ETH Price: $2,952.06 (-0.13%)

Token

Bank Of Linea (BOL)

Overview

Max Total Supply

100,000,000 BOL

Holders

1,836

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.387508119687166209 BOL

Value
$0.00
0xdd927dc030a12b77c45ba537ef0b344b71226c49
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Bank of Linea is a reflection-based token on the Linea network that redistributes Ethereum rewards to holders through onchain tax mechanisms, while supporting sustainable growth via community incentives, and periodic buybacks.

Contract Source Code Verified (Exact Match)

Contract Name:
BankOfLinea

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 10000 runs

Other Settings:
london EvmVersion
File 1 of 1 : BankOfLinea.sol
// File: BankOfLinea.sol
// Author: [BankOfLinea]
// Date:- May, 2025.

/**
 * @title BankOfLinea
 * @dev   ERC20 token contract with advanced fee mechanisms, dividend distribution, and a max transaction to reduce market manipulation
 *        Implements a reward system where fees are collected and distributed to token holders as dividends.
 *        Includes features like anti-bot measures, max transaction limits, and liquidity pool integration.
 *        Utilizes SafeMath for arithmetic operations and integrates with a decentralized exchange router.
 *
 * Key Features:
 * - **Tokenomics**: Configurable fees for marketing, development, and rewards.
 * - **Dividend System**: Distributes ETH rewards to eligible shareholders based on token holdings.
 * - **Trading Controls**: Enforces max transaction, max sell, and max wallet limits to prevent abuse.
 * - **Fee Exemptions**: Allows specific addresses to be exempt from fees and dividend distributions.
 * - **Swap and Liquify**: Automatically swaps tokens for ETH to fund rewards and other fee receivers.
 *
 *
 * Important Notes:
 * - The contract uses Solidity version 0.8.26, which includes built-in overflow checks, but SafeMath is still used for consistency.
 * - Fees are capped at 30% for total, sell, and transfer transactions to ensure fairness.
 * - The contract includes rescue functions for stuck ERC20 tokens and excess ETH, callable only by the owner.
 *
 * License: This contract is licensed under the MIT License.
 * 
 * https://bankoflinea.build/
 * https://linktr.ee/bankoflinea
 * https://x.com/bankoflinea
 * 
 */

// SPDX-License-Identifier: MIT

pragma solidity 0.8.26;


library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {return a + b;}
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {return a - b;}
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {return a * b;}
    function div(uint256 a, uint256 b) internal pure returns (uint256) {return a / b;}
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {return a % b;}
    
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {uint256 c = a + b; if(c < a) return(false, 0); return(true, c);}}

    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {if(b > a) return(false, 0); return(true, a - b);}}

    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {if (a == 0) return(true, 0); uint256 c = a * b;
        if(c / a != b) return(false, 0); return(true, c);}}

    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {if(b == 0) return(false, 0); return(true, a / b);}}

    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {if(b == 0) return(false, 0); return(true, a % b);}}

    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked{require(b <= a, errorMessage); return a - b;}}

    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked{require(b > 0, errorMessage); return a / b;}}

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked{require(b > 0, errorMessage); return a % b;}}}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function circulatingSupply() external view returns (uint256);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function name() external view returns (string memory);
    function getOwner() external view returns (address);
    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);}

abstract contract Ownable {
    address internal owner;
    constructor(address _owner) {owner = _owner;}
    modifier onlyOwner() {require(isOwner(msg.sender), "!OWNER"); _;}
    function isOwner(address account) public view returns (bool) {return account == owner;}
    function transferOwnership(address payable adr) public onlyOwner {owner = adr; emit OwnershipTransferred(adr);}
    event OwnershipTransferred(address owner);
}

struct route {
    address from;
    address to;
    bool stable;
}

interface IFactory {
    function createPair(address tokenA, address tokenB, bool stable) external returns (address pair);
    function getPair(address tokenA, address tokenB, bool stable) external view returns (address pair);
}

interface IRouter {
    function factory() external pure returns (address);
    function wETH() external pure returns (address);
    function getAmountsOut(uint amountIn, route[] calldata routes) external view returns (uint[] memory amounts);
    function addLiquidityETH(
        address token,
        bool stable,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        route[] calldata routes,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        route[] calldata routes,
        address to,
        uint deadline
    ) external;
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
    uint amountIn,
    uint amountOutMin,
    route[] calldata routes,
    address to,
    uint deadline
   ) external;
}

contract BankOfLinea is IERC20, Ownable {
    using SafeMath for uint256;
    string private constant _name = 'Bank Of Linea';
    string private constant _symbol = 'BOL';
    uint8 private constant _decimals = 18;
    uint256 private _totalSupply = 100000000 * (10 ** _decimals);
    uint256 private _maxTxAmount = ( _totalSupply * 25 ) / 10000;
    uint256 private _maxSellAmount = ( _totalSupply * 25 ) / 10000;
    uint256 private _maxWalletToken = ( _totalSupply * 200 ) / 10000;
    mapping (address => uint256) _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => bool) public isFeeExempt;
    mapping (address => bool) public isDividendExempt;
    mapping (address => bool) private isBot;
    IRouter router;
    address public pair;
    bool private tradingAllowed = false;
    uint256 private liquidityFee = 0;
    uint256 private marketingFee = 2000;
    uint256 private rewardsFee = 7000;
    uint256 private developmentFee = 1000;
    uint256 private burnFee = 0;
    uint256 private totalFee = 1000;
    uint256 private sellFee = 1500;
    uint256 private transferFee = 200;
    uint256 private denominator = 10000;
    bool private swapEnabled = true;
    uint256 private swapTimes;
    bool private swapping; 
    uint256 private swapThreshold = ( _totalSupply * 250 ) / 100000;
    uint256 private _minTokenAmount = ( _totalSupply * 10 ) / 100000;
    modifier lockTheSwap {swapping = true; _; swapping = false;}
    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalDistributed;
    uint256 internal dividendsPerShare;
    uint256 internal dividendsPerShareAccuracyFactor = 10 ** 36;
    address[] shareholders;
    mapping (address => uint256) shareholderIndexes;
    mapping (address => uint256) shareholderClaims;
    struct Share {uint256 amount; uint256 totalExcluded; uint256 totalRealised; }
    mapping (address => Share) public shares;
    uint256 internal currentIndex;
    uint256 public minPeriod = 60 minutes;
    uint256 public minDistribution = 1 * (10 ** 5);
    uint256 public distributorGas = 350000;
    function _claimDividend() external {distributeDividend(msg.sender);}


    // Mutable receiver addresses
    address internal marketing_receiver = 0x271c1959cd69909a98D1FAF71C552CB139260fF5;
    address internal development_receiver = 0xfb997CCc8081798a2fE0b70c576488a5f9E6AB78;

    address internal constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address internal constant liquidity_receiver = 0xd53686b4298Ac78B1d182E95FeAC1A4DD1D780bD;

    constructor() Ownable(msg.sender) {
        isFeeExempt[address(this)] = true;
        isFeeExempt[liquidity_receiver] = true;
        isFeeExempt[marketing_receiver] = true;
        isFeeExempt[msg.sender] = true;
        isDividendExempt[address(msg.sender)] = true;        
        isDividendExempt[address(this)] = true;
        isDividendExempt[address(DEAD)] = true;
        isDividendExempt[address(0)] = true;
        _balances[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }




    receive() external payable {}
    function name() public pure returns (string memory) {return _name;}
    function symbol() public pure returns (string memory) {return _symbol;}
    function decimals() public pure returns (uint8) {return _decimals;}
    function getOwner() external view override returns (address) { return owner; }
    function totalSupply() public view override returns (uint256) {return _totalSupply;}
    function balanceOf(address account) public view override returns (uint256) {return _balances[account];}
    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 isCont(address addr) internal view returns (bool) {uint size; assembly { size := extcodesize(addr) } return size > 0; }
    function setisExempt(address _address, bool _enabled) external onlyOwner {isFeeExempt[_address] = _enabled;}
    function approve(address spender, uint256 amount) public override returns (bool) {_approve(msg.sender, spender, amount);return true;}
    function circulatingSupply() public view override returns (uint256) {return _totalSupply.sub(balanceOf(DEAD)).sub(balanceOf(address(0)));}

    function startTrading() external onlyOwner {
        require(!tradingAllowed,"trading is already open");
        tradingAllowed = true;
    }

    function setPair(address _routerAddress) external onlyOwner {
        require(_routerAddress != address(0), "Router cannot be zero address");
        router = IRouter(_routerAddress);
        pair = IFactory(router.factory()).getPair(address(this), router.wETH(), false);
        if (pair == address(0)) {
            pair = IFactory(router.factory()).createPair(address(this), router.wETH(), false);
        }
        isDividendExempt[pair] = true;
    }

    function preTxCheck(address sender, address recipient, uint256 amount) internal view {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount > uint256(0), "Transfer amount must be greater than zero");
        require(amount <= balanceOf(sender),"You are trying to transfer more than your balance");
    }

function _transfer(address sender, address recipient, uint256 amount) private {
    require(sender != address(0), "ERC20: transfer from zero address");
    require(recipient != address(0), "ERC20: transfer to zero address");
    require(amount > 0, "Transfer amount must be greater than zero");
    require(amount <= _balances[sender], "Insufficient balance");

    bool isSenderExempt = isFeeExempt[sender];
    bool isRecipientExempt = isFeeExempt[recipient];
    bool isSell = recipient == pair;
    bool isBuy = sender == pair;

    if (!isSenderExempt && !isRecipientExempt) {
        require(tradingAllowed, "Trading not allowed");
        if (!isSell && recipient != address(DEAD)) {
            require(_balances[recipient] + amount <= _maxWalletToken, "Exceeds max wallet");
        }
        require(amount <= _maxTxAmount, "Exceeds max tx amount");
        if (!isBuy) {
            require(amount <= _maxSellAmount, "Exceeds max sell amount");
        }
    }

    if (isSell && !isSenderExempt) {
        swapTimes++;
    }

    uint256 contractBalance = _balances[address(this)];
    bool shouldSwap = !swapping && swapEnabled && tradingAllowed && !isSenderExempt && isSell &&
                      swapTimes >= 2 && amount >= _minTokenAmount && contractBalance >= swapThreshold;
    if (shouldSwap) {
        swapandreward(swapThreshold);
        swapTimes = 0;
    }

    _balances[sender] -= amount;
    uint256 amountReceived = (isSenderExempt || isRecipientExempt) ? amount : takeFee(sender, recipient, amount);
    _balances[recipient] += amountReceived;

    emit Transfer(sender, recipient, amountReceived);

    bool senderHasShares = !isDividendExempt[sender];
    bool recipientHasShares = !isDividendExempt[recipient];

    if (senderHasShares || recipientHasShares) {
        if (senderHasShares && !isCont(sender)) {
            if (isSell && shouldSwap) {
                distributeDividend(sender); // Sender only on sell with swap
            } else if (!isSell && !isBuy) {
                distributeDividend(sender); // Sender on transfer
            }
            setShare(sender, _balances[sender]);
        }
        if (recipientHasShares && !isCont(recipient)) {
           if (isBuy) {
               distributeDividend(recipient);
           } else if (!isSell && !shouldSwap && !isBuy) {
                distributeDividend(recipient); // Recipient on transfer
            }
            setShare(recipient, _balances[recipient]);
        }
    }
}



    

  function setStructure(
    uint256 _liquidity,
    uint256 _marketing,
    uint256 _burn,
    uint256 _rewards,
    uint256 _development,
    uint256 _total,
    uint256 _sell,
    uint256 _trans
) external onlyOwner {
    liquidityFee = _liquidity;
    marketingFee = _marketing;
    burnFee = _burn;
    rewardsFee = _rewards;
    developmentFee = _development;
    totalFee = _total;
    sellFee = _sell;
    transferFee = _trans;
    require(
        totalFee <= denominator.mul(30).div(100) &&
        sellFee <= denominator.mul(30).div(100) &&
        transferFee <= denominator.mul(30).div(100),
        "Fees cannot exceed 30%"
    );
}

function getCurrentFeesAsPercent() public view returns (
    uint256 liquidity,
    uint256 marketing,
    uint256 burn,
    uint256 rewards,
    uint256 development,
    uint256 total,
    uint256 sell,
    uint256 transfersFee
) {
    return (
        liquidityFee.div(100),
        marketingFee.div(100),
        burnFee.div(100),
        rewardsFee.div(100),
        developmentFee.div(100),
        totalFee.div(100),
        sellFee.div(100),
        transferFee.div(100)
    );
}


/// @notice Sets a new swap threshold for triggering token-to-ETH swaps.
/// @param _newThreshold The new threshold in tokens (must be at least 0.1% of total supply).
/// @dev Only callable by the owner. Emits no event as state change is trackable via transaction logs.
function setSwapThreshold(uint256 _newThreshold) external onlyOwner {
    require(_newThreshold >= (_totalSupply * 100) / 100000, "Threshold cannot be less than 0.1% of total supply");
    require(_newThreshold <= (_totalSupply * 1000) / 100000, "Threshold cannot exceed 1% of total supply");
    swapThreshold = _newThreshold;
    emit SwapThresholdUpdated(_newThreshold);
}


/// @notice Emitted when the marketing receiver address is updated.
/// @param newReceiver The new marketing receiver address.
event MarketingReceiverUpdated(address indexed newReceiver);


/// @notice Emitted when the development receiver address is updated.
/// @param newReceiver The new development receiver address.
event DevelopmentReceiverUpdated(address indexed newReceiver);


/// @notice Emitted when tokens are swapped for ETH in the swap and reward system.
/// @param tokenAmount The amount of tokens swapped.
/// @param ethReceived The amount of ETH received from the swap.
event SwapTriggered(uint256 indexed tokenAmount, uint256 ethReceived);


/// @notice Emitted when the swap threshold is updated.
/// @param newThreshold The new swap threshold in tokens.
event SwapThresholdUpdated(uint256 newThreshold);

/// @notice Sets a new marketing receiver address.
/// @param _newReceiver The new address to receive marketing fees.
/// @dev Only callable by the owner. The new address cannot be the zero address.
function setMarketingReceiver(address _newReceiver) external onlyOwner {
    require(_newReceiver != address(0), "Cannot set to zero address");
    isFeeExempt[marketing_receiver] = false; // Remove exemption from old receiver
    marketing_receiver = _newReceiver;
    isFeeExempt[_newReceiver] = true; // Add exemption to new receiver
    emit MarketingReceiverUpdated(_newReceiver);
}

/// @notice Sets a new development receiver address.
/// @param _newReceiver The new address to receive development fees.
/// @dev Only callable by the owner. The new address cannot be the zero address.
function setDevelopmentReceiver(address _newReceiver) external onlyOwner {
    require(_newReceiver != address(0), "Cannot set to zero address");
    development_receiver = _newReceiver;
    emit DevelopmentReceiverUpdated(_newReceiver);
}



    function setisBot(address _address, bool _enabled) external onlyOwner {
        require(_address != address(pair) && _address != address(router) && _address != address(this), "Ineligible Address");
        isBot[_address] = _enabled;
    }

    function setParameters(uint256 _buy, uint256 _trans, uint256 _wallet) external onlyOwner {
    require(_buy <= 200 && _trans <= 200 && _wallet <= 200, "Cannot exceed 2%");
    uint256 newTx = (totalSupply() * _buy) / 10000;
    uint256 newTransfer = (totalSupply() * _trans) / 10000;
    uint256 newWallet = (totalSupply() * _wallet) / 10000;
    _maxTxAmount = newTx;
    _maxSellAmount = newTransfer;
    _maxWalletToken = newWallet;
    uint256 limit = totalSupply().mul(25).div(10000); // 0.25%
    require(newTx >= limit && newTransfer >= limit && newWallet >= limit, "Max TXs and Max Wallet cannot be less than 0.25%");
}



function getMaxTxAmount() public view returns (uint256 amount, uint256 percentage) {
    return (_maxTxAmount, (_maxTxAmount * 10000) / totalSupply());
}
function getMaxSellAmount() public view returns (uint256 amount, uint256 percentage) {
    return (_maxSellAmount, (_maxSellAmount * 10000) / totalSupply());
}
function getMaxWalletAmount() public view returns (uint256 amount, uint256 percentage) {
    return (_maxWalletToken, (_maxWalletToken * 10000) / totalSupply());
}

    function checkTradingAllowed(address sender, address recipient) internal view {
        if(!isFeeExempt[sender] && !isFeeExempt[recipient]){require(tradingAllowed, "tradingAllowed");}
    }
    
    function checkMaxWallet(address sender, address recipient, uint256 amount) internal view {
        if(!isFeeExempt[sender] && !isFeeExempt[recipient] && recipient != address(pair) && recipient != address(DEAD)){
            require((_balances[recipient].add(amount)) <= _maxWalletToken, "Exceeds maximum wallet amount.");}
    }

    function swapbackCounters(address sender, address recipient) internal {
        if(recipient == pair && !isFeeExempt[sender]){swapTimes += uint256(1);}
    }

    function checkTxLimit(address sender, address recipient, uint256 amount) internal view {
        if(sender != pair){require(amount <= _maxSellAmount || isFeeExempt[sender] || isFeeExempt[recipient], "TX Limit Exceeded");}
        require(amount <= _maxTxAmount || isFeeExempt[sender] || isFeeExempt[recipient], "TX Limit Exceeded");
    }

    

    function addLiquidity(uint256 tokenAmount, uint256 ETHAmount) private {
        _approve(address(this), address(router), tokenAmount);
        router.addLiquidityETH{value: ETHAmount}(
            address(this),
            false,
            tokenAmount,
            0,
            0,
            liquidity_receiver,
            block.timestamp);
    }

    function swapTokensForETH(uint256 tokenAmount) private {
        route[] memory routes = new route[](1);
        routes[0] = route({
            from: address(this),
            to: router.wETH(),
            stable: false
        });
        _approve(address(this), address(router), tokenAmount);
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            routes,
            address(this),
            block.timestamp);
    }


    function shouldSwapBack(address sender, address recipient, uint256 amount) internal view returns (bool) {
        bool aboveMin = amount >= _minTokenAmount;
        bool aboveThreshold = balanceOf(address(this)) >= swapThreshold;
        return !swapping && swapEnabled && tradingAllowed && aboveMin && !isFeeExempt[sender] && recipient == pair && swapTimes >= uint256(2) && aboveThreshold;
    }

function depositreward(uint256 amount) private {
        totalDividends = totalDividends.add(amount);
        dividendsPerShare = dividendsPerShare.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));
    }

function swapandreward(uint256 tokens) private lockTheSwap {
    uint256 _denominator = marketingFee + developmentFee + rewardsFee;

    // Swap tokens for ETH
    uint256 initialBalance = address(this).balance;
    swapTokensForETH(tokens);
    uint256 deltaBalance = address(this).balance - initialBalance;

    emit SwapTriggered(tokens, deltaBalance);

    // Calculate unit ETH per fee weight
    uint256 unitBalance = deltaBalance / _denominator;

    // Distribute ETH based on fee allocations
    uint256 rewardsAmount = unitBalance * rewardsFee;
    if (rewardsAmount > 0) {
        depositreward(rewardsAmount); // Assumes deposit handles ETH distribution for rewards
    }

    uint256 marketingAmount = unitBalance * marketingFee;
    if (marketingAmount > 0) {
        payable(marketing_receiver).transfer(marketingAmount);
    }

    // Calculate the remaining balance after rewards and marketing
    uint256 usedBalance = rewardsAmount + marketingAmount;
    uint256 remaining = deltaBalance > usedBalance ? deltaBalance - usedBalance : 0;

    if (remaining > 0) {
        payable(development_receiver).transfer(remaining);
    }
}

    function swapBack(address sender, address recipient, uint256 amount) internal {
        if(shouldSwapBack(sender, recipient, amount)){swapandreward(swapThreshold); swapTimes = uint256(0);}
    }

    function shouldTakeFee(address sender, address recipient) internal view returns (bool) {
        return !isFeeExempt[sender] && !isFeeExempt[recipient];
    }

    function getTotalFee(address sender, address recipient) internal view returns (uint256) {
        if(isBot[sender] || isBot[recipient]){return denominator.sub(uint256(100));}
        if(recipient == pair){return sellFee;}
        if(sender == pair){return totalFee;}
        return transferFee;
    }

    function takeFee(address sender, address recipient, uint256 amount) internal returns (uint256) {
        if(getTotalFee(sender, recipient) > 0){
        uint256 feeAmount = amount.div(denominator).mul(getTotalFee(sender, recipient));
        _balances[address(this)] = _balances[address(this)].add(feeAmount);
        emit Transfer(sender, address(this), feeAmount);
        if(burnFee > uint256(0)){_transfer(address(this), address(DEAD), amount.div(denominator).mul(burnFee));}
        return amount.sub(feeAmount);} return amount;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public 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 triggerSwap(uint256 tokens) external onlyOwner {
        swapandreward(tokens);
    }

    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function setisDividendExempt(address holder, bool exempt) external onlyOwner {
        isDividendExempt[holder] = exempt;
        if(exempt){setShare(holder, 0);}
        else{setShare(holder, balanceOf(holder)); }
    }

    function setShare(address shareholder, uint256 amount) internal {
        if(amount > 0 && shares[shareholder].amount == 0){addShareholder(shareholder);}
        else if(amount == 0 && shares[shareholder].amount > 0){removeShareholder(shareholder); }
        totalShares = totalShares.sub(shares[shareholder].amount).add(amount);
        shares[shareholder].amount = amount;
        shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
    }

    

    function processDistribution(uint256 gas) external {
        uint256 shareholderCount = shareholders.length;
        if(shareholderCount == 0) { return; }
        uint256 gasUsed = 0;
        uint256 gasLeft = gasleft();
        uint256 iterations = 0;
        while(gasUsed < gas && iterations < shareholderCount) {
            if(currentIndex >= shareholderCount){currentIndex = 0;}
            if(shouldDistribute(shareholders[currentIndex])){
                distributeDividend(shareholders[currentIndex]);}
            gasUsed = gasUsed.add(gasLeft.sub(gasleft()));
            gasLeft = gasleft();
            currentIndex++;
            iterations++;
        }
    }

   function rescueERC20(address _address, uint256 _amount) external onlyOwner {
    IERC20(_address).transfer(marketing_receiver, _amount);

    }

function getExcessETH() public view returns (uint256) {
    uint256 contractBalance = address(this).balance;
    uint256 pendingDividends = totalDividends - totalDistributed;

    // Safety check: totalDividends should always be >= totalDistributed
    if (pendingDividends > contractBalance) return 0;

    return contractBalance - pendingDividends;
}

function rescueExcessETH(address to) external onlyOwner {
    uint256 excess = getExcessETH();
    require(excess > 0, "No excess ETH");
    (bool success, ) = payable(to).call{value: excess}("");
    require(success, "Transfer failed");
}

function forceDistributeExcessETH() external onlyOwner {
    uint256 unallocated = getExcessETH();
    require(unallocated > 0, "No unallocated ETH");
    totalDividends += unallocated;
    dividendsPerShare += (unallocated * dividendsPerShareAccuracyFactor) / totalShares;
}
    
    function shouldDistribute(address shareholder) internal view returns (bool) {
        return shareholderClaims[shareholder] + minPeriod < block.timestamp
                && getUnpaidEarnings(shareholder) > minDistribution;
    }

    function totalRewardsDistributed(address _wallet) external view returns (uint256) {
        address shareholder = _wallet;
        return uint256(shares[shareholder].totalRealised);
    }

function distributeDividend(address shareholder) private {
    Share storage share = shares[shareholder];
    uint256 amount = getUnpaidEarnings(shareholder);

    if (share.amount == 0 || amount == 0) return;

    totalDistributed += amount;
    
    // Use transfer instead of call
    payable(shareholder).transfer(amount);

    shareholderClaims[shareholder] = block.timestamp;
    share.totalRealised += amount;
    share.totalExcluded = getCumulativeDividends(share.amount);
}

    

    function getUnpaidEarnings(address shareholder) public view returns (uint256) {
        if(shares[shareholder].amount == 0){ return 0; }
        uint256 shareholderTotalDividends = getCumulativeDividends(shares[shareholder].amount);
        uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded;
        if(shareholderTotalDividends <= shareholderTotalExcluded){ return 0; }
        return shareholderTotalDividends.sub(shareholderTotalExcluded);
    }

    function getCumulativeDividends(uint256 share) internal view returns (uint256) {
        return share.mul(dividendsPerShare).div(dividendsPerShareAccuracyFactor);
    }

    function addShareholder(address shareholder) internal {
        shareholderIndexes[shareholder] = shareholders.length;
        shareholders.push(shareholder);
    }

    function removeShareholder(address shareholder) internal {
        shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length-1];
        shareholderIndexes[shareholders[shareholders.length-1]] = shareholderIndexes[shareholder];
        shareholders.pop();
    }

    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution, uint256 _distributorGas) external onlyOwner {
        minPeriod = _minPeriod;
        minDistribution = _minDistribution;
        distributorGas = _distributorGas;
    }
}

Settings
{
  "evmVersion": "london",
  "optimizer": {
    "enabled": true,
    "runs": 10000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newReceiver","type":"address"}],"name":"DevelopmentReceiverUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newReceiver","type":"address"}],"name":"MarketingReceiverUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"SwapThresholdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"}],"name":"SwapTriggered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_claimDividend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"distributorGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forceDistributeExcessETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCurrentFeesAsPercent","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"marketing","type":"uint256"},{"internalType":"uint256","name":"burn","type":"uint256"},{"internalType":"uint256","name":"rewards","type":"uint256"},{"internalType":"uint256","name":"development","type":"uint256"},{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"},{"internalType":"uint256","name":"transfersFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExcessETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxSellAmount","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"percentage","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxTxAmount","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"percentage","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxWalletAmount","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"percentage","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"shareholder","type":"address"}],"name":"getUnpaidEarnings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isDividendExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"rescueExcessETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newReceiver","type":"address"}],"name":"setDevelopmentReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minPeriod","type":"uint256"},{"internalType":"uint256","name":"_minDistribution","type":"uint256"},{"internalType":"uint256","name":"_distributorGas","type":"uint256"}],"name":"setDistributionCriteria","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newReceiver","type":"address"}],"name":"setMarketingReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_routerAddress","type":"address"}],"name":"setPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buy","type":"uint256"},{"internalType":"uint256","name":"_trans","type":"uint256"},{"internalType":"uint256","name":"_wallet","type":"uint256"}],"name":"setParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"uint256","name":"_marketing","type":"uint256"},{"internalType":"uint256","name":"_burn","type":"uint256"},{"internalType":"uint256","name":"_rewards","type":"uint256"},{"internalType":"uint256","name":"_development","type":"uint256"},{"internalType":"uint256","name":"_total","type":"uint256"},{"internalType":"uint256","name":"_sell","type":"uint256"},{"internalType":"uint256","name":"_trans","type":"uint256"}],"name":"setStructure","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newThreshold","type":"uint256"}],"name":"setSwapThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setisBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setisDividendExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setisExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"totalExcluded","type":"uint256"},{"internalType":"uint256","name":"totalRealised","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"totalRewardsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"adr","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"triggerSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526100106012600a6103c5565b61001e906305f5e1006103db565b600155612710600154601961003391906103db565b61003d91906103f2565b600255612710600154601961005291906103db565b61005c91906103f2565b60035561271060015460c861007191906103db565b61007b91906103f2565b600455600b805460ff60a01b191690556000600c8190556107d0600d55611b58600e556103e8600f8190556010919091556011556105dc60125560c86013556127106014556015805460ff1916600190811790915554620186a0906100e19060fa6103db565b6100eb91906103f2565b601855620186a0600154600a61010191906103db565b61010b91906103f2565b6019556ec097ce7bc90715b34b9f1000000000601e55610e10602455620186a060255562055730602655602780546001600160a01b031990811673271c1959cd69909a98d1faf71c552cb139260ff5179091556028805490911673fb997ccc8081798a2fe0b70c576488a5f9e6ab7817905534801561018957600080fd5b50600080546001600160a01b03191633908117825530808352600760209081526040808520805460ff1990811660019081179092557f8e59ac7acde592c7ba2df38c5a1ecf7a6c39a39b6e4a94fdf4dfdb65e47f3b2380548216831790556027546001600160a01b031687528287208054821683179055858752828720805482168317905560088452828720805482168317905593865281862080548516821790557f046fee3d77c34a6c5e10c3be6dc4b132c30449dbf4f0bc07684896dd0933429980548516821790557f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c78054909416811790935591548385526005825282852081905591519182529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610414565b634e487b7160e01b600052601160045260246000fd5b6001815b6001841115610317578085048111156102fb576102fb6102c6565b600184161561030957908102905b60019390931c9280026102e0565b935093915050565b60008261032e575060016103bf565b8161033b575060006103bf565b8160018114610351576002811461035b57610377565b60019150506103bf565b60ff84111561036c5761036c6102c6565b50506001821b6103bf565b5060208310610133831016604e8410600b841016171561039a575081810a6103bf565b6103a760001984846102dc565b80600019048211156103bb576103bb6102c6565b0290505b92915050565b60006103d460ff84168361031f565b9392505050565b80820281158282048414176103bf576103bf6102c6565b60008261040f57634e487b7160e01b600052601260045260246000fd5b500490565b6135f5806104236000396000f3fe60806040526004361061030c5760003560e01c80638187f5161161019a578063c942435d116100e1578063e63d2d5b1161008a578063f2fde38b11610064578063f2fde38b1461098b578063f8e5884b146109ab578063ffd49c84146109cb57600080fd5b8063e63d2d5b14610940578063ef43b02b14610955578063efca2eed1461097557600080fd5b8063d84b440a116100bb578063d84b440a146108c5578063dd62ed3e146108da578063e2d6f94c1461092057600080fd5b8063c942435d14610820578063ca89b89914610835578063ce7c2ac21461086e57600080fd5b806395d89b4111610143578063a8aa1b311161011d578063a8aa1b31146107cb578063a9059cbb146107eb578063ad77bd141461080b57600080fd5b806395d89b411461074f578063997664d7146107955780639d0014b1146107ab57600080fd5b80638c41180e116101745780638c41180e146106fa5780638cd4426d1461071a5780639358928b1461073a57600080fd5b80638187f5161461068857806382d1097d146106a8578063893d20e8146106c857600080fd5b806334c5d2ce1161025e57806348ff2b8b116102075780636d8b0527116101e15780636d8b05271461061d57806370a082311461063257806375b625321461066857600080fd5b806348ff2b8b146105d15780634fab0ae8146105f157806360e719621461060757600080fd5b80633f89797e116102385780633f89797e146105615780634355855a1461058157806344e56680146105b157600080fd5b806334c5d2ce146104fb5780633a98ef391461051b5780633f4218e01461053157600080fd5b806323b872dd116102c05780632f54bf6e1161029a5780632f54bf6e1461046057806330b2bab91461048f578063313ce567146104df57600080fd5b806323b872dd1461040b57806328fd31981461042b578063293230b81461044b57600080fd5b806309c95a1b116102f157806309c95a1b146103a05780630ca61cb1146103ca57806318160ddd146103ec57600080fd5b806306fdde0314610318578063095ea7b31461037057600080fd5b3661031357005b600080fd5b34801561032457600080fd5b5060408051808201909152600d81527f42616e6b204f66204c696e65610000000000000000000000000000000000000060208201525b6040516103679190613163565b60405180910390f35b34801561037c57600080fd5b5061039061038b3660046131e4565b6109e1565b6040519015158152602001610367565b3480156103ac57600080fd5b506103b56109f8565b60408051928352602083019190915201610367565b3480156103d657600080fd5b506103ea6103e5366004613210565b610a28565b005b3480156103f857600080fd5b506001545b604051908152602001610367565b34801561041757600080fd5b5061039061042636600461323c565b610a7e565b34801561043757600080fd5b506103fd61044636600461327d565b610ae8565b34801561045757600080fd5b506103ea610b73565b34801561046c57600080fd5b5061039061047b36600461327d565b6000546001600160a01b0391821691161490565b34801561049b57600080fd5b506104a4610c62565b604080519889526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610367565b3480156104eb57600080fd5b5060405160128152602001610367565b34801561050757600080fd5b506103ea610516366004613210565b610cfe565b34801561052757600080fd5b506103fd601a5481565b34801561053d57600080fd5b5061039061054c36600461327d565b60076020526000908152604090205460ff1681565b34801561056d57600080fd5b506103ea61057c36600461329a565b610ee5565b34801561058d57600080fd5b5061039061059c36600461327d565b60086020526000908152604090205460ff1681565b3480156105bd57600080fd5b506103ea6105cc36600461327d565b610fd2565b3480156105dd57600080fd5b506103ea6105ec3660046132c1565b611119565b3480156105fd57600080fd5b506103fd60255481565b34801561061357600080fd5b506103fd60265481565b34801561062957600080fd5b506103b5611187565b34801561063e57600080fd5b506103fd61064d36600461327d565b6001600160a01b031660009081526005602052604090205490565b34801561067457600080fd5b506103ea61068336600461327d565b6111a5565b34801561069457600080fd5b506103ea6106a336600461327d565b6112cf565b3480156106b457600080fd5b506103ea6106c336600461327d565b611753565b3480156106d457600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610367565b34801561070657600080fd5b506103ea6107153660046132c1565b61184e565b34801561072657600080fd5b506103ea6107353660046131e4565b611949565b34801561074657600080fd5b506103fd611a1c565b34801561075b57600080fd5b5060408051808201909152600381527f424f4c0000000000000000000000000000000000000000000000000000000000602082015261035a565b3480156107a157600080fd5b506103fd601b5481565b3480156107b757600080fd5b506103ea6107c636600461329a565b611a8d565b3480156107d757600080fd5b50600b546106e2906001600160a01b031681565b3480156107f757600080fd5b506103906108063660046131e4565b611c31565b34801561081757600080fd5b506103fd611c3e565b34801561082c57600080fd5b506103ea611c78565b34801561084157600080fd5b506103fd61085036600461327d565b6001600160a01b031660009081526022602052604090206002015490565b34801561087a57600080fd5b506108aa61088936600461327d565b60226020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610367565b3480156108d157600080fd5b506103ea611c83565b3480156108e657600080fd5b506103fd6108f53660046132fa565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b34801561092c57600080fd5b506103ea61093b366004613328565b611d6c565b34801561094c57600080fd5b506103b5611e97565b34801561096157600080fd5b506103ea6109703660046132c1565b611eb5565b34801561098157600080fd5b506103fd601c5481565b34801561099757600080fd5b506103ea6109a636600461327d565b611f5c565b3480156109b757600080fd5b506103ea6109c636600461329a565b612005565b3480156109d757600080fd5b506103fd60245481565b60006109ee338484612054565b5060015b92915050565b600080600454610a0760015490565b600454610a16906127106133ac565b610a2091906133c3565b915091509091565b6000546001600160a01b03163314610a705760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b60448201526064015b60405180910390fd5b602492909255602555602655565b6000610a8b8484846121ac565b610add8433610ad885604051806060016040528060288152602001613598602891396001600160a01b038a166000908152600660209081526040808320338452909152902054919061280a565b612054565b5060015b9392505050565b6001600160a01b0381166000908152602260205260408120548103610b0f57506000919050565b6001600160a01b038216600090815260226020526040812054610b3190612836565b6001600160a01b038416600090815260226020526040902060010154909150808211610b61575060009392505050565b610b6b8282612853565b949350505050565b6000546001600160a01b03163314610bb65760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b600b5474010000000000000000000000000000000000000000900460ff1615610c215760405162461bcd60e51b815260206004820152601760248201527f74726164696e6720697320616c7265616479206f70656e0000000000000000006044820152606401610a67565b600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055565b600080600080600080600080610c846064600c5461285f90919063ffffffff16565b600d54610c9290606461285f565b601054610ca090606461285f565b600e54610cae90606461285f565b600f54610cbc90606461285f565b601154610cca90606461285f565b601254610cd890606461285f565b601354610ce690606461285f565b969f959e50939c50919a509850965094509092509050565b6000546001600160a01b03163314610d415760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b60c88311158015610d53575060c88211155b8015610d60575060c88111155b610dac5760405162461bcd60e51b815260206004820152601060248201527f43616e6e6f7420657863656564203225000000000000000000000000000000006044820152606401610a67565b600061271084610dbb60015490565b610dc591906133ac565b610dcf91906133c3565b9050600061271084610de060015490565b610dea91906133ac565b610df491906133c3565b9050600061271084610e0560015490565b610e0f91906133ac565b610e1991906133c3565b60028490556003839055600481905590506000610e4c612710610e466019610e4060015490565b9061286b565b9061285f565b9050808410158015610e5e5750808310155b8015610e6a5750808210155b610edc5760405162461bcd60e51b815260206004820152603060248201527f4d61782054587320616e64204d61782057616c6c65742063616e6e6f7420626560448201527f206c657373207468616e20302e323525000000000000000000000000000000006064820152608401610a67565b50505050505050565b601f546000819003610ef5575050565b6000805a905060005b8483108015610f0c57508381105b15610fcb578360235410610f205760006023555b610f52601f60235481548110610f3857610f386133fe565b6000918252602090912001546001600160a01b0316612877565b15610f8957610f89601f60235481548110610f6f57610f6f6133fe565b6000918252602090912001546001600160a01b03166128bc565b610f9e610f975a8490612853565b8490612991565b92505a602380549193506000610fb38361342d565b91905055508080610fc39061342d565b915050610efe565b5050505050565b6000546001600160a01b031633146110155760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b600061101f611c3e565b9050600081116110715760405162461bcd60e51b815260206004820152600d60248201527f4e6f2065786365737320455448000000000000000000000000000000000000006044820152606401610a67565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146110be576040519150601f19603f3d011682016040523d82523d6000602084013e6110c3565b606091505b50509050806111145760405162461bcd60e51b815260206004820152600f60248201527f5472616e73666572206661696c656400000000000000000000000000000000006044820152606401610a67565b505050565b6000546001600160a01b0316331461115c5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b60008060025461119660015490565b600254610a16906127106133ac565b6000546001600160a01b031633146111e85760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b6001600160a01b03811661123e5760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f742073657420746f207a65726f20616464726573730000000000006044820152606401610a67565b602780546001600160a01b03908116600090815260076020526040808220805460ff1990811690915584547fffffffffffffffffffffffff0000000000000000000000000000000000000000169386169384179094558282528082208054909416600117909355915190917f1a9ebc3770a8a35e7494c4635aaedfa9f174ae61261b6e3aac36aeffc590cb6491a250565b6000546001600160a01b031633146113125760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b6001600160a01b0381166113685760405162461bcd60e51b815260206004820152601d60248201527f526f757465722063616e6e6f74206265207a65726f20616464726573730000006044820152606401610a67565b600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038316908117909155604080517fc45a0155000000000000000000000000000000000000000000000000000000008152905163c45a0155916004808201926020929091908290030181865afa1580156113f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114169190613465565b6001600160a01b0316636801cc3030600a60009054906101000a90046001600160a01b03166001600160a01b031663f24286216040518163ffffffff1660e01b8152600401602060405180830381865afa158015611478573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149c9190613465565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0392831660048201529116602482015260006044820152606401602060405180830381865afa158015611506573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152a9190613465565b600b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216918217905561172b57600a60009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115dc9190613465565b6001600160a01b03166382dfdce430600a60009054906101000a90046001600160a01b03166001600160a01b031663f24286216040518163ffffffff1660e01b8152600401602060405180830381865afa15801561163e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116629190613465565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152600060448201526064016020604051808303816000875af11580156116ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f29190613465565b600b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555b50600b546001600160a01b03166000908152600860205260409020805460ff19166001179055565b6000546001600160a01b031633146117965760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b6001600160a01b0381166117ec5760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f742073657420746f207a65726f20616464726573730000000000006044820152606401610a67565b602880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517f796efd09cca1be7f9e563aee4eb486953686e519c52d1c38136f5b5050ec317090600090a250565b6000546001600160a01b031633146118915760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b600b546001600160a01b038381169116148015906118bd5750600a546001600160a01b03838116911614155b80156118d257506001600160a01b0382163014155b61191e5760405162461bcd60e51b815260206004820152601260248201527f496e656c696769626c65204164647265737300000000000000000000000000006044820152606401610a67565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b6000546001600160a01b0316331461198c5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b6027546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016020604051808303816000875af11580156119f8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111149190613482565b60056020527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc5461dead60009081527f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba546001549192611a88929091611a829190612853565b90612853565b905090565b6000546001600160a01b03163314611ad05760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b620186a06001546064611ae391906133ac565b611aed91906133c3565b811015611b625760405162461bcd60e51b815260206004820152603260248201527f5468726573686f6c642063616e6e6f74206265206c657373207468616e20302e60448201527f3125206f6620746f74616c20737570706c7900000000000000000000000000006064820152608401610a67565b620186a06001546103e8611b7691906133ac565b611b8091906133c3565b811115611bf55760405162461bcd60e51b815260206004820152602a60248201527f5468726573686f6c642063616e6e6f7420657863656564203125206f6620746f60448201527f74616c20737570706c79000000000000000000000000000000000000000000006064820152608401610a67565b60188190556040518181527f18ff2fc8464635e4f668567019152095047e34d7a2ab4b97661ba4dc7fd06476906020015b60405180910390a150565b60006109ee3384846121ac565b601c54601b5460009147918391611c549161349f565b905081811115611c675760009250505090565b611c71818361349f565b9250505090565b611c81336128bc565b565b6000546001600160a01b03163314611cc65760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b6000611cd0611c3e565b905060008111611d225760405162461bcd60e51b815260206004820152601260248201527f4e6f20756e616c6c6f63617465642045544800000000000000000000000000006044820152606401610a67565b80601b6000828254611d3491906134b2565b9091555050601a54601e54611d4990836133ac565b611d5391906133c3565b601d6000828254611d6491906134b2565b909155505050565b6000546001600160a01b03163314611daf5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b600c889055600d8790556010869055600e859055600f849055601183905560128290556013819055601454611dec90606490610e4690601e61286b565b60115411158015611e195750611e136064610e46601e60145461286b90919063ffffffff16565b60125411155b8015611e415750611e3b6064610e46601e60145461286b90919063ffffffff16565b60135411155b611e8d5760405162461bcd60e51b815260206004820152601660248201527f466565732063616e6e6f742065786365656420333025000000000000000000006044820152606401610a67565b5050505050505050565b600080600354611ea660015490565b600354610a16906127106133ac565b6000546001600160a01b03163314611ef85760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b6001600160a01b0382166000908152600860205260409020805460ff19168215801591909117909155611f3457611f3082600061299d565b5050565b611f3082611f57846001600160a01b031660009081526005602052604090205490565b61299d565b6000546001600160a01b03163314611f9f5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc68616390602001611c26565b6000546001600160a01b031633146120485760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b61205181612aee565b50565b6001600160a01b0383166120cf5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a67565b6001600160a01b03821661214b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610a67565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166122285760405162461bcd60e51b815260206004820152602160248201527f45524332303a207472616e736665722066726f6d207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610a67565b6001600160a01b03821661227e5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a207472616e7366657220746f207a65726f2061646472657373006044820152606401610a67565b600081116122f45760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610a67565b6001600160a01b03831660009081526005602052604090205481111561235c5760405162461bcd60e51b815260206004820152601460248201527f496e73756666696369656e742062616c616e63650000000000000000000000006044820152606401610a67565b6001600160a01b03808416600081815260076020526040808220548685168084529190922054600b5460ff93841695919093169392169081149114831580156123a3575082155b1561254e57600b5474010000000000000000000000000000000000000000900460ff166124125760405162461bcd60e51b815260206004820152601360248201527f54726164696e67206e6f7420616c6c6f776564000000000000000000000000006044820152606401610a67565b8115801561242b57506001600160a01b03861661dead14155b156124a5576004546001600160a01b0387166000908152600560205260409020546124579087906134b2565b11156124a55760405162461bcd60e51b815260206004820152601260248201527f45786365656473206d61782077616c6c657400000000000000000000000000006044820152606401610a67565b6002548511156124f75760405162461bcd60e51b815260206004820152601560248201527f45786365656473206d617820747820616d6f756e7400000000000000000000006044820152606401610a67565b8061254e5760035485111561254e5760405162461bcd60e51b815260206004820152601760248201527f45786365656473206d61782073656c6c20616d6f756e740000000000000000006044820152606401610a67565b818015612559575083155b15612574576016805490600061256e8361342d565b91905055505b3060009081526005602052604081205460175490919060ff1615801561259c575060155460ff165b80156125c25750600b5474010000000000000000000000000000000000000000900460ff165b80156125cc575085155b80156125d55750835b80156125e45750600260165410155b80156125f257506019548710155b801561260057506018548210155b9050801561261957612613601854612aee565b60006016555b6001600160a01b0389166000908152600560205260408120805489929061264190849061349f565b909155506000905086806126525750855b612666576126618a8a8a612c73565b612668565b875b6001600160a01b038a166000908152600560205260408120805492935083929091906126959084906134b2565b92505081905550886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516126e191815260200190565b60405180910390a36001600160a01b03808b1660009081526008602052604080822054928c16825290205460ff91821615911615818061271e5750805b156127fc5781801561272f57508b3b155b1561278f5786801561273e5750835b156127515761274c8c6128bc565b61276b565b8615801561275d575085155b1561276b5761276b8c6128bc565b6001600160a01b038c1660009081526005602052604090205461278f908d9061299d565b80801561279b57508a3b155b156127fc5785156127b4576127af8b6128bc565b6127d8565b861580156127c0575083155b80156127ca575085155b156127d8576127d88b6128bc565b6001600160a01b038b166000908152600560205260409020546127fc908c9061299d565b505050505050505050505050565b6000818484111561282e5760405162461bcd60e51b8152600401610a679190613163565b505050900390565b60006109f2601e54610e46601d548561286b90919063ffffffff16565b6000610ae1828461349f565b6000610ae182846133c3565b6000610ae182846133ac565b6024546001600160a01b038216600090815260216020526040812054909142916128a191906134b2565b1080156109f257506025546128b583610ae8565b1192915050565b6001600160a01b0381166000908152602260205260408120906128de83610ae8565b825490915015806128ed575080155b156128f757505050565b80601c600082825461290991906134b2565b90915550506040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015612944573d6000803e3d6000fd5b506001600160a01b03831660009081526021602052604081204290556002830180548392906129749084906134b2565b9091555050815461298490612836565b8260010181905550505050565b6000610ae182846134b2565b6000811180156129c357506001600160a01b038216600090815260226020526040902054155b15612a4057601f80546001600160a01b03841660008181526020805260408120839055600183018455929092527fa03837a25210ee280c2113ff4b77ca23440b19d4866cca721c801278fd08d8070180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055612a73565b80158015612a6557506001600160a01b03821660009081526022602052604090205415155b15612a7357612a7382612d61565b6001600160a01b038216600090815260226020526040902054601a54612aa4918391612a9e91612853565b90612991565b601a556001600160a01b0382166000908152602260205260409020819055612acb81612836565b6001600160a01b0390921660009081526022602052604090206001019190915550565b6017805460ff19166001179055600e54600f54600d5460009291612b11916134b2565b612b1b91906134b2565b905047612b2783612ebf565b6000612b33824761349f565b9050837f1d72f49919518f8b57f1506c1a9806f26a34269df52a1fd96dbe70994398f0a182604051612b6791815260200190565b60405180910390a26000612b7b84836133c3565b90506000600e5482612b8d91906133ac565b90508015612b9e57612b9e8161308b565b6000600d5483612bae91906133ac565b90508015612bf2576027546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015612bf0573d6000803e3d6000fd5b505b6000612bfe82846134b2565b90506000818611612c10576000612c1a565b612c1a828761349f565b90508015612c5e576028546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015612c5c573d6000803e3d6000fd5b505b50506017805460ff1916905550505050505050565b600080612c8085856130c2565b1115612d5a576000612ca3612c9586866130c2565b601454610e4090869061285f565b30600090815260056020526040902054909150612cc09082612991565b30600081815260056020526040908190209290925590516001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612d119085815260200190565b60405180910390a360105415612d4857612d483061dead612d43601054610e406014548961285f90919063ffffffff16565b6121ac565b612d528382612853565b915050610ae1565b5092915050565b601f8054612d719060019061349f565b81548110612d8157612d816133fe565b60009182526020808320909101546001600160a01b038481168452918052604090922054601f80549290931692918110612dbd57612dbd6133fe565b600091825260208083209190910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0394851617905591831681528180526040812054601f805491939291612e1e9060019061349f565b81548110612e2e57612e2e6133fe565b60009182526020808320909101546001600160a01b03168352820192909252604001902055601f805480612e6457612e646134c5565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905501905550565b604080516001808252818301909252600091816020015b60408051606081018252600080825260208083018290529282015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181612ed657505060408051606081018252308152600a5482517ff2428621000000000000000000000000000000000000000000000000000000008152925193945090926020808501936001600160a01b039093169263f242862192600480830193928290030181865afa158015612f94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fb89190613465565b6001600160a01b031681526020016000151581525081600081518110612fe057612fe06133fe565b6020908102919091010152600a546130039030906001600160a01b031684612054565b600a546040517f7af728c80000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690637af728c8906130559085906000908690309042906004016134f4565b600060405180830381600087803b15801561306f57600080fd5b505af1158015613083573d6000803e3d6000fd5b505050505050565b601b546130989082612991565b601b55601a54601e546130bc916130b391610e46908561286b565b601d5490612991565b601d5550565b6001600160a01b03821660009081526009602052604081205460ff168061310157506001600160a01b03821660009081526009602052604090205460ff165b1561311b57601454613114906064612853565b90506109f2565b600b546001600160a01b039081169083160361313a57506012546109f2565b600b546001600160a01b039081169084160361315957506011546109f2565b5060135492915050565b602081526000825180602084015260005b818110156131915760208186018101516040868401015201613174565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b6001600160a01b038116811461205157600080fd5b600080604083850312156131f757600080fd5b8235613202816131cf565b946020939093013593505050565b60008060006060848603121561322557600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561325157600080fd5b833561325c816131cf565b9250602084013561326c816131cf565b929592945050506040919091013590565b60006020828403121561328f57600080fd5b8135610ae1816131cf565b6000602082840312156132ac57600080fd5b5035919050565b801515811461205157600080fd5b600080604083850312156132d457600080fd5b82356132df816131cf565b915060208301356132ef816132b3565b809150509250929050565b6000806040838503121561330d57600080fd5b8235613318816131cf565b915060208301356132ef816131cf565b600080600080600080600080610100898b03121561334557600080fd5b505086359860208801359850604088013597606081013597506080810135965060a0810135955060c0810135945060e0013592509050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176109f2576109f261337d565b6000826133f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361345e5761345e61337d565b5060010190565b60006020828403121561347757600080fd5b8151610ae1816131cf565b60006020828403121561349457600080fd5b8151610ae1816132b3565b818103818111156109f2576109f261337d565b808201808211156109f2576109f261337d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600060a0820187835286602084015260a0604084015280865180835260c08501915060208801925060005b8181101561356d5783516001600160a01b0381511684526001600160a01b0360208201511660208501526040810151151560408501525060608301925060208401935060018101905061351f565b50506001600160a01b038616606085015291506135879050565b826080830152969550505050505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212208e1ad9f6189a6df8b40fa5c06b8bd76f72a13c60c918b1438f0e7831b3a1e14e64736f6c634300081a0033

Deployed Bytecode

0x60806040526004361061030c5760003560e01c80638187f5161161019a578063c942435d116100e1578063e63d2d5b1161008a578063f2fde38b11610064578063f2fde38b1461098b578063f8e5884b146109ab578063ffd49c84146109cb57600080fd5b8063e63d2d5b14610940578063ef43b02b14610955578063efca2eed1461097557600080fd5b8063d84b440a116100bb578063d84b440a146108c5578063dd62ed3e146108da578063e2d6f94c1461092057600080fd5b8063c942435d14610820578063ca89b89914610835578063ce7c2ac21461086e57600080fd5b806395d89b4111610143578063a8aa1b311161011d578063a8aa1b31146107cb578063a9059cbb146107eb578063ad77bd141461080b57600080fd5b806395d89b411461074f578063997664d7146107955780639d0014b1146107ab57600080fd5b80638c41180e116101745780638c41180e146106fa5780638cd4426d1461071a5780639358928b1461073a57600080fd5b80638187f5161461068857806382d1097d146106a8578063893d20e8146106c857600080fd5b806334c5d2ce1161025e57806348ff2b8b116102075780636d8b0527116101e15780636d8b05271461061d57806370a082311461063257806375b625321461066857600080fd5b806348ff2b8b146105d15780634fab0ae8146105f157806360e719621461060757600080fd5b80633f89797e116102385780633f89797e146105615780634355855a1461058157806344e56680146105b157600080fd5b806334c5d2ce146104fb5780633a98ef391461051b5780633f4218e01461053157600080fd5b806323b872dd116102c05780632f54bf6e1161029a5780632f54bf6e1461046057806330b2bab91461048f578063313ce567146104df57600080fd5b806323b872dd1461040b57806328fd31981461042b578063293230b81461044b57600080fd5b806309c95a1b116102f157806309c95a1b146103a05780630ca61cb1146103ca57806318160ddd146103ec57600080fd5b806306fdde0314610318578063095ea7b31461037057600080fd5b3661031357005b600080fd5b34801561032457600080fd5b5060408051808201909152600d81527f42616e6b204f66204c696e65610000000000000000000000000000000000000060208201525b6040516103679190613163565b60405180910390f35b34801561037c57600080fd5b5061039061038b3660046131e4565b6109e1565b6040519015158152602001610367565b3480156103ac57600080fd5b506103b56109f8565b60408051928352602083019190915201610367565b3480156103d657600080fd5b506103ea6103e5366004613210565b610a28565b005b3480156103f857600080fd5b506001545b604051908152602001610367565b34801561041757600080fd5b5061039061042636600461323c565b610a7e565b34801561043757600080fd5b506103fd61044636600461327d565b610ae8565b34801561045757600080fd5b506103ea610b73565b34801561046c57600080fd5b5061039061047b36600461327d565b6000546001600160a01b0391821691161490565b34801561049b57600080fd5b506104a4610c62565b604080519889526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610367565b3480156104eb57600080fd5b5060405160128152602001610367565b34801561050757600080fd5b506103ea610516366004613210565b610cfe565b34801561052757600080fd5b506103fd601a5481565b34801561053d57600080fd5b5061039061054c36600461327d565b60076020526000908152604090205460ff1681565b34801561056d57600080fd5b506103ea61057c36600461329a565b610ee5565b34801561058d57600080fd5b5061039061059c36600461327d565b60086020526000908152604090205460ff1681565b3480156105bd57600080fd5b506103ea6105cc36600461327d565b610fd2565b3480156105dd57600080fd5b506103ea6105ec3660046132c1565b611119565b3480156105fd57600080fd5b506103fd60255481565b34801561061357600080fd5b506103fd60265481565b34801561062957600080fd5b506103b5611187565b34801561063e57600080fd5b506103fd61064d36600461327d565b6001600160a01b031660009081526005602052604090205490565b34801561067457600080fd5b506103ea61068336600461327d565b6111a5565b34801561069457600080fd5b506103ea6106a336600461327d565b6112cf565b3480156106b457600080fd5b506103ea6106c336600461327d565b611753565b3480156106d457600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610367565b34801561070657600080fd5b506103ea6107153660046132c1565b61184e565b34801561072657600080fd5b506103ea6107353660046131e4565b611949565b34801561074657600080fd5b506103fd611a1c565b34801561075b57600080fd5b5060408051808201909152600381527f424f4c0000000000000000000000000000000000000000000000000000000000602082015261035a565b3480156107a157600080fd5b506103fd601b5481565b3480156107b757600080fd5b506103ea6107c636600461329a565b611a8d565b3480156107d757600080fd5b50600b546106e2906001600160a01b031681565b3480156107f757600080fd5b506103906108063660046131e4565b611c31565b34801561081757600080fd5b506103fd611c3e565b34801561082c57600080fd5b506103ea611c78565b34801561084157600080fd5b506103fd61085036600461327d565b6001600160a01b031660009081526022602052604090206002015490565b34801561087a57600080fd5b506108aa61088936600461327d565b60226020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610367565b3480156108d157600080fd5b506103ea611c83565b3480156108e657600080fd5b506103fd6108f53660046132fa565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b34801561092c57600080fd5b506103ea61093b366004613328565b611d6c565b34801561094c57600080fd5b506103b5611e97565b34801561096157600080fd5b506103ea6109703660046132c1565b611eb5565b34801561098157600080fd5b506103fd601c5481565b34801561099757600080fd5b506103ea6109a636600461327d565b611f5c565b3480156109b757600080fd5b506103ea6109c636600461329a565b612005565b3480156109d757600080fd5b506103fd60245481565b60006109ee338484612054565b5060015b92915050565b600080600454610a0760015490565b600454610a16906127106133ac565b610a2091906133c3565b915091509091565b6000546001600160a01b03163314610a705760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b60448201526064015b60405180910390fd5b602492909255602555602655565b6000610a8b8484846121ac565b610add8433610ad885604051806060016040528060288152602001613598602891396001600160a01b038a166000908152600660209081526040808320338452909152902054919061280a565b612054565b5060015b9392505050565b6001600160a01b0381166000908152602260205260408120548103610b0f57506000919050565b6001600160a01b038216600090815260226020526040812054610b3190612836565b6001600160a01b038416600090815260226020526040902060010154909150808211610b61575060009392505050565b610b6b8282612853565b949350505050565b6000546001600160a01b03163314610bb65760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b600b5474010000000000000000000000000000000000000000900460ff1615610c215760405162461bcd60e51b815260206004820152601760248201527f74726164696e6720697320616c7265616479206f70656e0000000000000000006044820152606401610a67565b600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055565b600080600080600080600080610c846064600c5461285f90919063ffffffff16565b600d54610c9290606461285f565b601054610ca090606461285f565b600e54610cae90606461285f565b600f54610cbc90606461285f565b601154610cca90606461285f565b601254610cd890606461285f565b601354610ce690606461285f565b969f959e50939c50919a509850965094509092509050565b6000546001600160a01b03163314610d415760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b60c88311158015610d53575060c88211155b8015610d60575060c88111155b610dac5760405162461bcd60e51b815260206004820152601060248201527f43616e6e6f7420657863656564203225000000000000000000000000000000006044820152606401610a67565b600061271084610dbb60015490565b610dc591906133ac565b610dcf91906133c3565b9050600061271084610de060015490565b610dea91906133ac565b610df491906133c3565b9050600061271084610e0560015490565b610e0f91906133ac565b610e1991906133c3565b60028490556003839055600481905590506000610e4c612710610e466019610e4060015490565b9061286b565b9061285f565b9050808410158015610e5e5750808310155b8015610e6a5750808210155b610edc5760405162461bcd60e51b815260206004820152603060248201527f4d61782054587320616e64204d61782057616c6c65742063616e6e6f7420626560448201527f206c657373207468616e20302e323525000000000000000000000000000000006064820152608401610a67565b50505050505050565b601f546000819003610ef5575050565b6000805a905060005b8483108015610f0c57508381105b15610fcb578360235410610f205760006023555b610f52601f60235481548110610f3857610f386133fe565b6000918252602090912001546001600160a01b0316612877565b15610f8957610f89601f60235481548110610f6f57610f6f6133fe565b6000918252602090912001546001600160a01b03166128bc565b610f9e610f975a8490612853565b8490612991565b92505a602380549193506000610fb38361342d565b91905055508080610fc39061342d565b915050610efe565b5050505050565b6000546001600160a01b031633146110155760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b600061101f611c3e565b9050600081116110715760405162461bcd60e51b815260206004820152600d60248201527f4e6f2065786365737320455448000000000000000000000000000000000000006044820152606401610a67565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146110be576040519150601f19603f3d011682016040523d82523d6000602084013e6110c3565b606091505b50509050806111145760405162461bcd60e51b815260206004820152600f60248201527f5472616e73666572206661696c656400000000000000000000000000000000006044820152606401610a67565b505050565b6000546001600160a01b0316331461115c5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b60008060025461119660015490565b600254610a16906127106133ac565b6000546001600160a01b031633146111e85760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b6001600160a01b03811661123e5760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f742073657420746f207a65726f20616464726573730000000000006044820152606401610a67565b602780546001600160a01b03908116600090815260076020526040808220805460ff1990811690915584547fffffffffffffffffffffffff0000000000000000000000000000000000000000169386169384179094558282528082208054909416600117909355915190917f1a9ebc3770a8a35e7494c4635aaedfa9f174ae61261b6e3aac36aeffc590cb6491a250565b6000546001600160a01b031633146113125760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b6001600160a01b0381166113685760405162461bcd60e51b815260206004820152601d60248201527f526f757465722063616e6e6f74206265207a65726f20616464726573730000006044820152606401610a67565b600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038316908117909155604080517fc45a0155000000000000000000000000000000000000000000000000000000008152905163c45a0155916004808201926020929091908290030181865afa1580156113f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114169190613465565b6001600160a01b0316636801cc3030600a60009054906101000a90046001600160a01b03166001600160a01b031663f24286216040518163ffffffff1660e01b8152600401602060405180830381865afa158015611478573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149c9190613465565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0392831660048201529116602482015260006044820152606401602060405180830381865afa158015611506573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152a9190613465565b600b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216918217905561172b57600a60009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115dc9190613465565b6001600160a01b03166382dfdce430600a60009054906101000a90046001600160a01b03166001600160a01b031663f24286216040518163ffffffff1660e01b8152600401602060405180830381865afa15801561163e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116629190613465565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152600060448201526064016020604051808303816000875af11580156116ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116f29190613465565b600b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555b50600b546001600160a01b03166000908152600860205260409020805460ff19166001179055565b6000546001600160a01b031633146117965760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b6001600160a01b0381166117ec5760405162461bcd60e51b815260206004820152601a60248201527f43616e6e6f742073657420746f207a65726f20616464726573730000000000006044820152606401610a67565b602880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040517f796efd09cca1be7f9e563aee4eb486953686e519c52d1c38136f5b5050ec317090600090a250565b6000546001600160a01b031633146118915760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b600b546001600160a01b038381169116148015906118bd5750600a546001600160a01b03838116911614155b80156118d257506001600160a01b0382163014155b61191e5760405162461bcd60e51b815260206004820152601260248201527f496e656c696769626c65204164647265737300000000000000000000000000006044820152606401610a67565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b6000546001600160a01b0316331461198c5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b6027546040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152602481018390529083169063a9059cbb906044016020604051808303816000875af11580156119f8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111149190613482565b60056020527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc5461dead60009081527f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba546001549192611a88929091611a829190612853565b90612853565b905090565b6000546001600160a01b03163314611ad05760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b620186a06001546064611ae391906133ac565b611aed91906133c3565b811015611b625760405162461bcd60e51b815260206004820152603260248201527f5468726573686f6c642063616e6e6f74206265206c657373207468616e20302e60448201527f3125206f6620746f74616c20737570706c7900000000000000000000000000006064820152608401610a67565b620186a06001546103e8611b7691906133ac565b611b8091906133c3565b811115611bf55760405162461bcd60e51b815260206004820152602a60248201527f5468726573686f6c642063616e6e6f7420657863656564203125206f6620746f60448201527f74616c20737570706c79000000000000000000000000000000000000000000006064820152608401610a67565b60188190556040518181527f18ff2fc8464635e4f668567019152095047e34d7a2ab4b97661ba4dc7fd06476906020015b60405180910390a150565b60006109ee3384846121ac565b601c54601b5460009147918391611c549161349f565b905081811115611c675760009250505090565b611c71818361349f565b9250505090565b611c81336128bc565b565b6000546001600160a01b03163314611cc65760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b6000611cd0611c3e565b905060008111611d225760405162461bcd60e51b815260206004820152601260248201527f4e6f20756e616c6c6f63617465642045544800000000000000000000000000006044820152606401610a67565b80601b6000828254611d3491906134b2565b9091555050601a54601e54611d4990836133ac565b611d5391906133c3565b601d6000828254611d6491906134b2565b909155505050565b6000546001600160a01b03163314611daf5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b600c889055600d8790556010869055600e859055600f849055601183905560128290556013819055601454611dec90606490610e4690601e61286b565b60115411158015611e195750611e136064610e46601e60145461286b90919063ffffffff16565b60125411155b8015611e415750611e3b6064610e46601e60145461286b90919063ffffffff16565b60135411155b611e8d5760405162461bcd60e51b815260206004820152601660248201527f466565732063616e6e6f742065786365656420333025000000000000000000006044820152606401610a67565b5050505050505050565b600080600354611ea660015490565b600354610a16906127106133ac565b6000546001600160a01b03163314611ef85760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b6001600160a01b0382166000908152600860205260409020805460ff19168215801591909117909155611f3457611f3082600061299d565b5050565b611f3082611f57846001600160a01b031660009081526005602052604090205490565b61299d565b6000546001600160a01b03163314611f9f5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc68616390602001611c26565b6000546001600160a01b031633146120485760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610a67565b61205181612aee565b50565b6001600160a01b0383166120cf5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610a67565b6001600160a01b03821661214b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610a67565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166122285760405162461bcd60e51b815260206004820152602160248201527f45524332303a207472616e736665722066726f6d207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610a67565b6001600160a01b03821661227e5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a207472616e7366657220746f207a65726f2061646472657373006044820152606401610a67565b600081116122f45760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610a67565b6001600160a01b03831660009081526005602052604090205481111561235c5760405162461bcd60e51b815260206004820152601460248201527f496e73756666696369656e742062616c616e63650000000000000000000000006044820152606401610a67565b6001600160a01b03808416600081815260076020526040808220548685168084529190922054600b5460ff93841695919093169392169081149114831580156123a3575082155b1561254e57600b5474010000000000000000000000000000000000000000900460ff166124125760405162461bcd60e51b815260206004820152601360248201527f54726164696e67206e6f7420616c6c6f776564000000000000000000000000006044820152606401610a67565b8115801561242b57506001600160a01b03861661dead14155b156124a5576004546001600160a01b0387166000908152600560205260409020546124579087906134b2565b11156124a55760405162461bcd60e51b815260206004820152601260248201527f45786365656473206d61782077616c6c657400000000000000000000000000006044820152606401610a67565b6002548511156124f75760405162461bcd60e51b815260206004820152601560248201527f45786365656473206d617820747820616d6f756e7400000000000000000000006044820152606401610a67565b8061254e5760035485111561254e5760405162461bcd60e51b815260206004820152601760248201527f45786365656473206d61782073656c6c20616d6f756e740000000000000000006044820152606401610a67565b818015612559575083155b15612574576016805490600061256e8361342d565b91905055505b3060009081526005602052604081205460175490919060ff1615801561259c575060155460ff165b80156125c25750600b5474010000000000000000000000000000000000000000900460ff165b80156125cc575085155b80156125d55750835b80156125e45750600260165410155b80156125f257506019548710155b801561260057506018548210155b9050801561261957612613601854612aee565b60006016555b6001600160a01b0389166000908152600560205260408120805489929061264190849061349f565b909155506000905086806126525750855b612666576126618a8a8a612c73565b612668565b875b6001600160a01b038a166000908152600560205260408120805492935083929091906126959084906134b2565b92505081905550886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516126e191815260200190565b60405180910390a36001600160a01b03808b1660009081526008602052604080822054928c16825290205460ff91821615911615818061271e5750805b156127fc5781801561272f57508b3b155b1561278f5786801561273e5750835b156127515761274c8c6128bc565b61276b565b8615801561275d575085155b1561276b5761276b8c6128bc565b6001600160a01b038c1660009081526005602052604090205461278f908d9061299d565b80801561279b57508a3b155b156127fc5785156127b4576127af8b6128bc565b6127d8565b861580156127c0575083155b80156127ca575085155b156127d8576127d88b6128bc565b6001600160a01b038b166000908152600560205260409020546127fc908c9061299d565b505050505050505050505050565b6000818484111561282e5760405162461bcd60e51b8152600401610a679190613163565b505050900390565b60006109f2601e54610e46601d548561286b90919063ffffffff16565b6000610ae1828461349f565b6000610ae182846133c3565b6000610ae182846133ac565b6024546001600160a01b038216600090815260216020526040812054909142916128a191906134b2565b1080156109f257506025546128b583610ae8565b1192915050565b6001600160a01b0381166000908152602260205260408120906128de83610ae8565b825490915015806128ed575080155b156128f757505050565b80601c600082825461290991906134b2565b90915550506040516001600160a01b0384169082156108fc029083906000818181858888f19350505050158015612944573d6000803e3d6000fd5b506001600160a01b03831660009081526021602052604081204290556002830180548392906129749084906134b2565b9091555050815461298490612836565b8260010181905550505050565b6000610ae182846134b2565b6000811180156129c357506001600160a01b038216600090815260226020526040902054155b15612a4057601f80546001600160a01b03841660008181526020805260408120839055600183018455929092527fa03837a25210ee280c2113ff4b77ca23440b19d4866cca721c801278fd08d8070180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055612a73565b80158015612a6557506001600160a01b03821660009081526022602052604090205415155b15612a7357612a7382612d61565b6001600160a01b038216600090815260226020526040902054601a54612aa4918391612a9e91612853565b90612991565b601a556001600160a01b0382166000908152602260205260409020819055612acb81612836565b6001600160a01b0390921660009081526022602052604090206001019190915550565b6017805460ff19166001179055600e54600f54600d5460009291612b11916134b2565b612b1b91906134b2565b905047612b2783612ebf565b6000612b33824761349f565b9050837f1d72f49919518f8b57f1506c1a9806f26a34269df52a1fd96dbe70994398f0a182604051612b6791815260200190565b60405180910390a26000612b7b84836133c3565b90506000600e5482612b8d91906133ac565b90508015612b9e57612b9e8161308b565b6000600d5483612bae91906133ac565b90508015612bf2576027546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015612bf0573d6000803e3d6000fd5b505b6000612bfe82846134b2565b90506000818611612c10576000612c1a565b612c1a828761349f565b90508015612c5e576028546040516001600160a01b039091169082156108fc029083906000818181858888f19350505050158015612c5c573d6000803e3d6000fd5b505b50506017805460ff1916905550505050505050565b600080612c8085856130c2565b1115612d5a576000612ca3612c9586866130c2565b601454610e4090869061285f565b30600090815260056020526040902054909150612cc09082612991565b30600081815260056020526040908190209290925590516001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612d119085815260200190565b60405180910390a360105415612d4857612d483061dead612d43601054610e406014548961285f90919063ffffffff16565b6121ac565b612d528382612853565b915050610ae1565b5092915050565b601f8054612d719060019061349f565b81548110612d8157612d816133fe565b60009182526020808320909101546001600160a01b038481168452918052604090922054601f80549290931692918110612dbd57612dbd6133fe565b600091825260208083209190910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0394851617905591831681528180526040812054601f805491939291612e1e9060019061349f565b81548110612e2e57612e2e6133fe565b60009182526020808320909101546001600160a01b03168352820192909252604001902055601f805480612e6457612e646134c5565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905501905550565b604080516001808252818301909252600091816020015b60408051606081018252600080825260208083018290529282015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181612ed657505060408051606081018252308152600a5482517ff2428621000000000000000000000000000000000000000000000000000000008152925193945090926020808501936001600160a01b039093169263f242862192600480830193928290030181865afa158015612f94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fb89190613465565b6001600160a01b031681526020016000151581525081600081518110612fe057612fe06133fe565b6020908102919091010152600a546130039030906001600160a01b031684612054565b600a546040517f7af728c80000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690637af728c8906130559085906000908690309042906004016134f4565b600060405180830381600087803b15801561306f57600080fd5b505af1158015613083573d6000803e3d6000fd5b505050505050565b601b546130989082612991565b601b55601a54601e546130bc916130b391610e46908561286b565b601d5490612991565b601d5550565b6001600160a01b03821660009081526009602052604081205460ff168061310157506001600160a01b03821660009081526009602052604090205460ff165b1561311b57601454613114906064612853565b90506109f2565b600b546001600160a01b039081169083160361313a57506012546109f2565b600b546001600160a01b039081169084160361315957506011546109f2565b5060135492915050565b602081526000825180602084015260005b818110156131915760208186018101516040868401015201613174565b5060006040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b6001600160a01b038116811461205157600080fd5b600080604083850312156131f757600080fd5b8235613202816131cf565b946020939093013593505050565b60008060006060848603121561322557600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561325157600080fd5b833561325c816131cf565b9250602084013561326c816131cf565b929592945050506040919091013590565b60006020828403121561328f57600080fd5b8135610ae1816131cf565b6000602082840312156132ac57600080fd5b5035919050565b801515811461205157600080fd5b600080604083850312156132d457600080fd5b82356132df816131cf565b915060208301356132ef816132b3565b809150509250929050565b6000806040838503121561330d57600080fd5b8235613318816131cf565b915060208301356132ef816131cf565b600080600080600080600080610100898b03121561334557600080fd5b505086359860208801359850604088013597606081013597506080810135965060a0810135955060c0810135945060e0013592509050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820281158282048414176109f2576109f261337d565b6000826133f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361345e5761345e61337d565b5060010190565b60006020828403121561347757600080fd5b8151610ae1816131cf565b60006020828403121561349457600080fd5b8151610ae1816132b3565b818103818111156109f2576109f261337d565b808201808211156109f2576109f261337d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600060a0820187835286602084015260a0604084015280865180835260c08501915060208801925060005b8181101561356d5783516001600160a01b0381511684526001600160a01b0360208201511660208501526040810151151560408501525060608301925060208401935060018101905061351f565b50506001600160a01b038616606085015291506135879050565b826080830152969550505050505056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365a26469706673582212208e1ad9f6189a6df8b40fa5c06b8bd76f72a13c60c918b1438f0e7831b3a1e14e64736f6c634300081a0033

Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.