Transactions
Token Transfers
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
- Contract name:
- MilkShiba
- Optimization enabled
- true
- Compiler version
- v0.8.12+commit.f00d7308
- Optimization runs
- 50
- EVM Version
- default
- Verified at
- 2022-03-30T23:56:55.166869Z
Contract source code
// SPDX-License-Identifier: MIT /* MilkShiba - the one true Shib on Milkomeda www.MilkShiba.com t.me/MilkShiba */ pragma solidity ^0.8.12; library SafeMathInt { int256 private constant MIN_INT256 = int256(1) << 255; int256 private constant MAX_INT256 = ~(int256(1) << 255); function mul(int256 a, int256 b) internal pure returns (int256) { int256 c = a * b; require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256)); require((b == 0) || (c / b == a)); return c; } function div(int256 a, int256 b) internal pure returns (int256) { require(b != -1 || a != MIN_INT256); return a / b; } function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a)); return c; } function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } function abs(int256 a) internal pure returns (int256) { require(a != MIN_INT256); return a < 0 ? -a : a; } } 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) { 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; return c; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0); return a % b; } } library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } } interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); } interface IDEXPair { function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function sync() external; } interface IDEXRouter{ function factory() external pure returns (address); function WETH() external pure returns (address); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } interface IDEXFactory { function getPair(address tokenA, address tokenB) external view returns (address pair); function createPair(address tokenA, address tokenB) external returns (address pair); } contract Ownable { address private _owner; event OwnershipRenounced(address indexed previousOwner); event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); constructor() { _owner = msg.sender; } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(isOwner()); _; } function isOwner() public view returns (bool) { return msg.sender == _owner; } function renounceOwnership() public onlyOwner { emit OwnershipRenounced(_owner); _owner = address(0); } function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } function _transferOwnership(address newOwner) internal { require(newOwner != address(0)); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } abstract contract ERC20Detailed is IERC20 { string private _name; string private _symbol; uint8 private _decimals; constructor( string memory name_, string memory symbol_, uint8 decimals_ ) { _name = name_; _symbol = symbol_; _decimals = decimals_; } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns (uint8) { return _decimals; } } contract MilkShiba is ERC20Detailed, Ownable { using SafeMath for uint256; using SafeMathInt for int256; event LogRebase(uint256 indexed epoch, uint256 totalSupply); string public _name = "MilkShiba"; string public _symbol = "MSHIB"; uint8 public _decimals = 5; IDEXPair public pairContract; mapping(address => bool) _isFeeExempt; uint256 public constant DECIMALS = 5; uint256 public constant MAX_UINT256 = ~uint256(0); uint8 public constant RATE_DECIMALS = 7; uint256 private constant INITIAL_FRAGMENTS_SUPPLY = 325 * 10**3 * 10**DECIMALS; uint256 public liquidityFeeBuy = 40; uint256 public spoiledMilkFeeBuy = 0; uint256 public liquidityFeeSell = 40; uint256 public spoiledMilkFeeSell = 20; uint256 public swapFeeBuy = 90; uint256 public swapFeeSell = 120; uint256 public milkTankShare = 30; uint256 public milkWarShare = 30; uint256 public milkBankShare = 40; uint256 public milkPupBountyPercent = 66; uint256 public totalFeeBuy = liquidityFeeBuy.add(swapFeeBuy).add(spoiledMilkFeeBuy); uint256 public totalFeeSell = liquidityFeeSell.add(swapFeeSell).add(spoiledMilkFeeSell); uint256 public constant feeDenominator = 1000; IDEXRouter public router; address public constant DEAD = 0x000000000000000000000000000000000000dEaD; address public constant ZERO = 0x0000000000000000000000000000000000000000; //ADA Mainnet address public USDAddress = address(0xB44a9B6905aF7c801311e8F4E76932ee959c663C); address public _routerAddress = address(0x9D2E30C2FB648BeE307EDBaFDb461b09DF79516C); // //ADA Testnet // address public USDAddress = address(0xC12F6Ee5c853393105f29EF0310e61e6B494a70F); // address public _routerAddress = address(0x347e2a75e99174d46D94B5D7b4BE8f294bc2F5Fc); using EnumerableSet for EnumerableSet.AddressSet; EnumerableSet.AddressSet electedCouncil; EnumerableSet.AddressSet milkPups; address public milkShiba = ZERO; uint256 public milkShibaScore; address public milkPup = ZERO; uint256 public milkPupScore; uint256 public totalmilkPup; uint256 public timeLastMilkPup; uint256 public timeLastMilkShiba; uint256 public milkPupRoundDuration = 30 minutes; uint256 public milkShibaRoundDuration = 1 days; mapping(address => uint256) public timesAsmilkPup; mapping(address => uint256) public timesWinMilkBattle; mapping(address => uint256) public timesWinBuy; mapping(address => uint256) public maxWinBuy; mapping(address => uint256) public winCouncilBuy; mapping(address => uint256) public individualmilkShibaBounty; mapping(address => uint256) public individualmilkPupBounty; address public mostWinsmilkPup; uint256 public mostWinsAsmilkPup; uint256 public totalmilkShibaBounty; uint256 public totalmilkPupBounty; mapping(address => bool) public fallenToGreed; uint256 public totalFallenToGreed; address public autoLiquidityFund; address public milkBank; address public milkTank; address public spoiledMilk; address public pairAddress; bool public swapEnabled = true; bool public useTradeLimits = true; address public pair; bool inSwap = false; modifier swapping() { inSwap = true; _; inSwap = false; } uint256 private constant TOTAL_GONS = MAX_UINT256 - (MAX_UINT256 % INITIAL_FRAGMENTS_SUPPLY); uint256 private constant MAX_SUPPLY = 325 * 10**7 * 10**DECIMALS; uint256 public INDEX; bool public _autoRebase; bool public _autoAddLiquidity; uint256 public _initRebaseStartTime; uint256 public _lastRebasedTime; uint256 public _lastAddLiquidityTime; uint256 public _rebaseIncremenet = 0; uint256 public _rebaseCooldown; uint256 public _liquidityAddCooldown; uint256 public _totalSupply; uint256 public swapLimit; uint256 private _gonsPerFragment; mapping(address => uint256) private _gonBalances; mapping(address => mapping(address => uint256)) private _allowedFragments; mapping(address => bool) public blacklist; constructor() ERC20Detailed(_name, _symbol, uint8(DECIMALS)) Ownable() { router = IDEXRouter(_routerAddress); pair = IDEXFactory(router.factory()).createPair( router.WETH(), address(this) ); autoLiquidityFund = address(0x4548A20CAd4707Cbd38c205079bD9eD3c88aE103); milkBank = msg.sender; milkTank = address(0x47ca15f1E2bE671B0B26C2599A25F3e012a1A7ca); spoiledMilk = ZERO; _allowedFragments[address(this)][address(router)] = MAX_UINT256; pairAddress = pair; pairContract = IDEXPair(pair); _totalSupply = INITIAL_FRAGMENTS_SUPPLY; swapLimit = 2 * _totalSupply / 1000; _gonBalances[milkBank] = TOTAL_GONS; _gonsPerFragment = TOTAL_GONS.div(_totalSupply); _initRebaseStartTime = block.timestamp; _lastRebasedTime = block.timestamp; _autoRebase = true; _autoAddLiquidity = true; _isFeeExempt[milkBank] = true; _isFeeExempt[address(this)] = true; INDEX = gonsForBalance(100000); _rebaseCooldown = 15 minutes; _liquidityAddCooldown = 15 minutes; timeLastMilkShiba = block.timestamp; timeLastMilkPup = block.timestamp; _transferOwnership(milkBank); emit Transfer(address(0x0), milkBank, _totalSupply); } function rebase() internal { if ( inSwap ) return; uint256 rebaseRate; uint256 deltaTimeFromInit = block.timestamp - _initRebaseStartTime; uint256 deltaTime = block.timestamp - _lastRebasedTime; uint256 times = deltaTime.div(_rebaseCooldown); uint256 epoch = times.mul(_rebaseCooldown / 60); if (deltaTimeFromInit >= (8 * 365 days)) { rebaseRate = 8 + _rebaseIncremenet / 320; } else if (deltaTimeFromInit >= (5 * 365 days)) { rebaseRate = 33 + _rebaseIncremenet / 80; } else if (deltaTimeFromInit >= (3 * 365 days)) { rebaseRate = 62 + _rebaseIncremenet / 40; } else if (deltaTimeFromInit >= (2 * 365 days)) { rebaseRate = 125 + _rebaseIncremenet / 20; } else if (deltaTimeFromInit >= (365 days)) { rebaseRate = 224 + _rebaseIncremenet / 10; } else { rebaseRate = 2362 + _rebaseIncremenet; } for (uint256 i = 0; i < times; i++) { _totalSupply = _totalSupply .mul((10**RATE_DECIMALS).add(rebaseRate)) .div(10**RATE_DECIMALS); } _gonsPerFragment = TOTAL_GONS.div(_totalSupply); _lastRebasedTime = _lastRebasedTime.add(times.mul(_rebaseCooldown)); pairContract.sync(); emit LogRebase(epoch, _totalSupply); } function transfer(address to, uint256 value) external override returns (bool){ _transferFrom(msg.sender, to, value); return true; } function transferFrom(address from, address to, uint256 value) external override returns (bool) { if (_allowedFragments[from][msg.sender] != MAX_UINT256) { _allowedFragments[from][msg.sender] = _allowedFragments[from][ msg.sender ].sub(value, "Insufficient Allowance"); } _transferFrom(from, to, value); return true; } function _basicTransfer(address from, address to, uint256 amount) internal returns (bool) { uint256 gonAmount = amount.mul(_gonsPerFragment); _gonBalances[from] = _gonBalances[from].sub(gonAmount); _gonBalances[to] = _gonBalances[to].add(gonAmount); return true; } function toggleTradeLimits(bool _useTradeLimits) external onlyOwner { useTradeLimits = _useTradeLimits; } function setSwapLimit(uint256 _swapLimit) external onlyOwner { swapLimit = _swapLimit; } function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) { require(!blacklist[sender] && !blacklist[recipient], "in_blacklist"); if (inSwap) { return _basicTransfer(sender, recipient, amount); } if (shouldRebase()) { rebase(); } if (shouldAddLiquidity()) { addLiquidity(); } if (shouldSwapBack()) { swapBack(); } uint256 gonAmount = amount.mul(_gonsPerFragment); if(useTradeLimits && sender != owner() && recipient != pair){ require(_gonBalances[recipient].add(gonAmount) <= gonsForBalance(_totalSupply) / 50, "Initial 2% max wallet restriction"); } _gonBalances[sender] = _gonBalances[sender].sub(gonAmount); uint256 gonAmountReceived; if(shouldTakeFee(sender, recipient)){ gonAmountReceived = takeFee(sender, recipient, gonAmount); if(sender == pair){ address[] memory path = new address[](2); path[0] = router.WETH(); path[1] = address(this); uint256 buyAmountADA = router.getAmountsIn(amount, path)[0]; if(block.timestamp > timeLastMilkPup + milkPupRoundDuration && milkPup != ZERO){ if(milkPups.contains(milkPup) == false){ milkPups.add(milkPup); } timesWinMilkBattle[milkPup] ++; timesWinBuy[milkPup] += milkPupScore; if(timesWinMilkBattle[milkPup] > mostWinsAsmilkPup){ mostWinsmilkPup = milkPup; mostWinsAsmilkPup = timesWinMilkBattle[milkPup]; } maxWinBuy[milkPup] = milkPupScore > maxWinBuy[milkPup] ? milkPupScore : maxWinBuy[milkPup]; milkPup = ZERO; milkPupScore = 0; } if(block.timestamp > timeLastMilkShiba + milkShibaRoundDuration && milkShiba != ZERO){ if(electedCouncil.contains(milkShiba) == false){ electedCouncil.add(milkShiba); winCouncilBuy[milkShiba] = milkShibaScore; } milkShiba = ZERO; milkShibaScore = 0; } if(buyAmountADA > milkPupScore && !fallenToGreed[recipient]){ if(timesAsmilkPup[recipient] == 0){ totalmilkPup++; } if(milkPup != recipient){ timesAsmilkPup[recipient]++; milkPup = recipient; } milkPupScore = buyAmountADA; timeLastMilkPup = block.timestamp; if(buyAmountADA > milkShibaScore){ if(milkShiba != recipient){ milkShiba = recipient; } milkShibaScore = buyAmountADA; timeLastMilkShiba = block.timestamp; } } } else if(recipient == pair){ if(sender == milkPup || sender == milkShiba){ fallenToGreed[sender] = true; totalFallenToGreed++; if(sender == milkPup){ milkPup = ZERO; milkPupScore = 0; timeLastMilkPup = block.timestamp; } if(sender == milkShiba){ milkShiba = ZERO; milkShibaScore = 0; timeLastMilkShiba = block.timestamp; } } } } else{ gonAmountReceived = gonAmount; } _gonBalances[recipient] = _gonBalances[recipient].add(gonAmountReceived); emit Transfer(sender,recipient, gonAmountReceived.div(_gonsPerFragment)); return true; } function takeFee(address sender, address recipient, uint256 gonAmount) internal returns (uint256) { uint256 feeAmount; if (recipient == pair) { _gonBalances[spoiledMilk] = _gonBalances[spoiledMilk].add( gonAmount.div(feeDenominator).mul(spoiledMilkFeeSell) ); _gonBalances[address(this)] = _gonBalances[address(this)].add( gonAmount.div(feeDenominator).mul(swapFeeSell) ); _gonBalances[autoLiquidityFund] = _gonBalances[autoLiquidityFund].add( gonAmount.div(feeDenominator).mul(liquidityFeeSell) ); feeAmount = gonAmount.div(feeDenominator).mul(totalFeeSell); } else{ _gonBalances[spoiledMilk] = _gonBalances[spoiledMilk].add( gonAmount.div(feeDenominator).mul(spoiledMilkFeeBuy) ); _gonBalances[address(this)] = _gonBalances[address(this)].add( gonAmount.div(feeDenominator).mul(swapFeeBuy) ); _gonBalances[autoLiquidityFund] = _gonBalances[autoLiquidityFund].add( gonAmount.div(feeDenominator).mul(liquidityFeeBuy) ); feeAmount = gonAmount.div(feeDenominator).mul(totalFeeBuy); } emit Transfer(sender, address(this), feeAmount.div(_gonsPerFragment)); return gonAmount.sub(feeAmount); } function addLiquidity() internal swapping { uint256 autoLiquidityAmount = _gonBalances[autoLiquidityFund].div( _gonsPerFragment ); _gonBalances[address(this)] = _gonBalances[address(this)].add( _gonBalances[autoLiquidityFund] ); _gonBalances[autoLiquidityFund] = 0; uint256 amountToLiquify = autoLiquidityAmount.div(2); uint256 amountToSwap = autoLiquidityAmount.sub(amountToLiquify); if( amountToSwap == 0 ) { return; } address[] memory path = new address[](2); path[0] = address(this); path[1] = router.WETH(); uint256 balanceBefore = address(this).balance; router.swapExactTokensForETHSupportingFeeOnTransferTokens( amountToSwap, 0, path, address(this), block.timestamp ); uint256 amountETHLiquidity = address(this).balance.sub(balanceBefore); if (amountToLiquify > 0 && amountETHLiquidity > 0) { router.addLiquidityETH{value: amountETHLiquidity}( address(this), amountToLiquify, 0, 0, autoLiquidityFund, block.timestamp ); } _lastAddLiquidityTime = block.timestamp; } function swapBack() internal swapping { uint256 amountToSwap = _gonBalances[address(this)].div(_gonsPerFragment); amountToSwap = amountToSwap >= swapLimit ? swapLimit : amountToSwap; if( amountToSwap == 0) { return; } uint256 milkBankTokens = amountToSwap * milkBankShare / 100; uint256 milkWarTokens = amountToSwap * milkWarShare / 100; uint256 milkTankTokens = amountToSwap - milkBankTokens - milkWarTokens; uint256 spoiledMilkAmount = 0; if(milkPupScore == 0 || milkShibaScore == 0){ if(milkPupScore == 0){ spoiledMilkAmount += milkPupBountyPercent * milkWarTokens / 100; } if(milkShibaScore == 0){ spoiledMilkAmount += (100 - milkPupBountyPercent) * milkWarTokens / 100; } milkWarTokens -= spoiledMilkAmount; _gonBalances[spoiledMilk] = _gonBalances[spoiledMilk] + spoiledMilkAmount; } uint256 tokensToSwap = milkBankTokens + milkWarTokens + milkTankTokens; uint256 balanceBefore = address(this).balance; address[] memory path = new address[](2); path[0] = address(this); path[1] = router.WETH(); router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokensToSwap, 0, path, address(this), block.timestamp ); uint256 amountETH = address(this).balance.sub(balanceBefore); if(milkPupScore != 0 || milkShibaScore != 0){ uint256 bnbForBounty = amountETH * milkWarTokens / tokensToSwap; if(milkPupScore != 0 && milkShibaScore != 0){ uint256 bnbFormilkPup = milkPupBountyPercent * bnbForBounty / 100; uint256 bnbFormilkShiba = bnbForBounty - bnbFormilkPup; (bool temp,) = payable(milkShiba).call{value: bnbFormilkShiba, gas: 30000}(""); (temp,) = payable(milkPup).call{value: bnbFormilkPup, gas: 30000}(""); individualmilkShibaBounty[milkShiba] += bnbFormilkShiba; individualmilkPupBounty[milkPup] += bnbFormilkPup; totalmilkShibaBounty += bnbFormilkShiba; totalmilkPupBounty += bnbFormilkPup; } else if(milkPupScore != 0){ (bool temp,) = payable(milkPup).call{value: bnbForBounty, gas: 30000}("");temp; //warning-suppresion individualmilkPupBounty[milkPup] += bnbForBounty; totalmilkPupBounty += bnbForBounty; } else{ (bool temp,) = payable(milkShiba).call{value: bnbForBounty, gas: 30000}("");temp; individualmilkShibaBounty[milkShiba] += bnbForBounty; totalmilkShibaBounty += bnbForBounty; } } ( bool tempo,) = payable(milkBank).call{value: amountETH * milkBankTokens / tokensToSwap, gas: 30000}("");tempo; //warning-suppresion (tempo, ) = payable(milkTank).call{value: address(this).balance, gas: 30000}(""); } function withdrawAllTomilkBank() external swapping onlyOwner { uint256 amountToSwap = _gonBalances[address(this)].div(_gonsPerFragment); require( amountToSwap > 0,"There is no milkWar token deposited in token contract"); address[] memory path = new address[](2); path[0] = address(this); path[1] = router.WETH(); router.swapExactTokensForETHSupportingFeeOnTransferTokens( amountToSwap, 0, path, milkBank, block.timestamp ); } function shouldTakeFee(address from, address to) internal view returns (bool){ return (pair == from || pair == to) && !_isFeeExempt[to] && !_isFeeExempt[from]; } function shouldRebase() internal view returns (bool) { return _autoRebase && (_totalSupply < MAX_SUPPLY) && msg.sender != pair && !inSwap && block.timestamp >= (_lastRebasedTime + _rebaseCooldown); } function shouldAddLiquidity() internal view returns (bool) { return _autoAddLiquidity && !inSwap && msg.sender != pair && block.timestamp >= (_lastAddLiquidityTime + _liquidityAddCooldown); } function shouldSwapBack() internal view returns (bool) { return !inSwap && msg.sender != pair; } function setAutoRebase(bool _flag, uint256 rebaseCooldown, uint256 rebaseIncrement) external onlyOwner { if (_flag) { require(rebaseIncrement <= 268, "Upper APY cap at 1,003,975 %"); require(rebaseCooldown >= 15 minutes && rebaseCooldown <= 18 minutes , "Lower APY cap at 98,853 %"); _autoRebase = _flag; _lastRebasedTime = block.timestamp; _rebaseCooldown = rebaseCooldown; _rebaseIncremenet = rebaseIncrement; } else { _autoRebase = _flag; } } function setAutoAddLiquidity(bool _flag, uint256 liquidityAddCooldown) external onlyOwner { if(_flag) { require(liquidityAddCooldown >= 15 minutes && liquidityAddCooldown <= 2 days, "Liquidity injection cooldown restricted."); _autoAddLiquidity = _flag; _lastAddLiquidityTime = block.timestamp; _liquidityAddCooldown = liquidityAddCooldown; } else { _autoAddLiquidity = _flag; } } function allowance(address owner_, address spender) external view override returns (uint256) { return _allowedFragments[owner_][spender]; } function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) { uint256 oldValue = _allowedFragments[msg.sender][spender]; if (subtractedValue >= oldValue) { _allowedFragments[msg.sender][spender] = 0; } else { _allowedFragments[msg.sender][spender] = oldValue.sub( subtractedValue ); } emit Approval( msg.sender, spender, _allowedFragments[msg.sender][spender] ); return true; } function increaseAllowance(address spender, uint256 addedValue) external returns (bool) { _allowedFragments[msg.sender][spender] = _allowedFragments[msg.sender][ spender ].add(addedValue); emit Approval( msg.sender, spender, _allowedFragments[msg.sender][spender] ); return true; } function approve(address spender, uint256 value) external override returns (bool) { _allowedFragments[msg.sender][spender] = value; emit Approval(msg.sender, spender, value); return true; } function checkFeeExempt(address _addr) external view returns (bool) { return _isFeeExempt[_addr]; } function getCirculatingSupply() public view returns (uint256) { return (TOTAL_GONS.sub(_gonBalances[spoiledMilk].sub(_gonBalances[DEAD])).sub(_gonBalances[ZERO])) .div(_gonsPerFragment); } function isNotInSwap() external view returns (bool) { return !inSwap; } function manualSync() external { IDEXPair(pair).sync(); } function setFeeReceivers(address _autoLiquidityFund, address _milkBank, address _milkTank) external onlyOwner { autoLiquidityFund = _autoLiquidityFund; milkBank = _milkBank; milkTank = _milkTank; } function setFees(uint256 _liquidityFeeBuy, uint256 _liquidityFeeSell, uint256 _spoiledMilkFeeBuy, uint256 _spoiledMilkFeeSell, uint256 _swapFeeBuy, uint256 _swapFeeSell, uint256 _milkTankShare, uint256 _milkWarShare, uint256 _milkBankShare, uint256 _milkPupBountyPercent) external onlyOwner { require(_liquidityFeeBuy > 0 && _liquidityFeeSell > 0 && _liquidityFeeBuy + _spoiledMilkFeeBuy + _swapFeeBuy <= 300 && _liquidityFeeSell + _spoiledMilkFeeSell + _swapFeeSell <= 300, "Fees too high, 30% max."); require(_milkWarShare >= 30 && _milkPupBountyPercent >= 50, "Fighters need be paid."); assert(_milkTankShare + _milkWarShare + _milkBankShare == 100); liquidityFeeBuy = _liquidityFeeBuy; liquidityFeeSell = _liquidityFeeSell; spoiledMilkFeeBuy = _spoiledMilkFeeBuy; spoiledMilkFeeSell = _spoiledMilkFeeSell; swapFeeBuy = _swapFeeBuy; swapFeeSell = _swapFeeSell; milkTankShare = _milkTankShare; milkWarShare = _milkWarShare; milkBankShare = _milkBankShare; milkPupBountyPercent = _milkPupBountyPercent; totalFeeBuy = liquidityFeeBuy.add(swapFeeBuy).add(spoiledMilkFeeBuy); totalFeeSell = liquidityFeeSell.add(swapFeeSell).add(spoiledMilkFeeSell); } function setmilkPupRound(uint256 _milkPupRoundDuration) external onlyOwner { require(_milkPupRoundDuration >= 15 minutes && _milkPupRoundDuration <= 1 hours, "Duration of rounds in milkWar restricted."); milkPupRoundDuration = _milkPupRoundDuration; } function setWhitelist(address _addr) external onlyOwner { _isFeeExempt[_addr] = true; } function setBotBlacklist(address _botAddress, bool _flag) external onlyOwner { require(isContract(_botAddress), "Only contract address, not allowed externally owned account"); blacklist[_botAddress] = _flag; } function setPairAddress(address _pairAddress) external onlyOwner { pairAddress = _pairAddress; } function setLP(address _address) external onlyOwner { pairContract = IDEXPair(_address); } function totalSupply() external view override returns (uint256) { return _totalSupply; } function balanceOf(address who) external view override returns (uint256) { return _gonBalances[who].div(_gonsPerFragment); } function isContract(address addr) internal view returns (bool) { uint size; assembly { size := extcodesize(addr) } return size > 0; } function gonsForBalance(uint256 amount) public view returns (uint256) { return amount.mul(_gonsPerFragment); } function balanceForGons(uint256 gons) public view returns (uint256) { return gons.div(_gonsPerFragment); } function index() public view returns (uint256) { return balanceForGons(INDEX); } struct MilkBattleOracleData{ address milkShiba; uint256 milkShibaScore; address milkPup; uint256 milkPupScore; uint256 timeLastMilkPup; uint256 timeLastMilkShiba; address mostWinsmilkPup; uint256 mostWinsAsmilkPup; uint256 totalFighters; uint256 totalmilkPup; uint256 totalmilkShiba; uint256 totalmilkShibaBounty; uint256 totalmilkPupBounty; uint256 totalFallenToGreed; uint256 liquidity; uint256 milkBank; uint256 spoiledMilk; uint256 lastRebasedTime; } function getMilkBattleOracleData() external view returns(MilkBattleOracleData memory){ MilkBattleOracleData memory data = MilkBattleOracleData( milkShiba, milkShibaScore, milkPup, milkPupScore, timeLastMilkPup, timeLastMilkShiba, mostWinsmilkPup, mostWinsAsmilkPup, totalmilkPup, milkPups.length(), electedCouncil.length(), totalmilkShibaBounty, totalmilkPupBounty, totalFallenToGreed, getPairValue(), milkBank.balance, getspoiledMilkValue(), _lastRebasedTime); return data; } struct MilkBattleOracleDataWallet{ bool inCouncil; uint256 timesWinMilkBattle; uint256 timesWinBuy; bool fallenToGreed; uint256 individualAresBounty; uint256 individualmilkPupBounty; uint256 maxWinBuy; uint256 winCouncilBuy; } function getMilkBattleOracleDataWallet(address wallet) external view returns (MilkBattleOracleDataWallet memory){ MilkBattleOracleDataWallet memory data = MilkBattleOracleDataWallet( electedCouncil.contains(wallet), timesWinMilkBattle[wallet], timesWinBuy[wallet], fallenToGreed[wallet], individualmilkShibaBounty[wallet], individualmilkPupBounty[wallet], maxWinBuy[wallet], winCouncilBuy[wallet]); return data; } function getEstimatedUSD(uint256 amount, bool fromToken) public view returns (uint256){ if(fromToken){ address[] memory path = new address[](3); path[0] = USDAddress; path[1] = router.WETH(); path[2] = address(this); return router.getAmountsIn(amount, path)[0]; }else{ address[] memory path = new address[](2); path[0] = USDAddress; path[1] = router.WETH(); return router.getAmountsIn(amount, path)[0]; } } function getspoiledMilkValue() public view returns (uint256){ if(this.balanceOf(ZERO) == 0){ return 0; } else{ return getEstimatedUSD(this.balanceOf(ZERO), true); } } function getPairValue() public view returns (uint256){ return getEstimatedUSD(IERC20(router.WETH()).balanceOf(pair), false); } function getMilkPupAt(uint256 _index) external view returns(address) { return milkPups.at(_index); } function getMilkShibaAt(uint256 _index) external view returns(address) { return electedCouncil.at(_index); } function getmilkPupCount() external view returns(uint256) { return milkPups.length(); } function getMilkShibaCount() external view returns(uint256) { return electedCouncil.length(); } receive() external payable {} }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"LogRebase","inputs":[{"type":"uint256","name":"epoch","internalType":"uint256","indexed":true},{"type":"uint256","name":"totalSupply","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipRenounced","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"DEAD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"DECIMALS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"INDEX","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAX_UINT256","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"RATE_DECIMALS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"USDAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ZERO","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_autoAddLiquidity","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_autoRebase","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"_decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_initRebaseStartTime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_lastAddLiquidityTime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_lastRebasedTime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_liquidityAddCooldown","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"_name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_rebaseCooldown","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_rebaseIncremenet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"_routerAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"_symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_totalSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner_","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"autoLiquidityFund","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceForGons","inputs":[{"type":"uint256","name":"gons","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"who","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"blacklist","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"checkFeeExempt","inputs":[{"type":"address","name":"_addr","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"fallenToGreed","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"feeDenominator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getCirculatingSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getEstimatedUSD","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"bool","name":"fromToken","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct MilkShiba.MilkBattleOracleData","components":[{"type":"address","name":"milkShiba","internalType":"address"},{"type":"uint256","name":"milkShibaScore","internalType":"uint256"},{"type":"address","name":"milkPup","internalType":"address"},{"type":"uint256","name":"milkPupScore","internalType":"uint256"},{"type":"uint256","name":"timeLastMilkPup","internalType":"uint256"},{"type":"uint256","name":"timeLastMilkShiba","internalType":"uint256"},{"type":"address","name":"mostWinsmilkPup","internalType":"address"},{"type":"uint256","name":"mostWinsAsmilkPup","internalType":"uint256"},{"type":"uint256","name":"totalFighters","internalType":"uint256"},{"type":"uint256","name":"totalmilkPup","internalType":"uint256"},{"type":"uint256","name":"totalmilkShiba","internalType":"uint256"},{"type":"uint256","name":"totalmilkShibaBounty","internalType":"uint256"},{"type":"uint256","name":"totalmilkPupBounty","internalType":"uint256"},{"type":"uint256","name":"totalFallenToGreed","internalType":"uint256"},{"type":"uint256","name":"liquidity","internalType":"uint256"},{"type":"uint256","name":"milkBank","internalType":"uint256"},{"type":"uint256","name":"spoiledMilk","internalType":"uint256"},{"type":"uint256","name":"lastRebasedTime","internalType":"uint256"}]}],"name":"getMilkBattleOracleData","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct MilkShiba.MilkBattleOracleDataWallet","components":[{"type":"bool","name":"inCouncil","internalType":"bool"},{"type":"uint256","name":"timesWinMilkBattle","internalType":"uint256"},{"type":"uint256","name":"timesWinBuy","internalType":"uint256"},{"type":"bool","name":"fallenToGreed","internalType":"bool"},{"type":"uint256","name":"individualAresBounty","internalType":"uint256"},{"type":"uint256","name":"individualmilkPupBounty","internalType":"uint256"},{"type":"uint256","name":"maxWinBuy","internalType":"uint256"},{"type":"uint256","name":"winCouncilBuy","internalType":"uint256"}]}],"name":"getMilkBattleOracleDataWallet","inputs":[{"type":"address","name":"wallet","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getMilkPupAt","inputs":[{"type":"uint256","name":"_index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getMilkShibaAt","inputs":[{"type":"uint256","name":"_index","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getMilkShibaCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getPairValue","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getmilkPupCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getspoiledMilkValue","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"gonsForBalance","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"index","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"individualmilkPupBounty","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"individualmilkShibaBounty","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isNotInSwap","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isOwner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"liquidityFeeBuy","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"liquidityFeeSell","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"manualSync","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxWinBuy","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"milkBank","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"milkBankShare","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"milkPup","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"milkPupBountyPercent","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"milkPupRoundDuration","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"milkPupScore","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"milkShiba","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"milkShibaRoundDuration","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"milkShibaScore","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"milkTank","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"milkTankShare","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"milkWarShare","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"mostWinsAsmilkPup","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"mostWinsmilkPup","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pair","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pairAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IDEXPair"}],"name":"pairContract","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IDEXRouter"}],"name":"router","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAutoAddLiquidity","inputs":[{"type":"bool","name":"_flag","internalType":"bool"},{"type":"uint256","name":"liquidityAddCooldown","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAutoRebase","inputs":[{"type":"bool","name":"_flag","internalType":"bool"},{"type":"uint256","name":"rebaseCooldown","internalType":"uint256"},{"type":"uint256","name":"rebaseIncrement","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBotBlacklist","inputs":[{"type":"address","name":"_botAddress","internalType":"address"},{"type":"bool","name":"_flag","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeeReceivers","inputs":[{"type":"address","name":"_autoLiquidityFund","internalType":"address"},{"type":"address","name":"_milkBank","internalType":"address"},{"type":"address","name":"_milkTank","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFees","inputs":[{"type":"uint256","name":"_liquidityFeeBuy","internalType":"uint256"},{"type":"uint256","name":"_liquidityFeeSell","internalType":"uint256"},{"type":"uint256","name":"_spoiledMilkFeeBuy","internalType":"uint256"},{"type":"uint256","name":"_spoiledMilkFeeSell","internalType":"uint256"},{"type":"uint256","name":"_swapFeeBuy","internalType":"uint256"},{"type":"uint256","name":"_swapFeeSell","internalType":"uint256"},{"type":"uint256","name":"_milkTankShare","internalType":"uint256"},{"type":"uint256","name":"_milkWarShare","internalType":"uint256"},{"type":"uint256","name":"_milkBankShare","internalType":"uint256"},{"type":"uint256","name":"_milkPupBountyPercent","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLP","inputs":[{"type":"address","name":"_address","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPairAddress","inputs":[{"type":"address","name":"_pairAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapLimit","inputs":[{"type":"uint256","name":"_swapLimit","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setWhitelist","inputs":[{"type":"address","name":"_addr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setmilkPupRound","inputs":[{"type":"uint256","name":"_milkPupRoundDuration","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"spoiledMilk","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"spoiledMilkFeeBuy","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"spoiledMilkFeeSell","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"swapEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapFeeBuy","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapFeeSell","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapLimit","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"timeLastMilkPup","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"timeLastMilkShiba","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"timesAsmilkPup","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"timesWinBuy","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"timesWinMilkBattle","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"toggleTradeLimits","inputs":[{"type":"bool","name":"_useTradeLimits","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalFallenToGreed","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalFeeBuy","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalFeeSell","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalmilkPup","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalmilkPupBounty","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalmilkShibaBounty","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"useTradeLimits","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"winCouncilBuy","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawAllTomilkBank","inputs":[]},{"type":"receive","stateMutability":"payable"}]
Deployed ByteCode
0x6080604052600436106105415760003560e01c8063715018a6116102af578063afb9cf6d11610171578063dd62ed3e116100d2578063dd62ed3e14611017578063e4b2c6d41461105d578063e91fa7fb14611073578063e92433b314611093578063ea98b8da146110c0578063edf2618a146110d5578063f2fde38b146110eb578063f51e716d1461110b578063f6e785361461112b578063f887ea40146111b0578063f8d71dfc146111d0578063f9f92be4146111e6578063fa64a3c214611216578063fb5f27fb1461122c57600080fd5b8063afb9cf6d14610e7f578063b03e838a14610e99578063b09f126614610eb9578063c032e0a214610ece578063c1689c6414610ee4578063c9a9488214610f11578063c9c8577314610f27578063cd5fc1b514610f47578063cede0ff514610f5d578063d28d885214610f73578063d439979014610f88578063d500a6ea14610fc1578063d7c0103214610fd7578063d9e6646014610ff757600080fd5b80639669b6c01161021b5780639669b6c014610d045780639797c8cf14610d1a5780639b2912cc14610d3b5780639b87676c14610d51578063a12a27a114610d67578063a22d483214610d7d578063a457c2d714610d9d578063a583b5d414610dbd578063a8aa1b3114610dd3578063a8b0898214610df3578063a9059cbb14610e13578063a9bdccf814610e33578063abfb426c14610e49578063ad80114e14610e5f57600080fd5b8063715018a614610bad578063753d02a114610bc25780637965d56d14610bd757806382d2011614610bf757806383b4ac6814610c0d578063854cff2f14610c2d5780638775782814610c4d5780638cbb710c14610c635780638da5cb5b14610c905780638f32d59b14610ca557806393a6e27414610cba57806395d89b4114610cda57806395e8477c14610cef57600080fd5b80633950935111610403578063615abd4311610364578063615abd43146109f9578063655fcfd214610a1957806365a484e114610a2f57806368587dcf14610a455780636912652c14610a655780636974a51314610a845780636a01f09c14610ab15780636a28e3f914610ac75780636ae1270914610ae95780636b6570b414610b095780636c3409d314610b295780636ddd171314610b565780636e9d80dd14610b7757806370a0823114610b8d57600080fd5b806339509351146108715780633dad4a0d146108915780633eaaf86b146108b15780634771749d146108c757806349499c0d146108dc5780634b46e301146108fc5780634be7fe3c1461091c5780634d709adf146109325780634f0c9c4214610957578063530553d61461096c578063531484161461099957806358fa63ca146109af5780635a604c52146109c45780635ddb4ae2146109d957600080fd5b806321cfcd50116104ad57806321cfcd50146106ed5780632231f25c1461071a57806323b872dd146107305780632986c0e5146107505780632ac3495a146107655780632b112e49146107855780632df75cb11461079a5780632e0f2625146107b05780632f34d282146107c5578063313ce567146107e557806332424aa31461080b57806332b756831461082557806333a581d21461083b57806337c9be871461085157600080fd5b806303fd2a451461054d5780630614824a1461057957806306fdde031461059d5780630917377f146105bf578063095ea7b3146105df5780630c97da9e1461060f5780630e3d505d1461062f5780631107b3a51461065f578063180b0d7e1461067557806318160ddd1461068b5780631b2b4bcb146106a05780631bd39674146106b65780632051b87b146106d657600080fd5b3661054857005b600080fd5b34801561055957600080fd5b5061056361dead81565b604051610570919061436c565b60405180910390f35b34801561058557600080fd5b5061058f600a5481565b604051908152602001610570565b3480156105a957600080fd5b506105b2611242565b6040516105709190614380565b3480156105cb57600080fd5b50601454610563906001600160a01b031681565b3480156105eb57600080fd5b506105ff6105fa3660046143ea565b6112d4565b6040519015158152602001610570565b34801561061b57600080fd5b5061058f61062a36600461442b565b61132f565b34801561063b57600080fd5b506105ff61064a366004614457565b602e6020526000908152604090205460ff1681565b34801561066b57600080fd5b5061058f60095481565b34801561068157600080fd5b5061058f6103e881565b34801561069757600080fd5b50603e5461058f565b3480156106ac57600080fd5b5061058f603c5481565b3480156106c257600080fd5b5061058f6106d1366004614474565b6115b5565b3480156106e257600080fd5b506106eb6115cc565b005b3480156106f957600080fd5b5061058f610708366004614457565b60256020526000908152604090205481565b34801561072657600080fd5b5061058f600f5481565b34801561073c57600080fd5b506105ff61074b36600461448d565b6117d5565b34801561075c57600080fd5b5061058f61189a565b34801561077157600080fd5b506106eb6107803660046144ce565b6118ac565b34801561079157600080fd5b5061058f6119a4565b3480156107a657600080fd5b5061058f60365481565b3480156107bc57600080fd5b5061058f600581565b3480156107d157600080fd5b506106eb6107e0366004614457565b611a5c565b3480156107f157600080fd5b5060025460ff165b60405160ff9091168152602001610570565b34801561081757600080fd5b506005546107f99060ff1681565b34801561083157600080fd5b5061058f60395481565b34801561084757600080fd5b5061058f60001981565b34801561085d57600080fd5b506106eb61086c366004614501565b611a95565b34801561087d57600080fd5b506105ff61088c3660046143ea565b611b43565b34801561089d57600080fd5b50603254610563906001600160a01b031681565b3480156108bd57600080fd5b5061058f603e5481565b3480156108d357600080fd5b5061058f611bb6565b3480156108e857600080fd5b50603354610563906001600160a01b031681565b34801561090857600080fd5b506106eb610917366004614474565b611bc2565b34801561092857600080fd5b5061058f600b5481565b34801561093e57600080fd5b506005546105639061010090046001600160a01b031681565b34801561096357600080fd5b5061058f611bd8565b34801561097857600080fd5b5061058f610987366004614457565b60266020526000908152604090205481565b3480156109a557600080fd5b5061058f60125481565b3480156109bb57600080fd5b50610563600081565b3480156109d057600080fd5b506107f9600781565b3480156109e557600080fd5b50603054610563906001600160a01b031681565b348015610a0557600080fd5b50610563610a14366004614474565b611be4565b348015610a2557600080fd5b5061058f602d5481565b348015610a3b57600080fd5b5061058f60215481565b348015610a5157600080fd5b50602a54610563906001600160a01b031681565b348015610a7157600080fd5b506037546105ff90610100900460ff1681565b348015610a9057600080fd5b5061058f610a9f366004614457565b60276020526000908152604090205481565b348015610abd57600080fd5b5061058f603f5481565b348015610ad357600080fd5b50610adc611bf1565b604051610570919061452d565b348015610af557600080fd5b50601a54610563906001600160a01b031681565b348015610b1557600080fd5b50603154610563906001600160a01b031681565b348015610b3557600080fd5b5061058f610b44366004614457565b60246020526000908152604090205481565b348015610b6257600080fd5b506034546105ff90600160a01b900460ff1681565b348015610b8357600080fd5b5061058f60225481565b348015610b9957600080fd5b5061058f610ba8366004614457565b611d76565b348015610bb957600080fd5b506106eb611d9b565b348015610bce57600080fd5b506106eb611dfb565b348015610be357600080fd5b5061058f610bf2366004614474565b611e65565b348015610c0357600080fd5b5061058f60075481565b348015610c1957600080fd5b50603554600160a01b900460ff16156105ff565b348015610c3957600080fd5b506106eb610c48366004614457565b611e7c565b348015610c5957600080fd5b5061058f602b5481565b348015610c6f57600080fd5b5061058f610c7e366004614457565b60286020526000908152604090205481565b348015610c9c57600080fd5b50610563611eb1565b348015610cb157600080fd5b506105ff611ec5565b348015610cc657600080fd5b506106eb610cd536600461460e565b611edb565b348015610ce657600080fd5b506105b2611f9f565b348015610cfb57600080fd5b5061058f611fae565b348015610d1057600080fd5b5061058f603b5481565b348015610d2657600080fd5b506034546105ff90600160a81b900460ff1681565b348015610d4757600080fd5b5061058f603a5481565b348015610d5d57600080fd5b5061058f60385481565b348015610d7357600080fd5b5061058f60205481565b348015610d8957600080fd5b506106eb610d98366004614457565b6120a3565b348015610da957600080fd5b506105ff610db83660046143ea565b6120d6565b348015610dc957600080fd5b5061058f600c5481565b348015610ddf57600080fd5b50603554610563906001600160a01b031681565b348015610dff57600080fd5b50603454610563906001600160a01b031681565b348015610e1f57600080fd5b506105ff610e2e3660046143ea565b6121ab565b348015610e3f57600080fd5b5061058f601f5481565b348015610e5557600080fd5b5061058f601d5481565b348015610e6b57600080fd5b506106eb610e7a36600461462a565b6121c2565b348015610e8b57600080fd5b506037546105ff9060ff1681565b348015610ea557600080fd5b50601c54610563906001600160a01b031681565b348015610ec557600080fd5b506105b2612358565b348015610eda57600080fd5b5061058f603d5481565b348015610ef057600080fd5b5061058f610eff366004614457565b60296020526000908152604090205481565b348015610f1d57600080fd5b5061058f600d5481565b348015610f3357600080fd5b50610563610f42366004614474565b6123e6565b348015610f5357600080fd5b5061058f601e5481565b348015610f6957600080fd5b5061058f602f5481565b348015610f7f57600080fd5b506105b26123f3565b348015610f9457600080fd5b506105ff610fa3366004614457565b6001600160a01b031660009081526006602052604090205460ff1690565b348015610fcd57600080fd5b5061058f601b5481565b348015610fe357600080fd5b506106eb610ff2366004614692565b612400565b34801561100357600080fd5b50601554610563906001600160a01b031681565b34801561102357600080fd5b5061058f6110323660046146dd565b6001600160a01b03918216600090815260426020908152604080832093909416825291909152205490565b34801561106957600080fd5b5061058f600e5481565b34801561107f57600080fd5b506106eb61108e366004614474565b612450565b34801561109f57600080fd5b5061058f6110ae366004614457565b60236020526000908152604090205481565b3480156110cc57600080fd5b5061058f6124d8565b3480156110e157600080fd5b5061058f60105481565b3480156110f757600080fd5b506106eb611106366004614457565b6125b9565b34801561111757600080fd5b506106eb611126366004614716565b6125d6565b34801561113757600080fd5b5061114b611146366004614457565b612605565b604051610570919060006101008201905082511515825260208301516020830152604083015160408301526060830151151560608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015292915050565b3480156111bc57600080fd5b50601354610563906001600160a01b031681565b3480156111dc57600080fd5b5061058f602c5481565b3480156111f257600080fd5b506105ff611201366004614457565b60436020526000908152604090205460ff1681565b34801561122257600080fd5b5061058f60085481565b34801561123857600080fd5b5061058f60115481565b60606000805461125190614731565b80601f016020809104026020016040519081016040528092919081815260200182805461127d90614731565b80156112ca5780601f1061129f576101008083540402835291602001916112ca565b820191906000526020600020905b8154815290600101906020018083116112ad57829003601f168201915b5050505050905090565b3360008181526042602090815260408083206001600160a01b03871680855292528083208590555191929091600080516020614b2e8339815191529061131d9086815260200190565b60405180910390a35060015b92915050565b600081156114e4576040805160038082526080820190925260009160208201606080368337505060145482519293506001600160a01b03169183915060009061137a5761137a614782565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156113d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f79190614798565b8160018151811061140a5761140a614782565b60200260200101906001600160a01b031690816001600160a01b031681525050308160028151811061143e5761143e614782565b6001600160a01b0392831660209182029290920101526013546040516307c0329d60e21b8152911690631f00ca749061147d90879085906004016147f9565b600060405180830381865afa15801561149a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114c2919081019061481a565b6000815181106114d4576114d4614782565b6020026020010151915050611329565b604080516002808252606082018352600092602083019080368337505060145482519293506001600160a01b03169183915060009061152557611525614782565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561157e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a29190614798565b8160018151811061143e5761143e614782565b6000611329604054836127a190919063ffffffff16565b6035805460ff60a01b1916600160a01b1790556115e7611ec5565b6115f057600080fd5b6040805430600090815260416020529182205461160c91612762565b9050600081116116815760405162461bcd60e51b815260206004820152603560248201527f5468657265206973206e6f206d696c6b57617220746f6b656e206465706f73696044820152741d1959081a5b881d1bdad95b8818dbdb9d1c9858dd605a1b60648201526084015b60405180910390fd5b60408051600280825260608201835260009260208301908036833701905050905030816000815181106116b6576116b6614782565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561170f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117339190614798565b8160018151811061174657611746614782565b6001600160a01b03928316602091820292909201015260135460315460405163791ac94760e01b81529183169263791ac9479261179292879260009288929091169042906004016148d8565b600060405180830381600087803b1580156117ac57600080fd5b505af11580156117c0573d6000803e3d6000fd5b50506035805460ff60a01b1916905550505050565b6001600160a01b038316600090815260426020908152604080832033845290915281205460001914611882576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b038716600090815260428252838120338252909152919091205461185d918490612820565b6001600160a01b03851660009081526042602090815260408083203384529091529020555b61188d84848461285a565b50600190505b9392505050565b60006118a7603654611e65565b905090565b6118b4611ec5565b6118bd57600080fd5b821561198f5761010c8111156119155760405162461bcd60e51b815260206004820152601c60248201527f5570706572204150592063617020617420312c3030332c3937352025000000006044820152606401611678565b610384821015801561192957506104388211155b6119715760405162461bcd60e51b81526020600482015260196024820152784c6f77657220415059206361702061742039382c383533202560381b6044820152606401611678565b6037805460ff19169315159390931790925542603955603c55603b55565b6037805484151560ff19909116179055505050565b6040805460416020527f22157c206018468b45ae7922bc7a0b0cb8feed201dac3c6fb5e7876aa94e11e9547fa0677eb5bcd8fda08ec5a3787163ff937699a7cfa9c49b8c0d83e4d0cc4c9d00546033546001600160a01b03166000908152938420546118a79392611a56929091611a5091611a1f91906130cf565b611a2b6005600a614a0e565b611a38906204f588614a1a565b611a4490600019614a4f565b611a5090600019614a63565b906130cf565b90612762565b611a64611ec5565b611a6d57600080fd5b600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b611a9d611ec5565b611aa657600080fd5b813b611b185760405162461bcd60e51b815260206004820152603b60248201527f4f6e6c7920636f6e747261637420616464726573732c206e6f7420616c6c6f7760448201527a195908195e1d195c9b985b1b1e481bdddb9959081858d8dbdd5b9d602a1b6064820152608401611678565b6001600160a01b03919091166000908152604360205260409020805460ff1916911515919091179055565b3360009081526042602090815260408083206001600160a01b0386168452909152812054611b719083612705565b3360008181526042602090815260408083206001600160a01b03891680855290835292819020859055519384529092600080516020614b2e833981519152910161131d565b60006118a76016613111565b611bca611ec5565b611bd357600080fd5b603f55565b60006118a76018613111565b600061132960168361311b565b611c9a60405180610240016040528060006001600160a01b031681526020016000815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6040805161024081018252601a546001600160a01b039081168252601b54602080840191909152601c54821693830193909352601d546060830152601f546080830152915460a0820152602a5490911660c0820152602b5460e0820152601e546101008201526000906101208101611d126018613111565b8152602001611d216016613111565b8152602001602c548152602001602d548152602001602f548152602001611d46611fae565b81526031546001600160a01b0316316020820152604001611d656124d8565b815260395460209091015292915050565b604080546001600160a01b038316600090815260416020529182205461132991612762565b611da3611ec5565b611dac57600080fd5b6002546040516101009091046001600160a01b0316907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a260028054610100600160a81b0319169055565b603560009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611e4b57600080fd5b505af1158015611e5f573d6000803e3d6000fd5b50505050565b60006113296040548361276290919063ffffffff16565b611e84611ec5565b611e8d57600080fd5b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b60025461010090046001600160a01b031690565b60025461010090046001600160a01b0316331490565b611ee3611ec5565b611eec57600080fd5b8115611f86576103848110158015611f0757506202a3008111155b611f645760405162461bcd60e51b815260206004820152602860248201527f4c697175696469747920696e6a656374696f6e20636f6f6c646f776e207265736044820152673a3934b1ba32b21760c11b6064820152608401611678565b603780548315156101000261ff001990911617905542603a55603d8190555050565b603780548315156101000261ff00199091161790555050565b60606001805461125190614731565b60006118a7601360009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612006573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202a9190614798565b6035546040516370a0823160e01b81526001600160a01b03928316926370a082319261205b9291169060040161436c565b602060405180830381865afa158015612078573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209c9190614a7a565b600061132f565b6120ab611ec5565b6120b457600080fd5b603480546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526042602090815260408083206001600160a01b038616845290915281205480831061212a573360009081526042602090815260408083206001600160a01b0388168452909152812055612159565b61213481846130cf565b3360009081526042602090815260408083206001600160a01b03891684529091529020555b3360008181526042602090815260408083206001600160a01b03891680855290835292819020549051908152919291600080516020614b2e833981519152910160405180910390a35060019392505050565b60006121b833848461285a565b5060019392505050565b6121ca611ec5565b6121d357600080fd5b60008a1180156121e35750600089115b8015612205575061012c866121f88a8d614a93565b6122029190614a93565b11155b8015612227575061012c8561221a898c614a93565b6122249190614a93565b11155b61226d5760405162461bcd60e51b81526020600482015260176024820152762332b2b9903a37b7903434b3b416101998129036b0bc1760491b6044820152606401611678565b601e831015801561227f575060328110155b6122c45760405162461bcd60e51b81526020600482015260166024820152752334b3b43a32b939903732b2b2103132903830b4b21760511b6044820152606401611678565b816122cf8486614a93565b6122d99190614a93565b6064146122e8576122e8614aab565b60078a905560098990556008889055600a879055600b869055600c859055600d849055600e839055600f829055601081905561232e886123288c89612705565b90612705565b601155600a54600c5460095461234992916123289190612705565b60125550505050505050505050565b6004805461236590614731565b80601f016020809104026020016040519081016040528092919081815260200182805461239190614731565b80156123de5780601f106123b3576101008083540402835291602001916123de565b820191906000526020600020905b8154815290600101906020018083116123c157829003601f168201915b505050505081565b600061132960188361311b565b6003805461236590614731565b612408611ec5565b61241157600080fd5b603080546001600160a01b039485166001600160a01b031991821617909155603180549385169382169390931790925560328054919093169116179055565b612458611ec5565b61246157600080fd5b61038481101580156124755750610e108111155b6124d35760405162461bcd60e51b815260206004820152602960248201527f4475726174696f6e206f6620726f756e647320696e206d696c6b57617220726560448201526839ba3934b1ba32b21760b91b6064820152608401611678565b602155565b6040516370a0823160e01b815260009030906370a08231906124fe90849060040161436c565b602060405180830381865afa15801561251b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253f9190614a7a565b6125495750600090565b6040516370a0823160e01b81526118a79030906370a08231906125719060009060040161436c565b602060405180830381865afa15801561258e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b29190614a7a565b600161132f565b6125c1611ec5565b6125ca57600080fd5b6125d381613127565b50565b6125de611ec5565b6125e757600080fd5b60348054911515600160a81b0260ff60a81b19909216919091179055565b6126516040518061010001604052806000151581526020016000815260200160008152602001600015158152602001600081526020016000815260200160008152602001600081525090565b60006040518061010001604052806126738560166131a190919063ffffffff16565b151581526001600160a01b0390941660008181526024602090815260408083205482890152838352602582528083205481890152838352602e82528083205460ff161515606089015283835260288252808320546080890152838352602982528083205460a0890152838352602682528083205460c089015292825260279052205460e0909401939093525090919050565b6000806127128385614a93565b9050838110156118935760405162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b6044820152606401611678565b600061189383836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b8152506131c3565b6000826127b057506000611329565b60006127bc8385614a1a565b9050826127c98583614ac1565b146118935760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401611678565b600081848411156128445760405162461bcd60e51b81526004016116789190614380565b5060006128518486614a63565b95945050505050565b6001600160a01b03831660009081526043602052604081205460ff1615801561289c57506001600160a01b03831660009081526043602052604090205460ff16155b6128d75760405162461bcd60e51b815260206004820152600c60248201526b1a5b97d89b1858dadb1a5cdd60a21b6044820152606401611678565b603554600160a01b900460ff16156128fb576128f48484846131f1565b9050611893565b612903613283565b15612910576129106132fe565b612918613592565b15612925576129256135e4565b61292d6138bd565b1561293a5761293a6138e8565b6000612951604054846127a190919063ffffffff16565b603454909150600160a81b900460ff1680156129865750612970611eb1565b6001600160a01b0316856001600160a01b031614155b80156129a057506035546001600160a01b03858116911614155b15612a375760326129b2603e546115b5565b6129bc9190614ac1565b6001600160a01b0385166000908152604160205260409020546129df9083612705565b1115612a375760405162461bcd60e51b815260206004820152602160248201527f496e697469616c203225206d61782077616c6c6574207265737472696374696f6044820152603760f91b6064820152608401611678565b6001600160a01b038516600090815260416020526040902054612a5a90826130cf565b6001600160a01b038616600090815260416020526040812091909155612a808686613fd8565b1561303a57612a90868684614051565b6035549091506001600160a01b0387811691161415612f5b576040805160028082526060820183526000926020830190803683375050601354604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612b13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b379190614798565b81600081518110612b4a57612b4a614782565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612b7e57612b7e614782565b6001600160a01b0392831660209182029290920101526013546040516307c0329d60e21b81526000929190911690631f00ca7490612bc290899086906004016147f9565b600060405180830381865afa158015612bdf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c07919081019061481a565b600081518110612c1957612c19614782565b60200260200101519050602154601f54612c339190614a93565b42118015612c4b5750601c546001600160a01b031615155b15612db357601c54612c68906018906001600160a01b03166131a1565b612c8657601c54612c84906018906001600160a01b0316614275565b505b601c546001600160a01b03166000908152602460205260408120805491612cac83614ad5565b9091555050601d54601c546001600160a01b031660009081526025602052604081208054909190612cde908490614a93565b9091555050602b54601c546001600160a01b03166000908152602460205260409020541115612d3b57601c54602a80546001600160a01b0319166001600160a01b039092169182179055600090815260246020526040902054602b555b601c546001600160a01b0316600090815260266020526040902054601d5411612d7e57601c546001600160a01b0316600090815260266020526040902054612d82565b601d545b601c80546001600160a01b031660009081526026602052604081209290925580546001600160a01b0319169055601d555b602254602054612dc39190614a93565b42118015612ddb5750601a546001600160a01b031615155b15612e4a57601a54612df8906016906001600160a01b03166131a1565b612e3457601a54612e14906016906001600160a01b0316614275565b50601b54601a546001600160a01b03166000908152602760205260409020555b601a80546001600160a01b03191690556000601b555b601d5481118015612e7457506001600160a01b0387166000908152602e602052604090205460ff16155b15612f54576001600160a01b038716600090815260236020526040902054612eac57601e8054906000612ea683614ad5565b91905055505b601c546001600160a01b03888116911614612f06576001600160a01b0387166000908152602360205260408120805491612ee583614ad5565b9091555050601c80546001600160a01b0319166001600160a01b0389161790555b601d81905542601f55601b54811115612f5457601a546001600160a01b03888116911614612f4a57601a80546001600160a01b0319166001600160a01b0389161790555b601b819055426020555b505061303d565b6035546001600160a01b038681169116141561303557601c546001600160a01b0387811691161480612f9a5750601a546001600160a01b038781169116145b15613035576001600160a01b0386166000908152602e60205260408120805460ff19166001179055602f805491612fd083614ad5565b9091555050601c546001600160a01b038781169116141561300557601c80546001600160a01b03191690556000601d5542601f555b601a546001600160a01b038781169116141561303557601a80546001600160a01b03191690556000601b55426020555b61303d565b50805b6001600160a01b0385166000908152604160205260409020546130609082612705565b6001600160a01b0380871660008181526041602052604090819020939093559154908816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906130b2908590612762565b60405190815260200160405180910390a350600195945050505050565b600061189383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612820565b6000611329825490565b6000611893838361428a565b6001600160a01b03811661313a57600080fd5b6002546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600280546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b03811660009081526001830160205260408120541515611893565b600081836131e45760405162461bcd60e51b81526004016116789190614380565b5060006128518486614ac1565b600080613209604054846127a190919063ffffffff16565b6001600160a01b03861660009081526041602052604090205490915061322f90826130cf565b6001600160a01b03808716600090815260416020526040808220939093559086168152205461325e9082612705565b6001600160a01b03851660009081526041602052604090205550600190509392505050565b60375460009060ff1680156132b2575061329f6005600a614a0e565b6132ad9063c1b71080614a1a565b603e54105b80156132c957506035546001600160a01b03163314155b80156132df5750603554600160a01b900460ff16155b80156118a75750603c546039546132f69190614a93565b421015905090565b603554600160a01b900460ff161561331257565b600080603854426133239190614a63565b90506000603954426133359190614a63565b9050600061334e603c548361276290919063ffffffff16565b9050600061336a603c80546133639190614ac1565b83906127a1565b9050630f099c00841061339957610140603b546133879190614ac1565b613392906008614a93565b945061343f565b630966018084106133be576050603b546133b39190614ac1565b613392906021614a93565b6305a39a8084106133e3576028603b546133d89190614ac1565b61339290603e614a93565b6303c267008410613408576014603b546133fd9190614ac1565b61339290607d614a93565b6301e13380841061342d57600a603b546134229190614ac1565b6133929060e0614a93565b603b5461343c9061093a614a93565b94505b60005b8281101561348a576134756134596007600a614af0565b611a5661346c896123286007600a614af0565b603e54906127a1565b603e558061348281614ad5565b915050613442565b50603e546134c39061349e6005600a614a0e565b6134ab906204f588614a1a565b6134b790600019614a4f565b611a5690600019614a63565b604055603c546134e1906134d89084906127a1565b60395490612705565b603981905550600560019054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561353757600080fd5b505af115801561354b573d6000803e3d6000fd5b50505050807f72725a3b1e5bd622d6bcd1339bb31279c351abe8f541ac7fd320f24e1b1641f2603e5460405161358391815260200190565b60405180910390a25050505050565b603754600090610100900460ff1680156135b65750603554600160a01b900460ff16155b80156135cd57506035546001600160a01b03163314155b80156118a75750603d54603a546132f69190614a93565b6035805460ff60a01b1916600160a01b179055604080546030546001600160a01b0316600090815260416020529182205461361e91612762565b6030546001600160a01b03166000908152604160205260408082205430835291205491925061364d9190612705565b30600090815260416020526040808220929092556030546001600160a01b03168152908120819055613680826002612762565b9050600061368e83836130cf565b90508061369d575050506138ae565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106136d2576136d2614782565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801561372b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061374f9190614798565b8160018151811061376257613762614782565b6001600160a01b03928316602091820292909201015260135460405163791ac94760e01b81524792919091169063791ac947906137ac9086906000908790309042906004016148d8565b600060405180830381600087803b1580156137c657600080fd5b505af11580156137da573d6000803e3d6000fd5b5050505060006137f382476130cf90919063ffffffff16565b90506000851180156138055750600081115b156138a35760135460305460405163f305d71960e01b81523060048201526024810188905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af115801561387a573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061389f9190614aff565b5050505b505042603a55505050505b6035805460ff60a01b19169055565b603554600090600160a01b900460ff161580156118a75750506035546001600160a01b031633141590565b6035805460ff60a01b1916600160a01b1790556040805430600090815260416020529182205461391791612762565b9050603f54811015613929578061392d565b603f545b90508061393a57506138ae565b60006064600f548361394c9190614a1a565b6139569190614ac1565b905060006064600e548461396a9190614a1a565b6139749190614ac1565b90506000816139838486614a63565b61398d9190614a63565b90506000601d54600014806139a25750601b54155b15613a5e57601d546139d5576064836010546139be9190614a1a565b6139c89190614ac1565b6139d29082614a93565b90505b601b54613a0f5760648360105460646139ee9190614a63565b6139f89190614a1a565b613a029190614ac1565b613a0c9082614a93565b90505b613a198184614a63565b6033546001600160a01b0316600090815260416020526040902054909350613a42908290614a93565b6033546001600160a01b03166000908152604160205260409020555b600082613a6b8587614a93565b613a759190614a93565b60408051600280825260608201835292935047926000926020830190803683370190505090503081600081518110613aaf57613aaf614782565b6001600160a01b03928316602091820292909201810191909152601354604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613b08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b2c9190614798565b81600181518110613b3f57613b3f614782565b6001600160a01b03928316602091820292909201015260135460405163791ac94760e01b815291169063791ac94790613b859086906000908690309042906004016148d8565b600060405180830381600087803b158015613b9f57600080fd5b505af1158015613bb3573d6000803e3d6000fd5b505050506000613bcc83476130cf90919063ffffffff16565b9050601d546000141580613be15750601b5415155b15613ef757600084613bf38984614a1a565b613bfd9190614ac1565b9050601d54600014158015613c135750601b5415155b15613d98576000606482601054613c2a9190614a1a565b613c349190614ac1565b90506000613c428284614a63565b601a546040519192506000916001600160a01b039091169061753090849084818181858888f193505050503d8060008114613c99576040519150601f19603f3d011682016040523d82523d6000602084013e613c9e565b606091505b5050601c546040519192506001600160a01b0316906175309085906000818181858888f193505050503d8060008114613cf3576040519150601f19603f3d011682016040523d82523d6000602084013e613cf8565b606091505b5050601a546001600160a01b0316600090815260286020526040812080549293508492909190613d29908490614a93565b9091555050601c546001600160a01b031660009081526029602052604081208054859290613d58908490614a93565b9250508190555081602c6000828254613d719190614a93565b9250508190555082602d6000828254613d8a9190614a93565b90915550613ef59350505050565b601d5415613e4d57601c546040516000916001600160a01b03169061753090849084818181858888f193505050503d8060008114613df2576040519150601f19603f3d011682016040523d82523d6000602084013e613df7565b606091505b5050601c546001600160a01b0316600090815260296020526040812080549293508492909190613e28908490614a93565b9250508190555081602d6000828254613e419190614a93565b90915550613ef5915050565b601a546040516000916001600160a01b03169061753090849084818181858888f193505050503d8060008114613e9f576040519150601f19603f3d011682016040523d82523d6000602084013e613ea4565b606091505b5050601a546001600160a01b0316600090815260286020526040812080549293508492909190613ed5908490614a93565b9250508190555081602c6000828254613eee9190614a93565b9091555050505b505b6031546000906001600160a01b031685613f118b85614a1a565b613f1b9190614ac1565b60405161753091906000818181858888f193505050503d8060008114613f5d576040519150601f19603f3d011682016040523d82523d6000602084013e613f62565b606091505b50506032546040519192506001600160a01b0316906175309047906000818181858888f193505050503d8060008114613fb7576040519150601f19603f3d011682016040523d82523d6000602084013e613fbc565b606091505b505050505050505050505050506035805460ff60a01b19169055565b6035546000906001600160a01b038481169116148061400457506035546001600160a01b038381169116145b801561402957506001600160a01b03821660009081526006602052604090205460ff16155b8015611893575050506001600160a01b031660009081526006602052604090205460ff161590565b60355460009081906001600160a01b038581169116141561416f57600a546140aa9061408990614083866103e8612762565b906127a1565b6033546001600160a01b031660009081526041602052604090205490612705565b6033546001600160a01b0316600090815260416020526040902055600c546140f2906140dc90614083866103e8612762565b3060009081526041602052604090205490612705565b3060009081526041602052604090205560095461413a9061411990614083866103e8612762565b6030546001600160a01b031660009081526041602052604090205490612705565b6030546001600160a01b031660009081526041602052604090205560125461416890614083856103e8612762565b9050614210565b6008546141869061408990614083866103e8612762565b6033546001600160a01b0316600090815260416020526040902055600b546141b8906140dc90614083866103e8612762565b306000908152604160205260409020556007546141df9061411990614083866103e8612762565b6030546001600160a01b031660009081526041602052604090205560115461420d90614083856103e8612762565b90505b306001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef61425a6040548561276290919063ffffffff16565b60405190815260200160405180910390a361285183826130cf565b6000611893836001600160a01b038416614310565b815460009082106142e85760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401611678565b8260000182815481106142fd576142fd614782565b9060005260206000200154905092915050565b600081815260018301602052604081205461435757508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611329565b506000611329565b6001600160a01b03169052565b6001600160a01b0391909116815260200190565b600060208083528351808285015260005b818110156143ad57858101830151858201604001528201614391565b818111156143bf576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b03811681146125d357600080fd5b600080604083850312156143fd57600080fd5b8235614408816143d5565b946020939093013593505050565b8035801515811461442657600080fd5b919050565b6000806040838503121561443e57600080fd5b8235915061444e60208401614416565b90509250929050565b60006020828403121561446957600080fd5b8135611893816143d5565b60006020828403121561448657600080fd5b5035919050565b6000806000606084860312156144a257600080fd5b83356144ad816143d5565b925060208401356144bd816143d5565b929592945050506040919091013590565b6000806000606084860312156144e357600080fd5b6144ec84614416565b95602085013595506040909401359392505050565b6000806040838503121561451457600080fd5b823561451f816143d5565b915061444e60208401614416565b60006102408201905061454182845161435f565b60208301516020830152604083015161455d604084018261435f565b50606083015160608301526080830151608083015260a083015160a083015260c083015161458e60c084018261435f565b5060e08381015190830152610100808401519083015261012080840151908301526101408084015190830152610160808401519083015261018080840151908301526101a080840151908301526101c080840151908301526101e08084015190830152610200808401519083015261022092830151929091019190915290565b6000806040838503121561462157600080fd5b61440883614416565b6000806000806000806000806000806101408b8d03121561464a57600080fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b6000806000606084860312156146a757600080fd5b83356146b2816143d5565b925060208401356146c2816143d5565b915060408401356146d2816143d5565b809150509250925092565b600080604083850312156146f057600080fd5b82356146fb816143d5565b9150602083013561470b816143d5565b809150509250929050565b60006020828403121561472857600080fd5b61189382614416565b600181811c9082168061474557607f821691505b6020821081141561476657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000602082840312156147aa57600080fd5b8151611893816143d5565b600081518084526020808501945080840160005b838110156147ee5781516001600160a01b0316875295820195908201906001016147c9565b509495945050505050565b82815260406020820152600061481260408301846147b5565b949350505050565b6000602080838503121561482d57600080fd5b825167ffffffffffffffff8082111561484557600080fd5b818501915085601f83011261485957600080fd5b81518181111561486b5761486b61476c565b8060051b604051601f19603f830116810181811085821117156148905761489061476c565b6040529182528482019250838101850191888311156148ae57600080fd5b938501935b828510156148cc578451845293850193928501926148b3565b98975050505050505050565b85815284602082015260a0604082015260006148f760a08301866147b5565b6001600160a01b0394909416606083015250608001529392505050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561496557816000190482111561494b5761494b614914565b8085161561495857918102915b93841c939080029061492f565b509250929050565b60008261497c57506001611329565b8161498957506000611329565b816001811461499f57600281146149a9576149c5565b6001915050611329565b60ff8411156149ba576149ba614914565b50506001821b611329565b5060208310610133831016604e8410600b84101617156149e8575081810a611329565b6149f2838361492a565b8060001904821115614a0657614a06614914565b029392505050565b6000611893838361496d565b6000816000190483118215151615614a3457614a34614914565b500290565b634e487b7160e01b600052601260045260246000fd5b600082614a5e57614a5e614a39565b500690565b600082821015614a7557614a75614914565b500390565b600060208284031215614a8c57600080fd5b5051919050565b60008219821115614aa657614aa6614914565b500190565b634e487b7160e01b600052600160045260246000fd5b600082614ad057614ad0614a39565b500490565b6000600019821415614ae957614ae9614914565b5060010190565b600061189360ff84168361496d565b600080600060608486031215614b1457600080fd5b835192506020840151915060408401519050925092509256fe8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a2646970667358221220290c12c610ca2c0d83ee8e59102d7dda7e949765dc3f60e926769ee3d3935e3764736f6c634300080c0033