Scroll Sepolia Testnet

Token

BrownFI V1 (BRF-V1)
ERC-20

Overview

Max Total Supply

0.000001414213562373 BRF-V1

Holders

1

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000000000000001 BRF-V1
0x0000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
BrownFiV1Pair

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 12 : BrownFiV1Pair.sol
pragma solidity =0.5.16;

import './interfaces/IBrownFiV1Pair.sol';
import './BrownFiV1ERC20.sol';
import './libraries/Math.sol';
import './libraries/UQ112x112.sol';
import './interfaces/IERC20.sol';
import './interfaces/IBrownFiV1Factory.sol';
import './interfaces/IBrownFiV1Callee.sol';
import '@uniswap/lib/contracts/libraries/FullMath.sol';
import './interfaces/AggregatorV3Interface.sol';

contract BrownFiV1Pair is IBrownFiV1Pair, BrownFiV1ERC20 {
    using SafeMath  for uint;
    using SafeMath  for uint112;
    using UQ112x112 for uint224;

    // avoids stack too deep errors
    struct Balances {
        uint balance0;
        uint balance1;
    }
    struct Inventories {
        uint preInvetory;
        uint postInvetory;
    }

    uint256 internal constant Q128 = 1 << 128;
    uint256 internal constant FEE_DENOMINATOR = 10000;
    uint public constant MINIMUM_LIQUIDITY = 10**3;
    bytes4 private constant SELECTOR = bytes4(keccak256(bytes('transfer(address,uint256)')));

    address public factory;
    address public token0;
    address public token1;

    uint112 private reserve0;           // uses single storage slot, accessible via getReserves
    uint112 private reserve1;           // uses single storage slot, accessible via getReserves
    uint32  private blockTimestampLast; // uses single storage slot, accessible via getReserves

    uint private unlocked = 1;

    // new variables
    uint public kappa = Q128.mul(2); // kappa = 2
    address public priceFeed;
    uint public fee = 0; // fee = 0%
    // quote token index
    uint public qti = 0; // qti = 0
    // shift decimal
    int public decimalShift = 0;

    modifier lock() {
        require(unlocked == 1, 'BrownFiV1: LOCKED');
        unlocked = 0;
        _;
        unlocked = 1;
    }

    function setKappa(uint _kappa) external {
        require(msg.sender == IBrownFiV1Factory(factory).setter(), 'BrownFiV1: FORBIDDEN');
        // kappa limitation [0.001, 2]
        require(_kappa >= Q128 / 1000 && _kappa <= Q128.mul(2), 'BrownFiV1: INVALID_KAPPA');
        kappa = _kappa;
    }

    function setFee(uint _fee) external {
        require(msg.sender == IBrownFiV1Factory(factory).setter(), 'BrownFiV1: FORBIDDEN');
        fee = _fee;
    }

    function setQTI(uint _qti) external {
        require(msg.sender == IBrownFiV1Factory(factory).setter(), 'BrownFiV1: FORBIDDEN');
        qti = _qti;
    }

    function setPriceFeed(address _priceFeed) external {
        require(msg.sender == IBrownFiV1Factory(factory).setter(), 'BrownFiV1: FORBIDDEN');
        priceFeed = _priceFeed;
    }

    function setDecimalShift(int _decimalShift) external {
        require(msg.sender == IBrownFiV1Factory(factory).setter(), 'BrownFiV1: FORBIDDEN');
        decimalShift = _decimalShift;
    }

    function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {
        _reserve0 = reserve0;
        _reserve1 = reserve1;
        _blockTimestampLast = blockTimestampLast;
    }

    // Feed oracle price using chainlink interface
    function fetchOraclePrice() public view returns (uint) {
        AggregatorV3Interface _priceFeed = AggregatorV3Interface(priceFeed);
        (
            /* uint80 roundID, */,
            int price,
            /* uint startedAt, */,
            /* uint timeStamp, */,
            /* uint80 answeredInRound */
        ) = _priceFeed.latestRoundData();
        // get decimals from oracle
        uint8 decimals = _priceFeed.decimals();
        // convert price to Q128 base on decimals
        if (qti == 0) {
            if (decimalShift > 0) {
                return FullMath.mulDiv(10**uint(decimals) * 10**uint(decimalShift), Q128, uint(price));
            } else if (decimalShift < 0) {
                return FullMath.mulDiv(10**uint(decimals), Q128, uint(price) * 10**uint(-decimalShift));
            } else {
                return FullMath.mulDiv(10**uint(decimals), Q128, uint(price));
            }
        }
        else {
            if (decimalShift > 0) {
                return FullMath.mulDiv(uint(price), Q128, 10**uint(decimals) * 10**uint(decimalShift));
            } else if (decimalShift < 0) {
                return FullMath.mulDiv(uint(price) * 10**uint(-decimalShift), Q128, 10**uint(decimals));
            } else {
                return FullMath.mulDiv(uint(price), Q128, 10**uint(decimals));
            }
        }
    }

    function _safeTransfer(address token, address to, uint value) private {
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'BrownFiV1: TRANSFER_FAILED');
    }

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to,
        uint swapPrice
    );
    event Sync(uint112 reserve0, uint112 reserve1);

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

    // called once by the factory at time of deployment
    function initialize(address _token0, address _token1) external {
        require(msg.sender == factory, 'BrownFiV1: FORBIDDEN'); // sufficient check
        token0 = _token0;
        token1 = _token1;
    }

    // update reserves and, on the first call per block, price accumulators
    function _update(uint balance0, uint balance1, uint112 _reserve0, uint112 _reserve1) private {
        require(balance0 <= uint112(-1) && balance1 <= uint112(-1), 'BrownFiV1: OVERFLOW');
        uint32 blockTimestamp = uint32(block.timestamp % 2**32);
        reserve0 = uint112(balance0);
        reserve1 = uint112(balance1);
        blockTimestampLast = blockTimestamp;
        emit Sync(reserve0, reserve1);
    }

    // this low-level function should be called from a contract which performs important safety checks
    function mint(address to) external lock returns (uint liquidity) {
        (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
        uint balance0 = IERC20(token0).balanceOf(address(this));
        uint balance1 = IERC20(token1).balanceOf(address(this));
        uint amount0 = balance0.sub(_reserve0);
        uint amount1 = balance1.sub(_reserve1);

        uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
        if (_totalSupply == 0) {
            liquidity = Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);
           _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens
        } else {
            liquidity = Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);
        }
        require(liquidity > 0, 'BrownFiV1: INSUFFICIENT_LIQUIDITY_MINTED');
        _mint(to, liquidity);

        _update(balance0, balance1, _reserve0, _reserve1);
        emit Mint(msg.sender, amount0, amount1);
    }

    // this low-level function should be called from a contract which performs important safety checks
    function burn(address to) external lock returns (uint amount0, uint amount1) {
        (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
        address _token0 = token0;                                // gas savings
        address _token1 = token1;                                // gas savings
        uint balance0 = IERC20(_token0).balanceOf(address(this));
        uint balance1 = IERC20(_token1).balanceOf(address(this));
        uint liquidity = balanceOf[address(this)];

        uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
        amount0 = liquidity.mul(balance0) / _totalSupply; // using balances ensures pro-rata distribution
        amount1 = liquidity.mul(balance1) / _totalSupply; // using balances ensures pro-rata distribution
        require(amount0 > 0 && amount1 > 0, 'BrownFiV1: INSUFFICIENT_LIQUIDITY_BURNED');
        _burn(address(this), liquidity);
        _safeTransfer(_token0, to, amount0);
        _safeTransfer(_token1, to, amount1);
        balance0 = IERC20(_token0).balanceOf(address(this));
        balance1 = IERC20(_token1).balanceOf(address(this));

        _update(balance0, balance1, _reserve0, _reserve1);
        emit Burn(msg.sender, amount0, amount1, to);
    }

    // this low-level function should be called from a contract which performs important safety checks
    function swap(
        uint amount0Out,
        uint amount1Out,
        address to,
        bytes calldata data
    ) external lock {
        require(amount0Out > 0 || amount1Out > 0, 'BrownFiV1: INSUFFICIENT_OUTPUT_AMOUNT');
        (uint112 _reserve0, uint112 _reserve1,) = getReserves(); // gas savings
        require(amount0Out < _reserve0 && amount1Out < _reserve1, 'BrownFiV1: INSUFFICIENT_LIQUIDITY');

        Balances memory b;
        { // scope for _token{0,1}, avoids stack too deep errors
        address _token0 = token0;
        address _token1 = token1;
        require(to != _token0 && to != _token1, 'BrownFiV1: INVALID_TO');
        if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens
        if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens
        if (data.length > 0) IBrownFiV1Callee(to).brownFiV1Call(msg.sender, amount0Out, amount1Out, data);
        b.balance0 = IERC20(_token0).balanceOf(address(this));
        b.balance1 = IERC20(_token1).balanceOf(address(this));
        }
        uint amount0In = b.balance0 > _reserve0 - amount0Out ? b.balance0 - (_reserve0 - amount0Out) : 0;
        uint amount1In = b.balance1 > _reserve1 - amount1Out ? b.balance1 - (_reserve1 - amount1Out) : 0;
        require(amount0In > 0 || amount1In > 0, 'BrownFiV1: INSUFFICIENT_INPUT_AMOUNT');

        // verify post-trade invetory is greater or equal to pre-trade invetory
        uint swapPrice = checkInvetory(amount0Out, amount1Out, b.balance0, b.balance1, _reserve0, _reserve1);
        emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to, swapPrice);
    }

    function checkInvetory(
        uint amount0Out,
        uint amount1Out,
        uint balance0,
        uint balance1,
        uint112 _reserve0,
        uint112 _reserve1
    ) private returns (uint) {
        uint oPrice = fetchOraclePrice();
        Inventories memory i;
        uint amount0OutWithoutFee;
        uint amount1OutWithoutFee;
        if (amount0Out > 0) amount0OutWithoutFee = FullMath.mulDiv(amount0Out, FEE_DENOMINATOR, FEE_DENOMINATOR - fee);
        if (amount1Out > 0) amount1OutWithoutFee = FullMath.mulDiv(amount1Out, FEE_DENOMINATOR, FEE_DENOMINATOR - fee);
        if (amount0OutWithoutFee > 0) {
            // calculate pre-trade invetory x*P + y + (P*K*dx*dx) / 2*(x - dx)
            // (P*K*dx*dx)
            uint denominator = FullMath.mulDiv(oPrice, amount0OutWithoutFee, Q128)
                .mul(FullMath.mulDiv(kappa, amount0OutWithoutFee, Q128));
            // 2*(x - dx)
            uint numerator = (_reserve0 - amount0OutWithoutFee).mul(2);
            i.preInvetory = FullMath.mulDiv(oPrice, _reserve0, Q128).add(_reserve1).add(denominator / numerator);
            _update(balance0, balance1, _reserve0, _reserve1);
            // calculate post-trade invetory (x - dx)*P + (y + dy)
            i.postInvetory = FullMath.mulDiv(oPrice, _reserve0 - amount0OutWithoutFee, Q128).add(reserve1);
        }
        if (amount1OutWithoutFee > 0) {
            // calculate pre-trade invetory x*P + y + (K*dx*dx) / 2*(y - dy)
            // (K*dy*dy)
            uint denominator = (FullMath.mulDiv(kappa, amount1OutWithoutFee, Q128)).mul(amount1OutWithoutFee);
            // 2*(y - dy)
            uint numerator = (_reserve1 - amount1OutWithoutFee).mul(2);
            i.preInvetory = FullMath.mulDiv(oPrice, _reserve0, Q128).add(_reserve1).add(denominator / numerator);
            _update(balance0, balance1, _reserve0, _reserve1);
            // calculate post-trade invetory (x + dx)*P + (y - dy)
            i.postInvetory = FullMath.mulDiv(oPrice, reserve0, Q128).add(_reserve1 - amount1OutWithoutFee);
        }
        // verification
        require(i.postInvetory >= i.preInvetory, 'BrownFiV1: INVALID_TRADE');
        return oPrice;
    }

    // force balances to match reserves
    function skim(address to) external lock {
        address _token0 = token0; // gas savings
        address _token1 = token1; // gas savings
        _safeTransfer(_token0, to, IERC20(_token0).balanceOf(address(this)).sub(reserve0));
        _safeTransfer(_token1, to, IERC20(_token1).balanceOf(address(this)).sub(reserve1));
    }

    // force reserves to match balances
    function sync() external lock {
        _update(IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1);
    }
}

File 2 of 12 : FullMath.sol
// SPDX-License-Identifier: CC-BY-4.0
pragma solidity >=0.4.0;

// taken from https://medium.com/coinmonks/math-in-solidity-part-3-percents-and-proportions-4db014e080b1
// license is CC-BY-4.0
library FullMath {
    function fullMul(uint256 x, uint256 y) internal pure returns (uint256 l, uint256 h) {
        uint256 mm = mulmod(x, y, uint256(-1));
        l = x * y;
        h = mm - l;
        if (mm < l) h -= 1;
    }

    function fullDiv(
        uint256 l,
        uint256 h,
        uint256 d
    ) private pure returns (uint256) {
        uint256 pow2 = d & -d;
        d /= pow2;
        l /= pow2;
        l += h * ((-pow2) / pow2 + 1);
        uint256 r = 1;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        r *= 2 - d * r;
        return l * r;
    }

    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 d
    ) internal pure returns (uint256) {
        (uint256 l, uint256 h) = fullMul(x, y);

        uint256 mm = mulmod(x, y, d);
        if (mm > l) h -= 1;
        l -= mm;

        if (h == 0) return l / d;

        require(h < d, 'FullMath: FULLDIV_OVERFLOW');
        return fullDiv(l, h, d);
    }
}

File 3 of 12 : BrownFiV1ERC20.sol
pragma solidity =0.5.16;

import './interfaces/IBrownFiV1ERC20.sol';
import './libraries/SafeMath.sol';

contract BrownFiV1ERC20 is IBrownFiV1ERC20 {
    using SafeMath for uint;

    string public constant name = 'BrownFI V1';
    string public constant symbol = 'BRF-V1';
    uint8 public constant decimals = 18;
    uint  public totalSupply;
    mapping(address => uint) public balanceOf;
    mapping(address => mapping(address => uint)) public allowance;

    bytes32 public DOMAIN_SEPARATOR;
    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
    mapping(address => uint) public nonces;

    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    constructor() public {
        uint chainId;
        assembly {
            chainId := chainid
        }
        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'),
                keccak256(bytes(name)),
                keccak256(bytes('1')),
                chainId,
                address(this)
            )
        );
    }

    function _mint(address to, uint value) internal {
        totalSupply = totalSupply.add(value);
        balanceOf[to] = balanceOf[to].add(value);
        emit Transfer(address(0), to, value);
    }

    function _burn(address from, uint value) internal {
        balanceOf[from] = balanceOf[from].sub(value);
        totalSupply = totalSupply.sub(value);
        emit Transfer(from, address(0), value);
    }

    function _approve(address owner, address spender, uint value) private {
        allowance[owner][spender] = value;
        emit Approval(owner, spender, value);
    }

    function _transfer(address from, address to, uint value) private {
        balanceOf[from] = balanceOf[from].sub(value);
        balanceOf[to] = balanceOf[to].add(value);
        emit Transfer(from, to, value);
    }

    function approve(address spender, uint value) external returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    function transfer(address to, uint value) external returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    function transferFrom(address from, address to, uint value) external returns (bool) {
        if (allowance[from][msg.sender] != uint(-1)) {
            allowance[from][msg.sender] = allowance[from][msg.sender].sub(value);
        }
        _transfer(from, to, value);
        return true;
    }

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
        require(deadline >= block.timestamp, 'BrownFiV1: EXPIRED');
        bytes32 digest = keccak256(
            abi.encodePacked(
                '\x19\x01',
                DOMAIN_SEPARATOR,
                keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
            )
        );
        address recoveredAddress = ecrecover(digest, v, r, s);
        require(recoveredAddress != address(0) && recoveredAddress == owner, 'BrownFiV1: INVALID_SIGNATURE');
        _approve(owner, spender, value);
    }
}

File 4 of 12 : AggregatorV3Interface.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0;

interface AggregatorV3Interface {
    function decimals() external view returns (uint8);

    function description() external view returns (string memory);

    function version() external view returns (uint256);

    function getRoundData(
        uint80 _roundId
    )
        external
        view
        returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);

    function latestRoundData()
        external
        view
        returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
}

File 5 of 12 : IBrownFiV1Callee.sol
pragma solidity >=0.5.0;

interface IBrownFiV1Callee {
    function brownFiV1Call(address sender, uint amount0, uint amount1, bytes calldata data) external;
}

File 6 of 12 : IBrownFiV1ERC20.sol
pragma solidity >=0.5.0;

interface IBrownFiV1ERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
}

File 7 of 12 : IBrownFiV1Factory.sol
pragma solidity >=0.5.0;

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

    function setter() 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 setSetter(address) external;
}

File 8 of 12 : IBrownFiV1Pair.sol
pragma solidity >=0.5.0;

interface IBrownFiV1Pair {

    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;

    function fetchOraclePrice() external view returns (uint);
    function kappa() external view returns (uint);
    function fee() external view returns (uint);
    function priceFeed() external view returns (address);
    function qti() external view returns (uint);
    function decimalShift() external view returns (int);
}

File 9 of 12 : IERC20.sol
pragma solidity >=0.5.0;

interface IERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
}

File 10 of 12 : Math.sol
pragma solidity =0.5.16;

// a library for performing various math operations

library Math {
    function min(uint x, uint y) internal pure returns (uint z) {
        z = x < y ? x : y;
    }

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint y) internal pure returns (uint z) {
        if (y > 3) {
            z = y;
            uint x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }
}

File 11 of 12 : SafeMath.sol
pragma solidity =0.5.16;

// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)

library SafeMath {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'ds-math-add-overflow');
    }

    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x, 'ds-math-sub-underflow');
    }

    function mul(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
    }
}

File 12 of 12 : UQ112x112.sol
pragma solidity =0.5.16;

// a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format))

// range: [0, 2**112 - 1]
// resolution: 1 / 2**112

library UQ112x112 {
    uint224 constant Q112 = 2**112;

    // encode a uint112 as a UQ112x112
    function encode(uint112 y) internal pure returns (uint224 z) {
        z = uint224(y) * Q112; // never overflows
    }

    // divide a UQ112x112 by a uint112, returning a UQ112x112
    function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {
        z = x / uint224(y);
    }
}

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

Contract ABI

API
[{"inputs":[],"payable":false,"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":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"swapPrice","type":"uint256"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint112","name":"reserve0","type":"uint112"},{"indexed":false,"internalType":"uint112","name":"reserve1","type":"uint112"}],"name":"Sync","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"},{"constant":true,"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MINIMUM_LIQUIDITY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimalShift","outputs":[{"internalType":"int256","name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"fetchOraclePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint112","name":"_reserve0","type":"uint112"},{"internalType":"uint112","name":"_reserve1","type":"uint112"},{"internalType":"uint32","name":"_blockTimestampLast","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"kappa","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"priceFeed","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"qti","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"int256","name":"_decimalShift","type":"int256"}],"name":"setDecimalShift","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_kappa","type":"uint256"}],"name":"setKappa","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_priceFeed","type":"address"}],"name":"setPriceFeed","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_qti","type":"uint256"}],"name":"setQTI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"sync","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040526001600955620000286002600160801b6200012f60201b62002f4f1790919060201c565b600a556000600c556000600d556000600e553480156200004757600080fd5b506040514690806052620038148239604080519182900360520182208282018252600a83526942726f776e464920563160b01b6020938401528151808301835260018152603160f81b908401528151808401919091527fa5a13ee614b8f13ac266e9da78720c46238a6d85a587eef56ff2fac77a36003b818301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101949094523060a0808601919091528151808603909101815260c09094019052825192019190912060035550600580546001600160a01b03191633179055620001a4565b60008115806200014c575050808202828282816200014957fe5b04145b6200019e576040805162461bcd60e51b815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b92915050565b61366080620001b46000396000f3fe608060405234801561001057600080fd5b50600436106102415760003560e01c806370a0823111610145578063ba9a7a56116100bd578063d505accf1161008c578063dd62ed3e11610071578063dd62ed3e1461077f578063ddca3f43146107ba578063fff6cae9146107c257610241565b8063d505accf14610719578063dae5f0fd1461077757610241565b8063ba9a7a56146106ce578063bc25cf77146106d6578063c45a015514610709578063d21220a71461071157610241565b806389afcb4411610114578063a9059cbb116100f9578063a9059cbb14610670578063add1c817146106a9578063b519f43f146106b157610241565b806389afcb441461061c57806395d89b411461066857610241565b806370a082311461057b578063724e78da146105ae578063741bef1a146105e15780637ecebe00146105e957610241565b806330adf81f116101d857806356539200116101a757806369fe0e2d1161018c57806369fe0e2d146105235780636a627842146105405780636bba3f2f1461057357610241565b806356539200146104fe5780635e8b5a561461050657610241565b806330adf81f14610495578063313ce5671461049d5780633644e515146104bb578063485cc955146104c357610241565b80630dfe1681116102145780630dfe1681146103ea57806318160ddd1461041b57806323b872dd1461043557806324fcffe81461047857610241565b8063022c0d9f1461024657806306fdde03146102e15780630902f1ac1461035e578063095ea7b31461039d575b600080fd5b6102df6004803603608081101561025c57600080fd5b81359160208101359173ffffffffffffffffffffffffffffffffffffffff60408301351691908101906080810160608201356401000000008111156102a057600080fd5b8201836020820111156102b257600080fd5b803590602001918460018302840111640100000000831117156102d457600080fd5b5090925090506107ca565b005b6102e9610dc3565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561032357818101518382015260200161030b565b50505050905090810190601f1680156103505780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610366610dfc565b604080516dffffffffffffffffffffffffffff948516815292909316602083015263ffffffff168183015290519081900360600190f35b6103d6600480360360408110156103b357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610e51565b604080519115158252519081900360200190f35b6103f2610e68565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610423610e84565b60408051918252519081900360200190f35b6103d66004803603606081101561044b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610e8a565b6102df6004803603602081101561048e57600080fd5b5035610f6a565b610423611086565b6104a56110aa565b6040805160ff9092168252519081900360200190f35b6104236110af565b6102df600480360360408110156104d957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166110b5565b61042361118e565b6102df6004803603602081101561051c57600080fd5b5035611194565b6102df6004803603602081101561053957600080fd5b503561135b565b6104236004803603602081101561055657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611477565b6104236117ec565b6104236004803603602081101561059157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166117f2565b6102df600480360360208110156105c457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611804565b6103f2611962565b610423600480360360208110156105ff57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661197e565b61064f6004803603602081101561063257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611990565b6040805192835260208301919091528051918290030190f35b6102e9611ddd565b6103d66004803603604081101561068657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611e16565b610423611e23565b6102df600480360360208110156106c757600080fd5b5035612089565b6104236121a5565b6102df600480360360208110156106ec57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166121ab565b6103f26123a1565b6103f26123bd565b6102df600480360360e081101561072f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c001356123d9565b6104236126a5565b6104236004803603604081101561079557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166126ab565b6104236126c8565b6102df6126ce565b60095460011461083b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f42726f776e466956313a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b60006009558415158061084e5750600084115b6108a3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806135726025913960400191505060405180910390fd5b6000806108ae610dfc565b5091509150816dffffffffffffffffffffffffffff16871080156108e15750806dffffffffffffffffffffffffffff1686105b610936576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806135e76021913960400191505060405180910390fd5b61093e613557565b60065460075473ffffffffffffffffffffffffffffffffffffffff91821691908116908816821480159061099e57508073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614155b610a0957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f42726f776e466956313a20494e56414c49445f544f0000000000000000000000604482015290519081900360640190fd5b8915610a1a57610a1a82898c6128b4565b8815610a2b57610a2b81898b6128b4565b8515610b0d578773ffffffffffffffffffffffffffffffffffffffff16637b9c231e338c8c8b8b6040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b158015610af457600080fd5b505af1158015610b08573d6000803e3d6000fd5b505050505b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b158015610b7957600080fd5b505afa158015610b8d573d6000803e3d6000fd5b505050506040513d6020811015610ba357600080fd5b50518352604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8316916370a08231916024808301926020929190829003018186803b158015610c1357600080fd5b505afa158015610c27573d6000803e3d6000fd5b505050506040513d6020811015610c3d57600080fd5b50516020840152505080516000906dffffffffffffffffffffffffffff85168a900310610c6b576000610c85565b88846dffffffffffffffffffffffffffff16038260000151035b9050600088846dffffffffffffffffffffffffffff1603836020015111610cad576000610cc7565b88846dffffffffffffffffffffffffffff16038360200151035b90506000821180610cd85750600081115b610d2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806136086024913960400191505060405180910390fd5b6000610d458b8b866000015187602001518a8a612ac1565b60408051858152602081018590528082018e9052606081018d905260808101839052905191925073ffffffffffffffffffffffffffffffffffffffff8b169133917f606ecd02b3e3b4778f8e97b2e03351de14224efaa5fa64e62200afc9395c2499919081900360a00190a350506001600955505050505050505050565b6040518060400160405280600a81526020017f42726f776e46492056310000000000000000000000000000000000000000000081525081565b6008546dffffffffffffffffffffffffffff808216926e0100000000000000000000000000008304909116917c0100000000000000000000000000000000000000000000000000000000900463ffffffff1690565b6000610e5e338484612d8d565b5060015b92915050565b60065473ffffffffffffffffffffffffffffffffffffffff1681565b60005481565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610f545773ffffffffffffffffffffffffffffffffffffffff84166000908152600260209081526040808320338452909152902054610f22908363ffffffff612dfc16565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b610f5f848484612e6e565b5060015b9392505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633f3108f76040518163ffffffff1660e01b815260040160206040518083038186803b158015610fd257600080fd5b505afa158015610fe6573d6000803e3d6000fd5b505050506040513d6020811015610ffc57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff16331461108157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42726f776e466956313a20464f5242494444454e000000000000000000000000604482015290519081900360640190fd5b600e55565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b60035481565b60055473ffffffffffffffffffffffffffffffffffffffff16331461113b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42726f776e466956313a20464f5242494444454e000000000000000000000000604482015290519081900360640190fd5b6006805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560078054929093169116179055565b600d5481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633f3108f76040518163ffffffff1660e01b815260040160206040518083038186803b1580156111fc57600080fd5b505afa158015611210573d6000803e3d6000fd5b505050506040513d602081101561122657600080fd5b505173ffffffffffffffffffffffffffffffffffffffff1633146112ab57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42726f776e466956313a20464f5242494444454e000000000000000000000000604482015290519081900360640190fd5b6e4189374bc6a7ef9db22d0e5604189381108015906112eb57506112e7700100000000000000000000000000000000600263ffffffff612f4f16565b8111155b61135657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f42726f776e466956313a20494e56414c49445f4b415050410000000000000000604482015290519081900360640190fd5b600a55565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633f3108f76040518163ffffffff1660e01b815260040160206040518083038186803b1580156113c357600080fd5b505afa1580156113d7573d6000803e3d6000fd5b505050506040513d60208110156113ed57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff16331461147257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42726f776e466956313a20464f5242494444454e000000000000000000000000604482015290519081900360640190fd5b600c55565b60006009546001146114ea57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f42726f776e466956313a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b60006009819055806114fa610dfc565b50600654604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905193955091935060009273ffffffffffffffffffffffffffffffffffffffff909116916370a08231916024808301926020929190829003018186803b15801561157457600080fd5b505afa158015611588573d6000803e3d6000fd5b505050506040513d602081101561159e57600080fd5b5051600754604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905192935060009273ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b15801561161757600080fd5b505afa15801561162b573d6000803e3d6000fd5b505050506040513d602081101561164157600080fd5b505190506000611667836dffffffffffffffffffffffffffff871663ffffffff612dfc16565b9050600061168b836dffffffffffffffffffffffffffff871663ffffffff612dfc16565b600054909150806116d4576116c06103e86116b46116af868663ffffffff612f4f16565b612fd5565b9063ffffffff612dfc16565b97506116cf60006103e8613027565b611731565b61172e6dffffffffffffffffffffffffffff88166116f8858463ffffffff612f4f16565b816116ff57fe5b046dffffffffffffffffffffffffffff8816611721858563ffffffff612f4f16565b8161172857fe5b046130d7565b97505b6000881161178a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806135976028913960400191505060405180910390fd5b6117948989613027565b6117a0858589896130ed565b6040805184815260208101849052815133927f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f928290030190a250506001600955509395945050505050565b600a5481565b60016020526000908152604090205481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633f3108f76040518163ffffffff1660e01b815260040160206040518083038186803b15801561186c57600080fd5b505afa158015611880573d6000803e3d6000fd5b505050506040513d602081101561189657600080fd5b505173ffffffffffffffffffffffffffffffffffffffff16331461191b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42726f776e466956313a20464f5242494444454e000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600b5473ffffffffffffffffffffffffffffffffffffffff1681565b60046020526000908152604090205481565b600080600954600114611a0457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f42726f776e466956313a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600981905580611a14610dfc565b50600654600754604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905194965092945073ffffffffffffffffffffffffffffffffffffffff9182169391169160009184916370a08231916024808301926020929190829003018186803b158015611a9657600080fd5b505afa158015611aaa573d6000803e3d6000fd5b505050506040513d6020811015611ac057600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191925060009173ffffffffffffffffffffffffffffffffffffffff8516916370a08231916024808301926020929190829003018186803b158015611b3457600080fd5b505afa158015611b48573d6000803e3d6000fd5b505050506040513d6020811015611b5e57600080fd5b50513060009081526001602052604081205490549192509080611b87838663ffffffff612f4f16565b81611b8e57fe5b04995080611ba2838563ffffffff612f4f16565b81611ba957fe5b04985060008a118015611bbc5750600089115b611c11576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806135bf6028913960400191505060405180910390fd5b611c1b3083613292565b611c26868c8c6128b4565b611c31858c8b6128b4565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8816916370a08231916024808301926020929190829003018186803b158015611c9d57600080fd5b505afa158015611cb1573d6000803e3d6000fd5b505050506040513d6020811015611cc757600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191955073ffffffffffffffffffffffffffffffffffffffff8716916370a0823191602480820192602092909190829003018186803b158015611d3957600080fd5b505afa158015611d4d573d6000803e3d6000fd5b505050506040513d6020811015611d6357600080fd5b50519250611d7384848a8a6130ed565b604080518b8152602081018b9052815173ffffffffffffffffffffffffffffffffffffffff8e169233927fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496929081900390910190a350505050505050506001600981905550915091565b6040518060400160405280600681526020017f4252462d5631000000000000000000000000000000000000000000000000000081525081565b6000610e5e338484612e6e565b600b54604080517ffeaf968c000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff16918391839163feaf968c9160048083019260a0929190829003018186803b158015611e9257600080fd5b505afa158015611ea6573d6000803e3d6000fd5b505050506040513d60a0811015611ebc57600080fd5b50602090810151604080517f313ce567000000000000000000000000000000000000000000000000000000008152905191935060009273ffffffffffffffffffffffffffffffffffffffff86169263313ce567926004808201939291829003018186803b158015611f2c57600080fd5b505afa158015611f40573d6000803e3d6000fd5b505050506040513d6020811015611f5657600080fd5b5051600d54909150611ff9576000600e541315611fa057611f96600e54600a0a8260ff16600a0a0270010000000000000000000000000000000084613357565b9350505050612086565b6000600e541215611fd757611f968160ff16600a0a700100000000000000000000000000000000600e54600003600a0a8502613357565b611f968160ff16600a0a70010000000000000000000000000000000084613357565b6000600e54131561202d57611f9682700100000000000000000000000000000000600e54600a0a8460ff16600a0a02613357565b6000600e54121561206457611f96600e54600003600a0a83027001000000000000000000000000000000008360ff16600a0a613357565b611f96827001000000000000000000000000000000008360ff16600a0a613357565b90565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633f3108f76040518163ffffffff1660e01b815260040160206040518083038186803b1580156120f157600080fd5b505afa158015612105573d6000803e3d6000fd5b505050506040513d602081101561211b57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff1633146121a057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42726f776e466956313a20464f5242494444454e000000000000000000000000604482015290519081900360640190fd5b600d55565b6103e881565b60095460011461221c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f42726f776e466956313a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600955600654600754600854604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff94851694909316926122f892859287926122f3926dffffffffffffffffffffffffffff169185916370a0823191602480820192602092909190829003018186803b1580156122bb57600080fd5b505afa1580156122cf573d6000803e3d6000fd5b505050506040513d60208110156122e557600080fd5b50519063ffffffff612dfc16565b6128b4565b600854604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905161239792849287926122f3926e01000000000000000000000000000090046dffffffffffffffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff8616916370a0823191602480820192602092909190829003018186803b1580156122bb57600080fd5b5050600160095550565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b60075473ffffffffffffffffffffffffffffffffffffffff1681565b4284101561244857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f42726f776e466956313a20455850495245440000000000000000000000000000604482015290519081900360640190fd5b60035473ffffffffffffffffffffffffffffffffffffffff80891660008181526004602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e0850182528051908301207f19010000000000000000000000000000000000000000000000000000000000006101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e2808201937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa1580156125a9573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161580159061262457508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b61268f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f42726f776e466956313a20494e56414c49445f5349474e415455524500000000604482015290519081900360640190fd5b61269a898989612d8d565b505050505050505050565b600e5481565b600260209081526000928352604080842090915290825290205481565b600c5481565b60095460011461273f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f42726f776e466956313a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600955600654604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516128ad9273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b1580156127b657600080fd5b505afa1580156127ca573d6000803e3d6000fd5b505050506040513d60208110156127e057600080fd5b5051600754604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b15801561285357600080fd5b505afa158015612867573d6000803e3d6000fd5b505050506040513d602081101561287d57600080fd5b50516008546dffffffffffffffffffffffffffff808216916e0100000000000000000000000000009004166130ed565b6001600955565b604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251815160009460609489169392918291908083835b602083106129ba57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161297d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612a1c576040519150601f19603f3d011682016040523d82523d6000602084013e612a21565b606091505b5091509150818015612a4f575080511580612a4f5750808060200190516020811015612a4c57600080fd5b50515b612aba57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f42726f776e466956313a205452414e534645525f4641494c4544000000000000604482015290519081900360640190fd5b5050505050565b600080612acc611e23565b9050612ad6613557565b6000808a15612af557612af28b612710600c5461271003613357565b91505b8915612b1157612b0e8a612710600c5461271003613357565b90505b8115612c59576000612b62612b3a600a5485700100000000000000000000000000000000613357565b612b568786700100000000000000000000000000000000613357565b9063ffffffff612f4f16565b90506000612b8a6dffffffffffffffffffffffffffff8a16859003600263ffffffff612f4f16565b9050612be5818381612b9857fe5b04612bd98a6dffffffffffffffffffffffffffff16612bd98a8e6dffffffffffffffffffffffffffff16700100000000000000000000000000000000613357565b9063ffffffff61342a16565b8552612bf38b8b8b8b6130ed565b612c516008600e9054906101000a90046dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff16612bd988878d6dffffffffffffffffffffffffffff1603700100000000000000000000000000000000613357565b602086015250505b8015612d0a576000612c8382612b56600a5485700100000000000000000000000000000000613357565b90506000612cab6dffffffffffffffffffffffffffff8916849003600263ffffffff612f4f16565b9050612cb9818381612b9857fe5b8552612cc78b8b8b8b6130ed565b600854612d02906dffffffffffffffffffffffffffff808b1686900391612bd9918a9116700100000000000000000000000000000000613357565b602086015250505b825160208401511015612d7e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f42726f776e466956313a20494e56414c49445f54524144450000000000000000604482015290519081900360640190fd5b50919998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b80820382811115610e6257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054612ea4908263ffffffff612dfc16565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600160205260408082209390935590841681522054612ee6908263ffffffff61342a16565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000811580612f6a57505080820282828281612f6757fe5b04145b610e6257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b60006003821115613018575080600160028204015b818110156130125780915060028182858161300157fe5b04018161300a57fe5b049050612fea565b50613022565b8115613022575060015b919050565b60005461303a908263ffffffff61342a16565b600090815573ffffffffffffffffffffffffffffffffffffffff8316815260016020526040902054613072908263ffffffff61342a16565b73ffffffffffffffffffffffffffffffffffffffff831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60008183106130e65781610f63565b5090919050565b6dffffffffffffffffffffffffffff841180159061311957506dffffffffffffffffffffffffffff8311155b61318457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f42726f776e466956313a204f564552464c4f5700000000000000000000000000604482015290519081900360640190fd5b600880547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff868116919091177fffffffff0000000000000000000000000000ffffffffffffffffffffffffffff166e0100000000000000000000000000008683168102919091177bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c01000000000000000000000000000000000000000000000000000000004263ffffffff169081029190911793849055604080518585168152929094049092166020820152825191927f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad192918290030190a15050505050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160205260409020546132c8908263ffffffff612dfc16565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081209190915554613302908263ffffffff612dfc16565b600090815560408051838152905173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a35050565b6000806000613366868661349c565b915091506000848061337457fe5b868809905082811115613388576001820391505b9182900391816133a65784838161339b57fe5b049350505050610f63565b84821061341457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f46756c6c4d6174683a2046554c4c4449565f4f564552464c4f57000000000000604482015290519081900360640190fd5b61341f8383876134e7565b979650505050505050565b80820182811015610e6257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848609905083850292508281039150828110156134df576001820391505b509250929050565b600081810382168083816134f757fe5b04925080858161350357fe5b04945080816000038161351257fe5b60028581038087028203028087028203028087028203028087028203028087028203028087028203029586029003909402930460010193909302939093010292915050565b60405180604001604052806000815260200160008152509056fe42726f776e466956313a20494e53554646494349454e545f4f55545055545f414d4f554e5442726f776e466956313a20494e53554646494349454e545f4c49515549444954595f4d494e54454442726f776e466956313a20494e53554646494349454e545f4c49515549444954595f4255524e454442726f776e466956313a20494e53554646494349454e545f4c495155494449545942726f776e466956313a20494e53554646494349454e545f494e5055545f414d4f554e54a265627a7a7231582084cd485a31663b717769f7239c53fe67c9c1b209259cf0a7453fb16842dc04fd64736f6c63430005100032454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102415760003560e01c806370a0823111610145578063ba9a7a56116100bd578063d505accf1161008c578063dd62ed3e11610071578063dd62ed3e1461077f578063ddca3f43146107ba578063fff6cae9146107c257610241565b8063d505accf14610719578063dae5f0fd1461077757610241565b8063ba9a7a56146106ce578063bc25cf77146106d6578063c45a015514610709578063d21220a71461071157610241565b806389afcb4411610114578063a9059cbb116100f9578063a9059cbb14610670578063add1c817146106a9578063b519f43f146106b157610241565b806389afcb441461061c57806395d89b411461066857610241565b806370a082311461057b578063724e78da146105ae578063741bef1a146105e15780637ecebe00146105e957610241565b806330adf81f116101d857806356539200116101a757806369fe0e2d1161018c57806369fe0e2d146105235780636a627842146105405780636bba3f2f1461057357610241565b806356539200146104fe5780635e8b5a561461050657610241565b806330adf81f14610495578063313ce5671461049d5780633644e515146104bb578063485cc955146104c357610241565b80630dfe1681116102145780630dfe1681146103ea57806318160ddd1461041b57806323b872dd1461043557806324fcffe81461047857610241565b8063022c0d9f1461024657806306fdde03146102e15780630902f1ac1461035e578063095ea7b31461039d575b600080fd5b6102df6004803603608081101561025c57600080fd5b81359160208101359173ffffffffffffffffffffffffffffffffffffffff60408301351691908101906080810160608201356401000000008111156102a057600080fd5b8201836020820111156102b257600080fd5b803590602001918460018302840111640100000000831117156102d457600080fd5b5090925090506107ca565b005b6102e9610dc3565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561032357818101518382015260200161030b565b50505050905090810190601f1680156103505780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610366610dfc565b604080516dffffffffffffffffffffffffffff948516815292909316602083015263ffffffff168183015290519081900360600190f35b6103d6600480360360408110156103b357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610e51565b604080519115158252519081900360200190f35b6103f2610e68565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610423610e84565b60408051918252519081900360200190f35b6103d66004803603606081101561044b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610e8a565b6102df6004803603602081101561048e57600080fd5b5035610f6a565b610423611086565b6104a56110aa565b6040805160ff9092168252519081900360200190f35b6104236110af565b6102df600480360360408110156104d957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166110b5565b61042361118e565b6102df6004803603602081101561051c57600080fd5b5035611194565b6102df6004803603602081101561053957600080fd5b503561135b565b6104236004803603602081101561055657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611477565b6104236117ec565b6104236004803603602081101561059157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166117f2565b6102df600480360360208110156105c457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611804565b6103f2611962565b610423600480360360208110156105ff57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661197e565b61064f6004803603602081101561063257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611990565b6040805192835260208301919091528051918290030190f35b6102e9611ddd565b6103d66004803603604081101561068657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611e16565b610423611e23565b6102df600480360360208110156106c757600080fd5b5035612089565b6104236121a5565b6102df600480360360208110156106ec57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166121ab565b6103f26123a1565b6103f26123bd565b6102df600480360360e081101561072f57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c001356123d9565b6104236126a5565b6104236004803603604081101561079557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160200135166126ab565b6104236126c8565b6102df6126ce565b60095460011461083b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f42726f776e466956313a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b60006009558415158061084e5750600084115b6108a3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806135726025913960400191505060405180910390fd5b6000806108ae610dfc565b5091509150816dffffffffffffffffffffffffffff16871080156108e15750806dffffffffffffffffffffffffffff1686105b610936576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806135e76021913960400191505060405180910390fd5b61093e613557565b60065460075473ffffffffffffffffffffffffffffffffffffffff91821691908116908816821480159061099e57508073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614155b610a0957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f42726f776e466956313a20494e56414c49445f544f0000000000000000000000604482015290519081900360640190fd5b8915610a1a57610a1a82898c6128b4565b8815610a2b57610a2b81898b6128b4565b8515610b0d578773ffffffffffffffffffffffffffffffffffffffff16637b9c231e338c8c8b8b6040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f8201169050808301925050509650505050505050600060405180830381600087803b158015610af457600080fd5b505af1158015610b08573d6000803e3d6000fd5b505050505b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8416916370a08231916024808301926020929190829003018186803b158015610b7957600080fd5b505afa158015610b8d573d6000803e3d6000fd5b505050506040513d6020811015610ba357600080fd5b50518352604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8316916370a08231916024808301926020929190829003018186803b158015610c1357600080fd5b505afa158015610c27573d6000803e3d6000fd5b505050506040513d6020811015610c3d57600080fd5b50516020840152505080516000906dffffffffffffffffffffffffffff85168a900310610c6b576000610c85565b88846dffffffffffffffffffffffffffff16038260000151035b9050600088846dffffffffffffffffffffffffffff1603836020015111610cad576000610cc7565b88846dffffffffffffffffffffffffffff16038360200151035b90506000821180610cd85750600081115b610d2d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806136086024913960400191505060405180910390fd5b6000610d458b8b866000015187602001518a8a612ac1565b60408051858152602081018590528082018e9052606081018d905260808101839052905191925073ffffffffffffffffffffffffffffffffffffffff8b169133917f606ecd02b3e3b4778f8e97b2e03351de14224efaa5fa64e62200afc9395c2499919081900360a00190a350506001600955505050505050505050565b6040518060400160405280600a81526020017f42726f776e46492056310000000000000000000000000000000000000000000081525081565b6008546dffffffffffffffffffffffffffff808216926e0100000000000000000000000000008304909116917c0100000000000000000000000000000000000000000000000000000000900463ffffffff1690565b6000610e5e338484612d8d565b5060015b92915050565b60065473ffffffffffffffffffffffffffffffffffffffff1681565b60005481565b73ffffffffffffffffffffffffffffffffffffffff831660009081526002602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14610f545773ffffffffffffffffffffffffffffffffffffffff84166000908152600260209081526040808320338452909152902054610f22908363ffffffff612dfc16565b73ffffffffffffffffffffffffffffffffffffffff851660009081526002602090815260408083203384529091529020555b610f5f848484612e6e565b5060015b9392505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633f3108f76040518163ffffffff1660e01b815260040160206040518083038186803b158015610fd257600080fd5b505afa158015610fe6573d6000803e3d6000fd5b505050506040513d6020811015610ffc57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff16331461108157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42726f776e466956313a20464f5242494444454e000000000000000000000000604482015290519081900360640190fd5b600e55565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b601281565b60035481565b60055473ffffffffffffffffffffffffffffffffffffffff16331461113b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42726f776e466956313a20464f5242494444454e000000000000000000000000604482015290519081900360640190fd5b6006805473ffffffffffffffffffffffffffffffffffffffff9384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560078054929093169116179055565b600d5481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633f3108f76040518163ffffffff1660e01b815260040160206040518083038186803b1580156111fc57600080fd5b505afa158015611210573d6000803e3d6000fd5b505050506040513d602081101561122657600080fd5b505173ffffffffffffffffffffffffffffffffffffffff1633146112ab57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42726f776e466956313a20464f5242494444454e000000000000000000000000604482015290519081900360640190fd5b6e4189374bc6a7ef9db22d0e5604189381108015906112eb57506112e7700100000000000000000000000000000000600263ffffffff612f4f16565b8111155b61135657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f42726f776e466956313a20494e56414c49445f4b415050410000000000000000604482015290519081900360640190fd5b600a55565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633f3108f76040518163ffffffff1660e01b815260040160206040518083038186803b1580156113c357600080fd5b505afa1580156113d7573d6000803e3d6000fd5b505050506040513d60208110156113ed57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff16331461147257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42726f776e466956313a20464f5242494444454e000000000000000000000000604482015290519081900360640190fd5b600c55565b60006009546001146114ea57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f42726f776e466956313a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b60006009819055806114fa610dfc565b50600654604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905193955091935060009273ffffffffffffffffffffffffffffffffffffffff909116916370a08231916024808301926020929190829003018186803b15801561157457600080fd5b505afa158015611588573d6000803e3d6000fd5b505050506040513d602081101561159e57600080fd5b5051600754604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905192935060009273ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b15801561161757600080fd5b505afa15801561162b573d6000803e3d6000fd5b505050506040513d602081101561164157600080fd5b505190506000611667836dffffffffffffffffffffffffffff871663ffffffff612dfc16565b9050600061168b836dffffffffffffffffffffffffffff871663ffffffff612dfc16565b600054909150806116d4576116c06103e86116b46116af868663ffffffff612f4f16565b612fd5565b9063ffffffff612dfc16565b97506116cf60006103e8613027565b611731565b61172e6dffffffffffffffffffffffffffff88166116f8858463ffffffff612f4f16565b816116ff57fe5b046dffffffffffffffffffffffffffff8816611721858563ffffffff612f4f16565b8161172857fe5b046130d7565b97505b6000881161178a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806135976028913960400191505060405180910390fd5b6117948989613027565b6117a0858589896130ed565b6040805184815260208101849052815133927f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f928290030190a250506001600955509395945050505050565b600a5481565b60016020526000908152604090205481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633f3108f76040518163ffffffff1660e01b815260040160206040518083038186803b15801561186c57600080fd5b505afa158015611880573d6000803e3d6000fd5b505050506040513d602081101561189657600080fd5b505173ffffffffffffffffffffffffffffffffffffffff16331461191b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42726f776e466956313a20464f5242494444454e000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600b5473ffffffffffffffffffffffffffffffffffffffff1681565b60046020526000908152604090205481565b600080600954600114611a0457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f42726f776e466956313a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600981905580611a14610dfc565b50600654600754604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905194965092945073ffffffffffffffffffffffffffffffffffffffff9182169391169160009184916370a08231916024808301926020929190829003018186803b158015611a9657600080fd5b505afa158015611aaa573d6000803e3d6000fd5b505050506040513d6020811015611ac057600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191925060009173ffffffffffffffffffffffffffffffffffffffff8516916370a08231916024808301926020929190829003018186803b158015611b3457600080fd5b505afa158015611b48573d6000803e3d6000fd5b505050506040513d6020811015611b5e57600080fd5b50513060009081526001602052604081205490549192509080611b87838663ffffffff612f4f16565b81611b8e57fe5b04995080611ba2838563ffffffff612f4f16565b81611ba957fe5b04985060008a118015611bbc5750600089115b611c11576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806135bf6028913960400191505060405180910390fd5b611c1b3083613292565b611c26868c8c6128b4565b611c31858c8b6128b4565b604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8816916370a08231916024808301926020929190829003018186803b158015611c9d57600080fd5b505afa158015611cb1573d6000803e3d6000fd5b505050506040513d6020811015611cc757600080fd5b5051604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905191955073ffffffffffffffffffffffffffffffffffffffff8716916370a0823191602480820192602092909190829003018186803b158015611d3957600080fd5b505afa158015611d4d573d6000803e3d6000fd5b505050506040513d6020811015611d6357600080fd5b50519250611d7384848a8a6130ed565b604080518b8152602081018b9052815173ffffffffffffffffffffffffffffffffffffffff8e169233927fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496929081900390910190a350505050505050506001600981905550915091565b6040518060400160405280600681526020017f4252462d5631000000000000000000000000000000000000000000000000000081525081565b6000610e5e338484612e6e565b600b54604080517ffeaf968c000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff16918391839163feaf968c9160048083019260a0929190829003018186803b158015611e9257600080fd5b505afa158015611ea6573d6000803e3d6000fd5b505050506040513d60a0811015611ebc57600080fd5b50602090810151604080517f313ce567000000000000000000000000000000000000000000000000000000008152905191935060009273ffffffffffffffffffffffffffffffffffffffff86169263313ce567926004808201939291829003018186803b158015611f2c57600080fd5b505afa158015611f40573d6000803e3d6000fd5b505050506040513d6020811015611f5657600080fd5b5051600d54909150611ff9576000600e541315611fa057611f96600e54600a0a8260ff16600a0a0270010000000000000000000000000000000084613357565b9350505050612086565b6000600e541215611fd757611f968160ff16600a0a700100000000000000000000000000000000600e54600003600a0a8502613357565b611f968160ff16600a0a70010000000000000000000000000000000084613357565b6000600e54131561202d57611f9682700100000000000000000000000000000000600e54600a0a8460ff16600a0a02613357565b6000600e54121561206457611f96600e54600003600a0a83027001000000000000000000000000000000008360ff16600a0a613357565b611f96827001000000000000000000000000000000008360ff16600a0a613357565b90565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633f3108f76040518163ffffffff1660e01b815260040160206040518083038186803b1580156120f157600080fd5b505afa158015612105573d6000803e3d6000fd5b505050506040513d602081101561211b57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff1633146121a057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42726f776e466956313a20464f5242494444454e000000000000000000000000604482015290519081900360640190fd5b600d55565b6103e881565b60095460011461221c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f42726f776e466956313a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600955600654600754600854604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff94851694909316926122f892859287926122f3926dffffffffffffffffffffffffffff169185916370a0823191602480820192602092909190829003018186803b1580156122bb57600080fd5b505afa1580156122cf573d6000803e3d6000fd5b505050506040513d60208110156122e557600080fd5b50519063ffffffff612dfc16565b6128b4565b600854604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905161239792849287926122f3926e01000000000000000000000000000090046dffffffffffffffffffffffffffff169173ffffffffffffffffffffffffffffffffffffffff8616916370a0823191602480820192602092909190829003018186803b1580156122bb57600080fd5b5050600160095550565b60055473ffffffffffffffffffffffffffffffffffffffff1681565b60075473ffffffffffffffffffffffffffffffffffffffff1681565b4284101561244857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f42726f776e466956313a20455850495245440000000000000000000000000000604482015290519081900360640190fd5b60035473ffffffffffffffffffffffffffffffffffffffff80891660008181526004602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e0850182528051908301207f19010000000000000000000000000000000000000000000000000000000000006101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e2808201937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa1580156125a9573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81161580159061262457508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b61268f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f42726f776e466956313a20494e56414c49445f5349474e415455524500000000604482015290519081900360640190fd5b61269a898989612d8d565b505050505050505050565b600e5481565b600260209081526000928352604080842090915290825290205481565b600c5481565b60095460011461273f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f42726f776e466956313a204c4f434b4544000000000000000000000000000000604482015290519081900360640190fd5b6000600955600654604080517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290516128ad9273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b1580156127b657600080fd5b505afa1580156127ca573d6000803e3d6000fd5b505050506040513d60208110156127e057600080fd5b5051600754604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff909216916370a0823191602480820192602092909190829003018186803b15801561285357600080fd5b505afa158015612867573d6000803e3d6000fd5b505050506040513d602081101561287d57600080fd5b50516008546dffffffffffffffffffffffffffff808216916e0100000000000000000000000000009004166130ed565b6001600955565b604080518082018252601981527f7472616e7366657228616464726573732c75696e743235362900000000000000602091820152815173ffffffffffffffffffffffffffffffffffffffff85811660248301526044808301869052845180840390910181526064909201845291810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251815160009460609489169392918291908083835b602083106129ba57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161297d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612a1c576040519150601f19603f3d011682016040523d82523d6000602084013e612a21565b606091505b5091509150818015612a4f575080511580612a4f5750808060200190516020811015612a4c57600080fd5b50515b612aba57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f42726f776e466956313a205452414e534645525f4641494c4544000000000000604482015290519081900360640190fd5b5050505050565b600080612acc611e23565b9050612ad6613557565b6000808a15612af557612af28b612710600c5461271003613357565b91505b8915612b1157612b0e8a612710600c5461271003613357565b90505b8115612c59576000612b62612b3a600a5485700100000000000000000000000000000000613357565b612b568786700100000000000000000000000000000000613357565b9063ffffffff612f4f16565b90506000612b8a6dffffffffffffffffffffffffffff8a16859003600263ffffffff612f4f16565b9050612be5818381612b9857fe5b04612bd98a6dffffffffffffffffffffffffffff16612bd98a8e6dffffffffffffffffffffffffffff16700100000000000000000000000000000000613357565b9063ffffffff61342a16565b8552612bf38b8b8b8b6130ed565b612c516008600e9054906101000a90046dffffffffffffffffffffffffffff166dffffffffffffffffffffffffffff16612bd988878d6dffffffffffffffffffffffffffff1603700100000000000000000000000000000000613357565b602086015250505b8015612d0a576000612c8382612b56600a5485700100000000000000000000000000000000613357565b90506000612cab6dffffffffffffffffffffffffffff8916849003600263ffffffff612f4f16565b9050612cb9818381612b9857fe5b8552612cc78b8b8b8b6130ed565b600854612d02906dffffffffffffffffffffffffffff808b1686900391612bd9918a9116700100000000000000000000000000000000613357565b602086015250505b825160208401511015612d7e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f42726f776e466956313a20494e56414c49445f54524144450000000000000000604482015290519081900360640190fd5b50919998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260026020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b80820382811115610e6257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260016020526040902054612ea4908263ffffffff612dfc16565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600160205260408082209390935590841681522054612ee6908263ffffffff61342a16565b73ffffffffffffffffffffffffffffffffffffffff80841660008181526001602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000811580612f6a57505080820282828281612f6757fe5b04145b610e6257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b60006003821115613018575080600160028204015b818110156130125780915060028182858161300157fe5b04018161300a57fe5b049050612fea565b50613022565b8115613022575060015b919050565b60005461303a908263ffffffff61342a16565b600090815573ffffffffffffffffffffffffffffffffffffffff8316815260016020526040902054613072908263ffffffff61342a16565b73ffffffffffffffffffffffffffffffffffffffff831660008181526001602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60008183106130e65781610f63565b5090919050565b6dffffffffffffffffffffffffffff841180159061311957506dffffffffffffffffffffffffffff8311155b61318457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f42726f776e466956313a204f564552464c4f5700000000000000000000000000604482015290519081900360640190fd5b600880547fffffffffffffffffffffffffffffffffffff0000000000000000000000000000166dffffffffffffffffffffffffffff868116919091177fffffffff0000000000000000000000000000ffffffffffffffffffffffffffff166e0100000000000000000000000000008683168102919091177bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c01000000000000000000000000000000000000000000000000000000004263ffffffff169081029190911793849055604080518585168152929094049092166020820152825191927f1c411e9a96e071241c2f21f7726b17ae89e3cab4c78be50e062b03a9fffbbad192918290030190a15050505050565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160205260409020546132c8908263ffffffff612dfc16565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081209190915554613302908263ffffffff612dfc16565b600090815560408051838152905173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef919081900360200190a35050565b6000806000613366868661349c565b915091506000848061337457fe5b868809905082811115613388576001820391505b9182900391816133a65784838161339b57fe5b049350505050610f63565b84821061341457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f46756c6c4d6174683a2046554c4c4449565f4f564552464c4f57000000000000604482015290519081900360640190fd5b61341f8383876134e7565b979650505050505050565b80820182811015610e6257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848609905083850292508281039150828110156134df576001820391505b509250929050565b600081810382168083816134f757fe5b04925080858161350357fe5b04945080816000038161351257fe5b60028581038087028203028087028203028087028203028087028203028087028203028087028203029586029003909402930460010193909302939093010292915050565b60405180604001604052806000815260200160008152509056fe42726f776e466956313a20494e53554646494349454e545f4f55545055545f414d4f554e5442726f776e466956313a20494e53554646494349454e545f4c49515549444954595f4d494e54454442726f776e466956313a20494e53554646494349454e545f4c49515549444954595f4255524e454442726f776e466956313a20494e53554646494349454e545f4c495155494449545942726f776e466956313a20494e53554646494349454e545f494e5055545f414d4f554e54a265627a7a7231582084cd485a31663b717769f7239c53fe67c9c1b209259cf0a7453fb16842dc04fd64736f6c63430005100032

[ Download: CSV Export  ]
[ Download: CSV Export  ]

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