Contract of DeFi Saver's MCD Monitor V2. Submitted by Kleros Curate.
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 14,637 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Boost For | 12919036 | 1686 days ago | IN | 0 ETH | 0.02507151 | ||||
| Boost For | 12918257 | 1686 days ago | IN | 0 ETH | 0.01818577 | ||||
| Boost For | 12917863 | 1687 days ago | IN | 0 ETH | 0.03319497 | ||||
| Repay For | 12916151 | 1687 days ago | IN | 0 ETH | 0.05160583 | ||||
| Repay For | 12916151 | 1687 days ago | IN | 0 ETH | 0.056317 | ||||
| Repay For | 12916149 | 1687 days ago | IN | 0 ETH | 0.05059595 | ||||
| Boost For | 12915688 | 1687 days ago | IN | 0 ETH | 0.09752895 | ||||
| Boost For | 12915673 | 1687 days ago | IN | 0 ETH | 0.07143459 | ||||
| Repay For | 12915379 | 1687 days ago | IN | 0 ETH | 0.0396846 | ||||
| Repay For | 12915018 | 1687 days ago | IN | 0 ETH | 0.02687898 | ||||
| Repay For | 12914697 | 1687 days ago | IN | 0 ETH | 0.0241284 | ||||
| Repay For | 12914696 | 1687 days ago | IN | 0 ETH | 0.02183055 | ||||
| Boost For | 12914678 | 1687 days ago | IN | 0 ETH | 0.02799928 | ||||
| Boost For | 12914637 | 1687 days ago | IN | 0 ETH | 0.02701463 | ||||
| Boost For | 12914602 | 1687 days ago | IN | 0 ETH | 0.04004511 | ||||
| Boost For | 12914602 | 1687 days ago | IN | 0 ETH | 0.0391758 | ||||
| Boost For | 12914221 | 1687 days ago | IN | 0 ETH | 0.03405799 | ||||
| Boost For | 12912515 | 1687 days ago | IN | 0 ETH | 0.01959952 | ||||
| Boost For | 12912375 | 1687 days ago | IN | 0 ETH | 0.0492784 | ||||
| Boost For | 12912356 | 1687 days ago | IN | 0 ETH | 0.06802026 | ||||
| Repay For | 12912271 | 1687 days ago | IN | 0 ETH | 0.0206902 | ||||
| Boost For | 12912232 | 1687 days ago | IN | 0 ETH | 0.02056886 | ||||
| Boost For | 12912232 | 1687 days ago | IN | 0 ETH | 0.02627076 | ||||
| Boost For | 12912231 | 1687 days ago | IN | 0 ETH | 0.0235712 | ||||
| Boost For | 12911946 | 1687 days ago | IN | 0 ETH | 0.0223894 |
Latest 16 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 12873432 | 1693 days ago | 0.004144 ETH | ||||
| - | 12377246 | 1771 days ago | 0.006384 ETH | ||||
| - | 12371142 | 1772 days ago | 0.005936 ETH | ||||
| - | 12363803 | 1773 days ago | 0.01904 ETH | ||||
| - | 12358419 | 1773 days ago | 0.003472 ETH | ||||
| - | 12358417 | 1773 days ago | 0.003472 ETH | ||||
| - | 12350567 | 1775 days ago | 0.00504 ETH | ||||
| - | 12350529 | 1775 days ago | 0.005264 ETH | ||||
| - | 12266355 | 1788 days ago | 0.01456 ETH | ||||
| - | 12149498 | 1806 days ago | 0.082656 ETH | ||||
| - | 12149495 | 1806 days ago | 0.076608 ETH | ||||
| - | 12063962 | 1819 days ago | 0.027664 ETH | ||||
| - | 12063936 | 1819 days ago | 0.028112 ETH | ||||
| - | 12063911 | 1819 days ago | 0.028896 ETH | ||||
| - | 12060380 | 1819 days ago | 0.017696 ETH | ||||
| - | 12060380 | 1819 days ago | 0.018032 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
MCDMonitorV2
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-02-25
*/
pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;
abstract contract Manager {
function last(address) virtual public returns (uint);
function cdpCan(address, uint, address) virtual public view returns (uint);
function ilks(uint) virtual public view returns (bytes32);
function owns(uint) virtual public view returns (address);
function urns(uint) virtual public view returns (address);
function vat() virtual public view returns (address);
function open(bytes32, address) virtual public returns (uint);
function give(uint, address) virtual public;
function cdpAllow(uint, address, uint) virtual public;
function urnAllow(address, uint) virtual public;
function frob(uint, int, int) virtual public;
function flux(uint, address, uint) virtual public;
function move(uint, address, uint) virtual public;
function exit(address, uint, address, uint) virtual public;
function quit(uint, address) virtual public;
function enter(address, uint) virtual public;
function shift(uint, uint) virtual public;
} abstract contract Vat {
struct Urn {
uint256 ink; // Locked Collateral [wad]
uint256 art; // Normalised Debt [wad]
}
struct Ilk {
uint256 Art; // Total Normalised Debt [wad]
uint256 rate; // Accumulated Rates [ray]
uint256 spot; // Price with Safety Margin [ray]
uint256 line; // Debt Ceiling [rad]
uint256 dust; // Urn Debt Floor [rad]
}
mapping (bytes32 => mapping (address => Urn )) public urns;
mapping (bytes32 => Ilk) public ilks;
mapping (bytes32 => mapping (address => uint)) public gem; // [wad]
function can(address, address) virtual public view returns (uint);
function dai(address) virtual public view returns (uint);
function frob(bytes32, address, address, address, int, int) virtual public;
function hope(address) virtual public;
function move(address, address, uint) virtual public;
function fork(bytes32, address, address, int, int) virtual public;
} abstract contract PipInterface {
function read() public virtual returns (bytes32);
} abstract contract Spotter {
struct Ilk {
PipInterface pip;
uint256 mat;
}
mapping (bytes32 => Ilk) public ilks;
uint256 public par;
} contract DSMath {
function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
require((z = x + y) >= x);
}
function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
require((z = x - y) <= x);
}
function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
require(y == 0 || (z = x * y) / y == x);
}
function div(uint256 x, uint256 y) internal pure returns (uint256 z) {
return x / y;
}
function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
return x <= y ? x : y;
}
function max(uint256 x, uint256 y) internal pure returns (uint256 z) {
return x >= y ? x : y;
}
function imin(int256 x, int256 y) internal pure returns (int256 z) {
return x <= y ? x : y;
}
function imax(int256 x, int256 y) internal pure returns (int256 z) {
return x >= y ? x : y;
}
uint256 constant WAD = 10**18;
uint256 constant RAY = 10**27;
function wmul(uint256 x, uint256 y) internal pure returns (uint256 z) {
z = add(mul(x, y), WAD / 2) / WAD;
}
function rmul(uint256 x, uint256 y) internal pure returns (uint256 z) {
z = add(mul(x, y), RAY / 2) / RAY;
}
function wdiv(uint256 x, uint256 y) internal pure returns (uint256 z) {
z = add(mul(x, WAD), y / 2) / y;
}
function rdiv(uint256 x, uint256 y) internal pure returns (uint256 z) {
z = add(mul(x, RAY), y / 2) / y;
}
// This famous algorithm is called "exponentiation by squaring"
// and calculates x^n with x as fixed-point and n as regular unsigned.
//
// It's O(log n), instead of O(n) for naive repeated multiplication.
//
// These facts are why it works:
//
// If n is even, then x^n = (x^2)^(n/2).
// If n is odd, then x^n = x * x^(n-1),
// and applying the equation for even x gives
// x^n = x * (x^2)^((n-1) / 2).
//
// Also, EVM division is flooring and
// floor[(n-1) / 2] = floor[n / 2].
//
function rpow(uint256 x, uint256 n) internal pure returns (uint256 z) {
z = n % 2 != 0 ? x : RAY;
for (n /= 2; n != 0; n /= 2) {
x = rmul(x, x);
if (n % 2 != 0) {
z = rmul(z, x);
}
}
}
} interface ERC20 {
function totalSupply() external view returns (uint256 supply);
function balanceOf(address _owner) external view returns (uint256 balance);
function transfer(address _to, uint256 _value) external returns (bool success);
function transferFrom(address _from, address _to, uint256 _value)
external
returns (bool success);
function approve(address _spender, uint256 _value) external returns (bool success);
function allowance(address _owner, address _spender) external view returns (uint256 remaining);
function decimals() external view returns (uint256 digits);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
} library Address {
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);
}
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");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return _functionCallWithValue(target, data, 0, errorMessage);
}
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");
}
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");
return _functionCallWithValue(target, data, value, errorMessage);
}
function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
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);
}
}
}
} library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
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;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
} library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(ERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(ERC20 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.
*/
function safeApprove(ERC20 token, address spender, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(ERC20 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(ERC20 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));
}
function _callOptionalReturn(ERC20 token, bytes memory data) private {
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");
}
}
} contract AdminAuth {
using SafeERC20 for ERC20;
address public owner;
address public admin;
modifier onlyOwner() {
require(owner == msg.sender);
_;
}
modifier onlyAdmin() {
require(admin == msg.sender);
_;
}
constructor() public {
owner = msg.sender;
admin = 0x25eFA336886C74eA8E282ac466BdCd0199f85BB9;
}
/// @notice Admin is set by owner first time, after that admin is super role and has permission to change owner
/// @param _admin Address of multisig that becomes admin
function setAdminByOwner(address _admin) public {
require(msg.sender == owner);
require(admin == address(0));
admin = _admin;
}
/// @notice Admin is able to set new admin
/// @param _admin Address of multisig that becomes new admin
function setAdminByAdmin(address _admin) public {
require(msg.sender == admin);
admin = _admin;
}
/// @notice Admin is able to change owner
/// @param _owner Address of new owner
function setOwnerByAdmin(address _owner) public {
require(msg.sender == admin);
owner = _owner;
}
/// @notice Destroy the contract
function kill() public onlyOwner {
selfdestruct(payable(owner));
}
/// @notice withdraw stuck funds
function withdrawStuckFunds(address _token, uint _amount) public onlyOwner {
if (_token == 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) {
payable(owner).transfer(_amount);
} else {
ERC20(_token).safeTransfer(owner, _amount);
}
}
} contract DefisaverLogger {
event LogEvent(
address indexed contractAddress,
address indexed caller,
string indexed logName,
bytes data
);
// solhint-disable-next-line func-name-mixedcase
function Log(address _contract, address _caller, string memory _logName, bytes memory _data)
public
{
emit LogEvent(_contract, _caller, _logName, _data);
}
} abstract contract GasTokenInterface is ERC20 {
function free(uint256 value) public virtual returns (bool success);
function freeUpTo(uint256 value) public virtual returns (uint256 freed);
function freeFrom(address from, uint256 value) public virtual returns (bool success);
function freeFromUpTo(address from, uint256 value) public virtual returns (uint256 freed);
} contract GasBurner {
// solhint-disable-next-line const-name-snakecase
GasTokenInterface public constant gasToken = GasTokenInterface(0x0000000000b3F879cb30FE243b4Dfee438691c04);
modifier burnGas(uint _amount) {
if (gasToken.balanceOf(address(this)) >= _amount) {
gasToken.free(_amount);
}
_;
}
} contract BotRegistry is AdminAuth {
mapping (address => bool) public botList;
constructor() public {
botList[0x776B4a13093e30B05781F97F6A4565B6aa8BE330] = true;
botList[0xAED662abcC4FA3314985E67Ea993CAD064a7F5cF] = true;
botList[0xa5d330F6619d6bF892A5B87D80272e1607b3e34D] = true;
botList[0x5feB4DeE5150B589a7f567EA7CADa2759794A90A] = true;
botList[0x7ca06417c1d6f480d3bB195B80692F95A6B66158] = true;
}
function setBot(address _botAddr, bool _state) public onlyOwner {
botList[_botAddr] = _state;
}
}
contract DFSExchangeData {
// first is empty to keep the legacy order in place
enum ExchangeType { _, OASIS, KYBER, UNISWAP, ZEROX }
enum ActionType { SELL, BUY }
struct OffchainData {
address wrapper;
address exchangeAddr;
address allowanceTarget;
uint256 price;
uint256 protocolFee;
bytes callData;
}
struct ExchangeData {
address srcAddr;
address destAddr;
uint256 srcAmount;
uint256 destAmount;
uint256 minPrice;
uint256 dfsFeeDivider; // service fee divider
address user; // user to check special fee
address wrapper;
bytes wrapperData;
OffchainData offchainData;
}
function packExchangeData(ExchangeData memory _exData) public pure returns(bytes memory) {
return abi.encode(_exData);
}
function unpackExchangeData(bytes memory _data) public pure returns(ExchangeData memory _exData) {
_exData = abi.decode(_data, (ExchangeData));
}
} /// @title Implements enum Method
abstract contract StaticV2 {
enum Method { Boost, Repay }
struct CdpHolder {
uint128 minRatio;
uint128 maxRatio;
uint128 optimalRatioBoost;
uint128 optimalRatioRepay;
address owner;
uint cdpId;
bool boostEnabled;
bool nextPriceEnabled;
}
struct SubPosition {
uint arrPos;
bool subscribed;
}
}
abstract contract ISubscriptionsV2 is StaticV2 {
function getOwner(uint _cdpId) external view virtual returns(address);
function getSubscribedInfo(uint _cdpId) public view virtual returns(bool, uint128, uint128, uint128, uint128, address, uint coll, uint debt);
function getCdpHolder(uint _cdpId) public view virtual returns (bool subscribed, CdpHolder memory);
} abstract contract DSProxyInterface {
/// Truffle wont compile if this isn't commented
// function execute(bytes memory _code, bytes memory _data)
// public virtual
// payable
// returns (address, bytes32);
function execute(address _target, bytes memory _data) public virtual payable returns (bytes32);
function setCache(address _cacheAddr) public virtual payable returns (bool);
function owner() public virtual returns (address);
} /// @title Implements logic for calling MCDSaverProxy always from same contract
contract MCDMonitorProxyV2 is AdminAuth {
uint public CHANGE_PERIOD;
uint public MIN_CHANGE_PERIOD = 6 * 1 hours;
address public monitor;
address public newMonitor;
address public lastMonitor;
uint public changeRequestedTimestamp;
event MonitorChangeInitiated(address oldMonitor, address newMonitor);
event MonitorChangeCanceled();
event MonitorChangeFinished(address monitor);
event MonitorChangeReverted(address monitor);
modifier onlyMonitor() {
require (msg.sender == monitor);
_;
}
constructor(uint _changePeriod) public {
CHANGE_PERIOD = _changePeriod * 1 hours;
}
/// @notice Only monitor contract is able to call execute on users proxy
/// @param _owner Address of cdp owner (users DSProxy address)
/// @param _saverProxy Address of MCDSaverProxy
/// @param _data Data to send to MCDSaverProxy
function callExecute(address _owner, address _saverProxy, bytes memory _data) public payable onlyMonitor {
// execute reverts if calling specific method fails
DSProxyInterface(_owner).execute{value: msg.value}(_saverProxy, _data);
// return if anything left
if (address(this).balance > 0) {
msg.sender.transfer(address(this).balance);
}
}
/// @notice Allowed users are able to set Monitor contract without any waiting period first time
/// @param _monitor Address of Monitor contract
function setMonitor(address _monitor) public onlyOwner {
require(monitor == address(0));
monitor = _monitor;
}
/// @notice Allowed users are able to start procedure for changing monitor
/// @dev after CHANGE_PERIOD needs to call confirmNewMonitor to actually make a change
/// @param _newMonitor address of new monitor
function changeMonitor(address _newMonitor) public onlyOwner {
require(changeRequestedTimestamp == 0);
changeRequestedTimestamp = now;
lastMonitor = monitor;
newMonitor = _newMonitor;
emit MonitorChangeInitiated(lastMonitor, newMonitor);
}
/// @notice At any point allowed users are able to cancel monitor change
function cancelMonitorChange() public onlyOwner {
require(changeRequestedTimestamp > 0);
changeRequestedTimestamp = 0;
newMonitor = address(0);
emit MonitorChangeCanceled();
}
/// @notice Anyone is able to confirm new monitor after CHANGE_PERIOD if process is started
function confirmNewMonitor() public onlyOwner {
require((changeRequestedTimestamp + CHANGE_PERIOD) < now);
require(changeRequestedTimestamp != 0);
require(newMonitor != address(0));
monitor = newMonitor;
newMonitor = address(0);
changeRequestedTimestamp = 0;
emit MonitorChangeFinished(monitor);
}
/// @notice Its possible to revert monitor to last used monitor
function revertMonitor() public onlyOwner {
require(lastMonitor != address(0));
monitor = lastMonitor;
emit MonitorChangeReverted(monitor);
}
function setChangePeriod(uint _periodInHours) public onlyOwner {
require(_periodInHours * 1 hours > MIN_CHANGE_PERIOD);
CHANGE_PERIOD = _periodInHours * 1 hours;
}
}
/// @title Implements logic that allows bots to call Boost and Repay
contract MCDMonitorV2 is DSMath, AdminAuth, GasBurner, StaticV2 {
uint public REPAY_GAS_TOKEN = 25;
uint public BOOST_GAS_TOKEN = 25;
uint public MAX_GAS_PRICE = 800000000000; // 800 gwei
uint public REPAY_GAS_COST = 1000000;
uint public BOOST_GAS_COST = 1000000;
bytes4 public REPAY_SELECTOR = 0xf360ce20;
bytes4 public BOOST_SELECTOR = 0x8ec2ae25;
MCDMonitorProxyV2 public monitorProxyContract;
ISubscriptionsV2 public subscriptionsContract;
address public mcdSaverTakerAddress;
address public constant BOT_REGISTRY_ADDRESS = 0x637726f8b08a7ABE3aE3aCaB01A80E2d8ddeF77B;
address public constant PROXY_PERMISSION_ADDR = 0x5a4f877CA808Cca3cB7c2A194F80Ab8588FAE26B;
Manager public manager = Manager(0x5ef30b9986345249bc32d8928B7ee64DE9435E39);
Vat public vat = Vat(0x35D1b3F3D7966A1DFe207aa4514C12a259A0492B);
Spotter public spotter = Spotter(0x65C79fcB50Ca1594B025960e539eD7A9a6D434A3);
DefisaverLogger public constant logger = DefisaverLogger(0x5c55B921f590a89C1Ebe84dF170E655a82b62126);
modifier onlyApproved() {
require(BotRegistry(BOT_REGISTRY_ADDRESS).botList(msg.sender), "Not auth bot");
_;
}
constructor(address _monitorProxy, address _subscriptions, address _mcdSaverTakerAddress) public {
monitorProxyContract = MCDMonitorProxyV2(_monitorProxy);
subscriptionsContract = ISubscriptionsV2(_subscriptions);
mcdSaverTakerAddress = _mcdSaverTakerAddress;
}
/// @notice Bots call this method to repay for user when conditions are met
/// @dev If the contract ownes gas token it will try and use it for gas price reduction
function repayFor(
DFSExchangeData.ExchangeData memory _exchangeData,
uint _cdpId,
uint _nextPrice,
address _joinAddr
) public payable onlyApproved burnGas(REPAY_GAS_TOKEN) {
(bool isAllowed, uint ratioBefore) = canCall(Method.Repay, _cdpId, _nextPrice);
require(isAllowed);
uint gasCost = calcGasCost(REPAY_GAS_COST);
address owner = subscriptionsContract.getOwner(_cdpId);
monitorProxyContract.callExecute{value: msg.value}(
owner,
mcdSaverTakerAddress,
abi.encodeWithSelector(REPAY_SELECTOR, _exchangeData, _cdpId, gasCost, _joinAddr, 0));
(bool isGoodRatio, uint ratioAfter) = ratioGoodAfter(Method.Repay, _cdpId, _nextPrice);
require(isGoodRatio);
returnEth();
logger.Log(address(this), owner, "AutomaticMCDRepay", abi.encode(ratioBefore, ratioAfter));
}
/// @notice Bots call this method to boost for user when conditions are met
/// @dev If the contract ownes gas token it will try and use it for gas price reduction
function boostFor(
DFSExchangeData.ExchangeData memory _exchangeData,
uint _cdpId,
uint _nextPrice,
address _joinAddr
) public payable onlyApproved burnGas(BOOST_GAS_TOKEN) {
(bool isAllowed, uint ratioBefore) = canCall(Method.Boost, _cdpId, _nextPrice);
require(isAllowed);
uint gasCost = calcGasCost(BOOST_GAS_COST);
address owner = subscriptionsContract.getOwner(_cdpId);
monitorProxyContract.callExecute{value: msg.value}(
owner,
mcdSaverTakerAddress,
abi.encodeWithSelector(BOOST_SELECTOR, _exchangeData, _cdpId, gasCost, _joinAddr, 0));
(bool isGoodRatio, uint ratioAfter) = ratioGoodAfter(Method.Boost, _cdpId, _nextPrice);
require(isGoodRatio);
returnEth();
logger.Log(address(this), owner, "AutomaticMCDBoost", abi.encode(ratioBefore, ratioAfter));
}
/******************* INTERNAL METHODS ********************************/
function returnEth() internal {
// return if some eth left
if (address(this).balance > 0) {
msg.sender.transfer(address(this).balance);
}
}
/******************* STATIC METHODS ********************************/
/// @notice Returns an address that owns the CDP
/// @param _cdpId Id of the CDP
function getOwner(uint _cdpId) public view returns(address) {
return manager.owns(_cdpId);
}
/// @notice Gets CDP info (collateral, debt)
/// @param _cdpId Id of the CDP
/// @param _ilk Ilk of the CDP
function getCdpInfo(uint _cdpId, bytes32 _ilk) public view returns (uint, uint) {
address urn = manager.urns(_cdpId);
(uint collateral, uint debt) = vat.urns(_ilk, urn);
(,uint rate,,,) = vat.ilks(_ilk);
return (collateral, rmul(debt, rate));
}
/// @notice Gets a price of the asset
/// @param _ilk Ilk of the CDP
function getPrice(bytes32 _ilk) public view returns (uint) {
(, uint mat) = spotter.ilks(_ilk);
(,,uint spot,,) = vat.ilks(_ilk);
return rmul(rmul(spot, spotter.par()), mat);
}
/// @notice Gets CDP ratio
/// @param _cdpId Id of the CDP
/// @param _nextPrice Next price for user
function getRatio(uint _cdpId, uint _nextPrice) public view returns (uint) {
bytes32 ilk = manager.ilks(_cdpId);
uint price = (_nextPrice == 0) ? getPrice(ilk) : _nextPrice;
(uint collateral, uint debt) = getCdpInfo(_cdpId, ilk);
if (debt == 0) return 0;
return rdiv(wmul(collateral, price), debt) / (10 ** 18);
}
/// @notice Checks if Boost/Repay could be triggered for the CDP
/// @dev Called by MCDMonitor to enforce the min/max check
function canCall(Method _method, uint _cdpId, uint _nextPrice) public view returns(bool, uint) {
bool subscribed;
CdpHolder memory holder;
(subscribed, holder) = subscriptionsContract.getCdpHolder(_cdpId);
// check if cdp is subscribed
if (!subscribed) return (false, 0);
// check if using next price is allowed
if (_nextPrice > 0 && !holder.nextPriceEnabled) return (false, 0);
// check if boost and boost allowed
if (_method == Method.Boost && !holder.boostEnabled) return (false, 0);
// check if owner is still owner
if (getOwner(_cdpId) != holder.owner) return (false, 0);
uint currRatio = getRatio(_cdpId, _nextPrice);
if (_method == Method.Repay) {
return (currRatio < holder.minRatio, currRatio);
} else if (_method == Method.Boost) {
return (currRatio > holder.maxRatio, currRatio);
}
}
/// @dev After the Boost/Repay check if the ratio doesn't trigger another call
function ratioGoodAfter(Method _method, uint _cdpId, uint _nextPrice) public view returns(bool, uint) {
CdpHolder memory holder;
(, holder) = subscriptionsContract.getCdpHolder(_cdpId);
uint currRatio = getRatio(_cdpId, _nextPrice);
if (_method == Method.Repay) {
return (currRatio < holder.maxRatio, currRatio);
} else if (_method == Method.Boost) {
return (currRatio > holder.minRatio, currRatio);
}
}
/// @notice Calculates gas cost (in Eth) of tx
/// @dev Gas price is limited to MAX_GAS_PRICE to prevent attack of draining user CDP
/// @param _gasAmount Amount of gas used for the tx
function calcGasCost(uint _gasAmount) public view returns (uint) {
uint gasPrice = tx.gasprice <= MAX_GAS_PRICE ? tx.gasprice : MAX_GAS_PRICE;
return mul(gasPrice, _gasAmount);
}
/******************* OWNER ONLY OPERATIONS ********************************/
/// @notice Allows owner to change gas cost for boost operation, but only up to 3 millions
/// @param _gasCost New gas cost for boost method
function changeBoostGasCost(uint _gasCost) public onlyOwner {
require(_gasCost < 3000000);
BOOST_GAS_COST = _gasCost;
}
/// @notice Allows owner to change gas cost for repay operation, but only up to 3 millions
/// @param _gasCost New gas cost for repay method
function changeRepayGasCost(uint _gasCost) public onlyOwner {
require(_gasCost < 3000000);
REPAY_GAS_COST = _gasCost;
}
/// @notice Allows owner to change max gas price
/// @param _maxGasPrice New max gas price
function changeMaxGasPrice(uint _maxGasPrice) public onlyOwner {
require(_maxGasPrice < 1000000000000);
MAX_GAS_PRICE = _maxGasPrice;
}
/// @notice Allows owner to change the amount of gas token burned per function call
/// @param _gasAmount Amount of gas token
/// @param _isRepay Flag to know for which function we are setting the gas token amount
function changeGasTokenAmount(uint _gasAmount, bool _isRepay) public onlyOwner {
if (_isRepay) {
REPAY_GAS_TOKEN = _gasAmount;
} else {
BOOST_GAS_TOKEN = _gasAmount;
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_monitorProxy","type":"address"},{"internalType":"address","name":"_subscriptions","type":"address"},{"internalType":"address","name":"_mcdSaverTakerAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BOOST_GAS_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BOOST_GAS_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BOOST_SELECTOR","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BOT_REGISTRY_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_GAS_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROXY_PERMISSION_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REPAY_GAS_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REPAY_GAS_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REPAY_SELECTOR","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcAddr","type":"address"},{"internalType":"address","name":"destAddr","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"uint256","name":"destAmount","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"dfsFeeDivider","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"bytes","name":"wrapperData","type":"bytes"},{"components":[{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"address","name":"exchangeAddr","type":"address"},{"internalType":"address","name":"allowanceTarget","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct DFSExchangeData.OffchainData","name":"offchainData","type":"tuple"}],"internalType":"struct DFSExchangeData.ExchangeData","name":"_exchangeData","type":"tuple"},{"internalType":"uint256","name":"_cdpId","type":"uint256"},{"internalType":"uint256","name":"_nextPrice","type":"uint256"},{"internalType":"address","name":"_joinAddr","type":"address"}],"name":"boostFor","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gasAmount","type":"uint256"}],"name":"calcGasCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum StaticV2.Method","name":"_method","type":"uint8"},{"internalType":"uint256","name":"_cdpId","type":"uint256"},{"internalType":"uint256","name":"_nextPrice","type":"uint256"}],"name":"canCall","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gasCost","type":"uint256"}],"name":"changeBoostGasCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gasAmount","type":"uint256"},{"internalType":"bool","name":"_isRepay","type":"bool"}],"name":"changeGasTokenAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxGasPrice","type":"uint256"}],"name":"changeMaxGasPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gasCost","type":"uint256"}],"name":"changeRepayGasCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasToken","outputs":[{"internalType":"contract GasTokenInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cdpId","type":"uint256"},{"internalType":"bytes32","name":"_ilk","type":"bytes32"}],"name":"getCdpInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cdpId","type":"uint256"}],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_ilk","type":"bytes32"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cdpId","type":"uint256"},{"internalType":"uint256","name":"_nextPrice","type":"uint256"}],"name":"getRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kill","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"logger","outputs":[{"internalType":"contract DefisaverLogger","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"contract Manager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mcdSaverTakerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"monitorProxyContract","outputs":[{"internalType":"contract MCDMonitorProxyV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum StaticV2.Method","name":"_method","type":"uint8"},{"internalType":"uint256","name":"_cdpId","type":"uint256"},{"internalType":"uint256","name":"_nextPrice","type":"uint256"}],"name":"ratioGoodAfter","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"srcAddr","type":"address"},{"internalType":"address","name":"destAddr","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"uint256","name":"destAmount","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"dfsFeeDivider","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"bytes","name":"wrapperData","type":"bytes"},{"components":[{"internalType":"address","name":"wrapper","type":"address"},{"internalType":"address","name":"exchangeAddr","type":"address"},{"internalType":"address","name":"allowanceTarget","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct DFSExchangeData.OffchainData","name":"offchainData","type":"tuple"}],"internalType":"struct DFSExchangeData.ExchangeData","name":"_exchangeData","type":"tuple"},{"internalType":"uint256","name":"_cdpId","type":"uint256"},{"internalType":"uint256","name":"_nextPrice","type":"uint256"},{"internalType":"address","name":"_joinAddr","type":"address"}],"name":"repayFor","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdminByAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"setAdminByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwnerByAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"spotter","outputs":[{"internalType":"contract Spotter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"subscriptionsContract","outputs":[{"internalType":"contract ISubscriptionsV2","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vat","outputs":[{"internalType":"contract Vat","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawStuckFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526019600281905560035564ba43b74000600455620f4240600581905560065560078054678ec2ae250000000063ffffffff60201b1963ffffffff1990921663f360ce201791909116179055600a80546001600160a01b0319908116735ef30b9986345249bc32d8928b7ee64de9435e3917909155600b805482167335d1b3f3d7966a1dfe207aa4514c12a259a0492b179055600c80549091167365c79fcb50ca1594b025960e539ed7a9a6d434a3179055348015620000c257600080fd5b506040516200276238038062002762833981016040819052620000e59162000168565b600080546001600160a01b031990811633179091556001805482167325efa336886c74ea8e282ac466bdcd0199f85bb9179055600780546001600160a01b039586166801000000000000000002600160401b600160e01b0319909116179055600880549385169382169390931790925560098054919093169116179055620001d4565b6000806000606084860312156200017d578283fd5b83516200018a81620001bb565b60208501519093506200019d81620001bb565b6040850151909250620001b081620001bb565b809150509250925092565b6001600160a01b0381168114620001d157600080fd5b50565b61257e80620001e46000396000f3fe60806040526004361061021a5760003560e01c80637016722c11610123578063c41a360a116100ab578063deca5f881161006f578063deca5f8814610598578063e3bbb4f1146105b8578063f05def81146105cd578063f24ccbfe146105ed578063f851a440146106025761021a565b8063c41a360a14610500578063c42498ea14610520578063c91d59fe1461054e578063cf66a6bc14610563578063cff70001146105785761021a565b8063a56f9718116100f2578063a56f971814610481578063a7304bf714610496578063a8c90323146104b6578063b2f9e47f146104d6578063b6d5a156146104eb5761021a565b80637016722c1461043157806379521f02146104445780638da5cb5b14610459578063a564056c1461046e5761021a565b80633a128322116101a65780634d3f199e116101755780634d3f199e146103b0578063526d6461146103d057806358346f4b146103e55780635ea2a60914610407578063696806c01461041c5761021a565b80633a1283221461034657806341c0e1b514610366578063481c6a751461037b57806349a7ac67146103905761021a565b80632e77468d116101ed5780632e77468d146102ba57806331d98b3f146102dc57806336569e77146102fc57806336fc603f146103115780633816377e146103265761021a565b806305a2cded1461021f57806318bf60e1146102565780631e48907b146102785780632a56f6021461029a575b600080fd5b34801561022b57600080fd5b5061023f61023a366004611ee3565b610617565b60405161024d9291906122b6565b60405180910390f35b34801561026257600080fd5b5061026b6107bb565b60405161024d91906122c6565b34801561028457600080fd5b50610298610293366004611d37565b6107c1565b005b3480156102a657600080fd5b5061026b6102b5366004611e86565b6107fa565b3480156102c657600080fd5b506102cf610824565b60405161024d91906121aa565b3480156102e857600080fd5b5061026b6102f7366004611e86565b610833565b34801561030857600080fd5b506102cf6109e2565b34801561031d57600080fd5b5061026b6109f1565b34801561033257600080fd5b50610298610341366004611e86565b6109f7565b34801561035257600080fd5b50610298610361366004611d6f565b610a24565b34801561037257600080fd5b50610298610abd565b34801561038757600080fd5b506102cf610ae2565b34801561039c57600080fd5b5061023f6103ab366004611ee3565b610af1565b3480156103bc57600080fd5b506102986103cb366004611e86565b610bf1565b3480156103dc57600080fd5b506102cf610c1c565b3480156103f157600080fd5b506103fa610c34565b60405161024d91906122e6565b34801561041357600080fd5b506102cf610c3d565b34801561042857600080fd5b5061026b610c58565b61029861043f366004611f1a565b610c5e565b34801561045057600080fd5b506102cf611076565b34801561046557600080fd5b506102cf611085565b61029861047c366004611f1a565b611094565b34801561048d57600080fd5b5061026b611464565b3480156104a257600080fd5b506102986104b1366004611d37565b61146a565b3480156104c257600080fd5b506102986104d1366004611e86565b6114a3565b3480156104e257600080fd5b506103fa6114ce565b3480156104f757600080fd5b506102cf6114df565b34801561050c57600080fd5b506102cf61051b366004611e86565b6114f7565b34801561052c57600080fd5b5061054061053b366004612076565b61157e565b60405161024d9291906124ab565b34801561055a57600080fd5b506102cf611733565b34801561056f57600080fd5b506102cf611746565b34801561058457600080fd5b5061026b610593366004612076565b611755565b3480156105a457600080fd5b506102986105b3366004611d37565b61184b565b3480156105c457600080fd5b5061026b611878565b3480156105d957600080fd5b506102986105e8366004612047565b61187e565b3480156105f957600080fd5b506102cf6118ab565b34801561060e57600080fd5b506102cf6118c3565b6000806000610624611bba565b600854604051631da1542f60e01b81526001600160a01b0390911690631da1542f906106549089906004016122c6565b6101206040518083038186803b15801561066d57600080fd5b505afa158015610681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a59190611db6565b9092509050816106bd576000809350935050506107b3565b6000851180156106cf57508060e00151155b156106e2576000809350935050506107b3565b60008760018111156106f057fe5b1480156106ff57508060c00151155b15610712576000809350935050506107b3565b80608001516001600160a01b0316610729876114f7565b6001600160a01b031614610745576000809350935050506107b3565b60006107518787611755565b9050600188600181111561076157fe5b141561077f5790516001600160801b03168110935091506107b39050565b600088600181111561078d57fe5b14156107af576020909101516001600160801b03168111935091506107b39050565b5050505b935093915050565b60065481565b6001546001600160a01b031633146107d857600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806004543a111561080f57600454610811565b3a5b905061081d81846118d2565b9392505050565b600c546001600160a01b031681565b600c54604051636cb1c69b60e11b815260009182916001600160a01b039091169063d9638d36906108689086906004016122c6565b604080518083038186803b15801561087f57600080fd5b505afa158015610893573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b79190611eb6565b600b54604051636cb1c69b60e11b8152919350600092506001600160a01b03169063d9638d36906108ec9087906004016122c6565b60a06040518083038186803b15801561090457600080fd5b505afa158015610918573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093c91906120ba565b5050925050506109da6109d482600c60009054906101000a90046001600160a01b03166001600160a01b031663495d32cb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561099757600080fd5b505afa1580156109ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109cf9190611e9e565b6118f6565b836118f6565b949350505050565b600b546001600160a01b031681565b60055481565b6000546001600160a01b03163314610a0e57600080fd5b64e8d4a510008110610a1f57600080fd5b600455565b6000546001600160a01b03163314610a3b57600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0383161415610a9f57600080546040516001600160a01b039091169183156108fc02918491818181858888f19350505050158015610a99573d6000803e3d6000fd5b50610ab9565b600054610ab9906001600160a01b03848116911683611937565b5050565b6000546001600160a01b03163314610ad457600080fd5b6000546001600160a01b0316ff5b600a546001600160a01b031681565b600080610afc611bba565b600854604051631da1542f60e01b81526001600160a01b0390911690631da1542f90610b2c9088906004016122c6565b6101206040518083038186803b158015610b4557600080fd5b505afa158015610b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7d9190611db6565b915060009050610b8d8686611755565b90506001876001811115610b9d57fe5b1415610bbd576020909101516001600160801b03168110925090506107b3565b6000876001811115610bcb57fe5b1415610be75790516001600160801b03168111925090506107b3565b5050935093915050565b6000546001600160a01b03163314610c0857600080fd5b622dc6c08110610c1757600080fd5b600555565b73637726f8b08a7abe3ae3acab01a80e2d8ddef77b81565b60075460e01b81565b6007546801000000000000000090046001600160a01b031681565b60035481565b6040516320eb73ed60e11b815273637726f8b08a7abe3ae3acab01a80e2d8ddef77b906341d6e7da90610c959033906004016121aa565b60206040518083038186803b158015610cad57600080fd5b505afa158015610cc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce59190611d9a565b610d0a5760405162461bcd60e51b8152600401610d0190612345565b60405180910390fd5b6002546040516370a0823160e01b815281906eb3f879cb30fe243b4dfee438691c04906370a0823190610d419030906004016121aa565b60206040518083038186803b158015610d5957600080fd5b505afa158015610d6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d919190611e9e565b10610e1c5760405163d8ccd0f360e01b81526eb3f879cb30fe243b4dfee438691c049063d8ccd0f390610dc89084906004016122c6565b602060405180830381600087803b158015610de257600080fd5b505af1158015610df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1a9190611d9a565b505b600080610e2b60018787610617565b9150915081610e3957600080fd5b6000610e466005546107fa565b60085460405163620d1b0560e11b81529192506000916001600160a01b039091169063c41a360a90610e7c908b906004016122c6565b60206040518083038186803b158015610e9457600080fd5b505afa158015610ea8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecc9190611d53565b9050600760089054906101000a90046001600160a01b03166001600160a01b0316638a0e833f3483600960009054906101000a90046001600160a01b0316600760009054906101000a900460e01b8e8e898e6000604051602401610f349594939291906123b5565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e087901b9092168252610f7b9392916004016121be565b6000604051808303818588803b158015610f9457600080fd5b505af1158015610fa8573d6000803e3d6000fd5b5050505050600080610fbc60018b8b610af1565b9150915081610fca57600080fd5b610fd2611992565b735c55b921f590a89c1ebe84df170e655a82b621266001600160a01b031663d061ce503085888560405160200161100a9291906124ab565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401611037939291906121f3565b600060405180830381600087803b15801561105157600080fd5b505af1158015611065573d6000803e3d6000fd5b505050505050505050505050505050565b6008546001600160a01b031681565b6000546001600160a01b031681565b6040516320eb73ed60e11b815273637726f8b08a7abe3ae3acab01a80e2d8ddef77b906341d6e7da906110cb9033906004016121aa565b60206040518083038186803b1580156110e357600080fd5b505afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b9190611d9a565b6111375760405162461bcd60e51b8152600401610d0190612345565b6003546040516370a0823160e01b815281906eb3f879cb30fe243b4dfee438691c04906370a082319061116e9030906004016121aa565b60206040518083038186803b15801561118657600080fd5b505afa15801561119a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111be9190611e9e565b106112495760405163d8ccd0f360e01b81526eb3f879cb30fe243b4dfee438691c049063d8ccd0f3906111f59084906004016122c6565b602060405180830381600087803b15801561120f57600080fd5b505af1158015611223573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112479190611d9a565b505b60008061125860008787610617565b915091508161126657600080fd5b60006112736006546107fa565b60085460405163620d1b0560e11b81529192506000916001600160a01b039091169063c41a360a906112a9908b906004016122c6565b60206040518083038186803b1580156112c157600080fd5b505afa1580156112d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f99190611d53565b9050600760089054906101000a90046001600160a01b03166001600160a01b0316638a0e833f3483600960009054906101000a90046001600160a01b0316600760049054906101000a900460e01b8e8e898e60006040516024016113619594939291906123b5565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e087901b90921682526113a89392916004016121be565b6000604051808303818588803b1580156113c157600080fd5b505af11580156113d5573d6000803e3d6000fd5b50505050506000806113e960008b8b610af1565b91509150816113f757600080fd5b6113ff611992565b735c55b921f590a89c1ebe84df170e655a82b621266001600160a01b031663d061ce50308588856040516020016114379291906124ab565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161103793929190612248565b60025481565b6001546001600160a01b0316331461148157600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146114ba57600080fd5b622dc6c081106114c957600080fd5b600655565b600754640100000000900460e01b81565b735a4f877ca808cca3cb7c2a194f80ab8588fae26b81565b600a5460405163040b0d8960e51b81526000916001600160a01b031690638161b120906115289085906004016122c6565b60206040518083038186803b15801561154057600080fd5b505afa158015611554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115789190611d53565b92915050565b600a54604051632726b07360e01b8152600091829182916001600160a01b031690632726b073906115b39088906004016122c6565b60206040518083038186803b1580156115cb57600080fd5b505afa1580156115df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116039190611d53565b600b546040516309092f9760e21b815291925060009182916001600160a01b031690632424be5c9061163b90899087906004016122cf565b604080518083038186803b15801561165257600080fd5b505afa158015611666573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168a9190612097565b600b54604051636cb1c69b60e11b81529294509092506000916001600160a01b039091169063d9638d36906116c3908a906004016122c6565b60a06040518083038186803b1580156116db57600080fd5b505afa1580156116ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171391906120ba565b5050509150508261172483836118f6565b95509550505050509250929050565b6eb3f879cb30fe243b4dfee438691c0481565b6009546001600160a01b031681565b600a54604051632c2cb9fd60e01b815260009182916001600160a01b0390911690632c2cb9fd9061178a9087906004016122c6565b60206040518083038186803b1580156117a257600080fd5b505afa1580156117b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117da9190611e9e565b9050600083156117ea57836117f3565b6117f382610833565b9050600080611802878561157e565b91509150806000141561181c576000945050505050611578565b670de0b6b3a764000061183861183284866119c8565b836119f0565b8161183f57fe5b04979650505050505050565b6000546001600160a01b0316331461186257600080fd5b6001546001600160a01b03161561148157600080fd5b60045481565b6000546001600160a01b0316331461189557600080fd5b80156118a5576002829055610ab9565b50600355565b735c55b921f590a89c1ebe84df170e655a82b6212681565b6001546001600160a01b031681565b60008115806118ed575050808202828282816118ea57fe5b04145b61157857600080fd5b60006b033b2e3c9fd0803ce800000061192861191285856118d2565b60026b033b2e3c9fd0803ce80000005b04611a14565b8161192f57fe5b049392505050565b61198d8363a9059cbb60e01b848460405160240161195692919061229d565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611a24565b505050565b47156119c65760405133904780156108fc02916000818181858888f193505050501580156119c4573d6000803e3d6000fd5b505b565b6000670de0b6b3a76400006119286119e085856118d2565b6002670de0b6b3a7640000611922565b600081611928611a0c856b033b2e3c9fd0803ce80000006118d2565b600285611922565b8082018281101561157857600080fd5b6060611a79826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ab39092919063ffffffff16565b80519091501561198d5780806020019051810190611a979190611d9a565b61198d5760405162461bcd60e51b8152600401610d019061236b565b60606109da84846000856060611ac885611b81565b611ae45760405162461bcd60e51b8152600401610d019061230e565b60006060866001600160a01b03168587604051611b01919061218e565b60006040518083038185875af1925050503d8060008114611b3e576040519150601f19603f3d011682016040523d82523d6000602084013e611b43565b606091505b50915091508115611b575791506109da9050565b805115611b675780518082602001fd5b8360405162461bcd60e51b8152600401610d0191906122fb565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906109da575050151592915050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b803561157881612510565b805161157881612510565b805161157881612525565b600082601f830112611c2f578081fd5b813567ffffffffffffffff811115611c45578182fd5b611c58601f8201601f19166020016124b9565b9150808252836020828501011115611c6f57600080fd5b8060208401602084013760009082016020015292915050565b600060c08284031215611c99578081fd5b611ca360c06124b9565b90508135611cb081612510565b81526020820135611cc081612510565b60208201526040820135611cd381612510565b80604083015250606082013560608201526080820135608082015260a082013567ffffffffffffffff811115611d0857600080fd5b611d1484828501611c1f565b60a08301525092915050565b80516001600160801b038116811461157857600080fd5b600060208284031215611d48578081fd5b813561081d81612510565b600060208284031215611d64578081fd5b815161081d81612510565b60008060408385031215611d81578081fd5b8235611d8c81612510565b946020939093013593505050565b600060208284031215611dab578081fd5b815161081d81612525565b600080828403610120811215611dca578283fd5b8351611dd581612525565b9250610100601f198201811315611dea578283fd5b611df3816124b9565b91506020850151611e0381612533565b8252611e128660408701611d20565b6020830152611e248660608701611d20565b6040830152611e368660808701611d20565b6060830152611e488660a08701611c09565b608083015260c085015160a0830152611e648660e08701611c14565b60c0830152611e7586828701611c14565b60e083015250809150509250929050565b600060208284031215611e97578081fd5b5035919050565b600060208284031215611eaf578081fd5b5051919050565b60008060408385031215611ec8578182fd5b8251611ed381612510565b6020939093015192949293505050565b600080600060608486031215611ef7578081fd5b833560028110611f05578182fd5b95602085013595506040909401359392505050565b60008060008060808587031215611f2f578182fd5b843567ffffffffffffffff80821115611f46578384fd5b818701915061014080838a031215611f5c578485fd5b611f65816124b9565b9050611f718984611bfe565b8152611f808960208501611bfe565b602082015260408301356040820152606083013560608201526080830135608082015260a083013560a0820152611fba8960c08501611bfe565b60c0820152611fcc8960e08501611bfe565b60e08201526101008084013583811115611fe4578687fd5b611ff08b828701611c1f565b8284015250506101208084013583811115612009578687fd5b6120158b828701611c88565b828401525050809650505050602085013592506040850135915061203c8660608701611bfe565b905092959194509250565b60008060408385031215612059578182fd5b82359150602083013561206b81612525565b809150509250929050565b60008060408385031215612088578182fd5b50508035926020909101359150565b600080604083850312156120a9578182fd5b505080516020909101519092909150565b600080600080600060a086880312156120d1578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b6001600160a01b03169052565b6000815180845261211e8160208601602086016124e0565b601f01601f19169290920160200192915050565b60ff169052565b600060018060a01b0380835116845280602084015116602085015280604084015116604085015250606082015160608401526080820151608084015260a082015160c060a08501526109da60c0850182612106565b600082516121a08184602087016124e0565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b038481168252831660208201526060604082018190526000906121ea90830184612106565b95945050505050565b6001600160a01b03848116825283166020820152608060408201819052601190820152704175746f6d617469634d4344526570617960781b60a082015260c0606082018190526000906121ea90830184612106565b6001600160a01b0384811682528316602082015260806040820181905260119082015270105d5d1bdb585d1a58d350d1109bdbdcdd607a1b60a082015260c0606082018190526000906121ea90830184612106565b6001600160a01b03929092168252602082015260400190565b9115158252602082015260400190565b90815260200190565b9182526001600160a01b0316602082015260400190565b6001600160e01b031991909116815260200190565b60006020825261081d6020830184612106565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600c908201526b139bdd08185d5d1a08189bdd60a21b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b600060a082526123c960a0830188516120f9565b60208701516123db60c08401826120f9565b50604087015160e08301526060870151610100818185015260808901519150610120828186015260a08a01519250610140838187015260c08b015193506124266101608701856120f9565b60e08b0151935061243b6101808701856120f9565b828b01519350806101a0870152506124576101e0860184612106565b908a0151858203609f19016101c087015290925090506124778282612139565b9250505085602083015284604083015261249460608301856120f9565b6124a16080830184612132565b9695505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156124d857600080fd5b604052919050565b60005b838110156124fb5781810151838201526020016124e3565b8381111561250a576000848401525b50505050565b6001600160a01b03811681146119c457600080fd5b80151581146119c457600080fd5b6001600160801b03811681146119c457600080fdfea26469706673582212202f1e4edc0d6fa5b853387d6a2f8be8710466783219e288b481dadb9bcc2059a664736f6c634300060c00330000000000000000000000001816a86c4da59395522a42b871bf11a4e96a1c7a000000000000000000000000c45d4f6b6bf41b6edaa58b01c4298b8d9078269a0000000000000000000000001739e1e5bb8be51bb6b1982db9578fa61e67d6ca
Deployed Bytecode
0x60806040526004361061021a5760003560e01c80637016722c11610123578063c41a360a116100ab578063deca5f881161006f578063deca5f8814610598578063e3bbb4f1146105b8578063f05def81146105cd578063f24ccbfe146105ed578063f851a440146106025761021a565b8063c41a360a14610500578063c42498ea14610520578063c91d59fe1461054e578063cf66a6bc14610563578063cff70001146105785761021a565b8063a56f9718116100f2578063a56f971814610481578063a7304bf714610496578063a8c90323146104b6578063b2f9e47f146104d6578063b6d5a156146104eb5761021a565b80637016722c1461043157806379521f02146104445780638da5cb5b14610459578063a564056c1461046e5761021a565b80633a128322116101a65780634d3f199e116101755780634d3f199e146103b0578063526d6461146103d057806358346f4b146103e55780635ea2a60914610407578063696806c01461041c5761021a565b80633a1283221461034657806341c0e1b514610366578063481c6a751461037b57806349a7ac67146103905761021a565b80632e77468d116101ed5780632e77468d146102ba57806331d98b3f146102dc57806336569e77146102fc57806336fc603f146103115780633816377e146103265761021a565b806305a2cded1461021f57806318bf60e1146102565780631e48907b146102785780632a56f6021461029a575b600080fd5b34801561022b57600080fd5b5061023f61023a366004611ee3565b610617565b60405161024d9291906122b6565b60405180910390f35b34801561026257600080fd5b5061026b6107bb565b60405161024d91906122c6565b34801561028457600080fd5b50610298610293366004611d37565b6107c1565b005b3480156102a657600080fd5b5061026b6102b5366004611e86565b6107fa565b3480156102c657600080fd5b506102cf610824565b60405161024d91906121aa565b3480156102e857600080fd5b5061026b6102f7366004611e86565b610833565b34801561030857600080fd5b506102cf6109e2565b34801561031d57600080fd5b5061026b6109f1565b34801561033257600080fd5b50610298610341366004611e86565b6109f7565b34801561035257600080fd5b50610298610361366004611d6f565b610a24565b34801561037257600080fd5b50610298610abd565b34801561038757600080fd5b506102cf610ae2565b34801561039c57600080fd5b5061023f6103ab366004611ee3565b610af1565b3480156103bc57600080fd5b506102986103cb366004611e86565b610bf1565b3480156103dc57600080fd5b506102cf610c1c565b3480156103f157600080fd5b506103fa610c34565b60405161024d91906122e6565b34801561041357600080fd5b506102cf610c3d565b34801561042857600080fd5b5061026b610c58565b61029861043f366004611f1a565b610c5e565b34801561045057600080fd5b506102cf611076565b34801561046557600080fd5b506102cf611085565b61029861047c366004611f1a565b611094565b34801561048d57600080fd5b5061026b611464565b3480156104a257600080fd5b506102986104b1366004611d37565b61146a565b3480156104c257600080fd5b506102986104d1366004611e86565b6114a3565b3480156104e257600080fd5b506103fa6114ce565b3480156104f757600080fd5b506102cf6114df565b34801561050c57600080fd5b506102cf61051b366004611e86565b6114f7565b34801561052c57600080fd5b5061054061053b366004612076565b61157e565b60405161024d9291906124ab565b34801561055a57600080fd5b506102cf611733565b34801561056f57600080fd5b506102cf611746565b34801561058457600080fd5b5061026b610593366004612076565b611755565b3480156105a457600080fd5b506102986105b3366004611d37565b61184b565b3480156105c457600080fd5b5061026b611878565b3480156105d957600080fd5b506102986105e8366004612047565b61187e565b3480156105f957600080fd5b506102cf6118ab565b34801561060e57600080fd5b506102cf6118c3565b6000806000610624611bba565b600854604051631da1542f60e01b81526001600160a01b0390911690631da1542f906106549089906004016122c6565b6101206040518083038186803b15801561066d57600080fd5b505afa158015610681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a59190611db6565b9092509050816106bd576000809350935050506107b3565b6000851180156106cf57508060e00151155b156106e2576000809350935050506107b3565b60008760018111156106f057fe5b1480156106ff57508060c00151155b15610712576000809350935050506107b3565b80608001516001600160a01b0316610729876114f7565b6001600160a01b031614610745576000809350935050506107b3565b60006107518787611755565b9050600188600181111561076157fe5b141561077f5790516001600160801b03168110935091506107b39050565b600088600181111561078d57fe5b14156107af576020909101516001600160801b03168111935091506107b39050565b5050505b935093915050565b60065481565b6001546001600160a01b031633146107d857600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806004543a111561080f57600454610811565b3a5b905061081d81846118d2565b9392505050565b600c546001600160a01b031681565b600c54604051636cb1c69b60e11b815260009182916001600160a01b039091169063d9638d36906108689086906004016122c6565b604080518083038186803b15801561087f57600080fd5b505afa158015610893573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b79190611eb6565b600b54604051636cb1c69b60e11b8152919350600092506001600160a01b03169063d9638d36906108ec9087906004016122c6565b60a06040518083038186803b15801561090457600080fd5b505afa158015610918573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093c91906120ba565b5050925050506109da6109d482600c60009054906101000a90046001600160a01b03166001600160a01b031663495d32cb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561099757600080fd5b505afa1580156109ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109cf9190611e9e565b6118f6565b836118f6565b949350505050565b600b546001600160a01b031681565b60055481565b6000546001600160a01b03163314610a0e57600080fd5b64e8d4a510008110610a1f57600080fd5b600455565b6000546001600160a01b03163314610a3b57600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0383161415610a9f57600080546040516001600160a01b039091169183156108fc02918491818181858888f19350505050158015610a99573d6000803e3d6000fd5b50610ab9565b600054610ab9906001600160a01b03848116911683611937565b5050565b6000546001600160a01b03163314610ad457600080fd5b6000546001600160a01b0316ff5b600a546001600160a01b031681565b600080610afc611bba565b600854604051631da1542f60e01b81526001600160a01b0390911690631da1542f90610b2c9088906004016122c6565b6101206040518083038186803b158015610b4557600080fd5b505afa158015610b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7d9190611db6565b915060009050610b8d8686611755565b90506001876001811115610b9d57fe5b1415610bbd576020909101516001600160801b03168110925090506107b3565b6000876001811115610bcb57fe5b1415610be75790516001600160801b03168111925090506107b3565b5050935093915050565b6000546001600160a01b03163314610c0857600080fd5b622dc6c08110610c1757600080fd5b600555565b73637726f8b08a7abe3ae3acab01a80e2d8ddef77b81565b60075460e01b81565b6007546801000000000000000090046001600160a01b031681565b60035481565b6040516320eb73ed60e11b815273637726f8b08a7abe3ae3acab01a80e2d8ddef77b906341d6e7da90610c959033906004016121aa565b60206040518083038186803b158015610cad57600080fd5b505afa158015610cc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce59190611d9a565b610d0a5760405162461bcd60e51b8152600401610d0190612345565b60405180910390fd5b6002546040516370a0823160e01b815281906eb3f879cb30fe243b4dfee438691c04906370a0823190610d419030906004016121aa565b60206040518083038186803b158015610d5957600080fd5b505afa158015610d6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d919190611e9e565b10610e1c5760405163d8ccd0f360e01b81526eb3f879cb30fe243b4dfee438691c049063d8ccd0f390610dc89084906004016122c6565b602060405180830381600087803b158015610de257600080fd5b505af1158015610df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1a9190611d9a565b505b600080610e2b60018787610617565b9150915081610e3957600080fd5b6000610e466005546107fa565b60085460405163620d1b0560e11b81529192506000916001600160a01b039091169063c41a360a90610e7c908b906004016122c6565b60206040518083038186803b158015610e9457600080fd5b505afa158015610ea8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecc9190611d53565b9050600760089054906101000a90046001600160a01b03166001600160a01b0316638a0e833f3483600960009054906101000a90046001600160a01b0316600760009054906101000a900460e01b8e8e898e6000604051602401610f349594939291906123b5565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e087901b9092168252610f7b9392916004016121be565b6000604051808303818588803b158015610f9457600080fd5b505af1158015610fa8573d6000803e3d6000fd5b5050505050600080610fbc60018b8b610af1565b9150915081610fca57600080fd5b610fd2611992565b735c55b921f590a89c1ebe84df170e655a82b621266001600160a01b031663d061ce503085888560405160200161100a9291906124ab565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401611037939291906121f3565b600060405180830381600087803b15801561105157600080fd5b505af1158015611065573d6000803e3d6000fd5b505050505050505050505050505050565b6008546001600160a01b031681565b6000546001600160a01b031681565b6040516320eb73ed60e11b815273637726f8b08a7abe3ae3acab01a80e2d8ddef77b906341d6e7da906110cb9033906004016121aa565b60206040518083038186803b1580156110e357600080fd5b505afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b9190611d9a565b6111375760405162461bcd60e51b8152600401610d0190612345565b6003546040516370a0823160e01b815281906eb3f879cb30fe243b4dfee438691c04906370a082319061116e9030906004016121aa565b60206040518083038186803b15801561118657600080fd5b505afa15801561119a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111be9190611e9e565b106112495760405163d8ccd0f360e01b81526eb3f879cb30fe243b4dfee438691c049063d8ccd0f3906111f59084906004016122c6565b602060405180830381600087803b15801561120f57600080fd5b505af1158015611223573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112479190611d9a565b505b60008061125860008787610617565b915091508161126657600080fd5b60006112736006546107fa565b60085460405163620d1b0560e11b81529192506000916001600160a01b039091169063c41a360a906112a9908b906004016122c6565b60206040518083038186803b1580156112c157600080fd5b505afa1580156112d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f99190611d53565b9050600760089054906101000a90046001600160a01b03166001600160a01b0316638a0e833f3483600960009054906101000a90046001600160a01b0316600760049054906101000a900460e01b8e8e898e60006040516024016113619594939291906123b5565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e087901b90921682526113a89392916004016121be565b6000604051808303818588803b1580156113c157600080fd5b505af11580156113d5573d6000803e3d6000fd5b50505050506000806113e960008b8b610af1565b91509150816113f757600080fd5b6113ff611992565b735c55b921f590a89c1ebe84df170e655a82b621266001600160a01b031663d061ce50308588856040516020016114379291906124ab565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161103793929190612248565b60025481565b6001546001600160a01b0316331461148157600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146114ba57600080fd5b622dc6c081106114c957600080fd5b600655565b600754640100000000900460e01b81565b735a4f877ca808cca3cb7c2a194f80ab8588fae26b81565b600a5460405163040b0d8960e51b81526000916001600160a01b031690638161b120906115289085906004016122c6565b60206040518083038186803b15801561154057600080fd5b505afa158015611554573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115789190611d53565b92915050565b600a54604051632726b07360e01b8152600091829182916001600160a01b031690632726b073906115b39088906004016122c6565b60206040518083038186803b1580156115cb57600080fd5b505afa1580156115df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116039190611d53565b600b546040516309092f9760e21b815291925060009182916001600160a01b031690632424be5c9061163b90899087906004016122cf565b604080518083038186803b15801561165257600080fd5b505afa158015611666573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168a9190612097565b600b54604051636cb1c69b60e11b81529294509092506000916001600160a01b039091169063d9638d36906116c3908a906004016122c6565b60a06040518083038186803b1580156116db57600080fd5b505afa1580156116ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061171391906120ba565b5050509150508261172483836118f6565b95509550505050509250929050565b6eb3f879cb30fe243b4dfee438691c0481565b6009546001600160a01b031681565b600a54604051632c2cb9fd60e01b815260009182916001600160a01b0390911690632c2cb9fd9061178a9087906004016122c6565b60206040518083038186803b1580156117a257600080fd5b505afa1580156117b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117da9190611e9e565b9050600083156117ea57836117f3565b6117f382610833565b9050600080611802878561157e565b91509150806000141561181c576000945050505050611578565b670de0b6b3a764000061183861183284866119c8565b836119f0565b8161183f57fe5b04979650505050505050565b6000546001600160a01b0316331461186257600080fd5b6001546001600160a01b03161561148157600080fd5b60045481565b6000546001600160a01b0316331461189557600080fd5b80156118a5576002829055610ab9565b50600355565b735c55b921f590a89c1ebe84df170e655a82b6212681565b6001546001600160a01b031681565b60008115806118ed575050808202828282816118ea57fe5b04145b61157857600080fd5b60006b033b2e3c9fd0803ce800000061192861191285856118d2565b60026b033b2e3c9fd0803ce80000005b04611a14565b8161192f57fe5b049392505050565b61198d8363a9059cbb60e01b848460405160240161195692919061229d565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611a24565b505050565b47156119c65760405133904780156108fc02916000818181858888f193505050501580156119c4573d6000803e3d6000fd5b505b565b6000670de0b6b3a76400006119286119e085856118d2565b6002670de0b6b3a7640000611922565b600081611928611a0c856b033b2e3c9fd0803ce80000006118d2565b600285611922565b8082018281101561157857600080fd5b6060611a79826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ab39092919063ffffffff16565b80519091501561198d5780806020019051810190611a979190611d9a565b61198d5760405162461bcd60e51b8152600401610d019061236b565b60606109da84846000856060611ac885611b81565b611ae45760405162461bcd60e51b8152600401610d019061230e565b60006060866001600160a01b03168587604051611b01919061218e565b60006040518083038185875af1925050503d8060008114611b3e576040519150601f19603f3d011682016040523d82523d6000602084013e611b43565b606091505b50915091508115611b575791506109da9050565b805115611b675780518082602001fd5b8360405162461bcd60e51b8152600401610d0191906122fb565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906109da575050151592915050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b803561157881612510565b805161157881612510565b805161157881612525565b600082601f830112611c2f578081fd5b813567ffffffffffffffff811115611c45578182fd5b611c58601f8201601f19166020016124b9565b9150808252836020828501011115611c6f57600080fd5b8060208401602084013760009082016020015292915050565b600060c08284031215611c99578081fd5b611ca360c06124b9565b90508135611cb081612510565b81526020820135611cc081612510565b60208201526040820135611cd381612510565b80604083015250606082013560608201526080820135608082015260a082013567ffffffffffffffff811115611d0857600080fd5b611d1484828501611c1f565b60a08301525092915050565b80516001600160801b038116811461157857600080fd5b600060208284031215611d48578081fd5b813561081d81612510565b600060208284031215611d64578081fd5b815161081d81612510565b60008060408385031215611d81578081fd5b8235611d8c81612510565b946020939093013593505050565b600060208284031215611dab578081fd5b815161081d81612525565b600080828403610120811215611dca578283fd5b8351611dd581612525565b9250610100601f198201811315611dea578283fd5b611df3816124b9565b91506020850151611e0381612533565b8252611e128660408701611d20565b6020830152611e248660608701611d20565b6040830152611e368660808701611d20565b6060830152611e488660a08701611c09565b608083015260c085015160a0830152611e648660e08701611c14565b60c0830152611e7586828701611c14565b60e083015250809150509250929050565b600060208284031215611e97578081fd5b5035919050565b600060208284031215611eaf578081fd5b5051919050565b60008060408385031215611ec8578182fd5b8251611ed381612510565b6020939093015192949293505050565b600080600060608486031215611ef7578081fd5b833560028110611f05578182fd5b95602085013595506040909401359392505050565b60008060008060808587031215611f2f578182fd5b843567ffffffffffffffff80821115611f46578384fd5b818701915061014080838a031215611f5c578485fd5b611f65816124b9565b9050611f718984611bfe565b8152611f808960208501611bfe565b602082015260408301356040820152606083013560608201526080830135608082015260a083013560a0820152611fba8960c08501611bfe565b60c0820152611fcc8960e08501611bfe565b60e08201526101008084013583811115611fe4578687fd5b611ff08b828701611c1f565b8284015250506101208084013583811115612009578687fd5b6120158b828701611c88565b828401525050809650505050602085013592506040850135915061203c8660608701611bfe565b905092959194509250565b60008060408385031215612059578182fd5b82359150602083013561206b81612525565b809150509250929050565b60008060408385031215612088578182fd5b50508035926020909101359150565b600080604083850312156120a9578182fd5b505080516020909101519092909150565b600080600080600060a086880312156120d1578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b6001600160a01b03169052565b6000815180845261211e8160208601602086016124e0565b601f01601f19169290920160200192915050565b60ff169052565b600060018060a01b0380835116845280602084015116602085015280604084015116604085015250606082015160608401526080820151608084015260a082015160c060a08501526109da60c0850182612106565b600082516121a08184602087016124e0565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b038481168252831660208201526060604082018190526000906121ea90830184612106565b95945050505050565b6001600160a01b03848116825283166020820152608060408201819052601190820152704175746f6d617469634d4344526570617960781b60a082015260c0606082018190526000906121ea90830184612106565b6001600160a01b0384811682528316602082015260806040820181905260119082015270105d5d1bdb585d1a58d350d1109bdbdcdd607a1b60a082015260c0606082018190526000906121ea90830184612106565b6001600160a01b03929092168252602082015260400190565b9115158252602082015260400190565b90815260200190565b9182526001600160a01b0316602082015260400190565b6001600160e01b031991909116815260200190565b60006020825261081d6020830184612106565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600c908201526b139bdd08185d5d1a08189bdd60a21b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b600060a082526123c960a0830188516120f9565b60208701516123db60c08401826120f9565b50604087015160e08301526060870151610100818185015260808901519150610120828186015260a08a01519250610140838187015260c08b015193506124266101608701856120f9565b60e08b0151935061243b6101808701856120f9565b828b01519350806101a0870152506124576101e0860184612106565b908a0151858203609f19016101c087015290925090506124778282612139565b9250505085602083015284604083015261249460608301856120f9565b6124a16080830184612132565b9695505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156124d857600080fd5b604052919050565b60005b838110156124fb5781810151838201526020016124e3565b8381111561250a576000848401525b50505050565b6001600160a01b03811681146119c457600080fd5b80151581146119c457600080fd5b6001600160801b03811681146119c457600080fdfea26469706673582212202f1e4edc0d6fa5b853387d6a2f8be8710466783219e288b481dadb9bcc2059a664736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001816a86c4da59395522a42b871bf11a4e96a1c7a000000000000000000000000c45d4f6b6bf41b6edaa58b01c4298b8d9078269a0000000000000000000000001739e1e5bb8be51bb6b1982db9578fa61e67d6ca
-----Decoded View---------------
Arg [0] : _monitorProxy (address): 0x1816A86C4DA59395522a42b871bf11A4E96A1C7a
Arg [1] : _subscriptions (address): 0xC45d4f6B6bf41b6EdAA58B01c4298B8d9078269a
Arg [2] : _mcdSaverTakerAddress (address): 0x1739e1E5bB8be51bB6b1982dB9578fa61E67d6cA
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000001816a86c4da59395522a42b871bf11a4e96a1c7a
Arg [1] : 000000000000000000000000c45d4f6b6bf41b6edaa58b01c4298b8d9078269a
Arg [2] : 0000000000000000000000001739e1e5bb8be51bb6b1982db9578fa61e67d6ca
Deployed Bytecode Sourcemap
21828:9058:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27495:972;;;;;;;;;;-1:-1:-1;27495:972:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;22085:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;13449:122::-;;;;;;;;;;-1:-1:-1;13449:122:0;;;;;:::i;:::-;;:::i;:::-;;29261:203;;;;;;;;;;-1:-1:-1;29261:203:0;;;;;:::i;:::-;;:::i;22727:76::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26650:210::-;;;;;;;;;;-1:-1:-1;26650:210:0;;;;;:::i;:::-;;:::i;22656:64::-;;;;;;;;;;;;;:::i;22042:36::-;;;;;;;;;;;;;:::i;30259:160::-;;;;;;;;;;-1:-1:-1;30259:160:0;;;;;:::i;:::-;;:::i;13744:285::-;;;;;;;;;;-1:-1:-1;13744:285:0;;;;;:::i;:::-;;:::i;13617:80::-;;;;;;;;;;;;;:::i;22573:76::-;;;;;;;;;;;;;:::i;28559:494::-;;;;;;;;;;-1:-1:-1;28559:494:0;;;;;:::i;:::-;;:::i;30006:144::-;;;;;;;;;;-1:-1:-1;30006:144:0;;;;;:::i;:::-;;:::i;22376:89::-;;;;;;;;;;;;;:::i;22130:41::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22228:45::-;;;;;;;;;;;;;:::i;21940:32::-;;;;;;;;;;;;;:::i;23537:941::-;;;;;;:::i;:::-;;:::i;22280:45::-;;;;;;;;;;;;;:::i;12407:20::-;;;;;;;;;;;;;:::i;24660:940::-;;;;;;:::i;:::-;;:::i;21901:32::-;;;;;;;;;;;;;:::i;13228:122::-;;;;;;;;;;-1:-1:-1;13228:122:0;;;;;:::i;:::-;;:::i;29703:144::-;;;;;;;;;;-1:-1:-1;29703:144:0;;;;;:::i;:::-;;:::i;22178:41::-;;;;;;;;;;;;;:::i;22474:90::-;;;;;;;;;;;;;:::i;26037:106::-;;;;;;;;;;-1:-1:-1;26037:106:0;;;;;:::i;:::-;;:::i;26274:289::-;;;;;;;;;;-1:-1:-1;26274:289:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;14946:106::-;;;;;;;;;;;;;:::i;22332:35::-;;;;;;;;;;;;;:::i;26984:369::-;;;;;;;;;;-1:-1:-1;26984:369:0;;;;;:::i;:::-;;:::i;12945:161::-;;;;;;;;;;-1:-1:-1;12945:161:0;;;;;:::i;:::-;;:::i;21981:40::-;;;;;;;;;;;;;:::i;30656:227::-;;;;;;;;;;-1:-1:-1;30656:227:0;;;;;:::i;:::-;;:::i;22812:100::-;;;;;;;;;;;;;:::i;12434:20::-;;;;;;;;;;;;;:::i;27495:972::-;27578:4;27584;27601:15;27627:23;;:::i;:::-;27684:21;;:42;;-1:-1:-1;;;27684:42:0;;-1:-1:-1;;;;;27684:21:0;;;;:34;;:42;;27719:6;;27684:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27661:65;;-1:-1:-1;27661:65:0;-1:-1:-1;27661:65:0;27778:34;;27803:5;27810:1;27795:17;;;;;;;;27778:34;27891:1;27878:10;:14;:42;;;;;27897:6;:23;;;27896:24;27878:42;27874:65;;;27930:5;27937:1;27922:17;;;;;;;;27874:65;28012:12;28001:7;:23;;;;;;;;;:47;;;;;28029:6;:19;;;28028:20;28001:47;27997:70;;;28058:5;28065:1;28050:17;;;;;;;;27997:70;28146:6;:12;;;-1:-1:-1;;;;;28126:32:0;:16;28135:6;28126:8;:16::i;:::-;-1:-1:-1;;;;;28126:32:0;;28122:55;;28168:5;28175:1;28160:17;;;;;;;;28122:55;28190:14;28207:28;28216:6;28224:10;28207:8;:28::i;:::-;28190:45;-1:-1:-1;28263:12:0;28252:7;:23;;;;;;;;;28248:212;;;28312:15;;-1:-1:-1;;;;;28300:27:0;;;;-1:-1:-1;28300:9:0;-1:-1:-1;28292:47:0;;-1:-1:-1;28292:47:0;28248:212;28372:12;28361:7;:23;;;;;;;;;28357:103;;;28421:15;;;;;-1:-1:-1;;;;;28409:27:0;;;;-1:-1:-1;28409:9:0;-1:-1:-1;28401:47:0;;-1:-1:-1;28401:47:0;28357:103;27495:972;;;;;;;;;;:::o;22085:36::-;;;;:::o;13449:122::-;13530:5;;-1:-1:-1;;;;;13530:5:0;13516:10;:19;13508:28;;;;;;13549:5;:14;;-1:-1:-1;;;;;;13549:14:0;-1:-1:-1;;;;;13549:14:0;;;;;;;;;;13449:122::o;29261:203::-;29320:4;29337:13;29368;;29353:11;:28;;:58;;29398:13;;29353:58;;;29384:11;29353:58;29337:74;;29431:25;29435:8;29445:10;29431:3;:25::i;:::-;29424:32;29261:203;-1:-1:-1;;;29261:203:0:o;22727:76::-;;;-1:-1:-1;;;;;22727:76:0;;:::o;26650:210::-;26735:7;;:18;;-1:-1:-1;;;26735:18:0;;26703:4;;;;-1:-1:-1;;;;;26735:7:0;;;;:12;;:18;;26748:4;;26735:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26782:3;;:14;;-1:-1:-1;;;26782:14:0;;26720:33;;-1:-1:-1;26767:9:0;;-1:-1:-1;;;;;;26782:3:0;;:8;;:14;;26791:4;;26782:14;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26764:32;;;;;;26816:36;26821:25;26826:4;26832:7;;;;;;;;;-1:-1:-1;;;;;26832:7:0;-1:-1:-1;;;;;26832:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26821:4;:25::i;:::-;26848:3;26816:4;:36::i;:::-;26809:43;26650:210;-1:-1:-1;;;;26650:210:0:o;22656:64::-;;;-1:-1:-1;;;;;22656:64:0;;:::o;22042:36::-;;;;:::o;30259:160::-;12503:5;;-1:-1:-1;;;;;12503:5:0;12512:10;12503:19;12495:28;;;;;;30356:13:::1;30341:12;:28;30333:37;;;::::0;::::1;;30383:13;:28:::0;30259:160::o;13744:285::-;12503:5;;-1:-1:-1;;;;;12503:5:0;12512:10;12503:19;12495:28;;;;;;13844:42:::1;-1:-1:-1::0;;;;;13834:52:0;::::1;;13830:192;;;13911:5;::::0;;13903:32:::1;::::0;-1:-1:-1;;;;;13911:5:0;;::::1;::::0;13903:32;::::1;;;::::0;13927:7;;13903:32;13911:5;13903:32;13927:7;13911:5;13903:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;13830:192;;;13995:5;::::0;13968:42:::1;::::0;-1:-1:-1;;;;;13968:26:0;;::::1;::::0;13995:5:::1;14002:7:::0;13968:26:::1;:42::i;:::-;13744:285:::0;;:::o;13617:80::-;12503:5;;-1:-1:-1;;;;;12503:5:0;12512:10;12503:19;12495:28;;;;;;13682:5:::1;::::0;-1:-1:-1;;;;;13682:5:0::1;13661:28;22573:76:::0;;;-1:-1:-1;;;;;22573:76:0;;:::o;28559:494::-;28649:4;28655;28672:23;;:::i;:::-;28721:21;;:42;;-1:-1:-1;;;28721:42:0;;-1:-1:-1;;;;;28721:21:0;;;;:34;;:42;;28756:6;;28721:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28708:55;-1:-1:-1;28776:14:0;;-1:-1:-1;28793:28:0;28802:6;28810:10;28793:8;:28::i;:::-;28776:45;-1:-1:-1;28849:12:0;28838:7;:23;;;;;;;;;28834:212;;;28898:15;;;;;-1:-1:-1;;;;;28886:27:0;;;;-1:-1:-1;28886:9:0;-1:-1:-1;28878:47:0;;28834:212;28958:12;28947:7;:23;;;;;;;;;28943:103;;;29007:15;;-1:-1:-1;;;;;28995:27:0;;;;-1:-1:-1;28995:9:0;-1:-1:-1;28987:47:0;;28943:103;28559:494;;;;;;;;:::o;30006:144::-;12503:5;;-1:-1:-1;;;;;12503:5:0;12512:10;12503:19;12495:28;;;;;;30096:7:::1;30085:8;:18;30077:27;;;::::0;::::1;;30117:14;:25:::0;30006:144::o;22376:89::-;22423:42;22376:89;:::o;22130:41::-;;;;;;:::o;22228:45::-;;;;;;-1:-1:-1;;;;;22228:45:0;;:::o;21940:32::-;;;;:::o;23537:941::-;22964:53;;-1:-1:-1;;;22964:53:0;;22423:42;;22964:41;;:53;;23006:10;;22964:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22956:78;;;;-1:-1:-1;;;22956:78:0;;;;;;;:::i;:::-;;;;;;;;;23734:15:::1;::::0;15107:33:::1;::::0;-1:-1:-1;;;15107:33:0;;23734:15;;15009:42:::1;::::0;15107:18:::1;::::0;:33:::1;::::0;15134:4:::1;::::0;15107:33:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;15103:99;;15168:22;::::0;-1:-1:-1;;;15168:22:0;;15009:42:::1;::::0;15168:13:::1;::::0;:22:::1;::::0;15182:7;;15168:22:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15103:99;23765:14:::2;23781:16:::0;23801:41:::2;23809:12;23823:6;23831:10;23801:7;:41::i;:::-;23764:78;;;;23861:9;23853:18;;;::::0;::::2;;23884:12;23899:27;23911:14;;23899:11;:27::i;:::-;23955:21;::::0;:38:::2;::::0;-1:-1:-1;;;23955:38:0;;23884:42;;-1:-1:-1;23939:13:0::2;::::0;-1:-1:-1;;;;;23955:21:0;;::::2;::::0;:30:::2;::::0;:38:::2;::::0;23986:6;;23955:38:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23939:54;;24006:20;;;;;;;;;-1:-1:-1::0;;;;;24006:20:0::2;-1:-1:-1::0;;;;;24006:32:0::2;;24046:9;24071:5;24091:20;;;;;;;;;-1:-1:-1::0;;;;;24091:20:0::2;24149:14;;;;;;;;;;;24165:13;24180:6;24188:7;24197:9;24208:1;24126:84;;;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;24126:84:0;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;24126:84:0::2;-1:-1:-1::0;;;;;;24126:84:0;;::::2;;::::0;;24006:205;::::2;::::0;;;;;;;;::::2;::::0;;;::::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;24227:16;24245:15:::0;24264:48:::2;24279:12;24293:6;24301:10;24264:14;:48::i;:::-;24226:86;;;;24331:11;24323:20;;;::::0;::::2;;24356:11;:9;:11::i;:::-;22869:42;-1:-1:-1::0;;;;;24380:10:0::2;;24399:4;24406:5;24445:11;24458:10;24434:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24380:90;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;15214:1;;;;;;23045::::1;23537:941:::0;;;;:::o;22280:45::-;;;-1:-1:-1;;;;;22280:45:0;;:::o;12407:20::-;;;-1:-1:-1;;;;;12407:20:0;;:::o;24660:940::-;22964:53;;-1:-1:-1;;;22964:53:0;;22423:42;;22964:41;;:53;;23006:10;;22964:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22956:78;;;;-1:-1:-1;;;22956:78:0;;;;;;;:::i;:::-;24857:15:::1;::::0;15107:33:::1;::::0;-1:-1:-1;;;15107:33:0;;24857:15;;15009:42:::1;::::0;15107:18:::1;::::0;:33:::1;::::0;15134:4:::1;::::0;15107:33:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;15103:99;;15168:22;::::0;-1:-1:-1;;;15168:22:0;;15009:42:::1;::::0;15168:13:::1;::::0;:22:::1;::::0;15182:7;;15168:22:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15103:99;24889:14:::2;24905:16:::0;24925:41:::2;24933:12;24947:6;24955:10;24925:7;:41::i;:::-;24888:78;;;;24985:9;24977:18;;;::::0;::::2;;25008:12;25023:27;25035:14;;25023:11;:27::i;:::-;25079:21;::::0;:38:::2;::::0;-1:-1:-1;;;25079:38:0;;25008:42;;-1:-1:-1;25063:13:0::2;::::0;-1:-1:-1;;;;;25079:21:0;;::::2;::::0;:30:::2;::::0;:38:::2;::::0;25110:6;;25079:38:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25063:54;;25130:20;;;;;;;;;-1:-1:-1::0;;;;;25130:20:0::2;-1:-1:-1::0;;;;;25130:32:0::2;;25170:9;25195:5;25215:20;;;;;;;;;-1:-1:-1::0;;;;;25215:20:0::2;25273:14;;;;;;;;;;;25289:13;25304:6;25312:7;25321:9;25332:1;25250:84;;;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;25250:84:0;;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;;-1:-1:-1;;;;;25250:84:0::2;-1:-1:-1::0;;;;;;25250:84:0;;::::2;;::::0;;25130:205;::::2;::::0;;;;;;;;::::2;::::0;;;::::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;25349:16;25367:15:::0;25386:48:::2;25401:12;25415:6;25423:10;25386:14;:48::i;:::-;25348:86;;;;25453:11;25445:20;;;::::0;::::2;;25478:11;:9;:11::i;:::-;22869:42;-1:-1:-1::0;;;;;25502:10:0::2;;25521:4;25528:5;25567:11;25580:10;25556:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25502:90;;;;;;;;;;;;;;;;;:::i;21901:32::-:0;;;;:::o;13228:122::-;13309:5;;-1:-1:-1;;;;;13309:5:0;13295:10;:19;13287:28;;;;;;13328:5;:14;;-1:-1:-1;;;;;;13328:14:0;-1:-1:-1;;;;;13328:14:0;;;;;;;;;;13228:122::o;29703:144::-;12503:5;;-1:-1:-1;;;;;12503:5:0;12512:10;12503:19;12495:28;;;;;;29793:7:::1;29782:8;:18;29774:27;;;::::0;::::1;;29814:14;:25:::0;29703:144::o;22178:41::-;;;;;;;;;:::o;22474:90::-;22522:42;22474:90;:::o;26037:106::-;26115:7;;:20;;-1:-1:-1;;;26115:20:0;;26088:7;;-1:-1:-1;;;;;26115:7:0;;:12;;:20;;26128:6;;26115:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26108:27;26037:106;-1:-1:-1;;26037:106:0:o;26274:289::-;26379:7;;:20;;-1:-1:-1;;;26379:20:0;;26342:4;;;;;;-1:-1:-1;;;;;26379:7:0;;:12;;:20;;26392:6;;26379:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26443:3;;:19;;-1:-1:-1;;;26443:19:0;;26365:34;;-1:-1:-1;26413:15:0;;;;-1:-1:-1;;;;;26443:3:0;;:8;;:19;;26452:4;;26365:34;;26443:19;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26491:3;;:14;;-1:-1:-1;;;26491:14:0;;26412:50;;-1:-1:-1;26412:50:0;;-1:-1:-1;26475:9:0;;-1:-1:-1;;;;;26491:3:0;;;;:8;;:14;;26500:4;;26491:14;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26473:32;;;;;;26526:10;26538:16;26543:4;26549;26538;:16::i;:::-;26518:37;;;;;;;;26274:289;;;;;:::o;14946:106::-;15009:42;14946:106;:::o;22332:35::-;;;-1:-1:-1;;;;;22332:35:0;;:::o;26984:369::-;27084:7;;:20;;-1:-1:-1;;;27084:20:0;;27053:4;;;;-1:-1:-1;;;;;27084:7:0;;;;:12;;:20;;27097:6;;27084:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27070:34;-1:-1:-1;27115:10:0;27129:15;;27128:46;;27164:10;27128:46;;;27148:13;27157:3;27148:8;:13::i;:::-;27115:59;;27188:15;27205:9;27218:23;27229:6;27237:3;27218:10;:23::i;:::-;27187:54;;;;27258:4;27266:1;27258:9;27254:23;;;27276:1;27269:8;;;;;;;;27254:23;27336:8;27297:35;27302:23;27307:10;27319:5;27302:4;:23::i;:::-;27327:4;27297;:35::i;:::-;:48;;;;;;;26984:369;-1:-1:-1;;;;;;;26984:369:0:o;12945:161::-;13026:5;;-1:-1:-1;;;;;13026:5:0;13012:10;:19;13004:28;;;;;;13051:5;;-1:-1:-1;;;;;13051:5:0;:19;13043:28;;;;;21981:40;;;;:::o;30656:227::-;12503:5;;-1:-1:-1;;;;;12503:5:0;12512:10;12503:19;12495:28;;;;;;30750:8:::1;30746:130;;;30775:15;:28:::0;;;30746:130:::1;;;-1:-1:-1::0;30836:15:0::1;:28:::0;30656:227::o;22812:100::-;22869:42;22812:100;:::o;12434:20::-;;;-1:-1:-1;;;;;12434:20:0;;:::o;2718:127::-;2776:9;2806:6;;;:30;;-1:-1:-1;;2821:5:0;;;2835:1;2830;2821:5;2830:1;2816:15;;;;;:20;2806:30;2798:39;;;;;3629:122;3688:9;3484:6;3714:23;3718:9;3722:1;3725;3718:3;:9::i;:::-;3735:1;3484:6;3729:7;;3714:3;:23::i;:::-;:29;;;;;;;3629:122;-1:-1:-1;;;3629:122:0:o;10451:176::-;10533:86;10553:5;10583:23;;;10608:2;10612:5;10560:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;10560:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;10560:58:0;-1:-1:-1;;;;;;10560:58:0;;;;;;;;;;10533:19;:86::i;:::-;10451:176;;;:::o;25681:184::-;25762:21;:25;25758:100;;25804:42;;:10;;25824:21;25804:42;;;;;;;;;25824:21;25804:10;:42;;;;;;;;;;;;;;;;;;;;;25758:100;25681:184::o;3499:122::-;3558:9;3448:6;3584:23;3588:9;3592:1;3595;3588:3;:9::i;:::-;3605:1;3448:6;3599:7;;3887:120;3946:9;3998:1;3972:23;3976:11;3980:1;3484:6;3976:3;:11::i;:::-;3993:1;3989;:5;;2476:113;2569:5;;;2564:16;;;;2556:25;;;;;11920:419;12002:23;12028:69;12056:4;12028:69;;;;;;;;;;;;;;;;;12036:5;-1:-1:-1;;;;;12028:27:0;;;:69;;;;;:::i;:::-;12112:17;;12002:95;;-1:-1:-1;12112:21:0;12108:224;;12254:10;12243:30;;;;;;;;;;;;:::i;:::-;12235:85;;;;-1:-1:-1;;;12235:85:0;;;;;;;:::i;6840:196::-;6943:12;6975:53;6998:6;7006:4;7012:1;7015:12;7732;7765:18;7776:6;7765:10;:18::i;:::-;7757:60;;;;-1:-1:-1;;;7757:60:0;;;;;;;:::i;:::-;7891:12;7905:23;7932:6;-1:-1:-1;;;;;7932:11:0;7952:8;7963:4;7932:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7890:78;;;;7983:7;7979:595;;;8014:10;-1:-1:-1;8007:17:0;;-1:-1:-1;8007:17:0;7979:595;8128:17;;:21;8124:439;;8391:10;8385:17;8452:15;8439:10;8435:2;8431:19;8424:44;8339:148;8534:12;8527:20;;-1:-1:-1;;;8527:20:0;;;;;;;;:::i;5627:619::-;5687:4;6155:20;;5998:66;6195:23;;;;;;:42;;-1:-1:-1;;6222:15:0;;;5627:619;-1:-1:-1;;5627:619:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;72:20;;97:33;72:20;97:33;:::i;142:134::-;220:13;;238:33;220:13;238:33;:::i;414:128::-;489:13;;507:30;489:13;507:30;:::i;828:440::-;;929:3;922:4;914:6;910:17;906:27;896:2;;-1:-1;;937:12;896:2;984:6;971:20;31984:18;31976:6;31973:30;31970:2;;;-1:-1;;32006:12;31970:2;1006:64;32079:9;32060:17;;-1:-1;;32056:33;32147:4;32137:15;1006:64;:::i;:::-;997:73;;1090:6;1083:5;1076:21;1194:3;32147:4;1185:6;1118;1176:16;;1173:25;1170:2;;;1211:1;;1201:12;1170:2;36743:6;32147:4;1118:6;1114:17;32147:4;1152:5;1148:16;36720:30;36799:1;36781:16;;;32147:4;36781:16;36774:27;1152:5;889:379;-1:-1;;889:379::o;5134:1179::-;;5253:4;5241:9;5236:3;5232:19;5228:30;5225:2;;;-1:-1;;5261:12;5225:2;5289:20;5253:4;5289:20;:::i;:::-;5280:29;;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5369:75;;5513:2;5567:22;;72:20;97:33;72:20;97:33;:::i;:::-;5513:2;5528:16;;5521:75;5668:2;5722:22;;72:20;97:33;72:20;97:33;:::i;:::-;5701:49;5668:2;5687:5;5683:16;5676:75;;5813:2;5871:9;5867:22;6528:20;5813:2;5832:5;5828:16;5821:75;5964:3;6023:9;6019:22;6528:20;5964:3;5984:5;5980:16;5973:75;6141:3;6130:9;6126:19;6113:33;6166:18;6158:6;6155:30;6152:2;;;-1:-1;;6188:12;6152:2;6233:58;6287:3;6278:6;6267:9;6263:22;6233:58;:::i;:::-;6141:3;6219:5;6215:16;6208:84;;5219:1094;;;;:::o;6320:134::-;6398:13;;-1:-1;;;;;33683:46;;37898:35;;37888:2;;37947:1;;37937:12;6739:241;;6843:2;6831:9;6822:7;6818:23;6814:32;6811:2;;;-1:-1;;6849:12;6811:2;85:6;72:20;97:33;124:5;97:33;:::i;6987:263::-;;7102:2;7090:9;7081:7;7077:23;7073:32;7070:2;;;-1:-1;;7108:12;7070:2;226:6;220:13;238:33;265:5;238:33;:::i;7257:366::-;;;7378:2;7366:9;7357:7;7353:23;7349:32;7346:2;;;-1:-1;;7384:12;7346:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;7436:63;7536:2;7575:22;;;;6528:20;;-1:-1;;;7340:283::o;7630:257::-;;7742:2;7730:9;7721:7;7717:23;7713:32;7710:2;;;-1:-1;;7748:12;7710:2;495:6;489:13;507:30;531:5;507:30;:::i;7894:448::-;;;8038:9;8029:7;8025:23;8050:3;8025:23;8021:33;8018:2;;;-1:-1;;8057:12;8018:2;495:6;489:13;507:30;531:5;507:30;:::i;:::-;8109:71;-1:-1;1775:6;-1:-1;;1754:19;;1750:32;-1:-1;1747:2;;;-1:-1;;1785:12;1747:2;1813:22;1775:6;1813:22;:::i;:::-;1804:31;;8217:2;8298:9;8294:22;6398:13;6416:33;6443:5;6416:33;:::i;:::-;1896:86;;2080:60;2136:3;2112:22;;;2080:60;:::i;:::-;8217:2;2066:5;2062:16;2055:86;2248:60;2304:3;2280:22;8298:9;2280:22;2248:60;:::i;:::-;2112:22;2234:5;2230:16;2223:86;2416:60;2472:3;2448:22;8298:9;2448:22;2416:60;:::i;:::-;2280:22;2402:5;2398:16;2391:86;2573:60;2629:3;2605:22;8298:9;2605:22;2573:60;:::i;:::-;2448:22;2559:5;2555:16;2548:86;2762:22;8298:9;2762:22;6676:13;2605:22;2716:5;2712:16;2705:86;2894:57;2947:3;2923:22;8298:9;2923:22;2894:57;:::i;:::-;2762:22;2880:5;2876:16;2869:83;3059:57;3112:3;1775:6;8298:9;3088:22;3059:57;:::i;:::-;2923:22;3045:5;3041:16;3034:83;;8225:101;;;;8012:330;;;;;:::o;8349:241::-;;8453:2;8441:9;8432:7;8428:23;8424:32;8421:2;;;-1:-1;;8459:12;8421:2;-1:-1;616:20;;8415:175;-1:-1;8415:175::o;8597:263::-;;8712:2;8700:9;8691:7;8687:23;8683:32;8680:2;;;-1:-1;;8718:12;8680:2;-1:-1;764:13;;8674:186;-1:-1;8674:186::o;8867:439::-;;;9019:2;9007:9;8998:7;8994:23;8990:32;8987:2;;;-1:-1;;9025:12;8987:2;1380:6;1374:13;1392:53;1439:5;1392:53;:::i;:::-;9208:2;9258:22;;;;6676:13;9077:94;;6676:13;;-1:-1;;;8981:325::o;9313:513::-;;;;9462:2;9450:9;9441:7;9437:23;9433:32;9430:2;;;-1:-1;;9468:12;9430:2;1548:6;1535:20;37807:1;37800:5;37797:12;37787:2;;-1:-1;;37813:12;37787:2;9520:74;9631:2;9670:22;;6528:20;;-1:-1;9739:2;9778:22;;;6528:20;;9424:402;-1:-1;;;9424:402::o;9833:763::-;;;;;10018:3;10006:9;9997:7;9993:23;9989:33;9986:2;;;-1:-1;;10025:12;9986:2;10083:17;10070:31;10121:18;;10113:6;10110:30;10107:2;;;-1:-1;;10143:12;10107:2;10239:6;10228:9;10224:22;;;3306:6;;3294:9;3289:3;3285:19;3281:32;3278:2;;;-1:-1;;3316:12;3278:2;3344:22;3306:6;3344:22;:::i;:::-;3335:31;;3451:49;3496:3;3472:22;3451:49;:::i;:::-;3433:16;3426:75;3599:49;3644:3;3566:2;3624:9;3620:22;3599:49;:::i;:::-;3566:2;3585:5;3581:16;3574:75;3715:2;3773:9;3769:22;6528:20;3715:2;3734:5;3730:16;3723:75;3865:2;3923:9;3919:22;6528:20;3865:2;3884:5;3880:16;3873:75;10018:3;4072:9;4068:22;6528:20;10018:3;4033:5;4029:16;4022:75;4167:3;4226:9;4222:22;6528:20;4167:3;4187:5;4183:16;4176:75;4346:49;4391:3;4312;4371:9;4367:22;4346:49;:::i;:::-;4312:3;4332:5;4328:16;4321:75;4494:49;4539:3;4460;4519:9;4515:22;4494:49;:::i;:::-;4460:3;4480:5;4476:16;4469:75;4640:3;;4629:9;4625:19;4612:33;10121:18;4657:6;4654:30;4651:2;;;-1:-1;;4687:12;4651:2;4734:58;4788:3;4779:6;4768:9;4764:22;4734:58;:::i;:::-;4640:3;4718:5;4714:18;4707:86;;;4890:3;;4879:9;4875:19;4862:33;10121:18;4907:6;4904:30;4901:2;;;-1:-1;;4937:12;4901:2;4984:79;5059:3;5050:6;5039:9;5035:22;4984:79;:::i;:::-;4890:3;4968:5;4964:18;4957:107;;;10163:93;;;;;;3566:2;10336:9;10332:22;6528:20;10301:63;;3715:2;10444:9;10440:22;6528:20;10409:63;;10527:53;10572:7;3865:2;10552:9;10548:22;10527:53;:::i;:::-;10517:63;;9980:616;;;;;;;:::o;11121:360::-;;;11239:2;11227:9;11218:7;11214:23;11210:32;11207:2;;;-1:-1;;11245:12;11207:2;6541:6;6528:20;11297:63;;11397:2;11437:9;11433:22;347:20;372:30;396:5;372:30;:::i;:::-;11405:60;;;;11201:280;;;;;:::o;11488:366::-;;;11609:2;11597:9;11588:7;11584:23;11580:32;11577:2;;;-1:-1;;11615:12;11577:2;-1:-1;;6528:20;;;11767:2;11806:22;;;616:20;;-1:-1;11571:283::o;12234:399::-;;;12366:2;12354:9;12345:7;12341:23;12337:32;12334:2;;;-1:-1;;12372:12;12334:2;-1:-1;;6676:13;;12535:2;12585:22;;;6676:13;;;;;-1:-1;12328:305::o;12640:809::-;;;;;;12823:3;12811:9;12802:7;12798:23;12794:33;12791:2;;;-1:-1;;12830:12;12791:2;-1:-1;;6676:13;;12993:2;13043:22;;6676:13;13112:2;13162:22;;6676:13;13231:2;13281:22;;6676:13;13350:3;13401:22;;;6676:13;;;;;-1:-1;6676:13;;-1:-1;6676:13;;-1:-1;12785:664;-1:-1;12785:664::o;13605:103::-;-1:-1;;;;;33803:54;13666:37;;13660:48::o;14183:323::-;;14315:5;32256:12;32531:6;32526:3;32519:19;14398:52;14443:6;32568:4;32563:3;32559:14;32568:4;14424:5;14420:16;14398:52;:::i;:::-;32079:9;37160:14;-1:-1;;37156:28;14462:39;;;;32568:4;14462:39;;14263:243;-1:-1;;14263:243::o;16441:138::-;34019:4;34008:16;16518:56;;16512:67::o;20794:1219::-;;31984:18;;33814:42;;;;21020:16;21014:23;33803:54;13673:3;13666:37;33814:42;21193:4;21186:5;21182:16;21176:23;33803:54;21193:4;21257:3;21253:14;13666:37;33814:42;21358:4;21351:5;21347:16;21341:23;33803:54;21358:4;21422:3;21418:14;13666:37;;21513:4;21506:5;21502:16;21496:23;21513:4;21577:3;21573:14;14017:37;21674:4;21667:5;21663:16;21657:23;21674:4;21738:3;21734:14;14017:37;21832:4;21825:5;21821:16;21815:23;20945:4;21832;21862:3;21858:14;21851:38;21904:71;20945:4;20940:3;20936:14;21956:12;21904:71;:::i;22250:271::-;;15023:5;32256:12;15134:52;15179:6;15174:3;15167:4;15160:5;15156:16;15134:52;:::i;:::-;15198:16;;;;;22384:137;-1:-1;;22384:137::o;22528:222::-;-1:-1;;;;;33803:54;;;;13666:37;;22655:2;22640:18;;22626:124::o;23002:528::-;-1:-1;;;;;33803:54;;;13666:37;;33803:54;;23367:2;23352:18;;13666:37;23203:2;23404;23389:18;;23382:48;;;23002:528;;23444:76;;23188:18;;23506:6;23444:76;:::i;:::-;23436:84;23174:356;-1:-1;;;;;23174:356::o;23537:834::-;-1:-1;;;;;33803:54;;;13666:37;;33803:54;;24004:2;23989:18;;13666:37;23839:3;24041:2;24026:18;;24019:48;;;17165:2;23824:19;;;32519;-1:-1;;;33814:42;32559:14;;17181:40;17240:12;24245:2;24230:18;;24223:48;;;23537:834;;24285:76;;17240:12;;24347:6;24285:76;:::i;24378:834::-;-1:-1;;;;;33803:54;;;13666:37;;33803:54;;24845:2;24830:18;;13666:37;24680:3;24882:2;24867:18;;24860:48;;;17491:2;24665:19;;;32519;-1:-1;;;33814:42;32559:14;;17507:40;17566:12;25086:2;25071:18;;25064:48;;;24378:834;;25126:76;;17566:12;;25188:6;25126:76;:::i;25219:333::-;-1:-1;;;;;33803:54;;;;13666:37;;25538:2;25523:18;;14017:37;25374:2;25359:18;;25345:207::o;25559:321::-;33247:13;;33240:21;13900:34;;25866:2;25851:18;;14017:37;25708:2;25693:18;;25679:201::o;25887:222::-;14017:37;;;26014:2;25999:18;;25985:124::o;26116:333::-;14017:37;;;-1:-1;;;;;33803:54;26435:2;26420:18;;13666:37;26271:2;26256:18;;26242:207::o;26456:218::-;-1:-1;;;;;;33413:78;;;;14135:36;;26581:2;26566:18;;26552:122::o;28568:310::-;;28715:2;28736:17;28729:47;28790:78;28715:2;28704:9;28700:18;28854:6;28790:78;:::i;28885:416::-;29085:2;29099:47;;;17817:2;29070:18;;;32519:19;17853:31;32559:14;;;17833:52;17904:12;;;29056:245::o;29308:416::-;29508:2;29522:47;;;18155:2;29493:18;;;32519:19;-1:-1;;;32559:14;;;18171:35;18225:12;;;29479:245::o;29731:416::-;29931:2;29945:47;;;18476:2;29916:18;;;32519:19;18512:34;32559:14;;;18492:55;-1:-1;;;18567:12;;;18560:34;18613:12;;;29902:245::o;30154:848::-;;30459:3;30481:17;30474:47;18981:63;30459:3;30448:9;30444:19;18958:16;18952:23;18981:63;:::i;:::-;19127:4;19120:5;19116:16;19110:23;19139:63;19187:14;30448:9;19187:14;19173:12;19139:63;:::i;:::-;;19286:4;19279:5;19275:16;19269:23;19346:14;30448:9;19346:14;14017:37;19446:4;19439:5;19435:16;19429:23;19506:14;19429:23;19506:14;30448:9;19506:14;14017:37;19604:4;19597:5;19593:16;19587:23;;;19664:14;19587:23;19664:14;30448:9;19664:14;14017:37;30459:3;19760:5;19756:16;19750:23;;;18881:6;19750:23;18881:6;30448:9;19827:14;14017:37;19187:14;19914:5;19910:16;19904:23;19884:43;;19933:63;19981:14;30448:9;19981:14;19967:12;19933:63;:::i;:::-;19346:14;20071:5;20067:16;20061:23;20041:43;;20090:63;20138:14;30448:9;20138:14;20124:12;20090:63;:::i;:::-;19506:14;20232:5;20228:18;20222:25;20202:45;;18881:6;20267:16;30448:9;20267:16;20260:40;;20315:71;18872:16;30448:9;18872:16;20367:12;20315:71;:::i;:::-;20468:18;;;20462:25;20525:14;;;-1:-1;;20525:14;20507:16;;;20500:40;20307:79;;-1:-1;20462:25;-1:-1;20555:113;20307:79;20462:25;20555:113;:::i;:::-;30527:126;;;;14047:5;19127:4;30721:9;30717:18;14017:37;14047:5;19286:4;30804:9;30800:18;14017:37;30830:72;19446:4;30887:9;30883:18;30874:6;30830:72;:::i;:::-;30913:79;19604:4;30976:9;30972:19;30963:6;30913:79;:::i;:::-;30430:572;;;;;;;;:::o;31238:333::-;14017:37;;;31557:2;31542:18;;14017:37;31393:2;31378:18;;31364:207::o;31578:256::-;31640:2;31634:9;31666:17;;;31741:18;31726:34;;31762:22;;;31723:62;31720:2;;;31798:1;;31788:12;31720:2;31640;31807:22;31618:216;;-1:-1;31618:216::o;36816:268::-;36881:1;36888:101;36902:6;36899:1;36896:13;36888:101;;;36969:11;;;36963:18;36950:11;;;36943:39;36924:2;36917:10;36888:101;;;37004:6;37001:1;36998:13;36995:2;;;36881:1;37060:6;37055:3;37051:16;37044:27;36995:2;;36865:219;;;:::o;37197:117::-;-1:-1;;;;;33803:54;;37256:35;;37246:2;;37305:1;;37295:12;37321:111;37402:5;33247:13;33240:21;37380:5;37377:32;37367:2;;37423:1;;37413:12;37839:117;-1:-1;;;;;37926:5;33683:46;37901:5;37898:35;37888:2;;37947:1;;37937:12
Swarm Source
ipfs://2f1e4edc0d6fa5b853387d6a2f8be8710466783219e288b481dadb9bcc2059a6
Loading...
Loading
Loading...
Loading
OVERVIEW
Contract of DeFi Saver's MCD Monitor V2Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.