Address Details
contract
token

0x459277127535efe9eB6c387f66432Fbd615617F2

Token
PreImmortal (pIMMO)
Creator
0xad5e83–557abf at 0x9124fb–813c90
Balance
0 CELO ( )
Locked CELO Balance
0.00 CELO
Voting CELO Balance
0.00 CELO
Pending Unlocked Gold
0.00 CELO
Tokens
Fetching tokens...
Transactions
88 Transactions
Transfers
1 Transfers
Gas Used
2,186,642
Last Balance Update
24751388
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
PreImmortal




Optimization enabled
true
Compiler version
v0.7.5+commit.eb77ed08




Optimization runs
200
EVM Version
istanbul




Verified at
2022-01-01T21:57:33.098934Z

pIMMO.sol

// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;

library SafeMath {
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    require(c >= a, "SafeMath: addition overflow");

    return c;
  }

  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    return sub(a, b, "SafeMath: subtraction overflow");
  }

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

    return c;
  }

  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }

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

    return c;
  }

  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    return div(a, b, "SafeMath: division by zero");
  }

  function div(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    require(b > 0, errorMessage);
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;
  }

  function mod(uint256 a, uint256 b) internal pure returns (uint256) {
    return mod(a, b, "SafeMath: modulo by zero");
  }

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

  function sqrrt(uint256 a) internal pure returns (uint256 c) {
    if (a > 3) {
      c = a;
      uint256 b = add(div(a, 2), 1);
      while (b < c) {
        c = b;
        b = div(add(div(a, b), b), 2);
      }
    } else if (a != 0) {
      c = 1;
    }
  }

  function percentageAmount(uint256 total_, uint8 percentage_)
    internal
    pure
    returns (uint256 percentAmount_)
  {
    return div(mul(total_, percentage_), 1000);
  }

  function percentageOfTotal(uint256 part_, uint256 total_)
    internal
    pure
    returns (uint256 percent_)
  {
    return div(mul(part_, 100), total_);
  }

  function average(uint256 a, uint256 b) internal pure returns (uint256) {
    // (a + b) / 2 can overflow, so we distribute
    return (a / 2) + (b / 2) + (((a % 2) + (b % 2)) / 2);
  }

  function substractPercentage(uint256 total_, uint8 percentageToSub_)
    internal
    pure
    returns (uint256 result_)
  {
    return sub(total_, div(mul(total_, percentageToSub_), 1000));
  }

  function quadraticPricing(uint256 payment_, uint256 multiplier_)
    internal
    pure
    returns (uint256)
  {
    return sqrrt(mul(multiplier_, payment_));
  }

  function bondingCurve(uint256 supply_, uint256 multiplier_)
    internal
    pure
    returns (uint256)
  {
    return mul(multiplier_, supply_);
  }
}

library Context {
  function _msgSender() internal view returns (address payable) {
    return msg.sender;
  }

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

contract Ownable {
  address internal _owner;

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

  constructor() {
    address msgSender = Context._msgSender();
    _owner = msgSender;
    emit OwnershipTransferred(address(0), msgSender);
  }

  function owner() public view returns (address) {
    return _owner;
  }

  modifier onlyOwner() {
    require(_owner == Context._msgSender(), "Ownable: caller is not the owner");
    _;
  }

  function renounceOwnership() public virtual onlyOwner {
    emit OwnershipTransferred(_owner, address(0));
    _owner = address(0);
  }

  function transferOwnership(address newOwner) public virtual onlyOwner {
    require(newOwner != address(0), "Ownable: new owner is the zero address");
    emit OwnershipTransferred(_owner, newOwner);
    _owner = newOwner;
  }
}

interface IERC20 {
  function totalSupply() external view returns (uint256);

  function balanceOf(address account) external view returns (uint256);

  function transfer(address recipient, uint256 amount) external returns (bool);

  function allowance(address owner, address spender)
    external
    view
    returns (uint256);

  function approve(address spender, uint256 amount) external returns (bool);

  function transferFrom(
    address sender,
    address recipient,
    uint256 amount
  ) external returns (bool);

  event Transfer(address indexed from, address indexed to, uint256 value);

  event Approval(address indexed owner, address indexed spender, uint256 value);
}

abstract contract ERC20 is IERC20 {
  using SafeMath for uint256;

  mapping(address => uint256) internal _balances;

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

  uint256 internal _totalSupply;

  string internal _name;

  string internal _symbol;

  uint8 internal _decimals;

  constructor(
    string memory name_,
    string memory symbol_,
    uint8 decimals_
  ) {
    _name = name_;
    _symbol = symbol_;
    _decimals = decimals_;
  }

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

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

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

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

  function balanceOf(address account) public view override returns (uint256) {
    return _balances[account];
  }

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

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

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

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

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

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

  function _transfer(
    address sender,
    address recipient,
    uint256 amount
  ) internal virtual {
    require(sender != address(0), "ERC20: transfer from the zero address");
    require(recipient != address(0), "ERC20: transfer to the zero address");

    _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);
  }

  function _mint(address account_, uint256 ammount_) internal virtual {
    require(account_ != address(0), "ERC20: mint to the zero address");
    _beforeTokenTransfer(address(this), account_, ammount_);
    _totalSupply = _totalSupply.add(ammount_);
    _balances[account_] = _balances[account_].add(ammount_);
    emit Transfer(address(this), account_, ammount_);
  }

  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);
  }

  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);
  }

  function _beforeTokenTransfer(
    address from,
    address to,
    uint256 amount
  ) internal virtual {}
}

abstract contract Divine is ERC20, Ownable {
  constructor(
    string memory name_,
    string memory symbol_,
    uint8 decimals_
  ) ERC20(name_, symbol_, decimals_) {}
}

contract PreImmortal is Divine {
  using SafeMath for uint256;

  bool public requireSellerApproval;
  bool public allowMinting;

  mapping(address => bool) public isApprovedSeller;

  constructor() Divine("PreImmortal", "pIMMO", 18) {
    uint256 initialSupply_ = 1000000000 * 1e18;
    requireSellerApproval = true;
    allowMinting = true;
    _addApprovedSeller(address(this));
    _addApprovedSeller(msg.sender);
    _mint(owner(), initialSupply_);
  }

  function allowOpenTrading() external onlyOwner returns (bool) {
    requireSellerApproval = false;
    return requireSellerApproval;
  }

  function disableMinting() external onlyOwner returns (bool) {
    allowMinting = false;
    return allowMinting;
  }

  function _addApprovedSeller(address approvedSeller_) internal {
    isApprovedSeller[approvedSeller_] = true;
  }

  function addApprovedSeller(address approvedSeller_)
    external
    onlyOwner
    returns (bool)
  {
    _addApprovedSeller(approvedSeller_);
    return isApprovedSeller[approvedSeller_];
  }

  function addApprovedSellers(address[] calldata approvedSellers_)
    external
    onlyOwner
    returns (bool)
  {
    for (
      uint256 iteration_;
      approvedSellers_.length > iteration_;
      iteration_++
    ) {
      _addApprovedSeller(approvedSellers_[iteration_]);
    }
    return true;
  }

  function _removeApprovedSeller(address disapprovedSeller_) internal {
    isApprovedSeller[disapprovedSeller_] = false;
  }

  function removeApprovedSeller(address disapprovedSeller_)
    external
    onlyOwner
    returns (bool)
  {
    _removeApprovedSeller(disapprovedSeller_);
    return isApprovedSeller[disapprovedSeller_];
  }

  function removeApprovedSellers(address[] calldata disapprovedSellers_)
    external
    onlyOwner
    returns (bool)
  {
    for (
      uint256 iteration_;
      disapprovedSellers_.length > iteration_;
      iteration_++
    ) {
      _removeApprovedSeller(disapprovedSellers_[iteration_]);
    }
    return true;
  }

  function _beforeTokenTransfer(
    address from_,
    address to_,
    uint256 amount_
  ) internal override {
    require(
      (_balances[to_] > 0 || isApprovedSeller[from_] == true),
      "Account not approved to transfer pIMMO."
    );
  }

  function mint(address recipient_, uint256 amount_) public virtual onlyOwner {
    require(allowMinting, "Minting has been disabled.");
    _mint(recipient_, amount_);
  }

  function burn(uint256 amount_) public virtual {
    _burn(msg.sender, amount_);
  }

  function burnFrom(address account_, uint256 amount_) public virtual {
    _burnFrom(account_, amount_);
  }

  function _burnFrom(address account_, uint256 amount_) internal virtual {
    uint256 decreasedAllowance_ = allowance(account_, msg.sender).sub(
      amount_,
      "ERC20: burn amount exceeds allowance"
    );
    _approve(account_, msg.sender, decreasedAllowance_);
    _burn(account_, amount_);
  }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"addApprovedSeller","inputs":[{"type":"address","name":"approvedSeller_","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"addApprovedSellers","inputs":[{"type":"address[]","name":"approvedSellers_","internalType":"address[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"allowMinting","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"allowOpenTrading","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"amount_","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burnFrom","inputs":[{"type":"address","name":"account_","internalType":"address"},{"type":"uint256","name":"amount_","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"disableMinting","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isApprovedSeller","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mint","inputs":[{"type":"address","name":"recipient_","internalType":"address"},{"type":"uint256","name":"amount_","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"removeApprovedSeller","inputs":[{"type":"address","name":"disapprovedSeller_","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"removeApprovedSellers","inputs":[{"type":"address[]","name":"disapprovedSellers_","internalType":"address[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"requireSellerApproval","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]}]
              

Contract Creation Code

0x60806040523480156200001157600080fd5b506040518060400160405280600b81526020016a141c99525b5b5bdc9d185b60aa1b8152506040518060400160405280600581526020016470494d4d4f60d81b8152506012828282826003908051906020019062000071929190620003ab565b50815162000087906004906020850190620003ab565b5080600560006101000a81548160ff021916908360ff1602179055505050506000620000bd6200017860201b62000e851760201c565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350506005805460ff60b01b1960ff60a81b19909116600160a81b1716600160b01b179055506b033b2e3c9fd0803ce8000000905062000151306200017c565b6200015c336200017c565b620001716200016a620001a0565b82620001b4565b5062000457565b3390565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b60055461010090046001600160a01b031690565b6001600160a01b03821662000210576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6200021d308383620002c3565b62000239816002546200034960201b62000e891790919060201c565b6002556001600160a01b038216600090815260208181526040909120546200026c91839062000e8962000349821b17901c565b6001600160a01b038316600081815260208181526040918290209390935580518481529051919230927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b0382166000908152602081905260409020541515806200030757506001600160a01b03831660009081526006602052604090205460ff1615156001145b620003445760405162461bcd60e51b815260040180806020018281038252602781526020018062001b776027913960400191505060405180910390fd5b505050565b600082820183811015620003a4576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620003e357600085556200042e565b82601f10620003fe57805160ff19168380011785556200042e565b828001600101855582156200042e579182015b828111156200042e57825182559160200191906001019062000411565b506200043c92915062000440565b5090565b5b808211156200043c576000815560010162000441565b61171080620004676000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c8063715018a6116100de578063a2efb97511610097578063b93ea6a111610071578063b93ea6a114610575578063dd62ed3e1461057d578063ea46d196146105ab578063f2fde38b146105b35761018e565b8063a2efb975146104f7578063a457c2d71461051d578063a9059cbb146105495761018e565b8063715018a61461041f57806379cc6790146104275780637e5cd5c1146104535780638da5cb5b1461045b57806395d89b411461047f5780639a9429b6146104875761018e565b806323b872dd1161014b57806340c10f191161012557806340c10f191461033e57806342966c681461036c5780635b0ed0ef1461038957806370a08231146103f95761018e565b806323b872dd146102be578063313ce567146102f457806339509351146103125761018e565b806306fdde03146101935780630775b33d14610210578063095ea7b31461024a5780630c4b56bf146102765780631602a1241461029c57806318160ddd146102a4575b600080fd5b61019b6105d9565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101d55781810151838201526020016101bd565b50505050905090810190601f1680156102025780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102366004803603602081101561022657600080fd5b50356001600160a01b031661066f565b604080519115158252519081900360200190f35b6102366004803603604081101561026057600080fd5b506001600160a01b0381351690602001356106f6565b6102366004803603602081101561028c57600080fd5b50356001600160a01b0316610713565b610236610728565b6102ac610738565b60408051918252519081900360200190f35b610236600480360360608110156102d457600080fd5b506001600160a01b0381358116916020810135909116906040013561073e565b6102fc6107c5565b6040805160ff9092168252519081900360200190f35b6102366004803603604081101561032857600080fd5b506001600160a01b0381351690602001356107ce565b61036a6004803603604081101561035457600080fd5b506001600160a01b03813516906020013561081c565b005b61036a6004803603602081101561038257600080fd5b50356108e5565b6102366004803603602081101561039f57600080fd5b8101906020810181356401000000008111156103ba57600080fd5b8201836020820111156103cc57600080fd5b803590602001918460208302840111640100000000831117156103ee57600080fd5b5090925090506108f2565b6102ac6004803603602081101561040f57600080fd5b50356001600160a01b0316610988565b61036a6109a3565b61036a6004803603604081101561043d57600080fd5b506001600160a01b038135169060200135610a50565b610236610a5a565b610463610ad6565b604080516001600160a01b039092168252519081900360200190f35b61019b610aea565b6102366004803603602081101561049d57600080fd5b8101906020810181356401000000008111156104b857600080fd5b8201836020820111156104ca57600080fd5b803590602001918460208302840111640100000000831117156104ec57600080fd5b509092509050610b4b565b6102366004803603602081101561050d57600080fd5b50356001600160a01b0316610be1565b6102366004803603604081101561053357600080fd5b506001600160a01b038135169060200135610c49565b6102366004803603604081101561055f57600080fd5b506001600160a01b038135169060200135610cb1565b610236610cc5565b6102ac6004803603604081101561059357600080fd5b506001600160a01b0381358116916020013516610cd5565b610236610d00565b61036a600480360360208110156105c957600080fd5b50356001600160a01b0316610d7c565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106655780601f1061063a57610100808354040283529160200191610665565b820191906000526020600020905b81548152906001019060200180831161064857829003601f168201915b5050505050905090565b6000610679610e85565b60055461010090046001600160a01b039081169116146106ce576040805162461bcd60e51b81526020600482018190526024820152600080516020611608833981519152604482015290519081900360640190fd5b6106d782610eea565b506001600160a01b031660009081526006602052604090205460ff1690565b600061070a610703610e85565b8484610f0b565b50600192915050565b60066020526000908152604090205460ff1681565b600554600160b01b900460ff1681565b60025490565b600061074b848484610ff7565b6107bb84610757610e85565b6107b6856040518060600160405280602881526020016115e0602891396001600160a01b038a16600090815260016020526040812090610795610e85565b6001600160a01b031681526020810191909152604001600020549190611152565b610f0b565b5060019392505050565b60055460ff1690565b600061070a6107db610e85565b846107b685600160006107ec610e85565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490610e89565b610824610e85565b60055461010090046001600160a01b03908116911614610879576040805162461bcd60e51b81526020600482018190526024820152600080516020611608833981519152604482015290519081900360640190fd5b600554600160b01b900460ff166108d7576040805162461bcd60e51b815260206004820152601a60248201527f4d696e74696e6720686173206265656e2064697361626c65642e000000000000604482015290519081900360640190fd5b6108e182826111e9565b5050565b6108ef33826112d9565b50565b60006108fc610e85565b60055461010090046001600160a01b03908116911614610951576040805162461bcd60e51b81526020600482018190526024820152600080516020611608833981519152604482015290519081900360640190fd5b60005b808311156107bb5761098084848381811061096b57fe5b905060200201356001600160a01b03166113d5565b600101610954565b6001600160a01b031660009081526020819052604090205490565b6109ab610e85565b60055461010090046001600160a01b03908116911614610a00576040805162461bcd60e51b81526020600482018190526024820152600080516020611608833981519152604482015290519081900360640190fd5b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6108e182826113f9565b6000610a64610e85565b60055461010090046001600160a01b03908116911614610ab9576040805162461bcd60e51b81526020600482018190526024820152600080516020611608833981519152604482015290519081900360640190fd5b506005805460ff60b01b191690819055600160b01b900460ff1690565b60055461010090046001600160a01b031690565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106655780601f1061063a57610100808354040283529160200191610665565b6000610b55610e85565b60055461010090046001600160a01b03908116911614610baa576040805162461bcd60e51b81526020600482018190526024820152600080516020611608833981519152604482015290519081900360640190fd5b60005b808311156107bb57610bd9848483818110610bc457fe5b905060200201356001600160a01b0316610eea565b600101610bad565b6000610beb610e85565b60055461010090046001600160a01b03908116911614610c40576040805162461bcd60e51b81526020600482018190526024820152600080516020611608833981519152604482015290519081900360640190fd5b6106d7826113d5565b600061070a610c56610e85565b846107b6856040518060600160405280602581526020016116b66025913960016000610c80610e85565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611152565b600061070a610cbe610e85565b8484610ff7565b600554600160a81b900460ff1681565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6000610d0a610e85565b60055461010090046001600160a01b03908116911614610d5f576040805162461bcd60e51b81526020600482018190526024820152600080516020611608833981519152604482015290519081900360640190fd5b506005805460ff60a81b191690819055600160a81b900460ff1690565b610d84610e85565b60055461010090046001600160a01b03908116911614610dd9576040805162461bcd60e51b81526020600482018190526024820152600080516020611608833981519152604482015290519081900360640190fd5b6001600160a01b038116610e1e5760405162461bcd60e51b81526004018080602001828103825260268152602001806115726026913960400191505060405180910390fd5b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b3390565b600082820183811015610ee3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6001600160a01b038316610f505760405162461bcd60e51b81526004018080602001828103825260248152602001806116926024913960400191505060405180910390fd5b6001600160a01b038216610f955760405162461bcd60e51b81526004018080602001828103825260228152602001806115986022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b03831661103c5760405162461bcd60e51b815260040180806020018281038252602581526020018061166d6025913960400191505060405180910390fd5b6001600160a01b0382166110815760405162461bcd60e51b81526004018080602001828103825260238152602001806115066023913960400191505060405180910390fd5b61108c838383611445565b6110c9816040518060600160405280602681526020016115ba602691396001600160a01b0386166000908152602081905260409020549190611152565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546110f89082610e89565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156111e15760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156111a657818101518382015260200161118e565b50505050905090810190601f1680156111d35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b038216611244576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61124f308383611445565b60025461125c9082610e89565b6002556001600160a01b0382166000908152602081905260409020546112829082610e89565b6001600160a01b038316600081815260208181526040918290209390935580518481529051919230927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b03821661131e5760405162461bcd60e51b815260040180806020018281038252602181526020018061164c6021913960400191505060405180910390fd5b61132a82600083611445565b61136781604051806060016040528060228152602001611529602291396001600160a01b0385166000908152602081905260409020549190611152565b6001600160a01b03831660009081526020819052604090205560025461138d90826114c3565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b600061142982604051806060016040528060248152602001611628602491396114228633610cd5565b9190611152565b9050611436833383610f0b565b61144083836112d9565b505050565b6001600160a01b03821660009081526020819052604090205415158061148857506001600160a01b03831660009081526006602052604090205460ff1615156001145b6114405760405162461bcd60e51b815260040180806020018281038252602781526020018061154b6027913960400191505060405180910390fd5b6000610ee383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061115256fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654163636f756e74206e6f7420617070726f76656420746f207472616e736665722070494d4d4f2e4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212209189676653cb6032d77110b994d4cd0a668a40206b797109bcee3d7f7378b22164736f6c634300070500334163636f756e74206e6f7420617070726f76656420746f207472616e736665722070494d4d4f2e

Deployed ByteCode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c8063715018a6116100de578063a2efb97511610097578063b93ea6a111610071578063b93ea6a114610575578063dd62ed3e1461057d578063ea46d196146105ab578063f2fde38b146105b35761018e565b8063a2efb975146104f7578063a457c2d71461051d578063a9059cbb146105495761018e565b8063715018a61461041f57806379cc6790146104275780637e5cd5c1146104535780638da5cb5b1461045b57806395d89b411461047f5780639a9429b6146104875761018e565b806323b872dd1161014b57806340c10f191161012557806340c10f191461033e57806342966c681461036c5780635b0ed0ef1461038957806370a08231146103f95761018e565b806323b872dd146102be578063313ce567146102f457806339509351146103125761018e565b806306fdde03146101935780630775b33d14610210578063095ea7b31461024a5780630c4b56bf146102765780631602a1241461029c57806318160ddd146102a4575b600080fd5b61019b6105d9565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101d55781810151838201526020016101bd565b50505050905090810190601f1680156102025780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102366004803603602081101561022657600080fd5b50356001600160a01b031661066f565b604080519115158252519081900360200190f35b6102366004803603604081101561026057600080fd5b506001600160a01b0381351690602001356106f6565b6102366004803603602081101561028c57600080fd5b50356001600160a01b0316610713565b610236610728565b6102ac610738565b60408051918252519081900360200190f35b610236600480360360608110156102d457600080fd5b506001600160a01b0381358116916020810135909116906040013561073e565b6102fc6107c5565b6040805160ff9092168252519081900360200190f35b6102366004803603604081101561032857600080fd5b506001600160a01b0381351690602001356107ce565b61036a6004803603604081101561035457600080fd5b506001600160a01b03813516906020013561081c565b005b61036a6004803603602081101561038257600080fd5b50356108e5565b6102366004803603602081101561039f57600080fd5b8101906020810181356401000000008111156103ba57600080fd5b8201836020820111156103cc57600080fd5b803590602001918460208302840111640100000000831117156103ee57600080fd5b5090925090506108f2565b6102ac6004803603602081101561040f57600080fd5b50356001600160a01b0316610988565b61036a6109a3565b61036a6004803603604081101561043d57600080fd5b506001600160a01b038135169060200135610a50565b610236610a5a565b610463610ad6565b604080516001600160a01b039092168252519081900360200190f35b61019b610aea565b6102366004803603602081101561049d57600080fd5b8101906020810181356401000000008111156104b857600080fd5b8201836020820111156104ca57600080fd5b803590602001918460208302840111640100000000831117156104ec57600080fd5b509092509050610b4b565b6102366004803603602081101561050d57600080fd5b50356001600160a01b0316610be1565b6102366004803603604081101561053357600080fd5b506001600160a01b038135169060200135610c49565b6102366004803603604081101561055f57600080fd5b506001600160a01b038135169060200135610cb1565b610236610cc5565b6102ac6004803603604081101561059357600080fd5b506001600160a01b0381358116916020013516610cd5565b610236610d00565b61036a600480360360208110156105c957600080fd5b50356001600160a01b0316610d7c565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106655780601f1061063a57610100808354040283529160200191610665565b820191906000526020600020905b81548152906001019060200180831161064857829003601f168201915b5050505050905090565b6000610679610e85565b60055461010090046001600160a01b039081169116146106ce576040805162461bcd60e51b81526020600482018190526024820152600080516020611608833981519152604482015290519081900360640190fd5b6106d782610eea565b506001600160a01b031660009081526006602052604090205460ff1690565b600061070a610703610e85565b8484610f0b565b50600192915050565b60066020526000908152604090205460ff1681565b600554600160b01b900460ff1681565b60025490565b600061074b848484610ff7565b6107bb84610757610e85565b6107b6856040518060600160405280602881526020016115e0602891396001600160a01b038a16600090815260016020526040812090610795610e85565b6001600160a01b031681526020810191909152604001600020549190611152565b610f0b565b5060019392505050565b60055460ff1690565b600061070a6107db610e85565b846107b685600160006107ec610e85565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490610e89565b610824610e85565b60055461010090046001600160a01b03908116911614610879576040805162461bcd60e51b81526020600482018190526024820152600080516020611608833981519152604482015290519081900360640190fd5b600554600160b01b900460ff166108d7576040805162461bcd60e51b815260206004820152601a60248201527f4d696e74696e6720686173206265656e2064697361626c65642e000000000000604482015290519081900360640190fd5b6108e182826111e9565b5050565b6108ef33826112d9565b50565b60006108fc610e85565b60055461010090046001600160a01b03908116911614610951576040805162461bcd60e51b81526020600482018190526024820152600080516020611608833981519152604482015290519081900360640190fd5b60005b808311156107bb5761098084848381811061096b57fe5b905060200201356001600160a01b03166113d5565b600101610954565b6001600160a01b031660009081526020819052604090205490565b6109ab610e85565b60055461010090046001600160a01b03908116911614610a00576040805162461bcd60e51b81526020600482018190526024820152600080516020611608833981519152604482015290519081900360640190fd5b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b6108e182826113f9565b6000610a64610e85565b60055461010090046001600160a01b03908116911614610ab9576040805162461bcd60e51b81526020600482018190526024820152600080516020611608833981519152604482015290519081900360640190fd5b506005805460ff60b01b191690819055600160b01b900460ff1690565b60055461010090046001600160a01b031690565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106655780601f1061063a57610100808354040283529160200191610665565b6000610b55610e85565b60055461010090046001600160a01b03908116911614610baa576040805162461bcd60e51b81526020600482018190526024820152600080516020611608833981519152604482015290519081900360640190fd5b60005b808311156107bb57610bd9848483818110610bc457fe5b905060200201356001600160a01b0316610eea565b600101610bad565b6000610beb610e85565b60055461010090046001600160a01b03908116911614610c40576040805162461bcd60e51b81526020600482018190526024820152600080516020611608833981519152604482015290519081900360640190fd5b6106d7826113d5565b600061070a610c56610e85565b846107b6856040518060600160405280602581526020016116b66025913960016000610c80610e85565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611152565b600061070a610cbe610e85565b8484610ff7565b600554600160a81b900460ff1681565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6000610d0a610e85565b60055461010090046001600160a01b03908116911614610d5f576040805162461bcd60e51b81526020600482018190526024820152600080516020611608833981519152604482015290519081900360640190fd5b506005805460ff60a81b191690819055600160a81b900460ff1690565b610d84610e85565b60055461010090046001600160a01b03908116911614610dd9576040805162461bcd60e51b81526020600482018190526024820152600080516020611608833981519152604482015290519081900360640190fd5b6001600160a01b038116610e1e5760405162461bcd60e51b81526004018080602001828103825260268152602001806115726026913960400191505060405180910390fd5b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b3390565b600082820183811015610ee3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b03166000908152600660205260409020805460ff19169055565b6001600160a01b038316610f505760405162461bcd60e51b81526004018080602001828103825260248152602001806116926024913960400191505060405180910390fd5b6001600160a01b038216610f955760405162461bcd60e51b81526004018080602001828103825260228152602001806115986022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b03831661103c5760405162461bcd60e51b815260040180806020018281038252602581526020018061166d6025913960400191505060405180910390fd5b6001600160a01b0382166110815760405162461bcd60e51b81526004018080602001828103825260238152602001806115066023913960400191505060405180910390fd5b61108c838383611445565b6110c9816040518060600160405280602681526020016115ba602691396001600160a01b0386166000908152602081905260409020549190611152565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546110f89082610e89565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156111e15760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156111a657818101518382015260200161118e565b50505050905090810190601f1680156111d35780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b038216611244576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b61124f308383611445565b60025461125c9082610e89565b6002556001600160a01b0382166000908152602081905260409020546112829082610e89565b6001600160a01b038316600081815260208181526040918290209390935580518481529051919230927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b03821661131e5760405162461bcd60e51b815260040180806020018281038252602181526020018061164c6021913960400191505060405180910390fd5b61132a82600083611445565b61136781604051806060016040528060228152602001611529602291396001600160a01b0385166000908152602081905260409020549190611152565b6001600160a01b03831660009081526020819052604090205560025461138d90826114c3565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b03166000908152600660205260409020805460ff19166001179055565b600061142982604051806060016040528060248152602001611628602491396114228633610cd5565b9190611152565b9050611436833383610f0b565b61144083836112d9565b505050565b6001600160a01b03821660009081526020819052604090205415158061148857506001600160a01b03831660009081526006602052604090205460ff1615156001145b6114405760405162461bcd60e51b815260040180806020018281038252602781526020018061154b6027913960400191505060405180910390fd5b6000610ee383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061115256fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654163636f756e74206e6f7420617070726f76656420746f207472616e736665722070494d4d4f2e4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212209189676653cb6032d77110b994d4cd0a668a40206b797109bcee3d7f7378b22164736f6c63430007050033