Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Cross-Chain Transactions
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0xe33d84fb...758633768 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
Market
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity 0.7.6;
pragma abicoder v2;
import "../libraries/SafeMath.sol";
import "../libraries/ReentrancyGuard.sol";
import "../libraries/SafeCast.sol";
import "../libraries/SignedSafeMath.sol";
import "../libraries/TransferHelper.sol";
//import "../interfaces/IERC20.sol";
import "./MarketStorage.sol";
import "../interfaces/IMarketLogic.sol";
import "../interfaces/IManager.sol";
import "../interfaces/IPool.sol";
import "../interfaces/IFundingLogic.sol";
import "../interfaces/IInviteManager.sol";
/// @notice A market represents a perpetual trading market, eg. BTC_USDT (USDT settled).
/// YFX.com provides a diverse perpetual contracts including two kinds of position model, which are one-way position and
/// the hedging positiion mode, as well as three kinds of perpetual contracts, which are the linear contracts, the inverse contracts and the quanto contracts.
contract Market is MarketStorage, ReentrancyGuard {
using SafeMath for uint256;
using SignedSafeMath for int256;
using SignedSafeMath for int8;
using SafeCast for int256;
using SafeCast for uint256;
constructor(address _manager, address _marketLogic, address _fundingLogic){
//require(_manager != address(0) && _marketLogic != address(0) && _fundingLogic != address(0), "Market: address is zero address");
require(_manager != address(0) && _marketLogic != address(0), "Market: address is zero address");
manager = _manager;
marketLogic = _marketLogic;
fundingLogic = _fundingLogic;
}
modifier onlyManager() {
require(msg.sender == manager, "Market: only manager");
_;
}
modifier onlyController() {
require(IManager(manager).checkController(msg.sender), "Market: Must be controller");
_;
}
modifier onlyRouter() {
require(IManager(manager).checkRouter(msg.sender), "Market: Must be router");
_;
}
modifier whenNotCreateOrderPaused() {
require(!marketConfig.createOrderPaused, "Market:Open paused");
_;
}
modifier whenNotSetTPSLPricePaused() {
require(!marketConfig.setTPSLPricePaused, "Market:Set price paused");
_;
}
modifier whenUpdateMarginPaused() {
require(!marketConfig.updateMarginPaused, "Market: Update margin pause");
_;
}
/// @notice initialize market, only manager can call
/// @param _token actually the price key, eg. "BTC_USDT"
/// @param _marginAsset margin asset address
/// @param _pool pool address
/// @param _marketType market type: {0: linear, 1: inverse, 2: quanto}
function initialize(string memory _token, address _marginAsset, address _pool, uint8 _marketType) external {
require(msg.sender == manager && _marginAsset != address(0) && _pool != address(0), "Market: Must be manager or valid address");
token = _token;
marginAsset = _marginAsset;
pool = _pool;
marketType = _marketType;
emit Initialize(_token, _marginAsset, _pool, _marketType);
}
/// @notice set market params, only controller can call
/// @param _marketLogic market logic address
/// @param _fundingLogic funding logic address
function modifyLogicAddresses(
address _marketLogic,
address _fundingLogic
) external onlyController {
require(_marketLogic != address(0), "Market: invalid address");
if (fundingLogic != address(0)) {
require(_fundingLogic != address(0), "Market: invalid address");
}
marketLogic = _marketLogic;
fundingLogic = _fundingLogic;
emit LogicAddressesModified(marketLogic, fundingLogic);
}
/// @notice set general market configurations, only controller can call
/// @param _config configuration parameters
function setMarketConfig(MarketDataStructure.MarketConfig memory _config) external onlyManager {
marketConfig = _config;
emit SetMarketConfig(marketConfig);
}
/// @notice switch position mode, users can choose the one-way or hedging positon mode for a specific market
/// @param _taker taker address
/// @param _mode mode {0: one-way, 1: hedging}
function switchPositionMode(address _taker, MarketDataStructure.PositionMode _mode) external onlyRouter {
positionModes[_taker] = _mode;
emit SwitchPositionMode(_taker, _mode);
}
/// @notice create a new order
/// @param params order parameters
/// @return id order id
function createOrder(MarketDataStructure.CreateInternalParams memory params) external nonReentrant onlyRouter whenNotCreateOrderPaused returns (uint256 id) {
return _createOrder(params);
}
function _createOrder(MarketDataStructure.CreateInternalParams memory params) internal returns (uint256) {
MarketDataStructure.Order memory order = IMarketLogic(marketLogic).createOrderInternal(params);
order.id = order.orderType == MarketDataStructure.OrderType.Open || order.orderType == MarketDataStructure.OrderType.Close ? ++orderID : ++triggerOrderID;
orders[order.id] = order;
takerOrderList[params._taker].push(order.id);
if (!params.isLiquidate) takerOrderNum[params._taker][order.orderType] ++;
_setTakerOrderTotalValue(order.taker, order.orderType, order.direction, order.freezeMargin.mul(order.takerLeverage).toInt256());
if (!params.isLiquidate) IMarketLogic(marketLogic).checkOrder(order.id);
return order.id;
}
struct ExecuteOrderInternalParams {
uint256 price;
bytes32 code;
address inviter;
uint256 discountRate;
uint256 inviteRate;
MarketDataStructure.Order order;
MarketDataStructure.Position position;
MarketDataStructure.Position oldPosition;
MarketDataStructure.TradeResponse response;
uint256 errorCode;
address inviteManager;
int256 settleDustMargin; // dust margin part to be settled
}
/// @notice execute an order
/// @param _id order id
/// @return resultCode execute result 0:open success;1:order open fail;2:trigger order open fail
/// @return _positionId position id
function executeOrder(uint256 _id) external nonReentrant onlyRouter returns (int256 resultCode, uint256 _positionId) {
ExecuteOrderInternalParams memory params;
params.order = orders[_id];
//freezeMargin > 0 ,order type is open and position direction is same as order direction;freezeMargin = 0,order type is close and position direction is neg of order direction
int8 positionDirection;
if (isOpenOrder(params.order.orderType)) {
positionDirection = params.order.direction;
} else {
positionDirection = params.order.direction.neg256().toInt8();
}
MarketDataStructure.PositionKey key = getPositionKey(params.order.taker, positionDirection);
_positionId = takerPositionList[params.order.taker][key];
if (_positionId == 0) {
_positionId = ++positionID;
takerPositionList[params.order.taker][key] = _positionId;
}
//store position last funding rate
orders[_id].frLastX96 = takerPositions[_positionId].frLastX96;
//store position last funding amount
orders[_id].fundingAmount = takerPositions[_positionId].amount.toInt256().mul(takerPositions[_positionId].direction);
IPool(pool).updateBorrowIG();
_settleFunding(takerPositions[_positionId]);
params.oldPosition = takerPositions[_positionId];
params.inviteManager = IManager(manager).inviteManager();
(params.code, params.inviter, params.discountRate, params.inviteRate) = IInviteManager(params.inviteManager).getReferrerCodeByTaker(orders[_id].taker);
if (params.order.orderType == MarketDataStructure.OrderType.Open || params.order.orderType == MarketDataStructure.OrderType.Close) {
lastExecutedOrderId = _id;
}
(params.order, params.position, params.response, params.errorCode) = IMarketLogic(marketLogic).trade(_id, _positionId, params.discountRate, params.inviteRate);
if (params.errorCode != 0) {
emit ExecuteOrderError(_id, params.errorCode);
if (params.errorCode == 5) {
return (2, _positionId);
}
orders[_id].status = MarketDataStructure.OrderStatus.OpenFail;
return (1, _positionId);
}
params.order.code = params.code;
// if (params.order.freezeMargin > 0) TransferHelper.safeTransfer(marginAsset,IManager(manager).vault(), params.order.freezeMargin);
if (params.order.freezeMargin > 0) _transfer(IManager(manager).vault(), params.order.freezeMargin);
takerOrderNum[params.order.taker][params.order.orderType]--;
_setTakerOrderTotalValue(params.order.taker, params.order.orderType, params.order.direction, params.order.freezeMargin.mul(params.order.takerLeverage).toInt256().neg256());
if (params.position.amount < marketConfig.DUST && params.position.amount > 0) {
params.settleDustMargin = params.position.takerMargin.toInt256().sub(params.position.fundingPayment).sub(params.response.leftInterestPayment.toInt256());
if (params.settleDustMargin > 0) {
params.response.toTaker = params.response.toTaker.add(params.settleDustMargin.toUint256());
} else {
params.order.rlzPnl = params.order.rlzPnl.add(params.settleDustMargin);
}
emit DustPositionClosed(
params.position.id,
params.position.amount,
params.position.takerMargin,
params.position.makerMargin,
params.position.value,
params.position.fundingPayment,
params.response.leftInterestPayment
);
params.order.interestPayment = params.order.interestPayment.add(params.response.leftInterestPayment);
params.order.fundingPayment = params.order.fundingPayment.add(params.position.fundingPayment);
params.position.fundingPayment = 0;
params.position.takerMargin = 0;
params.position.makerMargin = 0;
params.position.debtShare = 0;
params.position.amount = 0;
params.position.value = 0;
params.response.isIncreasePosition = false;
}
if (params.response.isIncreasePosition) {
IPool(pool).openUpdate(IPool.OpenUpdateInternalParams(
params.response.isDecreasePosition ? params.position.makerMargin : params.position.makerMargin.sub(params.oldPosition.makerMargin),
params.response.isDecreasePosition ? params.position.takerMargin : params.position.takerMargin.sub(params.oldPosition.takerMargin),
params.response.isDecreasePosition ? params.position.amount : params.position.amount.sub(params.oldPosition.amount),
params.response.isDecreasePosition ? params.position.value : params.position.value.sub(params.oldPosition.value),
params.response.isDecreasePosition ? 0 : params.order.feeToMaker,
params.order.direction,
params.order.freezeMargin,
params.order.taker,
params.response.isDecreasePosition ? 0 : params.order.feeToInviter,
params.inviter,
params.response.isDecreasePosition ? params.position.debtShare : params.position.debtShare.sub(params.oldPosition.debtShare),
params.response.isDecreasePosition ? 0 : params.order.feeToExchange
)
);
}
if (params.response.isDecreasePosition) {
IPool(pool).closeUpdate(
IPool.CloseUpdateInternalParams(
params.response.isIncreasePosition ? params.oldPosition.makerMargin : params.oldPosition.makerMargin.sub(params.position.makerMargin),
params.response.isIncreasePosition ? params.oldPosition.takerMargin : params.oldPosition.takerMargin.sub(params.position.takerMargin),
params.response.isIncreasePosition ? params.oldPosition.amount : params.oldPosition.amount.sub(params.position.amount),
params.response.isIncreasePosition ? params.oldPosition.value : params.oldPosition.value.sub(params.position.value),
params.order.rlzPnl.neg256(),
params.order.feeToMaker,
params.response.isIncreasePosition ? params.oldPosition.fundingPayment : params.oldPosition.fundingPayment.sub(params.position.fundingPayment),
params.oldPosition.direction,
params.response.isIncreasePosition ? 0 : params.order.freezeMargin,
params.response.isIncreasePosition ? params.oldPosition.debtShare : params.oldPosition.debtShare.sub(params.position.debtShare),
params.order.interestPayment,
params.oldPosition.isETH,
0,
params.response.toTaker,
params.order.taker,
params.order.feeToInviter,
params.inviter,
params.order.feeToExchange
)
);
}
IInviteManager(params.inviteManager).updateTradeValue(marketType, params.order.taker, params.inviter, params.response.tradeValue);
emit ExecuteFeeInfo(params.order.id, params.order.code, params.order.taker, params.inviter, marginAsset, params.response.tradeValue, params.order.feeToDiscount, params.order.feeToInviter);
if (params.response.isIncreasePosition && !params.response.isDecreasePosition) {
require(params.position.amount > params.oldPosition.amount, "Market:position amount error");
} else if (!params.response.isIncreasePosition && params.response.isDecreasePosition) {
require(params.position.amount < params.oldPosition.amount, "Market:position amount error");
} else {
require(params.position.direction != params.oldPosition.direction, "Market:position direction error");
}
orders[_id] = params.order;
takerPositions[_positionId] = params.position;
return (0, _positionId);
}
struct LiquidateInternalParams {
IMarketLogic.LiquidateInfoResponse response;
uint256 toTaker;
bytes32 code;
address inviter;
uint256 discountRate;
uint256 inviteRate;
address inviteManager;
}
///@notice liquidate position
///@param _id position id
///@param action liquidate type
///@return liquidate order id
function liquidate(uint256 _id, MarketDataStructure.OrderType action) public nonReentrant onlyRouter returns (uint256) {
LiquidateInternalParams memory params;
MarketDataStructure.Position storage position = takerPositions[_id];
require(position.amount > 0, "Market: position does not exist");
//create liquidate order
MarketDataStructure.Order storage order = orders[_createOrder(MarketDataStructure.CreateInternalParams(position.taker, position.id, 0, 0, 0, position.amount, position.takerLeverage, position.direction.neg256().toInt8(), 0, 0, 1, true, position.isETH))];
order.frLastX96 = position.frLastX96;
order.fundingAmount = position.amount.toInt256().mul(position.direction);
//update interest rate
IPool(pool).updateBorrowIG();
//settle funding rate
_settleFunding(position);
order.frX96 = fundingGrowthGlobalX96;
order.fundingPayment = position.fundingPayment;
params.inviteManager = IManager(manager).inviteManager();
(params.code, params.inviter, params.discountRate, params.inviteRate) = IInviteManager(params.inviteManager).getReferrerCodeByTaker(order.taker);
//get liquidate info by marketLogic
params.response = IMarketLogic(marketLogic).getLiquidateInfo(IMarketLogic.LiquidityInfoParams(position, action, params.discountRate, params.inviteRate));
//update order info
order.code = params.code;
order.takerFee = params.response.takerFee;
order.feeToMaker = params.response.feeToMaker;
order.feeToExchange = params.response.feeToExchange;
order.feeToInviter = params.response.feeToInviter;
order.feeToDiscount = params.response.feeToDiscount;
order.orderType = action;
order.interestPayment = params.response.payInterest;
order.riskFunding = params.response.riskFunding;
order.rlzPnl = params.response.pnl;
order.status = MarketDataStructure.OrderStatus.Opened;
order.tradeTs = block.timestamp;
order.tradePrice = params.response.price;
order.tradeIndexPrice= params.response.indexPrice;
//liquidate position,update close position info in pool
IPool(pool).closeUpdate(
IPool.CloseUpdateInternalParams(
position.makerMargin,
position.takerMargin,
position.amount,
position.value,
params.response.pnl.neg256(),
params.response.feeToMaker,
position.fundingPayment,
position.direction,
0,
position.debtShare,
params.response.payInterest,
position.isETH,
order.riskFunding,
params.response.toTaker,
position.taker,
order.feeToInviter,
params.inviter,
order.feeToExchange
)
);
//emit invite info
if (order.orderType != MarketDataStructure.OrderType.Liquidate) {
IInviteManager(params.inviteManager).updateTradeValue(marketType, order.taker, params.inviter, params.response.tradeValue);
emit ExecuteFeeInfo(order.id, order.code, order.taker, marginAsset, params.inviter, params.response.tradeValue, params.response.feeToDiscount, params.response.feeToInviter);
}
//update position info
position.amount = 0;
position.makerMargin = 0;
position.takerMargin = 0;
position.value = 0;
//position cumulative rlz pnl
position.pnl = position.pnl.add(order.rlzPnl);
position.fundingPayment = 0;
position.lastUpdateTs = 0;
position.stopLossPrice = 0;
position.takeProfitPrice = 0;
position.lastTPSLTs = 0;
//clear position debt share
position.debtShare = 0;
return order.id;
}
///@notice update market funding rate
function updateFundingGrowthGlobal() external {
_updateFundingGrowthGlobal();
}
///@notice update market funding rate
///@param position taker position
///@return _fundingPayment
function _settleFunding(MarketDataStructure.Position storage position) internal returns (int256 _fundingPayment){
/// @notice once funding logic address set, address(0) is not allowed to use
if (fundingLogic == address(0)) {
return 0;
}
_updateFundingGrowthGlobal();
_fundingPayment = IFundingLogic(fundingLogic).getFundingPayment(address(this), position.id, fundingGrowthGlobalX96);
if (block.timestamp != lastFrX96Ts) {
lastFrX96Ts = block.timestamp;
}
position.frLastX96 = fundingGrowthGlobalX96;
if (_fundingPayment != 0) {
position.fundingPayment = position.fundingPayment.add(_fundingPayment);
IPool(pool).updateFundingPayment(address(this), _fundingPayment);
}
}
///@notice update market funding rate
function _updateFundingGrowthGlobal() internal {
//calc current funding rate by fundingLogic
if (fundingLogic != address(0)) {
fundingGrowthGlobalX96 = IFundingLogic(fundingLogic).getFunding(address(this));
}
}
///@notice cancel order, only router can call
///@param _id order id
function cancel(uint256 _id) external nonReentrant onlyRouter {
MarketDataStructure. Order storage order = orders[_id];
require(order.status == MarketDataStructure.OrderStatus.Open || order.status == MarketDataStructure.OrderStatus.OpenFail, "Market:not open");
order.status = MarketDataStructure.OrderStatus.Canceled;
//reduce taker order count
takerOrderNum[order.taker][order.orderType]--;
_setTakerOrderTotalValue(order.taker, order.orderType, order.direction, order.freezeMargin.mul(order.takerLeverage).toInt256().neg256());
// if (order.freezeMargin > 0)TransferHelper.safeTransfer(marginAsset,msg.sender, order.freezeMargin);
if (order.freezeMargin > 0) _transfer(msg.sender, order.freezeMargin);
}
function _setTakerOrderTotalValue(address _taker, MarketDataStructure.OrderType orderType, int8 _direction, int256 _value) internal {
if (isOpenOrder(orderType)) {
_value = _value.mul(AMOUNT_PRECISION).div(marketConfig.marketAssetPrecision.toInt256());
//reduce taker order total value
takerOrderTotalValues[_taker][_direction] = takerOrderTotalValues[_taker][_direction].add(_value);
}
}
///@notice set order stop profit and loss price, only router can call
///@param _id position id
///@param _profitPrice take profit price
///@param _stopLossPrice stop loss price
function setTPSLPrice(uint256 _id, uint256 _profitPrice, uint256 _stopLossPrice) external onlyRouter whenNotSetTPSLPricePaused {
takerPositions[_id].takeProfitPrice = _profitPrice;
takerPositions[_id].stopLossPrice = _stopLossPrice;
takerPositions[_id].lastTPSLTs = block.timestamp;
}
///@notice increase or decrease taker margin, only router can call
///@param _id position id
///@param _updateMargin increase or decrease margin
function updateMargin(uint256 _id, uint256 _updateMargin, bool isIncrease) external nonReentrant onlyRouter whenUpdateMarginPaused {
MarketDataStructure.Position storage position = takerPositions[_id];
int256 _deltaMargin;
if (isIncrease) {
position.takerMargin = position.takerMargin.add(_updateMargin);
_deltaMargin = _updateMargin.toInt256();
} else {
position.takerMargin = position.takerMargin.sub(_updateMargin);
_deltaMargin = _updateMargin.toInt256().neg256();
}
//update taker margin in pool
IPool(pool).takerUpdateMargin(address(this), position.taker, _deltaMargin, position.isETH);
emit UpdateMargin(_id, _deltaMargin);
}
function _transfer(address to, uint256 amount) internal {
TransferHelper.safeTransfer(marginAsset, to, amount);
}
function isOpenOrder(MarketDataStructure.OrderType orderType) internal pure returns (bool) {
return orderType == MarketDataStructure.OrderType.Open || orderType == MarketDataStructure.OrderType.TriggerOpen;
}
///@notice get taker position id
///@param _taker taker address
///@param _direction position direction
///@return position id
function getPositionId(address _taker, int8 _direction) public view returns (uint256) {
return takerPositionList[_taker][getPositionKey(_taker, _direction)];
}
function getPositionKey(address _taker, int8 _direction) internal view returns (MarketDataStructure.PositionKey key) {
//if position mode is oneway,position key is 2,else if direction is 1,position key is 1,else position key is 0
if (positionModes[_taker] == MarketDataStructure.PositionMode.OneWay) {
key = MarketDataStructure.PositionKey.OneWay;
} else {
key = _direction == - 1 ? MarketDataStructure.PositionKey.Short : MarketDataStructure.PositionKey.Long;
}
}
function getPosition(uint256 _id) external view returns (MarketDataStructure.Position memory) {
return takerPositions[_id];
}
function getOrderIds(address _taker) external view returns (uint256[] memory) {
return takerOrderList[_taker];
}
function getOrder(uint256 _id) external view returns (MarketDataStructure.Order memory) {
return orders[_id];
}
function getLogicAddress() external view returns (address){
return fundingLogic;
}
function getMarketConfig() external view returns (MarketDataStructure.MarketConfig memory){
return marketConfig;
}
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity 0.7.6;
pragma abicoder v2;
import "../libraries/MarketDataStructure.sol";
contract MarketStorage {
// amount decimal 1e20
int256 public constant AMOUNT_PRECISION = 1e20;
string public token;//indexToken,like `BTC_USD`,price key
uint8 public marketType = 0;//contract type ,0:usd-m,1:coin-m,2:mix-m
address public pool;//pool address
address internal manager;//manager address
address public marketLogic;//marketLogic address
address internal fundingLogic;//fundingLogic address
address internal marginAsset;//margin asset address
MarketDataStructure.MarketConfig internal marketConfig;//marketConfig
uint256 public positionID;//positionID
uint256 public orderID;//orderID
uint256 public triggerOrderID = type(uint128).max; //trigger Order ID
//taker => key => positionID
mapping(address => mapping(MarketDataStructure.PositionKey => uint256)) internal takerPositionList;//key: short;long;cross
//taker => orderID[]
mapping(address => uint256[]) internal takerOrderList;
//orderId => order
mapping(uint256 => MarketDataStructure.Order) internal orders;
//positionId => position
mapping(uint256 => MarketDataStructure.Position) internal takerPositions;
//taker => marginMode
mapping(address => MarketDataStructure.PositionMode) public positionModes;//0 cross marginMode;1 Isolated marginMode
//taker => orderType => orderNum, orderNum < maxOrderLimit
mapping(address => mapping(MarketDataStructure.OrderType => uint256)) public takerOrderNum;
//taker => direction => orderTotalValue,orderTotalValue < maxOrderValueLimit
mapping(address => mapping(int8 => int256)) public takerOrderTotalValues;
//cumulative funding rate,it`s last funding rate, fundingGrowthGlobalX96 be equivalent to frX96
int256 public fundingGrowthGlobalX96;
//last update funding rate timestamp
uint256 public lastFrX96Ts;//lastFrX96Ts
uint256 public lastExecutedOrderId;
event Initialize(string indexToken, address _clearAnchor, address _pool, uint8 _marketType);
event LogicAddressesModified(address _marketLogic, address _fundingLogic);
event SetMarketConfig(MarketDataStructure.MarketConfig _marketConfig);
event ExecuteOrderError(uint256 _orderId, uint256 _errCode);
event ExecuteFeeInfo(uint256 id, bytes32 code, address taker, address inviter, address token, uint256 value, uint256 feeToInviter, uint256 feeToDiscount);
event UpdateMargin(uint256 id, int256 deltaMargin);
event SwitchPositionMode(address taker, MarketDataStructure.PositionMode mode);
event DustPositionClosed(uint256 positionId, uint256 amount, uint256 takerMargin, uint256 makerMargin, uint256 value, int256 fundingPayment, uint256 interestPayment);
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity 0.7.6;
pragma abicoder v2;
import "../libraries/PoolDataStructure.sol";
import "../interfaces/IPool.sol";
contract PoolStorage {
//
// data for this pool
//
// constant
uint256 constant RATE_PRECISION = 1e6; // example rm lp fee rate 1000/1e6=0.001
uint256 constant PRICE_PRECISION = 1e10;
uint256 constant AMOUNT_PRECISION = 1e20;
// contracts addresses used
address public vault; // vault address
address baseAsset; // base token address
address marketPriceFeed; // price feed contract address
uint256 public baseAssetDecimals; // base token decimals
address public interestLogic; // interest logic address
address public WETH; // WETH address
bool public addPaused = false; // flag for adding liquidity
bool public removePaused = false; // flag for remove liquidity
uint256 public minRemoveLiquidityAmount; // minimum amount (lp) for removing liquidity
uint256 public minAddLiquidityAmount; // minimum amount (asset) for add liquidity
uint256 public removeLiquidityFeeRate = 1000; // fee ratio for removing liquidity
uint256 public balance; // balance that is available to use of this pool
uint256 public reserveRate; // reserve ratio
uint256 public sharePrice; // net value
uint256 public cumulateRmLiqFee; // cumulative fee collected when removing liquidity
uint256 public autoId = 1; // liquidity operations order id
mapping(address => uint256) lastOperationTime; // mapping of last operation timestamp for addresses
address[] public marketList; // supported markets array
mapping(address => bool) public isMarket; // supported markets mapping
mapping(uint256 => PoolDataStructure.MakerOrder) makerOrders; // liquidity orders
mapping(address => uint256[]) public makerOrderIds; // mapping of liquidity orders for addresses
mapping(address => uint256) public freezeBalanceOf; // frozen liquidity amount when removing
mapping(address => MarketConfig) public marketConfigs; // mapping of market configs
mapping(address => DataByMarket) public poolDataByMarkets; // mapping of market data
mapping(int8 => IPool.InterestData) public interestData; // mapping of interest data for position directions (long or short)
//structs
struct MarketConfig {
uint256 marketType;
uint256 fundUtRateLimit; // fund utilization ratio limit, 0: cant't open; example 200000 r = fundUtRateLimit/RATE_PRECISION=0.2
uint256 openLimit; // 0: 0 authorized credit limit; > 0 limit is min(openLimit, fundUtRateLimit * balance)
}
struct DataByMarket {
int256 rlzPNL; // realized profit and loss
uint256 cumulativeFee; // cumulative trade fee for pool
uint256 longMakerFreeze; // user total long margin freeze, that is the pool short margin freeze
uint256 shortMakerFreeze; // user total short margin freeze, that is pool long margin freeze
uint256 takerTotalMargin; // all taker's margin
int256 makerFundingPayment; // pending fundingPayment
uint256 longAmount; // sum asset for long pos
uint256 longOpenTotal; // sum value for long pos
uint256 shortAmount; // sum asset for short pos
uint256 shortOpenTotal; // sum value for short pos
}
event RegisterMarket(address market);
event SetMinAddLiquidityAmount(uint256 minAmount);
event SetMinRemoveLiquidity(uint256 minLp);
event SetOpenRateAndLimit(address market, uint256 openRate, uint256 openLimit);
event SetReserveRate(uint256 reserveRate);
event SetRemoveLiquidityFeeRatio(uint256 feeRate);
event SetPaused(bool addPaused, bool removePaused);
event SetInterestLogic(address interestLogic);
event SetMarketPriceFeed(address marketPriceFeed);
event PoolSettledFundingPaymentAndInterestInfo(address pool, int256 fundingPayment, uint256 interest);
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.6.0 <0.8.0;
interface IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address owner) external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
/**
* @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);
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.6.0 <0.8.0;
pragma abicoder v2;
import "../libraries/MarketDataStructure.sol";
interface IFundingLogic {
function getFunding(address market) external view returns (int256 fundingGrowthGlobalX96);
function getFundingPayment(address market, uint256 positionId, int256 fundingGrowthGlobalX96) external view returns (int256 fundingPayment);
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.6.0 <0.8.0;
interface IInviteManager {
function setTraderReferralCode(address _account, bytes32 _code) external;
function getReferrerCodeByTaker(address _taker) external view returns (bytes32, address, uint256, uint256);
function updateTradeValue(uint8 _marketType, address _taker, address _inviter, uint256 _tradeValue) external;
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.6.0 <0.8.0;
pragma abicoder v2;
interface IManager {
function vault() external view returns (address);
function riskFunding() external view returns (address);
function checkSigner(address _signer) external view returns (bool);
function checkController(address _controller) view external returns (bool);
function checkRouter(address _router) external view returns (bool);
function checkMarket(address _market) external view returns (bool);
function checkPool(address _pool) external view returns (bool);
function cancelElapse() external view returns (uint256);
function triggerOrderDuration() external view returns (uint256);
function paused() external returns (bool);
function getMakerByMarket(address maker) external view returns (address);
function getMarketMarginAsset(address) external view returns (address);
function isFundingPaused() external view returns (bool);
function isInterestPaused() external view returns (bool);
function executeOrderFee() external view returns (uint256);
function inviteManager() external view returns (address);
function getAllMarkets() external view returns (address[] memory);
function getAllPools() external view returns (address[] memory);
function orderNumLimit() external view returns (uint256);
function checkTreasurer(address _treasurer) external view returns (bool);
function checkLiquidator(address _liquidator) external view returns (bool);
function communityExecuteOrderDelay() external view returns (uint256);
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.6.0 <0.8.0;
pragma abicoder v2;
import "../libraries/MarketDataStructure.sol";
interface IMarketLogic {
struct LiquidityInfoParams {
MarketDataStructure.Position position;
MarketDataStructure.OrderType action;
uint256 discountRate;
uint256 inviteRate;
}
struct LiquidateInfoResponse {
int256 pnl;
uint256 takerFee;
uint256 feeToMaker;
uint256 feeToExchange;
uint256 feeToInviter;
uint256 feeToDiscount;
uint256 riskFunding;
uint256 payInterest;
uint256 toTaker;
uint256 tradeValue;
uint256 price;
uint256 indexPrice;
}
function trade(uint256 id, uint256 positionId, uint256, uint256) external view returns (MarketDataStructure.Order memory order, MarketDataStructure.Position memory position, MarketDataStructure.TradeResponse memory response, uint256 errCode);
function createOrderInternal(MarketDataStructure.CreateInternalParams memory params) external view returns (MarketDataStructure.Order memory order);
function getLiquidateInfo(LiquidityInfoParams memory params) external view returns (LiquidateInfoResponse memory response);
function isLiquidateOrProfitMaximum(MarketDataStructure.Position memory position, uint256 mm, uint256 indexPrice, uint256 toPrecision) external view returns (bool);
function getMaxTakerDecreaseMargin(MarketDataStructure.Position memory position) external view returns (uint256 maxDecreaseMargin);
function checkOrder(uint256 id) external view;
function checkSwitchMode(address _market, address _taker, MarketDataStructure.PositionMode _mode) external view;
function checkoutConfig(address market, MarketDataStructure.MarketConfig memory _config) external view;
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.6.0 <0.8.0;
pragma abicoder v2;
import "../libraries/PoolDataStructure.sol";
import "../core/PoolStorage.sol";
interface IPool {
struct InterestData {
uint256 totalBorrowShare;
uint256 lastInterestUpdateTs;
uint256 borrowIG;
}
/// @notice the following tow structs are parameters used to update pool data when an order is executed.
/// We differ the affect of the executed order by result as open or close,
/// which represents increase or decrease the position.
/// Normally, there's one type of pool update operation during one order execution,
/// excepts in the one-way position model, when an order causing the position reversal, both opening and
/// closing process will be executed respectively.
struct OpenUpdateInternalParams {
uint256 _makerMargin; // pool balance taken by this order
uint256 _takerMargin; // taker margin for this order
uint256 _amount; // order amount
uint256 _total; // order value
uint256 makerFee; // fees distributed to the pool, specially when an order causes the position reversal, the fee to maker will be updated in the closing process
int8 _takerDirection; // order direction
uint256 marginToVault; // margin should transferred to the vault
address taker; // taker address
uint256 feeToInviter; // fees distributed to the inviter, specially when an order causes the position reversal, the fee to maker will be updated in the closing process
address inviter; // inviter address
uint256 deltaDebtShare; //add position debt share
uint256 feeToExchange; // fee distributed to the protocol, specially when an order causes the position reversal, the fee to maker will be updated in the closing process
}
struct CloseUpdateInternalParams {
uint256 _makerMargin;//reduce maker margin,taker margin,amount,value
uint256 _takerMargin;
uint256 _amount;
uint256 _total;
int256 _makerProfit;
uint256 makerFee; //trade fee to maker
int256 fundingPayment;//settled funding payment
int8 _takerDirection;//old position direction
uint256 marginToVault;// reduce position size ,order margin should be to record in vault
uint256 deltaDebtShare;//reduce position debt share
uint256 payInterest;//settled interest payment
bool isOutETH;//margin is ETH
uint256 toRiskFund;
uint256 toTaker;//balance of reduce position to taker
address taker;//taker address
uint256 feeToInviter; //trade fee to inviter
address inviter;//inviter address
uint256 feeToExchange;//fee to exchange
}
event Mint(address indexed sender, uint256 amount0, uint256 amount1);
event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address owner) external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
function setMinAddLiquidityAmount(uint256 _minAmount) external returns (bool);
function setMinRemoveLiquidity(uint256 _minLiquidity) external returns (bool);
function setOpenRate(address _market, uint256 _openRate, uint256 _openLimit) external returns (bool);
//function setRemoveLiquidityFeeRatio(uint256 _rate) external returns (bool);
function canOpen(address _market, uint256 _makerMargin) external view returns (bool);
function getMakerOrderIds(address _maker) external view returns (uint256[] memory);
function getOrder(uint256 _no) external view returns (PoolDataStructure.MakerOrder memory);
function openUpdate(OpenUpdateInternalParams memory params) external returns (bool);
function closeUpdate(CloseUpdateInternalParams memory params) external returns (bool);
function takerUpdateMargin(address _market, address, int256 _margin, bool isOutETH) external returns (bool);
function addLiquidity(address sender, uint256 amount) external returns (uint256 _id);
function executeAddLiquidityOrder(uint256 id) external returns (uint256 liquidity);
function removeLiquidity(address sender, uint256 liquidity) external returns (uint256 _id, uint256 _liquidity);
function executeRmLiquidityOrder(uint256 id, bool isETH) external returns (uint256 amount);
function getLpBalanceOf(address _maker) external view returns (uint256 _balance, uint256 _totalSupply);
function registerMarket(address _market) external returns (bool);
function getSharePrice() external view returns (
uint256 _price,
uint256 _balance
);
function updateFundingPayment(address _market, int256 _fundingPayment) external;
function getMarketAmount(address _market) external view returns (uint256, uint256, uint256);
function getCurrentBorrowIG(int8 _direction) external view returns (uint256 _borrowRate, uint256 _borrowIG);
function getCurrentAmount(int8 _direction, uint256 share) external view returns (uint256);
function getCurrentShare(int8 _direction, uint256 amount) external view returns (uint256);
function updateBorrowIG() external;
function getAllMarketData() external view returns (PoolStorage.DataByMarket memory allMarketPos, uint256 allMakerFreeze);
function getAssetAmount() external view returns (uint256 amount);
function getBaseAsset() external view returns (address);
function getAutoId() external view returns (uint256);
// function updateLiquidatorFee(address _liquidator) external;
function minRemoveLiquidityAmount() external view returns (uint256);
function minAddLiquidityAmount() external view returns (uint256);
function removeLiquidityFeeRate() external view returns (uint256);
function reserveRate() external view returns (uint256);
function addPaused() external view returns (bool);
function removePaused() external view returns (bool);
function makerProfitForLiquidity(bool isAdd) external view returns (int256 unPNL);
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity 0.7.6;
/// @notice data structure used by Pool
library MarketDataStructure {
/// @notice enumerate of user trade order status
enum OrderStatus {
Open,
Opened,
OpenFail,
Canceled
}
/// @notice enumerate of user trade order types
enum OrderType{
Open,
Close,
TriggerOpen,
TriggerClose,
Liquidate,
TakeProfit,
UserTakeProfit,
UserStopLoss
}
/// @notice position mode, one-way or hedge
enum PositionMode{
OneWay,
Hedge
}
enum PositionKey{
Short,
Long,
OneWay
}
/// @notice Position data structure
struct Position {
uint256 id; // position id, generated by counter
address taker; // taker address
address market; // market address
int8 direction; // position direction
uint16 takerLeverage; // leverage used by trader
uint256 amount; // position amount
uint256 value; // position value
uint256 takerMargin; // margin of trader
uint256 makerMargin; // margin of maker(pool)
uint256 multiplier; // multiplier of quanto perpetual contracts
int256 frLastX96; // last settled funding global cumulative value
uint256 stopLossPrice; // stop loss price of this position set by trader
uint256 takeProfitPrice; // take profit price of this position set by trader
uint256 lastTPSLTs; // last timestamp of trading setting the stop loss price or take profit price
int256 fundingPayment; // cumulative funding need to pay of this position
uint256 debtShare; // borrowed share of interest module
int256 pnl; // cumulative realized pnl of this position
bool isETH; // true if the margin is payed by ETH
uint256 lastUpdateTs; // last updated timestamp of this position
}
/// @notice data structure of trading orders
struct Order {
uint256 id; // order id, generated by counter
address market; // market address
address taker; // trader address
int8 direction; // order direction
uint16 takerLeverage; // order leverage
int8 triggerDirection; // price condition if order is trigger order: {0: not available, 1: >=, -1: <= }
uint256 triggerPrice; // trigger price, 0: not available
uint256 freezeMargin; // frozen margin of this order
uint256 amount; // order amount
uint256 multiplier; // multiplier of quanto perpetual contracts
uint256 takerOpenPriceMin; // minimum trading price for slippage control
uint256 takerOpenPriceMax; // maximum trading price for slippage control
OrderType orderType; // order type
uint256 riskFunding; // risk funding penalty if this is a liquidate order
uint256 takerFee; // taker trade fee
uint256 feeToInviter; // reward of trading fee to the inviter
uint256 feeToExchange; // trading fee charged by protocol
uint256 feeToMaker; // fee reward to the pool
uint256 feeToDiscount; // fee discount
uint256 executeFee; // execution fee
bytes32 code; // invite code
uint256 tradeTs; // trade timestamp
uint256 tradePrice; // trade price
uint256 tradeIndexPrice; // index price when executing
int256 rlzPnl; // realized pnl by this order
int256 fundingPayment; // settled funding payment
int256 frX96; // latest cumulative funding growth global
int256 frLastX96; // last cumulative funding growth global
int256 fundingAmount; // funding amount by this order, calculated by amount, frX96 and frLastX96
uint256 interestPayment; // settled interest amount
uint256 createTs; // create timestamp
OrderStatus status; // order status
MarketDataStructure.PositionMode mode; // margin mode, one-way or hedge
bool isETH; // true if the margin is payed by ETH
}
/// @notice configuration of markets
struct MarketConfig {
uint256 mm; // maintenance margin ratio
uint256 liquidateRate; // penalty ratio when position is liquidated, penalty = position.value * liquidateRate
uint256 tradeFeeRate; // trading fee rate
uint256 makerFeeRate; // ratio of trading fee that goes to the pool
bool createOrderPaused; // true if order creation is paused
bool setTPSLPricePaused; // true if tpsl price setting is paused
bool createTriggerOrderPaused; // true if trigger order creation is paused
bool updateMarginPaused; // true if updating margin is paused
uint256 multiplier; // multiplier of quanto perpetual contracts
uint256 marketAssetPrecision; // margin asset decimals
uint256 DUST; // dust amount,scaled by AMOUNT_PRECISION (1e20)
uint256 takerLeverageMin; // minimum leverage that trader can use
uint256 takerLeverageMax; // maximum leverage that trader can use
uint256 dMMultiplier; // used to calculate the initial margin when trading decrease position margin
uint256 takerMarginMin; // minimum margin of a single trader order
uint256 takerMarginMax; // maximum margin of a single trader order
uint256 takerValueMin; // minimum value amount of a single trader order
uint256 takerValueMax; // maximum value amount of a single trader order
int256 takerValueLimit; // maximum position value of a single position
}
/// @notice internal parameter data structure when creating an order
struct CreateInternalParams {
address _taker; // trader address
uint256 id; // order id, generated by id counter
uint256 minPrice; // slippage: minimum trading price, validated in Router
uint256 maxPrice; // slippage: maximum trading price, validated in Router
uint256 margin; // order margin
uint256 amount; // close order amount, 0 if order is an open order
uint16 leverage; // order leverage, validated in MarketLogic
int8 direction; // order direction, validated in MarketLogic
int8 triggerDirection; // trigger condition, validated in MarketLogic
uint256 triggerPrice; // trigger price
uint8 reduceOnly; // 0: false, 1: true
bool isLiquidate; // is liquidate order, liquidate orders are generated automatically
bool isETH; // true if order margin payed in ETH
}
/// @notice returned data structure when an order is executed, used by MarketLogic.sol::trade
struct TradeResponse {
uint256 toTaker; // refund to the taker
uint256 tradeValue; // value of the order
uint256 leftInterestPayment;// interest payment on the remaining portion of the position
bool isIncreasePosition; // if the order causes position value increased
bool isDecreasePosition; // true if the order causes position value decreased
}
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity 0.7.6;
library PoolDataStructure {
enum PoolAction {
Deposit,
Withdraw
}
enum PoolActionStatus {
Submit,
Success,
Fail,
Cancel
}
/// @notice data structure of adding or removing liquidity order
struct MakerOrder {
uint256 id; // liquidity order id, generated by counter
address maker; // pool address
uint256 submitBlockTimestamp; // timestamp when order submitted
uint256 amount; // base asset amount
uint256 liquidity; // liquidity
uint256 feeToPool; // fee charged when remove liquidity
uint256 sharePrice; // pool share price when order is executed
int256 poolTotal; // pool total valuation when order is executed
int256 profit; // pool profit when order is executed, pnl + funding earns + interest earns
PoolAction action; // order action type
PoolActionStatus status; // order status
}
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity 0.7.6;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor () {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity 0.7.6;
library SafeCast {
/**
* @dev Returns the downcasted uint128 from uint256, reverting on
* overflow (when the input is greater than largest uint128).
*
* Counterpart to Solidity's `uint128` operator.
*
* Requirements:
*
* - input must fit into 128 bits
*/
function toUint128(uint256 value) internal pure returns (uint128) {
require(value < 2**128, "SafeCast: value doesn\'t fit in 128 bits");
return uint128(value);
}
/**
* @dev Returns the downcasted uint64 from uint256, reverting on
* overflow (when the input is greater than largest uint64).
*
* Counterpart to Solidity's `uint64` operator.
*
* Requirements:
*
* - input must fit into 64 bits
*/
function toUint64(uint256 value) internal pure returns (uint64) {
require(value < 2**64, "SafeCast: value doesn\'t fit in 64 bits");
return uint64(value);
}
/**
* @dev Returns the downcasted uint32 from uint256, reverting on
* overflow (when the input is greater than largest uint32).
*
* Counterpart to Solidity's `uint32` operator.
*
* Requirements:
*
* - input must fit into 32 bits
*/
function toUint32(uint256 value) internal pure returns (uint32) {
require(value < 2**32, "SafeCast: value doesn\'t fit in 32 bits");
return uint32(value);
}
/**
* @dev Returns the downcasted uint16 from uint256, reverting on
* overflow (when the input is greater than largest uint16).
*
* Counterpart to Solidity's `uint16` operator.
*
* Requirements:
*
* - input must fit into 16 bits
*/
function toUint16(uint256 value) internal pure returns (uint16) {
require(value < 2**16, "SafeCast: value doesn\'t fit in 16 bits");
return uint16(value);
}
/**
* @dev Returns the downcasted uint8 from uint256, reverting on
* overflow (when the input is greater than largest uint8).
*
* Counterpart to Solidity's `uint8` operator.
*
* Requirements:
*
* - input must fit into 8 bits.
*/
function toUint8(uint256 value) internal pure returns (uint8) {
require(value < 2**8, "SafeCast: value doesn\'t fit in 8 bits");
return uint8(value);
}
/**
* @dev Converts a signed int256 into an unsigned uint256.
*
* Requirements:
*
* - input must be greater than or equal to 0.
*/
function toUint256(int256 value) internal pure returns (uint256) {
require(value >= 0, "SafeCast: value must be positive");
return uint256(value);
}
/**
* @dev Returns the downcasted int128 from int256, reverting on
* overflow (when the input is less than smallest int128 or
* greater than largest int128).
*
* Counterpart to Solidity's `int128` operator.
*
* Requirements:
*
* - input must fit into 128 bits
*
* _Available since v3.1._
*/
function toInt128(int256 value) internal pure returns (int128) {
require(value >= -2**127 && value < 2**127, "SafeCast: value doesn\'t fit in 128 bits");
return int128(value);
}
/**
* @dev Returns the downcasted int64 from int256, reverting on
* overflow (when the input is less than smallest int64 or
* greater than largest int64).
*
* Counterpart to Solidity's `int64` operator.
*
* Requirements:
*
* - input must fit into 64 bits
*
* _Available since v3.1._
*/
function toInt64(int256 value) internal pure returns (int64) {
require(value >= -2**63 && value < 2**63, "SafeCast: value doesn\'t fit in 64 bits");
return int64(value);
}
/**
* @dev Returns the downcasted int32 from int256, reverting on
* overflow (when the input is less than smallest int32 or
* greater than largest int32).
*
* Counterpart to Solidity's `int32` operator.
*
* Requirements:
*
* - input must fit into 32 bits
*
* _Available since v3.1._
*/
function toInt32(int256 value) internal pure returns (int32) {
require(value >= -2**31 && value < 2**31, "SafeCast: value doesn\'t fit in 32 bits");
return int32(value);
}
/**
* @dev Returns the downcasted int16 from int256, reverting on
* overflow (when the input is less than smallest int16 or
* greater than largest int16).
*
* Counterpart to Solidity's `int16` operator.
*
* Requirements:
*
* - input must fit into 16 bits
*
* _Available since v3.1._
*/
function toInt16(int256 value) internal pure returns (int16) {
require(value >= -2**15 && value < 2**15, "SafeCast: value doesn\'t fit in 16 bits");
return int16(value);
}
/**
* @dev Returns the downcasted int8 from int256, reverting on
* overflow (when the input is less than smallest int8 or
* greater than largest int8).
*
* Counterpart to Solidity's `int8` operator.
*
* Requirements:
*
* - input must fit into 8 bits.
*
* _Available since v3.1._
*/
function toInt8(int256 value) internal pure returns (int8) {
require(value >= -2**7 && value < 2**7, "SafeCast: value doesn\'t fit in 8 bits");
return int8(value);
}
/**
* @dev Converts an unsigned uint256 into a signed int256.
*
* Requirements:
*
* - input must be less than or equal to maxInt256.
*/
function toInt256(uint256 value) internal pure returns (int256) {
require(value < 2**255, "SafeCast: value doesn't fit in an int256");
return int256(value);
}
/**
* @dev Returns the downcasted uint80 from uint256, reverting on
* overflow (when the input is greater than largest uint80).
*
* copy from openzeppelin-contracts
*
* Counterpart to Solidity's `uint80` operator.
*
* Requirements:
*
* - input must fit into 80 bits
*
* _Available since v4.7._
*/
function toUint80(uint256 value) internal pure returns (uint80) {
require(value <= type(uint80).max, "SafeCast: value doesn't fit in 80 bits");
return uint80(value);
}
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity 0.7.6;
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*
* _Available since v2.4.0._
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*
* _Available since v2.4.0._
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*
* _Available since v2.4.0._
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity 0.7.6;
import "./SafeCast.sol";
library SignedSafeMath {
using SafeCast for int256;
int256 constant private _INT256_MIN = - 2 ** 255;
/**
* @dev Returns the multiplication of two signed integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(int256 a, int256 b) internal pure returns (int256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
require(!(a == - 1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow");
int256 c = a * b;
require(c / a == b, "SignedSafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two signed integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(int256 a, int256 b) internal pure returns (int256) {
require(b != 0, "SignedSafeMath: division by zero");
require(!(b == - 1 && a == _INT256_MIN), "SignedSafeMath: division overflow");
int256 c = a / b;
return c;
}
/**
* @dev Returns the subtraction of two signed integers, reverting on
* overflow.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(int256 a, int256 b) internal pure returns (int256) {
int256 c = a - b;
require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow");
return c;
}
function add(int256 a, int256 b) internal pure returns (int256) {
int256 c = a + b;
require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow");
return c;
}
function abs(int256 value) internal pure returns (uint256) {
return value >= 0 ? value.toUint256() : neg256(value).toUint256();
}
function neg256(int256 a) internal pure returns (int256) {
require(a > - 2 ** 255, "PerpMath: inversion overflow");
return - a;
}
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity 0.7.6;
import "../interfaces/IERC20.sol";
library TransferHelper {
function safeApprove(address token, address to, uint256 value) internal {
// bytes4(keccak256(bytes('approve(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
}
function safeTransfer(address token, address to, uint256 value) internal {
// usdt of tron mainnet TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t: 0x41a614f803b6fd780986a42c78ec9c7f77e6ded13c
/*
if (token == address(0x41a614f803b6fd780986a42c78ec9c7f77e6ded13c)){
IERC20(token).transfer(to, value);
return;
}
*/
// bytes4(keccak256(bytes('transfer(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
}
function safeTransferFrom(address token, address from, address to, uint256 value) internal {
// bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
}
function safeTransferETH(address to, uint256 value) internal {
(bool success,) = to.call{value : value}(new bytes(0));
require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"evmVersion": "istanbul",
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_manager","type":"address"},{"internalType":"address","name":"_marketLogic","type":"address"},{"internalType":"address","name":"_fundingLogic","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"positionId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"takerMargin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"makerMargin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"int256","name":"fundingPayment","type":"int256"},{"indexed":false,"internalType":"uint256","name":"interestPayment","type":"uint256"}],"name":"DustPositionClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"code","type":"bytes32"},{"indexed":false,"internalType":"address","name":"taker","type":"address"},{"indexed":false,"internalType":"address","name":"inviter","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeToInviter","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeToDiscount","type":"uint256"}],"name":"ExecuteFeeInfo","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_orderId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_errCode","type":"uint256"}],"name":"ExecuteOrderError","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"indexToken","type":"string"},{"indexed":false,"internalType":"address","name":"_clearAnchor","type":"address"},{"indexed":false,"internalType":"address","name":"_pool","type":"address"},{"indexed":false,"internalType":"uint8","name":"_marketType","type":"uint8"}],"name":"Initialize","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_marketLogic","type":"address"},{"indexed":false,"internalType":"address","name":"_fundingLogic","type":"address"}],"name":"LogicAddressesModified","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"mm","type":"uint256"},{"internalType":"uint256","name":"liquidateRate","type":"uint256"},{"internalType":"uint256","name":"tradeFeeRate","type":"uint256"},{"internalType":"uint256","name":"makerFeeRate","type":"uint256"},{"internalType":"bool","name":"createOrderPaused","type":"bool"},{"internalType":"bool","name":"setTPSLPricePaused","type":"bool"},{"internalType":"bool","name":"createTriggerOrderPaused","type":"bool"},{"internalType":"bool","name":"updateMarginPaused","type":"bool"},{"internalType":"uint256","name":"multiplier","type":"uint256"},{"internalType":"uint256","name":"marketAssetPrecision","type":"uint256"},{"internalType":"uint256","name":"DUST","type":"uint256"},{"internalType":"uint256","name":"takerLeverageMin","type":"uint256"},{"internalType":"uint256","name":"takerLeverageMax","type":"uint256"},{"internalType":"uint256","name":"dMMultiplier","type":"uint256"},{"internalType":"uint256","name":"takerMarginMin","type":"uint256"},{"internalType":"uint256","name":"takerMarginMax","type":"uint256"},{"internalType":"uint256","name":"takerValueMin","type":"uint256"},{"internalType":"uint256","name":"takerValueMax","type":"uint256"},{"internalType":"int256","name":"takerValueLimit","type":"int256"}],"indexed":false,"internalType":"struct MarketDataStructure.MarketConfig","name":"_marketConfig","type":"tuple"}],"name":"SetMarketConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"taker","type":"address"},{"indexed":false,"internalType":"enum MarketDataStructure.PositionMode","name":"mode","type":"uint8"}],"name":"SwitchPositionMode","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"int256","name":"deltaMargin","type":"int256"}],"name":"UpdateMargin","type":"event"},{"inputs":[],"name":"AMOUNT_PRECISION","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"cancel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"_taker","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"},{"internalType":"uint256","name":"margin","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint16","name":"leverage","type":"uint16"},{"internalType":"int8","name":"direction","type":"int8"},{"internalType":"int8","name":"triggerDirection","type":"int8"},{"internalType":"uint256","name":"triggerPrice","type":"uint256"},{"internalType":"uint8","name":"reduceOnly","type":"uint8"},{"internalType":"bool","name":"isLiquidate","type":"bool"},{"internalType":"bool","name":"isETH","type":"bool"}],"internalType":"struct MarketDataStructure.CreateInternalParams","name":"params","type":"tuple"}],"name":"createOrder","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"executeOrder","outputs":[{"internalType":"int256","name":"resultCode","type":"int256"},{"internalType":"uint256","name":"_positionId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fundingGrowthGlobalX96","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLogicAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMarketConfig","outputs":[{"components":[{"internalType":"uint256","name":"mm","type":"uint256"},{"internalType":"uint256","name":"liquidateRate","type":"uint256"},{"internalType":"uint256","name":"tradeFeeRate","type":"uint256"},{"internalType":"uint256","name":"makerFeeRate","type":"uint256"},{"internalType":"bool","name":"createOrderPaused","type":"bool"},{"internalType":"bool","name":"setTPSLPricePaused","type":"bool"},{"internalType":"bool","name":"createTriggerOrderPaused","type":"bool"},{"internalType":"bool","name":"updateMarginPaused","type":"bool"},{"internalType":"uint256","name":"multiplier","type":"uint256"},{"internalType":"uint256","name":"marketAssetPrecision","type":"uint256"},{"internalType":"uint256","name":"DUST","type":"uint256"},{"internalType":"uint256","name":"takerLeverageMin","type":"uint256"},{"internalType":"uint256","name":"takerLeverageMax","type":"uint256"},{"internalType":"uint256","name":"dMMultiplier","type":"uint256"},{"internalType":"uint256","name":"takerMarginMin","type":"uint256"},{"internalType":"uint256","name":"takerMarginMax","type":"uint256"},{"internalType":"uint256","name":"takerValueMin","type":"uint256"},{"internalType":"uint256","name":"takerValueMax","type":"uint256"},{"internalType":"int256","name":"takerValueLimit","type":"int256"}],"internalType":"struct MarketDataStructure.MarketConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getOrder","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"market","type":"address"},{"internalType":"address","name":"taker","type":"address"},{"internalType":"int8","name":"direction","type":"int8"},{"internalType":"uint16","name":"takerLeverage","type":"uint16"},{"internalType":"int8","name":"triggerDirection","type":"int8"},{"internalType":"uint256","name":"triggerPrice","type":"uint256"},{"internalType":"uint256","name":"freezeMargin","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"multiplier","type":"uint256"},{"internalType":"uint256","name":"takerOpenPriceMin","type":"uint256"},{"internalType":"uint256","name":"takerOpenPriceMax","type":"uint256"},{"internalType":"enum MarketDataStructure.OrderType","name":"orderType","type":"uint8"},{"internalType":"uint256","name":"riskFunding","type":"uint256"},{"internalType":"uint256","name":"takerFee","type":"uint256"},{"internalType":"uint256","name":"feeToInviter","type":"uint256"},{"internalType":"uint256","name":"feeToExchange","type":"uint256"},{"internalType":"uint256","name":"feeToMaker","type":"uint256"},{"internalType":"uint256","name":"feeToDiscount","type":"uint256"},{"internalType":"uint256","name":"executeFee","type":"uint256"},{"internalType":"bytes32","name":"code","type":"bytes32"},{"internalType":"uint256","name":"tradeTs","type":"uint256"},{"internalType":"uint256","name":"tradePrice","type":"uint256"},{"internalType":"uint256","name":"tradeIndexPrice","type":"uint256"},{"internalType":"int256","name":"rlzPnl","type":"int256"},{"internalType":"int256","name":"fundingPayment","type":"int256"},{"internalType":"int256","name":"frX96","type":"int256"},{"internalType":"int256","name":"frLastX96","type":"int256"},{"internalType":"int256","name":"fundingAmount","type":"int256"},{"internalType":"uint256","name":"interestPayment","type":"uint256"},{"internalType":"uint256","name":"createTs","type":"uint256"},{"internalType":"enum MarketDataStructure.OrderStatus","name":"status","type":"uint8"},{"internalType":"enum MarketDataStructure.PositionMode","name":"mode","type":"uint8"},{"internalType":"bool","name":"isETH","type":"bool"}],"internalType":"struct MarketDataStructure.Order","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_taker","type":"address"}],"name":"getOrderIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getPosition","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"taker","type":"address"},{"internalType":"address","name":"market","type":"address"},{"internalType":"int8","name":"direction","type":"int8"},{"internalType":"uint16","name":"takerLeverage","type":"uint16"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"takerMargin","type":"uint256"},{"internalType":"uint256","name":"makerMargin","type":"uint256"},{"internalType":"uint256","name":"multiplier","type":"uint256"},{"internalType":"int256","name":"frLastX96","type":"int256"},{"internalType":"uint256","name":"stopLossPrice","type":"uint256"},{"internalType":"uint256","name":"takeProfitPrice","type":"uint256"},{"internalType":"uint256","name":"lastTPSLTs","type":"uint256"},{"internalType":"int256","name":"fundingPayment","type":"int256"},{"internalType":"uint256","name":"debtShare","type":"uint256"},{"internalType":"int256","name":"pnl","type":"int256"},{"internalType":"bool","name":"isETH","type":"bool"},{"internalType":"uint256","name":"lastUpdateTs","type":"uint256"}],"internalType":"struct MarketDataStructure.Position","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_taker","type":"address"},{"internalType":"int8","name":"_direction","type":"int8"}],"name":"getPositionId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_token","type":"string"},{"internalType":"address","name":"_marginAsset","type":"address"},{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint8","name":"_marketType","type":"uint8"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastExecutedOrderId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastFrX96Ts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"enum MarketDataStructure.OrderType","name":"action","type":"uint8"}],"name":"liquidate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketLogic","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketType","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_marketLogic","type":"address"},{"internalType":"address","name":"_fundingLogic","type":"address"}],"name":"modifyLogicAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"orderID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"positionID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"positionModes","outputs":[{"internalType":"enum MarketDataStructure.PositionMode","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"mm","type":"uint256"},{"internalType":"uint256","name":"liquidateRate","type":"uint256"},{"internalType":"uint256","name":"tradeFeeRate","type":"uint256"},{"internalType":"uint256","name":"makerFeeRate","type":"uint256"},{"internalType":"bool","name":"createOrderPaused","type":"bool"},{"internalType":"bool","name":"setTPSLPricePaused","type":"bool"},{"internalType":"bool","name":"createTriggerOrderPaused","type":"bool"},{"internalType":"bool","name":"updateMarginPaused","type":"bool"},{"internalType":"uint256","name":"multiplier","type":"uint256"},{"internalType":"uint256","name":"marketAssetPrecision","type":"uint256"},{"internalType":"uint256","name":"DUST","type":"uint256"},{"internalType":"uint256","name":"takerLeverageMin","type":"uint256"},{"internalType":"uint256","name":"takerLeverageMax","type":"uint256"},{"internalType":"uint256","name":"dMMultiplier","type":"uint256"},{"internalType":"uint256","name":"takerMarginMin","type":"uint256"},{"internalType":"uint256","name":"takerMarginMax","type":"uint256"},{"internalType":"uint256","name":"takerValueMin","type":"uint256"},{"internalType":"uint256","name":"takerValueMax","type":"uint256"},{"internalType":"int256","name":"takerValueLimit","type":"int256"}],"internalType":"struct MarketDataStructure.MarketConfig","name":"_config","type":"tuple"}],"name":"setMarketConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_profitPrice","type":"uint256"},{"internalType":"uint256","name":"_stopLossPrice","type":"uint256"}],"name":"setTPSLPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_taker","type":"address"},{"internalType":"enum MarketDataStructure.PositionMode","name":"_mode","type":"uint8"}],"name":"switchPositionMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"enum MarketDataStructure.OrderType","name":"","type":"uint8"}],"name":"takerOrderNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int8","name":"","type":"int8"}],"name":"takerOrderTotalValues","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"triggerOrderID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateFundingGrowthGlobal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_updateMargin","type":"uint256"},{"internalType":"bool","name":"isIncrease","type":"bool"}],"name":"updateMargin","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
0x60806040526001805460ff191690556001600160801b036018553480156200002657600080fd5b506040516200615b3803806200615b8339810160408190526200004991620000f7565b60016023556001600160a01b038316158015906200006f57506001600160a01b03821615155b620000975760405162461bcd60e51b81526004016200008e9062000140565b60405180910390fd5b600280546001600160a01b039485166001600160a01b03199182161790915560038054938516938216939093179092556004805491909316911617905562000177565b80516001600160a01b0381168114620000f257600080fd5b919050565b6000806000606084860312156200010c578283fd5b6200011784620000da565b92506200012760208501620000da565b91506200013760408501620000da565b90509250925092565b6020808252601f908201527f4d61726b65743a2061646472657373206973207a65726f206164647265737300604082015260600190565b615fd480620001876000396000f3fe608060405234801561001057600080fd5b50600436106101e45760003560e01c806381203d031161010f578063b85b479f116100a2578063e5e24bb711610071578063e5e24bb7146103cd578063e7fe4461146103ed578063eb02c301146103f5578063fc0c546a14610415576101e4565b8063b85b479f1461038a578063ba49d3db1461039d578063ce05f8c7146103a5578063d09ef241146103ad576101e4565b80639e8a033f116100de5780639e8a033f14610349578063a04be9c21461035c578063abd108ba1461036f578063b3097c7514610377576101e4565b806381203d03146102ed57806389039f4a146102f55780638f2b811a1461031557806394f6113414610328576101e4565b80634c6e1162116101875780636af8dfd7116101565780636af8dfd7146102c25780636d8d1305146102ca5780637225a25c146102d257806379d1dcd9146102da576101e4565b80634c6e11621461027f5780634e155b751461029257806352b080241461029a578063614bd944146102ad576101e4565b80632a8a3b90116101c35780632a8a3b90146102245780632dd48909146102375780633d98c7c11461024c57806340e58ee51461026c576101e4565b80624d3c36146101e957806316f0115b146101fe57806320130c121461021c575b600080fd5b6101fc6101f736600461510d565b61042a565b005b610206610687565b60405161021391906152f8565b60405180910390f35b61020661069b565b6101fc610232366004614aea565b6106aa565b61023f610814565b6040516102139190615dc8565b61025f61025a366004614b7c565b61081d565b60405161021391906153f8565b6101fc61027a3660046150d1565b61086e565b6101fc61028d366004615145565b610a8d565b61025f610b79565b6101fc6102a8366004614e4f565b610b7f565b6102b5610cbe565b60405161021391906158dc565b61025f610d92565b61025f610d9f565b61025f610da5565b6101fc6102e8366004614c1a565b610dab565b61025f610e9d565b610308610303366004614ab2565b610ea3565b60405161021391906153ea565b61025f610323366004614b22565b610eb8565b61033b6103363660046150d1565b610ed5565b604051610213929190615401565b61025f6103573660046150e9565b6125ca565b61025f61036a366004614b7c565b612ef5565b610206612f12565b6101fc610385366004614b4f565b612f21565b61025f610398366004614cd6565b613021565b6101fc613141565b61025f61314b565b6103c06103bb3660046150d1565b613151565b6040516102139190615b6a565b6103e06103db366004614ab2565b61336e565b60405161021391906153a6565b61025f6133da565b6104086104033660046150d1565b6133e0565b6040516102139190615d2b565b61041d6134f1565b604051610213919061540f565b60026023541415610470576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e84833981519152604482015290519081900360640190fd5b6002602381905554604051630cc03d9760e11b81526001600160a01b03909116906319807b2e906104a59033906004016152f8565b60206040518083038186803b1580156104bd57600080fd5b505afa1580156104d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f59190614ba9565b61051a5760405162461bcd60e51b815260040161051190615489565b60405180910390fd5b600a546301000000900460ff16156105445760405162461bcd60e51b8152600401610511906155cc565b6000838152601c6020526040812090821561057d576005820154610568908561357f565b6005830155610576846135e0565b90506105a5565b600582015461058c9085613628565b60058301556105a261059d856135e0565b61366a565b90505b6001805490830154600f840154604051630d7bea6560e31b81526101009093046001600160a01b0390811693636bdf5328936105ef93309390911691879160ff1690600401615326565b602060405180830381600087803b15801561060957600080fd5b505af115801561061d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106419190614ba9565b507f82b8dd3fdddf992631f67e1ae3c2213fbbe1c816f3f79df16bacb5dd470c7c5b8582604051610673929190615401565b60405180910390a150506001602355505050565b60015461010090046001600160a01b031681565b6003546001600160a01b031681565b6002546040516310fd24b760e11b81526001600160a01b03909116906321fa496e906106da9033906004016152f8565b60206040518083038186803b1580156106f257600080fd5b505afa158015610706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190614ba9565b6107465760405162461bcd60e51b81526004016105119061555e565b6001600160a01b03821661076c5760405162461bcd60e51b8152600401610511906154f0565b6004546001600160a01b0316156107a3576001600160a01b0381166107a35760405162461bcd60e51b8152600401610511906154f0565b600380546001600160a01b038085166001600160a01b0319928316179283905560048054858316931692909217918290556040517f10b09df773f985c74b5e7961018f0064f3cd1744386728f0d7f9a666155baca4936108089390831692169061530c565b60405180910390a15050565b60015460ff1681565b6001600160a01b03821660009081526019602052604081208161084085856136cb565b600281111561084b57fe5b600281111561085657fe5b81526020019081526020016000205490505b92915050565b600260235414156108b4576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e84833981519152604482015290519081900360640190fd5b6002602381905554604051630cc03d9760e11b81526001600160a01b03909116906319807b2e906108e99033906004016152f8565b60206040518083038186803b15801561090157600080fd5b505afa158015610915573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109399190614ba9565b6109555760405162461bcd60e51b815260040161051190615489565b6000818152601b6020526040812090601c82015460ff16600381111561097757fe5b148061099557506002601c82015460ff16600381111561099357fe5b145b6109b15760405162461bcd60e51b815260040161051190615460565b601c8101805460ff1916600317905560028101546001600160a01b03166000908152601e60205260408120600983015490919060ff1660078111156109f257fe5b60078111156109fd57fe5b8152602081019190915260400160009081208054600019019055600282015460098301546004840154610a6c936001600160a01b0384169360ff90931692600160a01b810490910b91610a679161059d91610a6291600160a81b900461ffff1661371f565b6135e0565b613778565b600481015415610a8457610a84338260040154613813565b50506001602355565b600254604051630cc03d9760e11b81526001600160a01b03909116906319807b2e90610abd9033906004016152f8565b60206040518083038186803b158015610ad557600080fd5b505afa158015610ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0d9190614ba9565b610b295760405162461bcd60e51b815260040161051190615489565b600a54610100900460ff1615610b515760405162461bcd60e51b815260040161051190615595565b6000928352601c6020526040909220600a810191909155600981019190915542600b90910155565b60185481565b6002546001600160a01b03163314610ba95760405162461bcd60e51b815260040161051190615603565b80516006908155602082015160075560408083015160085560608301516009556080830151600a805460a086015160c087015160e088015160ff199093169415159490941761ff00191661010091151582021762ff0000191662010000941515949094029390931763ff0000001916630100000091151591909102179055830151600b55610120830151600c55610140830151600d55610160830151600e55610180830151600f556101a08301516010556101c08301516011556101e0830151601255610200830151601355610220830151601455610240830151601555517f05eb5eb2ce9e8f3f982c40d2724aed301cfd2ff37ad3d7c413a3db51bd6ed43191610cb3916159d3565b60405180910390a150565b610cc6614366565b50604080516102608101825260065481526007546020820152600854918101919091526009546060820152600a5460ff808216151560808401526101008083048216151560a08501526201000083048216151560c0850152630100000090920416151560e0830152600b5490820152600c54610120820152600d54610140820152600e54610160820152600f546101808201526010546101a08201526011546101c08201526012546101e082015260135461020082015260145461022082015260155461024082015290565b68056bc75e2d6310000081565b60205481565b60215481565b6002546001600160a01b031633148015610dcd57506001600160a01b03831615155b8015610de157506001600160a01b03821615155b610dfd5760405162461bcd60e51b815260040161051190615631565b8351610e10906000906020870190614400565b50600580546001600160a01b0319166001600160a01b038581169190911790915560018054610100600160a81b031916610100928516929092029190911760ff191660ff83161790556040517f4170d6c3406f944ff888a43ae17a28405aa2e66d7e0f7f39419b4aa40362d91690610e8f908690869086908690615422565b60405180910390a150505050565b60175481565b601d6020526000908152604090205460ff1681565b601e60209081526000928352604080842090915290825290205481565b60008060026023541415610f1e576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e84833981519152604482015290519081900360640190fd5b6002602381905554604051630cc03d9760e11b81526001600160a01b03909116906319807b2e90610f539033906004016152f8565b60206040518083038186803b158015610f6b57600080fd5b505afa158015610f7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa39190614ba9565b610fbf5760405162461bcd60e51b815260040161051190615489565b610fc7614488565b6000848152601b602090815260408083208151610440810183528154815260018201546001600160a01b0390811694820194909452600282015493841692810192909252600160a01b8304840b840b840b606083015261ffff600160a81b8404166080830152600160b81b909204830b830b90920b60a0830152600381015460c0830152600481015460e0830152600581015461010083015260068101546101208301526007808201546101408401526008820154610160840152600982015461018084019160ff9091169081111561109c57fe5b60078111156110a757fe5b8152600a8201546020820152600b8201546040820152600c8201546060820152600d8201546080820152600e82015460a0820152600f82015460c0820152601082015460e08201526011820154610100820152601282015461012082015260138201546101408201526014820154610160820152601582015461018082015260168201546101a082015260178201546101c082015260188201546101e08201526019820154610200820152601a820154610220820152601b820154610240820152601c8201546102609091019060ff16600381111561118257fe5b600381111561118d57fe5b8152602001601c820160019054906101000a900460ff1660018111156111af57fe5b60018111156111ba57fe5b8152601c919091015462010000900460ff16151560209091015260a0820181905261018001516000906111ec9061382e565b15611200575060a08101516060015161121f565b61121c6112178360a001516060015160000b61366a565b613859565b90505b60006112338360a0015160400151836136cb565b60a08401516040908101516001600160a01b03166000908152601960205290812091925082600281111561126357fe5b600281111561126e57fe5b815260200190815260200160002054935083600014156112e357601680546001019081905560a08401516040908101516001600160a01b0316600090815260196020529081209195508591908360028111156112c657fe5b60028111156112d157fe5b81526020810191909152604001600020555b6000848152601c6020818152604080842060088101548b8652601b845291852060180191909155878452919052600281015460039091015461133c92600160a01b909204820b90910b90611336906135e0565b906138a8565b6000878152601b602052604080822060190192909255600154825163975b9fed60e01b815292516101009091046001600160a01b03169263975b9fed92600480830193919282900301818387803b15801561139657600080fd5b505af11580156113aa573d6000803e3d6000fd5b5050506000858152601c602052604090206113c59150613951565b506000848152601c602090815260408083208151610260810183528154815260018201546001600160a01b039081168286015260028084015480831684870152600160a01b8104880b880b90970b6060840152600160a81b90960461ffff166080830152600383015460a083015260048084015460c0840152600584015460e0808501919091526006850154610100850152600785015461012085015260088501546101408501526009850154610160850152600a850154610180850152600b8501546101a0850152600c8501546101c0850152600d8501546101e0850152600e850154610200850152600f85015460ff1615156102208501526010909401546102408401529289019190915293548251630fdb3b6d60e01b81529251941693630fdb3b6d9383830193909290829003018186803b15801561150657600080fd5b505afa15801561151a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153e9190614ace565b6001600160a01b0390811661014085018190526000888152601b60205260409081902060020154905163019933d760e11b8152919263033267ae9261158992909116906004016152f8565b60806040518083038186803b1580156115a157600080fd5b505afa1580156115b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d99190614bc5565b608087015260608601526001600160a01b03166040850152602084015260008360a001516101800151600781111561160d57fe5b148061162d575060018360a001516101800151600781111561162b57fe5b145b156116385760228690555b60035460608401516080850151604051630ad3a39b60e41b81526001600160a01b039093169263ad3a39b092611676928b928a929190600401615d7d565b6107606040518083038186803b15801561168f57600080fd5b505afa1580156116a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c79190614f71565b610120870181905261010087019190915260c086019190915260a08501919091521561176d577fbb6c6db062179325388caf1b610c92beeb771b87f046694aaea698f1441e715486846101200151604051611723929190615401565b60405180910390a18261012001516005141561174557600294505050506125be565b5050506000838152601b60205260409020601c01805460ff19166002179055600191506125be565b602083015160a08401805161028001919091525160e0015115611816576002546040805163fbfa77cf60e01b81529051611816926001600160a01b03169163fbfa77cf916004808301926020929190829003018186803b1580156117d057600080fd5b505afa1580156117e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118089190614ace565b8460a0015160e00151613813565b60a0830180516040908101516001600160a01b03166000908152601e60205290812091516101800151600781111561184a57fe5b600781111561185557fe5b815260208101919091526040908101600020805460001901905560a0840151908101516101808201516060830151608084015160e0909401516118a894610a679161059d91610a62919061ffff1661371f565b600d5460c084015160a001511080156118c9575060008360c0015160a00151115b15611a68576119076118e3846101000151604001516135e0565b6119018560c001516101c001516119018760c0015160e001516135e0565b90613a9b565b61016084018190526000121561194157611935611928846101600151613b00565b610100850151519061357f565b61010084015152611965565b61016083015160a0840151610300015161195a91613b57565b60a084015161030001525b60c080840151805160a082015160e083015161010080850151958501516101c0909501519089015160409081015190517f8d52f8d6309cfb217f8d74c0cc6d90b1a04bd66fdbcb672b9ad327eba426b179976119c697909390929091615d98565b60405180910390a16101008301516040015160a08401516103a001516119eb9161357f565b60a0840180516103a0019190915260c08401516101c0015190516103200151611a1391613b57565b60a080850151610320019190915260c0808501805160006101c0909101819052815160e001819052815161010090810182905282516101e0018290528251909401819052905190910181905290840151606001525b8261010001516060015115611d2a5760018054906101000a90046001600160a01b03166001600160a01b03166346dcc90960405180610180016040528086610100015160800151611add57611ad88760e0015161010001518860c00151610100015161362890919063ffffffff16565b611ae8565b8660c0015161010001515b815260200186610100015160800151611b2357611b1e8760e0015160e001518860c0015160e0015161362890919063ffffffff16565b611b2d565b8660c0015160e001515b815260200186610100015160800151611b6857611b638760e0015160a001518860c0015160a0015161362890919063ffffffff16565b611b72565b8660c0015160a001515b815260200186610100015160800151611bad57611ba88760e0015160c001518860c0015160c0015161362890919063ffffffff16565b611bb7565b8660c0015160c001515b815260200186610100015160800151611bd9578660a001516102200151611bdc565b60005b81526020018660a001516060015160000b81526020018660a0015160e0015181526020018660a00151604001516001600160a01b0316815260200186610100015160800151611c34578660a001516101e00151611c37565b60005b815260200186604001516001600160a01b0316815260200186610100015160800151611c8757611c828760e001516101e001518860c001516101e0015161362890919063ffffffff16565b611c92565b8660c001516101e001515b815260200186610100015160800151611cb4578660a001516102000151611cb7565b60005b8152506040518263ffffffff1660e01b8152600401611cd69190615ac8565b602060405180830381600087803b158015611cf057600080fd5b505af1158015611d04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d289190614ba9565b505b82610100015160800151156120555760018054906101000a90046001600160a01b03166001600160a01b0316638b58486760405180610240016040528086610100015160600151611d9f57611d9a8760c0015161010001518860e00151610100015161362890919063ffffffff16565b611daa565b8660e0015161010001515b815260200186610100015160600151611de557611de08760c0015160e001518860e0015160e0015161362890919063ffffffff16565b611def565b8660e0015160e001515b815260200186610100015160600151611e2a57611e258760c0015160a001518860e0015160a0015161362890919063ffffffff16565b611e34565b8660e0015160a001515b815260200186610100015160600151611e6f57611e6a8760c0015160c001518860e0015160c0015161362890919063ffffffff16565b611e79565b8660e0015160c001515b8152602001611e908760a00151610300015161366a565b81526020018660a001516102200151815260200186610100015160600151611edc57611ed78760c001516101c001518860e001516101c00151613a9b90919063ffffffff16565b611ee7565b8660e001516101c001515b81526020018660e001516060015160000b815260200186610100015160600151611f19578660a0015160e00151611f1c565b60005b815260200186610100015160600151611f5957611f548760c001516101e001518860e001516101e0015161362890919063ffffffff16565b611f64565b8660e001516101e001515b81526020018660a001516103a0015181526020018660e00151610220015115158152602001600081526020018661010001516000015181526020018660a00151604001516001600160a01b031681526020018660a001516101e00151815260200186604001516001600160a01b031681526020018660a0015161020001518152506040518263ffffffff1660e01b815260040161200191906156dc565b602060405180830381600087803b15801561201b57600080fd5b505af115801561202f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120539190614ba9565b505b61014083015160015460a0850151604090810151818701516101008801516020015192516340fcf9e760e11b81526001600160a01b03909516946381f9f3ce946120a99460ff909116939291600401615dd6565b600060405180830381600087803b1580156120c357600080fd5b505af11580156120d7573d6000803e3d6000fd5b5050505060a08301518051610280820151604080840151818801516005546101008a0151602001516102408801516101e09098015194517fedea480d8299344e246665a5598126093132fa4c5bbf173c2024726bb581194f986121499897966001600160a01b03909416939091615d3a565b60405180910390a182610100015160600151801561216e575082610100015160800151155b156121a7578260e0015160a001518360c0015160a00151116121a25760405162461bcd60e51b815260040161051190615679565b61222e565b826101000151606001511580156121c45750826101000151608001515b156121f8578260e0015160a001518360c0015160a00151106121a25760405162461bcd60e51b815260040161051190615679565b8260e001516060015160000b8360c001516060015160000b141561222e5760405162461bcd60e51b815260040161051190615527565b60a0808401516000888152601b602090815260408083208451815591840151600180840180546001600160a01b039384166001600160a01b03199182161790915592860151600285018054606089015160808a01519a8a0151890b60ff908116600160b81b0260ff60b81b1961ffff909d16600160a81b0261ffff60a81b1993909b0b909116600160a01b0260ff60a01b1995909716929097169190911792909216939093171694909417959095161790935560c0820151600384015560e082015160048401556101008201516005840155610120820151600684015561014082015160078085019190915561016083015160088501556101808301516009850180549495949193909260ff1990921691849081111561234a57fe5b02179055506101a0820151600a8201556101c0820151600b8201556101e0820151600c820155610200820151600d820155610220820151600e820155610240820151600f820155610260820151601082015561028082015160118201556102a082015160128201556102c082015160138201556102e08201516014820155610300820151601582015561032082015160168201556103408201516017820155610360820151601882015561038082015160198201556103a0820151601a8201556103c0820151601b8201556103e0820151601c8201805460ff1916600183600381111561243357fe5b0217905550610400820151601c8201805461ff00191661010083600181111561245857fe5b02179055506104209190910151601c9182018054911515620100000262ff00001990921691909117905560c09384015160008681526020928352604080822083518155938301516001850180546001600160a01b039283166001600160a01b031991821617909155918401516002860180546060870151608088015161ffff16600160a81b0261ffff60a81b1991880b60ff16600160a01b0260ff60a01b1995909616929096169190911792909216929092171691909117905560a0820151600384015594810151600483015560e081015160058301556101008101516006830155610120810151600783015561014081015160088301556101608101516009830155610180810151600a8301556101a0810151600b8301556101c0810151600c8301556101e0810151600d830155610200810151600e830155610220810151600f8301805491151560ff19909216919091179055610240015160109091015550909250505b60016023559092909150565b600060026023541415612612576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e84833981519152604482015290519081900360640190fd5b6002602381905554604051630cc03d9760e11b81526001600160a01b03909116906319807b2e906126479033906004016152f8565b60206040518083038186803b15801561265f57600080fd5b505afa158015612673573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126979190614ba9565b6126b35760405162461bcd60e51b815260040161051190615489565b6126bb614516565b6000848152601c6020526040902060038101546126ea5760405162461bcd60e51b8152600401610511906154b9565b604080516101a08101825260018301546001600160a01b031681528254602082015260009181018290526060810182905260808101829052600383015460a0820152600283015461ffff600160a81b82041660c0830152601b91839161279e919060e08201906127689061121790600160a01b9004860b860b61366a565b600090810b82526020820181905260408201526001606082018190526080820152600f87015460ff16151560a090910152613bbc565b81526020019081526020016000209050816008015481601801819055506127e08260020160149054906101000a900460000b60000b61133684600301546135e0565b816019018190555060018054906101000a90046001600160a01b03166001600160a01b031663975b9fed6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561283657600080fd5b505af115801561284a573d6000803e3d6000fd5b5050505061285782613951565b50602080546017830155600c830154601683015560025460408051630fdb3b6d60e01b815290516001600160a01b0390921692630fdb3b6d92600480840193829003018186803b1580156128aa57600080fd5b505afa1580156128be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128e29190614ace565b6001600160a01b0390811660c08501819052600283015460405163019933d760e11b8152919263033267ae9261291e92909116906004016152f8565b60806040518083038186803b15801561293657600080fd5b505afa15801561294a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296e9190614bc5565b60a0878101919091526080808801929092526001600160a01b0392831660608801526040808801949094526003805485516102e0810190965287549386019384526001880154851692860192909252600287015480851660c0870152600160a01b8104600090810b810b900b60e0870152600160a81b900461ffff166101008601528601546101208501526004860154610140850152600586015461016085015260068601546101808501526007808701546101a086015260088701546101c086015260098701546101e0860152600a870154610200860152600b870154610220860152600c870154610240860152600d870154610260860152600e870154610280860152600f87015460ff1615156102a086015260108701546102c0860152918452909116916371e152519160208201908990811115612aab57fe5b8152602001866080015181526020018660a001518152506040518263ffffffff1660e01b8152600401612ade9190615899565b6101806040518083038186803b158015612af757600080fd5b505afa158015612b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2f9190614dad565b80845260408085015160118401556020820151600b840155810151600e8301556060810151600d8301556080810151600c83015560a00151600f82015560098101805486919060ff19166001836007811115612b8757fe5b0217905550825160e0810151601a83015560c0810151600a830155516015820155601c810180546001919060ff191682800217905550426012820155825161014081015160138301556101600151601482015560015460408051610240810182526006850154815260058501546020820152600385015491810191909152600484015460608201528451516101009092046001600160a01b031691638b58486791906080820190612c379061366a565b8152602001866000015160400151815260200185600c015481526020018560020160149054906101000a900460000b60000b81526020016000815260200185600d01548152602001866000015160e00151815260200185600f0160009054906101000a900460ff161515815260200184600a015481526020018660000151610100015181526020018560010160009054906101000a90046001600160a01b03166001600160a01b0316815260200184600c0154815260200186606001516001600160a01b0316815260200184600d01548152506040518263ffffffff1660e01b8152600401612d2691906156dc565b602060405180830381600087803b158015612d4057600080fd5b505af1158015612d54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d789190614ba9565b506004600982015460ff166007811115612d8e57fe5b14612e855760c083015160015460028301546060860151865161012001516040516340fcf9e760e11b81526001600160a01b03958616956381f9f3ce95612de29560ff909116949116929091600401615dd6565b600060405180830381600087803b158015612dfc57600080fd5b505af1158015612e10573d6000803e3d6000fd5b50508254601184015460028501546005546060890151895161012081015160a08201516080909201516040517fedea480d8299344e246665a5598126093132fa4c5bbf173c2024726bb581194f9a50612e7c99506001600160a01b039687169690951694919291615d3a565b60405180910390a15b600060038301819055600683018190556005830181905560048301556015810154600e830154612eb491613b57565b600e8301556000600c83018190556010830181905560098301819055600a8301819055600b8301819055600d90920191909155546001602355949350505050565b601f60209081526000928352604080842090915290825290205481565b6004546001600160a01b031690565b600254604051630cc03d9760e11b81526001600160a01b03909116906319807b2e90612f519033906004016152f8565b60206040518083038186803b158015612f6957600080fd5b505afa158015612f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fa19190614ba9565b612fbd5760405162461bcd60e51b815260040161051190615489565b6001600160a01b0382166000908152601d60205260409020805482919060ff191660018381811115612feb57fe5b02179055507fd8e7fc0df562c0edbe9f10f1713d069535cab2090c770f7c2a9c3015cc59d2e4828260405161080892919061534f565b600060026023541415613069576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e84833981519152604482015290519081900360640190fd5b6002602381905554604051630cc03d9760e11b81526001600160a01b03909116906319807b2e9061309e9033906004016152f8565b60206040518083038186803b1580156130b657600080fd5b505afa1580156130ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130ee9190614ba9565b61310a5760405162461bcd60e51b815260040161051190615489565b600a5460ff161561312d5760405162461bcd60e51b8152600401610511906156b0565b61313682613bbc565b600160235592915050565b613149614019565b565b60165481565b613159614559565b6000828152601b602090815260408083208151610440810183528154815260018201546001600160a01b0390811694820194909452600282015493841692810192909252600160a01b8304840b840b840b606083015261ffff600160a81b8404166080830152600160b81b909204830b830b90920b60a0830152600381015460c0830152600481015460e0830152600581015461010083015260068101546101208301526007808201546101408401526008820154610160840152600982015461018084019160ff9091169081111561322e57fe5b600781111561323957fe5b8152600a8201546020820152600b8201546040820152600c8201546060820152600d8201546080820152600e82015460a0820152600f82015460c0820152601082015460e08201526011820154610100820152601282015461012082015260138201546101408201526014820154610160820152601582015461018082015260168201546101a082015260178201546101c082015260188201546101e08201526019820154610200820152601a820154610220820152601b820154610240820152601c8201546102609091019060ff16600381111561331457fe5b600381111561331f57fe5b8152602001601c820160019054906101000a900460ff16600181111561334157fe5b600181111561334c57fe5b8152601c919091015462010000900460ff16151560209091015290505b919050565b6001600160a01b0381166000908152601a60209081526040918290208054835181840281018401909452808452606093928301828280156133ce57602002820191906000526020600020905b8154815260200190600101908083116133ba575b50505050509050919050565b60225481565b6133e8614687565b506000908152601c602090815260408083208151610260810183528154815260018201546001600160a01b0390811694820194909452600282015493841692810192909252600160a01b8304840b840b90930b6060820152600160a81b90910461ffff166080820152600382015460a0820152600482015460c0820152600582015460e08201526006820154610100820152600782015461012082015260088201546101408201526009820154610160820152600a820154610180820152600b8201546101a0820152600c8201546101c0820152600d8201546101e0820152600e820154610200820152600f82015460ff16151561022082015260109091015461024082015290565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156135775780601f1061354c57610100808354040283529160200191613577565b820191906000526020600020905b81548152906001019060200180831161355a57829003601f168201915b505050505081565b6000828201838110156135d9576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6000600160ff1b82106136245760405162461bcd60e51b8152600401808060200182810382526028815260200180615f536028913960400191505060405180910390fd5b5090565b60006135d983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506140ae565b6000600160ff1b82136136c4576040805162461bcd60e51b815260206004820152601c60248201527f506572704d6174683a20696e76657273696f6e206f766572666c6f7700000000604482015290519081900360640190fd5b5060000390565b6000806001600160a01b0384166000908152601d602052604090205460ff1660018111156136f557fe5b141561370357506002610868565b8160000b600019146137165760016135d9565b50600092915050565b60008261372e57506000610868565b8282028284828161373b57fe5b04146135d95760405162461bcd60e51b8152600401808060200182810382526021815260200180615f0b6021913960400191505060405180910390fd5b6137818361382e565b1561380d576137af61379660068001546135e0565b6137a98368056bc75e2d631000006138a8565b90614145565b6001600160a01b0385166000908152601f6020908152604080832086840b840b84529091529020549091506137e49082613b57565b6001600160a01b0385166000908152601f6020908152604080832086840b840b84529091529020555b50505050565b60055461382a906001600160a01b031683836141fd565b5050565b60008082600781111561383d57fe5b14806108685750600282600781111561385257fe5b1492915050565b6000607f19821215801561386d5750608082125b6136245760405162461bcd60e51b8152600401808060200182810382526025815260200180615ea46025913960400191505060405180910390fd5b6000826138b757506000610868565b826000191480156138cb5750600160ff1b82145b156139075760405162461bcd60e51b8152600401808060200182810382526027815260200180615f2c6027913960400191505060405180910390fd5b8282028284828161391457fe5b05146135d95760405162461bcd60e51b8152600401808060200182810382526027815260200180615f2c6027913960400191505060405180910390fd5b6004546000906001600160a01b031661396c57506000613369565b613974614019565b60048054835460205460405163489bcce160e01b81526001600160a01b039093169363489bcce1936139ac9330939092909101615385565b60206040518083038186803b1580156139c457600080fd5b505afa1580156139d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139fc9190614c02565b90506021544214613a0c57426021555b6020546008830155801561336957600c820154613a299082613b57565b600c83015560015460405163808d7cdf60e01b81526101009091046001600160a01b03169063808d7cdf90613a64903090859060040161536c565b600060405180830381600087803b158015613a7e57600080fd5b505af1158015613a92573d6000803e3d6000fd5b50505050919050565b6000818303818312801590613ab05750838113155b80613ac55750600083128015613ac557508381135b6135d95760405162461bcd60e51b8152600401808060200182810382526024815260200180615f7b6024913960400191505060405180910390fd5b600080821215613624576040805162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f736974697665604482015290519081900360640190fd5b6000828201818312801590613b6c5750838112155b80613b815750600083128015613b8157508381125b6135d95760405162461bcd60e51b8152600401808060200182810382526021815260200180615ec96021913960400191505060405180910390fd5b600354604051635e03528160e01b815260009182916001600160a01b0390911690635e03528190613bf19086906004016157c8565b6104406040518083038186803b158015613c0a57600080fd5b505afa158015613c1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c429190614f55565b905060008161018001516007811115613c5757fe5b1480613c73575060018161018001516007811115613c7157fe5b145b613c87576018805460010190819055613c93565b60178054600101908190555b8082526000908152601b602090815260408083208451815591840151600180840180546001600160a01b03199081166001600160a01b039485161790915592860151600285018054606089015160808a015160a08b015192909716939095169290921760ff60a01b1916600160a01b94880b60ff908116959095021761ffff60a81b1916600160a81b61ffff909616959095029490941760ff60b81b1916600160b81b9190960b929092169190910293909317905560c0830151600382015560e0830151600482015561010083015160058201556101208301516006820155610140830151600780830191909155610160840151600883015561018084015160098301805486959293919260ff19909116918490811115613db057fe5b02179055506101a0820151600a8201556101c0820151600b8201556101e0820151600c820155610200820151600d820155610220820151600e820155610240820151600f820155610260820151601082015561028082015160118201556102a082015160128201556102c082015160138201556102e08201516014820155610300820151601582015561032082015160168201556103408201516017820155610360820151601882015561038082015160198201556103a0820151601a8201556103c0820151601b8201556103e0820151601c8201805460ff19166001836003811115613e9957fe5b0217905550610400820151601c8201805461ff001916610100836001811115613ebe57fe5b02179055506104209190910151601c9091018054911515620100000262ff00001990921691909117905582516001600160a01b03166000908152601a602090815260408220835181546001810183559184529190922090910155610160830151613f725782516001600160a01b03166000908152601e602052604081206101808301519091906007811115613f4f57fe5b6007811115613f5a57fe5b81526020810191909152604001600020805460010190555b613fa781604001518261018001518360600151610a67610a62866080015161ffff168760e0015161371f90919063ffffffff16565b826101600151614012576003548151604051632477e33960e11b81526001600160a01b03909216916348efc67291613fe1916004016153f8565b60006040518083038186803b158015613ff957600080fd5b505afa15801561400d573d6000803e3d6000fd5b505050505b5192915050565b6004546001600160a01b0316156131495760048054604051635685279960e11b81526001600160a01b039091169163ad0a4f3291614059913091016152f8565b60206040518083038186803b15801561407157600080fd5b505afa158015614085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140a99190614c02565b602055565b6000818484111561413d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156141025781810151838201526020016140ea565b50505050905090810190601f16801561412f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081614199576040805162461bcd60e51b815260206004820181905260248201527f5369676e6564536166654d6174683a206469766973696f6e206279207a65726f604482015290519081900360640190fd5b816000191480156141ad5750600160ff1b83145b156141e95760405162461bcd60e51b8152600401808060200182810382526021815260200180615eea6021913960400191505060405180910390fd5b60008284816141f457fe5b05949350505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b602083106142795780518252601f19909201916020918201910161425a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146142db576040519150601f19603f3d011682016040523d82523d6000602084013e6142e0565b606091505b509150915081801561430e57508051158061430e575080806020019051602081101561430b57600080fd5b50515b61435f576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b6040518061026001604052806000815260200160008152602001600081526020016000815260200160001515815260200160001515815260200160001515815260200160001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282614436576000855561447c565b82601f1061444f57805160ff191683800117855561447c565b8280016001018555821561447c579182015b8281111561447c578251825591602001919060010190614461565b50613624929150614733565b604051806101800160405280600081526020016000801916815260200160006001600160a01b0316815260200160008152602001600081526020016144cb614559565b81526020016144d8614687565b81526020016144e5614687565b81526020016144f2614748565b81526020016000815260200160006001600160a01b03168152602001600081525090565b6040518060e0016040528061452961477b565b815260006020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b6040518061044001604052806000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000800b8152602001600061ffff1681526020016000800b8152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600060078111156145e057fe5b81526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008019168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000600381111561467357fe5b815260200160008152600060209091015290565b6040518061026001604052806000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000800b8152602001600061ffff168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600015158152602001600081525090565b5b808211156136245760008155600101614734565b6040518060a001604052806000815260200160008152602001600081526020016000151581526020016000151581525090565b6040518061018001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b803561336981615e24565b805161336981615e24565b803561336981615e3c565b805161336981615e3c565b80516004811061336957600080fd5b805161336981615e4a565b805161336981615e57565b803561336981615e64565b805161336981615e64565b6000610440808385031215614856578182fd5b61485f81615e00565b91505081518152614872602083016147e7565b6020820152614883604083016147e7565b604082015261489460608301614838565b60608201526148a560808301614a96565b60808201526148b660a08301614838565b60a082015260c0828101519082015260e080830151908201526101008083015190820152610120808301519082015261014080830151908201526101608083015190820152610180614909818401614817565b908201526101a082810151908201526101c080830151908201526101e08083015190820152610200808301519082015261022080830151908201526102408083015190820152610260808301519082015261028080830151908201526102a080830151908201526102c080830151908201526102e08083015190820152610300808301519082015261032080830151908201526103408083015190820152610360808301519082015261038080830151908201526103a080830151908201526103c080830151908201526103e06149e1818401614808565b908201526104006149f3838201614822565b90820152610420614a058382016147fd565b9082015292915050565b600060a08284031215614a20578081fd5b60405160a0810181811067ffffffffffffffff82111715614a3d57fe5b80604052508091508251815260208301516020820152604083015160408201526060830151614a6b81615e3c565b60608201526080830151614a7e81615e3c565b6080919091015292915050565b803561336981615e73565b805161336981615e73565b803560ff8116811461336957600080fd5b600060208284031215614ac3578081fd5b81356135d981615e24565b600060208284031215614adf578081fd5b81516135d981615e24565b60008060408385031215614afc578081fd5b8235614b0781615e24565b91506020830135614b1781615e24565b809150509250929050565b60008060408385031215614b34578182fd5b8235614b3f81615e24565b91506020830135614b1781615e4a565b60008060408385031215614b61578182fd5b8235614b6c81615e24565b91506020830135614b1781615e57565b60008060408385031215614b8e578182fd5b8235614b9981615e24565b91506020830135614b1781615e64565b600060208284031215614bba578081fd5b81516135d981615e3c565b60008060008060808587031215614bda578182fd5b845193506020850151614bec81615e24565b6040860151606090960151949790965092505050565b600060208284031215614c13578081fd5b5051919050565b60008060008060808587031215614c2f578182fd5b843567ffffffffffffffff80821115614c46578384fd5b818701915087601f830112614c59578384fd5b8135602082821115614c6757fe5b614c79601f8301601f19168201615e00565b92508183528981838601011115614c8e578586fd5b818185018285013785818385010152829750614cab818a016147dc565b965050505050614cbd604086016147dc565b9150614ccb60608601614aa1565b905092959194509250565b60006101a0808385031215614ce9578182fd5b614cf281615e00565b9050614cfd836147dc565b81526020830135602082015260408301356040820152606083013560608201526080830135608082015260a083013560a0820152614d3d60c08401614a8b565b60c0820152614d4e60e0840161482d565b60e0820152610100614d6181850161482d565b908201526101208381013590820152610140614d7e818501614aa1565b90820152610160614d908482016147f2565b90820152610180614da28482016147f2565b908201529392505050565b6000610180808385031215614dc0578182fd5b614dc981615e00565b9050825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152506101208084015181830152506101408084015181830152506101608084015181830152508091505092915050565b6000610260808385031215614e62578182fd5b614e6b81615e00565b905082358152602083013560208201526040830135604082015260608301356060820152614e9b608084016147f2565b6080820152614eac60a084016147f2565b60a0820152614ebd60c084016147f2565b60c0820152614ece60e084016147f2565b60e0820152610100838101359082015261012080840135908201526101408084013590820152610160808401359082015261018080840135908201526101a080840135908201526101c080840135908201526101e0808401359082015261020080840135908201526102208084013590820152610240928301359281019290925250919050565b60006104408284031215614f67578081fd5b6135d98383614843565b600080600080848603610760811215614f88578283fd5b614f928787614843565b94506102608061043f1983011215614fa8578384fd5b614fb181615e00565b9150506104408601518152614fc961046087016147e7565b6020820152614fdb61048087016147e7565b6040820152614fed6104a08701614838565b6060820152614fff6104c08701614a96565b60808201526104e086015160a082015261050086015160c082015261052086015160e08201526105408601516101008201526105608601516101208201526105808601516101408201526105a08601516101608201526105c08601516101808201526105e08601516101a08201526106008601516101c08201526106208601516101e082015261064086015161020082015261509e61066087016147fd565b61022082015261068086015161024082015292506150c0866106a08701614a0f565b610740959095015193969295505050565b6000602082840312156150e2578081fd5b5035919050565b600080604083850312156150fb578182fd5b823591506020830135614b1781615e4a565b600080600060608486031215615121578081fd5b8335925060208401359150604084013561513a81615e3c565b809150509250925092565b600080600060608486031215615159578081fd5b505081359360208301359350604090920135919050565b6001600160a01b03169052565b15159052565b6004811061518d57fe5b9052565b6008811061518d57fe5b6002811061518d57fe5b60000b9052565b60008151808452815b818110156151d1576020818501810151868301820152016151b5565b818111156151e25782602083870101525b50601f01601f19169290920160200192915050565b80518252602081015161520d6020840182615170565b5060408101516152206040840182615170565b50606081015161523360608401826151a5565b50608081015161524660808401826152e9565b5060a0818101519083015260c0808201519083015260e08082015190830152610100808201519083015261012080820151908301526101408082015190830152610160808201519083015261018080820151908301526101a080820151908301526101c080820151908301526101e080820151908301526102008082015190830152610220808201516152db8285018261517d565b505061024090810151910152565b61ffff169052565b60ff169052565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0394851681529290931660208301526040820152901515606082015260800190565b6001600160a01b0383168152604081016135d9602083018461519b565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b6020808252825182820181905260009190848201906040850190845b818110156153de578351835292840192918401916001016153c2565b50909695505050505050565b60208101610868828461519b565b90815260200190565b918252602082015260400190565b6000602082526135d960208301846151ac565b60006080825261543560808301876151ac565b6001600160a01b03958616602084015293909416604082015260ff9190911660609091015292915050565b6020808252600f908201526e26b0b935b2ba1d3737ba1037b832b760891b604082015260600190565b60208082526016908201527526b0b935b2ba1d1026bab9ba103132903937baba32b960511b604082015260600190565b6020808252601f908201527f4d61726b65743a20706f736974696f6e20646f6573206e6f7420657869737400604082015260600190565b60208082526017908201527f4d61726b65743a20696e76616c69642061646472657373000000000000000000604082015260600190565b6020808252601f908201527f4d61726b65743a706f736974696f6e20646972656374696f6e206572726f7200604082015260600190565b6020808252601a908201527f4d61726b65743a204d75737420626520636f6e74726f6c6c6572000000000000604082015260600190565b60208082526017908201527f4d61726b65743a53657420707269636520706175736564000000000000000000604082015260600190565b6020808252601b908201527f4d61726b65743a20557064617465206d617267696e2070617573650000000000604082015260600190565b60208082526014908201527326b0b935b2ba1d1037b7363c9036b0b730b3b2b960611b604082015260600190565b60208082526028908201527f4d61726b65743a204d757374206265206d616e61676572206f722076616c6964604082015267206164647265737360c01b606082015260800190565b6020808252601c908201527f4d61726b65743a706f736974696f6e20616d6f756e74206572726f7200000000604082015260600190565b60208082526012908201527113585c9ad95d0e93dc195b881c185d5cd95960721b604082015260600190565b600061024082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015161573760e08401826151a5565b506101008381015190830152610120808401519083015261014080840151908301526101608084015161576c8285018261517d565b505061018083810151908301526101a080840151908301526101c08084015161579782850182615170565b50506101e08381015190830152610200808401516157b782850182615170565b505061022092830151919092015290565b60006101a0820190506157dc828451615170565b6020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015161582060c08401826152e9565b5060e083015161583360e08401826151a5565b5061010080840151615847828501826151a5565b5050610120838101519083015261014080840151615867828501826152f1565b50506101608084015161587c8285018261517d565b5050610180808401516158918285018261517d565b505092915050565b60006102c0820190506158ad8284516151f7565b60208301516158c0610260840182615191565b5060408301516102808301526060909201516102a09091015290565b600061026082019050825182526020830151602083015260408301516040830152606083015160608301526080830151615919608084018261517d565b5060a083015161592c60a084018261517d565b5060c083015161593f60c084018261517d565b5060e083015161595260e084018261517d565b50610100838101519083015261012080840151908301526101408084015190830152610160808401519083015261018080840151908301526101a080840151908301526101c080840151908301526101e080840151908301526102008084015190830152610220808401519083015261024092830151929091019190915290565b815481526001820154602082015260028201546040820152600382015460608201526004820154610260820190615a106080840160ff831661517d565b615a2360a0840160ff8360081c1661517d565b615a3660c0840160ff8360101c1661517d565b615a4960e0840160ff8360181c1661517d565b5060058301546101008301526006830154610120830152600783015461014083015260088301546101608301526009830154610180830152600a8301546101a0830152600b8301546101c0830152600c8301546101e0830152600d830154610200830152600e830154610220830152600f909201546102409091015290565b600061018082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a0830151615b0f60a08401826151a5565b5060c083015160c083015260e0830151615b2c60e0840182615170565b50610100838101519083015261012080840151615b4b82850182615170565b5050610140838101519083015261016092830151929091019190915290565b81518152602080830151610440830191615b8690840182615170565b506040830151615b996040840182615170565b506060830151615bac60608401826151a5565b506080830151615bbf60808401826152e9565b5060a0830151615bd260a08401826151a5565b5060c0838101519083015260e08084015190830152610100808401519083015261012080840151908301526101408084015190830152610160808401519083015261018080840151615c2682850182615191565b50506101a083810151908301526101c080840151908301526101e08084015190830152610200808401519083015261022080840151908301526102408084015190830152610260808401519083015261028080840151908301526102a080840151908301526102c080840151908301526102e08084015190830152610300808401519083015261032080840151908301526103408084015190830152610360808401519083015261038080840151908301526103a080840151908301526103c080840151908301526103e080840151615d0182850182615183565b505061040080840151615d168285018261519b565b5050610420808401516158918285018261517d565b610260810161086882846151f7565b97885260208801969096526001600160a01b03948516604088015292841660608701529216608085015260a084019190915260c083015260e08201526101000190565b93845260208401929092526040830152606082015260800190565b968752602087019590955260408601939093526060850191909152608084015260a083015260c082015260e00190565b60ff91909116815260200190565b60ff9490941684526001600160a01b03928316602085015291166040830152606082015260800190565b60405181810167ffffffffffffffff81118282101715615e1c57fe5b604052919050565b6001600160a01b0381168114615e3957600080fd5b50565b8015158114615e3957600080fd5b60088110615e3957600080fd5b60028110615e3957600080fd5b8060000b8114615e3957600080fd5b61ffff81168114615e3957600080fdfe5265656e7472616e637947756172643a207265656e7472616e742063616c6c0053616665436173743a2076616c756520646f65736e27742066697420696e203820626974735369676e6564536166654d6174683a206164646974696f6e206f766572666c6f775369676e6564536166654d6174683a206469766973696f6e206f766572666c6f77536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775369676e6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7753616665436173743a2076616c756520646f65736e27742066697420696e20616e20696e743235365369676e6564536166654d6174683a207375627472616374696f6e206f766572666c6f77a2646970667358221220e3f857782c4693a96641d61ebe581c4a07b3416882fa488ea8b564af20ebbb0a64736f6c63430007060033000000000000000000000000fd38ead11eaa5d566dc331848ff495b3d5cfb79f00000000000000000000000023ca92bf4cd73aa15e06058b7992e775d4dd3f040000000000000000000000003b6f77e51b06a3a6087c693090149fc10bff7858
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101e45760003560e01c806381203d031161010f578063b85b479f116100a2578063e5e24bb711610071578063e5e24bb7146103cd578063e7fe4461146103ed578063eb02c301146103f5578063fc0c546a14610415576101e4565b8063b85b479f1461038a578063ba49d3db1461039d578063ce05f8c7146103a5578063d09ef241146103ad576101e4565b80639e8a033f116100de5780639e8a033f14610349578063a04be9c21461035c578063abd108ba1461036f578063b3097c7514610377576101e4565b806381203d03146102ed57806389039f4a146102f55780638f2b811a1461031557806394f6113414610328576101e4565b80634c6e1162116101875780636af8dfd7116101565780636af8dfd7146102c25780636d8d1305146102ca5780637225a25c146102d257806379d1dcd9146102da576101e4565b80634c6e11621461027f5780634e155b751461029257806352b080241461029a578063614bd944146102ad576101e4565b80632a8a3b90116101c35780632a8a3b90146102245780632dd48909146102375780633d98c7c11461024c57806340e58ee51461026c576101e4565b80624d3c36146101e957806316f0115b146101fe57806320130c121461021c575b600080fd5b6101fc6101f736600461510d565b61042a565b005b610206610687565b60405161021391906152f8565b60405180910390f35b61020661069b565b6101fc610232366004614aea565b6106aa565b61023f610814565b6040516102139190615dc8565b61025f61025a366004614b7c565b61081d565b60405161021391906153f8565b6101fc61027a3660046150d1565b61086e565b6101fc61028d366004615145565b610a8d565b61025f610b79565b6101fc6102a8366004614e4f565b610b7f565b6102b5610cbe565b60405161021391906158dc565b61025f610d92565b61025f610d9f565b61025f610da5565b6101fc6102e8366004614c1a565b610dab565b61025f610e9d565b610308610303366004614ab2565b610ea3565b60405161021391906153ea565b61025f610323366004614b22565b610eb8565b61033b6103363660046150d1565b610ed5565b604051610213929190615401565b61025f6103573660046150e9565b6125ca565b61025f61036a366004614b7c565b612ef5565b610206612f12565b6101fc610385366004614b4f565b612f21565b61025f610398366004614cd6565b613021565b6101fc613141565b61025f61314b565b6103c06103bb3660046150d1565b613151565b6040516102139190615b6a565b6103e06103db366004614ab2565b61336e565b60405161021391906153a6565b61025f6133da565b6104086104033660046150d1565b6133e0565b6040516102139190615d2b565b61041d6134f1565b604051610213919061540f565b60026023541415610470576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e84833981519152604482015290519081900360640190fd5b6002602381905554604051630cc03d9760e11b81526001600160a01b03909116906319807b2e906104a59033906004016152f8565b60206040518083038186803b1580156104bd57600080fd5b505afa1580156104d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f59190614ba9565b61051a5760405162461bcd60e51b815260040161051190615489565b60405180910390fd5b600a546301000000900460ff16156105445760405162461bcd60e51b8152600401610511906155cc565b6000838152601c6020526040812090821561057d576005820154610568908561357f565b6005830155610576846135e0565b90506105a5565b600582015461058c9085613628565b60058301556105a261059d856135e0565b61366a565b90505b6001805490830154600f840154604051630d7bea6560e31b81526101009093046001600160a01b0390811693636bdf5328936105ef93309390911691879160ff1690600401615326565b602060405180830381600087803b15801561060957600080fd5b505af115801561061d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106419190614ba9565b507f82b8dd3fdddf992631f67e1ae3c2213fbbe1c816f3f79df16bacb5dd470c7c5b8582604051610673929190615401565b60405180910390a150506001602355505050565b60015461010090046001600160a01b031681565b6003546001600160a01b031681565b6002546040516310fd24b760e11b81526001600160a01b03909116906321fa496e906106da9033906004016152f8565b60206040518083038186803b1580156106f257600080fd5b505afa158015610706573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072a9190614ba9565b6107465760405162461bcd60e51b81526004016105119061555e565b6001600160a01b03821661076c5760405162461bcd60e51b8152600401610511906154f0565b6004546001600160a01b0316156107a3576001600160a01b0381166107a35760405162461bcd60e51b8152600401610511906154f0565b600380546001600160a01b038085166001600160a01b0319928316179283905560048054858316931692909217918290556040517f10b09df773f985c74b5e7961018f0064f3cd1744386728f0d7f9a666155baca4936108089390831692169061530c565b60405180910390a15050565b60015460ff1681565b6001600160a01b03821660009081526019602052604081208161084085856136cb565b600281111561084b57fe5b600281111561085657fe5b81526020019081526020016000205490505b92915050565b600260235414156108b4576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e84833981519152604482015290519081900360640190fd5b6002602381905554604051630cc03d9760e11b81526001600160a01b03909116906319807b2e906108e99033906004016152f8565b60206040518083038186803b15801561090157600080fd5b505afa158015610915573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109399190614ba9565b6109555760405162461bcd60e51b815260040161051190615489565b6000818152601b6020526040812090601c82015460ff16600381111561097757fe5b148061099557506002601c82015460ff16600381111561099357fe5b145b6109b15760405162461bcd60e51b815260040161051190615460565b601c8101805460ff1916600317905560028101546001600160a01b03166000908152601e60205260408120600983015490919060ff1660078111156109f257fe5b60078111156109fd57fe5b8152602081019190915260400160009081208054600019019055600282015460098301546004840154610a6c936001600160a01b0384169360ff90931692600160a01b810490910b91610a679161059d91610a6291600160a81b900461ffff1661371f565b6135e0565b613778565b600481015415610a8457610a84338260040154613813565b50506001602355565b600254604051630cc03d9760e11b81526001600160a01b03909116906319807b2e90610abd9033906004016152f8565b60206040518083038186803b158015610ad557600080fd5b505afa158015610ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0d9190614ba9565b610b295760405162461bcd60e51b815260040161051190615489565b600a54610100900460ff1615610b515760405162461bcd60e51b815260040161051190615595565b6000928352601c6020526040909220600a810191909155600981019190915542600b90910155565b60185481565b6002546001600160a01b03163314610ba95760405162461bcd60e51b815260040161051190615603565b80516006908155602082015160075560408083015160085560608301516009556080830151600a805460a086015160c087015160e088015160ff199093169415159490941761ff00191661010091151582021762ff0000191662010000941515949094029390931763ff0000001916630100000091151591909102179055830151600b55610120830151600c55610140830151600d55610160830151600e55610180830151600f556101a08301516010556101c08301516011556101e0830151601255610200830151601355610220830151601455610240830151601555517f05eb5eb2ce9e8f3f982c40d2724aed301cfd2ff37ad3d7c413a3db51bd6ed43191610cb3916159d3565b60405180910390a150565b610cc6614366565b50604080516102608101825260065481526007546020820152600854918101919091526009546060820152600a5460ff808216151560808401526101008083048216151560a08501526201000083048216151560c0850152630100000090920416151560e0830152600b5490820152600c54610120820152600d54610140820152600e54610160820152600f546101808201526010546101a08201526011546101c08201526012546101e082015260135461020082015260145461022082015260155461024082015290565b68056bc75e2d6310000081565b60205481565b60215481565b6002546001600160a01b031633148015610dcd57506001600160a01b03831615155b8015610de157506001600160a01b03821615155b610dfd5760405162461bcd60e51b815260040161051190615631565b8351610e10906000906020870190614400565b50600580546001600160a01b0319166001600160a01b038581169190911790915560018054610100600160a81b031916610100928516929092029190911760ff191660ff83161790556040517f4170d6c3406f944ff888a43ae17a28405aa2e66d7e0f7f39419b4aa40362d91690610e8f908690869086908690615422565b60405180910390a150505050565b60175481565b601d6020526000908152604090205460ff1681565b601e60209081526000928352604080842090915290825290205481565b60008060026023541415610f1e576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e84833981519152604482015290519081900360640190fd5b6002602381905554604051630cc03d9760e11b81526001600160a01b03909116906319807b2e90610f539033906004016152f8565b60206040518083038186803b158015610f6b57600080fd5b505afa158015610f7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa39190614ba9565b610fbf5760405162461bcd60e51b815260040161051190615489565b610fc7614488565b6000848152601b602090815260408083208151610440810183528154815260018201546001600160a01b0390811694820194909452600282015493841692810192909252600160a01b8304840b840b840b606083015261ffff600160a81b8404166080830152600160b81b909204830b830b90920b60a0830152600381015460c0830152600481015460e0830152600581015461010083015260068101546101208301526007808201546101408401526008820154610160840152600982015461018084019160ff9091169081111561109c57fe5b60078111156110a757fe5b8152600a8201546020820152600b8201546040820152600c8201546060820152600d8201546080820152600e82015460a0820152600f82015460c0820152601082015460e08201526011820154610100820152601282015461012082015260138201546101408201526014820154610160820152601582015461018082015260168201546101a082015260178201546101c082015260188201546101e08201526019820154610200820152601a820154610220820152601b820154610240820152601c8201546102609091019060ff16600381111561118257fe5b600381111561118d57fe5b8152602001601c820160019054906101000a900460ff1660018111156111af57fe5b60018111156111ba57fe5b8152601c919091015462010000900460ff16151560209091015260a0820181905261018001516000906111ec9061382e565b15611200575060a08101516060015161121f565b61121c6112178360a001516060015160000b61366a565b613859565b90505b60006112338360a0015160400151836136cb565b60a08401516040908101516001600160a01b03166000908152601960205290812091925082600281111561126357fe5b600281111561126e57fe5b815260200190815260200160002054935083600014156112e357601680546001019081905560a08401516040908101516001600160a01b0316600090815260196020529081209195508591908360028111156112c657fe5b60028111156112d157fe5b81526020810191909152604001600020555b6000848152601c6020818152604080842060088101548b8652601b845291852060180191909155878452919052600281015460039091015461133c92600160a01b909204820b90910b90611336906135e0565b906138a8565b6000878152601b602052604080822060190192909255600154825163975b9fed60e01b815292516101009091046001600160a01b03169263975b9fed92600480830193919282900301818387803b15801561139657600080fd5b505af11580156113aa573d6000803e3d6000fd5b5050506000858152601c602052604090206113c59150613951565b506000848152601c602090815260408083208151610260810183528154815260018201546001600160a01b039081168286015260028084015480831684870152600160a01b8104880b880b90970b6060840152600160a81b90960461ffff166080830152600383015460a083015260048084015460c0840152600584015460e0808501919091526006850154610100850152600785015461012085015260088501546101408501526009850154610160850152600a850154610180850152600b8501546101a0850152600c8501546101c0850152600d8501546101e0850152600e850154610200850152600f85015460ff1615156102208501526010909401546102408401529289019190915293548251630fdb3b6d60e01b81529251941693630fdb3b6d9383830193909290829003018186803b15801561150657600080fd5b505afa15801561151a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153e9190614ace565b6001600160a01b0390811661014085018190526000888152601b60205260409081902060020154905163019933d760e11b8152919263033267ae9261158992909116906004016152f8565b60806040518083038186803b1580156115a157600080fd5b505afa1580156115b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d99190614bc5565b608087015260608601526001600160a01b03166040850152602084015260008360a001516101800151600781111561160d57fe5b148061162d575060018360a001516101800151600781111561162b57fe5b145b156116385760228690555b60035460608401516080850151604051630ad3a39b60e41b81526001600160a01b039093169263ad3a39b092611676928b928a929190600401615d7d565b6107606040518083038186803b15801561168f57600080fd5b505afa1580156116a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116c79190614f71565b610120870181905261010087019190915260c086019190915260a08501919091521561176d577fbb6c6db062179325388caf1b610c92beeb771b87f046694aaea698f1441e715486846101200151604051611723929190615401565b60405180910390a18261012001516005141561174557600294505050506125be565b5050506000838152601b60205260409020601c01805460ff19166002179055600191506125be565b602083015160a08401805161028001919091525160e0015115611816576002546040805163fbfa77cf60e01b81529051611816926001600160a01b03169163fbfa77cf916004808301926020929190829003018186803b1580156117d057600080fd5b505afa1580156117e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118089190614ace565b8460a0015160e00151613813565b60a0830180516040908101516001600160a01b03166000908152601e60205290812091516101800151600781111561184a57fe5b600781111561185557fe5b815260208101919091526040908101600020805460001901905560a0840151908101516101808201516060830151608084015160e0909401516118a894610a679161059d91610a62919061ffff1661371f565b600d5460c084015160a001511080156118c9575060008360c0015160a00151115b15611a68576119076118e3846101000151604001516135e0565b6119018560c001516101c001516119018760c0015160e001516135e0565b90613a9b565b61016084018190526000121561194157611935611928846101600151613b00565b610100850151519061357f565b61010084015152611965565b61016083015160a0840151610300015161195a91613b57565b60a084015161030001525b60c080840151805160a082015160e083015161010080850151958501516101c0909501519089015160409081015190517f8d52f8d6309cfb217f8d74c0cc6d90b1a04bd66fdbcb672b9ad327eba426b179976119c697909390929091615d98565b60405180910390a16101008301516040015160a08401516103a001516119eb9161357f565b60a0840180516103a0019190915260c08401516101c0015190516103200151611a1391613b57565b60a080850151610320019190915260c0808501805160006101c0909101819052815160e001819052815161010090810182905282516101e0018290528251909401819052905190910181905290840151606001525b8261010001516060015115611d2a5760018054906101000a90046001600160a01b03166001600160a01b03166346dcc90960405180610180016040528086610100015160800151611add57611ad88760e0015161010001518860c00151610100015161362890919063ffffffff16565b611ae8565b8660c0015161010001515b815260200186610100015160800151611b2357611b1e8760e0015160e001518860c0015160e0015161362890919063ffffffff16565b611b2d565b8660c0015160e001515b815260200186610100015160800151611b6857611b638760e0015160a001518860c0015160a0015161362890919063ffffffff16565b611b72565b8660c0015160a001515b815260200186610100015160800151611bad57611ba88760e0015160c001518860c0015160c0015161362890919063ffffffff16565b611bb7565b8660c0015160c001515b815260200186610100015160800151611bd9578660a001516102200151611bdc565b60005b81526020018660a001516060015160000b81526020018660a0015160e0015181526020018660a00151604001516001600160a01b0316815260200186610100015160800151611c34578660a001516101e00151611c37565b60005b815260200186604001516001600160a01b0316815260200186610100015160800151611c8757611c828760e001516101e001518860c001516101e0015161362890919063ffffffff16565b611c92565b8660c001516101e001515b815260200186610100015160800151611cb4578660a001516102000151611cb7565b60005b8152506040518263ffffffff1660e01b8152600401611cd69190615ac8565b602060405180830381600087803b158015611cf057600080fd5b505af1158015611d04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d289190614ba9565b505b82610100015160800151156120555760018054906101000a90046001600160a01b03166001600160a01b0316638b58486760405180610240016040528086610100015160600151611d9f57611d9a8760c0015161010001518860e00151610100015161362890919063ffffffff16565b611daa565b8660e0015161010001515b815260200186610100015160600151611de557611de08760c0015160e001518860e0015160e0015161362890919063ffffffff16565b611def565b8660e0015160e001515b815260200186610100015160600151611e2a57611e258760c0015160a001518860e0015160a0015161362890919063ffffffff16565b611e34565b8660e0015160a001515b815260200186610100015160600151611e6f57611e6a8760c0015160c001518860e0015160c0015161362890919063ffffffff16565b611e79565b8660e0015160c001515b8152602001611e908760a00151610300015161366a565b81526020018660a001516102200151815260200186610100015160600151611edc57611ed78760c001516101c001518860e001516101c00151613a9b90919063ffffffff16565b611ee7565b8660e001516101c001515b81526020018660e001516060015160000b815260200186610100015160600151611f19578660a0015160e00151611f1c565b60005b815260200186610100015160600151611f5957611f548760c001516101e001518860e001516101e0015161362890919063ffffffff16565b611f64565b8660e001516101e001515b81526020018660a001516103a0015181526020018660e00151610220015115158152602001600081526020018661010001516000015181526020018660a00151604001516001600160a01b031681526020018660a001516101e00151815260200186604001516001600160a01b031681526020018660a0015161020001518152506040518263ffffffff1660e01b815260040161200191906156dc565b602060405180830381600087803b15801561201b57600080fd5b505af115801561202f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120539190614ba9565b505b61014083015160015460a0850151604090810151818701516101008801516020015192516340fcf9e760e11b81526001600160a01b03909516946381f9f3ce946120a99460ff909116939291600401615dd6565b600060405180830381600087803b1580156120c357600080fd5b505af11580156120d7573d6000803e3d6000fd5b5050505060a08301518051610280820151604080840151818801516005546101008a0151602001516102408801516101e09098015194517fedea480d8299344e246665a5598126093132fa4c5bbf173c2024726bb581194f986121499897966001600160a01b03909416939091615d3a565b60405180910390a182610100015160600151801561216e575082610100015160800151155b156121a7578260e0015160a001518360c0015160a00151116121a25760405162461bcd60e51b815260040161051190615679565b61222e565b826101000151606001511580156121c45750826101000151608001515b156121f8578260e0015160a001518360c0015160a00151106121a25760405162461bcd60e51b815260040161051190615679565b8260e001516060015160000b8360c001516060015160000b141561222e5760405162461bcd60e51b815260040161051190615527565b60a0808401516000888152601b602090815260408083208451815591840151600180840180546001600160a01b039384166001600160a01b03199182161790915592860151600285018054606089015160808a01519a8a0151890b60ff908116600160b81b0260ff60b81b1961ffff909d16600160a81b0261ffff60a81b1993909b0b909116600160a01b0260ff60a01b1995909716929097169190911792909216939093171694909417959095161790935560c0820151600384015560e082015160048401556101008201516005840155610120820151600684015561014082015160078085019190915561016083015160088501556101808301516009850180549495949193909260ff1990921691849081111561234a57fe5b02179055506101a0820151600a8201556101c0820151600b8201556101e0820151600c820155610200820151600d820155610220820151600e820155610240820151600f820155610260820151601082015561028082015160118201556102a082015160128201556102c082015160138201556102e08201516014820155610300820151601582015561032082015160168201556103408201516017820155610360820151601882015561038082015160198201556103a0820151601a8201556103c0820151601b8201556103e0820151601c8201805460ff1916600183600381111561243357fe5b0217905550610400820151601c8201805461ff00191661010083600181111561245857fe5b02179055506104209190910151601c9182018054911515620100000262ff00001990921691909117905560c09384015160008681526020928352604080822083518155938301516001850180546001600160a01b039283166001600160a01b031991821617909155918401516002860180546060870151608088015161ffff16600160a81b0261ffff60a81b1991880b60ff16600160a01b0260ff60a01b1995909616929096169190911792909216929092171691909117905560a0820151600384015594810151600483015560e081015160058301556101008101516006830155610120810151600783015561014081015160088301556101608101516009830155610180810151600a8301556101a0810151600b8301556101c0810151600c8301556101e0810151600d830155610200810151600e830155610220810151600f8301805491151560ff19909216919091179055610240015160109091015550909250505b60016023559092909150565b600060026023541415612612576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e84833981519152604482015290519081900360640190fd5b6002602381905554604051630cc03d9760e11b81526001600160a01b03909116906319807b2e906126479033906004016152f8565b60206040518083038186803b15801561265f57600080fd5b505afa158015612673573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126979190614ba9565b6126b35760405162461bcd60e51b815260040161051190615489565b6126bb614516565b6000848152601c6020526040902060038101546126ea5760405162461bcd60e51b8152600401610511906154b9565b604080516101a08101825260018301546001600160a01b031681528254602082015260009181018290526060810182905260808101829052600383015460a0820152600283015461ffff600160a81b82041660c0830152601b91839161279e919060e08201906127689061121790600160a01b9004860b860b61366a565b600090810b82526020820181905260408201526001606082018190526080820152600f87015460ff16151560a090910152613bbc565b81526020019081526020016000209050816008015481601801819055506127e08260020160149054906101000a900460000b60000b61133684600301546135e0565b816019018190555060018054906101000a90046001600160a01b03166001600160a01b031663975b9fed6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561283657600080fd5b505af115801561284a573d6000803e3d6000fd5b5050505061285782613951565b50602080546017830155600c830154601683015560025460408051630fdb3b6d60e01b815290516001600160a01b0390921692630fdb3b6d92600480840193829003018186803b1580156128aa57600080fd5b505afa1580156128be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128e29190614ace565b6001600160a01b0390811660c08501819052600283015460405163019933d760e11b8152919263033267ae9261291e92909116906004016152f8565b60806040518083038186803b15801561293657600080fd5b505afa15801561294a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061296e9190614bc5565b60a0878101919091526080808801929092526001600160a01b0392831660608801526040808801949094526003805485516102e0810190965287549386019384526001880154851692860192909252600287015480851660c0870152600160a01b8104600090810b810b900b60e0870152600160a81b900461ffff166101008601528601546101208501526004860154610140850152600586015461016085015260068601546101808501526007808701546101a086015260088701546101c086015260098701546101e0860152600a870154610200860152600b870154610220860152600c870154610240860152600d870154610260860152600e870154610280860152600f87015460ff1615156102a086015260108701546102c0860152918452909116916371e152519160208201908990811115612aab57fe5b8152602001866080015181526020018660a001518152506040518263ffffffff1660e01b8152600401612ade9190615899565b6101806040518083038186803b158015612af757600080fd5b505afa158015612b0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b2f9190614dad565b80845260408085015160118401556020820151600b840155810151600e8301556060810151600d8301556080810151600c83015560a00151600f82015560098101805486919060ff19166001836007811115612b8757fe5b0217905550825160e0810151601a83015560c0810151600a830155516015820155601c810180546001919060ff191682800217905550426012820155825161014081015160138301556101600151601482015560015460408051610240810182526006850154815260058501546020820152600385015491810191909152600484015460608201528451516101009092046001600160a01b031691638b58486791906080820190612c379061366a565b8152602001866000015160400151815260200185600c015481526020018560020160149054906101000a900460000b60000b81526020016000815260200185600d01548152602001866000015160e00151815260200185600f0160009054906101000a900460ff161515815260200184600a015481526020018660000151610100015181526020018560010160009054906101000a90046001600160a01b03166001600160a01b0316815260200184600c0154815260200186606001516001600160a01b0316815260200184600d01548152506040518263ffffffff1660e01b8152600401612d2691906156dc565b602060405180830381600087803b158015612d4057600080fd5b505af1158015612d54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d789190614ba9565b506004600982015460ff166007811115612d8e57fe5b14612e855760c083015160015460028301546060860151865161012001516040516340fcf9e760e11b81526001600160a01b03958616956381f9f3ce95612de29560ff909116949116929091600401615dd6565b600060405180830381600087803b158015612dfc57600080fd5b505af1158015612e10573d6000803e3d6000fd5b50508254601184015460028501546005546060890151895161012081015160a08201516080909201516040517fedea480d8299344e246665a5598126093132fa4c5bbf173c2024726bb581194f9a50612e7c99506001600160a01b039687169690951694919291615d3a565b60405180910390a15b600060038301819055600683018190556005830181905560048301556015810154600e830154612eb491613b57565b600e8301556000600c83018190556010830181905560098301819055600a8301819055600b8301819055600d90920191909155546001602355949350505050565b601f60209081526000928352604080842090915290825290205481565b6004546001600160a01b031690565b600254604051630cc03d9760e11b81526001600160a01b03909116906319807b2e90612f519033906004016152f8565b60206040518083038186803b158015612f6957600080fd5b505afa158015612f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fa19190614ba9565b612fbd5760405162461bcd60e51b815260040161051190615489565b6001600160a01b0382166000908152601d60205260409020805482919060ff191660018381811115612feb57fe5b02179055507fd8e7fc0df562c0edbe9f10f1713d069535cab2090c770f7c2a9c3015cc59d2e4828260405161080892919061534f565b600060026023541415613069576040805162461bcd60e51b815260206004820152601f6024820152600080516020615e84833981519152604482015290519081900360640190fd5b6002602381905554604051630cc03d9760e11b81526001600160a01b03909116906319807b2e9061309e9033906004016152f8565b60206040518083038186803b1580156130b657600080fd5b505afa1580156130ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130ee9190614ba9565b61310a5760405162461bcd60e51b815260040161051190615489565b600a5460ff161561312d5760405162461bcd60e51b8152600401610511906156b0565b61313682613bbc565b600160235592915050565b613149614019565b565b60165481565b613159614559565b6000828152601b602090815260408083208151610440810183528154815260018201546001600160a01b0390811694820194909452600282015493841692810192909252600160a01b8304840b840b840b606083015261ffff600160a81b8404166080830152600160b81b909204830b830b90920b60a0830152600381015460c0830152600481015460e0830152600581015461010083015260068101546101208301526007808201546101408401526008820154610160840152600982015461018084019160ff9091169081111561322e57fe5b600781111561323957fe5b8152600a8201546020820152600b8201546040820152600c8201546060820152600d8201546080820152600e82015460a0820152600f82015460c0820152601082015460e08201526011820154610100820152601282015461012082015260138201546101408201526014820154610160820152601582015461018082015260168201546101a082015260178201546101c082015260188201546101e08201526019820154610200820152601a820154610220820152601b820154610240820152601c8201546102609091019060ff16600381111561331457fe5b600381111561331f57fe5b8152602001601c820160019054906101000a900460ff16600181111561334157fe5b600181111561334c57fe5b8152601c919091015462010000900460ff16151560209091015290505b919050565b6001600160a01b0381166000908152601a60209081526040918290208054835181840281018401909452808452606093928301828280156133ce57602002820191906000526020600020905b8154815260200190600101908083116133ba575b50505050509050919050565b60225481565b6133e8614687565b506000908152601c602090815260408083208151610260810183528154815260018201546001600160a01b0390811694820194909452600282015493841692810192909252600160a01b8304840b840b90930b6060820152600160a81b90910461ffff166080820152600382015460a0820152600482015460c0820152600582015460e08201526006820154610100820152600782015461012082015260088201546101408201526009820154610160820152600a820154610180820152600b8201546101a0820152600c8201546101c0820152600d8201546101e0820152600e820154610200820152600f82015460ff16151561022082015260109091015461024082015290565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156135775780601f1061354c57610100808354040283529160200191613577565b820191906000526020600020905b81548152906001019060200180831161355a57829003601f168201915b505050505081565b6000828201838110156135d9576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6000600160ff1b82106136245760405162461bcd60e51b8152600401808060200182810382526028815260200180615f536028913960400191505060405180910390fd5b5090565b60006135d983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506140ae565b6000600160ff1b82136136c4576040805162461bcd60e51b815260206004820152601c60248201527f506572704d6174683a20696e76657273696f6e206f766572666c6f7700000000604482015290519081900360640190fd5b5060000390565b6000806001600160a01b0384166000908152601d602052604090205460ff1660018111156136f557fe5b141561370357506002610868565b8160000b600019146137165760016135d9565b50600092915050565b60008261372e57506000610868565b8282028284828161373b57fe5b04146135d95760405162461bcd60e51b8152600401808060200182810382526021815260200180615f0b6021913960400191505060405180910390fd5b6137818361382e565b1561380d576137af61379660068001546135e0565b6137a98368056bc75e2d631000006138a8565b90614145565b6001600160a01b0385166000908152601f6020908152604080832086840b840b84529091529020549091506137e49082613b57565b6001600160a01b0385166000908152601f6020908152604080832086840b840b84529091529020555b50505050565b60055461382a906001600160a01b031683836141fd565b5050565b60008082600781111561383d57fe5b14806108685750600282600781111561385257fe5b1492915050565b6000607f19821215801561386d5750608082125b6136245760405162461bcd60e51b8152600401808060200182810382526025815260200180615ea46025913960400191505060405180910390fd5b6000826138b757506000610868565b826000191480156138cb5750600160ff1b82145b156139075760405162461bcd60e51b8152600401808060200182810382526027815260200180615f2c6027913960400191505060405180910390fd5b8282028284828161391457fe5b05146135d95760405162461bcd60e51b8152600401808060200182810382526027815260200180615f2c6027913960400191505060405180910390fd5b6004546000906001600160a01b031661396c57506000613369565b613974614019565b60048054835460205460405163489bcce160e01b81526001600160a01b039093169363489bcce1936139ac9330939092909101615385565b60206040518083038186803b1580156139c457600080fd5b505afa1580156139d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139fc9190614c02565b90506021544214613a0c57426021555b6020546008830155801561336957600c820154613a299082613b57565b600c83015560015460405163808d7cdf60e01b81526101009091046001600160a01b03169063808d7cdf90613a64903090859060040161536c565b600060405180830381600087803b158015613a7e57600080fd5b505af1158015613a92573d6000803e3d6000fd5b50505050919050565b6000818303818312801590613ab05750838113155b80613ac55750600083128015613ac557508381135b6135d95760405162461bcd60e51b8152600401808060200182810382526024815260200180615f7b6024913960400191505060405180910390fd5b600080821215613624576040805162461bcd60e51b815260206004820181905260248201527f53616665436173743a2076616c7565206d75737420626520706f736974697665604482015290519081900360640190fd5b6000828201818312801590613b6c5750838112155b80613b815750600083128015613b8157508381125b6135d95760405162461bcd60e51b8152600401808060200182810382526021815260200180615ec96021913960400191505060405180910390fd5b600354604051635e03528160e01b815260009182916001600160a01b0390911690635e03528190613bf19086906004016157c8565b6104406040518083038186803b158015613c0a57600080fd5b505afa158015613c1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c429190614f55565b905060008161018001516007811115613c5757fe5b1480613c73575060018161018001516007811115613c7157fe5b145b613c87576018805460010190819055613c93565b60178054600101908190555b8082526000908152601b602090815260408083208451815591840151600180840180546001600160a01b03199081166001600160a01b039485161790915592860151600285018054606089015160808a015160a08b015192909716939095169290921760ff60a01b1916600160a01b94880b60ff908116959095021761ffff60a81b1916600160a81b61ffff909616959095029490941760ff60b81b1916600160b81b9190960b929092169190910293909317905560c0830151600382015560e0830151600482015561010083015160058201556101208301516006820155610140830151600780830191909155610160840151600883015561018084015160098301805486959293919260ff19909116918490811115613db057fe5b02179055506101a0820151600a8201556101c0820151600b8201556101e0820151600c820155610200820151600d820155610220820151600e820155610240820151600f820155610260820151601082015561028082015160118201556102a082015160128201556102c082015160138201556102e08201516014820155610300820151601582015561032082015160168201556103408201516017820155610360820151601882015561038082015160198201556103a0820151601a8201556103c0820151601b8201556103e0820151601c8201805460ff19166001836003811115613e9957fe5b0217905550610400820151601c8201805461ff001916610100836001811115613ebe57fe5b02179055506104209190910151601c9091018054911515620100000262ff00001990921691909117905582516001600160a01b03166000908152601a602090815260408220835181546001810183559184529190922090910155610160830151613f725782516001600160a01b03166000908152601e602052604081206101808301519091906007811115613f4f57fe5b6007811115613f5a57fe5b81526020810191909152604001600020805460010190555b613fa781604001518261018001518360600151610a67610a62866080015161ffff168760e0015161371f90919063ffffffff16565b826101600151614012576003548151604051632477e33960e11b81526001600160a01b03909216916348efc67291613fe1916004016153f8565b60006040518083038186803b158015613ff957600080fd5b505afa15801561400d573d6000803e3d6000fd5b505050505b5192915050565b6004546001600160a01b0316156131495760048054604051635685279960e11b81526001600160a01b039091169163ad0a4f3291614059913091016152f8565b60206040518083038186803b15801561407157600080fd5b505afa158015614085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140a99190614c02565b602055565b6000818484111561413d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156141025781810151838201526020016140ea565b50505050905090810190601f16801561412f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081614199576040805162461bcd60e51b815260206004820181905260248201527f5369676e6564536166654d6174683a206469766973696f6e206279207a65726f604482015290519081900360640190fd5b816000191480156141ad5750600160ff1b83145b156141e95760405162461bcd60e51b8152600401808060200182810382526021815260200180615eea6021913960400191505060405180910390fd5b60008284816141f457fe5b05949350505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b602083106142795780518252601f19909201916020918201910161425a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146142db576040519150601f19603f3d011682016040523d82523d6000602084013e6142e0565b606091505b509150915081801561430e57508051158061430e575080806020019051602081101561430b57600080fd5b50515b61435f576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b6040518061026001604052806000815260200160008152602001600081526020016000815260200160001515815260200160001515815260200160001515815260200160001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282614436576000855561447c565b82601f1061444f57805160ff191683800117855561447c565b8280016001018555821561447c579182015b8281111561447c578251825591602001919060010190614461565b50613624929150614733565b604051806101800160405280600081526020016000801916815260200160006001600160a01b0316815260200160008152602001600081526020016144cb614559565b81526020016144d8614687565b81526020016144e5614687565b81526020016144f2614748565b81526020016000815260200160006001600160a01b03168152602001600081525090565b6040518060e0016040528061452961477b565b815260006020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b6040518061044001604052806000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000800b8152602001600061ffff1681526020016000800b8152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600060078111156145e057fe5b81526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008019168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000600381111561467357fe5b815260200160008152600060209091015290565b6040518061026001604052806000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000800b8152602001600061ffff168152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600015158152602001600081525090565b5b808211156136245760008155600101614734565b6040518060a001604052806000815260200160008152602001600081526020016000151581526020016000151581525090565b6040518061018001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b803561336981615e24565b805161336981615e24565b803561336981615e3c565b805161336981615e3c565b80516004811061336957600080fd5b805161336981615e4a565b805161336981615e57565b803561336981615e64565b805161336981615e64565b6000610440808385031215614856578182fd5b61485f81615e00565b91505081518152614872602083016147e7565b6020820152614883604083016147e7565b604082015261489460608301614838565b60608201526148a560808301614a96565b60808201526148b660a08301614838565b60a082015260c0828101519082015260e080830151908201526101008083015190820152610120808301519082015261014080830151908201526101608083015190820152610180614909818401614817565b908201526101a082810151908201526101c080830151908201526101e08083015190820152610200808301519082015261022080830151908201526102408083015190820152610260808301519082015261028080830151908201526102a080830151908201526102c080830151908201526102e08083015190820152610300808301519082015261032080830151908201526103408083015190820152610360808301519082015261038080830151908201526103a080830151908201526103c080830151908201526103e06149e1818401614808565b908201526104006149f3838201614822565b90820152610420614a058382016147fd565b9082015292915050565b600060a08284031215614a20578081fd5b60405160a0810181811067ffffffffffffffff82111715614a3d57fe5b80604052508091508251815260208301516020820152604083015160408201526060830151614a6b81615e3c565b60608201526080830151614a7e81615e3c565b6080919091015292915050565b803561336981615e73565b805161336981615e73565b803560ff8116811461336957600080fd5b600060208284031215614ac3578081fd5b81356135d981615e24565b600060208284031215614adf578081fd5b81516135d981615e24565b60008060408385031215614afc578081fd5b8235614b0781615e24565b91506020830135614b1781615e24565b809150509250929050565b60008060408385031215614b34578182fd5b8235614b3f81615e24565b91506020830135614b1781615e4a565b60008060408385031215614b61578182fd5b8235614b6c81615e24565b91506020830135614b1781615e57565b60008060408385031215614b8e578182fd5b8235614b9981615e24565b91506020830135614b1781615e64565b600060208284031215614bba578081fd5b81516135d981615e3c565b60008060008060808587031215614bda578182fd5b845193506020850151614bec81615e24565b6040860151606090960151949790965092505050565b600060208284031215614c13578081fd5b5051919050565b60008060008060808587031215614c2f578182fd5b843567ffffffffffffffff80821115614c46578384fd5b818701915087601f830112614c59578384fd5b8135602082821115614c6757fe5b614c79601f8301601f19168201615e00565b92508183528981838601011115614c8e578586fd5b818185018285013785818385010152829750614cab818a016147dc565b965050505050614cbd604086016147dc565b9150614ccb60608601614aa1565b905092959194509250565b60006101a0808385031215614ce9578182fd5b614cf281615e00565b9050614cfd836147dc565b81526020830135602082015260408301356040820152606083013560608201526080830135608082015260a083013560a0820152614d3d60c08401614a8b565b60c0820152614d4e60e0840161482d565b60e0820152610100614d6181850161482d565b908201526101208381013590820152610140614d7e818501614aa1565b90820152610160614d908482016147f2565b90820152610180614da28482016147f2565b908201529392505050565b6000610180808385031215614dc0578182fd5b614dc981615e00565b9050825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152506101208084015181830152506101408084015181830152506101608084015181830152508091505092915050565b6000610260808385031215614e62578182fd5b614e6b81615e00565b905082358152602083013560208201526040830135604082015260608301356060820152614e9b608084016147f2565b6080820152614eac60a084016147f2565b60a0820152614ebd60c084016147f2565b60c0820152614ece60e084016147f2565b60e0820152610100838101359082015261012080840135908201526101408084013590820152610160808401359082015261018080840135908201526101a080840135908201526101c080840135908201526101e0808401359082015261020080840135908201526102208084013590820152610240928301359281019290925250919050565b60006104408284031215614f67578081fd5b6135d98383614843565b600080600080848603610760811215614f88578283fd5b614f928787614843565b94506102608061043f1983011215614fa8578384fd5b614fb181615e00565b9150506104408601518152614fc961046087016147e7565b6020820152614fdb61048087016147e7565b6040820152614fed6104a08701614838565b6060820152614fff6104c08701614a96565b60808201526104e086015160a082015261050086015160c082015261052086015160e08201526105408601516101008201526105608601516101208201526105808601516101408201526105a08601516101608201526105c08601516101808201526105e08601516101a08201526106008601516101c08201526106208601516101e082015261064086015161020082015261509e61066087016147fd565b61022082015261068086015161024082015292506150c0866106a08701614a0f565b610740959095015193969295505050565b6000602082840312156150e2578081fd5b5035919050565b600080604083850312156150fb578182fd5b823591506020830135614b1781615e4a565b600080600060608486031215615121578081fd5b8335925060208401359150604084013561513a81615e3c565b809150509250925092565b600080600060608486031215615159578081fd5b505081359360208301359350604090920135919050565b6001600160a01b03169052565b15159052565b6004811061518d57fe5b9052565b6008811061518d57fe5b6002811061518d57fe5b60000b9052565b60008151808452815b818110156151d1576020818501810151868301820152016151b5565b818111156151e25782602083870101525b50601f01601f19169290920160200192915050565b80518252602081015161520d6020840182615170565b5060408101516152206040840182615170565b50606081015161523360608401826151a5565b50608081015161524660808401826152e9565b5060a0818101519083015260c0808201519083015260e08082015190830152610100808201519083015261012080820151908301526101408082015190830152610160808201519083015261018080820151908301526101a080820151908301526101c080820151908301526101e080820151908301526102008082015190830152610220808201516152db8285018261517d565b505061024090810151910152565b61ffff169052565b60ff169052565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0394851681529290931660208301526040820152901515606082015260800190565b6001600160a01b0383168152604081016135d9602083018461519b565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039390931683526020830191909152604082015260600190565b6020808252825182820181905260009190848201906040850190845b818110156153de578351835292840192918401916001016153c2565b50909695505050505050565b60208101610868828461519b565b90815260200190565b918252602082015260400190565b6000602082526135d960208301846151ac565b60006080825261543560808301876151ac565b6001600160a01b03958616602084015293909416604082015260ff9190911660609091015292915050565b6020808252600f908201526e26b0b935b2ba1d3737ba1037b832b760891b604082015260600190565b60208082526016908201527526b0b935b2ba1d1026bab9ba103132903937baba32b960511b604082015260600190565b6020808252601f908201527f4d61726b65743a20706f736974696f6e20646f6573206e6f7420657869737400604082015260600190565b60208082526017908201527f4d61726b65743a20696e76616c69642061646472657373000000000000000000604082015260600190565b6020808252601f908201527f4d61726b65743a706f736974696f6e20646972656374696f6e206572726f7200604082015260600190565b6020808252601a908201527f4d61726b65743a204d75737420626520636f6e74726f6c6c6572000000000000604082015260600190565b60208082526017908201527f4d61726b65743a53657420707269636520706175736564000000000000000000604082015260600190565b6020808252601b908201527f4d61726b65743a20557064617465206d617267696e2070617573650000000000604082015260600190565b60208082526014908201527326b0b935b2ba1d1037b7363c9036b0b730b3b2b960611b604082015260600190565b60208082526028908201527f4d61726b65743a204d757374206265206d616e61676572206f722076616c6964604082015267206164647265737360c01b606082015260800190565b6020808252601c908201527f4d61726b65743a706f736974696f6e20616d6f756e74206572726f7200000000604082015260600190565b60208082526012908201527113585c9ad95d0e93dc195b881c185d5cd95960721b604082015260600190565b600061024082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015161573760e08401826151a5565b506101008381015190830152610120808401519083015261014080840151908301526101608084015161576c8285018261517d565b505061018083810151908301526101a080840151908301526101c08084015161579782850182615170565b50506101e08381015190830152610200808401516157b782850182615170565b505061022092830151919092015290565b60006101a0820190506157dc828451615170565b6020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015161582060c08401826152e9565b5060e083015161583360e08401826151a5565b5061010080840151615847828501826151a5565b5050610120838101519083015261014080840151615867828501826152f1565b50506101608084015161587c8285018261517d565b5050610180808401516158918285018261517d565b505092915050565b60006102c0820190506158ad8284516151f7565b60208301516158c0610260840182615191565b5060408301516102808301526060909201516102a09091015290565b600061026082019050825182526020830151602083015260408301516040830152606083015160608301526080830151615919608084018261517d565b5060a083015161592c60a084018261517d565b5060c083015161593f60c084018261517d565b5060e083015161595260e084018261517d565b50610100838101519083015261012080840151908301526101408084015190830152610160808401519083015261018080840151908301526101a080840151908301526101c080840151908301526101e080840151908301526102008084015190830152610220808401519083015261024092830151929091019190915290565b815481526001820154602082015260028201546040820152600382015460608201526004820154610260820190615a106080840160ff831661517d565b615a2360a0840160ff8360081c1661517d565b615a3660c0840160ff8360101c1661517d565b615a4960e0840160ff8360181c1661517d565b5060058301546101008301526006830154610120830152600783015461014083015260088301546101608301526009830154610180830152600a8301546101a0830152600b8301546101c0830152600c8301546101e0830152600d830154610200830152600e830154610220830152600f909201546102409091015290565b600061018082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a0830151615b0f60a08401826151a5565b5060c083015160c083015260e0830151615b2c60e0840182615170565b50610100838101519083015261012080840151615b4b82850182615170565b5050610140838101519083015261016092830151929091019190915290565b81518152602080830151610440830191615b8690840182615170565b506040830151615b996040840182615170565b506060830151615bac60608401826151a5565b506080830151615bbf60808401826152e9565b5060a0830151615bd260a08401826151a5565b5060c0838101519083015260e08084015190830152610100808401519083015261012080840151908301526101408084015190830152610160808401519083015261018080840151615c2682850182615191565b50506101a083810151908301526101c080840151908301526101e08084015190830152610200808401519083015261022080840151908301526102408084015190830152610260808401519083015261028080840151908301526102a080840151908301526102c080840151908301526102e08084015190830152610300808401519083015261032080840151908301526103408084015190830152610360808401519083015261038080840151908301526103a080840151908301526103c080840151908301526103e080840151615d0182850182615183565b505061040080840151615d168285018261519b565b5050610420808401516158918285018261517d565b610260810161086882846151f7565b97885260208801969096526001600160a01b03948516604088015292841660608701529216608085015260a084019190915260c083015260e08201526101000190565b93845260208401929092526040830152606082015260800190565b968752602087019590955260408601939093526060850191909152608084015260a083015260c082015260e00190565b60ff91909116815260200190565b60ff9490941684526001600160a01b03928316602085015291166040830152606082015260800190565b60405181810167ffffffffffffffff81118282101715615e1c57fe5b604052919050565b6001600160a01b0381168114615e3957600080fd5b50565b8015158114615e3957600080fd5b60088110615e3957600080fd5b60028110615e3957600080fd5b8060000b8114615e3957600080fd5b61ffff81168114615e3957600080fdfe5265656e7472616e637947756172643a207265656e7472616e742063616c6c0053616665436173743a2076616c756520646f65736e27742066697420696e203820626974735369676e6564536166654d6174683a206164646974696f6e206f766572666c6f775369676e6564536166654d6174683a206469766973696f6e206f766572666c6f77536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775369676e6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7753616665436173743a2076616c756520646f65736e27742066697420696e20616e20696e743235365369676e6564536166654d6174683a207375627472616374696f6e206f766572666c6f77a2646970667358221220e3f857782c4693a96641d61ebe581c4a07b3416882fa488ea8b564af20ebbb0a64736f6c63430007060033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.