ETH Price: $3,385.90 (-1.43%)
Gas: 2 Gwei

Token

Momentum (XMM)
 

Overview

Max Total Supply

65,952,566.1237638057 XMM

Holders

226 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 10 Decimals)

Balance
582.8648057582 XMM

Value
$0.00
0x89788e2A9153378cAb1B84F91eCc6C967098f15A
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Momentum (XMM) is a deflationary token whereby every transfer will burn some tokens and cause the total supply to decrease over time.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Momentum

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license, Audited

Contract Source Code (Solidity Multiple files format)Audit Report

File 6 of 8: Momentum.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.12;

import "./ERC20.sol";
import "./Ownable.sol";
import { ABDKMath64x64 as Math } from "./ABDKMath64x64.sol";

contract Momentum is ERC20, Ownable {
    int128 shortMomentum;
    int128 longMomentum;
    int128 SMweight;
    int128 LMweightEx;
    int128 LMweightCo;

    mapping (address => mapping (address => uint256)) _allowances;

    bool isBurning = false;

    constructor(
        uint256 initialSupply, 
        uint256 _shortMomentumWeight,
        uint256 _LMweightEx,
        uint256 _LMweightCo,
        uint256 factor,
        uint256 _shortMomentum, 
        uint256 _longMomentum
    ) public ERC20("Momentum", "XMM") {
        _setupDecimals(10);
        _mint(_msgSender(), initialSupply);
        SMweight = Math.divu(_shortMomentumWeight, factor);
        LMweightEx = Math.divu(_LMweightEx, factor);
        LMweightCo = Math.divu(_LMweightCo, factor);
        shortMomentum = Math.fromUInt(_shortMomentum);
        longMomentum = Math.fromUInt(_longMomentum);
    }

    function getShortMomentum() external view returns (uint256) {
        return Math.mulu(shortMomentum, 1);
    }

    function getLongMomentum() external view returns (uint256) {
        return Math.mulu(longMomentum, 1);
    }

    function getMomentumAndSupply() external view returns (uint256, uint256, uint256) {
        uint256 SM = Math.mulu(shortMomentum, 1);
        uint256 LM = Math.mulu(longMomentum, 1);
        return (SM, LM, totalSupply());
    }

    function getNewMomentum(int128 amount, int128 SMcopy, int128 LMcopy) internal view returns (int128, int128) {
        int128 LMweight = (amount < SMcopy) ? LMweightCo : LMweightEx;
        int128 LMnew = Math.add(LMcopy, Math.div(Math.sub(amount, LMcopy), LMweight));
        int128 SMnew = Math.add(SMcopy, Math.div(Math.sub(amount, SMcopy), SMweight));
        return (LMnew, SMnew);
    }

    function getRangeData(int128 LMcopy, int128 SMcopy, int128 LMnew, int128 SMnew) internal pure returns (int128, int128) {
        int128 range = Math.abs(Math.sub(LMcopy, SMcopy));
        int128 newRange = Math.abs(Math.sub(LMnew, SMnew));
        int128 rangeDelta = Math.sub(newRange, range);
        return (rangeDelta, newRange);
    }

    function getDestabilizingTransferFee(int128 amount, int128 newRange, int128 newLongMomentum) internal pure returns (int128) {
        // If newRange is within 2% of newLongMomentum, apply ~0.75% fee 
        // to avoid potential overflow calculations and negative log values
        if (newRange <= Math.div(newLongMomentum, Math.fromUInt(50))) {
            return Math.mul(amount, Math.div(Math.fromUInt(1), Math.fromUInt(133)));
        } else {
            int128 proportion = Math.div(newRange, newLongMomentum);
            int128 rate = Math.add(Math.fromUInt(1), Math.ln(Math.mul(proportion, Math.fromUInt(50))));
            return Math.mul(amount, Math.div(rate, Math.fromUInt(133)));
        }
    }

    function getTransferFee(uint256 amount256, int128 SMcopy, int128 LMcopy) internal returns (uint256) {
        int128 amount = Math.fromUInt(amount256);

        // Guard against flood of small transfers manipulating momentum values
        // If transfer size is less than ~0.3% of lower momentum value, charge 5% fee and skip momentum update
        if (SMcopy <= LMcopy) {
            if (amount < Math.div(SMcopy, Math.fromUInt(333))) {
                return Math.mulu(Math.div(amount, Math.fromUInt(20)), 1);
            }
        } else {
            if (amount < Math.div(LMcopy, Math.fromUInt(333))) {
                return Math.mulu(Math.div(amount, Math.fromUInt(20)), 1);
            }
        }
        
        (int128 newLongMomentum, int128 newShortMomentum) = getNewMomentum(amount, SMcopy, LMcopy);
        (int128 rangeDelta, int128 newRange) = getRangeData(LMcopy, SMcopy, newLongMomentum, newShortMomentum);

        int128 transferFee;

        if (rangeDelta < Math.fromUInt(0)) {
            transferFee = Math.div(amount, Math.fromUInt(133)); // stabilizing transfer ~0.75% fee
        } else {
            transferFee = getDestabilizingTransferFee(amount, newRange, newLongMomentum);
        }

        longMomentum = newLongMomentum;
        shortMomentum = newShortMomentum;

        return Math.mulu(transferFee, 1);
    }

    function startBurning() public onlyOwner {
        isBurning = true;
        renounceOwnership();
    }

    function burnAndTransfer(address sender, address recipient, uint256 amount256) internal {
        if (isBurning) {
            uint256 transferFee = getTransferFee(amount256, shortMomentum, longMomentum);
            uint256 adjustedAmount = amount256.sub(transferFee);
            _burn(sender, transferFee);
            _transfer(sender, recipient, adjustedAmount);
        } else {
            _transfer(sender, recipient, amount256);
        }
    }

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

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

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

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

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

    function _approve(address owner, address spender, uint256 amount) internal override {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
}

File 1 of 8: ABDKMath64x64.sol
/*
 * ABDK Math 64.64 Smart Contract Library.  Copyright © 2019 by ABDK Consulting.
 * Author: Mikhail Vladimirov <[email protected]>
 */
pragma solidity ^0.5.0 || ^0.6.0;

/**
 * Smart contract library of mathematical functions operating with signed
 * 64.64-bit fixed point numbers.  Signed 64.64-bit fixed point number is
 * basically a simple fraction whose numerator is signed 128-bit integer and
 * denominator is 2^64.  As long as denominator is always the same, there is no
 * need to store it, thus in Solidity signed 64.64-bit fixed point numbers are
 * represented by int128 type holding only the numerator.
 */
library ABDKMath64x64 {
  /**
   * Minimum value signed 64.64-bit fixed point number may have. 
   */
  int128 private constant MIN_64x64 = -0x80000000000000000000000000000000;

  /**
   * Maximum value signed 64.64-bit fixed point number may have. 
   */
  int128 private constant MAX_64x64 = 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;

  /**
   * Convert signed 256-bit integer number into signed 64.64-bit fixed point
   * number.  Revert on overflow.
   *
   * @param x signed 256-bit integer number
   * @return signed 64.64-bit fixed point number
   */
  function fromInt (int256 x) internal pure returns (int128) {
    require (x >= -0x8000000000000000 && x <= 0x7FFFFFFFFFFFFFFF);
    return int128 (x << 64);
  }

  /**
   * Convert signed 64.64 fixed point number into signed 64-bit integer number
   * rounding down.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64-bit integer number
   */
  function toInt (int128 x) internal pure returns (int64) {
    return int64 (x >> 64);
  }

  /**
   * Convert unsigned 256-bit integer number into signed 64.64-bit fixed point
   * number.  Revert on overflow.
   *
   * @param x unsigned 256-bit integer number
   * @return signed 64.64-bit fixed point number
   */
  function fromUInt (uint256 x) internal pure returns (int128) {
    require (x <= 0x7FFFFFFFFFFFFFFF);
    return int128 (x << 64);
  }

  /**
   * Convert signed 64.64 fixed point number into unsigned 64-bit integer
   * number rounding down.  Revert on underflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @return unsigned 64-bit integer number
   */
  function toUInt (int128 x) internal pure returns (uint64) {
    require (x >= 0);
    return uint64 (x >> 64);
  }

  /**
   * Convert signed 128.128 fixed point number into signed 64.64-bit fixed point
   * number rounding down.  Revert on overflow.
   *
   * @param x signed 128.128-bin fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function from128x128 (int256 x) internal pure returns (int128) {
    int256 result = x >> 64;
    require (result >= MIN_64x64 && result <= MAX_64x64);
    return int128 (result);
  }

  /**
   * Convert signed 64.64 fixed point number into signed 128.128 fixed point
   * number.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 128.128 fixed point number
   */
  function to128x128 (int128 x) internal pure returns (int256) {
    return int256 (x) << 64;
  }

  /**
   * Calculate x + y.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function add (int128 x, int128 y) internal pure returns (int128) {
    int256 result = int256(x) + y;
    require (result >= MIN_64x64 && result <= MAX_64x64);
    return int128 (result);
  }

  /**
   * Calculate x - y.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function sub (int128 x, int128 y) internal pure returns (int128) {
    int256 result = int256(x) - y;
    require (result >= MIN_64x64 && result <= MAX_64x64);
    return int128 (result);
  }

  /**
   * Calculate x * y rounding down.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function mul (int128 x, int128 y) internal pure returns (int128) {
    int256 result = int256(x) * y >> 64;
    require (result >= MIN_64x64 && result <= MAX_64x64);
    return int128 (result);
  }

  /**
   * Calculate x * y rounding towards zero, where x is signed 64.64 fixed point
   * number and y is signed 256-bit integer number.  Revert on overflow.
   *
   * @param x signed 64.64 fixed point number
   * @param y signed 256-bit integer number
   * @return signed 256-bit integer number
   */
  function muli (int128 x, int256 y) internal pure returns (int256) {
    if (x == MIN_64x64) {
      require (y >= -0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF &&
        y <= 0x1000000000000000000000000000000000000000000000000);
      return -y << 63;
    } else {
      bool negativeResult = false;
      if (x < 0) {
        x = -x;
        negativeResult = true;
      }
      if (y < 0) {
        y = -y; // We rely on overflow behavior here
        negativeResult = !negativeResult;
      }
      uint256 absoluteResult = mulu (x, uint256 (y));
      if (negativeResult) {
        require (absoluteResult <=
          0x8000000000000000000000000000000000000000000000000000000000000000);
        return -int256 (absoluteResult); // We rely on overflow behavior here
      } else {
        require (absoluteResult <=
          0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
        return int256 (absoluteResult);
      }
    }
  }

  /**
   * Calculate x * y rounding down, where x is signed 64.64 fixed point number
   * and y is unsigned 256-bit integer number.  Revert on overflow.
   *
   * @param x signed 64.64 fixed point number
   * @param y unsigned 256-bit integer number
   * @return unsigned 256-bit integer number
   */
  function mulu (int128 x, uint256 y) internal pure returns (uint256) {
    if (y == 0) return 0;

    require (x >= 0);

    uint256 lo = (uint256 (x) * (y & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)) >> 64;
    uint256 hi = uint256 (x) * (y >> 128);

    require (hi <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
    hi <<= 64;

    require (hi <=
      0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - lo);
    return hi + lo;
  }

  /**
   * Calculate x / y rounding towards zero.  Revert on overflow or when y is
   * zero.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function div (int128 x, int128 y) internal pure returns (int128) {
    require (y != 0);
    int256 result = (int256 (x) << 64) / y;
    require (result >= MIN_64x64 && result <= MAX_64x64);
    return int128 (result);
  }

  /**
   * Calculate x / y rounding towards zero, where x and y are signed 256-bit
   * integer numbers.  Revert on overflow or when y is zero.
   *
   * @param x signed 256-bit integer number
   * @param y signed 256-bit integer number
   * @return signed 64.64-bit fixed point number
   */
  function divi (int256 x, int256 y) internal pure returns (int128) {
    require (y != 0);

    bool negativeResult = false;
    if (x < 0) {
      x = -x; // We rely on overflow behavior here
      negativeResult = true;
    }
    if (y < 0) {
      y = -y; // We rely on overflow behavior here
      negativeResult = !negativeResult;
    }
    uint128 absoluteResult = divuu (uint256 (x), uint256 (y));
    if (negativeResult) {
      require (absoluteResult <= 0x80000000000000000000000000000000);
      return -int128 (absoluteResult); // We rely on overflow behavior here
    } else {
      require (absoluteResult <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
      return int128 (absoluteResult); // We rely on overflow behavior here
    }
  }

  /**
   * Calculate x / y rounding towards zero, where x and y are unsigned 256-bit
   * integer numbers.  Revert on overflow or when y is zero.
   *
   * @param x unsigned 256-bit integer number
   * @param y unsigned 256-bit integer number
   * @return signed 64.64-bit fixed point number
   */
  function divu (uint256 x, uint256 y) internal pure returns (int128) {
    require (y != 0);
    uint128 result = divuu (x, y);
    require (result <= uint128 (MAX_64x64));
    return int128 (result);
  }

  /**
   * Calculate -x.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function neg (int128 x) internal pure returns (int128) {
    require (x != MIN_64x64);
    return -x;
  }

  /**
   * Calculate |x|.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function abs (int128 x) internal pure returns (int128) {
    require (x != MIN_64x64);
    return x < 0 ? -x : x;
  }

  /**
   * Calculate 1 / x rounding towards zero.  Revert on overflow or when x is
   * zero.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function inv (int128 x) internal pure returns (int128) {
    require (x != 0);
    int256 result = int256 (0x100000000000000000000000000000000) / x;
    require (result >= MIN_64x64 && result <= MAX_64x64);
    return int128 (result);
  }

  /**
   * Calculate arithmetics average of x and y, i.e. (x + y) / 2 rounding down.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function avg (int128 x, int128 y) internal pure returns (int128) {
    return int128 ((int256 (x) + int256 (y)) >> 1);
  }

  /**
   * Calculate geometric average of x and y, i.e. sqrt (x * y) rounding down.
   * Revert on overflow or in case x * y is negative.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function gavg (int128 x, int128 y) internal pure returns (int128) {
    int256 m = int256 (x) * int256 (y);
    require (m >= 0);
    require (m <
        0x4000000000000000000000000000000000000000000000000000000000000000);
    return int128 (sqrtu (uint256 (m), uint256 (x) + uint256 (y) >> 1));
  }

  /**
   * Calculate x^y assuming 0^0 is 1, where x is signed 64.64 fixed point number
   * and y is unsigned 256-bit integer number.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @param y uint256 value
   * @return signed 64.64-bit fixed point number
   */
  function pow (int128 x, uint256 y) internal pure returns (int128) {
    uint256 absoluteResult;
    bool negativeResult = false;
    if (x >= 0) {
      absoluteResult = powu (uint256 (x) << 63, y);
    } else {
      // We rely on overflow behavior here
      absoluteResult = powu (uint256 (uint128 (-x)) << 63, y);
      negativeResult = y & 1 > 0;
    }

    absoluteResult >>= 63;

    if (negativeResult) {
      require (absoluteResult <= 0x80000000000000000000000000000000);
      return -int128 (absoluteResult); // We rely on overflow behavior here
    } else {
      require (absoluteResult <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
      return int128 (absoluteResult); // We rely on overflow behavior here
    }
  }

  /**
   * Calculate sqrt (x) rounding down.  Revert if x < 0.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function sqrt (int128 x) internal pure returns (int128) {
    require (x >= 0);
    return int128 (sqrtu (uint256 (x) << 64, 0x10000000000000000));
  }

  /**
   * Calculate binary logarithm of x.  Revert if x <= 0.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function log_2 (int128 x) internal pure returns (int128) {
    require (x > 0);

    int256 msb = 0;
    int256 xc = x;
    if (xc >= 0x10000000000000000) { xc >>= 64; msb += 64; }
    if (xc >= 0x100000000) { xc >>= 32; msb += 32; }
    if (xc >= 0x10000) { xc >>= 16; msb += 16; }
    if (xc >= 0x100) { xc >>= 8; msb += 8; }
    if (xc >= 0x10) { xc >>= 4; msb += 4; }
    if (xc >= 0x4) { xc >>= 2; msb += 2; }
    if (xc >= 0x2) msb += 1;  // No need to shift xc anymore

    int256 result = msb - 64 << 64;
    uint256 ux = uint256 (x) << 127 - msb;
    for (int256 bit = 0x8000000000000000; bit > 0; bit >>= 1) {
      ux *= ux;
      uint256 b = ux >> 255;
      ux >>= 127 + b;
      result += bit * int256 (b);
    }

    return int128 (result);
  }

  /**
   * Calculate natural logarithm of x.  Revert if x <= 0.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function ln (int128 x) internal pure returns (int128) {
    require (x > 0);

    return int128 (
        uint256 (log_2 (x)) * 0xB17217F7D1CF79ABC9E3B39803F2F6AF >> 128);
  }

  /**
   * Calculate binary exponent of x.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function exp_2 (int128 x) internal pure returns (int128) {
    require (x < 0x400000000000000000); // Overflow

    if (x < -0x400000000000000000) return 0; // Underflow

    uint256 result = 0x80000000000000000000000000000000;

    if (x & 0x8000000000000000 > 0)
      result = result * 0x16A09E667F3BCC908B2FB1366EA957D3E >> 128;
    if (x & 0x4000000000000000 > 0)
      result = result * 0x1306FE0A31B7152DE8D5A46305C85EDEC >> 128;
    if (x & 0x2000000000000000 > 0)
      result = result * 0x1172B83C7D517ADCDF7C8C50EB14A791F >> 128;
    if (x & 0x1000000000000000 > 0)
      result = result * 0x10B5586CF9890F6298B92B71842A98363 >> 128;
    if (x & 0x800000000000000 > 0)
      result = result * 0x1059B0D31585743AE7C548EB68CA417FD >> 128;
    if (x & 0x400000000000000 > 0)
      result = result * 0x102C9A3E778060EE6F7CACA4F7A29BDE8 >> 128;
    if (x & 0x200000000000000 > 0)
      result = result * 0x10163DA9FB33356D84A66AE336DCDFA3F >> 128;
    if (x & 0x100000000000000 > 0)
      result = result * 0x100B1AFA5ABCBED6129AB13EC11DC9543 >> 128;
    if (x & 0x80000000000000 > 0)
      result = result * 0x10058C86DA1C09EA1FF19D294CF2F679B >> 128;
    if (x & 0x40000000000000 > 0)
      result = result * 0x1002C605E2E8CEC506D21BFC89A23A00F >> 128;
    if (x & 0x20000000000000 > 0)
      result = result * 0x100162F3904051FA128BCA9C55C31E5DF >> 128;
    if (x & 0x10000000000000 > 0)
      result = result * 0x1000B175EFFDC76BA38E31671CA939725 >> 128;
    if (x & 0x8000000000000 > 0)
      result = result * 0x100058BA01FB9F96D6CACD4B180917C3D >> 128;
    if (x & 0x4000000000000 > 0)
      result = result * 0x10002C5CC37DA9491D0985C348C68E7B3 >> 128;
    if (x & 0x2000000000000 > 0)
      result = result * 0x1000162E525EE054754457D5995292026 >> 128;
    if (x & 0x1000000000000 > 0)
      result = result * 0x10000B17255775C040618BF4A4ADE83FC >> 128;
    if (x & 0x800000000000 > 0)
      result = result * 0x1000058B91B5BC9AE2EED81E9B7D4CFAB >> 128;
    if (x & 0x400000000000 > 0)
      result = result * 0x100002C5C89D5EC6CA4D7C8ACC017B7C9 >> 128;
    if (x & 0x200000000000 > 0)
      result = result * 0x10000162E43F4F831060E02D839A9D16D >> 128;
    if (x & 0x100000000000 > 0)
      result = result * 0x100000B1721BCFC99D9F890EA06911763 >> 128;
    if (x & 0x80000000000 > 0)
      result = result * 0x10000058B90CF1E6D97F9CA14DBCC1628 >> 128;
    if (x & 0x40000000000 > 0)
      result = result * 0x1000002C5C863B73F016468F6BAC5CA2B >> 128;
    if (x & 0x20000000000 > 0)
      result = result * 0x100000162E430E5A18F6119E3C02282A5 >> 128;
    if (x & 0x10000000000 > 0)
      result = result * 0x1000000B1721835514B86E6D96EFD1BFE >> 128;
    if (x & 0x8000000000 > 0)
      result = result * 0x100000058B90C0B48C6BE5DF846C5B2EF >> 128;
    if (x & 0x4000000000 > 0)
      result = result * 0x10000002C5C8601CC6B9E94213C72737A >> 128;
    if (x & 0x2000000000 > 0)
      result = result * 0x1000000162E42FFF037DF38AA2B219F06 >> 128;
    if (x & 0x1000000000 > 0)
      result = result * 0x10000000B17217FBA9C739AA5819F44F9 >> 128;
    if (x & 0x800000000 > 0)
      result = result * 0x1000000058B90BFCDEE5ACD3C1CEDC823 >> 128;
    if (x & 0x400000000 > 0)
      result = result * 0x100000002C5C85FE31F35A6A30DA1BE50 >> 128;
    if (x & 0x200000000 > 0)
      result = result * 0x10000000162E42FF0999CE3541B9FFFCF >> 128;
    if (x & 0x100000000 > 0)
      result = result * 0x100000000B17217F80F4EF5AADDA45554 >> 128;
    if (x & 0x80000000 > 0)
      result = result * 0x10000000058B90BFBF8479BD5A81B51AD >> 128;
    if (x & 0x40000000 > 0)
      result = result * 0x1000000002C5C85FDF84BD62AE30A74CC >> 128;
    if (x & 0x20000000 > 0)
      result = result * 0x100000000162E42FEFB2FED257559BDAA >> 128;
    if (x & 0x10000000 > 0)
      result = result * 0x1000000000B17217F7D5A7716BBA4A9AE >> 128;
    if (x & 0x8000000 > 0)
      result = result * 0x100000000058B90BFBE9DDBAC5E109CCE >> 128;
    if (x & 0x4000000 > 0)
      result = result * 0x10000000002C5C85FDF4B15DE6F17EB0D >> 128;
    if (x & 0x2000000 > 0)
      result = result * 0x1000000000162E42FEFA494F1478FDE05 >> 128;
    if (x & 0x1000000 > 0)
      result = result * 0x10000000000B17217F7D20CF927C8E94C >> 128;
    if (x & 0x800000 > 0)
      result = result * 0x1000000000058B90BFBE8F71CB4E4B33D >> 128;
    if (x & 0x400000 > 0)
      result = result * 0x100000000002C5C85FDF477B662B26945 >> 128;
    if (x & 0x200000 > 0)
      result = result * 0x10000000000162E42FEFA3AE53369388C >> 128;
    if (x & 0x100000 > 0)
      result = result * 0x100000000000B17217F7D1D351A389D40 >> 128;
    if (x & 0x80000 > 0)
      result = result * 0x10000000000058B90BFBE8E8B2D3D4EDE >> 128;
    if (x & 0x40000 > 0)
      result = result * 0x1000000000002C5C85FDF4741BEA6E77E >> 128;
    if (x & 0x20000 > 0)
      result = result * 0x100000000000162E42FEFA39FE95583C2 >> 128;
    if (x & 0x10000 > 0)
      result = result * 0x1000000000000B17217F7D1CFB72B45E1 >> 128;
    if (x & 0x8000 > 0)
      result = result * 0x100000000000058B90BFBE8E7CC35C3F0 >> 128;
    if (x & 0x4000 > 0)
      result = result * 0x10000000000002C5C85FDF473E242EA38 >> 128;
    if (x & 0x2000 > 0)
      result = result * 0x1000000000000162E42FEFA39F02B772C >> 128;
    if (x & 0x1000 > 0)
      result = result * 0x10000000000000B17217F7D1CF7D83C1A >> 128;
    if (x & 0x800 > 0)
      result = result * 0x1000000000000058B90BFBE8E7BDCBE2E >> 128;
    if (x & 0x400 > 0)
      result = result * 0x100000000000002C5C85FDF473DEA871F >> 128;
    if (x & 0x200 > 0)
      result = result * 0x10000000000000162E42FEFA39EF44D91 >> 128;
    if (x & 0x100 > 0)
      result = result * 0x100000000000000B17217F7D1CF79E949 >> 128;
    if (x & 0x80 > 0)
      result = result * 0x10000000000000058B90BFBE8E7BCE544 >> 128;
    if (x & 0x40 > 0)
      result = result * 0x1000000000000002C5C85FDF473DE6ECA >> 128;
    if (x & 0x20 > 0)
      result = result * 0x100000000000000162E42FEFA39EF366F >> 128;
    if (x & 0x10 > 0)
      result = result * 0x1000000000000000B17217F7D1CF79AFA >> 128;
    if (x & 0x8 > 0)
      result = result * 0x100000000000000058B90BFBE8E7BCD6D >> 128;
    if (x & 0x4 > 0)
      result = result * 0x10000000000000002C5C85FDF473DE6B2 >> 128;
    if (x & 0x2 > 0)
      result = result * 0x1000000000000000162E42FEFA39EF358 >> 128;
    if (x & 0x1 > 0)
      result = result * 0x10000000000000000B17217F7D1CF79AB >> 128;

    result >>= 63 - (x >> 64);
    require (result <= uint256 (MAX_64x64));

    return int128 (result);
  }

  /**
   * Calculate natural exponent of x.  Revert on overflow.
   *
   * @param x signed 64.64-bit fixed point number
   * @return signed 64.64-bit fixed point number
   */
  function exp (int128 x) internal pure returns (int128) {
    require (x < 0x400000000000000000); // Overflow

    if (x < -0x400000000000000000) return 0; // Underflow

    return exp_2 (
        int128 (int256 (x) * 0x171547652B82FE1777D0FFDA0D23A7D12 >> 128));
  }

  /**
   * Calculate x / y rounding towards zero, where x and y are unsigned 256-bit
   * integer numbers.  Revert on overflow or when y is zero.
   *
   * @param x unsigned 256-bit integer number
   * @param y unsigned 256-bit integer number
   * @return unsigned 64.64-bit fixed point number
   */
  function divuu (uint256 x, uint256 y) private pure returns (uint128) {
    require (y != 0);

    uint256 result;

    if (x <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
      result = (x << 64) / y;
    else {
      uint256 msb = 192;
      uint256 xc = x >> 192;
      if (xc >= 0x100000000) { xc >>= 32; msb += 32; }
      if (xc >= 0x10000) { xc >>= 16; msb += 16; }
      if (xc >= 0x100) { xc >>= 8; msb += 8; }
      if (xc >= 0x10) { xc >>= 4; msb += 4; }
      if (xc >= 0x4) { xc >>= 2; msb += 2; }
      if (xc >= 0x2) msb += 1;  // No need to shift xc anymore

      result = (x << 255 - msb) / ((y - 1 >> msb - 191) + 1);
      require (result <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);

      uint256 hi = result * (y >> 128);
      uint256 lo = result * (y & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);

      uint256 xh = x >> 192;
      uint256 xl = x << 64;

      if (xl < lo) xh -= 1;
      xl -= lo; // We rely on overflow behavior here
      lo = hi << 128;
      if (xl < lo) xh -= 1;
      xl -= lo; // We rely on overflow behavior here

      assert (xh == hi >> 128);

      result += xl / y;
    }

    require (result <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF);
    return uint128 (result);
  }

  /**
   * Calculate x^y assuming 0^0 is 1, where x is unsigned 129.127 fixed point
   * number and y is unsigned 256-bit integer number.  Revert on overflow.
   *
   * @param x unsigned 129.127-bit fixed point number
   * @param y uint256 value
   * @return unsigned 129.127-bit fixed point number
   */
  function powu (uint256 x, uint256 y) private pure returns (uint256) {
    if (y == 0) return 0x80000000000000000000000000000000;
    else if (x == 0) return 0;
    else {
      int256 msb = 0;
      uint256 xc = x;
      if (xc >= 0x100000000000000000000000000000000) { xc >>= 128; msb += 128; }
      if (xc >= 0x10000000000000000) { xc >>= 64; msb += 64; }
      if (xc >= 0x100000000) { xc >>= 32; msb += 32; }
      if (xc >= 0x10000) { xc >>= 16; msb += 16; }
      if (xc >= 0x100) { xc >>= 8; msb += 8; }
      if (xc >= 0x10) { xc >>= 4; msb += 4; }
      if (xc >= 0x4) { xc >>= 2; msb += 2; }
      if (xc >= 0x2) msb += 1;  // No need to shift xc anymore

      int256 xe = msb - 127;
      if (xe > 0) x >>= xe;
      else x <<= -xe;

      uint256 result = 0x80000000000000000000000000000000;
      int256 re = 0;

      while (y > 0) {
        if (y & 1 > 0) {
          result = result * x;
          y -= 1;
          re += xe;
          if (result >=
            0x8000000000000000000000000000000000000000000000000000000000000000) {
            result >>= 128;
            re += 1;
          } else result >>= 127;
          if (re < -127) return 0; // Underflow
          require (re < 128); // Overflow
        } else {
          x = x * x;
          y >>= 1;
          xe <<= 1;
          if (x >=
            0x8000000000000000000000000000000000000000000000000000000000000000) {
            x >>= 128;
            xe += 1;
          } else x >>= 127;
          if (xe < -127) return 0; // Underflow
          require (xe < 128); // Overflow
        }
      }

      if (re > 0) result <<= re;
      else if (re < 0) result >>= -re;

      return result;
    }
  }

  /**
   * Calculate sqrt (x) rounding down, where x is unsigned 256-bit integer
   * number.
   *
   * @param x unsigned 256-bit integer number
   * @return unsigned 128-bit integer number
   */
  function sqrtu (uint256 x, uint256 r) private pure returns (uint128) {
    if (x == 0) return 0;
    else {
      require (r > 0);
      while (true) {
        uint256 rr = x / r;
        if (r == rr || r + 1 == rr) return uint128 (r);
        else if (r == rr + 1) return uint128 (rr);
        r = r + rr + 1 >> 1;
      }
    }
  }
}

File 2 of 8: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.2;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 3 of 8: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

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

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

File 4 of 8: ERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

import "./Context.sol";
import "./IERC20.sol";
import "./SafeMath.sol";
import "./Address.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;
        _decimals = 18;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

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

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

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

pragma solidity ^0.6.0;

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

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

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

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

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

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

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

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

File 7 of 8: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

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

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

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

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

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

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

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

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

pragma solidity ^0.6.0;

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"uint256","name":"_shortMomentumWeight","type":"uint256"},{"internalType":"uint256","name":"_LMweightEx","type":"uint256"},{"internalType":"uint256","name":"_LMweightCo","type":"uint256"},{"internalType":"uint256","name":"factor","type":"uint256"},{"internalType":"uint256","name":"_shortMomentum","type":"uint256"},{"internalType":"uint256","name":"_longMomentum","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getLongMomentum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMomentumAndSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getShortMomentum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBurning","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount256","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount256","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600a60006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b5060405162002de438038062002de4833981810160405260e08110156200005257600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050506040518060400160405280600881526020017f4d6f6d656e74756d0000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f584d4d0000000000000000000000000000000000000000000000000000000000815250816003908051906020019062000123929190620008de565b5080600490805190602001906200013c929190620008de565b506012600560006101000a81548160ff021916908360ff160217905550505060006200016d620003e460201b60201c565b905080600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506200021e600a620003ec60201b60201c565b6200023f62000232620003e460201b60201c565b886200040a60201b60201c565b620002568684620005e860201b6200104e1760201c565b600760006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620002a88584620005e860201b6200104e1760201c565b600760106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620002fa8484620005e860201b6200104e1760201c565b600860006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200034b826200065a60201b620010b61760201c565b600660006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200039c816200065a60201b620010b61760201c565b600660106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055505050505050505062000984565b600033905090565b80600560006101000a81548160ff021916908360ff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620004ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b620004c2600083836200067e60201b60201c565b620004de816002546200068360201b620010d91790919060201c565b6002819055506200053c816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200068360201b620010d91790919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080821415620005f857600080fd5b60006200060c84846200070c60201b60201c565b90506f7fffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff16816fffffffffffffffffffffffffffffffff1611156200065057600080fd5b8091505092915050565b6000677fffffffffffffff8211156200067257600080fd5b604082901b9050919050565b505050565b60008082840190508381101562000702576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b6000808214156200071c57600080fd5b600077ffffffffffffffffffffffffffffffffffffffffffffffff8411620007555782604085901b816200074c57fe5b049050620008b6565b600060c09050600060c086901c905064010000000081106200077f57602081901c90506020820191505b6201000081106200079857601081901c90506010820191505b6101008110620007b057600881901c90506008820191505b60108110620007c757600481901c90506004820191505b60048110620007de57600281901c90506002820191505b60028110620007ee576001820191505b600160bf830360018703901c018260ff0387901b816200080a57fe5b0492506fffffffffffffffffffffffffffffffff8311156200082b57600080fd5b6000608086901c8402905060006fffffffffffffffffffffffffffffffff871685029050600060c089901c9050600060408a901b90508281101562000871576001820391505b8281039050608084901b9250828110156200088d576001820391505b8281039050608084901c8214620008a057fe5b888181620008aa57fe5b04870196505050505050505b6fffffffffffffffffffffffffffffffff811115620008d457600080fd5b8091505092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200092157805160ff191683800117855562000952565b8280016001018555821562000952579182015b828111156200095157825182559160200191906001019062000934565b5b50905062000961919062000965565b5090565b5b808211156200098057600081600090555060010162000966565b5090565b61245080620009946000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c806374576db6116100a2578063a9059cbb11610071578063a9059cbb146104ce578063d7a70e0314610532578063dd62ed3e1461055e578063e7142a64146105d6578063f2fde38b146105f457610116565b806374576db6146103a95780638da5cb5b146103b357806395d89b41146103e7578063a457c2d71461046a57610116565b8063313ce567116100e9578063313ce567146102a457806339509351146102c5578063553e46371461032957806370a0823114610347578063715018a61461039f57610116565b806306fdde031461011b578063095ea7b31461019e57806318160ddd1461020257806323b872dd14610220575b600080fd5b610123610638565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610163578082015181840152602081019050610148565b50505050905090810190601f1680156101905780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101ea600480360360408110156101b457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506106da565b60405180821515815260200191505060405180910390f35b61020a6106f8565b6040518082815260200191505060405180910390f35b61028c6004803603606081101561023657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610702565b60405180821515815260200191505060405180910390f35b6102ac6107db565b604051808260ff16815260200191505060405180910390f35b610311600480360360408110156102db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506107f2565b60405180821515815260200191505060405180910390f35b6103316108a5565b6040518082815260200191505060405180910390f35b6103896004803603602081101561035d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108c6565b6040518082815260200191505060405180910390f35b6103a761090e565b005b6103b1610a99565b005b6103bb610b88565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103ef610bb2565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561042f578082015181840152602081019050610414565b50505050905090810190601f16801561045c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104b66004803603604081101561048057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c54565b60405180821515815260200191505060405180910390f35b61051a600480360360408110156104e457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d21565b60405180821515815260200191505060405180910390f35b61053a610d3f565b60405180848152602001838152602001828152602001935050505060405180910390f35b6105c06004803603604081101561057457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d96565b6040518082815260200191505060405180910390f35b6105de610e1d565b6040518082815260200191505060405180910390f35b6106366004803603602081101561060a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e3e565b005b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106d05780601f106106a5576101008083540402835291602001916106d0565b820191906000526020600020905b8154815290600101906020018083116106b357829003601f168201915b5050505050905090565b60006106ee6106e7611161565b8484611169565b6001905092915050565b6000600254905090565b600061070f848484611360565b6107d08461071b611161565b6107cb8560405180606001604052806028815260200161236460289139600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610781611161565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113e69092919063ffffffff16565b611169565b600190509392505050565b6000600560009054906101000a900460ff16905090565b600061089b6107ff611161565b846108968560096000610810611161565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110d990919063ffffffff16565b611169565b6001905092915050565b60006108c1600660009054906101000a9004600f0b60016114a6565b905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610916611161565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146109d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b610aa1611161565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b63576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6001600a60006101000a81548160ff021916908315150217905550610b8661090e565b565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c4a5780601f10610c1f57610100808354040283529160200191610c4a565b820191906000526020600020905b815481529060010190602001808311610c2d57829003601f168201915b5050505050905090565b6000610d17610c61611161565b84610d12856040518060600160405280602581526020016123f66025913960096000610c8b611161565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113e69092919063ffffffff16565b611169565b6001905092915050565b6000610d35610d2e611161565b8484611360565b6001905092915050565b600080600080610d5f600660009054906101000a9004600f0b60016114a6565b90506000610d7d600660109054906101000a9004600f0b60016114a6565b90508181610d896106f8565b9450945094505050909192565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000610e39600660109054906101000a9004600f0b60016114a6565b905090565b610e46611161565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f8e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806122f66026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008082141561105d57600080fd5b60006110698484611561565b90506f7fffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff16816fffffffffffffffffffffffffffffffff1611156110ac57600080fd5b8091505092915050565b6000677fffffffffffffff8211156110cd57600080fd5b604082901b9050919050565b600080828401905083811015611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156111ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806123d26024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061231c6022913960400191505060405180910390fd5b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600a60009054906101000a900460ff16156113d55760006113a082600660009054906101000a9004600f0b600660109054906101000a9004600f0b611722565b905060006113b782846118c890919063ffffffff16565b90506113c38583611912565b6113ce858583611ad6565b50506113e1565b6113e0838383611ad6565b5b505050565b6000838311158290611493576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561145857808201518184015260208101905061143d565b50505050905090810190601f1680156114855780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000808214156114b9576000905061155b565b600083600f0b12156114ca57600080fd5b600060406fffffffffffffffffffffffffffffffff841685600f0b02901c90506000608084901c85600f0b02905077ffffffffffffffffffffffffffffffffffffffffffffffff81111561151d57600080fd5b604081901b9050817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0381111561155357600080fd5b818101925050505b92915050565b60008082141561157057600080fd5b600077ffffffffffffffffffffffffffffffffffffffffffffffff84116115a65782604085901b8161159e57fe5b0490506116fb565b600060c09050600060c086901c905064010000000081106115cf57602081901c90506020820191505b6201000081106115e757601081901c90506010820191505b61010081106115fe57600881901c90506008820191505b6010811061161457600481901c90506004820191505b6004811061162a57600281901c90506002820191505b60028110611639576001820191505b600160bf830360018703901c018260ff0387901b8161165457fe5b0492506fffffffffffffffffffffffffffffffff83111561167457600080fd5b6000608086901c8402905060006fffffffffffffffffffffffffffffffff871685029050600060c089901c9050600060408a901b9050828110156116b9576001820391505b8281039050608084901b9250828110156116d4576001820391505b8281039050608084901c82146116e657fe5b8881816116ef57fe5b04870196505050505050505b6fffffffffffffffffffffffffffffffff81111561171857600080fd5b8091505092915050565b60008061172e856110b6565b905082600f0b84600f0b13611788576117518461174c61014d6110b6565b611d97565b600f0b81600f0b12156117835761177b6117748261176f60146110b6565b611d97565b60016114a6565b9150506118c1565b6117cf565b61179c8361179761014d6110b6565b611d97565b600f0b81600f0b12156117ce576117c66117bf826117ba60146110b6565b611d97565b60016114a6565b9150506118c1565b5b6000806117dd838787611e1a565b915091506000806117f087898686611eb4565b91509150600061180060006110b6565b600f0b83600f0b1215611827576118208661181b60856110b6565b611d97565b9050611835565b611832868387611f03565b90505b84600660106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555083600660006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506118b88160016114a6565b96505050505050505b9392505050565b600061190a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506113e6565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061238c6021913960400191505060405180910390fd5b6119a482600083611fb7565b611a0f816040518060600160405280602281526020016122d4602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113e69092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611a66816002546118c890919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b5c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806123ad6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611be2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806122b16023913960400191505060405180910390fd5b611bed838383611fb7565b611c588160405180606001604052806026815260200161233e602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113e69092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611ceb816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110d990919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60008082600f0b1415611da957600080fd5b600082600f0b604085600f0b901b81611dbe57fe5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015611e0757506f7fffffffffffffffffffffffffffffff600f0b8113155b611e1057600080fd5b8091505092915050565b600080600084600f0b86600f0b12611e4157600760109054906101000a9004600f0b611e52565b600860009054906101000a9004600f0b5b90506000611e7285611e6d611e678a89611fbc565b85611d97565b612023565b90506000611ea187611e9c611e878b8b611fbc565b600760009054906101000a9004600f0b611d97565b612023565b9050818194509450505050935093915050565b6000806000611ecb611ec68888611fbc565b61208a565b90506000611ee1611edc8787611fbc565b61208a565b90506000611eef8284611fbc565b905080829450945050505094509492505050565b6000611f1882611f1360326110b6565b611d97565b600f0b83600f0b13611f5057611f4984611f44611f3560016110b6565b611f3f60856110b6565b611d97565b6120dc565b9050611fb0565b6000611f5c8484611d97565b90506000611f8d611f6d60016110b6565b611f88611f8385611f7e60326110b6565b6120dc565b612147565b612023565b9050611fab86611fa683611fa160856110b6565b611d97565b6120dc565b925050505b9392505050565b505050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561201057506f7fffffffffffffffffffffffffffffff600f0b8113155b61201957600080fd5b8091505092915050565b60008082600f0b84600f0b0190507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561207757506f7fffffffffffffffffffffffffffffff600f0b8113155b61208057600080fd5b8091505092915050565b60007fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b82600f0b14156120bf57600080fd5b600082600f0b126120d057816120d5565b816000035b9050919050565b600080604083600f0b85600f0b02901d90507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561213457506f7fffffffffffffffffffffffffffffff600f0b8113155b61213d57600080fd5b8091505092915050565b60008082600f0b1361215857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af61217484612181565b600f0b02901c9050919050565b60008082600f0b1361219257600080fd5b60008083600f0b90506801000000000000000081126121b957604081901d90506040820191505b64010000000081126121d357602081901d90506020820191505b6201000081126121eb57601081901d90506010820191505b610100811261220257600881901d90506008820191505b6010811261221857600481901d90506004820191505b6004811261222e57600281901d90506002820191505b6002811261223d576001820191505b60006040808403901b9050600083607f0386600f0b600082121561225d57fe5b901b9050600067800000000000000090505b60008113156122a3578182029150600060ff83901c905080607f0183901c92508082028401935050600181901d905061226f565b508194505050505091905056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ae3ab1acab4a6a7b5465e9a1db9c3e425a43d4e681c312ba2be7906e37a8383864736f6c634300060c00330000000000000000000000000000000000000000000000000aaf96eb9d0d0000000000000000000000000000000000000000000000000000000000000002780b000000000000000000000000000000000000000000000000000000000003feab00000000000000000000000000000000000000000000000000000000000676b50000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000110d9316ec000000000000000000000000000000000000000000000000000000110d9316ec000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101165760003560e01c806374576db6116100a2578063a9059cbb11610071578063a9059cbb146104ce578063d7a70e0314610532578063dd62ed3e1461055e578063e7142a64146105d6578063f2fde38b146105f457610116565b806374576db6146103a95780638da5cb5b146103b357806395d89b41146103e7578063a457c2d71461046a57610116565b8063313ce567116100e9578063313ce567146102a457806339509351146102c5578063553e46371461032957806370a0823114610347578063715018a61461039f57610116565b806306fdde031461011b578063095ea7b31461019e57806318160ddd1461020257806323b872dd14610220575b600080fd5b610123610638565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610163578082015181840152602081019050610148565b50505050905090810190601f1680156101905780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101ea600480360360408110156101b457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506106da565b60405180821515815260200191505060405180910390f35b61020a6106f8565b6040518082815260200191505060405180910390f35b61028c6004803603606081101561023657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610702565b60405180821515815260200191505060405180910390f35b6102ac6107db565b604051808260ff16815260200191505060405180910390f35b610311600480360360408110156102db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506107f2565b60405180821515815260200191505060405180910390f35b6103316108a5565b6040518082815260200191505060405180910390f35b6103896004803603602081101561035d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108c6565b6040518082815260200191505060405180910390f35b6103a761090e565b005b6103b1610a99565b005b6103bb610b88565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103ef610bb2565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561042f578082015181840152602081019050610414565b50505050905090810190601f16801561045c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104b66004803603604081101561048057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c54565b60405180821515815260200191505060405180910390f35b61051a600480360360408110156104e457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610d21565b60405180821515815260200191505060405180910390f35b61053a610d3f565b60405180848152602001838152602001828152602001935050505060405180910390f35b6105c06004803603604081101561057457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d96565b6040518082815260200191505060405180910390f35b6105de610e1d565b6040518082815260200191505060405180910390f35b6106366004803603602081101561060a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e3e565b005b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106d05780601f106106a5576101008083540402835291602001916106d0565b820191906000526020600020905b8154815290600101906020018083116106b357829003601f168201915b5050505050905090565b60006106ee6106e7611161565b8484611169565b6001905092915050565b6000600254905090565b600061070f848484611360565b6107d08461071b611161565b6107cb8560405180606001604052806028815260200161236460289139600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610781611161565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113e69092919063ffffffff16565b611169565b600190509392505050565b6000600560009054906101000a900460ff16905090565b600061089b6107ff611161565b846108968560096000610810611161565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110d990919063ffffffff16565b611169565b6001905092915050565b60006108c1600660009054906101000a9004600f0b60016114a6565b905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610916611161565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146109d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b610aa1611161565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b63576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6001600a60006101000a81548160ff021916908315150217905550610b8661090e565b565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610c4a5780601f10610c1f57610100808354040283529160200191610c4a565b820191906000526020600020905b815481529060010190602001808311610c2d57829003601f168201915b5050505050905090565b6000610d17610c61611161565b84610d12856040518060600160405280602581526020016123f66025913960096000610c8b611161565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113e69092919063ffffffff16565b611169565b6001905092915050565b6000610d35610d2e611161565b8484611360565b6001905092915050565b600080600080610d5f600660009054906101000a9004600f0b60016114a6565b90506000610d7d600660109054906101000a9004600f0b60016114a6565b90508181610d896106f8565b9450945094505050909192565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000610e39600660109054906101000a9004600f0b60016114a6565b905090565b610e46611161565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f8e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806122f66026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008082141561105d57600080fd5b60006110698484611561565b90506f7fffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff16816fffffffffffffffffffffffffffffffff1611156110ac57600080fd5b8091505092915050565b6000677fffffffffffffff8211156110cd57600080fd5b604082901b9050919050565b600080828401905083811015611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156111ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806123d26024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018061231c6022913960400191505060405180910390fd5b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600a60009054906101000a900460ff16156113d55760006113a082600660009054906101000a9004600f0b600660109054906101000a9004600f0b611722565b905060006113b782846118c890919063ffffffff16565b90506113c38583611912565b6113ce858583611ad6565b50506113e1565b6113e0838383611ad6565b5b505050565b6000838311158290611493576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561145857808201518184015260208101905061143d565b50505050905090810190601f1680156114855780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b6000808214156114b9576000905061155b565b600083600f0b12156114ca57600080fd5b600060406fffffffffffffffffffffffffffffffff841685600f0b02901c90506000608084901c85600f0b02905077ffffffffffffffffffffffffffffffffffffffffffffffff81111561151d57600080fd5b604081901b9050817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0381111561155357600080fd5b818101925050505b92915050565b60008082141561157057600080fd5b600077ffffffffffffffffffffffffffffffffffffffffffffffff84116115a65782604085901b8161159e57fe5b0490506116fb565b600060c09050600060c086901c905064010000000081106115cf57602081901c90506020820191505b6201000081106115e757601081901c90506010820191505b61010081106115fe57600881901c90506008820191505b6010811061161457600481901c90506004820191505b6004811061162a57600281901c90506002820191505b60028110611639576001820191505b600160bf830360018703901c018260ff0387901b8161165457fe5b0492506fffffffffffffffffffffffffffffffff83111561167457600080fd5b6000608086901c8402905060006fffffffffffffffffffffffffffffffff871685029050600060c089901c9050600060408a901b9050828110156116b9576001820391505b8281039050608084901b9250828110156116d4576001820391505b8281039050608084901c82146116e657fe5b8881816116ef57fe5b04870196505050505050505b6fffffffffffffffffffffffffffffffff81111561171857600080fd5b8091505092915050565b60008061172e856110b6565b905082600f0b84600f0b13611788576117518461174c61014d6110b6565b611d97565b600f0b81600f0b12156117835761177b6117748261176f60146110b6565b611d97565b60016114a6565b9150506118c1565b6117cf565b61179c8361179761014d6110b6565b611d97565b600f0b81600f0b12156117ce576117c66117bf826117ba60146110b6565b611d97565b60016114a6565b9150506118c1565b5b6000806117dd838787611e1a565b915091506000806117f087898686611eb4565b91509150600061180060006110b6565b600f0b83600f0b1215611827576118208661181b60856110b6565b611d97565b9050611835565b611832868387611f03565b90505b84600660106101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff16021790555083600660006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506118b88160016114a6565b96505050505050505b9392505050565b600061190a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506113e6565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061238c6021913960400191505060405180910390fd5b6119a482600083611fb7565b611a0f816040518060600160405280602281526020016122d4602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113e69092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611a66816002546118c890919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611b5c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806123ad6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611be2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806122b16023913960400191505060405180910390fd5b611bed838383611fb7565b611c588160405180606001604052806026815260200161233e602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546113e69092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611ceb816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110d990919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b60008082600f0b1415611da957600080fd5b600082600f0b604085600f0b901b81611dbe57fe5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015611e0757506f7fffffffffffffffffffffffffffffff600f0b8113155b611e1057600080fd5b8091505092915050565b600080600084600f0b86600f0b12611e4157600760109054906101000a9004600f0b611e52565b600860009054906101000a9004600f0b5b90506000611e7285611e6d611e678a89611fbc565b85611d97565b612023565b90506000611ea187611e9c611e878b8b611fbc565b600760009054906101000a9004600f0b611d97565b612023565b9050818194509450505050935093915050565b6000806000611ecb611ec68888611fbc565b61208a565b90506000611ee1611edc8787611fbc565b61208a565b90506000611eef8284611fbc565b905080829450945050505094509492505050565b6000611f1882611f1360326110b6565b611d97565b600f0b83600f0b13611f5057611f4984611f44611f3560016110b6565b611f3f60856110b6565b611d97565b6120dc565b9050611fb0565b6000611f5c8484611d97565b90506000611f8d611f6d60016110b6565b611f88611f8385611f7e60326110b6565b6120dc565b612147565b612023565b9050611fab86611fa683611fa160856110b6565b611d97565b6120dc565b925050505b9392505050565b505050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561201057506f7fffffffffffffffffffffffffffffff600f0b8113155b61201957600080fd5b8091505092915050565b60008082600f0b84600f0b0190507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561207757506f7fffffffffffffffffffffffffffffff600f0b8113155b61208057600080fd5b8091505092915050565b60007fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b82600f0b14156120bf57600080fd5b600082600f0b126120d057816120d5565b816000035b9050919050565b600080604083600f0b85600f0b02901d90507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561213457506f7fffffffffffffffffffffffffffffff600f0b8113155b61213d57600080fd5b8091505092915050565b60008082600f0b1361215857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af61217484612181565b600f0b02901c9050919050565b60008082600f0b1361219257600080fd5b60008083600f0b90506801000000000000000081126121b957604081901d90506040820191505b64010000000081126121d357602081901d90506020820191505b6201000081126121eb57601081901d90506010820191505b610100811261220257600881901d90506008820191505b6010811261221857600481901d90506004820191505b6004811261222e57600281901d90506002820191505b6002811261223d576001820191505b60006040808403901b9050600083607f0386600f0b600082121561225d57fe5b901b9050600067800000000000000090505b60008113156122a3578182029150600060ff83901c905080607f0183901c92508082028401935050600181901d905061226f565b508194505050505091905056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ae3ab1acab4a6a7b5465e9a1db9c3e425a43d4e681c312ba2be7906e37a8383864736f6c634300060c0033

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

0000000000000000000000000000000000000000000000000aaf96eb9d0d0000000000000000000000000000000000000000000000000000000000000002780b000000000000000000000000000000000000000000000000000000000003feab00000000000000000000000000000000000000000000000000000000000676b50000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000110d9316ec000000000000000000000000000000000000000000000000000000110d9316ec000

-----Decoded View---------------
Arg [0] : initialSupply (uint256): 770000000000000000
Arg [1] : _shortMomentumWeight (uint256): 161803
Arg [2] : _LMweightEx (uint256): 261803
Arg [3] : _LMweightCo (uint256): 423605
Arg [4] : factor (uint256): 10000
Arg [5] : _shortMomentum (uint256): 300000000000000
Arg [6] : _longMomentum (uint256): 300000000000000

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000aaf96eb9d0d0000
Arg [1] : 000000000000000000000000000000000000000000000000000000000002780b
Arg [2] : 000000000000000000000000000000000000000000000000000000000003feab
Arg [3] : 00000000000000000000000000000000000000000000000000000000000676b5
Arg [4] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [5] : 000000000000000000000000000000000000000000000000000110d9316ec000
Arg [6] : 000000000000000000000000000000000000000000000000000110d9316ec000


Deployed Bytecode Sourcemap

174:6379:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2192:81:3;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4228:166;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;3235:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5211:328:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;3094:81:3;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;5698:219:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1086:113;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3391:117:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1684:145:6;;;:::i;:::-;;4440:106:5;;;:::i;:::-;;1061:77:6;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2386:85:3;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5925:270:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;5024:179;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1326:232;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5547:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1207:111;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1978:240:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2192:81:3;2229:13;2261:5;2254:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2192:81;:::o;4228:166::-;4311:4;4327:39;4336:12;:10;:12::i;:::-;4350:7;4359:6;4327:8;:39::i;:::-;4383:4;4376:11;;4228:166;;;;:::o;3235:98::-;3288:7;3314:12;;3307:19;;3235:98;:::o;5211:328:5:-;5312:4;5329:45;5345:6;5353:9;5364;5329:15;:45::i;:::-;5385:124;5394:6;5402:12;:10;:12::i;:::-;5416:92;5454:9;5416:92;;;;;;;;;;;;;;;;;:11;:19;5428:6;5416:19;;;;;;;;;;;;;;;:33;5436:12;:10;:12::i;:::-;5416:33;;;;;;;;;;;;;;;;:37;;:92;;;;;:::i;:::-;5385:8;:124::i;:::-;5527:4;5520:11;;5211:328;;;;;:::o;3094:81:3:-;3135:5;3159:9;;;;;;;;;;;3152:16;;3094:81;:::o;5698:219:5:-;5787:4;5804:83;5813:12;:10;:12::i;:::-;5827:7;5836:50;5875:10;5836:11;:25;5848:12;:10;:12::i;:::-;5836:25;;;;;;;;;;;;;;;:34;5862:7;5836:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;5804:8;:83::i;:::-;5905:4;5898:11;;5698:219;;;;:::o;1086:113::-;1137:7;1164:27;1174:13;;;;;;;;;;;1189:1;1164:9;:27::i;:::-;1157:34;;1086:113;:::o;3391:117:3:-;3457:7;3483:9;:18;3493:7;3483:18;;;;;;;;;;;;;;;;3476:25;;3391:117;;;:::o;1684:145:6:-;1275:12;:10;:12::i;:::-;1265:22;;:6;;;;;;;;;;;:22;;;1257:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1790:1:::1;1753:40;;1774:6;;;;;;;;;;;1753:40;;;;;;;;;;;;1820:1;1803:6;;:19;;;;;;;;;;;;;;;;;;1684:145::o:0;4440:106:5:-;1275:12:6;:10;:12::i;:::-;1265:22;;:6;;;;;;;;;;;:22;;;1257:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4504:4:5::1;4492:9;;:16;;;;;;;;;;;;;;;;;;4519:19;:17;:19::i;:::-;4440:106::o:0;1061:77:6:-;1099:7;1125:6;;;;;;;;;;;1118:13;;1061:77;:::o;2386:85:3:-;2425:13;2457:7;2450:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2386:85;:::o;5925:270:5:-;6019:4;6036:129;6045:12;:10;:12::i;:::-;6059:7;6068:96;6107:15;6068:96;;;;;;;;;;;;;;;;;:11;:25;6080:12;:10;:12::i;:::-;6068:25;;;;;;;;;;;;;;;:34;6094:7;6068:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;6036:8;:129::i;:::-;6183:4;6176:11;;5925:270;;;;:::o;5024:179::-;5105:4;5122:51;5138:12;:10;:12::i;:::-;5152:9;5163;5122:15;:51::i;:::-;5191:4;5184:11;;5024:179;;;;:::o;1326:232::-;1381:7;1390;1399;1419:10;1432:27;1442:13;;;;;;;;;;;1457:1;1432:9;:27::i;:::-;1419:40;;1470:10;1483:26;1493:12;;;;;;;;;;;1507:1;1483:9;:26::i;:::-;1470:39;;1528:2;1532;1536:13;:11;:13::i;:::-;1520:30;;;;;;;;1326:232;;;:::o;5547:143::-;5628:7;5655:11;:18;5667:5;5655:18;;;;;;;;;;;;;;;:27;5674:7;5655:27;;;;;;;;;;;;;;;;5648:34;;5547:143;;;;:::o;1207:111::-;1257:7;1284:26;1294:12;;;;;;;;;;;1308:1;1284:9;:26::i;:::-;1277:33;;1207:111;:::o;1978:240:6:-;1275:12;:10;:12::i;:::-;1265:22;;:6;;;;;;;;;;;:22;;;1257:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2086:1:::1;2066:22;;:8;:22;;;;2058:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2175:8;2146:38;;2167:6;;;;;;;;;;;2146:38;;;;;;;;;;;;2203:8;2194:6;;:17;;;;;;;;;;;;;;;;;;1978:240:::0;:::o;8433:208:0:-;8493:6;8522:1;8517;:6;;8508:16;;;;;;8531:14;8548:12;8555:1;8558;8548:5;:12::i;:::-;8531:29;;952:34;8576:29;;:6;:29;;;;8567:39;;;;;;8628:6;8613:22;;;8433:208;;;;:::o;1934:137::-;1987:6;2016:18;2011:1;:23;;2002:33;;;;;;2062:2;2057:1;:7;;2042:23;;1934:137;;;:::o;874:176:7:-;932:7;951:9;967:1;963;:5;951:17;;991:1;986;:6;;978:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1042:1;1035:8;;;874:176;;;;:::o;590:104:2:-;643:15;677:10;670:17;;590:104;:::o;6203:347:5:-;6323:1;6306:19;;:5;:19;;;;6298:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6404:1;6385:21;;:7;:21;;;;6377:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6488:6;6458:11;:18;6470:5;6458:18;;;;;;;;;;;;;;;:27;6477:7;6458:27;;;;;;;;;;;;;;;:36;;;;6526:7;6510:32;;6519:5;6510:32;;;6535:6;6510:32;;;;;;;;;;;;;;;;;;6203:347;;;:::o;4554:462::-;4657:9;;;;;;;;;;;4653:356;;;4683:19;4705:54;4720:9;4731:13;;;;;;;;;;;4746:12;;;;;;;;;;;4705:14;:54::i;:::-;4683:76;;4774:22;4799:26;4813:11;4799:9;:13;;:26;;;;:::i;:::-;4774:51;;4840:26;4846:6;4854:11;4840:5;:26::i;:::-;4881:44;4891:6;4899:9;4910:14;4881:9;:44::i;:::-;4653:356;;;;;4958:39;4968:6;4976:9;4987;4958;:39::i;:::-;4653:356;4554:462;;;:::o;1746:187:7:-;1832:7;1864:1;1859;:6;;1867:12;1851:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1890:9;1906:1;1902;:5;1890:17;;1925:1;1918:8;;;1746:187;;;;;:::o;6088:469:0:-;6147:7;6172:1;6167;:6;6163:20;;;6182:1;6175:8;;;;6163:20;6206:1;6201;:6;;;;6192:16;;;;;;6217:10;6290:2;6250:34;6246:1;:38;6240:1;6231:11;;:54;6230:62;;6217:75;;6299:10;6332:3;6327:1;:8;;6321:1;6312:11;;:24;6299:37;;6360:50;6354:2;:56;;6345:66;;;;;;6425:2;6418:9;;;;;6527:2;6458:66;:71;6445:2;:84;;6436:94;;;;;;6549:2;6544;:7;6537:14;;;;6088:469;;;;;:::o;21005:1257::-;21065:7;21095:1;21090;:6;;21081:16;;;;;;21106:14;21138:50;21133:1;:55;21129:1035;;21218:1;21212:2;21207:1;:7;;21206:13;;;;;;21197:22;;21129:1035;;;21240:11;21254:3;21240:17;;21266:10;21284:3;21279:1;:8;;21266:21;;21306:11;21300:2;:17;21296:48;;21328:2;21321:9;;;;;21339:2;21332:9;;;;21296:48;21362:7;21356:2;:13;21352:44;;21380:2;21373:9;;;;;21391:2;21384:9;;;;21352:44;21414:5;21408:2;:11;21404:40;;21430:1;21423:8;;;;;21440:1;21433:8;;;;21404:40;21462:4;21456:2;:10;21452:39;;21477:1;21470:8;;;;;21487:1;21480:8;;;;21452:39;21509:3;21503:2;:9;21499:38;;21523:1;21516:8;;;;;21533:1;21526:8;;;;21499:38;21555:3;21549:2;:9;21545:23;;21567:1;21560:8;;;;21545:23;21663:1;21656:3;21650;:9;21645:1;21641;:5;:18;;21640:24;21632:3;21626;:9;21621:1;:14;;21620:45;;;;;;21611:54;;21693:34;21683:6;:44;;21674:54;;;;;;21739:10;21767:3;21762:1;:8;;21752:6;:19;21739:32;;21780:10;21807:34;21803:1;:38;21793:6;:49;21780:62;;21853:10;21871:3;21866:1;:8;;21853:21;;21883:10;21901:2;21896:1;:7;;21883:20;;21923:2;21918;:7;21914:20;;;21933:1;21927:7;;;;21914:20;21949:2;21943:8;;;;22008:3;22002:2;:9;;21997:14;;22029:2;22024;:7;22020:20;;;22039:1;22033:7;;;;22020:20;22055:2;22049:8;;;;22125:3;22119:2;:9;;22113:2;:15;22105:24;;;;22155:1;22150:2;:6;;;;;;22140:16;;;;21129:1035;;;;;;;22191:34;22181:6;:44;;22172:54;;;;;;22249:6;22233:23;;;21005:1257;;;;:::o;3051:1381:5:-;3142:7;3162:13;3178:24;3192:9;3178:13;:24::i;:::-;3162:40;;3421:6;3411:16;;:6;:16;;;3407:364;;3457:36;3466:6;3474:18;3488:3;3474:13;:18::i;:::-;3457:8;:36::i;:::-;3448:45;;:6;:45;;;3444:142;;;3521:49;3531:35;3540:6;3548:17;3562:2;3548:13;:17::i;:::-;3531:8;:35::i;:::-;3568:1;3521:9;:49::i;:::-;3514:56;;;;;3444:142;3407:364;;;3631:36;3640:6;3648:18;3662:3;3648:13;:18::i;:::-;3631:8;:36::i;:::-;3622:45;;:6;:45;;;3618:142;;;3695:49;3705:35;3714:6;3722:17;3736:2;3722:13;:17::i;:::-;3705:8;:35::i;:::-;3742:1;3695:9;:49::i;:::-;3688:56;;;;;3618:142;3407:364;3792:22;3816:23;3843:38;3858:6;3866;3874;3843:14;:38::i;:::-;3791:90;;;;3893:17;3912:15;3931:63;3944:6;3952;3960:15;3977:16;3931:12;:63::i;:::-;3892:102;;;;4007:18;4055:16;4069:1;4055:13;:16::i;:::-;4042:29;;:10;:29;;;4038:256;;;4102:36;4111:6;4119:18;4133:3;4119:13;:18::i;:::-;4102:8;:36::i;:::-;4088:50;;4038:256;;;4220:62;4248:6;4256:8;4266:15;4220:27;:62::i;:::-;4206:76;;4038:256;4321:15;4306:12;;:30;;;;;;;;;;;;;;;;;;;;4363:16;4347:13;;:32;;;;;;;;;;;;;;;;;;;;4399:25;4409:11;4422:1;4399:9;:25::i;:::-;4392:32;;;;;;;;3051:1381;;;;;;:::o;1321:134:7:-;1379:7;1405:43;1409:1;1412;1405:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1398:50;;1321:134;;;;:::o;8497:410:3:-;8599:1;8580:21;;:7;:21;;;;8572:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8650:49;8671:7;8688:1;8692:6;8650:20;:49::i;:::-;8731:68;8754:6;8731:68;;;;;;;;;;;;;;;;;:9;:18;8741:7;8731:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;8710:9;:18;8720:7;8710:18;;;;;;;;;;;;;;;:89;;;;8824:24;8841:6;8824:12;;:16;;:24;;;;:::i;:::-;8809:12;:39;;;;8889:1;8863:37;;8872:7;8863:37;;;8893:6;8863:37;;;;;;;;;;;;;;;;;;8497:410;;:::o;7008:530::-;7131:1;7113:20;;:6;:20;;;;7105:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7214:1;7193:23;;:9;:23;;;;7185:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7267:47;7288:6;7296:9;7307:6;7267:20;:47::i;:::-;7345:71;7367:6;7345:71;;;;;;;;;;;;;;;;;:9;:17;7355:6;7345:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;7325:9;:17;7335:6;7325:17;;;;;;;;;;;;;;;:91;;;;7449:32;7474:6;7449:9;:20;7459:9;7449:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;7426:9;:20;7436:9;7426:20;;;;;;;;;;;;;;;:55;;;;7513:9;7496:35;;7505:6;7496:35;;;7524:6;7496:35;;;;;;;;;;;;;;;;;;7008:530;;;:::o;6825:227:0:-;6882:6;6911:1;6906;:6;;;;6897:16;;;;;;6920:13;6957:1;6936:22;;6951:2;6945:1;6937:10;;:16;;6936:22;;;;;;6920:38;;793:35;6974:19;;:6;:19;;:42;;;;;952:34;6997:19;;:6;:19;;6974:42;6965:52;;;;;;7039:6;7024:22;;;6825:227;;;;:::o;1566:396:5:-;1658:6;1666;1685:15;1713:6;1704:15;;:6;:15;;;1703:43;;1736:10;;;;;;;;;;;1703:43;;;1723:10;;;;;;;;;;;1703:43;1685:61;;1757:12;1772:62;1781:6;1789:44;1798:24;1807:6;1815;1798:8;:24::i;:::-;1824:8;1789;:44::i;:::-;1772:8;:62::i;:::-;1757:77;;1845:12;1860:62;1869:6;1877:44;1886:24;1895:6;1903;1886:8;:24::i;:::-;1912:8;;;;;;;;;;;1877;:44::i;:::-;1860:8;:62::i;:::-;1845:77;;1941:5;1948;1933:21;;;;;;;1566:396;;;;;;:::o;1970:344::-;2073:6;2081;2100:12;2115:34;2124:24;2133:6;2141;2124:8;:24::i;:::-;2115:8;:34::i;:::-;2100:49;;2160:15;2178:32;2187:22;2196:5;2203;2187:8;:22::i;:::-;2178:8;:32::i;:::-;2160:50;;2221:17;2241:25;2250:8;2260:5;2241:8;:25::i;:::-;2221:45;;2285:10;2297:8;2277:29;;;;;;;1970:344;;;;;;;:::o;2322:721::-;2438:6;2625:44;2634:15;2651:17;2665:2;2651:13;:17::i;:::-;2625:8;:44::i;:::-;2613:56;;:8;:56;;;2609:427;;2693:64;2702:6;2710:46;2719:16;2733:1;2719:13;:16::i;:::-;2737:18;2751:3;2737:13;:18::i;:::-;2710:8;:46::i;:::-;2693:8;:64::i;:::-;2686:71;;;;2609:427;2790:17;2810:35;2819:8;2829:15;2810:8;:35::i;:::-;2790:55;;2860:11;2874:76;2883:16;2897:1;2883:13;:16::i;:::-;2901:48;2909:39;2918:10;2930:17;2944:2;2930:13;:17::i;:::-;2909:8;:39::i;:::-;2901:7;:48::i;:::-;2874:8;:76::i;:::-;2860:90;;2972:52;2981:6;2989:34;2998:4;3004:18;3018:3;3004:13;:18::i;:::-;2989:8;:34::i;:::-;2972:8;:52::i;:::-;2965:59;;;;2322:721;;;;;;:::o;10670:92:3:-;;;;:::o;3835:195:0:-;3892:6;3907:13;3935:1;3923:13;;3930:1;3923:9;;:13;3907:29;;793:35;3952:19;;:6;:19;;:42;;;;;952:34;3975:19;;:6;:19;;3952:42;3943:52;;;;;;4017:6;4002:22;;;3835:195;;;;:::o;3418:::-;3475:6;3490:13;3518:1;3506:13;;3513:1;3506:9;;:13;3490:29;;793:35;3535:19;;:6;:19;;:42;;;;;952:34;3558:19;;:6;:19;;3535:42;3526:52;;;;;;3600:6;3585:22;;;3418:195;;;;:::o;9086:120::-;9133:6;793:35;9157:14;;:1;:14;;;;9148:24;;;;;;9190:1;9186;:5;;;:14;;9199:1;9186:14;;;9195:1;9194:2;;9186:14;9179:21;;9086:120;;;:::o;4266:201::-;4323:6;4338:13;4371:2;4366:1;4354:13;;4361:1;4354:9;;:13;:19;;4338:35;;793;4389:19;;:6;:19;;:42;;;;;952:34;4412:19;;:6;:19;;4389:42;4380:52;;;;;;4454:6;4439:22;;;4266:201;;;;:::o;13211:180::-;13257:6;13285:1;13281;:5;;;13272:15;;;;;;13381:3;13343:34;13330:9;13337:1;13330:5;:9::i;:::-;13321:19;;:56;:63;;13296:89;;13211:180;;;:::o;12243:782::-;12292:6;12320:1;12316;:5;;;12307:15;;;;;;12331:10;12352:9;12364:1;12352:13;;;;12382:19;12376:2;:25;12372:56;;12412:2;12405:9;;;;;12423:2;12416:9;;;;12372:56;12444:11;12438:2;:17;12434:48;;12466:2;12459:9;;;;;12477:2;12470:9;;;;12434:48;12498:7;12492:2;:13;12488:44;;12516:2;12509:9;;;;;12527:2;12520:9;;;;12488:44;12548:5;12542:2;:11;12538:40;;12564:1;12557:8;;;;;12574:1;12567:8;;;;12538:40;12594:4;12588:2;:10;12584:39;;12609:1;12602:8;;;;;12619:1;12612:8;;;;12584:39;12639:3;12633:2;:9;12629:38;;12653:1;12646:8;;;;;12663:1;12656:8;;;;12629:38;12683:3;12677:2;:9;12673:23;;12695:1;12688:8;;;;12673:23;12737:13;12765:2;12759;12753:3;:8;:14;;12737:30;;12774:10;12808:3;12802;:9;12796:1;12787:11;;:24;;;;;;;;;;12774:37;;12823:10;12836:18;12823:31;;12818:171;12862:1;12856:3;:7;12818:171;;;12891:2;12885:8;;;;12902:9;12920:3;12914:2;:9;;12902:21;;12945:1;12939:3;:7;12932:14;;;;;12979:1;12965:3;:16;12955:26;;;;12818:171;12873:1;12865:9;;;;;12818:171;;;;13012:6;12997:22;;;;;;12243:782;;;:::o

Swarm Source

ipfs://ae3ab1acab4a6a7b5465e9a1db9c3e425a43d4e681c312ba2be7906e37a83838
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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