Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
Reader
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "./interfaces/IPositionVault.sol"; import "./interfaces/IOrderVault.sol"; import "./interfaces/IVault.sol"; import "./interfaces/ISettingsManager.sol"; import {Constants} from "../access/Constants.sol"; import {OrderStatus, PositionTrigger, TriggerInfo, PaidFees} from "./structs.sol"; contract Reader is Constants, Initializable { struct AccruedFees { uint256 positionFee; uint256 borrowFee; int256 fundingFee; } IOrderVault private orderVault; IPositionVault private positionVault; ISettingsManager private settingsManager; IVault private vault; IERC20 private USDC; IERC20 private nsusd; IERC20 private nslp; function initialize(IPositionVault _positionVault, IOrderVault _orderVault, ISettingsManager _settingsManager) public initializer { require(AddressUpgradeable.isContract(address(_positionVault)), "positionVault invalid"); require(AddressUpgradeable.isContract(address(_orderVault)), "orderVault invalid"); positionVault = _positionVault; orderVault = _orderVault; settingsManager = _settingsManager; } function initializeV2(IVault _vault, IERC20 _USDC, IERC20 _nsusd, IERC20 _nslp) reinitializer(2) public { require(AddressUpgradeable.isContract(address(_vault)), "Vault invalid"); require(AddressUpgradeable.isContract(address(_nslp)), "nslp invalid"); require(AddressUpgradeable.isContract(address(_USDC)), "USDC invalid"); require(AddressUpgradeable.isContract(address(_nsusd)), "nsusd invalid"); vault = _vault; nslp = _nslp; USDC = _USDC; nsusd = _nsusd; } function getUserAlivePositions( address _user ) public view returns (uint256[] memory, Position[] memory, Order[] memory, PositionTrigger[] memory, PaidFees[] memory, AccruedFees[] memory) { uint256[] memory posIds = positionVault.getUserPositionIds(_user); return getPositions(posIds); } function getPositions( uint256[] memory posIds ) public view returns (uint256[] memory, Position[] memory, Order[] memory, PositionTrigger[] memory, PaidFees[] memory, AccruedFees[] memory) { uint256 length = posIds.length; Position[] memory positions_ = new Position[](length); Order[] memory orders_ = new Order[](length); PositionTrigger[] memory triggers_ = new PositionTrigger[](length); PaidFees[] memory paidFees_ = new PaidFees[](length); AccruedFees[] memory accruedFees_ = new AccruedFees[](length); for (uint i; i < length; ++i) { uint256 posId = posIds[i]; positions_[i] = positionVault.getPosition(posId); orders_[i] = orderVault.getOrder(posId); triggers_[i] = orderVault.getTriggerOrderInfo(posId); paidFees_[i] = positionVault.getPaidFees(posId); accruedFees_[i] = getAccruedFee(posId); } return (posIds, positions_, orders_, triggers_, paidFees_, accruedFees_); } function getAccruedFee(uint256 _posId) internal view returns (AccruedFees memory){ Position memory position = positionVault.getPosition(_posId); AccruedFees memory accruedFees; accruedFees.positionFee = settingsManager.getTradingFee(position.owner, position.tokenId, position.isLong, position.size); accruedFees.borrowFee = settingsManager.getBorrowFee(position.size, position.lastIncreasedTime, position.tokenId, position.isLong) + position.accruedBorrowFee; accruedFees.fundingFee = settingsManager.getFundingFee(position.tokenId, position.isLong, position.size, position.fundingIndex); return accruedFees; } function getGlobalInfo( address _account, uint256 _tokenId ) external view returns ( int256 fundingRate, uint256 borrowRateForLong, uint256 borrowRateForShort, uint256 longOpenInterest, uint256 shortOpenInterest, uint256 maxLongOpenInterest, uint256 maxShortOpenInterest, uint256 longTradingFee, uint256 shortTradingFee ) { fundingRate = settingsManager.getFundingRate(_tokenId); borrowRateForLong = settingsManager.getBorrowRate(_tokenId, true); borrowRateForShort = settingsManager.getBorrowRate(_tokenId, false); longOpenInterest = settingsManager.openInterestPerAssetPerSide(_tokenId, true); shortOpenInterest = settingsManager.openInterestPerAssetPerSide(_tokenId, false); maxLongOpenInterest = settingsManager.maxOpenInterestPerAssetPerSide(_tokenId, true); maxShortOpenInterest = settingsManager.maxOpenInterestPerAssetPerSide(_tokenId, false); longTradingFee = settingsManager.getTradingFee(_account, _tokenId, true, PRICE_PRECISION); shortTradingFee = settingsManager.getTradingFee(_account, _tokenId, false, PRICE_PRECISION); } function getUserOpenOrders( address _user ) public view returns (uint256[] memory, Position[] memory, Order[] memory, PositionTrigger[] memory, PaidFees[] memory, AccruedFees[] memory) { uint256[] memory posIds = positionVault.getUserOpenOrderIds(_user); uint256 length = posIds.length; Position[] memory positions_ = new Position[](length); Order[] memory orders_ = new Order[](length); PositionTrigger[] memory triggers_ = new PositionTrigger[](length); PaidFees[] memory paidFees_ = new PaidFees[](length); AccruedFees[] memory accruedFees_ = new AccruedFees[](length); for (uint i; i < length; ++i) { uint256 posId = posIds[i]; positions_[i] = positionVault.getPosition(posId); orders_[i] = orderVault.getOrder(posId); triggers_[i] = orderVault.getTriggerOrderInfo(posId); paidFees_[i] = positionVault.getPaidFees(posId); accruedFees_[i] = getAccruedFee(posId); } return (posIds, positions_, orders_, triggers_, paidFees_, accruedFees_); } function getFeesFor1CT(address _normal, address _oneCT) external view returns (bool, uint256) { uint256 tierInfoPercent = settingsManager.getTierInfo(_normal); uint256 deductFeePercentForNormal = settingsManager.deductFeePercent(_normal); uint256 deductFeePercentForOneCT = settingsManager.deductFeePercent(_oneCT); if (tierInfoPercent * (BASIS_POINTS_DIVISOR - deductFeePercentForNormal) / BASIS_POINTS_DIVISOR != (BASIS_POINTS_DIVISOR - deductFeePercentForOneCT)) { return (true, BASIS_POINTS_DIVISOR - tierInfoPercent * (BASIS_POINTS_DIVISOR - deductFeePercentForNormal) / BASIS_POINTS_DIVISOR); } else { return (false, 0); } } function validateMaxOILimit(address _account, bool _isLong, uint256 _size, uint256 _tokenId) external view returns (uint256, uint256, uint256, uint8) { uint256 _openInterestPerUser = settingsManager.openInterestPerUser(_account); uint256 _maxOpenInterestPerUser = settingsManager.maxOpenInterestPerUser(_account); uint256 tradingFee = settingsManager.getTradingFee(_account, _tokenId, _isLong, _size); uint256 triggerGasFee = settingsManager.triggerGasFee(); uint256 marketOrderGasFee = settingsManager.marketOrderGasFee(); if (_maxOpenInterestPerUser == 0) _maxOpenInterestPerUser = settingsManager.defaultMaxOpenInterestPerUser(); if (_openInterestPerUser + _size > _maxOpenInterestPerUser) return (triggerGasFee, marketOrderGasFee, tradingFee, 1); uint256 _openInterestPerAssetPerSide = settingsManager.openInterestPerAssetPerSide(_tokenId, _isLong); if (_openInterestPerAssetPerSide + _size > settingsManager.maxOpenInterestPerAssetPerSide(_tokenId, _isLong )) return (triggerGasFee, marketOrderGasFee, tradingFee, 2); return (triggerGasFee, marketOrderGasFee, tradingFee, 0); } function getUserBalances(address _account) external view returns (uint256 ethBalance, uint256 usdcBalance, uint256 usdcAllowance, uint256 nsusdBalance) { ethBalance = _account.balance; usdcBalance = USDC.balanceOf(_account); usdcAllowance = USDC.allowance(_account, address(vault)); nsusdBalance = nsusd.balanceOf(_account); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.sol"; /** * @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 Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 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 functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _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 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _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() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @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 { require(!_initializing, "Initializable: contract is initializing"); if (_initialized != type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @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]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; contract Constants { uint8 internal constant STAKING_PID_FOR_CHARGE_FEE = 1; uint256 internal constant BASIS_POINTS_DIVISOR = 100000; uint256 internal constant LIQUIDATE_THRESHOLD_DIVISOR = 10 * BASIS_POINTS_DIVISOR; uint256 internal constant DEFAULT_NSLP_PRICE = 100000; uint256 internal constant FUNDING_RATE_PRECISION = BASIS_POINTS_DIVISOR ** 3; // 1e15 uint256 internal constant MAX_DEPOSIT_WITHDRAW_FEE = 10000; // 10% uint256 internal constant MAX_DELTA_TIME = 24 hours; uint256 internal constant MAX_COOLDOWN_DURATION = 30 days; uint256 internal constant MAX_FEE_BASIS_POINTS = 5000; // 5% uint256 internal constant MAX_PRICE_MOVEMENT_PERCENT = 10000; // 10% uint256 internal constant MAX_BORROW_FEE_FACTOR = 500; // 0.5% per hour uint256 internal constant MAX_FUNDING_RATE = FUNDING_RATE_PRECISION / 10; // 10% per hour uint256 internal constant MAX_STAKING_UNSTAKING_FEE = 10000; // 10% uint256 internal constant MAX_EXPIRY_DURATION = 60; // 60 seconds uint256 internal constant MAX_SELF_EXECUTE_COOLDOWN = 300; // 5 minutes uint256 internal constant MAX_TOKENFARM_COOLDOWN_DURATION = 4 weeks; uint256 internal constant MAX_TRIGGER_GAS_FEE = 1e8 gwei; uint256 internal constant MAX_MARKET_ORDER_GAS_FEE = 1e8 gwei; uint256 internal constant MAX_VESTING_DURATION = 700 days; uint256 internal constant MIN_LEVERAGE = 10000; // 1x uint256 internal constant POSITION_MARKET = 0; uint256 internal constant POSITION_LIMIT = 1; uint256 internal constant POSITION_STOP_MARKET = 2; uint256 internal constant POSITION_STOP_LIMIT = 3; uint256 internal constant POSITION_TRAILING_STOP = 4; uint256 internal constant PRICE_PRECISION = 10 ** 30; uint256 internal constant TRAILING_STOP_TYPE_AMOUNT = 0; uint256 internal constant TRAILING_STOP_TYPE_PERCENT = 1; uint256 internal constant NSLP_DECIMALS = 18; function uintToBytes(uint v) internal pure returns (bytes32 ret) { if (v == 0) { ret = "0"; } else { while (v > 0) { ret = bytes32(uint(ret) / (2 ** 8)); ret |= bytes32(((v % 10) + 48) * 2 ** (8 * 31)); v /= 10; } } return ret; } function checkSlippage(bool isLong, uint256 allowedPrice, uint256 actualMarketPrice) internal pure { if (isLong) { require( actualMarketPrice <= allowedPrice, string( abi.encodePacked( "long: slippage exceeded ", uintToBytes(actualMarketPrice), " ", uintToBytes(allowedPrice) ) ) ); } else { require( actualMarketPrice >= allowedPrice, string( abi.encodePacked( "short: slippage exceeded ", uintToBytes(actualMarketPrice), " ", uintToBytes(allowedPrice) ) ) ); } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import {Order, OrderType, OrderStatus, AddPositionOrder, DecreasePositionOrder, PositionTrigger} from "../structs.sol"; interface IOrderVault { function addTrailingStop(address _account, uint256 _posId, uint256[] memory _params) external; function addTriggerOrders( uint256 _posId, address _account, bool[] memory _isTPs, uint256[] memory _prices, uint256[] memory _amountPercents ) external; function cancelPendingOrder(address _account, uint256 _posId) external; function updateOrder( uint256 _posId, uint256 _positionType, uint256 _collateral, uint256 _size, OrderStatus _status ) external; function cancelMarketOrder(uint256 _posId) external; function createNewOrder( uint256 _posId, address _accout, bool _isLong, uint256 _tokenId, uint256 _positionType, uint256[] memory _params, address _refer ) external; function createAddPositionOrder( address _owner, uint256 _posId, uint256 _collateralDelta, uint256 _sizeDelta, uint256 _allowedPrice, uint256 _fee ) external; function createDecreasePositionOrder(uint256 _posId, uint256 _sizeDelta, uint256 _allowedPrice) external; function cancelAddPositionOrder(uint256 _posId) external; function deleteAddPositionOrder(uint256 _posId) external; function deleteDecreasePositionOrder(uint256 _posId) external; function getOrder(uint256 _posId) external view returns (Order memory); function getAddPositionOrder(uint256 _posId) external view returns (AddPositionOrder memory); function getDecreasePositionOrder(uint256 _posId) external view returns (DecreasePositionOrder memory); function getTriggerOrderInfo(uint256 _posId) external view returns (PositionTrigger memory); function triggerForOpenOrders(uint256 _posId) external; function triggerForTPSL(uint256 _posId) external; function updateTrailingStop(uint256 _posId) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import {Position, Order, OrderType, PaidFees} from "../structs.sol"; interface IPositionVault { function newPositionOrder( address _account, uint256 _tokenId, bool _isLong, OrderType _orderType, uint256[] memory _params, address _refer ) external; function addOrRemoveCollateral(address _account, uint256 _posId, bool isPlus, uint256 _amount) external; function createAddPositionOrder( address _account, uint256 _posId, uint256 _collateralDelta, uint256 _sizeDelta, uint256 _allowedPrice ) external; function createDecreasePositionOrder( uint256 _posId, address _account, uint256 _sizeDelta, uint256 _allowedPrice ) external; function increasePosition( uint256 _posId, address _account, uint256 _tokenId, bool _isLong, uint256 _price, uint256 _collateralDelta, uint256 _sizeDelta, uint256 _fee ) external; function decreasePosition(uint256 _posId, uint256 _price, uint256 _sizeDelta) external; function decreasePositionByOrderVault(uint256 _posId, uint256 _price, uint256 _sizeDelta) external; function removeUserAlivePosition(address _user, uint256 _posId) external; function removeUserOpenOrder(address _user, uint256 _posId) external; function lastPosId() external view returns (uint256); function queueIndex() external view returns (uint256); function getNumOfUnexecuted() external view returns (uint256); function queuePosIds(uint256 _id) external view returns (uint256); function getPosition(uint256 _posId) external view returns (Position memory); function getUserPositionIds(address _account) external view returns (uint256[] memory); function getUserOpenOrderIds(address _account) external view returns (uint256[] memory); function getPaidFees(uint256 _posId) external view returns (PaidFees memory); function getVaultUSDBalance() external view returns (uint256); function executeOrders(uint256 numOfOrders) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; interface ISettingsManager { function decreaseOpenInterest(uint256 _tokenId, address _sender, bool _isLong, uint256 _amount) external; function increaseOpenInterest(uint256 _tokenId, address _sender, bool _isLong, uint256 _amount) external; function openInterestPerAssetPerSide(uint256 _tokenId, bool _isLong) external view returns (uint256); function openInterestPerUser(address _sender) external view returns (uint256); function bountyPercent() external view returns (uint32, uint32); function checkBanList(address _delegate) external view returns (bool); function checkDelegation(address _master, address _delegate) external view returns (bool); function minCollateral() external view returns (uint256); function closeDeltaTime() external view returns (uint256); function expiryDuration() external view returns (uint256); function selfExecuteCooldown() external view returns (uint256); function cooldownDuration() external view returns (uint256); function liquidationPendingTime() external view returns (uint256); function depositFee(address token) external view returns (uint256); function withdrawFee(address token) external view returns (uint256); function feeManager() external view returns (address); function feeRewardBasisPoints() external view returns (uint256); function defaultBorrowFeeFactor() external view returns (uint256); function borrowFeeFactor(uint256 tokenId) external view returns (uint256); function totalOpenInterest() external view returns (uint256); function basisFundingRateFactor() external view returns (uint256); function deductFeePercent(address _account) external view returns (uint256); function referrerTiers(address _referrer) external view returns (uint256); function tierFees(uint256 _tier) external view returns (uint256); function fundingIndex(uint256 _tokenId) external view returns (int256); function fundingRateFactor(uint256 _tokenId) external view returns (uint256); function slippageFactor(uint256 _tokenId) external view returns (uint256); function getFundingFee( uint256 _tokenId, bool _isLong, uint256 _size, int256 _fundingIndex ) external view returns (int256); function getFundingChange(uint256 _tokenId) external view returns (int256); function getBorrowRate(uint256 _tokenId, bool _isLong) external view returns (uint256); function getFundingRate(uint256 _tokenId) external view returns (int256); function getTradingFee( address _account, uint256 _tokenId, bool _isLong, uint256 _sizeDelta ) external view returns (uint256); function getPnl( uint256 _tokenId, bool _isLong, uint256 _size, uint256 _averagePrice, uint256 _lastPrice, uint256 _lastIncreasedTime, uint256 _accruedBorrowFee, int256 _fundingIndex ) external view returns (int256, int256, int256); function updateFunding(uint256 _tokenId) external; function getBorrowFee( uint256 _borrowedSize, uint256 _lastIncreasedTime, uint256 _tokenId, bool _isLong ) external view returns (uint256); function getUndiscountedTradingFee( uint256 _tokenId, bool _isLong, uint256 _sizeDelta ) external view returns (uint256); function getReferFee(address _refer) external view returns (uint256); function getReferFeeAndTraderRebate(address _refer) external view returns (uint256 referFee, uint256 traderRebate); function platformFees(address _platform) external view returns (uint256); function getPriceWithSlippage( uint256 _tokenId, bool _isLong, uint256 _size, uint256 _price ) external view returns (uint256); function getDelegates(address _master) external view returns (address[] memory); function isDeposit(address _token) external view returns (bool); function isStakingEnabled(address _token) external view returns (bool); function isUnstakingEnabled(address _token) external view returns (bool); function isIncreasingPositionDisabled(uint256 _tokenId) external view returns (bool); function isDecreasingPositionDisabled(uint256 _tokenId) external view returns (bool); function isWhitelistedFromCooldown(address _addr) external view returns (bool); function isWhitelistedFromTransferCooldown(address _addr) external view returns (bool); function isWithdraw(address _token) external view returns (bool); function lastFundingTimes(uint256 _tokenId) external view returns (uint256); function liquidateThreshold(uint256) external view returns (uint256); function tradingFee(uint256 _tokenId, bool _isLong) external view returns (uint256); function defaultMaxOpenInterestPerUser() external view returns (uint256); function maxProfitPercent(uint256 _tokenId) external view returns (uint256); function defaultMaxProfitPercent() external view returns (uint256); function maxOpenInterestPerAssetPerSide(uint256 _tokenId, bool _isLong) external view returns (uint256); function priceMovementPercent() external view returns (uint256); function maxOpenInterestPerUser(address _account) external view returns (uint256); function stakingFee(address token) external view returns (uint256); function unstakingFee(address token) external view returns (uint256); function triggerGasFee() external view returns (uint256); function marketOrderGasFee() external view returns (uint256); function maxTriggerPerPosition() external view returns (uint256); function maxFundingRate() external view returns (uint256); function maxTotalNslp() external view returns (uint256); function minProfitDurations(uint256 tokenId) external view returns (uint256); function maxCloseProfits(uint256 tokenId) external view returns (uint256); function maxCloseProfitPercents(uint256 tokenId) external view returns (uint256); function getTierInfo(address _account) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; interface IVault { function accountDeltaIntoTotalUSD(bool _isIncrease, uint256 _delta) external; function distributeFee(uint256 _fee, address _refer, address _trader) external; function takeNSUSDIn(address _account, uint256 _amount) external; function takeNSUSDOut(address _account, uint256 _amount) external; function lastStakedAt(address _account) external view returns (uint256); function getVaultUSDBalance() external view returns (uint256); function getNSLPPrice() external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; enum OrderType { MARKET, LIMIT, STOP, STOP_LIMIT } enum OrderStatus { NONE, PENDING, FILLED, CANCELED } enum TriggerStatus { NONE, PENDING, OPEN, TRIGGERED, CANCELLED } struct Order { OrderStatus status; uint256 lmtPrice; uint256 size; uint256 collateral; uint256 positionType; uint256 stepAmount; uint256 stepType; uint256 stpPrice; uint256 timestamp; } struct AddPositionOrder { address owner; uint256 collateral; uint256 size; uint256 allowedPrice; uint256 timestamp; uint256 fee; } struct DecreasePositionOrder { uint256 size; uint256 allowedPrice; uint256 timestamp; } struct Position { address owner; address refer; bool isLong; uint256 tokenId; uint256 averagePrice; uint256 collateral; int256 fundingIndex; uint256 lastIncreasedTime; uint256 size; uint256 accruedBorrowFee; } struct PaidFees { uint256 paidPositionFee; uint256 paidBorrowFee; int256 paidFundingFee; } struct Temp { uint256 a; uint256 b; uint256 c; uint256 d; uint256 e; } struct TriggerInfo { bool isTP; uint256 amountPercent; uint256 createdAt; uint256 price; uint256 triggeredAmount; uint256 triggeredAt; TriggerStatus status; } struct PositionTrigger { TriggerInfo[] triggers; }
{ "evmVersion": "london", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 200 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"inputs":[{"internalType":"address","name":"_normal","type":"address"},{"internalType":"address","name":"_oneCT","type":"address"}],"name":"getFeesFor1CT","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getGlobalInfo","outputs":[{"internalType":"int256","name":"fundingRate","type":"int256"},{"internalType":"uint256","name":"borrowRateForLong","type":"uint256"},{"internalType":"uint256","name":"borrowRateForShort","type":"uint256"},{"internalType":"uint256","name":"longOpenInterest","type":"uint256"},{"internalType":"uint256","name":"shortOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxLongOpenInterest","type":"uint256"},{"internalType":"uint256","name":"maxShortOpenInterest","type":"uint256"},{"internalType":"uint256","name":"longTradingFee","type":"uint256"},{"internalType":"uint256","name":"shortTradingFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"posIds","type":"uint256[]"}],"name":"getPositions","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"refer","type":"address"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"averagePrice","type":"uint256"},{"internalType":"uint256","name":"collateral","type":"uint256"},{"internalType":"int256","name":"fundingIndex","type":"int256"},{"internalType":"uint256","name":"lastIncreasedTime","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"},{"internalType":"uint256","name":"accruedBorrowFee","type":"uint256"}],"internalType":"struct Position[]","name":"","type":"tuple[]"},{"components":[{"internalType":"enum OrderStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"lmtPrice","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"},{"internalType":"uint256","name":"collateral","type":"uint256"},{"internalType":"uint256","name":"positionType","type":"uint256"},{"internalType":"uint256","name":"stepAmount","type":"uint256"},{"internalType":"uint256","name":"stepType","type":"uint256"},{"internalType":"uint256","name":"stpPrice","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct Order[]","name":"","type":"tuple[]"},{"components":[{"components":[{"internalType":"bool","name":"isTP","type":"bool"},{"internalType":"uint256","name":"amountPercent","type":"uint256"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"triggeredAmount","type":"uint256"},{"internalType":"uint256","name":"triggeredAt","type":"uint256"},{"internalType":"enum TriggerStatus","name":"status","type":"uint8"}],"internalType":"struct TriggerInfo[]","name":"triggers","type":"tuple[]"}],"internalType":"struct PositionTrigger[]","name":"","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"paidPositionFee","type":"uint256"},{"internalType":"uint256","name":"paidBorrowFee","type":"uint256"},{"internalType":"int256","name":"paidFundingFee","type":"int256"}],"internalType":"struct PaidFees[]","name":"","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"positionFee","type":"uint256"},{"internalType":"uint256","name":"borrowFee","type":"uint256"},{"internalType":"int256","name":"fundingFee","type":"int256"}],"internalType":"struct Reader.AccruedFees[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserAlivePositions","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"refer","type":"address"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"averagePrice","type":"uint256"},{"internalType":"uint256","name":"collateral","type":"uint256"},{"internalType":"int256","name":"fundingIndex","type":"int256"},{"internalType":"uint256","name":"lastIncreasedTime","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"},{"internalType":"uint256","name":"accruedBorrowFee","type":"uint256"}],"internalType":"struct Position[]","name":"","type":"tuple[]"},{"components":[{"internalType":"enum OrderStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"lmtPrice","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"},{"internalType":"uint256","name":"collateral","type":"uint256"},{"internalType":"uint256","name":"positionType","type":"uint256"},{"internalType":"uint256","name":"stepAmount","type":"uint256"},{"internalType":"uint256","name":"stepType","type":"uint256"},{"internalType":"uint256","name":"stpPrice","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct Order[]","name":"","type":"tuple[]"},{"components":[{"components":[{"internalType":"bool","name":"isTP","type":"bool"},{"internalType":"uint256","name":"amountPercent","type":"uint256"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"triggeredAmount","type":"uint256"},{"internalType":"uint256","name":"triggeredAt","type":"uint256"},{"internalType":"enum TriggerStatus","name":"status","type":"uint8"}],"internalType":"struct TriggerInfo[]","name":"triggers","type":"tuple[]"}],"internalType":"struct PositionTrigger[]","name":"","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"paidPositionFee","type":"uint256"},{"internalType":"uint256","name":"paidBorrowFee","type":"uint256"},{"internalType":"int256","name":"paidFundingFee","type":"int256"}],"internalType":"struct PaidFees[]","name":"","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"positionFee","type":"uint256"},{"internalType":"uint256","name":"borrowFee","type":"uint256"},{"internalType":"int256","name":"fundingFee","type":"int256"}],"internalType":"struct Reader.AccruedFees[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"getUserBalances","outputs":[{"internalType":"uint256","name":"ethBalance","type":"uint256"},{"internalType":"uint256","name":"usdcBalance","type":"uint256"},{"internalType":"uint256","name":"usdcAllowance","type":"uint256"},{"internalType":"uint256","name":"nsusdBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserOpenOrders","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"refer","type":"address"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"averagePrice","type":"uint256"},{"internalType":"uint256","name":"collateral","type":"uint256"},{"internalType":"int256","name":"fundingIndex","type":"int256"},{"internalType":"uint256","name":"lastIncreasedTime","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"},{"internalType":"uint256","name":"accruedBorrowFee","type":"uint256"}],"internalType":"struct Position[]","name":"","type":"tuple[]"},{"components":[{"internalType":"enum OrderStatus","name":"status","type":"uint8"},{"internalType":"uint256","name":"lmtPrice","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"},{"internalType":"uint256","name":"collateral","type":"uint256"},{"internalType":"uint256","name":"positionType","type":"uint256"},{"internalType":"uint256","name":"stepAmount","type":"uint256"},{"internalType":"uint256","name":"stepType","type":"uint256"},{"internalType":"uint256","name":"stpPrice","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"internalType":"struct Order[]","name":"","type":"tuple[]"},{"components":[{"components":[{"internalType":"bool","name":"isTP","type":"bool"},{"internalType":"uint256","name":"amountPercent","type":"uint256"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"triggeredAmount","type":"uint256"},{"internalType":"uint256","name":"triggeredAt","type":"uint256"},{"internalType":"enum TriggerStatus","name":"status","type":"uint8"}],"internalType":"struct TriggerInfo[]","name":"triggers","type":"tuple[]"}],"internalType":"struct PositionTrigger[]","name":"","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"paidPositionFee","type":"uint256"},{"internalType":"uint256","name":"paidBorrowFee","type":"uint256"},{"internalType":"int256","name":"paidFundingFee","type":"int256"}],"internalType":"struct PaidFees[]","name":"","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"positionFee","type":"uint256"},{"internalType":"uint256","name":"borrowFee","type":"uint256"},{"internalType":"int256","name":"fundingFee","type":"int256"}],"internalType":"struct Reader.AccruedFees[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IPositionVault","name":"_positionVault","type":"address"},{"internalType":"contract IOrderVault","name":"_orderVault","type":"address"},{"internalType":"contract ISettingsManager","name":"_settingsManager","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IVault","name":"_vault","type":"address"},{"internalType":"contract IERC20","name":"_USDC","type":"address"},{"internalType":"contract IERC20","name":"_nsusd","type":"address"},{"internalType":"contract IERC20","name":"_nslp","type":"address"}],"name":"initializeV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_isLong","type":"bool"},{"internalType":"uint256","name":"_size","type":"uint256"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"validateMaxOILimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50612c81806100206000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c8063833a304711610066578063833a304714610162578063abd3f6121461018c578063c0c53b8b146101bf578063f27ebced146101d4578063fba3fb78146101e757600080fd5b80630415d273146100985780631a2a8d52146100f45780634c723c281461012a5780635cbb25031461014f575b600080fd5b6100ab6100a6366004612182565b6101fa565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e0830152610100820152610120015b60405180910390f35b6101076101023660046121bc565b6106d8565b6040805194855260208501939093529183015260ff1660608201526080016100eb565b61013d6101383660046122fb565b610b7e565b6040516100eb969594939291906125fe565b61013d61015d3660046126a9565b611066565b6101756101703660046126cd565b611115565b6040805192151583526020830191909152016100eb565b61019f61019a3660046126a9565b611324565b6040805194855260208501939093529183015260608201526080016100eb565b6101d26101cd366004612706565b6114c1565b005b6101d26101e2366004612751565b611677565b61013d6101f53660046126a9565b61187d565b600254604051639f52a26160e01b815260048101839052600091829182918291829182918291829182916001600160a01b031690639f52a2619060240160206040518083038186803b15801561024f57600080fd5b505afa158015610263573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061028791906127ad565b6002546040516319121e3d60e11b8152600481018d905260016024820152919a506001600160a01b0316906332243c7a9060440160206040518083038186803b1580156102d357600080fd5b505afa1580156102e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061030b91906127ad565b6002546040516319121e3d60e11b8152600481018d9052600060248201529199506001600160a01b0316906332243c7a9060440160206040518083038186803b15801561035757600080fd5b505afa15801561036b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038f91906127ad565b60025460405163b809d0f960e01b8152600481018d9052600160248201529198506001600160a01b03169063b809d0f99060440160206040518083038186803b1580156103db57600080fd5b505afa1580156103ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041391906127ad565b60025460405163b809d0f960e01b8152600481018d9052600060248201529197506001600160a01b03169063b809d0f99060440160206040518083038186803b15801561045f57600080fd5b505afa158015610473573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049791906127ad565b60025460405163232d77c560e21b8152600481018d9052600160248201529196506001600160a01b031690638cb5df149060440160206040518083038186803b1580156104e357600080fd5b505afa1580156104f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051b91906127ad565b60025460405163232d77c560e21b8152600481018d9052600060248201529195506001600160a01b031690638cb5df149060440160206040518083038186803b15801561056757600080fd5b505afa15801561057b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059f91906127ad565b6002546040516334c86b6b60e01b81529194506001600160a01b0316906334c86b6b906105e4908e908e906001906c0c9f2c9cd04674edea40000000906004016127c6565b60206040518083038186803b1580156105fc57600080fd5b505afa158015610610573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063491906127ad565b6002546040516334c86b6b60e01b81529193506001600160a01b0316906334c86b6b90610679908e908e906000906c0c9f2c9cd04674edea40000000906004016127c6565b60206040518083038186803b15801561069157600080fd5b505afa1580156106a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c991906127ad565b90509295985092959850929598565b60025460405163de8f5a1160e01b81526001600160a01b038681166004830152600092839283928392839291169063de8f5a119060240160206040518083038186803b15801561072757600080fd5b505afa15801561073b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075f91906127ad565b600254604051630b63179d60e11b81526001600160a01b038c81166004830152929350600092909116906316c62f3a9060240160206040518083038186803b1580156107aa57600080fd5b505afa1580156107be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e291906127ad565b6002546040516334c86b6b60e01b81529192506000916001600160a01b03909116906334c86b6b9061081e908e908c908f908f906004016127c6565b60206040518083038186803b15801561083657600080fd5b505afa15801561084a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086e91906127ad565b90506000600260009054906101000a90046001600160a01b03166001600160a01b03166364c8bb7e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156108c057600080fd5b505afa1580156108d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f891906127ad565b90506000600260009054906101000a90046001600160a01b03166001600160a01b031663ce9e80096040518163ffffffff1660e01b815260040160206040518083038186803b15801561094a57600080fd5b505afa15801561095e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098291906127ad565b905083610a1257600260009054906101000a90046001600160a01b03166001600160a01b03166347c6f0f46040518163ffffffff1660e01b815260040160206040518083038186803b1580156109d757600080fd5b505afa1580156109eb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0f91906127ad565b93505b83610a1d8c87612804565b1115610a36579097509550935060019250610b73915050565b60025460405163b809d0f960e01b8152600481018c90528d151560248201526000916001600160a01b03169063b809d0f99060440160206040518083038186803b158015610a8357600080fd5b505afa158015610a97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abb91906127ad565b60025460405163232d77c560e21b8152600481018e90528f151560248201529192506001600160a01b031690638cb5df149060440160206040518083038186803b158015610b0857600080fd5b505afa158015610b1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4091906127ad565b610b4a8d83612804565b1115610b6457509097509550935060029250610b73915050565b50909750955093506000925050505b945094509450949050565b6060806060806060806000875190506000816001600160401b03811115610ba757610ba7612202565b604051908082528060200260200182016040528015610be057816020015b610bcd6120b6565b815260200190600190039081610bc55790505b5090506000826001600160401b03811115610bfd57610bfd612202565b604051908082528060200260200182016040528015610c3657816020015b610c2361211d565b815260200190600190039081610c1b5790505b5090506000836001600160401b03811115610c5357610c53612202565b604051908082528060200260200182016040528015610c9357816020015b604080516020810190915260608152815260200190600190039081610c715790505b5090506000846001600160401b03811115610cb057610cb0612202565b604051908082528060200260200182016040528015610d0557816020015b610cf260405180606001604052806000815260200160008152602001600081525090565b815260200190600190039081610cce5790505b5090506000856001600160401b03811115610d2257610d22612202565b604051908082528060200260200182016040528015610d7757816020015b610d6460405180606001604052806000815260200160008152602001600081525090565b815260200190600190039081610d405790505b50905060005b868110156110515760008e8281518110610d9957610d9961281c565b602090810291909101015160015460405163eb02c30160e01b8152600481018390529192506001600160a01b03169063eb02c301906024016101406040518083038186803b158015610dea57600080fd5b505afa158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e22919061284d565b878381518110610e3457610e3461281c565b602090810291909101015260005460405163d09ef24160e01b815260048101839052620100009091046001600160a01b03169063d09ef241906024016101206040518083038186803b158015610e8957600080fd5b505afa158015610e9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec191906128f8565b868381518110610ed357610ed361281c565b602090810291909101015260005460405163f32af30160e01b815260048101839052620100009091046001600160a01b03169063f32af3019060240160006040518083038186803b158015610f2757600080fd5b505afa158015610f3b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f63919081019061297a565b858381518110610f7557610f7561281c565b60209081029190910101526001546040516306393ef960e41b8152600481018390526001600160a01b0390911690636393ef909060240160606040518083038186803b158015610fc457600080fd5b505afa158015610fd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffc9190612aaa565b84838151811061100e5761100e61281c565b602002602001018190525061102281611dec565b8383815181106110345761103461281c565b6020026020010181905250508061104a90612b05565b9050610d7d565b509b9c939b929a509098509650945092505050565b600154604051630eddf75760e41b81526001600160a01b03838116600483015260609283928392839283928392600092169063eddf75709060240160006040518083038186803b1580156110b957600080fd5b505afa1580156110cd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110f59190810190612b20565b905061110081610b7e565b949d939c50919a509850965090945092505050565b600254604051633fd172dd60e11b81526001600160a01b0384811660048301526000928392839290911690637fa2e5ba9060240160206040518083038186803b15801561116157600080fd5b505afa158015611175573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119991906127ad565b60025460405163449cbd5160e01b81526001600160a01b0388811660048301529293506000929091169063449cbd519060240160206040518083038186803b1580156111e457600080fd5b505afa1580156111f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121c91906127ad565b60025460405163449cbd5160e01b81526001600160a01b0388811660048301529293506000929091169063449cbd519060240160206040518083038186803b15801561126757600080fd5b505afa15801561127b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129f91906127ad565b90506112ae81620186a0612ba5565b620186a06112bc8482612ba5565b6112c69086612bbc565b6112d09190612bdb565b14611312576001620186a06112e58482612ba5565b6112ef9086612bbc565b6112f99190612bdb565b61130690620186a0612ba5565b9450945050505061131d565b600080945094505050505b9250929050565b600480546040516370a0823160e01b81526001600160a01b0384811693820184905292319260009283928392909116906370a082319060240160206040518083038186803b15801561137557600080fd5b505afa158015611389573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ad91906127ad565b60048054600354604051636eb1769f60e11b81526001600160a01b038a8116948201949094529083166024820152929550169063dd62ed3e9060440160206040518083038186803b15801561140157600080fd5b505afa158015611415573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143991906127ad565b6005546040516370a0823160e01b81526001600160a01b0388811660048301529294509116906370a082319060240160206040518083038186803b15801561148057600080fd5b505afa158015611494573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b891906127ad565b90509193509193565b600054610100900460ff16158080156114e15750600054600160ff909116105b806114fb5750303b1580156114fb575060005460ff166001145b6115205760405162461bcd60e51b815260040161151790612bfd565b60405180910390fd5b6000805460ff191660011790558015611543576000805461ff0019166101001790555b6001600160a01b0384163b6115925760405162461bcd60e51b81526020600482015260156024820152741c1bdcda5d1a5bdb95985d5b1d081a5b9d985b1a59605a1b6044820152606401611517565b6001600160a01b0383163b6115de5760405162461bcd60e51b81526020600482015260126024820152711bdc99195c95985d5b1d081a5b9d985b1a5960721b6044820152606401611517565b600180546001600160a01b038087166001600160a01b03199283161790925560008054868416620100000262010000600160b01b031990911617905560028054928516929091169190911790558015611671576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b600054600290610100900460ff16158015611699575060005460ff8083169116105b6116b55760405162461bcd60e51b815260040161151790612bfd565b6000805461ffff191660ff8316176101001790556116dc856001600160a01b03163b151590565b6117185760405162461bcd60e51b815260206004820152600d60248201526c15985d5b1d081a5b9d985b1a59609a1b6044820152606401611517565b6001600160a01b0382163b61175e5760405162461bcd60e51b815260206004820152600c60248201526b1b9cdb1c081a5b9d985b1a5960a21b6044820152606401611517565b6001600160a01b0384163b6117a45760405162461bcd60e51b815260206004820152600c60248201526b1554d110c81a5b9d985b1a5960a21b6044820152606401611517565b6001600160a01b0383163b6117eb5760405162461bcd60e51b815260206004820152600d60248201526c1b9cdd5cd9081a5b9d985b1a59609a1b6044820152606401611517565b600380546001600160a01b03199081166001600160a01b0388811691909117909255600680548216858416179055600480548216878416179055600580549091169185169190911790556000805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6001546040516307cc1a7b60e41b81526001600160a01b038381166004830152606092839283928392839283926000921690637cc1a7b09060240160006040518083038186803b1580156118d057600080fd5b505afa1580156118e4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261190c9190810190612b20565b80519091506000816001600160401b0381111561192b5761192b612202565b60405190808252806020026020018201604052801561196457816020015b6119516120b6565b8152602001906001900390816119495790505b5090506000826001600160401b0381111561198157611981612202565b6040519080825280602002602001820160405280156119ba57816020015b6119a761211d565b81526020019060019003908161199f5790505b5090506000836001600160401b038111156119d7576119d7612202565b604051908082528060200260200182016040528015611a1757816020015b6040805160208101909152606081528152602001906001900390816119f55790505b5090506000846001600160401b03811115611a3457611a34612202565b604051908082528060200260200182016040528015611a8957816020015b611a7660405180606001604052806000815260200160008152602001600081525090565b815260200190600190039081611a525790505b5090506000856001600160401b03811115611aa657611aa6612202565b604051908082528060200260200182016040528015611afb57816020015b611ae860405180606001604052806000815260200160008152602001600081525090565b815260200190600190039081611ac45790505b50905060005b86811015611dd5576000888281518110611b1d57611b1d61281c565b602090810291909101015160015460405163eb02c30160e01b8152600481018390529192506001600160a01b03169063eb02c301906024016101406040518083038186803b158015611b6e57600080fd5b505afa158015611b82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba6919061284d565b878381518110611bb857611bb861281c565b602090810291909101015260005460405163d09ef24160e01b815260048101839052620100009091046001600160a01b03169063d09ef241906024016101206040518083038186803b158015611c0d57600080fd5b505afa158015611c21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4591906128f8565b868381518110611c5757611c5761281c565b602090810291909101015260005460405163f32af30160e01b815260048101839052620100009091046001600160a01b03169063f32af3019060240160006040518083038186803b158015611cab57600080fd5b505afa158015611cbf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ce7919081019061297a565b858381518110611cf957611cf961281c565b60209081029190910101526001546040516306393ef960e41b8152600481018390526001600160a01b0390911690636393ef909060240160606040518083038186803b158015611d4857600080fd5b505afa158015611d5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d809190612aaa565b848381518110611d9257611d9261281c565b6020026020010181905250611da681611dec565b838381518110611db857611db861281c565b60200260200101819052505080611dce90612b05565b9050611b01565b50959d939c50919a50985096509194509092505050565b611e1060405180606001604052806000815260200160008152602001600081525090565b60015460405163eb02c30160e01b8152600481018490526000916001600160a01b03169063eb02c301906024016101406040518083038186803b158015611e5657600080fd5b505afa158015611e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8e919061284d565b9050611eb460405180606001604052806000815260200160008152602001600081525090565b6002548251606084015160408086015161010087015191516334c86b6b60e01b81526001600160a01b03909516946334c86b6b94611ef99490939092916004016127c6565b60206040518083038186803b158015611f1157600080fd5b505afa158015611f25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4991906127ad565b815261012082015160025461010084015160e08501516060860151604080880151905163b76b634d60e01b8152600481019490945260248401929092526044830152151560648201526001600160a01b039091169063b76b634d9060840160206040518083038186803b158015611fbf57600080fd5b505afa158015611fd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ff791906127ad565b6120019190612804565b6020820152600254606083015160408085015161010086015160c087015192516322dfbe7f60e11b815260048101949094529015156024840152604483015260648201526001600160a01b03909116906345bf7cfe9060840160206040518083038186803b15801561207257600080fd5b505afa158015612086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120aa91906127ad565b60408201529392505050565b60405180610140016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600015158152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604080516101208101909152806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b038116811461217f57600080fd5b50565b6000806040838503121561219557600080fd5b82356121a08161216a565b946020939093013593505050565b801515811461217f57600080fd5b600080600080608085870312156121d257600080fd5b84356121dd8161216a565b935060208501356121ed816121ae565b93969395505050506040820135916060013590565b634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b038111828210171561223b5761223b612202565b60405290565b60405161012081016001600160401b038111828210171561223b5761223b612202565b604051602081016001600160401b038111828210171561223b5761223b612202565b60405160e081016001600160401b038111828210171561223b5761223b612202565b604051601f8201601f191681016001600160401b03811182821017156122d0576122d0612202565b604052919050565b60006001600160401b038211156122f1576122f1612202565b5060051b60200190565b6000602080838503121561230e57600080fd5b82356001600160401b0381111561232457600080fd5b8301601f8101851361233557600080fd5b8035612348612343826122d8565b6122a8565b81815260059190911b8201830190838101908783111561236757600080fd5b928401925b828410156123855783358252928401929084019061236c565b979650505050505050565b600081518084526020808501945080840160005b8381101561242d57815180516001600160a01b039081168952848201511684890152604080820151151590890152606080820151908901526080808201519089015260a0808201519089015260c0808201519089015260e080820151908901526101008082015190890152610120908101519088015261014090960195908201906001016123a4565b509495945050505050565b634e487b7160e01b600052602160045260246000fd5b600081518084526020808501945080840160005b8381101561242d57815180516004811061247e5761247e612438565b8852808401518489015260408082015190890152606080820151908901526080808201519089015260a0808201519089015260c0808201519089015260e0808201519089015261010090810151908801526101209096019590820190600101612462565b600081518084526020808501808196506005915083821b81018387016000805b878110156125a9578484038b5282515187855280518886018190529088019060409081870190855b818110156125935784518051151584528c8101518d8501528481015185850152606080820151908501526080808201519085015260a0808201519085015260c090810151908c821061257e5761257e612438565b840152938b019360e09092019160010161252a565b50509c89019c9550505091860191600101612502565b50919998505050505050505050565b600081518084526020808501945080840160005b8381101561242d57815180518852838101518489015260409081015190880152606090960195908201906001016125cc565b60c0808252875190820181905260009060209060e0840190828b01845b828110156126375781518452928401929084019060010161261b565b5050508381038285015261264b818a612390565b9150508281036040840152612660818861244e565b9050828103606084015261267481876124e2565b9050828103608084015261268881866125b8565b905082810360a084015261269c81856125b8565b9998505050505050505050565b6000602082840312156126bb57600080fd5b81356126c68161216a565b9392505050565b600080604083850312156126e057600080fd5b82356126eb8161216a565b915060208301356126fb8161216a565b809150509250929050565b60008060006060848603121561271b57600080fd5b83356127268161216a565b925060208401356127368161216a565b915060408401356127468161216a565b809150509250925092565b6000806000806080858703121561276757600080fd5b84356127728161216a565b935060208501356127828161216a565b925060408501356127928161216a565b915060608501356127a28161216a565b939692955090935050565b6000602082840312156127bf57600080fd5b5051919050565b6001600160a01b03949094168452602084019290925215156040830152606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612817576128176127ee565b500190565b634e487b7160e01b600052603260045260246000fd5b805161283d8161216a565b919050565b805161283d816121ae565b6000610140828403121561286057600080fd5b612868612218565b61287183612832565b815261287f60208401612832565b602082015261289060408401612842565b6040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152506101208084015181830152508091505092915050565b80516004811061283d57600080fd5b6000610120828403121561290b57600080fd5b612913612241565b61291c836128e9565b81526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152508091505092915050565b6000602080838503121561298d57600080fd5b82516001600160401b03808211156129a457600080fd5b81850191508282870312156129b857600080fd5b6129c0612264565b8251828111156129cf57600080fd5b80840193505086601f8401126129e457600080fd5b825191506129f4612343836122d8565b82815260e09283028401850192858201919089851115612a1357600080fd5b948601945b84861015612a9c5780868b031215612a305760008081fd5b612a38612286565b8651612a43816121ae565b8152868801518882015260408088015190820152606080880151908201526080808801519082015260a0808801519082015260c08088015160058110612a895760008081fd5b9082015283529485019491860191612a18565b508252509695505050505050565b600060608284031215612abc57600080fd5b604051606081018181106001600160401b0382111715612ade57612ade612202565b80604052508251815260208301516020820152604083015160408201528091505092915050565b6000600019821415612b1957612b196127ee565b5060010190565b60006020808385031215612b3357600080fd5b82516001600160401b03811115612b4957600080fd5b8301601f81018513612b5a57600080fd5b8051612b68612343826122d8565b81815260059190911b82018301908381019087831115612b8757600080fd5b928401925b8284101561238557835182529284019290840190612b8c565b600082821015612bb757612bb76127ee565b500390565b6000816000190483118215151615612bd657612bd66127ee565b500290565b600082612bf857634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b60608201526080019056fea2646970667358221220fbba83c9c9ed9ac1a529fc32fccb4f04d847e03ed19bb85ec41dfcdf04d842f664736f6c63430008090033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100935760003560e01c8063833a304711610066578063833a304714610162578063abd3f6121461018c578063c0c53b8b146101bf578063f27ebced146101d4578063fba3fb78146101e757600080fd5b80630415d273146100985780631a2a8d52146100f45780634c723c281461012a5780635cbb25031461014f575b600080fd5b6100ab6100a6366004612182565b6101fa565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e0830152610100820152610120015b60405180910390f35b6101076101023660046121bc565b6106d8565b6040805194855260208501939093529183015260ff1660608201526080016100eb565b61013d6101383660046122fb565b610b7e565b6040516100eb969594939291906125fe565b61013d61015d3660046126a9565b611066565b6101756101703660046126cd565b611115565b6040805192151583526020830191909152016100eb565b61019f61019a3660046126a9565b611324565b6040805194855260208501939093529183015260608201526080016100eb565b6101d26101cd366004612706565b6114c1565b005b6101d26101e2366004612751565b611677565b61013d6101f53660046126a9565b61187d565b600254604051639f52a26160e01b815260048101839052600091829182918291829182918291829182916001600160a01b031690639f52a2619060240160206040518083038186803b15801561024f57600080fd5b505afa158015610263573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061028791906127ad565b6002546040516319121e3d60e11b8152600481018d905260016024820152919a506001600160a01b0316906332243c7a9060440160206040518083038186803b1580156102d357600080fd5b505afa1580156102e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061030b91906127ad565b6002546040516319121e3d60e11b8152600481018d9052600060248201529199506001600160a01b0316906332243c7a9060440160206040518083038186803b15801561035757600080fd5b505afa15801561036b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038f91906127ad565b60025460405163b809d0f960e01b8152600481018d9052600160248201529198506001600160a01b03169063b809d0f99060440160206040518083038186803b1580156103db57600080fd5b505afa1580156103ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041391906127ad565b60025460405163b809d0f960e01b8152600481018d9052600060248201529197506001600160a01b03169063b809d0f99060440160206040518083038186803b15801561045f57600080fd5b505afa158015610473573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061049791906127ad565b60025460405163232d77c560e21b8152600481018d9052600160248201529196506001600160a01b031690638cb5df149060440160206040518083038186803b1580156104e357600080fd5b505afa1580156104f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051b91906127ad565b60025460405163232d77c560e21b8152600481018d9052600060248201529195506001600160a01b031690638cb5df149060440160206040518083038186803b15801561056757600080fd5b505afa15801561057b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059f91906127ad565b6002546040516334c86b6b60e01b81529194506001600160a01b0316906334c86b6b906105e4908e908e906001906c0c9f2c9cd04674edea40000000906004016127c6565b60206040518083038186803b1580156105fc57600080fd5b505afa158015610610573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063491906127ad565b6002546040516334c86b6b60e01b81529193506001600160a01b0316906334c86b6b90610679908e908e906000906c0c9f2c9cd04674edea40000000906004016127c6565b60206040518083038186803b15801561069157600080fd5b505afa1580156106a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c991906127ad565b90509295985092959850929598565b60025460405163de8f5a1160e01b81526001600160a01b038681166004830152600092839283928392839291169063de8f5a119060240160206040518083038186803b15801561072757600080fd5b505afa15801561073b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075f91906127ad565b600254604051630b63179d60e11b81526001600160a01b038c81166004830152929350600092909116906316c62f3a9060240160206040518083038186803b1580156107aa57600080fd5b505afa1580156107be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e291906127ad565b6002546040516334c86b6b60e01b81529192506000916001600160a01b03909116906334c86b6b9061081e908e908c908f908f906004016127c6565b60206040518083038186803b15801561083657600080fd5b505afa15801561084a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086e91906127ad565b90506000600260009054906101000a90046001600160a01b03166001600160a01b03166364c8bb7e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156108c057600080fd5b505afa1580156108d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f891906127ad565b90506000600260009054906101000a90046001600160a01b03166001600160a01b031663ce9e80096040518163ffffffff1660e01b815260040160206040518083038186803b15801561094a57600080fd5b505afa15801561095e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098291906127ad565b905083610a1257600260009054906101000a90046001600160a01b03166001600160a01b03166347c6f0f46040518163ffffffff1660e01b815260040160206040518083038186803b1580156109d757600080fd5b505afa1580156109eb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0f91906127ad565b93505b83610a1d8c87612804565b1115610a36579097509550935060019250610b73915050565b60025460405163b809d0f960e01b8152600481018c90528d151560248201526000916001600160a01b03169063b809d0f99060440160206040518083038186803b158015610a8357600080fd5b505afa158015610a97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610abb91906127ad565b60025460405163232d77c560e21b8152600481018e90528f151560248201529192506001600160a01b031690638cb5df149060440160206040518083038186803b158015610b0857600080fd5b505afa158015610b1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b4091906127ad565b610b4a8d83612804565b1115610b6457509097509550935060029250610b73915050565b50909750955093506000925050505b945094509450949050565b6060806060806060806000875190506000816001600160401b03811115610ba757610ba7612202565b604051908082528060200260200182016040528015610be057816020015b610bcd6120b6565b815260200190600190039081610bc55790505b5090506000826001600160401b03811115610bfd57610bfd612202565b604051908082528060200260200182016040528015610c3657816020015b610c2361211d565b815260200190600190039081610c1b5790505b5090506000836001600160401b03811115610c5357610c53612202565b604051908082528060200260200182016040528015610c9357816020015b604080516020810190915260608152815260200190600190039081610c715790505b5090506000846001600160401b03811115610cb057610cb0612202565b604051908082528060200260200182016040528015610d0557816020015b610cf260405180606001604052806000815260200160008152602001600081525090565b815260200190600190039081610cce5790505b5090506000856001600160401b03811115610d2257610d22612202565b604051908082528060200260200182016040528015610d7757816020015b610d6460405180606001604052806000815260200160008152602001600081525090565b815260200190600190039081610d405790505b50905060005b868110156110515760008e8281518110610d9957610d9961281c565b602090810291909101015160015460405163eb02c30160e01b8152600481018390529192506001600160a01b03169063eb02c301906024016101406040518083038186803b158015610dea57600080fd5b505afa158015610dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e22919061284d565b878381518110610e3457610e3461281c565b602090810291909101015260005460405163d09ef24160e01b815260048101839052620100009091046001600160a01b03169063d09ef241906024016101206040518083038186803b158015610e8957600080fd5b505afa158015610e9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec191906128f8565b868381518110610ed357610ed361281c565b602090810291909101015260005460405163f32af30160e01b815260048101839052620100009091046001600160a01b03169063f32af3019060240160006040518083038186803b158015610f2757600080fd5b505afa158015610f3b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f63919081019061297a565b858381518110610f7557610f7561281c565b60209081029190910101526001546040516306393ef960e41b8152600481018390526001600160a01b0390911690636393ef909060240160606040518083038186803b158015610fc457600080fd5b505afa158015610fd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ffc9190612aaa565b84838151811061100e5761100e61281c565b602002602001018190525061102281611dec565b8383815181106110345761103461281c565b6020026020010181905250508061104a90612b05565b9050610d7d565b509b9c939b929a509098509650945092505050565b600154604051630eddf75760e41b81526001600160a01b03838116600483015260609283928392839283928392600092169063eddf75709060240160006040518083038186803b1580156110b957600080fd5b505afa1580156110cd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526110f59190810190612b20565b905061110081610b7e565b949d939c50919a509850965090945092505050565b600254604051633fd172dd60e11b81526001600160a01b0384811660048301526000928392839290911690637fa2e5ba9060240160206040518083038186803b15801561116157600080fd5b505afa158015611175573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119991906127ad565b60025460405163449cbd5160e01b81526001600160a01b0388811660048301529293506000929091169063449cbd519060240160206040518083038186803b1580156111e457600080fd5b505afa1580156111f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121c91906127ad565b60025460405163449cbd5160e01b81526001600160a01b0388811660048301529293506000929091169063449cbd519060240160206040518083038186803b15801561126757600080fd5b505afa15801561127b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129f91906127ad565b90506112ae81620186a0612ba5565b620186a06112bc8482612ba5565b6112c69086612bbc565b6112d09190612bdb565b14611312576001620186a06112e58482612ba5565b6112ef9086612bbc565b6112f99190612bdb565b61130690620186a0612ba5565b9450945050505061131d565b600080945094505050505b9250929050565b600480546040516370a0823160e01b81526001600160a01b0384811693820184905292319260009283928392909116906370a082319060240160206040518083038186803b15801561137557600080fd5b505afa158015611389573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ad91906127ad565b60048054600354604051636eb1769f60e11b81526001600160a01b038a8116948201949094529083166024820152929550169063dd62ed3e9060440160206040518083038186803b15801561140157600080fd5b505afa158015611415573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143991906127ad565b6005546040516370a0823160e01b81526001600160a01b0388811660048301529294509116906370a082319060240160206040518083038186803b15801561148057600080fd5b505afa158015611494573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b891906127ad565b90509193509193565b600054610100900460ff16158080156114e15750600054600160ff909116105b806114fb5750303b1580156114fb575060005460ff166001145b6115205760405162461bcd60e51b815260040161151790612bfd565b60405180910390fd5b6000805460ff191660011790558015611543576000805461ff0019166101001790555b6001600160a01b0384163b6115925760405162461bcd60e51b81526020600482015260156024820152741c1bdcda5d1a5bdb95985d5b1d081a5b9d985b1a59605a1b6044820152606401611517565b6001600160a01b0383163b6115de5760405162461bcd60e51b81526020600482015260126024820152711bdc99195c95985d5b1d081a5b9d985b1a5960721b6044820152606401611517565b600180546001600160a01b038087166001600160a01b03199283161790925560008054868416620100000262010000600160b01b031990911617905560028054928516929091169190911790558015611671576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b600054600290610100900460ff16158015611699575060005460ff8083169116105b6116b55760405162461bcd60e51b815260040161151790612bfd565b6000805461ffff191660ff8316176101001790556116dc856001600160a01b03163b151590565b6117185760405162461bcd60e51b815260206004820152600d60248201526c15985d5b1d081a5b9d985b1a59609a1b6044820152606401611517565b6001600160a01b0382163b61175e5760405162461bcd60e51b815260206004820152600c60248201526b1b9cdb1c081a5b9d985b1a5960a21b6044820152606401611517565b6001600160a01b0384163b6117a45760405162461bcd60e51b815260206004820152600c60248201526b1554d110c81a5b9d985b1a5960a21b6044820152606401611517565b6001600160a01b0383163b6117eb5760405162461bcd60e51b815260206004820152600d60248201526c1b9cdd5cd9081a5b9d985b1a59609a1b6044820152606401611517565b600380546001600160a01b03199081166001600160a01b0388811691909117909255600680548216858416179055600480548216878416179055600580549091169185169190911790556000805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6001546040516307cc1a7b60e41b81526001600160a01b038381166004830152606092839283928392839283926000921690637cc1a7b09060240160006040518083038186803b1580156118d057600080fd5b505afa1580156118e4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261190c9190810190612b20565b80519091506000816001600160401b0381111561192b5761192b612202565b60405190808252806020026020018201604052801561196457816020015b6119516120b6565b8152602001906001900390816119495790505b5090506000826001600160401b0381111561198157611981612202565b6040519080825280602002602001820160405280156119ba57816020015b6119a761211d565b81526020019060019003908161199f5790505b5090506000836001600160401b038111156119d7576119d7612202565b604051908082528060200260200182016040528015611a1757816020015b6040805160208101909152606081528152602001906001900390816119f55790505b5090506000846001600160401b03811115611a3457611a34612202565b604051908082528060200260200182016040528015611a8957816020015b611a7660405180606001604052806000815260200160008152602001600081525090565b815260200190600190039081611a525790505b5090506000856001600160401b03811115611aa657611aa6612202565b604051908082528060200260200182016040528015611afb57816020015b611ae860405180606001604052806000815260200160008152602001600081525090565b815260200190600190039081611ac45790505b50905060005b86811015611dd5576000888281518110611b1d57611b1d61281c565b602090810291909101015160015460405163eb02c30160e01b8152600481018390529192506001600160a01b03169063eb02c301906024016101406040518083038186803b158015611b6e57600080fd5b505afa158015611b82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ba6919061284d565b878381518110611bb857611bb861281c565b602090810291909101015260005460405163d09ef24160e01b815260048101839052620100009091046001600160a01b03169063d09ef241906024016101206040518083038186803b158015611c0d57600080fd5b505afa158015611c21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4591906128f8565b868381518110611c5757611c5761281c565b602090810291909101015260005460405163f32af30160e01b815260048101839052620100009091046001600160a01b03169063f32af3019060240160006040518083038186803b158015611cab57600080fd5b505afa158015611cbf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ce7919081019061297a565b858381518110611cf957611cf961281c565b60209081029190910101526001546040516306393ef960e41b8152600481018390526001600160a01b0390911690636393ef909060240160606040518083038186803b158015611d4857600080fd5b505afa158015611d5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d809190612aaa565b848381518110611d9257611d9261281c565b6020026020010181905250611da681611dec565b838381518110611db857611db861281c565b60200260200101819052505080611dce90612b05565b9050611b01565b50959d939c50919a50985096509194509092505050565b611e1060405180606001604052806000815260200160008152602001600081525090565b60015460405163eb02c30160e01b8152600481018490526000916001600160a01b03169063eb02c301906024016101406040518083038186803b158015611e5657600080fd5b505afa158015611e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8e919061284d565b9050611eb460405180606001604052806000815260200160008152602001600081525090565b6002548251606084015160408086015161010087015191516334c86b6b60e01b81526001600160a01b03909516946334c86b6b94611ef99490939092916004016127c6565b60206040518083038186803b158015611f1157600080fd5b505afa158015611f25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4991906127ad565b815261012082015160025461010084015160e08501516060860151604080880151905163b76b634d60e01b8152600481019490945260248401929092526044830152151560648201526001600160a01b039091169063b76b634d9060840160206040518083038186803b158015611fbf57600080fd5b505afa158015611fd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ff791906127ad565b6120019190612804565b6020820152600254606083015160408085015161010086015160c087015192516322dfbe7f60e11b815260048101949094529015156024840152604483015260648201526001600160a01b03909116906345bf7cfe9060840160206040518083038186803b15801561207257600080fd5b505afa158015612086573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120aa91906127ad565b60408201529392505050565b60405180610140016040528060006001600160a01b0316815260200160006001600160a01b03168152602001600015158152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604080516101208101909152806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b038116811461217f57600080fd5b50565b6000806040838503121561219557600080fd5b82356121a08161216a565b946020939093013593505050565b801515811461217f57600080fd5b600080600080608085870312156121d257600080fd5b84356121dd8161216a565b935060208501356121ed816121ae565b93969395505050506040820135916060013590565b634e487b7160e01b600052604160045260246000fd5b60405161014081016001600160401b038111828210171561223b5761223b612202565b60405290565b60405161012081016001600160401b038111828210171561223b5761223b612202565b604051602081016001600160401b038111828210171561223b5761223b612202565b60405160e081016001600160401b038111828210171561223b5761223b612202565b604051601f8201601f191681016001600160401b03811182821017156122d0576122d0612202565b604052919050565b60006001600160401b038211156122f1576122f1612202565b5060051b60200190565b6000602080838503121561230e57600080fd5b82356001600160401b0381111561232457600080fd5b8301601f8101851361233557600080fd5b8035612348612343826122d8565b6122a8565b81815260059190911b8201830190838101908783111561236757600080fd5b928401925b828410156123855783358252928401929084019061236c565b979650505050505050565b600081518084526020808501945080840160005b8381101561242d57815180516001600160a01b039081168952848201511684890152604080820151151590890152606080820151908901526080808201519089015260a0808201519089015260c0808201519089015260e080820151908901526101008082015190890152610120908101519088015261014090960195908201906001016123a4565b509495945050505050565b634e487b7160e01b600052602160045260246000fd5b600081518084526020808501945080840160005b8381101561242d57815180516004811061247e5761247e612438565b8852808401518489015260408082015190890152606080820151908901526080808201519089015260a0808201519089015260c0808201519089015260e0808201519089015261010090810151908801526101209096019590820190600101612462565b600081518084526020808501808196506005915083821b81018387016000805b878110156125a9578484038b5282515187855280518886018190529088019060409081870190855b818110156125935784518051151584528c8101518d8501528481015185850152606080820151908501526080808201519085015260a0808201519085015260c090810151908c821061257e5761257e612438565b840152938b019360e09092019160010161252a565b50509c89019c9550505091860191600101612502565b50919998505050505050505050565b600081518084526020808501945080840160005b8381101561242d57815180518852838101518489015260409081015190880152606090960195908201906001016125cc565b60c0808252875190820181905260009060209060e0840190828b01845b828110156126375781518452928401929084019060010161261b565b5050508381038285015261264b818a612390565b9150508281036040840152612660818861244e565b9050828103606084015261267481876124e2565b9050828103608084015261268881866125b8565b905082810360a084015261269c81856125b8565b9998505050505050505050565b6000602082840312156126bb57600080fd5b81356126c68161216a565b9392505050565b600080604083850312156126e057600080fd5b82356126eb8161216a565b915060208301356126fb8161216a565b809150509250929050565b60008060006060848603121561271b57600080fd5b83356127268161216a565b925060208401356127368161216a565b915060408401356127468161216a565b809150509250925092565b6000806000806080858703121561276757600080fd5b84356127728161216a565b935060208501356127828161216a565b925060408501356127928161216a565b915060608501356127a28161216a565b939692955090935050565b6000602082840312156127bf57600080fd5b5051919050565b6001600160a01b03949094168452602084019290925215156040830152606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612817576128176127ee565b500190565b634e487b7160e01b600052603260045260246000fd5b805161283d8161216a565b919050565b805161283d816121ae565b6000610140828403121561286057600080fd5b612868612218565b61287183612832565b815261287f60208401612832565b602082015261289060408401612842565b6040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152506101208084015181830152508091505092915050565b80516004811061283d57600080fd5b6000610120828403121561290b57600080fd5b612913612241565b61291c836128e9565b81526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152508091505092915050565b6000602080838503121561298d57600080fd5b82516001600160401b03808211156129a457600080fd5b81850191508282870312156129b857600080fd5b6129c0612264565b8251828111156129cf57600080fd5b80840193505086601f8401126129e457600080fd5b825191506129f4612343836122d8565b82815260e09283028401850192858201919089851115612a1357600080fd5b948601945b84861015612a9c5780868b031215612a305760008081fd5b612a38612286565b8651612a43816121ae565b8152868801518882015260408088015190820152606080880151908201526080808801519082015260a0808801519082015260c08088015160058110612a895760008081fd5b9082015283529485019491860191612a18565b508252509695505050505050565b600060608284031215612abc57600080fd5b604051606081018181106001600160401b0382111715612ade57612ade612202565b80604052508251815260208301516020820152604083015160408201528091505092915050565b6000600019821415612b1957612b196127ee565b5060010190565b60006020808385031215612b3357600080fd5b82516001600160401b03811115612b4957600080fd5b8301601f81018513612b5a57600080fd5b8051612b68612343826122d8565b81815260059190911b82018301908381019087831115612b8757600080fd5b928401925b8284101561238557835182529284019290840190612b8c565b600082821015612bb757612bb76127ee565b500390565b6000816000190483118215151615612bd657612bd66127ee565b500290565b600082612bf857634e487b7160e01b600052601260045260246000fd5b500490565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b60608201526080019056fea2646970667358221220fbba83c9c9ed9ac1a529fc32fccb4f04d847e03ed19bb85ec41dfcdf04d842f664736f6c63430008090033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.