ETH Price: $2,499.11 (-2.03%)

Contract

0xA6D84dce85c457d28A971f858967002BFDe74c1c
 

Overview

ETH Balance

3 ETH

Eth Value

$7,497.32 (@ $2,499.11/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve207232962024-09-10 22:49:1144 days ago1726008551IN
0xA6D84dce...BFDe74c1c
0 ETH0.000172785.91980223
Approve201140802024-06-17 21:06:35129 days ago1718658395IN
0xA6D84dce...BFDe74c1c
0 ETH0.000121455
Approve185527472023-11-12 2:06:35348 days ago1699754795IN
0xA6D84dce...BFDe74c1c
0 ETH0.0004372318
Approve150405302022-06-28 16:15:31849 days ago1656432931IN
0xA6D84dce...BFDe74c1c
0 ETH0.0017733673.00510023
Approve132138812021-09-12 23:15:391138 days ago1631488539IN
0xA6D84dce...BFDe74c1c
0 ETH0.0015003561.7659415
Unlock LP122395692021-04-14 17:33:371289 days ago1618421617IN
0xA6D84dce...BFDe74c1c
0 ETH0.0077446178
Set Uni Pair122395642021-04-14 17:32:491289 days ago1618421569IN
0xA6D84dce...BFDe74c1c
0 ETH0.00729312213
Approve122183042021-04-11 11:18:211292 days ago1618139901IN
0xA6D84dce...BFDe74c1c
0 ETH0.0010036769.00000145
Transfer120602282021-03-18 3:36:081317 days ago1616038568IN
0xA6D84dce...BFDe74c1c
0 ETH0.057681170
Approve116033192021-01-06 20:46:061387 days ago1609965966IN
0xA6D84dce...BFDe74c1c
0 ETH0.00247282170
Transfer115921592021-01-05 3:54:371389 days ago1609818877IN
0xA6D84dce...BFDe74c1c
0 ETH0.02517666204
Include Account115921542021-01-05 3:53:361389 days ago1609818816IN
0xA6D84dce...BFDe74c1c
0 ETH0.00575201201
Burn115920542021-01-05 3:32:401389 days ago1609817560IN
0xA6D84dce...BFDe74c1c
0 ETH0.00783574220
Transfer115920462021-01-05 3:27:581389 days ago1609817278IN
0xA6D84dce...BFDe74c1c
0 ETH0.02299203189
Transfer115920362021-01-05 3:25:551389 days ago1609817155IN
0xA6D84dce...BFDe74c1c
0 ETH0.0256256
Transfer115920322021-01-05 3:25:111389 days ago1609817111IN
0xA6D84dce...BFDe74c1c
0 ETH0.02290245183
Transfer115920272021-01-05 3:23:431389 days ago1609817023IN
0xA6D84dce...BFDe74c1c
0 ETH0.0109109
Approve115807412021-01-03 9:41:591390 days ago1609666919IN
0xA6D84dce...BFDe74c1c
0 ETH0.0044199100
Approve115707872021-01-01 21:04:241392 days ago1609535064IN
0xA6D84dce...BFDe74c1c
0 ETH0.0011966641
Approve115707792021-01-01 21:03:171392 days ago1609534997IN
0xA6D84dce...BFDe74c1c
0 ETH0.0018116641
Approve115693952021-01-01 15:54:421392 days ago1609516482IN
0xA6D84dce...BFDe74c1c
0 ETH0.0029649467.10000023
Approve115624682020-12-31 14:24:141393 days ago1609424654IN
0xA6D84dce...BFDe74c1c
0 ETH0.0035791481
Transfer115496432020-12-29 15:04:461395 days ago1609254286IN
0xA6D84dce...BFDe74c1c
0 ETH0.04867643134
Approve115440702020-12-28 18:33:541396 days ago1609180434IN
0xA6D84dce...BFDe74c1c
0 ETH0.0030497369
Approve115440332020-12-28 18:26:351396 days ago1609179995IN
0xA6D84dce...BFDe74c1c
0 ETH0.00534807121
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SyntLayer

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion
File 1 of 14 : SyntLayerToken.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.8;
//Import abstractions
import { IUniswapV2Router02, IBalancer, IFreeFromUpTo, Ownable , SafeMath } from './abstractions/Balancer.sol';
import { REFLECTBase } from './abstractions/ReflectToken.sol';
import './libraries/TransferHelper.sol';
//Import uniswap interfaces
import './interfaces/IUniswapFactory.sol';
import './interfaces/IUniswapV2Pair.sol';

contract SyntLayer is REFLECTBase {
    using SafeMath for uint256;

    event Rebalance(uint256 tokenBurnt);
    event RewardLiquidityProviders(uint256 liquidityRewards);

    address public uniswapV2Router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    address public uniswapV2Pair = address(0);
    address payable public treasury;

    mapping(address => bool) public unlockedAddr;

    IUniswapV2Router02 router = IUniswapV2Router02(uniswapV2Router);
    IUniswapV2Pair iuniswapV2Pair = IUniswapV2Pair(uniswapV2Pair);
    IFreeFromUpTo public constant chi = IFreeFromUpTo(0x0000000000004946c0e9F43F4Dee607b0eF1fA1c);

    uint256 public minRebalanceAmount;
    uint256 public lastRebalance;
    uint256 public rebalanceInterval;
    uint256 public liqAddBalance = 0;

    uint256 constant INFINITE_ALLOWANCE = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff;


    uint256 public lpUnlocked;
    bool public locked;
    //Use CHI to save on gas on rebalance
    bool public useCHI = false;
    bool approved = false;
    bool doAddLiq = true;

    /// @notice Liq Add Cut fee at 1% initially
    uint256 public LIQFEE = 100;
    /// @notice LiqLock is set at 0.2%
    uint256 public LIQLOCK = 20;
    /// @notice Rebalance amount is 2.5%
    uint256 public REBALCUT = 250;
    /// @notice Caller cut is at 2%
    uint256 public CALLCUT = 200;
    /// @notice Fee BASE
    uint256 constant public BASE = 10000;

    IBalancer balancer;

    modifier discountCHI {
        uint256 gasStart = gasleft();
        _;
        uint256 gasSpent = 21000 + gasStart - gasleft() + 16 *
                           msg.data.length;
        if(useCHI){
            if(chi.balanceOf(address(this)) > 0) {
                chi.freeFromUpTo(address(this), (gasSpent + 14154) / 41947);
            }
            else {
                chi.freeFromUpTo(msg.sender, (gasSpent + 14154) / 41947);
            }
        }
    }

    constructor(address balancerAddr) public {
        lastRebalance = block.timestamp;
        rebalanceInterval = 1 seconds;
        lpUnlocked = block.timestamp + 90 days;
        minRebalanceAmount = 20 ether;
        treasury = msg.sender;
        balancer = IBalancer(balancerAddr);
        locked = true;
        unlockedAddr[msg.sender] = true;
        unlockedAddr[balancerAddr] = true;
        isFeeless[address(this)] = true;
        isFeeless[balancerAddr] = true;
        isFeeless[msg.sender] = true;
    }

    function setBalancer(address newBalancer) public onlyOwner {
        balancer = IBalancer(newBalancer);
        isFeeless[newBalancer] = true;
        unlockedAddr[newBalancer] = true;
    }

    /* Fee getters */
    function getLiqAddBudget(uint256 amount) public view returns (uint256) {
        return amount.mul(LIQFEE).div(BASE);
    }

    function getLiqLockBudget(uint256 amount) public view returns (uint256) {
        return amount.mul(LIQLOCK).div(BASE);
    }


    function getRebalanceCut(uint256 amount) public view returns (uint256) {
        return amount.mul(REBALCUT).div(BASE);
    }

    function getCallerCut(uint256 amount) public view returns (uint256) {
        return amount.mul(CALLCUT).div(BASE);
    }

    function transferOwnership(address newOwner) public override onlyOwner {
        //First remove feelet set for current owner
        toggleFeeless(owner());
        //Remove unlock flag for current owner
        toggleUnlockable(owner());
        //Add feeless for new owner
        toggleFeeless(newOwner);
        //Add unlocked for new owner
        toggleUnlockable(newOwner);
        //Transfer ownersip
        super.transferOwnership(newOwner);
    }

    // transfer function with liq add and liq rewards
    function _transfer(address from, address to, uint256 amount) internal override  {
        // calculate liquidity lock amount
        // dont transfer burn from this contract
        // or can never lock full lockable amount
        if(locked && !unlockedAddr[from])
            revert("Locked until end of distribution");

        if (!isFeeless[from] && !isFeeless[to] && !locked) {
            uint256 liquidityLockAmount = getLiqLockBudget(amount);
            uint256 LiqPoolAddition = getLiqAddBudget(amount);
            //Transfer to liq add amount
            super._transfer(from, address(this), LiqPoolAddition);
            liqAddBalance = liqAddBalance.add(LiqPoolAddition);
            //Transfer to liq lock amount
            super._transfer(from, address(this), liquidityLockAmount);
            //Amount that is ending up after liq rewards and liq budget
            uint256 totalsub = LiqPoolAddition.add(liquidityLockAmount);
            super._transfer(from, to, amount.sub(totalsub));
        }
        else {
            super._transfer(from, to, amount);
        }
    }

    // receive eth from uniswap swap
    receive () external payable {}

    function initPair() public {
        // Create a uniswap pair for this new token
        uniswapV2Pair = IUniswapV2Factory(router.factory()).createPair(address(this), router.WETH());
        //Set uniswap pair interface
        iuniswapV2Pair = IUniswapV2Pair(uniswapV2Pair);
    }

    function setUniPair(address pair) public onlyOwner {
        uniswapV2Pair = pair;
        iuniswapV2Pair = IUniswapV2Pair(uniswapV2Pair);
    }

    function unlock() public onlyOwner {
        locked = false;
    }

    function setTreasury(address treasuryN) public onlyOwner {
        treasury = payable(treasuryN);
        balancer.setTreasury(treasuryN);
    }

    /* Fee setters */
    function setLiqFee(uint newFee) public onlyOwner {
        LIQFEE = newFee;
    }
    function setLiquidityLockCut(uint256 newFee) public onlyOwner {
        LIQLOCK = newFee;
    }

    function setRebalanceCut(uint256 newFee) public onlyOwner {
        REBALCUT = newFee;
    }
    function setCallerRewardCut(uint256 newFee) public onlyOwner {
        CALLCUT = newFee;
    }

    function toggleCHI() public onlyOwner {
        useCHI = !useCHI;
    }

    function setRebalanceInterval(uint256 _interval) public onlyOwner {
        rebalanceInterval = _interval;
    }

    function _transferLP(address dest,uint256 amount) internal{
        iuniswapV2Pair.transfer(dest, amount);
    }

    function unlockLPPartial(uint256 amount) public onlyOwner {
        require(block.timestamp > lpUnlocked, "Not unlocked yet");
        _transferLP(msg.sender,amount);
    }

    function unlockLP() public onlyOwner {
        require(block.timestamp > lpUnlocked, "Not unlocked yet");
        uint256 amount = iuniswapV2Pair.balanceOf(address(this));
        _transferLP(msg.sender, amount);
    }

    function toggleFeeless(address _addr) public onlyOwner {
        isFeeless[_addr] = !isFeeless[_addr];
    }

    function toggleUnlockable(address _addr) public onlyOwner {
        unlockedAddr[_addr] = !unlockedAddr[_addr];
    }

    function setMinRebalanceAmount(uint256 amount_) public onlyOwner {
        minRebalanceAmount = amount_;
    }

    function rebalanceable() public view returns (bool) {
        return block.timestamp > lastRebalance.add(rebalanceInterval);
    }

    function hasMinRebalanceBalance(address addr) public view returns (bool) {
        return balanceOf(addr) >= minRebalanceAmount;
    }

    function _rewardLiquidityProviders(uint256 liquidityRewards) private {
        super._transfer(address(this), uniswapV2Pair, liquidityRewards);
        iuniswapV2Pair.sync();
        emit RewardLiquidityProviders(liquidityRewards);
    }

    function remLiquidity(uint256 lpAmount) private returns(uint ETHAmount) {
        iuniswapV2Pair.approve(uniswapV2Router, lpAmount);
        (ETHAmount) = router
            .removeLiquidityETHSupportingFeeOnTransferTokens(
                address(this),
                lpAmount,
                0,
                0,
                address(balancer),
                block.timestamp
            );
    }

    function ApproveInf(address tokenT,address spender) internal{
        TransferHelper.safeApprove(tokenT,spender,INFINITE_ALLOWANCE);
    }

    function toggleAddLiq() public onlyOwner {
        doAddLiq = !doAddLiq;
    }

    function rebalanceLiquidity() public discountCHI {
        require(hasMinRebalanceBalance(msg.sender), "!hasMinRebalanceBalance");
        require(rebalanceable(), '!rebalanceable');
        lastRebalance = block.timestamp;

        if(!approved) {
            ApproveInf(address(this),uniswapV2Router);
            ApproveInf(uniswapV2Pair,uniswapV2Router);
            approved = true;
        }
        //Approve CHI incase its enabled
        if(useCHI) ApproveInf(address(chi),address(chi));
        // lockable supply is the token balance of this contract minus the liqaddbalance
        if(lockableSupply() > 0)
            _rewardLiquidityProviders(lockableSupply());

        uint256 amountToRemove = getRebalanceCut(iuniswapV2Pair.balanceOf(address(this)));
        // Sell half of balance tokens to eth and add liq
        if(balanceOf(address(this)) >= liqAddBalance && liqAddBalance > 0 && doAddLiq) {
            //Send tokens to balancer
            super._transfer(address(this),address(balancer),liqAddBalance);
            require(balancer.AddLiq(),"!AddLiq");
            liqAddBalance = 0;
        }
        // needed in case contract already owns eth
        remLiquidity(amountToRemove);
        uint _locked = balancer.rebalance(msg.sender);
        //Sync after changes
        iuniswapV2Pair.sync();
        emit Rebalance(_locked);
    }

    // returns token amount
    function lockableSupply() public view returns (uint256) {
        return balanceOf(address(this)) > 0 ? balanceOf(address(this)).sub(liqAddBalance,"underflow on lockableSupply") : 0;
    }

    // returns token amount
    function lockedSupply() external view returns (uint256) {
        uint256 lpTotalSupply = iuniswapV2Pair.totalSupply();
        uint256 lpBalance = lockedLiquidity();
        uint256 percentOfLpTotalSupply = lpBalance.mul(1e12).div(lpTotalSupply);

        uint256 uniswapBalance = balanceOf(uniswapV2Pair);
        uint256 _lockedSupply = uniswapBalance.mul(percentOfLpTotalSupply).div(1e12);
        return _lockedSupply;
    }

    // returns token amount
    function burnedSupply() external view returns (uint256) {
        uint256 lpTotalSupply = iuniswapV2Pair.totalSupply();
        uint256 lpBalance = burnedLiquidity();
        uint256 percentOfLpTotalSupply = lpBalance.mul(1e12).div(lpTotalSupply);

        uint256 uniswapBalance = balanceOf(uniswapV2Pair);
        uint256 _burnedSupply = uniswapBalance.mul(percentOfLpTotalSupply).div(1e12);
        return _burnedSupply;
    }

    // returns LP amount, not token amount
    function burnableLiquidity() public view returns (uint256) {
        return iuniswapV2Pair.balanceOf(address(this));
    }

    // returns LP amount, not token amount
    function burnedLiquidity() public view returns (uint256) {
        return iuniswapV2Pair.balanceOf(address(0));
    }

    // returns LP amount, not token amount
    function lockedLiquidity() public view returns (uint256) {
        return burnableLiquidity().add(burnedLiquidity());
    }
}

File 2 of 14 : Balancer.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.8;
import { Ownable, SafeMath } from '../interfaces/CommonImports.sol';
import { IERC20Burnable } from '../interfaces/IERC20Burnable.sol';
import '../interfaces/IUniswapV2Router02.sol';
import '../interfaces/IBalancer.sol';

interface IFreeFromUpTo {
    function freeFromUpTo(address from, uint256 value) external returns (uint256 freed);
    function balanceOf(address account) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
}

contract BalancerNew is Ownable, IBalancer {
    using SafeMath for uint256;

    address internal UniRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
    address payable public override treasury;
    IERC20Burnable token;
    IUniswapV2Router02 routerInterface = IUniswapV2Router02(UniRouter);
    address internal WETH = routerInterface.WETH();

    constructor() public {
        treasury = msg.sender;
    }

    function setToken(address tokenAddr) public onlyOwner {
        token = IERC20Burnable(tokenAddr);
    }

    function setTreasury(address treasuryN) external override{
        require(msg.sender == address(token), "only token");
        treasury = payable(treasuryN);
    }

    receive () external payable {}

    /** Path stuff **/
    function getPath(address tokent,bool isSell) internal view returns (address[] memory path){
        path = new address[](2);
        path[0] = isSell ? tokent : WETH;
        path[1] = isSell ? WETH : tokent;
        return path;
    }

    function getSellPath(address tokent) public view returns (address[] memory path) {
        path = getPath(tokent,true);
    }

    function getBuyPath(address tokent) public view returns (address[] memory path){
        path = getPath(tokent,false);
    }
    /** Path stuff end **/

    function rebalance(address rewardRecp) external override returns (uint256) {
        require(msg.sender == address(token), "only token");
        swapEthForTokens();
        uint256 lockableBalance = token.balanceOf(address(this));
        uint256 callerReward = token.getCallerCut(lockableBalance);
        token.transfer(rewardRecp, callerReward);
        token.burn(lockableBalance.sub(callerReward,"Underflow on burn"));
        return lockableBalance.sub(callerReward,"underflow on return");
    }

    function swapEthForTokens() private {

        uint256 treasuryAmount = token.getCallerCut(address(this).balance);
        (bool success,) = treasury.call{value: treasuryAmount}("");
        require(success,"treasury send failed");

        routerInterface.swapExactETHForTokensSupportingFeeOnTransferTokens{value: address(this).balance}(
                0,
                getBuyPath(address(token)),
                address(this),
                block.timestamp.add(200)
            );
    }

    function swapTokensForETH(uint256 tokenAmount) private {
        //Approve before swap
        token.approve(UniRouter,tokenAmount);
        routerInterface.swapExactTokensForETHSupportingFeeOnTransferTokens(
                tokenAmount,
                0,
                getSellPath(address(token)),
                address(this),
                block.timestamp.add(200)
        );
    }



    function addLiq(uint256 tokenAmount,uint256 ethamount) private {
        //Approve before adding liq
        token.approve(UniRouter,tokenAmount);
        routerInterface.addLiquidityETH{value:ethamount}(
            address(token),
            tokenAmount,
            0,
            ethamount.div(2),//Atleast half of eth should be added
            address(token),
            block.timestamp.add(200)
        );
    }

    function AddLiq() external override returns (bool) {
        //Sell half of the amount to ETH
        uint256 tokenAmount  = token.balanceOf(address(this)).div(2);
        //Swap half of it to eth
        swapTokensForETH(tokenAmount);
        //Add liq with remaining eth and tokens
        addLiq(token.balanceOf(address(this)),address(this).balance);
        //If any eth remains swap to token
        if(address(this).balance > 0)
            swapEthForTokens();
        return true;
    }

}

File 3 of 14 : ReflectToken.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.8;
import { Ownable, SafeMath } from './Balancer.sol';
import { IERC20 } from '../interfaces/IERC20Burnable.sol';

contract REFLECTBase is Ownable ,IERC20{
    using SafeMath for uint256;

    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping(address => bool) public isFeeless;

    mapping (address => bool) private _isExcluded;
    address[] private _excluded;

    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal = 1000000 ether;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    string private _name = 'SyntLayer';
    string private _symbol = 'SYNL';
    uint8 private _decimals = 18;

    event Redestributed(address from, uint256 t, uint256 rAmount, uint256 tAmount);

    constructor () public {
        _rOwned[_msgSender()] = _rTotal;
        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

    function reflect(uint256 tAmount) public {
        address sender = _msgSender();
        require(!_isExcluded[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount,,,,) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,) = _getValues(tAmount);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount.div(currentRate);
    }

    function excludeAccount(address account) external onlyOwner() {
        require(!_isExcluded[account], "Account is already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeAccount(address account) external onlyOwner() {
        require(_isExcluded[account], "Account is already excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    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 _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }
    }

    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);

        if (isFeeless[sender] || isFeeless[recipient]) {
            rTransferAmount = rTransferAmount.add(rFee);
            tTransferAmount = tTransferAmount.add(tFee);
        } else {
            _reflectFee(rFee, tFee);
            emit Redestributed(sender, 1, rAmount, tAmount);
        }

        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);

        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);

        if (isFeeless[sender] || isFeeless[recipient]) {
            rTransferAmount = rTransferAmount.add(rFee);
            tTransferAmount = tTransferAmount.add(tFee);
        } else {
            _reflectFee(rFee, tFee);
            emit Redestributed(sender, 2, rAmount, tAmount);
        }

        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);

        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);

        if (isFeeless[sender] || isFeeless[recipient]) {
            rTransferAmount = rTransferAmount.add(rFee);
            tTransferAmount = tTransferAmount.add(tFee);
        } else {
            _reflectFee(rFee, tFee);
            emit Redestributed(sender, 3, rAmount, tAmount);
        }

        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);

        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee) = _getValues(tAmount);

        if (isFeeless[sender] || isFeeless[recipient]) {
            rTransferAmount= rTransferAmount.add(rFee);
            tTransferAmount = tTransferAmount.add(tFee);
        } else {
            _reflectFee(rFee, tFee);
            emit Redestributed(sender, 4, rAmount, tAmount);
        }

        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);

        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee) = _getTValues(tAmount);
        uint256 currentRate =  _getRate();
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, currentRate);
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee);
    }

    function _getTValues(uint256 tAmount) private pure returns (uint256, uint256) {
        uint256 tFee = tAmount.div(100);
        uint256 tTransferAmount = tAmount.sub(tFee);
        return (tTransferAmount, tFee);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");
        _rOwned[account] = _rOwned[account].sub(amount, "ERC20: burn amount exceeds balance");
        _tTotal = _tTotal.sub(amount, "ERC20: burn amount exceeds balance");
        emit Transfer(account, address(0), amount);
    }
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance");

        _approve(account, _msgSender(), decreasedAllowance);
        _burn(account, amount);
    }
}

File 4 of 14 : CommonImports.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.8;
import '@openzeppelin/contracts/token/ERC20/IERC20.sol';
import '@openzeppelin/contracts/math/SafeMath.sol';
import '@openzeppelin/contracts/access/Ownable.sol';

File 5 of 14 : IBalancer.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.8;
interface IBalancer {
  function treasury (  ) external view returns ( address payable );
  function setTreasury ( address treasuryN ) external;
  function rebalance ( address rewardRecp ) external returns ( uint256 );
  function AddLiq (  ) external returns (bool);
}

File 6 of 14 : IERC20Burnable.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.8;
import {IERC20} from '../interfaces/CommonImports.sol';
interface IERC20Burnable is IERC20 {
    function burn(uint256 amount) external;
    function getLiqAddBudget(uint256 amount) external view returns (uint256);
    function getCallerCut(uint256 amount) external view returns (uint256);
}

File 7 of 14 : IUniswapFactory.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.8;

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

File 8 of 14 : IUniswapV2Pair.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.8;
import { IERC20 } from './IERC20Burnable.sol';
interface IUniswapV2Pair is IERC20 {
    function sync() external;
}

File 9 of 14 : IUniswapV2Router02.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.8;
interface IUniswapV2Router02 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
      uint amountOutMin,
      address[] calldata path,
      address to,
      uint deadline
    ) external payable;
    function removeLiquidityETH(
      address token,
      uint liquidity,
      uint amountTokenMin,
      uint amountETHMin,
      address to,
      uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function removeLiquidityETHSupportingFeeOnTransferTokens(
      address token,
      uint liquidity,
      uint amountTokenMin,
      uint amountETHMin,
      address to,
      uint deadline
    ) external returns (uint amountETH);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}

File 10 of 14 : TransferHelper.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.12;

library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
    }
    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

    function safeTransferWithReturn(address token, address to, uint value) internal returns (bool) {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        return (success && (data.length == 0 || abi.decode(data, (bool))));
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }
}

File 11 of 14 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 12 of 14 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

import "../GSN/Context.sol";
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 13 of 14 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

File 14 of 14 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 10000
  },
  "evmVersion": "istanbul",
  "libraries": {
    "": {}
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"balancerAddr","type":"address"}],"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenBurnt","type":"uint256"}],"name":"Rebalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"t","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"Redestributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"liquidityRewards","type":"uint256"}],"name":"RewardLiquidityProviders","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":"BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CALLCUT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIQFEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIQLOCK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REBALCUT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnableLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnedLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chi","outputs":[{"internalType":"contract IFreeFromUpTo","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getCallerCut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getLiqAddBudget","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getLiqLockBudget","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getRebalanceCut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"hasMinRebalanceBalance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeless","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRebalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liqAddBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockableSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpUnlocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minRebalanceAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebalanceInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebalanceLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rebalanceable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"reflect","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newBalancer","type":"address"}],"name":"setBalancer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"setCallerRewardCut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"setLiqFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"setLiquidityLockCut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"setMinRebalanceAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"setRebalanceCut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_interval","type":"uint256"}],"name":"setRebalanceInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"treasuryN","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"setUniPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleAddLiq","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleCHI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"toggleFeeless","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"toggleUnlockable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","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","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unlockLPPartial","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"unlockedAddr","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"useCHI","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

69d3c21bcecceda100000060075569085afffa6ff50bffffff1960085560c0604052600960808190526829bcb73a2630bcb2b960b91b60a09081526200004991600a9190620002e0565b506040805180820190915260048082526314d6539360e21b60209092019182526200007791600b91620002e0565b50600c8054747a250d5630b4cf539739df2c5dacb4c659f2488d00610100600160a81b031960ff19909216601217919091161790819055600d80546001600160a01b03199081169091556010805482166101009093046001600160a01b03169290921790915560118054909116905560006015556017805463ffffff00191663010000001790556064601855601460195560fa601a5560c8601b553480156200011f57600080fd5b5060405162004b4f38038062004b4f833981810160405260208110156200014557600080fd5b5051600062000153620002dc565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060085460016000620001ae620002dc565b6001600160a01b03168152602081019190915260400160002055620001d2620002dc565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6007546040518082815260200191505060405180910390a3426013819055600160148190556276a7009091016016556801158e460913d00000601255600e8054336001600160a01b03199182168117909255601c80549091166001600160a01b039490941693841790556017805460ff1990811684179091556000828152600f602090815260408083208054851687179055868352808320805485168717905530835260049091528082208054841686179055948152848120805483168517905591825292902080549092161790556200037c565b3390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200032357805160ff191683800117855562000353565b8280016001018555821562000353579182015b828111156200035357825182559160200191906001019062000336565b506200036192915062000365565b5090565b5b8082111562000361576000815560010162000366565b6147c3806200038c6000396000f3fe6080604052600436106104695760003560e01c80638da5cb5b11610243578063cafab28911610143578063ec10af9a116100bb578063f2cc0c181161008a578063f84354f11161006f578063f84354f114610e3a578063f953797314610e6d578063feb1dfcc14610ea057610470565b8063f2cc0c1814610dd4578063f2fde38b14610e0757610470565b8063ec10af9a14610d4d578063ec342ad014610d62578063f0f4426014610d77578063f24fb01d14610daa57610470565b8063d7666de611610112578063e0c22cba116100f7578063e0c22cba14610cdb578063e267191c14610d0e578063e84354c514610d3857610470565b8063d7666de614610c76578063dd62ed3e14610ca057610470565b8063cafab28914610c22578063cef857db14610c37578063cf30901214610c4c578063d250e69914610c6157610470565b8063b4398244116101d6578063bc132751116101a5578063c6bed9511161018a578063c6bed95114610bce578063c92aecc414610bf8578063ca5c7b9114610c0d57610470565b8063bc13275114610b71578063c0132fdb14610ba457610470565b8063b439824414610af3578063b477bddd14610b08578063b6833c5914610b32578063b91f3f9714610b5c57610470565b8063a8a5550e11610212578063a8a5550e14610a5d578063a9059cbb14610a72578063aa04947414610aab578063ae74a1b514610ac057610470565b80638da5cb5b146109e557806395d89b41146109fa578063a457c2d714610a0f578063a69df4b514610a4857610470565b806342966c681161036957806361d027b3116102e1578063715018a6116102b05780637f4aeb1a116102955780637f4aeb1a146109a6578063812c146c146109bb578063858750ab146109d057610470565b8063715018a61461095857806379cc67901461096d57610470565b806361d027b3146108aa57806368c32b9c146108bf57806370709a7c146108f257806370a082311461092557610470565b80634be744ab11610338578063571b3b5f1161031d578063571b3b5f146108415780635b7dcaed1461086b5780636168608b1461089557610470565b80634be744ab1461081757806355d0a1d01461082c57610470565b806342966c681461077c5780634549b039146107a657806347ae9cd8146107d857806349bd5a5e1461080257610470565b80631987be91116103fc5780632898cafa116103cb578063313ce567116103b0578063313ce567146106ee57806338966f8814610719578063395093511461074357610470565b80632898cafa146106af5780632d838119146106c457610470565b80631987be911461060f5780631dc83ab7146106245780631ffa30211461063957806323b872dd1461066c57610470565b806313114a9d1161043857806313114a9d1461059f5780631694505e146105b457806316d1d916146105e557806318160ddd146105fa57610470565b8063053ab1821461047557806306fdde03146104a1578063095ea7b31461052b578063106b9ca11461057857610470565b3661047057005b600080fd5b34801561048157600080fd5b5061049f6004803603602081101561049857600080fd5b5035610eb5565b005b3480156104ad57600080fd5b506104b6610f8d565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104f05781810151838201526020016104d8565b50505050905090810190601f16801561051d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561053757600080fd5b506105646004803603604081101561054e57600080fd5b506001600160a01b038135169060200135611041565b604080519115158252519081900360200190f35b34801561058457600080fd5b5061058d61105f565b60408051918252519081900360200190f35b3480156105ab57600080fd5b5061058d611065565b3480156105c057600080fd5b506105c961106b565b604080516001600160a01b039092168252519081900360200190f35b3480156105f157600080fd5b5061058d61107f565b34801561060657600080fd5b5061058d611085565b34801561061b57600080fd5b5061058d61108b565b34801561063057600080fd5b50610564611091565b34801561064557600080fd5b5061049f6004803603602081101561065c57600080fd5b50356001600160a01b03166110b1565b34801561067857600080fd5b506105646004803603606081101561068f57600080fd5b506001600160a01b03813581169160208101359091169060400135611162565b3480156106bb57600080fd5b5061058d6111e9565b3480156106d057600080fd5b5061058d600480360360208110156106e757600080fd5b5035611281565b3480156106fa57600080fd5b506107036112e3565b6040805160ff9092168252519081900360200190f35b34801561072557600080fd5b5061049f6004803603602081101561073c57600080fd5b50356112ec565b34801561074f57600080fd5b506105646004803603604081101561076657600080fd5b506001600160a01b03813516906020013561135b565b34801561078857600080fd5b5061049f6004803603602081101561079f57600080fd5b50356113a9565b3480156107b257600080fd5b5061058d600480360360408110156107c957600080fd5b508035906020013515156113bd565b3480156107e457600080fd5b5061058d600480360360208110156107fb57600080fd5b503561144d565b34801561080e57600080fd5b506105c9611470565b34801561082357600080fd5b5061058d61147f565b34801561083857600080fd5b5061058d611485565b34801561084d57600080fd5b5061058d6004803603602081101561086457600080fd5b5035611561565b34801561087757600080fd5b5061049f6004803603602081101561088e57600080fd5b503561157e565b3480156108a157600080fd5b506105646115ed565b3480156108b657600080fd5b506105c96115fb565b3480156108cb57600080fd5b5061049f600480360360208110156108e257600080fd5b50356001600160a01b031661160a565b3480156108fe57600080fd5b5061049f6004803603602081101561091557600080fd5b50356001600160a01b03166116df565b34801561093157600080fd5b5061058d6004803603602081101561094857600080fd5b50356001600160a01b0316611772565b34801561096457600080fd5b5061049f6117d4565b34801561097957600080fd5b5061049f6004803603604081101561099057600080fd5b506001600160a01b0381351690602001356118a0565b3480156109b257600080fd5b5061049f6118fa565b3480156109c757600080fd5b5061058d611f93565b3480156109dc57600080fd5b5061058d611f99565b3480156109f157600080fd5b506105c9611ffd565b348015610a0657600080fd5b506104b661200c565b348015610a1b57600080fd5b5061056460048036036040811015610a3257600080fd5b506001600160a01b03813516906020013561208b565b348015610a5457600080fd5b5061049f6120f3565b348015610a6957600080fd5b5061058d612169565b348015610a7e57600080fd5b5061056460048036036040811015610a9557600080fd5b506001600160a01b0381351690602001356121cb565b348015610ab757600080fd5b5061058d6121df565b348015610acc57600080fd5b5061056460048036036020811015610ae357600080fd5b50356001600160a01b03166121e5565b348015610aff57600080fd5b5061058d6121fa565b348015610b1457600080fd5b5061058d60048036036020811015610b2b57600080fd5b5035612215565b348015610b3e57600080fd5b5061049f60048036036020811015610b5557600080fd5b5035612232565b348015610b6857600080fd5b5061049f6122a1565b348015610b7d57600080fd5b5061056460048036036020811015610b9457600080fd5b50356001600160a01b03166123fd565b348015610bb057600080fd5b5061049f60048036036020811015610bc757600080fd5b5035612412565b348015610bda57600080fd5b5061049f60048036036020811015610bf157600080fd5b50356124dc565b348015610c0457600080fd5b506105c961254b565b348015610c1957600080fd5b5061058d61255d565b348015610c2e57600080fd5b5061058d6125e6565b348015610c4357600080fd5b5061049f6125ec565b348015610c5857600080fd5b50610564612690565b348015610c6d57600080fd5b5061058d612699565b348015610c8257600080fd5b5061049f60048036036020811015610c9957600080fd5b503561269f565b348015610cac57600080fd5b5061058d60048036036040811015610cc357600080fd5b506001600160a01b038135811691602001351661270e565b348015610ce757600080fd5b5061056460048036036020811015610cfe57600080fd5b50356001600160a01b0316612739565b348015610d1a57600080fd5b5061058d60048036036020811015610d3157600080fd5b503561274f565b348015610d4457600080fd5b5061058d61276c565b348015610d5957600080fd5b5061049f612772565b348015610d6e57600080fd5b5061058d612818565b348015610d8357600080fd5b5061049f60048036036020811015610d9a57600080fd5b50356001600160a01b031661281e565b348015610db657600080fd5b5061049f60048036036020811015610dcd57600080fd5b5035612937565b348015610de057600080fd5b5061049f60048036036020811015610df757600080fd5b50356001600160a01b03166129a6565b348015610e1357600080fd5b5061049f60048036036020811015610e2a57600080fd5b50356001600160a01b0316612b56565b348015610e4657600080fd5b5061049f60048036036020811015610e5d57600080fd5b50356001600160a01b0316612bfb565b348015610e7957600080fd5b5061049f60048036036020811015610e9057600080fd5b50356001600160a01b0316612e36565b348015610eac57600080fd5b5061049f612ec9565b6000610ebf6130b3565b6001600160a01b03811660009081526005602052604090205490915060ff1615610f1a5760405162461bcd60e51b815260040180806020018281038252602c81526020018061473d602c913960400191505060405180910390fd5b6000610f25836130b7565b505050506001600160a01b038316600090815260016020526040902054909150610f4f9082613103565b6001600160a01b038316600090815260016020526040902055600854610f759082613103565b600855600954610f85908461314c565b600955505050565b600a8054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110375780601f1061100c57610100808354040283529160200191611037565b820191906000526020600020905b81548152906001019060200180831161101a57829003601f168201915b5050505050905090565b600061105561104e6130b3565b84846131a6565b5060015b92915050565b60135481565b60095490565b600c5461010090046001600160a01b031681565b60145481565b60075490565b601a5481565b60006110aa60145460135461314c90919063ffffffff16565b4211905090565b6110b96130b3565b6000546001600160a01b0390811691161461111b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600d80547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b03938416179182905560118054929093169116179055565b600061116f848484613292565b6111df8461117b6130b3565b6111da8560405180606001604052806028815260200161465e602891396001600160a01b038a166000908152600360205260408120906111b96130b3565b6001600160a01b0316815260208101919091526040016000205491906133da565b6131a6565b5060019392505050565b601154604080517f70a08231000000000000000000000000000000000000000000000000000000008152600060048201819052915191926001600160a01b0316916370a0823191602480820192602092909190829003018186803b15801561125057600080fd5b505afa158015611264573d6000803e3d6000fd5b505050506040513d602081101561127a57600080fd5b5051905090565b60006008548211156112c45760405162461bcd60e51b815260040180806020018281038252602a8152602001806145cb602a913960400191505060405180910390fd5b60006112ce613471565b90506112da8382613494565b9150505b919050565b600c5460ff1690565b6112f46130b3565b6000546001600160a01b03908116911614611356576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b601955565b60006110556113686130b3565b846111da85600360006113796130b3565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549061314c565b6113ba6113b46130b3565b826134d6565b50565b6000600754831115611416576040805162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c7900604482015290519081900360640190fd5b81611434576000611426846130b7565b509294506110599350505050565b600061143f846130b7565b509194506110599350505050565b600061105961271061146a601954856135f090919063ffffffff16565b90613494565b600d546001600160a01b031681565b60185481565b600080601160009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156114d657600080fd5b505afa1580156114ea573d6000803e3d6000fd5b505050506040513d602081101561150057600080fd5b50519050600061150e6111e9565b905060006115258361146a8464e8d4a510006135f0565b600d54909150600090611540906001600160a01b0316611772565b9050600061155764e8d4a5100061146a84866135f0565b9550505050505090565b600061105961271061146a601854856135f090919063ffffffff16565b6115866130b3565b6000546001600160a01b039081169116146115e8576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b601455565b601754610100900460ff1681565b600e546001600160a01b031681565b6116126130b3565b6000546001600160a01b03908116911614611674576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b601c80546001600160a01b039092167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216821790556000908152600460209081526040808320805460ff199081166001908117909255600f909352922080549091169091179055565b6116e76130b3565b6000546001600160a01b03908116911614611749576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19811660ff90911615179055565b6001600160a01b03811660009081526005602052604081205460ff16156117b257506001600160a01b0381166000908152600260205260409020546112de565b6001600160a01b03821660009081526001602052604090205461105990611281565b6117dc6130b3565b6000546001600160a01b0390811691161461183e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60006118d7826040518060600160405280602481526020016146af602491396118d0866118cb6130b3565b61270e565b91906133da565b90506118eb836118e56130b3565b836131a6565b6118f583836134d6565b505050565b60005a905061190833612739565b611959576040805162461bcd60e51b815260206004820152601760248201527f216861734d696e526562616c616e636542616c616e6365000000000000000000604482015290519081900360640190fd5b611961611091565b6119b2576040805162461bcd60e51b815260206004820152600e60248201527f21726562616c616e636561626c65000000000000000000000000000000000000604482015290519081900360640190fd5b4260135560175462010000900460ff16611a3157600c546119e290309061010090046001600160a01b0316613649565b600d54600c54611a03916001600160a01b0390811691610100900416613649565b601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff16620100001790555b601754610100900460ff1615611a5957611a596d4946c0e9f43f4dee607b0ef1fa1c80613649565b6000611a63612169565b1115611a7957611a79611a74612169565b613674565b601154604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600092611b15926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b158015611ae457600080fd5b505afa158015611af8573d6000803e3d6000fd5b505050506040513d6020811015611b0e57600080fd5b505161274f565b9050601554611b2330611772565b10158015611b3357506000601554115b8015611b4857506017546301000000900460ff165b15611c3d57601c54601554611b6a9130916001600160a01b039091169061372b565b601c60009054906101000a90046001600160a01b03166001600160a01b0316636c208a536040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611bba57600080fd5b505af1158015611bce573d6000803e3d6000fd5b505050506040513d6020811015611be457600080fd5b5051611c37576040805162461bcd60e51b815260206004820152600760248201527f214164644c697100000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60006015555b611c4681613948565b50601c54604080517f21c2819100000000000000000000000000000000000000000000000000000000815233600482015290516000926001600160a01b0316916321c2819191602480830192602092919082900301818787803b158015611cac57600080fd5b505af1158015611cc0573d6000803e3d6000fd5b505050506040513d6020811015611cd657600080fd5b5051601154604080517ffff6cae900000000000000000000000000000000000000000000000000000000815290519293506001600160a01b039091169163fff6cae99160048082019260009290919082900301818387803b158015611d3a57600080fd5b505af1158015611d4e573d6000803e3d6000fd5b50506040805184815290517f811d4760f1a92875eb76dbd3dc2359544b2f6a000ba5b78784c0b105b3469bd09350908190036020019150a15060009050601036025a836152080103019050601760019054906101000a900460ff1615611f8f57604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000916d4946c0e9f43f4dee607b0ef1fa1c916370a0823191602480820192602092909190829003018186803b158015611e1657600080fd5b505afa158015611e2a573d6000803e3d6000fd5b505050506040513d6020811015611e4057600080fd5b50511115611eee57604080517f079d229f00000000000000000000000000000000000000000000000000000000815230600482015261a3db61374a840104602482015290516d4946c0e9f43f4dee607b0ef1fa1c9163079d229f9160448083019260209291908290030181600087803b158015611ebc57600080fd5b505af1158015611ed0573d6000803e3d6000fd5b505050506040513d6020811015611ee657600080fd5b50611f8f9050565b604080517f079d229f00000000000000000000000000000000000000000000000000000000815233600482015261a3db61374a840104602482015290516d4946c0e9f43f4dee607b0ef1fa1c9163079d229f9160448083019260209291908290030181600087803b158015611f6257600080fd5b505af1158015611f76573d6000803e3d6000fd5b505050506040513d6020811015611f8c57600080fd5b50505b5050565b60195481565b601154604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561125057600080fd5b6000546001600160a01b031690565b600b8054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110375780601f1061100c57610100808354040283529160200191611037565b60006110556120986130b3565b846111da8560405180606001604052806025815260200161476960259139600360006120c26130b3565b6001600160a01b03908116825260208083019390935260409182016000908120918d168152925290205491906133da565b6120fb6130b3565b6000546001600160a01b0390811691161461215d576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6017805460ff19169055565b60008061217530611772565b116121815760006121c6565b6121c66015546040518060400160405280601b81526020017f756e646572666c6f77206f6e206c6f636b61626c65537570706c7900000000008152506118d030611772565b905090565b60006110556121d86130b3565b8484613292565b601b5481565b60046020526000908152604090205460ff1681565b60006121c66122076111e9565b61220f611f99565b9061314c565b600061105961271061146a601b54856135f090919063ffffffff16565b61223a6130b3565b6000546001600160a01b0390811691161461229c576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b601255565b6122a96130b3565b6000546001600160a01b0390811691161461230b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6016544211612361576040805162461bcd60e51b815260206004820152601060248201527f4e6f7420756e6c6f636b65642079657400000000000000000000000000000000604482015290519081900360640190fd5b601154604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156123c557600080fd5b505afa1580156123d9573d6000803e3d6000fd5b505050506040513d60208110156123ef57600080fd5b505190506113ba3382613aae565b600f6020526000908152604090205460ff1681565b61241a6130b3565b6000546001600160a01b0390811691161461247c576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60165442116124d2576040805162461bcd60e51b815260206004820152601060248201527f4e6f7420756e6c6f636b65642079657400000000000000000000000000000000604482015290519081900360640190fd5b6113ba3382613aae565b6124e46130b3565b6000546001600160a01b03908116911614612546576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b601b55565b6d4946c0e9f43f4dee607b0ef1fa1c81565b600080601160009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156125ae57600080fd5b505afa1580156125c2573d6000803e3d6000fd5b505050506040513d60208110156125d857600080fd5b50519050600061150e6121fa565b60165481565b6125f46130b3565b6000546001600160a01b03908116911614612656576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b60175460ff1681565b60155481565b6126a76130b3565b6000546001600160a01b03908116911614612709576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b601855565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b600060125461274783611772565b101592915050565b600061105961271061146a601a54856135f090919063ffffffff16565b60125481565b61277a6130b3565b6000546001600160a01b039081169116146127dc576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff811663010000009182900460ff1615909102179055565b61271081565b6128266130b3565b6000546001600160a01b03908116911614612888576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03838116918217909255601c54604080517ff0f4426000000000000000000000000000000000000000000000000000000000815260048101939093525192169163f0f442609160248082019260009290919082900301818387803b15801561291c57600080fd5b505af1158015612930573d6000803e3d6000fd5b5050505050565b61293f6130b3565b6000546001600160a01b039081169116146129a1576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b601a55565b6129ae6130b3565b6000546001600160a01b03908116911614612a10576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811660009081526005602052604090205460ff1615612a7e576040805162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604482015290519081900360640190fd5b6001600160a01b03811660009081526001602052604090205415612ad8576001600160a01b038116600090815260016020526040902054612abe90611281565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600560205260408120805460ff191660019081179091556006805491820181559091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b612b5e6130b3565b6000546001600160a01b03908116911614612bc0576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b612bd0612bcb611ffd565b6116df565b612be0612bdb611ffd565b612e36565b612be9816116df565b612bf281612e36565b6113ba81613b1d565b612c036130b3565b6000546001600160a01b03908116911614612c65576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811660009081526005602052604090205460ff16612cd2576040805162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604482015290519081900360640190fd5b60005b600654811015611f8f57816001600160a01b031660068281548110612cf657fe5b6000918252602090912001546001600160a01b03161415612e2e57600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110612d4157fe5b600091825260209091200154600680546001600160a01b039092169183908110612d6757fe5b600091825260208083209190910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039485161790559184168152600282526040808220829055600590925220805460ff191690556006805480612dd157fe5b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055611f8f565b600101612cd5565b612e3e6130b3565b6000546001600160a01b03908116911614612ea0576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03166000908152600f60205260409020805460ff19811660ff90911615179055565b601060009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015612f1757600080fd5b505afa158015612f2b573d6000803e3d6000fd5b505050506040513d6020811015612f4157600080fd5b5051601054604080517fad5c464800000000000000000000000000000000000000000000000000000000815290516001600160a01b039384169363c9c6539693309391169163ad5c464891600480820192602092909190829003018186803b158015612fac57600080fd5b505afa158015612fc0573d6000803e3d6000fd5b505050506040513d6020811015612fd657600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b0393841660048201529290911660248301525160448083019260209291908290030181600087803b15801561304057600080fd5b505af1158015613054573d6000803e3d6000fd5b505050506040513d602081101561306a57600080fd5b5051600d80547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b03938416179182905560118054929093169116179055565b3390565b60008060008060008060006130cb88613c3f565b9150915060006130d9613471565b905060008060006130eb8c8686613c67565b919e909d50909b509599509397509395505050505050565b600061314583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506133da565b9392505050565b600082820183811015613145576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0383166131eb5760405162461bcd60e51b81526004018080602001828103825260248152602001806147196024913960400191505060405180910390fd5b6001600160a01b0382166132305760405162461bcd60e51b815260040180806020018281038252602281526020018061461b6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260036020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60175460ff1680156132bd57506001600160a01b0383166000908152600f602052604090205460ff16155b1561330f576040805162461bcd60e51b815260206004820181905260248201527f4c6f636b656420756e74696c20656e64206f6620646973747269627574696f6e604482015290519081900360640190fd5b6001600160a01b03831660009081526004602052604090205460ff1615801561335157506001600160a01b03821660009081526004602052604090205460ff16155b8015613360575060175460ff16155b156133cf5760006133708261144d565b9050600061337d83611561565b905061338a85308361372b565b601554613397908261314c565b6015556133a585308461372b565b60006133b1828461314c565b90506133c786866133c28785613103565b61372b565b5050506118f5565b6118f583838361372b565b600081848411156134695760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561342e578181015183820152602001613416565b50505050905090810190601f16801561345b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600080600061347e613ca3565b909250905061348d8282613494565b9250505090565b600061314583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613e06565b6001600160a01b03821661351b5760405162461bcd60e51b81526004018080602001828103825260218152602001806146d36021913960400191505060405180910390fd5b613558816040518060600160405280602281526020016145a9602291396001600160a01b03851660009081526001602052604090205491906133da565b60016000846001600160a01b03166001600160a01b03168152602001908152602001600020819055506135a8816040518060600160405280602281526020016145a96022913960075491906133da565b6007556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000826135ff57506000611059565b8282028284828161360c57fe5b04146131455760405162461bcd60e51b815260040180806020018281038252602181526020018061463d6021913960400191505060405180910390fd5b611f8f82827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613e6b565b600d5461368c9030906001600160a01b03168361372b565b601160009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156136dc57600080fd5b505af11580156136f0573d6000803e3d6000fd5b50506040805184815290517f8765d2bb982ed6ee74d2b03c76c9c129aa4a4e3e6b17bd7cf7830088e9d490549350908190036020019150a150565b6001600160a01b0383166137705760405162461bcd60e51b81526004018080602001828103825260258152602001806146f46025913960400191505060405180910390fd5b6001600160a01b0382166137b55760405162461bcd60e51b81526004018080602001828103825260238152602001806145866023913960400191505060405180910390fd5b600081116137f45760405162461bcd60e51b81526004018080602001828103825260298152602001806146866029913960400191505060405180910390fd5b6001600160a01b03831660009081526005602052604090205460ff16801561383557506001600160a01b03821660009081526005602052604090205460ff16155b1561384a5761384583838361401a565b6118f5565b6001600160a01b03831660009081526005602052604090205460ff1615801561388b57506001600160a01b03821660009081526005602052604090205460ff165b1561389b576138458383836141d6565b6001600160a01b03831660009081526005602052604090205460ff161580156138dd57506001600160a01b03821660009081526005602052604090205460ff16155b156138ed57613845838383614338565b6001600160a01b03831660009081526005602052604090205460ff16801561392d57506001600160a01b03821660009081526005602052604090205460ff165b1561393d57613845838383614435565b6118f5838383614338565b601154600c54604080517f095ea7b30000000000000000000000000000000000000000000000000000000081526101009092046001600160a01b039081166004840152602483018590529051600093919091169163095ea7b391604480830192602092919082900301818787803b1580156139c257600080fd5b505af11580156139d6573d6000803e3d6000fd5b505050506040513d60208110156139ec57600080fd5b5050601054601c54604080517faf2979eb00000000000000000000000000000000000000000000000000000000815230600482015260248101869052600060448201819052606482018190526001600160a01b0393841660848301524260a48301529151929093169263af2979eb9260c48083019360209383900390910190829087803b158015613a7c57600080fd5b505af1158015613a90573d6000803e3d6000fd5b505050506040513d6020811015613aa657600080fd5b505192915050565b601154604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015611f6257600080fd5b613b256130b3565b6000546001600160a01b03908116911614613b87576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b038116613bcc5760405162461bcd60e51b81526004018080602001828103825260268152602001806145f56026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60008080613c4e846064613494565b90506000613c5c8583613103565b935090915050915091565b6000808080613c7687866135f0565b90506000613c8487876135f0565b90506000613c928383613103565b929992985090965090945050505050565b6008546007546000918291825b600654811015613dd457826001600060068481548110613ccc57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020541180613d315750816002600060068481548110613d0a57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15613d485760085460075494509450505050613e02565b613d886001600060068481548110613d5c57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490613103565b9250613dca6002600060068481548110613d9e57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390613103565b9150600101613cb0565b50600754600854613de491613494565b821015613dfc57600854600754935093505050613e02565b90925090505b9091565b60008183613e555760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561342e578181015183820152602001613416565b506000838581613e6157fe5b0495945050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310613f3457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613ef7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613f96576040519150601f19603f3d011682016040523d82523d6000602084013e613f9b565b606091505b5091509150818015613fc9575080511580613fc95750808060200190516020811015613fc657600080fd5b50515b612930576040805162461bcd60e51b815260206004820152601e60248201527f5472616e7366657248656c7065723a20415050524f56455f4641494c45440000604482015290519081900360640190fd5b600080600080600061402b866130b7565b6001600160a01b038d166000908152600460205260409020549499509297509095509350915060ff168061407757506001600160a01b03871660009081526004602052604090205460ff165b1561409957614086848461314c565b9350614092828261314c565b91506140f4565b6140a38382614561565b604080516001600160a01b038a168152600360208201528082018790526060810188905290517fb0c7ad67bb089f910de90ed6e1efd1067c85d1947e2b901ffce5febef59bb1959181900360800190a15b6001600160a01b0388166000908152600260205260409020546141179087613103565b6001600160a01b0389166000908152600260209081526040808320939093556001905220546141469086613103565b6001600160a01b03808a166000908152600160205260408082209390935590891681522054614175908561314c565b6001600160a01b0380891660008181526001602090815260409182902094909455805186815290519193928c16927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35050505050505050565b60008060008060006141e7866130b7565b6001600160a01b038d166000908152600460205260409020549499509297509095509350915060ff168061423357506001600160a01b03871660009081526004602052604090205460ff165b1561425557614242848461314c565b935061424e828261314c565b91506142b0565b61425f8382614561565b604080516001600160a01b038a168152600260208201528082018790526060810188905290517fb0c7ad67bb089f910de90ed6e1efd1067c85d1947e2b901ffce5febef59bb1959181900360800190a15b6001600160a01b0388166000908152600160205260409020546142d39086613103565b6001600160a01b03808a16600090815260016020908152604080832094909455918a16815260029091522054614309908361314c565b6001600160a01b038816600090815260026020908152604080832093909355600190522054614175908561314c565b6000806000806000614349866130b7565b6001600160a01b038d166000908152600460205260409020549499509297509095509350915060ff168061439557506001600160a01b03871660009081526004602052604090205460ff165b156143b7576143a4848461314c565b93506143b0828261314c565b9150614412565b6143c18382614561565b604080516001600160a01b038a168152600160208201528082018790526060810188905290517fb0c7ad67bb089f910de90ed6e1efd1067c85d1947e2b901ffce5febef59bb1959181900360800190a15b6001600160a01b0388166000908152600160205260409020546141469086613103565b6000806000806000614446866130b7565b6001600160a01b038d166000908152600460205260409020549499509297509095509350915060ff168061449257506001600160a01b03871660009081526004602052604090205460ff165b156144b4576144a1848461314c565b93506144ad828261314c565b915061450f565b6144be8382614561565b604080516001600160a01b038a168152600460208201528082018790526060810188905290517fb0c7ad67bb089f910de90ed6e1efd1067c85d1947e2b901ffce5febef59bb1959181900360800190a15b6001600160a01b0388166000908152600260205260409020546145329087613103565b6001600160a01b0389166000908152600260209081526040808320939093556001905220546142d39086613103565b60085461456e9083613103565b60085560095461457e908261314c565b600955505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e6365416d6f756e74206d757374206265206c657373207468616e20746f74616c207265666c656374696f6e734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734578636c75646564206164647265737365732063616e6e6f742063616c6c20746869732066756e6374696f6e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212201bd7201678a90873d2b6d5f92bcebcb8c4a2476fb437c38192fd5d17f06218b864736f6c634300060c00330000000000000000000000008d10258d526aebcd8815e0767332305be74c5c98

Deployed Bytecode

0x6080604052600436106104695760003560e01c80638da5cb5b11610243578063cafab28911610143578063ec10af9a116100bb578063f2cc0c181161008a578063f84354f11161006f578063f84354f114610e3a578063f953797314610e6d578063feb1dfcc14610ea057610470565b8063f2cc0c1814610dd4578063f2fde38b14610e0757610470565b8063ec10af9a14610d4d578063ec342ad014610d62578063f0f4426014610d77578063f24fb01d14610daa57610470565b8063d7666de611610112578063e0c22cba116100f7578063e0c22cba14610cdb578063e267191c14610d0e578063e84354c514610d3857610470565b8063d7666de614610c76578063dd62ed3e14610ca057610470565b8063cafab28914610c22578063cef857db14610c37578063cf30901214610c4c578063d250e69914610c6157610470565b8063b4398244116101d6578063bc132751116101a5578063c6bed9511161018a578063c6bed95114610bce578063c92aecc414610bf8578063ca5c7b9114610c0d57610470565b8063bc13275114610b71578063c0132fdb14610ba457610470565b8063b439824414610af3578063b477bddd14610b08578063b6833c5914610b32578063b91f3f9714610b5c57610470565b8063a8a5550e11610212578063a8a5550e14610a5d578063a9059cbb14610a72578063aa04947414610aab578063ae74a1b514610ac057610470565b80638da5cb5b146109e557806395d89b41146109fa578063a457c2d714610a0f578063a69df4b514610a4857610470565b806342966c681161036957806361d027b3116102e1578063715018a6116102b05780637f4aeb1a116102955780637f4aeb1a146109a6578063812c146c146109bb578063858750ab146109d057610470565b8063715018a61461095857806379cc67901461096d57610470565b806361d027b3146108aa57806368c32b9c146108bf57806370709a7c146108f257806370a082311461092557610470565b80634be744ab11610338578063571b3b5f1161031d578063571b3b5f146108415780635b7dcaed1461086b5780636168608b1461089557610470565b80634be744ab1461081757806355d0a1d01461082c57610470565b806342966c681461077c5780634549b039146107a657806347ae9cd8146107d857806349bd5a5e1461080257610470565b80631987be91116103fc5780632898cafa116103cb578063313ce567116103b0578063313ce567146106ee57806338966f8814610719578063395093511461074357610470565b80632898cafa146106af5780632d838119146106c457610470565b80631987be911461060f5780631dc83ab7146106245780631ffa30211461063957806323b872dd1461066c57610470565b806313114a9d1161043857806313114a9d1461059f5780631694505e146105b457806316d1d916146105e557806318160ddd146105fa57610470565b8063053ab1821461047557806306fdde03146104a1578063095ea7b31461052b578063106b9ca11461057857610470565b3661047057005b600080fd5b34801561048157600080fd5b5061049f6004803603602081101561049857600080fd5b5035610eb5565b005b3480156104ad57600080fd5b506104b6610f8d565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104f05781810151838201526020016104d8565b50505050905090810190601f16801561051d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561053757600080fd5b506105646004803603604081101561054e57600080fd5b506001600160a01b038135169060200135611041565b604080519115158252519081900360200190f35b34801561058457600080fd5b5061058d61105f565b60408051918252519081900360200190f35b3480156105ab57600080fd5b5061058d611065565b3480156105c057600080fd5b506105c961106b565b604080516001600160a01b039092168252519081900360200190f35b3480156105f157600080fd5b5061058d61107f565b34801561060657600080fd5b5061058d611085565b34801561061b57600080fd5b5061058d61108b565b34801561063057600080fd5b50610564611091565b34801561064557600080fd5b5061049f6004803603602081101561065c57600080fd5b50356001600160a01b03166110b1565b34801561067857600080fd5b506105646004803603606081101561068f57600080fd5b506001600160a01b03813581169160208101359091169060400135611162565b3480156106bb57600080fd5b5061058d6111e9565b3480156106d057600080fd5b5061058d600480360360208110156106e757600080fd5b5035611281565b3480156106fa57600080fd5b506107036112e3565b6040805160ff9092168252519081900360200190f35b34801561072557600080fd5b5061049f6004803603602081101561073c57600080fd5b50356112ec565b34801561074f57600080fd5b506105646004803603604081101561076657600080fd5b506001600160a01b03813516906020013561135b565b34801561078857600080fd5b5061049f6004803603602081101561079f57600080fd5b50356113a9565b3480156107b257600080fd5b5061058d600480360360408110156107c957600080fd5b508035906020013515156113bd565b3480156107e457600080fd5b5061058d600480360360208110156107fb57600080fd5b503561144d565b34801561080e57600080fd5b506105c9611470565b34801561082357600080fd5b5061058d61147f565b34801561083857600080fd5b5061058d611485565b34801561084d57600080fd5b5061058d6004803603602081101561086457600080fd5b5035611561565b34801561087757600080fd5b5061049f6004803603602081101561088e57600080fd5b503561157e565b3480156108a157600080fd5b506105646115ed565b3480156108b657600080fd5b506105c96115fb565b3480156108cb57600080fd5b5061049f600480360360208110156108e257600080fd5b50356001600160a01b031661160a565b3480156108fe57600080fd5b5061049f6004803603602081101561091557600080fd5b50356001600160a01b03166116df565b34801561093157600080fd5b5061058d6004803603602081101561094857600080fd5b50356001600160a01b0316611772565b34801561096457600080fd5b5061049f6117d4565b34801561097957600080fd5b5061049f6004803603604081101561099057600080fd5b506001600160a01b0381351690602001356118a0565b3480156109b257600080fd5b5061049f6118fa565b3480156109c757600080fd5b5061058d611f93565b3480156109dc57600080fd5b5061058d611f99565b3480156109f157600080fd5b506105c9611ffd565b348015610a0657600080fd5b506104b661200c565b348015610a1b57600080fd5b5061056460048036036040811015610a3257600080fd5b506001600160a01b03813516906020013561208b565b348015610a5457600080fd5b5061049f6120f3565b348015610a6957600080fd5b5061058d612169565b348015610a7e57600080fd5b5061056460048036036040811015610a9557600080fd5b506001600160a01b0381351690602001356121cb565b348015610ab757600080fd5b5061058d6121df565b348015610acc57600080fd5b5061056460048036036020811015610ae357600080fd5b50356001600160a01b03166121e5565b348015610aff57600080fd5b5061058d6121fa565b348015610b1457600080fd5b5061058d60048036036020811015610b2b57600080fd5b5035612215565b348015610b3e57600080fd5b5061049f60048036036020811015610b5557600080fd5b5035612232565b348015610b6857600080fd5b5061049f6122a1565b348015610b7d57600080fd5b5061056460048036036020811015610b9457600080fd5b50356001600160a01b03166123fd565b348015610bb057600080fd5b5061049f60048036036020811015610bc757600080fd5b5035612412565b348015610bda57600080fd5b5061049f60048036036020811015610bf157600080fd5b50356124dc565b348015610c0457600080fd5b506105c961254b565b348015610c1957600080fd5b5061058d61255d565b348015610c2e57600080fd5b5061058d6125e6565b348015610c4357600080fd5b5061049f6125ec565b348015610c5857600080fd5b50610564612690565b348015610c6d57600080fd5b5061058d612699565b348015610c8257600080fd5b5061049f60048036036020811015610c9957600080fd5b503561269f565b348015610cac57600080fd5b5061058d60048036036040811015610cc357600080fd5b506001600160a01b038135811691602001351661270e565b348015610ce757600080fd5b5061056460048036036020811015610cfe57600080fd5b50356001600160a01b0316612739565b348015610d1a57600080fd5b5061058d60048036036020811015610d3157600080fd5b503561274f565b348015610d4457600080fd5b5061058d61276c565b348015610d5957600080fd5b5061049f612772565b348015610d6e57600080fd5b5061058d612818565b348015610d8357600080fd5b5061049f60048036036020811015610d9a57600080fd5b50356001600160a01b031661281e565b348015610db657600080fd5b5061049f60048036036020811015610dcd57600080fd5b5035612937565b348015610de057600080fd5b5061049f60048036036020811015610df757600080fd5b50356001600160a01b03166129a6565b348015610e1357600080fd5b5061049f60048036036020811015610e2a57600080fd5b50356001600160a01b0316612b56565b348015610e4657600080fd5b5061049f60048036036020811015610e5d57600080fd5b50356001600160a01b0316612bfb565b348015610e7957600080fd5b5061049f60048036036020811015610e9057600080fd5b50356001600160a01b0316612e36565b348015610eac57600080fd5b5061049f612ec9565b6000610ebf6130b3565b6001600160a01b03811660009081526005602052604090205490915060ff1615610f1a5760405162461bcd60e51b815260040180806020018281038252602c81526020018061473d602c913960400191505060405180910390fd5b6000610f25836130b7565b505050506001600160a01b038316600090815260016020526040902054909150610f4f9082613103565b6001600160a01b038316600090815260016020526040902055600854610f759082613103565b600855600954610f85908461314c565b600955505050565b600a8054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110375780601f1061100c57610100808354040283529160200191611037565b820191906000526020600020905b81548152906001019060200180831161101a57829003601f168201915b5050505050905090565b600061105561104e6130b3565b84846131a6565b5060015b92915050565b60135481565b60095490565b600c5461010090046001600160a01b031681565b60145481565b60075490565b601a5481565b60006110aa60145460135461314c90919063ffffffff16565b4211905090565b6110b96130b3565b6000546001600160a01b0390811691161461111b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600d80547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b03938416179182905560118054929093169116179055565b600061116f848484613292565b6111df8461117b6130b3565b6111da8560405180606001604052806028815260200161465e602891396001600160a01b038a166000908152600360205260408120906111b96130b3565b6001600160a01b0316815260208101919091526040016000205491906133da565b6131a6565b5060019392505050565b601154604080517f70a08231000000000000000000000000000000000000000000000000000000008152600060048201819052915191926001600160a01b0316916370a0823191602480820192602092909190829003018186803b15801561125057600080fd5b505afa158015611264573d6000803e3d6000fd5b505050506040513d602081101561127a57600080fd5b5051905090565b60006008548211156112c45760405162461bcd60e51b815260040180806020018281038252602a8152602001806145cb602a913960400191505060405180910390fd5b60006112ce613471565b90506112da8382613494565b9150505b919050565b600c5460ff1690565b6112f46130b3565b6000546001600160a01b03908116911614611356576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b601955565b60006110556113686130b3565b846111da85600360006113796130b3565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549061314c565b6113ba6113b46130b3565b826134d6565b50565b6000600754831115611416576040805162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c7900604482015290519081900360640190fd5b81611434576000611426846130b7565b509294506110599350505050565b600061143f846130b7565b509194506110599350505050565b600061105961271061146a601954856135f090919063ffffffff16565b90613494565b600d546001600160a01b031681565b60185481565b600080601160009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156114d657600080fd5b505afa1580156114ea573d6000803e3d6000fd5b505050506040513d602081101561150057600080fd5b50519050600061150e6111e9565b905060006115258361146a8464e8d4a510006135f0565b600d54909150600090611540906001600160a01b0316611772565b9050600061155764e8d4a5100061146a84866135f0565b9550505050505090565b600061105961271061146a601854856135f090919063ffffffff16565b6115866130b3565b6000546001600160a01b039081169116146115e8576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b601455565b601754610100900460ff1681565b600e546001600160a01b031681565b6116126130b3565b6000546001600160a01b03908116911614611674576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b601c80546001600160a01b039092167fffffffffffffffffffffffff0000000000000000000000000000000000000000909216821790556000908152600460209081526040808320805460ff199081166001908117909255600f909352922080549091169091179055565b6116e76130b3565b6000546001600160a01b03908116911614611749576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19811660ff90911615179055565b6001600160a01b03811660009081526005602052604081205460ff16156117b257506001600160a01b0381166000908152600260205260409020546112de565b6001600160a01b03821660009081526001602052604090205461105990611281565b6117dc6130b3565b6000546001600160a01b0390811691161461183e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60006118d7826040518060600160405280602481526020016146af602491396118d0866118cb6130b3565b61270e565b91906133da565b90506118eb836118e56130b3565b836131a6565b6118f583836134d6565b505050565b60005a905061190833612739565b611959576040805162461bcd60e51b815260206004820152601760248201527f216861734d696e526562616c616e636542616c616e6365000000000000000000604482015290519081900360640190fd5b611961611091565b6119b2576040805162461bcd60e51b815260206004820152600e60248201527f21726562616c616e636561626c65000000000000000000000000000000000000604482015290519081900360640190fd5b4260135560175462010000900460ff16611a3157600c546119e290309061010090046001600160a01b0316613649565b600d54600c54611a03916001600160a01b0390811691610100900416613649565b601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff16620100001790555b601754610100900460ff1615611a5957611a596d4946c0e9f43f4dee607b0ef1fa1c80613649565b6000611a63612169565b1115611a7957611a79611a74612169565b613674565b601154604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600092611b15926001600160a01b03909116916370a0823191602480820192602092909190829003018186803b158015611ae457600080fd5b505afa158015611af8573d6000803e3d6000fd5b505050506040513d6020811015611b0e57600080fd5b505161274f565b9050601554611b2330611772565b10158015611b3357506000601554115b8015611b4857506017546301000000900460ff165b15611c3d57601c54601554611b6a9130916001600160a01b039091169061372b565b601c60009054906101000a90046001600160a01b03166001600160a01b0316636c208a536040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611bba57600080fd5b505af1158015611bce573d6000803e3d6000fd5b505050506040513d6020811015611be457600080fd5b5051611c37576040805162461bcd60e51b815260206004820152600760248201527f214164644c697100000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60006015555b611c4681613948565b50601c54604080517f21c2819100000000000000000000000000000000000000000000000000000000815233600482015290516000926001600160a01b0316916321c2819191602480830192602092919082900301818787803b158015611cac57600080fd5b505af1158015611cc0573d6000803e3d6000fd5b505050506040513d6020811015611cd657600080fd5b5051601154604080517ffff6cae900000000000000000000000000000000000000000000000000000000815290519293506001600160a01b039091169163fff6cae99160048082019260009290919082900301818387803b158015611d3a57600080fd5b505af1158015611d4e573d6000803e3d6000fd5b50506040805184815290517f811d4760f1a92875eb76dbd3dc2359544b2f6a000ba5b78784c0b105b3469bd09350908190036020019150a15060009050601036025a836152080103019050601760019054906101000a900460ff1615611f8f57604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000916d4946c0e9f43f4dee607b0ef1fa1c916370a0823191602480820192602092909190829003018186803b158015611e1657600080fd5b505afa158015611e2a573d6000803e3d6000fd5b505050506040513d6020811015611e4057600080fd5b50511115611eee57604080517f079d229f00000000000000000000000000000000000000000000000000000000815230600482015261a3db61374a840104602482015290516d4946c0e9f43f4dee607b0ef1fa1c9163079d229f9160448083019260209291908290030181600087803b158015611ebc57600080fd5b505af1158015611ed0573d6000803e3d6000fd5b505050506040513d6020811015611ee657600080fd5b50611f8f9050565b604080517f079d229f00000000000000000000000000000000000000000000000000000000815233600482015261a3db61374a840104602482015290516d4946c0e9f43f4dee607b0ef1fa1c9163079d229f9160448083019260209291908290030181600087803b158015611f6257600080fd5b505af1158015611f76573d6000803e3d6000fd5b505050506040513d6020811015611f8c57600080fd5b50505b5050565b60195481565b601154604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801561125057600080fd5b6000546001600160a01b031690565b600b8054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110375780601f1061100c57610100808354040283529160200191611037565b60006110556120986130b3565b846111da8560405180606001604052806025815260200161476960259139600360006120c26130b3565b6001600160a01b03908116825260208083019390935260409182016000908120918d168152925290205491906133da565b6120fb6130b3565b6000546001600160a01b0390811691161461215d576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6017805460ff19169055565b60008061217530611772565b116121815760006121c6565b6121c66015546040518060400160405280601b81526020017f756e646572666c6f77206f6e206c6f636b61626c65537570706c7900000000008152506118d030611772565b905090565b60006110556121d86130b3565b8484613292565b601b5481565b60046020526000908152604090205460ff1681565b60006121c66122076111e9565b61220f611f99565b9061314c565b600061105961271061146a601b54856135f090919063ffffffff16565b61223a6130b3565b6000546001600160a01b0390811691161461229c576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b601255565b6122a96130b3565b6000546001600160a01b0390811691161461230b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6016544211612361576040805162461bcd60e51b815260206004820152601060248201527f4e6f7420756e6c6f636b65642079657400000000000000000000000000000000604482015290519081900360640190fd5b601154604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156123c557600080fd5b505afa1580156123d9573d6000803e3d6000fd5b505050506040513d60208110156123ef57600080fd5b505190506113ba3382613aae565b600f6020526000908152604090205460ff1681565b61241a6130b3565b6000546001600160a01b0390811691161461247c576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60165442116124d2576040805162461bcd60e51b815260206004820152601060248201527f4e6f7420756e6c6f636b65642079657400000000000000000000000000000000604482015290519081900360640190fd5b6113ba3382613aae565b6124e46130b3565b6000546001600160a01b03908116911614612546576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b601b55565b6d4946c0e9f43f4dee607b0ef1fa1c81565b600080601160009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156125ae57600080fd5b505afa1580156125c2573d6000803e3d6000fd5b505050506040513d60208110156125d857600080fd5b50519050600061150e6121fa565b60165481565b6125f46130b3565b6000546001600160a01b03908116911614612656576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff81166101009182900460ff1615909102179055565b60175460ff1681565b60155481565b6126a76130b3565b6000546001600160a01b03908116911614612709576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b601855565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b600060125461274783611772565b101592915050565b600061105961271061146a601a54856135f090919063ffffffff16565b60125481565b61277a6130b3565b6000546001600160a01b039081169116146127dc576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff811663010000009182900460ff1615909102179055565b61271081565b6128266130b3565b6000546001600160a01b03908116911614612888576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03838116918217909255601c54604080517ff0f4426000000000000000000000000000000000000000000000000000000000815260048101939093525192169163f0f442609160248082019260009290919082900301818387803b15801561291c57600080fd5b505af1158015612930573d6000803e3d6000fd5b5050505050565b61293f6130b3565b6000546001600160a01b039081169116146129a1576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b601a55565b6129ae6130b3565b6000546001600160a01b03908116911614612a10576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811660009081526005602052604090205460ff1615612a7e576040805162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604482015290519081900360640190fd5b6001600160a01b03811660009081526001602052604090205415612ad8576001600160a01b038116600090815260016020526040902054612abe90611281565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152600560205260408120805460ff191660019081179091556006805491820181559091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b612b5e6130b3565b6000546001600160a01b03908116911614612bc0576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b612bd0612bcb611ffd565b6116df565b612be0612bdb611ffd565b612e36565b612be9816116df565b612bf281612e36565b6113ba81613b1d565b612c036130b3565b6000546001600160a01b03908116911614612c65576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811660009081526005602052604090205460ff16612cd2576040805162461bcd60e51b815260206004820152601b60248201527f4163636f756e7420697320616c7265616479206578636c756465640000000000604482015290519081900360640190fd5b60005b600654811015611f8f57816001600160a01b031660068281548110612cf657fe5b6000918252602090912001546001600160a01b03161415612e2e57600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110612d4157fe5b600091825260209091200154600680546001600160a01b039092169183908110612d6757fe5b600091825260208083209190910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039485161790559184168152600282526040808220829055600590925220805460ff191690556006805480612dd157fe5b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055611f8f565b600101612cd5565b612e3e6130b3565b6000546001600160a01b03908116911614612ea0576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03166000908152600f60205260409020805460ff19811660ff90911615179055565b601060009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015612f1757600080fd5b505afa158015612f2b573d6000803e3d6000fd5b505050506040513d6020811015612f4157600080fd5b5051601054604080517fad5c464800000000000000000000000000000000000000000000000000000000815290516001600160a01b039384169363c9c6539693309391169163ad5c464891600480820192602092909190829003018186803b158015612fac57600080fd5b505afa158015612fc0573d6000803e3d6000fd5b505050506040513d6020811015612fd657600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b1681526001600160a01b0393841660048201529290911660248301525160448083019260209291908290030181600087803b15801561304057600080fd5b505af1158015613054573d6000803e3d6000fd5b505050506040513d602081101561306a57600080fd5b5051600d80547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b03938416179182905560118054929093169116179055565b3390565b60008060008060008060006130cb88613c3f565b9150915060006130d9613471565b905060008060006130eb8c8686613c67565b919e909d50909b509599509397509395505050505050565b600061314583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506133da565b9392505050565b600082820183811015613145576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0383166131eb5760405162461bcd60e51b81526004018080602001828103825260248152602001806147196024913960400191505060405180910390fd5b6001600160a01b0382166132305760405162461bcd60e51b815260040180806020018281038252602281526020018061461b6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260036020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60175460ff1680156132bd57506001600160a01b0383166000908152600f602052604090205460ff16155b1561330f576040805162461bcd60e51b815260206004820181905260248201527f4c6f636b656420756e74696c20656e64206f6620646973747269627574696f6e604482015290519081900360640190fd5b6001600160a01b03831660009081526004602052604090205460ff1615801561335157506001600160a01b03821660009081526004602052604090205460ff16155b8015613360575060175460ff16155b156133cf5760006133708261144d565b9050600061337d83611561565b905061338a85308361372b565b601554613397908261314c565b6015556133a585308461372b565b60006133b1828461314c565b90506133c786866133c28785613103565b61372b565b5050506118f5565b6118f583838361372b565b600081848411156134695760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561342e578181015183820152602001613416565b50505050905090810190601f16801561345b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600080600061347e613ca3565b909250905061348d8282613494565b9250505090565b600061314583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613e06565b6001600160a01b03821661351b5760405162461bcd60e51b81526004018080602001828103825260218152602001806146d36021913960400191505060405180910390fd5b613558816040518060600160405280602281526020016145a9602291396001600160a01b03851660009081526001602052604090205491906133da565b60016000846001600160a01b03166001600160a01b03168152602001908152602001600020819055506135a8816040518060600160405280602281526020016145a96022913960075491906133da565b6007556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000826135ff57506000611059565b8282028284828161360c57fe5b04146131455760405162461bcd60e51b815260040180806020018281038252602181526020018061463d6021913960400191505060405180910390fd5b611f8f82827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff613e6b565b600d5461368c9030906001600160a01b03168361372b565b601160009054906101000a90046001600160a01b03166001600160a01b031663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156136dc57600080fd5b505af11580156136f0573d6000803e3d6000fd5b50506040805184815290517f8765d2bb982ed6ee74d2b03c76c9c129aa4a4e3e6b17bd7cf7830088e9d490549350908190036020019150a150565b6001600160a01b0383166137705760405162461bcd60e51b81526004018080602001828103825260258152602001806146f46025913960400191505060405180910390fd5b6001600160a01b0382166137b55760405162461bcd60e51b81526004018080602001828103825260238152602001806145866023913960400191505060405180910390fd5b600081116137f45760405162461bcd60e51b81526004018080602001828103825260298152602001806146866029913960400191505060405180910390fd5b6001600160a01b03831660009081526005602052604090205460ff16801561383557506001600160a01b03821660009081526005602052604090205460ff16155b1561384a5761384583838361401a565b6118f5565b6001600160a01b03831660009081526005602052604090205460ff1615801561388b57506001600160a01b03821660009081526005602052604090205460ff165b1561389b576138458383836141d6565b6001600160a01b03831660009081526005602052604090205460ff161580156138dd57506001600160a01b03821660009081526005602052604090205460ff16155b156138ed57613845838383614338565b6001600160a01b03831660009081526005602052604090205460ff16801561392d57506001600160a01b03821660009081526005602052604090205460ff165b1561393d57613845838383614435565b6118f5838383614338565b601154600c54604080517f095ea7b30000000000000000000000000000000000000000000000000000000081526101009092046001600160a01b039081166004840152602483018590529051600093919091169163095ea7b391604480830192602092919082900301818787803b1580156139c257600080fd5b505af11580156139d6573d6000803e3d6000fd5b505050506040513d60208110156139ec57600080fd5b5050601054601c54604080517faf2979eb00000000000000000000000000000000000000000000000000000000815230600482015260248101869052600060448201819052606482018190526001600160a01b0393841660848301524260a48301529151929093169263af2979eb9260c48083019360209383900390910190829087803b158015613a7c57600080fd5b505af1158015613a90573d6000803e3d6000fd5b505050506040513d6020811015613aa657600080fd5b505192915050565b601154604080517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018590529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015611f6257600080fd5b613b256130b3565b6000546001600160a01b03908116911614613b87576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b038116613bcc5760405162461bcd60e51b81526004018080602001828103825260268152602001806145f56026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60008080613c4e846064613494565b90506000613c5c8583613103565b935090915050915091565b6000808080613c7687866135f0565b90506000613c8487876135f0565b90506000613c928383613103565b929992985090965090945050505050565b6008546007546000918291825b600654811015613dd457826001600060068481548110613ccc57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020541180613d315750816002600060068481548110613d0a57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15613d485760085460075494509450505050613e02565b613d886001600060068481548110613d5c57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548490613103565b9250613dca6002600060068481548110613d9e57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390613103565b9150600101613cb0565b50600754600854613de491613494565b821015613dfc57600854600754935093505050613e02565b90925090505b9091565b60008183613e555760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561342e578181015183820152602001613416565b506000838581613e6157fe5b0495945050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f095ea7b300000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310613f3457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613ef7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613f96576040519150601f19603f3d011682016040523d82523d6000602084013e613f9b565b606091505b5091509150818015613fc9575080511580613fc95750808060200190516020811015613fc657600080fd5b50515b612930576040805162461bcd60e51b815260206004820152601e60248201527f5472616e7366657248656c7065723a20415050524f56455f4641494c45440000604482015290519081900360640190fd5b600080600080600061402b866130b7565b6001600160a01b038d166000908152600460205260409020549499509297509095509350915060ff168061407757506001600160a01b03871660009081526004602052604090205460ff165b1561409957614086848461314c565b9350614092828261314c565b91506140f4565b6140a38382614561565b604080516001600160a01b038a168152600360208201528082018790526060810188905290517fb0c7ad67bb089f910de90ed6e1efd1067c85d1947e2b901ffce5febef59bb1959181900360800190a15b6001600160a01b0388166000908152600260205260409020546141179087613103565b6001600160a01b0389166000908152600260209081526040808320939093556001905220546141469086613103565b6001600160a01b03808a166000908152600160205260408082209390935590891681522054614175908561314c565b6001600160a01b0380891660008181526001602090815260409182902094909455805186815290519193928c16927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35050505050505050565b60008060008060006141e7866130b7565b6001600160a01b038d166000908152600460205260409020549499509297509095509350915060ff168061423357506001600160a01b03871660009081526004602052604090205460ff165b1561425557614242848461314c565b935061424e828261314c565b91506142b0565b61425f8382614561565b604080516001600160a01b038a168152600260208201528082018790526060810188905290517fb0c7ad67bb089f910de90ed6e1efd1067c85d1947e2b901ffce5febef59bb1959181900360800190a15b6001600160a01b0388166000908152600160205260409020546142d39086613103565b6001600160a01b03808a16600090815260016020908152604080832094909455918a16815260029091522054614309908361314c565b6001600160a01b038816600090815260026020908152604080832093909355600190522054614175908561314c565b6000806000806000614349866130b7565b6001600160a01b038d166000908152600460205260409020549499509297509095509350915060ff168061439557506001600160a01b03871660009081526004602052604090205460ff165b156143b7576143a4848461314c565b93506143b0828261314c565b9150614412565b6143c18382614561565b604080516001600160a01b038a168152600160208201528082018790526060810188905290517fb0c7ad67bb089f910de90ed6e1efd1067c85d1947e2b901ffce5febef59bb1959181900360800190a15b6001600160a01b0388166000908152600160205260409020546141469086613103565b6000806000806000614446866130b7565b6001600160a01b038d166000908152600460205260409020549499509297509095509350915060ff168061449257506001600160a01b03871660009081526004602052604090205460ff165b156144b4576144a1848461314c565b93506144ad828261314c565b915061450f565b6144be8382614561565b604080516001600160a01b038a168152600460208201528082018790526060810188905290517fb0c7ad67bb089f910de90ed6e1efd1067c85d1947e2b901ffce5febef59bb1959181900360800190a15b6001600160a01b0388166000908152600260205260409020546145329087613103565b6001600160a01b0389166000908152600260209081526040808320939093556001905220546142d39086613103565b60085461456e9083613103565b60085560095461457e908261314c565b600955505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e6365416d6f756e74206d757374206265206c657373207468616e20746f74616c207265666c656374696f6e734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63655472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734578636c75646564206164647265737365732063616e6e6f742063616c6c20746869732066756e6374696f6e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212201bd7201678a90873d2b6d5f92bcebcb8c4a2476fb437c38192fd5d17f06218b864736f6c634300060c0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000008d10258d526aebcd8815e0767332305be74c5c98

-----Decoded View---------------
Arg [0] : balancerAddr (address): 0x8D10258D526AebCd8815e0767332305be74c5C98

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000008d10258d526aebcd8815e0767332305be74c5c98


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.