Source Code
Latest 25 from a total of 4,338 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Create Burn Requ... | 848856 | 681 days ago | IN | 0.00055 ETH | 0.00008536 | ||||
| Create Burn Requ... | 848603 | 681 days ago | IN | 0.00055 ETH | 0.00009107 | ||||
| Unstake Llp | 848590 | 681 days ago | IN | 0 ETH | 0.00005582 | ||||
| Create Burn Requ... | 848527 | 681 days ago | IN | 0.00055 ETH | 0.00008778 | ||||
| Stake Llp | 848477 | 681 days ago | IN | 0 ETH | 0.00006412 | ||||
| Create Mint Requ... | 848464 | 681 days ago | IN | 0.00055 ETH | 0.00008496 | ||||
| Stake Llp | 848281 | 681 days ago | IN | 0 ETH | 0.00006575 | ||||
| Stake Llp | 848278 | 681 days ago | IN | 0 ETH | 0.00005931 | ||||
| Create Mint Requ... | 848262 | 681 days ago | IN | 0.00055 ETH | 0.00009813 | ||||
| Create Mint Requ... | 848256 | 681 days ago | IN | 0.00055 ETH | 0.00009778 | ||||
| Create Mint Requ... | 847906 | 681 days ago | IN | 0.00055 ETH | 0.00008056 | ||||
| Create Burn Requ... | 847707 | 681 days ago | IN | 0.00055 ETH | 0.00008853 | ||||
| Stake Llp | 846952 | 681 days ago | IN | 0 ETH | 0.00005839 | ||||
| Create Mint Requ... | 846948 | 681 days ago | IN | 0.00055 ETH | 0.00008359 | ||||
| Create Mint Requ... | 846934 | 681 days ago | IN | 0.00055 ETH | 0.0000866 | ||||
| Create Burn Requ... | 846902 | 681 days ago | IN | 0.00055 ETH | 0.00009281 | ||||
| Unstake Llp | 846847 | 681 days ago | IN | 0 ETH | 0.00005807 | ||||
| Create Mint Requ... | 846692 | 681 days ago | IN | 0.00055 ETH | 0.00008086 | ||||
| Create Burn Requ... | 846598 | 681 days ago | IN | 0.00055 ETH | 0.00009035 | ||||
| Unstake Llp | 846547 | 681 days ago | IN | 0 ETH | 0.00005313 | ||||
| Stake Llp | 846397 | 681 days ago | IN | 0 ETH | 0.00006701 | ||||
| Create Burn Requ... | 845855 | 681 days ago | IN | 0.00055 ETH | 0.00008268 | ||||
| Unstake Llp | 845830 | 681 days ago | IN | 0 ETH | 0.00005115 | ||||
| Create Burn Requ... | 844603 | 681 days ago | IN | 0.00055 ETH | 0.00009986 | ||||
| Unstake Llp | 844539 | 681 days ago | IN | 0 ETH | 0.00006113 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 848858 | 681 days ago | 0.00055 ETH | ||||
| 848604 | 681 days ago | 0.00055 ETH | ||||
| 848529 | 681 days ago | 0.00055 ETH | ||||
| 848467 | 681 days ago | 0.00055 ETH | ||||
| 848264 | 681 days ago | 0.00055 ETH | ||||
| 848258 | 681 days ago | 0.00055 ETH | ||||
| 847908 | 681 days ago | 0.00055 ETH | ||||
| 847709 | 681 days ago | 0.00055 ETH | ||||
| 846951 | 681 days ago | 0.00055 ETH | ||||
| 846936 | 681 days ago | 0.00055 ETH | ||||
| 846904 | 681 days ago | 0.00055 ETH | ||||
| 846694 | 681 days ago | 0.00055 ETH | ||||
| 846599 | 681 days ago | 0.00055 ETH | ||||
| 845857 | 681 days ago | 0.00055 ETH | ||||
| 844605 | 681 days ago | 0.00055 ETH | ||||
| 843973 | 681 days ago | 0.00055 ETH | ||||
| 843555 | 681 days ago | 0.00055 ETH | ||||
| 843520 | 681 days ago | 0.00055 ETH | ||||
| 843500 | 681 days ago | 0.00055 ETH | ||||
| 843482 | 681 days ago | 0.00055 ETH | ||||
| 843482 | 681 days ago | 0.00055 ETH | ||||
| 840938 | 681 days ago | 0.00055 ETH | ||||
| 840809 | 681 days ago | 0.00055 ETH | ||||
| 840070 | 681 days ago | 0.00055 ETH | ||||
| 838583 | 681 days ago | 0.00055 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
RewardRouter
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity)
/**
*Submitted for verification at blastscan.io on 2024-03-01
*/
// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity 0.8.19;
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @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);
/**
* @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 `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount) external returns (bool);
function decimals() external view returns (uint8);
}
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
/**
* @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].
*/
abstract 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;
/**
* @dev Unauthorized reentrant call.
*/
error ReentrancyGuardReentrantCall();
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
if (_status == _ENTERED) {
revert ReentrancyGuardReentrantCall();
}
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
/**
* @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);
}
}
}
}
interface IRewardTracker {
function depositBalances(address _account, address _depositToken) external view returns (uint256);
function stakeForAccount(address _fundingAccount, address _account, address _depositToken, uint256 _amount) external;
function unstakeForAccount(address _account, address _depositToken, uint256 _amount, address _receiver) external;
function claimForAccount(address _account, address _receiver) external returns (uint256);
function claimable(address _account) external view returns (uint256);
}
interface IRewardRouter {
function feeLlpTracker() external view returns (address);
function executeMintRequests(uint endIndex, address payable feeReceiver ) external returns(uint);
function executeBurnRequests(uint endIndex, address payable feeReceiver ) external returns (uint);
function mintAccountIdx(address user) external returns (uint);
function burnAccountIdx(address user) external returns (uint);
}
interface IUtils {
function validateIncreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong) external view;
function validateDecreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong, address _receiver) external view;
function validateLiquidation(address _account, address _collateralToken, address _indexToken, bool _isLong, bool _raise, uint256 _markPrice) external returns (uint256, int256);
function getEntryBorrowingRate(address _collateralToken, address _indexToken, bool _isLong) external view returns (uint256);
function getEntryFundingRate(address _collateralToken, address _indexToken, bool _isLong) external view returns (int256);
function getPositionFee(address _account, address _collateralToken, address _indexToken, bool _isLong, uint256 _sizeDelta) external view returns (uint256);
function getBorrowingFee(address _account, address _collateralToken, address _indexToken, bool _isLong, uint256 _size, uint256 _entryBorrowingRate) external view returns (uint256);
function getBuyUsdlFeeBasisPoints(address _token, uint256 _usdgAmount) external view returns (uint256);
function getSellUsdlFeeBasisPoints(address _token, uint256 _usdgAmount) external view returns (uint256);
function getFeeBasisPoints(address _token, uint256 _usdgDelta, uint256 _feeBasisPoints, bool _increment) external view returns (uint256);
function getDelta(
address _indexToken,
uint256 _size,
uint256 _averagePrice,
uint256 _nextPrice,
bool _isLong,
uint256 _lastIncreasedTime
) external view returns (bool, uint256);
function getNextGlobalAveragePrice(
address _account,
address _collateralToken,
address _indexToken,
uint256 _nextPrice,
uint256 _sizeDelta,
bool _isLong,
bool _isIncrease
) external view returns (uint256);
function getNextAveragePrice(
address _indexToken,
uint256 _size,
uint256 _averagePrice,
bool _isLong,
uint256 _nextPrice,
uint256 _sizeDelta,
uint256 _lastIncreasedTime
) external view returns (uint256);
function adjustForDecimals(
uint256 _amount,
address _tokenDiv,
address _tokenMul
) external view returns (uint256);
function getGlobalPositionDelta(address _token, uint size, bool _isLong) external view returns (bool, uint256);
function getAum(bool maximise) external view returns (uint256);
function getAumInUsdl(
bool maximise
) external view returns (uint256);
function validatePosition(
uint256 _size,
uint256 _collateral
) external view;
function getNextBorrowingRate(address _indexToken, bool _isLong) external view returns(uint);
function getMinPrice(address _token) external view returns (uint256);
function tokenToUsdMin(address _token, uint256 _tokenAmount) external view returns (uint256);
function getMaxPrice(address _token) external view returns (uint256);
function usdToTokenMin(address _token, uint256 _usdAmount) external view returns (uint256);
function usdToTokenMax(address _token, uint256 _usdAmount) external view returns (uint256);
function updateCumulativeBorrowingRate(address _indexToken) external view returns(uint256 borrowingTime, uint256 borrowingRateForLongs, uint256 borrowingRateForShorts);
function updateCumulativeFundingRate(address _indexToken, uint256 lastFundingTime) external returns(uint lastFundingUpdateTime, int256 fundingRateForLong, int256 fundingRateForShort);
function getRedemptionAmount(address _token, uint256 _usdlAmount) external view returns (uint256);
function collectMarginFees(
address _account,
address _collateralToken,
address _indexToken,
bool _isLong,
uint256 _sizeDelta,
uint256 _size,
uint256 _entryBorrowingRate,
int256 _entryFundingRate
) external returns (int256 feeUsd);
function getTPPrice(uint256 sizeDelta, bool isLong, uint256 markPrice, uint256 _maxTPAmount, address collateralToken) external returns(uint256);
function calcLiquidationFee(uint256 size, address indexToken) external returns(uint);
function setPriceFeed(address _pricefeed) external;
function getOI(address _token, bool _isLong) view external returns(uint);
function getLPAmountInUSD() external view returns(uint lpAmountInUSD);
function getTotalOI() view external returns(uint totalOI);
function maintanenceMargin(address token) external view returns(uint);
function tokenPremiumPositionFee(address token) external view returns(int);
}
library StructsUtils {
struct IncreasePositionRequest {
address account;
address _collateralToken;
address indexToken;
uint256 amountIn;
uint256 sizeDelta;
bool isLong;
uint256 acceptablePrice;
uint256 executionFee;
uint256 blockNumber;
uint256 blockTime;
}
struct DecreasePositionRequest {
address account;
address _collateralToken;
address indexToken;
uint256 sizeDelta;
bool isLong;
address receiver;
uint256 acceptablePrice;
uint256 executionFee;
uint256 blockNumber;
uint256 blockTime;
}
struct Order {
address account;
address collateralToken;
address indexToken;
uint256 collateralDelta;
uint256 sizeDelta;
uint256 triggerPrice;
uint256 executionFee;
bool isLong;
bool triggerAboveThreshold;
bool isIncreaseOrder;
bool isMaxOrder;
uint256 orderIndex;
}
struct Position {
address account;
address collateralToken;
address indexToken;
bool isLong;
uint256 size;
uint256 collateral;
uint256 averagePrice;
uint256 entryBorrowingRate;
int256 entryFundingRate;
int256 realisedPnl;
uint256 lastIncreasedTime;
}
struct MintLLPRequest {
address account;
uint256 amount;
address collateralToken;
uint256 executionFee;
uint256 minUsdl;
uint256 minLLP;
}
struct BurnLLPRequest {
address account;
uint256 amount;
address collateralToken;
uint256 minOut;
address receiver;
uint256 executionFee;
}
struct LiquidatorCacheReturn {
IndexTokenDetails[] indexTokenDetailsArray;
VaultDetails vaultDetails;
}
struct IndexTokenDetails {
address indexToken;
uint256 minProfitBasisPoints;
uint256 maintanenceMargin;
CumulativeBorrowingRate cumulativeBorrowingRate;
CumulativeFundingRate cumulativeFundingRate;
}
struct CumulativeBorrowingRate {
uint256 borrowingTime;
uint256 currentBorrowingRateLongs;
uint256 currentBorrowingRateShorts;
}
struct CumulativeFundingRate {
uint lastFundingTime;
int currentFundingRateLongs;
int currentFundingRateShorts;
}
struct VaultDetails {
uint256 minProfitTime;
uint256 liquidationFactor;
uint256 liquidationFeeUsd;
uint256 marginFeeBasisPoints;
}
struct FECacheReturn {
IndexTokenDetailsFE[] indexTokenDetailsArray;
PoolDetailsFE poolDetails;
}
struct IndexTokenDetailsFE {
address indexToken;
uint borrowingRateLong;
uint borrowingRateShort;
int256 fundingRateLong;
int256 fundingRateShort;
uint longOpenInterest;
uint shortOpenInterest;
uint256 globalLongSizesLimitBps;
uint256 globalShortSizesLimitBps;
}
struct PoolDetailsFE {
uint256 totalSupply;
uint256 totalStaked;
uint256 poolValue;
uint256 poolAmounts;
}
}
interface IVault {
struct FundingFeeData {
uint256 fundingRateFactor;
uint256 fundingInterval;
uint256 fundingExponent;
}
struct BorrowingFeeData {
uint256 borrowingRateFactor;
uint256 borrowingInterval;
uint256 borrowingExponent;
}
function isInitialized() external view returns (bool);
function setUtils(address _utils) external;
function usdl() external view returns (address);
function maxLeverage(address _token) external view returns (uint256);
function oiImbalanceThreshold(
address _token
) external view returns (uint256);
function gov() external view returns (address);
function ceaseTradingActivity() external view returns (bool);
function ceaseLPActivity() external view returns (bool);
function minProfitTime() external view returns (uint256);
function hasDynamicFees() external view returns (bool);
function inManagerMode() external view returns (bool);
function inPrivateLiquidationMode() external view returns (bool);
function maxGasPrice() external view returns (uint256);
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 lastBorrowingTimes(address _token) external view returns (uint256);
function lastFundingTimes(address _token) external view returns (uint256);
function setMaxLeverage(uint256 _maxLeverage, address _token) external;
function setInManagerMode(bool _inManagerMode) external;
function setManager(address _manager, bool _isManager) external;
function setMaxGasPrice(uint256 _maxGasPrice) external;
function setMaxGlobalShortSize(address _token, uint256 _amount) external;
function setMaxGlobalLongSize(address _token, uint256 _amount) external;
function setInPrivateLiquidationMode(
bool _inPrivateLiquidationMode
) external;
function setLiquidator(address _liquidator, bool _isActive) external;
function setBorrowingRate(
address token,
uint256 _borrowingInterval,
uint256 _borrowingRateFactor,
uint256 borrowingExponent
) external;
function setFundingRate(
address token,
uint256 _fundingInterval,
uint256 _fundingRateFactor,
uint256 fundingExponent
) external;
function setFees(
uint256 _mintBurnFeeBasisPoints,
uint256 _marginFeeBasisPoints,
uint256 _liquidationFeeUsd,
uint256 liquidationFactor,
uint256 _minProfitTime,
bool _hasDynamicFees
) external;
function setTokenConfig(
address _token,
uint256 _tokenDecimals,
uint256 _minProfitBps,
bool _isStable,
bool _canBeCollateralToken,
bool _canBeIndexToken,
uint _maxLeverage
) external;
function setCeaseLPActivity(bool _cease) external;
function setCeaseTradingActivity(bool _cease) external;
function setPriceFeed(address _priceFeed) external;
function withdrawFees(
address _token,
address _receiver
) external returns (uint256);
function setGov(address _gov) external;
function directPoolDeposit(address _token) external;
function buyUSDL(
address _token,
address _receiver
) external returns (uint256);
function sellUSDL(
address _token,
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 _sizeDelta,
bool _isLong,
address _receiver
) external returns (uint256);
function liquidatePosition(
address _account,
address _collateralToken,
address _indexToken,
bool _isLong,
address _feeReceiver
) external;
function liquidatePosition(bytes32 key, address feeReceiver) external;
function priceFeed() external view returns (address);
function fundingRateFactor(
address
) external view returns (uint256, uint256, uint256);
function borrowingRateFactor(
address
) external view returns (uint256, uint256, uint256);
function cumulativeBorrowingRatesForLongs(
address _token
) external view returns (uint256);
function cumulativeBorrowingRatesForShorts(
address _token
) external view returns (uint256);
function cumulativeFundingRatesForLongs(
address _token
) external view returns (int);
function cumulativeFundingRatesForShorts(
address _token
) external view returns (int);
function liquidationFeeUsd() external view returns (uint256);
function liquidationFactor() external view returns (uint256);
function mintBurnFeeBasisPoints() 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 feeReserves(address _token) external view returns (uint256);
function globalShortSizes(address _token) external view returns (uint256);
function globalLongSizes(address _token) external view returns (uint256);
function globalShortAveragePrices(
address _token
) external view returns (uint256);
function globalLongAveragePrices(
address _token
) external view returns (uint256);
function maxGlobalShortSizesBps(
address _token
) external view returns (uint256);
function maxGlobalLongSizesBps(
address _token
) external view returns (uint256);
function tokenDecimals(address _token) external view returns (uint256);
function canBeIndexToken(address _token) external view returns (bool);
function canBeCollateralToken(address _token) external view returns (bool);
function poolAmounts(address _token) external view returns (uint256);
function setGlobalLongSizesLimitBps(address token, uint amount) external;
function setGlobalShortSizesLimitBps(address token, uint amount) external;
function setPoolSafetyFactorInBps(uint _poolSafetyFactorInBps) external;
function getPosition(
address _account,
address _collateralToken,
address _indexToken,
bool _isLong
) external view returns (StructsUtils.Position memory);
function globalShortSizesLimitBps(
address _token
) external view returns (uint256);
function globalLongSizesLimitBps(
address _token
) external view returns (uint256);
}
interface ILlpManager {
function llp() external view returns (address);
function usdl() external view returns (address);
function vault() external view returns (IVault);
function cooldownDuration() external returns (uint256);
function lastAddedAt(address _account) external returns (uint256);
function addLiquidityForAccount(address _fundingAccount, address _account, address _token, uint256 _amount, uint256 _minUsdl, uint256 _minllp) external returns (uint256);
function removeLiquidityForAccount(address _account, address _tokenOut, uint256 _llpAmount, uint256 _minOut, address _receiver) external returns (uint256);
function setCooldownDuration(uint256 _cooldownDuration) external;
function whiteListedTokens(address token) external returns (bool);
}
contract Governable {
address public gov;
constructor() {
gov = msg.sender;
}
modifier onlyGov() {
require(msg.sender == gov, "Governable: forbidden");
_;
}
function setGov(address _gov) external onlyGov {
gov = _gov;
}
}
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol)
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
/**
* @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 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)+(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)-(value);
_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");
}
}
}
interface IBlastPoints {
function configurePointsOperator(address operator) external;
}
contract RewardRouter is IRewardRouter, ReentrancyGuard, Governable {
using SafeERC20 for IERC20;
using Address for address payable;
bool public isInitialized;
address public llp; // logX Liquidity Provider token
address public llpManager;
uint256 public minExecutionFee;
mapping(address => bool) public isKeeper;
mapping(address=>uint) public mintAccountIdx;
mapping(address=>uint) public burnAccountIdx;
mapping(bytes32=>StructsUtils.MintLLPRequest) public mintRequests;
mapping(bytes32=>StructsUtils.BurnLLPRequest) public burnReqeusts;
address public override feeLlpTracker;
bytes32[] public arrayOfMintRequests;
bytes32[] public arrayOfBurnRequests;
uint256 public mintRequestExecuteStart;
uint256 public burnRequestExecuteStart;
event CreateMintRequest(address indexed account, uint256 amount);
event CreateBurnRequest(address indexed account, uint256 amount);
event CancelMintRequest(address indexed account, uint256 amount);
event CancelBurnRequest(address indexed account, uint256 amount);
event Mintllp(address indexed account, uint256 amount);
event Burnllp(address indexed account, uint256 amount);
function initialize(
address _llp,
address _llpManager,
address _feeLlpTracker
) external onlyGov {
require(!isInitialized, "RewardRouter: already initialized");
isInitialized = true;
llp = _llp;
llpManager = _llpManager;
feeLlpTracker = _feeLlpTracker;
}
modifier onlyKeeper(){
require(isKeeper[msg.sender]||(msg.sender == address(this)), "RewardRouter: Not keeper");
_;
}
function setFeeLlpTracker(address _feeLlpTracker) external onlyGov {
feeLlpTracker = _feeLlpTracker;
}
function setLlpManager(address _llpManager) external onlyGov {
llpManager = _llpManager;
}
function setLlp(address _llp) external onlyGov {
llp = _llp;
}
function setMinExecutionFee(uint256 _minExecutionFee) external onlyGov {
minExecutionFee = _minExecutionFee;
}
function setKeeperStatus(address newKeeper, bool status) external onlyGov {
isKeeper[newKeeper] = status;
}
// to help users who accidentally send their tokens to this contract
function withdrawToken(address _token, address _account, uint256 _amount) external onlyGov {
IERC20(_token).safeTransfer(_account, _amount);
}
function mintLlp(address _token, uint256 _amount, uint256 _minUsdl, uint256 _minLlp) external nonReentrant returns (uint256) {
require(_amount > 0, "RewardRouter: invalid _amount");
address account = msg.sender;
uint256 llpAmount = ILlpManager(llpManager).addLiquidityForAccount(account, account, _token, _amount, _minUsdl, _minLlp);
emit Mintllp(account, llpAmount);
return llpAmount;
}
function burnLlp( uint256 _llpAmount, uint256 _minOut, address tokenOut) external nonReentrant returns (uint256) {
require(_llpAmount > 0, "RewardRouter: invalid _llpAmount");
address account = msg.sender;
uint256 amountOut = ILlpManager(llpManager).removeLiquidityForAccount(account, tokenOut, _llpAmount, _minOut, account);
emit Burnllp(account, _llpAmount);
return amountOut;
}
function stakeLlp(uint256 llpAmount) external nonReentrant {
require(llpAmount > 0, "RewardRouter: llpAmount too low");
address account = msg.sender;
IRewardTracker(feeLlpTracker).stakeForAccount(account, account, llp, llpAmount);
}
function unstakeLlp(uint256 amount) external nonReentrant {
address account = msg.sender;
IRewardTracker(feeLlpTracker).unstakeForAccount(account, llp, amount, account);
}
function claimStakeRewards() external nonReentrant returns(uint256){
address account = msg.sender;
return IRewardTracker(feeLlpTracker).claimForAccount(account, account);
}
function createMintRequest(address account, uint256 executionFee, address token, uint256 amount,uint256 minUsdl, uint256 minLLP) payable external {
require(executionFee >= minExecutionFee, "RewardRouter: Not enough execution fee");
require(executionFee == msg.value, "RewardRouter: execution fee doesn't match");
require(ILlpManager(llpManager).whiteListedTokens(token), "RewardRouter: not suported LP token");
IERC20(token).safeTransferFrom(account, address(this), amount);
_createMintRequest(account, executionFee, token, amount, minUsdl, minLLP);
}
function _createMintRequest(address account, uint256 executionFee, address token, uint256 amount, uint256 minUsdl, uint256 minLLP) internal {
uint256 requestIdx = mintAccountIdx[account];
bytes32 requestKey = getRequestKey(account, requestIdx);
mintAccountIdx[account] = requestIdx +1;
StructsUtils.MintLLPRequest memory mintRequest = StructsUtils.MintLLPRequest(account, amount, token, executionFee, minUsdl, minLLP);
mintRequests[requestKey] = mintRequest;
arrayOfMintRequests.push(requestKey);
emit CreateMintRequest(account, amount);
}
function createBurnRequest(address account, uint256 executionFee, address token, uint256 amount,uint256 minOut, address receiver) payable external {
require(executionFee >= minExecutionFee, "RewardRouter: Not enough execution fee");
require(executionFee == msg.value, "RewardRouter: execution fee doesn't match");
require(msg.sender==account, "RewardRouter: account should be same as msg.sender");
require(IERC20(llp).balanceOf(account) >= amount,"RewardRouter: insuff LLP");
uint256 requestIdx = burnAccountIdx[account];
bytes32 requestKey = getRequestKey(account, requestIdx);
burnAccountIdx[account] = requestIdx +1;
StructsUtils.BurnLLPRequest memory burnRequest = StructsUtils.BurnLLPRequest(account, amount, token, minOut, receiver, executionFee);
burnReqeusts[requestKey] = burnRequest;
arrayOfBurnRequests.push(requestKey);
emit CreateBurnRequest(account, amount);
}
function getRequestKey(
address account,
uint256 index
) internal pure returns (bytes32) {
return keccak256(abi.encodePacked(account, index));
}
function executeMintRequests(uint endIndex, address payable feeReceiver ) external onlyKeeper returns(uint) {
uint256 lastIdx = arrayOfMintRequests.length;
uint256 index = mintRequestExecuteStart;
if(index >= lastIdx){
return index;
}
if(endIndex>lastIdx){
endIndex = lastIdx;
}
while(index<endIndex){
bytes32 requestKey = arrayOfMintRequests[index];
try
this._executeMintRequest(requestKey, feeReceiver)
returns(bool _wasExecuted){
if (!_wasExecuted) {
break;
}
} catch {
try
this._cancelMintRequest(requestKey, feeReceiver)
returns (bool _wasCancelled) {
if (!_wasCancelled) {}
} catch {
continue;
}
}
index++;
delete mintRequests[requestKey];
}
mintRequestExecuteStart = index;
return index;
}
function executeBurnRequests(uint endIndex, address payable feeReceiver ) external onlyKeeper returns (uint) {
uint256 lastIdx = arrayOfBurnRequests.length;
uint256 index = burnRequestExecuteStart;
if(index >= lastIdx){
return index;
}
if(endIndex>lastIdx){
endIndex = lastIdx;
}
while(index<endIndex){
bytes32 requestKey = arrayOfBurnRequests[index];
try
this._executeBurnRequest(requestKey, feeReceiver)
returns(bool _wasExecuted){
if (!_wasExecuted) {
break;
}
} catch {
try
this._cancelBurnRequest(requestKey, feeReceiver)
returns (bool _wasCancelled) {
if (!_wasCancelled) {}
} catch {
continue;
}
}
index++;
delete burnReqeusts[requestKey];
}
burnRequestExecuteStart = index;
return index;
}
function _executeMintRequest(bytes32 requestKey, address payable feeReceiver) public onlyKeeper returns(bool) {
StructsUtils.MintLLPRequest memory mintRequest = mintRequests[requestKey];
if(mintRequest.account == address(0)){
return true;
}
IERC20(mintRequest.collateralToken).approve(llpManager, mintRequest.amount);
uint256 llpAmount = ILlpManager(llpManager).addLiquidityForAccount(address(this), mintRequest.account, mintRequest.collateralToken, mintRequest.amount, mintRequest.minUsdl, mintRequest.minUsdl);
emit Mintllp(mintRequest.account, llpAmount);
(bool success, ) = feeReceiver.call{value: mintRequest.executionFee}("");
require(success, "Failed to send mint execution fee to keeper");
return true;
}
function _cancelMintRequest(bytes32 requestKey, address payable feeReceiver) public onlyKeeper returns(bool) {
StructsUtils.MintLLPRequest memory mintRequest = mintRequests[requestKey];
if(mintRequest.account == address(0)){
return true;
}
IERC20(mintRequest.collateralToken).transfer(mintRequest.account, mintRequest.amount);
(bool success, ) = feeReceiver.call{value: mintRequest.executionFee}("");
require(success, "Failed to send mint execution fee to keeper");
emit CancelMintRequest(mintRequest.account, mintRequest.amount);
return true;
}
function _executeBurnRequest(bytes32 requestKey, address payable feeReceiver) public onlyKeeper returns(bool) {
StructsUtils.BurnLLPRequest memory burnRequest = burnReqeusts[requestKey];
if(burnRequest.account == address(0)){
return true;
}
uint256 llpAmount = ILlpManager(llpManager).removeLiquidityForAccount(burnRequest.account, burnRequest.collateralToken, burnRequest.amount, burnRequest.minOut, burnRequest.receiver);
emit Burnllp(burnRequest.account, llpAmount);
(bool success, ) = feeReceiver.call{value: burnRequest.executionFee}("");
require(success, "Failed to send mint execution fee to keeper");
return true;
}
function _cancelBurnRequest(bytes32 requestKey, address payable feeReceiver) public onlyKeeper returns(bool) {
StructsUtils.BurnLLPRequest memory burnRequest = burnReqeusts[requestKey];
if(burnRequest.account == address(0)){
return true;
}
emit CancelBurnRequest(burnRequest.account, burnRequest.amount);
return true;
}
function getMintRequestsCount() public view returns(uint){
return arrayOfMintRequests.length;
}
function getBurnRequestsCount() public view returns(uint){
return arrayOfBurnRequests.length;
}
function initiateBlastPoints(address blastPointContract, address pointsOperator) onlyGov external {
IBlastPoints(blastPointContract).configurePointsOperator(pointsOperator);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Burnllp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CancelBurnRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CancelMintRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CreateBurnRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CreateMintRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Mintllp","type":"event"},{"inputs":[{"internalType":"bytes32","name":"requestKey","type":"bytes32"},{"internalType":"address payable","name":"feeReceiver","type":"address"}],"name":"_cancelBurnRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestKey","type":"bytes32"},{"internalType":"address payable","name":"feeReceiver","type":"address"}],"name":"_cancelMintRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestKey","type":"bytes32"},{"internalType":"address payable","name":"feeReceiver","type":"address"}],"name":"_executeBurnRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestKey","type":"bytes32"},{"internalType":"address payable","name":"feeReceiver","type":"address"}],"name":"_executeMintRequest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"arrayOfBurnRequests","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"arrayOfMintRequests","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"burnAccountIdx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_llpAmount","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"burnLlp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"burnReqeusts","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"collateralToken","type":"address"},{"internalType":"uint256","name":"minOut","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"executionFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnRequestExecuteStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimStakeRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"executionFee","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minOut","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"createBurnRequest","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"executionFee","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"minUsdl","type":"uint256"},{"internalType":"uint256","name":"minLLP","type":"uint256"}],"name":"createMintRequest","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"endIndex","type":"uint256"},{"internalType":"address payable","name":"feeReceiver","type":"address"}],"name":"executeBurnRequests","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"endIndex","type":"uint256"},{"internalType":"address payable","name":"feeReceiver","type":"address"}],"name":"executeMintRequests","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeLlpTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnRequestsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintRequestsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_llp","type":"address"},{"internalType":"address","name":"_llpManager","type":"address"},{"internalType":"address","name":"_feeLlpTracker","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"blastPointContract","type":"address"},{"internalType":"address","name":"pointsOperator","type":"address"}],"name":"initiateBlastPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isKeeper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"llp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"llpManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minExecutionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintAccountIdx","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":"_minUsdl","type":"uint256"},{"internalType":"uint256","name":"_minLlp","type":"uint256"}],"name":"mintLlp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintRequestExecuteStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"mintRequests","outputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"collateralToken","type":"address"},{"internalType":"uint256","name":"executionFee","type":"uint256"},{"internalType":"uint256","name":"minUsdl","type":"uint256"},{"internalType":"uint256","name":"minLLP","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_feeLlpTracker","type":"address"}],"name":"setFeeLlpTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gov","type":"address"}],"name":"setGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newKeeper","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setKeeperStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_llp","type":"address"}],"name":"setLlp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_llpManager","type":"address"}],"name":"setLlpManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minExecutionFee","type":"uint256"}],"name":"setMinExecutionFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"llpAmount","type":"uint256"}],"name":"stakeLlp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unstakeLlp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b506001600081905580546001600160a01b031916331790556128be806100376000396000f3fe60806040526004361061022f5760003560e01c80636ba42aaa1161012e578063b46d32a3116100ab578063ee536a661161006f578063ee536a6614610795578063f540c10d146107b5578063f76d014f146107d5578063fc2cee62146107eb578063fc2e30a51461080b57600080fd5b8063b46d32a31461070a578063c0c53b8b1461071f578063c1bb9ebc1461073f578063cfad57a214610755578063d54eefaf1461077557600080fd5b80638ad24a86116100f25780638ad24a861461065d57806391fcf5a81461067d578063a0a48d521461069d578063ae4ca2d0146106ca578063b2419939146106ea57600080fd5b80636ba42aaa146105ad5780637c5babaa146105dd5780637e5c153f146105fd5780638116f1311461061d57806381abfdc91461063d57600080fd5b80632649bc79116101bc5780634d3a5992116101805780634d3a59921461053c5780634e8a7e801461054f5780635126c9021461056457806363ae2103146105775780636acd58ba1461058d57600080fd5b80632649bc791461049b578063392e53cd146104bb578063396119fa146104dc5780633a50a3b5146104fc5780633ad13bfa1461051c57600080fd5b80630d39e46d116102035780630d39e46d146102e35780630fa503b61461037d57806312d43a51146103ab5780631f2c7b5b146103cb578063239e2e461461046e57600080fd5b8062389ac51461023457806301e336671461027157806302e963f114610293578063036f5ade146102c3575b600080fd5b34801561024057600080fd5b50600a54610254906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561027d57600080fd5b5061029161028c366004612386565b610820565b005b34801561029f57600080fd5b506102b36102ae3660046123c7565b61086c565b6040519015158152602001610268565b3480156102cf57600080fd5b506102916102de3660046123f7565b610a5f565b3480156102ef57600080fd5b5061033f6102fe366004612414565b6008602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160a01b0394851695939490921692909186565b604080516001600160a01b039788168152602081019690965293909516928401929092526060830152608082015260a081019190915260c001610268565b34801561038957600080fd5b5061039d610398366004612414565b610aab565b604051908152602001610268565b3480156103b757600080fd5b50600154610254906001600160a01b031681565b3480156103d757600080fd5b5061042b6103e6366004612414565b6009602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160a01b039485169593949283169391929091169086565b604080516001600160a01b0397881681526020810196909652938616938501939093526060840191909152909216608082015260a081019190915260c001610268565b34801561047a57600080fd5b5061039d6104893660046123f7565b60076020526000908152604090205481565b3480156104a757600080fd5b5061039d6104b636600461242d565b610acc565b3480156104c757600080fd5b506001546102b390600160a01b900460ff1681565b3480156104e857600080fd5b506102916104f7366004612414565b610c10565b34801561050857600080fd5b506102b36105173660046123c7565b610ca1565b34801561052857600080fd5b506102b36105373660046123c7565b610f1c565b61029161054a366004612466565b6110c9565b34801561055b57600080fd5b50600c5461039d565b6102916105723660046124c2565b6111fd565b34801561058357600080fd5b5061039d60045481565b34801561059957600080fd5b506102916105a8366004612537565b611546565b3480156105b957600080fd5b506102b36105c83660046123f7565b60056020526000908152604090205460ff1681565b3480156105e957600080fd5b506102916105f83660046123f7565b61159b565b34801561060957600080fd5b50610291610618366004612414565b6115e7565b34801561062957600080fd5b50600254610254906001600160a01b031681565b34801561064957600080fd5b50600354610254906001600160a01b031681565b34801561066957600080fd5b5061039d6106783660046123c7565b61168c565b34801561068957600080fd5b5061039d610698366004612565565b61186b565b3480156106a957600080fd5b5061039d6106b83660046123f7565b60066020526000908152604090205481565b3480156106d657600080fd5b506102916106e53660046123f7565b6119a1565b3480156106f657600080fd5b506102b36107053660046123c7565b6119ed565b34801561071657600080fd5b5061039d611aed565b34801561072b57600080fd5b5061029161073a3660046125a0565b611b7d565b34801561074b57600080fd5b5061039d600e5481565b34801561076157600080fd5b506102916107703660046123f7565b611c5d565b34801561078157600080fd5b5061039d6107903660046123c7565b611ca9565b3480156107a157600080fd5b5061039d6107b0366004612414565b611e8b565b3480156107c157600080fd5b506102916107d03660046125e0565b611e9b565b3480156107e157600080fd5b5061039d600d5481565b3480156107f757600080fd5b50610291610806366004612414565b611f1c565b34801561081757600080fd5b50600b5461039d565b6001546001600160a01b031633146108535760405162461bcd60e51b815260040161084a9061260e565b60405180910390fd5b6108676001600160a01b0384168383611f4b565b505050565b3360009081526005602052604081205460ff168061088957503330145b6108a55760405162461bcd60e51b815260040161084a9061263d565b600083815260086020908152604091829020825160c08101845281546001600160a01b039081168083526001840154948301949094526002830154169381019390935260038101546060840152600481015460808401526005015460a0830152610913576001915050610a59565b60408181015182516020840151925163a9059cbb60e01b81526001600160a01b0391821660048201526024810193909352169063a9059cbb906044016020604051808303816000875af115801561096e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109929190612674565b5060608101516040516000916001600160a01b038616918381818185875af1925050503d80600081146109e1576040519150601f19603f3d011682016040523d82523d6000602084013e6109e6565b606091505b5050905080610a075760405162461bcd60e51b815260040161084a90612691565b81600001516001600160a01b03167fe3861323d3496a71690430a440d3f89298d4cede5317e52cff163abb909aab208360200151604051610a4a91815260200190565b60405180910390a26001925050505b92915050565b6001546001600160a01b03163314610a895760405162461bcd60e51b815260040161084a9061260e565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600b8181548110610abb57600080fd5b600091825260209091200154905081565b6000610ad6611fae565b60008411610b265760405162461bcd60e51b815260206004820181905260248201527f526577617264526f757465723a20696e76616c6964205f6c6c70416d6f756e74604482015260640161084a565b6003546040516371d597ad60e01b815233600482018190526001600160a01b03858116602484015260448301889052606483018790526084830182905290926000929116906371d597ad9060a4016020604051808303816000875af1158015610b93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb791906126dc565b9050816001600160a01b03167fbfed372bc52735a8e622ff9ce7bcf01f9031fb1beb6aca08ac87480a1dbe471087604051610bf491815260200190565b60405180910390a2915050610c096001600055565b9392505050565b610c18611fae565b600a5460025460405163098bf59d60e01b815233600482018190526001600160a01b039283166024830152604482018590526064820181905292919091169063098bf59d906084015b600060405180830381600087803b158015610c7b57600080fd5b505af1158015610c8f573d6000803e3d6000fd5b5050505050610c9e6001600055565b50565b3360009081526005602052604081205460ff1680610cbe57503330145b610cda5760405162461bcd60e51b815260040161084a9061263d565b600083815260086020908152604091829020825160c08101845281546001600160a01b039081168083526001840154948301949094526002830154169381019390935260038101546060840152600481015460808401526005015460a0830152610d48576001915050610a59565b6040818101516003546020840151925163095ea7b360e01b81526001600160a01b0391821660048201526024810193909352169063095ea7b3906044016020604051808303816000875af1158015610da4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc89190612674565b5060035481516040808401516020850151608086015192516317eb2a1560e01b81526000956001600160a01b0316946317eb2a1594610e1394309492939092919081906004016126f5565b6020604051808303816000875af1158015610e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5691906126dc565b82516040518281529192506001600160a01b0316907f41115caaff93d0fb3d6d596733e2442429850baef9d556b420e59b096b1ffe759060200160405180910390a26000846001600160a01b031683606001516040515b60006040518083038185875af1925050503d8060008114610eea576040519150601f19603f3d011682016040523d82523d6000602084013e610eef565b606091505b5050905080610f105760405162461bcd60e51b815260040161084a90612691565b50600195945050505050565b3360009081526005602052604081205460ff1680610f3957503330145b610f555760405162461bcd60e51b815260040161084a9061263d565b600083815260096020908152604091829020825160c08101845281546001600160a01b03908116808352600184015494830194909452600283015481169482019490945260038201546060820152600482015490931660808401526005015460a0830152610fc7576001915050610a59565b600354815160408084015160208501516060860151608087015193516371d597ad60e01b81526001600160a01b039586166004820152928516602484015260448301919091526064820152908216608482015260009291909116906371d597ad9060a4016020604051808303816000875af115801561104a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106e91906126dc565b82516040518281529192506001600160a01b0316907fbfed372bc52735a8e622ff9ce7bcf01f9031fb1beb6aca08ac87480a1dbe47109060200160405180910390a26000846001600160a01b03168360a00151604051610ead565b6004548510156110eb5760405162461bcd60e51b815260040161084a9061272e565b34851461110a5760405162461bcd60e51b815260040161084a90612774565b60035460405163d3c2638360e01b81526001600160a01b0386811660048301529091169063d3c26383906024016020604051808303816000875af1158015611156573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117a9190612674565b6111d25760405162461bcd60e51b815260206004820152602360248201527f526577617264526f757465723a206e6f74207375706f72746564204c5020746f60448201526235b2b760e91b606482015260840161084a565b6111e76001600160a01b038516873086611fd8565b6111f5868686868686612016565b505050505050565b60045485101561121f5760405162461bcd60e51b815260040161084a9061272e565b34851461123e5760405162461bcd60e51b815260040161084a90612774565b336001600160a01b038716146112b15760405162461bcd60e51b815260206004820152603260248201527f526577617264526f757465723a206163636f756e742073686f756c642062652060448201527139b0b6b29030b99036b9b39739b2b73232b960711b606482015260840161084a565b6002546040516370a0823160e01b81526001600160a01b038881166004830152859216906370a0823190602401602060405180830381865afa1580156112fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131f91906126dc565b101561136d5760405162461bcd60e51b815260206004820152601860248201527f526577617264526f757465723a20696e73756666204c4c500000000000000000604482015260640161084a565b6001600160a01b03861660009081526007602052604081205490611391888361214d565b905061139e8260016127d3565b600760008a6001600160a01b03166001600160a01b031681526020019081526020016000208190555060006040518060c001604052808a6001600160a01b03168152602001878152602001886001600160a01b03168152602001868152602001856001600160a01b03168152602001898152509050806009600084815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015560808201518160040160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a08201518160050155905050600c829080600181540180825580915050600190039060005260206000200160009091909190915055886001600160a01b03167fac0d6b7d4c519f3e82e78a6df78c4275349679c06ff6c0cbe7ef2245f2d225fc8760405161153391815260200190565b60405180910390a2505050505050505050565b6001546001600160a01b031633146115705760405162461bcd60e51b815260040161084a9061260e565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b6001546001600160a01b031633146115c55760405162461bcd60e51b815260040161084a9061260e565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6115ef611fae565b6000811161163f5760405162461bcd60e51b815260206004820152601f60248201527f526577617264526f757465723a206c6c70416d6f756e7420746f6f206c6f7700604482015260640161084a565b600a54600254604051631e42d69b60e21b81523360048201819052602482018190526001600160a01b0392831660448301526064820185905292919091169063790b5a6c90608401610c61565b3360009081526005602052604081205460ff16806116a957503330145b6116c55760405162461bcd60e51b815260040161084a9061263d565b600b54600d548181106116db579150610a599050565b818511156116e7578194505b8481101561185e576000600b8281548110611704576117046127e6565b600091825260209091200154604051633a50a3b560e01b8152600481018290526001600160a01b03871660248201529091503090633a50a3b5906044016020604051808303816000875af192505050801561177c575060408051601f3d908101601f1916820190925261177991810190612674565b60015b6117f9576040516302e963f160e01b8152600481018290526001600160a01b038616602482015230906302e963f1906044016020604051808303816000875af19250505080156117e9575060408051601f3d908101601f191682019092526117e691810190612674565b60015b6117f357506116e7565b50611807565b8061180557505061185e565b505b81611811816127fc565b600092835260086020526040832080546001600160a01b031990811682556001820185905560028201805490911690556003810184905560048101849055600501929092555090506116e7565b600d819055949350505050565b6000611875611fae565b600084116118c55760405162461bcd60e51b815260206004820152601d60248201527f526577617264526f757465723a20696e76616c6964205f616d6f756e74000000604482015260640161084a565b6003546040516317eb2a1560e01b815233916000916001600160a01b03909116906317eb2a159061190490859081908c908c908c908c906004016126f5565b6020604051808303816000875af1158015611923573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194791906126dc565b9050816001600160a01b03167f41115caaff93d0fb3d6d596733e2442429850baef9d556b420e59b096b1ffe758260405161198491815260200190565b60405180910390a29150506119996001600055565b949350505050565b6001546001600160a01b031633146119cb5760405162461bcd60e51b815260040161084a9061260e565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526005602052604081205460ff1680611a0a57503330145b611a265760405162461bcd60e51b815260040161084a9061263d565b600083815260096020908152604091829020825160c08101845281546001600160a01b03908116808352600184015494830194909452600283015481169482019490945260038201546060820152600482015490931660808401526005015460a0830152611a98576001915050610a59565b80600001516001600160a01b03167fef06bcb737aaf23cece9d2cf084e7044f7fc556929f7b317e9459301fc5429668260200151604051611adb91815260200190565b60405180910390a25060019392505050565b6000611af7611fae565b600a546040516309f4173d60e11b8152336004820181905260248201819052916001600160a01b0316906313e82e7a906044016020604051808303816000875af1158015611b49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6d91906126dc565b915050611b7a6001600055565b90565b6001546001600160a01b03163314611ba75760405162461bcd60e51b815260040161084a9061260e565b600154600160a01b900460ff1615611c0b5760405162461bcd60e51b815260206004820152602160248201527f526577617264526f757465723a20616c726561647920696e697469616c697a656044820152601960fa1b606482015260840161084a565b6001805460ff60a01b1916600160a01b179055600280546001600160a01b039485166001600160a01b0319918216179091556003805493851693821693909317909255600a8054919093169116179055565b6001546001600160a01b03163314611c875760405162461bcd60e51b815260040161084a9061260e565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526005602052604081205460ff1680611cc657503330145b611ce25760405162461bcd60e51b815260040161084a9061263d565b600c54600e54818110611cf8579150610a599050565b81851115611d04578194505b84811015611e7e576000600c8281548110611d2157611d216127e6565b600091825260209091200154604051631d689dfd60e11b8152600481018290526001600160a01b03871660248201529091503090633ad13bfa906044016020604051808303816000875af1925050508015611d99575060408051601f3d908101601f19168201909252611d9691810190612674565b60015b611e165760405163b241993960e01b8152600481018290526001600160a01b0386166024820152309063b2419939906044016020604051808303816000875af1925050508015611e06575060408051601f3d908101601f19168201909252611e0391810190612674565b60015b611e105750611d04565b50611e24565b80611e22575050611e7e565b505b81611e2e816127fc565b600092835260096020526040832080546001600160a01b03199081168255600182018590556002820180548216905560038201859055600482018054909116905560050192909255509050611d04565b600e819055949350505050565b600c8181548110610abb57600080fd5b6001546001600160a01b03163314611ec55760405162461bcd60e51b815260040161084a9061260e565b6040516336b91f2b60e01b81526001600160a01b0382811660048301528316906336b91f2b90602401600060405180830381600087803b158015611f0857600080fd5b505af11580156111f5573d6000803e3d6000fd5b6001546001600160a01b03163314611f465760405162461bcd60e51b815260040161084a9061260e565b600455565b6040516001600160a01b03831660248201526044810182905261086790849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612194565b600260005403611fd157604051633ee5aeb560e01b815260040160405180910390fd5b6002600055565b6040516001600160a01b03808516602483015283166044820152606481018290526120109085906323b872dd60e01b90608401611f77565b50505050565b6001600160a01b0386166000908152600660205260408120549061203a888361214d565b90506120478260016127d3565b6001600160a01b03898116600081815260066020908152604080832095909555845160c0810186528381528082018b81528c8616828801908152606083018f8152608084018d815260a085018d81528b8852600887528a882086518154908c166001600160a01b03199182161782559551600180830191909155945160028201805491909c16961695909517909955905160038401555160048301559551600590910155600b805495860181559092527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9909301859055925188815290917f6f0c1e1d0dd3edf10dfe8838209c4930d845b1f29d1cb64019f6198afc69ef2c9101611533565b6040516bffffffffffffffffffffffff19606084901b1660208201526034810182905260009060540160405160208183030381529060405280519060200120905092915050565b60006121e9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122669092919063ffffffff16565b80519091501561086757808060200190518101906122079190612674565b6108675760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161084a565b6060611999848460008585843b6122bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161084a565b600080866001600160a01b031685876040516122db9190612839565b60006040518083038185875af1925050503d8060008114612318576040519150601f19603f3d011682016040523d82523d6000602084013e61231d565b606091505b509150915061232d828286612338565b979650505050505050565b60608315612347575081610c09565b8251156123575782518084602001fd5b8160405162461bcd60e51b815260040161084a9190612855565b6001600160a01b0381168114610c9e57600080fd5b60008060006060848603121561239b57600080fd5b83356123a681612371565b925060208401356123b681612371565b929592945050506040919091013590565b600080604083850312156123da57600080fd5b8235915060208301356123ec81612371565b809150509250929050565b60006020828403121561240957600080fd5b8135610c0981612371565b60006020828403121561242657600080fd5b5035919050565b60008060006060848603121561244257600080fd5b8335925060208401359150604084013561245b81612371565b809150509250925092565b60008060008060008060c0878903121561247f57600080fd5b863561248a81612371565b95506020870135945060408701356124a181612371565b959894975094956060810135955060808101359460a0909101359350915050565b60008060008060008060c087890312156124db57600080fd5b86356124e681612371565b95506020870135945060408701356124fd81612371565b9350606087013592506080870135915060a087013561251b81612371565b809150509295509295509295565b8015158114610c9e57600080fd5b6000806040838503121561254a57600080fd5b823561255581612371565b915060208301356123ec81612529565b6000806000806080858703121561257b57600080fd5b843561258681612371565b966020860135965060408601359560600135945092505050565b6000806000606084860312156125b557600080fd5b83356125c081612371565b925060208401356125d081612371565b9150604084013561245b81612371565b600080604083850312156125f357600080fd5b82356125fe81612371565b915060208301356123ec81612371565b60208082526015908201527423b7bb32b93730b136329d103337b93134b23232b760591b604082015260600190565b60208082526018908201527f526577617264526f757465723a204e6f74206b65657065720000000000000000604082015260600190565b60006020828403121561268657600080fd5b8151610c0981612529565b6020808252602b908201527f4661696c656420746f2073656e64206d696e7420657865637574696f6e20666560408201526a32903a379035b2b2b832b960a91b606082015260800190565b6000602082840312156126ee57600080fd5b5051919050565b6001600160a01b03968716815294861660208601529290941660408401526060830152608082019290925260a081019190915260c00190565b60208082526026908201527f526577617264526f757465723a204e6f7420656e6f75676820657865637574696040820152656f6e2066656560d01b606082015260800190565b60208082526029908201527f526577617264526f757465723a20657865637574696f6e2066656520646f65736040820152680dc4ee840dac2e8c6d60bb1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610a5957610a596127bd565b634e487b7160e01b600052603260045260246000fd5b60006001820161280e5761280e6127bd565b5060010190565b60005b83811015612830578181015183820152602001612818565b50506000910152565b6000825161284b818460208701612815565b9190910192915050565b6020815260008251806020840152612874816040850160208701612815565b601f01601f1916919091016040019291505056fea264697066735822122077f47cc471b611a71849e9641b7f50d9d66533242f584831ac14fc8c48b04c3864736f6c63430008130033
Deployed Bytecode
0x60806040526004361061022f5760003560e01c80636ba42aaa1161012e578063b46d32a3116100ab578063ee536a661161006f578063ee536a6614610795578063f540c10d146107b5578063f76d014f146107d5578063fc2cee62146107eb578063fc2e30a51461080b57600080fd5b8063b46d32a31461070a578063c0c53b8b1461071f578063c1bb9ebc1461073f578063cfad57a214610755578063d54eefaf1461077557600080fd5b80638ad24a86116100f25780638ad24a861461065d57806391fcf5a81461067d578063a0a48d521461069d578063ae4ca2d0146106ca578063b2419939146106ea57600080fd5b80636ba42aaa146105ad5780637c5babaa146105dd5780637e5c153f146105fd5780638116f1311461061d57806381abfdc91461063d57600080fd5b80632649bc79116101bc5780634d3a5992116101805780634d3a59921461053c5780634e8a7e801461054f5780635126c9021461056457806363ae2103146105775780636acd58ba1461058d57600080fd5b80632649bc791461049b578063392e53cd146104bb578063396119fa146104dc5780633a50a3b5146104fc5780633ad13bfa1461051c57600080fd5b80630d39e46d116102035780630d39e46d146102e35780630fa503b61461037d57806312d43a51146103ab5780631f2c7b5b146103cb578063239e2e461461046e57600080fd5b8062389ac51461023457806301e336671461027157806302e963f114610293578063036f5ade146102c3575b600080fd5b34801561024057600080fd5b50600a54610254906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561027d57600080fd5b5061029161028c366004612386565b610820565b005b34801561029f57600080fd5b506102b36102ae3660046123c7565b61086c565b6040519015158152602001610268565b3480156102cf57600080fd5b506102916102de3660046123f7565b610a5f565b3480156102ef57600080fd5b5061033f6102fe366004612414565b6008602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160a01b0394851695939490921692909186565b604080516001600160a01b039788168152602081019690965293909516928401929092526060830152608082015260a081019190915260c001610268565b34801561038957600080fd5b5061039d610398366004612414565b610aab565b604051908152602001610268565b3480156103b757600080fd5b50600154610254906001600160a01b031681565b3480156103d757600080fd5b5061042b6103e6366004612414565b6009602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160a01b039485169593949283169391929091169086565b604080516001600160a01b0397881681526020810196909652938616938501939093526060840191909152909216608082015260a081019190915260c001610268565b34801561047a57600080fd5b5061039d6104893660046123f7565b60076020526000908152604090205481565b3480156104a757600080fd5b5061039d6104b636600461242d565b610acc565b3480156104c757600080fd5b506001546102b390600160a01b900460ff1681565b3480156104e857600080fd5b506102916104f7366004612414565b610c10565b34801561050857600080fd5b506102b36105173660046123c7565b610ca1565b34801561052857600080fd5b506102b36105373660046123c7565b610f1c565b61029161054a366004612466565b6110c9565b34801561055b57600080fd5b50600c5461039d565b6102916105723660046124c2565b6111fd565b34801561058357600080fd5b5061039d60045481565b34801561059957600080fd5b506102916105a8366004612537565b611546565b3480156105b957600080fd5b506102b36105c83660046123f7565b60056020526000908152604090205460ff1681565b3480156105e957600080fd5b506102916105f83660046123f7565b61159b565b34801561060957600080fd5b50610291610618366004612414565b6115e7565b34801561062957600080fd5b50600254610254906001600160a01b031681565b34801561064957600080fd5b50600354610254906001600160a01b031681565b34801561066957600080fd5b5061039d6106783660046123c7565b61168c565b34801561068957600080fd5b5061039d610698366004612565565b61186b565b3480156106a957600080fd5b5061039d6106b83660046123f7565b60066020526000908152604090205481565b3480156106d657600080fd5b506102916106e53660046123f7565b6119a1565b3480156106f657600080fd5b506102b36107053660046123c7565b6119ed565b34801561071657600080fd5b5061039d611aed565b34801561072b57600080fd5b5061029161073a3660046125a0565b611b7d565b34801561074b57600080fd5b5061039d600e5481565b34801561076157600080fd5b506102916107703660046123f7565b611c5d565b34801561078157600080fd5b5061039d6107903660046123c7565b611ca9565b3480156107a157600080fd5b5061039d6107b0366004612414565b611e8b565b3480156107c157600080fd5b506102916107d03660046125e0565b611e9b565b3480156107e157600080fd5b5061039d600d5481565b3480156107f757600080fd5b50610291610806366004612414565b611f1c565b34801561081757600080fd5b50600b5461039d565b6001546001600160a01b031633146108535760405162461bcd60e51b815260040161084a9061260e565b60405180910390fd5b6108676001600160a01b0384168383611f4b565b505050565b3360009081526005602052604081205460ff168061088957503330145b6108a55760405162461bcd60e51b815260040161084a9061263d565b600083815260086020908152604091829020825160c08101845281546001600160a01b039081168083526001840154948301949094526002830154169381019390935260038101546060840152600481015460808401526005015460a0830152610913576001915050610a59565b60408181015182516020840151925163a9059cbb60e01b81526001600160a01b0391821660048201526024810193909352169063a9059cbb906044016020604051808303816000875af115801561096e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109929190612674565b5060608101516040516000916001600160a01b038616918381818185875af1925050503d80600081146109e1576040519150601f19603f3d011682016040523d82523d6000602084013e6109e6565b606091505b5050905080610a075760405162461bcd60e51b815260040161084a90612691565b81600001516001600160a01b03167fe3861323d3496a71690430a440d3f89298d4cede5317e52cff163abb909aab208360200151604051610a4a91815260200190565b60405180910390a26001925050505b92915050565b6001546001600160a01b03163314610a895760405162461bcd60e51b815260040161084a9061260e565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600b8181548110610abb57600080fd5b600091825260209091200154905081565b6000610ad6611fae565b60008411610b265760405162461bcd60e51b815260206004820181905260248201527f526577617264526f757465723a20696e76616c6964205f6c6c70416d6f756e74604482015260640161084a565b6003546040516371d597ad60e01b815233600482018190526001600160a01b03858116602484015260448301889052606483018790526084830182905290926000929116906371d597ad9060a4016020604051808303816000875af1158015610b93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb791906126dc565b9050816001600160a01b03167fbfed372bc52735a8e622ff9ce7bcf01f9031fb1beb6aca08ac87480a1dbe471087604051610bf491815260200190565b60405180910390a2915050610c096001600055565b9392505050565b610c18611fae565b600a5460025460405163098bf59d60e01b815233600482018190526001600160a01b039283166024830152604482018590526064820181905292919091169063098bf59d906084015b600060405180830381600087803b158015610c7b57600080fd5b505af1158015610c8f573d6000803e3d6000fd5b5050505050610c9e6001600055565b50565b3360009081526005602052604081205460ff1680610cbe57503330145b610cda5760405162461bcd60e51b815260040161084a9061263d565b600083815260086020908152604091829020825160c08101845281546001600160a01b039081168083526001840154948301949094526002830154169381019390935260038101546060840152600481015460808401526005015460a0830152610d48576001915050610a59565b6040818101516003546020840151925163095ea7b360e01b81526001600160a01b0391821660048201526024810193909352169063095ea7b3906044016020604051808303816000875af1158015610da4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc89190612674565b5060035481516040808401516020850151608086015192516317eb2a1560e01b81526000956001600160a01b0316946317eb2a1594610e1394309492939092919081906004016126f5565b6020604051808303816000875af1158015610e32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5691906126dc565b82516040518281529192506001600160a01b0316907f41115caaff93d0fb3d6d596733e2442429850baef9d556b420e59b096b1ffe759060200160405180910390a26000846001600160a01b031683606001516040515b60006040518083038185875af1925050503d8060008114610eea576040519150601f19603f3d011682016040523d82523d6000602084013e610eef565b606091505b5050905080610f105760405162461bcd60e51b815260040161084a90612691565b50600195945050505050565b3360009081526005602052604081205460ff1680610f3957503330145b610f555760405162461bcd60e51b815260040161084a9061263d565b600083815260096020908152604091829020825160c08101845281546001600160a01b03908116808352600184015494830194909452600283015481169482019490945260038201546060820152600482015490931660808401526005015460a0830152610fc7576001915050610a59565b600354815160408084015160208501516060860151608087015193516371d597ad60e01b81526001600160a01b039586166004820152928516602484015260448301919091526064820152908216608482015260009291909116906371d597ad9060a4016020604051808303816000875af115801561104a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106e91906126dc565b82516040518281529192506001600160a01b0316907fbfed372bc52735a8e622ff9ce7bcf01f9031fb1beb6aca08ac87480a1dbe47109060200160405180910390a26000846001600160a01b03168360a00151604051610ead565b6004548510156110eb5760405162461bcd60e51b815260040161084a9061272e565b34851461110a5760405162461bcd60e51b815260040161084a90612774565b60035460405163d3c2638360e01b81526001600160a01b0386811660048301529091169063d3c26383906024016020604051808303816000875af1158015611156573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117a9190612674565b6111d25760405162461bcd60e51b815260206004820152602360248201527f526577617264526f757465723a206e6f74207375706f72746564204c5020746f60448201526235b2b760e91b606482015260840161084a565b6111e76001600160a01b038516873086611fd8565b6111f5868686868686612016565b505050505050565b60045485101561121f5760405162461bcd60e51b815260040161084a9061272e565b34851461123e5760405162461bcd60e51b815260040161084a90612774565b336001600160a01b038716146112b15760405162461bcd60e51b815260206004820152603260248201527f526577617264526f757465723a206163636f756e742073686f756c642062652060448201527139b0b6b29030b99036b9b39739b2b73232b960711b606482015260840161084a565b6002546040516370a0823160e01b81526001600160a01b038881166004830152859216906370a0823190602401602060405180830381865afa1580156112fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061131f91906126dc565b101561136d5760405162461bcd60e51b815260206004820152601860248201527f526577617264526f757465723a20696e73756666204c4c500000000000000000604482015260640161084a565b6001600160a01b03861660009081526007602052604081205490611391888361214d565b905061139e8260016127d3565b600760008a6001600160a01b03166001600160a01b031681526020019081526020016000208190555060006040518060c001604052808a6001600160a01b03168152602001878152602001886001600160a01b03168152602001868152602001856001600160a01b03168152602001898152509050806009600084815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015560808201518160040160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060a08201518160050155905050600c829080600181540180825580915050600190039060005260206000200160009091909190915055886001600160a01b03167fac0d6b7d4c519f3e82e78a6df78c4275349679c06ff6c0cbe7ef2245f2d225fc8760405161153391815260200190565b60405180910390a2505050505050505050565b6001546001600160a01b031633146115705760405162461bcd60e51b815260040161084a9061260e565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b6001546001600160a01b031633146115c55760405162461bcd60e51b815260040161084a9061260e565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6115ef611fae565b6000811161163f5760405162461bcd60e51b815260206004820152601f60248201527f526577617264526f757465723a206c6c70416d6f756e7420746f6f206c6f7700604482015260640161084a565b600a54600254604051631e42d69b60e21b81523360048201819052602482018190526001600160a01b0392831660448301526064820185905292919091169063790b5a6c90608401610c61565b3360009081526005602052604081205460ff16806116a957503330145b6116c55760405162461bcd60e51b815260040161084a9061263d565b600b54600d548181106116db579150610a599050565b818511156116e7578194505b8481101561185e576000600b8281548110611704576117046127e6565b600091825260209091200154604051633a50a3b560e01b8152600481018290526001600160a01b03871660248201529091503090633a50a3b5906044016020604051808303816000875af192505050801561177c575060408051601f3d908101601f1916820190925261177991810190612674565b60015b6117f9576040516302e963f160e01b8152600481018290526001600160a01b038616602482015230906302e963f1906044016020604051808303816000875af19250505080156117e9575060408051601f3d908101601f191682019092526117e691810190612674565b60015b6117f357506116e7565b50611807565b8061180557505061185e565b505b81611811816127fc565b600092835260086020526040832080546001600160a01b031990811682556001820185905560028201805490911690556003810184905560048101849055600501929092555090506116e7565b600d819055949350505050565b6000611875611fae565b600084116118c55760405162461bcd60e51b815260206004820152601d60248201527f526577617264526f757465723a20696e76616c6964205f616d6f756e74000000604482015260640161084a565b6003546040516317eb2a1560e01b815233916000916001600160a01b03909116906317eb2a159061190490859081908c908c908c908c906004016126f5565b6020604051808303816000875af1158015611923573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194791906126dc565b9050816001600160a01b03167f41115caaff93d0fb3d6d596733e2442429850baef9d556b420e59b096b1ffe758260405161198491815260200190565b60405180910390a29150506119996001600055565b949350505050565b6001546001600160a01b031633146119cb5760405162461bcd60e51b815260040161084a9061260e565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526005602052604081205460ff1680611a0a57503330145b611a265760405162461bcd60e51b815260040161084a9061263d565b600083815260096020908152604091829020825160c08101845281546001600160a01b03908116808352600184015494830194909452600283015481169482019490945260038201546060820152600482015490931660808401526005015460a0830152611a98576001915050610a59565b80600001516001600160a01b03167fef06bcb737aaf23cece9d2cf084e7044f7fc556929f7b317e9459301fc5429668260200151604051611adb91815260200190565b60405180910390a25060019392505050565b6000611af7611fae565b600a546040516309f4173d60e11b8152336004820181905260248201819052916001600160a01b0316906313e82e7a906044016020604051808303816000875af1158015611b49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6d91906126dc565b915050611b7a6001600055565b90565b6001546001600160a01b03163314611ba75760405162461bcd60e51b815260040161084a9061260e565b600154600160a01b900460ff1615611c0b5760405162461bcd60e51b815260206004820152602160248201527f526577617264526f757465723a20616c726561647920696e697469616c697a656044820152601960fa1b606482015260840161084a565b6001805460ff60a01b1916600160a01b179055600280546001600160a01b039485166001600160a01b0319918216179091556003805493851693821693909317909255600a8054919093169116179055565b6001546001600160a01b03163314611c875760405162461bcd60e51b815260040161084a9061260e565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526005602052604081205460ff1680611cc657503330145b611ce25760405162461bcd60e51b815260040161084a9061263d565b600c54600e54818110611cf8579150610a599050565b81851115611d04578194505b84811015611e7e576000600c8281548110611d2157611d216127e6565b600091825260209091200154604051631d689dfd60e11b8152600481018290526001600160a01b03871660248201529091503090633ad13bfa906044016020604051808303816000875af1925050508015611d99575060408051601f3d908101601f19168201909252611d9691810190612674565b60015b611e165760405163b241993960e01b8152600481018290526001600160a01b0386166024820152309063b2419939906044016020604051808303816000875af1925050508015611e06575060408051601f3d908101601f19168201909252611e0391810190612674565b60015b611e105750611d04565b50611e24565b80611e22575050611e7e565b505b81611e2e816127fc565b600092835260096020526040832080546001600160a01b03199081168255600182018590556002820180548216905560038201859055600482018054909116905560050192909255509050611d04565b600e819055949350505050565b600c8181548110610abb57600080fd5b6001546001600160a01b03163314611ec55760405162461bcd60e51b815260040161084a9061260e565b6040516336b91f2b60e01b81526001600160a01b0382811660048301528316906336b91f2b90602401600060405180830381600087803b158015611f0857600080fd5b505af11580156111f5573d6000803e3d6000fd5b6001546001600160a01b03163314611f465760405162461bcd60e51b815260040161084a9061260e565b600455565b6040516001600160a01b03831660248201526044810182905261086790849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612194565b600260005403611fd157604051633ee5aeb560e01b815260040160405180910390fd5b6002600055565b6040516001600160a01b03808516602483015283166044820152606481018290526120109085906323b872dd60e01b90608401611f77565b50505050565b6001600160a01b0386166000908152600660205260408120549061203a888361214d565b90506120478260016127d3565b6001600160a01b03898116600081815260066020908152604080832095909555845160c0810186528381528082018b81528c8616828801908152606083018f8152608084018d815260a085018d81528b8852600887528a882086518154908c166001600160a01b03199182161782559551600180830191909155945160028201805491909c16961695909517909955905160038401555160048301559551600590910155600b805495860181559092527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9909301859055925188815290917f6f0c1e1d0dd3edf10dfe8838209c4930d845b1f29d1cb64019f6198afc69ef2c9101611533565b6040516bffffffffffffffffffffffff19606084901b1660208201526034810182905260009060540160405160208183030381529060405280519060200120905092915050565b60006121e9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122669092919063ffffffff16565b80519091501561086757808060200190518101906122079190612674565b6108675760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161084a565b6060611999848460008585843b6122bf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161084a565b600080866001600160a01b031685876040516122db9190612839565b60006040518083038185875af1925050503d8060008114612318576040519150601f19603f3d011682016040523d82523d6000602084013e61231d565b606091505b509150915061232d828286612338565b979650505050505050565b60608315612347575081610c09565b8251156123575782518084602001fd5b8160405162461bcd60e51b815260040161084a9190612855565b6001600160a01b0381168114610c9e57600080fd5b60008060006060848603121561239b57600080fd5b83356123a681612371565b925060208401356123b681612371565b929592945050506040919091013590565b600080604083850312156123da57600080fd5b8235915060208301356123ec81612371565b809150509250929050565b60006020828403121561240957600080fd5b8135610c0981612371565b60006020828403121561242657600080fd5b5035919050565b60008060006060848603121561244257600080fd5b8335925060208401359150604084013561245b81612371565b809150509250925092565b60008060008060008060c0878903121561247f57600080fd5b863561248a81612371565b95506020870135945060408701356124a181612371565b959894975094956060810135955060808101359460a0909101359350915050565b60008060008060008060c087890312156124db57600080fd5b86356124e681612371565b95506020870135945060408701356124fd81612371565b9350606087013592506080870135915060a087013561251b81612371565b809150509295509295509295565b8015158114610c9e57600080fd5b6000806040838503121561254a57600080fd5b823561255581612371565b915060208301356123ec81612529565b6000806000806080858703121561257b57600080fd5b843561258681612371565b966020860135965060408601359560600135945092505050565b6000806000606084860312156125b557600080fd5b83356125c081612371565b925060208401356125d081612371565b9150604084013561245b81612371565b600080604083850312156125f357600080fd5b82356125fe81612371565b915060208301356123ec81612371565b60208082526015908201527423b7bb32b93730b136329d103337b93134b23232b760591b604082015260600190565b60208082526018908201527f526577617264526f757465723a204e6f74206b65657065720000000000000000604082015260600190565b60006020828403121561268657600080fd5b8151610c0981612529565b6020808252602b908201527f4661696c656420746f2073656e64206d696e7420657865637574696f6e20666560408201526a32903a379035b2b2b832b960a91b606082015260800190565b6000602082840312156126ee57600080fd5b5051919050565b6001600160a01b03968716815294861660208601529290941660408401526060830152608082019290925260a081019190915260c00190565b60208082526026908201527f526577617264526f757465723a204e6f7420656e6f75676820657865637574696040820152656f6e2066656560d01b606082015260800190565b60208082526029908201527f526577617264526f757465723a20657865637574696f6e2066656520646f65736040820152680dc4ee840dac2e8c6d60bb1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610a5957610a596127bd565b634e487b7160e01b600052603260045260246000fd5b60006001820161280e5761280e6127bd565b5060010190565b60005b83811015612830578181015183820152602001612818565b50506000910152565b6000825161284b818460208701612815565b9190910192915050565b6020815260008251806020840152612874816040850160208701612815565b601f01601f1916919091016040019291505056fea264697066735822122077f47cc471b611a71849e9641b7f50d9d66533242f584831ac14fc8c48b04c3864736f6c63430008130033
Deployed Bytecode Sourcemap
37956:11762:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38566:37;;;;;;;;;;-1:-1:-1;38566:37:0;;;;-1:-1:-1;;;;;38566:37:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;38566:37:0;;;;;;;;40344:156;;;;;;;;;;-1:-1:-1;40344:156:0;;;;;:::i;:::-;;:::i;:::-;;47538:636;;;;;;;;;;-1:-1:-1;47538:636:0;;;;;:::i;:::-;;:::i;:::-;;;1312:14:1;;1305:22;1287:41;;1275:2;1260:18;47538:636:0;1147:187:1;39925:76:0;;;;;;;;;;-1:-1:-1;39925:76:0;;;;;:::i;:::-;;:::i;38420:65::-;;;;;;;;;;-1:-1:-1;38420:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38420:65:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2119:15:1;;;2101:34;;2166:2;2151:18;;2144:34;;;;2214:15;;;;2194:18;;;2187:43;;;;2261:2;2246:18;;2239:34;2304:3;2289:19;;2282:35;2081:3;2333:19;;2326:35;;;;2050:3;2035:19;38420:65:0;1776:591:1;38610:36:0;;;;;;;;;;-1:-1:-1;38610:36:0;;;;;:::i;:::-;;:::i;:::-;;;2703:25:1;;;2691:2;2676:18;38610:36:0;2557:177:1;31690:18:0;;;;;;;;;;-1:-1:-1;31690:18:0;;;;-1:-1:-1;;;;;31690:18:0;;;38492:65;;;;;;;;;;-1:-1:-1;38492:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38492:65:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3082:15:1;;;3064:34;;3129:2;3114:18;;3107:34;;;;3177:15;;;3157:18;;;3150:43;;;;3224:2;3209:18;;3202:34;;;;3273:15;;;3267:3;3252:19;;3245:44;3044:3;3305:19;;3298:35;;;;3013:3;2998:19;38492:65:0;2739:600:1;38369:44:0;;;;;;;;;;-1:-1:-1;38369:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;40955:434;;;;;;;;;;-1:-1:-1;40955:434:0;;;;;:::i;:::-;;:::i;38106:25::-;;;;;;;;;;-1:-1:-1;38106:25:0;;;;-1:-1:-1;;;38106:25:0;;;;;;41669:194;;;;;;;;;;-1:-1:-1;41669:194:0;;;;;:::i;:::-;;:::i;46718:812::-;;;;;;;;;;-1:-1:-1;46718:812:0;;;;;:::i;:::-;;:::i;48182:714::-;;;;;;;;;;-1:-1:-1;48182:714:0;;;;;:::i;:::-;;:::i;42074:601::-;;;;;;:::i;:::-;;:::i;49409:109::-;;;;;;;;;;-1:-1:-1;49484:19:0;:26;49409:109;;43298:978;;;;;;:::i;:::-;;:::i;38232:30::-;;;;;;;;;;;;;;;;40141:121;;;;;;;;;;-1:-1:-1;40141:121:0;;;;;:::i;:::-;;:::i;38269:40::-;;;;;;;;;;-1:-1:-1;38269:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;39689:116;;;;;;;;;;-1:-1:-1;39689:116:0;;;;;:::i;:::-;;:::i;41397:264::-;;;;;;;;;;-1:-1:-1;41397:264:0;;;;;:::i;:::-;;:::i;38140:18::-;;;;;;;;;;-1:-1:-1;38140:18:0;;;;-1:-1:-1;;;;;38140:18:0;;;38200:25;;;;;;;;;;-1:-1:-1;38200:25:0;;;;-1:-1:-1;;;;;38200:25:0;;;44473:1113;;;;;;;;;;-1:-1:-1;44473:1113:0;;;;;:::i;:::-;;:::i;40508:439::-;;;;;;;;;;-1:-1:-1;40508:439:0;;;;;:::i;:::-;;:::i;38318:44::-;;;;;;;;;;-1:-1:-1;38318:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;39813:104;;;;;;;;;;-1:-1:-1;39813:104:0;;;;;:::i;:::-;;:::i;48904:382::-;;;;;;;;;;-1:-1:-1;48904:382:0;;;;;:::i;:::-;;:::i;41871:195::-;;;;;;;;;;;;;:::i;39196:337::-;;;;;;;;;;-1:-1:-1;39196:337:0;;;;;:::i;:::-;;:::i;38741:38::-;;;;;;;;;;;;;;;;31883:76;;;;;;;;;;-1:-1:-1;31883:76:0;;;;;:::i;:::-;;:::i;45595:1114::-;;;;;;;;;;-1:-1:-1;45595:1114:0;;;;;:::i;:::-;;:::i;38653:36::-;;;;;;;;;;-1:-1:-1;38653:36:0;;;;;:::i;:::-;;:::i;49526:189::-;;;;;;;;;;-1:-1:-1;49526:189:0;;;;;:::i;:::-;;:::i;38696:38::-;;;;;;;;;;;;;;;;40009:124;;;;;;;;;;-1:-1:-1;40009:124:0;;;;;:::i;:::-;;:::i;49294:109::-;;;;;;;;;;-1:-1:-1;49369:19:0;:26;49294:109;;40344:156;31826:3;;-1:-1:-1;;;;;31826:3:0;31812:10;:17;31804:51;;;;-1:-1:-1;;;31804:51:0;;;;;;;:::i;:::-;;;;;;;;;40446:46:::1;-1:-1:-1::0;;;;;40446:27:0;::::1;40474:8:::0;40484:7;40446:27:::1;:46::i;:::-;40344:156:::0;;;:::o;47538:636::-;39590:10;47641:4;39581:20;;;:8;:20;;;;;;;;;:51;;-1:-1:-1;39604:10:0;39626:4;39604:27;39581:51;39573:88;;;;-1:-1:-1;;;39573:88:0;;;;;;;:::i;:::-;47658:46:::1;47707:24:::0;;;:12:::1;:24;::::0;;;;;;;;47658:73;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;47658:73:0;;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;;::::0;;;;;47742:75:::1;;47801:4;47794:11;;;;;47742:75;47834:27;::::0;;::::1;::::0;47872:19;;47893:18:::1;::::0;::::1;::::0;47827:85;;-1:-1:-1;;;47827:85:0;;-1:-1:-1;;;;;8440:32:1;;;47827:85:0::1;::::0;::::1;8422:51:1::0;8489:18;;;8482:34;;;;47827:44:0::1;::::0;::::1;::::0;8395:18:1;;47827:85:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;47967:24:0::1;::::0;::::1;::::0;47943:53:::1;::::0;47924:12:::1;::::0;-1:-1:-1;;;;;47943:16:0;::::1;::::0;47924:12;47943:53;47924:12;47943:53;47967:24;47943:16;:53:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47923:73;;;48015:7;48007:63;;;;-1:-1:-1::0;;;48007:63:0::1;;;;;;;:::i;:::-;48104:11;:19;;;-1:-1:-1::0;;;;;48086:58:0::1;;48125:11;:18;;;48086:58;;;;2703:25:1::0;;2691:2;2676:18;;2557:177;48086:58:0::1;;;;;;;;48162:4;48155:11;;;;39672:1;47538:636:::0;;;;:::o;39925:76::-;31826:3;;-1:-1:-1;;;;;31826:3:0;31812:10;:17;31804:51;;;;-1:-1:-1;;;31804:51:0;;;;;;;:::i;:::-;39983:3:::1;:10:::0;;-1:-1:-1;;;;;;39983:10:0::1;-1:-1:-1::0;;;;;39983:10:0;;;::::1;::::0;;;::::1;::::0;;39925:76::o;38610:36::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38610:36:0;:::o;40955:434::-;41059:7;5244:21;:19;:21::i;:::-;41100:1:::1;41087:10;:14;41079:59;;;::::0;-1:-1:-1;;;41079:59:0;;9601:2:1;41079:59:0::1;::::0;::::1;9583:21:1::0;;;9620:18;;;9613:30;9679:34;9659:18;;;9652:62;9731:18;;41079:59:0::1;9399:356:1::0;41079:59:0::1;41222:10;::::0;41210:98:::1;::::0;-1:-1:-1;;;41210:98:0;;41169:10:::1;41210:98;::::0;::::1;10057:34:1::0;;;-1:-1:-1;;;;;10127:15:1;;;10107:18;;;10100:43;10159:18;;;10152:34;;;10202:18;;;10195:34;;;10245:19;;;10238:44;;;41169:10:0;;41151:15:::1;::::0;41222:10;::::1;::::0;41210:49:::1;::::0;9991:19:1;;41210:98:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41190:118;;41332:7;-1:-1:-1::0;;;;;41324:28:0::1;;41341:10;41324:28;;;;2703:25:1::0;;2691:2;2676:18;;2557:177;41324:28:0::1;;;;;;;;41372:9:::0;-1:-1:-1;;5288:20:0;4577:1;5833:7;:22;5650:213;5288:20;40955:434;;;;;:::o;41669:194::-;5244:21;:19;:21::i;:::-;41792:13:::1;::::0;41834:3:::1;::::0;41777:78:::1;::::0;-1:-1:-1;;;41777:78:0;;41756:10:::1;41777:78;::::0;::::1;10751:34:1::0;;;-1:-1:-1;;;;;41834:3:0;;::::1;10801:18:1::0;;;10794:43;10853:18;;;10846:34;;;10896:18;;;10889:43;;;41756:10:0;41792:13;;;::::1;::::0;41777:47:::1;::::0;10685:19:1;;41777:78:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;41727:136;5288:20:::0;4577:1;5833:7;:22;5650:213;5288:20;41669:194;:::o;46718:812::-;39590:10;46822:4;39581:20;;;:8;:20;;;;;;;;;:51;;-1:-1:-1;39604:10:0;39626:4;39604:27;39581:51;39573:88;;;;-1:-1:-1;;;39573:88:0;;;;;;;:::i;:::-;46839:46:::1;46888:24:::0;;;:12:::1;:24;::::0;;;;;;;;46839:73;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;46839:73:0;;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;;::::0;;;;;46923:75:::1;;46982:4;46975:11;;;;;46923:75;47015:27;::::0;;::::1;::::0;47052:10:::1;::::0;47064:18:::1;::::0;::::1;::::0;47008:75;;-1:-1:-1;;;47008:75:0;;-1:-1:-1;;;;;47052:10:0;;::::1;47008:75;::::0;::::1;8422:51:1::0;8489:18;;;8482:34;;;;47008:43:0::1;::::0;::::1;::::0;8395:18:1;;47008:75:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;47126:10:0::1;::::0;47176:19;;47197:27:::1;::::0;;::::1;::::0;47226:18:::1;::::0;::::1;::::0;47246:19:::1;::::0;::::1;::::0;47114:173;;-1:-1:-1;;;47114:173:0;;47094:17:::1;::::0;-1:-1:-1;;;;;47126:10:0::1;::::0;47114:46:::1;::::0;:173:::1;::::0;47169:4:::1;::::0;47176:19;;47197:27;;47226:18;47246:19;;;47114:173:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47311:19:::0;;47303:39:::1;::::0;2703:25:1;;;47094:193:0;;-1:-1:-1;;;;;;47303:39:0::1;::::0;::::1;::::0;2691:2:1;2676:18;47303:39:0::1;;;;;;;47354:12;47373:11;-1:-1:-1::0;;;;;47373:16:0::1;47397:11;:24;;;47373:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47353:73;;;47445:7;47437:63;;;;-1:-1:-1::0;;;47437:63:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;47518:4:0::1;::::0;46718:812;-1:-1:-1;;;;;46718:812:0:o;48182:714::-;39590:10;48286:4;39581:20;;;:8;:20;;;;;;;;;:51;;-1:-1:-1;39604:10:0;39626:4;39604:27;39581:51;39573:88;;;;-1:-1:-1;;;39573:88:0;;;;;;;:::i;:::-;48303:46:::1;48352:24:::0;;;:12:::1;:24;::::0;;;;;;;;48303:73;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;48303:73:0;;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;;::::0;;;;;48387:75:::1;;48446:4;48439:11;;;;;48387:75;48504:10;::::0;48542:19;;48563:27:::1;::::0;;::::1;::::0;48592:18:::1;::::0;::::1;::::0;48612::::1;::::0;::::1;::::0;48632:20:::1;::::0;::::1;::::0;48492:161;;-1:-1:-1;;;48492:161:0;;-1:-1:-1;;;;;10075:15:1;;;48492:161:0::1;::::0;::::1;10057:34:1::0;10127:15;;;10107:18;;;10100:43;10159:18;;;10152:34;;;;10202:18;;;10195:34;10266:15;;;10245:19;;;10238:44;48472:17:0::1;::::0;48504:10;;;::::1;::::0;48492:49:::1;::::0;9991:19:1;;48492:161:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48677:19:::0;;48669:39:::1;::::0;2703:25:1;;;48472:181:0;;-1:-1:-1;;;;;;48669:39:0::1;::::0;::::1;::::0;2691:2:1;2676:18;48669:39:0::1;;;;;;;48720:12;48739:11;-1:-1:-1::0;;;;;48739:16:0::1;48763:11;:24;;;48739:53;;;8777:205:1::0;42074:601:0;42255:15;;42239:12;:31;;42231:82;;;;-1:-1:-1;;;42231:82:0;;;;;;;:::i;:::-;42348:9;42332:12;:25;42324:79;;;;-1:-1:-1;;;42324:79:0;;;;;;;:::i;:::-;42434:10;;42422:48;;-1:-1:-1;;;42422:48:0;;-1:-1:-1;;;;;178:32:1;;;42422:48:0;;;160:51:1;42434:10:0;;;;42422:41;;133:18:1;;42422:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42414:96;;;;-1:-1:-1;;;42414:96:0;;12567:2:1;42414:96:0;;;12549:21:1;12606:2;12586:18;;;12579:30;12645:34;12625:18;;;12618:62;-1:-1:-1;;;12696:18:1;;;12689:33;12739:19;;42414:96:0;12365:399:1;42414:96:0;42521:62;-1:-1:-1;;;;;42521:30:0;;42552:7;42569:4;42576:6;42521:30;:62::i;:::-;42594:73;42613:7;42622:12;42636:5;42643:6;42651:7;42660:6;42594:18;:73::i;:::-;42074:601;;;;;;:::o;43298:978::-;43480:15;;43464:12;:31;;43456:82;;;;-1:-1:-1;;;43456:82:0;;;;;;;:::i;:::-;43573:9;43557:12;:25;43549:79;;;;-1:-1:-1;;;43549:79:0;;;;;;;:::i;:::-;43647:10;-1:-1:-1;;;;;43647:19:0;;;43639:82;;;;-1:-1:-1;;;43639:82:0;;12971:2:1;43639:82:0;;;12953:21:1;13010:2;12990:18;;;12983:30;13049:34;13029:18;;;13022:62;-1:-1:-1;;;13100:18:1;;;13093:48;13158:19;;43639:82:0;12769:414:1;43639:82:0;43747:3;;43740:30;;-1:-1:-1;;;43740:30:0;;-1:-1:-1;;;;;178:32:1;;;43740:30:0;;;160:51:1;43774:6:0;;43747:3;;43740:21;;133:18:1;;43740:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;43732:76;;;;-1:-1:-1;;;43732:76:0;;13390:2:1;43732:76:0;;;13372:21:1;13429:2;13409:18;;;13402:30;13468:26;13448:18;;;13441:54;13512:18;;43732:76:0;13188:348:1;43732:76:0;-1:-1:-1;;;;;43840:23:0;;43819:18;43840:23;;;:14;:23;;;;;;;43895:34;43855:7;43840:23;43895:13;:34::i;:::-;43874:55;-1:-1:-1;43966:13:0;:10;43978:1;43966:13;:::i;:::-;43940:14;:23;43955:7;-1:-1:-1;;;;;43940:23:0;-1:-1:-1;;;;;43940:23:0;;;;;;;;;;;;:39;;;;43990:46;44039:83;;;;;;;;44067:7;-1:-1:-1;;;;;44039:83:0;;;;;44076:6;44039:83;;;;44084:5;-1:-1:-1;;;;;44039:83:0;;;;;44091:6;44039:83;;;;44099:8;-1:-1:-1;;;;;44039:83:0;;;;;44109:12;44039:83;;;43990:132;;44160:11;44133:12;:24;44146:10;44133:24;;;;;;;;;;;:38;;;;;;;;;;;;;-1:-1:-1;;;;;44133:38:0;;;;;-1:-1:-1;;;;;44133:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44133:38:0;;;;;-1:-1:-1;;;;;44133:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44133:38:0;;;;;-1:-1:-1;;;;;44133:38:0;;;;;;;;;;;;;;;;;44182:19;44207:10;44182:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44252:7;-1:-1:-1;;;;;44234:34:0;;44261:6;44234:34;;;;2703:25:1;;2691:2;2676:18;;2557:177;44234:34:0;;;;;;;;43445:831;;;43298:978;;;;;;:::o;40141:121::-;31826:3;;-1:-1:-1;;;;;31826:3:0;31812:10;:17;31804:51;;;;-1:-1:-1;;;31804:51:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40226:19:0;;;::::1;;::::0;;;:8:::1;:19;::::0;;;;:28;;-1:-1:-1;;40226:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;40141:121::o;39689:116::-;31826:3;;-1:-1:-1;;;;;31826:3:0;31812:10;:17;31804:51;;;;-1:-1:-1;;;31804:51:0;;;;;;;:::i;:::-;39767:13:::1;:30:::0;;-1:-1:-1;;;;;;39767:30:0::1;-1:-1:-1::0;;;;;39767:30:0;;;::::1;::::0;;;::::1;::::0;;39689:116::o;41397:264::-;5244:21;:19;:21::i;:::-;41487:1:::1;41475:9;:13;41467:57;;;::::0;-1:-1:-1;;;41467:57:0;;14005:2:1;41467:57:0::1;::::0;::::1;13987:21:1::0;14044:2;14024:18;;;14017:30;14083:33;14063:18;;;14056:61;14134:18;;41467:57:0::1;13803:355:1::0;41467:57:0::1;41589:13;::::0;41638:3:::1;::::0;41574:79:::1;::::0;-1:-1:-1;;;41574:79:0;;41553:10:::1;41574:79;::::0;::::1;14432:34:1::0;;;14482:18;;;14475:43;;;-1:-1:-1;;;;;41638:3:0;;::::1;14534:18:1::0;;;14527:43;14586:18;;;14579:34;;;41553:10:0;41589:13;;;::::1;::::0;41574:45:::1;::::0;14366:19:1;;41574:79:0::1;14163:456:1::0;44473:1113:0;39590:10;44575:4;39581:20;;;:8;:20;;;;;;;;;:51;;-1:-1:-1;39604:10:0;39626:4;39604:27;39581:51;39573:88;;;;-1:-1:-1;;;39573:88:0;;;;;;;:::i;:::-;44610:19:::1;:26:::0;44663:23:::1;::::0;44700:16;;::::1;44697:59;;44739:5:::0;-1:-1:-1;44732:12:0::1;::::0;-1:-1:-1;44732:12:0::1;44697:59;44780:7;44771:8;:16;44768:65;;;44814:7;44803:18;;44768:65;44855:8;44849:5;:14;44843:671;;;44879:18;44900:19;44920:5;44900:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;44962:49:::1;::::0;-1:-1:-1;;;44962:49:0;;::::1;::::0;::::1;14946:25:1::0;;;-1:-1:-1;;;;;15007:32:1;;14987:18;;;14980:60;44900:26:0;;-1:-1:-1;44962:4:0::1;::::0;:24:::1;::::0;14919:18:1;;44962:49:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;44962:49:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;44962:49:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;44941:494;;45203:48;::::0;-1:-1:-1;;;45203:48:0;;::::1;::::0;::::1;14946:25:1::0;;;-1:-1:-1;;;;;15007:32:1;;14987:18;;;14980:60;45203:4:0::1;::::0;:23:::1;::::0;14919:18:1;;45203:48:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;45203:48:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;45203:48:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;45178:242;;45392:8;;;45178:242;45269:93;44941:494;;;45075:12;45070:67;;45112:5;;;;45070:67;45025:127;44941:494;45449:7:::0;::::1;::::0;::::1;:::i;:::-;45478:24;::::0;;;:12:::1;:24;::::0;;;;45471:31;;-1:-1:-1;;;;;;45471:31:0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;;::::0;;;;-1:-1:-1;45449:7:0;-1:-1:-1;44843:671:0::1;;;45524:23;:31:::0;;;;44473:1113;-1:-1:-1;;;;44473:1113:0:o;40508:439::-;40624:7;5244:21;:19;:21::i;:::-;40662:1:::1;40652:7;:11;40644:53;;;::::0;-1:-1:-1;;;40644:53:0;;15393:2:1;40644:53:0::1;::::0;::::1;15375:21:1::0;15432:2;15412:18;;;15405:30;15471:31;15451:18;;;15444:59;15520:18;;40644:53:0::1;15191:353:1::0;40644:53:0::1;40781:10;::::0;40769:100:::1;::::0;-1:-1:-1;;;40769:100:0;;40728:10:::1;::::0;40710:15:::1;::::0;-1:-1:-1;;;;;40781:10:0;;::::1;::::0;40769:46:::1;::::0;:100:::1;::::0;40728:10;;;;40834:6;;40842:7;;40851:8;;40861:7;;40769:100:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40749:120;;40893:7;-1:-1:-1::0;;;;;40885:27:0::1;;40902:9;40885:27;;;;2703:25:1::0;;2691:2;2676:18;;2557:177;40885:27:0::1;;;;;;;;40930:9:::0;-1:-1:-1;;5288:20:0;4577:1;5833:7;:22;5650:213;5288:20;40508:439;;;;;;:::o;39813:104::-;31826:3;;-1:-1:-1;;;;;31826:3:0;31812:10;:17;31804:51;;;;-1:-1:-1;;;31804:51:0;;;;;;;:::i;:::-;39885:10:::1;:24:::0;;-1:-1:-1;;;;;;39885:24:0::1;-1:-1:-1::0;;;;;39885:24:0;;;::::1;::::0;;;::::1;::::0;;39813:104::o;48904:382::-;39590:10;49007:4;39581:20;;;:8;:20;;;;;;;;;:51;;-1:-1:-1;39604:10:0;39626:4;39604:27;39581:51;39573:88;;;;-1:-1:-1;;;39573:88:0;;;;;;;:::i;:::-;49024:46:::1;49073:24:::0;;;:12:::1;:24;::::0;;;;;;;;49024:73;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;49024:73:0;;::::1;::::0;;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;;::::0;;;;;49108:75:::1;;49167:4;49160:11;;;;;49108:75;49216:11;:19;;;-1:-1:-1::0;;;;;49198:58:0::1;;49237:11;:18;;;49198:58;;;;2703:25:1::0;;2691:2;2676:18;;2557:177;49198:58:0::1;;;;;;;;-1:-1:-1::0;49274:4:0::1;::::0;48904:382;-1:-1:-1;;;48904:382:0:o;41871:195::-;41930:7;5244:21;:19;:21::i;:::-;42010:13:::1;::::0;41995:63:::1;::::0;-1:-1:-1;;;41995:63:0;;41967:10:::1;41995:63;::::0;::::1;15761:34:1::0;;;15811:18;;;15804:43;;;41967:10:0;-1:-1:-1;;;;;42010:13:0::1;::::0;41995:45:::1;::::0;15696:18:1;;41995:63:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41988:70;;;5288:20:::0;4577:1;5833:7;:22;5650:213;5288:20;41871:195;:::o;39196:337::-;31826:3;;-1:-1:-1;;;;;31826:3:0;31812:10;:17;31804:51;;;;-1:-1:-1;;;31804:51:0;;;;;;;:::i;:::-;39346:13:::1;::::0;-1:-1:-1;;;39346:13:0;::::1;;;39345:14;39337:60;;;::::0;-1:-1:-1;;;39337:60:0;;16060:2:1;39337:60:0::1;::::0;::::1;16042:21:1::0;16099:2;16079:18;;;16072:30;16138:34;16118:18;;;16111:62;-1:-1:-1;;;16189:18:1;;;16182:31;16230:19;;39337:60:0::1;15858:397:1::0;39337:60:0::1;39424:4;39408:20:::0;;-1:-1:-1;;;;39408:20:0::1;-1:-1:-1::0;;;39408:20:0::1;::::0;;39439:3:::1;:10:::0;;-1:-1:-1;;;;;39439:10:0;;::::1;-1:-1:-1::0;;;;;;39439:10:0;;::::1;;::::0;;;39460::::1;:24:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;39495:13:::1;:30:::0;;;;;::::1;::::0;::::1;;::::0;;39196:337::o;31883:76::-;31826:3;;-1:-1:-1;;;;;31826:3:0;31812:10;:17;31804:51;;;;-1:-1:-1;;;31804:51:0;;;;;;;:::i;:::-;31941:3:::1;:10:::0;;-1:-1:-1;;;;;;31941:10:0::1;-1:-1:-1::0;;;;;31941:10:0;;;::::1;::::0;;;::::1;::::0;;31883:76::o;45595:1114::-;39590:10;45698:4;39581:20;;;:8;:20;;;;;;;;;:51;;-1:-1:-1;39604:10:0;39626:4;39604:27;39581:51;39573:88;;;;-1:-1:-1;;;39573:88:0;;;;;;;:::i;:::-;45733:19:::1;:26:::0;45786:23:::1;::::0;45823:16;;::::1;45820:59;;45862:5:::0;-1:-1:-1;45855:12:0::1;::::0;-1:-1:-1;45855:12:0::1;45820:59;45903:7;45894:8;:16;45891:65;;;45937:7;45926:18;;45891:65;45978:8;45972:5;:14;45966:671;;;46002:18;46023:19;46043:5;46023:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;46085:49:::1;::::0;-1:-1:-1;;;46085:49:0;;::::1;::::0;::::1;14946:25:1::0;;;-1:-1:-1;;;;;15007:32:1;;14987:18;;;14980:60;46023:26:0;;-1:-1:-1;46085:4:0::1;::::0;:24:::1;::::0;14919:18:1;;46085:49:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;46085:49:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;46085:49:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;46064:494;;46326:48;::::0;-1:-1:-1;;;46326:48:0;;::::1;::::0;::::1;14946:25:1::0;;;-1:-1:-1;;;;;15007:32:1;;14987:18;;;14980:60;46326:4:0::1;::::0;:23:::1;::::0;14919:18:1;;46326:48:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;46326:48:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;46326:48:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;46301:242;;46515:8;;;46301:242;46392:93;46064:494;;;46198:12;46193:67;;46235:5;;;;46193:67;46148:127;46064:494;46572:7:::0;::::1;::::0;::::1;:::i;:::-;46601:24;::::0;;;:12:::1;:24;::::0;;;;46594:31;;-1:-1:-1;;;;;;46594:31:0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;;::::0;;;;-1:-1:-1;46572:7:0;-1:-1:-1;45966:671:0::1;;;46647:23;:31:::0;;;;45595:1114;-1:-1:-1;;;;45595:1114:0:o;38653:36::-;;;;;;;;;;;;49526:189;31826:3;;-1:-1:-1;;;;;31826:3:0;31812:10;:17;31804:51;;;;-1:-1:-1;;;31804:51:0;;;;;;;:::i;:::-;49635:72:::1;::::0;-1:-1:-1;;;49635:72:0;;-1:-1:-1;;;;;178:32:1;;;49635:72:0::1;::::0;::::1;160:51:1::0;49635:56:0;::::1;::::0;::::1;::::0;133:18:1;;49635:72:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;40009:124:::0;31826:3;;-1:-1:-1;;;;;31826:3:0;31812:10;:17;31804:51;;;;-1:-1:-1;;;31804:51:0;;;;;;;:::i;:::-;40091:15:::1;:34:::0;40009:124::o;34840:177::-;34950:58;;-1:-1:-1;;;;;8440:32:1;;34950:58:0;;;8422:51:1;8489:18;;;8482:34;;;34923:86:0;;34943:5;;-1:-1:-1;;;34973:23:0;8395:18:1;;34950:58:0;;;;-1:-1:-1;;34950:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;34950:58:0;-1:-1:-1;;;;;;34950:58:0;;;;;;;;;;34923:19;:86::i;5324:318::-;4621:1;5454:7;;:19;5450:89;;5497:30;;-1:-1:-1;;;5497:30:0;;;;;;;;;;;5450:89;4621:1;5616:7;:18;5324:318::o;35025:205::-;35153:68;;-1:-1:-1;;;;;16518:15:1;;;35153:68:0;;;16500:34:1;16570:15;;16550:18;;;16543:43;16602:18;;;16595:34;;;35126:96:0;;35146:5;;-1:-1:-1;;;35176:27:0;16435:18:1;;35153:68:0;16260:375:1;35126:96:0;35025:205;;;;:::o;42683:607::-;-1:-1:-1;;;;;42855:23:0;;42834:18;42855:23;;;:14;:23;;;;;;;42910:34;42870:7;42855:23;42910:13;:34::i;:::-;42889:55;-1:-1:-1;42981:13:0;:10;42993:1;42981:13;:::i;:::-;-1:-1:-1;;;;;42955:23:0;;;;;;;:14;:23;;;;;;;;:39;;;;43054:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43147:24;;;:12;:24;;;;;:38;;;;;;;-1:-1:-1;;;;;;43147:38:0;;;;;;;;-1:-1:-1;43147:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43196:19;:36;;;;;;;;;;;;;;;;;43248:34;;2703:25:1;;;42955:23:0;;43248:34;;2676:18:1;43248:34:0;2557:177:1;44284:181:0;44424:32;;-1:-1:-1;;16817:2:1;16813:15;;;16809:53;44424:32:0;;;16797:66:1;16879:12;;;16872:28;;;44387:7:0;;16916:12:1;;44424:32:0;;;;;;;;;;;;44414:43;;;;;;44407:50;;44284:181;;;;:::o;37094:761::-;37518:23;37544:69;37572:4;37544:69;;;;;;;;;;;;;;;;;37552:5;-1:-1:-1;;;;;37544:27:0;;;:69;;;;;:::i;:::-;37628:17;;37518:95;;-1:-1:-1;37628:21:0;37624:224;;37770:10;37759:30;;;;;;;;;;;;:::i;:::-;37751:85;;;;-1:-1:-1;;;37751:85:0;;17141:2:1;37751:85:0;;;17123:21:1;17180:2;17160:18;;;17153:30;17219:34;17199:18;;;17192:62;-1:-1:-1;;;17270:18:1;;;17263:40;17320:19;;37751:85:0;16939:406:1;9834:195:0;9937:12;9969:52;9991:6;9999:4;10005:1;10008:12;9937;7283:20;;11130:60;;;;-1:-1:-1;;;11130:60:0;;17959:2:1;11130:60:0;;;17941:21:1;17998:2;17978:18;;;17971:30;18037:31;18017:18;;;18010:59;18086:18;;11130:60:0;17757:353:1;11130:60:0;11264:12;11278:23;11305:6;-1:-1:-1;;;;;11305:11:0;11325:5;11333:4;11305:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11263:75;;;;11356:52;11374:7;11383:10;11395:12;11356:17;:52::i;:::-;11349:59;10886:530;-1:-1:-1;;;;;;;10886:530:0:o;13426:742::-;13541:12;13570:7;13566:595;;;-1:-1:-1;13601:10:0;13594:17;;13566:595;13715:17;;:21;13711:439;;13978:10;13972:17;14039:15;14026:10;14022:2;14018:19;14011:44;13711:439;14121:12;14114:20;;-1:-1:-1;;;14114:20:0;;;;;;;;:::i;222:131:1:-;-1:-1:-1;;;;;297:31:1;;287:42;;277:70;;343:1;340;333:12;358:456;435:6;443;451;504:2;492:9;483:7;479:23;475:32;472:52;;;520:1;517;510:12;472:52;559:9;546:23;578:31;603:5;578:31;:::i;:::-;628:5;-1:-1:-1;685:2:1;670:18;;657:32;698:33;657:32;698:33;:::i;:::-;358:456;;750:7;;-1:-1:-1;;;804:2:1;789:18;;;;776:32;;358:456::o;819:323::-;895:6;903;956:2;944:9;935:7;931:23;927:32;924:52;;;972:1;969;962:12;924:52;1008:9;995:23;985:33;;1068:2;1057:9;1053:18;1040:32;1081:31;1106:5;1081:31;:::i;:::-;1131:5;1121:15;;;819:323;;;;;:::o;1339:247::-;1398:6;1451:2;1439:9;1430:7;1426:23;1422:32;1419:52;;;1467:1;1464;1457:12;1419:52;1506:9;1493:23;1525:31;1550:5;1525:31;:::i;1591:180::-;1650:6;1703:2;1691:9;1682:7;1678:23;1674:32;1671:52;;;1719:1;1716;1709:12;1671:52;-1:-1:-1;1742:23:1;;1591:180;-1:-1:-1;1591:180:1:o;3526:383::-;3603:6;3611;3619;3672:2;3660:9;3651:7;3647:23;3643:32;3640:52;;;3688:1;3685;3678:12;3640:52;3724:9;3711:23;3701:33;;3781:2;3770:9;3766:18;3753:32;3743:42;;3835:2;3824:9;3820:18;3807:32;3848:31;3873:5;3848:31;:::i;:::-;3898:5;3888:15;;;3526:383;;;;;:::o;3914:663::-;4018:6;4026;4034;4042;4050;4058;4111:3;4099:9;4090:7;4086:23;4082:33;4079:53;;;4128:1;4125;4118:12;4079:53;4167:9;4154:23;4186:31;4211:5;4186:31;:::i;:::-;4236:5;-1:-1:-1;4288:2:1;4273:18;;4260:32;;-1:-1:-1;4344:2:1;4329:18;;4316:32;4357:33;4316:32;4357:33;:::i;:::-;3914:663;;;;-1:-1:-1;4409:7:1;;4463:2;4448:18;;4435:32;;-1:-1:-1;4514:3:1;4499:19;;4486:33;;4566:3;4551:19;;;4538:33;;-1:-1:-1;3914:663:1;-1:-1:-1;;3914:663:1:o;4582:736::-;4686:6;4694;4702;4710;4718;4726;4779:3;4767:9;4758:7;4754:23;4750:33;4747:53;;;4796:1;4793;4786:12;4747:53;4835:9;4822:23;4854:31;4879:5;4854:31;:::i;:::-;4904:5;-1:-1:-1;4956:2:1;4941:18;;4928:32;;-1:-1:-1;5012:2:1;4997:18;;4984:32;5025:33;4984:32;5025:33;:::i;:::-;5077:7;-1:-1:-1;5131:2:1;5116:18;;5103:32;;-1:-1:-1;5182:3:1;5167:19;;5154:33;;-1:-1:-1;5239:3:1;5224:19;;5211:33;5253;5211;5253;:::i;:::-;5305:7;5295:17;;;4582:736;;;;;;;;:::o;5323:118::-;5409:5;5402:13;5395:21;5388:5;5385:32;5375:60;;5431:1;5428;5421:12;5446:382;5511:6;5519;5572:2;5560:9;5551:7;5547:23;5543:32;5540:52;;;5588:1;5585;5578:12;5540:52;5627:9;5614:23;5646:31;5671:5;5646:31;:::i;:::-;5696:5;-1:-1:-1;5753:2:1;5738:18;;5725:32;5766:30;5725:32;5766:30;:::i;6161:452::-;6247:6;6255;6263;6271;6324:3;6312:9;6303:7;6299:23;6295:33;6292:53;;;6341:1;6338;6331:12;6292:53;6380:9;6367:23;6399:31;6424:5;6399:31;:::i;:::-;6449:5;6501:2;6486:18;;6473:32;;-1:-1:-1;6552:2:1;6537:18;;6524:32;;6603:2;6588:18;6575:32;;-1:-1:-1;6161:452:1;-1:-1:-1;;;6161:452:1:o;6618:529::-;6695:6;6703;6711;6764:2;6752:9;6743:7;6739:23;6735:32;6732:52;;;6780:1;6777;6770:12;6732:52;6819:9;6806:23;6838:31;6863:5;6838:31;:::i;:::-;6888:5;-1:-1:-1;6945:2:1;6930:18;;6917:32;6958:33;6917:32;6958:33;:::i;:::-;7010:7;-1:-1:-1;7069:2:1;7054:18;;7041:32;7082:33;7041:32;7082:33;:::i;7152:388::-;7220:6;7228;7281:2;7269:9;7260:7;7256:23;7252:32;7249:52;;;7297:1;7294;7287:12;7249:52;7336:9;7323:23;7355:31;7380:5;7355:31;:::i;:::-;7405:5;-1:-1:-1;7462:2:1;7447:18;;7434:32;7475:33;7434:32;7475:33;:::i;7545:345::-;7747:2;7729:21;;;7786:2;7766:18;;;7759:30;-1:-1:-1;;;7820:2:1;7805:18;;7798:51;7881:2;7866:18;;7545:345::o;7895:348::-;8097:2;8079:21;;;8136:2;8116:18;;;8109:30;8175:26;8170:2;8155:18;;8148:54;8234:2;8219:18;;7895:348::o;8527:245::-;8594:6;8647:2;8635:9;8626:7;8622:23;8618:32;8615:52;;;8663:1;8660;8653:12;8615:52;8695:9;8689:16;8714:28;8736:5;8714:28;:::i;8987:407::-;9189:2;9171:21;;;9228:2;9208:18;;;9201:30;9267:34;9262:2;9247:18;;9240:62;-1:-1:-1;;;9333:2:1;9318:18;;9311:41;9384:3;9369:19;;8987:407::o;10293:184::-;10363:6;10416:2;10404:9;10395:7;10391:23;10387:32;10384:52;;;10432:1;10429;10422:12;10384:52;-1:-1:-1;10455:16:1;;10293:184;-1:-1:-1;10293:184:1:o;10943:600::-;-1:-1:-1;;;;;11286:15:1;;;11268:34;;11338:15;;;11333:2;11318:18;;11311:43;11390:15;;;;11385:2;11370:18;;11363:43;11437:2;11422:18;;11415:34;11480:3;11465:19;;11458:35;;;;11248:3;11509:19;;11502:35;;;;11217:3;11202:19;;10943:600::o;11548:402::-;11750:2;11732:21;;;11789:2;11769:18;;;11762:30;11828:34;11823:2;11808:18;;11801:62;-1:-1:-1;;;11894:2:1;11879:18;;11872:36;11940:3;11925:19;;11548:402::o;11955:405::-;12157:2;12139:21;;;12196:2;12176:18;;;12169:30;12235:34;12230:2;12215:18;;12208:62;-1:-1:-1;;;12301:2:1;12286:18;;12279:39;12350:3;12335:19;;11955:405::o;13541:127::-;13602:10;13597:3;13593:20;13590:1;13583:31;13633:4;13630:1;13623:15;13657:4;13654:1;13647:15;13673:125;13738:9;;;13759:10;;;13756:36;;;13772:18;;:::i;14624:127::-;14685:10;14680:3;14676:20;14673:1;14666:31;14716:4;14713:1;14706:15;14740:4;14737:1;14730:15;15051:135;15090:3;15111:17;;;15108:43;;15131:18;;:::i;:::-;-1:-1:-1;15178:1:1;15167:13;;15051:135::o;18115:250::-;18200:1;18210:113;18224:6;18221:1;18218:13;18210:113;;;18300:11;;;18294:18;18281:11;;;18274:39;18246:2;18239:10;18210:113;;;-1:-1:-1;;18357:1:1;18339:16;;18332:27;18115:250::o;18370:287::-;18499:3;18537:6;18531:13;18553:66;18612:6;18607:3;18600:4;18592:6;18588:17;18553:66;:::i;:::-;18635:16;;;;;18370:287;-1:-1:-1;;18370:287:1:o;18662:396::-;18811:2;18800:9;18793:21;18774:4;18843:6;18837:13;18886:6;18881:2;18870:9;18866:18;18859:34;18902:79;18974:6;18969:2;18958:9;18954:18;18949:2;18941:6;18937:15;18902:79;:::i;:::-;19042:2;19021:15;-1:-1:-1;;19017:29:1;19002:45;;;;19049:2;18998:54;;18662:396;-1:-1:-1;;18662:396:1:o
Swarm Source
ipfs://77f47cc471b611a71849e9641b7f50d9d66533242f584831ac14fc8c48b04c38
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.