Source Code
Overview
ETH Balance
ETH Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PairInfos
Compiler Version
v0.8.15+commit.e14f2714
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
import "./interfaces/IVault.sol";
import "./interfaces/IPairInfos.sol";
import "./interfaces/ITradingStorage.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol";
import {TradeType} from "./libs/Types.sol";
import {LIQ_THRESHOLD_P, LEV_DENOMINATOR, DENOMINATOR, MIN_LEVERAGE, MAX_LEVERAGE, MILLAGE_DENOMINATOR} from "./libs/VarConstant.sol";
contract PairInfos is Initializable, Ownable2StepUpgradeable, IPairInfos {
address public keeper;
IVault public vault;
mapping(address => bool) public tradings;
struct Group {
string name;
bool guaranteedSlAndTPEnable;
uint maxCollateralP; // ‰
}
mapping(uint => Group) public groups;
struct Fee {
string name;
uint openFeeP; // (‰ of leveraged pos) openFeeP/1000
uint closeFeeP; //(‰ of leveraged pos) closeFeeP/1000
}
mapping(uint => Fee) public fees;
struct Pair {
string pairName;
bytes32 feedId;
uint spreadP; // spreadP/1000
uint feeIndex;
uint groupIndex;
uint maxSpread; // the max slippage for limit or stop trade
uint minLeverage;
uint maxLeverage;
uint minMagin;
uint minLevPos;
uint maxLevPos;
bool priceRollover;
}
mapping(uint => Pair) public pairs;
uint public pairsCount;
uint public groupsCount;
uint public feesCount;
mapping(string => bool) public isPairListed;
struct PairParams {
uint onePercentDepthAbove;
uint onePercentDepthBelow;
uint rolloverFeePerBlockP;
uint fundingFeePerBlockP;
}
mapping(uint => PairParams) public pairParams;
// Pair acc funding fees
struct PairFundingFees {
int accPerOiLong;
int accPerOiShort;
uint lastUpdateBlock;
}
mapping(uint => PairFundingFees) public pairFundingFees;
// Pair acc rollover fees
struct PairRolloverFees {
uint accPerCollateral;
uint lastUpdateBlock;
}
mapping(uint => PairRolloverFees) public pairRolloverFees;
// Trade initial acc fees
struct TradeInitialAccFee {
uint rollover;
int funding;
}
//orderId => TradeInitialAccFees
mapping(uint256 => TradeInitialAccFee) public tradeInitialAccFees;
struct GroupsCollateral {
uint256 long;
uint256 short;
}
mapping(uint => GroupsCollateral) public groupsCollaterals; // (long, short)
struct OpenInterest {
uint256 long;
uint256 short;
}
mapping(uint256 => OpenInterest) public openInterests;
struct InterestLimt {
uint256 maxOI;
uint256 maxNetOI;
}
mapping(uint256 => InterestLimt) public interestLimts;
uint256 public fundingRewardDiscount;
event PairParamsUpdated(uint pairIndex, PairParams value);
event AccRolloverFeesStored(uint pairIndex, uint value);
event AccFundingFeesStored(uint pairIndex, int valueLong, int valueShort);
event PairAdded(uint index, string pairName);
event PairUpdated(uint index);
event GroupAdded(uint index, string name);
event GroupUpdated(uint index);
event FeeAdded(uint index, string name);
event FeeUpdated(uint index);
event SetVault(IVault _vault);
event SetKeeper(address _keeper);
event SetTrading(address _trading, bool _flag);
event SetInterestLimt(uint256 pairIndex, InterestLimt _limit);
event SetFundingRewardDiscount(uint256 _fundingFeeRewardDiscount);
modifier groupListed(uint _groupIndex) {
require(groups[_groupIndex].maxCollateralP != 0, "GROUP_NOT_LISTED");
_;
}
modifier feeListed(uint _feeIndex) {
require(bytes(fees[_feeIndex].name).length != 0, "FEE_NOT_LISTED");
_;
}
modifier groupOk(Group calldata _group) {
require(_group.maxCollateralP < MILLAGE_DENOMINATOR && _group.maxCollateralP != 0, "maxCollateralP wrong");
_;
}
modifier feeOk(Fee calldata _fee) {
require(
_fee.openFeeP < MILLAGE_DENOMINATOR && _fee.closeFeeP < MILLAGE_DENOMINATOR && bytes(_fee.name).length != 0,
"WRONG_FEES"
);
_;
}
modifier onlyTrading() {
require(tradings[msg.sender], "only trading");
_;
}
modifier onlyKeeper() {
require(msg.sender == keeper, "only keeper");
_;
}
modifier checkAddress(address _check) {
require(_check != address(0), "address_0");
_;
}
/// @custom:oz-upgrades-unsafe-allow constructor
constructor() {
_disableInitializers();
}
function initialize(address _owner) external checkAddress(_owner) initializer {
_transferOwnership(_owner);
}
function setVault(IVault _vault) external onlyOwner checkAddress(address(_vault)) {
vault = _vault;
emit SetVault(_vault);
}
function setKeeper(address _keeper) external onlyOwner checkAddress(_keeper) {
keeper = _keeper;
emit SetKeeper(_keeper);
}
function setTrading(address _trading, bool _flag) external onlyOwner checkAddress(_trading) {
tradings[_trading] = _flag;
emit SetTrading(_trading, _flag);
}
function setInterestLimt(uint256 pairIndex, InterestLimt calldata _limit) external onlyOwner {
interestLimts[pairIndex] = _limit;
emit SetInterestLimt(pairIndex, _limit);
}
function setFundingRewardDiscount(uint256 _fundingRewardDiscount) external onlyOwner {
require(_fundingRewardDiscount <= MILLAGE_DENOMINATOR, "TOO_BIG");
fundingRewardDiscount = _fundingRewardDiscount;
emit SetFundingRewardDiscount(_fundingRewardDiscount);
}
function setPairParams(uint[] calldata indices, PairParams[] calldata values) external onlyKeeper {
require(indices.length == values.length, "WRONG_LENGTH");
for (uint i = 0; i < indices.length; ) {
_setPairParam(indices[i], values[i]);
unchecked {
i++;
}
}
}
function addPairs(Pair[] calldata _pairs) external onlyOwner {
for (uint i = 0; i < _pairs.length; ) {
_addPair(_pairs[i]);
unchecked {
i++;
}
}
}
function updatePair(
uint _pairIndex,
Pair calldata _pair
) external onlyOwner groupListed(_pair.groupIndex) feeListed(_pair.feeIndex) {
Pair storage p = pairs[_pairIndex];
require(isPairListed[p.pairName], "PAIR_NOT_LISTED");
require(!isPairListed[_pair.pairName], "NAME_ALREADY_USED");
isPairListed[p.pairName] = false;
p.pairName = _pair.pairName;
isPairListed[_pair.pairName] = true;
if (_pair.feedId != bytes32(0)) {
p.feedId = _pair.feedId;
}
if (_pair.spreadP > 0) {
p.spreadP = _pair.spreadP;
}
if (_pair.minMagin > 0) {
p.minMagin = _pair.minMagin;
}
if (_pair.maxSpread > 0 && _pair.maxSpread < MILLAGE_DENOMINATOR) {
p.maxSpread = _pair.maxSpread;
}
if (_pair.minLeverage > 0 && _pair.maxLeverage > _pair.minLeverage) {
require(_pair.minLeverage >= MIN_LEVERAGE && _pair.maxLeverage <= MAX_LEVERAGE, "set Leverage wrong");
p.maxLeverage = _pair.maxLeverage;
p.minLeverage = _pair.minLeverage;
}
if (_pair.minLevPos > 0 && _pair.maxLevPos > _pair.minLevPos) {
p.minLevPos = _pair.minLevPos;
p.maxLevPos = _pair.maxLevPos;
}
p.feeIndex = _pair.feeIndex;
p.groupIndex = _pair.groupIndex;
p.priceRollover = _pair.priceRollover;
emit PairUpdated(_pairIndex);
}
// Manage groups
function addGroup(Group calldata _group) external onlyOwner groupOk(_group) {
groups[groupsCount] = _group;
emit GroupAdded(groupsCount++, _group.name);
}
function updateGroup(uint _id, Group calldata _group) external onlyOwner groupListed(_id) groupOk(_group) {
groups[_id] = _group;
emit GroupUpdated(_id);
}
function addFee(Fee calldata _fee) external onlyOwner feeOk(_fee) {
fees[feesCount] = _fee;
emit FeeAdded(feesCount++, _fee.name);
}
function updateFee(uint _id, Fee calldata _fee) external onlyOwner feeListed(_id) feeOk(_fee) {
fees[_id] = _fee;
emit FeeUpdated(_id);
}
function _addPair(Pair calldata _pair) internal groupListed(_pair.groupIndex) feeListed(_pair.feeIndex) {
require(!isPairListed[_pair.pairName], "PAIR_ALREADY_LISTED");
require(
_pair.minLeverage >= MIN_LEVERAGE &&
_pair.maxLeverage <= MAX_LEVERAGE &&
_pair.maxLeverage > _pair.minLeverage,
"set Leverage wrong"
);
require(_pair.maxLevPos > _pair.minLevPos, "set LevPos wrong");
require(_pair.maxSpread < MILLAGE_DENOMINATOR, "set maxSpread wrong");
pairs[pairsCount] = _pair;
isPairListed[_pair.pairName] = true;
emit PairAdded(pairsCount++, _pair.pairName);
}
function _setPairParam(uint pairIndex, PairParams memory value) internal {
PairParams storage p = pairParams[pairIndex];
if (value.rolloverFeePerBlockP > 0 && value.rolloverFeePerBlockP < 25_000_000) {
_storeAccRolloverFees(pairIndex);
p.rolloverFeePerBlockP = value.rolloverFeePerBlockP;
}
if (value.fundingFeePerBlockP > 0 && value.fundingFeePerBlockP < 10_000_000) {
_storeAccFundingFees(pairIndex);
p.fundingFeePerBlockP = value.fundingFeePerBlockP;
}
if (value.onePercentDepthAbove > 0) {
p.onePercentDepthAbove = value.onePercentDepthAbove;
}
if (value.onePercentDepthBelow > 0) {
p.onePercentDepthBelow = value.onePercentDepthBelow;
}
emit PairParamsUpdated(pairIndex, value);
}
function _storeAccRolloverFees(uint pairIndex) private {
PairRolloverFees storage r = pairRolloverFees[pairIndex];
r.accPerCollateral = getPendingAccRolloverFees(pairIndex);
r.lastUpdateBlock = block.number;
emit AccRolloverFeesStored(pairIndex, r.accPerCollateral);
}
function _storeAccFundingFees(uint pairIndex) private {
PairFundingFees storage f = pairFundingFees[pairIndex];
(f.accPerOiLong, f.accPerOiShort) = getPendingAccFundingFees(pairIndex);
f.lastUpdateBlock = block.number;
emit AccFundingFeesStored(pairIndex, f.accPerOiLong, f.accPerOiShort);
}
function storeTradeInitialAccFees(uint256 orderId, uint256 pairIndex, bool long) external override onlyTrading {
TradeInitialAccFee storage t = tradeInitialAccFees[orderId];
t.rollover = getPendingAccRolloverFees(pairIndex);
// open trader affect openInterest should update funding fee before it
t.funding = long ? pairFundingFees[pairIndex].accPerOiLong : pairFundingFees[pairIndex].accPerOiShort;
}
function delTradeInitialAccFees(uint256 orderId) external onlyTrading {
delete tradeInitialAccFees[orderId];
}
function updateGroupCollateral(
uint _pairIndex,
uint _collateral,
bool _long,
bool _increase
) external override onlyTrading {
GroupsCollateral storage collateralOpen = groupsCollaterals[pairs[_pairIndex].groupIndex];
if (_increase) {
_long ? collateralOpen.long += _collateral : collateralOpen.short += _collateral;
} else {
_long ? collateralOpen.long -= _collateral : collateralOpen.short -= _collateral;
}
}
function updateOpenInterest(
uint _pairIndex,
uint _amount,
bool _long,
bool _increase
) external override onlyTrading {
_storeAccFundingFees(_pairIndex);
OpenInterest storage openInterest = openInterests[_pairIndex];
if (_increase) {
_long ? openInterest.long += _amount : openInterest.short += _amount;
} else {
_long ? openInterest.long -= _amount : openInterest.short -= _amount;
}
}
// Dynamic price impact value on trade opening
function getTradePriceImpact(
uint openPrice,
uint pairIndex,
bool long,
uint tradeOpenInterest
) external view override returns (uint priceAfterImpact) {
(uint256 depth, uint256 openInterest) = _getDepthAndOpenInterest(pairIndex, long);
if (depth == 0) {
return openPrice;
}
uint256 priceImpactP = ((openInterest + tradeOpenInterest / 2) * DENOMINATOR) / depth;
uint priceImpact = (priceImpactP * openPrice) / DENOMINATOR;
priceAfterImpact = long ? openPrice + priceImpact : openPrice - priceImpact;
}
function _getDepthAndOpenInterest(
uint256 pairIndex,
bool isLong
) internal view returns (uint256 depth, uint256 openInterest) {
if (isLong) {
depth = pairParams[pairIndex].onePercentDepthAbove;
openInterest = openInterests[pairIndex].long;
} else {
depth = pairParams[pairIndex].onePercentDepthBelow;
openInterest = openInterests[pairIndex].short;
}
}
function getFundingAndRolloverFee(
uint256 orderId,
uint256 pairIndex,
uint256 position,
bool long
) public view override returns (int256 fundingFee, uint256 rolloverFee) {
TradeInitialAccFee memory t = tradeInitialAccFees[orderId];
rolloverFee = ((getPendingAccRolloverFees(pairIndex) - t.rollover) * position) / DENOMINATOR;
(int pendingLong, int pendingShort) = getPendingAccFundingFees(pairIndex);
if (long) {
fundingFee = ((pendingLong - t.funding) * int(position)) / int(DENOMINATOR);
} else {
fundingFee = ((pendingShort - t.funding) * int(position)) / int(DENOMINATOR);
}
}
function getPendingAccRolloverFees(uint pairIndex) public view returns (uint) {
PairRolloverFees storage r = pairRolloverFees[pairIndex];
return r.accPerCollateral + (block.number - r.lastUpdateBlock) * pairParams[pairIndex].rolloverFeePerBlockP;
}
function getPendingAccFundingFees(uint pairIndex) public view returns (int valueLong, int valueShort) {
PairFundingFees storage f = pairFundingFees[pairIndex];
valueLong = f.accPerOiLong;
valueShort = f.accPerOiShort;
uint256 nio;
uint feesPaid;
uint256 long = openInterests[pairIndex].long;
uint256 short = openInterests[pairIndex].short;
uint256 countBlockNum = block.number - f.lastUpdateBlock;
uint256 fundingFeePerBlockP = pairParams[pairIndex].fundingFeePerBlockP;
if (long > short) {
nio = long - short;
feesPaid = countBlockNum * nio * fundingFeePerBlockP;
valueLong += toInt(feesPaid / long);
// fundingFee if not negative, as reward to the trader.
// but need discount if fundingRewardDiscount != 0
valueShort += short > 0 ? toInt(_discountFundingReward(feesPaid) / short) * (-1) : int(0);
} else {
nio = short - long;
feesPaid = countBlockNum * nio * fundingFeePerBlockP;
valueShort += short > 0 ? toInt(feesPaid / short) : int(0);
// fundingFee if not negative, as reward to the trader.
// but need discount if fundingRewardDiscount != 0
valueLong += long > 0 ? toInt(_discountFundingReward(feesPaid) / long) * (-1) : int(0);
}
}
function _discountFundingReward(uint256 feesPaid) private view returns (uint256) {
uint256 _fundingRewardDiscount = fundingRewardDiscount;
if (_fundingRewardDiscount != 0 && _fundingRewardDiscount <= MILLAGE_DENOMINATOR) {
return (feesPaid * _fundingRewardDiscount) / MILLAGE_DENOMINATOR;
} else {
return feesPaid;
}
}
//Liquidation Price Distance = Open Price * (Collateral * 0.9 - Rollover Fees - Funding Fees) / Collateral / Leverage.
function getTradeLiquidationPrice(
uint256 orderId,
uint pairIndex,
uint openPrice,
uint collateral,
uint leverage,
bool long
) external view override returns (uint) {
uint256 position = (collateral * leverage) / LEV_DENOMINATOR;
(int256 fundingFee, uint256 rolloverFee) = getFundingAndRolloverFee(orderId, pairIndex, position, long);
int residue = toInt((collateral * LIQ_THRESHOLD_P) / MILLAGE_DENOMINATOR) - fundingFee - int(rolloverFee);
int liqPriceDistance = (toInt(openPrice) * residue) / toInt(position);
int liquidationPrice;
if (long) {
liquidationPrice = toInt(openPrice) - liqPriceDistance;
} else {
liquidationPrice = toInt(openPrice) + liqPriceDistance;
}
return liquidationPrice > 0 ? uint256(liquidationPrice) : 0;
}
function isExceedGroupsCollateralLimit(
uint256 pairIndex,
uint256 collateral,
bool
) external view override returns (bool) {
uint256 groupIndex = pairs[pairIndex].groupIndex;
uint256 maxCollateralP = groups[groupIndex].maxCollateralP;
GroupsCollateral storage groupsCollateral = groupsCollaterals[groupIndex];
uint256 collateralTotal = groupsCollateral.long + groupsCollateral.short;
return collateralTotal + collateral > (maxCollateralP * vault.currentBalance()) / MILLAGE_DENOMINATOR;
}
function isInPairInterestLimit(uint pairIndex, uint256 position, bool isLong) external view returns (bool) {
OpenInterest storage o = openInterests[pairIndex];
InterestLimt storage i = interestLimts[pairIndex];
uint256 long = o.long;
uint256 short = o.short;
if (isLong) {
long += position;
uint256 noi = getNetOI(long, short);
return (long < i.maxOI) && (noi <= i.maxNetOI);
} else {
short += position;
uint256 noi = getNetOI(long, short);
return (short < i.maxOI) && (noi <= i.maxNetOI);
}
}
function legalPositionSizeAndLeverage(
uint256 pairIndex,
uint256 margin,
uint256 leverage
) external view override returns (bool) {
Pair storage p = pairs[pairIndex];
uint256 minLeverage = p.minLeverage;
uint256 maxLeverage = p.maxLeverage;
uint256 min = p.minLevPos;
uint256 max = p.maxLevPos;
uint256 minMagin = p.minMagin;
uint256 position = (margin * leverage) / LEV_DENOMINATOR;
return
leverage >= minLeverage &&
leverage <= maxLeverage &&
margin >= minMagin &&
position >= min &&
position <= max;
}
function withinMaxSpread(
uint256 pairIndex,
TradeType tradeType,
uint256 limit,
uint256 current,
bool isLong
) external view override returns (bool result) {
Pair memory _pair = pairs[pairIndex];
if (tradeType == TradeType.LIMIT) {
if (isLong) {
// must current <= limit
return ((limit - current) * MILLAGE_DENOMINATOR) / limit <= _pair.maxSpread;
} else {
// must limit <= current
return ((current - limit) * MILLAGE_DENOMINATOR) / limit <= _pair.maxSpread;
}
} else if (tradeType == TradeType.STOP) {
if (isLong) {
// must limit <= current
return ((current - limit) * MILLAGE_DENOMINATOR) / limit <= _pair.maxSpread;
} else {
// must current <= limit
return ((limit - current) * MILLAGE_DENOMINATOR) / limit <= _pair.maxSpread;
}
} else {
return true;
}
}
function pairFeedId(uint _pairIndex) external view override returns (bytes32) {
return pairs[_pairIndex].feedId;
}
function pairSpreadP(uint _pairIndex) external view override returns (uint) {
return pairs[_pairIndex].spreadP;
}
function pairOpenFeeP(uint _pairIndex) external view override returns (uint) {
return fees[pairs[_pairIndex].feeIndex].openFeeP;
}
function pairCloseFeeP(uint _pairIndex) external view override returns (uint) {
return fees[pairs[_pairIndex].feeIndex].closeFeeP;
}
function priceRollover(uint _pairIndex) external view override returns (bool) {
return pairs[_pairIndex].priceRollover;
}
function guaranteedSlAndTPEnable(uint _pairIndex) external view override returns (bool) {
return groups[pairs[_pairIndex].groupIndex].guaranteedSlAndTPEnable;
}
function occupiedCollateral() external view override returns (uint256) {
uint256 max;
for (uint256 i = 0; i < groupsCount; ) {
GroupsCollateral memory groupsCollateral = groupsCollaterals[i];
Group memory group = groups[i];
uint256 totalCollateral = groupsCollateral.long + groupsCollateral.short;
if (group.maxCollateralP != 0) {
uint256 occupied = (totalCollateral * MILLAGE_DENOMINATOR) / group.maxCollateralP;
if (occupied > max) {
max = occupied;
}
}
unchecked {
i++;
}
}
return max;
}
function getNetOI(uint256 long, uint256 short) internal pure returns (uint netOI) {
if (long > short) {
unchecked {
netOI = long - short;
}
} else {
unchecked {
netOI = short - long;
}
}
}
function toInt(uint256 v) private pure returns (int) {
require(v <= uint256(type(int256).max), "overflow");
return int(v);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)
pragma solidity ^0.8.0;
import "./OwnableUpgradeable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Contract module which provides access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership} and {acceptOwnership}.
*
* This module is used through inheritance. It will make available all functions
* from parent (Ownable).
*/
abstract contract Ownable2StepUpgradeable is Initializable, OwnableUpgradeable {
function __Ownable2Step_init() internal onlyInitializing {
__Ownable_init_unchained();
}
function __Ownable2Step_init_unchained() internal onlyInitializing {
}
address private _pendingOwner;
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
/**
* @dev Returns the address of the pending owner.
*/
function pendingOwner() public view virtual returns (address) {
return _pendingOwner;
}
/**
* @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual override onlyOwner {
_pendingOwner = newOwner;
emit OwnershipTransferStarted(owner(), newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual override {
delete _pendingOwner;
super._transferOwnership(newOwner);
}
/**
* @dev The new owner accepts the ownership transfer.
*/
function acceptOwnership() public virtual {
address sender = _msgSender();
require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner");
_transferOwnership(sender);
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[49] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
function __Ownable_init() internal onlyInitializing {
__Ownable_init_unchained();
}
function __Ownable_init_unchained() internal onlyInitializing {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[49] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.2;
import "../../utils/AddressUpgradeable.sol";
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
* case an upgrade adds a module that needs to be initialized.
*
* For example:
*
* [.hljs-theme-light.nopadding]
* ```solidity
* contract MyToken is ERC20Upgradeable {
* function initialize() initializer public {
* __ERC20_init("MyToken", "MTK");
* }
* }
*
* contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
* the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() {
* _disableInitializers();
* }
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
* @custom:oz-retyped-from bool
*/
uint8 private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Triggered when the contract has been initialized or reinitialized.
*/
event Initialized(uint8 version);
/**
* @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
* `onlyInitializing` functions can be used to initialize parent contracts.
*
* Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a
* constructor.
*
* Emits an {Initialized} event.
*/
modifier initializer() {
bool isTopLevelCall = !_initializing;
require(
(isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),
"Initializable: contract is already initialized"
);
_initialized = 1;
if (isTopLevelCall) {
_initializing = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
emit Initialized(1);
}
}
/**
* @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
* contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
* used to initialize parent contracts.
*
* A reinitializer may be used after the original initialization step. This is essential to configure modules that
* are added through upgrades and that require initialization.
*
* When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
* cannot be nested. If one is invoked in the context of another, execution will revert.
*
* Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
* a contract, executing them in the right order is up to the developer or operator.
*
* WARNING: setting the version to 255 will prevent any future reinitialization.
*
* Emits an {Initialized} event.
*/
modifier reinitializer(uint8 version) {
require(!_initializing && _initialized < version, "Initializable: contract is already initialized");
_initialized = version;
_initializing = true;
_;
_initializing = false;
emit Initialized(version);
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} and {reinitializer} modifiers, directly or indirectly.
*/
modifier onlyInitializing() {
require(_initializing, "Initializable: contract is not initializing");
_;
}
/**
* @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
* Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
* to any version. It is recommended to use this to lock implementation contracts that are designed to be called
* through proxies.
*
* Emits an {Initialized} event the first time it is successfully executed.
*/
function _disableInitializers() internal virtual {
require(!_initializing, "Initializable: contract is initializing");
if (_initialized != type(uint8).max) {
_initialized = type(uint8).max;
emit Initialized(type(uint8).max);
}
}
/**
* @dev Returns the highest version that has been initialized. See {reinitializer}.
*/
function _getInitializedVersion() internal view returns (uint8) {
return _initialized;
}
/**
* @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.
*/
function _isInitializing() internal view returns (bool) {
return _initializing;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
import "../proxy/utils/Initializable.sol";
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
}
function __Context_init_unchained() internal onlyInitializing {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
import {TradeType} from "../libs/Types.sol";
interface IPairInfos {
function pairFeedId(uint _pairIndex) external view returns (bytes32);
function withinMaxSpread(
uint256 pairIndex,
TradeType tradeType,
uint256 limit,
uint256 current,
bool isLong
) external view returns (bool result);
function isExceedGroupsCollateralLimit(uint256 pairIndex, uint256 position, bool long) external view returns (bool);
function isInPairInterestLimit(uint pairIndex, uint256 position, bool isLong) external view returns (bool);
function legalPositionSizeAndLeverage(
uint256 pairIndex,
uint256 margin,
uint256 leverage
) external view returns (bool);
function pairSpreadP(uint _pairIndex) external view returns (uint);
function pairOpenFeeP(uint _pairIndex) external view returns (uint);
function pairCloseFeeP(uint _pairIndex) external view returns (uint);
function priceRollover(uint _pairIndex) external view returns (bool);
function guaranteedSlAndTPEnable(uint _pairIndex) external view returns (bool);
function occupiedCollateral() external view returns (uint256);
function getTradePriceImpact(
uint openPrice,
uint pairIndex,
bool long,
uint tradeOpenInterest
) external view returns (uint priceAfterImpact);
function updateGroupCollateral(uint _pairIndex, uint _amount, bool _long, bool _increase) external;
function updateOpenInterest(uint _pairIndex, uint _amount, bool _long, bool _increase) external;
function storeTradeInitialAccFees(uint256 orderId, uint256 pairIndex, bool long) external;
function delTradeInitialAccFees(uint256 orderId) external;
function getFundingAndRolloverFee(
uint256 orderId,
uint256 pairIndex,
uint256 position,
bool long
) external view returns (int256 fundingFee, uint256 rolloverFee);
function getTradeLiquidationPrice(
uint256 orderId,
uint pairIndex,
uint openPrice,
uint collateral,
uint leverage,
bool long
) external view returns (uint);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
import {TradeBase, OpenTrade, OpenRequest, CloseRequest} from "../libs/Types.sol";
interface ITradingStorage {
function storeOpenTrade(uint256 orderId, OpenTrade memory _openTrade) external;
function delOpenTrade(uint256 orderId) external;
function updateOpentrade(uint256 orderId, uint256 margin, uint256 tp, uint256 sl, bool isClose) external;
function storeOpenRequst(uint256 _orderId, OpenRequest memory _request) external;
function delOpenRequst(uint256 _orderId) external;
function updateOpenRequst(uint256 orderId, uint256 _max, uint256 _min, uint256 _tp, uint256 _sl) external;
function storeCloseRequst(uint256 _orderId, CloseRequest memory _request) external returns (uint256 index);
function doneCloseRequst(uint256 _orderId, uint256 index, bool exec) external;
function delClose(uint256 orderId) external;
function getOpenTrade(uint256 orderId) external view returns (OpenTrade memory);
function getOpenRequest(uint256 orderId) external view returns (OpenRequest memory);
function getCloseRequest(uint256 orderId, uint256 index) external view returns (CloseRequest memory);
function getCloseRequstAmount(uint256 orderId) external view returns (uint256);
function transferTo(address token, address to, uint256 amount) external;
function trading() external view returns (address);
function pool() external view returns (address);
function vault() external view returns (address);
function pairInfo() external view returns (address);
function oracle() external view returns (address);
function feeHelper() external view returns (address);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
interface IVault {
function distributeReward(uint _amount, bool _send) external;
function currentBalance() external view returns (uint);
function sendToTrader(address _trader, uint _amount) external;
function receiveFromTrader(address _trader, uint _amount, uint _vaultFee, bool _send) external;
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;
enum CloseType {
INITIATIVE,
LQI,
TP,
SL
}
enum TradeType {
MARKET,
LIMIT,
STOP
}
struct TradeBase {
address trader;
uint256 pairIndex;
uint256 margin;
bool long;
uint leverage; // x10?
uint tp;
uint sl;
}
struct OpenTrade {
TradeBase base;
uint256 openPrice; // x10**18
uint256 lastUpdateTime;
}
struct OpenRequest {
TradeType tradeType;
TradeBase base;
address callTarget;
uint256 maxPrice; // x10**18
uint256 minPrice; // x10**18
uint256 time;
}
struct CloseRequest {
uint256 closeMargin;
address callTarget;
uint256 time;
bool isDone;
}
struct Close {
uint256 requestAmount;
CloseRequest[] requests;
}// SPDX-License-Identifier: MIT pragma solidity 0.8.15; uint256 constant DENOMINATOR = 10 ** 10; uint256 constant LEV_DENOMINATOR = 10 ** 18; // leverage 10**18 -> 1 uint256 constant MILLAGE_DENOMINATOR = 1000; uint256 constant FEE_DENOMINATOR = 100000; uint256 constant LIQ_THRESHOLD_P = 900; // 90% uint256 constant MIN_LEVERAGE = 1 * 10 ** 17; uint256 constant MAX_LEVERAGE = 100 * 10 ** 18; uint256 constant MAX_GAIN = 9; //900%
{
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": [],
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"int256","name":"valueLong","type":"int256"},{"indexed":false,"internalType":"int256","name":"valueShort","type":"int256"}],"name":"AccFundingFeesStored","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"AccRolloverFeesStored","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"FeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"FeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"GroupAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"GroupUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"string","name":"pairName","type":"string"}],"name":"PairAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"components":[{"internalType":"uint256","name":"onePercentDepthAbove","type":"uint256"},{"internalType":"uint256","name":"onePercentDepthBelow","type":"uint256"},{"internalType":"uint256","name":"rolloverFeePerBlockP","type":"uint256"},{"internalType":"uint256","name":"fundingFeePerBlockP","type":"uint256"}],"indexed":false,"internalType":"struct PairInfos.PairParams","name":"value","type":"tuple"}],"name":"PairParamsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"}],"name":"PairUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_fundingFeeRewardDiscount","type":"uint256"}],"name":"SetFundingRewardDiscount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pairIndex","type":"uint256"},{"components":[{"internalType":"uint256","name":"maxOI","type":"uint256"},{"internalType":"uint256","name":"maxNetOI","type":"uint256"}],"indexed":false,"internalType":"struct PairInfos.InterestLimt","name":"_limit","type":"tuple"}],"name":"SetInterestLimt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_keeper","type":"address"}],"name":"SetKeeper","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_trading","type":"address"},{"indexed":false,"internalType":"bool","name":"_flag","type":"bool"}],"name":"SetTrading","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract IVault","name":"_vault","type":"address"}],"name":"SetVault","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"openFeeP","type":"uint256"},{"internalType":"uint256","name":"closeFeeP","type":"uint256"}],"internalType":"struct PairInfos.Fee","name":"_fee","type":"tuple"}],"name":"addFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"bool","name":"guaranteedSlAndTPEnable","type":"bool"},{"internalType":"uint256","name":"maxCollateralP","type":"uint256"}],"internalType":"struct PairInfos.Group","name":"_group","type":"tuple"}],"name":"addGroup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"pairName","type":"string"},{"internalType":"bytes32","name":"feedId","type":"bytes32"},{"internalType":"uint256","name":"spreadP","type":"uint256"},{"internalType":"uint256","name":"feeIndex","type":"uint256"},{"internalType":"uint256","name":"groupIndex","type":"uint256"},{"internalType":"uint256","name":"maxSpread","type":"uint256"},{"internalType":"uint256","name":"minLeverage","type":"uint256"},{"internalType":"uint256","name":"maxLeverage","type":"uint256"},{"internalType":"uint256","name":"minMagin","type":"uint256"},{"internalType":"uint256","name":"minLevPos","type":"uint256"},{"internalType":"uint256","name":"maxLevPos","type":"uint256"},{"internalType":"bool","name":"priceRollover","type":"bool"}],"internalType":"struct PairInfos.Pair[]","name":"_pairs","type":"tuple[]"}],"name":"addPairs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"orderId","type":"uint256"}],"name":"delTradeInitialAccFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"fees","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"openFeeP","type":"uint256"},{"internalType":"uint256","name":"closeFeeP","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundingRewardDiscount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"orderId","type":"uint256"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"position","type":"uint256"},{"internalType":"bool","name":"long","type":"bool"}],"name":"getFundingAndRolloverFee","outputs":[{"internalType":"int256","name":"fundingFee","type":"int256"},{"internalType":"uint256","name":"rolloverFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairIndex","type":"uint256"}],"name":"getPendingAccFundingFees","outputs":[{"internalType":"int256","name":"valueLong","type":"int256"},{"internalType":"int256","name":"valueShort","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairIndex","type":"uint256"}],"name":"getPendingAccRolloverFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"orderId","type":"uint256"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"openPrice","type":"uint256"},{"internalType":"uint256","name":"collateral","type":"uint256"},{"internalType":"uint256","name":"leverage","type":"uint256"},{"internalType":"bool","name":"long","type":"bool"}],"name":"getTradeLiquidationPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"openPrice","type":"uint256"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"bool","name":"long","type":"bool"},{"internalType":"uint256","name":"tradeOpenInterest","type":"uint256"}],"name":"getTradePriceImpact","outputs":[{"internalType":"uint256","name":"priceAfterImpact","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"groups","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"bool","name":"guaranteedSlAndTPEnable","type":"bool"},{"internalType":"uint256","name":"maxCollateralP","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"groupsCollaterals","outputs":[{"internalType":"uint256","name":"long","type":"uint256"},{"internalType":"uint256","name":"short","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"groupsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pairIndex","type":"uint256"}],"name":"guaranteedSlAndTPEnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"interestLimts","outputs":[{"internalType":"uint256","name":"maxOI","type":"uint256"},{"internalType":"uint256","name":"maxNetOI","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"collateral","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"name":"isExceedGroupsCollateralLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"position","type":"uint256"},{"internalType":"bool","name":"isLong","type":"bool"}],"name":"isInPairInterestLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"isPairListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"uint256","name":"margin","type":"uint256"},{"internalType":"uint256","name":"leverage","type":"uint256"}],"name":"legalPositionSizeAndLeverage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"occupiedCollateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"openInterests","outputs":[{"internalType":"uint256","name":"long","type":"uint256"},{"internalType":"uint256","name":"short","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pairIndex","type":"uint256"}],"name":"pairCloseFeeP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pairIndex","type":"uint256"}],"name":"pairFeedId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pairFundingFees","outputs":[{"internalType":"int256","name":"accPerOiLong","type":"int256"},{"internalType":"int256","name":"accPerOiShort","type":"int256"},{"internalType":"uint256","name":"lastUpdateBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pairIndex","type":"uint256"}],"name":"pairOpenFeeP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pairParams","outputs":[{"internalType":"uint256","name":"onePercentDepthAbove","type":"uint256"},{"internalType":"uint256","name":"onePercentDepthBelow","type":"uint256"},{"internalType":"uint256","name":"rolloverFeePerBlockP","type":"uint256"},{"internalType":"uint256","name":"fundingFeePerBlockP","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pairRolloverFees","outputs":[{"internalType":"uint256","name":"accPerCollateral","type":"uint256"},{"internalType":"uint256","name":"lastUpdateBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pairIndex","type":"uint256"}],"name":"pairSpreadP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pairs","outputs":[{"internalType":"string","name":"pairName","type":"string"},{"internalType":"bytes32","name":"feedId","type":"bytes32"},{"internalType":"uint256","name":"spreadP","type":"uint256"},{"internalType":"uint256","name":"feeIndex","type":"uint256"},{"internalType":"uint256","name":"groupIndex","type":"uint256"},{"internalType":"uint256","name":"maxSpread","type":"uint256"},{"internalType":"uint256","name":"minLeverage","type":"uint256"},{"internalType":"uint256","name":"maxLeverage","type":"uint256"},{"internalType":"uint256","name":"minMagin","type":"uint256"},{"internalType":"uint256","name":"minLevPos","type":"uint256"},{"internalType":"uint256","name":"maxLevPos","type":"uint256"},{"internalType":"bool","name":"priceRollover","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pairsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pairIndex","type":"uint256"}],"name":"priceRollover","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fundingRewardDiscount","type":"uint256"}],"name":"setFundingRewardDiscount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"components":[{"internalType":"uint256","name":"maxOI","type":"uint256"},{"internalType":"uint256","name":"maxNetOI","type":"uint256"}],"internalType":"struct PairInfos.InterestLimt","name":"_limit","type":"tuple"}],"name":"setInterestLimt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"indices","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"onePercentDepthAbove","type":"uint256"},{"internalType":"uint256","name":"onePercentDepthBelow","type":"uint256"},{"internalType":"uint256","name":"rolloverFeePerBlockP","type":"uint256"},{"internalType":"uint256","name":"fundingFeePerBlockP","type":"uint256"}],"internalType":"struct PairInfos.PairParams[]","name":"values","type":"tuple[]"}],"name":"setPairParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_trading","type":"address"},{"internalType":"bool","name":"_flag","type":"bool"}],"name":"setTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IVault","name":"_vault","type":"address"}],"name":"setVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"orderId","type":"uint256"},{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"bool","name":"long","type":"bool"}],"name":"storeTradeInitialAccFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tradeInitialAccFees","outputs":[{"internalType":"uint256","name":"rollover","type":"uint256"},{"internalType":"int256","name":"funding","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tradings","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"openFeeP","type":"uint256"},{"internalType":"uint256","name":"closeFeeP","type":"uint256"}],"internalType":"struct PairInfos.Fee","name":"_fee","type":"tuple"}],"name":"updateFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"bool","name":"guaranteedSlAndTPEnable","type":"bool"},{"internalType":"uint256","name":"maxCollateralP","type":"uint256"}],"internalType":"struct PairInfos.Group","name":"_group","type":"tuple"}],"name":"updateGroup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pairIndex","type":"uint256"},{"internalType":"uint256","name":"_collateral","type":"uint256"},{"internalType":"bool","name":"_long","type":"bool"},{"internalType":"bool","name":"_increase","type":"bool"}],"name":"updateGroupCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pairIndex","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_long","type":"bool"},{"internalType":"bool","name":"_increase","type":"bool"}],"name":"updateOpenInterest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pairIndex","type":"uint256"},{"components":[{"internalType":"string","name":"pairName","type":"string"},{"internalType":"bytes32","name":"feedId","type":"bytes32"},{"internalType":"uint256","name":"spreadP","type":"uint256"},{"internalType":"uint256","name":"feeIndex","type":"uint256"},{"internalType":"uint256","name":"groupIndex","type":"uint256"},{"internalType":"uint256","name":"maxSpread","type":"uint256"},{"internalType":"uint256","name":"minLeverage","type":"uint256"},{"internalType":"uint256","name":"maxLeverage","type":"uint256"},{"internalType":"uint256","name":"minMagin","type":"uint256"},{"internalType":"uint256","name":"minLevPos","type":"uint256"},{"internalType":"uint256","name":"maxLevPos","type":"uint256"},{"internalType":"bool","name":"priceRollover","type":"bool"}],"internalType":"struct PairInfos.Pair","name":"_pair","type":"tuple"}],"name":"updatePair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"contract IVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pairIndex","type":"uint256"},{"internalType":"enum TradeType","name":"tradeType","type":"uint8"},{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"uint256","name":"current","type":"uint256"},{"internalType":"bool","name":"isLong","type":"bool"}],"name":"withinMaxSpread","outputs":[{"internalType":"bool","name":"result","type":"bool"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b506200001c62000022565b620000e3565b600054610100900460ff16156200008f5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff90811614620000e1576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6138df80620000f36000396000f3fe608060405234801561001057600080fd5b50600436106103775760003560e01c8063836a341a116101d3578063bf1db1f611610104578063e30c3978116100a2578063ecb9d95e1161007c578063ecb9d95e1461092d578063f2fde38b14610940578063fbfa77cf14610953578063fcc37c871461096657600080fd5b8063e30c3978146108f6578063ebca8c0514610907578063ec8b6fa11461091a57600080fd5b8063c6057186116100de578063c60571861461085f578063d3ee3d8814610886578063d7354478146108ad578063db377f42146108c057600080fd5b8063bf1db1f614610812578063bfe2b01c14610839578063c4d66de81461084c57600080fd5b8063a1d54e9b11610171578063aced16611161014b578063aced1661146107b8578063b81b2b71146107cb578063b8d040e4146107d4578063b91ac788146107e757600080fd5b8063a1d54e9b1461076f578063a833064514610792578063ab21a05c146107a557600080fd5b8063914e07da116101ad578063914e07da146106c957806392a67c19146106f057806396324bd4146107035780639cf9c9391461072557600080fd5b8063836a341a14610668578063885e27501461069b5780638da5cb5b146106a457600080fd5b80636ada93dd116102ad578063748747e61161024b5780637ca7c690116102255780637ca7c690146105e95780637ea95f32146105fc5780638251135b1461060f578063835907711461064257600080fd5b8063748747e6146105ab57806378999f76146105be57806379ba5097146105e157600080fd5b80636dd5d23b116102875780636dd5d23b14610541578063713040631461057d578063715018a6146105905780637325d7111461059857600080fd5b80636ada93dd146104ed5780636ce0e751146105005780636d3c666e1461052e57600080fd5b8063369dd0b11161031a5780634d314ffb116102f45780634d314ffb146104b557806362c57c9a146104c8578063658de48a146104d15780636817031b146104da57600080fd5b8063369dd0b11461041b57806342dee1ad1461043e5780634acc79ed1461049357600080fd5b806315edff631161035657806315edff63146103cf57806320f0fc5e146103e25780632fb3d704146103f55780633459202a1461040857600080fd5b8062e9f38b1461037c578063087f9188146103b25780630e01809c146103c7575b600080fd5b61039f61038a366004612a27565b6000908152609c602052604090206001015490565b6040519081526020015b60405180910390f35b6103c56103c0366004612a52565b610979565b005b61039f610a69565b6103c56103dd366004612a27565b610bc7565b6103c56103f0366004612a95565b610c46565b6103c5610403366004612b24565b610d26565b6103c5610416366004612bd3565b610e08565b61042e610429366004612c0c565b610e9c565b60405190151581526020016103a9565b61047361044c366004612a27565b60a16020526000908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016103a9565b6104a66104a1366004612a27565b610f85565b6040516103a993929190612c92565b6103c56104c3366004612cb7565b61102f565b61039f60a85481565b61039f609f5481565b6103c56104e8366004612cfb565b6113c7565b6103c56104fb366004612c0c565b611444565b61042e61050e366004612d2e565b805160208183018101805160a08252928201919093012091525460ff1681565b61039f61053c366004612ddf565b6114c3565b61056861054f366004612a27565b60a5602052600090815260409020805460019091015482565b604080519283526020830191909152016103a9565b6103c561058b366004612a52565b6115bb565b6103c561166f565b6105686105a6366004612e34565b611683565b6103c56105b9366004612cfb565b611764565b61042e6105cc366004612cfb565b60996020526000908152604090205460ff1681565b6103c56117e1565b6103c56105f7366004612e6a565b61185b565b61039f61060a366004612ea2565b6118c0565b61039f61061d366004612a27565b6000908152609c60209081526040808320600301548352609b90915290206001015490565b61042e610650366004612a27565b6000908152609c60205260409020600b015460ff1690565b61039f610676366004612a27565b6000908152609c60209081526040808320600301548352609b90915290206002015490565b61039f609e5481565b6033546001600160a01b03165b6040516001600160a01b0390911681526020016103a9565b6105686106d7366004612a27565b60a6602052600090815260409020805460019091015482565b6103c56106fe366004612ee1565b611964565b610716610711366004612a27565b611a4f565b6040516103a993929190612f28565b610754610733366004612a27565b60a26020526000908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016103a9565b61039f61077d366004612a27565b6000908152609c602052604090206002015490565b61042e6107a0366004612f4d565b611afd565b61039f6107b3366004612a27565b611b87565b6097546106b1906001600160a01b031681565b61039f609d5481565b6103c56107e2366004612a27565b611bc8565b6107fa6107f5366004612a27565b611c0e565b6040516103a99c9b9a99989796959493929190612f79565b610568610820366004612a27565b60a3602052600090815260409020805460019091015482565b61042e610847366004612fe4565b611cfb565b6103c561085a366004612cfb565b611eda565b61056861086d366004612a27565b60a4602052600090815260409020805460019091015482565b610568610894366004612a27565b60a7602052600090815260409020805460019091015482565b6103c56108bb366004612a95565b612011565b61042e6108ce366004612a27565b6000908152609c60209081526040808320600401548352609a90915290206001015460ff1690565b6065546001600160a01b03166106b1565b6103c561091536600461303e565b612076565b61042e610928366004612c0c565b6120bd565b6103c561093b366004612ee1565b612157565b6103c561094e366004612cfb565b612252565b6098546106b1906001600160a01b031681565b610568610974366004612a27565b6122c3565b610981612421565b806103e8816020013510801561099c57506103e88160400135105b80156109b257506109ad8180613080565b151590505b6109f05760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f4645455360b01b60448201526064015b60405180910390fd5b609f546000908152609b602052604090208290610a0d8282613210565b5050609f80547f482049823c85e038e099fe4f2b901487c4800def71c9a3f5bae2de8381ec54f6916000610a4083613300565b90915550610a4e8480613080565b604051610a5d93929190613319565b60405180910390a15050565b60008060005b609e54811015610bc157600081815260a560209081526040808320815180830183528154815260019091015481840152848452609a909252808320815160608101909252805492939282908290610ac5906130c7565b80601f0160208091040260200160405190810160405280929190818152602001828054610af1906130c7565b8015610b3e5780601f10610b1357610100808354040283529160200191610b3e565b820191906000526020600020905b815481529060010190602001808311610b2157829003601f168201915b5050509183525050600182015460ff1615156020808301919091526002909201546040909101528301518351919250600091610b7a919061334f565b90508160400151600014610bb6576040820151600090610b9c6103e884613367565b610ba6919061339c565b905085811115610bb4578095505b505b505050600101610a6f565b50919050565b610bcf612421565b6103e8811115610c0b5760405162461bcd60e51b8152602060048201526007602482015266544f4f5f42494760c81b60448201526064016109e7565b60a88190556040518181527f1d3ab14658b38d0f95f3cf64837ec69850b67631073f7ac97c8107839c7883f59060200160405180910390a150565b3360009081526099602052604090205460ff16610c755760405162461bcd60e51b81526004016109e7906133b0565b6000848152609c6020908152604080832060040154835260a590915290208115610cde5782610cbd5783816001016000828254610cb2919061334f565b925050819055610cd8565b83816000016000828254610cd1919061334f565b9250508190555b50610d1f565b82610d025783816001016000828254610cf791906133d6565b925050819055610d1d565b83816000016000828254610d1691906133d6565b9250508190555b505b5050505050565b6097546001600160a01b03163314610d6e5760405162461bcd60e51b815260206004820152600b60248201526a37b7363c9035b2b2b832b960a91b60448201526064016109e7565b828114610dac5760405162461bcd60e51b815260206004820152600c60248201526b0aea49e9c8ebe988a9c8ea8960a31b60448201526064016109e7565b60005b83811015610d1f57610e00858583818110610dcc57610dcc6133e8565b90506020020135848484818110610de557610de56133e8565b905060800201803603810190610dfb91906133fe565b61247b565b600101610daf565b610e10612421565b816001600160a01b038116610e375760405162461bcd60e51b81526004016109e790613464565b6001600160a01b038316600081815260996020908152604091829020805460ff19168615159081179091558251938452908301527f671298d545527a25b744efd60bff038370b275ff9ed023ab90fc0b17bdb6062b91015b60405180910390a1505050565b6000838152609c6020908152604080832060040154808452609a83528184206002015460a5909352908320600181015481549293928591610edc9161334f565b90506103e8609860009054906101000a90046001600160a01b03166001600160a01b031663ce845d1d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f589190613487565b610f629085613367565b610f6c919061339c565b610f76888361334f565b119450505050505b9392505050565b609b60205260009081526040902080548190610fa0906130c7565b80601f0160208091040260200160405190810160405280929190818152602001828054610fcc906130c7565b80156110195780601f10610fee57610100808354040283529160200191611019565b820191906000526020600020905b815481529060010190602001808311610ffc57829003601f168201915b5050505050908060010154908060020154905083565b611037612421565b60808101356000818152609a6020526040812060020154900361106c5760405162461bcd60e51b81526004016109e7906134a0565b60608201356000818152609b60205260409020805461108a906130c7565b90506000036110ab5760405162461bcd60e51b81526004016109e7906134ca565b6000848152609c602052604090819020905160a0906110cb9083906134f2565b9081526040519081900360200190205460ff1661111c5760405162461bcd60e51b815260206004820152600f60248201526e1410525497d393d517d31254d51151608a1b60448201526064016109e7565b60a06111288580613080565b604051611136929190613568565b9081526040519081900360200190205460ff161561118a5760405162461bcd60e51b81526020600482015260116024820152701390535157d053149150511657d554d151607a1b60448201526064016109e7565b600060a08260000160405161119f91906134f2565b908152604051908190036020019020805491151560ff199092169190911790556111c98480613080565b82916111d6919083613156565b50600160a06111e58680613080565b6040516111f3929190613568565b90815260405160209181900382019020805460ff1916921515929092179091558401351561122657602084013560018201555b60408401351561123b57604084013560028201555b610100840135156112525761010084013560088201555b60008460a0013511801561126b57506103e88460a00135105b1561127b5760a084013560058201555b60008460c0013511801561129657508360c001358460e00135115b1561131a5767016345785d8a00008460c00135101580156112c4575068056bc75e2d631000008460e0013511155b6113055760405162461bcd60e51b8152602060048201526012602482015271736574204c657665726167652077726f6e6760701b60448201526064016109e7565b60e0840135600782015560c084013560068201555b60008461012001351180156113385750836101200135846101400135115b15611354576101208401356009820155610140840135600a8201555b606084013560038201556080840135600482015561137a61018085016101608601613578565b600b8201805460ff19169115159190911790556040518581527f123a1b961ae93e7acda9790b318237b175b45ac09277cd3614305d8baa3f19539060200160405180910390a15050505050565b6113cf612421565b806001600160a01b0381166113f65760405162461bcd60e51b81526004016109e790613464565b609880546001600160a01b0319166001600160a01b0384169081179091556040519081527fd459c7242e23d490831b5676a611c4342d899d28f342d89ae80793e56a930f3090602001610a5d565b3360009081526099602052604090205460ff166114735760405162461bcd60e51b81526004016109e7906133b0565b600083815260a46020526040902061148a83611b87565b8155816114a857600083815260a260205260409020600101546114b8565b600083815260a260205260409020545b600190910155505050565b600080670de0b6b3a76400006114d98587613367565b6114e3919061339c565b90506000806114f48a8a8588611683565b90925090506000818361151e6103e861150f6103848d613367565b611519919061339c565b612569565b6115289190613595565b6115329190613595565b9050600061153f85612569565b826115498c612569565b61155391906135d4565b61155d9190613659565b90506000871561158257816115718c612569565b61157b9190613595565b9050611599565b8161158c8c612569565b6115969190613687565b90505b600081136115a85760006115aa565b805b9d9c50505050505050505050505050565b6115c3612421565b806103e881604001351080156115dc5750604081013515155b61161f5760405162461bcd60e51b81526020600482015260146024820152736d6178436f6c6c61746572616c502077726f6e6760601b60448201526064016109e7565b609e546000908152609a60205260409020829061163c82826136d5565b5050609e80547faf17de8e82beccc440012117a600dc37e26925225d0f1ee192fc107eb3dcbca4916000610a4083613300565b611677612421565b61168160006125b1565b565b600084815260a460209081526040808320815180830190925280548083526001909101549282019290925282916402540be4009086906116c289611b87565b6116cc91906133d6565b6116d69190613367565b6116e0919061339c565b91506000806116ee886122c3565b91509150851561172a576402540be4008784602001518461170f9190613595565b61171991906135d4565b6117239190613659565b9450611758565b6402540be400878460200151836117419190613595565b61174b91906135d4565b6117559190613659565b94505b50505094509492505050565b61176c612421565b806001600160a01b0381166117935760405162461bcd60e51b81526004016109e790613464565b609780546001600160a01b0319166001600160a01b0384169081179091556040519081527fefb5cfa1a8690c124332ab93324539c5c9c4be03f28aeb8be86f2d8a0c9fb99b90602001610a5d565b60655433906001600160a01b0316811461184f5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016109e7565b611858816125b1565b50565b611863612421565b600082815260a760209081526040918290208335808255848301356001909201829055835186815292830152918101919091527ff8031435e646b2320b8e9c9cf327090aa48ac29616cb5692b52e1f02ebcb667b90606001610a5d565b60008060006118cf86866125ca565b91509150816000036118e557869250505061195c565b6000826402540be4006118f960028861339c565b611903908561334f565b61190d9190613367565b611917919061339c565b905060006402540be40061192b8a84613367565b611935919061339c565b90508661194b57611946818a6133d6565b611955565b611955818a61334f565b9450505050505b949350505050565b61196c612421565b6000828152609a602052604081206002015483910361199d5760405162461bcd60e51b81526004016109e7906134a0565b816103e881604001351080156119b65750604081013515155b6119f95760405162461bcd60e51b81526020600482015260146024820152736d6178436f6c6c61746572616c502077726f6e6760601b60448201526064016109e7565b6000848152609a602052604090208390611a1382826136d5565b50506040518481527fcfde8f228364c70f12cbbac5a88fc91ceca76dd750ac93364991a333b34afb8e906020015b60405180910390a150505050565b609a60205260009081526040902080548190611a6a906130c7565b80601f0160208091040260200160405190810160405280929190818152602001828054611a96906130c7565b8015611ae35780601f10611ab857610100808354040283529160200191611ae3565b820191906000526020600020905b815481529060010190602001808311611ac657829003601f168201915b505050506001830154600290930154919260ff1691905083565b6000838152609c60205260408120600681015460078201546009830154600a840154600885015486670de0b6b3a7640000611b388a8c613367565b611b42919061339c565b9050858910158015611b545750848911155b8015611b605750818a10155b8015611b6c5750838110155b8015611b785750828111155b9b9a5050505050505050505050565b600081815260a36020908152604080832060a19092528220600201546001820154611bb290436133d6565b611bbc9190613367565b8154610f7e919061334f565b3360009081526099602052604090205460ff16611bf75760405162461bcd60e51b81526004016109e7906133b0565b600090815260a46020526040812081815560010155565b609c60205260009081526040902080548190611c29906130c7565b80601f0160208091040260200160405190810160405280929190818152602001828054611c55906130c7565b8015611ca25780601f10611c7757610100808354040283529160200191611ca2565b820191906000526020600020905b815481529060010190602001808311611c8557829003601f168201915b50505050509080600101549080600201549080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600a01549080600b0160009054906101000a900460ff1690508c565b6000858152609c60205260408082208151610180810190925280548392919082908290611d27906130c7565b80601f0160208091040260200160405190810160405280929190818152602001828054611d53906130c7565b8015611da05780601f10611d7557610100808354040283529160200191611da0565b820191906000526020600020905b815481529060010190602001808311611d8357829003601f168201915b50505091835250506001828101546020830152600283015460408301526003830154606083015260048301546080830152600583015460a0830152600683015460c0830152600783015460e083015260088301546101008301526009830154610120830152600a830154610140830152600b9092015460ff16151561016090910152909150866002811115611e3757611e376137c7565b03611e86578215611e735760a0810151856103e8611e5587836133d6565b611e5f9190613367565b611e69919061339c565b1115915050611ed1565b60a0810151856103e8611e5582886133d6565b6002866002811115611e9a57611e9a6137c7565b03611ecb578215611eb85760a0810151856103e8611e5582886133d6565b60a0810151856103e8611e5587836133d6565b60019150505b95945050505050565b806001600160a01b038116611f015760405162461bcd60e51b81526004016109e790613464565b600054610100900460ff1615808015611f215750600054600160ff909116105b80611f3b5750303b158015611f3b575060005460ff166001145b611f9e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016109e7565b6000805460ff191660011790558015611fc1576000805461ff0019166101001790555b611fca836125b1565b801561200c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610e8f565b505050565b3360009081526099602052604090205460ff166120405760405162461bcd60e51b81526004016109e7906133b0565b61204984612621565b600084815260a6602052604090208115610cde5782610cbd5783816001016000828254610cb2919061334f565b61207e612421565b60005b8181101561200c576120b583838381811061209e5761209e6133e8565b90506020028101906120b091906137dd565b612684565b600101612081565b600083815260a66020908152604080832060a7909252822081546001830154851561211d576120ec878361334f565b915060006120fa8383612926565b845490915083108015612111575083600101548111155b95505050505050610f7e565b612127878261334f565b905060006121358383612926565b8454909150821080156121115750836001015481111595505050505050610f7e565b61215f612421565b6000828152609b60205260409020805483919061217b906130c7565b905060000361219c5760405162461bcd60e51b81526004016109e7906134ca565b816103e881602001351080156121b757506103e88160400135105b80156121cd57506121c88180613080565b151590505b6122065760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f4645455360b01b60448201526064016109e7565b6000848152609b6020526040902083906122208282613210565b50506040518481527f8c4d35e54a3f2ef1134138fd8ea3daee6a3c89e10d2665996babdf70261e2c7690602001611a41565b61225a612421565b606580546001600160a01b0383166001600160a01b0319909116811790915561228b6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600081815260a260209081526040808320805460018083015460a690955292852080549301546002830154919592938392909190839061230390436133d6565b60008a815260a16020526040902060030154909150828411156123955761232a83856133d6565b9550806123378784613367565b6123419190613367565b9450612350611519858761339c565b61235a908a613687565b98506000831161236b576000612384565b6123788361150f87612944565b612384906000196135d4565b61238e9089613687565b9750612415565b61239f84846133d6565b9550806123ac8784613367565b6123b69190613367565b9450600083116123c75760006123d4565b6123d4611519848761339c565b6123de9089613687565b9750600084116123ef576000612408565b6123fc8461150f87612944565b612408906000196135d4565b612412908a613687565b98505b50505050505050915091565b6033546001600160a01b031633146116815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109e7565b600082815260a160205260409081902090820151158015906124a4575063017d78408260400151105b156124bd576124b28361297e565b604082015160028201555b600082606001511180156124d75750629896808260600151105b156124f0576124e583612621565b606082015160038201555b8151156124fc57815181555b60208201511561251157602082015160018201555b604080518481528351602080830191909152840151818301529083015160608083019190915283015160808201527f901e66575b0aecca6e394d488bfe990ff28995f6da67ef2fe1d6c900b6573a039060a001610e8f565b60006001600160ff1b038211156125ad5760405162461bcd60e51b81526020600482015260086024820152676f766572666c6f7760c01b60448201526064016109e7565b5090565b606580546001600160a01b0319169055611858816129d5565b60008082156125f5575050600082815260a1602090815260408083205460a69092529091205461261a565b5050600082815260a16020908152604080832060019081015460a69093529220909101545b9250929050565b600081815260a260205260409020612638826122c3565b600183018190558183554360028401556040805185815260208101939093528201527fc08ace100a8e3b7186ad5fcb68a0b9e7e0bd60aa466cdba34932fa0513353c6490606001610a5d565b60808101356000818152609a602052604081206002015490036126b95760405162461bcd60e51b81526004016109e7906134a0565b60608201356000818152609b6020526040902080546126d7906130c7565b90506000036126f85760405162461bcd60e51b81526004016109e7906134ca565b60a06127048480613080565b604051612712929190613568565b9081526040519081900360200190205460ff16156127685760405162461bcd60e51b81526020600482015260136024820152721410525497d053149150511657d31254d51151606a1b60448201526064016109e7565b67016345785d8a00008360c0013510158015612791575068056bc75e2d631000008360e0013511155b80156127a457508260c001358360e00135115b6127e55760405162461bcd60e51b8152602060048201526012602482015271736574204c657665726167652077726f6e6760701b60448201526064016109e7565b826101200135836101400135116128315760405162461bcd60e51b815260206004820152601060248201526f736574204c6576506f732077726f6e6760801b60448201526064016109e7565b6103e88360a001351061287c5760405162461bcd60e51b8152602060048201526013602482015272736574206d61785370726561642077726f6e6760681b60448201526064016109e7565b609d546000908152609c60205260409020839061289982826137fe565b506001905060a06128aa8580613080565b6040516128b8929190613568565b908152604051908190036020019020805491151560ff19909216919091179055609d80547f575435d4059a3408bba26020601e4d25bbdc3cfcc047810f873cea4caef7aa5591600061290983613300565b909155506129178580613080565b604051610e8f93929190613319565b600081831115612939575080820361293e565b508181035b92915050565b60a854600090801580159061295b57506103e88111155b15612977576103e861296d8285613367565b610f7e919061339c565b5090919050565b600081815260a36020526040902061299582611b87565b8082554360018301556040805184815260208101929092527f66ae41afb9d1762b0b5f1a431a9e5c767128a1bec9ecb20e1ef9dba7dc3663d69101610a5d565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600060208284031215612a3957600080fd5b5035919050565b600060608284031215610bc157600080fd5b600060208284031215612a6457600080fd5b813567ffffffffffffffff811115612a7b57600080fd5b61195c84828501612a40565b801515811461185857600080fd5b60008060008060808587031215612aab57600080fd5b84359350602085013592506040850135612ac481612a87565b91506060850135612ad481612a87565b939692955090935050565b60008083601f840112612af157600080fd5b50813567ffffffffffffffff811115612b0957600080fd5b6020830191508360208260051b850101111561261a57600080fd5b60008060008060408587031215612b3a57600080fd5b843567ffffffffffffffff80821115612b5257600080fd5b612b5e88838901612adf565b90965094506020870135915080821115612b7757600080fd5b818701915087601f830112612b8b57600080fd5b813581811115612b9a57600080fd5b8860208260071b8501011115612baf57600080fd5b95989497505060200194505050565b6001600160a01b038116811461185857600080fd5b60008060408385031215612be657600080fd5b8235612bf181612bbe565b91506020830135612c0181612a87565b809150509250929050565b600080600060608486031215612c2157600080fd5b83359250602084013591506040840135612c3a81612a87565b809150509250925092565b6000815180845260005b81811015612c6b57602081850181015186830182015201612c4f565b81811115612c7d576000602083870101525b50601f01601f19169290920160200192915050565b606081526000612ca56060830186612c45565b60208301949094525060400152919050565b60008060408385031215612cca57600080fd5b82359150602083013567ffffffffffffffff811115612ce857600080fd5b83016101808186031215612c0157600080fd5b600060208284031215612d0d57600080fd5b8135610f7e81612bbe565b634e487b7160e01b600052604160045260246000fd5b600060208284031215612d4057600080fd5b813567ffffffffffffffff80821115612d5857600080fd5b818401915084601f830112612d6c57600080fd5b813581811115612d7e57612d7e612d18565b604051601f8201601f19908116603f01168101908382118183101715612da657612da6612d18565b81604052828152876020848701011115612dbf57600080fd5b826020860160208301376000928101602001929092525095945050505050565b60008060008060008060c08789031215612df857600080fd5b863595506020870135945060408701359350606087013592506080870135915060a0870135612e2681612a87565b809150509295509295509295565b60008060008060808587031215612e4a57600080fd5b8435935060208501359250604085013591506060850135612ad481612a87565b6000808284036060811215612e7e57600080fd5b833592506040601f1982011215612e9457600080fd5b506020830190509250929050565b60008060008060808587031215612eb857600080fd5b84359350602085013592506040850135612ed181612a87565b9396929550929360600135925050565b60008060408385031215612ef457600080fd5b82359150602083013567ffffffffffffffff811115612f1257600080fd5b612f1e85828601612a40565b9150509250929050565b606081526000612f3b6060830186612c45565b93151560208301525060400152919050565b600080600060608486031215612f6257600080fd5b505081359360208301359350604090920135919050565b61018081526000612f8e61018083018f612c45565b602083019d909d5250604081019a909a5260608a0198909852608089019690965260a088019490945260c087019290925260e0860152610100850152610120840152610140830152151561016090910152919050565b600080600080600060a08688031215612ffc57600080fd5b8535945060208601356003811061301257600080fd5b93506040860135925060608601359150608086013561303081612a87565b809150509295509295909350565b6000806020838503121561305157600080fd5b823567ffffffffffffffff81111561306857600080fd5b61307485828601612adf565b90969095509350505050565b6000808335601e1984360301811261309757600080fd5b83018035915067ffffffffffffffff8211156130b257600080fd5b60200191503681900382131561261a57600080fd5b600181811c908216806130db57607f821691505b602082108103610bc157634e487b7160e01b600052602260045260246000fd5b601f82111561200c57600081815260208120601f850160051c810160208610156131225750805b601f850160051c820191505b81811015610d1d5782815560010161312e565b600019600383901b1c191660019190911b1790565b67ffffffffffffffff83111561316e5761316e612d18565b6131828361317c83546130c7565b836130fb565b6000601f8411600181146131b0576000851561319e5750838201355b6131a88682613141565b845550610d1f565b600083815260209020601f19861690835b828110156131e157868501358255602094850194600190920191016131c1565b50868210156131fe5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b61321a8283613080565b67ffffffffffffffff81111561323257613232612d18565b6132468161324085546130c7565b856130fb565b6000601f82116001811461327457600083156132625750838201355b61326c8482613141565b8655506132ce565b600085815260209020601f19841690835b828110156132a55786850135825560209485019460019092019101613285565b50848210156132c25760001960f88660031b161c19848701351681555b505060018360011b0185555b5050505060208201356001820155604082013560028201555050565b634e487b7160e01b600052601160045260246000fd5b600060018201613312576133126132ea565b5060010190565b83815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f1916010192915050565b60008219821115613362576133626132ea565b500190565b6000816000190483118215151615613381576133816132ea565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826133ab576133ab613386565b500490565b6020808252600c908201526b6f6e6c792074726164696e6760a01b604082015260600190565b600082821015612939576129396132ea565b634e487b7160e01b600052603260045260246000fd5b60006080828403121561341057600080fd5b6040516080810181811067ffffffffffffffff8211171561343357613433612d18565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b6020808252600990820152680616464726573735f360bc1b604082015260600190565b60006020828403121561349957600080fd5b5051919050565b60208082526010908201526f11d493d55417d393d517d31254d5115160821b604082015260600190565b6020808252600e908201526d11915157d393d517d31254d5115160921b604082015260600190565b6000808354613500816130c7565b60018281168015613518576001811461352d5761355c565b60ff198416875282151583028701945061355c565b8760005260208060002060005b858110156135535781548a82015290840190820161353a565b50505082870194505b50929695505050505050565b8183823760009101908152919050565b60006020828403121561358a57600080fd5b8135610f7e81612a87565b60008083128015600160ff1b8501841216156135b3576135b36132ea565b6001600160ff1b03840183138116156135ce576135ce6132ea565b50500390565b60006001600160ff1b03818413828413808216868404861116156135fa576135fa6132ea565b600160ff1b6000871282811687830589121615613619576136196132ea565b60008712925087820587128484161615613635576136356132ea565b8785058712818416161561364b5761364b6132ea565b505050929093029392505050565b60008261366857613668613386565b600160ff1b821460001984141615613682576136826132ea565b500590565b600080821280156001600160ff1b03849003851316156136a9576136a96132ea565b600160ff1b83900384128116156136c2576136c26132ea565b50500190565b6000813561293e81612a87565b6136df8283613080565b67ffffffffffffffff8111156136f7576136f7612d18565b6137058161324085546130c7565b6000601f82116001811461373357600083156137215750838201355b61372b8482613141565b86555061378d565b600085815260209020601f19841690835b828110156137645786850135825560209485019460019092019101613744565b50848210156137815760001960f88660031b161c19848701351681555b505060018360011b0185555b505050506137b96137a0602084016136c8565b6001830160ff1981541660ff8315151681178255505050565b604082013560028201555050565b634e487b7160e01b600052602160045260246000fd5b6000823561017e198336030181126137f457600080fd5b9190910192915050565b6138088283613080565b613813818385613156565b50506020820135600182015560408201356002820155606082013560038201556080820135600482015560a0820135600582015560c0820135600682015560e0820135600782015561010082013560088201556101208201356009820155610140820135600a8201556138a561388c61016084016136c8565b600b830160ff1981541660ff8315151681178255505050565b505056fea264697066735822122055a22cd4ae6b4fcdb833343e48df24e3aeb89bc5fa306d8b7cd2af1a7c3faadc64736f6c634300080f0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103775760003560e01c8063836a341a116101d3578063bf1db1f611610104578063e30c3978116100a2578063ecb9d95e1161007c578063ecb9d95e1461092d578063f2fde38b14610940578063fbfa77cf14610953578063fcc37c871461096657600080fd5b8063e30c3978146108f6578063ebca8c0514610907578063ec8b6fa11461091a57600080fd5b8063c6057186116100de578063c60571861461085f578063d3ee3d8814610886578063d7354478146108ad578063db377f42146108c057600080fd5b8063bf1db1f614610812578063bfe2b01c14610839578063c4d66de81461084c57600080fd5b8063a1d54e9b11610171578063aced16611161014b578063aced1661146107b8578063b81b2b71146107cb578063b8d040e4146107d4578063b91ac788146107e757600080fd5b8063a1d54e9b1461076f578063a833064514610792578063ab21a05c146107a557600080fd5b8063914e07da116101ad578063914e07da146106c957806392a67c19146106f057806396324bd4146107035780639cf9c9391461072557600080fd5b8063836a341a14610668578063885e27501461069b5780638da5cb5b146106a457600080fd5b80636ada93dd116102ad578063748747e61161024b5780637ca7c690116102255780637ca7c690146105e95780637ea95f32146105fc5780638251135b1461060f578063835907711461064257600080fd5b8063748747e6146105ab57806378999f76146105be57806379ba5097146105e157600080fd5b80636dd5d23b116102875780636dd5d23b14610541578063713040631461057d578063715018a6146105905780637325d7111461059857600080fd5b80636ada93dd146104ed5780636ce0e751146105005780636d3c666e1461052e57600080fd5b8063369dd0b11161031a5780634d314ffb116102f45780634d314ffb146104b557806362c57c9a146104c8578063658de48a146104d15780636817031b146104da57600080fd5b8063369dd0b11461041b57806342dee1ad1461043e5780634acc79ed1461049357600080fd5b806315edff631161035657806315edff63146103cf57806320f0fc5e146103e25780632fb3d704146103f55780633459202a1461040857600080fd5b8062e9f38b1461037c578063087f9188146103b25780630e01809c146103c7575b600080fd5b61039f61038a366004612a27565b6000908152609c602052604090206001015490565b6040519081526020015b60405180910390f35b6103c56103c0366004612a52565b610979565b005b61039f610a69565b6103c56103dd366004612a27565b610bc7565b6103c56103f0366004612a95565b610c46565b6103c5610403366004612b24565b610d26565b6103c5610416366004612bd3565b610e08565b61042e610429366004612c0c565b610e9c565b60405190151581526020016103a9565b61047361044c366004612a27565b60a16020526000908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016103a9565b6104a66104a1366004612a27565b610f85565b6040516103a993929190612c92565b6103c56104c3366004612cb7565b61102f565b61039f60a85481565b61039f609f5481565b6103c56104e8366004612cfb565b6113c7565b6103c56104fb366004612c0c565b611444565b61042e61050e366004612d2e565b805160208183018101805160a08252928201919093012091525460ff1681565b61039f61053c366004612ddf565b6114c3565b61056861054f366004612a27565b60a5602052600090815260409020805460019091015482565b604080519283526020830191909152016103a9565b6103c561058b366004612a52565b6115bb565b6103c561166f565b6105686105a6366004612e34565b611683565b6103c56105b9366004612cfb565b611764565b61042e6105cc366004612cfb565b60996020526000908152604090205460ff1681565b6103c56117e1565b6103c56105f7366004612e6a565b61185b565b61039f61060a366004612ea2565b6118c0565b61039f61061d366004612a27565b6000908152609c60209081526040808320600301548352609b90915290206001015490565b61042e610650366004612a27565b6000908152609c60205260409020600b015460ff1690565b61039f610676366004612a27565b6000908152609c60209081526040808320600301548352609b90915290206002015490565b61039f609e5481565b6033546001600160a01b03165b6040516001600160a01b0390911681526020016103a9565b6105686106d7366004612a27565b60a6602052600090815260409020805460019091015482565b6103c56106fe366004612ee1565b611964565b610716610711366004612a27565b611a4f565b6040516103a993929190612f28565b610754610733366004612a27565b60a26020526000908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016103a9565b61039f61077d366004612a27565b6000908152609c602052604090206002015490565b61042e6107a0366004612f4d565b611afd565b61039f6107b3366004612a27565b611b87565b6097546106b1906001600160a01b031681565b61039f609d5481565b6103c56107e2366004612a27565b611bc8565b6107fa6107f5366004612a27565b611c0e565b6040516103a99c9b9a99989796959493929190612f79565b610568610820366004612a27565b60a3602052600090815260409020805460019091015482565b61042e610847366004612fe4565b611cfb565b6103c561085a366004612cfb565b611eda565b61056861086d366004612a27565b60a4602052600090815260409020805460019091015482565b610568610894366004612a27565b60a7602052600090815260409020805460019091015482565b6103c56108bb366004612a95565b612011565b61042e6108ce366004612a27565b6000908152609c60209081526040808320600401548352609a90915290206001015460ff1690565b6065546001600160a01b03166106b1565b6103c561091536600461303e565b612076565b61042e610928366004612c0c565b6120bd565b6103c561093b366004612ee1565b612157565b6103c561094e366004612cfb565b612252565b6098546106b1906001600160a01b031681565b610568610974366004612a27565b6122c3565b610981612421565b806103e8816020013510801561099c57506103e88160400135105b80156109b257506109ad8180613080565b151590505b6109f05760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f4645455360b01b60448201526064015b60405180910390fd5b609f546000908152609b602052604090208290610a0d8282613210565b5050609f80547f482049823c85e038e099fe4f2b901487c4800def71c9a3f5bae2de8381ec54f6916000610a4083613300565b90915550610a4e8480613080565b604051610a5d93929190613319565b60405180910390a15050565b60008060005b609e54811015610bc157600081815260a560209081526040808320815180830183528154815260019091015481840152848452609a909252808320815160608101909252805492939282908290610ac5906130c7565b80601f0160208091040260200160405190810160405280929190818152602001828054610af1906130c7565b8015610b3e5780601f10610b1357610100808354040283529160200191610b3e565b820191906000526020600020905b815481529060010190602001808311610b2157829003601f168201915b5050509183525050600182015460ff1615156020808301919091526002909201546040909101528301518351919250600091610b7a919061334f565b90508160400151600014610bb6576040820151600090610b9c6103e884613367565b610ba6919061339c565b905085811115610bb4578095505b505b505050600101610a6f565b50919050565b610bcf612421565b6103e8811115610c0b5760405162461bcd60e51b8152602060048201526007602482015266544f4f5f42494760c81b60448201526064016109e7565b60a88190556040518181527f1d3ab14658b38d0f95f3cf64837ec69850b67631073f7ac97c8107839c7883f59060200160405180910390a150565b3360009081526099602052604090205460ff16610c755760405162461bcd60e51b81526004016109e7906133b0565b6000848152609c6020908152604080832060040154835260a590915290208115610cde5782610cbd5783816001016000828254610cb2919061334f565b925050819055610cd8565b83816000016000828254610cd1919061334f565b9250508190555b50610d1f565b82610d025783816001016000828254610cf791906133d6565b925050819055610d1d565b83816000016000828254610d1691906133d6565b9250508190555b505b5050505050565b6097546001600160a01b03163314610d6e5760405162461bcd60e51b815260206004820152600b60248201526a37b7363c9035b2b2b832b960a91b60448201526064016109e7565b828114610dac5760405162461bcd60e51b815260206004820152600c60248201526b0aea49e9c8ebe988a9c8ea8960a31b60448201526064016109e7565b60005b83811015610d1f57610e00858583818110610dcc57610dcc6133e8565b90506020020135848484818110610de557610de56133e8565b905060800201803603810190610dfb91906133fe565b61247b565b600101610daf565b610e10612421565b816001600160a01b038116610e375760405162461bcd60e51b81526004016109e790613464565b6001600160a01b038316600081815260996020908152604091829020805460ff19168615159081179091558251938452908301527f671298d545527a25b744efd60bff038370b275ff9ed023ab90fc0b17bdb6062b91015b60405180910390a1505050565b6000838152609c6020908152604080832060040154808452609a83528184206002015460a5909352908320600181015481549293928591610edc9161334f565b90506103e8609860009054906101000a90046001600160a01b03166001600160a01b031663ce845d1d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f589190613487565b610f629085613367565b610f6c919061339c565b610f76888361334f565b119450505050505b9392505050565b609b60205260009081526040902080548190610fa0906130c7565b80601f0160208091040260200160405190810160405280929190818152602001828054610fcc906130c7565b80156110195780601f10610fee57610100808354040283529160200191611019565b820191906000526020600020905b815481529060010190602001808311610ffc57829003601f168201915b5050505050908060010154908060020154905083565b611037612421565b60808101356000818152609a6020526040812060020154900361106c5760405162461bcd60e51b81526004016109e7906134a0565b60608201356000818152609b60205260409020805461108a906130c7565b90506000036110ab5760405162461bcd60e51b81526004016109e7906134ca565b6000848152609c602052604090819020905160a0906110cb9083906134f2565b9081526040519081900360200190205460ff1661111c5760405162461bcd60e51b815260206004820152600f60248201526e1410525497d393d517d31254d51151608a1b60448201526064016109e7565b60a06111288580613080565b604051611136929190613568565b9081526040519081900360200190205460ff161561118a5760405162461bcd60e51b81526020600482015260116024820152701390535157d053149150511657d554d151607a1b60448201526064016109e7565b600060a08260000160405161119f91906134f2565b908152604051908190036020019020805491151560ff199092169190911790556111c98480613080565b82916111d6919083613156565b50600160a06111e58680613080565b6040516111f3929190613568565b90815260405160209181900382019020805460ff1916921515929092179091558401351561122657602084013560018201555b60408401351561123b57604084013560028201555b610100840135156112525761010084013560088201555b60008460a0013511801561126b57506103e88460a00135105b1561127b5760a084013560058201555b60008460c0013511801561129657508360c001358460e00135115b1561131a5767016345785d8a00008460c00135101580156112c4575068056bc75e2d631000008460e0013511155b6113055760405162461bcd60e51b8152602060048201526012602482015271736574204c657665726167652077726f6e6760701b60448201526064016109e7565b60e0840135600782015560c084013560068201555b60008461012001351180156113385750836101200135846101400135115b15611354576101208401356009820155610140840135600a8201555b606084013560038201556080840135600482015561137a61018085016101608601613578565b600b8201805460ff19169115159190911790556040518581527f123a1b961ae93e7acda9790b318237b175b45ac09277cd3614305d8baa3f19539060200160405180910390a15050505050565b6113cf612421565b806001600160a01b0381166113f65760405162461bcd60e51b81526004016109e790613464565b609880546001600160a01b0319166001600160a01b0384169081179091556040519081527fd459c7242e23d490831b5676a611c4342d899d28f342d89ae80793e56a930f3090602001610a5d565b3360009081526099602052604090205460ff166114735760405162461bcd60e51b81526004016109e7906133b0565b600083815260a46020526040902061148a83611b87565b8155816114a857600083815260a260205260409020600101546114b8565b600083815260a260205260409020545b600190910155505050565b600080670de0b6b3a76400006114d98587613367565b6114e3919061339c565b90506000806114f48a8a8588611683565b90925090506000818361151e6103e861150f6103848d613367565b611519919061339c565b612569565b6115289190613595565b6115329190613595565b9050600061153f85612569565b826115498c612569565b61155391906135d4565b61155d9190613659565b90506000871561158257816115718c612569565b61157b9190613595565b9050611599565b8161158c8c612569565b6115969190613687565b90505b600081136115a85760006115aa565b805b9d9c50505050505050505050505050565b6115c3612421565b806103e881604001351080156115dc5750604081013515155b61161f5760405162461bcd60e51b81526020600482015260146024820152736d6178436f6c6c61746572616c502077726f6e6760601b60448201526064016109e7565b609e546000908152609a60205260409020829061163c82826136d5565b5050609e80547faf17de8e82beccc440012117a600dc37e26925225d0f1ee192fc107eb3dcbca4916000610a4083613300565b611677612421565b61168160006125b1565b565b600084815260a460209081526040808320815180830190925280548083526001909101549282019290925282916402540be4009086906116c289611b87565b6116cc91906133d6565b6116d69190613367565b6116e0919061339c565b91506000806116ee886122c3565b91509150851561172a576402540be4008784602001518461170f9190613595565b61171991906135d4565b6117239190613659565b9450611758565b6402540be400878460200151836117419190613595565b61174b91906135d4565b6117559190613659565b94505b50505094509492505050565b61176c612421565b806001600160a01b0381166117935760405162461bcd60e51b81526004016109e790613464565b609780546001600160a01b0319166001600160a01b0384169081179091556040519081527fefb5cfa1a8690c124332ab93324539c5c9c4be03f28aeb8be86f2d8a0c9fb99b90602001610a5d565b60655433906001600160a01b0316811461184f5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016109e7565b611858816125b1565b50565b611863612421565b600082815260a760209081526040918290208335808255848301356001909201829055835186815292830152918101919091527ff8031435e646b2320b8e9c9cf327090aa48ac29616cb5692b52e1f02ebcb667b90606001610a5d565b60008060006118cf86866125ca565b91509150816000036118e557869250505061195c565b6000826402540be4006118f960028861339c565b611903908561334f565b61190d9190613367565b611917919061339c565b905060006402540be40061192b8a84613367565b611935919061339c565b90508661194b57611946818a6133d6565b611955565b611955818a61334f565b9450505050505b949350505050565b61196c612421565b6000828152609a602052604081206002015483910361199d5760405162461bcd60e51b81526004016109e7906134a0565b816103e881604001351080156119b65750604081013515155b6119f95760405162461bcd60e51b81526020600482015260146024820152736d6178436f6c6c61746572616c502077726f6e6760601b60448201526064016109e7565b6000848152609a602052604090208390611a1382826136d5565b50506040518481527fcfde8f228364c70f12cbbac5a88fc91ceca76dd750ac93364991a333b34afb8e906020015b60405180910390a150505050565b609a60205260009081526040902080548190611a6a906130c7565b80601f0160208091040260200160405190810160405280929190818152602001828054611a96906130c7565b8015611ae35780601f10611ab857610100808354040283529160200191611ae3565b820191906000526020600020905b815481529060010190602001808311611ac657829003601f168201915b505050506001830154600290930154919260ff1691905083565b6000838152609c60205260408120600681015460078201546009830154600a840154600885015486670de0b6b3a7640000611b388a8c613367565b611b42919061339c565b9050858910158015611b545750848911155b8015611b605750818a10155b8015611b6c5750838110155b8015611b785750828111155b9b9a5050505050505050505050565b600081815260a36020908152604080832060a19092528220600201546001820154611bb290436133d6565b611bbc9190613367565b8154610f7e919061334f565b3360009081526099602052604090205460ff16611bf75760405162461bcd60e51b81526004016109e7906133b0565b600090815260a46020526040812081815560010155565b609c60205260009081526040902080548190611c29906130c7565b80601f0160208091040260200160405190810160405280929190818152602001828054611c55906130c7565b8015611ca25780601f10611c7757610100808354040283529160200191611ca2565b820191906000526020600020905b815481529060010190602001808311611c8557829003601f168201915b50505050509080600101549080600201549080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600a01549080600b0160009054906101000a900460ff1690508c565b6000858152609c60205260408082208151610180810190925280548392919082908290611d27906130c7565b80601f0160208091040260200160405190810160405280929190818152602001828054611d53906130c7565b8015611da05780601f10611d7557610100808354040283529160200191611da0565b820191906000526020600020905b815481529060010190602001808311611d8357829003601f168201915b50505091835250506001828101546020830152600283015460408301526003830154606083015260048301546080830152600583015460a0830152600683015460c0830152600783015460e083015260088301546101008301526009830154610120830152600a830154610140830152600b9092015460ff16151561016090910152909150866002811115611e3757611e376137c7565b03611e86578215611e735760a0810151856103e8611e5587836133d6565b611e5f9190613367565b611e69919061339c565b1115915050611ed1565b60a0810151856103e8611e5582886133d6565b6002866002811115611e9a57611e9a6137c7565b03611ecb578215611eb85760a0810151856103e8611e5582886133d6565b60a0810151856103e8611e5587836133d6565b60019150505b95945050505050565b806001600160a01b038116611f015760405162461bcd60e51b81526004016109e790613464565b600054610100900460ff1615808015611f215750600054600160ff909116105b80611f3b5750303b158015611f3b575060005460ff166001145b611f9e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016109e7565b6000805460ff191660011790558015611fc1576000805461ff0019166101001790555b611fca836125b1565b801561200c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610e8f565b505050565b3360009081526099602052604090205460ff166120405760405162461bcd60e51b81526004016109e7906133b0565b61204984612621565b600084815260a6602052604090208115610cde5782610cbd5783816001016000828254610cb2919061334f565b61207e612421565b60005b8181101561200c576120b583838381811061209e5761209e6133e8565b90506020028101906120b091906137dd565b612684565b600101612081565b600083815260a66020908152604080832060a7909252822081546001830154851561211d576120ec878361334f565b915060006120fa8383612926565b845490915083108015612111575083600101548111155b95505050505050610f7e565b612127878261334f565b905060006121358383612926565b8454909150821080156121115750836001015481111595505050505050610f7e565b61215f612421565b6000828152609b60205260409020805483919061217b906130c7565b905060000361219c5760405162461bcd60e51b81526004016109e7906134ca565b816103e881602001351080156121b757506103e88160400135105b80156121cd57506121c88180613080565b151590505b6122065760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f4645455360b01b60448201526064016109e7565b6000848152609b6020526040902083906122208282613210565b50506040518481527f8c4d35e54a3f2ef1134138fd8ea3daee6a3c89e10d2665996babdf70261e2c7690602001611a41565b61225a612421565b606580546001600160a01b0383166001600160a01b0319909116811790915561228b6033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600081815260a260209081526040808320805460018083015460a690955292852080549301546002830154919592938392909190839061230390436133d6565b60008a815260a16020526040902060030154909150828411156123955761232a83856133d6565b9550806123378784613367565b6123419190613367565b9450612350611519858761339c565b61235a908a613687565b98506000831161236b576000612384565b6123788361150f87612944565b612384906000196135d4565b61238e9089613687565b9750612415565b61239f84846133d6565b9550806123ac8784613367565b6123b69190613367565b9450600083116123c75760006123d4565b6123d4611519848761339c565b6123de9089613687565b9750600084116123ef576000612408565b6123fc8461150f87612944565b612408906000196135d4565b612412908a613687565b98505b50505050505050915091565b6033546001600160a01b031633146116815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109e7565b600082815260a160205260409081902090820151158015906124a4575063017d78408260400151105b156124bd576124b28361297e565b604082015160028201555b600082606001511180156124d75750629896808260600151105b156124f0576124e583612621565b606082015160038201555b8151156124fc57815181555b60208201511561251157602082015160018201555b604080518481528351602080830191909152840151818301529083015160608083019190915283015160808201527f901e66575b0aecca6e394d488bfe990ff28995f6da67ef2fe1d6c900b6573a039060a001610e8f565b60006001600160ff1b038211156125ad5760405162461bcd60e51b81526020600482015260086024820152676f766572666c6f7760c01b60448201526064016109e7565b5090565b606580546001600160a01b0319169055611858816129d5565b60008082156125f5575050600082815260a1602090815260408083205460a69092529091205461261a565b5050600082815260a16020908152604080832060019081015460a69093529220909101545b9250929050565b600081815260a260205260409020612638826122c3565b600183018190558183554360028401556040805185815260208101939093528201527fc08ace100a8e3b7186ad5fcb68a0b9e7e0bd60aa466cdba34932fa0513353c6490606001610a5d565b60808101356000818152609a602052604081206002015490036126b95760405162461bcd60e51b81526004016109e7906134a0565b60608201356000818152609b6020526040902080546126d7906130c7565b90506000036126f85760405162461bcd60e51b81526004016109e7906134ca565b60a06127048480613080565b604051612712929190613568565b9081526040519081900360200190205460ff16156127685760405162461bcd60e51b81526020600482015260136024820152721410525497d053149150511657d31254d51151606a1b60448201526064016109e7565b67016345785d8a00008360c0013510158015612791575068056bc75e2d631000008360e0013511155b80156127a457508260c001358360e00135115b6127e55760405162461bcd60e51b8152602060048201526012602482015271736574204c657665726167652077726f6e6760701b60448201526064016109e7565b826101200135836101400135116128315760405162461bcd60e51b815260206004820152601060248201526f736574204c6576506f732077726f6e6760801b60448201526064016109e7565b6103e88360a001351061287c5760405162461bcd60e51b8152602060048201526013602482015272736574206d61785370726561642077726f6e6760681b60448201526064016109e7565b609d546000908152609c60205260409020839061289982826137fe565b506001905060a06128aa8580613080565b6040516128b8929190613568565b908152604051908190036020019020805491151560ff19909216919091179055609d80547f575435d4059a3408bba26020601e4d25bbdc3cfcc047810f873cea4caef7aa5591600061290983613300565b909155506129178580613080565b604051610e8f93929190613319565b600081831115612939575080820361293e565b508181035b92915050565b60a854600090801580159061295b57506103e88111155b15612977576103e861296d8285613367565b610f7e919061339c565b5090919050565b600081815260a36020526040902061299582611b87565b8082554360018301556040805184815260208101929092527f66ae41afb9d1762b0b5f1a431a9e5c767128a1bec9ecb20e1ef9dba7dc3663d69101610a5d565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600060208284031215612a3957600080fd5b5035919050565b600060608284031215610bc157600080fd5b600060208284031215612a6457600080fd5b813567ffffffffffffffff811115612a7b57600080fd5b61195c84828501612a40565b801515811461185857600080fd5b60008060008060808587031215612aab57600080fd5b84359350602085013592506040850135612ac481612a87565b91506060850135612ad481612a87565b939692955090935050565b60008083601f840112612af157600080fd5b50813567ffffffffffffffff811115612b0957600080fd5b6020830191508360208260051b850101111561261a57600080fd5b60008060008060408587031215612b3a57600080fd5b843567ffffffffffffffff80821115612b5257600080fd5b612b5e88838901612adf565b90965094506020870135915080821115612b7757600080fd5b818701915087601f830112612b8b57600080fd5b813581811115612b9a57600080fd5b8860208260071b8501011115612baf57600080fd5b95989497505060200194505050565b6001600160a01b038116811461185857600080fd5b60008060408385031215612be657600080fd5b8235612bf181612bbe565b91506020830135612c0181612a87565b809150509250929050565b600080600060608486031215612c2157600080fd5b83359250602084013591506040840135612c3a81612a87565b809150509250925092565b6000815180845260005b81811015612c6b57602081850181015186830182015201612c4f565b81811115612c7d576000602083870101525b50601f01601f19169290920160200192915050565b606081526000612ca56060830186612c45565b60208301949094525060400152919050565b60008060408385031215612cca57600080fd5b82359150602083013567ffffffffffffffff811115612ce857600080fd5b83016101808186031215612c0157600080fd5b600060208284031215612d0d57600080fd5b8135610f7e81612bbe565b634e487b7160e01b600052604160045260246000fd5b600060208284031215612d4057600080fd5b813567ffffffffffffffff80821115612d5857600080fd5b818401915084601f830112612d6c57600080fd5b813581811115612d7e57612d7e612d18565b604051601f8201601f19908116603f01168101908382118183101715612da657612da6612d18565b81604052828152876020848701011115612dbf57600080fd5b826020860160208301376000928101602001929092525095945050505050565b60008060008060008060c08789031215612df857600080fd5b863595506020870135945060408701359350606087013592506080870135915060a0870135612e2681612a87565b809150509295509295509295565b60008060008060808587031215612e4a57600080fd5b8435935060208501359250604085013591506060850135612ad481612a87565b6000808284036060811215612e7e57600080fd5b833592506040601f1982011215612e9457600080fd5b506020830190509250929050565b60008060008060808587031215612eb857600080fd5b84359350602085013592506040850135612ed181612a87565b9396929550929360600135925050565b60008060408385031215612ef457600080fd5b82359150602083013567ffffffffffffffff811115612f1257600080fd5b612f1e85828601612a40565b9150509250929050565b606081526000612f3b6060830186612c45565b93151560208301525060400152919050565b600080600060608486031215612f6257600080fd5b505081359360208301359350604090920135919050565b61018081526000612f8e61018083018f612c45565b602083019d909d5250604081019a909a5260608a0198909852608089019690965260a088019490945260c087019290925260e0860152610100850152610120840152610140830152151561016090910152919050565b600080600080600060a08688031215612ffc57600080fd5b8535945060208601356003811061301257600080fd5b93506040860135925060608601359150608086013561303081612a87565b809150509295509295909350565b6000806020838503121561305157600080fd5b823567ffffffffffffffff81111561306857600080fd5b61307485828601612adf565b90969095509350505050565b6000808335601e1984360301811261309757600080fd5b83018035915067ffffffffffffffff8211156130b257600080fd5b60200191503681900382131561261a57600080fd5b600181811c908216806130db57607f821691505b602082108103610bc157634e487b7160e01b600052602260045260246000fd5b601f82111561200c57600081815260208120601f850160051c810160208610156131225750805b601f850160051c820191505b81811015610d1d5782815560010161312e565b600019600383901b1c191660019190911b1790565b67ffffffffffffffff83111561316e5761316e612d18565b6131828361317c83546130c7565b836130fb565b6000601f8411600181146131b0576000851561319e5750838201355b6131a88682613141565b845550610d1f565b600083815260209020601f19861690835b828110156131e157868501358255602094850194600190920191016131c1565b50868210156131fe5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b61321a8283613080565b67ffffffffffffffff81111561323257613232612d18565b6132468161324085546130c7565b856130fb565b6000601f82116001811461327457600083156132625750838201355b61326c8482613141565b8655506132ce565b600085815260209020601f19841690835b828110156132a55786850135825560209485019460019092019101613285565b50848210156132c25760001960f88660031b161c19848701351681555b505060018360011b0185555b5050505060208201356001820155604082013560028201555050565b634e487b7160e01b600052601160045260246000fd5b600060018201613312576133126132ea565b5060010190565b83815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f1916010192915050565b60008219821115613362576133626132ea565b500190565b6000816000190483118215151615613381576133816132ea565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826133ab576133ab613386565b500490565b6020808252600c908201526b6f6e6c792074726164696e6760a01b604082015260600190565b600082821015612939576129396132ea565b634e487b7160e01b600052603260045260246000fd5b60006080828403121561341057600080fd5b6040516080810181811067ffffffffffffffff8211171561343357613433612d18565b8060405250823581526020830135602082015260408301356040820152606083013560608201528091505092915050565b6020808252600990820152680616464726573735f360bc1b604082015260600190565b60006020828403121561349957600080fd5b5051919050565b60208082526010908201526f11d493d55417d393d517d31254d5115160821b604082015260600190565b6020808252600e908201526d11915157d393d517d31254d5115160921b604082015260600190565b6000808354613500816130c7565b60018281168015613518576001811461352d5761355c565b60ff198416875282151583028701945061355c565b8760005260208060002060005b858110156135535781548a82015290840190820161353a565b50505082870194505b50929695505050505050565b8183823760009101908152919050565b60006020828403121561358a57600080fd5b8135610f7e81612a87565b60008083128015600160ff1b8501841216156135b3576135b36132ea565b6001600160ff1b03840183138116156135ce576135ce6132ea565b50500390565b60006001600160ff1b03818413828413808216868404861116156135fa576135fa6132ea565b600160ff1b6000871282811687830589121615613619576136196132ea565b60008712925087820587128484161615613635576136356132ea565b8785058712818416161561364b5761364b6132ea565b505050929093029392505050565b60008261366857613668613386565b600160ff1b821460001984141615613682576136826132ea565b500590565b600080821280156001600160ff1b03849003851316156136a9576136a96132ea565b600160ff1b83900384128116156136c2576136c26132ea565b50500190565b6000813561293e81612a87565b6136df8283613080565b67ffffffffffffffff8111156136f7576136f7612d18565b6137058161324085546130c7565b6000601f82116001811461373357600083156137215750838201355b61372b8482613141565b86555061378d565b600085815260209020601f19841690835b828110156137645786850135825560209485019460019092019101613744565b50848210156137815760001960f88660031b161c19848701351681555b505060018360011b0185555b505050506137b96137a0602084016136c8565b6001830160ff1981541660ff8315151681178255505050565b604082013560028201555050565b634e487b7160e01b600052602160045260246000fd5b6000823561017e198336030181126137f457600080fd5b9190910192915050565b6138088283613080565b613813818385613156565b50506020820135600182015560408201356002820155606082013560038201556080820135600482015560a0820135600582015560c0820135600682015560e0820135600782015561010082013560088201556101208201356009820155610140820135600a8201556138a561388c61016084016136c8565b600b830160ff1981541660ff8315151681178255505050565b505056fea264697066735822122055a22cd4ae6b4fcdb833343e48df24e3aeb89bc5fa306d8b7cd2af1a7c3faadc64736f6c634300080f0033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.