Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 3,754 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Boost For | 13861318 | 1146 days ago | IN | 0 ETH | 0.04943064 | ||||
Repay For | 13860218 | 1146 days ago | IN | 0 ETH | 0.06614631 | ||||
Boost For | 13860006 | 1146 days ago | IN | 0 ETH | 0.0603018 | ||||
Boost For | 13859201 | 1147 days ago | IN | 0 ETH | 0.07128523 | ||||
Boost For | 13858653 | 1147 days ago | IN | 0 ETH | 0.10994751 | ||||
Boost For | 13858416 | 1147 days ago | IN | 0 ETH | 0.08425096 | ||||
Boost For | 13858303 | 1147 days ago | IN | 0 ETH | 0.10339916 | ||||
Boost For | 13857862 | 1147 days ago | IN | 0 ETH | 0.08038017 | ||||
Repay For | 13855705 | 1147 days ago | IN | 0 ETH | 0.0663462 | ||||
Boost For | 13854343 | 1147 days ago | IN | 0 ETH | 0.05027614 | ||||
Boost For | 13854343 | 1147 days ago | IN | 0 ETH | 0.04967306 | ||||
Boost For | 13854343 | 1147 days ago | IN | 0 ETH | 0.04978562 | ||||
Boost For | 13854020 | 1147 days ago | IN | 0 ETH | 0.04355111 | ||||
Boost For | 13854006 | 1147 days ago | IN | 0 ETH | 0.04510717 | ||||
Boost For | 13854005 | 1147 days ago | IN | 0 ETH | 0.05805952 | ||||
Boost For | 13853940 | 1147 days ago | IN | 0 ETH | 0.03326716 | ||||
Boost For | 13853609 | 1147 days ago | IN | 0 ETH | 0.03499717 | ||||
Boost For | 13853532 | 1147 days ago | IN | 0 ETH | 0.05240243 | ||||
Boost For | 13853526 | 1147 days ago | IN | 0 ETH | 0.04033695 | ||||
Boost For | 13853526 | 1147 days ago | IN | 0 ETH | 0.04044139 | ||||
Boost For | 13853526 | 1147 days ago | IN | 0 ETH | 0.04079691 | ||||
Boost For | 13853525 | 1147 days ago | IN | 0 ETH | 0.07801187 | ||||
Repay For | 13850586 | 1148 days ago | IN | 0 ETH | 0.06491 | ||||
Repay For | 13850548 | 1148 days ago | IN | 0 ETH | 0.09644769 | ||||
Repay For | 13850283 | 1148 days ago | IN | 0 ETH | 0.05029112 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
MCDMonitorV2
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-14 */ 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 = 0xBc841B0dE0b93205e912CFBBd1D0c160A1ec6F00; 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); } } 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, StaticV2 { uint256 public MAX_GAS_PRICE = 800 gwei; // 800 gwei uint256 public REPAY_GAS_COST = 1_000_000; uint256 public BOOST_GAS_COST = 1_000_000; bytes4 public REPAY_SELECTOR = 0xf360ce20; // repayWithLoan(...) bytes4 public BOOST_SELECTOR = 0x8ec2ae25; // boostWithLoan(...) MCDMonitorProxyV2 public monitorProxyContract = MCDMonitorProxyV2(0x1816A86C4DA59395522a42b871bf11A4E96A1C7a); ISubscriptionsV2 public subscriptionsContract = ISubscriptionsV2(0xC45d4f6B6bf41b6EdAA58B01c4298B8d9078269a); 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 _newMcdSaverTakerAddress ) public { mcdSaverTakerAddress = _newMcdSaverTakerAddress; } /// @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, uint256 _cdpId, uint256 _nextPrice, address _joinAddr ) public payable onlyApproved { bool isAllowed; uint256 ratioBefore; string memory errReason; (isAllowed, ratioBefore, errReason) = checkPreconditions( Method.Repay, _cdpId, _nextPrice ); require(isAllowed, errReason); uint256 gasCost = calcGasCost(REPAY_GAS_COST); address usersProxy = subscriptionsContract.getOwner(_cdpId); monitorProxyContract.callExecute{value: msg.value}( usersProxy, mcdSaverTakerAddress, abi.encodeWithSelector(REPAY_SELECTOR, _exchangeData, _cdpId, gasCost, _joinAddr, 0) ); bool isGoodRatio; uint256 ratioAfter; (isGoodRatio, ratioAfter, errReason) = ratioGoodAfter( Method.Repay, _cdpId, _nextPrice, ratioBefore ); require(isGoodRatio, errReason); returnEth(); logger.Log( address(this), usersProxy, "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, uint256 _cdpId, uint256 _nextPrice, address _joinAddr ) public payable onlyApproved { bool isAllowed; uint256 ratioBefore; string memory errReason; (isAllowed, ratioBefore, errReason) = checkPreconditions( Method.Boost, _cdpId, _nextPrice ); require(isAllowed, errReason); uint256 gasCost = calcGasCost(BOOST_GAS_COST); address usersProxy = subscriptionsContract.getOwner(_cdpId); monitorProxyContract.callExecute{value: msg.value}( usersProxy, mcdSaverTakerAddress, abi.encodeWithSelector(BOOST_SELECTOR, _exchangeData, _cdpId, gasCost, _joinAddr, 0) ); bool isGoodRatio; uint256 ratioAfter; (isGoodRatio, ratioAfter, errReason) = ratioGoodAfter( Method.Boost, _cdpId, _nextPrice, ratioBefore ); require(isGoodRatio, errReason); returnEth(); logger.Log( address(this), usersProxy, "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(uint256 _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(uint256 _cdpId, bytes32 _ilk) public view returns (uint256, uint256) { address urn = manager.urns(_cdpId); (uint256 collateral, uint256 debt) = vat.urns(_ilk, urn); (, uint256 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 (uint256) { (, uint256 mat) = spotter.ilks(_ilk); (, , uint256 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(uint256 _cdpId, uint256 _nextPrice) public view returns (uint256) { bytes32 ilk = manager.ilks(_cdpId); uint256 price = (_nextPrice == 0) ? getPrice(ilk) : _nextPrice; (uint256 collateral, uint256 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 checkPreconditions( Method _method, uint256 _cdpId, uint256 _nextPrice ) public view returns ( bool, uint256, string memory ) { (bool subscribed, CdpHolder memory holder) = subscriptionsContract.getCdpHolder(_cdpId); // check if cdp is subscribed if (!subscribed) return (false, 0, "Cdp not sub"); // check if using next price is allowed if (_nextPrice > 0 && !holder.nextPriceEnabled) return (false, 0, "Next price send but not enabled"); // check if boost and boost allowed if (_method == Method.Boost && !holder.boostEnabled) return (false, 0, "Boost not enabled"); // check if owner is still owner if (getOwner(_cdpId) != holder.owner) return (false, 0, "EOA not subbed owner"); uint256 currRatio = getRatio(_cdpId, _nextPrice); if (_method == Method.Repay) { if (currRatio > holder.minRatio) return (false, 0, "Ratio is bigger than min"); } else if (_method == Method.Boost) { if (currRatio < holder.maxRatio) return (false, 0, "Ratio is less than max"); } return (true, currRatio, ""); } /// @dev After the Boost/Repay check if the ratio doesn't trigger another call function ratioGoodAfter( Method _method, uint256 _cdpId, uint256 _nextPrice, uint256 _beforeRatio ) public view returns ( bool, uint256, string memory ) { (, CdpHolder memory holder) = subscriptionsContract.getCdpHolder(_cdpId); uint256 currRatio = getRatio(_cdpId, _nextPrice); if (_method == Method.Repay) { if (currRatio >= holder.maxRatio) return (false, currRatio, "Repay increased ratio over max"); if (currRatio <= _beforeRatio) return (false, currRatio, "Repay made ratio worse"); } else if (_method == Method.Boost) { if (currRatio <= holder.minRatio) return (false, currRatio, "Boost lowered ratio over min"); if (currRatio >= _beforeRatio) return (false, currRatio, "Boost didn't lower ratio"); } return (true, 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(uint256 _gasAmount) public view returns (uint256) { uint256 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(uint256 _gasCost) public onlyOwner { require(_gasCost < 3_000_000, "Boost gas cost over limit"); 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(uint256 _gasCost) public onlyOwner { require(_gasCost < 3_000_000, "Repay gas cost over limit"); REPAY_GAS_COST = _gasCost; } /// @notice Allows owner to change max gas price /// @param _maxGasPrice New max gas price function changeMaxGasPrice(uint256 _maxGasPrice) public onlyOwner { require(_maxGasPrice < 2000 gwei, "Max gas price over the limit"); MAX_GAS_PRICE = _maxGasPrice; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_newMcdSaverTakerAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BOOST_GAS_COST","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_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":"uint256","name":"_gasCost","type":"uint256"}],"name":"changeBoostGasCost","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":[{"internalType":"enum StaticV2.Method","name":"_method","type":"uint8"},{"internalType":"uint256","name":"_cdpId","type":"uint256"},{"internalType":"uint256","name":"_nextPrice","type":"uint256"}],"name":"checkPreconditions","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"string","name":"","type":"string"}],"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"},{"internalType":"uint256","name":"_beforeRatio","type":"uint256"}],"name":"ratioGoodAfter","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"string","name":"","type":"string"}],"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
608060405264ba43b74000600255620f424060038190556004556005805463f360ce2063ffffffff199091161763ffffffff60201b1916678ec2ae250000000017600160401b600160e01b0319167b1816a86c4da59395522a42b871bf11a4e96a1c7a00000000000000001790556006805473c45d4f6b6bf41b6edaa58b01c4298b8d9078269a6001600160a01b03199182161790915560088054735ef30b9986345249bc32d8928b7ee64de9435e39908316179055600980547335d1b3f3d7966a1dfe207aa4514c12a259a0492b908316179055600a80547365c79fcb50ca1594b025960e539ed7a9a6d434a392169190911790553480156200010257600080fd5b50604051620028333803806200283383398101604081905262000125916200018c565b600080546001600160a01b031990811673bc841b0de0b93205e912cfbbd1d0c160a1ec6f00179091556001805482167325efa336886c74ea8e282ac466bdcd0199f85bb9179055600780546001600160a01b039390931692909116919091179055620001bc565b6000602082840312156200019e578081fd5b81516001600160a01b0381168114620001b5578182fd5b9392505050565b61266780620001cc6000396000f3fe6080604052600436106101ee5760003560e01c80635ea2a6091161010d578063b6d5a156116100a0578063cff700011161006f578063cff700011461050e578063deca5f881461052e578063e3bbb4f11461054e578063f24ccbfe14610563578063f851a44014610578576101ee565b8063b6d5a15614610496578063c41a360a146104ab578063c42498ea146104cb578063cf66a6bc146104f9576101ee565b8063a564056c116100dc578063a564056c1461042e578063a7304bf714610441578063a8c9032314610461578063b2f9e47f14610481576101ee565b80635ea2a609146103dc5780637016722c146103f157806379521f02146104045780638da5cb5b14610419576101ee565b80633816377e11610185578063481c6a7511610154578063481c6a75146103705780634d3f199e14610385578063526d6461146103a557806358346f4b146103ba576101ee565b80633816377e146102fb5780633a1283221461031b57806341c0e1b51461033b57806342e7c83014610350576101ee565b80632e77468d116101c15780632e77468d1461028f57806331d98b3f146102b157806336569e77146102d157806336fc603f146102e6576101ee565b8063065b80bf146101f357806318bf60e11461022b5780631e48907b1461024d5780632a56f6021461026f575b600080fd5b3480156101ff57600080fd5b5061021361020e366004611f25565b61058d565b604051610222939291906122fe565b60405180910390f35b34801561023757600080fd5b50610240610882565b604051610222919061231f565b34801561025957600080fd5b5061026d610268366004611d7a565b610888565b005b34801561027b57600080fd5b5061024061028a366004611ec8565b6108c1565b34801561029b57600080fd5b506102a46108eb565b60405161022291906121f2565b3480156102bd57600080fd5b506102406102cc366004611ec8565b6108fa565b3480156102dd57600080fd5b506102a4610aa9565b3480156102f257600080fd5b50610240610ab8565b34801561030757600080fd5b5061026d610316366004611ec8565b610abe565b34801561032757600080fd5b5061026d610336366004611db2565b610b08565b34801561034757600080fd5b5061026d610ba1565b34801561035c57600080fd5b5061021361036b366004611f58565b610bc6565b34801561037c57600080fd5b506102a4610dfa565b34801561039157600080fd5b5061026d6103a0366004611ec8565b610e09565b3480156103b157600080fd5b506102a4610e47565b3480156103c657600080fd5b506103cf610e5f565b604051610222919061233f565b3480156103e857600080fd5b506102a4610e68565b61026d6103ff366004611f91565b610e83565b34801561041057600080fd5b506102a46111b5565b34801561042557600080fd5b506102a46111c4565b61026d61043c366004611f91565b6111d3565b34801561044d57600080fd5b5061026d61045c366004611d7a565b6114c6565b34801561046d57600080fd5b5061026d61047c366004611ec8565b6114ff565b34801561048d57600080fd5b506103cf61153d565b3480156104a257600080fd5b506102a461154e565b3480156104b757600080fd5b506102a46104c6366004611ec8565b611566565b3480156104d757600080fd5b506104eb6104e63660046120be565b6115ed565b6040516102229291906125a9565b34801561050557600080fd5b506102a46117a2565b34801561051a57600080fd5b506102406105293660046120be565b6117b1565b34801561053a57600080fd5b5061026d610549366004611d7a565b6118a7565b34801561055a57600080fd5b506102406118d4565b34801561056f57600080fd5b506102a46118da565b34801561058457600080fd5b506102a46118f2565b6000806060600061059c611be9565b600654604051631da1542f60e01b81526001600160a01b0390911690631da1542f906105cc908a9060040161231f565b6101206040518083038186803b1580156105e557600080fd5b505afa1580156105f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061061d9190611df9565b915091508161065a576000806040518060400160405280600b81526020016a21b238103737ba1039bab160a91b8152509450945094505050610879565b60008611801561066c57508060e00151155b156106b7576000806040518060400160405280601f81526020017f4e6578742070726963652073656e6420627574206e6f7420656e61626c6564008152509450945094505050610879565b60008860018111156106c557fe5b1480156106d457508060c00151155b156107135760008060405180604001604052806011815260200170109bdbdcdd081b9bdd08195b98589b1959607a1b8152509450945094505050610879565b80608001516001600160a01b031661072a88611566565b6001600160a01b031614610775576000806040518060400160405280601481526020017322a7a0903737ba1039bab13132b21037bbb732b960611b8152509450945094505050610879565b600061078188886117b1565b9050600189600181111561079157fe5b14156107f55781516001600160801b03168111156107f0576000806040518060400160405280601881526020017f526174696f20697320626967676572207468616e206d696e0000000000000000815250955095509550505050610879565b61085e565b600089600181111561080357fe5b141561085e5781602001516001600160801b031681101561085e57600080604051806040016040528060168152602001750a4c2e8d2de40d2e640d8cae6e640e8d0c2dc40dac2f60531b815250955095509550505050610879565b60408051602081019091526000815260019650909450925050505b93509350939050565b60045481565b6001546001600160a01b0316331461089f57600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806002543a11156108d6576002546108d8565b3a5b90506108e48184611901565b9392505050565b600a546001600160a01b031681565b600a54604051636cb1c69b60e11b815260009182916001600160a01b039091169063d9638d369061092f90869060040161231f565b604080518083038186803b15801561094657600080fd5b505afa15801561095a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097e9190611ef8565b600954604051636cb1c69b60e11b8152919350600092506001600160a01b03169063d9638d36906109b390879060040161231f565b60a06040518083038186803b1580156109cb57600080fd5b505afa1580156109df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a039190612102565b505092505050610aa1610a9b82600a60009054906101000a90046001600160a01b03166001600160a01b031663495d32cb6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a5e57600080fd5b505afa158015610a72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a969190611ee0565b611925565b83611925565b949350505050565b6009546001600160a01b031681565b60035481565b6000546001600160a01b03163314610ad557600080fd5b6501d1a94a20008110610b035760405162461bcd60e51b8152600401610afa906123d5565b60405180910390fd5b600255565b6000546001600160a01b03163314610b1f57600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0383161415610b8357600080546040516001600160a01b039091169183156108fc02918491818181858888f19350505050158015610b7d573d6000803e3d6000fd5b50610b9d565b600054610b9d906001600160a01b03848116911683611966565b5050565b6000546001600160a01b03163314610bb857600080fd5b6000546001600160a01b0316ff5b6000806060610bd3611be9565b600654604051631da1542f60e01b81526001600160a01b0390911690631da1542f90610c03908a9060040161231f565b6101206040518083038186803b158015610c1c57600080fd5b505afa158015610c30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c549190611df9565b9150506000610c6388886117b1565b90506001896001811115610c7357fe5b1415610d1e5781602001516001600160801b03168110610cd3576000816040518060400160405280601e81526020017f526570617920696e6372656173656420726174696f206f766572206d617800008152509450945094505050610df0565b858111610d1957600081604051806040016040528060168152602001755265706179206d61646520726174696f20776f72736560501b8152509450945094505050610df0565b610dd6565b6000896001811115610d2c57fe5b1415610dd65781516001600160801b03168111610d89576000816040518060400160405280601c81526020017f426f6f7374206c6f776572656420726174696f206f766572206d696e000000008152509450945094505050610df0565b858110610dd6576000816040518060400160405280601881526020017f426f6f7374206469646e2774206c6f77657220726174696f00000000000000008152509450945094505050610df0565b604080516020810190915260008152600195509093509150505b9450945094915050565b6008546001600160a01b031681565b6000546001600160a01b03163314610e2057600080fd5b622dc6c08110610e425760405162461bcd60e51b8152600401610afa90612367565b600355565b73637726f8b08a7abe3ae3acab01a80e2d8ddef77b81565b60055460e01b81565b6005546801000000000000000090046001600160a01b031681565b6040516320eb73ed60e11b815273637726f8b08a7abe3ae3acab01a80e2d8ddef77b906341d6e7da90610eba9033906004016121f2565b60206040518083038186803b158015610ed257600080fd5b505afa158015610ee6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0a9190611ddd565b610f265760405162461bcd60e51b8152600401610afa90612443565b6000806060610f376001878761058d565b919450925090508083610f5d5760405162461bcd60e51b8152600401610afa9190612354565b506000610f6b6003546108c1565b60065460405163620d1b0560e11b81529192506000916001600160a01b039091169063c41a360a90610fa1908b9060040161231f565b60206040518083038186803b158015610fb957600080fd5b505afa158015610fcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff19190611d96565b9050600560089054906101000a90046001600160a01b03166001600160a01b0316638a0e833f3483600760009054906101000a90046001600160a01b0316600560009054906101000a900460e01b8e8e898e60006040516024016110599594939291906124b3565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e087901b90921682526110a0939291600401612206565b6000604051808303818588803b1580156110b957600080fd5b505af11580156110cd573d6000803e3d6000fd5b50505050506000806110e260018b8b89610bc6565b9650909250905084826111085760405162461bcd60e51b8152600401610afa9190612354565b506111116119c1565b735c55b921f590a89c1ebe84df170e655a82b621266001600160a01b031663d061ce50308589856040516020016111499291906125a9565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016111769392919061223b565b600060405180830381600087803b15801561119057600080fd5b505af11580156111a4573d6000803e3d6000fd5b505050505050505050505050505050565b6006546001600160a01b031681565b6000546001600160a01b031681565b6040516320eb73ed60e11b815273637726f8b08a7abe3ae3acab01a80e2d8ddef77b906341d6e7da9061120a9033906004016121f2565b60206040518083038186803b15801561122257600080fd5b505afa158015611236573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125a9190611ddd565b6112765760405162461bcd60e51b8152600401610afa90612443565b60008060606112876000878761058d565b9194509250905080836112ad5760405162461bcd60e51b8152600401610afa9190612354565b5060006112bb6004546108c1565b60065460405163620d1b0560e11b81529192506000916001600160a01b039091169063c41a360a906112f1908b9060040161231f565b60206040518083038186803b15801561130957600080fd5b505afa15801561131d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113419190611d96565b9050600560089054906101000a90046001600160a01b03166001600160a01b0316638a0e833f3483600760009054906101000a90046001600160a01b0316600560049054906101000a900460e01b8e8e898e60006040516024016113a99594939291906124b3565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e087901b90921682526113f0939291600401612206565b6000604051808303818588803b15801561140957600080fd5b505af115801561141d573d6000803e3d6000fd5b505050505060008061143260008b8b89610bc6565b9650909250905084826114585760405162461bcd60e51b8152600401610afa9190612354565b506114616119c1565b735c55b921f590a89c1ebe84df170e655a82b621266001600160a01b031663d061ce50308589856040516020016114999291906125a9565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161117693929190612290565b6001546001600160a01b031633146114dd57600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461151657600080fd5b622dc6c081106115385760405162461bcd60e51b8152600401610afa9061239e565b600455565b600554640100000000900460e01b81565b735a4f877ca808cca3cb7c2a194f80ab8588fae26b81565b60085460405163040b0d8960e51b81526000916001600160a01b031690638161b1209061159790859060040161231f565b60206040518083038186803b1580156115af57600080fd5b505afa1580156115c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e79190611d96565b92915050565b600854604051632726b07360e01b8152600091829182916001600160a01b031690632726b0739061162290889060040161231f565b60206040518083038186803b15801561163a57600080fd5b505afa15801561164e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116729190611d96565b6009546040516309092f9760e21b815291925060009182916001600160a01b031690632424be5c906116aa9089908790600401612328565b604080518083038186803b1580156116c157600080fd5b505afa1580156116d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f991906120df565b600954604051636cb1c69b60e11b81529294509092506000916001600160a01b039091169063d9638d3690611732908a9060040161231f565b60a06040518083038186803b15801561174a57600080fd5b505afa15801561175e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117829190612102565b505050915050826117938383611925565b95509550505050509250929050565b6007546001600160a01b031681565b600854604051632c2cb9fd60e01b815260009182916001600160a01b0390911690632c2cb9fd906117e690879060040161231f565b60206040518083038186803b1580156117fe57600080fd5b505afa158015611812573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118369190611ee0565b905060008315611846578361184f565b61184f826108fa565b905060008061185e87856115ed565b9150915080600014156118785760009450505050506115e7565b670de0b6b3a764000061189461188e84866119f7565b83611a1f565b8161189b57fe5b04979650505050505050565b6000546001600160a01b031633146118be57600080fd5b6001546001600160a01b0316156114dd57600080fd5b60025481565b735c55b921f590a89c1ebe84df170e655a82b6212681565b6001546001600160a01b031681565b600081158061191c5750508082028282828161191957fe5b04145b6115e757600080fd5b60006b033b2e3c9fd0803ce80000006119576119418585611901565b60026b033b2e3c9fd0803ce80000005b04611a43565b8161195e57fe5b049392505050565b6119bc8363a9059cbb60e01b84846040516024016119859291906122e5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611a53565b505050565b47156119f55760405133904780156108fc02916000818181858888f193505050501580156119f3573d6000803e3d6000fd5b505b565b6000670de0b6b3a7640000611957611a0f8585611901565b6002670de0b6b3a7640000611951565b600081611957611a3b856b033b2e3c9fd0803ce8000000611901565b600285611951565b808201828110156115e757600080fd5b6060611aa8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ae29092919063ffffffff16565b8051909150156119bc5780806020019051810190611ac69190611ddd565b6119bc5760405162461bcd60e51b8152600401610afa90612469565b6060610aa184846000856060611af785611bb0565b611b135760405162461bcd60e51b8152600401610afa9061240c565b60006060866001600160a01b03168587604051611b3091906121d6565b60006040518083038185875af1925050503d8060008114611b6d576040519150601f19603f3d011682016040523d82523d6000602084013e611b72565b606091505b50915091508115611b86579150610aa19050565b805115611b965780518082602001fd5b8360405162461bcd60e51b8152600401610afa9190612354565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610aa1575050151592915050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b80356115e78161260e565b80516115e78161260e565b805180151581146115e757600080fd5b600082601f830112611c63578081fd5b813567ffffffffffffffff811115611c79578182fd5b611c8c601f8201601f19166020016125b7565b9150808252836020828501011115611ca357600080fd5b8060208401602084013760009082016020015292915050565b8035600281106115e757600080fd5b600060c08284031215611cdc578081fd5b611ce660c06125b7565b90508135611cf38161260e565b81526020820135611d038161260e565b60208201526040820135611d168161260e565b80604083015250606082013560608201526080820135608082015260a082013567ffffffffffffffff811115611d4b57600080fd5b611d5784828501611c53565b60a08301525092915050565b80516001600160801b03811681146115e757600080fd5b600060208284031215611d8b578081fd5b81356108e48161260e565b600060208284031215611da7578081fd5b81516108e48161260e565b60008060408385031215611dc4578081fd5b8235611dcf8161260e565b946020939093013593505050565b600060208284031215611dee578081fd5b81516108e481612623565b600080828403610120811215611e0d578283fd5b8351611e1881612623565b9250610100601f198201811315611e2d578283fd5b611e36816125b7565b9150611e458660208701611d63565b8252611e548660408701611d63565b6020830152611e668660608701611d63565b6040830152611e788660808701611d63565b6060830152611e8a8660a08701611c38565b608083015260c085015160a0830152611ea68660e08701611c43565b60c0830152611eb786828701611c43565b60e083015250809150509250929050565b600060208284031215611ed9578081fd5b5035919050565b600060208284031215611ef1578081fd5b5051919050565b60008060408385031215611f0a578182fd5b8251611f158161260e565b6020939093015192949293505050565b600080600060608486031215611f39578081fd5b611f438585611cbc565b95602085013595506040909401359392505050565b60008060008060808587031215611f6d578182fd5b611f778686611cbc565b966020860135965060408601359560600135945092505050565b60008060008060808587031215611fa6578182fd5b843567ffffffffffffffff80821115611fbd578384fd5b818701915061014080838a031215611fd3578485fd5b611fdc816125b7565b9050611fe88984611c2d565b8152611ff78960208501611c2d565b602082015260408301356040820152606083013560608201526080830135608082015260a083013560a08201526120318960c08501611c2d565b60c08201526120438960e08501611c2d565b60e0820152610100808401358381111561205b578687fd5b6120678b828701611c53565b8284015250506101208084013583811115612080578687fd5b61208c8b828701611ccb565b82840152505080965050505060208501359250604085013591506120b38660608701611c2d565b905092959194509250565b600080604083850312156120d0578182fd5b50508035926020909101359150565b600080604083850312156120f1578182fd5b505080516020909101519092909150565b600080600080600060a08688031215612119578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b6001600160a01b03169052565b600081518084526121668160208601602086016125de565b601f01601f19169290920160200192915050565b60ff169052565b600060018060a01b0380835116845280602084015116602085015280604084015116604085015250606082015160608401526080820151608084015260a082015160c060a0850152610aa160c085018261214e565b600082516121e88184602087016125de565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b038481168252831660208201526060604082018190526000906122329083018461214e565b95945050505050565b6001600160a01b03848116825283166020820152608060408201819052601190820152704175746f6d617469634d4344526570617960781b60a082015260c0606082018190526000906122329083018461214e565b6001600160a01b0384811682528316602082015260806040820181905260119082015270105d5d1bdb585d1a58d350d1109bdbdcdd607a1b60a082015260c0606082018190526000906122329083018461214e565b6001600160a01b03929092168252602082015260400190565b6000841515825283602083015260606040830152612232606083018461214e565b90815260200190565b9182526001600160a01b0316602082015260400190565b6001600160e01b031991909116815260200190565b6000602082526108e4602083018461214e565b60208082526019908201527f52657061792067617320636f7374206f766572206c696d697400000000000000604082015260600190565b60208082526019908201527f426f6f73742067617320636f7374206f766572206c696d697400000000000000604082015260600190565b6020808252601c908201527f4d617820676173207072696365206f76657220746865206c696d697400000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600c908201526b139bdd08185d5d1a08189bdd60a21b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b600060a082526124c760a083018851612141565b60208701516124d960c0840182612141565b50604087015160e08301526060870151610100818185015260808901519150610120828186015260a08a01519250610140838187015260c08b01519350612524610160870185612141565b60e08b01519350612539610180870185612141565b828b01519350806101a0870152506125556101e086018461214e565b908a0151858203609f19016101c087015290925090506125758282612181565b925050508560208301528460408301526125926060830185612141565b61259f608083018461217a565b9695505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156125d657600080fd5b604052919050565b60005b838110156125f95781810151838201526020016125e1565b83811115612608576000848401525b50505050565b6001600160a01b03811681146119f357600080fd5b80151581146119f357600080fdfea2646970667358221220c999350d2e1b9943e8873ae08df2b1aad0834b75188488780fa9030bffc4854764736f6c634300060c00330000000000000000000000006b90059be44103b997b755f5d389dab6211fb7da
Deployed Bytecode
0x6080604052600436106101ee5760003560e01c80635ea2a6091161010d578063b6d5a156116100a0578063cff700011161006f578063cff700011461050e578063deca5f881461052e578063e3bbb4f11461054e578063f24ccbfe14610563578063f851a44014610578576101ee565b8063b6d5a15614610496578063c41a360a146104ab578063c42498ea146104cb578063cf66a6bc146104f9576101ee565b8063a564056c116100dc578063a564056c1461042e578063a7304bf714610441578063a8c9032314610461578063b2f9e47f14610481576101ee565b80635ea2a609146103dc5780637016722c146103f157806379521f02146104045780638da5cb5b14610419576101ee565b80633816377e11610185578063481c6a7511610154578063481c6a75146103705780634d3f199e14610385578063526d6461146103a557806358346f4b146103ba576101ee565b80633816377e146102fb5780633a1283221461031b57806341c0e1b51461033b57806342e7c83014610350576101ee565b80632e77468d116101c15780632e77468d1461028f57806331d98b3f146102b157806336569e77146102d157806336fc603f146102e6576101ee565b8063065b80bf146101f357806318bf60e11461022b5780631e48907b1461024d5780632a56f6021461026f575b600080fd5b3480156101ff57600080fd5b5061021361020e366004611f25565b61058d565b604051610222939291906122fe565b60405180910390f35b34801561023757600080fd5b50610240610882565b604051610222919061231f565b34801561025957600080fd5b5061026d610268366004611d7a565b610888565b005b34801561027b57600080fd5b5061024061028a366004611ec8565b6108c1565b34801561029b57600080fd5b506102a46108eb565b60405161022291906121f2565b3480156102bd57600080fd5b506102406102cc366004611ec8565b6108fa565b3480156102dd57600080fd5b506102a4610aa9565b3480156102f257600080fd5b50610240610ab8565b34801561030757600080fd5b5061026d610316366004611ec8565b610abe565b34801561032757600080fd5b5061026d610336366004611db2565b610b08565b34801561034757600080fd5b5061026d610ba1565b34801561035c57600080fd5b5061021361036b366004611f58565b610bc6565b34801561037c57600080fd5b506102a4610dfa565b34801561039157600080fd5b5061026d6103a0366004611ec8565b610e09565b3480156103b157600080fd5b506102a4610e47565b3480156103c657600080fd5b506103cf610e5f565b604051610222919061233f565b3480156103e857600080fd5b506102a4610e68565b61026d6103ff366004611f91565b610e83565b34801561041057600080fd5b506102a46111b5565b34801561042557600080fd5b506102a46111c4565b61026d61043c366004611f91565b6111d3565b34801561044d57600080fd5b5061026d61045c366004611d7a565b6114c6565b34801561046d57600080fd5b5061026d61047c366004611ec8565b6114ff565b34801561048d57600080fd5b506103cf61153d565b3480156104a257600080fd5b506102a461154e565b3480156104b757600080fd5b506102a46104c6366004611ec8565b611566565b3480156104d757600080fd5b506104eb6104e63660046120be565b6115ed565b6040516102229291906125a9565b34801561050557600080fd5b506102a46117a2565b34801561051a57600080fd5b506102406105293660046120be565b6117b1565b34801561053a57600080fd5b5061026d610549366004611d7a565b6118a7565b34801561055a57600080fd5b506102406118d4565b34801561056f57600080fd5b506102a46118da565b34801561058457600080fd5b506102a46118f2565b6000806060600061059c611be9565b600654604051631da1542f60e01b81526001600160a01b0390911690631da1542f906105cc908a9060040161231f565b6101206040518083038186803b1580156105e557600080fd5b505afa1580156105f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061061d9190611df9565b915091508161065a576000806040518060400160405280600b81526020016a21b238103737ba1039bab160a91b8152509450945094505050610879565b60008611801561066c57508060e00151155b156106b7576000806040518060400160405280601f81526020017f4e6578742070726963652073656e6420627574206e6f7420656e61626c6564008152509450945094505050610879565b60008860018111156106c557fe5b1480156106d457508060c00151155b156107135760008060405180604001604052806011815260200170109bdbdcdd081b9bdd08195b98589b1959607a1b8152509450945094505050610879565b80608001516001600160a01b031661072a88611566565b6001600160a01b031614610775576000806040518060400160405280601481526020017322a7a0903737ba1039bab13132b21037bbb732b960611b8152509450945094505050610879565b600061078188886117b1565b9050600189600181111561079157fe5b14156107f55781516001600160801b03168111156107f0576000806040518060400160405280601881526020017f526174696f20697320626967676572207468616e206d696e0000000000000000815250955095509550505050610879565b61085e565b600089600181111561080357fe5b141561085e5781602001516001600160801b031681101561085e57600080604051806040016040528060168152602001750a4c2e8d2de40d2e640d8cae6e640e8d0c2dc40dac2f60531b815250955095509550505050610879565b60408051602081019091526000815260019650909450925050505b93509350939050565b60045481565b6001546001600160a01b0316331461089f57600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000806002543a11156108d6576002546108d8565b3a5b90506108e48184611901565b9392505050565b600a546001600160a01b031681565b600a54604051636cb1c69b60e11b815260009182916001600160a01b039091169063d9638d369061092f90869060040161231f565b604080518083038186803b15801561094657600080fd5b505afa15801561095a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097e9190611ef8565b600954604051636cb1c69b60e11b8152919350600092506001600160a01b03169063d9638d36906109b390879060040161231f565b60a06040518083038186803b1580156109cb57600080fd5b505afa1580156109df573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a039190612102565b505092505050610aa1610a9b82600a60009054906101000a90046001600160a01b03166001600160a01b031663495d32cb6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a5e57600080fd5b505afa158015610a72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a969190611ee0565b611925565b83611925565b949350505050565b6009546001600160a01b031681565b60035481565b6000546001600160a01b03163314610ad557600080fd5b6501d1a94a20008110610b035760405162461bcd60e51b8152600401610afa906123d5565b60405180910390fd5b600255565b6000546001600160a01b03163314610b1f57600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b0383161415610b8357600080546040516001600160a01b039091169183156108fc02918491818181858888f19350505050158015610b7d573d6000803e3d6000fd5b50610b9d565b600054610b9d906001600160a01b03848116911683611966565b5050565b6000546001600160a01b03163314610bb857600080fd5b6000546001600160a01b0316ff5b6000806060610bd3611be9565b600654604051631da1542f60e01b81526001600160a01b0390911690631da1542f90610c03908a9060040161231f565b6101206040518083038186803b158015610c1c57600080fd5b505afa158015610c30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c549190611df9565b9150506000610c6388886117b1565b90506001896001811115610c7357fe5b1415610d1e5781602001516001600160801b03168110610cd3576000816040518060400160405280601e81526020017f526570617920696e6372656173656420726174696f206f766572206d617800008152509450945094505050610df0565b858111610d1957600081604051806040016040528060168152602001755265706179206d61646520726174696f20776f72736560501b8152509450945094505050610df0565b610dd6565b6000896001811115610d2c57fe5b1415610dd65781516001600160801b03168111610d89576000816040518060400160405280601c81526020017f426f6f7374206c6f776572656420726174696f206f766572206d696e000000008152509450945094505050610df0565b858110610dd6576000816040518060400160405280601881526020017f426f6f7374206469646e2774206c6f77657220726174696f00000000000000008152509450945094505050610df0565b604080516020810190915260008152600195509093509150505b9450945094915050565b6008546001600160a01b031681565b6000546001600160a01b03163314610e2057600080fd5b622dc6c08110610e425760405162461bcd60e51b8152600401610afa90612367565b600355565b73637726f8b08a7abe3ae3acab01a80e2d8ddef77b81565b60055460e01b81565b6005546801000000000000000090046001600160a01b031681565b6040516320eb73ed60e11b815273637726f8b08a7abe3ae3acab01a80e2d8ddef77b906341d6e7da90610eba9033906004016121f2565b60206040518083038186803b158015610ed257600080fd5b505afa158015610ee6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f0a9190611ddd565b610f265760405162461bcd60e51b8152600401610afa90612443565b6000806060610f376001878761058d565b919450925090508083610f5d5760405162461bcd60e51b8152600401610afa9190612354565b506000610f6b6003546108c1565b60065460405163620d1b0560e11b81529192506000916001600160a01b039091169063c41a360a90610fa1908b9060040161231f565b60206040518083038186803b158015610fb957600080fd5b505afa158015610fcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff19190611d96565b9050600560089054906101000a90046001600160a01b03166001600160a01b0316638a0e833f3483600760009054906101000a90046001600160a01b0316600560009054906101000a900460e01b8e8e898e60006040516024016110599594939291906124b3565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e087901b90921682526110a0939291600401612206565b6000604051808303818588803b1580156110b957600080fd5b505af11580156110cd573d6000803e3d6000fd5b50505050506000806110e260018b8b89610bc6565b9650909250905084826111085760405162461bcd60e51b8152600401610afa9190612354565b506111116119c1565b735c55b921f590a89c1ebe84df170e655a82b621266001600160a01b031663d061ce50308589856040516020016111499291906125a9565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016111769392919061223b565b600060405180830381600087803b15801561119057600080fd5b505af11580156111a4573d6000803e3d6000fd5b505050505050505050505050505050565b6006546001600160a01b031681565b6000546001600160a01b031681565b6040516320eb73ed60e11b815273637726f8b08a7abe3ae3acab01a80e2d8ddef77b906341d6e7da9061120a9033906004016121f2565b60206040518083038186803b15801561122257600080fd5b505afa158015611236573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125a9190611ddd565b6112765760405162461bcd60e51b8152600401610afa90612443565b60008060606112876000878761058d565b9194509250905080836112ad5760405162461bcd60e51b8152600401610afa9190612354565b5060006112bb6004546108c1565b60065460405163620d1b0560e11b81529192506000916001600160a01b039091169063c41a360a906112f1908b9060040161231f565b60206040518083038186803b15801561130957600080fd5b505afa15801561131d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113419190611d96565b9050600560089054906101000a90046001600160a01b03166001600160a01b0316638a0e833f3483600760009054906101000a90046001600160a01b0316600560049054906101000a900460e01b8e8e898e60006040516024016113a99594939291906124b3565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e087901b90921682526113f0939291600401612206565b6000604051808303818588803b15801561140957600080fd5b505af115801561141d573d6000803e3d6000fd5b505050505060008061143260008b8b89610bc6565b9650909250905084826114585760405162461bcd60e51b8152600401610afa9190612354565b506114616119c1565b735c55b921f590a89c1ebe84df170e655a82b621266001600160a01b031663d061ce50308589856040516020016114999291906125a9565b6040516020818303038152906040526040518463ffffffff1660e01b815260040161117693929190612290565b6001546001600160a01b031633146114dd57600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461151657600080fd5b622dc6c081106115385760405162461bcd60e51b8152600401610afa9061239e565b600455565b600554640100000000900460e01b81565b735a4f877ca808cca3cb7c2a194f80ab8588fae26b81565b60085460405163040b0d8960e51b81526000916001600160a01b031690638161b1209061159790859060040161231f565b60206040518083038186803b1580156115af57600080fd5b505afa1580156115c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e79190611d96565b92915050565b600854604051632726b07360e01b8152600091829182916001600160a01b031690632726b0739061162290889060040161231f565b60206040518083038186803b15801561163a57600080fd5b505afa15801561164e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116729190611d96565b6009546040516309092f9760e21b815291925060009182916001600160a01b031690632424be5c906116aa9089908790600401612328565b604080518083038186803b1580156116c157600080fd5b505afa1580156116d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f991906120df565b600954604051636cb1c69b60e11b81529294509092506000916001600160a01b039091169063d9638d3690611732908a9060040161231f565b60a06040518083038186803b15801561174a57600080fd5b505afa15801561175e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117829190612102565b505050915050826117938383611925565b95509550505050509250929050565b6007546001600160a01b031681565b600854604051632c2cb9fd60e01b815260009182916001600160a01b0390911690632c2cb9fd906117e690879060040161231f565b60206040518083038186803b1580156117fe57600080fd5b505afa158015611812573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118369190611ee0565b905060008315611846578361184f565b61184f826108fa565b905060008061185e87856115ed565b9150915080600014156118785760009450505050506115e7565b670de0b6b3a764000061189461188e84866119f7565b83611a1f565b8161189b57fe5b04979650505050505050565b6000546001600160a01b031633146118be57600080fd5b6001546001600160a01b0316156114dd57600080fd5b60025481565b735c55b921f590a89c1ebe84df170e655a82b6212681565b6001546001600160a01b031681565b600081158061191c5750508082028282828161191957fe5b04145b6115e757600080fd5b60006b033b2e3c9fd0803ce80000006119576119418585611901565b60026b033b2e3c9fd0803ce80000005b04611a43565b8161195e57fe5b049392505050565b6119bc8363a9059cbb60e01b84846040516024016119859291906122e5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611a53565b505050565b47156119f55760405133904780156108fc02916000818181858888f193505050501580156119f3573d6000803e3d6000fd5b505b565b6000670de0b6b3a7640000611957611a0f8585611901565b6002670de0b6b3a7640000611951565b600081611957611a3b856b033b2e3c9fd0803ce8000000611901565b600285611951565b808201828110156115e757600080fd5b6060611aa8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ae29092919063ffffffff16565b8051909150156119bc5780806020019051810190611ac69190611ddd565b6119bc5760405162461bcd60e51b8152600401610afa90612469565b6060610aa184846000856060611af785611bb0565b611b135760405162461bcd60e51b8152600401610afa9061240c565b60006060866001600160a01b03168587604051611b3091906121d6565b60006040518083038185875af1925050503d8060008114611b6d576040519150601f19603f3d011682016040523d82523d6000602084013e611b72565b606091505b50915091508115611b86579150610aa19050565b805115611b965780518082602001fd5b8360405162461bcd60e51b8152600401610afa9190612354565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610aa1575050151592915050565b6040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081019190915290565b80356115e78161260e565b80516115e78161260e565b805180151581146115e757600080fd5b600082601f830112611c63578081fd5b813567ffffffffffffffff811115611c79578182fd5b611c8c601f8201601f19166020016125b7565b9150808252836020828501011115611ca357600080fd5b8060208401602084013760009082016020015292915050565b8035600281106115e757600080fd5b600060c08284031215611cdc578081fd5b611ce660c06125b7565b90508135611cf38161260e565b81526020820135611d038161260e565b60208201526040820135611d168161260e565b80604083015250606082013560608201526080820135608082015260a082013567ffffffffffffffff811115611d4b57600080fd5b611d5784828501611c53565b60a08301525092915050565b80516001600160801b03811681146115e757600080fd5b600060208284031215611d8b578081fd5b81356108e48161260e565b600060208284031215611da7578081fd5b81516108e48161260e565b60008060408385031215611dc4578081fd5b8235611dcf8161260e565b946020939093013593505050565b600060208284031215611dee578081fd5b81516108e481612623565b600080828403610120811215611e0d578283fd5b8351611e1881612623565b9250610100601f198201811315611e2d578283fd5b611e36816125b7565b9150611e458660208701611d63565b8252611e548660408701611d63565b6020830152611e668660608701611d63565b6040830152611e788660808701611d63565b6060830152611e8a8660a08701611c38565b608083015260c085015160a0830152611ea68660e08701611c43565b60c0830152611eb786828701611c43565b60e083015250809150509250929050565b600060208284031215611ed9578081fd5b5035919050565b600060208284031215611ef1578081fd5b5051919050565b60008060408385031215611f0a578182fd5b8251611f158161260e565b6020939093015192949293505050565b600080600060608486031215611f39578081fd5b611f438585611cbc565b95602085013595506040909401359392505050565b60008060008060808587031215611f6d578182fd5b611f778686611cbc565b966020860135965060408601359560600135945092505050565b60008060008060808587031215611fa6578182fd5b843567ffffffffffffffff80821115611fbd578384fd5b818701915061014080838a031215611fd3578485fd5b611fdc816125b7565b9050611fe88984611c2d565b8152611ff78960208501611c2d565b602082015260408301356040820152606083013560608201526080830135608082015260a083013560a08201526120318960c08501611c2d565b60c08201526120438960e08501611c2d565b60e0820152610100808401358381111561205b578687fd5b6120678b828701611c53565b8284015250506101208084013583811115612080578687fd5b61208c8b828701611ccb565b82840152505080965050505060208501359250604085013591506120b38660608701611c2d565b905092959194509250565b600080604083850312156120d0578182fd5b50508035926020909101359150565b600080604083850312156120f1578182fd5b505080516020909101519092909150565b600080600080600060a08688031215612119578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b6001600160a01b03169052565b600081518084526121668160208601602086016125de565b601f01601f19169290920160200192915050565b60ff169052565b600060018060a01b0380835116845280602084015116602085015280604084015116604085015250606082015160608401526080820151608084015260a082015160c060a0850152610aa160c085018261214e565b600082516121e88184602087016125de565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b038481168252831660208201526060604082018190526000906122329083018461214e565b95945050505050565b6001600160a01b03848116825283166020820152608060408201819052601190820152704175746f6d617469634d4344526570617960781b60a082015260c0606082018190526000906122329083018461214e565b6001600160a01b0384811682528316602082015260806040820181905260119082015270105d5d1bdb585d1a58d350d1109bdbdcdd607a1b60a082015260c0606082018190526000906122329083018461214e565b6001600160a01b03929092168252602082015260400190565b6000841515825283602083015260606040830152612232606083018461214e565b90815260200190565b9182526001600160a01b0316602082015260400190565b6001600160e01b031991909116815260200190565b6000602082526108e4602083018461214e565b60208082526019908201527f52657061792067617320636f7374206f766572206c696d697400000000000000604082015260600190565b60208082526019908201527f426f6f73742067617320636f7374206f766572206c696d697400000000000000604082015260600190565b6020808252601c908201527f4d617820676173207072696365206f76657220746865206c696d697400000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600c908201526b139bdd08185d5d1a08189bdd60a21b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b600060a082526124c760a083018851612141565b60208701516124d960c0840182612141565b50604087015160e08301526060870151610100818185015260808901519150610120828186015260a08a01519250610140838187015260c08b01519350612524610160870185612141565b60e08b01519350612539610180870185612141565b828b01519350806101a0870152506125556101e086018461214e565b908a0151858203609f19016101c087015290925090506125758282612181565b925050508560208301528460408301526125926060830185612141565b61259f608083018461217a565b9695505050505050565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156125d657600080fd5b604052919050565b60005b838110156125f95781810151838201526020016125e1565b83811115612608576000848401525b50505050565b6001600160a01b03811681146119f357600080fd5b80151581146119f357600080fdfea2646970667358221220c999350d2e1b9943e8873ae08df2b1aad0834b75188488780fa9030bffc4854764736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006b90059be44103b997b755f5d389dab6211fb7da
-----Decoded View---------------
Arg [0] : _newMcdSaverTakerAddress (address): 0x6B90059bE44103b997B755F5D389dAB6211Fb7Da
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000006b90059be44103b997b755f5d389dab6211fb7da
Deployed Bytecode Sourcemap
21073:10320:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27496:1313;;;;;;;;;;-1:-1:-1;27496:1313:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;21241:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;13471:122::-;;;;;;;;;;-1:-1:-1;13471:122:0;;;;;:::i;:::-;;:::i;:::-;;30120:212;;;;;;;;;;-1:-1:-1;30120:212:0;;;;;:::i;:::-;;:::i;22057:76::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26622:223::-;;;;;;;;;;-1:-1:-1;26622:223:0;;;;;:::i;:::-;;:::i;21986:64::-;;;;;;;;;;;;;:::i;21193:41::-;;;;;;;;;;;;;:::i;31199:191::-;;;;;;;;;;-1:-1:-1;31199:191:0;;;;;:::i;:::-;;:::i;13766:285::-;;;;;;;;;;-1:-1:-1;13766:285:0;;;;;:::i;:::-;;:::i;13639:80::-;;;;;;;;;;;;;:::i;28901:1011::-;;;;;;;;;;-1:-1:-1;28901:1011:0;;;;;:::i;:::-;;:::i;21903:76::-;;;;;;;;;;;;;:::i;30912:178::-;;;;;;;;;;-1:-1:-1;30912:178:0;;;;;:::i;:::-;;:::i;21708:89::-;;;;;;;;;;;;;:::i;21291:41::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;21433:109::-;;;;;;;;;;;;;:::i;22718:1319::-;;;;;;:::i;:::-;;:::i;21549:108::-;;;;;;;;;;;;;:::i;12397:20::-;;;;;;;;;;;;;:::i;24219:1319::-;;;;;;:::i;:::-;;:::i;13250:122::-;;;;;;;;;;-1:-1:-1;13250:122:0;;;;;:::i;:::-;;:::i;30575:178::-;;;;;;;;;;-1:-1:-1;30575:178:0;;;;;:::i;:::-;;:::i;21361:41::-;;;;;;;;;;;;;:::i;21804:90::-;;;;;;;;;;;;;:::i;25983:110::-;;;;;;;;;;-1:-1:-1;25983:110:0;;;;;:::i;:::-;;:::i;26224:311::-;;;;;;;;;;-1:-1:-1;26224:311:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;21664:35::-;;;;;;;;;;;;;:::i;26969:385::-;;;;;;;;;;-1:-1:-1;26969:385:0;;;;;:::i;:::-;;:::i;12967:161::-;;;;;;;;;;-1:-1:-1;12967:161:0;;;;;:::i;:::-;;:::i;21133:39::-;;;;;;;;;;;;;:::i;22142:109::-;;;;;;;;;;;;;:::i;12424:20::-;;;;;;;;;;;;;:::i;27496:1313::-;27672:4;27691:7;27713:13;27757:15;27774:23;;:::i;:::-;27801:21;;:42;;-1:-1:-1;;;27801:42:0;;-1:-1:-1;;;;;27801:21:0;;;;:34;;:42;;27836:6;;27801:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27756:87;;;;27900:10;27895:49;;27920:5;27927:1;27912:32;;;;;;;;;;;;;-1:-1:-1;;;27912:32:0;;;;;;;;;;;;;27895:49;28023:1;28010:10;:14;:42;;;;;28029:6;:23;;;28028:24;28010:42;28006:113;;;28075:5;28082:1;28067:52;;;;;;;;;;;;;;;;;;;;;;;;;;;28006:113;28192:12;28181:7;:23;;;;;;;;;:47;;;;;28209:6;:19;;;28208:20;28181:47;28177:104;;;28251:5;28258:1;28243:38;;;;;;;;;;;;;-1:-1:-1;;;28243:38:0;;;;;;;;;;;;;28177:104;28360:6;:12;;;-1:-1:-1;;;;;28340:32:0;:16;28349:6;28340:8;:16::i;:::-;-1:-1:-1;;;;;28340:32:0;;28336:79;;28382:5;28389:1;28374:41;;;;;;;;;;;;;-1:-1:-1;;;28374:41:0;;;;;;;;;;;;;28336:79;28428:17;28448:28;28457:6;28465:10;28448:8;:28::i;:::-;28428:48;-1:-1:-1;28504:12:0;28493:7;:23;;;;;;;;;28489:272;;;28549:15;;-1:-1:-1;;;;;28537:27:0;;;28533:78;;;28574:5;28581:1;28566:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;28533:78;28489:272;;;28644:12;28633:7;:23;;;;;;;;;28629:132;;;28689:6;:15;;;-1:-1:-1;;;;;28677:27:0;:9;:27;28673:76;;;28714:5;28721:1;28706:43;;;;;;;;;;;;;-1:-1:-1;;;28706:43:0;;;;;;;;;;;;;;28673:76;28773:28;;;;;;;;;-1:-1:-1;28773:28:0;;28781:4;;-1:-1:-1;28787:9:0;;-1:-1:-1;28773:28:0;-1:-1:-1;;;27496:1313:0;;;;;;;;:::o;21241:41::-;;;;:::o;13471:122::-;13552:5;;-1:-1:-1;;;;;13552:5:0;13538:10;:19;13530:28;;;;;;13571:5;:14;;-1:-1:-1;;;;;;13571:14:0;-1:-1:-1;;;;;13571:14:0;;;;;;;;;;13471:122::o;30120:212::-;30182:7;30202:16;30236:13;;30221:11;:28;;:58;;30266:13;;30221:58;;;30252:11;30221:58;30202:77;;30299:25;30303:8;30313:10;30299:3;:25::i;:::-;30292:32;30120:212;-1:-1:-1;;;30120:212:0:o;22057:76::-;;;-1:-1:-1;;;;;22057:76:0;;:::o;26622:223::-;26713:7;;:18;;-1:-1:-1;;;26713:18:0;;26675:7;;;;-1:-1:-1;;;;;26713:7:0;;;;:12;;:18;;26726:4;;26713:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26767:3;;:14;;-1:-1:-1;;;26767:14:0;;26695:36;;-1:-1:-1;26747:12:0;;-1:-1:-1;;;;;;26767:3:0;;:8;;:14;;26776:4;;26767:14;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26742:39;;;;;;26801:36;26806:25;26811:4;26817:7;;;;;;;;;-1:-1:-1;;;;;26817:7:0;-1:-1:-1;;;;;26817:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26806:4;:25::i;:::-;26833:3;26801:4;:36::i;:::-;26794:43;26622:223;-1:-1:-1;;;;26622:223:0:o;21986:64::-;;;-1:-1:-1;;;;;21986:64:0;;:::o;21193:41::-;;;;:::o;31199:191::-;12493:5;;-1:-1:-1;;;;;12493:5:0;12502:10;12493:19;12485:28;;;;;;31299:9:::1;31284:12;:24;31276:65;;;;-1:-1:-1::0;;;31276:65:0::1;;;;;;;:::i;:::-;;;;;;;;;31354:13;:28:::0;31199:191::o;13766:285::-;12493:5;;-1:-1:-1;;;;;12493:5:0;12502:10;12493:19;12485:28;;;;;;13866:42:::1;-1:-1:-1::0;;;;;13856:52:0;::::1;;13852:192;;;13933:5;::::0;;13925:32:::1;::::0;-1:-1:-1;;;;;13933:5:0;;::::1;::::0;13925:32;::::1;;;::::0;13949:7;;13925:32;13933:5;13925:32;13949:7;13933:5;13925:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;13852:192;;;14017:5;::::0;13990:42:::1;::::0;-1:-1:-1;;;;;13990:26:0;;::::1;::::0;14017:5:::1;14024:7:::0;13990:26:::1;:42::i;:::-;13766:285:::0;;:::o;13639:80::-;12493:5;;-1:-1:-1;;;;;12493:5:0;12502:10;12493:19;12485:28;;;;;;13704:5:::1;::::0;-1:-1:-1;;;;;13704:5:0::1;13683:28;28901:1011:::0;29104:4;29123:7;29145:13;29191:23;;:::i;:::-;29218:21;;:42;;-1:-1:-1;;;29218:42:0;;-1:-1:-1;;;;;29218:21:0;;;;:34;;:42;;29253:6;;29218:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29188:72;;;29271:17;29291:28;29300:6;29308:10;29291:8;:28::i;:::-;29271:48;-1:-1:-1;29347:12:0;29336:7;:23;;;;;;;;;29332:532;;;29393:6;:15;;;-1:-1:-1;;;;;29380:28:0;:9;:28;29376:110;;29435:5;29442:9;29427:59;;;;;;;;;;;;;;;;;;;;;;;;;;;29376:110;29518:12;29505:9;:25;29501:82;;29540:5;29547:9;29532:51;;;;;;;;;;;;;-1:-1:-1;;;29532:51:0;;;;;;;;;;;;;29501:82;29332:532;;;29616:12;29605:7;:23;;;;;;;;;29601:263;;;29662:15;;-1:-1:-1;;;;;29649:28:0;;;29645:108;;29704:5;29711:9;29696:57;;;;;;;;;;;;;;;;;;;;;;;;;;;29645:108;29785:12;29772:9;:25;29768:84;;29807:5;29814:9;29799:53;;;;;;;;;;;;;;;;;;;;;;;;;;;29768:84;29876:28;;;;;;;;;-1:-1:-1;29876:28:0;;29884:4;;-1:-1:-1;29890:9:0;;-1:-1:-1;29876:28:0;-1:-1:-1;;28901:1011:0;;;;;;;;;:::o;21903:76::-;;;-1:-1:-1;;;;;21903:76:0;;:::o;30912:178::-;12493:5;;-1:-1:-1;;;;;12493:5:0;12502:10;12493:19;12485:28;;;;;;31005:9:::1;30994:8;:20;30986:58;;;;-1:-1:-1::0;;;30986:58:0::1;;;;;;;:::i;:::-;31057:14;:25:::0;30912:178::o;21708:89::-;21755:42;21708:89;:::o;21291:41::-;;;;;;:::o;21433:109::-;;;;;;-1:-1:-1;;;;;21433:109:0;;:::o;22718:1319::-;22303:53;;-1:-1:-1;;;22303:53:0;;21755:42;;22303:41;;:53;;22345:10;;22303:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22295:78;;;;-1:-1:-1;;;22295:78:0;;;;;;;:::i;:::-;22924:14:::1;22949:19:::0;22979:23:::1;23053:102;23086:12;23113:6;23134:10;23053:18;:102::i;:::-;23015:140:::0;;-1:-1:-1;23015:140:0;-1:-1:-1;23015:140:0;-1:-1:-1;23015:140:0;;23166:29:::1;;;;-1:-1:-1::0;;;23166:29:0::1;;;;;;;;:::i;:::-;;23208:15;23226:27;23238:14;;23226:11;:27::i;:::-;23287:21;::::0;:38:::1;::::0;-1:-1:-1;;;23287:38:0;;23208:45;;-1:-1:-1;23266:18:0::1;::::0;-1:-1:-1;;;;;23287:21:0;;::::1;::::0;:30:::1;::::0;:38:::1;::::0;23318:6;;23287:38:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23266:59;;23338:20;;;;;;;;;-1:-1:-1::0;;;;;23338:20:0::1;-1:-1:-1::0;;;;;23338:32:0::1;;23378:9;23403:10;23428:20;;;;;;;;;-1:-1:-1::0;;;;;23428:20:0::1;23486:14;;;;;;;;;;;23502:13;23517:6;23525:7;23534:9;23545:1;23463:84;;;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;23463:84:0;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;23463:84:0::1;-1:-1:-1::0;;;;;;23463:84:0;;::::1;;::::0;;23338:220;::::1;::::0;;;;;;;;::::1;::::0;;;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;23571:16;23598:18:::0;23668:124:::1;23697:12;23724:6;23745:10;23770:11;23668:14;:124::i;:::-;23629:163:::0;-1:-1:-1;23629:163:0;;-1:-1:-1;23629:163:0;-1:-1:-1;23629:163:0;;23803:31:::1;;;;-1:-1:-1::0;;;23803:31:0::1;;;;;;;;:::i;:::-;;23847:11;:9;:11::i;:::-;22208:42;-1:-1:-1::0;;;;;23871:10:0::1;;23904:4;23924:10;23994:11;24007:10;23983:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23871:158;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22384:1;;;;;;;22718:1319:::0;;;;:::o;21549:108::-;;;-1:-1:-1;;;;;21549:108:0;;:::o;12397:20::-;;;-1:-1:-1;;;;;12397:20:0;;:::o;24219:1319::-;22303:53;;-1:-1:-1;;;22303:53:0;;21755:42;;22303:41;;:53;;22345:10;;22303:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22295:78;;;;-1:-1:-1;;;22295:78:0;;;;;;;:::i;:::-;24425:14:::1;24450:19:::0;24480:23:::1;24554:102;24587:12;24614:6;24635:10;24554:18;:102::i;:::-;24516:140:::0;;-1:-1:-1;24516:140:0;-1:-1:-1;24516:140:0;-1:-1:-1;24516:140:0;;24667:29:::1;;;;-1:-1:-1::0;;;24667:29:0::1;;;;;;;;:::i;:::-;;24709:15;24727:27;24739:14;;24727:11;:27::i;:::-;24788:21;::::0;:38:::1;::::0;-1:-1:-1;;;24788:38:0;;24709:45;;-1:-1:-1;24767:18:0::1;::::0;-1:-1:-1;;;;;24788:21:0;;::::1;::::0;:30:::1;::::0;:38:::1;::::0;24819:6;;24788:38:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24767:59;;24839:20;;;;;;;;;-1:-1:-1::0;;;;;24839:20:0::1;-1:-1:-1::0;;;;;24839:32:0::1;;24879:9;24904:10;24929:20;;;;;;;;;-1:-1:-1::0;;;;;24929:20:0::1;24987:14;;;;;;;;;;;25003:13;25018:6;25026:7;25035:9;25046:1;24964:84;;;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;24964:84:0;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;24964:84:0::1;-1:-1:-1::0;;;;;;24964:84:0;;::::1;;::::0;;24839:220;::::1;::::0;;;;;;;;::::1;::::0;;;::::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;25072:16;25099:18:::0;25169:124:::1;25198:12;25225:6;25246:10;25271:11;25169:14;:124::i;:::-;25130:163:::0;-1:-1:-1;25130:163:0;;-1:-1:-1;25130:163:0;-1:-1:-1;25130:163:0;;25304:31:::1;;;;-1:-1:-1::0;;;25304:31:0::1;;;;;;;;:::i;:::-;;25348:11;:9;:11::i;:::-;22208:42;-1:-1:-1::0;;;;;25372:10:0::1;;25405:4;25425:10;25495:11;25508:10;25484:35;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25372:158;;;;;;;;;;;;;;;;;:::i;13250:122::-:0;13331:5;;-1:-1:-1;;;;;13331:5:0;13317:10;:19;13309:28;;;;;;13350:5;:14;;-1:-1:-1;;;;;;13350:14:0;-1:-1:-1;;;;;13350:14:0;;;;;;;;;;13250:122::o;30575:178::-;12493:5;;-1:-1:-1;;;;;12493:5:0;12502:10;12493:19;12485:28;;;;;;30668:9:::1;30657:8;:20;30649:58;;;;-1:-1:-1::0;;;30649:58:0::1;;;;;;;:::i;:::-;30720:14;:25:::0;30575:178::o;21361:41::-;;;;;;;;;:::o;21804:90::-;21852:42;21804:90;:::o;25983:110::-;26065:7;;:20;;-1:-1:-1;;;26065:20:0;;26038:7;;-1:-1:-1;;;;;26065:7:0;;:12;;:20;;26078:6;;26065:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26058:27;25983:110;-1:-1:-1;;25983:110:0:o;26224:311::-;26338:7;;:20;;-1:-1:-1;;;26338:20:0;;26295:7;;;;;;-1:-1:-1;;;;;26338:7:0;;:12;;:20;;26351:6;;26338:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26408:3;;:19;;-1:-1:-1;;;26408:19:0;;26324:34;;-1:-1:-1;26372:18:0;;;;-1:-1:-1;;;;;26408:3:0;;:8;;:19;;26417:4;;26324:34;;26408:19;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26463:3;;:14;;-1:-1:-1;;;26463:14:0;;26371:56;;-1:-1:-1;26371:56:0;;-1:-1:-1;26441:12:0;;-1:-1:-1;;;;;26463:3:0;;;;:8;;:14;;26472:4;;26463:14;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26438:39;;;;;;26498:10;26510:16;26515:4;26521;26510;:16::i;:::-;26490:37;;;;;;;;26224:311;;;;;:::o;21664:35::-;;;-1:-1:-1;;;;;21664:35:0;;:::o;26969:385::-;27078:7;;:20;;-1:-1:-1;;;27078:20:0;;27044:7;;;;-1:-1:-1;;;;;27078:7:0;;;;:12;;:20;;27091:6;;27078:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27064:34;-1:-1:-1;27109:13:0;27126:15;;27125:46;;27161:10;27125:46;;;27145:13;27154:3;27145:8;:13::i;:::-;27109:62;;27185:18;27205:12;27221:23;27232:6;27240:3;27221:10;:23::i;:::-;27184:60;;;;27261:4;27269:1;27261:9;27257:23;;;27279:1;27272:8;;;;;;;;27257:23;27339:6;27300:35;27305:23;27310:10;27322:5;27305:4;:23::i;:::-;27330:4;27300;:35::i;:::-;:46;;;;;;;26969:385;-1:-1:-1;;;;;;;26969:385:0:o;12967:161::-;13048:5;;-1:-1:-1;;;;;13048:5:0;13034:10;:19;13026:28;;;;;;13073:5;;-1:-1:-1;;;;;13073:5:0;:19;13065:28;;;;;21133:39;;;;:::o;22142:109::-;22208:42;22142:109;:::o;12424:20::-;;;-1:-1:-1;;;;;12424:20:0;;:::o;2713:127::-;2771:9;2801:6;;;:30;;-1:-1:-1;;2816:5:0;;;2830:1;2825;2816:5;2825:1;2811:15;;;;;:20;2801:30;2793:39;;;;;3624:122;3683:9;3479:6;3709:23;3713:9;3717:1;3720;3713:3;:9::i;:::-;3730:1;3479:6;3724:7;;3709:3;:23::i;:::-;:29;;;;;;;3624:122;-1:-1:-1;;;3624:122:0:o;10442:176::-;10524:86;10544:5;10574:23;;;10599:2;10603:5;10551:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;10551:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;10551:58:0;-1:-1:-1;;;;;;10551:58:0;;;;;;;;;;10524:19;:86::i;:::-;10442:176;;;:::o;25623:184::-;25704:21;:25;25700:100;;25746:42;;:10;;25766:21;25746:42;;;;;;;;;25766:21;25746:10;:42;;;;;;;;;;;;;;;;;;;;;25700:100;25623:184::o;3494:122::-;3553:9;3443:6;3579:23;3583:9;3587:1;3590;3583:3;:9::i;:::-;3600:1;3443:6;3594:7;;3882:120;3941:9;3993:1;3967:23;3971:11;3975:1;3479:6;3971:3;:11::i;:::-;3988:1;3984;:5;;2471:113;2564:5;;;2559:16;;;;2551:25;;;;;11911:419;11993:23;12019:69;12047:4;12019:69;;;;;;;;;;;;;;;;;12027:5;-1:-1:-1;;;;;12019:27:0;;;:69;;;;;:::i;:::-;12103:17;;11993:95;;-1:-1:-1;12103:21:0;12099:224;;12245:10;12234:30;;;;;;;;;;;;:::i;:::-;12226:85;;;;-1:-1:-1;;;12226:85:0;;;;;;;:::i;6833:196::-;6936:12;6968:53;6991:6;6999:4;7005:1;7008:12;7725;7758:18;7769:6;7758:10;:18::i;:::-;7750:60;;;;-1:-1:-1;;;7750:60:0;;;;;;;:::i;:::-;7884:12;7898:23;7925:6;-1:-1:-1;;;;;7925:11:0;7945:8;7956:4;7925:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7883:78;;;;7976:7;7972:595;;;8007:10;-1:-1:-1;8000:17:0;;-1:-1:-1;8000:17:0;7972:595;8121:17;;:21;8117:439;;8384:10;8378:17;8445:15;8432:10;8428:2;8424:19;8417:44;8332:148;8527:12;8520:20;;-1:-1:-1;;;8520:20:0;;;;;;;;:::i;5620:619::-;5680:4;6148:20;;5991:66;6188:23;;;;;;:42;;-1:-1:-1;;6215:15:0;;;5620:619;-1:-1:-1;;5620: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;283:128::-;358:13;;35402;;35395:21;39211:32;;39201:2;;39257:1;;39247:12;697:440;;798:3;791:4;783:6;779:17;775:27;765:2;;-1:-1;;806:12;765:2;853:6;840:20;34139:18;34131:6;34128:30;34125:2;;;-1:-1;;34161:12;34125:2;875:64;34234:9;34215:17;;-1:-1;;34211:33;34302:4;34292:15;875:64;:::i;:::-;866:73;;959:6;952:5;945:21;1063:3;34302:4;1054:6;987;1045:16;;1042:25;1039:2;;;1080:1;;1070:12;1039:2;38577:6;34302:4;987:6;983:17;34302:4;1021:5;1017:16;38554:30;38633:1;38615:16;;;34302:4;38615:16;38608:27;1021:5;758:379;-1:-1;;758:379::o;1326:152::-;1404:20;;39641:1;39631:12;;39621:2;;39657:1;;39647:12;5003:1179;;5122:4;5110:9;5105:3;5101:19;5097:30;5094:2;;;-1:-1;;5130:12;5094:2;5158:20;5122:4;5158:20;:::i;:::-;5149:29;;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5238:75;;5382:2;5436:22;;72:20;97:33;72:20;97:33;:::i;:::-;5382:2;5397:16;;5390:75;5537:2;5591:22;;72:20;97:33;72:20;97:33;:::i;:::-;5570:49;5537:2;5556:5;5552:16;5545:75;;5682:2;5740:9;5736:22;6397:20;5682:2;5701:5;5697:16;5690:75;5833:3;5892:9;5888:22;6397:20;5833:3;5853:5;5849:16;5842:75;6010:3;5999:9;5995:19;5982:33;6035:18;6027:6;6024:30;6021:2;;;-1:-1;;6057:12;6021:2;6102:58;6156:3;6147:6;6136:9;6132:22;6102:58;:::i;:::-;6010:3;6088:5;6084:16;6077:84;;5088:1094;;;;:::o;6189:134::-;6267:13;;-1:-1;;;;;35838:46;;39732:35;;39722:2;;39781:1;;39771:12;6608:241;;6712:2;6700:9;6691:7;6687:23;6683:32;6680:2;;;-1:-1;;6718:12;6680:2;85:6;72:20;97:33;124:5;97:33;:::i;6856:263::-;;6971:2;6959:9;6950:7;6946:23;6942:32;6939:2;;;-1:-1;;6977:12;6939:2;226:6;220:13;238:33;265:5;238:33;:::i;7126:366::-;;;7247:2;7235:9;7226:7;7222:23;7218:32;7215:2;;;-1:-1;;7253:12;7215:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;7305:63;7405:2;7444:22;;;;6397:20;;-1:-1;;;7209:283::o;7499:257::-;;7611:2;7599:9;7590:7;7586:23;7582:32;7579:2;;;-1:-1;;7617:12;7579:2;364:6;358:13;376:30;400:5;376:30;:::i;7763:448::-;;;7907:9;7898:7;7894:23;7919:3;7894:23;7890:33;7887:2;;;-1:-1;;7926:12;7887:2;364:6;358:13;376:30;400:5;376:30;:::i;:::-;7978:71;-1:-1;1644:6;-1:-1;;1623:19;;1619:32;-1:-1;1616:2;;;-1:-1;;1654:12;1616:2;1682:22;1644:6;1682:22;:::i;:::-;1673:31;;1790:60;1846:3;8086:2;8167:9;8163:22;1790:60;:::i;:::-;1772:16;1765:86;1949:60;2005:3;1981:22;8167:9;1981:22;1949:60;:::i;:::-;8086:2;1935:5;1931:16;1924:86;2117:60;2173:3;2149:22;8167:9;2149:22;2117:60;:::i;:::-;1981:22;2103:5;2099:16;2092:86;2285:60;2341:3;2317:22;8167:9;2317:22;2285:60;:::i;:::-;2149:22;2271:5;2267:16;2260:86;2442:60;2498:3;2474:22;8167:9;2474:22;2442:60;:::i;:::-;2317:22;2428:5;2424:16;2417:86;2631:22;8167:9;2631:22;6545:13;2474:22;2585:5;2581:16;2574:86;2763:57;2816:3;2792:22;8167:9;2792:22;2763:57;:::i;:::-;2631:22;2749:5;2745:16;2738:83;2928:57;2981:3;1644:6;8167:9;2957:22;2928:57;:::i;:::-;2792:22;2914:5;2910:16;2903:83;;8094:101;;;;7881:330;;;;;:::o;8218:241::-;;8322:2;8310:9;8301:7;8297:23;8293:32;8290:2;;;-1:-1;;8328:12;8290:2;-1:-1;485:20;;8284:175;-1:-1;8284:175::o;8466:263::-;;8581:2;8569:9;8560:7;8556:23;8552:32;8549:2;;;-1:-1;;8587:12;8549:2;-1:-1;633:13;;8543:186;-1:-1;8543:186::o;8736:439::-;;;8888:2;8876:9;8867:7;8863:23;8859:32;8856:2;;;-1:-1;;8894:12;8856:2;1249:6;1243:13;1261:53;1308:5;1261:53;:::i;:::-;9077:2;9127:22;;;;6545:13;8946:94;;6545:13;;-1:-1;;;8850:325::o;9182:513::-;;;;9331:2;9319:9;9310:7;9306:23;9302:32;9299:2;;;-1:-1;;9337:12;9299:2;9399:64;9455:7;9431:22;9399:64;:::i;:::-;9389:74;9500:2;9539:22;;6397:20;;-1:-1;9608:2;9647:22;;;6397:20;;9293:402;-1:-1;;;9293:402::o;9702:639::-;;;;;9868:3;9856:9;9847:7;9843:23;9839:33;9836:2;;;-1:-1;;9875:12;9836:2;9937:64;9993:7;9969:22;9937:64;:::i;:::-;9927:74;10038:2;10077:22;;6397:20;;-1:-1;10146:2;10185:22;;6397:20;;10254:2;10293:22;6397:20;;-1:-1;9830:511;-1:-1;;;9830:511::o;10348:763::-;;;;;10533:3;10521:9;10512:7;10508:23;10504:33;10501:2;;;-1:-1;;10540:12;10501:2;10598:17;10585:31;10636:18;;10628:6;10625:30;10622:2;;;-1:-1;;10658:12;10622:2;10754:6;10743:9;10739:22;;;3175:6;;3163:9;3158:3;3154:19;3150:32;3147:2;;;-1:-1;;3185:12;3147:2;3213:22;3175:6;3213:22;:::i;:::-;3204:31;;3320:49;3365:3;3341:22;3320:49;:::i;:::-;3302:16;3295:75;3468:49;3513:3;3435:2;3493:9;3489:22;3468:49;:::i;:::-;3435:2;3454:5;3450:16;3443:75;3584:2;3642:9;3638:22;6397:20;3584:2;3603:5;3599:16;3592:75;3734:2;3792:9;3788:22;6397:20;3734:2;3753:5;3749:16;3742:75;10533:3;3941:9;3937:22;6397:20;10533:3;3902:5;3898:16;3891:75;4036:3;4095:9;4091:22;6397:20;4036:3;4056:5;4052:16;4045:75;4215:49;4260:3;4181;4240:9;4236:22;4215:49;:::i;:::-;4181:3;4201:5;4197:16;4190:75;4363:49;4408:3;4329;4388:9;4384:22;4363:49;:::i;:::-;4329:3;4349:5;4345:16;4338:75;4509:3;;4498:9;4494:19;4481:33;10636:18;4526:6;4523:30;4520:2;;;-1:-1;;4556:12;4520:2;4603:58;4657:3;4648:6;4637:9;4633:22;4603:58;:::i;:::-;4509:3;4587:5;4583:18;4576:86;;;4759:3;;4748:9;4744:19;4731:33;10636:18;4776:6;4773:30;4770:2;;;-1:-1;;4806:12;4770:2;4853:79;4928:3;4919:6;4908:9;4904:22;4853:79;:::i;:::-;4759:3;4837:5;4833:18;4826:107;;;10678:93;;;;;;3435:2;10851:9;10847:22;6397:20;10816:63;;3584:2;10959:9;10955:22;6397:20;10924:63;;11042:53;11087:7;3734:2;11067:9;11063:22;11042:53;:::i;:::-;11032:63;;10495:616;;;;;;;:::o;11636:366::-;;;11757:2;11745:9;11736:7;11732:23;11728:32;11725:2;;;-1:-1;;11763:12;11725:2;-1:-1;;6397:20;;;11915:2;11954:22;;;485:20;;-1:-1;11719:283::o;12382:399::-;;;12514:2;12502:9;12493:7;12489:23;12485:32;12482:2;;;-1:-1;;12520:12;12482:2;-1:-1;;6545:13;;12683:2;12733:22;;;6545:13;;;;;-1:-1;12476:305::o;12788:809::-;;;;;;12971:3;12959:9;12950:7;12946:23;12942:33;12939:2;;;-1:-1;;12978:12;12939:2;-1:-1;;6545:13;;13141:2;13191:22;;6545:13;13260:2;13310:22;;6545:13;13379:2;13429:22;;6545:13;13498:3;13549:22;;;6545:13;;;;;-1:-1;6545:13;;-1:-1;6545:13;;-1:-1;12933:664;-1:-1;12933:664::o;13753:103::-;-1:-1;;;;;35958:54;13814:37;;13808:48::o;14331:323::-;;14463:5;34411:12;34686:6;34681:3;34674:19;14546:52;14591:6;34723:4;34718:3;34714:14;34723:4;14572:5;14568:16;14546:52;:::i;:::-;34234:9;38994:14;-1:-1;;38990:28;14610:39;;;;34723:4;14610:39;;14411:243;-1:-1;;14411:243::o;16404:138::-;36174:4;36163:16;16481:56;;16475:67::o;21762:1219::-;;34139:18;;35969:42;;;;21988:16;21982:23;35958:54;13821:3;13814:37;35969:42;22161:4;22154:5;22150:16;22144:23;35958:54;22161:4;22225:3;22221:14;13814:37;35969:42;22326:4;22319:5;22315:16;22309:23;35958:54;22326:4;22390:3;22386:14;13814:37;;22481:4;22474:5;22470:16;22464:23;22481:4;22545:3;22541:14;14165:37;22642:4;22635:5;22631:16;22625:23;22642:4;22706:3;22702:14;14165:37;22800:4;22793:5;22789:16;22783:23;21913:4;22800;22830:3;22826:14;22819:38;22872:71;21913:4;21908:3;21904:14;22924:12;22872:71;:::i;23218:271::-;;15171:5;34411:12;15282:52;15327:6;15322:3;15315:4;15308:5;15304:16;15282:52;:::i;:::-;15346:16;;;;;23352:137;-1:-1;;23352:137::o;23496:222::-;-1:-1;;;;;35958:54;;;;13814:37;;23623:2;23608:18;;23594:124::o;23970:528::-;-1:-1;;;;;35958:54;;;13814:37;;35958:54;;24335:2;24320:18;;13814:37;24171:2;24372;24357:18;;24350:48;;;23970:528;;24412:76;;24156:18;;24474:6;24412:76;:::i;:::-;24404:84;24142:356;-1:-1;;;;;24142:356::o;24505:834::-;-1:-1;;;;;35958:54;;;13814:37;;35958:54;;24972:2;24957:18;;13814:37;24807:3;25009:2;24994:18;;24987:48;;;18133:2;24792:19;;;34674;-1:-1;;;35969:42;34714:14;;18149:40;18208:12;25213:2;25198:18;;25191:48;;;24505:834;;25253:76;;18208:12;;25315:6;25253:76;:::i;25346:834::-;-1:-1;;;;;35958:54;;;13814:37;;35958:54;;25813:2;25798:18;;13814:37;25648:3;25850:2;25835:18;;25828:48;;;18459:2;25633:19;;;34674;-1:-1;;;35969:42;34714:14;;18475:40;18534:12;26054:2;26039:18;;26032:48;;;25346:834;;26094:76;;18534:12;;26156:6;26094:76;:::i;26187:333::-;-1:-1;;;;;35958:54;;;;13814:37;;26506:2;26491:18;;14165:37;26342:2;26327:18;;26313:207::o;26527:520::-;;14075:5;35402:13;35395:21;14055:3;14048:34;14195:5;26882:2;26871:9;26867:18;14165:37;26724:2;26919;26908:9;26904:18;26897:48;26959:78;26724:2;26713:9;26709:18;27023:6;26959:78;:::i;27054:222::-;14165:37;;;27181:2;27166:18;;27152:124::o;27283:333::-;14165:37;;;-1:-1;;;;;35958:54;27602:2;27587:18;;13814:37;27438:2;27423:18;;27409:207::o;27623:218::-;-1:-1;;;;;;35568:78;;;;14283:36;;27748:2;27733:18;;27719:122::o;29454:310::-;;29601:2;29622:17;29615:47;29676:78;29601:2;29590:9;29586:18;29740:6;29676:78;:::i;29771:416::-;29971:2;29985:47;;;17128:2;29956:18;;;34674:19;17164:27;34714:14;;;17144:48;17211:12;;;29942:245::o;30194:416::-;30394:2;30408:47;;;17462:2;30379:18;;;34674:19;17498:27;34714:14;;;17478:48;17545:12;;;30365:245::o;30617:416::-;30817:2;30831:47;;;17796:2;30802:18;;;34674:19;17832:30;34714:14;;;17812:51;17882:12;;;30788:245::o;31040:416::-;31240:2;31254:47;;;18785:2;31225:18;;;34674:19;18821:31;34714:14;;;18801:52;18872:12;;;31211:245::o;31463:416::-;31663:2;31677:47;;;19123:2;31648:18;;;34674:19;-1:-1;;;34714:14;;;19139:35;19193:12;;;31634:245::o;31886:416::-;32086:2;32100:47;;;19444:2;32071:18;;;34674:19;19480:34;34714:14;;;19460:55;-1:-1;;;19535:12;;;19528:34;19581:12;;;32057:245::o;32309:848::-;;32614:3;32636:17;32629:47;19949:63;32614:3;32603:9;32599:19;19926:16;19920:23;19949:63;:::i;:::-;20095:4;20088:5;20084:16;20078:23;20107:63;20155:14;32603:9;20155:14;20141:12;20107:63;:::i;:::-;;20254:4;20247:5;20243:16;20237:23;20314:14;32603:9;20314:14;14165:37;20414:4;20407:5;20403:16;20397:23;20474:14;20397:23;20474:14;32603:9;20474:14;14165:37;20572:4;20565:5;20561:16;20555:23;;;20632:14;20555:23;20632:14;32603:9;20632:14;14165:37;32614:3;20728:5;20724:16;20718:23;;;19849:6;20718:23;19849:6;32603:9;20795:14;14165:37;20155:14;20882:5;20878:16;20872:23;20852:43;;20901:63;20949:14;32603:9;20949:14;20935:12;20901:63;:::i;:::-;20314:14;21039:5;21035:16;21029:23;21009:43;;21058:63;21106:14;32603:9;21106:14;21092:12;21058:63;:::i;:::-;20474:14;21200:5;21196:18;21190:25;21170:45;;19849:6;21235:16;32603:9;21235:16;21228:40;;21283:71;19840:16;32603:9;19840:16;21335:12;21283:71;:::i;:::-;21436:18;;;21430:25;21493:14;;;-1:-1;;21493:14;21475:16;;;21468:40;21275:79;;-1:-1;21430:25;-1:-1;21523:113;21275:79;21430:25;21523:113;:::i;:::-;32682:126;;;;14195:5;20095:4;32876:9;32872:18;14165:37;14195:5;20254:4;32959:9;32955:18;14165:37;32985:72;20414:4;33042:9;33038:18;33029:6;32985:72;:::i;:::-;33068:79;20572:4;33131:9;33127:19;33118:6;33068:79;:::i;:::-;32585:572;;;;;;;;:::o;33393:333::-;14165:37;;;33712:2;33697:18;;14165:37;33548:2;33533:18;;33519:207::o;33733:256::-;33795:2;33789:9;33821:17;;;33896:18;33881:34;;33917:22;;;33878:62;33875:2;;;33953:1;;33943:12;33875:2;33795;33962:22;33773:216;;-1:-1;33773:216::o;38650:268::-;38715:1;38722:101;38736:6;38733:1;38730:13;38722:101;;;38803:11;;;38797:18;38784:11;;;38777:39;38758:2;38751:10;38722:101;;;38838:6;38835:1;38832:13;38829:2;;;38715:1;38894:6;38889:3;38885:16;38878:27;38829:2;;38699:219;;;:::o;39031:117::-;-1:-1;;;;;35958:54;;39090:35;;39080:2;;39139:1;;39129:12;39155:111;39236:5;35402:13;35395:21;39214:5;39211:32;39201:2;;39257:1;;39247:12
Swarm Source
ipfs://c999350d2e1b9943e8873ae08df2b1aad0834b75188488780fa9030bffc48547
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.