Contract 0x74e23df9110aa9ea0b6ff2faee01e740ca1c642e 5

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x7ff2a44f2e6865f0888500263b7b333f324984e99fa4c1a83c42e337e6ad2df7Approve633785322023-05-31 17:37:342 hrs 25 mins ago0xe1c8169f3446616cd573ab23e40ba5e36266bbe5 IN  HectorDAO: TOR Token0 FTM0.002524430571
0x332e1bcc60dbd13e59a80c8cc971a7f8cab949531014a3f5c2ca1303260a8ce9Approve633719222023-05-31 13:52:456 hrs 10 mins ago0x985efa96ad239a5ac41ff24e2f3451afe483a7d9 IN  HectorDAO: TOR Token0 FTM0.004496689957
0x2af0ceb116b042affa8c4a375f014f96058eae89c1a0bc8d5274f5eecdad774cApprove633691152023-05-31 12:31:257 hrs 31 mins ago0x9832ee476d66b58d185b7bd46d05cbcbe4e543e1 IN  HectorDAO: TOR Token0 FTM0.004322219763
0x09ffef082a83c92eece22c07929d5c83bf32f3458f468f220122f493d1ab95f2Approve633690182023-05-31 12:29:217 hrs 33 mins ago0x9832ee476d66b58d185b7bd46d05cbcbe4e543e1 IN  HectorDAO: TOR Token0 FTM0.002749077098
0xab5b9dfb1614ba411cd467d5a2fae3115f292ad369c7e16929eb994eedecdc65Approve633689482023-05-31 12:28:057 hrs 35 mins ago0x9832ee476d66b58d185b7bd46d05cbcbe4e543e1 IN  HectorDAO: TOR Token0 FTM0.002812026896
0xac754ba2cd28c99756e97909c20518e2a3c4584b43a6d949ca2953e6d3cdd38eApprove633688992023-05-31 12:27:097 hrs 36 mins ago0x9832ee476d66b58d185b7bd46d05cbcbe4e543e1 IN  HectorDAO: TOR Token0 FTM0.002830311965
0x6eef8e4fe405cab44d882b59665841e1e0108f6dca4e235608274d3cce4f27beTransfer633534962023-05-31 5:15:3214 hrs 47 mins ago0x26ee9901fe70c60d87bcc1c3e893364c85297711 IN  HectorDAO: TOR Token0 FTM0.059336980412
0x0ab4964b77f8158e3b6076b90bd4fc8b6d7b269afeafa3dd09fbb839d9e35572Approve633500972023-05-31 3:05:0716 hrs 58 mins ago0x1c2624d7d94902452fec507a9ac1661d9cab89b3 IN  HectorDAO: TOR Token0 FTM0.051697537639
0xb474b9f7a0c64fc485e879054c8aed48fcbf7e6c2b0b4a35d20284be1146b54fApprove633497732023-05-31 2:52:1117 hrs 11 mins ago0xedb143b3a7c45e7784223f3b7be8cde0663dce71 IN  HectorDAO: TOR Token0 FTM0.052732381536
0xa9e102ec35f45916b0384462501e494e3ce949f21d80082f56a6862c59eddb4eApprove633497202023-05-31 2:50:0817 hrs 13 mins ago0xedb143b3a7c45e7784223f3b7be8cde0663dce71 IN  HectorDAO: TOR Token0 FTM0.033043181028
0x2eb18e346888e48499d95d6056e2a9ee3b2626ee4e14c378edb59d43f6d42575Approve633467422023-05-31 0:55:0419 hrs 8 mins ago0xaa7259b144f3baf79049663227fc883188652c31 IN  HectorDAO: TOR Token0 FTM0.054957416291
0x869bbad1d6234534b3c8efec68fd22aa0ced7efab7ef3963bfaecca0caca18fbApprove633291882023-05-30 13:52:461 day 6 hrs ago0x45ce3ce7b4327ea4597ca6674168455155cee79e IN  HectorDAO: TOR Token0 FTM0.04960888844
0xd2e42200b2de4f8b990a640584f93bc7eb8d07bb017d7ac9094122206f5ad321Transfer633227382023-05-30 10:03:321 day 9 hrs ago0x413e05c590c5c2d0059a45f80ab98ee84ca2898c IN  HectorDAO: TOR Token0 FTM0.009241914
0x3f648581017815d2619312f6646824211b1bc5ffdd13f57c3c293e730793a33aApprove633217342023-05-30 9:29:261 day 10 hrs ago0x2ebcea8fc67cad361aad2e699962061a8eed11e1 IN  HectorDAO: TOR Token0 FTM0.0558597147
0x5910a7671ca7e1b528e3c6a33d6d0d00f2e086d8e2ad1b74901efe12d2774f6dTransfer633168752023-05-30 6:44:341 day 13 hrs ago0x6704a081d85746d50249ecb6dbc756ffcbd5d108 IN  HectorDAO: TOR Token0 FTM0.023137706015
0xd81dc2362e51388684653f573e45304eab5c40f4aea47bb618e307b2a59c2567Approve633082022023-05-30 1:54:031 day 18 hrs ago0xacfa0066b4f2321116d6aaa571aaf176fed1a89c IN  HectorDAO: TOR Token0 FTM0.002710101635
0x3703f2f533474c261b8dd272e19313d1fc00a099ac02ae7a82c623d282fbdf10Approve633053532023-05-30 0:14:001 day 19 hrs ago0xf8ecb21724a35795f19addd6c08b0ce10a2dbb52 IN  HectorDAO: TOR Token0 FTM0.08388951802
0x2d8529652e433b492df8290408627661ae902b61b720b7b6170c268eaabdff8aTransfer633019282023-05-29 22:03:301 day 21 hrs ago0x26af0440747cd1b52c491e7e261ed355d6f6f161 IN  HectorDAO: TOR Token0 FTM0.041397950058
0xec381123cce59d1b6d43a21d46e2e4e3345aa637e230566bb3b8ffee9b23ddf6Transfer633019052023-05-29 22:02:331 day 22 hrs ago0x26af0440747cd1b52c491e7e261ed355d6f6f161 IN  HectorDAO: TOR Token0 FTM0.041636662338
0xafb0bdeda46480bac84316b2a749cb6ce5c0d959940e8f560c4c9c295935e5abTransfer633009442023-05-29 21:24:581 day 22 hrs ago0x2f0e9e3ae41ba3d1952b1e103f0059c3ae48f685 IN  HectorDAO: TOR Token0 FTM0.049468192563
0x869d37acc42db96f509d59fb00e7f374a16b377070e2a6547c49638c36bdfb5cTransfer632997782023-05-29 20:42:241 day 23 hrs ago0x79d8e2dd94474db4224bca70048ed9f1c4fc1672 IN  HectorDAO: TOR Token0 FTM0.060247751669
0x064e84205368a21de674d370eb303718addc47045e2c3d66b7302082ad0e7e82Approve632989602023-05-29 20:13:241 day 23 hrs ago0x4577f2020cb843623d00632f3670c40fee0dd740 IN  HectorDAO: TOR Token0 FTM0.02381783205
0x6e550905aadc9f4d820c5c5bc41b6f6d6f04853f93789d79914906a6b8fbb457Transfer632989352023-05-29 20:12:231 day 23 hrs ago0x6704a081d85746d50249ecb6dbc756ffcbd5d108 IN  HectorDAO: TOR Token0 FTM0.036902945686
0xfac29258c9282e1345fa449a8a260ebf18e6916e2aa8660b32b65136b873005aTransfer632989252023-05-29 20:11:581 day 23 hrs ago0x6704a081d85746d50249ecb6dbc756ffcbd5d108 IN  HectorDAO: TOR Token0 FTM0.055261283729
0x53241e26f431f8fc54d1ff055036d11d3bf9de0268b08b1b857b07859f4935eaTransfer632989222023-05-29 20:11:461 day 23 hrs ago0x6704a081d85746d50249ecb6dbc756ffcbd5d108 IN  HectorDAO: TOR Token0 FTM0.055292008215
[ Download CSV Export 

OVERVIEW

Hector Network is developing an expansive web3 ecosystem for a visionary future. The foundations of the ecosystem, supported by the HEC utility token and TOR stablecoin, are functionality, accessibility and community. Hector Network is expanding cross-chain and is dedicated to mass adoption.

Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x7b60a88e52b998e8e36bce0ad84c2c2e5ce1f4788342d08e6f86c600982a39cc285609872022-01-20 16:44:54496 days 3 hrs ago HectorDAO: Deployer  Contract Creation0 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TOR

Compiler Version
v0.7.5+commit.eb77ed08

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at FtmScan.com on 2022-01-21
*/

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

library EnumerableSet {

  // To implement this library for multiple types with as little code
  // repetition as possible, we write it in terms of a generic Set type with
  // bytes32 values.
  // The Set implementation uses private functions, and user-facing
  // implementations (such as AddressSet) are just wrappers around the
  // underlying Set.
  // This means that we can only create new EnumerableSets for types that fit
  // in bytes32.
  struct Set {
    // Storage of set values
    bytes32[] _values;

    // Position of the value in the `values` array, plus 1 because index 0
    // means a value is not in the set.
    mapping (bytes32 => uint256) _indexes;
  }

  /**
   * @dev Add a value to a set. O(1).
   *
   * Returns true if the value was added to the set, that is if it was not
   * already present.
   */
  function _add(Set storage set, bytes32 value) private returns (bool) {
    if (!_contains(set, value)) {
      set._values.push(value);
      // The value is stored at length-1, but we add 1 to all indexes
      // and use 0 as a sentinel value
      set._indexes[value] = set._values.length;
      return true;
    } else {
      return false;
    }
  }

  /**
   * @dev Removes a value from a set. O(1).
   *
   * Returns true if the value was removed from the set, that is if it was
   * present.
   */
  function _remove(Set storage set, bytes32 value) private returns (bool) {
    // We read and store the value's index to prevent multiple reads from the same storage slot
    uint256 valueIndex = set._indexes[value];

    if (valueIndex != 0) { // Equivalent to contains(set, value)
      // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
      // the array, and then remove the last element (sometimes called as 'swap and pop').
      // This modifies the order of the array, as noted in {at}.

      uint256 toDeleteIndex = valueIndex - 1;
      uint256 lastIndex = set._values.length - 1;

      // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
      // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

      bytes32 lastvalue = set._values[lastIndex];

      // Move the last value to the index where the value to delete is
      set._values[toDeleteIndex] = lastvalue;
      // Update the index for the moved value
      set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

      // Delete the slot where the moved value was stored
      set._values.pop();

      // Delete the index for the deleted slot
      delete set._indexes[value];

      return true;
    } else {
      return false;
    }
  }

  /**
   * @dev Returns true if the value is in the set. O(1).
   */
  function _contains(Set storage set, bytes32 value) private view returns (bool) {
    return set._indexes[value] != 0;
  }

  /**
   * @dev Returns the number of values on the set. O(1).
   */
  function _length(Set storage set) private view returns (uint256) {
    return set._values.length;
  }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
  function _at(Set storage set, uint256 index) private view returns (bytes32) {
    require(set._values.length > index, "EnumerableSet: index out of bounds");
    return set._values[index];
  }

  function _getValues( Set storage set_ ) private view returns ( bytes32[] storage ) {
    return set_._values;
  }

  // TODO needs insert function that maintains order.
  // TODO needs NatSpec documentation comment.
  /**
   * Inserts new value by moving existing value at provided index to end of array and setting provided value at provided index
   */
  function _insert(Set storage set_, uint256 index_, bytes32 valueToInsert_ ) private returns ( bool ) {
    require(  set_._values.length > index_ );
    require( !_contains( set_, valueToInsert_ ), "Remove value you wish to insert if you wish to reorder array." );
    bytes32 existingValue_ = _at( set_, index_ );
    set_._values[index_] = valueToInsert_;
    return _add( set_, existingValue_);
  } 

  struct Bytes4Set {
    Set _inner;
  }

  /**
   * @dev Add a value to a set. O(1).
   *
   * Returns true if the value was added to the set, that is if it was not
   * already present.
   */
  function add(Bytes4Set storage set, bytes4 value) internal returns (bool) {
    return _add(set._inner, value);
  }

  /**
   * @dev Removes a value from a set. O(1).
   *
   * Returns true if the value was removed from the set, that is if it was
   * present.
   */
  function remove(Bytes4Set storage set, bytes4 value) internal returns (bool) {
    return _remove(set._inner, value);
  }

  /**
   * @dev Returns true if the value is in the set. O(1).
   */
  function contains(Bytes4Set storage set, bytes4 value) internal view returns (bool) {
    return _contains(set._inner, value);
  }

  /**
   * @dev Returns the number of values on the set. O(1).
   */
  function length(Bytes4Set storage set) internal view returns (uint256) {
    return _length(set._inner);
  }

  /**
   * @dev Returns the value stored at position `index` in the set. O(1).
   *
   * Note that there are no guarantees on the ordering of values inside the
   * array, and it may change when more values are added or removed.
   *
   * Requirements:
   *
   * - `index` must be strictly less than {length}.
   */
  function at(Bytes4Set storage set, uint256 index) internal view returns ( bytes4 ) {
    return bytes4( _at( set._inner, index ) );
  }

  function getValues( Bytes4Set storage set_ ) internal view returns ( bytes4[] memory ) {
    bytes4[] memory bytes4Array_;
    for( uint256 iteration_ = 0; _length( set_._inner ) > iteration_; iteration_++ ) {
      bytes4Array_[iteration_] = bytes4( _at( set_._inner, iteration_ ) );
    }
    return bytes4Array_;
  }

  function insert( Bytes4Set storage set_, uint256 index_, bytes4 valueToInsert_ ) internal returns ( bool ) {
    return _insert( set_._inner, index_, valueToInsert_ );
  }

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns ( bytes32 ) {
        return _at(set._inner, index);
    }

  function getValues( Bytes32Set storage set_ ) internal view returns ( bytes4[] memory ) {
    bytes4[] memory bytes4Array_;

      for( uint256 iteration_ = 0; _length( set_._inner ) >= iteration_; iteration_++ ){
        bytes4Array_[iteration_] = bytes4( at( set_, iteration_ ) );
      }

      return bytes4Array_;
  }

  function insert( Bytes32Set storage set_, uint256 index_, bytes32 valueToInsert_ ) internal returns ( bool ) {
    return _insert( set_._inner, index_, valueToInsert_ );
  }

  // AddressSet
  struct AddressSet {
    Set _inner;
  }

  /**
   * @dev Add a value to a set. O(1).
   *
   * Returns true if the value was added to the set, that is if it was not
   * already present.
   */
  function add(AddressSet storage set, address value) internal returns (bool) {
    return _add(set._inner, bytes32(uint256(value)));
  }

  /**
   * @dev Removes a value from a set. O(1).
   *
   * Returns true if the value was removed from the set, that is if it was
   * present.
   */
  function remove(AddressSet storage set, address value) internal returns (bool) {
    return _remove(set._inner, bytes32(uint256(value)));
  }

  /**
   * @dev Returns true if the value is in the set. O(1).
   */
  function contains(AddressSet storage set, address value) internal view returns (bool) {
    return _contains(set._inner, bytes32(uint256(value)));
  }

  /**
   * @dev Returns the number of values in the set. O(1).
   */
  function length(AddressSet storage set) internal view returns (uint256) {
    return _length(set._inner);
  }

  /**
   * @dev Returns the value stored at position `index` in the set. O(1).
   *
   * Note that there are no guarantees on the ordering of values inside the
   * array, and it may change when more values are added or removed.
   *
   * Requirements:
   *
   * - `index` must be strictly less than {length}.
   */
  function at(AddressSet storage set, uint256 index) internal view returns (address) {
    return address(uint256(_at(set._inner, index)));
  }

  /**
   * TODO Might require explicit conversion of bytes32[] to address[].
   *  Might require iteration.
   */
  function getValues( AddressSet storage set_ ) internal view returns ( address[] memory ) {

    address[] memory addressArray;

    for( uint256 iteration_ = 0; _length(set_._inner) >= iteration_; iteration_++ ){
      addressArray[iteration_] = at( set_, iteration_ );
    }

    return addressArray;
  }

  function insert(AddressSet storage set_, uint256 index_, address valueToInsert_ ) internal returns ( bool ) {
    return _insert( set_._inner, index_, bytes32(uint256(valueToInsert_)) );
  }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    struct UInt256Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UInt256Set storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UInt256Set storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UInt256Set storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UInt256Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UInt256Set storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

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

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 (uint c) {
        if (a > 3) {
            c = a;
            uint 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 substractPercentage( uint256 total_, uint8 percentageToSub_ ) internal pure returns ( uint256 result_ ) {
        return sub( total_, div( mul( total_, percentageToSub_ ), 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 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_ );
  }
}

abstract contract ERC20 is IERC20 {

  using SafeMath for uint256;

  // TODO comment actual hash value.
  bytes32 constant private ERC20TOKEN_ERC1820_INTERFACE_ID = keccak256( "ERC20Token" );
    
  // Present in ERC777
  mapping (address => uint256) internal _balances;

  // Present in ERC777
  mapping (address => mapping (address => uint256)) internal _allowances;

  // Present in ERC777
  uint256 internal _totalSupply;

  // Present in ERC777
  string internal _name;
    
  // Present in ERC777
  string internal _symbol;
    
  // Present in ERC777
  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 virtual override returns (uint256) {
    return _balances[account];
  }

  function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
    _transfer(msg.sender, 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(msg.sender, spender, amount);
        return true;
    }

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

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

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][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 amount_) internal virtual {
        require(account_ != address(0), "ERC20: mint to the zero address");
        _beforeTokenTransfer(address( this ), account_, amount_);
        _totalSupply = _totalSupply.add(amount_);
        _balances[account_] = _balances[account_].add(amount_);
        emit Transfer(address( this ), account_, amount_);
    }

    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 { }
}

library Counters {
    using SafeMath for uint256;

    struct Counter {
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}

interface IERC2612Permit {

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

    function nonces(address owner) external view returns (uint256);
}

abstract contract ERC20Permit is ERC20, IERC2612Permit {
    using Counters for Counters.Counter;

    mapping(address => Counters.Counter) private _nonces;

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

    bytes32 public DOMAIN_SEPARATOR;

    constructor() {
        uint256 chainID;
        assembly {
            chainID := chainid()
        }

        DOMAIN_SEPARATOR = keccak256(
            abi.encode(
                keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                keccak256(bytes(name())),
                keccak256(bytes("1")), // Version
                chainID,
                address(this)
            )
        );
    }

    function permit(
        address owner,
        address spender,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= deadline, "Permit: expired deadline");

        bytes32 hashStruct =
            keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, amount, _nonces[owner].current(), deadline));

        bytes32 _hash = keccak256(abi.encodePacked(uint16(0x1901), DOMAIN_SEPARATOR, hashStruct));

        address signer = ecrecover(_hash, v, r, s);
        require(signer != address(0) && signer == owner, "ZeroSwapPermit: Invalid signature");

        _nonces[owner].increment();
        _approve(owner, spender, amount);
    }

    function nonces(address owner) public view override returns (uint256) {
        return _nonces[owner].current();
    }
}

interface IOwnable {
    function owner() external view returns (address);

    function renounceManagement(string memory confirm) external;

    function pushManagement( address newOwner_ ) external;

    function pullManagement() external;
}

contract Ownable is IOwnable {

    address internal _owner;
    address internal _newOwner;

    event OwnershipPushed(address indexed previousOwner, address indexed newOwner);
    event OwnershipPulled(address indexed previousOwner, address indexed newOwner);

    constructor () {
        _owner = msg.sender;
        emit OwnershipPulled( address(0), _owner );
    }

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

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

    function renounceManagement(string memory confirm) public virtual override onlyOwner() {
        require(
            keccak256(abi.encodePacked(confirm)) == keccak256(abi.encodePacked("confirm renounce")),
            "Ownable: renouce needs 'confirm renounce' as input"
        );
        emit OwnershipPushed( _owner, address(0) );
        _owner = address(0);
    }

    function pushManagement( address newOwner_ ) public virtual override onlyOwner() {
        require( newOwner_ != address(0), "Ownable: new owner is the zero address");
        emit OwnershipPushed( _owner, newOwner_ );
        _newOwner = newOwner_;
    }

    function pullManagement() public virtual override {
        require( msg.sender == _newOwner, "Ownable: must be new owner to pull");
        emit OwnershipPulled( _owner, _newOwner );
        _owner = _newOwner;
    }
}

contract Mintable is Ownable {
    
  address internal _minter;

  function setMinter( address minter_ ) external onlyOwner() returns ( bool ) {
    _minter = minter_;

    return true;
  }

  function minter() public view returns (address) {
    return _minter;
  }

  modifier onlyMinter() {
    require( _minter == msg.sender, "Mintable: caller is not the Minter" );
    _;
  }

}

contract TOR is ERC20Permit, Mintable {

    using SafeMath for uint256;

    constructor() ERC20("TOR", "TOR", 18) {
    }

    function mint(address account_, uint256 amount_) external onlyMinter() {
        _mint(account_, 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 Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPulled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipPushed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pullManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"pushManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"confirm","type":"string"}],"name":"renounceManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter_","type":"address"}],"name":"setMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051806040016040528060038152602001622a27a960e91b815250604051806040016040528060038152602001622a27a960e91b815250601282600390805190602001906200006492919062000225565b5081516200007a90600490602085019062000225565b506005805460ff191660ff92909216919091179055504690507f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f620000be6200018b565b805160209182012060408051808201825260018152603160f81b90840152805180840194909452838101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606084015260808301939093523060a0808401919091528351808403909101815260c0909201928390528151910120600755600880546001600160a01b0319163317908190556001600160a01b0316906000907faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d908290a3620002d1565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156200021b5780601f10620001ef576101008083540402835291602001916200021b565b820191906000526020600020905b815481529060010190602001808311620001fd57829003601f168201915b5050505050905090565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200025d5760008555620002a8565b82601f106200027857805160ff1916838001178555620002a8565b82800160010185558215620002a8579182015b82811115620002a85782518255916020019190600101906200028b565b50620002b6929150620002ba565b5090565b5b80821115620002b65760008155600101620002bb565b6116d580620002e16000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80635a96ac0a116100c3578063a457c2d71161007c578063a457c2d7146103e9578063a9059cbb14610415578063b932268014610441578063d505accf146104e7578063dd62ed3e14610538578063fca3b5aa1461056657610158565b80635a96ac0a1461035957806370a082311461036157806379cc6790146103875780637ecebe00146103b35780638da5cb5b146103d957806395d89b41146103e157610158565b8063313ce56711610115578063313ce567146102965780633644e515146102b457806339509351146102bc57806340c10f19146102e857806342966c681461031657806346f68ee91461033357610158565b806306fdde031461015d57806307546172146101da578063095ea7b3146101fe57806318160ddd1461023e57806323b872dd1461025857806330adf81f1461028e575b600080fd5b61016561058c565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561019f578181015183820152602001610187565b50505050905090810190601f1680156101cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101e2610622565b604080516001600160a01b039092168252519081900360200190f35b61022a6004803603604081101561021457600080fd5b506001600160a01b038135169060200135610631565b604080519115158252519081900360200190f35b610246610647565b60408051918252519081900360200190f35b61022a6004803603606081101561026e57600080fd5b506001600160a01b0381358116916020810135909116906040013561064d565b6102466106b6565b61029e6106da565b6040805160ff9092168252519081900360200190f35b6102466106e3565b61022a600480360360408110156102d257600080fd5b506001600160a01b0381351690602001356106e9565b610314600480360360408110156102fe57600080fd5b506001600160a01b03813516906020013561071f565b005b6103146004803603602081101561032c57600080fd5b5035610776565b6103146004803603602081101561034957600080fd5b50356001600160a01b0316610783565b610314610883565b6102466004803603602081101561037757600080fd5b50356001600160a01b031661092f565b6103146004803603604081101561039d57600080fd5b506001600160a01b03813516906020013561094a565b610246600480360360208110156103c957600080fd5b50356001600160a01b0316610954565b6101e261097b565b61016561098a565b61022a600480360360408110156103ff57600080fd5b506001600160a01b0381351690602001356109eb565b61022a6004803603604081101561042b57600080fd5b506001600160a01b038135169060200135610a3a565b6103146004803603602081101561045757600080fd5b81019060208101813564010000000081111561047257600080fd5b82018360208201111561048457600080fd5b803590602001918460018302840111640100000000831117156104a657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610a47945050505050565b610314600480360360e08110156104fd57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135610bd5565b6102466004803603604081101561054e57600080fd5b506001600160a01b0381358116916020013516610e02565b61022a6004803603602081101561057c57600080fd5b50356001600160a01b0316610e2d565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106185780601f106105ed57610100808354040283529160200191610618565b820191906000526020600020905b8154815290600101906020018083116105fb57829003601f168201915b5050505050905090565b600a546001600160a01b031690565b600061063e338484610eb4565b50600192915050565b60025490565b600061065a848484610fa0565b6106ac84336106a7856040518060600160405280602881526020016115c5602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906110fb565b610eb4565b5060019392505050565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b60055460ff1690565b60075481565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161063e9185906106a79086611192565b600a546001600160a01b031633146107685760405162461bcd60e51b81526004018080602001828103825260228152602001806114c06022913960400191505060405180910390fd5b61077282826111f3565b5050565b61078033826112e3565b50565b6008546001600160a01b031633146107e2576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166108275760405162461bcd60e51b81526004018080602001828103825260268152602001806114e26026913960400191505060405180910390fd5b6008546040516001600160a01b038084169216907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba90600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b031633146108cc5760405162461bcd60e51b81526004018080602001828103825260228152602001806115506022913960400191505060405180910390fd5b6009546008546040516001600160a01b0392831692909116907faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d90600090a3600954600880546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b031660009081526020819052604090205490565b61077282826113df565b6001600160a01b03811660009081526006602052604081206109759061142b565b92915050565b6008546001600160a01b031690565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156106185780601f106105ed57610100808354040283529160200191610618565b600061063e33846106a78560405180606001604052806025815260200161167b602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906110fb565b600061063e338484610fa0565b6008546001600160a01b03163314610aa6576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60405160200180806f636f6e6669726d2072656e6f756e636560801b815250601001905060405160208183030381529060405280519060200120816040516020018082805190602001908083835b60208310610b135780518252601f199092019160209182019101610af4565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012014610b8a5760405162461bcd60e51b81526004018080602001828103825260328152602001806115936032913960400191505060405180910390fd5b6008546040516000916001600160a01b0316907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908390a350600880546001600160a01b0319169055565b83421115610c2a576040805162461bcd60e51b815260206004820152601860248201527f5065726d69743a206578706972656420646561646c696e650000000000000000604482015290519081900360640190fd5b6001600160a01b03871660009081526006602052604081207f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c990899089908990610c739061142b565b604080516020808201979097526001600160a01b0395861681830152939094166060840152608083019190915260a082015260c08082018990528251808303909101815260e08201835280519084012060075461190160f01b610100840152610102830152610122808301829052835180840390910181526101428301808552815191860191909120600091829052610162840180865281905260ff8a166101828501526101a284018990526101c28401889052935191955092936001926101e280820193601f1981019281900390910190855afa158015610d59573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590610d8f5750896001600160a01b0316816001600160a01b0316145b610dca5760405162461bcd60e51b81526004018080602001828103825260218152602001806115726021913960400191505060405180910390fd5b6001600160a01b038a166000908152600660205260409020610deb9061142f565b610df68a8a8a610eb4565b50505050505050505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6008546000906001600160a01b03163314610e8f576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b50600a80546001600160a01b0383166001600160a01b03199091161790556001919050565b6001600160a01b038316610ef95760405162461bcd60e51b81526004018080602001828103825260248152602001806116576024913960400191505060405180910390fd5b6001600160a01b038216610f3e5760405162461bcd60e51b81526004018080602001828103825260228152602001806115086022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610fe55760405162461bcd60e51b81526004018080602001828103825260258152602001806116326025913960400191505060405180910390fd5b6001600160a01b03821661102a5760405162461bcd60e51b815260040180806020018281038252602381526020018061147b6023913960400191505060405180910390fd5b611035838383611426565b6110728160405180606001604052806026815260200161152a602691396001600160a01b03861660009081526020819052604090205491906110fb565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546110a19082611192565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000818484111561118a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561114f578181015183820152602001611137565b50505050905090810190601f16801561117c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828201838110156111ec576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b03821661124e576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b611259308383611426565b6002546112669082611192565b6002556001600160a01b03821660009081526020819052604090205461128c9082611192565b6001600160a01b038316600081815260208181526040918290209390935580518481529051919230927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b0382166113285760405162461bcd60e51b81526004018080602001828103825260218152602001806116116021913960400191505060405180910390fd5b61133482600083611426565b6113718160405180606001604052806022815260200161149e602291396001600160a01b03851660009081526020819052604090205491906110fb565b6001600160a01b0383166000908152602081905260409020556002546113979082611438565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600061140f826040518060600160405280602481526020016115ed602491396114088633610e02565b91906110fb565b905061141c833383610eb4565b61142683836112e3565b505050565b5490565b80546001019055565b60006111ec83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506110fb56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654d696e7461626c653a2063616c6c6572206973206e6f7420746865204d696e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c5a65726f537761705065726d69743a20496e76616c6964207369676e61747572654f776e61626c653a2072656e6f756365206e656564732027636f6e6669726d2072656e6f756e63652720617320696e70757445524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212202423df051a5df38c3e834b9525609252182ac23ce4a4a44342e5ab9c7a3324f464736f6c63430007050033

Deployed ByteCode Sourcemap

28712:851:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20351:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28509:75;;;:::i;:::-;;;;-1:-1:-1;;;;;28509:75:0;;;;;;;;;;;;;;21161:167;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21161:167:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;20604:94;;;:::i;:::-;;;;;;;;;;;;;;;;21336:317;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21336:317:0;;;;;;;;;;;;;;;;;:::i;25019:108::-;;;:::i;20521:77::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25136:31;;;:::i;21661:214::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21661:214:0;;;;;;;;:::i;28848:114::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28848:114:0;;;;;;;;:::i;:::-;;28970:89;;;;;;;;;;;;;;;;-1:-1:-1;28970:89:0;;:::i;27811:259::-;;;;;;;;;;;;;;;;-1:-1:-1;27811:259:0;-1:-1:-1;;;;;27811:259:0;;:::i;28078:221::-;;;:::i;20704:121::-;;;;;;;;;;;;;;;;-1:-1:-1;20704:121:0;-1:-1:-1;;;;;20704:121:0;;:::i;29072:115::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29072:115:0;;;;;;;;:::i;26433:120::-;;;;;;;;;;;;;;;;-1:-1:-1;26433:120:0;-1:-1:-1;;;;;26433:120:0;;:::i;27204:88::-;;;:::i;20434:81::-;;;:::i;21883:265::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21883:265:0;;;;;;;;:::i;20831:163::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20831:163:0;;;;;;;;:::i;27427:376::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27427:376:0;;-1:-1:-1;27427:376:0;;-1:-1:-1;;;;;27427:376:0:i;25655:770::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25655:770:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21002:151::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21002:151:0;;;;;;;;;;:::i;28377:126::-;;;;;;;;;;;;;;;;-1:-1:-1;28377:126:0;-1:-1:-1;;;;;28377:126:0;;:::i;20351:77::-;20417:5;20410:12;;;;;;;;-1:-1:-1;;20410:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20388:13;;20410:12;;20417:5;;20410:12;;20417:5;20410:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20351:77;:::o;28509:75::-;28571:7;;-1:-1:-1;;;;;28571:7:0;28509:75;:::o;21161:167::-;21244:4;21261:37;21270:10;21282:7;21291:6;21261:8;:37::i;:::-;-1:-1:-1;21316:4:0;21161:167;;;;:::o;20604:94::-;20680:12;;20604:94;:::o;21336:317::-;21442:4;21459:36;21469:6;21477:9;21488:6;21459:9;:36::i;:::-;21506:117;21515:6;21523:10;21535:87;21571:6;21535:87;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21535:19:0;;;;;;:11;:19;;;;;;;;21555:10;21535:31;;;;;;;;;:87;:35;:87::i;:::-;21506:8;:117::i;:::-;-1:-1:-1;21641:4:0;21336:317;;;;;:::o;25019:108::-;25061:66;25019:108;:::o;20521:77::-;20583:9;;;;20521:77;:::o;25136:31::-;;;;:::o;21661:214::-;21775:10;21749:4;21796:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;21796:32:0;;;;;;;;;;21749:4;;21766:79;;21787:7;;21796:48;;21833:10;21796:36;:48::i;28848:114::-;28628:7;;-1:-1:-1;;;;;28628:7:0;28639:10;28628:21;28619:70;;;;-1:-1:-1;;;28619:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28930:24:::1;28936:8;28946:7;28930:5;:24::i;:::-;28848:114:::0;;:::o;28970:89::-;29026:25;29032:10;29044:6;29026:5;:25::i;:::-;28970:89;:::o;27811:259::-;27341:6;;-1:-1:-1;;;;;27341:6:0;27351:10;27341:20;27332:67;;;;;-1:-1:-1;;;27332:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27912:23:0;::::1;27903:75;;;;-1:-1:-1::0;;;27903:75:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28011:6;::::0;27994:36:::1;::::0;-1:-1:-1;;;;;27994:36:0;;::::1;::::0;28011:6:::1;::::0;27994:36:::1;::::0;28011:6:::1;::::0;27994:36:::1;28041:9;:21:::0;;-1:-1:-1;;;;;;28041:21:0::1;-1:-1:-1::0;;;;;28041:21:0;;;::::1;::::0;;;::::1;::::0;;27811:259::o;28078:221::-;28162:9;;-1:-1:-1;;;;;28162:9:0;28148:10;:23;28139:71;;;;-1:-1:-1;;;28139:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28251:9;;28243:6;;28226:36;;-1:-1:-1;;;;;28251:9:0;;;;28243:6;;;;28226:36;;28251:9;;28226:36;28282:9;;28273:6;:18;;-1:-1:-1;;;;;;28273:18:0;-1:-1:-1;;;;;28282:9:0;;;28273:18;;;;;;28078:221::o;20704:121::-;-1:-1:-1;;;;;20801:18:0;20778:7;20801:18;;;;;;;;;;;;20704:121::o;29072:115::-;29151:28;29161:8;29171:7;29151:9;:28::i;26433:120::-;-1:-1:-1;;;;;26521:14:0;;26494:7;26521:14;;;:7;:14;;;;;:24;;:22;:24::i;:::-;26514:31;26433:120;-1:-1:-1;;26433:120:0:o;27204:88::-;27278:6;;-1:-1:-1;;;;;27278:6:0;27204:88;:::o;20434:81::-;20502:7;20495:14;;;;;;;;-1:-1:-1;;20495:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20473:13;;20495:14;;20502:7;;20495:14;;20502:7;20495:14;;;;;;;;;;;;;;;;;;;;;;;;21883:265;21976:4;21993:125;22002:10;22014:7;22023:94;22060:15;22023:94;;;;;;;;;;;;;;;;;22035:10;22023:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;22023:32:0;;;;;;;;;;;:94;:36;:94::i;20831:163::-;20917:4;20930:40;20940:10;20952:9;20963:6;20930:9;:40::i;27427:376::-;27341:6;;-1:-1:-1;;;;;27341:6:0;27351:10;27341:20;27332:67;;;;;-1:-1:-1;;;27332:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27597:36:::1;;;;;;-1:-1:-1::0;;;27597:36:0::1;;::::0;::::1;;;;;;;;;;;;;;;;27587:47;;;;;;27574:7;27557:25;;;;;;;;;;;;;;;;;;;;;::::0;;;;-1:-1:-1;;27557:25:0;;;;::::1;::::0;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27547:36;;;;;;:87;27525:187;;;;-1:-1:-1::0;;;27525:187:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27745:6;::::0;27728:37:::1;::::0;27761:1:::1;::::0;-1:-1:-1;;;;;27745:6:0::1;::::0;27728:37:::1;::::0;27761:1;;27728:37:::1;-1:-1:-1::0;27776:6:0::1;:19:::0;;-1:-1:-1;;;;;;27776:19:0::1;::::0;;27427:376::o;25655:770::-;25900:8;25881:15;:27;;25873:64;;;;;-1:-1:-1;;;25873:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26046:14:0;;25950:18;26046:14;;;:7;:14;;;;;25061:66;;26022:5;;26029:7;;26038:6;;26046:24;;:22;:24::i;:::-;25994:87;;;;;;;;;;;-1:-1:-1;;;;;25994:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25984:98;;;;;;26154:16;;-1:-1:-1;;;26121:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26111:73;;;;;;;;;-1:-1:-1;26214:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25984:98;;-1:-1:-1;26111:73:0;;26214:25;;;;;;;-1:-1:-1;;26214:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26214:25:0;;-1:-1:-1;;26214:25:0;;;-1:-1:-1;;;;;;;26258:20:0;;;;;;:39;;;26292:5;-1:-1:-1;;;;;26282:15:0;:6;-1:-1:-1;;;;;26282:15:0;;26258:39;26250:85;;;;-1:-1:-1;;;26250:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26348:14:0;;;;;;:7;:14;;;;;:26;;:24;:26::i;:::-;26385:32;26394:5;26401:7;26410:6;26385:8;:32::i;:::-;25655:770;;;;;;;;;;:::o;21002:151::-;-1:-1:-1;;;;;21118:18:0;;;21091:7;21118:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;21002:151::o;28377:126::-;27341:6;;28446:4;;-1:-1:-1;;;;;27341:6:0;27351:10;27341:20;27332:67;;;;;-1:-1:-1;;;27332:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28460:7:0::1;:17:::0;;-1:-1:-1;;;;;28460:17:0;::::1;-1:-1:-1::0;;;;;;28460:17:0;;::::1;;::::0;;;28377:126;;;:::o;23520:346::-;-1:-1:-1;;;;;23622:19:0;;23614:68;;;;-1:-1:-1;;;23614:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23701:21:0;;23693:68;;;;-1:-1:-1;;;23693:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23774:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;23826:32;;;;;;;;;;;;;;;;;23520:346;;;:::o;22156:527::-;-1:-1:-1;;;;;22260:20:0;;22252:70;;;;-1:-1:-1;;;22252:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22339:23:0;;22331:71;;;;-1:-1:-1;;;22331:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22413:47;22434:6;22442:9;22453:6;22413:20;:47::i;:::-;22491:71;22513:6;22491:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22491:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;22471:17:0;;;:9;:17;;;;;;;;;;;:91;;;;22594:20;;;;;;;:32;;22619:6;22594:24;:32::i;:::-;-1:-1:-1;;;;;22571:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;22640:35;;;;;;;22571:20;;22640:35;;;;;;;;;;;;;22156:527;;;:::o;16961:192::-;17047:7;17083:12;17075:6;;;;17067:29;;;;-1:-1:-1;;;17067:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;17119:5:0;;;16961:192::o;16628:181::-;16686:7;16718:5;;;16742:6;;;;16734:46;;;;;-1:-1:-1;;;16734:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16800:1;16628:181;-1:-1:-1;;;16628:181:0:o;22691:395::-;-1:-1:-1;;;;;22777:22:0;;22769:66;;;;;-1:-1:-1;;;22769:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22846:56;22876:4;22884:8;22894:7;22846:20;:56::i;:::-;22928:12;;:25;;22945:7;22928:16;:25::i;:::-;22913:12;:40;-1:-1:-1;;;;;22986:19:0;;:9;:19;;;;;;;;;;;:32;;23010:7;22986:23;:32::i;:::-;-1:-1:-1;;;;;22964:19:0;;:9;:19;;;;;;;;;;;;:54;;;;23034:44;;;;;;;22964:19;;23052:4;;23034:44;;;;;;;;;;22691:395;;:::o;23094:418::-;-1:-1:-1;;;;;23178:21:0;;23170:67;;;;-1:-1:-1;;;23170:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23250:49;23271:7;23288:1;23292:6;23250:20;:49::i;:::-;23333:68;23356:6;23333:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23333:18:0;;:9;:18;;;;;;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;23312:18:0;;:9;:18;;;;;;;;;;:89;23427:12;;:24;;23444:6;23427:16;:24::i;:::-;23412:12;:39;23467:37;;;;;;;;23493:1;;-1:-1:-1;;;;;23467:37:0;;;;;;;;;;;;23094:418;;:::o;29195:365::-;29277:27;29320:133;29374:7;29320:133;;;;;;;;;;;;;;;;;:31;29330:8;29340:10;29320:9;:31::i;:::-;:35;:133;:35;:133::i;:::-;29277:176;;29466:51;29475:8;29485:10;29497:19;29466:8;:51::i;:::-;29528:24;29534:8;29544:7;29528:5;:24::i;:::-;29195:365;;;:::o;24105:114::-;24197:14;;24105:114::o;24227:91::-;24291:19;;24309:1;24291:19;;;24227:91::o;16817:136::-;16875:7;16902:43;16906:1;16909;16902:43;;;;;;;;;;;;;;;;;:3;:43::i

Swarm Source

ipfs://2423df051a5df38c3e834b9525609252182ac23ce4a4a44342e5ab9c7a3324f4
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.