Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 11092539 | 1486 days ago | IN | 0 ETH | 0.05095392 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
11889405 | 1363 days ago | 56.70717538 ETH | ||||
11889405 | 1363 days ago | 22.69167388 ETH | ||||
11889405 | 1363 days ago | 34.0155015 ETH | ||||
11889405 | 1363 days ago | 34.029106 ETH | ||||
11889405 | 1363 days ago | 34.029106 ETH | ||||
11881363 | 1365 days ago | 269.28211267 ETH | ||||
11881363 | 1365 days ago | 119.28211267 ETH | ||||
11881363 | 1365 days ago | 150 ETH | ||||
11877264 | 1365 days ago | 1.9099891 ETH | ||||
11877264 | 1365 days ago | 1.0953011 ETH | ||||
11877264 | 1365 days ago | 0.814688 ETH | ||||
11877264 | 1365 days ago | 0.82733 ETH | ||||
11877264 | 1365 days ago | 0.82733 ETH | ||||
11876612 | 1365 days ago | 180.35218673 ETH | ||||
11876612 | 1365 days ago | 81.33234873 ETH | ||||
11876612 | 1365 days ago | 99.019838 ETH | ||||
11876612 | 1365 days ago | 99.037338 ETH | ||||
11876612 | 1365 days ago | 99.037338 ETH | ||||
11876561 | 1365 days ago | 20.73442397 ETH | ||||
11876561 | 1365 days ago | 8.67889297 ETH | ||||
11876561 | 1365 days ago | 12.055531 ETH | ||||
11876561 | 1365 days ago | 12.071736 ETH | ||||
11876561 | 1365 days ago | 12.071736 ETH | ||||
11867613 | 1367 days ago | 0.0151795 ETH | ||||
11867613 | 1367 days ago | 0.0151795 ETH |
Loading...
Loading
Contract Name:
MCDCreateFlashLoan
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-10-20 */ pragma solidity ^0.6.0; pragma experimental ABIEncoderV2; 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); } } } } abstract contract TokenInterface { function allowance(address, address) public virtual returns (uint256); function balanceOf(address) public virtual returns (uint256); function approve(address, uint256) public virtual; function transfer(address, uint256) public virtual returns (bool); function transferFrom(address, address, uint256) public virtual returns (bool); function deposit() public virtual payable; function withdraw(uint256) public virtual; } interface ExchangeInterfaceV2 { function sell(address _srcAddr, address _destAddr, uint _srcAmount) external payable returns (uint); function buy(address _srcAddr, address _destAddr, uint _destAmount) external payable returns(uint); function getSellRate(address _srcAddr, address _destAddr, uint _srcAmount) external view returns (uint); function getBuyRate(address _srcAddr, address _destAddr, uint _srcAmount) external view returns (uint); } 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, 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); _; } constructor() public { owner = msg.sender; } /// @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 ZrxAllowlist is AdminAuth { mapping (address => bool) public zrxAllowlist; mapping(address => bool) private nonPayableAddrs; constructor() public { zrxAllowlist[0x6958F5e95332D93D21af0D7B9Ca85B8212fEE0A5] = true; zrxAllowlist[0x61935CbDd02287B511119DDb11Aeb42F1593b7Ef] = true; zrxAllowlist[0xDef1C0ded9bec7F1a1670819833240f027b25EfF] = true; zrxAllowlist[0x080bf510FCbF18b91105470639e9561022937712] = true; nonPayableAddrs[0x080bf510FCbF18b91105470639e9561022937712] = true; } function setAllowlistAddr(address _zrxAddr, bool _state) public onlyOwner { zrxAllowlist[_zrxAddr] = _state; } function isZrxAddr(address _zrxAddr) public view returns (bool) { return zrxAllowlist[_zrxAddr]; } function addNonPayableAddr(address _nonPayableAddr) public onlyOwner { nonPayableAddrs[_nonPayableAddr] = true; } function removeNonPayableAddr(address _nonPayableAddr) public onlyOwner { nonPayableAddrs[_nonPayableAddr] = false; } function isNonPayableAddr(address _addr) public view returns(bool) { return nonPayableAddrs[_addr]; } } contract Discount { address public owner; mapping(address => CustomServiceFee) public serviceFees; uint256 constant MAX_SERVICE_FEE = 400; struct CustomServiceFee { bool active; uint256 amount; } constructor() public { owner = msg.sender; } function isCustomFeeSet(address _user) public view returns (bool) { return serviceFees[_user].active; } function getCustomServiceFee(address _user) public view returns (uint256) { return serviceFees[_user].amount; } function setServiceFee(address _user, uint256 _fee) public { require(msg.sender == owner, "Only owner"); require(_fee >= MAX_SERVICE_FEE || _fee == 0); serviceFees[_user] = CustomServiceFee({active: true, amount: _fee}); } function disableServiceFee(address _user) public { require(msg.sender == owner, "Only owner"); serviceFees[_user] = CustomServiceFee({active: false, amount: 0}); } } contract SaverExchangeHelper { using SafeERC20 for ERC20; address public constant KYBER_ETH_ADDRESS = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; address public constant WETH_ADDRESS = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; address payable public constant WALLET_ID = 0x322d58b9E75a6918f7e7849AEe0fF09369977e08; address public constant DISCOUNT_ADDRESS = 0x1b14E8D511c9A4395425314f849bD737BAF8208F; address public constant SAVER_EXCHANGE_REGISTRY = 0x25dd3F51e0C3c3Ff164DDC02A8E4D65Bb9cBB12D; address public constant ERC20_PROXY_0X = 0x95E6F48254609A6ee006F7D493c8e5fB97094ceF; address public constant ZRX_ALLOWLIST_ADDR = 0x4BA1f38427b33B8ab7Bb0490200dAE1F1C36823F; function getDecimals(address _token) internal view returns (uint256) { if (_token == KYBER_ETH_ADDRESS) return 18; return ERC20(_token).decimals(); } function getBalance(address _tokenAddr) internal view returns (uint balance) { if (_tokenAddr == KYBER_ETH_ADDRESS) { balance = address(this).balance; } else { balance = ERC20(_tokenAddr).balanceOf(address(this)); } } function approve0xProxy(address _tokenAddr, uint _amount) internal { if (_tokenAddr != KYBER_ETH_ADDRESS) { ERC20(_tokenAddr).safeApprove(address(ERC20_PROXY_0X), _amount); } } function sendLeftover(address _srcAddr, address _destAddr, address payable _to) internal { // send back any leftover ether or tokens if (address(this).balance > 0) { _to.transfer(address(this).balance); } if (getBalance(_srcAddr) > 0) { ERC20(_srcAddr).safeTransfer(_to, getBalance(_srcAddr)); } if (getBalance(_destAddr) > 0) { ERC20(_destAddr).safeTransfer(_to, getBalance(_destAddr)); } } function sliceUint(bytes memory bs, uint256 start) internal pure returns (uint256) { require(bs.length >= start + 32, "slicing out of range"); uint256 x; assembly { x := mload(add(bs, add(0x20, start))) } return x; } } contract SaverExchangeRegistry is AdminAuth { mapping(address => bool) private wrappers; constructor() public { wrappers[0x880A845A85F843a5c67DB2061623c6Fc3bB4c511] = true; wrappers[0x4c9B55f2083629A1F7aDa257ae984E03096eCD25] = true; wrappers[0x42A9237b872368E1bec4Ca8D26A928D7d39d338C] = true; } function addWrapper(address _wrapper) public onlyOwner { wrappers[_wrapper] = true; } function removeWrapper(address _wrapper) public onlyOwner { wrappers[_wrapper] = false; } function isWrapper(address _wrapper) public view returns(bool) { return wrappers[_wrapper]; } } contract SaverExchangeCore is SaverExchangeHelper, DSMath { // first is empty to keep the legacy order in place enum ExchangeType { _, OASIS, KYBER, UNISWAP, ZEROX } enum ActionType { SELL, BUY } struct ExchangeData { address srcAddr; address destAddr; uint srcAmount; uint destAmount; uint minPrice; address wrapper; address exchangeAddr; bytes callData; uint256 price0x; } /// @notice Internal method that preforms a sell on 0x/on-chain /// @dev Usefull for other DFS contract to integrate for exchanging /// @param exData Exchange data struct /// @return (address, uint) Address of the wrapper used and destAmount function _sell(ExchangeData memory exData) internal returns (address, uint) { address wrapper; uint swapedTokens; bool success; uint tokensLeft = exData.srcAmount; // if selling eth, convert to weth if (exData.srcAddr == KYBER_ETH_ADDRESS) { exData.srcAddr = ethToWethAddr(exData.srcAddr); TokenInterface(WETH_ADDRESS).deposit.value(exData.srcAmount)(); } // Try 0x first and then fallback on specific wrapper if (exData.price0x > 0) { approve0xProxy(exData.srcAddr, exData.srcAmount); uint ethAmount = getProtocolFee(exData.srcAddr, exData.srcAmount); (success, swapedTokens, tokensLeft) = takeOrder(exData, ethAmount, ActionType.SELL); if (success) { wrapper = exData.exchangeAddr; } } // fallback to desired wrapper if 0x failed if (!success) { swapedTokens = saverSwap(exData, ActionType.SELL); wrapper = exData.wrapper; } require(getBalance(exData.destAddr) >= wmul(exData.minPrice, exData.srcAmount), "Final amount isn't correct"); // if anything is left in weth, pull it to user as eth if (getBalance(WETH_ADDRESS) > 0) { TokenInterface(WETH_ADDRESS).withdraw( TokenInterface(WETH_ADDRESS).balanceOf(address(this)) ); } return (wrapper, swapedTokens); } /// @notice Internal method that preforms a buy on 0x/on-chain /// @dev Usefull for other DFS contract to integrate for exchanging /// @param exData Exchange data struct /// @return (address, uint) Address of the wrapper used and srcAmount function _buy(ExchangeData memory exData) internal returns (address, uint) { address wrapper; uint swapedTokens; bool success; require(exData.destAmount != 0, "Dest amount must be specified"); // if selling eth, convert to weth if (exData.srcAddr == KYBER_ETH_ADDRESS) { exData.srcAddr = ethToWethAddr(exData.srcAddr); TokenInterface(WETH_ADDRESS).deposit.value(exData.srcAmount)(); } if (exData.price0x > 0) { approve0xProxy(exData.srcAddr, exData.srcAmount); uint ethAmount = getProtocolFee(exData.srcAddr, exData.srcAmount); (success, swapedTokens,) = takeOrder(exData, ethAmount, ActionType.BUY); if (success) { wrapper = exData.exchangeAddr; } } // fallback to desired wrapper if 0x failed if (!success) { swapedTokens = saverSwap(exData, ActionType.BUY); wrapper = exData.wrapper; } require(getBalance(exData.destAddr) >= exData.destAmount, "Final amount isn't correct"); // if anything is left in weth, pull it to user as eth if (getBalance(WETH_ADDRESS) > 0) { TokenInterface(WETH_ADDRESS).withdraw( TokenInterface(WETH_ADDRESS).balanceOf(address(this)) ); } return (wrapper, getBalance(exData.destAddr)); } /// @notice Takes order from 0x and returns bool indicating if it is successful /// @param _exData Exchange data /// @param _ethAmount Ether fee needed for 0x order function takeOrder( ExchangeData memory _exData, uint256 _ethAmount, ActionType _type ) private returns (bool success, uint256, uint256) { // write in the exact amount we are selling/buing in an order if (_type == ActionType.SELL) { writeUint256(_exData.callData, 36, _exData.srcAmount); } else { writeUint256(_exData.callData, 36, _exData.destAmount); } if (ZrxAllowlist(ZRX_ALLOWLIST_ADDR).isNonPayableAddr(_exData.exchangeAddr)) { _ethAmount = 0; } uint256 tokensBefore = getBalance(_exData.destAddr); if (ZrxAllowlist(ZRX_ALLOWLIST_ADDR).isZrxAddr(_exData.exchangeAddr)) { (success, ) = _exData.exchangeAddr.call{value: _ethAmount}(_exData.callData); } else { success = false; } uint256 tokensSwaped = 0; uint256 tokensLeft = _exData.srcAmount; if (success) { // check to see if any _src tokens are left over after exchange tokensLeft = getBalance(_exData.srcAddr); // convert weth -> eth if needed if (_exData.destAddr == KYBER_ETH_ADDRESS) { TokenInterface(WETH_ADDRESS).withdraw( TokenInterface(WETH_ADDRESS).balanceOf(address(this)) ); } // get the current balance of the swaped tokens tokensSwaped = getBalance(_exData.destAddr) - tokensBefore; } return (success, tokensSwaped, tokensLeft); } /// @notice Calls wraper contract for exchage to preform an on-chain swap /// @param _exData Exchange data struct /// @param _type Type of action SELL|BUY /// @return swapedTokens For Sell that the destAmount, for Buy thats the srcAmount function saverSwap(ExchangeData memory _exData, ActionType _type) internal returns (uint swapedTokens) { require(SaverExchangeRegistry(SAVER_EXCHANGE_REGISTRY).isWrapper(_exData.wrapper), "Wrapper is not valid"); uint ethValue = 0; ERC20(_exData.srcAddr).safeTransfer(_exData.wrapper, _exData.srcAmount); if (_type == ActionType.SELL) { swapedTokens = ExchangeInterfaceV2(_exData.wrapper). sell{value: ethValue}(_exData.srcAddr, _exData.destAddr, _exData.srcAmount); } else { swapedTokens = ExchangeInterfaceV2(_exData.wrapper). buy{value: ethValue}(_exData.srcAddr, _exData.destAddr, _exData.destAmount); } } function writeUint256(bytes memory _b, uint256 _index, uint _input) internal pure { if (_b.length < _index + 32) { revert("Incorrent lengt while writting bytes32"); } bytes32 input = bytes32(_input); _index += 32; // Read the bytes32 from array memory assembly { mstore(add(_b, _index), input) } } /// @notice Converts Kybers Eth address -> Weth /// @param _src Input address function ethToWethAddr(address _src) internal pure returns (address) { return _src == KYBER_ETH_ADDRESS ? WETH_ADDRESS : _src; } /// @notice Calculates protocol fee /// @param _srcAddr selling token address (if eth should be WETH) /// @param _srcAmount amount we are selling function getProtocolFee(address _srcAddr, uint256 _srcAmount) internal view returns(uint256) { // if we are not selling ETH msg value is always the protocol fee if (_srcAddr != WETH_ADDRESS) return address(this).balance; // if msg value is larger than srcAmount, that means that msg value is protocol fee + srcAmount, so we subsctract srcAmount from msg value // we have an edge case here when protocol fee is higher than selling amount if (address(this).balance > _srcAmount) return address(this).balance - _srcAmount; // if msg value is lower than src amount, that means that srcAmount isn't included in msg value, so we return msg value return address(this).balance; } function packExchangeData(ExchangeData memory _exData) public pure returns(bytes memory) { // splitting in two different bytes and encoding all because of stack too deep in decoding part bytes memory part1 = abi.encode( _exData.srcAddr, _exData.destAddr, _exData.srcAmount, _exData.destAmount ); bytes memory part2 = abi.encode( _exData.minPrice, _exData.wrapper, _exData.exchangeAddr, _exData.callData, _exData.price0x ); return abi.encode(part1, part2); } function unpackExchangeData(bytes memory _data) public pure returns(ExchangeData memory _exData) { ( bytes memory part1, bytes memory part2 ) = abi.decode(_data, (bytes,bytes)); ( _exData.srcAddr, _exData.destAddr, _exData.srcAmount, _exData.destAmount ) = abi.decode(part1, (address,address,uint256,uint256)); ( _exData.minPrice, _exData.wrapper, _exData.exchangeAddr, _exData.callData, _exData.price0x ) = abi.decode(part2, (uint256,address,address,bytes,uint256)); } // solhint-disable-next-line no-empty-blocks receive() external virtual payable {} } abstract contract GemLike { function approve(address, uint256) public virtual; function transfer(address, uint256) public virtual; function transferFrom(address, address, uint256) public virtual; function deposit() public virtual payable; function withdraw(uint256) public virtual; } abstract contract ManagerLike { function cdpCan(address, uint256, address) public virtual view returns (uint256); function ilks(uint256) public virtual view returns (bytes32); function owns(uint256) public virtual view returns (address); function urns(uint256) public virtual view returns (address); function vat() public virtual view returns (address); function open(bytes32, address) public virtual returns (uint256); function give(uint256, address) public virtual; function cdpAllow(uint256, address, uint256) public virtual; function urnAllow(address, uint256) public virtual; function frob(uint256, int256, int256) public virtual; function flux(uint256, address, uint256) public virtual; function move(uint256, address, uint256) public virtual; function exit(address, uint256, address, uint256) public virtual; function quit(uint256, address) public virtual; function enter(address, uint256) public virtual; function shift(uint256, uint256) public virtual; } abstract contract VatLike { function can(address, address) public virtual view returns (uint256); function ilks(bytes32) public virtual view returns (uint256, uint256, uint256, uint256, uint256); function dai(address) public virtual view returns (uint256); function urns(bytes32, address) public virtual view returns (uint256, uint256); function frob(bytes32, address, address, address, int256, int256) public virtual; function hope(address) public virtual; function move(address, address, uint256) public virtual; } abstract contract GemJoinLike { function dec() public virtual returns (uint256); function gem() public virtual returns (GemLike); function join(address, uint256) public virtual payable; function exit(address, uint256) public virtual; } abstract contract GNTJoinLike { function bags(address) public virtual view returns (address); function make(address) public virtual returns (address); } abstract contract DaiJoinLike { function vat() public virtual returns (VatLike); function dai() public virtual returns (GemLike); function join(address, uint256) public virtual payable; function exit(address, uint256) public virtual; } abstract contract HopeLike { function hope(address) public virtual; function nope(address) public virtual; } abstract contract ProxyRegistryInterface { function build(address) public virtual returns (address); } abstract contract EndLike { function fix(bytes32) public virtual view returns (uint256); function cash(bytes32, uint256) public virtual; function free(bytes32) public virtual; function pack(uint256) public virtual; function skim(bytes32, address) public virtual; } abstract contract JugLike { function drip(bytes32) public virtual returns (uint256); } abstract contract PotLike { function pie(address) public virtual view returns (uint256); function drip() public virtual returns (uint256); function join(uint256) public virtual; function exit(uint256) public virtual; } abstract contract ProxyRegistryLike { function proxies(address) public virtual view returns (address); function build(address) public virtual returns (address); } abstract contract ProxyLike { function owner() public virtual view returns (address); } // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! // WARNING: These functions meant to be used as a a library for a DSProxy. Some are unsafe if you call them directly. // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! contract Common { uint256 constant RAY = 10**27; // Internal functions function mul(uint256 x, uint256 y) internal pure returns (uint256 z) { require(y == 0 || (z = x * y) / y == x, "mul-overflow"); } // Public functions // solhint-disable-next-line func-name-mixedcase function daiJoin_join(address apt, address urn, uint256 wad) public { // Gets DAI from the user's wallet DaiJoinLike(apt).dai().transferFrom(msg.sender, address(this), wad); // Approves adapter to take the DAI amount DaiJoinLike(apt).dai().approve(apt, wad); // Joins DAI into the vat DaiJoinLike(apt).join(urn, wad); } } contract MCDCreateProxyActions is Common { // Internal functions function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x - y) <= x, "sub-overflow"); } function toInt(uint256 x) internal pure returns (int256 y) { y = int256(x); require(y >= 0, "int-overflow"); } function toRad(uint256 wad) internal pure returns (uint256 rad) { rad = mul(wad, 10**27); } function convertTo18(address gemJoin, uint256 amt) internal returns (uint256 wad) { // For those collaterals that have less than 18 decimals precision we need to do the conversion before passing to frob function // Adapters will automatically handle the difference of precision wad = mul(amt, 10**(18 - GemJoinLike(gemJoin).dec())); } function _getDrawDart(address vat, address jug, address urn, bytes32 ilk, uint256 wad) internal returns (int256 dart) { // Updates stability fee rate uint256 rate = JugLike(jug).drip(ilk); // Gets DAI balance of the urn in the vat uint256 dai = VatLike(vat).dai(urn); // If there was already enough DAI in the vat balance, just exits it without adding more debt if (dai < mul(wad, RAY)) { // Calculates the needed dart so together with the existing dai in the vat is enough to exit wad amount of DAI tokens dart = toInt(sub(mul(wad, RAY), dai) / rate); // This is neeeded due lack of precision. It might need to sum an extra dart wei (for the given DAI wad amount) dart = mul(uint256(dart), rate) < mul(wad, RAY) ? dart + 1 : dart; } } function _getWipeDart(address vat, uint256 dai, address urn, bytes32 ilk) internal view returns (int256 dart) { // Gets actual rate from the vat (, uint256 rate, , , ) = VatLike(vat).ilks(ilk); // Gets actual art value of the urn (, uint256 art) = VatLike(vat).urns(ilk, urn); // Uses the whole dai balance in the vat to reduce the debt dart = toInt(dai / rate); // Checks the calculated dart is not higher than urn.art (total debt), otherwise uses its value dart = uint256(dart) <= art ? -dart : -toInt(art); } function _getWipeAllWad(address vat, address usr, address urn, bytes32 ilk) internal view returns (uint256 wad) { // Gets actual rate from the vat (, uint256 rate, , , ) = VatLike(vat).ilks(ilk); // Gets actual art value of the urn (, uint256 art) = VatLike(vat).urns(ilk, urn); // Gets actual dai amount in the urn uint256 dai = VatLike(vat).dai(usr); uint256 rad = sub(mul(art, rate), dai); wad = rad / RAY; // If the rad precision has some dust, it will need to request for 1 extra wad wei wad = mul(wad, RAY) < rad ? wad + 1 : wad; } // Public functions function transfer(address gem, address dst, uint256 wad) public { GemLike(gem).transfer(dst, wad); } // solhint-disable-next-line func-name-mixedcase function ethJoin_join(address apt, address urn) public payable { // Wraps ETH in WETH GemJoinLike(apt).gem().deposit{value: msg.value}(); // Approves adapter to take the WETH amount GemJoinLike(apt).gem().approve(address(apt), msg.value); // Joins WETH collateral into the vat GemJoinLike(apt).join(urn, msg.value); } // solhint-disable-next-line func-name-mixedcase function gemJoin_join(address apt, address urn, uint256 wad, bool transferFrom) public { // Only executes for tokens that have approval/transferFrom implementation if (transferFrom) { // Gets token from the user's wallet GemJoinLike(apt).gem().transferFrom(msg.sender, address(this), wad); // Approves adapter to take the token amount GemJoinLike(apt).gem().approve(apt, 0); GemJoinLike(apt).gem().approve(apt, wad); } // Joins token collateral into the vat GemJoinLike(apt).join(urn, wad); } function hope(address obj, address usr) public { HopeLike(obj).hope(usr); } function nope(address obj, address usr) public { HopeLike(obj).nope(usr); } function open(address manager, bytes32 ilk, address usr) public returns (uint256 cdp) { cdp = ManagerLike(manager).open(ilk, usr); } function give(address manager, uint256 cdp, address usr) public { ManagerLike(manager).give(cdp, usr); } function move(address manager, uint256 cdp, address dst, uint256 rad) public { ManagerLike(manager).move(cdp, dst, rad); } function frob(address manager, uint256 cdp, int256 dink, int256 dart) public { ManagerLike(manager).frob(cdp, dink, dart); } function lockETH(address manager, address ethJoin, uint256 cdp) public payable { // Receives ETH amount, converts it to WETH and joins it into the vat ethJoin_join(ethJoin, address(this)); // Locks WETH amount into the CDP VatLike(ManagerLike(manager).vat()).frob( ManagerLike(manager).ilks(cdp), ManagerLike(manager).urns(cdp), address(this), address(this), toInt(msg.value), 0 ); } function lockGem(address manager, address gemJoin, uint256 cdp, uint256 wad, bool transferFrom) public { // Takes token amount from user's wallet and joins into the vat gemJoin_join(gemJoin, address(this), wad, transferFrom); // Locks token amount into the CDP VatLike(ManagerLike(manager).vat()).frob( ManagerLike(manager).ilks(cdp), ManagerLike(manager).urns(cdp), address(this), address(this), toInt(convertTo18(gemJoin, wad)), 0 ); } function draw(address manager, address jug, address daiJoin, uint256 cdp, uint256 wad) public { address urn = ManagerLike(manager).urns(cdp); address vat = ManagerLike(manager).vat(); bytes32 ilk = ManagerLike(manager).ilks(cdp); // Generates debt in the CDP frob(manager, cdp, 0, _getDrawDart(vat, jug, urn, ilk, wad)); // Moves the DAI amount (balance in the vat in rad) to proxy's address move(manager, cdp, address(this), toRad(wad)); // Allows adapter to access to proxy's DAI balance in the vat if (VatLike(vat).can(address(this), address(daiJoin)) == 0) { VatLike(vat).hope(daiJoin); } // Exits DAI to the user's wallet as a token DaiJoinLike(daiJoin).exit(msg.sender, wad); } function lockETHAndDraw( address manager, address jug, address ethJoin, address daiJoin, uint256 cdp, uint256 wadD ) public payable { address urn = ManagerLike(manager).urns(cdp); address vat = ManagerLike(manager).vat(); bytes32 ilk = ManagerLike(manager).ilks(cdp); // Receives ETH amount, converts it to WETH and joins it into the vat ethJoin_join(ethJoin, urn); // Locks WETH amount into the CDP and generates debt frob(manager, cdp, toInt(msg.value), _getDrawDart(vat, jug, urn, ilk, wadD)); // Moves the DAI amount (balance in the vat in rad) to proxy's address move(manager, cdp, address(this), toRad(wadD)); // Allows adapter to access to proxy's DAI balance in the vat if (VatLike(vat).can(address(this), address(daiJoin)) == 0) { VatLike(vat).hope(daiJoin); } // Exits DAI to the user's wallet as a token DaiJoinLike(daiJoin).exit(msg.sender, wadD); } function openLockETHAndDraw( address manager, address jug, address ethJoin, address daiJoin, bytes32 ilk, uint256 wadD, address owner ) public payable returns (uint256 cdp) { cdp = open(manager, ilk, address(this)); lockETHAndDraw(manager, jug, ethJoin, daiJoin, cdp, wadD); give(manager, cdp, owner); } function lockGemAndDraw( address manager, address jug, address gemJoin, address daiJoin, uint256 cdp, uint256 wadC, uint256 wadD, bool transferFrom ) public { address urn = ManagerLike(manager).urns(cdp); address vat = ManagerLike(manager).vat(); bytes32 ilk = ManagerLike(manager).ilks(cdp); // Takes token amount from user's wallet and joins into the vat gemJoin_join(gemJoin, urn, wadC, transferFrom); // Locks token amount into the CDP and generates debt frob( manager, cdp, toInt(convertTo18(gemJoin, wadC)), _getDrawDart(vat, jug, urn, ilk, wadD) ); // Moves the DAI amount (balance in the vat in rad) to proxy's address move(manager, cdp, address(this), toRad(wadD)); // Allows adapter to access to proxy's DAI balance in the vat if (VatLike(vat).can(address(this), address(daiJoin)) == 0) { VatLike(vat).hope(daiJoin); } // Exits DAI to the user's wallet as a token DaiJoinLike(daiJoin).exit(msg.sender, wadD); } function openLockGemAndDraw( address manager, address jug, address gemJoin, address daiJoin, bytes32 ilk, uint256 wadC, uint256 wadD, bool transferFrom, address owner ) public returns (uint256 cdp) { cdp = open(manager, ilk, address(this)); lockGemAndDraw(manager, jug, gemJoin, daiJoin, cdp, wadC, wadD, transferFrom); give(manager, cdp, owner); } } interface IFlashLoanReceiver { function executeOperation(address _reserve, uint256 _amount, uint256 _fee, bytes calldata _params) external; } abstract contract ILendingPoolAddressesProvider { function getLendingPool() public view virtual returns (address); function setLendingPoolImpl(address _pool) public virtual; function getLendingPoolCore() public virtual view returns (address payable); function setLendingPoolCoreImpl(address _lendingPoolCore) public virtual; function getLendingPoolConfigurator() public virtual view returns (address); function setLendingPoolConfiguratorImpl(address _configurator) public virtual; function getLendingPoolDataProvider() public virtual view returns (address); function setLendingPoolDataProviderImpl(address _provider) public virtual; function getLendingPoolParametersProvider() public virtual view returns (address); function setLendingPoolParametersProviderImpl(address _parametersProvider) public virtual; function getTokenDistributor() public virtual view returns (address); function setTokenDistributor(address _tokenDistributor) public virtual; function getFeeProvider() public virtual view returns (address); function setFeeProviderImpl(address _feeProvider) public virtual; function getLendingPoolLiquidationManager() public virtual view returns (address); function setLendingPoolLiquidationManager(address _manager) public virtual; function getLendingPoolManager() public virtual view returns (address); function setLendingPoolManager(address _lendingPoolManager) public virtual; function getPriceOracle() public virtual view returns (address); function setPriceOracle(address _priceOracle) public virtual; function getLendingRateOracle() public view virtual returns (address); function setLendingRateOracle(address _lendingRateOracle) public virtual; } library EthAddressLib { function ethAddress() internal pure returns(address) { return 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; } } abstract contract FlashLoanReceiverBase is IFlashLoanReceiver { using SafeERC20 for ERC20; using SafeMath for uint256; ILendingPoolAddressesProvider public addressesProvider; constructor(ILendingPoolAddressesProvider _provider) public { addressesProvider = _provider; } receive () external virtual payable {} function transferFundsBackToPoolInternal(address _reserve, uint256 _amount) internal { address payable core = addressesProvider.getLendingPoolCore(); transferInternal(core,_reserve, _amount); } function transferInternal(address payable _destination, address _reserve, uint256 _amount) internal { if(_reserve == EthAddressLib.ethAddress()) { //solium-disable-next-line _destination.call{value: _amount}(""); return; } ERC20(_reserve).safeTransfer(_destination, _amount); } function getBalanceInternal(address _target, address _reserve) internal view returns(uint256) { if(_reserve == EthAddressLib.ethAddress()) { return _target.balance; } return ERC20(_reserve).balanceOf(_target); } } 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 Gem { function dec() virtual public returns (uint); function gem() virtual public returns (Gem); function join(address, uint) virtual public payable; function exit(address, uint) virtual public; function approve(address, uint) virtual public; function transfer(address, uint) virtual public returns (bool); function transferFrom(address, address, uint) virtual public returns (bool); function deposit() virtual public payable; function withdraw(uint) virtual public; function allowance(address, address) virtual public returns (uint); } abstract contract Join { bytes32 public ilk; function dec() virtual public view returns (uint); function gem() virtual public view returns (Gem); function join(address, uint) virtual public payable; function exit(address, uint) virtual public; } abstract contract DSAuthority { function canCall(address src, address dst, bytes4 sig) public virtual view returns (bool); } contract DSAuthEvents { event LogSetAuthority(address indexed authority); event LogSetOwner(address indexed owner); } contract DSAuth is DSAuthEvents { DSAuthority public authority; address public owner; constructor() public { owner = msg.sender; emit LogSetOwner(msg.sender); } function setOwner(address owner_) public auth { owner = owner_; emit LogSetOwner(owner); } function setAuthority(DSAuthority authority_) public auth { authority = authority_; emit LogSetAuthority(address(authority)); } modifier auth { require(isAuthorized(msg.sender, msg.sig)); _; } function isAuthorized(address src, bytes4 sig) internal view returns (bool) { if (src == address(this)) { return true; } else if (src == owner) { return true; } else if (authority == DSAuthority(0)) { return false; } else { return authority.canCall(src, address(this), sig); } } } contract DSNote { event LogNote( bytes4 indexed sig, address indexed guy, bytes32 indexed foo, bytes32 indexed bar, uint256 wad, bytes fax ) anonymous; modifier note { bytes32 foo; bytes32 bar; assembly { foo := calldataload(4) bar := calldataload(36) } emit LogNote(msg.sig, msg.sender, foo, bar, msg.value, msg.data); _; } } abstract contract DSProxy is DSAuth, DSNote { DSProxyCache public cache; // global cache for contracts constructor(address _cacheAddr) public { require(setCache(_cacheAddr)); } // solhint-disable-next-line no-empty-blocks receive() external payable {} // use the proxy to execute calldata _data on contract _code // function execute(bytes memory _code, bytes memory _data) // public // payable // virtual // returns (address target, bytes32 response); function execute(address _target, bytes memory _data) public payable virtual returns (bytes32 response); //set new cache function setCache(address _cacheAddr) public virtual payable returns (bool); } contract DSProxyCache { mapping(bytes32 => address) cache; function read(bytes memory _code) public view returns (address) { bytes32 hash = keccak256(_code); return cache[hash]; } function write(bytes memory _code) public returns (address target) { assembly { target := create(0, add(_code, 0x20), mload(_code)) switch iszero(extcodesize(target)) case 1 { // throw if contract failed to deploy revert(0, 0) } } bytes32 hash = keccak256(_code); cache[hash] = target; } } contract MCDCreateFlashLoan is SaverExchangeCore, AdminAuth, FlashLoanReceiverBase { address public constant CREATE_PROXY_ACTIONS = 0x6d0984E80a86f26c0dd564ca0CF74a8E9Da03305; uint public constant SERVICE_FEE = 400; // 0.25% Fee address public constant DAI_ADDRESS = 0x6B175474E89094C44Da98b954EedeAC495271d0F; ILendingPoolAddressesProvider public LENDING_POOL_ADDRESS_PROVIDER = ILendingPoolAddressesProvider(0x24a42fD28C976A61Df5D00D0599C34c4f90748c8); address public constant DAI_JOIN_ADDRESS = 0x9759A6Ac90977b93B58547b4A71c78317f391A28; address public constant JUG_ADDRESS = 0x19c0976f590D67707E62397C87829d896Dc0f1F1; address public constant MANAGER_ADDRESS = 0x5ef30b9986345249bc32d8928B7ee64DE9435E39; constructor() FlashLoanReceiverBase(LENDING_POOL_ADDRESS_PROVIDER) public {} function executeOperation( address _reserve, uint256 _amount, uint256 _fee, bytes calldata _params) external override { //check the contract has the specified balance require(_amount <= getBalanceInternal(address(this), _reserve), "Invalid balance for the contract"); ( uint[6] memory numData, address[5] memory addrData, bytes memory callData, address proxy ) = abi.decode(_params, (uint256[6],address[5],bytes,address)); ExchangeData memory exchangeData = ExchangeData({ srcAddr: addrData[0], destAddr: addrData[1], srcAmount: numData[2], destAmount: numData[3], minPrice: numData[4], wrapper: addrData[3], exchangeAddr: addrData[2], callData: callData, price0x: numData[5] }); openAndLeverage(numData[0], numData[1] + _fee, addrData[4], proxy, exchangeData); transferFundsBackToPoolInternal(_reserve, _amount.add(_fee)); // if there is some eth left (0x fee), return it to user if (address(this).balance > 0) { tx.origin.transfer(address(this).balance); } } function openAndLeverage( uint _collAmount, uint _daiAmountAndFee, address _joinAddr, address _proxy, ExchangeData memory _exchangeData ) public { uint dfsFee = getFee(_exchangeData.srcAmount, DSProxy(payable(_proxy)).owner()); _exchangeData.srcAmount = (_exchangeData.srcAmount - dfsFee); (, uint256 collSwaped) = _sell(_exchangeData); bytes32 ilk = Join(_joinAddr).ilk(); if (isEthJoinAddr(_joinAddr)) { MCDCreateProxyActions(CREATE_PROXY_ACTIONS).openLockETHAndDraw{value: address(this).balance}( MANAGER_ADDRESS, JUG_ADDRESS, _joinAddr, DAI_JOIN_ADDRESS, ilk, _daiAmountAndFee, _proxy ); } else { ERC20(address(Join(_joinAddr).gem())).safeApprove(CREATE_PROXY_ACTIONS, 0); ERC20(address(Join(_joinAddr).gem())).safeApprove(CREATE_PROXY_ACTIONS, uint256(-1)); MCDCreateProxyActions(CREATE_PROXY_ACTIONS).openLockGemAndDraw( MANAGER_ADDRESS, JUG_ADDRESS, _joinAddr, DAI_JOIN_ADDRESS, ilk, (_collAmount + collSwaped), _daiAmountAndFee, true, _proxy ); } } function getFee(uint _amount, address _owner) internal returns (uint feeAmount) { uint fee = SERVICE_FEE; if (Discount(DISCOUNT_ADDRESS).isCustomFeeSet(_owner)) { fee = Discount(DISCOUNT_ADDRESS).getCustomServiceFee(_owner); } feeAmount = (fee == 0) ? 0 : (_amount / fee); // fee can't go over 20% of the whole amount if (feeAmount > (_amount / 5)) { feeAmount = _amount / 5; } ERC20(DAI_ADDRESS).transfer(WALLET_ID, feeAmount); } /// @notice Checks if the join address is one of the Ether coll. types /// @param _joinAddr Join address to check function isEthJoinAddr(address _joinAddr) internal view returns (bool) { // if it's dai_join_addr don't check gem() it will fail if (_joinAddr == 0x9759A6Ac90977b93B58547b4A71c78317f391A28) return false; // if coll is weth it's and eth type coll if (address(Join(_joinAddr).gem()) == 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2) { return true; } return false; } receive() external override(FlashLoanReceiverBase, SaverExchangeCore) payable {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CREATE_PROXY_ACTIONS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAI_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAI_JOIN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DISCOUNT_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERC20_PROXY_0X","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"JUG_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"KYBER_ETH_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LENDING_POOL_ADDRESS_PROVIDER","outputs":[{"internalType":"contract ILendingPoolAddressesProvider","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGER_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SAVER_EXCHANGE_REGISTRY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SERVICE_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WALLET_ID","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ZRX_ALLOWLIST_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addressesProvider","outputs":[{"internalType":"contract ILendingPoolAddressesProvider","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_reserve","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"bytes","name":"_params","type":"bytes"}],"name":"executeOperation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"kill","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collAmount","type":"uint256"},{"internalType":"uint256","name":"_daiAmountAndFee","type":"uint256"},{"internalType":"address","name":"_joinAddr","type":"address"},{"internalType":"address","name":"_proxy","type":"address"},{"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":"address","name":"wrapper","type":"address"},{"internalType":"address","name":"exchangeAddr","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"price0x","type":"uint256"}],"internalType":"struct SaverExchangeCore.ExchangeData","name":"_exchangeData","type":"tuple"}],"name":"openAndLeverage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","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":"address","name":"wrapper","type":"address"},{"internalType":"address","name":"exchangeAddr","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"price0x","type":"uint256"}],"internalType":"struct SaverExchangeCore.ExchangeData","name":"_exData","type":"tuple"}],"name":"packExchangeData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","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":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"unpackExchangeData","outputs":[{"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":"address","name":"wrapper","type":"address"},{"internalType":"address","name":"exchangeAddr","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"uint256","name":"price0x","type":"uint256"}],"internalType":"struct SaverExchangeCore.ExchangeData","name":"_exData","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawStuckFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600380546001600160a01b0319167324a42fd28c976a61df5d00d0599c34c4f90748c817905534801561003657600080fd5b50600354600080546001600160a01b03199081163317909155600280549091166001600160a01b0390921691909117905561298d806100766000396000f3fe6080604052600436106101855760003560e01c806398ab3d49116100d1578063c72c4d101161008a578063d3661fa511610064578063d3661fa5146103e0578063deca5f88146103f5578063ee87255814610415578063f851a440146104355761018c565b8063c72c4d10146103a1578063cfac57c7146103b6578063d0cc7289146103cb5761018c565b806398ab3d491461030057806399532ae714610315578063a3b8e5d11461032a578063a46a66c914610357578063a7304bf71461036c578063acbeba611461038c5761018c565b8063380d42441161013e57806350c86de51161011857806350c86de51461028757806353485907146102a95780638c8a7958146102d65780638da5cb5b146102eb5761018c565b8063380d42441461023d5780633a1283221461025257806341c0e1b5146102725761018c565b8063040141e5146101915780631e48907b146101bc57806329f7fc9e146101de5780632a4c0a1a146101f3578063303ffcbb14610208578063314b6332146102285761018c565b3661018c57005b600080fd5b34801561019d57600080fd5b506101a661044a565b6040516101b391906124e3565b60405180910390f35b3480156101c857600080fd5b506101dc6101d73660046120ac565b610462565b005b3480156101ea57600080fd5b506101a661049b565b3480156101ff57600080fd5b506101a66104b3565b34801561021457600080fd5b506101dc610223366004612417565b6104cb565b34801561023457600080fd5b506101a66108a6565b34801561024957600080fd5b506101a66108be565b34801561025e57600080fd5b506101dc61026d36600461212b565b6108d6565b34801561027e57600080fd5b506101dc61096f565b34801561029357600080fd5b5061029c610994565b6040516101b3919061285a565b3480156102b557600080fd5b506102c96102c436600461236e565b61099a565b6040516101b391906125e8565b3480156102e257600080fd5b506101a6610a3f565b3480156102f757600080fd5b506101a6610a57565b34801561030c57600080fd5b506101a6610a66565b34801561032157600080fd5b506101a6610a75565b34801561033657600080fd5b5061034a6103453660046122da565b610a8d565b6040516101b391906127c1565b34801561036357600080fd5b506101a6610b27565b34801561037857600080fd5b506101dc6103873660046120ac565b610b3f565b34801561039857600080fd5b506101a6610b78565b3480156103ad57600080fd5b506101a6610b90565b3480156103c257600080fd5b506101a6610b9f565b3480156103d757600080fd5b506101a6610bb7565b3480156103ec57600080fd5b506101a6610bcf565b34801561040157600080fd5b506101dc6104103660046120ac565b610be7565b34801561042157600080fd5b506101dc610430366004612156565b610c14565b34801561044157600080fd5b506101a6610d54565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6001546001600160a01b0316331461047957600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b736b175474e89094c44da98b954eedeac495271d0f81565b600061054b8260400151846001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561050e57600080fd5b505afa158015610522573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054691906120c8565b610d63565b60408301805182900390529050600061056383610f53565b9150506000856001600160a01b031663c5ce281e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156105a157600080fd5b505afa1580156105b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d991906122c2565b90506105e4866111ca565b156106ca57736d0984e80a86f26c0dd564ca0cf74a8e9da033056001600160a01b03166318df6c4e47735ef30b9986345249bc32d8928b7ee64de9435e397319c0976f590d67707e62397c87829d896dc0f1f18a739759a6ac90977b93b58547b4a71c78317f391a28878e8d6040518963ffffffff1660e01b81526004016106729796959493929190612510565b6020604051808303818588803b15801561068b57600080fd5b505af115801561069f573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906106c491906122c2565b5061089c565b610765736d0984e80a86f26c0dd564ca0cf74a8e9da033056000886001600160a01b0316637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b15801561071d57600080fd5b505afa158015610731573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075591906120c8565b6001600160a01b031691906112a7565b6107b9736d0984e80a86f26c0dd564ca0cf74a8e9da03305600019886001600160a01b0316637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b15801561071d57600080fd5b736d0984e80a86f26c0dd564ca0cf74a8e9da033056001600160a01b031663a7ce406e735ef30b9986345249bc32d8928b7ee64de9435e397319c0976f590d67707e62397c87829d896dc0f1f189739759a6ac90977b93b58547b4a71c78317f391a2886888f018e60018e6040518a63ffffffff1660e01b81526004016108489998979695949392919061254d565b602060405180830381600087803b15801561086257600080fd5b505af1158015610876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089a91906122c2565b505b5050505050505050565b7325dd3f51e0c3c3ff164ddc02a8e4d65bb9cbb12d81565b735ef30b9986345249bc32d8928b7ee64de9435e3981565b6000546001600160a01b031633146108ed57600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038316141561095157600080546040516001600160a01b039091169183156108fc02918491818181858888f1935050505015801561094b573d6000803e3d6000fd5b5061096b565b60005461096b906001600160a01b03848116911683611302565b5050565b6000546001600160a01b0316331461098657600080fd5b6000546001600160a01b0316ff5b61019081565b60608082600001518360200151846040015185606001516040516020016109c494939291906125bf565b60408051601f1981840301815290829052608085015160a086015160c087015160e0880151610100890151949650606095610a029590602001612863565b60405160208183030381529060405290508181604051602001610a269291906125fb565b604051602081830303815290604052925050505b919050565b734ba1f38427b33b8ab7bb0490200dae1f1c36823f81565b6000546001600160a01b031681565b6003546001600160a01b031681565b736d0984e80a86f26c0dd564ca0cf74a8e9da0330581565b610a95611e3c565b60608083806020019051810190610aac919061230d565b9150915081806020019051810190610ac491906120e4565b606087015260408601526001600160a01b03908116602080870191909152911684528151610af99190830181019083016123a1565b61010088015260e08701526001600160a01b0390811660c08701521660a08501526080840152509092915050565b731b14e8d511c9a4395425314f849bd737baf8208f81565b6001546001600160a01b03163314610b5657600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b7319c0976f590d67707e62397c87829d896dc0f1f181565b6002546001600160a01b031681565b739759a6ac90977b93b58547b4a71c78317f391a2881565b7395e6f48254609a6ee006f7d493c8e5fb97094cef81565b73322d58b9e75a6918f7e7849aee0ff09369977e0881565b6000546001600160a01b03163314610bfe57600080fd5b6001546001600160a01b031615610b5657600080fd5b610c1e3086611321565b841115610c465760405162461bcd60e51b8152600401610c3d9061270b565b60405180910390fd5b610c4e611eac565b610c56611eca565b60606000610c66858701876121e7565b9350935093509350610c76611e3c565b50604080516101208101825284516001600160a01b0390811682526020808701518216818401528784015183850152606080890151818501526080808a01518186015290880151831660a0808601919091529488015190921660c084015260e0830186905292870151610100830152865192870151908601519192610d019290918b019085856104cb565b610d148a610d0f8b8b6113da565b6113ff565b4715610d485760405132904780156108fc02916000818181858888f19350505050158015610d46573d6000803e3d6000fd5b505b50505050505050505050565b6001546001600160a01b031681565b604051632cdc77ab60e21b815260009061019090731b14e8d511c9a4395425314f849bd737baf8208f9063b371deac90610da19086906004016124e3565b60206040518083038186803b158015610db957600080fd5b505afa158015610dcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df191906122a2565b15610e8057604051636eeb543160e01b8152731b14e8d511c9a4395425314f849bd737baf8208f90636eeb543190610e2d9086906004016124e3565b60206040518083038186803b158015610e4557600080fd5b505afa158015610e59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7d91906122c2565b90505b8015610e9557808481610e8f57fe5b04610e98565b60005b915060058404821115610eac576005840491505b60405163a9059cbb60e01b8152736b175474e89094c44da98b954eedeac495271d0f9063a9059cbb90610ef99073322d58b9e75a6918f7e7849aee0ff09369977e089086906004016124f7565b602060405180830381600087803b158015610f1357600080fd5b505af1158015610f27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4b91906122a2565b505092915050565b604081015181516000918291829182918291906001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561100b578651610f9590611489565b6001600160a01b031687526040808801518151630d0e30db60e41b8152915173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29263d0e30db09291600480830192600092919082900301818588803b158015610ff157600080fd5b505af1158015611005573d6000803e3d6000fd5b50505050505b6101008701511561106257611028876000015188604001516114d0565b600061103c8860000151896040015161151c565b905061104a88826000611563565b90955090935091508215611060578760c0015194505b505b8161107c57611072876000611894565b92508660a0015193505b61108e87608001518860400151611aac565b61109b8860200151611ae1565b10156110b95760405162461bcd60e51b8152600401610c3d9061268e565b60006110d873c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2611ae1565b11156111be576040516370a0823160e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d9082906370a082319061111d9030906004016124e3565b602060405180830381600087803b15801561113757600080fd5b505af115801561114b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116f91906122c2565b6040518263ffffffff1660e01b815260040161118b919061285a565b600060405180830381600087803b1580156111a557600080fd5b505af11580156111b9573d6000803e3d6000fd5b505050505b50919350915050915091565b6000739759a6ac90977b93b58547b4a71c78317f391a286001600160a01b03831614156111f957506000610a3a565b816001600160a01b0316637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b15801561123257600080fd5b505afa158015611246573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126a91906120c8565b6001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316141561129f57506001610a3a565b506000919050565b6112fd8363095ea7b360e01b84846040516024016112c69291906124f7565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611b8b565b505050565b6112fd8363a9059cbb60e01b84846040516024016112c69291906124f7565b600061132b611c1a565b6001600160a01b0316826001600160a01b0316141561135557506001600160a01b038216316113d4565b6040516370a0823160e01b81526001600160a01b038316906370a08231906113819086906004016124e3565b60206040518083038186803b15801561139957600080fd5b505afa1580156113ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d191906122c2565b90505b92915050565b6000828201838110156113d15760405162461bcd60e51b8152600401610c3d90612629565b6002546040805163076b7fbb60e51b815290516000926001600160a01b03169163ed6ff760916004808301926020929190829003018186803b15801561144457600080fd5b505afa158015611458573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147c91906120c8565b90506112fd818484611c32565b60006001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146114b557816113d4565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc292915050565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461096b5761096b6001600160a01b0383167395e6f48254609a6ee006f7d493c8e5fb97094cef836112a7565b60006001600160a01b03831673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2146115495750476113d4565b8147111561155b5781470390506113d4565b504792915050565b600080808084600181111561157457fe5b14156115935761158e8660e0015160248860400151611cc8565b6115a7565b6115a78660e0015160248860600151611cc8565b60c0860151604051620c045f60e41b8152734ba1f38427b33b8ab7bb0490200dae1f1c36823f9162c045f0916115e091906004016124e3565b60206040518083038186803b1580156115f857600080fd5b505afa15801561160c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163091906122a2565b1561163a57600094505b60006116498760200151611ae1565b60c08801516040516302f5cc7960e11b8152919250734ba1f38427b33b8ab7bb0490200dae1f1c36823f916305eb98f291611686916004016124e3565b60206040518083038186803b15801561169e57600080fd5b505afa1580156116b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d691906122a2565b15611749578660c001516001600160a01b0316868860e001516040516116fc91906124c4565b60006040518083038185875af1925050503d8060008114611739576040519150601f19603f3d011682016040523d82523d6000602084013e61173e565b606091505b50508094505061174e565b600093505b6040870151600090851561188557885161176790611ae1565b60208a01519091506001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611873576040516370a0823160e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d9082906370a08231906117d29030906004016124e3565b602060405180830381600087803b1580156117ec57600080fd5b505af1158015611800573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182491906122c2565b6040518263ffffffff1660e01b8152600401611840919061285a565b600060405180830381600087803b15801561185a57600080fd5b505af115801561186e573d6000803e3d6000fd5b505050505b826118818a60200151611ae1565b0391505b90935091505093509350939050565b60a082015160405163e0aa279760e01b81526000917325dd3f51e0c3c3ff164ddc02a8e4d65bb9cbb12d9163e0aa2797916118d1916004016124e3565b60206040518083038186803b1580156118e957600080fd5b505afa1580156118fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192191906122a2565b61193d5760405162461bcd60e51b8152600401610c3d90612660565b60a083015160408401518451600092611961926001600160a01b0390921691611302565b600083600181111561196f57fe5b1415611a0f578360a001516001600160a01b031663cae270b6828660000151876020015188604001516040518563ffffffff1660e01b81526004016119b69392919061259b565b6020604051808303818588803b1580156119cf57600080fd5b505af11580156119e3573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611a0891906122c2565b9150611aa5565b8360a001516001600160a01b031663153e66e6828660000151876020015188606001516040518563ffffffff1660e01b8152600401611a509392919061259b565b6020604051808303818588803b158015611a6957600080fd5b505af1158015611a7d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611aa291906122c2565b91505b5092915050565b6000670de0b6b3a7640000611ad2611ac48585611cf4565b6706f05b59d3b20000611d18565b81611ad957fe5b049392505050565b60006001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611b0f575047610a3a565b6040516370a0823160e01b81526001600160a01b038316906370a0823190611b3b9030906004016124e3565b60206040518083038186803b158015611b5357600080fd5b505afa158015611b67573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d491906122c2565b6060611be0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611d289092919063ffffffff16565b8051909150156112fd5780806020019051810190611bfe91906122a2565b6112fd5760405162461bcd60e51b8152600401610c3d90612777565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b611c3a611c1a565b6001600160a01b0316826001600160a01b03161415611cb457826001600160a01b031681604051611c6a906124e0565b60006040518083038185875af1925050503d8060008114611ca7576040519150601f19603f3d011682016040523d82523d6000602084013e611cac565b606091505b5050506112fd565b6112fd6001600160a01b0383168483611302565b8160200183511015611cec5760405162461bcd60e51b8152600401610c3d906126c5565b910160200152565b6000811580611d0f57505080820282828281611d0c57fe5b04145b6113d457600080fd5b808201828110156113d457600080fd5b6060611d378484600085611d3f565b949350505050565b6060611d4a85611e03565b611d665760405162461bcd60e51b8152600401610c3d90612740565b60006060866001600160a01b03168587604051611d8391906124c4565b60006040518083038185875af1925050503d8060008114611dc0576040519150601f19603f3d011682016040523d82523d6000602084013e611dc5565b606091505b50915091508115611dd9579150611d379050565b805115611de95780518082602001fd5b8360405162461bcd60e51b8152600401610c3d91906125e8565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611d37575050151592915050565b60405180610120016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160608152602001600081525090565b6040518060c001604052806006906020820280368337509192915050565b6040518060a001604052806005906020820280368337509192915050565b80356113d48161293f565b600082601f830112611f03578081fd5b611f0d60a06128a7565b905080828460a085011115611f2157600080fd5b60005b6005811015611f4d578135611f388161293f565b83526020928301929190910190600101611f24565b50505092915050565b600082601f830112611f66578081fd5b8135611f79611f74826128eb565b6128a7565b9150808252836020828501011115611f9057600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112611fb9578081fd5b8151611fc7611f74826128eb565b9150808252836020828501011115611fde57600080fd5b611aa581602084016020860161290f565b6000610120808385031215612002578182fd5b61200b816128a7565b9150506120188383611ee8565b81526120278360208401611ee8565b60208201526040820135604082015260608201356060820152608082013560808201526120578360a08401611ee8565b60a08201526120698360c08401611ee8565b60c082015260e082013567ffffffffffffffff81111561208857600080fd5b61209484828501611f56565b60e08301525061010080830135818301525092915050565b6000602082840312156120bd578081fd5b81356113d18161293f565b6000602082840312156120d9578081fd5b81516113d18161293f565b600080600080608085870312156120f9578283fd5b84516121048161293f565b60208601519094506121158161293f565b6040860151606090960151949790965092505050565b6000806040838503121561213d578182fd5b82356121488161293f565b946020939093013593505050565b60008060008060006080868803121561216d578081fd5b85356121788161293f565b94506020860135935060408601359250606086013567ffffffffffffffff808211156121a2578283fd5b818801915088601f8301126121b5578283fd5b8135818111156121c3578384fd5b8960208285010111156121d4578384fd5b9699959850939650602001949392505050565b6000806000806101a085870312156121fd578384fd5b85601f86011261220b578384fd5b6006612219611f74826128ce565b808760c089018a81111561222b578889fd5b885b8581101561224b57823585526020948501949092019160010161222d565b508298506122598b82611ef3565b9750505050505061016085013567ffffffffffffffff81111561227a578283fd5b61228687828801611f56565b925050612297866101808701611ee8565b905092959194509250565b6000602082840312156122b3578081fd5b815180151581146113d1578182fd5b6000602082840312156122d3578081fd5b5051919050565b6000602082840312156122eb578081fd5b813567ffffffffffffffff811115612301578182fd5b611aa284828501611f56565b6000806040838503121561231f578182fd5b825167ffffffffffffffff80821115612336578384fd5b61234286838701611fa9565b93506020850151915080821115612357578283fd5b5061236485828601611fa9565b9150509250929050565b60006020828403121561237f578081fd5b813567ffffffffffffffff811115612395578182fd5b611aa284828501611fef565b600080600080600060a086880312156123b8578283fd5b8551945060208601516123ca8161293f565b60408701519094506123db8161293f565b606087015190935067ffffffffffffffff8111156123f7578182fd5b61240388828901611fa9565b925050608086015190509295509295909350565b600080600080600060a0868803121561242e578283fd5b853594506020860135935060408601356124478161293f565b925060608601356124578161293f565b9150608086013567ffffffffffffffff811115612472578182fd5b61247e88828901611fef565b9150509295509295909350565b6001600160a01b03169052565b600081518084526124b081602086016020860161290f565b601f01601f19169290920160200192915050565b600082516124d681846020870161290f565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039788168152958716602087015293861660408601529185166060850152608084015260a083015290911660c082015260e00190565b6001600160a01b03998a168152978916602089015295881660408801529387166060870152608086019290925260a085015260c0840152151560e08301529091166101008201526101200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6000602082526113d16020830184612498565b60006040825261260e6040830185612498565b82810360208401526126208185612498565b95945050505050565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526014908201527315dc985c1c195c881a5cc81b9bdd081d985b1a5960621b604082015260600190565b6020808252601a908201527f46696e616c20616d6f756e742069736e277420636f7272656374000000000000604082015260600190565b60208082526026908201527f496e636f7272656e74206c656e6774207768696c65207772697474696e6720626040820152653cba32b9999960d11b606082015260800190565b6020808252818101527f496e76616c69642062616c616e636520666f722074686520636f6e7472616374604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6000602082526127d560208301845161248b565b60208301516127e7604084018261248b565b506040830151606083015260608301516080830152608083015160a083015260a083015161281860c084018261248b565b5060c083015161282b60e084018261248b565b5060e0830151610120610100818186015261284a610140860184612498565b9501519301929092525090919050565b90815260200190565b8581526001600160a01b0385811660208301528416604082015260a06060820181905260009061289590830185612498565b90508260808301529695505050505050565b60405181810167ffffffffffffffff811182821017156128c657600080fd5b604052919050565b600067ffffffffffffffff8211156128e4578081fd5b5060200290565b600067ffffffffffffffff821115612901578081fd5b50601f01601f191660200190565b60005b8381101561292a578181015183820152602001612912565b83811115612939576000848401525b50505050565b6001600160a01b038116811461295457600080fd5b5056fea26469706673582212204d32e72c7eb63fd23e3c04ca0d405a3d64fc4302c76335f8ddd7b1b3bdae5a1164736f6c634300060c0033
Deployed Bytecode
0x6080604052600436106101855760003560e01c806398ab3d49116100d1578063c72c4d101161008a578063d3661fa511610064578063d3661fa5146103e0578063deca5f88146103f5578063ee87255814610415578063f851a440146104355761018c565b8063c72c4d10146103a1578063cfac57c7146103b6578063d0cc7289146103cb5761018c565b806398ab3d491461030057806399532ae714610315578063a3b8e5d11461032a578063a46a66c914610357578063a7304bf71461036c578063acbeba611461038c5761018c565b8063380d42441161013e57806350c86de51161011857806350c86de51461028757806353485907146102a95780638c8a7958146102d65780638da5cb5b146102eb5761018c565b8063380d42441461023d5780633a1283221461025257806341c0e1b5146102725761018c565b8063040141e5146101915780631e48907b146101bc57806329f7fc9e146101de5780632a4c0a1a146101f3578063303ffcbb14610208578063314b6332146102285761018c565b3661018c57005b600080fd5b34801561019d57600080fd5b506101a661044a565b6040516101b391906124e3565b60405180910390f35b3480156101c857600080fd5b506101dc6101d73660046120ac565b610462565b005b3480156101ea57600080fd5b506101a661049b565b3480156101ff57600080fd5b506101a66104b3565b34801561021457600080fd5b506101dc610223366004612417565b6104cb565b34801561023457600080fd5b506101a66108a6565b34801561024957600080fd5b506101a66108be565b34801561025e57600080fd5b506101dc61026d36600461212b565b6108d6565b34801561027e57600080fd5b506101dc61096f565b34801561029357600080fd5b5061029c610994565b6040516101b3919061285a565b3480156102b557600080fd5b506102c96102c436600461236e565b61099a565b6040516101b391906125e8565b3480156102e257600080fd5b506101a6610a3f565b3480156102f757600080fd5b506101a6610a57565b34801561030c57600080fd5b506101a6610a66565b34801561032157600080fd5b506101a6610a75565b34801561033657600080fd5b5061034a6103453660046122da565b610a8d565b6040516101b391906127c1565b34801561036357600080fd5b506101a6610b27565b34801561037857600080fd5b506101dc6103873660046120ac565b610b3f565b34801561039857600080fd5b506101a6610b78565b3480156103ad57600080fd5b506101a6610b90565b3480156103c257600080fd5b506101a6610b9f565b3480156103d757600080fd5b506101a6610bb7565b3480156103ec57600080fd5b506101a6610bcf565b34801561040157600080fd5b506101dc6104103660046120ac565b610be7565b34801561042157600080fd5b506101dc610430366004612156565b610c14565b34801561044157600080fd5b506101a6610d54565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6001546001600160a01b0316331461047957600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b736b175474e89094c44da98b954eedeac495271d0f81565b600061054b8260400151846001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561050e57600080fd5b505afa158015610522573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054691906120c8565b610d63565b60408301805182900390529050600061056383610f53565b9150506000856001600160a01b031663c5ce281e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156105a157600080fd5b505afa1580156105b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d991906122c2565b90506105e4866111ca565b156106ca57736d0984e80a86f26c0dd564ca0cf74a8e9da033056001600160a01b03166318df6c4e47735ef30b9986345249bc32d8928b7ee64de9435e397319c0976f590d67707e62397c87829d896dc0f1f18a739759a6ac90977b93b58547b4a71c78317f391a28878e8d6040518963ffffffff1660e01b81526004016106729796959493929190612510565b6020604051808303818588803b15801561068b57600080fd5b505af115801561069f573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906106c491906122c2565b5061089c565b610765736d0984e80a86f26c0dd564ca0cf74a8e9da033056000886001600160a01b0316637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b15801561071d57600080fd5b505afa158015610731573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075591906120c8565b6001600160a01b031691906112a7565b6107b9736d0984e80a86f26c0dd564ca0cf74a8e9da03305600019886001600160a01b0316637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b15801561071d57600080fd5b736d0984e80a86f26c0dd564ca0cf74a8e9da033056001600160a01b031663a7ce406e735ef30b9986345249bc32d8928b7ee64de9435e397319c0976f590d67707e62397c87829d896dc0f1f189739759a6ac90977b93b58547b4a71c78317f391a2886888f018e60018e6040518a63ffffffff1660e01b81526004016108489998979695949392919061254d565b602060405180830381600087803b15801561086257600080fd5b505af1158015610876573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089a91906122c2565b505b5050505050505050565b7325dd3f51e0c3c3ff164ddc02a8e4d65bb9cbb12d81565b735ef30b9986345249bc32d8928b7ee64de9435e3981565b6000546001600160a01b031633146108ed57600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6001600160a01b038316141561095157600080546040516001600160a01b039091169183156108fc02918491818181858888f1935050505015801561094b573d6000803e3d6000fd5b5061096b565b60005461096b906001600160a01b03848116911683611302565b5050565b6000546001600160a01b0316331461098657600080fd5b6000546001600160a01b0316ff5b61019081565b60608082600001518360200151846040015185606001516040516020016109c494939291906125bf565b60408051601f1981840301815290829052608085015160a086015160c087015160e0880151610100890151949650606095610a029590602001612863565b60405160208183030381529060405290508181604051602001610a269291906125fb565b604051602081830303815290604052925050505b919050565b734ba1f38427b33b8ab7bb0490200dae1f1c36823f81565b6000546001600160a01b031681565b6003546001600160a01b031681565b736d0984e80a86f26c0dd564ca0cf74a8e9da0330581565b610a95611e3c565b60608083806020019051810190610aac919061230d565b9150915081806020019051810190610ac491906120e4565b606087015260408601526001600160a01b03908116602080870191909152911684528151610af99190830181019083016123a1565b61010088015260e08701526001600160a01b0390811660c08701521660a08501526080840152509092915050565b731b14e8d511c9a4395425314f849bd737baf8208f81565b6001546001600160a01b03163314610b5657600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b7319c0976f590d67707e62397c87829d896dc0f1f181565b6002546001600160a01b031681565b739759a6ac90977b93b58547b4a71c78317f391a2881565b7395e6f48254609a6ee006f7d493c8e5fb97094cef81565b73322d58b9e75a6918f7e7849aee0ff09369977e0881565b6000546001600160a01b03163314610bfe57600080fd5b6001546001600160a01b031615610b5657600080fd5b610c1e3086611321565b841115610c465760405162461bcd60e51b8152600401610c3d9061270b565b60405180910390fd5b610c4e611eac565b610c56611eca565b60606000610c66858701876121e7565b9350935093509350610c76611e3c565b50604080516101208101825284516001600160a01b0390811682526020808701518216818401528784015183850152606080890151818501526080808a01518186015290880151831660a0808601919091529488015190921660c084015260e0830186905292870151610100830152865192870151908601519192610d019290918b019085856104cb565b610d148a610d0f8b8b6113da565b6113ff565b4715610d485760405132904780156108fc02916000818181858888f19350505050158015610d46573d6000803e3d6000fd5b505b50505050505050505050565b6001546001600160a01b031681565b604051632cdc77ab60e21b815260009061019090731b14e8d511c9a4395425314f849bd737baf8208f9063b371deac90610da19086906004016124e3565b60206040518083038186803b158015610db957600080fd5b505afa158015610dcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df191906122a2565b15610e8057604051636eeb543160e01b8152731b14e8d511c9a4395425314f849bd737baf8208f90636eeb543190610e2d9086906004016124e3565b60206040518083038186803b158015610e4557600080fd5b505afa158015610e59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7d91906122c2565b90505b8015610e9557808481610e8f57fe5b04610e98565b60005b915060058404821115610eac576005840491505b60405163a9059cbb60e01b8152736b175474e89094c44da98b954eedeac495271d0f9063a9059cbb90610ef99073322d58b9e75a6918f7e7849aee0ff09369977e089086906004016124f7565b602060405180830381600087803b158015610f1357600080fd5b505af1158015610f27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4b91906122a2565b505092915050565b604081015181516000918291829182918291906001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561100b578651610f9590611489565b6001600160a01b031687526040808801518151630d0e30db60e41b8152915173c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29263d0e30db09291600480830192600092919082900301818588803b158015610ff157600080fd5b505af1158015611005573d6000803e3d6000fd5b50505050505b6101008701511561106257611028876000015188604001516114d0565b600061103c8860000151896040015161151c565b905061104a88826000611563565b90955090935091508215611060578760c0015194505b505b8161107c57611072876000611894565b92508660a0015193505b61108e87608001518860400151611aac565b61109b8860200151611ae1565b10156110b95760405162461bcd60e51b8152600401610c3d9061268e565b60006110d873c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2611ae1565b11156111be576040516370a0823160e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d9082906370a082319061111d9030906004016124e3565b602060405180830381600087803b15801561113757600080fd5b505af115801561114b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116f91906122c2565b6040518263ffffffff1660e01b815260040161118b919061285a565b600060405180830381600087803b1580156111a557600080fd5b505af11580156111b9573d6000803e3d6000fd5b505050505b50919350915050915091565b6000739759a6ac90977b93b58547b4a71c78317f391a286001600160a01b03831614156111f957506000610a3a565b816001600160a01b0316637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b15801561123257600080fd5b505afa158015611246573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126a91906120c8565b6001600160a01b031673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316141561129f57506001610a3a565b506000919050565b6112fd8363095ea7b360e01b84846040516024016112c69291906124f7565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611b8b565b505050565b6112fd8363a9059cbb60e01b84846040516024016112c69291906124f7565b600061132b611c1a565b6001600160a01b0316826001600160a01b0316141561135557506001600160a01b038216316113d4565b6040516370a0823160e01b81526001600160a01b038316906370a08231906113819086906004016124e3565b60206040518083038186803b15801561139957600080fd5b505afa1580156113ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d191906122c2565b90505b92915050565b6000828201838110156113d15760405162461bcd60e51b8152600401610c3d90612629565b6002546040805163076b7fbb60e51b815290516000926001600160a01b03169163ed6ff760916004808301926020929190829003018186803b15801561144457600080fd5b505afa158015611458573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147c91906120c8565b90506112fd818484611c32565b60006001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146114b557816113d4565b73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc292915050565b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1461096b5761096b6001600160a01b0383167395e6f48254609a6ee006f7d493c8e5fb97094cef836112a7565b60006001600160a01b03831673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2146115495750476113d4565b8147111561155b5781470390506113d4565b504792915050565b600080808084600181111561157457fe5b14156115935761158e8660e0015160248860400151611cc8565b6115a7565b6115a78660e0015160248860600151611cc8565b60c0860151604051620c045f60e41b8152734ba1f38427b33b8ab7bb0490200dae1f1c36823f9162c045f0916115e091906004016124e3565b60206040518083038186803b1580156115f857600080fd5b505afa15801561160c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163091906122a2565b1561163a57600094505b60006116498760200151611ae1565b60c08801516040516302f5cc7960e11b8152919250734ba1f38427b33b8ab7bb0490200dae1f1c36823f916305eb98f291611686916004016124e3565b60206040518083038186803b15801561169e57600080fd5b505afa1580156116b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d691906122a2565b15611749578660c001516001600160a01b0316868860e001516040516116fc91906124c4565b60006040518083038185875af1925050503d8060008114611739576040519150601f19603f3d011682016040523d82523d6000602084013e61173e565b606091505b50508094505061174e565b600093505b6040870151600090851561188557885161176790611ae1565b60208a01519091506001600160a01b031673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611873576040516370a0823160e01b815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc290632e1a7d4d9082906370a08231906117d29030906004016124e3565b602060405180830381600087803b1580156117ec57600080fd5b505af1158015611800573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182491906122c2565b6040518263ffffffff1660e01b8152600401611840919061285a565b600060405180830381600087803b15801561185a57600080fd5b505af115801561186e573d6000803e3d6000fd5b505050505b826118818a60200151611ae1565b0391505b90935091505093509350939050565b60a082015160405163e0aa279760e01b81526000917325dd3f51e0c3c3ff164ddc02a8e4d65bb9cbb12d9163e0aa2797916118d1916004016124e3565b60206040518083038186803b1580156118e957600080fd5b505afa1580156118fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192191906122a2565b61193d5760405162461bcd60e51b8152600401610c3d90612660565b60a083015160408401518451600092611961926001600160a01b0390921691611302565b600083600181111561196f57fe5b1415611a0f578360a001516001600160a01b031663cae270b6828660000151876020015188604001516040518563ffffffff1660e01b81526004016119b69392919061259b565b6020604051808303818588803b1580156119cf57600080fd5b505af11580156119e3573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611a0891906122c2565b9150611aa5565b8360a001516001600160a01b031663153e66e6828660000151876020015188606001516040518563ffffffff1660e01b8152600401611a509392919061259b565b6020604051808303818588803b158015611a6957600080fd5b505af1158015611a7d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611aa291906122c2565b91505b5092915050565b6000670de0b6b3a7640000611ad2611ac48585611cf4565b6706f05b59d3b20000611d18565b81611ad957fe5b049392505050565b60006001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611b0f575047610a3a565b6040516370a0823160e01b81526001600160a01b038316906370a0823190611b3b9030906004016124e3565b60206040518083038186803b158015611b5357600080fd5b505afa158015611b67573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d491906122c2565b6060611be0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611d289092919063ffffffff16565b8051909150156112fd5780806020019051810190611bfe91906122a2565b6112fd5760405162461bcd60e51b8152600401610c3d90612777565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee90565b611c3a611c1a565b6001600160a01b0316826001600160a01b03161415611cb457826001600160a01b031681604051611c6a906124e0565b60006040518083038185875af1925050503d8060008114611ca7576040519150601f19603f3d011682016040523d82523d6000602084013e611cac565b606091505b5050506112fd565b6112fd6001600160a01b0383168483611302565b8160200183511015611cec5760405162461bcd60e51b8152600401610c3d906126c5565b910160200152565b6000811580611d0f57505080820282828281611d0c57fe5b04145b6113d457600080fd5b808201828110156113d457600080fd5b6060611d378484600085611d3f565b949350505050565b6060611d4a85611e03565b611d665760405162461bcd60e51b8152600401610c3d90612740565b60006060866001600160a01b03168587604051611d8391906124c4565b60006040518083038185875af1925050503d8060008114611dc0576040519150601f19603f3d011682016040523d82523d6000602084013e611dc5565b606091505b50915091508115611dd9579150611d379050565b805115611de95780518082602001fd5b8360405162461bcd60e51b8152600401610c3d91906125e8565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611d37575050151592915050565b60405180610120016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b0316815260200160608152602001600081525090565b6040518060c001604052806006906020820280368337509192915050565b6040518060a001604052806005906020820280368337509192915050565b80356113d48161293f565b600082601f830112611f03578081fd5b611f0d60a06128a7565b905080828460a085011115611f2157600080fd5b60005b6005811015611f4d578135611f388161293f565b83526020928301929190910190600101611f24565b50505092915050565b600082601f830112611f66578081fd5b8135611f79611f74826128eb565b6128a7565b9150808252836020828501011115611f9057600080fd5b8060208401602084013760009082016020015292915050565b600082601f830112611fb9578081fd5b8151611fc7611f74826128eb565b9150808252836020828501011115611fde57600080fd5b611aa581602084016020860161290f565b6000610120808385031215612002578182fd5b61200b816128a7565b9150506120188383611ee8565b81526120278360208401611ee8565b60208201526040820135604082015260608201356060820152608082013560808201526120578360a08401611ee8565b60a08201526120698360c08401611ee8565b60c082015260e082013567ffffffffffffffff81111561208857600080fd5b61209484828501611f56565b60e08301525061010080830135818301525092915050565b6000602082840312156120bd578081fd5b81356113d18161293f565b6000602082840312156120d9578081fd5b81516113d18161293f565b600080600080608085870312156120f9578283fd5b84516121048161293f565b60208601519094506121158161293f565b6040860151606090960151949790965092505050565b6000806040838503121561213d578182fd5b82356121488161293f565b946020939093013593505050565b60008060008060006080868803121561216d578081fd5b85356121788161293f565b94506020860135935060408601359250606086013567ffffffffffffffff808211156121a2578283fd5b818801915088601f8301126121b5578283fd5b8135818111156121c3578384fd5b8960208285010111156121d4578384fd5b9699959850939650602001949392505050565b6000806000806101a085870312156121fd578384fd5b85601f86011261220b578384fd5b6006612219611f74826128ce565b808760c089018a81111561222b578889fd5b885b8581101561224b57823585526020948501949092019160010161222d565b508298506122598b82611ef3565b9750505050505061016085013567ffffffffffffffff81111561227a578283fd5b61228687828801611f56565b925050612297866101808701611ee8565b905092959194509250565b6000602082840312156122b3578081fd5b815180151581146113d1578182fd5b6000602082840312156122d3578081fd5b5051919050565b6000602082840312156122eb578081fd5b813567ffffffffffffffff811115612301578182fd5b611aa284828501611f56565b6000806040838503121561231f578182fd5b825167ffffffffffffffff80821115612336578384fd5b61234286838701611fa9565b93506020850151915080821115612357578283fd5b5061236485828601611fa9565b9150509250929050565b60006020828403121561237f578081fd5b813567ffffffffffffffff811115612395578182fd5b611aa284828501611fef565b600080600080600060a086880312156123b8578283fd5b8551945060208601516123ca8161293f565b60408701519094506123db8161293f565b606087015190935067ffffffffffffffff8111156123f7578182fd5b61240388828901611fa9565b925050608086015190509295509295909350565b600080600080600060a0868803121561242e578283fd5b853594506020860135935060408601356124478161293f565b925060608601356124578161293f565b9150608086013567ffffffffffffffff811115612472578182fd5b61247e88828901611fef565b9150509295509295909350565b6001600160a01b03169052565b600081518084526124b081602086016020860161290f565b601f01601f19169290920160200192915050565b600082516124d681846020870161290f565b9190910192915050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039788168152958716602087015293861660408601529185166060850152608084015260a083015290911660c082015260e00190565b6001600160a01b03998a168152978916602089015295881660408801529387166060870152608086019290925260a085015260c0840152151560e08301529091166101008201526101200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0394851681529290931660208301526040820152606081019190915260800190565b6000602082526113d16020830184612498565b60006040825261260e6040830185612498565b82810360208401526126208185612498565b95945050505050565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526014908201527315dc985c1c195c881a5cc81b9bdd081d985b1a5960621b604082015260600190565b6020808252601a908201527f46696e616c20616d6f756e742069736e277420636f7272656374000000000000604082015260600190565b60208082526026908201527f496e636f7272656e74206c656e6774207768696c65207772697474696e6720626040820152653cba32b9999960d11b606082015260800190565b6020808252818101527f496e76616c69642062616c616e636520666f722074686520636f6e7472616374604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6000602082526127d560208301845161248b565b60208301516127e7604084018261248b565b506040830151606083015260608301516080830152608083015160a083015260a083015161281860c084018261248b565b5060c083015161282b60e084018261248b565b5060e0830151610120610100818186015261284a610140860184612498565b9501519301929092525090919050565b90815260200190565b8581526001600160a01b0385811660208301528416604082015260a06060820181905260009061289590830185612498565b90508260808301529695505050505050565b60405181810167ffffffffffffffff811182821017156128c657600080fd5b604052919050565b600067ffffffffffffffff8211156128e4578081fd5b5060200290565b600067ffffffffffffffff821115612901578081fd5b50601f01601f191660200190565b60005b8381101561292a578181015183820152602001612912565b83811115612939576000848401525b50505050565b6001600160a01b038116811461295457600080fd5b5056fea26469706673582212204d32e72c7eb63fd23e3c04ca0d405a3d64fc4302c76335f8ddd7b1b3bdae5a1164736f6c634300060c0033
Deployed Bytecode Sourcemap
50742:4814:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14745:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11786:122;;;;;;;;;;-1:-1:-1;11786:122:0;;;;;:::i;:::-;;:::i;:::-;;14652:86;;;;;;;;;;;;;:::i;50988:80::-;;;;;;;;;;;;;:::i;52914:1434::-;;;;;;;;;;-1:-1:-1;52914:1434:0;;;;;:::i;:::-;;:::i;15020:92::-;;;;;;;;;;;;;:::i;51407:84::-;;;;;;;;;;;;;:::i;12081:285::-;;;;;;;;;;-1:-1:-1;12081:285:0;;;;;:::i;:::-;;:::i;11954:80::-;;;;;;;;;;;;;:::i;50930:38::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25802:641::-;;;;;;;;;;-1:-1:-1;25802:641:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;15211:87::-;;;;;;;;;;;;;:::i;10893:20::-;;;;;;;;;;;;;:::i;51077:142::-;;;;;;;;;;;;;:::i;50832:89::-;;;;;;;;;;;;;:::i;26451:684::-;;;;;;;;;;-1:-1:-1;26451:684:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;14928:85::-;;;;;;;;;;;;;:::i;11565:122::-;;;;;;;;;;-1:-1:-1;11565:122:0;;;;;:::i;:::-;;:::i;51320:80::-;;;;;;;;;;;;;:::i;44547:54::-;;;;;;;;;;;;;:::i;51228:85::-;;;;;;;;;;;;;:::i;15121:83::-;;;;;;;;;;;;;:::i;14835:86::-;;;;;;;;;;;;;:::i;11282:161::-;;;;;;;;;;-1:-1:-1;11282:161:0;;;;;:::i;:::-;;:::i;51584:1322::-;;;;;;;;;;-1:-1:-1;51584:1322:0;;;;;:::i;:::-;;:::i;10920:20::-;;;;;;;;;;;;;:::i;14745:81::-;14784:42;14745:81;:::o;11786:122::-;11867:5;;-1:-1:-1;;;;;11867:5:0;11853:10;:19;11845:28;;;;;;11886:5;:14;;-1:-1:-1;;;;;;11886:14:0;-1:-1:-1;;;;;11886:14:0;;;;;;;;;;11786:122::o;14652:86::-;14696:42;14652:86;:::o;50988:80::-;51026:42;50988:80;:::o;52914:1434::-;53122:11;53136:65;53143:13;:23;;;53184:6;-1:-1:-1;;;;;53168:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53136:6;:65::i;:::-;53241:23;;;;;:32;;;53214:60;;53122:79;-1:-1:-1;;53310:20:0;53241:13;53310:5;:20::i;:::-;53285:45;;;53343:11;53362:9;-1:-1:-1;;;;;53357:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53343:35;;53395:24;53409:9;53395:13;:24::i;:::-;53391:950;;;50879:42;-1:-1:-1;;;;;53436:62:0;;53506:21;51449:42;51358;53611:9;51271:42;53674:3;53696:16;53731:6;53436:316;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53391:950;;;53785:74;50879:42;53857:1;53804:9;-1:-1:-1;;;;;53799:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;53785:49:0;;:74;:49;:74::i;:::-;53874:84;50879:42;-1:-1:-1;;53893:9:0;-1:-1:-1;;;;;53888:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53874:84;50879:42;-1:-1:-1;;;;;53975:62:0;;51449:42;51358;54120:9;51271:42;54183:3;54220:10;54206:11;:24;54250:16;54285:4;54308:6;53975:354;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;53391:950;52914:1434;;;;;;;;:::o;15020:92::-;15070:42;15020:92;:::o;51407:84::-;51449:42;51407:84;:::o;12081:285::-;10989:5;;-1:-1:-1;;;;;10989:5:0;10998:10;10989:19;10981:28;;;;;;12181:42:::1;-1:-1:-1::0;;;;;12171:52:0;::::1;;12167:192;;;12248:5;::::0;;12240:32:::1;::::0;-1:-1:-1;;;;;12248:5:0;;::::1;::::0;12240:32;::::1;;;::::0;12264:7;;12240:32;12248:5;12240:32;12264:7;12248:5;12240:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;12167:192;;;12332:5;::::0;12305:42:::1;::::0;-1:-1:-1;;;;;12305:26:0;;::::1;::::0;12332:5:::1;12339:7:::0;12305:26:::1;:42::i;:::-;12081:285:::0;;:::o;11954:80::-;10989:5;;-1:-1:-1;;;;;10989:5:0;10998:10;10989:19;10981:28;;;;;;12019:5:::1;::::0;-1:-1:-1;;;;;12019:5:0::1;11998:28;50930:38:::0;50965:3;50930:38;:::o;25802:641::-;25877:12;26009:18;26055:7;:15;;;26085:7;:16;;;26116:7;:17;;;26148:7;:18;;;26030:147;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;26030:147:0;;;;;;;;;;26236:16;;;;26267:15;;;;26297:20;;;;26332:16;;;;26363:15;;;;26030:147;;-1:-1:-1;26190:18:0;;26211:178;;26363:15;26030:147;26211:178;;:::i;:::-;;;;;;;;;;;;;26190:199;;26422:5;26429;26411:24;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26404:31;;;;25802:641;;;;:::o;15211:87::-;15256:42;15211:87;:::o;10893:20::-;;;-1:-1:-1;;;;;10893:20:0;;:::o;51077:142::-;;;-1:-1:-1;;;;;51077:142:0;;:::o;50832:89::-;50879:42;50832:89;:::o;26451:684::-;26519:27;;:::i;:::-;26574:18;26607;26650:5;26639:32;;;;;;;;;;;;:::i;:::-;26559:112;;;;26835:5;26824:52;;;;;;;;;;;;:::i;:::-;26792:18;;;26684:192;26760:17;;;26684:192;-1:-1:-1;;;;;26684:192:0;;;26729:16;;;;26684:192;;;;;;;;27069:58;;;;;;;;;;;;;:::i;:::-;27031:15;;;26889:238;27000:16;;;26889:238;-1:-1:-1;;;;;26889:238:0;;;26965:20;;;26889:238;;26935:15;;;26889:238;26904:16;;;26889:238;-1:-1:-1;26904:7:0;;26451:684;-1:-1:-1;;26451:684:0:o;14928:85::-;14971:42;14928:85;:::o;11565:122::-;11646:5;;-1:-1:-1;;;;;11646:5:0;11632:10;:19;11624:28;;;;;;11665:5;:14;;-1:-1:-1;;;;;;11665:14:0;-1:-1:-1;;;;;11665:14:0;;;;;;;;;;11565:122::o;51320:80::-;51358:42;51320:80;:::o;44547:54::-;;;-1:-1:-1;;;;;44547:54:0;;:::o;51228:85::-;51271:42;51228:85;:::o;15121:83::-;15162:42;15121:83;:::o;14835:86::-;14879:42;14835:86;:::o;11282:161::-;11363:5;;-1:-1:-1;;;;;11363:5:0;11349:10;:19;11341:28;;;;;;11388:5;;-1:-1:-1;;;;;11388:5:0;:19;11380:28;;;;;51584:1322;51831:43;51858:4;51865:8;51831:18;:43::i;:::-;51820:7;:54;;51812:112;;;;-1:-1:-1;;;51812:112:0;;;;;;;:::i;:::-;;;;;;;;;51952:22;;:::i;:::-;51989:26;;:::i;:::-;52030:21;52066:13;52103:58;;;;52114:7;52103:58;:::i;:::-;51937:224;;;;;;;;52174:32;;:::i;:::-;-1:-1:-1;52209:346:0;;;;;;;;52246:11;;-1:-1:-1;;;;;52209:346:0;;;;;52246:11;52282;;;;52209:346;;;;;;52319:10;;;;52209:346;;;;;52356:10;;;;52209:346;;;;;52391:10;;;;52209:346;;;;52425:11;;;;52209:346;;;;;;;;;;52465:11;;;;52209:346;;;;;;;;;;;;;52533:10;;;;52209:346;;;;52584:10;;52596;;;;52615:11;;;;52209:346;;52568:80;;52584:10;;52596:17;;;52628:5;52209:346;52568:15;:80::i;:::-;52661:60;52693:8;52703:17;:7;52715:4;52703:11;:17::i;:::-;52661:31;:60::i;:::-;52804:21;:25;52800:99;;52846:41;;:9;;52865:21;52846:41;;;;;;;;;52865:21;52846:9;:41;;;;;;;;;;;;;;;;;;;;;52800:99;51584:1322;;;;;;;;;;:::o;10920:20::-;;;-1:-1:-1;;;;;10920:20:0;;:::o;54356:541::-;54486:49;;-1:-1:-1;;;54486:49:0;;54420:14;;50965:3;;14971:42;;54486:41;;:49;;54528:6;;54486:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54482:142;;;54558:54;;-1:-1:-1;;;54558:54:0;;14971:42;;54558:46;;:54;;54605:6;;54558:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54552:60;;54482:142;54649:8;;54648:32;;54676:3;54666:7;:13;;;;;;54648:32;;;54661:1;54648:32;54636:44;-1:-1:-1;54774:1:0;54764:7;:11;54751:9;:25;54747:81;;;54815:1;54805:7;:11;54793:23;;54747:81;54840:49;;-1:-1:-1;;;54840:49:0;;51026:42;;54840:27;;:49;;14879:42;;54879:9;;54840:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;54356:541;;;;;:::o;18181:1522::-;18365:16;;;;18442:14;;18242:7;;;;;;;;;;18365:16;-1:-1:-1;;;;;18442:35:0;14696:42;18442:35;18438:191;;;18525:14;;18511:29;;:13;:29::i;:::-;-1:-1:-1;;;;;18494:46:0;;;18598:16;;;;;18555:62;;-1:-1:-1;;;18555:62:0;;;;14784:42;;18555:36;;18598:16;18555:62;;;;;18494:14;;18555:62;;;;;;;18598:16;14784:42;18555:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18438:191;18708:14;;;;:18;18704:372;;18743:48;18758:6;:14;;;18774:6;:16;;;18743:14;:48::i;:::-;18808:14;18825:48;18840:6;:14;;;18856:6;:16;;;18825:14;:48::i;:::-;18808:65;;18926:45;18936:6;18944:9;18955:15;18926:9;:45::i;:::-;18888:83;;-1:-1:-1;18888:83:0;;-1:-1:-1;18888:83:0;-1:-1:-1;18988:77:0;;;;19030:6;:19;;;19020:29;;18988:77;18704:372;;19146:7;19141:129;;19185:34;19195:6;19203:15;19185:9;:34::i;:::-;19170:49;;19244:6;:14;;;19234:24;;19141:129;19321:39;19326:6;:15;;;19343:6;:16;;;19321:4;:39::i;:::-;19290:27;19301:6;:15;;;19290:10;:27::i;:::-;:70;;19282:109;;;;-1:-1:-1;;;19282:109:0;;;;;;;:::i;:::-;19499:1;19472:24;14784:42;19472:10;:24::i;:::-;:28;19468:185;;;19573:53;;-1:-1:-1;;;19573:53:0;;14784:42;;19517:37;;14784:42;;19573:38;;:53;;19620:4;;19573:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19517:124;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19468:185;-1:-1:-1;19673:7:0;;-1:-1:-1;19682:12:0;-1:-1:-1;;18181:1522:0;;;:::o;55029:436::-;55094:4;55193:42;-1:-1:-1;;;;;55180:55:0;;;55176:73;;;-1:-1:-1;55244:5:0;55237:12;;55176:73;55330:9;-1:-1:-1;;;;;55325:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;55317:76:0;55351:42;-1:-1:-1;;;;;55317:76:0;;55313:120;;;-1:-1:-1;55417:4:0;55410:11;;55313:120;-1:-1:-1;55452:5:0;55029:436;;;:::o;9584:184::-;9670:90;9690:5;9720:22;;;9744:7;9753:5;9697:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;9697:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;9697:62:0;-1:-1:-1;;;;;;9697:62:0;;;;;;;;;;9670:19;:90::i;:::-;9584:184;;;:::o;9035:176::-;9117:86;9137:5;9167:23;;;9192:2;9196:5;9144:58;;;;;;;;;:::i;45363:262::-;45448:7;45483:26;:24;:26::i;:::-;-1:-1:-1;;;;;45471:38:0;:8;-1:-1:-1;;;;;45471:38:0;;45468:94;;;-1:-1:-1;;;;;;45535:15:0;;;45528:22;;45468:94;45581:34;;-1:-1:-1;;;45581:34:0;;-1:-1:-1;;;;;45581:25:0;;;;;:34;;45607:7;;45581:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45574:41;;45363:262;;;;;:::o;7196:181::-;7254:7;7286:5;;;7310:6;;;;7302:46;;;;-1:-1:-1;;;7302:46:0;;;;;;;:::i;44772:220::-;44893:17;;:38;;;-1:-1:-1;;;44893:38:0;;;;44870:20;;-1:-1:-1;;;;;44893:17:0;;:36;;:38;;;;;;;;;;;;;;:17;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44870:61;;44944:40;44961:4;44966:8;44976:7;44944:16;:40::i;24740:142::-;24800:7;-1:-1:-1;;;;;24827:25:0;;14696:42;24827:25;:47;;24870:4;24827:47;;;14784:42;24820:54;24740:142;-1:-1:-1;;24740:142:0:o;15774:212::-;-1:-1:-1;;;;;15856:31:0;;14696:42;15856:31;15852:127;;15904:63;-1:-1:-1;;;;;15904:29:0;;15162:42;15959:7;15904:29;:63::i;25051:743::-;25135:7;-1:-1:-1;;;;;25234:24:0;;14784:42;25234:24;25230:58;;-1:-1:-1;25267:21:0;25260:28;;25230:58;25563:10;25539:21;:34;25535:81;;;25606:10;25582:21;:34;25575:41;;;;25535:81;-1:-1:-1;25765:21:0;25051:743;;;;:::o;21629:1602::-;21766:12;;;;21886:5;:24;;;;;;;;;21882:197;;;21927:53;21940:7;:16;;;21958:2;21962:7;:17;;;21927:12;:53::i;:::-;21882:197;;;22013:54;22026:7;:16;;;22044:2;22048:7;:18;;;22013:12;:54::i;:::-;22145:20;;;;22095:71;;-1:-1:-1;;;22095:71:0;;15256:42;;22095:49;;:71;;22145:20;22095:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22091:118;;;22196:1;22183:14;;22091:118;22221:20;22244:28;22255:7;:16;;;22244:10;:28::i;:::-;22332:20;;;;22289:64;;-1:-1:-1;;;22289:64:0;;22221:51;;-1:-1:-1;15256:42:0;;22289;;:64;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22285:221;;;22384:7;:20;;;-1:-1:-1;;;;;22384:25:0;22417:10;22429:7;:16;;;22384:62;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22370:76;;;;;22285:221;;;22489:5;22479:15;;22285:221;22574:17;;;;22518:20;;22604:565;;;;22733:15;;22722:27;;:10;:27::i;:::-;22816:16;;;;22709:40;;-1:-1:-1;;;;;;22816:37:0;14696:42;22816:37;22812:210;;;22934:53;;-1:-1:-1;;;22934:53:0;;14784:42;;22874:37;;14784:42;;22934:38;;:53;;22981:4;;22934:53;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22874:132;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22812:210;23145:12;23114:28;23125:7;:16;;;23114:10;:28::i;:::-;:43;23099:58;;22604:565;23198:12;;-1:-1:-1;23212:10:0;-1:-1:-1;;21629:1602:0;;;;;;;:::o;23497:742::-;23676:15;;;;23619:73;;-1:-1:-1;;;23619:73:0;;23581:17;;15070:42;;23619:56;;:73;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23611:106;;;;-1:-1:-1;;;23611:106:0;;;;;;;:::i;:::-;23796:15;;;;23813:17;;;;23766:15;;23730:13;;23760:71;;-1:-1:-1;;;;;23760:35:0;;;;;:71::i;:::-;23857:15;23848:5;:24;;;;;;;;;23844:388;;;23924:7;:15;;;-1:-1:-1;;;;;23904:63:0;;23975:8;23985:7;:15;;;24002:7;:16;;;24020:7;:17;;;23904:134;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23889:149;;23844:388;;;24106:7;:15;;;-1:-1:-1;;;;;24086:62:0;;24156:8;24166:7;:15;;;24183:7;:16;;;24201:7;:18;;;24086:134;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24071:149;;23844:388;23497:742;;;;;:::o;1112:122::-;1171:9;1061:6;1197:23;1201:9;1205:1;1208;1201:3;:9::i;:::-;1212:7;1197:3;:23::i;:::-;:29;;;;;;;1112:122;-1:-1:-1;;;1112:122:0:o;15491:275::-;15554:12;-1:-1:-1;;;;;15583:31:0;;14696:42;15583:31;15579:180;;;-1:-1:-1;15641:21:0;15579:180;;;15705:42;;-1:-1:-1;;;15705:42:0;;-1:-1:-1;;;;;15705:27:0;;;;;:42;;15741:4;;15705:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;10407:419::-;10489:23;10515:69;10543:4;10515:69;;;;;;;;;;;;;;;;;10523:5;-1:-1:-1;;;;;10515:27:0;;;:69;;;;;:::i;:::-;10599:17;;10489:95;;-1:-1:-1;10599:21:0;10595:224;;10741:10;10730:30;;;;;;;;;;;;:::i;:::-;10722:85;;;;-1:-1:-1;;;10722:85:0;;;;;;;:::i;44281:121::-;44352:42;44281:121;:::o;45000:355::-;45127:26;:24;:26::i;:::-;-1:-1:-1;;;;;45115:38:0;:8;-1:-1:-1;;;;;45115:38:0;;45112:168;;;45210:12;-1:-1:-1;;;;;45210:17:0;45235:7;45210:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45262:7;;45112:168;45292:51;-1:-1:-1;;;;;45292:28:0;;45321:12;45335:7;45292:28;:51::i;24247:397::-;24356:6;24365:2;24356:11;24344:2;:9;:23;24340:104;;;24384:48;;-1:-1:-1;;;24384:48:0;;;;;;;:::i;24340:104::-;24603:15;;24510:2;24603:15;24596:30;24581:56::o;331:127::-;389:9;419:6;;;:30;;-1:-1:-1;;434:5:0;;;448:1;443;434:5;443:1;429:15;;;;;:20;419:30;411:39;;;;;89:113;182:5;;;177:16;;;;169:25;;;;;5426:196;5529:12;5561:53;5584:6;5592:4;5598:1;5601:12;5561:22;:53::i;:::-;5554:60;5426:196;-1:-1:-1;;;;5426:196:0:o;6188:979::-;6318:12;6351:18;6362:6;6351:10;:18::i;:::-;6343:60;;;;-1:-1:-1;;;6343:60:0;;;;;;;:::i;:::-;6477:12;6491:23;6518:6;-1:-1:-1;;;;;6518:11:0;6538:8;6549:4;6518:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6476:78;;;;6569:7;6565:595;;;6600:10;-1:-1:-1;6593:17:0;;-1:-1:-1;6593:17:0;6565:595;6714:17;;:21;6710:439;;6977:10;6971:17;7038:15;7025:10;7021:2;7017:19;7010:44;6925:148;7120:12;7113:20;;-1:-1:-1;;;7113:20:0;;;;;;;;:::i;4213:619::-;4273:4;4741:20;;4584:66;4781:23;;;;;;:42;;-1:-1:-1;;4808:15:0;;;4773:51;-1:-1:-1;;4213:619:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;72:20;;97:33;72:20;97:33;:::i;612:616::-;;727:3;720:4;712:6;708:17;704:27;694:2;;-1:-1;;735:12;694:2;788:78;31817:17;788:78;:::i;:::-;779:87;;872:16;931:17;989:3;31817:17;964:3;960:27;957:36;954:2;;;1006:1;;996:12;954:2;1031:1;1016:206;769:4;1038:1;1035:13;1016:206;;;85:6;72:20;97:33;124:5;97:33;:::i;:::-;1109:50;;31829:4;1173:14;;;;1201;;;;;1063:1;1056:9;1016:206;;;1020:14;;;687:541;;;;:::o;2514:440::-;;2615:3;2608:4;2600:6;2596:17;2592:27;2582:2;;-1:-1;;2623:12;2582:2;2670:6;2657:20;2692:64;2707:48;2748:6;2707:48;:::i;:::-;2692:64;:::i;:::-;2683:73;;2776:6;2769:5;2762:21;2880:3;2812:4;2871:6;2804;2862:16;;2859:25;2856:2;;;2897:1;;2887:12;2856:2;34859:6;2812:4;2804:6;2800:17;2812:4;2838:5;2834:16;34836:30;34915:1;34897:16;;;2812:4;34897:16;34890:27;2838:5;2575:379;-1:-1;;2575:379::o;2963:442::-;;3075:3;3068:4;3060:6;3056:17;3052:27;3042:2;;-1:-1;;3083:12;3042:2;3123:6;3117:13;3145:64;3160:48;3201:6;3160:48;:::i;3145:64::-;3136:73;;3229:6;3222:5;3215:21;3333:3;3265:4;3324:6;3257;3315:16;;3312:25;3309:2;;;3350:1;;3340:12;3309:2;3360:39;3392:6;3265:4;3291:5;3287:16;3265:4;3257:6;3253:17;3360:39;:::i;3622:1626::-;;3741:6;;3729:9;3724:3;3720:19;3716:32;3713:2;;;-1:-1;;3751:12;3713:2;3779:22;3741:6;3779:22;:::i;:::-;3770:31;;;3886:49;3931:3;3907:22;3886:49;:::i;:::-;3868:16;3861:75;4034:49;4079:3;4001:2;4059:9;4055:22;4034:49;:::i;:::-;4001:2;4020:5;4016:16;4009:75;4150:2;4208:9;4204:22;5322:20;4150:2;4169:5;4165:16;4158:75;4300:2;4358:9;4354:22;5322:20;4300:2;4319:5;4315:16;4308:75;4448:3;4507:9;4503:22;5322:20;4448:3;4468:5;4464:16;4457:75;4630:49;4675:3;4596;4655:9;4651:22;4630:49;:::i;:::-;4596:3;4616:5;4612:16;4605:75;4783:49;4828:3;4749;4808:9;4804:22;4783:49;:::i;:::-;4749:3;4769:5;4765:16;4758:75;4926:3;4915:9;4911:19;4898:33;4951:18;4943:6;4940:30;4937:2;;;3854:1;;4973:12;4937:2;5018:58;5072:3;5063:6;5052:9;5048:22;5018:58;:::i;:::-;4926:3;5004:5;5000:16;4993:84;;5141:3;;5202:9;5198:22;5322:20;5141:3;5161:5;5157:18;5150:77;;3707:1541;;;;:::o;5533:241::-;;5637:2;5625:9;5616:7;5612:23;5608:32;5605:2;;;-1:-1;;5643:12;5605:2;85:6;72:20;97:33;124:5;97:33;:::i;5781:263::-;;5896:2;5884:9;5875:7;5871:23;5867:32;5864:2;;;-1:-1;;5902:12;5864:2;226:6;220:13;238:33;265:5;238:33;:::i;6337:704::-;;;;;6519:3;6507:9;6498:7;6494:23;6490:33;6487:2;;;-1:-1;;6526:12;6487:2;528:6;522:13;540:41;575:5;540:41;:::i;:::-;6697:2;6755:22;;522:13;6578:82;;-1:-1;540:41;522:13;540:41;:::i;:::-;6824:2;6874:22;;5470:13;6943:2;6993:22;;;5470:13;6481:560;;6705:82;;-1:-1;6481:560;-1:-1;;;6481:560::o;7048:366::-;;;7169:2;7157:9;7148:7;7144:23;7140:32;7137:2;;;-1:-1;;7175:12;7137:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;7227:63;7327:2;7366:22;;;;5322:20;;-1:-1;;;7131:283::o;7421:741::-;;;;;;7595:3;7583:9;7574:7;7570:23;7566:33;7563:2;;;-1:-1;;7602:12;7563:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;7654:63;-1:-1;7754:2;7793:22;;5322:20;;-1:-1;7862:2;7901:22;;5322:20;;-1:-1;7998:2;7983:18;;7970:32;8022:18;8011:30;;;8008:2;;;-1:-1;;8044:12;8008:2;8129:6;8118:9;8114:22;;;2283:3;2276:4;2268:6;2264:17;2260:27;2250:2;;-1:-1;;2291:12;2250:2;2334:6;2321:20;8022:18;2353:6;2350:30;2347:2;;;-1:-1;;2383:12;2347:2;2478:3;7754:2;2458:17;2419:6;2444:32;;2441:41;2438:2;;;-1:-1;;2485:12;2438:2;7557:605;;;;-1:-1;7557:605;;-1:-1;7754:2;2415:17;;8064:82;7557:605;-1:-1;;;7557:605::o;8169:832::-;;;;;8387:3;8375:9;8366:7;8362:23;8358:33;8355:2;;;-1:-1;;8394:12;8355:2;1370:3;1363:4;1355:6;1351:17;1347:27;1337:2;;-1:-1;;1378:12;1337:2;1412:4;1431:78;1446:62;1412:4;1446:62;:::i;1431:78::-;1515:16;1574:17;1612;1607:3;1603:27;1632:3;1603:27;1600:36;1597:2;;;-1:-1;;1639:12;1597:2;-1:-1;1659:206;1412:4;1681:1;1678:13;1659:206;;;5322:20;;1752:50;;1624:4;1816:14;;;;1844;;;;1706:1;1699:9;1659:206;;;1663:14;8446:86;;;8588:76;8656:7;8632:22;8588:76;:::i;:::-;8578:86;;;;;;;8729:3;8718:9;8714:19;8701:33;8754:18;8746:6;8743:30;8740:2;;;-1:-1;;8776:12;8740:2;8806:62;8860:7;8851:6;8840:9;8836:22;8806:62;:::i;:::-;8796:72;;;8924:61;8977:7;8905:3;8957:9;8953:22;8924:61;:::i;:::-;8914:71;;8349:652;;;;;;;:::o;9008:257::-;;9120:2;9108:9;9099:7;9095:23;9091:32;9088:2;;;-1:-1;;9126:12;9088:2;1960:6;1954:13;35658:5;33619:13;33612:21;35636:5;35633:32;35623:2;;-1:-1;;35669:12;9272:263;;9387:2;9375:9;9366:7;9362:23;9358:32;9355:2;;;-1:-1;;9393:12;9355:2;-1:-1;2092:13;;9349:186;-1:-1;9349:186::o;9542:345::-;;9655:2;9643:9;9634:7;9630:23;9626:32;9623:2;;;-1:-1;;9661:12;9623:2;9719:17;9706:31;9757:18;9749:6;9746:30;9743:2;;;-1:-1;;9779:12;9743:2;9809:62;9863:7;9854:6;9843:9;9839:22;9809:62;:::i;9894:593::-;;;10044:2;10032:9;10023:7;10019:23;10015:32;10012:2;;;-1:-1;;10050:12;10012:2;10101:17;10095:24;10139:18;;10131:6;10128:30;10125:2;;;-1:-1;;10161:12;10125:2;10191:73;10256:7;10247:6;10236:9;10232:22;10191:73;:::i;:::-;10181:83;;10322:2;10311:9;10307:18;10301:25;10287:39;;10139:18;10338:6;10335:30;10332:2;;;-1:-1;;10368:12;10332:2;;10398:73;10463:7;10454:6;10443:9;10439:22;10398:73;:::i;:::-;10388:83;;;10006:481;;;;;:::o;10788:387::-;;10922:2;10910:9;10901:7;10897:23;10893:32;10890:2;;;-1:-1;;10928:12;10890:2;10986:17;10973:31;11024:18;11016:6;11013:30;11010:2;;;-1:-1;;11046:12;11010:2;11076:83;11151:7;11142:6;11131:9;11127:22;11076:83;:::i;11452:938::-;;;;;;11660:3;11648:9;11639:7;11635:23;11631:33;11628:2;;;-1:-1;;11667:12;11628:2;5476:6;5470:13;11719:74;;11830:2;11892:9;11888:22;522:13;540:41;575:5;540:41;:::i;:::-;11957:2;12015:22;;522:13;11838:82;;-1:-1;540:41;522:13;540:41;:::i;:::-;12105:2;12090:18;;12084:25;11965:82;;-1:-1;12129:18;12118:30;;12115:2;;;-1:-1;;12151:12;12115:2;12181:73;12246:7;12237:6;12226:9;12222:22;12181:73;:::i;:::-;12171:83;;;12291:3;12346:9;12342:22;5470:13;12300:74;;11622:768;;;;;;;;:::o;12397:889::-;;;;;;12599:3;12587:9;12578:7;12574:23;12570:33;12567:2;;;-1:-1;;12606:12;12567:2;5335:6;5322:20;12658:63;;12758:2;12801:9;12797:22;5322:20;12766:63;;12866:2;12909:9;12905:22;72:20;97:33;124:5;97:33;:::i;:::-;12874:63;-1:-1;12974:2;13013:22;;72:20;97:33;72:20;97:33;:::i;:::-;12982:63;-1:-1;13110:3;13095:19;;13082:33;13135:18;13124:30;;13121:2;;;-1:-1;;13157:12;13121:2;13187:83;13262:7;13253:6;13242:9;13238:22;13187:83;:::i;:::-;13177:93;;;12561:725;;;;;;;;:::o;13442:137::-;-1:-1;;;;;33896:54;13529:45;;13523:56::o;14047:323::-;;14179:5;32522:12;32797:6;32792:3;32785:19;14262:52;14307:6;32834:4;32829:3;32825:14;32834:4;14288:5;14284:16;14262:52;:::i;:::-;35292:7;35276:14;-1:-1;;35272:28;14326:39;;;;32834:4;14326:39;;14127:243;-1:-1;;14127:243::o;20434:271::-;;14887:5;32522:12;14998:52;15043:6;15038:3;15031:4;15024:5;15020:16;14998:52;:::i;:::-;15062:16;;;;;20568:137;-1:-1;;20568:137::o;20712:379::-;21076:10;20900:191::o;21098:222::-;-1:-1;;;;;33896:54;;;;13529:45;;21225:2;21210:18;;21196:124::o;21833:349::-;-1:-1;;;;;33896:54;;;;13372:58;;22168:2;22153:18;;13998:37;21996:2;21981:18;;21967:215::o;22189:892::-;-1:-1;;;;;33896:54;;;13529:45;;33896:54;;;22649:2;22634:18;;13529:45;33896:54;;;22732:2;22717:18;;13529:45;33896:54;;;22815:2;22800:18;;13529:45;22898:3;22883:19;;13998:37;33907:42;22967:19;;13998:37;33896:54;;;23066:3;23051:19;;13529:45;22484:3;22469:19;;22455:626::o;23088:1104::-;-1:-1;;;;;33896:54;;;13529:45;;33896:54;;;23598:2;23583:18;;13529:45;33896:54;;;23681:2;23666:18;;13529:45;33896:54;;;23764:2;23749:18;;13529:45;23847:3;23832:19;;13998:37;;;;33907:42;23916:19;;13998:37;24015:3;24000:19;;13998:37;33619:13;33612:21;24093:3;24078:19;;13881:34;33896:54;;;24177:3;24162:19;;13529:45;23433:3;23418:19;;23404:788::o;24199:444::-;-1:-1;;;;;33896:54;;;13529:45;;33896:54;;;;24546:2;24531:18;;13529:45;24629:2;24614:18;;13998:37;;;;24382:2;24367:18;;24353:290::o;24650:556::-;-1:-1;;;;;33896:54;;;13529:45;;33896:54;;;;25026:2;25011:18;;13529:45;25109:2;25094:18;;13998:37;25192:2;25177:18;;13998:37;;;;24861:3;24846:19;;24832:374::o;25553:306::-;;25698:2;25719:17;25712:47;25773:76;25698:2;25687:9;25683:18;25835:6;25773:76;:::i;25866:501::-;;26057:2;26078:17;26071:47;26132:76;26057:2;26046:9;26042:18;26194:6;26132:76;:::i;:::-;26256:9;26250:4;26246:20;26241:2;26230:9;26226:18;26219:48;26281:76;26352:4;26343:6;26281:76;:::i;:::-;26273:84;26028:339;-1:-1;;;;;26028:339::o;26996:416::-;27196:2;27210:47;;;15878:2;27181:18;;;32785:19;15914:29;32825:14;;;15894:50;15963:12;;;27167:245::o;27419:416::-;27619:2;27633:47;;;16214:2;27604:18;;;32785:19;-1:-1;;;32825:14;;;16230:43;16292:12;;;27590:245::o;27842:416::-;28042:2;28056:47;;;16543:2;28027:18;;;32785:19;16579:28;32825:14;;;16559:49;16627:12;;;28013:245::o;28265:416::-;28465:2;28479:47;;;16878:2;28450:18;;;32785:19;16914:34;32825:14;;;16894:55;-1:-1;;;16969:12;;;16962:30;17011:12;;;28436:245::o;28688:416::-;28888:2;28902:47;;;28873:18;;;32785:19;17298:34;32825:14;;;17278:55;17352:12;;;28859:245::o;29111:416::-;29311:2;29325:47;;;17908:2;29296:18;;;32785:19;17944:31;32825:14;;;17924:52;17995:12;;;29282:245::o;29534:416::-;29734:2;29748:47;;;18246:2;29719:18;;;32785:19;18282:34;32825:14;;;18262:55;-1:-1;;;18337:12;;;18330:34;18383:12;;;29705:245::o;29957:390::-;;30144:2;30165:17;30158:47;18755:63;30144:2;30133:9;30129:18;18732:16;18726:23;18755:63;:::i;:::-;30144:2;18894:5;18890:16;18884:23;18913:63;18961:14;30133:9;18961:14;18947:12;18913:63;:::i;:::-;;18961:14;19053:5;19049:16;19043:23;19120:14;30133:9;19120:14;13998:37;19120:14;19213:5;19209:16;19203:23;19280:14;30133:9;19280:14;13998:37;19280:14;19371:5;19367:16;19361:23;19438:14;30133:9;19438:14;13998:37;19438:14;19528:5;19524:16;19518:23;19547:63;19595:14;30133:9;19595:14;19581:12;19547:63;:::i;:::-;;19595:14;19690:5;19686:16;19680:23;19709:63;19757:14;30133:9;19757:14;19743:12;19709:63;:::i;:::-;;19757:14;19848:5;19844:16;19838:23;18655:6;19881:14;18655:6;19881:14;30133:9;19881:14;19874:38;19927:71;18646:16;30133:9;18646:16;19979:12;19927:71;:::i;:::-;20075:18;;20069:25;20148:16;;13998:37;;;;-1:-1;19919:79;;30115:232;-1:-1;30115:232::o;30354:222::-;13998:37;;;30481:2;30466:18;;30452:124::o;30583:752::-;13998:37;;;-1:-1;;;;;33896:54;;;31005:2;30990:18;;13529:45;33896:54;;31088:2;31073:18;;13529:45;33907:42;31125:2;31110:18;;31103:48;;;30583:752;;31165:76;;30825:19;;31227:6;31165:76;:::i;:::-;31157:84;;14028:5;31320:3;31309:9;31305:19;13998:37;30811:524;;;;;;;;:::o;31342:256::-;31404:2;31398:9;31430:17;;;31505:18;31490:34;;31526:22;;;31487:62;31484:2;;;31562:1;;31552:12;31484:2;31404;31571:22;31382:216;;-1:-1;31382:216::o;31605:244::-;;31762:18;31754:6;31751:30;31748:2;;;-1:-1;;31784:12;31748:2;-1:-1;31829:4;31817:17;;31685:164::o;32107:321::-;;32250:18;32242:6;32239:30;32236:2;;;-1:-1;;32272:12;32236:2;-1:-1;35292:7;32326:17;-1:-1;;32322:33;32413:4;32403:15;;32173:255::o;34932:268::-;34997:1;35004:101;35018:6;35015:1;35012:13;35004:101;;;35085:11;;;35079:18;35066:11;;;35059:39;35040:2;35033:10;35004:101;;;35120:6;35117:1;35114:13;35111:2;;;34997:1;35176:6;35171:3;35167:16;35160:27;35111:2;;34981:219;;;:::o;35313:117::-;-1:-1;;;;;33896:54;;35372:35;;35362:2;;35421:1;;35411:12;35362:2;35356:74;:::o
Swarm Source
ipfs://4d32e72c7eb63fd23e3c04ca0d405a3d64fc4302c76335f8ddd7b1b3bdae5a11
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.