Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- OrderExecutor
- Optimization enabled
- true
- Compiler version
- v0.6.12+commit.27d51765
- Optimization runs
- 8
- EVM Version
- default
- Verified at
- 2023-07-29T17:24:20.140952Z
Constructor Arguments
0x000000000000000000000000e3a4088781adc8f0b26bbbf42757d8238326dfea0000000000000000000000009bf49663e7e5ed00ef10d8cd16703fa83fc443d7
Arg [0] (address) : 0xe3a4088781adc8f0b26bbbf42757d8238326dfea
Arg [1] (address) : 0x9bf49663e7e5ed00ef10d8cd16703fa83fc443d7
contracts/core/OrderExecutor.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.6.0;
import "../libraries/math/SafeMath.sol";
import "./interfaces/IVault.sol";
import "./interfaces/IOrderBook.sol";
import "../peripherals/interfaces/ITimelock.sol";
contract OrderExecutor {
using SafeMath for uint256;
uint256 public constant BASIS_POINTS_DIVISOR = 10000;
address public vault;
address public orderBook;
constructor(address _vault, address _orderBook) public {
require(_vault != address(0) && _orderBook != address(0), "OrderExecutor: invalid address");
vault = _vault;
orderBook = _orderBook;
}
function executeSwapOrder(address _account, uint256 _orderIndex, address payable _feeReceiver) external {
IOrderBook(orderBook).executeSwapOrder(_account, _orderIndex, _feeReceiver);
}
function executeIncreaseOrder(address _address, uint256 _orderIndex, address payable _feeReceiver) external {
_validateIncreaseOrder(_address, _orderIndex);
address timelock = IVault(vault).gov();
ITimelock(timelock).setIsLeverageEnabled(vault, true);
IOrderBook(orderBook).executeIncreaseOrder(_address, _orderIndex, _feeReceiver);
ITimelock(timelock).setIsLeverageEnabled(vault, false);
}
function executeDecreaseOrder(address _address, uint256 _orderIndex, address payable _feeReceiver) external {
IOrderBook(orderBook).executeDecreaseOrder(_address, _orderIndex, _feeReceiver);
}
function _validateIncreaseOrder(address _account, uint256 _orderIndex) internal view {
(
address _purchaseToken,
uint256 _purchaseTokenAmount,
address _collateralToken,
address _indexToken,
uint256 _sizeDelta,
bool _isLong,
, // triggerPrice
, // triggerAboveThreshold
// executionFee
) = IOrderBook(orderBook).getIncreaseOrder(_account, _orderIndex);
// shorts are okay
if (!_isLong) { return; }
// if the position size is not increasing, this is a collateral deposit
require(_sizeDelta > 0, "OrderExecutor: long deposit");
IVault _vault = IVault(vault);
(uint256 size, uint256 collateral, , , , , , ) = _vault.getPosition(_account, _collateralToken, _indexToken, _isLong);
// if there is no existing position, do not charge a fee
if (size == 0) { return; }
uint256 nextSize = size.add(_sizeDelta);
uint256 collateralDelta = _vault.tokenToUsdMin(_purchaseToken, _purchaseTokenAmount);
uint256 nextCollateral = collateral.add(collateralDelta);
uint256 prevLeverage = size.mul(BASIS_POINTS_DIVISOR).div(collateral);
// add 100 to allow for a maximum of a 1% decrease since there might be some swap fees taken from the collateral
uint256 nextLeverageWithBuffer = nextSize.mul(BASIS_POINTS_DIVISOR + 100).div(nextCollateral);
require(nextLeverageWithBuffer >= prevLeverage, "OrderExecutor: long leverage decrease");
}
}
contracts/core/interfaces/IOrderBook.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface IOrderBook {
function getSwapOrder(address _account, uint256 _orderIndex) external view returns (
address path0,
address path1,
address path2,
uint256 amountIn,
uint256 minOut,
uint256 triggerRatio,
bool triggerAboveThreshold,
bool shouldUnwrap,
uint256 executionFee
);
function getIncreaseOrder(address _account, uint256 _orderIndex) external view returns (
address purchaseToken,
uint256 purchaseTokenAmount,
address collateralToken,
address indexToken,
uint256 sizeDelta,
bool isLong,
uint256 triggerPrice,
bool triggerAboveThreshold,
uint256 executionFee
);
function getDecreaseOrder(address _account, uint256 _orderIndex) external view returns (
address collateralToken,
uint256 collateralDelta,
address indexToken,
uint256 sizeDelta,
bool isLong,
uint256 triggerPrice,
bool triggerAboveThreshold,
uint256 executionFee
);
function executeSwapOrder(address, uint256, address payable) external;
function executeDecreaseOrder(address, uint256, address payable) external;
function executeIncreaseOrder(address, uint256, address payable) external;
}
contracts/core/interfaces/IVault.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
import "./IVaultUtils.sol";
interface IVault {
function isInitialized() external view returns (bool);
function isSwapEnabled() external view returns (bool);
function isLeverageEnabled() external view returns (bool);
function setVaultUtils(IVaultUtils _vaultUtils) external;
function setError(uint256 _errorCode, string calldata _error) external;
function router() external view returns (address);
function usdg() external view returns (address);
function gov() external view returns (address);
function whitelistedTokenCount() external view returns (uint256);
function maxLeverage() external view returns (uint256);
function minProfitTime() external view returns (uint256);
function hasDynamicFees() external view returns (bool);
function fundingInterval() external view returns (uint256);
function totalTokenWeights() external view returns (uint256);
function getTargetUsdgAmount(address _token) external view returns (uint256);
function inManagerMode() external view returns (bool);
function inPrivateLiquidationMode() external view returns (bool);
function maxGasPrice() external view returns (uint256);
function approvedRouters(address _account, address _router) external view returns (bool);
function isLiquidator(address _account) external view returns (bool);
function isManager(address _account) external view returns (bool);
function minProfitBasisPoints(address _token) external view returns (uint256);
function tokenBalances(address _token) external view returns (uint256);
function lastFundingTimes(address _token) external view returns (uint256);
function setMaxLeverage(uint256 _maxLeverage) external;
function setInManagerMode(bool _inManagerMode) external;
function setManager(address _manager, bool _isManager) external;
function setIsSwapEnabled(bool _isSwapEnabled) external;
function setIsLeverageEnabled(bool _isLeverageEnabled) external;
function setMaxGasPrice(uint256 _maxGasPrice) external;
function setUsdgAmount(address _token, uint256 _amount) external;
function setBufferAmount(address _token, uint256 _amount) external;
function setMaxGlobalShortSize(address _token, uint256 _amount) external;
function setInPrivateLiquidationMode(bool _inPrivateLiquidationMode) external;
function setLiquidator(address _liquidator, bool _isActive) external;
function setFundingRate(uint256 _fundingInterval, uint256 _fundingRateFactor, uint256 _stableFundingRateFactor) external;
function setFees(
uint256 _taxBasisPoints,
uint256 _stableTaxBasisPoints,
uint256 _mintBurnFeeBasisPoints,
uint256 _swapFeeBasisPoints,
uint256 _stableSwapFeeBasisPoints,
uint256 _marginFeeBasisPoints,
uint256 _liquidationFeeUsd,
uint256 _minProfitTime,
bool _hasDynamicFees
) external;
function setTokenConfig(
address _token,
uint256 _tokenDecimals,
uint256 _redemptionBps,
uint256 _minProfitBps,
uint256 _maxUsdgAmount,
bool _isStable,
bool _isShortable
) external;
function setPriceFeed(address _priceFeed) external;
function withdrawFees(address _token, address _receiver) external returns (uint256);
function directPoolDeposit(address _token) external;
function buyUSDG(address _token, address _receiver) external returns (uint256);
function sellUSDG(address _token, address _receiver) external returns (uint256);
function swap(address _tokenIn, address _tokenOut, address _receiver) external returns (uint256);
function increasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong) external;
function decreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address _receiver) external returns (uint256);
function validateLiquidation(address _account, address _collateralToken, address _indexToken, bool _isLong, bool _raise) external view returns (uint256, uint256);
function liquidatePosition(address _account, address _collateralToken, address _indexToken, bool _isLong, address _feeReceiver) external;
function tokenToUsdMin(address _token, uint256 _tokenAmount) external view returns (uint256);
function priceFeed() external view returns (address);
function fundingRateFactor() external view returns (uint256);
function stableFundingRateFactor() external view returns (uint256);
function cumulativeFundingRates(address _token) external view returns (uint256);
function getNextFundingRate(address _token) external view returns (uint256);
function getFeeBasisPoints(address _token, uint256 _usdgDelta, uint256 _feeBasisPoints, uint256 _taxBasisPoints, bool _increment) external view returns (uint256);
function liquidationFeeUsd() external view returns (uint256);
function taxBasisPoints() external view returns (uint256);
function stableTaxBasisPoints() external view returns (uint256);
function mintBurnFeeBasisPoints() external view returns (uint256);
function swapFeeBasisPoints() external view returns (uint256);
function stableSwapFeeBasisPoints() external view returns (uint256);
function marginFeeBasisPoints() external view returns (uint256);
function allWhitelistedTokensLength() external view returns (uint256);
function allWhitelistedTokens(uint256) external view returns (address);
function whitelistedTokens(address _token) external view returns (bool);
function stableTokens(address _token) external view returns (bool);
function shortableTokens(address _token) external view returns (bool);
function feeReserves(address _token) external view returns (uint256);
function globalShortSizes(address _token) external view returns (uint256);
function globalShortAveragePrices(address _token) external view returns (uint256);
function maxGlobalShortSizes(address _token) external view returns (uint256);
function tokenDecimals(address _token) external view returns (uint256);
function tokenWeights(address _token) external view returns (uint256);
function guaranteedUsd(address _token) external view returns (uint256);
function poolAmounts(address _token) external view returns (uint256);
function bufferAmounts(address _token) external view returns (uint256);
function reservedAmounts(address _token) external view returns (uint256);
function usdgAmounts(address _token) external view returns (uint256);
function maxUsdgAmounts(address _token) external view returns (uint256);
function getRedemptionAmount(address _token, uint256 _usdgAmount) external view returns (uint256);
function getMaxPrice(address _token) external view returns (uint256);
function getMinPrice(address _token) external view returns (uint256);
function getDelta(address _indexToken, uint256 _size, uint256 _averagePrice, bool _isLong, uint256 _lastIncreasedTime) external view returns (bool, uint256);
function getPosition(address _account, address _collateralToken, address _indexToken, bool _isLong) external view returns (uint256, uint256, uint256, uint256, uint256, uint256, bool, uint256);
}
contracts/core/interfaces/IVaultUtils.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface IVaultUtils {
function updateCumulativeFundingRate(address _collateralToken, address _indexToken) external returns (bool);
function validateIncreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong) external view;
function validateDecreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address _receiver) external view;
function validateLiquidation(address _account, address _collateralToken, address _indexToken, bool _isLong, bool _raise) external view returns (uint256, uint256);
function getEntryFundingRate(address _collateralToken, address _indexToken, bool _isLong) external view returns (uint256);
function getPositionFee(address _account, address _collateralToken, address _indexToken, bool _isLong, uint256 _sizeDelta) external view returns (uint256);
function getFundingFee(address _account, address _collateralToken, address _indexToken, bool _isLong, uint256 _size, uint256 _entryFundingRate) external view returns (uint256);
function getBuyUsdgFeeBasisPoints(address _token, uint256 _usdgAmount) external view returns (uint256);
function getSellUsdgFeeBasisPoints(address _token, uint256 _usdgAmount) external view returns (uint256);
function getSwapFeeBasisPoints(address _tokenIn, address _tokenOut, uint256 _usdgAmount) external view returns (uint256);
function getFeeBasisPoints(address _token, uint256 _usdgDelta, uint256 _feeBasisPoints, uint256 _taxBasisPoints, bool _increment) external view returns (uint256);
}
contracts/libraries/math/SafeMath.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
contracts/peripherals/interfaces/ITimelock.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface ITimelock {
function setAdmin(address _admin) external;
function enableLeverage(address _vault) external;
function disableLeverage(address _vault) external;
function setIsLeverageEnabled(address _vault, bool _isLeverageEnabled) external;
function signalSetGov(address _target, address _gov) external;
}
Compiler Settings
{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers"]}},"optimizer":{"runs":8,"enabled":true},"libraries":{}}
Contract ABI
[{"type":"constructor","inputs":[{"type":"address","name":"_vault","internalType":"address"},{"type":"address","name":"_orderBook","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"BASIS_POINTS_DIVISOR","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"executeDecreaseOrder","inputs":[{"type":"address","name":"_address","internalType":"address"},{"type":"uint256","name":"_orderIndex","internalType":"uint256"},{"type":"address","name":"_feeReceiver","internalType":"address payable"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"executeIncreaseOrder","inputs":[{"type":"address","name":"_address","internalType":"address"},{"type":"uint256","name":"_orderIndex","internalType":"uint256"},{"type":"address","name":"_feeReceiver","internalType":"address payable"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"executeSwapOrder","inputs":[{"type":"address","name":"_account","internalType":"address"},{"type":"uint256","name":"_orderIndex","internalType":"uint256"},{"type":"address","name":"_feeReceiver","internalType":"address payable"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"orderBook","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"vault","inputs":[]}]
Contract Creation Code
0x608060405234801561001057600080fd5b50604051610a10380380610a108339818101604052604081101561003357600080fd5b5080516020909101516001600160a01b0382161580159061005c57506001600160a01b03811615155b6100ad576040805162461bcd60e51b815260206004820152601e60248201527f4f726465724578656375746f723a20696e76616c696420616464726573730000604482015290519081900360640190fd5b600080546001600160a01b039384166001600160a01b03199182161790915560018054929093169116179055610928806100e86000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c806307c7edc31461006757806311d9444a1461009f578063126082cf146100d5578063776af5ba146100ef578063d38ab51914610113578063fbfa77cf14610149575b600080fd5b61009d6004803603606081101561007d57600080fd5b506001600160a01b03813581169160208101359160409091013516610151565b005b61009d600480360360608110156100b557600080fd5b506001600160a01b038135811691602081013591604090910135166101cb565b6100dd610228565b60408051918252519081900360200190f35b6100f761022e565b604080516001600160a01b039092168252519081900360200190f35b61009d6004803603606081101561012957600080fd5b506001600160a01b0381358116916020810135916040909101351661023d565b6100f7610415565b600154604080516307c7edc360e01b81526001600160a01b038681166004830152602482018690528481166044830152915191909216916307c7edc391606480830192600092919082900301818387803b1580156101ae57600080fd5b505af11580156101c2573d6000803e3d6000fd5b50505050505050565b600154604080516308eca22560e11b81526001600160a01b038681166004830152602482018690528481166044830152915191909216916311d9444a91606480830192600092919082900301818387803b1580156101ae57600080fd5b61271081565b6001546001600160a01b031681565b6102478383610424565b60008060009054906101000a90046001600160a01b03166001600160a01b03166312d43a516040518163ffffffff1660e01b815260040160206040518083038186803b15801561029657600080fd5b505afa1580156102aa573d6000803e3d6000fd5b505050506040513d60208110156102c057600080fd5b50516000805460408051630cd2b12360e41b81526001600160a01b0392831660048201526001602482015290519394509084169263cd2b12309260448084019391929182900301818387803b15801561031857600080fd5b505af115801561032c573d6000803e3d6000fd5b50506001546040805163d38ab51960e01b81526001600160a01b038981166004830152602482018990528781166044830152915191909216935063d38ab5199250606480830192600092919082900301818387803b15801561038d57600080fd5b505af11580156103a1573d6000803e3d6000fd5b50506000805460408051630cd2b12360e41b81526001600160a01b039283166004820152602481018490529051918616945063cd2b12309350604480820193929182900301818387803b1580156103f757600080fd5b505af115801561040b573d6000803e3d6000fd5b5050505050505050565b6000546001600160a01b031681565b6001546040805163d3bab1d160e01b81526001600160a01b03858116600483015260248201859052915160009384938493849384938493169163d3bab1d191604480830192610120929190829003018186803b15801561048357600080fd5b505afa158015610497573d6000803e3d6000fd5b505050506040513d6101208110156104ae57600080fd5b508051602082015160408301516060840151608085015160a090950151939a50919850965094509092509050806104ea57505050505050610712565b6000821161053d576040805162461bcd60e51b815260206004820152601b60248201527a13dc99195c915e1958dd5d1bdc8e881b1bdb99c819195c1bdcda5d602a1b604482015290519081900360640190fd5b6000805460408051634a3f088d60e01b81526001600160a01b038c81166004830152888116602483015287811660448301528515156064830152915191909216929182918491634a3f088d91608480830192610100929190829003018186803b1580156105a957600080fd5b505afa1580156105bd573d6000803e3d6000fd5b505050506040513d6101008110156105d457600080fd5b5080516020909101519092509050816105f557505050505050505050610712565b60006106018387610716565b90506000846001600160a01b0316630a48d5a98c8c6040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b15801561065a57600080fd5b505afa15801561066e573d6000803e3d6000fd5b505050506040513d602081101561068457600080fd5b5051905060006106948483610716565b905060006106ae856106a888612710610777565b906107d0565b905060006106c2836106a887612774610777565b9050818110156107035760405162461bcd60e51b81526004018080602001828103825260258152602001806108ce6025913960400191505060405180910390fd5b50505050505050505050505050505b5050565b60008282018381101561076e576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b90505b92915050565b60008261078657506000610771565b8282028284828161079357fe5b041461076e5760405162461bcd60e51b81526004018080602001828103825260218152602001806108ad6021913960400191505060405180910390fd5b600061076e83836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b815250600081836108965760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561085b578181015183820152602001610843565b50505050905090810190601f1680156108885780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816108a257fe5b049594505050505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f726465724578656375746f723a206c6f6e67206c65766572616765206465637265617365a26469706673582212206ff298a838460c037a5bad124ff23e92582171d7c14175f5cd9bc5d911fefb6f64736f6c634300060c0033000000000000000000000000e3a4088781adc8f0b26bbbf42757d8238326dfea0000000000000000000000009bf49663e7e5ed00ef10d8cd16703fa83fc443d7
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106100625760003560e01c806307c7edc31461006757806311d9444a1461009f578063126082cf146100d5578063776af5ba146100ef578063d38ab51914610113578063fbfa77cf14610149575b600080fd5b61009d6004803603606081101561007d57600080fd5b506001600160a01b03813581169160208101359160409091013516610151565b005b61009d600480360360608110156100b557600080fd5b506001600160a01b038135811691602081013591604090910135166101cb565b6100dd610228565b60408051918252519081900360200190f35b6100f761022e565b604080516001600160a01b039092168252519081900360200190f35b61009d6004803603606081101561012957600080fd5b506001600160a01b0381358116916020810135916040909101351661023d565b6100f7610415565b600154604080516307c7edc360e01b81526001600160a01b038681166004830152602482018690528481166044830152915191909216916307c7edc391606480830192600092919082900301818387803b1580156101ae57600080fd5b505af11580156101c2573d6000803e3d6000fd5b50505050505050565b600154604080516308eca22560e11b81526001600160a01b038681166004830152602482018690528481166044830152915191909216916311d9444a91606480830192600092919082900301818387803b1580156101ae57600080fd5b61271081565b6001546001600160a01b031681565b6102478383610424565b60008060009054906101000a90046001600160a01b03166001600160a01b03166312d43a516040518163ffffffff1660e01b815260040160206040518083038186803b15801561029657600080fd5b505afa1580156102aa573d6000803e3d6000fd5b505050506040513d60208110156102c057600080fd5b50516000805460408051630cd2b12360e41b81526001600160a01b0392831660048201526001602482015290519394509084169263cd2b12309260448084019391929182900301818387803b15801561031857600080fd5b505af115801561032c573d6000803e3d6000fd5b50506001546040805163d38ab51960e01b81526001600160a01b038981166004830152602482018990528781166044830152915191909216935063d38ab5199250606480830192600092919082900301818387803b15801561038d57600080fd5b505af11580156103a1573d6000803e3d6000fd5b50506000805460408051630cd2b12360e41b81526001600160a01b039283166004820152602481018490529051918616945063cd2b12309350604480820193929182900301818387803b1580156103f757600080fd5b505af115801561040b573d6000803e3d6000fd5b5050505050505050565b6000546001600160a01b031681565b6001546040805163d3bab1d160e01b81526001600160a01b03858116600483015260248201859052915160009384938493849384938493169163d3bab1d191604480830192610120929190829003018186803b15801561048357600080fd5b505afa158015610497573d6000803e3d6000fd5b505050506040513d6101208110156104ae57600080fd5b508051602082015160408301516060840151608085015160a090950151939a50919850965094509092509050806104ea57505050505050610712565b6000821161053d576040805162461bcd60e51b815260206004820152601b60248201527a13dc99195c915e1958dd5d1bdc8e881b1bdb99c819195c1bdcda5d602a1b604482015290519081900360640190fd5b6000805460408051634a3f088d60e01b81526001600160a01b038c81166004830152888116602483015287811660448301528515156064830152915191909216929182918491634a3f088d91608480830192610100929190829003018186803b1580156105a957600080fd5b505afa1580156105bd573d6000803e3d6000fd5b505050506040513d6101008110156105d457600080fd5b5080516020909101519092509050816105f557505050505050505050610712565b60006106018387610716565b90506000846001600160a01b0316630a48d5a98c8c6040518363ffffffff1660e01b815260040180836001600160a01b031681526020018281526020019250505060206040518083038186803b15801561065a57600080fd5b505afa15801561066e573d6000803e3d6000fd5b505050506040513d602081101561068457600080fd5b5051905060006106948483610716565b905060006106ae856106a888612710610777565b906107d0565b905060006106c2836106a887612774610777565b9050818110156107035760405162461bcd60e51b81526004018080602001828103825260258152602001806108ce6025913960400191505060405180910390fd5b50505050505050505050505050505b5050565b60008282018381101561076e576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b90505b92915050565b60008261078657506000610771565b8282028284828161079357fe5b041461076e5760405162461bcd60e51b81526004018080602001828103825260218152602001806108ad6021913960400191505060405180910390fd5b600061076e83836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b815250600081836108965760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561085b578181015183820152602001610843565b50505050905090810190601f1680156108885780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816108a257fe5b049594505050505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f726465724578656375746f723a206c6f6e67206c65766572616765206465637265617365a26469706673582212206ff298a838460c037a5bad124ff23e92582171d7c14175f5cd9bc5d911fefb6f64736f6c634300060c0033