Overview
ETH Balance
0 ETH
Eth Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Liquidator
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2020-12-16
*/
pragma solidity 0.5.16;
interface ICurveMetaPool {
function exchange_underlying(int128 i, int128 j, uint256 dx, uint256 min_dy) external returns (uint256);
}
interface IUniswapV2Router02 {
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
interface ISavingsManager {
/** @dev Admin privs */
function distributeUnallocatedInterest(address _mAsset) external;
/** @dev Liquidator */
function depositLiquidation(address _mAsset, uint256 _liquidation) external;
/** @dev Liquidator */
function collectAndStreamInterest(address _mAsset) external;
/** @dev Public privs */
function collectAndDistributeInterest(address _mAsset) external;
}
contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
*/
bool private initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private initializing;
/**
* @dev Modifier to use in the initializer function of a contract.
*/
modifier initializer() {
require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized");
bool isTopLevelCall = !initializing;
if (isTopLevelCall) {
initializing = true;
initialized = true;
}
_;
if (isTopLevelCall) {
initializing = false;
}
}
/// @dev Returns true if and only if the function is running in the constructor
function isConstructor() private view returns (bool) {
// extcodesize checks the size of the code stored in an address, and
// address returns the current address. Since the code is still not
// deployed when running a constructor, any checks on its code size will
// yield zero, making it an effective way to detect if a contract is
// under construction or not.
address self = address(this);
uint256 cs;
assembly { cs := extcodesize(self) }
return cs == 0;
}
// Reserved storage space to allow for layout changes in the future.
uint256[50] private ______gap;
}
contract InitializableModuleKeys {
// Governance // Phases
bytes32 internal KEY_GOVERNANCE; // 2.x
bytes32 internal KEY_STAKING; // 1.2
bytes32 internal KEY_PROXY_ADMIN; // 1.0
// mStable
bytes32 internal KEY_ORACLE_HUB; // 1.2
bytes32 internal KEY_MANAGER; // 1.2
bytes32 internal KEY_RECOLLATERALISER; // 2.x
bytes32 internal KEY_META_TOKEN; // 1.1
bytes32 internal KEY_SAVINGS_MANAGER; // 1.0
/**
* @dev Initialize function for upgradable proxy contracts. This function should be called
* via Proxy to initialize constants in the Proxy contract.
*/
function _initialize() internal {
// keccak256() values are evaluated only once at the time of this function call.
// Hence, no need to assign hard-coded values to these variables.
KEY_GOVERNANCE = keccak256("Governance");
KEY_STAKING = keccak256("Staking");
KEY_PROXY_ADMIN = keccak256("ProxyAdmin");
KEY_ORACLE_HUB = keccak256("OracleHub");
KEY_MANAGER = keccak256("Manager");
KEY_RECOLLATERALISER = keccak256("Recollateraliser");
KEY_META_TOKEN = keccak256("MetaToken");
KEY_SAVINGS_MANAGER = keccak256("SavingsManager");
}
}
interface INexus {
function governor() external view returns (address);
function getModule(bytes32 key) external view returns (address);
function proposeModule(bytes32 _key, address _addr) external;
function cancelProposedModule(bytes32 _key) external;
function acceptProposedModule(bytes32 _key) external;
function acceptProposedModules(bytes32[] calldata _keys) external;
function requestLockModule(bytes32 _key) external;
function cancelLockModule(bytes32 _key) external;
function lockModule(bytes32 _key) external;
}
contract InitializableModule is InitializableModuleKeys {
INexus public nexus;
/**
* @dev Modifier to allow function calls only from the Governor.
*/
modifier onlyGovernor() {
require(msg.sender == _governor(), "Only governor can execute");
_;
}
/**
* @dev Modifier to allow function calls only from the Governance.
* Governance is either Governor address or Governance address.
*/
modifier onlyGovernance() {
require(
msg.sender == _governor() || msg.sender == _governance(),
"Only governance can execute"
);
_;
}
/**
* @dev Modifier to allow function calls only from the ProxyAdmin.
*/
modifier onlyProxyAdmin() {
require(
msg.sender == _proxyAdmin(), "Only ProxyAdmin can execute"
);
_;
}
/**
* @dev Modifier to allow function calls only from the Manager.
*/
modifier onlyManager() {
require(msg.sender == _manager(), "Only manager can execute");
_;
}
/**
* @dev Initialization function for upgradable proxy contracts
* @param _nexus Nexus contract address
*/
function _initialize(address _nexus) internal {
require(_nexus != address(0), "Nexus address is zero");
nexus = INexus(_nexus);
InitializableModuleKeys._initialize();
}
/**
* @dev Returns Governor address from the Nexus
* @return Address of Governor Contract
*/
function _governor() internal view returns (address) {
return nexus.governor();
}
/**
* @dev Returns Governance Module address from the Nexus
* @return Address of the Governance (Phase 2)
*/
function _governance() internal view returns (address) {
return nexus.getModule(KEY_GOVERNANCE);
}
/**
* @dev Return Staking Module address from the Nexus
* @return Address of the Staking Module contract
*/
function _staking() internal view returns (address) {
return nexus.getModule(KEY_STAKING);
}
/**
* @dev Return ProxyAdmin Module address from the Nexus
* @return Address of the ProxyAdmin Module contract
*/
function _proxyAdmin() internal view returns (address) {
return nexus.getModule(KEY_PROXY_ADMIN);
}
/**
* @dev Return MetaToken Module address from the Nexus
* @return Address of the MetaToken Module contract
*/
function _metaToken() internal view returns (address) {
return nexus.getModule(KEY_META_TOKEN);
}
/**
* @dev Return OracleHub Module address from the Nexus
* @return Address of the OracleHub Module contract
*/
function _oracleHub() internal view returns (address) {
return nexus.getModule(KEY_ORACLE_HUB);
}
/**
* @dev Return Manager Module address from the Nexus
* @return Address of the Manager Module contract
*/
function _manager() internal view returns (address) {
return nexus.getModule(KEY_MANAGER);
}
/**
* @dev Return SavingsManager Module address from the Nexus
* @return Address of the SavingsManager Module contract
*/
function _savingsManager() internal view returns (address) {
return nexus.getModule(KEY_SAVINGS_MANAGER);
}
/**
* @dev Return Recollateraliser Module address from the Nexus
* @return Address of the Recollateraliser Module contract (Phase 2)
*/
function _recollateraliser() internal view returns (address) {
return nexus.getModule(KEY_RECOLLATERALISER);
}
}
contract ILiquidator {
function createLiquidation(
address _integration,
address _sellToken,
address _bAsset,
int128 _curvePosition,
address[] calldata _uniswapPath,
uint256 _trancheAmount,
uint256 _minReturn
)
external;
function updateBasset(
address _integration,
address _bAsset,
int128 _curvePosition,
address[] calldata _uniswapPath,
uint256 _trancheAmount,
uint256 _minReturn
)
external;
function deleteLiquidation(address _integration) external;
function triggerLiquidation(address _integration) external;
}
interface IBasicToken {
function decimals() external view returns (uint8);
}
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*
* _Available since v2.4.0._
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*
* _Available since v2.4.0._
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*
* _Available since v2.4.0._
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
/**
* @dev Interface of the ERC20 standard as defined in the EIP. Does not include
* the optional functions; to access them see {ERC20Detailed}.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
/**
* @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) {
// According to EIP-1052, 0x0 is the value returned for not-yet created accounts
// and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
// for accounts without code, i.e. `keccak256('')`
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
// solhint-disable-next-line no-inline-assembly
assembly { codehash := extcodehash(account) }
return (codehash != accountHash && codehash != 0x0);
}
/**
* @dev Converts an `address` into `address payable`. Note that this is
* simply a type cast: the actual underlying value is not changed.
*
* _Available since v2.4.0._
*/
function toPayable(address account) internal pure returns (address payable) {
return address(uint160(account));
}
/**
* @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].
*
* _Available since v2.4.0._
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-call-value
(bool success, ) = recipient.call.value(amount)("");
require(success, "Address: unable to send value, recipient may have reverted");
}
}
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves.
// A Solidity high level call has three parts:
// 1. The target address is checked to verify it contains contract code
// 2. The call itself is made, and success asserted
// 3. The return value is decoded, which in turn checks the size of the returned data.
// solhint-disable-next-line max-line-length
require(address(token).isContract(), "SafeERC20: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = address(token).call(data);
require(success, "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");
}
}
}
/**
* @title Liquidator
* @author Stability Labs Pty. Ltd.
* @notice The Liquidator allows rewards to be swapped for another token
* and returned to a calling contract
* @dev VERSION: 1.0
* DATE: 2020-10-13
*/
contract Liquidator is
ILiquidator,
Initializable,
InitializableModule
{
using SafeMath for uint256;
using SafeERC20 for IERC20;
event LiquidationModified(address indexed integration);
event LiquidationEnded(address indexed integration);
event Liquidated(address indexed sellToken, address mUSD, uint256 mUSDAmount, address buyToken);
address public mUSD;
ICurveMetaPool public curve;
IUniswapV2Router02 public uniswap;
// Deprecated var, but kept around to mirror storage layout
uint256 private interval = 7 days;
mapping(address => Liquidation) public liquidations;
mapping(address => uint256) public minReturn;
struct Liquidation {
address sellToken;
address bAsset;
int128 curvePosition;
address[] uniswapPath;
uint256 lastTriggered;
uint256 trancheAmount; // The amount of bAsset units to buy each week, with token decimals
}
function initialize(
address _nexus,
address _uniswap,
address _curve,
address _mUSD
)
external
initializer
{
InitializableModule._initialize(_nexus);
require(_uniswap != address(0), "Invalid uniswap address");
uniswap = IUniswapV2Router02(_uniswap);
require(_curve != address(0), "Invalid curve address");
curve = ICurveMetaPool(_curve);
require(_mUSD != address(0), "Invalid mUSD address");
mUSD = _mUSD;
}
/***************************************
GOVERNANCE
****************************************/
/**
* @dev Create a liquidation
* @param _integration The integration contract address from which to receive sellToken
* @param _sellToken Token harvested from the integration contract
* @param _bAsset The asset to buy on Uniswap
* @param _curvePosition Position of the bAsset in Curves MetaPool
* @param _uniswapPath The Uniswap path as an array of addresses e.g. [COMP, WETH, DAI]
* @param _trancheAmount The amount of bAsset units to buy in each weekly tranche
* @param _minReturn Minimum exact amount of bAsset to get for each (whole) sellToken unit
*/
function createLiquidation(
address _integration,
address _sellToken,
address _bAsset,
int128 _curvePosition,
address[] calldata _uniswapPath,
uint256 _trancheAmount,
uint256 _minReturn
)
external
onlyGovernance
{
require(liquidations[_integration].sellToken == address(0), "Liquidation exists for this bAsset");
require(
_integration != address(0) &&
_sellToken != address(0) &&
_bAsset != address(0) &&
_uniswapPath.length >= 2 &&
_minReturn > 0,
"Invalid inputs"
);
require(_validUniswapPath(_sellToken, _bAsset, _uniswapPath), "Invalid uniswap path");
liquidations[_integration] = Liquidation({
sellToken: _sellToken,
bAsset: _bAsset,
curvePosition: _curvePosition,
uniswapPath: _uniswapPath,
lastTriggered: 0,
trancheAmount: _trancheAmount
});
minReturn[_integration] = _minReturn;
emit LiquidationModified(_integration);
}
/**
* @dev Update a liquidation
* @param _integration The integration contract in question
* @param _bAsset New asset to buy on Uniswap
* @param _curvePosition Position of the bAsset in Curves MetaPool
* @param _uniswapPath The Uniswap path as an array of addresses e.g. [COMP, WETH, DAI]
* @param _trancheAmount The amount of bAsset units to buy in each weekly tranche
* @param _minReturn Minimum exact amount of bAsset to get for each (whole) sellToken unit
*/
function updateBasset(
address _integration,
address _bAsset,
int128 _curvePosition,
address[] calldata _uniswapPath,
uint256 _trancheAmount,
uint256 _minReturn
)
external
onlyGovernance
{
Liquidation memory liquidation = liquidations[_integration];
address oldBasset = liquidation.bAsset;
require(oldBasset != address(0), "Liquidation does not exist");
require(_minReturn > 0, "Must set some minimum value");
require(_bAsset != address(0), "Invalid bAsset");
require(_validUniswapPath(liquidation.sellToken, _bAsset, _uniswapPath), "Invalid uniswap path");
liquidations[_integration].bAsset = _bAsset;
liquidations[_integration].curvePosition = _curvePosition;
liquidations[_integration].uniswapPath = _uniswapPath;
liquidations[_integration].trancheAmount = _trancheAmount;
minReturn[_integration] = _minReturn;
emit LiquidationModified(_integration);
}
/**
* @dev Validates a given uniswap path - valid if sellToken at position 0 and bAsset at end
* @param _sellToken Token harvested from the integration contract
* @param _bAsset New asset to buy on Uniswap
* @param _uniswapPath The Uniswap path as an array of addresses e.g. [COMP, WETH, DAI]
*/
function _validUniswapPath(address _sellToken, address _bAsset, address[] memory _uniswapPath)
internal
pure
returns (bool)
{
uint256 len = _uniswapPath.length;
return _sellToken == _uniswapPath[0] && _bAsset == _uniswapPath[len-1];
}
/**
* @dev Delete a liquidation
*/
function deleteLiquidation(address _integration)
external
onlyGovernance
{
Liquidation memory liquidation = liquidations[_integration];
require(liquidation.bAsset != address(0), "Liquidation does not exist");
delete liquidations[_integration];
delete minReturn[_integration];
emit LiquidationEnded(_integration);
}
/***************************************
LIQUIDATION
****************************************/
/**
* @dev Triggers a liquidation, flow (once per week):
* - Sells $COMP for $USDC (or other) on Uniswap (up to trancheAmount)
* - Sell USDC for mUSD on Curve
* - Send to SavingsManager
* @param _integration Integration for which to trigger liquidation
*/
function triggerLiquidation(address _integration)
external
{
// solium-disable-next-line security/no-tx-origin
require(tx.origin == msg.sender, "Must be EOA");
Liquidation memory liquidation = liquidations[_integration];
address bAsset = liquidation.bAsset;
require(bAsset != address(0), "Liquidation does not exist");
require(block.timestamp > liquidation.lastTriggered.add(7 days), "Must wait for interval");
liquidations[_integration].lastTriggered = block.timestamp;
// Cache variables
address sellToken = liquidation.sellToken;
address[] memory uniswapPath = liquidation.uniswapPath;
// 1. Transfer sellTokens from integration contract if there are some
// Assumes infinite approval
uint256 integrationBal = IERC20(sellToken).balanceOf(_integration);
if (integrationBal > 0) {
IERC20(sellToken).safeTransferFrom(_integration, address(this), integrationBal);
}
// 2. Get the amount to sell based on the tranche amount we want to buy
// Check contract balance
uint256 sellTokenBal = IERC20(sellToken).balanceOf(address(this));
require(sellTokenBal > 0, "No sell tokens to liquidate");
require(liquidation.trancheAmount > 0, "Liquidation has been paused");
// Calc amounts for max tranche
uint[] memory amountsIn = uniswap.getAmountsIn(liquidation.trancheAmount, uniswapPath);
uint256 sellAmount = amountsIn[0];
if (sellTokenBal < sellAmount) {
sellAmount = sellTokenBal;
}
// 3. Make the swap
// 3.1 Approve Uniswap and make the swap
IERC20(sellToken).safeApprove(address(uniswap), 0);
IERC20(sellToken).safeApprove(address(uniswap), sellAmount);
// 3.2. Make the sale > https://uniswap.org/docs/v2/smart-contracts/router02/#swapexacttokensfortokens
// min amount out = sellAmount * priceFloor / 1e18
// e.g. 1e18 * 100e6 / 1e18 = 100e6
// e.g. 30e8 * 100e6 / 1e8 = 3000e6
// e.g. 30e18 * 100e18 / 1e18 = 3000e18
uint256 sellTokenDec = IBasicToken(sellToken).decimals();
uint256 minOut = sellAmount.mul(minReturn[_integration]).div(10 ** sellTokenDec);
require(minOut > 0, "Must have some price floor");
uniswap.swapExactTokensForTokens(
sellAmount,
minOut,
uniswapPath,
address(this),
block.timestamp.add(1800)
);
// 3.3. Trade on Curve
uint256 purchased = _sellOnCrv(bAsset, liquidation.curvePosition);
// 4.0. Send to SavingsManager
address savings = _savingsManager();
IERC20(mUSD).safeApprove(savings, 0);
IERC20(mUSD).safeApprove(savings, purchased);
ISavingsManager(savings).depositLiquidation(mUSD, purchased);
emit Liquidated(sellToken, mUSD, purchased, bAsset);
}
function _sellOnCrv(address _bAsset, int128 _curvePosition) internal returns (uint256 purchased) {
uint256 bAssetBal = IERC20(_bAsset).balanceOf(address(this));
IERC20(_bAsset).safeApprove(address(curve), 0);
IERC20(_bAsset).safeApprove(address(curve), bAssetBal);
uint256 bAssetDec = IBasicToken(_bAsset).decimals();
// e.g. 100e6 * 95e16 / 1e6 = 100e18
uint256 minOutCrv = bAssetBal.mul(95e16).div(10 ** bAssetDec);
purchased = curve.exchange_underlying(_curvePosition, 0, bAssetBal, minOutCrv);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sellToken","type":"address"},{"indexed":false,"internalType":"address","name":"mUSD","type":"address"},{"indexed":false,"internalType":"uint256","name":"mUSDAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"buyToken","type":"address"}],"name":"Liquidated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"integration","type":"address"}],"name":"LiquidationEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"integration","type":"address"}],"name":"LiquidationModified","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"_integration","type":"address"},{"internalType":"address","name":"_sellToken","type":"address"},{"internalType":"address","name":"_bAsset","type":"address"},{"internalType":"int128","name":"_curvePosition","type":"int128"},{"internalType":"address[]","name":"_uniswapPath","type":"address[]"},{"internalType":"uint256","name":"_trancheAmount","type":"uint256"},{"internalType":"uint256","name":"_minReturn","type":"uint256"}],"name":"createLiquidation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"curve","outputs":[{"internalType":"contract ICurveMetaPool","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_integration","type":"address"}],"name":"deleteLiquidation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_nexus","type":"address"},{"internalType":"address","name":"_uniswap","type":"address"},{"internalType":"address","name":"_curve","type":"address"},{"internalType":"address","name":"_mUSD","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"liquidations","outputs":[{"internalType":"address","name":"sellToken","type":"address"},{"internalType":"address","name":"bAsset","type":"address"},{"internalType":"int128","name":"curvePosition","type":"int128"},{"internalType":"uint256","name":"lastTriggered","type":"uint256"},{"internalType":"uint256","name":"trancheAmount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"mUSD","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nexus","outputs":[{"internalType":"contract INexus","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_integration","type":"address"}],"name":"triggerLiquidation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"uniswap","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_integration","type":"address"},{"internalType":"address","name":"_bAsset","type":"address"},{"internalType":"int128","name":"_curvePosition","type":"int128"},{"internalType":"address[]","name":"_uniswapPath","type":"address[]"},{"internalType":"uint256","name":"_trancheAmount","type":"uint256"},{"internalType":"uint256","name":"_minReturn","type":"uint256"}],"name":"updateBasset","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405262093a80603f5534801561001757600080fd5b5061248b806100276000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c8063937d4c4211610071578063937d4c42146101d1578063a3f5c1d214610233578063b350df5d1461023b578063cad4f58814610261578063f09a1d0014610300578063f8c8765e14610308576100a9565b80630ac1ff80146100ae5780632681f7e4146100e65780636495df271461010a5780637165485d146101a35780637e9fd222146101ab575b600080fd5b6100d4600480360360208110156100c457600080fd5b50356001600160a01b0316610346565b60408051918252519081900360200190f35b6100ee610358565b604080516001600160a01b039092168252519081900360200190f35b6101a1600480360360c081101561012057600080fd5b6001600160a01b0382358116926020810135909116916040820135600f0b9190810190608081016060820135600160201b81111561015d57600080fd5b82018360208201111561016f57600080fd5b803590602001918460208302840111600160201b8311171561019057600080fd5b919350915080359060200135610367565b005b6100ee610704565b6101a1600480360360208110156101c157600080fd5b50356001600160a01b0316610713565b6101f7600480360360208110156101e757600080fd5b50356001600160a01b031661097a565b604080516001600160a01b039687168152949095166020850152600f92830b90920b838501526060830152608082015290519081900360a00190f35b6100ee6109ba565b6101a16004803603602081101561025157600080fd5b50356001600160a01b03166109c9565b6101a1600480360360e081101561027757600080fd5b6001600160a01b03823581169260208101358216926040820135909216916060820135600f0b919081019060a081016080820135600160201b8111156102bc57600080fd5b8201836020820111156102ce57600080fd5b803590602001918460208302840111600160201b831117156102ef57600080fd5b9193509150803590602001356112ed565b6100ee611646565b6101a16004803603608081101561031e57600080fd5b506001600160a01b038135811691602081013582169160408201358116916060013516611655565b60416020526000908152604090205481565b603e546001600160a01b031681565b61036f61184f565b6001600160a01b0316336001600160a01b031614806103a657506103916118c6565b6001600160a01b0316336001600160a01b0316145b6103f7576040805162461bcd60e51b815260206004820152601b60248201527f4f6e6c7920676f7665726e616e63652063616e20657865637574650000000000604482015290519081900360640190fd5b6103ff61223d565b6001600160a01b0380891660009081526040602081815291819020815160c0810183528154851681526001820154909416848401526002810154600f90810b810b900b8483015260038101805483518186028101860190945280845291936060860193929083018282801561049d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161047f575b505050918352505060048201546020808301919091526005909201546040909101528101519091506001600160a01b03811661051d576040805162461bcd60e51b815260206004820152601a602482015279131a5c5d5a59185d1a5bdb88191bd95cc81b9bdd08195e1a5cdd60321b604482015290519081900360640190fd5b60008311610572576040805162461bcd60e51b815260206004820152601b60248201527f4d7573742073657420736f6d65206d696e696d756d2076616c75650000000000604482015290519081900360640190fd5b6001600160a01b0388166105be576040805162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a590818905cdcd95d60921b604482015290519081900360640190fd5b61060082600001518988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061191592505050565b610648576040805162461bcd60e51b8152602060048201526014602482015273092dcecc2d8d2c840eadcd2e6eec2e040e0c2e8d60631b604482015290519081900360640190fd5b6001600160a01b0389811660009081526040602081905290206001810180546001600160a01b031916928b16929092179091556002810180546001600160801b0319166001600160801b03600f8b900b161790556106aa906003018787612271565b506001600160a01b03891660008181526040602081815281832060050188905560419052808220869055517f52f63ab5789c9a266379c35974b035fb9f7079ec0effab1b31e7ad82fadb488a9190a2505050505050505050565b603d546001600160a01b031681565b61071b61184f565b6001600160a01b0316336001600160a01b03161480610752575061073d6118c6565b6001600160a01b0316336001600160a01b0316145b6107a3576040805162461bcd60e51b815260206004820152601b60248201527f4f6e6c7920676f7665726e616e63652063616e20657865637574650000000000604482015290519081900360640190fd5b6107ab61223d565b6001600160a01b0380831660009081526040602081815291819020815160c0810183528154851681526001820154909416848401526002810154600f90810b810b900b8483015260038101805483518186028101860190945280845291936060860193929083018282801561084957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161082b575b5050505050815260200160048201548152602001600582015481525050905060006001600160a01b031681602001516001600160a01b031614156108d1576040805162461bcd60e51b815260206004820152601a602482015279131a5c5d5a59185d1a5bdb88191bd95cc81b9bdd08195e1a5cdd60321b604482015290519081900360640190fd5b6001600160a01b038216600090815260406020819052812080546001600160a01b0319908116825560018201805490911690556002810180546001600160801b03191690559061092460038301826122d4565b5060006004820181905560059091018190556001600160a01b038316808252604160205260408083208390555190917fe513b42585b0ceec0d56d56fe3a23861c15a2f74eb4c32c94334d63d68ff4dcf91a25050565b604060208190526000918252902080546001820154600283015460048401546005909401546001600160a01b03938416949390921692600f9190910b9185565b603b546001600160a01b031681565b323314610a0b576040805162461bcd60e51b815260206004820152600b60248201526a4d75737420626520454f4160a81b604482015290519081900360640190fd5b610a1361223d565b6001600160a01b0380831660009081526040602081815291819020815160c0810183528154851681526001820154909416848401526002810154600f90810b810b900b84830152600381018054835181860281018601909452808452919360608601939290830182828015610ab157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610a93575b505050918352505060048201546020808301919091526005909201546040909101528101519091506001600160a01b038116610b31576040805162461bcd60e51b815260206004820152601a602482015279131a5c5d5a59185d1a5bdb88191bd95cc81b9bdd08195e1a5cdd60321b604482015290519081900360640190fd5b6080820151610b499062093a8063ffffffff61197b16565b4211610b95576040805162461bcd60e51b8152602060048201526016602482015275135d5cdd081dd85a5d08199bdc881a5b9d195c9d985b60521b604482015290519081900360640190fd5b6001600160a01b03808416600081815260406020818152818320426004918201558751606089015184516370a0823160e01b815292830196909652925192958616926370a0823192602480840193919291829003018186803b158015610bfa57600080fd5b505afa158015610c0e573d6000803e3d6000fd5b505050506040513d6020811015610c2457600080fd5b505190508015610c4957610c496001600160a01b03841687308463ffffffff6119de16565b604080516370a0823160e01b815230600482015290516000916001600160a01b038616916370a0823191602480820192602092909190829003018186803b158015610c9357600080fd5b505afa158015610ca7573d6000803e3d6000fd5b505050506040513d6020811015610cbd57600080fd5b5051905080610d13576040805162461bcd60e51b815260206004820152601b60248201527f4e6f2073656c6c20746f6b656e7320746f206c69717569646174650000000000604482015290519081900360640190fd5b60008660a0015111610d6c576040805162461bcd60e51b815260206004820152601b60248201527f4c69717569646174696f6e20686173206265656e207061757365640000000000604482015290519081900360640190fd5b603e5460a0870151604080516307c0329d60e21b815260048101838152602482019283528751604483015287516060956001600160a01b031694631f00ca749490938a93926064909101906020808601910280838360005b83811015610ddc578181015183820152602001610dc4565b50505050905001935050505060006040518083038186803b158015610e0057600080fd5b505afa158015610e14573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610e3d57600080fd5b8101908080516040519392919084600160201b821115610e5c57600080fd5b908301906020820185811115610e7157600080fd5b82518660208202830111600160201b82111715610e8d57600080fd5b82525081516020918201928201910280838360005b83811015610eba578181015183820152602001610ea2565b505050509050016040525050509050600081600081518110610ed857fe5b6020026020010151905080831015610eed5750815b603e54610f0e906001600160a01b038881169116600063ffffffff611a3e16565b603e54610f2e906001600160a01b0388811691168363ffffffff611a3e16565b6000866001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610f6957600080fd5b505afa158015610f7d573d6000803e3d6000fd5b505050506040513d6020811015610f9357600080fd5b50516001600160a01b038b1660009081526041602052604081205460ff909216925090610fdd90600a84900a90610fd190869063ffffffff611b5616565b9063ffffffff611baf16565b905060008111611034576040805162461bcd60e51b815260206004820152601a60248201527f4d757374206861766520736f6d6520707269636520666c6f6f72000000000000604482015290519081900360640190fd5b603e546001600160a01b03166338ed173984838a3061105b4261070863ffffffff61197b16565b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156110d45781810151838201526020016110bc565b505050509050019650505050505050600060405180830381600087803b1580156110fd57600080fd5b505af1158015611111573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561113a57600080fd5b8101908080516040519392919084600160201b82111561115957600080fd5b90830190602082018581111561116e57600080fd5b82518660208202830111600160201b8211171561118a57600080fd5b82525081516020918201928201910280838360005b838110156111b757818101518382015260200161119f565b505050509050016040525050505060006111d58a8c60400151611bf1565b905060006111e1611ddd565b603c54909150611202906001600160a01b031682600063ffffffff611a3e16565b603c5461121f906001600160a01b0316828463ffffffff611a3e16565b603c54604080516313e8da7160e21b81526001600160a01b03928316600482015260248101859052905191831691634fa369c49160448082019260009290919082900301818387803b15801561127457600080fd5b505af1158015611288573d6000803e3d6000fd5b5050603c54604080516001600160a01b039283168152602081018790528f8316818301529051918e1693507fbf8c93ffab42c7a8745e30d00eef080c6704962d26f0b42a0e9d9589b7417af1925081900360600190a250505050505050505050505050565b6112f561184f565b6001600160a01b0316336001600160a01b0316148061132c57506113176118c6565b6001600160a01b0316336001600160a01b0316145b61137d576040805162461bcd60e51b815260206004820152601b60248201527f4f6e6c7920676f7665726e616e63652063616e20657865637574650000000000604482015290519081900360640190fd5b6001600160a01b0388811660009081526040602081905290205416156113d45760405162461bcd60e51b81526004018080602001828103825260228152602001806123d56022913960400191505060405180910390fd5b6001600160a01b038816158015906113f457506001600160a01b03871615155b801561140857506001600160a01b03861615155b8015611415575060028310155b80156114215750600081115b611463576040805162461bcd60e51b815260206004820152600e60248201526d496e76616c696420696e7075747360901b604482015290519081900360640190fd5b6114a1878786868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061191592505050565b6114e9576040805162461bcd60e51b8152602060048201526014602482015273092dcecc2d8d2c840eadcd2e6eec2e040e0c2e8d60631b604482015290519081900360640190fd5b6040518060c00160405280886001600160a01b03168152602001876001600160a01b0316815260200186600f0b81526020018585808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250938552505050602080830182905260409283018690526001600160a01b03808d16835283825291839020845181549084166001600160a01b0319918216178255858301516001830180549190951691161790925591830151600282018054600f9290920b6001600160801b03166001600160801b03199092169190911790556060830151805191926115e4926003850192909101906122f2565b506080820151600482015560a0909101516005909101556001600160a01b038816600081815260416020526040808220849055517f52f63ab5789c9a266379c35974b035fb9f7079ec0effab1b31e7ad82fadb488a9190a25050505050505050565b603c546001600160a01b031681565b600054610100900460ff168061166e575061166e611e2c565b8061167c575060005460ff16155b6116b75760405162461bcd60e51b815260040180806020018281038252602e8152602001806123a7602e913960400191505060405180910390fd5b600054610100900460ff161580156116e2576000805460ff1961ff0019909116610100171660011790555b6116eb85611e32565b6001600160a01b038416611746576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420756e69737761702061646472657373000000000000000000604482015290519081900360640190fd5b603e80546001600160a01b0319166001600160a01b038681169190911790915583166117b1576040805162461bcd60e51b8152602060048201526015602482015274496e76616c6964206375727665206164647265737360581b604482015290519081900360640190fd5b603d80546001600160a01b0319166001600160a01b0385811691909117909155821661181b576040805162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d555344206164647265737360601b604482015290519081900360640190fd5b603c80546001600160a01b0319166001600160a01b0384161790558015611848576000805461ff00191690555b5050505050565b603b546040805163030d028960e21b815290516000926001600160a01b031691630c340a24916004808301926020929190829003018186803b15801561189457600080fd5b505afa1580156118a8573d6000803e3d6000fd5b505050506040513d60208110156118be57600080fd5b505190505b90565b603b54603354604080516385acd64160e01b81526004810192909252516000926001600160a01b0316916385acd641916024808301926020929190829003018186803b15801561189457600080fd5b805160009082828261192357fe5b60200260200101516001600160a01b0316856001600160a01b0316148015611972575082600182038151811061195557fe5b60200260200101516001600160a01b0316846001600160a01b0316145b95945050505050565b6000828201838110156119d5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611a38908590611eab565b50505050565b801580611ac4575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015611a9657600080fd5b505afa158015611aaa573d6000803e3d6000fd5b505050506040513d6020811015611ac057600080fd5b5051155b611aff5760405162461bcd60e51b81526004018080602001828103825260368152602001806124216036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052611b51908490611eab565b505050565b600082611b65575060006119d8565b82820282848281611b7257fe5b04146119d55760405162461bcd60e51b81526004018080602001828103825260218152602001806123866021913960400191505060405180910390fd5b60006119d583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612063565b604080516370a0823160e01b8152306004820152905160009182916001600160a01b038616916370a08231916024808301926020929190829003018186803b158015611c3c57600080fd5b505afa158015611c50573d6000803e3d6000fd5b505050506040513d6020811015611c6657600080fd5b5051603d54909150611c8c906001600160a01b038681169116600063ffffffff611a3e16565b603d54611cac906001600160a01b0386811691168363ffffffff611a3e16565b6000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611ce757600080fd5b505afa158015611cfb573d6000803e3d6000fd5b505050506040513d6020811015611d1157600080fd5b505160ff1690506000611d3a600a83900a610fd185670d2f13f7789f000063ffffffff611b5616565b603d5460408051635320bf6b60e11b8152600f89810b900b6004820152600060248201819052604482018890526064820185905291519394506001600160a01b039092169263a6417ed6926084808201936020939283900390910190829087803b158015611da757600080fd5b505af1158015611dbb573d6000803e3d6000fd5b505050506040513d6020811015611dd157600080fd5b50519695505050505050565b603b54603a54604080516385acd64160e01b81526004810192909252516000926001600160a01b0316916385acd641916024808301926020929190829003018186803b15801561189457600080fd5b303b1590565b6001600160a01b038116611e85576040805162461bcd60e51b81526020600482015260156024820152744e657875732061646472657373206973207a65726f60581b604482015290519081900360640190fd5b603b80546001600160a01b0319166001600160a01b038316179055611ea8612105565b50565b611ebd826001600160a01b0316612201565b611f0e576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310611f4c5780518252601f199092019160209182019101611f2d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611fae576040519150601f19603f3d011682016040523d82523d6000602084013e611fb3565b606091505b50915091508161200a576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115611a385780806020019051602081101561202657600080fd5b5051611a385760405162461bcd60e51b815260040180806020018281038252602a8152602001806123f7602a913960400191505060405180910390fd5b600081836120ef5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156120b457818101518382015260200161209c565b50505050905090810190601f1680156120e15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816120fb57fe5b0495945050505050565b6040805169476f7665726e616e636560b01b8152815190819003600a9081018220603355665374616b696e6760c81b82528251918290036007908101832060345569283937bc3ca0b236b4b760b11b835283519283900390910182206035556827b930b1b632a43ab160b91b8252825191829003600990810183206036556626b0b730b3b2b960c91b835283519283900390910182206037556f2932b1b7b63630ba32b930b634b9b2b960811b825282519182900360100182206038556826b2ba30aa37b5b2b760b91b82528251918290030181206039556d29b0bb34b733b9a6b0b730b3b2b960911b8152905190819003600e019020603a55565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061223557508115155b949350505050565b6040805160c0810182526000808252602082018190529181018290526060808201526080810182905260a081019190915290565b8280548282559060005260206000209081019282156122c4579160200282015b828111156122c45781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612291565b506122d0929150612347565b5090565b5080546000825590600052602060002090810190611ea8919061236b565b8280548282559060005260206000209081019282156122c4579160200282015b828111156122c457825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612312565b6118c391905b808211156122d05780546001600160a01b031916815560010161234d565b6118c391905b808211156122d0576000815560010161237156fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65644c69717569646174696f6e2065786973747320666f722074686973206241737365745361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a723158200624d163c7a512d07c456c56c55b0be633ca939b501a80384bfaa5bfaadea8b364736f6c63430005100032
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100a95760003560e01c8063937d4c4211610071578063937d4c42146101d1578063a3f5c1d214610233578063b350df5d1461023b578063cad4f58814610261578063f09a1d0014610300578063f8c8765e14610308576100a9565b80630ac1ff80146100ae5780632681f7e4146100e65780636495df271461010a5780637165485d146101a35780637e9fd222146101ab575b600080fd5b6100d4600480360360208110156100c457600080fd5b50356001600160a01b0316610346565b60408051918252519081900360200190f35b6100ee610358565b604080516001600160a01b039092168252519081900360200190f35b6101a1600480360360c081101561012057600080fd5b6001600160a01b0382358116926020810135909116916040820135600f0b9190810190608081016060820135600160201b81111561015d57600080fd5b82018360208201111561016f57600080fd5b803590602001918460208302840111600160201b8311171561019057600080fd5b919350915080359060200135610367565b005b6100ee610704565b6101a1600480360360208110156101c157600080fd5b50356001600160a01b0316610713565b6101f7600480360360208110156101e757600080fd5b50356001600160a01b031661097a565b604080516001600160a01b039687168152949095166020850152600f92830b90920b838501526060830152608082015290519081900360a00190f35b6100ee6109ba565b6101a16004803603602081101561025157600080fd5b50356001600160a01b03166109c9565b6101a1600480360360e081101561027757600080fd5b6001600160a01b03823581169260208101358216926040820135909216916060820135600f0b919081019060a081016080820135600160201b8111156102bc57600080fd5b8201836020820111156102ce57600080fd5b803590602001918460208302840111600160201b831117156102ef57600080fd5b9193509150803590602001356112ed565b6100ee611646565b6101a16004803603608081101561031e57600080fd5b506001600160a01b038135811691602081013582169160408201358116916060013516611655565b60416020526000908152604090205481565b603e546001600160a01b031681565b61036f61184f565b6001600160a01b0316336001600160a01b031614806103a657506103916118c6565b6001600160a01b0316336001600160a01b0316145b6103f7576040805162461bcd60e51b815260206004820152601b60248201527f4f6e6c7920676f7665726e616e63652063616e20657865637574650000000000604482015290519081900360640190fd5b6103ff61223d565b6001600160a01b0380891660009081526040602081815291819020815160c0810183528154851681526001820154909416848401526002810154600f90810b810b900b8483015260038101805483518186028101860190945280845291936060860193929083018282801561049d57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161047f575b505050918352505060048201546020808301919091526005909201546040909101528101519091506001600160a01b03811661051d576040805162461bcd60e51b815260206004820152601a602482015279131a5c5d5a59185d1a5bdb88191bd95cc81b9bdd08195e1a5cdd60321b604482015290519081900360640190fd5b60008311610572576040805162461bcd60e51b815260206004820152601b60248201527f4d7573742073657420736f6d65206d696e696d756d2076616c75650000000000604482015290519081900360640190fd5b6001600160a01b0388166105be576040805162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a590818905cdcd95d60921b604482015290519081900360640190fd5b61060082600001518988888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061191592505050565b610648576040805162461bcd60e51b8152602060048201526014602482015273092dcecc2d8d2c840eadcd2e6eec2e040e0c2e8d60631b604482015290519081900360640190fd5b6001600160a01b0389811660009081526040602081905290206001810180546001600160a01b031916928b16929092179091556002810180546001600160801b0319166001600160801b03600f8b900b161790556106aa906003018787612271565b506001600160a01b03891660008181526040602081815281832060050188905560419052808220869055517f52f63ab5789c9a266379c35974b035fb9f7079ec0effab1b31e7ad82fadb488a9190a2505050505050505050565b603d546001600160a01b031681565b61071b61184f565b6001600160a01b0316336001600160a01b03161480610752575061073d6118c6565b6001600160a01b0316336001600160a01b0316145b6107a3576040805162461bcd60e51b815260206004820152601b60248201527f4f6e6c7920676f7665726e616e63652063616e20657865637574650000000000604482015290519081900360640190fd5b6107ab61223d565b6001600160a01b0380831660009081526040602081815291819020815160c0810183528154851681526001820154909416848401526002810154600f90810b810b900b8483015260038101805483518186028101860190945280845291936060860193929083018282801561084957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161082b575b5050505050815260200160048201548152602001600582015481525050905060006001600160a01b031681602001516001600160a01b031614156108d1576040805162461bcd60e51b815260206004820152601a602482015279131a5c5d5a59185d1a5bdb88191bd95cc81b9bdd08195e1a5cdd60321b604482015290519081900360640190fd5b6001600160a01b038216600090815260406020819052812080546001600160a01b0319908116825560018201805490911690556002810180546001600160801b03191690559061092460038301826122d4565b5060006004820181905560059091018190556001600160a01b038316808252604160205260408083208390555190917fe513b42585b0ceec0d56d56fe3a23861c15a2f74eb4c32c94334d63d68ff4dcf91a25050565b604060208190526000918252902080546001820154600283015460048401546005909401546001600160a01b03938416949390921692600f9190910b9185565b603b546001600160a01b031681565b323314610a0b576040805162461bcd60e51b815260206004820152600b60248201526a4d75737420626520454f4160a81b604482015290519081900360640190fd5b610a1361223d565b6001600160a01b0380831660009081526040602081815291819020815160c0810183528154851681526001820154909416848401526002810154600f90810b810b900b84830152600381018054835181860281018601909452808452919360608601939290830182828015610ab157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610a93575b505050918352505060048201546020808301919091526005909201546040909101528101519091506001600160a01b038116610b31576040805162461bcd60e51b815260206004820152601a602482015279131a5c5d5a59185d1a5bdb88191bd95cc81b9bdd08195e1a5cdd60321b604482015290519081900360640190fd5b6080820151610b499062093a8063ffffffff61197b16565b4211610b95576040805162461bcd60e51b8152602060048201526016602482015275135d5cdd081dd85a5d08199bdc881a5b9d195c9d985b60521b604482015290519081900360640190fd5b6001600160a01b03808416600081815260406020818152818320426004918201558751606089015184516370a0823160e01b815292830196909652925192958616926370a0823192602480840193919291829003018186803b158015610bfa57600080fd5b505afa158015610c0e573d6000803e3d6000fd5b505050506040513d6020811015610c2457600080fd5b505190508015610c4957610c496001600160a01b03841687308463ffffffff6119de16565b604080516370a0823160e01b815230600482015290516000916001600160a01b038616916370a0823191602480820192602092909190829003018186803b158015610c9357600080fd5b505afa158015610ca7573d6000803e3d6000fd5b505050506040513d6020811015610cbd57600080fd5b5051905080610d13576040805162461bcd60e51b815260206004820152601b60248201527f4e6f2073656c6c20746f6b656e7320746f206c69717569646174650000000000604482015290519081900360640190fd5b60008660a0015111610d6c576040805162461bcd60e51b815260206004820152601b60248201527f4c69717569646174696f6e20686173206265656e207061757365640000000000604482015290519081900360640190fd5b603e5460a0870151604080516307c0329d60e21b815260048101838152602482019283528751604483015287516060956001600160a01b031694631f00ca749490938a93926064909101906020808601910280838360005b83811015610ddc578181015183820152602001610dc4565b50505050905001935050505060006040518083038186803b158015610e0057600080fd5b505afa158015610e14573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015610e3d57600080fd5b8101908080516040519392919084600160201b821115610e5c57600080fd5b908301906020820185811115610e7157600080fd5b82518660208202830111600160201b82111715610e8d57600080fd5b82525081516020918201928201910280838360005b83811015610eba578181015183820152602001610ea2565b505050509050016040525050509050600081600081518110610ed857fe5b6020026020010151905080831015610eed5750815b603e54610f0e906001600160a01b038881169116600063ffffffff611a3e16565b603e54610f2e906001600160a01b0388811691168363ffffffff611a3e16565b6000866001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610f6957600080fd5b505afa158015610f7d573d6000803e3d6000fd5b505050506040513d6020811015610f9357600080fd5b50516001600160a01b038b1660009081526041602052604081205460ff909216925090610fdd90600a84900a90610fd190869063ffffffff611b5616565b9063ffffffff611baf16565b905060008111611034576040805162461bcd60e51b815260206004820152601a60248201527f4d757374206861766520736f6d6520707269636520666c6f6f72000000000000604482015290519081900360640190fd5b603e546001600160a01b03166338ed173984838a3061105b4261070863ffffffff61197b16565b6040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156110d45781810151838201526020016110bc565b505050509050019650505050505050600060405180830381600087803b1580156110fd57600080fd5b505af1158015611111573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561113a57600080fd5b8101908080516040519392919084600160201b82111561115957600080fd5b90830190602082018581111561116e57600080fd5b82518660208202830111600160201b8211171561118a57600080fd5b82525081516020918201928201910280838360005b838110156111b757818101518382015260200161119f565b505050509050016040525050505060006111d58a8c60400151611bf1565b905060006111e1611ddd565b603c54909150611202906001600160a01b031682600063ffffffff611a3e16565b603c5461121f906001600160a01b0316828463ffffffff611a3e16565b603c54604080516313e8da7160e21b81526001600160a01b03928316600482015260248101859052905191831691634fa369c49160448082019260009290919082900301818387803b15801561127457600080fd5b505af1158015611288573d6000803e3d6000fd5b5050603c54604080516001600160a01b039283168152602081018790528f8316818301529051918e1693507fbf8c93ffab42c7a8745e30d00eef080c6704962d26f0b42a0e9d9589b7417af1925081900360600190a250505050505050505050505050565b6112f561184f565b6001600160a01b0316336001600160a01b0316148061132c57506113176118c6565b6001600160a01b0316336001600160a01b0316145b61137d576040805162461bcd60e51b815260206004820152601b60248201527f4f6e6c7920676f7665726e616e63652063616e20657865637574650000000000604482015290519081900360640190fd5b6001600160a01b0388811660009081526040602081905290205416156113d45760405162461bcd60e51b81526004018080602001828103825260228152602001806123d56022913960400191505060405180910390fd5b6001600160a01b038816158015906113f457506001600160a01b03871615155b801561140857506001600160a01b03861615155b8015611415575060028310155b80156114215750600081115b611463576040805162461bcd60e51b815260206004820152600e60248201526d496e76616c696420696e7075747360901b604482015290519081900360640190fd5b6114a1878786868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061191592505050565b6114e9576040805162461bcd60e51b8152602060048201526014602482015273092dcecc2d8d2c840eadcd2e6eec2e040e0c2e8d60631b604482015290519081900360640190fd5b6040518060c00160405280886001600160a01b03168152602001876001600160a01b0316815260200186600f0b81526020018585808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250938552505050602080830182905260409283018690526001600160a01b03808d16835283825291839020845181549084166001600160a01b0319918216178255858301516001830180549190951691161790925591830151600282018054600f9290920b6001600160801b03166001600160801b03199092169190911790556060830151805191926115e4926003850192909101906122f2565b506080820151600482015560a0909101516005909101556001600160a01b038816600081815260416020526040808220849055517f52f63ab5789c9a266379c35974b035fb9f7079ec0effab1b31e7ad82fadb488a9190a25050505050505050565b603c546001600160a01b031681565b600054610100900460ff168061166e575061166e611e2c565b8061167c575060005460ff16155b6116b75760405162461bcd60e51b815260040180806020018281038252602e8152602001806123a7602e913960400191505060405180910390fd5b600054610100900460ff161580156116e2576000805460ff1961ff0019909116610100171660011790555b6116eb85611e32565b6001600160a01b038416611746576040805162461bcd60e51b815260206004820152601760248201527f496e76616c696420756e69737761702061646472657373000000000000000000604482015290519081900360640190fd5b603e80546001600160a01b0319166001600160a01b038681169190911790915583166117b1576040805162461bcd60e51b8152602060048201526015602482015274496e76616c6964206375727665206164647265737360581b604482015290519081900360640190fd5b603d80546001600160a01b0319166001600160a01b0385811691909117909155821661181b576040805162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d555344206164647265737360601b604482015290519081900360640190fd5b603c80546001600160a01b0319166001600160a01b0384161790558015611848576000805461ff00191690555b5050505050565b603b546040805163030d028960e21b815290516000926001600160a01b031691630c340a24916004808301926020929190829003018186803b15801561189457600080fd5b505afa1580156118a8573d6000803e3d6000fd5b505050506040513d60208110156118be57600080fd5b505190505b90565b603b54603354604080516385acd64160e01b81526004810192909252516000926001600160a01b0316916385acd641916024808301926020929190829003018186803b15801561189457600080fd5b805160009082828261192357fe5b60200260200101516001600160a01b0316856001600160a01b0316148015611972575082600182038151811061195557fe5b60200260200101516001600160a01b0316846001600160a01b0316145b95945050505050565b6000828201838110156119d5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611a38908590611eab565b50505050565b801580611ac4575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015611a9657600080fd5b505afa158015611aaa573d6000803e3d6000fd5b505050506040513d6020811015611ac057600080fd5b5051155b611aff5760405162461bcd60e51b81526004018080602001828103825260368152602001806124216036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052611b51908490611eab565b505050565b600082611b65575060006119d8565b82820282848281611b7257fe5b04146119d55760405162461bcd60e51b81526004018080602001828103825260218152602001806123866021913960400191505060405180910390fd5b60006119d583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612063565b604080516370a0823160e01b8152306004820152905160009182916001600160a01b038616916370a08231916024808301926020929190829003018186803b158015611c3c57600080fd5b505afa158015611c50573d6000803e3d6000fd5b505050506040513d6020811015611c6657600080fd5b5051603d54909150611c8c906001600160a01b038681169116600063ffffffff611a3e16565b603d54611cac906001600160a01b0386811691168363ffffffff611a3e16565b6000846001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611ce757600080fd5b505afa158015611cfb573d6000803e3d6000fd5b505050506040513d6020811015611d1157600080fd5b505160ff1690506000611d3a600a83900a610fd185670d2f13f7789f000063ffffffff611b5616565b603d5460408051635320bf6b60e11b8152600f89810b900b6004820152600060248201819052604482018890526064820185905291519394506001600160a01b039092169263a6417ed6926084808201936020939283900390910190829087803b158015611da757600080fd5b505af1158015611dbb573d6000803e3d6000fd5b505050506040513d6020811015611dd157600080fd5b50519695505050505050565b603b54603a54604080516385acd64160e01b81526004810192909252516000926001600160a01b0316916385acd641916024808301926020929190829003018186803b15801561189457600080fd5b303b1590565b6001600160a01b038116611e85576040805162461bcd60e51b81526020600482015260156024820152744e657875732061646472657373206973207a65726f60581b604482015290519081900360640190fd5b603b80546001600160a01b0319166001600160a01b038316179055611ea8612105565b50565b611ebd826001600160a01b0316612201565b611f0e576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310611f4c5780518252601f199092019160209182019101611f2d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611fae576040519150601f19603f3d011682016040523d82523d6000602084013e611fb3565b606091505b50915091508161200a576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115611a385780806020019051602081101561202657600080fd5b5051611a385760405162461bcd60e51b815260040180806020018281038252602a8152602001806123f7602a913960400191505060405180910390fd5b600081836120ef5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156120b457818101518382015260200161209c565b50505050905090810190601f1680156120e15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816120fb57fe5b0495945050505050565b6040805169476f7665726e616e636560b01b8152815190819003600a9081018220603355665374616b696e6760c81b82528251918290036007908101832060345569283937bc3ca0b236b4b760b11b835283519283900390910182206035556827b930b1b632a43ab160b91b8252825191829003600990810183206036556626b0b730b3b2b960c91b835283519283900390910182206037556f2932b1b7b63630ba32b930b634b9b2b960811b825282519182900360100182206038556826b2ba30aa37b5b2b760b91b82528251918290030181206039556d29b0bb34b733b9a6b0b730b3b2b960911b8152905190819003600e019020603a55565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061223557508115155b949350505050565b6040805160c0810182526000808252602082018190529181018290526060808201526080810182905260a081019190915290565b8280548282559060005260206000209081019282156122c4579160200282015b828111156122c45781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612291565b506122d0929150612347565b5090565b5080546000825590600052602060002090810190611ea8919061236b565b8280548282559060005260206000209081019282156122c4579160200282015b828111156122c457825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612312565b6118c391905b808211156122d05780546001600160a01b031916815560010161234d565b6118c391905b808211156122d0576000815560010161237156fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a65644c69717569646174696f6e2065786973747320666f722074686973206241737365745361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a265627a7a723158200624d163c7a512d07c456c56c55b0be633ca939b501a80384bfaa5bfaadea8b364736f6c63430005100032
Deployed Bytecode Sourcemap
23608:10142:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23608:10142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24258:44;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24258:44:0;-1:-1:-1;;;;;24258:44:0;;:::i;:::-;;;;;;;;;;;;;;;;24053:33;;;:::i;:::-;;;;-1:-1:-1;;;;;24053:33:0;;;;;;;;;;;;;;27562:1058;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;27562:1058:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;27562:1058:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;27562:1058:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;27562:1058:0;;-1:-1:-1;27562:1058:0;-1:-1:-1;27562:1058:0;;;;;;;:::i;:::-;;24019:27;;;:::i;29301:391::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29301:391:0;-1:-1:-1;;;;;29301:391:0;;:::i;24200:51::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24200:51:0;-1:-1:-1;;;;;24200:51:0;;:::i;:::-;;;;-1:-1:-1;;;;;24200:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4400:19;;;:::i;30128:3042::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30128:3042:0;-1:-1:-1;;;;;30128:3042:0;;:::i;25888:1158::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;25888:1158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;25888:1158:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;25888:1158:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;25888:1158:0;;-1:-1:-1;25888:1158:0;-1:-1:-1;25888:1158:0;;;;;;;:::i;23993:19::-;;;:::i;24600:546::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;24600:546:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;24258:44::-;;;;;;;;;;;;;:::o;24053:33::-;;;-1:-1:-1;;;;;24053:33:0;;:::o;27562:1058::-;4879:11;:9;:11::i;:::-;-1:-1:-1;;;;;4865:25:0;:10;-1:-1:-1;;;;;4865:25:0;;:56;;;;4908:13;:11;:13::i;:::-;-1:-1:-1;;;;;4894:27:0;:10;-1:-1:-1;;;;;4894:27:0;;4865:56;4843:133;;;;;-1:-1:-1;;;4843:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27842:30;;:::i;:::-;-1:-1:-1;;;;;27875:26:0;;;;;;;:12;:26;;;;;;;;27842:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27875:26;;27842:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27842:59:0;;;;;;;;;;;;;;;;-1:-1:-1;;;27842:59:0;;;-1:-1:-1;;27842:59:0;;;;;;;;;;;;;;;;;;;;;;27934:18;;;27842:59;;-1:-1:-1;;;;;;27971:23:0;;27963:62;;;;;-1:-1:-1;;;27963:62:0;;;;;;;;;;;;-1:-1:-1;;;27963:62:0;;;;;;;;;;;;;;;28059:1;28046:10;:14;28038:54;;;;;-1:-1:-1;;;28038:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28111:21:0;;28103:48;;;;;-1:-1:-1;;;28103:48:0;;;;;;;;;;;;-1:-1:-1;;;28103:48:0;;;;;;;;;;;;;;;28170:63;28188:11;:21;;;28211:7;28220:12;;28170:63;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;28170:17:0;;-1:-1:-1;;;28170:63:0:i;:::-;28162:96;;;;;-1:-1:-1;;;28162:96:0;;;;;;;;;;;;-1:-1:-1;;;28162:96:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;28271:26:0;;;;;;;:12;:26;;;;;;:33;;;:43;;-1:-1:-1;;;;;;28271:43:0;;;;;;;;;;;28325:40;;;:57;;-1:-1:-1;;;;;;28325:57:0;-1:-1:-1;;;;;28325:57:0;;;;;;;;28393:53;;:38;;28434:12;;28393:53;:::i;:::-;-1:-1:-1;;;;;;28457:26:0;;;;;;:12;:26;;;;;;;:40;;:57;;;28525:9;:23;;;;;:36;;;28579:33;;;28457:26;28579:33;4987:1;;27562:1058;;;;;;;:::o;24019:27::-;;;-1:-1:-1;;;;;24019:27:0;;:::o;29301:391::-;4879:11;:9;:11::i;:::-;-1:-1:-1;;;;;4865:25:0;:10;-1:-1:-1;;;;;4865:25:0;;:56;;;;4908:13;:11;:13::i;:::-;-1:-1:-1;;;;;4894:27:0;:10;-1:-1:-1;;;;;4894:27:0;;4865:56;4843:133;;;;;-1:-1:-1;;;4843:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29408:30;;:::i;:::-;-1:-1:-1;;;;;29441:26:0;;;;;;;:12;:26;;;;;;;;29408:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29441:26;;29408:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29408:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29516:1;-1:-1:-1;;;;;29486:32:0;:11;:18;;;-1:-1:-1;;;;;29486:32:0;;;29478:71;;;;;-1:-1:-1;;;29478:71:0;;;;;;;;;;;;-1:-1:-1;;;29478:71:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29569:26:0;;;;;;:12;:26;;;;;;29562:33;;-1:-1:-1;;;;;;29562:33:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29562:33:0;;;29569:26;29562:33;;;;29569:26;29562:33;:::i;:::-;-1:-1:-1;29562:33:0;;;;;;;;;;;;;;-1:-1:-1;;;;;29613:23:0;;;;;:9;:23;;;;;;29606:30;;;29654;29613:23;;29654:30;;;4987:1;29301:391;:::o;24200:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24200:51:0;;;;;;;;;;;;;;;;:::o;4400:19::-;;;-1:-1:-1;;;;;4400:19:0;;:::o;30128:3042::-;30279:9;30292:10;30279:23;30271:47;;;;;-1:-1:-1;;;30271:47:0;;;;;;;;;;;;-1:-1:-1;;;30271:47:0;;;;;;;;;;;;;;;30331:30;;:::i;:::-;-1:-1:-1;;;;;30364:26:0;;;;;;;:12;:26;;;;;;;;30331:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30364:26;;30331:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30331:59:0;;;;;;;;;;;;;;;;-1:-1:-1;;;30331:59:0;;;-1:-1:-1;;30331:59:0;;;;;;;;;;;;;;;;;;;;;;30420:18;;;30331:59;;-1:-1:-1;;;;;;30457:20:0;;30449:59;;;;;-1:-1:-1;;;30449:59:0;;;;;;;;;;;;-1:-1:-1;;;30449:59:0;;;;;;;;;;;;;;;30547:25;;;;:37;;30577:6;30547:37;:29;:37;:::i;:::-;30529:15;:55;30521:90;;;;;-1:-1:-1;;;30521:90:0;;;;;;;;;;;;-1:-1:-1;;;30521:90:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30622:26:0;;;;;;;:12;:26;;;;;;;30665:15;30622:40;;;;:58;30741:21;;30773:28;30804:23;;;30985:41;;-1:-1:-1;;;30985:41:0;;;;;;;;;;;30741:21;;30985:27;;;;;:41;;;;;30622:26;;30985:41;;;;;;:27;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;30985:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30985:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30985:41:0;;-1:-1:-1;31041:18:0;;31037:130;;31076:79;-1:-1:-1;;;;;31076:34:0;;31111:12;31133:4;31140:14;31076:79;:34;:79;:::i;:::-;31321:42;;;-1:-1:-1;;;31321:42:0;;31357:4;31321:42;;;;;;31298:20;;-1:-1:-1;;;;;31321:27:0;;;;;:42;;;;;;;;;;;;;;;:27;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;31321:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31321:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31321:42:0;;-1:-1:-1;31382:16:0;31374:56;;;;;-1:-1:-1;;;31374:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31477:1;31449:11;:25;;;:29;31441:69;;;;;-1:-1:-1;;;31441:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31591:7;;31612:25;;;;31591:60;;;-1:-1:-1;;;31591:60:0;;;;;;;;;;;;;;;;;;;;;;31565:23;;-1:-1:-1;;;;;31591:7:0;;:20;;31612:25;;31639:11;;31591:60;;;;;;;;;;;;;;;:7;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;31591:60:0;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31591:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31591:60:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;31591:60:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;31591:60:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;31591:60:0;;421:4:-1;412:14;;;;31591:60:0;;;;;412:14:-1;31591:60:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;31591:60:0;;;;;;;;;;;31565:86;;31662:18;31683:9;31693:1;31683:12;;;;;;;;;;;;;;31662:33;;31727:10;31712:12;:25;31708:83;;;-1:-1:-1;31767:12:0;31708:83;31920:7;;31882:50;;-1:-1:-1;;;;;31882:29:0;;;;31920:7;;31882:50;:29;:50;:::i;:::-;31981:7;;31943:59;;-1:-1:-1;;;;;31943:29:0;;;;31981:7;31991:10;31943:59;:29;:59;:::i;:::-;32326:20;32361:9;-1:-1:-1;;;;;32349:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32349:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32349:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32349:33:0;-1:-1:-1;;;;;32425:23:0;;32393:14;32425:23;;;:9;32349:33;32425:23;;;;;32326:56;;;;;-1:-1:-1;32393:14:0;32410:63;;32454:2;:18;;;;32410:39;;:10;;:39;:14;:39;:::i;:::-;:43;:63;:43;:63;:::i;:::-;32393:80;;32501:1;32492:6;:10;32484:49;;;;;-1:-1:-1;;;32484:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;32544:7;;-1:-1:-1;;;;;32544:7:0;:32;32591:10;32616:6;32637:11;32671:4;32691:25;:15;32711:4;32691:25;:19;:25;:::i;:::-;32544:183;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32544:183:0;-1:-1:-1;;;;;32544:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;32544:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32544:183:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32544:183:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;32544:183:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;32544:183:0;;;;;;;;;;;;;-1:-1:-1;;;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;-1:-1;;;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;32544:183:0;;421:4:-1;412:14;;;;32544:183:0;;;;;412:14:-1;32544:183:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;32544:183:0;;;;;;;;;;;;32772:17;32792:45;32803:6;32811:11;:25;;;32792:10;:45::i;:::-;32772:65;;32890:15;32908:17;:15;:17::i;:::-;32943:4;;32890:35;;-1:-1:-1;32936:36:0;;-1:-1:-1;;;;;32943:4:0;32890:35;32970:1;32936:36;:24;:36;:::i;:::-;32990:4;;32983:44;;-1:-1:-1;;;;;32990:4:0;33008:7;33017:9;32983:44;:24;:44;:::i;:::-;33082:4;;33038:60;;;-1:-1:-1;;;33038:60:0;;-1:-1:-1;;;;;33082:4:0;;;33038:60;;;;;;;;;;;;:43;;;;;;:60;;;;;33082:4;;33038:60;;;;;;;;33082:4;33038:43;:60;;;5:2:-1;;;;30:1;27;20:12;5:2;33038:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;33138:4:0;;33116:46;;;-1:-1:-1;;;;;33138:4:0;;;33116:46;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33116:46:0;;-1:-1:-1;33116:46:0;;;;;;;30128:3042;;;;;;;;;;;;;:::o;25888:1158::-;4879:11;:9;:11::i;:::-;-1:-1:-1;;;;;4865:25:0;:10;-1:-1:-1;;;;;4865:25:0;;:56;;;;4908:13;:11;:13::i;:::-;-1:-1:-1;;;;;4894:27:0;:10;-1:-1:-1;;;;;4894:27:0;;4865:56;4843:133;;;;;-1:-1:-1;;;4843:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26210:26:0;;;26258:1;26210:26;;;:12;:26;;;;;;:36;;:50;26202:97;;;;-1:-1:-1;;;26202:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26334:26:0;;;;;;:67;;-1:-1:-1;;;;;;26377:24:0;;;;26334:67;:105;;;;-1:-1:-1;;;;;;26418:21:0;;;;26334:105;:146;;;;-1:-1:-1;26479:1:0;26456:24;;;26334:146;:177;;;;;26510:1;26497:10;:14;26334:177;26312:241;;;;;-1:-1:-1;;;26312:241:0;;;;;;;;;;;;-1:-1:-1;;;26312:241:0;;;;;;;;;;;;;;;26572:52;26590:10;26602:7;26611:12;;26572:52;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;26572:17:0;;-1:-1:-1;;;26572:52:0:i;:::-;26564:85;;;;;-1:-1:-1;;;26564:85:0;;;;;;;;;;;;-1:-1:-1;;;26564:85:0;;;;;;;;;;;;;;;26691:249;;;;;;;;26729:10;-1:-1:-1;;;;;26691:249:0;;;;;26762:7;-1:-1:-1;;;;;26691:249:0;;;;;26799:14;26691:249;;;;;;26841:12;;26691:249;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;-1:-1;26691:249:0;;;-1:-1:-1;;;26691:249:0;;;;;;;;;;;;;;-1:-1:-1;;;;;26662:26:0;;;;;;;;;;;;:278;;;;;;;-1:-1:-1;;;;;;26662:278:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26662:278:0;-1:-1:-1;;;;;;26662:278:0;;;;;;;;;;;;;;;:26;;:278;;;;;;;;;;;:::i;:::-;-1:-1:-1;26662:278:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26951:23:0;;-1:-1:-1;26951:23:0;;;:9;:23;;;;;;:36;;;27005:33;;;-1:-1:-1;27005:33:0;25888:1158;;;;;;;;:::o;23993:19::-;;;-1:-1:-1;;;;;23993:19:0;;:::o;24600:546::-;1372:12;;;;;;;;:31;;;1388:15;:13;:15::i;:::-;1372:47;;;-1:-1:-1;1408:11:0;;;;1407:12;1372:47;1364:106;;;;-1:-1:-1;;;1364:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1479:19;1502:12;;;;;;1501:13;1521:83;;;;1550:12;:19;;-1:-1:-1;;;;1550:19:0;;;;;1578:18;1565:4;1578:18;;;1521:83;24783:39;24815:6;24783:31;:39::i;:::-;-1:-1:-1;;;;;24843:22:0;;24835:58;;;;;-1:-1:-1;;;24835:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;24904:7;:38;;-1:-1:-1;;;;;;24904:38:0;-1:-1:-1;;;;;24904:38:0;;;;;;;;;;24963:20;;24955:54;;;;;-1:-1:-1;;;24955:54:0;;;;;;;;;;;;-1:-1:-1;;;24955:54:0;;;;;;;;;;;;;;;25020:5;:30;;-1:-1:-1;;;;;;25020:30:0;-1:-1:-1;;;;;25020:30:0;;;;;;;;;;25071:19;;25063:52;;;;;-1:-1:-1;;;25063:52:0;;;;;;;;;;;;-1:-1:-1;;;25063:52:0;;;;;;;;;;;;;;;25126:4;:12;;-1:-1:-1;;;;;;25126:12:0;-1:-1:-1;;;;;25126:12:0;;;;;1622:57;;;;1666:5;1651:20;;-1:-1:-1;;1651:20:0;;;1622:57;24600:546;;;;;:::o;5915:95::-;5986:5;;:16;;;-1:-1:-1;;;5986:16:0;;;;5959:7;;-1:-1:-1;;;;;5986:5:0;;:14;;:16;;;;;;;;;;;;;;:5;:16;;;5:2:-1;;;;30:1;27;20:12;5:2;5986:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5986:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5986:16:0;;-1:-1:-1;5915:95:0;;:::o;6150:112::-;6223:5;;6239:14;;6223:31;;;-1:-1:-1;;;6223:31:0;;;;;;;;;;6196:7;;-1:-1:-1;;;;;6223:5:0;;:15;;:31;;;;;;;;;;;;;;:5;:31;;;5:2:-1;;;;30:1;27;20:12;28954:289:0;29135:19;;29099:4;;29135:12;29099:4;29186:15;;;;;;;;;;;-1:-1:-1;;;;;29172:29:0;:10;-1:-1:-1;;;;;29172:29:0;;:63;;;;;29216:12;29233:1;29229:3;:5;29216:19;;;;;;;;;;;;;;-1:-1:-1;;;;;29205:30:0;:7;-1:-1:-1;;;;;29205:30:0;;29172:63;29165:70;28954:289;-1:-1:-1;;;;;28954:289:0:o;9132:181::-;9190:7;9222:5;;;9246:6;;;;9238:46;;;;;-1:-1:-1;;;9238:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9304:1;-1:-1:-1;9132:181:0;;;;;:::o;20378:204::-;20505:68;;;-1:-1:-1;;;;;20505:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;20505:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;20479:95:0;;20498:5;;20479:18;:95::i;:::-;20378:204;;;;:::o;20590:621::-;20960:10;;;20959:62;;-1:-1:-1;20976:39:0;;;-1:-1:-1;;;20976:39:0;;21000:4;20976:39;;;;-1:-1:-1;;;;;20976:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;20976:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20976:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20976:39:0;:44;20959:62;20951:152;;;;-1:-1:-1;;;20951:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21140:62;;;-1:-1:-1;;;;;21140:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;21140:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;21114:89:0;;21133:5;;21114:18;:89::i;:::-;20590:621;;;:::o;10504:471::-;10562:7;10807:6;10803:47;;-1:-1:-1;10837:1:0;10830:8;;10803:47;10874:5;;;10878:1;10874;:5;:1;10898:5;;;;;:10;10890:56;;;;-1:-1:-1;;;10890:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11443:132;11501:7;11528:39;11532:1;11535;11528:39;;;;;;;;;;;;;;;;;:3;:39::i;33178:569::-;33306:40;;;-1:-1:-1;;;33306:40:0;;33340:4;33306:40;;;;;;33256:17;;;;-1:-1:-1;;;;;33306:25:0;;;;;:40;;;;;;;;;;;;;;:25;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;33306:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33306:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33306:40:0;33395:5;;33306:40;;-1:-1:-1;33359:46:0;;-1:-1:-1;;;;;33359:27:0;;;;33395:5;;33359:46;:27;:46;:::i;:::-;33452:5;;33416:54;;-1:-1:-1;;;;;33416:27:0;;;;33452:5;33460:9;33416:54;:27;:54;:::i;:::-;33481:17;33513:7;-1:-1:-1;;;;;33501:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33501:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33501:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33501:31:0;33481:51;;;-1:-1:-1;33589:17:0;33609:41;33634:2;:15;;;33609:20;:9;33623:5;33609:20;:13;:20;:::i;:41::-;33673:5;;:66;;;-1:-1:-1;;;33673:66:0;;;;;;;;;;;;:5;:66;;;;;;;;;;;;;;;;;;;;33589:61;;-1:-1:-1;;;;;;33673:5:0;;;;:25;;:66;;;;;;;;;;;;;;;;;:5;:66;;;5:2:-1;;;;30:1;27;20:12;5:2;33673:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33673:66:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33673:66:0;;33178:569;-1:-1:-1;;;;;;33178:569:0:o;7671:121::-;7748:5;;7764:19;;7748:36;;;-1:-1:-1;;;7748:36:0;;;;;;;;;;7721:7;;-1:-1:-1;;;;;7748:5:0;;:15;;:36;;;;;;;;;;;;;;:5;:36;;;5:2:-1;;;;30:1;27;20:12;1773:508:0;2190:4;2236:17;2268:7;1773:508;:::o;5591:200::-;-1:-1:-1;;;;;5656:20:0;;5648:54;;;;;-1:-1:-1;;;5648:54:0;;;;;;;;;;;;-1:-1:-1;;;5648:54:0;;;;;;;;;;;;;;;5713:5;:22;;-1:-1:-1;;;;;;5713:22:0;-1:-1:-1;;;;;5713:22:0;;;;;5746:37;:35;:37::i;:::-;5591:200;:::o;22233:1114::-;22837:27;22845:5;-1:-1:-1;;;;;22837:25:0;;:27::i;:::-;22829:71;;;;;-1:-1:-1;;;22829:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22974:12;22988:23;23023:5;-1:-1:-1;;;;;23015:19:0;23035:4;23015:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;23015:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;22973:67:0;;;;23059:7;23051:52;;;;;-1:-1:-1;;;23051:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23120:17;;:21;23116:224;;23262:10;23251:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23251:30:0;23243:85;;;;-1:-1:-1;;;23243:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12105:345;12191:7;12293:12;12286:5;12278:28;;;;-1:-1:-1;;;12278:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;12278:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12317:9;12333:1;12329;:5;;;;;;;12105:345;-1:-1:-1;;;;;12105:345:0:o;3131:623::-;3356:23;;;-1:-1:-1;;;3356:23:0;;;;;;;;;;;;;;3339:14;:40;-1:-1:-1;;;3404:20:0;;;;;;;;;;;;;;3390:11;:34;-1:-1:-1;;;3453:23:0;;;;;;;;;;;;;3435:15;:41;-1:-1:-1;;;3506:22:0;;;;;;;;;;;;;;3489:14;:39;-1:-1:-1;;;3553:20:0;;;;;;;;;;;;;3539:11;:34;-1:-1:-1;;;3607:29:0;;;;;;;;;;;;3584:20;:52;-1:-1:-1;;;3664:22:0;;;;;;;;;;;3647:14;:39;-1:-1:-1;;;3719:27:0;;;;;;;;;;;;3697:19;:49;3131:623::o;17784:619::-;17844:4;18312:20;;18155:66;18352:23;;;;;;:42;;-1:-1:-1;18379:15:0;;;18352:42;18344:51;17784:619;-1:-1:-1;;;;17784:619:0:o;23608:10142::-;;;;;;;;;-1:-1:-1;23608:10142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23608:10142:0;-1:-1:-1;;;;;23608:10142:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;23608:10142:0;;;-1:-1:-1;23608:10142:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23608:10142:0;-1:-1:-1;;;;;23608:10142:0;;;;;;;;;;;-1:-1:-1;23608:10142:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;23608:10142:0;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://0624d163c7a512d07c456c56c55b0be633ca939b501a80384bfaa5bfaadea8b3
Loading...
Loading
Loading...
Loading
OVERVIEW
Logic contract for mStable LiquidatorNet Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.