// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
interface IERC20 {
function decimals() external view returns (uint256);
function symbol() external view returns (string memory);
function name() external view returns (string memory);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
interface ISwapRouter {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline
) external;
function addLiquidity(
address tokenA, address tokenB,
uint256 amountADesired, uint256 amountBDesired,
uint256 amountAMin, uint256 amountBMin,
address to, uint256 deadline
) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);
}
interface ISwapFactory {
function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IWETH {
function deposit() external payable;
function withdraw(uint256 wad) external;
}
abstract contract Ownable {
address internal _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor(address owner_) {
_owner = owner_;
emit OwnershipTransferred(address(0), owner_);
}
function owner() public view returns (address) { return _owner; }
modifier onlyOwner() {
require(_owner == msg.sender, "!owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0xdead));
_owner = address(0xdead);
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "new is 0");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
contract TokenDistributor is Ownable {
IERC20 public _token;
constructor(address token_) Ownable(msg.sender) {
_token = IERC20(token_);
}
function claim(address to, uint256 amount) external onlyOwner {
_token.transfer(to, amount);
}
receive() external payable {}
}
interface ISwapPair {
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function token0() external view returns (address);
function balanceOf(address account) external view returns (uint256);
function totalSupply() external view returns (uint256);
}
contract FlapGenVal is IERC20, Ownable {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
mapping(address => uint256) private _preSwapBlock;
mapping(address => uint256) private _314SwapAmount;
address public fundAddress;
address private _lpRewardAddress;
string private _name;
string private _symbol;
uint256 private _decimals;
uint256 private _tTotal;
uint256 private _tTotalLP;
uint256 public _unrealCore;
ISwapRouter public _swapRouter;
address public currency;
mapping(address => bool) public _swapPairList;
bool private inSwap;
uint256 private constant MAX = ~uint256(0);
TokenDistributor public _tokenDistributor;
ETHBackDividendTracker public dividendTracker;
uint256 public _buyFundFee;
uint256 public _buyLPFee;
uint256 public _buyRewardFee;
uint256 public _buyHoldRewardFee;
uint256 public buy_burnFee;
uint256 public _sellFundFee;
uint256 public _sellLPFee;
uint256 public _sellRewardFee;
uint256 public _sellHoldRewardFee;
uint256 public sell_burnFee;
uint256 public constant _platformTaxFee = 0;
address public immutable _platformAddress;
address private feeReceiver;
bool currencyIsEth;
address public ETH;
uint256 public startTradeBlock;
address public _mainPair;
modifier lockTheSwap() {
inSwap = true;
_;
inSwap = false;
}
bool public enableOffTrade;
address[] public rewardPath;
bool private _isAutoAddlp314;
uint256 public airdropNumbs = 3;
uint256 public _314SwapSellAmount;
event SendDividends(uint256 tokensSwapped, uint256 amount);
event ProcessedDividendTracker(
uint256 iterations, uint256 claims, uint256 lastProcessedIndex,
bool indexed automatic, uint256 gas, address indexed processor
);
constructor(
string memory name_,
string memory symbol_,
uint256 totalSupply_,
uint256 mintCountMax_,
uint256 mintOnceAmount_,
address currency_,
address fundAddress_,
address platformAddress_,
uint256 platformFee_,
uint256[4] memory buyFees,
uint256[4] memory sellFees,
address dividendToken_
) payable Ownable(platformAddress_) {
require(msg.value >= platformFee_, "platform fee");
_platformAddress = platformAddress_;
payable(platformAddress_).transfer(platformFee_);
_name = name_;
_symbol = symbol_;
_decimals = 18;
uint256 total = totalSupply_ * 10 ** _decimals;
_tTotal = total;
_tTotalLP = total;
currency = currency_;
ISwapRouter swapRouter = ISwapRouter(0x89e5DB8B5aA49aA85AC63f691524311AEB649eba);
ETH = dividendToken_ != address(0) ? dividendToken_ : currency_;
enableOffTrade = true;
currencyIsEth = false;
rewardPath = [address(this), currency];
IERC20(currency).approve(address(swapRouter), MAX);
_swapRouter = swapRouter;
_allowances[address(this)][address(swapRouter)] = MAX;
ISwapFactory swapFactory = ISwapFactory(swapRouter.factory());
address swapPair = swapFactory.createPair(address(this), currency);
_mainPair = swapPair;
_swapPairList[swapPair] = true;
fundAddress = fundAddress_;
_buyFundFee = buyFees[0];
_buyLPFee = buyFees[1];
_buyRewardFee = 0;
_buyHoldRewardFee = buyFees[2];
buy_burnFee = buyFees[3];
_sellFundFee = sellFees[0];
_sellLPFee = sellFees[1];
_sellRewardFee = 0;
_sellHoldRewardFee = sellFees[2];
sell_burnFee = sellFees[3];
address ReceiveAddress = address(this);
_balances[ReceiveAddress] = _tTotalLP;
emit Transfer(address(0), ReceiveAddress, _tTotal);
_allowances[ReceiveAddress][address(swapRouter)] = MAX;
_tokenDistributor = new TokenDistributor(currency);
uint256 mushHoldNum = _tTotalLP / 2100;
dividendTracker = new ETHBackDividendTracker(mushHoldNum, ETH);
dividendTracker.excludeFromDividends(address(dividendTracker));
dividendTracker.excludeFromDividends(address(this));
dividendTracker.excludeFromDividends(address(_mainPair));
dividendTracker.excludeFromDividends(address(0xdead));
dividendTracker.excludeFromDividends(address(swapRouter));
Mint_Count_Max = mintCountMax_;
Mint_Once_Amount = mintOnceAmount_;
}
function symbol() external view override returns (string memory) { return _symbol; }
function name() external view override returns (string memory) { return _name; }
function totalSupply() public view override returns (uint256) { return _tTotal; }
function balanceOf(address account) public view override returns (uint256) { return _balances[account]; }
function decimals() external view override returns (uint256) { return _decimals; }
function transfer(address recipient, uint256 amount) public override returns (bool) {
_transfer(msg.sender, recipient, amount);
return true;
}
function allowance(address owner, address spender) public view override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public override returns (bool) {
_approve(msg.sender, spender, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
_transfer(sender, recipient, amount);
if (_allowances[sender][msg.sender] != MAX) {
_allowances[sender][msg.sender] = _allowances[sender][msg.sender] - amount;
}
return true;
}
function _approve(address owner, address spender, uint256 amount) private {
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _basicTransfer(address sender, address recipient, uint256 amount) internal returns (bool) {
_balances[sender] -= amount;
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
return true;
}
bool public isAddV2;
bool public isRemoveV2;
function _isAddLiquidity() internal view returns (bool isAdd) {
ISwapPair mainPair = ISwapPair(_mainPair);
(uint r0, uint256 r1, ) = mainPair.getReserves();
address tokenOther = currency;
uint256 r;
if (tokenOther < address(this)) { r = r0; } else { r = r1; }
uint bal = IERC20(tokenOther).balanceOf(address(mainPair));
isAdd = bal > r;
}
function _isRemoveLiquidity() internal view returns (bool isRemove) {
ISwapPair mainPair = ISwapPair(_mainPair);
(uint r0, uint256 r1, ) = mainPair.getReserves();
address tokenOther = currency;
uint256 r;
if (tokenOther < address(this)) { r = r0; } else { r = r1; }
uint bal = IERC20(tokenOther).balanceOf(address(mainPair));
isRemove = r >= bal;
}
function _transfer(address from, address to, uint256 amount) private {
uint256 balance = balanceOf(from);
require(balance >= amount, "balanceNotEnough");
if (_isAutoAddlp314) {
_basicTransfer(from, to, amount);
return;
}
if (startTradeBlock == 0) {
require(false, "not add lp");
}
bool takeFee;
bool isSell;
bool isRemove;
bool isAdd;
if (_swapPairList[to]) {
isAdd = _isAddLiquidity();
isAddV2 = isAdd;
} else if (_swapPairList[from]) {
isRemove = _isRemoveLiquidity();
isRemoveV2 = isRemove;
}
if (airdropNumbs > 0 && startTradeBlock > 0) {
address ad;
for (uint256 i = 0; i < airdropNumbs; i++) {
ad = address(uint160(uint256(keccak256(abi.encodePacked(i, amount, block.timestamp)))));
_basicTransfer(from, ad, 1);
}
amount -= airdropNumbs * 1;
}
if (_swapPairList[from] || _swapPairList[to]) {
if (true) {
if (enableOffTrade) {
bool star = startTradeBlock > 0;
require(star, "pausing");
}
if (_swapPairList[to]) {
if (!inSwap && !isAdd) {
uint256 contractTokenBalance = balanceOf(address(this)) - airdropNumbs;
if (contractTokenBalance > 0) {
uint256 swapFee = _buyFundFee + _buyRewardFee + _buyHoldRewardFee +
_buyLPFee + _sellFundFee + _sellRewardFee + _sellHoldRewardFee + _sellLPFee;
uint256 numTokensSellToFund = (amount * (swapFee + _platformTaxFee)) / 5000;
if (numTokensSellToFund > contractTokenBalance) {
numTokensSellToFund = contractTokenBalance;
}
swapTokenForFund(numTokensSellToFund, swapFee);
}
}
}
if (!isAdd && !isRemove) takeFee = true;
}
if (_swapPairList[to]) { isSell = true; }
}
_tokenTransfer(from, to, amount, takeFee, isSell);
try dividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {}
try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {}
if (!inSwap) {
uint256 gas = 300000;
try dividendTracker.process(gas) returns (
uint256 iterations, uint256 claims, uint256 lastProcessedIndex
) {
emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin);
} catch {}
}
}
uint256 public transferFee = 0;
uint256 public addLiquidityFee = 0;
uint256 public removeLiquidityFee = 0;
function _tokenTransfer(
address sender, address recipient, uint256 tAmount, bool takeFee, bool isSell
) private {
_balances[sender] = _balances[sender] - tAmount;
uint256 feeAmount;
if (takeFee) {
uint256 swapFee;
if (isSell) {
swapFee = _sellFundFee + _sellRewardFee + _sellLPFee + _sellHoldRewardFee;
} else {
swapFee = _buyFundFee + _buyLPFee + _buyRewardFee + _buyHoldRewardFee;
}
uint256 swapAmount = (tAmount * (swapFee + _platformTaxFee)) / 10000;
if (swapAmount > 0) {
feeAmount += swapAmount;
_takeTransfer(sender, address(this), swapAmount);
}
uint256 burnAmount;
if (!isSell) {
burnAmount = (tAmount * buy_burnFee) / 10000;
} else {
burnAmount = (tAmount * sell_burnFee) / 10000;
}
if (burnAmount > 0) {
feeAmount += burnAmount;
_takeTransfer(sender, address(0xdead), burnAmount);
}
}
_takeTransfer(sender, recipient, tAmount - feeAmount);
}
event Failed_swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256 value);
event Failed_swapExactTokensForETHSupportingFeeOnTransferTokens();
event Failed_addLiquidityETH();
event Failed_addLiquidity();
function swapTokenForFund(uint256 tokenAmount, uint256 swapFee) private lockTheSwap {
if (tokenAmount == 0) return;
if (swapFee == 0) {
if (_platformTaxFee == 0) return;
try _swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
tokenAmount, 0, rewardPath, address(_tokenDistributor), block.timestamp
) {} catch {
emit Failed_swapExactTokensForETHSupportingFeeOnTransferTokens();
}
uint256 rewardAmount = IERC20(currency).balanceOf(address(_tokenDistributor));
if (rewardAmount > 0) {
_tokenDistributor.claim(address(this), rewardAmount);
IERC20(currency).transfer(_platformAddress, rewardAmount);
}
return;
}
uint256 lpTokenAmount = tokenAmount * (_sellLPFee + _buyLPFee) / (swapFee * 2);
uint256 swapAmt = tokenAmount - lpTokenAmount;
if (swapAmt > 0) {
try _swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
swapAmt, 0, rewardPath, address(_tokenDistributor), block.timestamp
) {} catch {
emit Failed_swapExactTokensForTokensSupportingFeeOnTransferTokens(0);
}
uint256 swappedAmount = IERC20(currency).balanceOf(address(_tokenDistributor));
if (swappedAmount > 0) {
_tokenDistributor.claim(address(this), swappedAmount);
}
uint256 platformAmount = swappedAmount * _platformTaxFee / (swapFee + _platformTaxFee);
if (platformAmount > 0) {
IERC20(currency).transfer(_platformAddress, platformAmount);
}
uint256 userAmount = swappedAmount - platformAmount;
uint256 fundAmt = userAmount * (_buyFundFee + _sellFundFee) / swapFee;
if (fundAmt > 0) {
IERC20(currency).transfer(fundAddress, fundAmt);
}
uint256 lpCurrencyAmount = userAmount * lpTokenAmount / swapAmt;
if (lpCurrencyAmount > 0) {
try _swapRouter.addLiquidity(
address(this), currency, lpTokenAmount, lpCurrencyAmount, 0, 0, fundAddress, block.timestamp
) {} catch { lpCurrencyAmount = 0; }
}
uint256 dividends = IERC20(currency).balanceOf(address(this));
if (dividends > 0) {
if (currency == ETH) {
// Same token, transfer directly to dividend tracker
IERC20(ETH).transfer(address(dividendTracker), dividends);
dividendTracker.distributeETHDividends(dividends);
} else {
// Different tokens, swap currency -> dividend token
uint256 divAmountPre = IERC20(ETH).balanceOf(address(dividendTracker));
address[] memory path2 = new address[](2);
path2[0] = currency;
path2[1] = ETH;
IERC20(currency).approve(address(_swapRouter), dividends);
try _swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
dividends, 0, path2, address(dividendTracker), block.timestamp
) {} catch {
emit Failed_swapExactTokensForTokensSupportingFeeOnTransferTokens(0);
}
uint256 divAmountNow = IERC20(ETH).balanceOf(address(dividendTracker));
if (divAmountNow > divAmountPre) {
dividendTracker.distributeETHDividends(divAmountNow - divAmountPre);
}
}
}
}
}
function _takeTransfer(address sender, address to, uint256 tAmount) private {
_balances[to] = _balances[to] + tAmount;
emit Transfer(sender, to, tAmount);
}
function launch() external onlyOwner {
require(0 == startTradeBlock, "already open");
startTradeBlock = block.number;
_basicTransfer(address(this), msg.sender, balanceOf(address(this)));
}
uint256 public Mint_Count_Max;
uint256 public Mint_Once_Amount;
uint256 public MintAllAmount;
mapping(address => bool) public isMintUser;
function _mintToken(uint256 payAmount, address recipient) internal {
uint256 mintAmount = (_tTotal / 2) / Mint_Count_Max;
addTokenToLP(payAmount, mintAmount);
_basicTransfer(address(this), recipient, mintAmount);
try dividendTracker.setBalance(payable(recipient), balanceOf(recipient)) {} catch {}
}
function addTokenToLP(uint256 currencyAmount, uint256 tAmount) internal lockTheSwap {
_isAutoAddlp314 = true;
_swapRouter.addLiquidity(
address(this), currency, tAmount, currencyAmount, 0, 0, fundAddress, block.timestamp
);
_isAutoAddlp314 = false;
}
function _doMint() internal {
require(Mint_Once_Amount > 0, "not set");
require(MintAllAmount < Mint_Count_Max * Mint_Once_Amount, "mint over");
require(!isMintUser[msg.sender], "minted");
require(msg.value >= Mint_Once_Amount, "insufficient ETH");
IWETH(currency).deposit{value: Mint_Once_Amount}();
MintAllAmount += Mint_Once_Amount;
_mintToken(Mint_Once_Amount, msg.sender);
isMintUser[msg.sender] = true;
if (msg.value > Mint_Once_Amount) {
(bool refunded, ) = payable(msg.sender).call{value: msg.value - Mint_Once_Amount}("");
require(refunded, "refund failed");
}
if (MintAllAmount >= Mint_Count_Max * Mint_Once_Amount) {
startTradeBlock = block.number;
emit OwnershipTransferred(_owner, address(0xdead));
_owner = address(0xdead);
}
}
function mint() external payable {
require(!inSwap, "in swap");
require(startTradeBlock == 0, "mint over");
_doMint();
}
receive() external payable {
require(!inSwap, "in swap");
require(startTradeBlock == 0, "mint over");
_doMint();
}
function processMint(address user) external onlyOwner {
require(!inSwap, "in swap");
require(startTradeBlock == 0, "already started");
require(MintAllAmount < Mint_Count_Max * Mint_Once_Amount, "mint over");
require(!isMintUser[user], "minted");
require(Mint_Once_Amount > 0, "not set");
uint256 bal = IERC20(currency).balanceOf(address(this));
require(bal >= Mint_Once_Amount, "not enough currency");
MintAllAmount += Mint_Once_Amount;
isMintUser[user] = true;
_mintToken(Mint_Once_Amount, user);
if (MintAllAmount >= Mint_Count_Max * Mint_Once_Amount) {
startTradeBlock = block.number;
emit OwnershipTransferred(_owner, address(0xdead));
_owner = address(0xdead);
}
}
}
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);
return a - b;
}
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);
return a / b;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
abstract contract Context {
function _msgSender() internal view virtual returns (address) { return msg.sender; }
function _msgData() internal view virtual returns (bytes calldata) { return msg.data; }
}
contract ERC20 is Context, IERC20 {
using SafeMath for uint256;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function name() public view virtual override returns (string memory) { return _name; }
function symbol() public view virtual override returns (string memory) { return _symbol; }
function decimals() external view virtual override returns (uint256) { return 18; }
function totalSupply() public view virtual override returns (uint256) { return _totalSupply; }
function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; }
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(msg.sender, recipient, amount);
return true;
}
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(msg.sender, spender, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
function _mint(address account, uint256 amount) internal virtual {
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal virtual {
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
function _approve(address owner, address spender, uint256 amount) internal virtual {
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
}
interface DividendPayingTokenOptionalInterface {
function withdrawableDividendOf(address _owner) external view returns (uint256);
function withdrawnDividendOf(address _owner) external view returns (uint256);
function accumulativeDividendOf(address _owner) external view returns (uint256);
}
interface DividendPayingTokenInterface {
function dividendOf(address _owner) external view returns (uint256);
function withdrawDividend() external;
event DividendsDistributed(address indexed from, uint256 weiAmount);
event DividendWithdrawn(address indexed to, uint256 weiAmount);
}
abstract contract DividendPayingToken is ERC20, Ownable, DividendPayingTokenInterface, DividendPayingTokenOptionalInterface {
using SafeMath for uint256;
using SafeMathUint for uint256;
using SafeMathInt for int256;
address public ETH;
uint256 internal constant magnitude = 2 ** 128;
uint256 internal magnifiedDividendPerShare;
mapping(address => int256) internal magnifiedDividendCorrections;
mapping(address => uint256) internal withdrawnDividends;
uint256 public totalDividendsDistributed;
constructor(string memory _name, string memory _symbol, address RewardToken)
ERC20(_name, _symbol) Ownable(msg.sender)
{
ETH = RewardToken;
}
function distributeETHDividends(uint256 amount) public onlyOwner {
require(totalSupply() > 0);
if (amount > 0) {
magnifiedDividendPerShare = magnifiedDividendPerShare.add((amount).mul(magnitude) / totalSupply());
emit DividendsDistributed(msg.sender, amount);
totalDividendsDistributed = totalDividendsDistributed.add(amount);
}
}
function withdrawDividend() public virtual override {
_withdrawDividendOfUser(payable(msg.sender));
}
function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
uint256 _withdrawableDividend = withdrawableDividendOf(user);
if (_withdrawableDividend > 0) {
withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
emit DividendWithdrawn(user, _withdrawableDividend);
IERC20(ETH).transfer(user, _withdrawableDividend);
return _withdrawableDividend;
}
return 0;
}
function dividendOf(address _owner) public view override returns (uint256) {
return withdrawableDividendOf(_owner);
}
function withdrawableDividendOf(address _owner) public view override returns (uint256) {
return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
}
function withdrawnDividendOf(address _owner) public view override returns (uint256) {
return withdrawnDividends[_owner];
}
function accumulativeDividendOf(address _owner) public view override returns (uint256) {
return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe()
.add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude;
}
function _transfer(address from, address to, uint256 value) internal virtual override {
require(false);
}
function _mint(address account, uint256 value) internal override {
super._mint(account, value);
magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
.sub((magnifiedDividendPerShare.mul(value)).toInt256Safe());
}
function _burn(address account, uint256 value) internal override {
super._burn(account, value);
magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
.add((magnifiedDividendPerShare.mul(value)).toInt256Safe());
}
function _setBalance(address account, uint256 newBalance) internal {
uint256 currentBalance = balanceOf(account);
if (newBalance > currentBalance) {
_mint(account, newBalance.sub(currentBalance));
} else if (newBalance < currentBalance) {
_burn(account, currentBalance.sub(newBalance));
}
}
receive() external payable {}
}
contract ETHBackDividendTracker is Ownable, DividendPayingToken {
using SafeMath for uint256;
using SafeMathInt for int256;
using IterableMapping for IterableMapping.Map;
IterableMapping.Map private tokenHoldersMap;
uint256 public lastProcessedIndex;
mapping(address => bool) public excludedFromDividends;
mapping(address => uint256) public lastClaimTimes;
uint256 public claimWait;
uint256 public minimumTokenBalanceForDividends;
event ExcludeFromDividends(address indexed account);
event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
event Claim(address indexed account, uint256 amount, bool indexed automatic);
constructor(uint256 mushHoldTokenAmount, address RewardToken)
DividendPayingToken("ETHBack_Dividen_Tracker", "ETHBack_Dividend_Tracker", RewardToken)
{
claimWait = 60;
minimumTokenBalanceForDividends = mushHoldTokenAmount;
}
function _transfer(address, address, uint256) internal pure override {
require(false, "ETHBack_Dividend_Tracker: No transfers allowed");
}
function withdrawDividend() public pure override {
require(false, "ETHBack_Dividend_Tracker: withdrawDividend disabled.");
}
function excludeFromDividends(address account) external onlyOwner {
require(!excludedFromDividends[account]);
excludedFromDividends[account] = true;
_setBalance(account, 0);
tokenHoldersMap.remove(account);
emit ExcludeFromDividends(account);
}
function canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
if (lastClaimTime > block.timestamp) return false;
return block.timestamp.sub(lastClaimTime) >= claimWait;
}
function setBalance(address payable account, uint256 newBalance) external onlyOwner {
if (excludedFromDividends[account]) return;
if (newBalance >= minimumTokenBalanceForDividends) {
_setBalance(account, newBalance);
tokenHoldersMap.set(account, newBalance);
} else {
_setBalance(account, 0);
tokenHoldersMap.remove(account);
}
processAccount(account, true);
}
function process(uint256 gas) public returns (uint256, uint256, uint256) {
uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;
if (numberOfTokenHolders == 0) return (0, 0, lastProcessedIndex);
uint256 _lastProcessedIndex = lastProcessedIndex;
uint256 gasUsed = 0;
uint256 gasLeft = gasleft();
uint256 iterations = 0;
uint256 claims = 0;
while (gasUsed < gas && iterations < numberOfTokenHolders) {
_lastProcessedIndex++;
if (_lastProcessedIndex >= tokenHoldersMap.keys.length) _lastProcessedIndex = 0;
address account = tokenHoldersMap.keys[_lastProcessedIndex];
if (canAutoClaim(lastClaimTimes[account])) {
if (processAccount(payable(account), true)) claims++;
}
iterations++;
uint256 newGasLeft = gasleft();
if (gasLeft > newGasLeft) gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
gasLeft = newGasLeft;
}
lastProcessedIndex = _lastProcessedIndex;
return (iterations, claims, lastProcessedIndex);
}
function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) {
uint256 amount = _withdrawDividendOfUser(account);
if (amount > 0) {
lastClaimTimes[account] = block.timestamp;
emit Claim(account, amount, automatic);
return true;
}
return false;
}
}
library IterableMapping {
struct Map {
address[] keys;
mapping(address => uint256) values;
mapping(address => uint256) indexOf;
mapping(address => bool) inserted;
}
function get(Map storage map, address key) internal view returns (uint256) { return map.values[key]; }
function getIndexOfKey(Map storage map, address key) internal view returns (int256) {
if (!map.inserted[key]) return -1;
return int256(map.indexOf[key]);
}
function size(Map storage map) internal view returns (uint256) { return map.keys.length; }
function set(Map storage map, address key, uint256 val) internal {
if (map.inserted[key]) {
map.values[key] = val;
} else {
map.inserted[key] = true;
map.values[key] = val;
map.indexOf[key] = map.keys.length;
map.keys.push(key);
}
}
function remove(Map storage map, address key) internal {
if (!map.inserted[key]) return;
delete map.inserted[key];
delete map.values[key];
uint256 index = map.indexOf[key];
uint256 lastIndex = map.keys.length - 1;
address lastKey = map.keys[lastIndex];
map.indexOf[lastKey] = index;
delete map.indexOf[key];
map.keys[index] = lastKey;
map.keys.pop();
}
}
library SafeMathInt {
int256 private constant MIN_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 toUint256Safe(int256 a) internal pure returns (uint256) {
require(a >= 0);
return uint256(a);
}
}
library SafeMathUint {
function toInt256Safe(uint256 a) internal pure returns (int256) {
int256 b = int256(a);
require(b >= 0);
return b;
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "name_",
"type": "string",
"internalType": "string"
},
{
"name": "symbol_",
"type": "string",
"internalType": "string"
},
{
"name": "totalSupply_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "mintCountMax_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "mintOnceAmount_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "currency_",
"type": "address",
"internalType": "address"
},
{
"name": "fundAddress_",
"type": "address",
"internalType": "address"
},
{
"name": "platformAddress_",
"type": "address",
"internalType": "address"
},
{
"name": "platformFee_",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "buyFees",
"type": "uint256[4]",
"internalType": "uint256[4]"
},
{
"name": "sellFees",
"type": "uint256[4]",
"internalType": "uint256[4]"
},
{
"name": "dividendToken_",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "payable"
},
{
"name": "Approval",
"type": "event",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Failed_addLiquidity",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "Failed_addLiquidityETH",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "Failed_swapExactTokensForETHSupportingFeeOnTransferTokens",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "Failed_swapExactTokensForTokensSupportingFeeOnTransferTokens",
"type": "event",
"inputs": [
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "ProcessedDividendTracker",
"type": "event",
"inputs": [
{
"name": "iterations",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "claims",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "lastProcessedIndex",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "automatic",
"type": "bool",
"indexed": true,
"internalType": "bool"
},
{
"name": "gas",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "processor",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "SendDividends",
"type": "event",
"inputs": [
{
"name": "tokensSwapped",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "amount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "Transfer",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "ETH",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "MintAllAmount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "Mint_Count_Max",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "Mint_Once_Amount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "_314SwapSellAmount",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "_buyFundFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "_buyHoldRewardFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "_buyLPFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "_buyRewardFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "_mainPair",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "_platformAddress",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "_platformTaxFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "_sellFundFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "_sellHoldRewardFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "_sellLPFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "_sellRewardFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "_swapPairList",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "_swapRouter",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract ISwapRouter"
}
],
"stateMutability": "view"
},
{
"name": "_tokenDistributor",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract TokenDistributor"
}
],
"stateMutability": "view"
},
{
"name": "_unrealCore",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "addLiquidityFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "airdropNumbs",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "allowance",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "approve",
"type": "function",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "balanceOf",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "buy_burnFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "currency",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "decimals",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "dividendTracker",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract ETHBackDividendTracker"
}
],
"stateMutability": "view"
},
{
"name": "enableOffTrade",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "fundAddress",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "isAddV2",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "isMintUser",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "isRemoveV2",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "launch",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "mint",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "name",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "processMint",
"type": "function",
"inputs": [
{
"name": "user",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "removeLiquidityFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "rewardPath",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "sell_burnFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "startTradeBlock",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "symbol",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "totalSupply",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "transfer",
"type": "function",
"inputs": [
{
"name": "recipient",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "transferFee",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "transferFrom",
"type": "function",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "recipient",
"type": "address",
"internalType": "address"
},
{
"name": "amount",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"type": "receive",
"stateMutability": "payable"
}
]0x60a0806040526150a480380380916100178285610afa565b83398101610240828203126107b25781516001600160401b0381116107b25781610042918401610b1d565b60208301519092906001600160401b0381116107b25782610064918301610b1d565b60408201519160608101519360808201519561008260a08401610b8a565b9461008f60c08501610b8a565b9461009c60e08601610b8a565b926101008601516100cc6102206100c56100ba896101208c01610b9e565b986101a08b01610b9e565b9801610b8a565b5f80546001600160a01b0319166001600160a01b038816908117825560405192979092909183907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a360036022555f6025555f6026555f602755833410610ac957505f809381938293608052828215610ac0575bf1156107a7578051906001600160401b0382116107b65760075490600182811c92168015610ab6575b60208310146109d95781601f849311610a68575b50602090601f8311600114610a02575f926109f7575b50508160011b915f199060031b1c1916176007555b8051906001600160401b0382116107b65760085490600182811c921680156109ed575b60208310146109d95781601f849311610980575b50602090601f831160011461091a575f9261090f575b50508160011b915f199060031b1c1916176008555b6012600955670de0b6b3a7640000810290808204670de0b6b3a764000014901517156108fb57600a819055600b55600e80546001600160a01b0319166001600160a01b038781169182179092555f969092918216156108f457505b601d80546001600160a01b0319166001600160a01b0392909216919091179055601f805460ff60a01b19908116600160a01b17909155601c8054909116905560408051919082016001600160401b038111838210176107b657604052308252602082015260205460026020558060021061089e575b5060205f5260205f20905f5b60028110610881575050600e5460405163095ea7b360e01b81525f5160206150845f395f51905f5260048201525f1960248201529150602090829060449082905f906001600160a01b03165af180156107a75761084a575b505f5160206150845f395f51905f5260018060a01b0319600d541617600d55305f52600260205260405f205f5160206150845f395f51905f525f5260205260405f205f19905560405163c45a015560e01b81526020816004815f5160206150845f395f51905f525afa9081156107a7575f9161080c575b50600e546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291602091839160449183915f91165af19081156107a7575f916107ca575b5090606093849260018060a01b03168060018060a01b0319601f541617601f555f52600f60205260405f20600160ff1982541617905560018060a01b031660018060a01b03196005541617600555805160125560208101516013555f60145560408101516015550151601655805160175560208101516018555f6019556040810151601a550151601b55600b54305f52600160205260405f2055600a546040519081525f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203093a3305f9081526002602090815260408083205f5160206150845f395f51905f528452909152908190205f199055600e549051906001600160a01b03166103c98083016001600160401b038111848210176107b65760209284926132be843981520301905ff080156107a75760108054610100600160a81b03191660089290921b610100600160a81b0316919091179055600b54601d54604051916108349004906119fd90818401906001600160a01b03166001600160401b038211858310176107b65760409385936136878539825260208201520301905ff080156107a757601180546001600160a01b0319166001600160a01b03929092169182179055803b156107b2575f809160246040518094819363031e79db60e41b83528060048401525af180156107a757610794575b506011546001600160a01b0316803b1561074d5781809160246040518094819363031e79db60e41b83523060048401525af180156107425790829161077f575b5050601154601f546001600160a01b039182169116813b1561077b57829160248392604051948593849263031e79db60e41b845260048401525af1801561074257908291610766575b50506011546001600160a01b0316803b1561074d5781809160246040518094819363031e79db60e41b835261dead60048401525af1801561074257908291610751575b50506011546001600160a01b0316803b1561074d5781809160246040518094819363031e79db60e41b83525f5160206150845f395f51905f5260048401525af180156107425761072a575b50506028556029556040516126c29081610bfc82396080518161028a0152f35b610735828092610afa565b61073f578061070a565b80fd5b6040513d84823e3d90fd5b5080fd5b8161075b91610afa565b61073f57805f6106bf565b8161077091610afa565b61073f57805f61067c565b8280fd5b8161078991610afa565b61073f57805f610633565b6107a091505f90610afa565b5f5f6105f3565b6040513d5f823e3d90fd5b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b9190506020823d602011610804575b816107e660209383610afa565b810103126107b2576060936107fb8593610b8a565b919250936103fc565b3d91506107d9565b90506020813d602011610842575b8161082760209383610afa565b810103126107b257602061083b5f92610b8a565b91506103b7565b3d915061081a565b6020813d602011610879575b8161086360209383610afa565b810103126107b257518015158114610340575f80fd5b3d9150610856565b81516001600160a01b0316818401556020909101906001016102e8565b60205f526108ee907fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bb017fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bd610be5565b5f6102dc565b9050610267565b634e487b7160e01b5f52601160045260245ffd5b015190505f806101f7565b60085f9081528281209350601f198516905b8181106109685750908460019594939210610950575b505050811b0160085561020c565b01515f1960f88460031b161c191690555f8080610942565b9293602060018192878601518155019501930161092c565b60085f526109c9907ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3601f850160051c810191602086106109cf575b601f0160051c0190610be5565b5f6101e1565b90915081906109bc565b634e487b7160e01b5f52602260045260245ffd5b91607f16916101cd565b015190505f80610195565b60075f9081528281209350601f198516905b818110610a505750908460019594939210610a38575b505050811b016007556101aa565b01515f1960f88460031b161c191690555f8080610a2a565b92936020600181928786015181550195019301610a14565b60075f52610ab0907fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688601f850160051c810191602086106109cf57601f0160051c0190610be5565b5f61017f565b91607f169161016b565b506108fc610142565b62461bcd60e51b815260206004820152600c60248201526b706c6174666f726d2066656560a01b6044820152606490fd5b601f909101601f19168101906001600160401b038211908210176107b657604052565b81601f820112156107b2578051906001600160401b0382116107b65760405192610b51601f8401601f191660200185610afa565b828452602083830101116107b2575f5b828110610b7557505060205f918301015290565b80602080928401015182828701015201610b61565b51906001600160a01b03821682036107b257565b9080601f830112156107b25760405191610bb9608084610afa565b8290608081019283116107b257905b828210610bd55750505090565b8151815260209182019101610bc8565b818110610bf0575050565b5f8155600101610be556fe60806040526004361015610022575b3615610018575f80fd5b6100206110a2565b005b5f3560e01c806301339c2114610e3d57806306fdde0314610d8257806307c3adf014610d65578063095ea7b314610cec578063124626c714610aee5780631249c58b14610adb57806318160ddd14610abe5780631e2ec80314610aa4578063206c17bb14610a7c57806323b872dd146109d1578063255412d9146109b45780632c1f52161461098c578063313ce5671461096f5780633b1cd187146109525780633bfe62ca146109355780633c11100d146108f85780634188bf5a146108d0578063553193ca146108b35780635b845af2146108965780636b6113681461087957806370a0823114610841578063715018a6146107f55780638322fff2146107cd5780638718b24f146107a15780638da5cb5b1461077a5780638fae76a11461075d578063948df7141461073b578063957755cb146106fe57806395d89b41146105fa5780639a5d1f8f146105dd5780639cc0e3c7146105815780639e10086b14610564578063a9059cbb14610533578063acb2ad6f14610516578063adc7955d146104f9578063af9e4fe1146104dc578063b9fbc49d146104bf578063bd802df8146104a2578063bd8cc6d514610485578063be4fe9a514610468578063bfc3137e1461044b578063c92d567e14610426578063ce0192f914610409578063dd62ed3e146103b9578063e32759cf1461039c578063e5a6b10f14610374578063e82bef291461034c578063f2fde38b146102b9578063f6e43c12146102755763fa3c49470361000e5734610271575f36600319011261027157602060ff60245460081c166040519015158152f35b5f80fd5b34610271575f366003190112610271576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b34610271576020366003190112610271576102d2610efe565b5f546001600160a01b038116916102ea338414610f2a565b6001600160a01b031691821561031c5782905f51602061264d5f395f51905f525f80a36001600160a01b031916175f55005b60405162461bcd60e51b815260206004820152600860248201526706e657720697320360c41b6044820152606490fd5b34610271575f366003190112610271576005546040516001600160a01b039091168152602090f35b34610271575f36600319011261027157600e546040516001600160a01b039091168152602090f35b34610271575f366003190112610271576020602254604051908152f35b34610271576040366003190112610271576103d2610efe565b6103da610f14565b6001600160a01b039182165f908152600260209081526040808320949093168252928352819020549051908152f35b34610271575f366003190112610271576020601254604051908152f35b34610271575f36600319011261027157602060ff601f5460a01c166040519015158152f35b34610271575f366003190112610271576020602754604051908152f35b34610271575f366003190112610271576020601954604051908152f35b34610271575f366003190112610271576020600c54604051908152f35b34610271575f366003190112610271576020601a54604051908152f35b34610271575f366003190112610271576020601354604051908152f35b34610271575f366003190112610271576020602a54604051908152f35b34610271575f366003190112610271576020601854604051908152f35b34610271575f366003190112610271576020602554604051908152f35b346102715760403660031901126102715761055961054f610efe565b602435903361150a565b602060405160018152f35b34610271575f366003190112610271576020602854604051908152f35b34610271576020366003190112610271576004356020548110156102715760205f8190527fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bb909101546040516001600160a01b03919091168152f35b34610271575f366003190112610271576020602954604051908152f35b34610271575f366003190112610271576040515f6008548060011c906001811680156106f4575b6020831081146106e0578285529081156106bc575060011461065e575b61065a8361064e81850382610f5f565b60405191829182610eb7565b0390f35b91905060085f527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3915f905b8082106106a25750909150810160200161064e61063e565b91926001816020925483858801015201910190929161068a565b60ff191660208086019190915291151560051b8401909101915061064e905061063e565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610621565b34610271576020366003190112610271576001600160a01b0361071f610efe565b165f52602b602052602060ff60405f2054166040519015158152f35b34610271575f36600319011261027157602060ff602454166040519015158152f35b34610271575f366003190112610271576020602354604051908152f35b34610271575f366003190112610271575f546040516001600160a01b039091168152602090f35b34610271575f3660031901126102715760105460405160089190911c6001600160a01b03168152602090f35b34610271575f36600319011261027157601d546040516001600160a01b039091168152602090f35b34610271575f366003190112610271575f5461dead90816001600160a01b038216610821338214610f2a565b5f51602061264d5f395f51905f525f80a36001600160a01b031916175f55005b34610271576020366003190112610271576001600160a01b03610862610efe565b165f526001602052602060405f2054604051908152f35b34610271575f366003190112610271576020601b54604051908152f35b34610271575f366003190112610271576020601554604051908152f35b34610271575f366003190112610271576020601e54604051908152f35b34610271575f36600319011261027157601f546040516001600160a01b039091168152602090f35b34610271576020366003190112610271576001600160a01b03610919610efe565b165f52600f602052602060ff60405f2054166040519015158152f35b34610271575f366003190112610271576020601754604051908152f35b34610271575f366003190112610271576020602654604051908152f35b34610271575f366003190112610271576020600954604051908152f35b34610271575f366003190112610271576011546040516001600160a01b039091168152602090f35b34610271575f366003190112610271576020601654604051908152f35b34610271576060366003190112610271576109ea610efe565b6109f2610f14565b90610a0160443580938361150a565b6001600160a01b03165f818152600260209081526040808320338452909152902054909190600101610a3857602060405160018152f35b5f828152600260209081526040808320338452909152902054610a5b91906112b9565b5f918252600260209081526040808420338552909152909120558080610559565b34610271575f36600319011261027157600d546040516001600160a01b039091168152602090f35b34610271575f3660031901126102715760206040515f8152f35b34610271575f366003190112610271576020600a54604051908152f35b5f366003190112610271576100206110a2565b3461027157602036600319011261027157610b07610efe565b610b1b60018060a01b035f54163314610f2a565b610b2a60ff6010541615610f95565b601e54610cb557602a549060285491610b50610b496029548095610fcb565b8210610ff2565b60018060a01b03821690815f52602b602052610b7360ff60405f2054161561102a565b610b7e84151561105f565b600e546040516370a0823160e01b815230600482015290602090829060249082906001600160a01b03165afa8015610caa5785915f91610c75575b5010610c3a57610bed93610bcc91611095565b602a555f52602b60205260405f20600160ff198254161790556029546113ac565b602a54610bff60285460295490610fcb565b1115610c0757005b43601e5561dead5f548160018060a01b0382165f51602061264d5f395f51905f525f80a36001600160a01b031916175f55005b60405162461bcd60e51b81526020600482015260136024820152726e6f7420656e6f7567682063757272656e637960681b6044820152606490fd5b9150506020813d602011610ca2575b81610c9160209383610f5f565b810103126102715784905186610bb9565b3d9150610c84565b6040513d5f823e3d90fd5b60405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e481cdd185c9d1959608a1b6044820152606490fd5b3461027157604036600319011261027157610d05610efe565b335f8181526002602090815260408083206001600160a01b03909516808452948252918290206024359081905591519182527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a3602060405160018152f35b34610271575f366003190112610271576020601454604051908152f35b34610271575f366003190112610271576040515f6007548060011c90600181168015610e33575b6020831081146106e0578285529081156106bc5750600114610dd55761065a8361064e81850382610f5f565b91905060075f527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688915f905b808210610e195750909150810160200161064e61063e565b919260018160209254838588010152019101909291610e01565b91607f1691610da9565b34610271575f36600319011261027157610e6160018060a01b035f54163314610f2a565b601e54610e835743601e55305f52600160205261002060405f2054333061132f565b60405162461bcd60e51b815260206004820152600c60248201526b30b63932b0b23c9037b832b760a11b6044820152606490fd5b9190916020815282518060208301525f5b818110610ee8575060409293505f838284010152601f8019910116010190565b8060208092870101516040828601015201610ec8565b600435906001600160a01b038216820361027157565b602435906001600160a01b038216820361027157565b15610f3157565b60405162461bcd60e51b815260206004820152600660248201526510b7bbb732b960d11b6044820152606490fd5b90601f8019910116810190811067ffffffffffffffff821117610f8157604052565b634e487b7160e01b5f52604160045260245ffd5b15610f9c57565b60405162461bcd60e51b81526020600482015260076024820152660696e20737761760cc1b6044820152606490fd5b81810292918115918404141715610fde57565b634e487b7160e01b5f52601160045260245ffd5b15610ff957565b60405162461bcd60e51b815260206004820152600960248201526836b4b73a1037bb32b960b91b6044820152606490fd5b1561103157565b60405162461bcd60e51b81526020600482015260066024820152651b5a5b9d195960d21b6044820152606490fd5b1561106657565b60405162461bcd60e51b81526020600482015260076024820152661b9bdd081cd95d60ca1b6044820152606490fd5b91908201809211610fde57565b6010546110b360ff5f921615610f95565b6110bf601e5415610ff2565b6029546110cd81151561105f565b6110e5602a546110df83602854610fcb565b11610ff2565b335f52602b6020526110fe60ff60405f2054161561102a565b80341061128157600e546001600160a01b0316803b15610271575f90600460405180948193630d0e30db60e41b83525af18015610caa5761126e575b5061115760295461114d81602a54611095565b602a5533906113ac565b338152602b60205260408120600160ff19825416179055806029548034116111cc575b5050602a5461118e60285460295490610fcb565b11156111975750565b43601e55805461dead90816001600160a01b0382165f51602061264d5f395f51905f528580a36001600160a01b031916179055565b81806111d98193346112b9565b335af13d15611269573d67ffffffffffffffff8111611255576040519061120a601f8201601f191660200183610f5f565b81528260203d92013e5b1561122057805f61117a565b60405162461bcd60e51b815260206004820152600d60248201526c1c99599d5b990819985a5b1959609a1b6044820152606490fd5b634e487b7160e01b83526041600452602483fd5b611214565b61127a91505f90610f5f565b5f5f61113a565b60405162461bcd60e51b815260206004820152601060248201526f0d2dce6eaccccd2c6d2cadce8408aa8960831b6044820152606490fd5b91908203918211610fde57565b6001600160a01b03165f81815260016020526040902080549192915f19810191908211610fde575560018060a01b031690815f52600160205260405f2080549060018201809211610fde57555f51602061266d5f395f51905f52602060405160018152a3600190565b60205f51602061266d5f395f51905f529160018060a01b031692835f526001825260405f2061135f8682546112b9565b905560018060a01b031693845f526001825260405f20611380828254611095565b9055604051908152a3600190565b8115611398570490565b634e487b7160e01b5f52601260045260245ffd5b6114239060606113c4600a546028549060011c61138e565b91600160ff196010541617601055600160ff19602154161760215560018060a01b03600d541660018060a01b03600e5416915f60018060a01b0360055416916040519788958694859362e8e33760e81b85528a42933060048801611d7c565b03925af1918215610caa57611453926114c0575b5060ff196021541660215560ff1960105416601055823061132f565b506011546001600160a01b039182165f818152600160205260409020549290911691823b15610271576040516338c110ef60e21b81526001600160a01b039290921660048301526024820152905f908290604490829084905af16114b45750565b5f6114be91610f5f565b565b6114e19060603d6060116114e8575b6114d98183610f5f565b8101906114ef565b5050611437565b503d6114cf565b90816060910312610271578051916040602083015192015190565b91905f9260018060a01b03811691825f5260016020528360405f205410611d445760ff60215416611d3557601e5415611d03576001600160a01b0381165f818152600f60205260408120549195909182908190819060ff1615611be05750601f54604051630240bc6b60e21b81526001600160a01b0390911690606081600481855afa908115610caa575f905f92611ba0575b50600e546001600160a01b0316916020916001600160701b039130851015611b97575016925b6024604051809481936370a0823160e01b835260048301525afa908115610caa575f91611b65575b501160ff196024541660ff8216176024555b602254151580611b5a575b611ad3575b875f52600f60205260ff60405f2054168015611abd575b611954575b505085885260016020526116418260408a20546112b9565b868952600160205260408920558792611820575b5061166b939291611665916112b9565b916125fd565b60018060a01b03601154168184526001602052604084205491813b1561181c576040516338c110ef60e21b81526001600160a01b039190911660048201526024810192909252839081908390604490829084905af1611801575b505060018060a01b03601154168183526001602052604083205491813b156117fd576040516338c110ef60e21b81526001600160a01b039190911660048201526024810192909252829081908390604490829084905af16117e3575b505060ff60105416156117315750565b6011546040516001624d3b8760e01b03198152620493e0600482015291906060908390602490829085906001600160a01b03165af19081819382936117be575b5061177b57505050565b60405192835260208301526040820152620493e0606082015260017fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a9860803293a3565b915092506117db915060603d6060116114e8576114d98183610f5f565b91925f611771565b6117ec91610f5f565b805f126117fa575f81611721565b80fd5b8380fd5b61180a91610f5f565b815f12611818575f826116c5565b5080fd5b8480fd5b8015611926578761184e61184561183c60175460195490611095565b60185490611095565b601a5490611095565b905b611912579161166b9594939161271061186c6116659584610fcb565b04806118ff575b506118ea5761271061188760165483610fcb565b045b878161189c575b50509150919293611655565b5f51602061266d5f395f51905f5260206118ba8461dead9597611095565b95845f52600182526118d08160405f2054611095565b855f526001835260405f2055604051908152a35f87611890565b6127106118f9601b5483610fcb565b04611889565b925061190c8330886125fd565b5f611873565b634e487b7160e01b89526011600452602489fd5b8761194e61194561193c60125460135490611095565b60145490611095565b60155490611095565b90611850565b60ff601f5460a01c16611a87575b885f52600f60205260ff60405f2054166119bb575b1590816119b2575b506119a9575b868852600f60205260ff6040892054166119a1575b5f80611629565b50600161199a565b60019250611985565b9050155f61197f565b60105460ff81161580611a7f575b6119d4575b50611977565b305f5260016020526119ed60405f2054602254906112b9565b806119f9575b506119ce565b611a65919b50611a3b61183c611845611a32611a29611a2061194560125460145490611095565b60135490611095565b60175490611095565b60195490611095565b905f9c611388611a4b848a610fcb565b0491808311611a76575b5060ff1916600117601055611e27565b60ff19601054166010555f806119f3565b91506001611a55565b5081156119c9565b601e546119625760405162461bcd60e51b815260206004820152600760248201526670617573696e6760c81b6044820152606490fd5b50885f52600f60205260ff60405f205416611624565b909895979492999693915f5b602254811015611b2e57600190611b278d604051906020820190848252604083015242606083015260608252611b16608083610f5f565b848060a01b0391519020168c6112c6565b5001611adf565b50919396999890929497959860225480800460011481151715610fde57611b54916112b9565b9261160d565b50601e541515611608565b90506020813d602011611b8f575b81611b8060209383610f5f565b8101031261027157515f6115eb565b3d9150611b73565b905016926115c3565b6001600160701b03925060209150611bcf9060603d606011611bd9575b611bc78183610f5f565b810190611dd9565b509290915061159d565b503d611bbd565b875f52600f60205260ff60405f205416156115fd57601f54604051630240bc6b60e21b81529192506001600160a01b0316606082600481845afa918215610caa575f905f93611cd3575b50600e546001600160a01b0316926020916001600160701b039130861015611cca575016915b6024604051809581936370a0823160e01b835260048301525afa918215610caa575f92611c96575b5010159060245461ff008360081b169061ff001916176024556115fd565b9091506020813d602011611cc2575b81611cb260209383610f5f565b810103126102715751905f611c78565b3d9150611ca5565b90501691611c50565b6001600160701b03935060209150611cf99060603d606011611bd957611bc78183610f5f565b5093909150611c2a565b60405162461bcd60e51b815260206004820152600a60248201526906e6f7420616464206c760b41b6044820152606490fd5b9150611d41935061132f565b50565b60405162461bcd60e51b815260206004820152601060248201526f0c4c2d8c2dcc6ca9cdee88adcdeeaced60831b6044820152606490fd5b6001600160a01b0391821681529181166020830152604082019290925260608101929092525f6080830181905260a083015290911660c082015260e08101919091526101000190565b51906001600160701b038216820361027157565b9081606091031261027157611ded81611dc5565b916040611dfc60208401611dc5565b92015163ffffffff811681036102715790565b90816020910312610271575180151581036102715790565b5f929181156125f75780156125f757611e4e611e4860185460135490611095565b83610fcb565b8160011b90828204600203610fde57611e7191611e6a9161138e565b80936112b9565b9081611e7f575b5050509050565b600d5460105460081c6001600160a01b03908116969116803b156102715760405190635c11d79560e01b825260a48201978560048401525f602484015260a0604484015260205480995260c483019860205f5260205f20905f5b8181106125d8575050505f918383818c819560249c9d9e50606483015242608483015203925af190816125c3575b506125be577f6c37756e80daba6f4df0d5bfa6cddadfe23601acc1a27dc8d4aa427de91467886020604051838152a15b60018060a01b03600e5416602060018060a01b0360105460081c1691604051968780926370a0823160e01b82528560048301525afa9485156120ce57829561258a575b508415908115612532575b506001171561251e5750611fb18491611fac611fa660125460175490611095565b86610fcb565b61138e565b806124a4575b50611fac90611fc593610fcb565b9081612434575b5050600e546040516370a0823160e01b8152306004820152906001600160a01b0316602082602481845afa908115610caa575f925f92612400575b5081612015575b8392611e78565b601d546001600160a01b0316818103612115575050601d5460115460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905291602091839160449183918891165af1801561210a576120dd575b506011546001600160a01b031690813b156120d95782916024839260405194859384926351c2a0e360e01b845260048401525af180156120ce576120b9575b50505b5f808061200e565b6120c4828092610f5f565b6117fa57806120ae565b6040513d84823e3d90fd5b8280fd5b6120fe9060203d602011612103575b6120f68183610f5f565b810190611e0f565b61206f565b503d6120ec565b6040513d85823e3d90fd5b6011546040516370a0823160e01b81526001600160a01b039091166004820152929091602084602481865afa938415610caa575f946123cc575b506040519261215f606085610f5f565b60028452602084019160403684378451156123b8578083528451600110156123b857604085810192909252600d54915163095ea7b360e01b81526001600160a01b03909216600483015260248201849052602090829060449082905f905af18015610caa5761239b575b50600d546011546001600160a01b0391821693911690833b1561027157939190604051948593635c11d79560e01b855260a485019160048601525f602486015260a060448601525180915260c4840192905f5b818110612379575050505f838195938193606483015242608483015203925af19081612364575b5061235f577f6c37756e80daba6f4df0d5bfa6cddadfe23601acc1a27dc8d4aa427de91467886020604051848152a15b601d546011546040516370a0823160e01b81526001600160a01b0391821660048201819052939092909160209184916024918391165afa918215612354578492612320575b508082116122ca575b505050506120b1565b6122d3916112b9565b813b156120d95782916024839260405194859384926351c2a0e360e01b845260048401525af180156120ce5761230b575b80806122c1565b612316828092610f5f565b6117fa5780612304565b9091506020813d60201161234c575b8161233c60209383610f5f565b810103126102715751905f6122b8565b3d915061232f565b6040513d86823e3d90fd5b612273565b6123719193505f90610f5f565b5f915f612243565b82516001600160a01b031685528795506020948501949092019160010161221c565b6123b39060203d602011612103576120f68183610f5f565b6121c9565b634e487b7160e01b5f52603260045260245ffd5b9093506020813d6020116123f8575b816123e860209383610f5f565b810103126102715751925f61214f565b3d91506123db565b9091506020813d60201161242c575b8161241c60209383610f5f565b810103126102715751905f612007565b3d915061240f565b600d54600e5460055460405162e8e33760e81b81529460609486946001600160a01b039081169486945f94869461247694429493811693163060048801611d7c565b03925af1612485575b80611fcc565b61249d9060603d6060116114e8576114d98183610f5f565b505061247f565b600e5460055460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810193909352919250602091839160449183915f91165af18015610caa57611fc593611fac9286926124ff575b50935090611fb7565b6125179060203d602011612103576120f68183610f5f565b505f6124f6565b634e487b7160e01b81526011600452602490fd5b803b156120d957604051635569f64b60e11b8152306004820152602481018790529083908290604490829084905af1801561210a57908391612575575b50611f85565b8161257f91610f5f565b61181857815f61256f565b9094506020813d6020116125b6575b816125a660209383610f5f565b810103126102715751935f611f7a565b3d9150612599565b611f37565b6125d09192505f90610f5f565b5f905f611f07565b82546001600160a01b03168c526020909b019a60019283019201611ed9565b50509050565b919060205f51602061266d5f395f51905f529160018060a01b031693845f526001825261262e8460405f2054611095565b855f526001835260405f205560405193845260018060a01b031692a356fe8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220155ebaa9806af61bf8f652d2e744f1f710bcab8f2c608f6c01226cfe329ddb4f64736f6c634300081c003360803460a957601f6103c938819003918201601f19168301916001600160401b0383118484101760ad5780849260209460405283398101031260a957516001600160a01b0381169081900360a9575f80546001600160a01b03191633908117825560405192917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600180546001600160a01b03191691909117905561030790816100c28239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c8063715018a6146102275780638da5cb5b14610200578063aad3ec9614610127578063ecd0c0c3146100ff5763f2fde38b0361000e57346100fb5760203660031901126100fb5761006e610286565b5f546001600160a01b0381169161008633841461029c565b6001600160a01b03169182156100cb5782907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a36001600160a01b031916175f55005b60405162461bcd60e51b815260206004820152600860248201526706e657720697320360c41b6044820152606490fd5b5f80fd5b346100fb575f3660031901126100fb576001546040516001600160a01b039091168152602090f35b346100fb5760403660031901126100fb575f6020610143610286565b61015760018060a01b03845416331461029c565b60015460405163a9059cbb60e01b81526001600160a01b0392831660048201526024803590820152938492604492849291165af180156101f55761019757005b60203d6020116101ee575b601f8101601f1916820167ffffffffffffffff8111838210176101da576020918391604052810103126100fb5751801515036100fb57005b634e487b7160e01b5f52604160045260245ffd5b503d6101a2565b6040513d5f823e3d90fd5b346100fb575f3660031901126100fb575f546040516001600160a01b039091168152602090f35b346100fb575f3660031901126100fb575f5461dead90816001600160a01b03821661025333821461029c565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a36001600160a01b031916175f55005b600435906001600160a01b03821682036100fb57565b156102a357565b60405162461bcd60e51b815260206004820152600660248201526510b7bbb732b960d11b6044820152606490fdfea26469706673582212208aad48ef4b4e65a0e6240f85f22645896064b179d3f44f2c8acbedd76393446c64736f6c634300081c00336080604052346103ba576119fd6040813803918261001c816103be565b9384928339810103126103ba5780516020909101516001600160a01b03811691908290036103ba5761004e60406103be565b91601783527f4554484261636b5f4469766964656e5f547261636b6572000000000000000000602084015261008360406103be565b601881527f4554484261636b5f4469766964656e645f547261636b65720000000000000000602082015283519092906001600160401b0381116102cb57600354600181811c911680156103b0575b60208210146102ad57601f811161034d575b50602094601f82116001146102ea579481929394955f926102df575b50508160011b915f199060031b1c1916176003555b82516001600160401b0381116102cb57600454600181811c911680156102c1575b60208210146102ad57601f811161024a575b506020601f82116001146101e757819293945f926101dc575b50508160011b915f199060031b1c1916176004555b600580546001600160a01b0319163390811790915560405192905f7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a3600680546001600160a01b031916919091179055603c60125560135561161990816103e48239f35b015190505f80610160565b601f1982169060045f52805f20915f5b8181106102325750958360019596971061021a575b505050811b01600455610175565b01515f1960f88460031b161c191690555f808061020c565b9192602060018192868b0151815501940192016101f7565b60045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f830160051c810191602084106102a3575b601f0160051c01905b8181106102985750610147565b5f815560010161028b565b9091508190610282565b634e487b7160e01b5f52602260045260245ffd5b90607f1690610135565b634e487b7160e01b5f52604160045260245ffd5b015190505f806100ff565b601f1982169560035f52805f20915f5b8881106103355750836001959697981061031d575b505050811b01600355610114565b01515f1960f88460031b161c191690555f808061030f565b919260206001819286850151815501940192016102fa565b60035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b601f830160051c810191602084106103a6575b601f0160051c01905b81811061039b57506100e3565b5f815560010161038e565b9091508190610385565b90607f16906100d1565b5f80fd5b6040519190601f01601f191682016001600160401b038111838210176102cb5760405256fe608080604052600436101561001c575b50361561001a575f80fd5b005b5f3560e01c90816306fdde031461096c57508063095ea7b3146108f357806318160ddd146108d6578063226cfa3d1461089e57806323b872dd1461087c57806327ce0147146108595780633009a6091461083c578063313ce5671461082157806331e79db0146107825780634e7b827f1461074557806351c2a0e3146106ad5780636a4740021461063b5780636f2789ec1461061e57806370a08231146105e7578063715018a6146105865780638322fff21461055e57806385a6b3ae146105415780638da5cb5b1461051957806391b89fba146103ea57806395d89b4114610415578063a8b9d240146103ea578063a9059cbb14610374578063aafd847a1461033c578063bc4c4b37146102eb578063be10b614146102ce578063dd62ed3e1461027e578063e30443bc14610244578063f2fde38b1461019c5763ffb2c47914610167575f61000f565b34610198576020366003190112610198576060610185600435611043565b9060405192835260208301526040820152f35b5f80fd5b34610198576020366003190112610198576101b5610a6b565b6005546001600160a01b038116916101ce338414610b37565b6001600160a01b03169182156102145782907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a36001600160a01b03191617600555005b60405162461bcd60e51b815260206004820152600860248201526706e657720697320360c41b6044820152606490fd5b346101985760403660031901126101985761001a610260610a6b565b61027560018060a01b03600554163314610b37565b60243590610c8a565b3461019857604036600319011261019857610297610a6b565b61029f610a81565b6001600160a01b039182165f908152600160209081526040808320949093168252928352819020549051908152f35b34610198575f366003190112610198576020601354604051908152f35b3461019857604036600319011261019857610304610a6b565b602435908115158203610198576020916103329161032d60018060a01b03600554163314610b37565b610c2a565b6040519015158152f35b34610198576020366003190112610198576001600160a01b0361035d610a6b565b165f526009602052602060405f2054604051908152f35b346101985760403660031901126101985761038d610a6b565b5060405162461bcd60e51b815260206004820152602e60248201527f4554484261636b5f4469766964656e645f547261636b65723a204e6f2074726160448201526d1b9cd9995c9cc8185b1b1bddd95960921b6064820152608490fd5b3461019857602036600319011261019857602061040d610408610a6b565b610b6c565b604051908152f35b34610198575f366003190112610198576040515f6004548060011c9060018116801561050f575b6020831081146104fb578285529081156104d75750600114610479575b6104758361046981850382610a97565b60405191829182610a24565b0390f35b91905060045f527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b915f905b8082106104bd57509091508101602001610469610459565b9192600181602092548385880101520191019092916104a5565b60ff191660208086019190915291151560051b840190910191506104699050610459565b634e487b7160e01b5f52602260045260245ffd5b91607f169161043c565b34610198575f366003190112610198576005546040516001600160a01b039091168152602090f35b34610198575f366003190112610198576020600a54604051908152f35b34610198575f366003190112610198576006546040516001600160a01b039091168152602090f35b34610198575f3660031901126101985760055461dead90816001600160a01b0382166105b3338214610b37565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a36001600160a01b03191617600555005b34610198576020366003190112610198576001600160a01b03610608610a6b565b165f525f602052602060405f2054604051908152f35b34610198575f366003190112610198576020601254604051908152f35b34610198575f3660031901126101985760405162461bcd60e51b815260206004820152603460248201527f4554484261636b5f4469766964656e645f547261636b65723a2077697468647260448201527330bba234bb34b232b732103234b9b0b13632b21760611b6064820152608490fd5b34610198576020366003190112610198576004356106d660018060a01b03600554163314610b37565b60025490811561019857806106e757005b61070961074092610703600754916106fe85611189565b610acd565b90611448565b6007556040518181527fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d7845411651160203392a2600a54611448565b600a55005b34610198576020366003190112610198576001600160a01b03610766610a6b565b165f526010602052602060ff60405f2054166040519015158152f35b346101985760203660031901126101985761079b610a6b565b6107b060018060a01b03600554163314610b37565b6001600160a01b0381165f8181526010602052604090205490919060ff16610198576107fb90825f52601060205260405f20600160ff198254161790556107f68161128b565b611367565b7fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b255f80a2005b34610198575f36600319011261019857602060405160128152f35b34610198575f366003190112610198576020600f54604051908152f35b3461019857602036600319011261019857602061040d610877610a6b565b610aeb565b3461019857606036600319011261019857610895610a6b565b5061038d610a81565b34610198576020366003190112610198576001600160a01b036108bf610a6b565b165f526011602052602060405f2054604051908152f35b34610198575f366003190112610198576020600254604051908152f35b346101985760403660031901126101985761090c610a6b565b335f8181526001602090815260408083206001600160a01b03909516808452948252918290206024359081905591519182527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a3602060405160018152f35b34610198575f366003190112610198575f6003548060011c90600181168015610a1a575b6020831081146104fb578285529081156104d757506001146109bc576104758361046981850382610a97565b91905060035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b915f905b808210610a0057509091508101602001610469610459565b9192600181602092548385880101520191019092916109e8565b91607f1691610990565b9190916020815282518060208301525f5b818110610a55575060409293505f838284010152601f8019910116010190565b8060208092870101516040828601015201610a35565b600435906001600160a01b038216820361019857565b602435906001600160a01b038216820361019857565b90601f8019910116810190811067ffffffffffffffff821117610ab957604052565b634e487b7160e01b5f52604160045260245ffd5b8115610ad7570490565b634e487b7160e01b5f52601260045260245ffd5b610b0d6007549160018060a01b031691825f525f60205260405f20549061120e565b5f811261019857610b2a915f52600860205260405f205490611232565b5f81126101985760801c90565b15610b3e57565b60405162461bcd60e51b815260206004820152600660248201526510b7bbb732b960d11b6044820152606490fd5b610bcc90610b7981610aeb565b9060018060a01b03165f52600960205260405f205460405191610b9d604084610a97565b601e83527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006020840152611154565b90565b610bd8816114a1565b80610be35750505f90565b7fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf0926020600193848060a01b031692835f52601182524260405f2055604051908152a3600190565b90610c34826114a1565b9182610c41575050505f90565b60207fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf0929160018060a01b031692835f52601182524260405f2055604051948552151593a3600190565b6001600160a01b0381165f8181526010602052604090205490929060ff16610fef576013548110610fde57825f525f60205260405f20548082115f14610ed657610d0d9060405190610cdd604083610a97565b601e82527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000602083015283611154565b610d1981600254611448565b600255835f525f602052610d318160405f2054611448565b845f525f60205260405f2055835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020604051858152a3835f526008602052610d8260405f20549160075461120e565b5f811290811591610198578203918213808216610ec25781610eb9575b508015610eb2575b1561019857835f52600860205260405f20555b6001600160a01b0383165f908152600e602052604090205460ff1615610e1657610df7610e139360018060a01b03165f52600c60205260405f2090565b555b610e0e60018060a01b03600554163314610b37565b610bcf565b50565b6001600160a01b0383165f908152600e60205260409020805460ff191660011790556001600160a01b0383165f908152600c6020526040902055600b54825f52600d6020528060405f205568010000000000000000811015610ab957610e1392610e89826001610ead9401600b55611002565b81546001600160a01b0393841660039290921b91821b9390911b1916919091179055565b610df9565b505f610da7565b9050155f610d9f565b634e487b7160e01b5f52601160045260245ffd5b808210610ee4575b50610dba565b610ef8908260405191610b9d604084610a97565b835f525f602052610f5160405f20548260405191610f17606084610a97565b602283527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e602084015261636560f01b6040840152611154565b845f525f60205260405f2055610f736002548260405191610b9d604084610a97565b6002555f847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020604051858152a3835f526008602052610fbb60405f20549160075461120e565b5f811261019857610fcb91611232565b835f52600860205260405f20555f610ede565b50610ead826107f6610e139461128b565b505050565b5f198114610ec25760010190565b600b5481101561101a57600b5f5260205f2001905f90565b634e487b7160e01b5f52603260045260245ffd5b805482101561101a575f5260205f2001905f90565b90600b549081156111485791600f54925f925a915f915f965b8587108061113f575b1561112f5761107390610ff4565b92600b54841015611127575b61108884611002565b60018060a01b0391549060031b1c16805f5260116020526110ac60405f2054611591565b6110ee575b506110bb90610ff4565b935a908181116110ce575b50939261105c565b966107036110e792988960405191610b9d604084610a97565b955f6110c6565b61110790610e0e60018060a01b03600554163314610b37565b611112575b5f6110b1565b9661111f6110bb91610ff4565b97905061110c565b5f935061107f565b9550509250905082600f55929190565b50818410611065565b600f545f935083925090565b9182821161116957508103908111610ec25790565b60405162461bcd60e51b81529081906111859060048301610a24565b0390fd5b801561120957608081901b90808204600160801b03610ec257600160801b906111b29083610acd565b036111ba5790565b60405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608490fd5b505f90565b90811561122c57808202918083048203610ec2576111b29083610acd565b50505f90565b818101918083125f8312908015821691151617610ec2575f1380159182611280575b8215611265575b5050156101985790565b90915081611276575b505f8061125b565b905081125f61126e565b808412159250611254565b6001600160a01b03165f81815260208190526040902054806112ab575050565b6112bf905f60405191610b9d604084610a97565b815f525f6020526112de60405f20548260405191610f17606084610a97565b825f525f60205260405f20556113006002548260405191610b9d604084610a97565b6002555f827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020604051858152a3815f52600860205261134860405f20549160075461120e565b5f81126101985761135891611232565b905f52600860205260405f2055565b6001600160a01b03165f818152600e602052604090205460ff1615610e13575f818152600e60209081526040808320805460ff19169055600c8252808320839055600d909152902054600b549091905f198101908111610ec257611405926113d3610e8992600b61102e565b60018060a01b0391549060031b1c1692835f52600d6020528160405f20555f52600d6020525f6040812055600b61102e565b600b548015611434575f190161141c81600b61102e565b81549060018060a01b039060031b1b19169055600b55565b634e487b7160e01b5f52603160045260245ffd5b90810190818111610ec257811061145c5790565b60405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606490fd5b6001600160a01b03166114b381610b6c565b90816114bf5750505f90565b6020815f928352600982526114d8846040852054611448565b818452600983526040842055807fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d83604051878152a260065460405163a9059cbb60e01b81526004810192909252602482018590529092839160449183916001600160a01b03165af180156115865761154f575090565b6020813d60201161157e575b8161156860209383610a97565b8101031261019857518015158103610198575090565b3d915061155b565b6040513d5f823e3d90fd5b428111611209576115db90604051906115ab604083610a97565b601e82527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000602083015242611154565b60125411159056fea26469706673582212206ff9c9a41cec6690383639ef002d6c323b77a6449fa938ed64f20c29fdcf337564736f6c634300081c003300000000000000000000000089e5db8b5aa49aa85ac63f691524311aeb649eba0000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000022b8000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000038d7ea4c680000000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73000000000000000000000000e5cf66f53bade37bd3828c177482d7978a4697eb000000000000000000000000e5cf66f53bade37bd3828c177482d7978a4697eb000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012526f62696e686f6f64e58f91e5b084e58fb0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064755555559590000000000000000000000000000000000000000000000000000
0x60806040526004361015610022575b3615610018575f80fd5b6100206110a2565b005b5f3560e01c806301339c2114610e3d57806306fdde0314610d8257806307c3adf014610d65578063095ea7b314610cec578063124626c714610aee5780631249c58b14610adb57806318160ddd14610abe5780631e2ec80314610aa4578063206c17bb14610a7c57806323b872dd146109d1578063255412d9146109b45780632c1f52161461098c578063313ce5671461096f5780633b1cd187146109525780633bfe62ca146109355780633c11100d146108f85780634188bf5a146108d0578063553193ca146108b35780635b845af2146108965780636b6113681461087957806370a0823114610841578063715018a6146107f55780638322fff2146107cd5780638718b24f146107a15780638da5cb5b1461077a5780638fae76a11461075d578063948df7141461073b578063957755cb146106fe57806395d89b41146105fa5780639a5d1f8f146105dd5780639cc0e3c7146105815780639e10086b14610564578063a9059cbb14610533578063acb2ad6f14610516578063adc7955d146104f9578063af9e4fe1146104dc578063b9fbc49d146104bf578063bd802df8146104a2578063bd8cc6d514610485578063be4fe9a514610468578063bfc3137e1461044b578063c92d567e14610426578063ce0192f914610409578063dd62ed3e146103b9578063e32759cf1461039c578063e5a6b10f14610374578063e82bef291461034c578063f2fde38b146102b9578063f6e43c12146102755763fa3c49470361000e5734610271575f36600319011261027157602060ff60245460081c166040519015158152f35b5f80fd5b34610271575f366003190112610271576040517f000000000000000000000000e5cf66f53bade37bd3828c177482d7978a4697eb6001600160a01b03168152602090f35b34610271576020366003190112610271576102d2610efe565b5f546001600160a01b038116916102ea338414610f2a565b6001600160a01b031691821561031c5782905f51602061264d5f395f51905f525f80a36001600160a01b031916175f55005b60405162461bcd60e51b815260206004820152600860248201526706e657720697320360c41b6044820152606490fd5b34610271575f366003190112610271576005546040516001600160a01b039091168152602090f35b34610271575f36600319011261027157600e546040516001600160a01b039091168152602090f35b34610271575f366003190112610271576020602254604051908152f35b34610271576040366003190112610271576103d2610efe565b6103da610f14565b6001600160a01b039182165f908152600260209081526040808320949093168252928352819020549051908152f35b34610271575f366003190112610271576020601254604051908152f35b34610271575f36600319011261027157602060ff601f5460a01c166040519015158152f35b34610271575f366003190112610271576020602754604051908152f35b34610271575f366003190112610271576020601954604051908152f35b34610271575f366003190112610271576020600c54604051908152f35b34610271575f366003190112610271576020601a54604051908152f35b34610271575f366003190112610271576020601354604051908152f35b34610271575f366003190112610271576020602a54604051908152f35b34610271575f366003190112610271576020601854604051908152f35b34610271575f366003190112610271576020602554604051908152f35b346102715760403660031901126102715761055961054f610efe565b602435903361150a565b602060405160018152f35b34610271575f366003190112610271576020602854604051908152f35b34610271576020366003190112610271576004356020548110156102715760205f8190527fc97bfaf2f8ee708c303a06d134f5ecd8389ae0432af62dc132a24118292866bb909101546040516001600160a01b03919091168152f35b34610271575f366003190112610271576020602954604051908152f35b34610271575f366003190112610271576040515f6008548060011c906001811680156106f4575b6020831081146106e0578285529081156106bc575060011461065e575b61065a8361064e81850382610f5f565b60405191829182610eb7565b0390f35b91905060085f527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3915f905b8082106106a25750909150810160200161064e61063e565b91926001816020925483858801015201910190929161068a565b60ff191660208086019190915291151560051b8401909101915061064e905061063e565b634e487b7160e01b5f52602260045260245ffd5b91607f1691610621565b34610271576020366003190112610271576001600160a01b0361071f610efe565b165f52602b602052602060ff60405f2054166040519015158152f35b34610271575f36600319011261027157602060ff602454166040519015158152f35b34610271575f366003190112610271576020602354604051908152f35b34610271575f366003190112610271575f546040516001600160a01b039091168152602090f35b34610271575f3660031901126102715760105460405160089190911c6001600160a01b03168152602090f35b34610271575f36600319011261027157601d546040516001600160a01b039091168152602090f35b34610271575f366003190112610271575f5461dead90816001600160a01b038216610821338214610f2a565b5f51602061264d5f395f51905f525f80a36001600160a01b031916175f55005b34610271576020366003190112610271576001600160a01b03610862610efe565b165f526001602052602060405f2054604051908152f35b34610271575f366003190112610271576020601b54604051908152f35b34610271575f366003190112610271576020601554604051908152f35b34610271575f366003190112610271576020601e54604051908152f35b34610271575f36600319011261027157601f546040516001600160a01b039091168152602090f35b34610271576020366003190112610271576001600160a01b03610919610efe565b165f52600f602052602060ff60405f2054166040519015158152f35b34610271575f366003190112610271576020601754604051908152f35b34610271575f366003190112610271576020602654604051908152f35b34610271575f366003190112610271576020600954604051908152f35b34610271575f366003190112610271576011546040516001600160a01b039091168152602090f35b34610271575f366003190112610271576020601654604051908152f35b34610271576060366003190112610271576109ea610efe565b6109f2610f14565b90610a0160443580938361150a565b6001600160a01b03165f818152600260209081526040808320338452909152902054909190600101610a3857602060405160018152f35b5f828152600260209081526040808320338452909152902054610a5b91906112b9565b5f918252600260209081526040808420338552909152909120558080610559565b34610271575f36600319011261027157600d546040516001600160a01b039091168152602090f35b34610271575f3660031901126102715760206040515f8152f35b34610271575f366003190112610271576020600a54604051908152f35b5f366003190112610271576100206110a2565b3461027157602036600319011261027157610b07610efe565b610b1b60018060a01b035f54163314610f2a565b610b2a60ff6010541615610f95565b601e54610cb557602a549060285491610b50610b496029548095610fcb565b8210610ff2565b60018060a01b03821690815f52602b602052610b7360ff60405f2054161561102a565b610b7e84151561105f565b600e546040516370a0823160e01b815230600482015290602090829060249082906001600160a01b03165afa8015610caa5785915f91610c75575b5010610c3a57610bed93610bcc91611095565b602a555f52602b60205260405f20600160ff198254161790556029546113ac565b602a54610bff60285460295490610fcb565b1115610c0757005b43601e5561dead5f548160018060a01b0382165f51602061264d5f395f51905f525f80a36001600160a01b031916175f55005b60405162461bcd60e51b81526020600482015260136024820152726e6f7420656e6f7567682063757272656e637960681b6044820152606490fd5b9150506020813d602011610ca2575b81610c9160209383610f5f565b810103126102715784905186610bb9565b3d9150610c84565b6040513d5f823e3d90fd5b60405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e481cdd185c9d1959608a1b6044820152606490fd5b3461027157604036600319011261027157610d05610efe565b335f8181526002602090815260408083206001600160a01b03909516808452948252918290206024359081905591519182527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a3602060405160018152f35b34610271575f366003190112610271576020601454604051908152f35b34610271575f366003190112610271576040515f6007548060011c90600181168015610e33575b6020831081146106e0578285529081156106bc5750600114610dd55761065a8361064e81850382610f5f565b91905060075f527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688915f905b808210610e195750909150810160200161064e61063e565b919260018160209254838588010152019101909291610e01565b91607f1691610da9565b34610271575f36600319011261027157610e6160018060a01b035f54163314610f2a565b601e54610e835743601e55305f52600160205261002060405f2054333061132f565b60405162461bcd60e51b815260206004820152600c60248201526b30b63932b0b23c9037b832b760a11b6044820152606490fd5b9190916020815282518060208301525f5b818110610ee8575060409293505f838284010152601f8019910116010190565b8060208092870101516040828601015201610ec8565b600435906001600160a01b038216820361027157565b602435906001600160a01b038216820361027157565b15610f3157565b60405162461bcd60e51b815260206004820152600660248201526510b7bbb732b960d11b6044820152606490fd5b90601f8019910116810190811067ffffffffffffffff821117610f8157604052565b634e487b7160e01b5f52604160045260245ffd5b15610f9c57565b60405162461bcd60e51b81526020600482015260076024820152660696e20737761760cc1b6044820152606490fd5b81810292918115918404141715610fde57565b634e487b7160e01b5f52601160045260245ffd5b15610ff957565b60405162461bcd60e51b815260206004820152600960248201526836b4b73a1037bb32b960b91b6044820152606490fd5b1561103157565b60405162461bcd60e51b81526020600482015260066024820152651b5a5b9d195960d21b6044820152606490fd5b1561106657565b60405162461bcd60e51b81526020600482015260076024820152661b9bdd081cd95d60ca1b6044820152606490fd5b91908201809211610fde57565b6010546110b360ff5f921615610f95565b6110bf601e5415610ff2565b6029546110cd81151561105f565b6110e5602a546110df83602854610fcb565b11610ff2565b335f52602b6020526110fe60ff60405f2054161561102a565b80341061128157600e546001600160a01b0316803b15610271575f90600460405180948193630d0e30db60e41b83525af18015610caa5761126e575b5061115760295461114d81602a54611095565b602a5533906113ac565b338152602b60205260408120600160ff19825416179055806029548034116111cc575b5050602a5461118e60285460295490610fcb565b11156111975750565b43601e55805461dead90816001600160a01b0382165f51602061264d5f395f51905f528580a36001600160a01b031916179055565b81806111d98193346112b9565b335af13d15611269573d67ffffffffffffffff8111611255576040519061120a601f8201601f191660200183610f5f565b81528260203d92013e5b1561122057805f61117a565b60405162461bcd60e51b815260206004820152600d60248201526c1c99599d5b990819985a5b1959609a1b6044820152606490fd5b634e487b7160e01b83526041600452602483fd5b611214565b61127a91505f90610f5f565b5f5f61113a565b60405162461bcd60e51b815260206004820152601060248201526f0d2dce6eaccccd2c6d2cadce8408aa8960831b6044820152606490fd5b91908203918211610fde57565b6001600160a01b03165f81815260016020526040902080549192915f19810191908211610fde575560018060a01b031690815f52600160205260405f2080549060018201809211610fde57555f51602061266d5f395f51905f52602060405160018152a3600190565b60205f51602061266d5f395f51905f529160018060a01b031692835f526001825260405f2061135f8682546112b9565b905560018060a01b031693845f526001825260405f20611380828254611095565b9055604051908152a3600190565b8115611398570490565b634e487b7160e01b5f52601260045260245ffd5b6114239060606113c4600a546028549060011c61138e565b91600160ff196010541617601055600160ff19602154161760215560018060a01b03600d541660018060a01b03600e5416915f60018060a01b0360055416916040519788958694859362e8e33760e81b85528a42933060048801611d7c565b03925af1918215610caa57611453926114c0575b5060ff196021541660215560ff1960105416601055823061132f565b506011546001600160a01b039182165f818152600160205260409020549290911691823b15610271576040516338c110ef60e21b81526001600160a01b039290921660048301526024820152905f908290604490829084905af16114b45750565b5f6114be91610f5f565b565b6114e19060603d6060116114e8575b6114d98183610f5f565b8101906114ef565b5050611437565b503d6114cf565b90816060910312610271578051916040602083015192015190565b91905f9260018060a01b03811691825f5260016020528360405f205410611d445760ff60215416611d3557601e5415611d03576001600160a01b0381165f818152600f60205260408120549195909182908190819060ff1615611be05750601f54604051630240bc6b60e21b81526001600160a01b0390911690606081600481855afa908115610caa575f905f92611ba0575b50600e546001600160a01b0316916020916001600160701b039130851015611b97575016925b6024604051809481936370a0823160e01b835260048301525afa908115610caa575f91611b65575b501160ff196024541660ff8216176024555b602254151580611b5a575b611ad3575b875f52600f60205260ff60405f2054168015611abd575b611954575b505085885260016020526116418260408a20546112b9565b868952600160205260408920558792611820575b5061166b939291611665916112b9565b916125fd565b60018060a01b03601154168184526001602052604084205491813b1561181c576040516338c110ef60e21b81526001600160a01b039190911660048201526024810192909252839081908390604490829084905af1611801575b505060018060a01b03601154168183526001602052604083205491813b156117fd576040516338c110ef60e21b81526001600160a01b039190911660048201526024810192909252829081908390604490829084905af16117e3575b505060ff60105416156117315750565b6011546040516001624d3b8760e01b03198152620493e0600482015291906060908390602490829085906001600160a01b03165af19081819382936117be575b5061177b57505050565b60405192835260208301526040820152620493e0606082015260017fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a9860803293a3565b915092506117db915060603d6060116114e8576114d98183610f5f565b91925f611771565b6117ec91610f5f565b805f126117fa575f81611721565b80fd5b8380fd5b61180a91610f5f565b815f12611818575f826116c5565b5080fd5b8480fd5b8015611926578761184e61184561183c60175460195490611095565b60185490611095565b601a5490611095565b905b611912579161166b9594939161271061186c6116659584610fcb565b04806118ff575b506118ea5761271061188760165483610fcb565b045b878161189c575b50509150919293611655565b5f51602061266d5f395f51905f5260206118ba8461dead9597611095565b95845f52600182526118d08160405f2054611095565b855f526001835260405f2055604051908152a35f87611890565b6127106118f9601b5483610fcb565b04611889565b925061190c8330886125fd565b5f611873565b634e487b7160e01b89526011600452602489fd5b8761194e61194561193c60125460135490611095565b60145490611095565b60155490611095565b90611850565b60ff601f5460a01c16611a87575b885f52600f60205260ff60405f2054166119bb575b1590816119b2575b506119a9575b868852600f60205260ff6040892054166119a1575b5f80611629565b50600161199a565b60019250611985565b9050155f61197f565b60105460ff81161580611a7f575b6119d4575b50611977565b305f5260016020526119ed60405f2054602254906112b9565b806119f9575b506119ce565b611a65919b50611a3b61183c611845611a32611a29611a2061194560125460145490611095565b60135490611095565b60175490611095565b60195490611095565b905f9c611388611a4b848a610fcb565b0491808311611a76575b5060ff1916600117601055611e27565b60ff19601054166010555f806119f3565b91506001611a55565b5081156119c9565b601e546119625760405162461bcd60e51b815260206004820152600760248201526670617573696e6760c81b6044820152606490fd5b50885f52600f60205260ff60405f205416611624565b909895979492999693915f5b602254811015611b2e57600190611b278d604051906020820190848252604083015242606083015260608252611b16608083610f5f565b848060a01b0391519020168c6112c6565b5001611adf565b50919396999890929497959860225480800460011481151715610fde57611b54916112b9565b9261160d565b50601e541515611608565b90506020813d602011611b8f575b81611b8060209383610f5f565b8101031261027157515f6115eb565b3d9150611b73565b905016926115c3565b6001600160701b03925060209150611bcf9060603d606011611bd9575b611bc78183610f5f565b810190611dd9565b509290915061159d565b503d611bbd565b875f52600f60205260ff60405f205416156115fd57601f54604051630240bc6b60e21b81529192506001600160a01b0316606082600481845afa918215610caa575f905f93611cd3575b50600e546001600160a01b0316926020916001600160701b039130861015611cca575016915b6024604051809581936370a0823160e01b835260048301525afa918215610caa575f92611c96575b5010159060245461ff008360081b169061ff001916176024556115fd565b9091506020813d602011611cc2575b81611cb260209383610f5f565b810103126102715751905f611c78565b3d9150611ca5565b90501691611c50565b6001600160701b03935060209150611cf99060603d606011611bd957611bc78183610f5f565b5093909150611c2a565b60405162461bcd60e51b815260206004820152600a60248201526906e6f7420616464206c760b41b6044820152606490fd5b9150611d41935061132f565b50565b60405162461bcd60e51b815260206004820152601060248201526f0c4c2d8c2dcc6ca9cdee88adcdeeaced60831b6044820152606490fd5b6001600160a01b0391821681529181166020830152604082019290925260608101929092525f6080830181905260a083015290911660c082015260e08101919091526101000190565b51906001600160701b038216820361027157565b9081606091031261027157611ded81611dc5565b916040611dfc60208401611dc5565b92015163ffffffff811681036102715790565b90816020910312610271575180151581036102715790565b5f929181156125f75780156125f757611e4e611e4860185460135490611095565b83610fcb565b8160011b90828204600203610fde57611e7191611e6a9161138e565b80936112b9565b9081611e7f575b5050509050565b600d5460105460081c6001600160a01b03908116969116803b156102715760405190635c11d79560e01b825260a48201978560048401525f602484015260a0604484015260205480995260c483019860205f5260205f20905f5b8181106125d8575050505f918383818c819560249c9d9e50606483015242608483015203925af190816125c3575b506125be577f6c37756e80daba6f4df0d5bfa6cddadfe23601acc1a27dc8d4aa427de91467886020604051838152a15b60018060a01b03600e5416602060018060a01b0360105460081c1691604051968780926370a0823160e01b82528560048301525afa9485156120ce57829561258a575b508415908115612532575b506001171561251e5750611fb18491611fac611fa660125460175490611095565b86610fcb565b61138e565b806124a4575b50611fac90611fc593610fcb565b9081612434575b5050600e546040516370a0823160e01b8152306004820152906001600160a01b0316602082602481845afa908115610caa575f925f92612400575b5081612015575b8392611e78565b601d546001600160a01b0316818103612115575050601d5460115460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905291602091839160449183918891165af1801561210a576120dd575b506011546001600160a01b031690813b156120d95782916024839260405194859384926351c2a0e360e01b845260048401525af180156120ce576120b9575b50505b5f808061200e565b6120c4828092610f5f565b6117fa57806120ae565b6040513d84823e3d90fd5b8280fd5b6120fe9060203d602011612103575b6120f68183610f5f565b810190611e0f565b61206f565b503d6120ec565b6040513d85823e3d90fd5b6011546040516370a0823160e01b81526001600160a01b039091166004820152929091602084602481865afa938415610caa575f946123cc575b506040519261215f606085610f5f565b60028452602084019160403684378451156123b8578083528451600110156123b857604085810192909252600d54915163095ea7b360e01b81526001600160a01b03909216600483015260248201849052602090829060449082905f905af18015610caa5761239b575b50600d546011546001600160a01b0391821693911690833b1561027157939190604051948593635c11d79560e01b855260a485019160048601525f602486015260a060448601525180915260c4840192905f5b818110612379575050505f838195938193606483015242608483015203925af19081612364575b5061235f577f6c37756e80daba6f4df0d5bfa6cddadfe23601acc1a27dc8d4aa427de91467886020604051848152a15b601d546011546040516370a0823160e01b81526001600160a01b0391821660048201819052939092909160209184916024918391165afa918215612354578492612320575b508082116122ca575b505050506120b1565b6122d3916112b9565b813b156120d95782916024839260405194859384926351c2a0e360e01b845260048401525af180156120ce5761230b575b80806122c1565b612316828092610f5f565b6117fa5780612304565b9091506020813d60201161234c575b8161233c60209383610f5f565b810103126102715751905f6122b8565b3d915061232f565b6040513d86823e3d90fd5b612273565b6123719193505f90610f5f565b5f915f612243565b82516001600160a01b031685528795506020948501949092019160010161221c565b6123b39060203d602011612103576120f68183610f5f565b6121c9565b634e487b7160e01b5f52603260045260245ffd5b9093506020813d6020116123f8575b816123e860209383610f5f565b810103126102715751925f61214f565b3d91506123db565b9091506020813d60201161242c575b8161241c60209383610f5f565b810103126102715751905f612007565b3d915061240f565b600d54600e5460055460405162e8e33760e81b81529460609486946001600160a01b039081169486945f94869461247694429493811693163060048801611d7c565b03925af1612485575b80611fcc565b61249d9060603d6060116114e8576114d98183610f5f565b505061247f565b600e5460055460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810193909352919250602091839160449183915f91165af18015610caa57611fc593611fac9286926124ff575b50935090611fb7565b6125179060203d602011612103576120f68183610f5f565b505f6124f6565b634e487b7160e01b81526011600452602490fd5b803b156120d957604051635569f64b60e11b8152306004820152602481018790529083908290604490829084905af1801561210a57908391612575575b50611f85565b8161257f91610f5f565b61181857815f61256f565b9094506020813d6020116125b6575b816125a660209383610f5f565b810103126102715751935f611f7a565b3d9150612599565b611f37565b6125d09192505f90610f5f565b5f905f611f07565b82546001600160a01b03168c526020909b019a60019283019201611ed9565b50509050565b919060205f51602061266d5f395f51905f529160018060a01b031693845f526001825261262e8460405f2054611095565b855f526001835260405f205560405193845260018060a01b031692a356fe8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220155ebaa9806af61bf8f652d2e744f1f710bcab8f2c608f6c01226cfe329ddb4f64736f6c634300081c0033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| Robinhood发射台 (GUUUYY) | GUUUYY | 4,444 | — | — |
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xb8b229…c4c4cd | 35 days agoSat, 11 Jul 2026 08:54:55 UTC | Transfer | [0] 0x000000000000…0f7e01d5 [1] 0x000000000000…7ec26eaf data: 0x000000000000000000…e5f80000 |
| 0xb8b229…c4c4cd | 35 days agoSat, 11 Jul 2026 08:54:55 UTC | Transfer | [0] 0x000000000000…0f7e01d5 [1] 0x000000000000…f38511f0 data: 0x000000000000000000…e5f80000 |
| 0x48094a…0e3b45 | 35 days agoSat, 11 Jul 2026 08:40:27 UTC | Transfer | [0] 0x000000000000…00000000 [1] 0x000000000000…0f7e01d5 data: 0x000000000000000000…97e00000 |
| 0x48094a…0e3b45 | 35 days agoSat, 11 Jul 2026 08:40:27 UTC | 0x8be007…57e0 | [0] 0x000000000000…00000000 [1] 0x000000000000…8a4697eb |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| no internal transactions found for this address yet (traced blocks + on-demand) | ||||||||
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| !0x0033b2…f8de14 | Transfer | 6,814,932 | 35 days agoSat, 11 Jul 2026 08:54:57 UTC | 0x6c03…f59c | IN | Robinhood发射台 | $1.880.001 ETH | 0.00000131 | |
| 0xb8b229…c4c4cd | Transfer | 6,814,917 | 35 days agoSat, 11 Jul 2026 08:54:55 UTC | 0x75fe…6eaf | IN | Robinhood发射台 | $1.880.001 ETH | 0.00002867 | |
| !0x4d1783…3d3cfc | Transfer | 6,814,482 | 35 days agoSat, 11 Jul 2026 08:54:12 UTC | 0x75fe…6eaf | IN | Robinhood发射台 | $1.880.001 ETH | 0.00000130 | |
| !0xfcf998…a41747 | Transfer | 6,814,379 | 35 days agoSat, 11 Jul 2026 08:54:01 UTC | 0x569e…53a6 | IN | Robinhood发射台 | $1.880.001 ETH | 0.00000131 | |
| !0x762cfb…ba3409 | Transfer | 6,813,120 | 35 days agoSat, 11 Jul 2026 08:51:55 UTC | 0x6c03…f59c | IN | Robinhood发射台 | $1.880.001 ETH | 0.00000130 | |
| !0x6fd640…1736e1 | Transfer | 6,812,461 | 35 days agoSat, 11 Jul 2026 08:50:49 UTC | 0x569e…53a6 | IN | Robinhood发射台 | $1.880.001 ETH | 0.00000131 | |
| !0x5609a7…e0ba07 | Transfer | 6,810,736 | 35 days agoSat, 11 Jul 2026 08:47:57 UTC | 0x6c03…f59c | IN | Robinhood发射台 | $1.880.001 ETH | 0.00000130 |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xb8b229b3…c4c4cd | Transfer | 6,814,917 | 35 days agoSat, 11 Jul 2026 08:54:55 UTC | 0xae6b…01d5 | OUT | 0x75fe…6eaf | 2,222 GUUUYY | Robinhood发射台 (GUUUYY) | |
| 0xb8b229b3…c4c4cd | Transfer | 6,814,917 | 35 days agoSat, 11 Jul 2026 08:54:55 UTC | 0xae6b…01d5 | OUT | 0x4895…11f0 | 0.001 WETH | WETH (WETH) | |
| 0xb8b229b3…c4c4cd | Transfer | 6,814,917 | 35 days agoSat, 11 Jul 2026 08:54:55 UTC | 0xae6b…01d5 | OUT | 0x4895…11f0 | 2,222 GUUUYY | Robinhood发射台 (GUUUYY) | |
| 0xb8b229b3…c4c4cd | Transfer | 6,814,917 | 35 days agoSat, 11 Jul 2026 08:54:55 UTC | 0x0000…0000 | IN | 0xae6b…01d5 | 0.001 WETH | WETH (WETH) | |
| 0x48094acf…0e3b45 | Transfer | 6,806,241 | 35 days agoSat, 11 Jul 2026 08:40:27 UTC | 0x0000…0000 | IN | 0xae6b…01d5 | 8,888 GUUUYY | Robinhood发射台 (GUUUYY) |