Latest 25 from a total of 6,536 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw Fees | 55883990 | 649 days ago | IN | 0 POL | 0.0214725 | ||||
| Cancel Increase ... | 55479893 | 659 days ago | IN | 0 POL | 0.02098817 | ||||
| Update Increase ... | 55479170 | 659 days ago | IN | 0 POL | 0.00964087 | ||||
| Create Increase ... | 55478617 | 659 days ago | IN | 403.05 POL | 0.10493658 | ||||
| Cancel Decrease ... | 54605339 | 683 days ago | IN | 0 POL | 0.01172915 | ||||
| Create Decrease ... | 54604369 | 683 days ago | IN | 1.55 POL | 0.03954847 | ||||
| Cancel Decrease ... | 54603377 | 683 days ago | IN | 0 POL | 0.01120744 | ||||
| Create Decrease ... | 54602959 | 683 days ago | IN | 1.55 POL | 0.03888624 | ||||
| Cancel Decrease ... | 54602909 | 683 days ago | IN | 0 POL | 0.01263263 | ||||
| Update Decrease ... | 54602519 | 683 days ago | IN | 0 POL | 0.00772429 | ||||
| Cancel Increase ... | 54602499 | 683 days ago | IN | 0 POL | 0.01351226 | ||||
| Create Decrease ... | 54601489 | 683 days ago | IN | 1.55 POL | 0.03843612 | ||||
| Update Increase ... | 54584452 | 683 days ago | IN | 0 POL | 0.00446419 | ||||
| Update Increase ... | 54575917 | 683 days ago | IN | 0 POL | 0.01357481 | ||||
| Cancel Decrease ... | 54575910 | 683 days ago | IN | 0 POL | 0.02567728 | ||||
| Create Decrease ... | 54574549 | 683 days ago | IN | 1.55 POL | 0.05008694 | ||||
| Create Increase ... | 54573495 | 683 days ago | IN | 201.5 POL | 0.06787738 | ||||
| Update Increase ... | 54573321 | 683 days ago | IN | 0 POL | 0.01331967 | ||||
| Create Increase ... | 54562975 | 684 days ago | IN | 86.5 POL | 0.11345378 | ||||
| Cancel Decrease ... | 54562430 | 684 days ago | IN | 0 POL | 0.02006189 | ||||
| Create Decrease ... | 54559144 | 684 days ago | IN | 1.55 POL | 0.03817397 | ||||
| Cancel Decrease ... | 54559122 | 684 days ago | IN | 0 POL | 0.01307275 | ||||
| Create Decrease ... | 54559053 | 684 days ago | IN | 1.55 POL | 0.04484429 | ||||
| Create Decrease ... | 54544976 | 684 days ago | IN | 1.55 POL | 0.0281198 | ||||
| Cancel Decrease ... | 54544871 | 684 days ago | IN | 0 POL | 0.00927319 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 55479893 | 659 days ago | 403.05 POL | ||||
| 55479893 | 659 days ago | 403.05 POL | ||||
| 55478617 | 659 days ago | 403.05 POL | ||||
| 54741776 | 679 days ago | 0.55 POL | ||||
| 54741776 | 679 days ago | 0.55 POL | ||||
| 54681898 | 681 days ago | 1.55 POL | ||||
| 54681898 | 681 days ago | 1.55 POL | ||||
| 54681898 | 681 days ago | 492.19881332 POL | ||||
| 54681898 | 681 days ago | 492.19881332 POL | ||||
| 54605339 | 683 days ago | 1.55 POL | ||||
| 54605339 | 683 days ago | 1.55 POL | ||||
| 54604369 | 683 days ago | 1.55 POL | ||||
| 54603377 | 683 days ago | 1.55 POL | ||||
| 54603377 | 683 days ago | 1.55 POL | ||||
| 54602959 | 683 days ago | 1.55 POL | ||||
| 54602909 | 683 days ago | 1.55 POL | ||||
| 54602909 | 683 days ago | 1.55 POL | ||||
| 54602499 | 683 days ago | 201.5 POL | ||||
| 54602499 | 683 days ago | 201.5 POL | ||||
| 54601489 | 683 days ago | 1.55 POL | ||||
| 54586099 | 683 days ago | 1 POL | ||||
| 54586099 | 683 days ago | 1 POL | ||||
| 54586099 | 683 days ago | 1.55 POL | ||||
| 54586099 | 683 days ago | 1.55 POL | ||||
| 54575910 | 683 days ago | 1.55 POL |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
OrderBook
Compiler Version
v0.6.12+commit.27d51765
Optimization Enabled:
Yes with 1 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;
import "../libraries/math/SafeMath.sol";
import "../libraries/token/IERC20.sol";
import "../tokens/interfaces/IWETH.sol";
import "../libraries/token/SafeERC20.sol";
import "../libraries/utils/Address.sol";
import "../libraries/utils/ReentrancyGuard.sol";
import "./interfaces/IPositionUtils.sol";
import "./interfaces/IRouter.sol";
import "./interfaces/IVault.sol";
import "./interfaces/IOrderBook.sol";
contract OrderBook is ReentrancyGuard, IOrderBook {
using SafeMath for uint256;
using SafeERC20 for IERC20;
using Address for address payable;
uint256 public constant PRICE_PRECISION = 1e30;
uint256 public constant USDM_PRECISION = 1e18;
uint256 public constant BASIS_POINTS_DIVISOR = 10000;
uint256 public constant override MAX_TRAILING_STOP_PERCENTAGE = 2000;
struct SLTPOrder {
uint256 trailingStopPercentage;
uint256 slPrice;
uint256 tpPrice;
address receiveToken;
bool withdrawETH;
}
struct IncreaseOrder {
address account;
address purchaseToken;
uint256 purchaseTokenAmount;
address collateralToken;
address indexToken;
uint256 sizeDelta;
bool isLong;
uint256 triggerPrice;
bool triggerAboveThreshold;
uint256 executionFee;
bytes orderProps;
}
struct DecreaseOrder {
address account;
address[] path;
uint256 collateralDelta;
address indexToken;
uint256 sizeDelta; // For orderType (1,2,3) whole position will be closed , size data will be read from position
bool isLong;
uint256 triggerPrice; // RefPrice for Trailing Stop
bool triggerAboveThreshold;
uint256 minOut;
bool withdrawETH;
uint256 executionFee;
uint256 orderType; // 0 - None,1 - Stop Loss,2 - Take Profit, 3 - Trailing Stop etc.
uint256 trailingStopPercentage;
uint256 trailingStopRefPriceTimestamp;
}
mapping(bytes32 => bool) public trailingStopPositions;
mapping(address => mapping(uint256 => IncreaseOrder)) public increaseOrders;
mapping(address => uint256) public increaseOrdersIndex;
mapping(address => mapping(uint256 => DecreaseOrder)) public decreaseOrders;
mapping(address => uint256) public decreaseOrdersIndex;
mapping(address => bool) public isOrderKeeper;
address public gov;
address public weth;
address public usdm;
address public router;
address public vault;
address public orderExecutor;
address public positionRouter;
IPositionUtils public positionUtils;
uint256 public override minExecutionFee;
uint256 public override minTrailingStopExecutionFee; // For execution
uint256 public override minSLTPExecutionFee; // For execution
uint256 public trailingStopFee; // For maintenance, percentage 200 => %2;
uint256 public minPurchaseTokenAmountUsd;
bool public isInitialized = false;
mapping(uint256 => string) public errors;
mapping(address => uint256) public feeReserves;
constructor() public {
gov = msg.sender;
}
function withdrawFees(address _token, address _receiver) external {
_onlyGov();
uint256 amount = feeReserves[_token];
if (amount == 0) {
return;
}
feeReserves[_token] = 0;
IERC20(_token).safeTransfer(_receiver, amount);
//emit WithdrawFees(_token, _receiver, amount);
}
function _collectTrailingStopFees(
address _feeToken,
uint256 _amountOut,
uint256 _size
) internal returns (uint256) {
uint256 feeUsdToToken = positionUtils.usdToTokenMax(_feeToken,_size.mul(trailingStopFee).div(BASIS_POINTS_DIVISOR));
if (feeUsdToToken < _amountOut) {
uint256 afterFeeAmount = _amountOut.sub(feeUsdToToken);
feeReserves[_feeToken] = feeReserves[_feeToken].add(feeUsdToToken);
return afterFeeAmount;
}
return _amountOut;
}
function setErrors(string[] calldata _errors) external {
_onlyGov();
for (uint256 i = 0; i < _errors.length; i++) {
errors[i] = _errors[i];
}
}
function _validate(bool _condition, uint256 _errorCode) private view {
require(_condition, errors[_errorCode]);
}
function _onlyGov() private view {
_validate(msg.sender == gov, 0);
}
function _onlyOrderExecutor() private view {
_validate(msg.sender == orderExecutor, 0);
}
function _onlyPositionRouter() private view {
_validate(msg.sender == positionRouter, 0);
}
function _onlyOrderKeeper() private view {
_validate(isOrderKeeper[msg.sender], 0);
}
function setOrderKeeper(address _account, bool _isActive) external {
_onlyGov();
isOrderKeeper[_account] = _isActive;
}
function initialize(
address _router,
address _vault,
address _weth,
address _usdm,
uint256 _minExecutionFee,
uint256 _minSLTPExecutionFee,
uint256 _minTrailingStopExecutionFee,
uint256 _minPurchaseTokenAmountUsd
) external {
_onlyGov();
_validate(!isInitialized, 1);
isInitialized = true;
router = _router;
vault = _vault;
weth = _weth;
usdm = _usdm;
minExecutionFee = _minExecutionFee;
minSLTPExecutionFee = _minSLTPExecutionFee;
minTrailingStopExecutionFee = _minTrailingStopExecutionFee;
minPurchaseTokenAmountUsd = _minPurchaseTokenAmountUsd;
}
receive() external payable {
_validate(msg.sender == weth, 2);
}
function setPositionUtils(IPositionUtils _positionUtils) external {
_onlyGov();
positionUtils = _positionUtils;
}
function setOrderExecutor(
address _orderExecutor
)external {
_onlyGov();
orderExecutor = _orderExecutor;
}
function setPositionRouter(
address _positionRouter
)external {
_onlyGov();
positionRouter = _positionRouter;
}
function setMinExecutionFee(uint256 _minExecutionFee) external {
_onlyGov();
minExecutionFee = _minExecutionFee;
}
function setTrailingStopFee(uint256 _trailingStopFee) external {
_onlyGov();
trailingStopFee = _trailingStopFee;
}
function setMinTrailingStopExecutionFee(uint256 _minTrailingStopExecutionFee) external {
_onlyGov();
minTrailingStopExecutionFee = _minTrailingStopExecutionFee;
}
function setMinSLTPExecutionFee(uint256 _minSLTPExecutionFee) external {
_onlyGov();
minSLTPExecutionFee = _minSLTPExecutionFee;
}
function setMinPurchaseTokenAmountUsd(uint256 _minPurchaseTokenAmountUsd) external {
_onlyGov();
minPurchaseTokenAmountUsd = _minPurchaseTokenAmountUsd;
}
function setGov(address _gov) external {
_onlyGov();
gov = _gov;
}
function cancelMultiple(
uint256[] memory _increaseOrderIndexes,
uint256[] memory _decreaseOrderIndexes
) external {
for (uint256 i = 0; i < _increaseOrderIndexes.length; i++) {
cancelIncreaseOrder(_increaseOrderIndexes[i]);
}
for (uint256 i = 0; i < _decreaseOrderIndexes.length; i++) {
cancelDecreaseOrder(_decreaseOrderIndexes[i]);
}
}
function cancelEmptyDecreaseOrderMultiple(
address[] memory _account,
uint256[] memory _decreaseOrderIndexes
) external {
_onlyOrderKeeper();
_validate(_account.length == _decreaseOrderIndexes.length,18);
for (uint256 i = 0; i < _account.length; i++) {
cancelEmptyDecreaseOrder(_account[i],_decreaseOrderIndexes[i]);
}
}
function getDecreaseOrder(address _account, uint256 _orderIndex)
public override
view
returns (
address collateralToken,
address receiveToken,
uint256 collateralDelta,
address indexToken,
uint256 sizeDelta,
bool isLong,
uint256 triggerPrice,
bool triggerAboveThreshold,
uint256 executionFee,
uint256 orderType,
uint256 trailingStopPercentage
)
{
DecreaseOrder memory order = decreaseOrders[_account][_orderIndex];
return (
order.path.length > 0 ? order.path[0] : address(0),
order.path.length > 1 ? order.path[1] : address(0),
order.collateralDelta, order.indexToken, order.sizeDelta, order.isLong, order.triggerPrice, order.triggerAboveThreshold, order.executionFee,order.orderType,order.trailingStopPercentage);
}
function getIncreaseOrder(address _account, uint256 _orderIndex)
public
view
override
returns (
address purchaseToken,
uint256 purchaseTokenAmount,
address collateralToken,
address indexToken,
uint256 sizeDelta,
bool isLong,
uint256 triggerPrice,
bool triggerAboveThreshold,
uint256 executionFee
)
{
IncreaseOrder memory order = increaseOrders[_account][_orderIndex];
return (
order.purchaseToken,
order.purchaseTokenAmount,
order.collateralToken,
order.indexToken,
order.sizeDelta,
order.isLong,
order.triggerPrice,
order.triggerAboveThreshold,
order.executionFee
);
}
function getOrderProps(bytes memory _orderProps) private pure returns(uint256,uint256,uint256,address,bool){
return abi.decode(_orderProps, (uint256,uint256,uint256,address,bool));
}
function getOrderPropsStruct(bytes memory _orderProps) private pure returns(SLTPOrder memory){
(uint256 trailingStopPercentage,uint256 slPrice,uint256 tpPrice,address receiveToken,bool withdrawETH) = abi.decode(_orderProps, (uint256,uint256,uint256,address,bool));
SLTPOrder memory sltpOrder = SLTPOrder(
trailingStopPercentage,
slPrice,
tpPrice,
receiveToken,
withdrawETH
);
return sltpOrder;
}
function _validateIncreaseOrder(
uint256 _executionFee,
bytes memory _orderProps
) private view returns(uint256){
(uint256 trailingStopPercentage,uint256 slPrice,uint256 tpPrice,,) = getOrderProps(_orderProps);
require(trailingStopPercentage<MAX_TRAILING_STOP_PERCENTAGE,"PR:invalid tsp");
require(trailingStopPercentage == 0 || slPrice == 0 ,"PR:only one type sl");
uint256 orderTotalFee = minSLTPExecutionFee.mul((slPrice>0?1:0)+(tpPrice>0?1:0));
if(trailingStopPercentage>0){
orderTotalFee = orderTotalFee.add(minTrailingStopExecutionFee);
}
require(_executionFee >= minExecutionFee.add(orderTotalFee), "PR: invalid executionFee");
return orderTotalFee;
}
function createIncreaseOrder(
address _purchaseToken,
uint256 _amountIn,
address _indexToken,
// uint256 _minOut,
uint256 _sizeDelta,
address _collateralToken,
bool _isLong,
uint256 _triggerPrice,
bool _triggerAboveThreshold,
uint256 _executionFee,
bool _shouldWrap,
bytes memory _orderProps
) external payable nonReentrant {
// always need this call because of mandatory executionFee user has to transfer in ETH
_transferInETH();
_validateIncreaseOrder(_executionFee,_orderProps);
if (_shouldWrap) {
_validate(_purchaseToken == weth, 8);
_validate(msg.value == _executionFee.add(_amountIn), 9);
} else {
_validate(msg.value == _executionFee, 10);
IRouter(router).pluginTransfer(_purchaseToken, msg.sender, address(this), _amountIn);
}
{
uint256 _purchaseTokenAmountUsd = IVault(vault).tokenToUsdMin(_purchaseToken, _amountIn);
_validate(_purchaseTokenAmountUsd >= minPurchaseTokenAmountUsd, 13);
}
_createIncreaseOrder(
msg.sender,
_purchaseToken,
_amountIn,
_collateralToken,
_indexToken,
_sizeDelta,
_isLong,
_triggerPrice,
_triggerAboveThreshold,
_executionFee,
_orderProps
);
}
function _createIncreaseOrder(
address _account,
address _purchaseToken,
uint256 _purchaseTokenAmount,
address _collateralToken,
address _indexToken,
uint256 _sizeDelta,
bool _isLong,
uint256 _triggerPrice,
bool _triggerAboveThreshold,
uint256 _executionFee,
bytes memory _orderProps
) private {
uint256 _orderIndex = increaseOrdersIndex[_account];
IncreaseOrder memory order = IncreaseOrder(
_account,
_purchaseToken,
_purchaseTokenAmount,
_collateralToken,
_indexToken,
_sizeDelta,
_isLong,
_triggerPrice,
_triggerAboveThreshold,
_executionFee,
_orderProps
);
increaseOrdersIndex[_account] = _orderIndex.add(1);
increaseOrders[_account][_orderIndex] = order;
positionUtils.emitCreateIncreaseOrder(_account,
_orderIndex,
_purchaseToken,
_purchaseTokenAmount,
_collateralToken,
_indexToken,
_sizeDelta,
_isLong,
_triggerPrice,
_triggerAboveThreshold,
_executionFee,
_orderProps);
}
function updateIncreaseOrder(
uint256 _orderIndex,
uint256 _sizeDelta,
uint256 _triggerPrice,
bool _triggerAboveThreshold
) external nonReentrant {
IncreaseOrder storage order = increaseOrders[msg.sender][_orderIndex];
_validate(order.account != address(0), 11);
order.triggerPrice = _triggerPrice;
order.triggerAboveThreshold = _triggerAboveThreshold;
order.sizeDelta = _sizeDelta;
positionUtils.emitUpdateIncreaseOrder(msg.sender, _orderIndex, order.collateralToken, order.indexToken, order.isLong, _sizeDelta, _triggerPrice, _triggerAboveThreshold);
}
function cancelIncreaseOrder(uint256 _orderIndex) public nonReentrant {
IncreaseOrder memory order = increaseOrders[msg.sender][_orderIndex];
_validate(order.account != address(0), 11);
delete increaseOrders[msg.sender][_orderIndex];
if (order.purchaseToken == weth) {
_transferOutETH(order.executionFee.add(order.purchaseTokenAmount), msg.sender);
} else {
IERC20(order.purchaseToken).safeTransfer(msg.sender, order.purchaseTokenAmount);
_transferOutETH(order.executionFee, msg.sender);
}
positionUtils.emitCancelIncreaseOrder(
order.account,
_orderIndex,
order.purchaseToken,
order.purchaseTokenAmount,
order.collateralToken,
order.indexToken,
order.sizeDelta,
order.isLong,
order.triggerPrice,
order.triggerAboveThreshold,
order.executionFee
);
}
function _processOrder(IncreaseOrder memory _order) private returns (uint256 ) {
uint256 executionFee = _order.executionFee;
(uint256 trailingStopPercentage,uint256 slPrice,uint256 tpPrice,address receiveToken,) = getOrderProps(_order.orderProps);
if (trailingStopPercentage>0 || slPrice>0 || tpPrice>0){ //TP and SL Order only for First Increase
address[] memory path;
if(receiveToken != _order.collateralToken ){
path = new address[](2);
path[0] = _order.collateralToken;
path[1] = receiveToken;
}else{
path = new address[](1);
path[0] = _order.collateralToken;
}
_createDecreaseOrderSLTP(_order.account, path , _order.indexToken, _order.isLong,_order.orderProps,_order.sizeDelta,executionFee.sub(minExecutionFee));
executionFee = minExecutionFee;
}
return executionFee;
}
function executeIncreaseOrder(
address _address,
uint256 _orderIndex,
address payable _feeReceiver
) external override nonReentrant {
_onlyOrderExecutor();
IncreaseOrder memory order = increaseOrders[_address][_orderIndex];
_validate(order.account != address(0), 11);
// increase long should use max price
// increase short should use min price
(uint256 currentPrice, ) = positionUtils.validateOrderPrice(order.triggerAboveThreshold, order.triggerPrice, order.indexToken, order.isLong, true,0,0);
delete increaseOrders[_address][_orderIndex];
IERC20(order.purchaseToken).safeTransfer(vault, order.purchaseTokenAmount);
if (order.purchaseToken != order.collateralToken) {
address[] memory path = new address[](2);
path[0] = order.purchaseToken;
path[1] = order.collateralToken;
uint256 amountOut = _swap(path, 0, address(this));
IERC20(order.collateralToken).safeTransfer(vault, amountOut);
}
IRouter(router).pluginIncreasePosition(order.account, order.collateralToken, order.indexToken, order.sizeDelta, order.isLong);
uint256 executionFee = _processOrder(order);
_transferOutETH(executionFee, _feeReceiver);
positionUtils.emitExecuteIncreaseOrder(
order.account,
_orderIndex,
order.purchaseToken,
order.purchaseTokenAmount,
order.collateralToken,
order.indexToken,
order.sizeDelta,
order.isLong,
order.triggerPrice,
order.triggerAboveThreshold,
order.executionFee,
currentPrice
);
}
function createDecreaseOrder(
address _indexToken,
uint256 _sizeDelta,
address[] memory _path,
uint256 _collateralDelta,
bool _isLong,
uint256 _triggerPrice,
bool _triggerAboveThreshold,
uint256 _minOut,
bool _withdrawETH,
uint256 trailingStopPercentage
) external payable nonReentrant {
_transferInETH();
_validate(_path.length == 1 || _path.length == 2, 3);
if(trailingStopPercentage>0){
_validate(msg.value >= minTrailingStopExecutionFee, 7);
_validate(trailingStopPercentage<MAX_TRAILING_STOP_PERCENTAGE,17);
}else{
_validate(msg.value > minExecutionFee, 7);
}
if (_withdrawETH) {
_validate(_path[_path.length - 1] == weth, 4);
}
uint256 positionSize;
if(trailingStopPercentage>0){
bytes32 key = _getPositionKey(msg.sender, _path[0], _indexToken,_isLong);
_validate(!trailingStopPositions[key],19);
(positionSize,
,
,
,
,
,
,
) = IVault(vault).getPosition(msg.sender, _path[0], _indexToken,_isLong);
_validate(positionSize>0,20);
}
DecreaseOrder memory order = DecreaseOrder(
msg.sender,
_path,
trailingStopPercentage>0 ? 0 :_collateralDelta,
_indexToken,
trailingStopPercentage>0 ? positionSize : _sizeDelta,
_isLong,
trailingStopPercentage>0 ? (_isLong ? IVault(vault).getMinPrice(_indexToken) : IVault(vault).getMaxPrice(_indexToken)) : _triggerPrice,
trailingStopPercentage>0 ? false : _triggerAboveThreshold,
trailingStopPercentage>0 ? 0 : _minOut,
_withdrawETH,
msg.value,
trailingStopPercentage>0 ? 3 : 0,
trailingStopPercentage,
trailingStopPercentage>0 ? block.timestamp : 0
);
_createDecreaseOrder(order);
}
function createDecreaseOrderSLTP(
address _account,
address[] memory _path,
address _indexToken,
bool _isLong,
bytes memory _orderProps,
uint256 _sizeDelta
) external payable override nonReentrant {
_onlyPositionRouter();
_transferInETH();
_createDecreaseOrderSLTP(_account,_path,_indexToken,_isLong,_orderProps,_sizeDelta,msg.value);
}
function _createDecreaseOrderSLTP(
address _account,
address[] memory _path,
address _indexToken,
bool _isLong,
bytes memory _orderProps,
uint256 _sizeDelta,
uint256 _executionFee
) private {
uint256 executionFee = _executionFee;
(uint256 positionSize,
,
uint256 entryPrice,
,
,
,
,
) = IVault(vault).getPosition(_account, _path[0], _indexToken,_isLong);
if(positionSize == _sizeDelta){
SLTPOrder memory sltpOrder = getOrderPropsStruct(_orderProps);
if(sltpOrder.tpPrice>0 && ((_isLong && sltpOrder.tpPrice>entryPrice) || (!_isLong && sltpOrder.tpPrice<entryPrice))){
uint256 fee = executionFee<minSLTPExecutionFee.mul(2)?executionFee:minSLTPExecutionFee;
DecreaseOrder memory order = DecreaseOrder(
_account,
_path,
0,
_indexToken,
positionSize,
_isLong,
sltpOrder.tpPrice,
sltpOrder.tpPrice>entryPrice,
0,
sltpOrder.withdrawETH,
fee,
2,
0,
0
);
_createDecreaseOrder(order);
executionFee = executionFee.sub(fee);
}
if(sltpOrder.trailingStopPercentage>0 || (sltpOrder.slPrice>0 && ((_isLong && sltpOrder.slPrice<entryPrice) || (!_isLong && sltpOrder.slPrice>entryPrice)) )){
uint256 fee = executionFee < _executionFee ? executionFee : sltpOrder.slPrice > 0 ? minSLTPExecutionFee : minTrailingStopExecutionFee;
DecreaseOrder memory order = DecreaseOrder(
_account,
_path,
0,
_indexToken,
positionSize,
_isLong,
sltpOrder.slPrice>0 ? sltpOrder.slPrice : entryPrice,
sltpOrder.slPrice>0 ? sltpOrder.slPrice>entryPrice : false, // for trailing stop not needed
0,
sltpOrder.withdrawETH,
fee,
sltpOrder.slPrice>0 ? 1 : 3,
sltpOrder.slPrice>0 ? 0 : sltpOrder.trailingStopPercentage,
sltpOrder.slPrice>0 ? 0 : block.timestamp
);
_createDecreaseOrder(order);
executionFee = executionFee.sub(fee);
}
}
if(executionFee>=minSLTPExecutionFee){
_transferOutETHWithGasLimit(executionFee, payable(_account));
}
}
function _getPositionKey(
address _account,
address _collateralToken,
address _indexToken,
bool _isLong
) private pure returns (bytes32) {
return keccak256(abi.encodePacked(_account, _collateralToken, _indexToken, _isLong));
}
function _createDecreaseOrder(
DecreaseOrder memory _order
) private {
uint256 orderIndex = decreaseOrdersIndex[_order.account];
decreaseOrdersIndex[_order.account] = orderIndex.add(1);
decreaseOrders[_order.account][orderIndex] = _order;
if(_order.orderType == 3){
bytes32 key = _getPositionKey(_order.account, _order.path[0],_order.indexToken, _order.isLong);
trailingStopPositions[key] = true;
}
positionUtils.emitCreateDecreaseOrder(
_order.account,
orderIndex,
_order.path[0],
_order.path[_order.path.length-1],
_order.collateralDelta,
_order.indexToken,
_order.sizeDelta,
_order.isLong,
_order.triggerPrice,
_order.triggerAboveThreshold,
_order.executionFee,
_order.orderType,
_order.trailingStopPercentage
);
}
function executeDecreaseOrder(
address _address,
uint256 _orderIndex,
address payable _feeReceiver,
uint256 _trailingStopRefPrice,
uint256 _trailingStopRefPriceTimestamp
) external override nonReentrant {
_onlyOrderExecutor();
DecreaseOrder memory order = decreaseOrders[_address][_orderIndex];
_validate(order.account != address(0), 11);
// decrease long should use min price
// decrease short should use max price
(uint256 currentPrice, ) = positionUtils.validateOrderPrice(order.triggerAboveThreshold, order.triggerPrice, order.indexToken, !order.isLong, true ,order.trailingStopPercentage,_trailingStopRefPrice);
uint256 positionSize = order.sizeDelta;
uint256 positionCollateral = order.collateralDelta;
delete decreaseOrders[_address][_orderIndex];
if(order.orderType == 3){
bytes32 key = _getPositionKey(order.account, order.path[0],order.indexToken, order.isLong);
trailingStopPositions[key] = false;
}
{
if(order.orderType>0){
(positionSize,
,
,
,
,
,
,
) = IVault(vault).getPosition(order.account, order.path[0],order.indexToken,order.isLong);
positionCollateral = 0;
}
uint256 amountOut = IRouter(router).pluginDecreasePosition(
order.account,
order.path[0],
order.indexToken,
positionCollateral,
positionSize,
order.isLong,
address(this)
);
if(order.orderType == 3 && amountOut>0){
amountOut = _collectTrailingStopFees(order.path[0],amountOut, positionSize);
}
bool isSwapExecuted;
if (order.path.length > 1) {
uint256 maxIn =positionUtils.getMaxAmountIn(order.path[0], order.path[1]);
if(amountOut<=maxIn){
IERC20(order.path[0]).safeTransfer(vault, amountOut);
amountOut = _swap(order.path, order.minOut, address(this));
isSwapExecuted = true;
}
}
if (order.withdrawETH) {
_transferOutETHWithGasLimit(amountOut, payable(order.account));
} else {
if (order.path.length > 1 && isSwapExecuted) {
IERC20(order.path[order.path.length - 1]).safeTransfer(order.account, amountOut);
}else{
IERC20(order.path[0]).safeTransfer(order.account, amountOut);
}
}
_transferOutETH(order.executionFee, _feeReceiver);
}
positionUtils.emitExecuteDecreaseOrder(
order.account,
_orderIndex,
order.path[0],
positionCollateral,
order.indexToken,
positionSize,
order.isLong,
order.triggerPrice,
order.triggerAboveThreshold,
order.executionFee,
currentPrice
);
if(order.orderType == 3){
positionUtils.emitExecuteTrailingStopOrder(
order.account,
_orderIndex,
order.trailingStopPercentage,
_trailingStopRefPrice,
_trailingStopRefPriceTimestamp,
currentPrice
);
}
}
function cancelDecreaseOrder(uint256 _orderIndex) public nonReentrant {
DecreaseOrder memory order = decreaseOrders[msg.sender][_orderIndex];
_validate(order.account != address(0), 11);
delete decreaseOrders[msg.sender][_orderIndex];
if(order.orderType == 3){
bytes32 key = _getPositionKey(order.account, order.path[0],order.indexToken, order.isLong);
trailingStopPositions[key] = false;
}
_transferOutETH(order.executionFee, msg.sender);
positionUtils.emitCancelDecreaseOrder(
order.account,
_orderIndex,
order.path[0],
order.collateralDelta,
order.indexToken,
order.sizeDelta,
order.isLong,
order.triggerPrice,
order.triggerAboveThreshold,
order.executionFee
);
}
function cancelEmptyDecreaseOrder(address _account,uint256 _orderIndex) public nonReentrant {
_onlyOrderKeeper();
DecreaseOrder memory order = decreaseOrders[_account][_orderIndex];
_validate(order.account != address(0), 11);
(uint256 positionSize,
,
,
,
,
,
,
) = IVault(vault).getPosition(order.account, order.path[0],order.indexToken,order.isLong);
if(positionSize == 0){
delete decreaseOrders[order.account][_orderIndex];
if(order.orderType == 3){
bytes32 key = _getPositionKey(order.account, order.path[0],order.indexToken, order.isLong);
trailingStopPositions[key] = false;
}
_transferOutETH(order.executionFee, payable(order.account));
positionUtils.emitCancelDecreaseOrder(
order.account,
_orderIndex,
order.path[0],
order.collateralDelta,
order.indexToken,
order.sizeDelta,
order.isLong,
order.triggerPrice,
order.triggerAboveThreshold,
order.executionFee
);
}
}
function updateTrailingRefPrice(
address _account,
uint256 _orderIndex,
uint256 _refPrice,
uint256 _refPriceTimestamp
) external nonReentrant {
_onlyOrderKeeper();
DecreaseOrder storage order = decreaseOrders[_account][_orderIndex];
_validate(order.account != address(0), 1);
if(order.orderType == 3){
order.triggerPrice = _refPrice;
order.trailingStopRefPriceTimestamp = _refPriceTimestamp;
}
}
function updateDecreaseOrder(
uint256 _orderIndex,
uint256 _collateralDelta,
uint256 _sizeDelta,
uint256 _triggerPrice,
bool _triggerAboveThreshold,
uint256 _trailingStopPercentage
) external nonReentrant {
DecreaseOrder storage order = decreaseOrders[msg.sender][_orderIndex];
_validate(order.account != address(0), 11);
if(order.trailingStopPercentage>0){
_validate(_trailingStopPercentage>0 && _trailingStopPercentage<MAX_TRAILING_STOP_PERCENTAGE, 17);
order.trailingStopPercentage = _trailingStopPercentage;
}else{
order.triggerPrice = _triggerPrice;
order.triggerAboveThreshold = _triggerAboveThreshold;
order.sizeDelta = _sizeDelta;
order.collateralDelta = _collateralDelta;
}
positionUtils.emitUpdateDecreaseOrder(
msg.sender,
_orderIndex,
order.path[0],
_collateralDelta,
order.indexToken,
_sizeDelta,
order.isLong,
_triggerPrice,
_triggerAboveThreshold,
_trailingStopPercentage
);
}
function _transferInETH() private {
if (msg.value != 0) {
IWETH(weth).deposit{value: msg.value}();
}
}
function _transferOutETH(uint256 _amountOut, address payable _receiver) private {
IWETH(weth).withdraw(_amountOut);
_receiver.sendValue(_amountOut);
}
function _transferOutETHWithGasLimit(uint256 _amountOut, address payable _receiver) internal {
IWETH(weth).withdraw(_amountOut);
_receiver.transfer(_amountOut);
}
function _swap(
address[] memory _path,
uint256 _minOut,
address _receiver
) private returns (uint256) {
_validate(_path.length == 2 , 3);
if (_path.length == 2) {
return _vaultSwap(_path[0], _path[1], _minOut, _receiver);
}
// if (_path.length == 3) {
// uint256 midOut = _vaultSwap(_path[0], _path[1], 0, address(this));
// IERC20(_path[1]).safeTransfer(vault, midOut);
// return _vaultSwap(_path[1], _path[2], _minOut, _receiver);
// }
}
function _vaultSwap(
address _tokenIn,
address _tokenOut,
uint256 _minOut,
address _receiver
) private returns (uint256) {
uint256 amountOut;
amountOut = IVault(vault).swap(_tokenIn, _tokenOut, _receiver);
_validate(amountOut >= _minOut, 16);
return amountOut;
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library 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.
*/
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.
*/
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
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.
*/
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) 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: MIT
pragma solidity 0.6.12;
interface IWETH {
function deposit() external payable;
function transfer(address to, uint value) external returns (bool);
function withdraw(uint) external;
}// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
import "./IERC20.sol";
import "../math/SafeMath.sol";
import "../utils/Address.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.6.12;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{value: value}(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.3._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.3._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) private pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
/**
* @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() internal {
_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: MIT
pragma solidity 0.6.12;
interface IPositionUtils {
function shouldDeductFee(
address _account,
address[] memory _path,
uint256 _amountIn,
address _indexToken,
bool _isLong,
uint256 _sizeDelta,
uint256 _increasePositionBufferBps
) external view returns (bool);
function validatePositionPrice(
bool _isIncrease,
bool _isLong,
address _indexToken,
uint256 _price,
uint256 _sizeDelta,
uint256 maxGlobalLongSize,
uint256 maxGlobalShortSize
) external returns(uint256) ;
function validateOrderPrice(
bool _triggerAboveThreshold,
uint256 _triggerPrice,
address _indexToken,
bool _maximizePrice,
bool _raise,
uint256 trailingStopPercentage,
uint256 refPrice
) external view returns (uint256, bool);
function emitCreateIncreaseOrder(
address account,
uint256 orderIndex,
address purchaseToken,
uint256 purchaseTokenAmount,
address collateralToken,
address indexToken,
uint256 sizeDelta,
bool isLong,
uint256 triggerPrice,
bool triggerAboveThreshold,
uint256 executionFee,
bytes memory orderProps
) external;
function emitCancelIncreaseOrder(
address account,
uint256 orderIndex,
address purchaseToken,
uint256 purchaseTokenAmount,
address collateralToken,
address indexToken,
uint256 sizeDelta,
bool isLong,
uint256 triggerPrice,
bool triggerAboveThreshold,
uint256 executionFee
) external;
function emitExecuteIncreaseOrder(
address account,
uint256 orderIndex,
address purchaseToken,
uint256 purchaseTokenAmount,
address collateralToken,
address indexToken,
uint256 sizeDelta,
bool isLong,
uint256 triggerPrice,
bool triggerAboveThreshold,
uint256 executionFee,
uint256 executionPrice
) external;
function emitUpdateIncreaseOrder(
address account,
uint256 orderIndex,
address collateralToken,
address indexToken,
bool isLong,
uint256 sizeDelta,
uint256 triggerPrice,
bool triggerAboveThreshold
) external;
function emitCreateDecreaseOrder(
address account,
uint256 orderIndex,
address collateralToken,
address receiveToken,
uint256 collateralDelta,
address indexToken,
uint256 sizeDelta,
bool isLong,
uint256 triggerPrice,
bool triggerAboveThreshold,
uint256 executionFee,
uint256 orderType,
uint256 trailingStopPercentage
) external;
function emitCancelDecreaseOrder(
address account,
uint256 orderIndex,
address collateralToken,
uint256 collateralDelta,
address indexToken,
uint256 sizeDelta,
bool isLong,
uint256 triggerPrice,
bool triggerAboveThreshold,
uint256 executionFee
) external;
function emitExecuteDecreaseOrder(
address account,
uint256 orderIndex,
address collateralToken,
uint256 collateralDelta,
address indexToken,
uint256 sizeDelta,
bool isLong,
uint256 triggerPrice,
bool triggerAboveThreshold,
uint256 executionFee,
uint256 executionPrice
) external;
function emitExecuteTrailingStopOrder(
address account,
uint256 orderIndex,
uint256 trailingStopPercentage,
uint256 trailingStopRefPrice,
uint256 trailingStopRefPriceTimestamp,
uint256 executionPrice
) external;
function emitUpdateDecreaseOrder(
address account,
uint256 orderIndex,
address collateralToken,
uint256 collateralDelta,
address indexToken,
uint256 sizeDelta,
bool isLong,
uint256 triggerPrice,
bool triggerAboveThreshold,
uint256 trailingStopPercentage
) external;
function emitCreateSwapOrder(
address account,
uint256 orderIndex,
address[] memory path,
uint256 amountIn,
uint256 minOut,
uint256 triggerRatio,
bool triggerAboveThreshold,
bool shouldUnwrap,
uint256 executionFee
) external;
function emitCancelSwapOrder(
address account,
uint256 orderIndex,
address[] memory path,
uint256 amountIn,
uint256 minOut,
uint256 triggerRatio,
bool triggerAboveThreshold,
bool shouldUnwrap,
uint256 executionFee
) external;
function emitUpdateSwapOrder(
address account,
uint256 ordexIndex,
address[] memory path,
uint256 amountIn,
uint256 minOut,
uint256 triggerRatio,
bool triggerAboveThreshold,
bool shouldUnwrap,
uint256 executionFee
) external;
function emitExecuteSwapOrder(
address account,
uint256 orderIndex,
address[] memory path,
uint256 amountIn,
uint256 minOut,
uint256 amountOut,
uint256 triggerRatio,
bool triggerAboveThreshold,
bool shouldUnwrap,
uint256 executionFee
) external;
function validateSwapOrderPriceWithTriggerAboveThreshold(address[] memory _path, uint256 _triggerRatio) external view returns (bool);
function getMaxAmountIn(
address _tokenIn,
address _tokenOut
) external view returns (uint256);
function usdToTokenMax(address _token, uint256 _usdAmount) external view returns (uint256);
function usdToTokenMin(address _token, uint256 _usdAmount) external view returns (uint256);
function usdToToken(
address _token,
uint256 _usdAmount,
uint256 _price
) external view returns (uint256);
}// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface IRouter {
function addPlugin(address _plugin) external;
function pluginTransfer(
address _token,
address _account,
address _receiver,
uint256 _amount
) external;
function pluginIncreasePosition(
address _account,
address _collateralToken,
address _indexToken,
uint256 _sizeDelta,
bool _isLong
) external;
function pluginDecreasePosition(
address _account,
address _collateralToken,
address _indexToken,
uint256 _collateralDelta,
uint256 _sizeDelta,
bool _isLong,
address _receiver
) external returns (uint256);
function swap(
address[] memory _path,
uint256 _amountIn,
uint256 _minOut,
address _receiver
) external;
}// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
import "./IVaultUtils.sol";
interface IVault {
function isInitialized() external view returns (bool);
function isSwapEnabled() external view returns (bool);
function isLeverageEnabled() external view returns (bool);
function setVaultUtils(IVaultUtils _vaultUtils) external;
function setError(uint256 _errorCode, string calldata _error) external;
function router() external view returns (address);
function usdm() external view returns (address);
function gov() external view returns (address);
function whitelistedTokenCount() external view returns (uint256);
function maxLeverage() external view returns (uint256);
function minProfitTime() external view returns (uint256);
function hasDynamicFees() external view returns (bool);
function fundingInterval() external view returns (uint256);
function totalTokenWeights() external view returns (uint256);
function getTargetUsdmAmount(address _token) external view returns (uint256);
function inManagerMode() external view returns (bool);
function inPrivateLiquidationMode() external view returns (bool);
function maxGasPrice() external view returns (uint256);
function approvedRouters(address _account, address _router) external view returns (bool);
function isLiquidator(address _account) external view returns (bool);
function isManager(address _account) external view returns (bool);
function minProfitBasisPoints(address _token) external view returns (uint256);
function tokenBalances(address _token) external view returns (uint256);
function lastFundingTimes(address _token) external view returns (uint256);
function setMaxLeverage(uint256 _maxLeverage) external;
function setInManagerMode(bool _inManagerMode) external;
function setManager(address _manager, bool _isManager) external;
function setIsSwapEnabled(bool _isSwapEnabled) external;
function setIsLeverageEnabled(bool _isLeverageEnabled) external;
function setMaxGasPrice(uint256 _maxGasPrice) external;
function setUsdmAmount(address _token, uint256 _amount) external;
function setBufferAmount(address _token, uint256 _amount) external;
function setMaxGlobalShortSize(address _token, uint256 _amount) external;
function setInPrivateLiquidationMode(bool _inPrivateLiquidationMode) external;
function setLiquidator(address _liquidator, bool _isActive) external;
function setFundingRate(
uint256 _fundingInterval,
uint256 _fundingRateFactor,
uint256 _stableFundingRateFactor
) external;
function setFees(
uint256 _taxBasisPoints,
uint256 _stableTaxBasisPoints,
uint256 _mintBurnFeeBasisPoints,
uint256 _swapFeeBasisPoints,
uint256 _stableSwapFeeBasisPoints,
uint256 _marginFeeBasisPoints,
uint256 _liquidationFeeUsd,
uint256 _minProfitTime,
bool _hasDynamicFees
) external;
function setTokenConfig(
address _token,
uint256 _tokenDecimals,
uint256 _redemptionBps,
uint256 _minProfitBps,
uint256 _maxUsdmAmount,
bool _isStable,
bool _isShortable
) external;
function setPriceFeed(address _priceFeed) external;
function withdrawFees(address _token, address _receiver) external returns (uint256);
function directPoolDeposit(address _token) external;
function buyUSDM(address _token, address _receiver) external returns (uint256);
function sellUSDM(address _token, address _receiver) external returns (uint256);
function swap(
address _tokenIn,
address _tokenOut,
address _receiver
) external returns (uint256);
function increasePosition(
address _account,
address _collateralToken,
address _indexToken,
uint256 _sizeDelta,
bool _isLong
) external;
function decreasePosition(
address _account,
address _collateralToken,
address _indexToken,
uint256 _collateralDelta,
uint256 _sizeDelta,
bool _isLong,
address _receiver
) external returns (uint256);
function liquidatePosition(
address _account,
address _collateralToken,
address _indexToken,
bool _isLong,
address _feeReceiver
) external;
function tokenToUsdMin(address _token, uint256 _tokenAmount) external view returns (uint256);
function priceFeed() external view returns (address);
function fundingRateFactor() external view returns (uint256);
function stableFundingRateFactor() external view returns (uint256);
function cumulativeFundingRates(address _token) external view returns (uint256);
function getNextFundingRate(address _token) external view returns (uint256);
function getFeeBasisPoints(
address _token,
uint256 _usdmDelta,
uint256 _feeBasisPoints,
uint256 _taxBasisPoints,
bool _increment
) external view returns (uint256);
function liquidationFeeUsd() external view returns (uint256);
function taxBasisPoints() external view returns (uint256);
function stableTaxBasisPoints() external view returns (uint256);
function mintBurnFeeBasisPoints() external view returns (uint256);
function swapFeeBasisPoints() external view returns (uint256);
function stableSwapFeeBasisPoints() external view returns (uint256);
function marginFeeBasisPoints() external view returns (uint256);
function allWhitelistedTokensLength() external view returns (uint256);
function allWhitelistedTokens(uint256) external view returns (address);
function whitelistedTokens(address _token) external view returns (bool);
function stableTokens(address _token) external view returns (bool);
function shortableTokens(address _token) external view returns (bool);
function feeReserves(address _token) external view returns (uint256);
function globalShortSizes(address _token) external view returns (uint256);
function globalShortAveragePrices(address _token) external view returns (uint256);
function maxGlobalShortSizes(address _token) external view returns (uint256);
function tokenDecimals(address _token) external view returns (uint256);
function tokenWeights(address _token) external view returns (uint256);
function guaranteedUsd(address _token) external view returns (uint256);
function poolAmounts(address _token) external view returns (uint256);
function bufferAmounts(address _token) external view returns (uint256);
function reservedAmounts(address _token) external view returns (uint256);
function usdmAmounts(address _token) external view returns (uint256);
function maxUsdmAmounts(address _token) external view returns (uint256);
function getRedemptionAmount(address _token, uint256 _usdmAmount) external view returns (uint256);
function getMaxPrice(address _token) external view returns (uint256);
function getMinPrice(address _token) external view returns (uint256);
function getDelta(
address _indexToken,
uint256 _size,
uint256 _averagePrice,
bool _isLong,
uint256 _lastIncreasedTime
) external view returns (bool, uint256);
function getPosition(
address _account,
address _collateralToken,
address _indexToken,
bool _isLong
)
external
view
returns (
uint256,
uint256,
uint256,
uint256,
uint256,
uint256,
bool,
uint256
);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.12 <0.9.0;
interface IOrderBook {
// function getSwapOrder(address _account, uint256 _orderIndex)
// external
// view
// returns (
// address path0,
// address path1,
// address path2,
// uint256 amountIn,
// uint256 minOut,
// uint256 triggerRatio,
// bool triggerAboveThreshold,
// bool shouldUnwrap,
// uint256 executionFee
// );
function getIncreaseOrder(address _account, uint256 _orderIndex)
external
view
returns (
address purchaseToken,
uint256 purchaseTokenAmount,
address collateralToken,
address indexToken,
uint256 sizeDelta,
bool isLong,
uint256 triggerPrice,
bool triggerAboveThreshold,
uint256 executionFee
);
function getDecreaseOrder(address _account, uint256 _orderIndex)
external
view
returns (
address collateralToken,
address receiveToken,
uint256 collateralDelta,
address indexToken,
uint256 sizeDelta,
bool isLong,
uint256 triggerPrice,
bool triggerAboveThreshold,
uint256 executionFee,
uint256 orderType,
uint256 trailingStopPercentage
);
// function executeSwapOrder(
// address,
// uint256,
// address payable
// ) external;
function executeDecreaseOrder(
address,
uint256,
address payable,
uint256 _trailingStopRefPrice,
uint256 _trailingStopRefPriceTimestamp
) external;
function executeIncreaseOrder(
address,
uint256,
address payable
) external;
function createDecreaseOrderSLTP(
address _account,
address[] memory _path,
address _indexToken,
bool _isLong,
bytes memory _orderProps,
uint256 _sizeDelta
) external payable;
function minExecutionFee() external view returns (uint256);
function minTrailingStopExecutionFee() external view returns (uint256);
function minSLTPExecutionFee() external view returns (uint256);
function MAX_TRAILING_STOP_PERCENTAGE() external view returns (uint256);
}// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface IVaultUtils {
function updateCumulativeFundingRate(
address _collateralToken,
address _indexToken
) external returns (bool);
function validateIncreasePosition(
address _account,
address _collateralToken,
address _indexToken,
uint256 _sizeDelta,
bool _isLong
) external view;
function validateDecreasePosition(
address _account,
address _collateralToken,
address _indexToken,
uint256 _collateralDelta,
uint256 _sizeDelta,
bool _isLong,
address _receiver
) external view;
function validateLiquidation(
address _account,
address _collateralToken,
address _indexToken,
bool _isLong,
bool _raise
) external view returns (uint256, uint256);
function getEntryFundingRate(
address _collateralToken,
address _indexToken,
bool _isLong
) external view returns (uint256);
function getPositionFee(
address _account,
address _collateralToken,
address _indexToken,
bool _isLong,
uint256 _sizeDelta
) external view returns (uint256);
function getFundingFee(
address _account,
address _collateralToken,
address _indexToken,
bool _isLong,
uint256 _size,
uint256 _entryFundingRate
) external view returns (uint256);
function getBuyUsdmFeeBasisPoints(address _token, uint256 _usdmAmount)
external
view
returns (uint256);
function getSellUsdmFeeBasisPoints(address _token, uint256 _usdmAmount)
external
view
returns (uint256);
function getSwapFeeBasisPoints(
address _tokenIn,
address _tokenOut,
uint256 _usdmAmount
) external view returns (uint256);
function getFeeBasisPoints(
address _token,
uint256 _usdmDelta,
uint256 _feeBasisPoints,
uint256 _taxBasisPoints,
bool _increment
) external view returns (uint256);
}{
"metadata": {
"bytecodeHash": "none",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 1
},
"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":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BASIS_POINTS_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TRAILING_STOP_PERCENTAGE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDM_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_orderIndex","type":"uint256"}],"name":"cancelDecreaseOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_orderIndex","type":"uint256"}],"name":"cancelEmptyDecreaseOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_account","type":"address[]"},{"internalType":"uint256[]","name":"_decreaseOrderIndexes","type":"uint256[]"}],"name":"cancelEmptyDecreaseOrderMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_orderIndex","type":"uint256"}],"name":"cancelIncreaseOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_increaseOrderIndexes","type":"uint256[]"},{"internalType":"uint256[]","name":"_decreaseOrderIndexes","type":"uint256[]"}],"name":"cancelMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_indexToken","type":"address"},{"internalType":"uint256","name":"_sizeDelta","type":"uint256"},{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"uint256","name":"_collateralDelta","type":"uint256"},{"internalType":"bool","name":"_isLong","type":"bool"},{"internalType":"uint256","name":"_triggerPrice","type":"uint256"},{"internalType":"bool","name":"_triggerAboveThreshold","type":"bool"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"bool","name":"_withdrawETH","type":"bool"},{"internalType":"uint256","name":"trailingStopPercentage","type":"uint256"}],"name":"createDecreaseOrder","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"address","name":"_indexToken","type":"address"},{"internalType":"bool","name":"_isLong","type":"bool"},{"internalType":"bytes","name":"_orderProps","type":"bytes"},{"internalType":"uint256","name":"_sizeDelta","type":"uint256"}],"name":"createDecreaseOrderSLTP","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_purchaseToken","type":"address"},{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"address","name":"_indexToken","type":"address"},{"internalType":"uint256","name":"_sizeDelta","type":"uint256"},{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"bool","name":"_isLong","type":"bool"},{"internalType":"uint256","name":"_triggerPrice","type":"uint256"},{"internalType":"bool","name":"_triggerAboveThreshold","type":"bool"},{"internalType":"uint256","name":"_executionFee","type":"uint256"},{"internalType":"bool","name":"_shouldWrap","type":"bool"},{"internalType":"bytes","name":"_orderProps","type":"bytes"}],"name":"createIncreaseOrder","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"decreaseOrders","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"collateralDelta","type":"uint256"},{"internalType":"address","name":"indexToken","type":"address"},{"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"triggerPrice","type":"uint256"},{"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"internalType":"uint256","name":"minOut","type":"uint256"},{"internalType":"bool","name":"withdrawETH","type":"bool"},{"internalType":"uint256","name":"executionFee","type":"uint256"},{"internalType":"uint256","name":"orderType","type":"uint256"},{"internalType":"uint256","name":"trailingStopPercentage","type":"uint256"},{"internalType":"uint256","name":"trailingStopRefPriceTimestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"decreaseOrdersIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"errors","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_orderIndex","type":"uint256"},{"internalType":"address payable","name":"_feeReceiver","type":"address"},{"internalType":"uint256","name":"_trailingStopRefPrice","type":"uint256"},{"internalType":"uint256","name":"_trailingStopRefPriceTimestamp","type":"uint256"}],"name":"executeDecreaseOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_orderIndex","type":"uint256"},{"internalType":"address payable","name":"_feeReceiver","type":"address"}],"name":"executeIncreaseOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"feeReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_orderIndex","type":"uint256"}],"name":"getDecreaseOrder","outputs":[{"internalType":"address","name":"collateralToken","type":"address"},{"internalType":"address","name":"receiveToken","type":"address"},{"internalType":"uint256","name":"collateralDelta","type":"uint256"},{"internalType":"address","name":"indexToken","type":"address"},{"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"triggerPrice","type":"uint256"},{"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"internalType":"uint256","name":"executionFee","type":"uint256"},{"internalType":"uint256","name":"orderType","type":"uint256"},{"internalType":"uint256","name":"trailingStopPercentage","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_orderIndex","type":"uint256"}],"name":"getIncreaseOrder","outputs":[{"internalType":"address","name":"purchaseToken","type":"address"},{"internalType":"uint256","name":"purchaseTokenAmount","type":"uint256"},{"internalType":"address","name":"collateralToken","type":"address"},{"internalType":"address","name":"indexToken","type":"address"},{"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"triggerPrice","type":"uint256"},{"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"internalType":"uint256","name":"executionFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"increaseOrders","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"purchaseToken","type":"address"},{"internalType":"uint256","name":"purchaseTokenAmount","type":"uint256"},{"internalType":"address","name":"collateralToken","type":"address"},{"internalType":"address","name":"indexToken","type":"address"},{"internalType":"uint256","name":"sizeDelta","type":"uint256"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"triggerPrice","type":"uint256"},{"internalType":"bool","name":"triggerAboveThreshold","type":"bool"},{"internalType":"uint256","name":"executionFee","type":"uint256"},{"internalType":"bytes","name":"orderProps","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"increaseOrdersIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_usdm","type":"address"},{"internalType":"uint256","name":"_minExecutionFee","type":"uint256"},{"internalType":"uint256","name":"_minSLTPExecutionFee","type":"uint256"},{"internalType":"uint256","name":"_minTrailingStopExecutionFee","type":"uint256"},{"internalType":"uint256","name":"_minPurchaseTokenAmountUsd","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOrderKeeper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minExecutionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minPurchaseTokenAmountUsd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minSLTPExecutionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minTrailingStopExecutionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"orderExecutor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"positionRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"positionUtils","outputs":[{"internalType":"contract IPositionUtils","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"_errors","type":"string[]"}],"name":"setErrors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gov","type":"address"}],"name":"setGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minExecutionFee","type":"uint256"}],"name":"setMinExecutionFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minPurchaseTokenAmountUsd","type":"uint256"}],"name":"setMinPurchaseTokenAmountUsd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minSLTPExecutionFee","type":"uint256"}],"name":"setMinSLTPExecutionFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minTrailingStopExecutionFee","type":"uint256"}],"name":"setMinTrailingStopExecutionFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_orderExecutor","type":"address"}],"name":"setOrderExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setOrderKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_positionRouter","type":"address"}],"name":"setPositionRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IPositionUtils","name":"_positionUtils","type":"address"}],"name":"setPositionUtils","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_trailingStopFee","type":"uint256"}],"name":"setTrailingStopFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"trailingStopFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"trailingStopPositions","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_orderIndex","type":"uint256"},{"internalType":"uint256","name":"_collateralDelta","type":"uint256"},{"internalType":"uint256","name":"_sizeDelta","type":"uint256"},{"internalType":"uint256","name":"_triggerPrice","type":"uint256"},{"internalType":"bool","name":"_triggerAboveThreshold","type":"bool"},{"internalType":"uint256","name":"_trailingStopPercentage","type":"uint256"}],"name":"updateDecreaseOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_orderIndex","type":"uint256"},{"internalType":"uint256","name":"_sizeDelta","type":"uint256"},{"internalType":"uint256","name":"_triggerPrice","type":"uint256"},{"internalType":"bool","name":"_triggerAboveThreshold","type":"bool"}],"name":"updateIncreaseOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_orderIndex","type":"uint256"},{"internalType":"uint256","name":"_refPrice","type":"uint256"},{"internalType":"uint256","name":"_refPriceTimestamp","type":"uint256"}],"name":"updateTrailingRefPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdm","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"withdrawFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040526014805460ff1916905534801561001a57600080fd5b506001600055600780546001600160a01b03191633179055615e3180620000426000396000f3fe6080604052600436106102695760003560e01c8063026032ee1461028e5780630d5cc938146102ce578063126082cf146102ee57806312d43a51146103105780631ce9cb8f146103325780631e261538146103525780632152336a146103725780632b7d6290146103925780633833f5f5146103c9578063392e53cd146103f65780633fc8cef31461040b57806347e0bbd0146104205780634b8d6f3b146104405780635bb63c1e146104605780635bfb9358146104805780635e44babd146104a057806361ef161f146104c05780636344ee85146104d557806363ae2103146104ea57806373e42bc8146104ff578063756677a1146105125780637ce5ff8c14610532578063852a752c146105455780638566ba5c1461056557806387b5c4c91461058557806388f6c3b31461059a5780638de10c2e146105ba57806395082d25146105cf5780639983ee1b146105e45780639b96eae5146106045780639e71b0f014610619578063a6e9790914610639578063a849d64414610659578063ae46415b1461066e578063aec2245514610683578063bbede3fb146106a3578063c843e81c146106c3578063cfaa55eb146106e3578063cfad57a214610703578063d38ab51914610723578063d3bab1d114610743578063d566d0ca14610778578063d95423e614610798578063dc59b7b6146107ad578063e9fe8a5f146107c2578063ee138d0f146107e2578063f2555278146107f7578063f2d2e01b14610817578063f887ea4014610850578063fbfa77cf14610865578063fc2cee621461087a578063fdace2d71461089a578063fed1a606146108ad578063ff637e81146108da57610289565b3661028957600854610287906001600160a01b0316331460026108fa565b005b600080fd5b34801561029a57600080fd5b506102ae6102a9366004614dfe565b610934565b6040516102c59b9a99989796959493929190615606565b60405180910390f35b3480156102da57600080fd5b506102876102e936600461519c565b610b6a565b3480156102fa57600080fd5b50610303610b77565b6040516102c59190615d2c565b34801561031c57600080fd5b50610325610b7d565b6040516102c591906153cd565b34801561033e57600080fd5b5061030361034d366004614c5a565b610b8c565b34801561035e57600080fd5b5061028761036d366004614dd1565b610b9e565b34801561037e57600080fd5b5061028761038d366004614c5a565b610bd1565b34801561039e57600080fd5b506103b26103ad366004614dfe565b610bfb565b6040516102c59b9a9998979695949392919061558d565b3480156103d557600080fd5b506103e96103e4366004614c5a565b610d60565b6040516102c591906159bb565b34801561040257600080fd5b506103e9610d75565b34801561041757600080fd5b50610325610d7e565b34801561042c57600080fd5b5061028761043b36600461519c565b610d8d565b34801561044c57600080fd5b5061028761045b3660046150de565b6110c6565b34801561046c57600080fd5b5061028761047b36600461519c565b611119565b34801561048c57600080fd5b5061028761049b36600461507e565b611126565b3480156104ac57600080fd5b506102876104bb36600461519c565b611181565b3480156104cc57600080fd5b5061032561118e565b3480156104e157600080fd5b5061030361119d565b3480156104f657600080fd5b506103036111a3565b61028761050d366004614ebb565b6111a9565b34801561051e57600080fd5b5061028761052d366004614c5a565b611366565b610287610540366004614f8b565b611390565b34801561055157600080fd5b506103e961056036600461519c565b611793565b34801561057157600080fd5b50610287610580366004614dfe565b6117a8565b34801561059157600080fd5b50610303611bb2565b3480156105a657600080fd5b506102876105b5366004615044565b611bb8565b3480156105c657600080fd5b50610303611c46565b3480156105db57600080fd5b50610303611c4c565b3480156105f057600080fd5b506102876105ff366004615246565b611c5c565b34801561061057600080fd5b50610303611d61565b34801561062557600080fd5b5061028761063436600461519c565b611d67565b34801561064557600080fd5b50610287610654366004615286565b61205d565b34801561066557600080fd5b506103256121b9565b34801561067a57600080fd5b506103036121c8565b34801561068f57600080fd5b5061030361069e366004614c5a565b6121d4565b3480156106af57600080fd5b506102876106be366004614e6a565b6121e6565b3480156106cf57600080fd5b506102876106de366004614cae565b6129b4565b3480156106ef57600080fd5b506102876106fe366004614c5a565b612a43565b34801561070f57600080fd5b5061028761071e366004614c5a565b612a6d565b34801561072f57600080fd5b5061028761073e366004614e29565b612a97565b34801561074f57600080fd5b5061076361075e366004614dfe565b612faa565b6040516102c599989796959493929190615706565b34801561078457600080fd5b50610303610793366004614c5a565b61320f565b3480156107a457600080fd5b50610325613221565b3480156107b957600080fd5b50610303613230565b3480156107ce57600080fd5b506102876107dd36600461519c565b613236565b3480156107ee57600080fd5b50610325613243565b34801561080357600080fd5b50610287610812366004614c76565b613252565b34801561082357600080fd5b50610837610832366004614dfe565b6132a6565b6040516102c59d9c9b9a99989796959493929190615907565b34801561085c57600080fd5b5061032561332c565b34801561087157600080fd5b5061032561333b565b34801561088657600080fd5b5061028761089536600461519c565b61334a565b6102876108a8366004614d2d565b613357565b3480156108b957600080fd5b506108cd6108c836600461519c565b61339e565b6040516102c59190615a03565b3480156108e657600080fd5b506102876108f536600461514c565b613439565b60008181526015602052604090208261092f5760405162461bcd60e51b81526004016109269190615a16565b60405180910390fd5b505050565b600080600080600080600080600080600061094d6147de565b600460008f6001600160a01b03166001600160a01b0316815260200190815260200160002060008e8152602001908152602001600020604051806101c00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201805480602002602001604051908101604052809291908181526020018280548015610a1757602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109f9575b5050509183525050600282015460208083019190915260038301546001600160a01b0316604083015260048301546060830152600583015460ff90811615156080840152600684015460a084015260078401548116151560c0840152600884015460e08401526009840154161515610100830152600a830154610120830152600b830154610140830152600c830154610160830152600d909201546101809091015281015151909150610acb576000610ae5565b8060200151600081518110610adc57fe5b60200260200101515b600182602001515111610af9576000610b13565b8160200151600181518110610b0a57fe5b60200260200101515b8260400151836060015184608001518560a001518660c001518760e001518861014001518961016001518a61018001519b509b509b509b509b509b509b509b509b509b509b50509295989b509295989b9093969950565b610b7261349a565b601355565b61271081565b6007546001600160a01b031681565b60166020526000908152604090205481565b610ba661349a565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b610bd961349a565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6002602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a90046001600160a01b0316908060010160009054906101000a90046001600160a01b0316908060020154908060030160009054906101000a90046001600160a01b0316908060040160009054906101000a90046001600160a01b0316908060050154908060060160009054906101000a900460ff16908060070154908060080160009054906101000a900460ff169080600901549080600a018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d565780601f10610d2b57610100808354040283529160200191610d56565b820191906000526020600020905b815481529060010190602001808311610d3957829003601f168201915b505050505090508b565b60066020526000908152604090205460ff1681565b60145460ff1681565b6008546001600160a01b031681565b60026000541415610db05760405162461bcd60e51b815260040161092690615cc3565b6002600055610dbd614865565b33600090815260026020818152604080842086855282529283902083516101608101855281546001600160a01b039081168252600180840154821683860152838601548388015260038401548216606084015260048401549091166080830152600583015460a0830152600683015460ff908116151560c0840152600784015460e08401526008840154161515610100808401919091526009840154610120840152600a840180548851938116159092026000190190911695909504601f81018590048502820185019096528581529094919361014086019391929091830182828015610eeb5780601f10610ec057610100808354040283529160200191610eeb565b820191906000526020600020905b815481529060010190602001808311610ece57829003601f168201915b5050509190925250508151919250610f11916001600160a01b031615159050600b6108fa565b336000908152600260208181526040808420868552909152822080546001600160a01b0319908116825560018201805482169055918101839055600381018054831690556004810180549092169091556005810182905560068101805460ff199081169091556007820183905560088201805490911690556009810182905590610f9e600a8301826148e7565b505060085460208201516001600160a01b0390811691161415610fe557610fe0610fda82604001518361012001516134b590919063ffffffff16565b336134e3565b61101a565b61100b33826040015183602001516001600160a01b03166135599092919063ffffffff16565b61101a816101200151336134e3565b600e54815160208301516040808501516060860151608087015160a088015160c089015160e08a01516101008b01516101208c015197516301aaf6ab60e51b81526001600160a01b03909b169a63355ed5609a61108b9a90998f99919891979196919591949193919260040161575b565b600060405180830381600087803b1580156110a557600080fd5b505af11580156110b9573d6000803e3d6000fd5b5050600160005550505050565b6110ce61349a565b60005b8181101561092f578282828181106110e557fe5b90506020028101906110f79190615d35565b600083815260156020526040902061111092909161492e565b506001016110d1565b61112161349a565b601055565b61112e6135af565b61113d815183511460126108fa565b60005b825181101561092f5761117983828151811061115857fe5b602002602001015183838151811061116c57fe5b60200260200101516117a8565b600101611140565b61118961349a565b601255565b600d546001600160a01b031681565b60115481565b600f5481565b600260005414156111cc5760405162461bcd60e51b815260040161092690615cc3565b60026000556111d96135ce565b6111e3838261363f565b5081156112245760088054611209916001600160a01b038e8116921691909114906108fa565b61121f611216848c6134b5565b341460096108fa565b6112ab565b611231833414600a6108fa565b600a60009054906101000a90046001600160a01b03166001600160a01b0316631b8278788c33308e6040518563ffffffff1660e01b815260040161127894939291906154cd565b600060405180830381600087803b15801561129257600080fd5b505af11580156112a6573d6000803e3d6000fd5b505050505b600b54604051630a48d5a960e01b81526000916001600160a01b031690630a48d5a9906112de908f908f9060040161566a565b60206040518083038186803b1580156112f657600080fd5b505afa15801561130a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132e91906151b4565b9050611340601354821015600d6108fa565b50611354338c8c8a8d8d8c8c8c8c8b613723565b50506001600055505050505050505050565b61136e61349a565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b600260005414156113b35760405162461bcd60e51b815260040161092690615cc3565b60026000556113c06135ce565b6113db8851600114806113d4575088516002145b60036108fa565b8015611405576113f160105434101560076108fa565b6114006107d0821060116108fa565b611414565b611414600f54341160076108fa565b8115611456576008548851611456916001600160a01b0316908a90600019810190811061143d57fe5b60200260200101516001600160a01b03161460046108fa565b6000811561155c576000611480338b60008151811061147157fe5b60200260200101518e8b613968565b6000818152600160205260409020549091506114a19060ff161560136108fa565b600b548a516001600160a01b0390911690634a3f088d9033908d906000906114c557fe5b60200260200101518f8c6040518563ffffffff1660e01b81526004016114ee94939291906153e1565b6101006040518083038186803b15801561150757600080fd5b505afa15801561151b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153f91906152da565b5095975061155a955050508515159250601491506108fa9050565b505b6115646147de565b604051806101c00160405280336001600160a01b031681526020018b815260200160008511611593578a611596565b60005b81526020018d6001600160a01b03168152602001600085116115b8578c6115ba565b835b81526020018915158152602001600085116115d55788611701565b8961167057600b60009054906101000a90046001600160a01b03166001600160a01b031663e124e6d28f6040518263ffffffff1660e01b815260040161161b91906153cd565b60206040518083038186803b15801561163357600080fd5b505afa158015611647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166b91906151b4565b611701565b600b60009054906101000a90046001600160a01b03166001600160a01b03166381a612d68f6040518263ffffffff1660e01b81526004016116b191906153cd565b60206040518083038186803b1580156116c957600080fd5b505afa1580156116dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170191906151b4565b8152602001600085116117145787611717565b60005b151581526020016000851161172c578661172f565b60005b8152602001851515815260200134815260200160008511611751576000611754565b60035b60ff16815260200184815260200160008511611771576000611773565b425b90529050611780816139a1565b5050600160005550505050505050505050565b60016020526000908152604090205460ff1681565b600260005414156117cb5760405162461bcd60e51b815260040161092690615cc3565b60026000556117d86135af565b6117e06147de565b6001600160a01b03808416600090815260046020908152604080832086845282529182902082516101c0810184528154909416845260018101805484518185028101850190955280855291938584019390929083018282801561186c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161184e575b50505091835250506002820154602082015260038201546001600160a01b03908116604083015260048301546060830152600583015460ff90811615156080840152600684015460a084015260078401548116151560c0840152600884015460e08401526009840154161515610100830152600a830154610120830152600b80840154610140840152600c840154610160840152600d9093015461018090920191909152825192935061192292161515906108fa565b600b548151602083015180516000936001600160a01b031692634a3f088d929091859061194b57fe5b602002602001015185606001518660a001516040518563ffffffff1660e01b815260040161197c94939291906153e1565b6101006040518083038186803b15801561199557600080fd5b505afa1580156119a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119cd91906152da565b5050505050505090508060001415611ba75781516001600160a01b03166000908152600460209081526040808320868452909152812080546001600160a01b031916815590611a1f60018301826149ac565b50600060028201819055600380830180546001600160a01b03191690556004830182905560058301805460ff199081169091556006840183905560078401805482169055600884018390556009840180549091169055600a8301829055600b8301829055600c8301829055600d909201556101608301511415611ae6576000611ace83600001518460200151600081518110611ab757fe5b602002602001015185606001518660a00151613968565b6000908152600160205260409020805460ff19169055505b611af982610140015183600001516134e3565b600e548251602084015180516001600160a01b03909316926372dcb01c92918791600090611b2357fe5b60200260200101518660400151876060015188608001518960a001518a60c001518b60e001518c61014001516040518b63ffffffff1660e01b8152600401611b749a99989796959493929190615457565b600060405180830381600087803b158015611b8e57600080fd5b505af1158015611ba2573d6000803e3d6000fd5b505050505b505060016000555050565b60125481565b60026000541415611bdb5760405162461bcd60e51b815260040161092690615cc3565b6002600055611be86135af565b6001600160a01b038085166000908152600460209081526040808320878452909152902080549091611c1e9116151560016108fa565b80600b015460031415611c3a5760068101839055600d81018290555b50506001600055505050565b60135481565b68327cb2734119d3b7a9601e1b81565b60026000541415611c7f5760405162461bcd60e51b815260040161092690615cc3565b6002600081815533815260209182526040808220878352909252208054611cb2906001600160a01b03161515600b6108fa565b6007810183905560088101805460ff191683151517905560058101849055600e546003820154600480840154600685015460405163e25a729160e01b81526001600160a01b039586169563e25a729195611d239533958e959284169493169260ff909216918d918d918d910161540b565b600060405180830381600087803b158015611d3d57600080fd5b505af1158015611d51573d6000803e3d6000fd5b5050600160005550505050505050565b6107d081565b60026000541415611d8a5760405162461bcd60e51b815260040161092690615cc3565b6002600055611d976147de565b33600090815260046020908152604080832085845282529182902082516101c08101845281546001600160a01b0316815260018201805485518186028101860190965280865291949293858101939290830182828015611e2057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611e02575b50505091835250506002820154602082015260038201546001600160a01b03908116604083015260048301546060830152600583015460ff90811615156080840152600684015460a084015260078401548116151560c0840152600884015460e08401526009840154161515610100830152600a830154610120830152600b80840154610140840152600c840154610160840152600d90930154610180909201919091528251929350611ed692161515906108fa565b336000908152600460209081526040808320858452909152812080546001600160a01b031916815590611f0c60018301826149ac565b50600060028201819055600380830180546001600160a01b03191690556004830182905560058301805460ff199081169091556006840183905560078401805482169055600884018390556009840180549091169055600a8301829055600b8301829055600c8301829055600d909201556101608201511415611fd3576000611fbb82600001518360200151600081518110611fa457fe5b602002602001015184606001518560a00151613968565b6000908152600160205260409020805460ff19169055505b611fe2816101400151336134e3565b600e548151602083015180516001600160a01b03909316926372dcb01c9291869160009061200c57fe5b60200260200101518560400151866060015187608001518860a001518960c001518a60e001518b61014001516040518b63ffffffff1660e01b815260040161108b9a99989796959493929190615457565b600260005414156120805760405162461bcd60e51b815260040161092690615cc3565b60026000908155338152600460209081526040808320898452909152902080546120b6906001600160a01b03161515600b6108fa565b600c810154156120e7576120db6000831180156120d457506107d083105b60116108fa565b600c810182905561210d565b6006810184905560078101805460ff191684151517905560048101859055600281018690555b600e546001820180546001600160a01b039092169163e421001d9133918b919060009061213657fe5b600091825260209091200154600386015460058701546040516001600160e01b031960e088901b16815261218b9594936001600160a01b03908116938f939116918e9160ff16908e908e908e90600401615457565b600060405180830381600087803b1580156121a557600080fd5b505af1158015611354573d6000803e3d6000fd5b600c546001600160a01b031681565b670de0b6b3a764000081565b60036020526000908152604090205481565b600260005414156122095760405162461bcd60e51b815260040161092690615cc3565b6002600055612216613c18565b61221e6147de565b6001600160a01b03808716600090815260046020908152604080832089845282529182902082516101c081018452815490941684526001810180548451818502810185019095528085529193858401939092908301828280156122aa57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161228c575b50505091835250506002820154602082015260038201546001600160a01b03908116604083015260048301546060830152600583015460ff90811615156080840152600684015460a084015260078401548116151560c0840152600884015460e08401526009840154161515610100830152600a830154610120830152600b80840154610140840152600c840154610160840152600d9093015461018090920191909152825192935061236092161515906108fa565b600e5460e082015160c0830151606084015160a08501516101808601516040516287cfe560e01b81526000966001600160a01b0316956287cfe5956123b5959194909391929015916001918d906004016159c6565b604080518083038186803b1580156123cc57600080fd5b505afa1580156123e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240491906151cc565b5060808301516040808501516001600160a01b038b166000908152600460209081528382208c8352905291822080546001600160a01b031916815593945091929061245260018301826149ac565b50600060028201819055600380830180546001600160a01b03191690556004830182905560058301805460ff199081169091556006840183905560078401805482169055600884018390556009840180549091169055600a8301829055600b8301829055600c8301829055600d909201556101608501511415612519576000612501856000015186602001516000815181106124ea57fe5b602002602001015187606001518860a00151613968565b6000908152600160205260409020805460ff19169055505b610160840151156125de57600b548451602086015180516001600160a01b0390931692634a3f088d92919060009061254d57fe5b602002602001015187606001518860a001516040518563ffffffff1660e01b815260040161257e94939291906153e1565b6101006040518083038186803b15801561259757600080fd5b505afa1580156125ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125cf91906152da565b50959750600096505050505050505b600a548451602086015180516000936001600160a01b031692632662166b929091859061260757fe5b6020026020010151886060015186888b60a00151306040518863ffffffff1660e01b815260040161263e979695949392919061554e565b602060405180830381600087803b15801561265857600080fd5b505af115801561266c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269091906151b4565b905084610160015160031480156126a75750600081115b156126d2576126cf85602001516000815181106126c057fe5b60200260200101518285613c31565b90505b6000600186602001515111156127fe57600e54602087015180516000926001600160a01b0316916324dd285c91849061270757fe5b6020026020010151896020015160018151811061272057fe5b60200260200101516040518363ffffffff1660e01b81526004016127459291906154b3565b60206040518083038186803b15801561275d57600080fd5b505afa158015612771573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279591906151b4565b90508083116127fc57600b54602088015180516127e1926001600160a01b03169186916000906127c157fe5b60200260200101516001600160a01b03166135599092919063ffffffff16565b6127f5876020015188610100015130613d40565b9250600191505b505b8561012001511561281c57612817828760000151613d96565b61286b565b600186602001515111801561282e5750805b15612851578551602087015180516128179291859160001981019081106127c157fe5b61286b86600001518388602001516000815181106127c157fe5b61287a8661014001518a6134e3565b5050600e548451602086015180516001600160a01b03909316926371b3f9d292918c916000906128a657fe5b6020026020010151858960600151888b60a001518c60c001518d60e001518e61014001518e6040518c63ffffffff1660e01b81526004016128f19b9a999897969594939291906158a0565b600060405180830381600087803b15801561290b57600080fd5b505af115801561291f573d6000803e3d6000fd5b5050505083610160015160031415611d5157600e548451610180860151604051631742351960e01b81526001600160a01b03909316926317423519926129729290918d91908c908c908b90600401615988565b600060405180830381600087803b15801561298c57600080fd5b505af11580156129a0573d6000803e3d6000fd5b505050505050600160005550505050505050565b6129bc61349a565b6014546129ce9060ff161560016108fa565b6014805460ff19166001179055600a80546001600160a01b03998a166001600160a01b031991821617909155600b8054988a1698821698909817909755600880549689169688169690961790955560098054949097169390951692909217909455600f93909355601192909255601055601355565b612a4b61349a565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b612a7561349a565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b60026000541415612aba5760405162461bcd60e51b815260040161092690615cc3565b6002600055612ac7613c18565b612acf614865565b6001600160a01b038481166000908152600260208181526040808420888552825292839020835161016081018552815486168152600180830154871682850152828501548287015260038301548716606083015260048301549096166080820152600582015460a0820152600682015460ff908116151560c0830152600783015460e08301526008830154161515610100808301919091526009830154610120830152600a830180548751988116159092026000190190911694909404601f81018490048402870184019095528486529490936101408601939192830182828015612bfb5780601f10612bd057610100808354040283529160200191612bfb565b820191906000526020600020905b815481529060010190602001808311612bde57829003601f168201915b5050509190925250508151919250612c21916001600160a01b031615159050600b6108fa565b600e5461010082015160e0830151608084015160c08501516040516287cfe560e01b81526000956001600160a01b0316946287cfe594612c6e9491939092600190899081906004016159c6565b604080518083038186803b158015612c8557600080fd5b505afa158015612c99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cbd91906151cc565b506001600160a01b0386166000908152600260208181526040808420898552909152822080546001600160a01b0319908116825560018201805482169055918101839055600381018054831690556004810180549092169091556005810182905560068101805460ff1990811690915560078201839055600882018054909116905560098101829055919250612d56600a8301826148e7565b5050600b5460408301516020840151612d7d926001600160a01b0391821692911690613559565b81606001516001600160a01b031682602001516001600160a01b031614612e55576040805160028082526060808301845292602083019080368337019050509050826020015181600081518110612dd057fe5b60200260200101906001600160a01b031690816001600160a01b031681525050826060015181600181518110612e0257fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000612e3082600030613d40565b600b546060860151919250612e52916001600160a01b03908116911683613559565b50505b600a5482516060840151608085015160a086015160c0870151604051630f8ee8bb60e11b81526001600160a01b0390961695631f1dd17695612ea195909490939092909160040161551a565b600060405180830381600087803b158015612ebb57600080fd5b505af1158015612ecf573d6000803e3d6000fd5b505050506000612ede83613e2e565b9050612eea81856134e3565b600e60009054906101000a90046001600160a01b03166001600160a01b03166361dcea4484600001518786602001518760400151886060015189608001518a60a001518b60c001518c60e001518d61010001518e61012001518e6040518d63ffffffff1660e01b8152600401612f6b9c9b9a99989796959493929190615832565b600060405180830381600087803b158015612f8557600080fd5b505af1158015612f99573d6000803e3d6000fd5b505060016000555050505050505050565b6000806000806000806000806000612fc0614865565b600260008d6001600160a01b03166001600160a01b0316815260200190815260200160002060008c8152602001908152602001600020604051806101600160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600282015481526020016003820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016004820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600582015481526020016006820160009054906101000a900460ff16151515158152602001600782015481526020016008820160009054906101000a900460ff1615151515815260200160098201548152602001600a82018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156131b55780601f1061318a576101008083540402835291602001916131b5565b820191906000526020600020905b81548152906001019060200180831161319857829003601f168201915b505050505081525050905080602001518160400151826060015183608001518460a001518560c001518660e00151876101000151886101200151995099509950995099509950995099509950509295985092959850929598565b60056020526000908152604090205481565b600e546001600160a01b031681565b60105481565b61323e61349a565b601155565b6009546001600160a01b031681565b61325a61349a565b6001600160a01b0382166000908152601660205260409020548061327e57506132a2565b6001600160a01b03831660008181526016602052604081205561092f908383613559565b5050565b600460208181526000938452604080852090915291835291208054600282015460038301549383015460058401546006850154600786015460088701546009880154600a890154600b8a0154600c8b0154600d909b01546001600160a01b039a8b169c999b99909a1699979860ff9788169896979586169694959390931693919290918d565b600a546001600160a01b031681565b600b546001600160a01b031681565b61335261349a565b600f55565b6002600054141561337a5760405162461bcd60e51b815260040161092690615cc3565b6002600055613387613fb6565b61338f6135ce565b6110b986868686868634613fcf565b60156020908152600091825260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156134315780601f1061340657610100808354040283529160200191613431565b820191906000526020600020905b81548152906001019060200180831161341457829003601f168201915b505050505081565b60005b82518110156134695761346183828151811061345457fe5b6020026020010151610d8d565b60010161343c565b5060005b815181101561092f5761349282828151811061348557fe5b6020026020010151611d67565b60010161346d565b6007546134b3906001600160a01b0316331460006108fa565b565b6000828201838110156134da5760405162461bcd60e51b815260040161092690615aa0565b90505b92915050565b600854604051632e1a7d4d60e01b81526001600160a01b0390911690632e1a7d4d90613513908590600401615d2c565b600060405180830381600087803b15801561352d57600080fd5b505af1158015613541573d6000803e3d6000fd5b506132a2925050506001600160a01b0382168361433e565b61092f8363a9059cbb60e01b848460405160240161357892919061566a565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526143da565b336000908152600660205260408120546134b39160ff909116906108fa565b34156134b357600860009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561362457600080fd5b505af1158015613638573d6000803e3d6000fd5b5050505050565b60008060008061364e85614469565b50509250925092506107d083106136775760405162461bcd60e51b815260040161092690615c9b565b821580613682575081155b61369e5760405162461bcd60e51b815260040161092690615ad5565b60006136d4600083116136b25760006136b5565b60015b600085116136c45760006136c7565b60015b601154910160ff16614497565b905083156136ed576010546136ea9082906134b5565b90505b600f546136fa90826134b5565b8710156137195760405162461bcd60e51b815260040161092690615cfa565b9695505050505050565b6001600160a01b038b16600090815260036020526040902054613744614865565b6040518061016001604052808e6001600160a01b031681526020018d6001600160a01b031681526020018c81526020018b6001600160a01b031681526020018a6001600160a01b03168152602001898152602001881515815260200187815260200186151581526020018581526020018481525090506137ce6001836134b590919063ffffffff16565b6001600160a01b03808f166000908152600360208181526040808420959095556002808252858420888552825292859020865181549086166001600160a01b0319918216178255878301516001830180549188169183169190911790559587015193810193909355606086015191830180549285169286169290921790915560808501516004830180549190941694169390931790915560a0830151600582015560c083015160068201805491151560ff1992831617905560e08401516007830155610100840151600883018054911515919092161790556101208301516009820155610140830151805184936138cc92600a8501929101906149ca565b50905050600e60009054906101000a90046001600160a01b03166001600160a01b03166336ed888c8e848f8f8f8f8f8f8f8f8f8f6040518d63ffffffff1660e01b81526004016139279c9b9a999897969594939291906157c3565b600060405180830381600087803b15801561394157600080fd5b505af1158015613955573d6000803e3d6000fd5b5050505050505050505050505050505050565b6000848484846040516020016139819493929190615375565b604051602081830303815290604052805190602001209050949350505050565b80516001600160a01b03166000908152600560205260409020546139c68160016134b5565b82516001600160a01b03908116600090815260056020908152604080832094909455855183168252600481528382208583528152929020845181546001600160a01b03191692169190911781558184015180518593613a2c926001850192910190614a38565b50604082015160028201556060820151600380830180546001600160a01b0319166001600160a01b03909316929092179091556080830151600483015560a083015160058301805460ff1990811692151592909217905560c0840151600684015560e084015160078401805483169115159190911790556101008401516008840155610120840151600984018054909216901515179055610140830151600a83015561016080840151600b840155610180840151600c8401556101a090930151600d90920191909155908301511415613b38576000613b1a83600001518460200151600081518110611ab757fe5b6000908152600160208190526040909120805460ff19169091179055505b600e548251602084015180516001600160a01b03909316926364813a5992918591600090613b6257fe5b6020026020010151866020015160018860200151510381518110613b8257fe5b60200260200101518760400151886060015189608001518a60a001518b60c001518c60e001518d61014001518e61016001518f61018001516040518e63ffffffff1660e01b8152600401613be29d9c9b9a99989796959493929190615683565b600060405180830381600087803b158015613bfc57600080fd5b505af1158015613c10573d6000803e3d6000fd5b505050505050565b600c546134b3906001600160a01b0316331460006108fa565b600e5460125460009182916001600160a01b039091169063a42ab3d2908790613c699061271090613c63908990614497565b906144d1565b6040518363ffffffff1660e01b8152600401613c8692919061566a565b60206040518083038186803b158015613c9e57600080fd5b505afa158015613cb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cd691906151b4565b905083811015613d34576000613cec8583614510565b6001600160a01b038716600090815260166020526040902054909150613d1290836134b5565b6001600160a01b0387166000908152601660205260409020559150613d399050565b839150505b9392505050565b6000613d51845160021460036108fa565b835160021415613d3957613d8f84600081518110613d6b57fe5b602002602001015185600181518110613d8057fe5b60200260200101518585614552565b9050613d39565b600854604051632e1a7d4d60e01b81526001600160a01b0390911690632e1a7d4d90613dc6908590600401615d2c565b600060405180830381600087803b158015613de057600080fd5b505af1158015613df4573d6000803e3d6000fd5b50506040516001600160a01b038416925084156108fc02915084906000818181858888f1935050505015801561092f573d6000803e3d6000fd5b6000808261012001519050600080600080613e4d876101400151614469565b5093509350935093506000841180613e655750600083115b80613e705750600082115b15613fab57606087606001516001600160a01b0316826001600160a01b031614613f19576040805160028082526060820183529091602083019080368337019050509050876060015181600081518110613ec657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508181600181518110613ef457fe5b60200260200101906001600160a01b031690816001600160a01b031681525050613f6c565b6040805160018082528183019092529060208083019080368337019050509050876060015181600081518110613f4b57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b613fa48860000151828a608001518b60c001518c61014001518d60a00151613f9f600f548e61451090919063ffffffff16565b613fcf565b600f549550505b509295945050505050565b600d546134b3906001600160a01b0316331460006108fa565b600b548651829160009182916001600160a01b031690634a3f088d908c908c908590613ff757fe5b60200260200101518b8b6040518563ffffffff1660e01b815260040161402094939291906153e1565b6101006040518083038186803b15801561403957600080fd5b505afa15801561404d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061407191906152da565b505050505092505091508482141561431f5761408b614a99565b614094876145f6565b9050600081604001511180156140cc57508780156140b55750818160400151115b806140cc5750871580156140cc5750818160400151105b1561419f576011546000906140e2906002614497565b85106140f0576011546140f2565b845b90506140fc6147de565b604051806101c001604052808e6001600160a01b031681526020018d8152602001600081526020018c6001600160a01b031681526020018681526020018b1515815260200184604001518152602001858560400151111515815260200160008152602001846080015115158152602001838152602001600281526020016000815260200160008152509050614190816139a1565b61419a8683614510565b955050505b80511515806141df5750600081602001511180156141df57508780156141c85750818160200151105b806141df5750871580156141df5750818160200151115b1561431d57600085851061420a57600082602001511161420157601054614205565b6011545b61420c565b845b90506142166147de565b604051806101c001604052808e6001600160a01b031681526020018d8152602001600081526020018c6001600160a01b031681526020018681526020018b15158152602001600085602001511161426d5785614273565b84602001515b8152602001600085602001511161428b576000614293565b858560200151115b151581526020016000815260200184608001511515815260200183815260200160008560200151116142c65760036142c9565b60015b60ff16815260200160008560200151116142e45784516142e7565b60005b815260200160008560200151116142fe5742614301565b60005b9052905061430e816139a1565b6143188683614510565b955050505b505b601154831061433257614332838b613d96565b50505050505050505050565b8047101561435e5760405162461bcd60e51b815260040161092690615b5c565b6000826001600160a01b031682604051614377906153ca565b60006040518083038185875af1925050503d80600081146143b4576040519150601f19603f3d011682016040523d82523d6000602084013e6143b9565b606091505b505090508061092f5760405162461bcd60e51b815260040161092690615b02565b606061442f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166146649092919063ffffffff16565b80519091501561092f578080602001905181019061444d9190615180565b61092f5760405162461bcd60e51b815260040161092690615c51565b60008060008060008580602001905181019061448591906151f0565b939a9299509097509550909350915050565b6000826144a6575060006134dd565b828202828482816144b357fe5b04146134da5760405162461bcd60e51b815260040161092690615bd9565b60006134da83836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b81525061467b565b60006134da83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506146b2565b600b54604051634998b10960e11b815260009182916001600160a01b039091169063933162129061458b908990899088906004016154f7565b602060405180830381600087803b1580156145a557600080fd5b505af11580156145b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145dd91906151b4565b90506145ed8482101560106108fa565b95945050505050565b6145fe614a99565b60008060008060008680602001905181019061461a91906151f0565b9450945094509450945061462c614a99565b506040805160a0810182529586526020860194909452928401919091526001600160a01b031660608301521515608082015292915050565b606061467384846000856146de565b949350505050565b6000818361469c5760405162461bcd60e51b81526004016109269190615a03565b5060008385816146a857fe5b0495945050505050565b600081848411156146d65760405162461bcd60e51b81526004016109269190615a03565b505050900390565b6060824710156147005760405162461bcd60e51b815260040161092690615b93565b6147098561479f565b6147255760405162461bcd60e51b815260040161092690615c1a565b60006060866001600160a01b0316858760405161474291906153ae565b60006040518083038185875af1925050503d806000811461477f576040519150601f19603f3d011682016040523d82523d6000602084013e614784565b606091505b50915091506147948282866147a5565b979650505050505050565b3b151590565b606083156147b4575081613d39565b8251156147c45782518084602001fd5b8160405162461bcd60e51b81526004016109269190615a03565b604051806101c0016040528060006001600160a01b03168152602001606081526020016000815260200160006001600160a01b03168152602001600081526020016000151581526020016000815260200160001515815260200160008152602001600015158152602001600081526020016000815260200160008152602001600081525090565b60405180610160016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000151581526020016000815260200160001515815260200160008152602001606081525090565b50805460018160011615610100020316600290046000825580601f1061490d575061492b565b601f01602090049060005260206000209081019061492b9190614ad3565b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061496f5782800160ff1982351617855561499c565b8280016001018555821561499c579182015b8281111561499c578235825591602001919060010190614981565b506149a8929150614ad3565b5090565b508054600082559060005260206000209081019061492b9190614ad3565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614a0b57805160ff191683800117855561499c565b8280016001018555821561499c579182015b8281111561499c578251825591602001919060010190614a1d565b828054828255906000526020600020908101928215614a8d579160200282015b82811115614a8d57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614a58565b506149a8929150614ae8565b6040518060a0016040528060008152602001600081526020016000815260200160006001600160a01b031681526020016000151581525090565b5b808211156149a85760008155600101614ad4565b5b808211156149a85780546001600160a01b0319168155600101614ae9565b80356134dd81615e01565b600082601f830112614b22578081fd5b8135614b35614b3082615da6565b615d80565b818152915060208083019084810181840286018201871015614b5657600080fd5b60005b84811015614b7e578135614b6c81615e01565b84529282019290820190600101614b59565b505050505092915050565b600082601f830112614b99578081fd5b8135614ba7614b3082615da6565b818152915060208083019084810181840286018201871015614bc857600080fd5b60005b84811015614b7e57813584529282019290820190600101614bcb565b80356134dd81615e16565b600082601f830112614c02578081fd5b81356001600160401b03811115614c17578182fd5b614c2a601f8201601f1916602001615d80565b9150808252836020828501011115614c4157600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215614c6b578081fd5b81356134da81615e01565b60008060408385031215614c88578081fd5b8235614c9381615e01565b91506020830135614ca381615e01565b809150509250929050565b600080600080600080600080610100898b031215614cca578384fd5b8835614cd581615e01565b97506020890135614ce581615e01565b96506040890135614cf581615e01565b95506060890135614d0581615e01565b979a969950949760808101359660a0820135965060c0820135955060e0909101359350915050565b60008060008060008060c08789031215614d45578182fd5b8635614d5081615e01565b955060208701356001600160401b0380821115614d6b578384fd5b614d778a838b01614b12565b965060408901359150614d8982615e01565b909450606088013590614d9b82615e16565b90935060808801359080821115614db0578384fd5b50614dbd89828a01614bf2565b92505060a087013590509295509295509295565b60008060408385031215614de3578182fd5b8235614dee81615e01565b91506020830135614ca381615e16565b60008060408385031215614e10578182fd5b8235614e1b81615e01565b946020939093013593505050565b600080600060608486031215614e3d578283fd5b8335614e4881615e01565b9250602084013591506040840135614e5f81615e01565b809150509250925092565b600080600080600060a08688031215614e81578283fd5b8535614e8c81615e01565b9450602086013593506040860135614ea381615e01565b94979396509394606081013594506080013592915050565b60008060008060008060008060008060006101608c8e031215614edc578485fd5b8b35614ee781615e01565b9a5060208c0135995060408c0135614efe81615e01565b985060608c01359750614f148d60808e01614b07565b9650614f238d60a08e01614be7565b955060c08c01359450614f398d60e08e01614be7565b93506101008c01359250614f518d6101208e01614be7565b91506101408c01356001600160401b03811115614f6c578182fd5b614f788e828f01614bf2565b9150509295989b509295989b9093969950565b6000806000806000806000806000806101408b8d031215614faa578384fd5b8a35614fb581615e01565b995060208b0135985060408b01356001600160401b03811115614fd6578485fd5b614fe28d828e01614b12565b98505060608b0135965060808b0135614ffa81615e16565b955060a08b0135945060c08b013561501181615e16565b935060e08b013592506101008b013561502981615e16565b809250506101208b013590509295989b9194979a5092959850565b60008060008060808587031215615059578182fd5b843561506481615e01565b966020860135965060408601359560600135945092505050565b60008060408385031215615090578182fd5b82356001600160401b03808211156150a6578384fd5b6150b286838701614b12565b935060208501359150808211156150c7578283fd5b506150d485828601614b89565b9150509250929050565b600080602083850312156150f0578182fd5b82356001600160401b0380821115615106578384fd5b818501915085601f830112615119578384fd5b813581811115615127578485fd5b866020808302850101111561513a578485fd5b60209290920196919550909350505050565b6000806040838503121561515e578182fd5b82356001600160401b0380821115615174578384fd5b6150b286838701614b89565b600060208284031215615191578081fd5b81516134da81615e16565b6000602082840312156151ad578081fd5b5035919050565b6000602082840312156151c5578081fd5b5051919050565b600080604083850312156151de578182fd5b825191506020830151614ca381615e16565b600080600080600060a08688031215615207578283fd5b855194506020860151935060408601519250606086015161522781615e01565b608087015190925061523881615e16565b809150509295509295909350565b6000806000806080858703121561525b578182fd5b843593506020850135925060408501359150606085013561527b81615e16565b939692955090935050565b60008060008060008060c0878903121561529e578384fd5b8635955060208701359450604087013593506060870135925060808701356152c581615e16565b8092505060a087013590509295509295509295565b600080600080600080600080610100898b0312156152f6578182fd5b885197506020890151965060408901519550606089015194506080890151935060a0890151925060c089015161532b81615e16565b8092505060e089015190509295985092959890939650565b15159052565b60008151808452615361816020860160208601615dd1565b601f01601f19169290920160200192915050565b6001600160601b0319606095861b8116825293851b841660148201529190931b909116602882015290151560f81b603c820152603d0190565b600082516153c0818460208701615dd1565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b039485168152928416602084015292166040820152901515606082015260800190565b6001600160a01b039889168152602081019790975294871660408701529290951660608501521515608084015260a083019390935260c082019290925290151560e08201526101000190565b6001600160a01b039a8b16815260208101999099529689166040890152606088019590955292909616608086015260a085015293151560c084015260e08301939093529115156101008201526101208101919091526101400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6001600160a01b03958616815293851660208501529190931660408301526060820192909252901515608082015260a00190565b6001600160a01b0397881681529587166020870152938616604086015260608501929092526080840152151560a083015290911660c082015260e00190565b600061016060018060a01b03808f168452808e1660208501528c6040850152808c166060850152808b166080850152508860a084015287151560c08401528660e084015285151561010084015284610120840152806101408401526155f481840185615349565b9e9d5050505050505050505050505050565b6001600160a01b039b8c168152998b1660208b015260408a0198909852959098166060880152608087019390935290151560a086015260c0850152151560e08401526101008301939093526101208201929092526101408101919091526101600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b038e81168252602082018e90528c811660408301528b81166060830152608082018b9052891660a082015260c0810188905286151560e082015261010081018690526101a081016156df610120830187615343565b8461014083015283610160830152826101808301529e9d5050505050505050505050505050565b6001600160a01b03998a168152602081019890985295881660408801529390961660608601526080850191909152151560a084015260c083019390935291151560e08201526101008101919091526101200190565b6001600160a01b039b8c168152602081019a909a52978a1660408a0152606089019690965293881660808801529190961660a086015260c085019590955293151560e08401526101008301939093529115156101208201526101408101919091526101600190565b600060018060a01b03808f1683528d6020840152808d1660408401528b6060840152808b166080840152808a1660a0840152508760c083015286151560e083015285610100830152841515610120830152836101408301526101806101608301526155f4610180830184615349565b6001600160a01b039c8d168152602081019b909b52988b1660408b015260608a019790975294891660808901529290971660a087015260c086015294151560e08501526101008401949094529215156101208301526101408201929092526101608101919091526101800190565b6001600160a01b039b8c168152602081019a909a52978a1660408a0152606089019690965293909716608087015260a0860191909152151560c085015260e08401949094529215156101008301526101208201929092526101408101919091526101600190565b6001600160a01b038e81168252602082018e90528c166040820152606081018b9052891515608082015260a0810189905287151560c082015260e081018790526101a0810161595a610100830188615343565b856101208301528461014083015283610160830152826101808301529e9d5050505050505050505050505050565b6001600160a01b03969096168652602086019490945260408501929092526060840152608083015260a082015260c00190565b901515815260200190565b961515875260208701959095526001600160a01b0393909316604086015290151560608501521515608084015260a083015260c082015260e00190565b6000602082526134da6020830184615349565b60006020808301818452828554600180821660008114615a3d5760018114615a5b57615a93565b60028304607f16855260ff1983166040890152606088019350615a93565b60028304808652615a6b8a615dc5565b885b82811015615a895781548b820160400152908401908801615a6d565b8a01604001955050505b5091979650505050505050565b6020808252601b908201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604082015260600190565b60208082526013908201527214148e9bdb9b1e481bdb99481d1e5c19481cdb606a1b604082015260600190565b6020808252603a908201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c20726040820152791958da5c1a595b9d081b585e481a185d99481c995d995c9d195960321b606082015260800190565b6020808252601d908201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600e908201526d050523a696e76616c6964207473760941b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526018908201527750523a20696e76616c696420657865637574696f6e46656560401b604082015260600190565b90815260200190565b6000808335601e19843603018112615d4b578283fd5b8301803591506001600160401b03821115615d64578283fd5b602001915036819003821315615d7957600080fd5b9250929050565b6040518181016001600160401b0381118282101715615d9e57600080fd5b604052919050565b60006001600160401b03821115615dbb578081fd5b5060209081020190565b60009081526020902090565b60005b83811015615dec578181015183820152602001615dd4565b83811115615dfb576000848401525b50505050565b6001600160a01b038116811461492b57600080fd5b801515811461492b57600080fdfea164736f6c634300060c000a
Deployed Bytecode
0x6080604052600436106102695760003560e01c8063026032ee1461028e5780630d5cc938146102ce578063126082cf146102ee57806312d43a51146103105780631ce9cb8f146103325780631e261538146103525780632152336a146103725780632b7d6290146103925780633833f5f5146103c9578063392e53cd146103f65780633fc8cef31461040b57806347e0bbd0146104205780634b8d6f3b146104405780635bb63c1e146104605780635bfb9358146104805780635e44babd146104a057806361ef161f146104c05780636344ee85146104d557806363ae2103146104ea57806373e42bc8146104ff578063756677a1146105125780637ce5ff8c14610532578063852a752c146105455780638566ba5c1461056557806387b5c4c91461058557806388f6c3b31461059a5780638de10c2e146105ba57806395082d25146105cf5780639983ee1b146105e45780639b96eae5146106045780639e71b0f014610619578063a6e9790914610639578063a849d64414610659578063ae46415b1461066e578063aec2245514610683578063bbede3fb146106a3578063c843e81c146106c3578063cfaa55eb146106e3578063cfad57a214610703578063d38ab51914610723578063d3bab1d114610743578063d566d0ca14610778578063d95423e614610798578063dc59b7b6146107ad578063e9fe8a5f146107c2578063ee138d0f146107e2578063f2555278146107f7578063f2d2e01b14610817578063f887ea4014610850578063fbfa77cf14610865578063fc2cee621461087a578063fdace2d71461089a578063fed1a606146108ad578063ff637e81146108da57610289565b3661028957600854610287906001600160a01b0316331460026108fa565b005b600080fd5b34801561029a57600080fd5b506102ae6102a9366004614dfe565b610934565b6040516102c59b9a99989796959493929190615606565b60405180910390f35b3480156102da57600080fd5b506102876102e936600461519c565b610b6a565b3480156102fa57600080fd5b50610303610b77565b6040516102c59190615d2c565b34801561031c57600080fd5b50610325610b7d565b6040516102c591906153cd565b34801561033e57600080fd5b5061030361034d366004614c5a565b610b8c565b34801561035e57600080fd5b5061028761036d366004614dd1565b610b9e565b34801561037e57600080fd5b5061028761038d366004614c5a565b610bd1565b34801561039e57600080fd5b506103b26103ad366004614dfe565b610bfb565b6040516102c59b9a9998979695949392919061558d565b3480156103d557600080fd5b506103e96103e4366004614c5a565b610d60565b6040516102c591906159bb565b34801561040257600080fd5b506103e9610d75565b34801561041757600080fd5b50610325610d7e565b34801561042c57600080fd5b5061028761043b36600461519c565b610d8d565b34801561044c57600080fd5b5061028761045b3660046150de565b6110c6565b34801561046c57600080fd5b5061028761047b36600461519c565b611119565b34801561048c57600080fd5b5061028761049b36600461507e565b611126565b3480156104ac57600080fd5b506102876104bb36600461519c565b611181565b3480156104cc57600080fd5b5061032561118e565b3480156104e157600080fd5b5061030361119d565b3480156104f657600080fd5b506103036111a3565b61028761050d366004614ebb565b6111a9565b34801561051e57600080fd5b5061028761052d366004614c5a565b611366565b610287610540366004614f8b565b611390565b34801561055157600080fd5b506103e961056036600461519c565b611793565b34801561057157600080fd5b50610287610580366004614dfe565b6117a8565b34801561059157600080fd5b50610303611bb2565b3480156105a657600080fd5b506102876105b5366004615044565b611bb8565b3480156105c657600080fd5b50610303611c46565b3480156105db57600080fd5b50610303611c4c565b3480156105f057600080fd5b506102876105ff366004615246565b611c5c565b34801561061057600080fd5b50610303611d61565b34801561062557600080fd5b5061028761063436600461519c565b611d67565b34801561064557600080fd5b50610287610654366004615286565b61205d565b34801561066557600080fd5b506103256121b9565b34801561067a57600080fd5b506103036121c8565b34801561068f57600080fd5b5061030361069e366004614c5a565b6121d4565b3480156106af57600080fd5b506102876106be366004614e6a565b6121e6565b3480156106cf57600080fd5b506102876106de366004614cae565b6129b4565b3480156106ef57600080fd5b506102876106fe366004614c5a565b612a43565b34801561070f57600080fd5b5061028761071e366004614c5a565b612a6d565b34801561072f57600080fd5b5061028761073e366004614e29565b612a97565b34801561074f57600080fd5b5061076361075e366004614dfe565b612faa565b6040516102c599989796959493929190615706565b34801561078457600080fd5b50610303610793366004614c5a565b61320f565b3480156107a457600080fd5b50610325613221565b3480156107b957600080fd5b50610303613230565b3480156107ce57600080fd5b506102876107dd36600461519c565b613236565b3480156107ee57600080fd5b50610325613243565b34801561080357600080fd5b50610287610812366004614c76565b613252565b34801561082357600080fd5b50610837610832366004614dfe565b6132a6565b6040516102c59d9c9b9a99989796959493929190615907565b34801561085c57600080fd5b5061032561332c565b34801561087157600080fd5b5061032561333b565b34801561088657600080fd5b5061028761089536600461519c565b61334a565b6102876108a8366004614d2d565b613357565b3480156108b957600080fd5b506108cd6108c836600461519c565b61339e565b6040516102c59190615a03565b3480156108e657600080fd5b506102876108f536600461514c565b613439565b60008181526015602052604090208261092f5760405162461bcd60e51b81526004016109269190615a16565b60405180910390fd5b505050565b600080600080600080600080600080600061094d6147de565b600460008f6001600160a01b03166001600160a01b0316815260200190815260200160002060008e8152602001908152602001600020604051806101c00160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200160018201805480602002602001604051908101604052809291908181526020018280548015610a1757602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116109f9575b5050509183525050600282015460208083019190915260038301546001600160a01b0316604083015260048301546060830152600583015460ff90811615156080840152600684015460a084015260078401548116151560c0840152600884015460e08401526009840154161515610100830152600a830154610120830152600b830154610140830152600c830154610160830152600d909201546101809091015281015151909150610acb576000610ae5565b8060200151600081518110610adc57fe5b60200260200101515b600182602001515111610af9576000610b13565b8160200151600181518110610b0a57fe5b60200260200101515b8260400151836060015184608001518560a001518660c001518760e001518861014001518961016001518a61018001519b509b509b509b509b509b509b509b509b509b509b50509295989b509295989b9093969950565b610b7261349a565b601355565b61271081565b6007546001600160a01b031681565b60166020526000908152604090205481565b610ba661349a565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b610bd961349a565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6002602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a90046001600160a01b0316908060010160009054906101000a90046001600160a01b0316908060020154908060030160009054906101000a90046001600160a01b0316908060040160009054906101000a90046001600160a01b0316908060050154908060060160009054906101000a900460ff16908060070154908060080160009054906101000a900460ff169080600901549080600a018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d565780601f10610d2b57610100808354040283529160200191610d56565b820191906000526020600020905b815481529060010190602001808311610d3957829003601f168201915b505050505090508b565b60066020526000908152604090205460ff1681565b60145460ff1681565b6008546001600160a01b031681565b60026000541415610db05760405162461bcd60e51b815260040161092690615cc3565b6002600055610dbd614865565b33600090815260026020818152604080842086855282529283902083516101608101855281546001600160a01b039081168252600180840154821683860152838601548388015260038401548216606084015260048401549091166080830152600583015460a0830152600683015460ff908116151560c0840152600784015460e08401526008840154161515610100808401919091526009840154610120840152600a840180548851938116159092026000190190911695909504601f81018590048502820185019096528581529094919361014086019391929091830182828015610eeb5780601f10610ec057610100808354040283529160200191610eeb565b820191906000526020600020905b815481529060010190602001808311610ece57829003601f168201915b5050509190925250508151919250610f11916001600160a01b031615159050600b6108fa565b336000908152600260208181526040808420868552909152822080546001600160a01b0319908116825560018201805482169055918101839055600381018054831690556004810180549092169091556005810182905560068101805460ff199081169091556007820183905560088201805490911690556009810182905590610f9e600a8301826148e7565b505060085460208201516001600160a01b0390811691161415610fe557610fe0610fda82604001518361012001516134b590919063ffffffff16565b336134e3565b61101a565b61100b33826040015183602001516001600160a01b03166135599092919063ffffffff16565b61101a816101200151336134e3565b600e54815160208301516040808501516060860151608087015160a088015160c089015160e08a01516101008b01516101208c015197516301aaf6ab60e51b81526001600160a01b03909b169a63355ed5609a61108b9a90998f99919891979196919591949193919260040161575b565b600060405180830381600087803b1580156110a557600080fd5b505af11580156110b9573d6000803e3d6000fd5b5050600160005550505050565b6110ce61349a565b60005b8181101561092f578282828181106110e557fe5b90506020028101906110f79190615d35565b600083815260156020526040902061111092909161492e565b506001016110d1565b61112161349a565b601055565b61112e6135af565b61113d815183511460126108fa565b60005b825181101561092f5761117983828151811061115857fe5b602002602001015183838151811061116c57fe5b60200260200101516117a8565b600101611140565b61118961349a565b601255565b600d546001600160a01b031681565b60115481565b600f5481565b600260005414156111cc5760405162461bcd60e51b815260040161092690615cc3565b60026000556111d96135ce565b6111e3838261363f565b5081156112245760088054611209916001600160a01b038e8116921691909114906108fa565b61121f611216848c6134b5565b341460096108fa565b6112ab565b611231833414600a6108fa565b600a60009054906101000a90046001600160a01b03166001600160a01b0316631b8278788c33308e6040518563ffffffff1660e01b815260040161127894939291906154cd565b600060405180830381600087803b15801561129257600080fd5b505af11580156112a6573d6000803e3d6000fd5b505050505b600b54604051630a48d5a960e01b81526000916001600160a01b031690630a48d5a9906112de908f908f9060040161566a565b60206040518083038186803b1580156112f657600080fd5b505afa15801561130a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132e91906151b4565b9050611340601354821015600d6108fa565b50611354338c8c8a8d8d8c8c8c8c8b613723565b50506001600055505050505050505050565b61136e61349a565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b600260005414156113b35760405162461bcd60e51b815260040161092690615cc3565b60026000556113c06135ce565b6113db8851600114806113d4575088516002145b60036108fa565b8015611405576113f160105434101560076108fa565b6114006107d0821060116108fa565b611414565b611414600f54341160076108fa565b8115611456576008548851611456916001600160a01b0316908a90600019810190811061143d57fe5b60200260200101516001600160a01b03161460046108fa565b6000811561155c576000611480338b60008151811061147157fe5b60200260200101518e8b613968565b6000818152600160205260409020549091506114a19060ff161560136108fa565b600b548a516001600160a01b0390911690634a3f088d9033908d906000906114c557fe5b60200260200101518f8c6040518563ffffffff1660e01b81526004016114ee94939291906153e1565b6101006040518083038186803b15801561150757600080fd5b505afa15801561151b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153f91906152da565b5095975061155a955050508515159250601491506108fa9050565b505b6115646147de565b604051806101c00160405280336001600160a01b031681526020018b815260200160008511611593578a611596565b60005b81526020018d6001600160a01b03168152602001600085116115b8578c6115ba565b835b81526020018915158152602001600085116115d55788611701565b8961167057600b60009054906101000a90046001600160a01b03166001600160a01b031663e124e6d28f6040518263ffffffff1660e01b815260040161161b91906153cd565b60206040518083038186803b15801561163357600080fd5b505afa158015611647573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166b91906151b4565b611701565b600b60009054906101000a90046001600160a01b03166001600160a01b03166381a612d68f6040518263ffffffff1660e01b81526004016116b191906153cd565b60206040518083038186803b1580156116c957600080fd5b505afa1580156116dd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170191906151b4565b8152602001600085116117145787611717565b60005b151581526020016000851161172c578661172f565b60005b8152602001851515815260200134815260200160008511611751576000611754565b60035b60ff16815260200184815260200160008511611771576000611773565b425b90529050611780816139a1565b5050600160005550505050505050505050565b60016020526000908152604090205460ff1681565b600260005414156117cb5760405162461bcd60e51b815260040161092690615cc3565b60026000556117d86135af565b6117e06147de565b6001600160a01b03808416600090815260046020908152604080832086845282529182902082516101c0810184528154909416845260018101805484518185028101850190955280855291938584019390929083018282801561186c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161184e575b50505091835250506002820154602082015260038201546001600160a01b03908116604083015260048301546060830152600583015460ff90811615156080840152600684015460a084015260078401548116151560c0840152600884015460e08401526009840154161515610100830152600a830154610120830152600b80840154610140840152600c840154610160840152600d9093015461018090920191909152825192935061192292161515906108fa565b600b548151602083015180516000936001600160a01b031692634a3f088d929091859061194b57fe5b602002602001015185606001518660a001516040518563ffffffff1660e01b815260040161197c94939291906153e1565b6101006040518083038186803b15801561199557600080fd5b505afa1580156119a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119cd91906152da565b5050505050505090508060001415611ba75781516001600160a01b03166000908152600460209081526040808320868452909152812080546001600160a01b031916815590611a1f60018301826149ac565b50600060028201819055600380830180546001600160a01b03191690556004830182905560058301805460ff199081169091556006840183905560078401805482169055600884018390556009840180549091169055600a8301829055600b8301829055600c8301829055600d909201556101608301511415611ae6576000611ace83600001518460200151600081518110611ab757fe5b602002602001015185606001518660a00151613968565b6000908152600160205260409020805460ff19169055505b611af982610140015183600001516134e3565b600e548251602084015180516001600160a01b03909316926372dcb01c92918791600090611b2357fe5b60200260200101518660400151876060015188608001518960a001518a60c001518b60e001518c61014001516040518b63ffffffff1660e01b8152600401611b749a99989796959493929190615457565b600060405180830381600087803b158015611b8e57600080fd5b505af1158015611ba2573d6000803e3d6000fd5b505050505b505060016000555050565b60125481565b60026000541415611bdb5760405162461bcd60e51b815260040161092690615cc3565b6002600055611be86135af565b6001600160a01b038085166000908152600460209081526040808320878452909152902080549091611c1e9116151560016108fa565b80600b015460031415611c3a5760068101839055600d81018290555b50506001600055505050565b60135481565b68327cb2734119d3b7a9601e1b81565b60026000541415611c7f5760405162461bcd60e51b815260040161092690615cc3565b6002600081815533815260209182526040808220878352909252208054611cb2906001600160a01b03161515600b6108fa565b6007810183905560088101805460ff191683151517905560058101849055600e546003820154600480840154600685015460405163e25a729160e01b81526001600160a01b039586169563e25a729195611d239533958e959284169493169260ff909216918d918d918d910161540b565b600060405180830381600087803b158015611d3d57600080fd5b505af1158015611d51573d6000803e3d6000fd5b5050600160005550505050505050565b6107d081565b60026000541415611d8a5760405162461bcd60e51b815260040161092690615cc3565b6002600055611d976147de565b33600090815260046020908152604080832085845282529182902082516101c08101845281546001600160a01b0316815260018201805485518186028101860190965280865291949293858101939290830182828015611e2057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611e02575b50505091835250506002820154602082015260038201546001600160a01b03908116604083015260048301546060830152600583015460ff90811615156080840152600684015460a084015260078401548116151560c0840152600884015460e08401526009840154161515610100830152600a830154610120830152600b80840154610140840152600c840154610160840152600d90930154610180909201919091528251929350611ed692161515906108fa565b336000908152600460209081526040808320858452909152812080546001600160a01b031916815590611f0c60018301826149ac565b50600060028201819055600380830180546001600160a01b03191690556004830182905560058301805460ff199081169091556006840183905560078401805482169055600884018390556009840180549091169055600a8301829055600b8301829055600c8301829055600d909201556101608201511415611fd3576000611fbb82600001518360200151600081518110611fa457fe5b602002602001015184606001518560a00151613968565b6000908152600160205260409020805460ff19169055505b611fe2816101400151336134e3565b600e548151602083015180516001600160a01b03909316926372dcb01c9291869160009061200c57fe5b60200260200101518560400151866060015187608001518860a001518960c001518a60e001518b61014001516040518b63ffffffff1660e01b815260040161108b9a99989796959493929190615457565b600260005414156120805760405162461bcd60e51b815260040161092690615cc3565b60026000908155338152600460209081526040808320898452909152902080546120b6906001600160a01b03161515600b6108fa565b600c810154156120e7576120db6000831180156120d457506107d083105b60116108fa565b600c810182905561210d565b6006810184905560078101805460ff191684151517905560048101859055600281018690555b600e546001820180546001600160a01b039092169163e421001d9133918b919060009061213657fe5b600091825260209091200154600386015460058701546040516001600160e01b031960e088901b16815261218b9594936001600160a01b03908116938f939116918e9160ff16908e908e908e90600401615457565b600060405180830381600087803b1580156121a557600080fd5b505af1158015611354573d6000803e3d6000fd5b600c546001600160a01b031681565b670de0b6b3a764000081565b60036020526000908152604090205481565b600260005414156122095760405162461bcd60e51b815260040161092690615cc3565b6002600055612216613c18565b61221e6147de565b6001600160a01b03808716600090815260046020908152604080832089845282529182902082516101c081018452815490941684526001810180548451818502810185019095528085529193858401939092908301828280156122aa57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161228c575b50505091835250506002820154602082015260038201546001600160a01b03908116604083015260048301546060830152600583015460ff90811615156080840152600684015460a084015260078401548116151560c0840152600884015460e08401526009840154161515610100830152600a830154610120830152600b80840154610140840152600c840154610160840152600d9093015461018090920191909152825192935061236092161515906108fa565b600e5460e082015160c0830151606084015160a08501516101808601516040516287cfe560e01b81526000966001600160a01b0316956287cfe5956123b5959194909391929015916001918d906004016159c6565b604080518083038186803b1580156123cc57600080fd5b505afa1580156123e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240491906151cc565b5060808301516040808501516001600160a01b038b166000908152600460209081528382208c8352905291822080546001600160a01b031916815593945091929061245260018301826149ac565b50600060028201819055600380830180546001600160a01b03191690556004830182905560058301805460ff199081169091556006840183905560078401805482169055600884018390556009840180549091169055600a8301829055600b8301829055600c8301829055600d909201556101608501511415612519576000612501856000015186602001516000815181106124ea57fe5b602002602001015187606001518860a00151613968565b6000908152600160205260409020805460ff19169055505b610160840151156125de57600b548451602086015180516001600160a01b0390931692634a3f088d92919060009061254d57fe5b602002602001015187606001518860a001516040518563ffffffff1660e01b815260040161257e94939291906153e1565b6101006040518083038186803b15801561259757600080fd5b505afa1580156125ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125cf91906152da565b50959750600096505050505050505b600a548451602086015180516000936001600160a01b031692632662166b929091859061260757fe5b6020026020010151886060015186888b60a00151306040518863ffffffff1660e01b815260040161263e979695949392919061554e565b602060405180830381600087803b15801561265857600080fd5b505af115801561266c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269091906151b4565b905084610160015160031480156126a75750600081115b156126d2576126cf85602001516000815181106126c057fe5b60200260200101518285613c31565b90505b6000600186602001515111156127fe57600e54602087015180516000926001600160a01b0316916324dd285c91849061270757fe5b6020026020010151896020015160018151811061272057fe5b60200260200101516040518363ffffffff1660e01b81526004016127459291906154b3565b60206040518083038186803b15801561275d57600080fd5b505afa158015612771573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279591906151b4565b90508083116127fc57600b54602088015180516127e1926001600160a01b03169186916000906127c157fe5b60200260200101516001600160a01b03166135599092919063ffffffff16565b6127f5876020015188610100015130613d40565b9250600191505b505b8561012001511561281c57612817828760000151613d96565b61286b565b600186602001515111801561282e5750805b15612851578551602087015180516128179291859160001981019081106127c157fe5b61286b86600001518388602001516000815181106127c157fe5b61287a8661014001518a6134e3565b5050600e548451602086015180516001600160a01b03909316926371b3f9d292918c916000906128a657fe5b6020026020010151858960600151888b60a001518c60c001518d60e001518e61014001518e6040518c63ffffffff1660e01b81526004016128f19b9a999897969594939291906158a0565b600060405180830381600087803b15801561290b57600080fd5b505af115801561291f573d6000803e3d6000fd5b5050505083610160015160031415611d5157600e548451610180860151604051631742351960e01b81526001600160a01b03909316926317423519926129729290918d91908c908c908b90600401615988565b600060405180830381600087803b15801561298c57600080fd5b505af11580156129a0573d6000803e3d6000fd5b505050505050600160005550505050505050565b6129bc61349a565b6014546129ce9060ff161560016108fa565b6014805460ff19166001179055600a80546001600160a01b03998a166001600160a01b031991821617909155600b8054988a1698821698909817909755600880549689169688169690961790955560098054949097169390951692909217909455600f93909355601192909255601055601355565b612a4b61349a565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b612a7561349a565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b60026000541415612aba5760405162461bcd60e51b815260040161092690615cc3565b6002600055612ac7613c18565b612acf614865565b6001600160a01b038481166000908152600260208181526040808420888552825292839020835161016081018552815486168152600180830154871682850152828501548287015260038301548716606083015260048301549096166080820152600582015460a0820152600682015460ff908116151560c0830152600783015460e08301526008830154161515610100808301919091526009830154610120830152600a830180548751988116159092026000190190911694909404601f81018490048402870184019095528486529490936101408601939192830182828015612bfb5780601f10612bd057610100808354040283529160200191612bfb565b820191906000526020600020905b815481529060010190602001808311612bde57829003601f168201915b5050509190925250508151919250612c21916001600160a01b031615159050600b6108fa565b600e5461010082015160e0830151608084015160c08501516040516287cfe560e01b81526000956001600160a01b0316946287cfe594612c6e9491939092600190899081906004016159c6565b604080518083038186803b158015612c8557600080fd5b505afa158015612c99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cbd91906151cc565b506001600160a01b0386166000908152600260208181526040808420898552909152822080546001600160a01b0319908116825560018201805482169055918101839055600381018054831690556004810180549092169091556005810182905560068101805460ff1990811690915560078201839055600882018054909116905560098101829055919250612d56600a8301826148e7565b5050600b5460408301516020840151612d7d926001600160a01b0391821692911690613559565b81606001516001600160a01b031682602001516001600160a01b031614612e55576040805160028082526060808301845292602083019080368337019050509050826020015181600081518110612dd057fe5b60200260200101906001600160a01b031690816001600160a01b031681525050826060015181600181518110612e0257fe5b60200260200101906001600160a01b031690816001600160a01b0316815250506000612e3082600030613d40565b600b546060860151919250612e52916001600160a01b03908116911683613559565b50505b600a5482516060840151608085015160a086015160c0870151604051630f8ee8bb60e11b81526001600160a01b0390961695631f1dd17695612ea195909490939092909160040161551a565b600060405180830381600087803b158015612ebb57600080fd5b505af1158015612ecf573d6000803e3d6000fd5b505050506000612ede83613e2e565b9050612eea81856134e3565b600e60009054906101000a90046001600160a01b03166001600160a01b03166361dcea4484600001518786602001518760400151886060015189608001518a60a001518b60c001518c60e001518d61010001518e61012001518e6040518d63ffffffff1660e01b8152600401612f6b9c9b9a99989796959493929190615832565b600060405180830381600087803b158015612f8557600080fd5b505af1158015612f99573d6000803e3d6000fd5b505060016000555050505050505050565b6000806000806000806000806000612fc0614865565b600260008d6001600160a01b03166001600160a01b0316815260200190815260200160002060008c8152602001908152602001600020604051806101600160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016001820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600282015481526020016003820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016004820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600582015481526020016006820160009054906101000a900460ff16151515158152602001600782015481526020016008820160009054906101000a900460ff1615151515815260200160098201548152602001600a82018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156131b55780601f1061318a576101008083540402835291602001916131b5565b820191906000526020600020905b81548152906001019060200180831161319857829003601f168201915b505050505081525050905080602001518160400151826060015183608001518460a001518560c001518660e00151876101000151886101200151995099509950995099509950995099509950509295985092959850929598565b60056020526000908152604090205481565b600e546001600160a01b031681565b60105481565b61323e61349a565b601155565b6009546001600160a01b031681565b61325a61349a565b6001600160a01b0382166000908152601660205260409020548061327e57506132a2565b6001600160a01b03831660008181526016602052604081205561092f908383613559565b5050565b600460208181526000938452604080852090915291835291208054600282015460038301549383015460058401546006850154600786015460088701546009880154600a890154600b8a0154600c8b0154600d909b01546001600160a01b039a8b169c999b99909a1699979860ff9788169896979586169694959390931693919290918d565b600a546001600160a01b031681565b600b546001600160a01b031681565b61335261349a565b600f55565b6002600054141561337a5760405162461bcd60e51b815260040161092690615cc3565b6002600055613387613fb6565b61338f6135ce565b6110b986868686868634613fcf565b60156020908152600091825260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156134315780601f1061340657610100808354040283529160200191613431565b820191906000526020600020905b81548152906001019060200180831161341457829003601f168201915b505050505081565b60005b82518110156134695761346183828151811061345457fe5b6020026020010151610d8d565b60010161343c565b5060005b815181101561092f5761349282828151811061348557fe5b6020026020010151611d67565b60010161346d565b6007546134b3906001600160a01b0316331460006108fa565b565b6000828201838110156134da5760405162461bcd60e51b815260040161092690615aa0565b90505b92915050565b600854604051632e1a7d4d60e01b81526001600160a01b0390911690632e1a7d4d90613513908590600401615d2c565b600060405180830381600087803b15801561352d57600080fd5b505af1158015613541573d6000803e3d6000fd5b506132a2925050506001600160a01b0382168361433e565b61092f8363a9059cbb60e01b848460405160240161357892919061566a565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526143da565b336000908152600660205260408120546134b39160ff909116906108fa565b34156134b357600860009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561362457600080fd5b505af1158015613638573d6000803e3d6000fd5b5050505050565b60008060008061364e85614469565b50509250925092506107d083106136775760405162461bcd60e51b815260040161092690615c9b565b821580613682575081155b61369e5760405162461bcd60e51b815260040161092690615ad5565b60006136d4600083116136b25760006136b5565b60015b600085116136c45760006136c7565b60015b601154910160ff16614497565b905083156136ed576010546136ea9082906134b5565b90505b600f546136fa90826134b5565b8710156137195760405162461bcd60e51b815260040161092690615cfa565b9695505050505050565b6001600160a01b038b16600090815260036020526040902054613744614865565b6040518061016001604052808e6001600160a01b031681526020018d6001600160a01b031681526020018c81526020018b6001600160a01b031681526020018a6001600160a01b03168152602001898152602001881515815260200187815260200186151581526020018581526020018481525090506137ce6001836134b590919063ffffffff16565b6001600160a01b03808f166000908152600360208181526040808420959095556002808252858420888552825292859020865181549086166001600160a01b0319918216178255878301516001830180549188169183169190911790559587015193810193909355606086015191830180549285169286169290921790915560808501516004830180549190941694169390931790915560a0830151600582015560c083015160068201805491151560ff1992831617905560e08401516007830155610100840151600883018054911515919092161790556101208301516009820155610140830151805184936138cc92600a8501929101906149ca565b50905050600e60009054906101000a90046001600160a01b03166001600160a01b03166336ed888c8e848f8f8f8f8f8f8f8f8f8f6040518d63ffffffff1660e01b81526004016139279c9b9a999897969594939291906157c3565b600060405180830381600087803b15801561394157600080fd5b505af1158015613955573d6000803e3d6000fd5b5050505050505050505050505050505050565b6000848484846040516020016139819493929190615375565b604051602081830303815290604052805190602001209050949350505050565b80516001600160a01b03166000908152600560205260409020546139c68160016134b5565b82516001600160a01b03908116600090815260056020908152604080832094909455855183168252600481528382208583528152929020845181546001600160a01b03191692169190911781558184015180518593613a2c926001850192910190614a38565b50604082015160028201556060820151600380830180546001600160a01b0319166001600160a01b03909316929092179091556080830151600483015560a083015160058301805460ff1990811692151592909217905560c0840151600684015560e084015160078401805483169115159190911790556101008401516008840155610120840151600984018054909216901515179055610140830151600a83015561016080840151600b840155610180840151600c8401556101a090930151600d90920191909155908301511415613b38576000613b1a83600001518460200151600081518110611ab757fe5b6000908152600160208190526040909120805460ff19169091179055505b600e548251602084015180516001600160a01b03909316926364813a5992918591600090613b6257fe5b6020026020010151866020015160018860200151510381518110613b8257fe5b60200260200101518760400151886060015189608001518a60a001518b60c001518c60e001518d61014001518e61016001518f61018001516040518e63ffffffff1660e01b8152600401613be29d9c9b9a99989796959493929190615683565b600060405180830381600087803b158015613bfc57600080fd5b505af1158015613c10573d6000803e3d6000fd5b505050505050565b600c546134b3906001600160a01b0316331460006108fa565b600e5460125460009182916001600160a01b039091169063a42ab3d2908790613c699061271090613c63908990614497565b906144d1565b6040518363ffffffff1660e01b8152600401613c8692919061566a565b60206040518083038186803b158015613c9e57600080fd5b505afa158015613cb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cd691906151b4565b905083811015613d34576000613cec8583614510565b6001600160a01b038716600090815260166020526040902054909150613d1290836134b5565b6001600160a01b0387166000908152601660205260409020559150613d399050565b839150505b9392505050565b6000613d51845160021460036108fa565b835160021415613d3957613d8f84600081518110613d6b57fe5b602002602001015185600181518110613d8057fe5b60200260200101518585614552565b9050613d39565b600854604051632e1a7d4d60e01b81526001600160a01b0390911690632e1a7d4d90613dc6908590600401615d2c565b600060405180830381600087803b158015613de057600080fd5b505af1158015613df4573d6000803e3d6000fd5b50506040516001600160a01b038416925084156108fc02915084906000818181858888f1935050505015801561092f573d6000803e3d6000fd5b6000808261012001519050600080600080613e4d876101400151614469565b5093509350935093506000841180613e655750600083115b80613e705750600082115b15613fab57606087606001516001600160a01b0316826001600160a01b031614613f19576040805160028082526060820183529091602083019080368337019050509050876060015181600081518110613ec657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508181600181518110613ef457fe5b60200260200101906001600160a01b031690816001600160a01b031681525050613f6c565b6040805160018082528183019092529060208083019080368337019050509050876060015181600081518110613f4b57fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b613fa48860000151828a608001518b60c001518c61014001518d60a00151613f9f600f548e61451090919063ffffffff16565b613fcf565b600f549550505b509295945050505050565b600d546134b3906001600160a01b0316331460006108fa565b600b548651829160009182916001600160a01b031690634a3f088d908c908c908590613ff757fe5b60200260200101518b8b6040518563ffffffff1660e01b815260040161402094939291906153e1565b6101006040518083038186803b15801561403957600080fd5b505afa15801561404d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061407191906152da565b505050505092505091508482141561431f5761408b614a99565b614094876145f6565b9050600081604001511180156140cc57508780156140b55750818160400151115b806140cc5750871580156140cc5750818160400151105b1561419f576011546000906140e2906002614497565b85106140f0576011546140f2565b845b90506140fc6147de565b604051806101c001604052808e6001600160a01b031681526020018d8152602001600081526020018c6001600160a01b031681526020018681526020018b1515815260200184604001518152602001858560400151111515815260200160008152602001846080015115158152602001838152602001600281526020016000815260200160008152509050614190816139a1565b61419a8683614510565b955050505b80511515806141df5750600081602001511180156141df57508780156141c85750818160200151105b806141df5750871580156141df5750818160200151115b1561431d57600085851061420a57600082602001511161420157601054614205565b6011545b61420c565b845b90506142166147de565b604051806101c001604052808e6001600160a01b031681526020018d8152602001600081526020018c6001600160a01b031681526020018681526020018b15158152602001600085602001511161426d5785614273565b84602001515b8152602001600085602001511161428b576000614293565b858560200151115b151581526020016000815260200184608001511515815260200183815260200160008560200151116142c65760036142c9565b60015b60ff16815260200160008560200151116142e45784516142e7565b60005b815260200160008560200151116142fe5742614301565b60005b9052905061430e816139a1565b6143188683614510565b955050505b505b601154831061433257614332838b613d96565b50505050505050505050565b8047101561435e5760405162461bcd60e51b815260040161092690615b5c565b6000826001600160a01b031682604051614377906153ca565b60006040518083038185875af1925050503d80600081146143b4576040519150601f19603f3d011682016040523d82523d6000602084013e6143b9565b606091505b505090508061092f5760405162461bcd60e51b815260040161092690615b02565b606061442f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166146649092919063ffffffff16565b80519091501561092f578080602001905181019061444d9190615180565b61092f5760405162461bcd60e51b815260040161092690615c51565b60008060008060008580602001905181019061448591906151f0565b939a9299509097509550909350915050565b6000826144a6575060006134dd565b828202828482816144b357fe5b04146134da5760405162461bcd60e51b815260040161092690615bd9565b60006134da83836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b81525061467b565b60006134da83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506146b2565b600b54604051634998b10960e11b815260009182916001600160a01b039091169063933162129061458b908990899088906004016154f7565b602060405180830381600087803b1580156145a557600080fd5b505af11580156145b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145dd91906151b4565b90506145ed8482101560106108fa565b95945050505050565b6145fe614a99565b60008060008060008680602001905181019061461a91906151f0565b9450945094509450945061462c614a99565b506040805160a0810182529586526020860194909452928401919091526001600160a01b031660608301521515608082015292915050565b606061467384846000856146de565b949350505050565b6000818361469c5760405162461bcd60e51b81526004016109269190615a03565b5060008385816146a857fe5b0495945050505050565b600081848411156146d65760405162461bcd60e51b81526004016109269190615a03565b505050900390565b6060824710156147005760405162461bcd60e51b815260040161092690615b93565b6147098561479f565b6147255760405162461bcd60e51b815260040161092690615c1a565b60006060866001600160a01b0316858760405161474291906153ae565b60006040518083038185875af1925050503d806000811461477f576040519150601f19603f3d011682016040523d82523d6000602084013e614784565b606091505b50915091506147948282866147a5565b979650505050505050565b3b151590565b606083156147b4575081613d39565b8251156147c45782518084602001fd5b8160405162461bcd60e51b81526004016109269190615a03565b604051806101c0016040528060006001600160a01b03168152602001606081526020016000815260200160006001600160a01b03168152602001600081526020016000151581526020016000815260200160001515815260200160008152602001600015158152602001600081526020016000815260200160008152602001600081525090565b60405180610160016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000151581526020016000815260200160001515815260200160008152602001606081525090565b50805460018160011615610100020316600290046000825580601f1061490d575061492b565b601f01602090049060005260206000209081019061492b9190614ad3565b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061496f5782800160ff1982351617855561499c565b8280016001018555821561499c579182015b8281111561499c578235825591602001919060010190614981565b506149a8929150614ad3565b5090565b508054600082559060005260206000209081019061492b9190614ad3565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614a0b57805160ff191683800117855561499c565b8280016001018555821561499c579182015b8281111561499c578251825591602001919060010190614a1d565b828054828255906000526020600020908101928215614a8d579160200282015b82811115614a8d57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614a58565b506149a8929150614ae8565b6040518060a0016040528060008152602001600081526020016000815260200160006001600160a01b031681526020016000151581525090565b5b808211156149a85760008155600101614ad4565b5b808211156149a85780546001600160a01b0319168155600101614ae9565b80356134dd81615e01565b600082601f830112614b22578081fd5b8135614b35614b3082615da6565b615d80565b818152915060208083019084810181840286018201871015614b5657600080fd5b60005b84811015614b7e578135614b6c81615e01565b84529282019290820190600101614b59565b505050505092915050565b600082601f830112614b99578081fd5b8135614ba7614b3082615da6565b818152915060208083019084810181840286018201871015614bc857600080fd5b60005b84811015614b7e57813584529282019290820190600101614bcb565b80356134dd81615e16565b600082601f830112614c02578081fd5b81356001600160401b03811115614c17578182fd5b614c2a601f8201601f1916602001615d80565b9150808252836020828501011115614c4157600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215614c6b578081fd5b81356134da81615e01565b60008060408385031215614c88578081fd5b8235614c9381615e01565b91506020830135614ca381615e01565b809150509250929050565b600080600080600080600080610100898b031215614cca578384fd5b8835614cd581615e01565b97506020890135614ce581615e01565b96506040890135614cf581615e01565b95506060890135614d0581615e01565b979a969950949760808101359660a0820135965060c0820135955060e0909101359350915050565b60008060008060008060c08789031215614d45578182fd5b8635614d5081615e01565b955060208701356001600160401b0380821115614d6b578384fd5b614d778a838b01614b12565b965060408901359150614d8982615e01565b909450606088013590614d9b82615e16565b90935060808801359080821115614db0578384fd5b50614dbd89828a01614bf2565b92505060a087013590509295509295509295565b60008060408385031215614de3578182fd5b8235614dee81615e01565b91506020830135614ca381615e16565b60008060408385031215614e10578182fd5b8235614e1b81615e01565b946020939093013593505050565b600080600060608486031215614e3d578283fd5b8335614e4881615e01565b9250602084013591506040840135614e5f81615e01565b809150509250925092565b600080600080600060a08688031215614e81578283fd5b8535614e8c81615e01565b9450602086013593506040860135614ea381615e01565b94979396509394606081013594506080013592915050565b60008060008060008060008060008060006101608c8e031215614edc578485fd5b8b35614ee781615e01565b9a5060208c0135995060408c0135614efe81615e01565b985060608c01359750614f148d60808e01614b07565b9650614f238d60a08e01614be7565b955060c08c01359450614f398d60e08e01614be7565b93506101008c01359250614f518d6101208e01614be7565b91506101408c01356001600160401b03811115614f6c578182fd5b614f788e828f01614bf2565b9150509295989b509295989b9093969950565b6000806000806000806000806000806101408b8d031215614faa578384fd5b8a35614fb581615e01565b995060208b0135985060408b01356001600160401b03811115614fd6578485fd5b614fe28d828e01614b12565b98505060608b0135965060808b0135614ffa81615e16565b955060a08b0135945060c08b013561501181615e16565b935060e08b013592506101008b013561502981615e16565b809250506101208b013590509295989b9194979a5092959850565b60008060008060808587031215615059578182fd5b843561506481615e01565b966020860135965060408601359560600135945092505050565b60008060408385031215615090578182fd5b82356001600160401b03808211156150a6578384fd5b6150b286838701614b12565b935060208501359150808211156150c7578283fd5b506150d485828601614b89565b9150509250929050565b600080602083850312156150f0578182fd5b82356001600160401b0380821115615106578384fd5b818501915085601f830112615119578384fd5b813581811115615127578485fd5b866020808302850101111561513a578485fd5b60209290920196919550909350505050565b6000806040838503121561515e578182fd5b82356001600160401b0380821115615174578384fd5b6150b286838701614b89565b600060208284031215615191578081fd5b81516134da81615e16565b6000602082840312156151ad578081fd5b5035919050565b6000602082840312156151c5578081fd5b5051919050565b600080604083850312156151de578182fd5b825191506020830151614ca381615e16565b600080600080600060a08688031215615207578283fd5b855194506020860151935060408601519250606086015161522781615e01565b608087015190925061523881615e16565b809150509295509295909350565b6000806000806080858703121561525b578182fd5b843593506020850135925060408501359150606085013561527b81615e16565b939692955090935050565b60008060008060008060c0878903121561529e578384fd5b8635955060208701359450604087013593506060870135925060808701356152c581615e16565b8092505060a087013590509295509295509295565b600080600080600080600080610100898b0312156152f6578182fd5b885197506020890151965060408901519550606089015194506080890151935060a0890151925060c089015161532b81615e16565b8092505060e089015190509295985092959890939650565b15159052565b60008151808452615361816020860160208601615dd1565b601f01601f19169290920160200192915050565b6001600160601b0319606095861b8116825293851b841660148201529190931b909116602882015290151560f81b603c820152603d0190565b600082516153c0818460208701615dd1565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b039485168152928416602084015292166040820152901515606082015260800190565b6001600160a01b039889168152602081019790975294871660408701529290951660608501521515608084015260a083019390935260c082019290925290151560e08201526101000190565b6001600160a01b039a8b16815260208101999099529689166040890152606088019590955292909616608086015260a085015293151560c084015260e08301939093529115156101008201526101208101919091526101400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039485168152928416602084015292166040820152606081019190915260800190565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6001600160a01b03958616815293851660208501529190931660408301526060820192909252901515608082015260a00190565b6001600160a01b0397881681529587166020870152938616604086015260608501929092526080840152151560a083015290911660c082015260e00190565b600061016060018060a01b03808f168452808e1660208501528c6040850152808c166060850152808b166080850152508860a084015287151560c08401528660e084015285151561010084015284610120840152806101408401526155f481840185615349565b9e9d5050505050505050505050505050565b6001600160a01b039b8c168152998b1660208b015260408a0198909852959098166060880152608087019390935290151560a086015260c0850152151560e08401526101008301939093526101208201929092526101408101919091526101600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b038e81168252602082018e90528c811660408301528b81166060830152608082018b9052891660a082015260c0810188905286151560e082015261010081018690526101a081016156df610120830187615343565b8461014083015283610160830152826101808301529e9d5050505050505050505050505050565b6001600160a01b03998a168152602081019890985295881660408801529390961660608601526080850191909152151560a084015260c083019390935291151560e08201526101008101919091526101200190565b6001600160a01b039b8c168152602081019a909a52978a1660408a0152606089019690965293881660808801529190961660a086015260c085019590955293151560e08401526101008301939093529115156101208201526101408101919091526101600190565b600060018060a01b03808f1683528d6020840152808d1660408401528b6060840152808b166080840152808a1660a0840152508760c083015286151560e083015285610100830152841515610120830152836101408301526101806101608301526155f4610180830184615349565b6001600160a01b039c8d168152602081019b909b52988b1660408b015260608a019790975294891660808901529290971660a087015260c086015294151560e08501526101008401949094529215156101208301526101408201929092526101608101919091526101800190565b6001600160a01b039b8c168152602081019a909a52978a1660408a0152606089019690965293909716608087015260a0860191909152151560c085015260e08401949094529215156101008301526101208201929092526101408101919091526101600190565b6001600160a01b038e81168252602082018e90528c166040820152606081018b9052891515608082015260a0810189905287151560c082015260e081018790526101a0810161595a610100830188615343565b856101208301528461014083015283610160830152826101808301529e9d5050505050505050505050505050565b6001600160a01b03969096168652602086019490945260408501929092526060840152608083015260a082015260c00190565b901515815260200190565b961515875260208701959095526001600160a01b0393909316604086015290151560608501521515608084015260a083015260c082015260e00190565b6000602082526134da6020830184615349565b60006020808301818452828554600180821660008114615a3d5760018114615a5b57615a93565b60028304607f16855260ff1983166040890152606088019350615a93565b60028304808652615a6b8a615dc5565b885b82811015615a895781548b820160400152908401908801615a6d565b8a01604001955050505b5091979650505050505050565b6020808252601b908201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604082015260600190565b60208082526013908201527214148e9bdb9b1e481bdb99481d1e5c19481cdb606a1b604082015260600190565b6020808252603a908201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c20726040820152791958da5c1a595b9d081b585e481a185d99481c995d995c9d195960321b606082015260800190565b6020808252601d908201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600e908201526d050523a696e76616c6964207473760941b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526018908201527750523a20696e76616c696420657865637574696f6e46656560401b604082015260600190565b90815260200190565b6000808335601e19843603018112615d4b578283fd5b8301803591506001600160401b03821115615d64578283fd5b602001915036819003821315615d7957600080fd5b9250929050565b6040518181016001600160401b0381118282101715615d9e57600080fd5b604052919050565b60006001600160401b03821115615dbb578081fd5b5060209081020190565b60009081526020902090565b60005b83811015615dec578181015183820152602001615dd4565b83811115615dfb576000848401525b50505050565b6001600160a01b038116811461492b57600080fd5b801515811461492b57600080fdfea164736f6c634300060c000a
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$20.24
Net Worth in POL
Token Allocations
USDC.E
82.74%
WPOL
16.16%
DUCKIES
1.10%
Multichain Portfolio | 35 Chains
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.