Source Code
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
KlpManager
Compiler Version
v0.6.12+commit.27d51765
Optimization Enabled:
Yes with 1 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
import "../libraries/math/SafeMath.sol";
import "../libraries/token/IERC20.sol";
import "../libraries/token/SafeERC20.sol";
import "../libraries/utils/ReentrancyGuard.sol";
import "./interfaces/IVault.sol";
import "./interfaces/IKlpManager.sol";
import "./interfaces/IShortsTracker.sol";
import "../tokens/interfaces/IUSDG.sol";
import "../tokens/interfaces/IMintable.sol";
import "../access/Governable.sol";
pragma solidity 0.6.12;
contract KlpManager is ReentrancyGuard, Governable, IKlpManager {
using SafeMath for uint256;
using SafeERC20 for IERC20;
uint256 public constant PRICE_PRECISION = 10 ** 30;
uint256 public constant USDG_DECIMALS = 18;
uint256 public constant KLP_PRECISION = 10 ** 18;
uint256 public constant MAX_COOLDOWN_DURATION = 48 hours;
uint256 public constant BASIS_POINTS_DIVISOR = 10000;
IVault public override vault;
IShortsTracker public shortsTracker;
address public override usdg;
address public override klp;
uint256 public override cooldownDuration;
mapping(address => uint256) public override lastAddedAt;
uint256 public aumAddition;
uint256 public aumDeduction;
bool public inPrivateMode;
uint256 public shortsTrackerAveragePriceWeight;
mapping(address => bool) public isHandler;
event AddLiquidity(
address account,
address token,
uint256 amount,
uint256 aumInUsdg,
uint256 klpSupply,
uint256 usdgAmount,
uint256 mintAmount
);
event RemoveLiquidity(
address account,
address token,
uint256 klpAmount,
uint256 aumInUsdg,
uint256 klpSupply,
uint256 usdgAmount,
uint256 amountOut
);
constructor(
address _vault,
address _usdg,
address _klp,
address _shortsTracker,
uint256 _cooldownDuration
) public {
gov = msg.sender;
vault = IVault(_vault);
usdg = _usdg;
klp = _klp;
shortsTracker = IShortsTracker(_shortsTracker);
cooldownDuration = _cooldownDuration;
}
function setInPrivateMode(bool _inPrivateMode) external onlyGov {
inPrivateMode = _inPrivateMode;
}
function setShortsTracker(IShortsTracker _shortsTracker) external onlyGov {
shortsTracker = _shortsTracker;
}
function setShortsTrackerAveragePriceWeight(
uint256 _shortsTrackerAveragePriceWeight
) external override onlyGov {
require(
shortsTrackerAveragePriceWeight <= BASIS_POINTS_DIVISOR,
"KlpManager: invalid weight"
);
shortsTrackerAveragePriceWeight = _shortsTrackerAveragePriceWeight;
}
function setHandler(address _handler, bool _isActive) external onlyGov {
isHandler[_handler] = _isActive;
}
function setCooldownDuration(
uint256 _cooldownDuration
) external override onlyGov {
require(
_cooldownDuration <= MAX_COOLDOWN_DURATION,
"KlpManager: invalid _cooldownDuration"
);
cooldownDuration = _cooldownDuration;
}
function setAumAdjustment(
uint256 _aumAddition,
uint256 _aumDeduction
) external onlyGov {
aumAddition = _aumAddition;
aumDeduction = _aumDeduction;
}
function addLiquidity(
address _token,
uint256 _amount,
uint256 _minUsdg,
uint256 _minKlp
) external override nonReentrant returns (uint256) {
if (inPrivateMode) {
revert("KlpManager: action not enabled");
}
return
_addLiquidity(
msg.sender,
msg.sender,
_token,
_amount,
_minUsdg,
_minKlp
);
}
function addLiquidityForAccount(
address _fundingAccount,
address _account,
address _token,
uint256 _amount,
uint256 _minUsdg,
uint256 _minKlp
) external override nonReentrant returns (uint256) {
_validateHandler();
return
_addLiquidity(
_fundingAccount,
_account,
_token,
_amount,
_minUsdg,
_minKlp
);
}
function removeLiquidity(
address _tokenOut,
uint256 _klpAmount,
uint256 _minOut,
address _receiver
) external override nonReentrant returns (uint256) {
if (inPrivateMode) {
revert("KlpManager: action not enabled");
}
return
_removeLiquidity(
msg.sender,
_tokenOut,
_klpAmount,
_minOut,
_receiver
);
}
function removeLiquidityForAccount(
address _account,
address _tokenOut,
uint256 _klpAmount,
uint256 _minOut,
address _receiver
) external override nonReentrant returns (uint256) {
_validateHandler();
return
_removeLiquidity(
_account,
_tokenOut,
_klpAmount,
_minOut,
_receiver
);
}
function getPrice(bool _maximise) external view returns (uint256) {
uint256 aum = getAum(_maximise);
uint256 supply = IERC20(klp).totalSupply();
return aum.mul(KLP_PRECISION).div(supply);
}
function getAums() public view returns (uint256[] memory) {
uint256[] memory amounts = new uint256[](2);
amounts[0] = getAum(true);
amounts[1] = getAum(false);
return amounts;
}
function getAumInUsdg(
bool maximise
) public view override returns (uint256) {
uint256 aum = getAum(maximise);
return aum.mul(10 ** USDG_DECIMALS).div(PRICE_PRECISION);
}
function getAum(bool maximise) public view returns (uint256) {
uint256 length = vault.allWhitelistedTokensLength();
uint256 aum = aumAddition;
uint256 shortProfits = 0;
IVault _vault = vault;
for (uint256 i = 0; i < length; i++) {
address token = vault.allWhitelistedTokens(i);
bool isWhitelisted = vault.whitelistedTokens(token);
if (!isWhitelisted) {
continue;
}
uint256 price = maximise
? _vault.getMaxPrice(token)
: _vault.getMinPrice(token);
uint256 poolAmount = _vault.poolAmounts(token);
uint256 decimals = _vault.tokenDecimals(token);
if (_vault.stableTokens(token)) {
aum = aum.add(poolAmount.mul(price).div(10 ** decimals));
} else {
// add global short profit / loss
uint256 size = _vault.globalShortSizes(token);
if (size > 0) {
(uint256 delta, bool hasProfit) = getGlobalShortDelta(
token,
price,
size
);
if (!hasProfit) {
// add losses from shorts
aum = aum.add(delta);
} else {
shortProfits = shortProfits.add(delta);
}
}
aum = aum.add(_vault.guaranteedUsd(token));
uint256 reservedAmount = _vault.reservedAmounts(token);
aum = aum.add(
poolAmount.sub(reservedAmount).mul(price).div(
10 ** decimals
)
);
}
}
aum = shortProfits > aum ? 0 : aum.sub(shortProfits);
return aumDeduction > aum ? 0 : aum.sub(aumDeduction);
}
function getGlobalShortDelta(
address _token,
uint256 _price,
uint256 _size
) public view returns (uint256, bool) {
uint256 averagePrice = getGlobalShortAveragePrice(_token);
uint256 priceDelta = averagePrice > _price
? averagePrice.sub(_price)
: _price.sub(averagePrice);
uint256 delta = _size.mul(priceDelta).div(averagePrice);
return (delta, averagePrice > _price);
}
function getGlobalShortAveragePrice(
address _token
) public view returns (uint256) {
IShortsTracker _shortsTracker = shortsTracker;
if (
address(_shortsTracker) == address(0) ||
!_shortsTracker.isGlobalShortDataReady()
) {
return vault.globalShortAveragePrices(_token);
}
uint256 _shortsTrackerAveragePriceWeight = shortsTrackerAveragePriceWeight;
if (_shortsTrackerAveragePriceWeight == 0) {
return vault.globalShortAveragePrices(_token);
} else if (_shortsTrackerAveragePriceWeight == BASIS_POINTS_DIVISOR) {
return _shortsTracker.globalShortAveragePrices(_token);
}
uint256 vaultAveragePrice = vault.globalShortAveragePrices(_token);
uint256 shortsTrackerAveragePrice = _shortsTracker
.globalShortAveragePrices(_token);
return
vaultAveragePrice
.mul(BASIS_POINTS_DIVISOR.sub(_shortsTrackerAveragePriceWeight))
.add(
shortsTrackerAveragePrice.mul(
_shortsTrackerAveragePriceWeight
)
)
.div(BASIS_POINTS_DIVISOR);
}
function _addLiquidity(
address _fundingAccount,
address _account,
address _token,
uint256 _amount,
uint256 _minUsdg,
uint256 _minKlp
) private returns (uint256) {
require(_amount > 0, "KlpManager: invalid _amount");
// calculate aum before buyUSDG
uint256 aumInUsdg = getAumInUsdg(true);
uint256 klpSupply = IERC20(klp).totalSupply();
IERC20(_token).safeTransferFrom(
_fundingAccount,
address(vault),
_amount
);
uint256 usdgAmount = vault.buyUSDG(_token, address(this));
require(usdgAmount >= _minUsdg, "KlpManager: insufficient USDG output");
uint256 mintAmount = aumInUsdg == 0
? usdgAmount
: usdgAmount.mul(klpSupply).div(aumInUsdg);
require(mintAmount >= _minKlp, "KlpManager: insufficient KLP output");
IMintable(klp).mint(_account, mintAmount);
lastAddedAt[_account] = block.timestamp;
emit AddLiquidity(
_account,
_token,
_amount,
aumInUsdg,
klpSupply,
usdgAmount,
mintAmount
);
return mintAmount;
}
function _removeLiquidity(
address _account,
address _tokenOut,
uint256 _klpAmount,
uint256 _minOut,
address _receiver
) private returns (uint256) {
require(_klpAmount > 0, "KlpManager: invalid _klpAmount");
require(
lastAddedAt[_account].add(cooldownDuration) <= block.timestamp,
"KlpManager: cooldown duration not yet passed"
);
// calculate aum before sellUSDG
uint256 aumInUsdg = getAumInUsdg(false);
uint256 klpSupply = IERC20(klp).totalSupply();
uint256 usdgAmount = _klpAmount.mul(aumInUsdg).div(klpSupply);
uint256 usdgBalance = IERC20(usdg).balanceOf(address(this));
if (usdgAmount > usdgBalance) {
IUSDG(usdg).mint(address(this), usdgAmount.sub(usdgBalance));
}
IMintable(klp).burn(_account, _klpAmount);
IERC20(usdg).transfer(address(vault), usdgAmount);
uint256 amountOut = vault.sellUSDG(_tokenOut, _receiver);
require(amountOut >= _minOut, "KlpManager: insufficient output");
emit RemoveLiquidity(
_account,
_tokenOut,
_klpAmount,
aumInUsdg,
klpSupply,
usdgAmount,
amountOut
);
return amountOut;
}
function _validateHandler() private view {
require(isHandler[msg.sender], "KlpManager: forbidden");
}
}// 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 getPositionRate(
address _account,
address _collateralToken,
address _indexToken,
bool _isLong,
bool _isIncrease,
uint256 _sizeDelta
) external view returns (uint256);
function getPositionFee(
address _account,
address _collateralToken,
address _indexToken,
bool _isLong,
bool _isIncrease,
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);
}// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
contract Governable {
address public gov;
constructor() public {
gov = msg.sender;
}
modifier onlyGov() {
require(msg.sender == gov, "Governable: forbidden");
_;
}
function setGov(address _gov) external onlyGov {
gov = _gov;
}
}// SPDX-License-Identifier: MIT
import "./IVault.sol";
pragma solidity 0.6.12;
interface IKlpManager {
function klp() external view returns (address);
function usdg() external view returns (address);
function vault() external view returns (IVault);
function cooldownDuration() external returns (uint256);
function getAumInUsdg(bool maximise) external view returns (uint256);
function lastAddedAt(address _account) external returns (uint256);
function addLiquidity(address _token, uint256 _amount, uint256 _minUsdg, uint256 _minKlp) external returns (uint256);
function addLiquidityForAccount(address _fundingAccount, address _account, address _token, uint256 _amount, uint256 _minUsdg, uint256 _minKlp) external returns (uint256);
function removeLiquidity(address _tokenOut, uint256 _klpAmount, uint256 _minOut, address _receiver) external returns (uint256);
function removeLiquidityForAccount(address _account, address _tokenOut, uint256 _klpAmount, uint256 _minOut, address _receiver) external returns (uint256);
function setShortsTrackerAveragePriceWeight(uint256 _shortsTrackerAveragePriceWeight) external;
function setCooldownDuration(uint256 _cooldownDuration) external;
}// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface IShortsTracker {
function isGlobalShortDataReady() external view returns (bool);
function globalShortAveragePrices(address _token) external view returns (uint256);
function getNextGlobalShortData(
address _account,
address _collateralToken,
address _indexToken,
uint256 _nextPrice,
uint256 _sizeDelta,
bool _isIncrease
) external view returns (uint256, uint256);
function updateGlobalShortData(
address _account,
address _collateralToken,
address _indexToken,
bool _isLong,
uint256 _sizeDelta,
uint256 _markPrice,
bool _isIncrease
) external;
function setIsGlobalShortDataReady(bool value) external;
function setInitData(address[] calldata _tokens, uint256[] calldata _averagePrices) external;
}// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
import "./IVaultUtils.sol";
interface IVault {
function isInitialized() external view returns (bool);
function isSwapEnabled() external view returns (bool);
function isLeverageEnabled() external view returns (bool);
function setVaultUtils(IVaultUtils _vaultUtils) external;
function setError(uint256 _errorCode, string calldata _error) external;
function router() external view returns (address);
function 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 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 getPositionFee(
address _account,
address _collateralToken,
address _indexToken,
bool _isLong,
bool _isIncrease,
uint256 _sizeDelta
) external view returns (uint256);
function getPosition(
address _account,
address _collateralToken,
address _indexToken,
bool _isLong
)
external
view
returns (
uint256,
uint256,
uint256,
uint256,
uint256,
uint256,
bool,
uint256
);
}// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
import "./IERC20.sol";
import "../math/SafeMath.sol";
import "../utils/Address.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.6.2;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.3._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.3._
*/
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor () internal {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface IMintable {
function isMinter(address _account) external returns (bool);
function setMinter(address _minter, bool _isActive) external;
function mint(address _account, uint256 _amount) external;
function burn(address _account, uint256 _amount) external;
}// SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface IUSDG {
function addVault(address _vault) external;
function removeVault(address _vault) external;
function mint(address _account, uint256 _amount) external;
function burn(address _account, uint256 _amount) external;
}{
"libraries": {},
"optimizer": {
"enabled": true,
"runs": 1
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_usdg","type":"address"},{"internalType":"address","name":"_klp","type":"address"},{"internalType":"address","name":"_shortsTracker","type":"address"},{"internalType":"uint256","name":"_cooldownDuration","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"aumInUsdg","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"klpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"usdgAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"klpAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"aumInUsdg","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"klpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"usdgAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"RemoveLiquidity","type":"event"},{"inputs":[],"name":"BASIS_POINTS_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KLP_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_COOLDOWN_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDG_DECIMALS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minUsdg","type":"uint256"},{"internalType":"uint256","name":"_minKlp","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_fundingAccount","type":"address"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minUsdg","type":"uint256"},{"internalType":"uint256","name":"_minKlp","type":"uint256"}],"name":"addLiquidityForAccount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"aumAddition","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aumDeduction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cooldownDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"maximise","type":"bool"}],"name":"getAum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"maximise","type":"bool"}],"name":"getAumInUsdg","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAums","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getGlobalShortAveragePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_size","type":"uint256"}],"name":"getGlobalShortDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_maximise","type":"bool"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inPrivateMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isHandler","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"klp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastAddedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenOut","type":"address"},{"internalType":"uint256","name":"_klpAmount","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"address","name":"_tokenOut","type":"address"},{"internalType":"uint256","name":"_klpAmount","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"removeLiquidityForAccount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_aumAddition","type":"uint256"},{"internalType":"uint256","name":"_aumDeduction","type":"uint256"}],"name":"setAumAdjustment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cooldownDuration","type":"uint256"}],"name":"setCooldownDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gov","type":"address"}],"name":"setGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_handler","type":"address"},{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setHandler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_inPrivateMode","type":"bool"}],"name":"setInPrivateMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IShortsTracker","name":"_shortsTracker","type":"address"}],"name":"setShortsTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shortsTrackerAveragePriceWeight","type":"uint256"}],"name":"setShortsTrackerAveragePriceWeight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shortsTracker","outputs":[{"internalType":"contract IShortsTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"shortsTrackerAveragePriceWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdg","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"contract IVault","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b5060405161265f38038061265f833981810160405260a081101561003357600080fd5b5080516020820151604083015160608401516080909401516001600081905580546001600160a01b031990811633908117821617909155600280546001600160a01b039687169083161790556004805494861694821694909417909355600580549285169284169290921790915560038054939094169290911691909117909155600655612599806100c66000396000f3fe608060405234801561001057600080fd5b50600436106101965760003560e01c8063033914761461019b578063070eacee146101cc578063126082cf146101e857806312d43a51146101f057806317eb2a1514610214578063196b68cb1461025c5780631e9049cf146102645780631ece366a1461026c57806335269315146102a4578063440d828a146102ac57806346ea87af146102d25780634f5f6b5e146102f857806351dcbca71461031757806364e6617f1461031f578063657bc5d01461032757806368a0a3e01461032f5780636a86da191461034e57806371d597ad1461036d578063870d917c146103b15780638b770e11146103b95780638fed0b2c146103df5780639116c4ae1461041957806395082d251461043c578063966be075146104445780639cb7de4b14610461578063a1acd3d51461048f578063b172bb0c146104da578063c249e15f146104e2578063cfad57a2146104ea578063d34ee09314610510578063e245b5af14610536578063ed0d1c0414610555578063f5b91b7b146105ad578063fbfa77cf146105b5575b600080fd5b6101ba600480360360208110156101b157600080fd5b503515156105bd565b60408051918252519081900360200190f35b6101d4610c3b565b604080519115158252519081900360200190f35b6101ba610c44565b6101f8610c4a565b604080516001600160a01b039092168252519081900360200190f35b6101ba600480360360c081101561022a57600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060808101359060a00135610c59565b6101ba610ccc565b6101ba610cd2565b6101ba6004803603608081101561028257600080fd5b506001600160a01b038135169060208101359060408101359060600135610cd9565b6101ba610d88565b6101ba600480360360208110156102c257600080fd5b50356001600160a01b0316610d8e565b6101d4600480360360208110156102e857600080fd5b50356001600160a01b031661109f565b6103156004803603602081101561030e57600080fd5b50356110b4565b005b6101f861115c565b6101ba61116b565b6101f8611171565b6101ba6004803603602081101561034557600080fd5b50351515611180565b6103156004803603602081101561036457600080fd5b503515156111b7565b6101ba600480360360a081101561038357600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160809091013516611217565b6101ba611288565b6101ba600480360360208110156103cf57600080fd5b50356001600160a01b031661128d565b6101ba600480360360808110156103f557600080fd5b506001600160a01b038135811691602081013591604082013591606001351661129f565b6103156004803603604081101561042f57600080fd5b508035906020013561133f565b6101ba611397565b6103156004803603602081101561045a57600080fd5b50356113a7565b6103156004803603604081101561047757600080fd5b506001600160a01b038135169060200135151561143b565b6104c1600480360360608110156104a557600080fd5b506001600160a01b0381351690602081013590604001356114b3565b6040805192835290151560208301528051918290030190f35b6101ba611507565b6101ba61150d565b6103156004803603602081101561050057600080fd5b50356001600160a01b0316611519565b6103156004803603602081101561052657600080fd5b50356001600160a01b0316611588565b6101ba6004803603602081101561054c57600080fd5b503515156115f7565b61055d6116a1565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610599578181015183820152602001610581565b505050509050019250505060405180910390f35b6101f861170f565b6101f861171e565b600080600260009054906101000a90046001600160a01b03166001600160a01b0316630842b0766040518163ffffffff1660e01b815260040160206040518083038186803b15801561060e57600080fd5b505afa158015610622573d6000803e3d6000fd5b505050506040513d602081101561063857600080fd5b5051600854600254919250906000906001600160a01b0316815b84811015610bf45760025460408051630e468baf60e41b81526004810184905290516000926001600160a01b03169163e468baf0916024808301926020929190829003018186803b1580156106a657600080fd5b505afa1580156106ba573d6000803e3d6000fd5b505050506040513d60208110156106d057600080fd5b505160025460408051630daf9c2160e41b81526001600160a01b0380851660048301529151939450600093919092169163daf9c210916024808301926020929190829003018186803b15801561072557600080fd5b505afa158015610739573d6000803e3d6000fd5b505050506040513d602081101561074f57600080fd5b505190508061075f575050610bec565b6000896107e457846001600160a01b03166381a612d6846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156107b357600080fd5b505afa1580156107c7573d6000803e3d6000fd5b505050506040513d60208110156107dd57600080fd5b505161085e565b846001600160a01b031663e124e6d2846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561083157600080fd5b505afa158015610845573d6000803e3d6000fd5b505050506040513d602081101561085b57600080fd5b50515b90506000856001600160a01b03166352f55eed856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156108af57600080fd5b505afa1580156108c3573d6000803e3d6000fd5b505050506040513d60208110156108d957600080fd5b5051604080516323b95ceb60e21b81526001600160a01b038781166004830152915192935060009291891691638ee573ac91602480820192602092909190829003018186803b15801561092b57600080fd5b505afa15801561093f573d6000803e3d6000fd5b505050506040513d602081101561095557600080fd5b5051604080516342b60b0360e01b81526001600160a01b0388811660048301529151929350908916916342b60b0391602480820192602092909190829003018186803b1580156109a457600080fd5b505afa1580156109b8573d6000803e3d6000fd5b505050506040513d60208110156109ce57600080fd5b5051156109fe576109f76109f0600a83900a6109ea858761172d565b9061178f565b8a906117ce565b9850610be6565b6000876001600160a01b0316638a78daa8876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610a4d57600080fd5b505afa158015610a61573d6000803e3d6000fd5b505050506040513d6020811015610a7757600080fd5b505190508015610ab957600080610a8f8887856114b3565b9150915080610aa957610aa28c836117ce565b9b50610ab6565b610ab38b836117ce565b9a505b50505b610b3c886001600160a01b031663f07456ce886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610b0957600080fd5b505afa158015610b1d573d6000803e3d6000fd5b505050506040513d6020811015610b3357600080fd5b50518b906117ce565b99506000886001600160a01b031663c3c7b9e9886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610b8d57600080fd5b505afa158015610ba1573d6000803e3d6000fd5b505050506040513d6020811015610bb757600080fd5b50519050610be1610bda600a85900a6109ea88610bd48987611826565b9061172d565b8c906117ce565b9a5050505b50505050505b600101610652565b50828211610c0b57610c068383611826565b610c0e565b60005b92508260095411610c2c57600954610c27908490611826565b610c2f565b60005b9450505050505b919050565b600a5460ff1681565b61271081565b6001546001600160a01b031681565b600060026000541415610ca1576040805162461bcd60e51b815260206004820152601f6024820152600080516020612421833981519152604482015290519081900360640190fd5b6002600055610cae611868565b610cbc8787878787876118c6565b6001600055979650505050505050565b60085481565b6202a30081565b600060026000541415610d21576040805162461bcd60e51b815260206004820152601f6024820152600080516020612421833981519152604482015290519081900360640190fd5b6002600055600a5460ff1615610d6c576040805162461bcd60e51b815260206004820152601e6024820152600080516020612441833981519152604482015290519081900360640190fd5b610d7a3333878787876118c6565b600160005595945050505050565b60065481565b6003546000906001600160a01b0316801580610e0c5750806001600160a01b0316639a11178f6040518163ffffffff1660e01b815260040160206040518083038186803b158015610dde57600080fd5b505afa158015610df2573d6000803e3d6000fd5b505050506040513d6020811015610e0857600080fd5b5051155b15610e935760025460408051636274980360e01b81526001600160a01b038681166004830152915191909216916362749803916024808301926020929190829003018186803b158015610e5e57600080fd5b505afa158015610e72573d6000803e3d6000fd5b505050506040513d6020811015610e8857600080fd5b50519150610c369050565b600b5480610f1e5760025460408051636274980360e01b81526001600160a01b038781166004830152915191909216916362749803916024808301926020929190829003018186803b158015610ee857600080fd5b505afa158015610efc573d6000803e3d6000fd5b505050506040513d6020811015610f1257600080fd5b50519250610c36915050565b612710811415610f7557816001600160a01b03166362749803856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610ee857600080fd5b60025460408051636274980360e01b81526001600160a01b03878116600483015291516000939290921691636274980391602480820192602092909190829003018186803b158015610fc657600080fd5b505afa158015610fda573d6000803e3d6000fd5b505050506040513d6020811015610ff057600080fd5b505160408051636274980360e01b81526001600160a01b038881166004830152915192935060009291861691636274980391602480820192602092909190829003018186803b15801561104257600080fd5b505afa158015611056573d6000803e3d6000fd5b505050506040513d602081101561106c57600080fd5b50519050610c2f6127106109ea611083848761172d565b61109961109261271089611826565b879061172d565b906117ce565b600c6020526000908152604090205460ff1681565b6001546001600160a01b03163314611101576040805162461bcd60e51b81526020600482015260156024820152600080516020612461833981519152604482015290519081900360640190fd5b612710600b541115611157576040805162461bcd60e51b815260206004820152601a60248201527912db1c13585b9859d95c8e881a5b9d985b1a59081dd95a59da1d60321b604482015290519081900360640190fd5b600b55565b6005546001600160a01b031681565b600b5481565b6003546001600160a01b031681565b60008061118c836105bd565b90506111b068327cb2734119d3b7a9601e1b6109ea83670de0b6b3a764000061172d565b9392505050565b6001546001600160a01b03163314611204576040805162461bcd60e51b81526020600482015260156024820152600080516020612461833981519152604482015290519081900360640190fd5b600a805460ff1916911515919091179055565b60006002600054141561125f576040805162461bcd60e51b815260206004820152601f6024820152600080516020612421833981519152604482015290519081900360640190fd5b600260005561126c611868565b6112798686868686611bdf565b60016000559695505050505050565b601281565b60076020526000908152604090205481565b6000600260005414156112e7576040805162461bcd60e51b815260206004820152601f6024820152600080516020612421833981519152604482015290519081900360640190fd5b6002600055600a5460ff1615611332576040805162461bcd60e51b815260206004820152601e6024820152600080516020612441833981519152604482015290519081900360640190fd5b610d7a3386868686611bdf565b6001546001600160a01b0316331461138c576040805162461bcd60e51b81526020600482015260156024820152600080516020612461833981519152604482015290519081900360640190fd5b600891909155600955565b68327cb2734119d3b7a9601e1b81565b6001546001600160a01b031633146113f4576040805162461bcd60e51b81526020600482015260156024820152600080516020612461833981519152604482015290519081900360640190fd5b6202a3008111156114365760405162461bcd60e51b81526004018080602001828103825260258152602001806124f26025913960400191505060405180910390fd5b600655565b6001546001600160a01b03163314611488576040805162461bcd60e51b81526020600482015260156024820152600080516020612461833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b60008060006114c186610d8e565b905060008582116114db576114d68683611826565b6114e5565b6114e58287611826565b905060006114f7836109ea888561172d565b9450505084109050935093915050565b60095481565b670de0b6b3a764000081565b6001546001600160a01b03163314611566576040805162461bcd60e51b81526020600482015260156024820152600080516020612461833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146115d5576040805162461bcd60e51b81526020600482015260156024820152600080516020612461833981519152604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600080611603836105bd565b90506000600560009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561165557600080fd5b505afa158015611669573d6000803e3d6000fd5b505050506040513d602081101561167f57600080fd5b50519050611699816109ea84670de0b6b3a764000061172d565b949350505050565b6040805160028082526060808301845292839291906020830190803683370190505090506116cf60016105bd565b816000815181106116dc57fe5b6020026020010181815250506116f260006105bd565b816001815181106116ff57fe5b6020908102919091010152905090565b6004546001600160a01b031681565b6002546001600160a01b031681565b60008261173c57506000611789565b8282028284828161174957fe5b04146117865760405162461bcd60e51b81526004018080602001828103825260218152602001806124d16021913960400191505060405180910390fd5b90505b92915050565b600061178683836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b81525061207c565b600082820183811015611786576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b600061178683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061211e565b336000908152600c602052604090205460ff166118c4576040805162461bcd60e51b815260206004820152601560248201527425b63826b0b730b3b2b91d103337b93134b23232b760591b604482015290519081900360640190fd5b565b600080841161191a576040805162461bcd60e51b815260206004820152601b60248201527a12db1c13585b9859d95c8e881a5b9d985b1a590817d85b5bdd5b9d602a1b604482015290519081900360640190fd5b60006119266001611180565b90506000600560009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561197857600080fd5b505afa15801561198c573d6000803e3d6000fd5b505050506040513d60208110156119a257600080fd5b50516002549091506119c3906001600160a01b03898116918c911689612178565b6002546040805163817bb85760e01b81526001600160a01b038a811660048301523060248301529151600093929092169163817bb8579160448082019260209290919082900301818787803b158015611a1b57600080fd5b505af1158015611a2f573d6000803e3d6000fd5b505050506040513d6020811015611a4557600080fd5b5051905085811015611a885760405162461bcd60e51b81526004018080602001828103825260248152602001806124816024913960400191505060405180910390fd5b60008315611aa357611a9e846109ea848661172d565b611aa5565b815b905085811015611ae65760405162461bcd60e51b81526004018080602001828103825260238152602001806125176023913960400191505060405180910390fd5b600554604080516340c10f1960e01b81526001600160a01b038d8116600483015260248201859052915191909216916340c10f1991604480830192600092919082900301818387803b158015611b3b57600080fd5b505af1158015611b4f573d6000803e3d6000fd5b5050506001600160a01b03808c166000818152600760209081526040918290204290558151928352928d16928201929092528082018b9052606081018790526080810186905260a0810185905260c0810184905290517f38dc38b96482be64113daffd8d464ebda93e856b70ccfc605e69ccf892ab981e92509081900360e00190a19a9950505050505050505050565b6000808411611c35576040805162461bcd60e51b815260206004820152601e60248201527f4b6c704d616e616765723a20696e76616c6964205f6b6c70416d6f756e740000604482015290519081900360640190fd5b6006546001600160a01b0387166000908152600760205260409020544291611c5d91906117ce565b1115611c9a5760405162461bcd60e51b815260040180806020018281038252602c8152602001806124a5602c913960400191505060405180910390fd5b6000611ca66000611180565b90506000600560009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611cf857600080fd5b505afa158015611d0c573d6000803e3d6000fd5b505050506040513d6020811015611d2257600080fd5b505190506000611d36826109ea898661172d565b60048054604080516370a0823160e01b81523093810193909352519293506000926001600160a01b03909116916370a08231916024808301926020929190829003018186803b158015611d8857600080fd5b505afa158015611d9c573d6000803e3d6000fd5b505050506040513d6020811015611db257600080fd5b5051905080821115611e39576004546001600160a01b03166340c10f1930611dda8585611826565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611e2057600080fd5b505af1158015611e34573d6000803e3d6000fd5b505050505b60055460408051632770a7eb60e21b81526001600160a01b038d81166004830152602482018c905291519190921691639dc29fac91604480830192600092919082900301818387803b158015611e8e57600080fd5b505af1158015611ea2573d6000803e3d6000fd5b5050600480546002546040805163a9059cbb60e01b81526001600160a01b039283169481019490945260248401889052519116935063a9059cbb925060448083019260209291908290030181600087803b158015611eff57600080fd5b505af1158015611f13573d6000803e3d6000fd5b505050506040513d6020811015611f2957600080fd5b505060025460408051630711e61960e41b81526001600160a01b038c8116600483015289811660248301529151600093929092169163711e61909160448082019260209290919082900301818787803b158015611f8557600080fd5b505af1158015611f99573d6000803e3d6000fd5b505050506040513d6020811015611faf57600080fd5b5051905087811015612008576040805162461bcd60e51b815260206004820152601f60248201527f4b6c704d616e616765723a20696e73756666696369656e74206f757470757400604482015290519081900360640190fd5b604080516001600160a01b03808e1682528c1660208201528082018b9052606081018790526080810186905260a0810185905260c0810183905290517f87b9679bb9a4944bafa98c267e7cd4a00ab29fed48afdefae25f0fca5da279409181900360e00190a19a9950505050505050505050565b600081836121085760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156120cd5781810151838201526020016120b5565b50505050905090810190601f1680156120fa5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161211457fe5b0495945050505050565b600081848411156121705760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156120cd5781810151838201526020016120b5565b505050900390565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526121d29085906121d8565b50505050565b606061222d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661228e9092919063ffffffff16565b8051909150156122895780806020019051602081101561224c57600080fd5b50516122895760405162461bcd60e51b815260040180806020018281038252602a81526020018061253a602a913960400191505060405180910390fd5b505050565b60606116998484600085856122a2856123b4565b6122f3576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106123325780518252601f199092019160209182019101612313565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612394576040519150601f19603f3d011682016040523d82523d6000602084013e612399565b606091505b50915091506123a98282866123ba565b979650505050505050565b3b151590565b606083156123c95750816111b0565b8251156123d95782518084602001fd5b60405162461bcd60e51b81526020600482018181528451602484015284518593919283926044019190850190808383600083156120cd5781810151838201526020016120b556fe5265656e7472616e637947756172643a207265656e7472616e742063616c6c004b6c704d616e616765723a20616374696f6e206e6f7420656e61626c65640000476f7665726e61626c653a20666f7262696464656e00000000000000000000004b6c704d616e616765723a20696e73756666696369656e742055534447206f75747075744b6c704d616e616765723a20636f6f6c646f776e206475726174696f6e206e6f742079657420706173736564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774b6c704d616e616765723a20696e76616c6964205f636f6f6c646f776e4475726174696f6e4b6c704d616e616765723a20696e73756666696369656e74204b4c50206f75747075745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122028912122afbba9781543358ea4ce6973209a7a5ce8922365840c84b31d09722164736f6c634300060c00330000000000000000000000002e488d7ed78171793fa91fad5352be423a50dae10000000000000000000000001ca85898619cf01edd8be6ef7f8989da03d6b69400000000000000000000000092351c9aed156bc8ec76d52cb1441b93f153e550000000000000000000000000cdece5195776482d176c842bba446937f2606ca70000000000000000000000000000000000000000000000000000000000000384
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101965760003560e01c8063033914761461019b578063070eacee146101cc578063126082cf146101e857806312d43a51146101f057806317eb2a1514610214578063196b68cb1461025c5780631e9049cf146102645780631ece366a1461026c57806335269315146102a4578063440d828a146102ac57806346ea87af146102d25780634f5f6b5e146102f857806351dcbca71461031757806364e6617f1461031f578063657bc5d01461032757806368a0a3e01461032f5780636a86da191461034e57806371d597ad1461036d578063870d917c146103b15780638b770e11146103b95780638fed0b2c146103df5780639116c4ae1461041957806395082d251461043c578063966be075146104445780639cb7de4b14610461578063a1acd3d51461048f578063b172bb0c146104da578063c249e15f146104e2578063cfad57a2146104ea578063d34ee09314610510578063e245b5af14610536578063ed0d1c0414610555578063f5b91b7b146105ad578063fbfa77cf146105b5575b600080fd5b6101ba600480360360208110156101b157600080fd5b503515156105bd565b60408051918252519081900360200190f35b6101d4610c3b565b604080519115158252519081900360200190f35b6101ba610c44565b6101f8610c4a565b604080516001600160a01b039092168252519081900360200190f35b6101ba600480360360c081101561022a57600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060808101359060a00135610c59565b6101ba610ccc565b6101ba610cd2565b6101ba6004803603608081101561028257600080fd5b506001600160a01b038135169060208101359060408101359060600135610cd9565b6101ba610d88565b6101ba600480360360208110156102c257600080fd5b50356001600160a01b0316610d8e565b6101d4600480360360208110156102e857600080fd5b50356001600160a01b031661109f565b6103156004803603602081101561030e57600080fd5b50356110b4565b005b6101f861115c565b6101ba61116b565b6101f8611171565b6101ba6004803603602081101561034557600080fd5b50351515611180565b6103156004803603602081101561036457600080fd5b503515156111b7565b6101ba600480360360a081101561038357600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160809091013516611217565b6101ba611288565b6101ba600480360360208110156103cf57600080fd5b50356001600160a01b031661128d565b6101ba600480360360808110156103f557600080fd5b506001600160a01b038135811691602081013591604082013591606001351661129f565b6103156004803603604081101561042f57600080fd5b508035906020013561133f565b6101ba611397565b6103156004803603602081101561045a57600080fd5b50356113a7565b6103156004803603604081101561047757600080fd5b506001600160a01b038135169060200135151561143b565b6104c1600480360360608110156104a557600080fd5b506001600160a01b0381351690602081013590604001356114b3565b6040805192835290151560208301528051918290030190f35b6101ba611507565b6101ba61150d565b6103156004803603602081101561050057600080fd5b50356001600160a01b0316611519565b6103156004803603602081101561052657600080fd5b50356001600160a01b0316611588565b6101ba6004803603602081101561054c57600080fd5b503515156115f7565b61055d6116a1565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610599578181015183820152602001610581565b505050509050019250505060405180910390f35b6101f861170f565b6101f861171e565b600080600260009054906101000a90046001600160a01b03166001600160a01b0316630842b0766040518163ffffffff1660e01b815260040160206040518083038186803b15801561060e57600080fd5b505afa158015610622573d6000803e3d6000fd5b505050506040513d602081101561063857600080fd5b5051600854600254919250906000906001600160a01b0316815b84811015610bf45760025460408051630e468baf60e41b81526004810184905290516000926001600160a01b03169163e468baf0916024808301926020929190829003018186803b1580156106a657600080fd5b505afa1580156106ba573d6000803e3d6000fd5b505050506040513d60208110156106d057600080fd5b505160025460408051630daf9c2160e41b81526001600160a01b0380851660048301529151939450600093919092169163daf9c210916024808301926020929190829003018186803b15801561072557600080fd5b505afa158015610739573d6000803e3d6000fd5b505050506040513d602081101561074f57600080fd5b505190508061075f575050610bec565b6000896107e457846001600160a01b03166381a612d6846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156107b357600080fd5b505afa1580156107c7573d6000803e3d6000fd5b505050506040513d60208110156107dd57600080fd5b505161085e565b846001600160a01b031663e124e6d2846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561083157600080fd5b505afa158015610845573d6000803e3d6000fd5b505050506040513d602081101561085b57600080fd5b50515b90506000856001600160a01b03166352f55eed856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156108af57600080fd5b505afa1580156108c3573d6000803e3d6000fd5b505050506040513d60208110156108d957600080fd5b5051604080516323b95ceb60e21b81526001600160a01b038781166004830152915192935060009291891691638ee573ac91602480820192602092909190829003018186803b15801561092b57600080fd5b505afa15801561093f573d6000803e3d6000fd5b505050506040513d602081101561095557600080fd5b5051604080516342b60b0360e01b81526001600160a01b0388811660048301529151929350908916916342b60b0391602480820192602092909190829003018186803b1580156109a457600080fd5b505afa1580156109b8573d6000803e3d6000fd5b505050506040513d60208110156109ce57600080fd5b5051156109fe576109f76109f0600a83900a6109ea858761172d565b9061178f565b8a906117ce565b9850610be6565b6000876001600160a01b0316638a78daa8876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610a4d57600080fd5b505afa158015610a61573d6000803e3d6000fd5b505050506040513d6020811015610a7757600080fd5b505190508015610ab957600080610a8f8887856114b3565b9150915080610aa957610aa28c836117ce565b9b50610ab6565b610ab38b836117ce565b9a505b50505b610b3c886001600160a01b031663f07456ce886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610b0957600080fd5b505afa158015610b1d573d6000803e3d6000fd5b505050506040513d6020811015610b3357600080fd5b50518b906117ce565b99506000886001600160a01b031663c3c7b9e9886040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610b8d57600080fd5b505afa158015610ba1573d6000803e3d6000fd5b505050506040513d6020811015610bb757600080fd5b50519050610be1610bda600a85900a6109ea88610bd48987611826565b9061172d565b8c906117ce565b9a5050505b50505050505b600101610652565b50828211610c0b57610c068383611826565b610c0e565b60005b92508260095411610c2c57600954610c27908490611826565b610c2f565b60005b9450505050505b919050565b600a5460ff1681565b61271081565b6001546001600160a01b031681565b600060026000541415610ca1576040805162461bcd60e51b815260206004820152601f6024820152600080516020612421833981519152604482015290519081900360640190fd5b6002600055610cae611868565b610cbc8787878787876118c6565b6001600055979650505050505050565b60085481565b6202a30081565b600060026000541415610d21576040805162461bcd60e51b815260206004820152601f6024820152600080516020612421833981519152604482015290519081900360640190fd5b6002600055600a5460ff1615610d6c576040805162461bcd60e51b815260206004820152601e6024820152600080516020612441833981519152604482015290519081900360640190fd5b610d7a3333878787876118c6565b600160005595945050505050565b60065481565b6003546000906001600160a01b0316801580610e0c5750806001600160a01b0316639a11178f6040518163ffffffff1660e01b815260040160206040518083038186803b158015610dde57600080fd5b505afa158015610df2573d6000803e3d6000fd5b505050506040513d6020811015610e0857600080fd5b5051155b15610e935760025460408051636274980360e01b81526001600160a01b038681166004830152915191909216916362749803916024808301926020929190829003018186803b158015610e5e57600080fd5b505afa158015610e72573d6000803e3d6000fd5b505050506040513d6020811015610e8857600080fd5b50519150610c369050565b600b5480610f1e5760025460408051636274980360e01b81526001600160a01b038781166004830152915191909216916362749803916024808301926020929190829003018186803b158015610ee857600080fd5b505afa158015610efc573d6000803e3d6000fd5b505050506040513d6020811015610f1257600080fd5b50519250610c36915050565b612710811415610f7557816001600160a01b03166362749803856040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610ee857600080fd5b60025460408051636274980360e01b81526001600160a01b03878116600483015291516000939290921691636274980391602480820192602092909190829003018186803b158015610fc657600080fd5b505afa158015610fda573d6000803e3d6000fd5b505050506040513d6020811015610ff057600080fd5b505160408051636274980360e01b81526001600160a01b038881166004830152915192935060009291861691636274980391602480820192602092909190829003018186803b15801561104257600080fd5b505afa158015611056573d6000803e3d6000fd5b505050506040513d602081101561106c57600080fd5b50519050610c2f6127106109ea611083848761172d565b61109961109261271089611826565b879061172d565b906117ce565b600c6020526000908152604090205460ff1681565b6001546001600160a01b03163314611101576040805162461bcd60e51b81526020600482015260156024820152600080516020612461833981519152604482015290519081900360640190fd5b612710600b541115611157576040805162461bcd60e51b815260206004820152601a60248201527912db1c13585b9859d95c8e881a5b9d985b1a59081dd95a59da1d60321b604482015290519081900360640190fd5b600b55565b6005546001600160a01b031681565b600b5481565b6003546001600160a01b031681565b60008061118c836105bd565b90506111b068327cb2734119d3b7a9601e1b6109ea83670de0b6b3a764000061172d565b9392505050565b6001546001600160a01b03163314611204576040805162461bcd60e51b81526020600482015260156024820152600080516020612461833981519152604482015290519081900360640190fd5b600a805460ff1916911515919091179055565b60006002600054141561125f576040805162461bcd60e51b815260206004820152601f6024820152600080516020612421833981519152604482015290519081900360640190fd5b600260005561126c611868565b6112798686868686611bdf565b60016000559695505050505050565b601281565b60076020526000908152604090205481565b6000600260005414156112e7576040805162461bcd60e51b815260206004820152601f6024820152600080516020612421833981519152604482015290519081900360640190fd5b6002600055600a5460ff1615611332576040805162461bcd60e51b815260206004820152601e6024820152600080516020612441833981519152604482015290519081900360640190fd5b610d7a3386868686611bdf565b6001546001600160a01b0316331461138c576040805162461bcd60e51b81526020600482015260156024820152600080516020612461833981519152604482015290519081900360640190fd5b600891909155600955565b68327cb2734119d3b7a9601e1b81565b6001546001600160a01b031633146113f4576040805162461bcd60e51b81526020600482015260156024820152600080516020612461833981519152604482015290519081900360640190fd5b6202a3008111156114365760405162461bcd60e51b81526004018080602001828103825260258152602001806124f26025913960400191505060405180910390fd5b600655565b6001546001600160a01b03163314611488576040805162461bcd60e51b81526020600482015260156024820152600080516020612461833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b60008060006114c186610d8e565b905060008582116114db576114d68683611826565b6114e5565b6114e58287611826565b905060006114f7836109ea888561172d565b9450505084109050935093915050565b60095481565b670de0b6b3a764000081565b6001546001600160a01b03163314611566576040805162461bcd60e51b81526020600482015260156024820152600080516020612461833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146115d5576040805162461bcd60e51b81526020600482015260156024820152600080516020612461833981519152604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600080611603836105bd565b90506000600560009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561165557600080fd5b505afa158015611669573d6000803e3d6000fd5b505050506040513d602081101561167f57600080fd5b50519050611699816109ea84670de0b6b3a764000061172d565b949350505050565b6040805160028082526060808301845292839291906020830190803683370190505090506116cf60016105bd565b816000815181106116dc57fe5b6020026020010181815250506116f260006105bd565b816001815181106116ff57fe5b6020908102919091010152905090565b6004546001600160a01b031681565b6002546001600160a01b031681565b60008261173c57506000611789565b8282028284828161174957fe5b04146117865760405162461bcd60e51b81526004018080602001828103825260218152602001806124d16021913960400191505060405180910390fd5b90505b92915050565b600061178683836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b81525061207c565b600082820183811015611786576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b600061178683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061211e565b336000908152600c602052604090205460ff166118c4576040805162461bcd60e51b815260206004820152601560248201527425b63826b0b730b3b2b91d103337b93134b23232b760591b604482015290519081900360640190fd5b565b600080841161191a576040805162461bcd60e51b815260206004820152601b60248201527a12db1c13585b9859d95c8e881a5b9d985b1a590817d85b5bdd5b9d602a1b604482015290519081900360640190fd5b60006119266001611180565b90506000600560009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561197857600080fd5b505afa15801561198c573d6000803e3d6000fd5b505050506040513d60208110156119a257600080fd5b50516002549091506119c3906001600160a01b03898116918c911689612178565b6002546040805163817bb85760e01b81526001600160a01b038a811660048301523060248301529151600093929092169163817bb8579160448082019260209290919082900301818787803b158015611a1b57600080fd5b505af1158015611a2f573d6000803e3d6000fd5b505050506040513d6020811015611a4557600080fd5b5051905085811015611a885760405162461bcd60e51b81526004018080602001828103825260248152602001806124816024913960400191505060405180910390fd5b60008315611aa357611a9e846109ea848661172d565b611aa5565b815b905085811015611ae65760405162461bcd60e51b81526004018080602001828103825260238152602001806125176023913960400191505060405180910390fd5b600554604080516340c10f1960e01b81526001600160a01b038d8116600483015260248201859052915191909216916340c10f1991604480830192600092919082900301818387803b158015611b3b57600080fd5b505af1158015611b4f573d6000803e3d6000fd5b5050506001600160a01b03808c166000818152600760209081526040918290204290558151928352928d16928201929092528082018b9052606081018790526080810186905260a0810185905260c0810184905290517f38dc38b96482be64113daffd8d464ebda93e856b70ccfc605e69ccf892ab981e92509081900360e00190a19a9950505050505050505050565b6000808411611c35576040805162461bcd60e51b815260206004820152601e60248201527f4b6c704d616e616765723a20696e76616c6964205f6b6c70416d6f756e740000604482015290519081900360640190fd5b6006546001600160a01b0387166000908152600760205260409020544291611c5d91906117ce565b1115611c9a5760405162461bcd60e51b815260040180806020018281038252602c8152602001806124a5602c913960400191505060405180910390fd5b6000611ca66000611180565b90506000600560009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015611cf857600080fd5b505afa158015611d0c573d6000803e3d6000fd5b505050506040513d6020811015611d2257600080fd5b505190506000611d36826109ea898661172d565b60048054604080516370a0823160e01b81523093810193909352519293506000926001600160a01b03909116916370a08231916024808301926020929190829003018186803b158015611d8857600080fd5b505afa158015611d9c573d6000803e3d6000fd5b505050506040513d6020811015611db257600080fd5b5051905080821115611e39576004546001600160a01b03166340c10f1930611dda8585611826565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015611e2057600080fd5b505af1158015611e34573d6000803e3d6000fd5b505050505b60055460408051632770a7eb60e21b81526001600160a01b038d81166004830152602482018c905291519190921691639dc29fac91604480830192600092919082900301818387803b158015611e8e57600080fd5b505af1158015611ea2573d6000803e3d6000fd5b5050600480546002546040805163a9059cbb60e01b81526001600160a01b039283169481019490945260248401889052519116935063a9059cbb925060448083019260209291908290030181600087803b158015611eff57600080fd5b505af1158015611f13573d6000803e3d6000fd5b505050506040513d6020811015611f2957600080fd5b505060025460408051630711e61960e41b81526001600160a01b038c8116600483015289811660248301529151600093929092169163711e61909160448082019260209290919082900301818787803b158015611f8557600080fd5b505af1158015611f99573d6000803e3d6000fd5b505050506040513d6020811015611faf57600080fd5b5051905087811015612008576040805162461bcd60e51b815260206004820152601f60248201527f4b6c704d616e616765723a20696e73756666696369656e74206f757470757400604482015290519081900360640190fd5b604080516001600160a01b03808e1682528c1660208201528082018b9052606081018790526080810186905260a0810185905260c0810183905290517f87b9679bb9a4944bafa98c267e7cd4a00ab29fed48afdefae25f0fca5da279409181900360e00190a19a9950505050505050505050565b600081836121085760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156120cd5781810151838201526020016120b5565b50505050905090810190601f1680156120fa5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161211457fe5b0495945050505050565b600081848411156121705760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156120cd5781810151838201526020016120b5565b505050900390565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526121d29085906121d8565b50505050565b606061222d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661228e9092919063ffffffff16565b8051909150156122895780806020019051602081101561224c57600080fd5b50516122895760405162461bcd60e51b815260040180806020018281038252602a81526020018061253a602a913960400191505060405180910390fd5b505050565b60606116998484600085856122a2856123b4565b6122f3576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106123325780518252601f199092019160209182019101612313565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612394576040519150601f19603f3d011682016040523d82523d6000602084013e612399565b606091505b50915091506123a98282866123ba565b979650505050505050565b3b151590565b606083156123c95750816111b0565b8251156123d95782518084602001fd5b60405162461bcd60e51b81526020600482018181528451602484015284518593919283926044019190850190808383600083156120cd5781810151838201526020016120b556fe5265656e7472616e637947756172643a207265656e7472616e742063616c6c004b6c704d616e616765723a20616374696f6e206e6f7420656e61626c65640000476f7665726e61626c653a20666f7262696464656e00000000000000000000004b6c704d616e616765723a20696e73756666696369656e742055534447206f75747075744b6c704d616e616765723a20636f6f6c646f776e206475726174696f6e206e6f742079657420706173736564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774b6c704d616e616765723a20696e76616c6964205f636f6f6c646f776e4475726174696f6e4b6c704d616e616765723a20696e73756666696369656e74204b4c50206f75747075745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122028912122afbba9781543358ea4ce6973209a7a5ce8922365840c84b31d09722164736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002e488d7ed78171793fa91fad5352be423a50dae10000000000000000000000001ca85898619cf01edd8be6ef7f8989da03d6b69400000000000000000000000092351c9aed156bc8ec76d52cb1441b93f153e550000000000000000000000000cdece5195776482d176c842bba446937f2606ca70000000000000000000000000000000000000000000000000000000000000384
-----Decoded View---------------
Arg [0] : _vault (address): 0x2e488D7ED78171793FA91fAd5352Be423A50Dae1
Arg [1] : _usdg (address): 0x1Ca85898619cF01eDD8bE6ef7f8989da03D6B694
Arg [2] : _klp (address): 0x92351C9Aed156Bc8Ec76D52cB1441b93f153e550
Arg [3] : _shortsTracker (address): 0xcdece5195776482d176C842bbA446937F2606CA7
Arg [4] : _cooldownDuration (uint256): 900
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000002e488d7ed78171793fa91fad5352be423a50dae1
Arg [1] : 0000000000000000000000001ca85898619cf01edd8be6ef7f8989da03d6b694
Arg [2] : 00000000000000000000000092351c9aed156bc8ec76d52cb1441b93f153e550
Arg [3] : 000000000000000000000000cdece5195776482d176c842bba446937f2606ca7
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000384
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in MNT
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.