Contract 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff

Txn Hash Method
Block
From
To
Value [Txn Fee]
0x351d16a087f130ed59f990beace4b09c3c091b1ac34225757658e3b7dfc33173Buy186885542021-10-09 17:22:1652 days 10 hrs ago0x0d2254a9b732484210776bcd303b938f0e814f87 IN  0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0.28 FTM0.014840709622
0x4d7dc614ea27f83a93f28d80244217a637698613dc5687d81c305b0d47c8a7d1Withdraw170506102021-09-14 16:45:4977 days 10 hrs ago0x1675fa34fdf9666604d7b5666a3640ad92414dec IN  0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0 FTM0.003945915
0x4ff6d1f0eac2ca15253f541a2a28d996831b95dad9aa28754056724f2f7991fdList170189432021-09-13 22:43:2278 days 4 hrs ago0x8d580c4b830e31c817c715e739ba9ae2160e150a IN  0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0 FTM0.0100772
0x956676f7ae582d36ced75b55c08851a4571fda1749abcd20521f0b3bd9f0f005List170188692021-09-13 22:41:0578 days 4 hrs ago0x8d580c4b830e31c817c715e739ba9ae2160e150a IN  0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0 FTM0.005744004
0xd098f22732b4d4a025f4062f3506ebf9e9f5ca68d559d87a2e827c0f331a765dList170187522021-09-13 22:38:0378 days 4 hrs ago0x8d580c4b830e31c817c715e739ba9ae2160e150a IN  0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0 FTM0.005744004
0xe5c3c1bc1e3dae4702f62591c505041965cf98f80da530a2f00e12cc509decfe0x60806040167536172021-09-09 16:06:5182 days 11 hrs ago0x28bc92e7b7e77d348fd262fb8e29da129308fbd3 IN  Contract Creation0 FTM0.146838625
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x7aeb41acc045869f330ab039cbad90708a18d9b15285016f7d12781cc6d95012236316322021-12-01 2:27:301 hr 8 mins ago 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0xa40ff93717fec514a3550e6ef3152cfc195f42690.6831 FTM
0xf2b4b8c714c22a435d30a8d3b3e7bd55978441e0a71602750b395dc42b231cab236301602021-12-01 2:06:411 hr 29 mins ago 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0x2f65b11826c1f55d35d20081f47fac03f3e06cab0.495 FTM
0x4d43b8e5bf7034fc914f0e29041737d410789354531967b13debb6daad4ec376236162702021-11-30 22:50:244 hrs 45 mins ago 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0x95ef5f26ef598c8ebeb820111fe95724f7e880210.693 FTM
0xaf0775583bea049487b40ee06d1e45a2f2dac23360f31aaf426b975e6ef346d0236158452021-11-30 22:44:424 hrs 51 mins ago 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0x4bedded8b463df310846d3e1056df74c07e6f7400.99 FTM
0x5a36c981683f7db10bc7ead791a008582ff022f8f3eafe409d10a8f0634c59ef236156082021-11-30 22:41:334 hrs 54 mins ago 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0x80bb8a84e94b2bb66b329130902bcda35d88a2c60.7128 FTM
0xdaba4306bd0d95a07ad71afec4bf01e6fb728f5e6c2a41dc47a8484bc24fbbb2236043772021-11-30 19:56:167 hrs 39 mins ago 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0x6b26459de6d8106bb3849a777895a4a9619e457e0.594 FTM
0x50292fe70f86a066f9efc032067e3d398134448ba6d0bdcaf215418263b97722236043772021-11-30 19:56:167 hrs 39 mins ago 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0x6b26459de6d8106bb3849a777895a4a9619e457e0.594 FTM
0x4221f2dc041bf9e97816a0fb16e0ada3a4a70025d905762ed536dc6afef99df3236043772021-11-30 19:56:167 hrs 39 mins ago 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0x6b26459de6d8106bb3849a777895a4a9619e457e0.594 FTM
0x5007ea3bce2caa643830335c98909d0e8cda4dd46c3c201204089695fd1e80d7236043352021-11-30 19:55:397 hrs 40 mins ago 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0x6b26459de6d8106bb3849a777895a4a9619e457e0.594 FTM
0xf653b032e308087bc62a780f69aa7ab016ef41bf1dc3c04f94b035d52b82e4ba236043352021-11-30 19:55:397 hrs 40 mins ago 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0x6b26459de6d8106bb3849a777895a4a9619e457e0.594 FTM
0xcec94fd71736f7ed102d3692ee333d7dfd018501d0e400e25d752cee2f748ff0236042102021-11-30 19:53:547 hrs 42 mins ago 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0x6b26459de6d8106bb3849a777895a4a9619e457e0.594 FTM
0x771ac3b2a6715cbf7c15a805eaa6dca73779f5fdbedc7e165ef05459478a0cf7236042102021-11-30 19:53:547 hrs 42 mins ago 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0x6b26459de6d8106bb3849a777895a4a9619e457e0.594 FTM
0xa8bcea2d2ddef07a7558c7d0466b20be65c39d5d29ef5ecc3b10f3c221c679fb236042102021-11-30 19:53:547 hrs 42 mins ago 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0x6b26459de6d8106bb3849a777895a4a9619e457e0.594 FTM
0xbf1dd65e49cb6764893c87610f64de0af02789ff118a3faa2b50e2fb901d044a236042102021-11-30 19:53:547 hrs 42 mins ago 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0x6b26459de6d8106bb3849a777895a4a9619e457e0.594 FTM
0xad85da8b8598138115b85d7dcda305d7f5cf2acced215eb92be7d55bd64b4977236042102021-11-30 19:53:547 hrs 42 mins ago 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0x6b26459de6d8106bb3849a777895a4a9619e457e0.594 FTM
0xd5532ea450a01476be8cb4cada208046dbb8cd655bbcb2c548aa93c51bc4569c236042102021-11-30 19:53:547 hrs 42 mins ago 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0x6b26459de6d8106bb3849a777895a4a9619e457e0.594 FTM
0xfcc6199e3ea0a13bfd7923be93f9a59c7cfee864b212f6bd4cd56a778d66328d236042102021-11-30 19:53:547 hrs 42 mins ago 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0x6b26459de6d8106bb3849a777895a4a9619e457e0.594 FTM
0xc92bb78c92b4ce6d30e7fd1b46ad1a6eb5a149893df4fdb0b4b3697e7db09288236041622021-11-30 19:53:177 hrs 42 mins ago 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0x9176df383214e8e2f92cb25885b9e2b2ff06117d0.99 FTM
0xd1fda75f064349a13b8287e8a04b693a0f6728ff2ce7dfd176f4ede4d6edc741236040892021-11-30 19:52:127 hrs 44 mins ago 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0x64318a5f534eac6bf6cc2f600286d206fd38e8ed0.495 FTM
0xf90d8802298cc0b169bf54ef95da1af6aee9e06787255b517b298bf8055082d4236037932021-11-30 19:48:147 hrs 47 mins ago 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0xfe9c2d9423bb34a10ee5cdab28ebadfb236a81c40.198 FTM
0xe37c82de7efad5a4d06f4d33ecfd9bf037fa37d59af8cc74f81a52930a40bb3f236037142021-11-30 19:47:127 hrs 49 mins ago 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0xfe9c2d9423bb34a10ee5cdab28ebadfb236a81c40.1782 FTM
0x60bd84c04a2cd330331bab56d6139f83c5129f311eeb0d45430cdab1a373ae68236036452021-11-30 19:46:187 hrs 49 mins ago 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0xfe9c2d9423bb34a10ee5cdab28ebadfb236a81c40.198 FTM
0x40ea34ea33d40006cae0d91ef64c047364c55608ccb263a3c41642aa29f50844236010722021-11-30 19:11:518 hrs 24 mins ago 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0x95ef5f26ef598c8ebeb820111fe95724f7e880210.594 FTM
0x83c752823b6095be0f3007e218179f3fb6f630c884ee8c8adc5a217103e6865c236010722021-11-30 19:11:518 hrs 24 mins ago 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0x95ef5f26ef598c8ebeb820111fe95724f7e880210.594 FTM
0x46ebf310640d495f198809357336b680de07bb02080f2e47682d9a4af4a5f6ab235995692021-11-30 18:51:348 hrs 44 mins ago 0xee973c3bb8bc27a76bcdf91e6e0921cf78d8e1ff0x95ef5f26ef598c8ebeb820111fe95724f7e880210.594 FTM
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SummonerMarket

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at FtmScan.com on 2021-09-09
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.3;



// Part: OpenZeppelin/[email protected]/EnumerableSet

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
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;

            if (lastIndex != toDeleteIndex) {
                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] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // 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) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

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

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // 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(uint160(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(uint160(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(uint160(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(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

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

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}

// Part: OpenZeppelin/[email protected]/IERC165

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// Part: OpenZeppelin/[email protected]/IERC721Receiver

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// Part: OpenZeppelin/[email protected]/Initializable

/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 */
abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        require(_initializing || !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }
}

// Part: OpenZeppelin/[email protected]/ERC721Holder

/**
 * @dev Implementation of the {IERC721Receiver} interface.
 *
 * Accepts all token transfers.
 * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}.
 */
contract ERC721Holder is IERC721Receiver {
    /**
     * @dev See {IERC721Receiver-onERC721Received}.
     *
     * Always returns `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address,
        address,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC721Received.selector;
    }
}

// Part: OpenZeppelin/[email protected]/IERC721

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: SummonerMarket.sol

/// @dev Summoner market to allow trading of summoners
/// @author swit.eth (@nomorebear) + nipun (@nipun_pit) + jade (@jade_arin)
contract SummonerMarket is Initializable, ERC721Holder {
  using EnumerableSet for EnumerableSet.UintSet;

  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
  event List(uint indexed id, address indexed lister, uint price);
  event Unlist(uint indexed id, address indexed lister);
  event Buy(uint indexed id, address indexed seller, address indexed buyer, uint price, uint fee);
  event SetFeeBps(uint feeBps);

  IERC721 public rarity;
  uint public feeBps;
  address public owner;
  uint private lock;
  EnumerableSet.UintSet private set;
  mapping(address => EnumerableSet.UintSet) private mySet;

  mapping(uint => uint) public prices;
  mapping(uint => address) public listers;

  modifier nonReentrant() {
    require(lock == 1, '!lock');
    lock = 2;
    _;
    lock = 1;
  }
  modifier onlyOwner() {
    require(owner == msg.sender, '!owner');
    _;
  }

  /// @dev Initializes the contract. Can only be called once.
  function initialize(IERC721 _rarity, uint _feeBps) external initializer {
    lock = 1;
    owner = msg.sender;
    rarity = _rarity;
    feeBps = _feeBps;
    emit OwnershipTransferred(address(0), msg.sender);
    emit SetFeeBps(_feeBps);
  }

  /// @dev Transfers ownership to a new address.
  function transferOwnership(address _owner) external onlyOwner {
    owner = _owner;
    emit OwnershipTransferred(msg.sender, _owner);
  }

  /// @dev Updates fee. Only callable by owner.
  function setFeeBps(uint _feeBps) external onlyOwner {
    feeBps = _feeBps;
    emit SetFeeBps(_feeBps);
  }

  /// @dev Lists the given summoner. This contract will take custody until bought / unlisted.
  function list(uint summonerId, uint price) external nonReentrant {
    require(price > 0, 'bad price');
    require(prices[summonerId] == 0, 'already listed');
    rarity.safeTransferFrom(msg.sender, address(this), summonerId);
    prices[summonerId] = price;
    listers[summonerId] = msg.sender;
    set.add(summonerId);
    mySet[msg.sender].add(summonerId);
    emit List(summonerId, msg.sender, price);
  }

  /// @dev Unlists the given summoner. Must be the lister.
  function unlist(uint summonerId) external nonReentrant {
    require(prices[summonerId] > 0, 'not listed');
    require(listers[summonerId] == msg.sender, 'not lister');
    prices[summonerId] = 0;
    listers[summonerId] = address(0);
    rarity.safeTransferFrom(address(this), msg.sender, summonerId);
    set.remove(summonerId);
    mySet[msg.sender].remove(summonerId);
    emit Unlist(summonerId, msg.sender);
  }

  /// @dev Buys the given summoner. Must pay the exact correct prirce.
  function buy(uint summonerId) external payable nonReentrant {
    uint price = prices[summonerId];
    require(price > 0, 'not listed');
    require(msg.value == price, 'bad msg.value');
    uint fee = (price * feeBps) / 10000;
    uint get = price - fee;
    address lister = listers[summonerId];
    prices[summonerId] = 0;
    listers[summonerId] = address(0);
    rarity.safeTransferFrom(address(this), msg.sender, summonerId);
    payable(lister).transfer(get);
    set.remove(summonerId);
    mySet[lister].remove(summonerId);
    emit Buy(summonerId, lister, msg.sender, price, fee);
  }

  /// @dev Withdraw trading fees. Only called by owner.
  function withdraw(uint amount) external onlyOwner {
    payable(msg.sender).transfer(amount == 0 ? address(this).balance : amount);
  }

  /// @dev Returns list the total number of listed summoners.
  function listLength() external view returns (uint) {
    return set.length();
  }

  /// @dev Returns the ids and the prices of the listed summoners.
  function listsAt(uint start, uint count)
    external
    view
    returns (uint[] memory rIds, uint[] memory rPrices)
  {
    rIds = new uint[](count);
    rPrices = new uint[](count);
    for (uint idx = 0; idx < count; idx++) {
      rIds[idx] = set.at(start + idx);
      rPrices[idx] = prices[rIds[idx]];
    }
  }

  /// @dev Returns list the total number of listed summoners of the given user.
  function myListLength(address user) external view returns (uint) {
    return mySet[user].length();
  }

  /// @dev Returns the ids and the prices of the listed summoners of the given user.
  function myListsAt(
    address user,
    uint start,
    uint count
  ) external view returns (uint[] memory rIds, uint[] memory rPrices) {
    rIds = new uint[](count);
    rPrices = new uint[](count);
    for (uint idx = 0; idx < count; idx++) {
      rIds[idx] = mySet[user].at(start + idx);
      rPrices[idx] = prices[rIds[idx]];
    }
  }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"seller","type":"address"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"Buy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"lister","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"List","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feeBps","type":"uint256"}],"name":"SetFeeBps","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"lister","type":"address"}],"name":"Unlist","type":"event"},{"inputs":[{"internalType":"uint256","name":"summonerId","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feeBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC721","name":"_rarity","type":"address"},{"internalType":"uint256","name":"_feeBps","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"summonerId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"list","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"listLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"listers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"listsAt","outputs":[{"internalType":"uint256[]","name":"rIds","type":"uint256[]"},{"internalType":"uint256[]","name":"rPrices","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"myListLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"myListsAt","outputs":[{"internalType":"uint256[]","name":"rIds","type":"uint256[]"},{"internalType":"uint256[]","name":"rPrices","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"prices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rarity","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeBps","type":"uint256"}],"name":"setFeeBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"summonerId","type":"uint256"}],"name":"unlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50611416806100206000396000f3fe6080604052600436106100fe5760003560e01c8063bc31c1c111610095578063d96a094a11610064578063d96a094a146102fb578063e61c56441461030e578063f2fde38b1461032e578063fb6f049f1461034e578063fef21f0f14610363576100fe565b8063bc31c1c11461026e578063bf5a4dd31461029b578063cd6dc687146102bb578063d8316476146102db576100fe565b806350fd7367116100d157806350fd7367146101e057806372c27b62146102005780638da5cb5b14610220578063a6177d1e14610240576100fe565b806311b84a8b14610103578063150b7a021461015657806324a9d8531461019a5780632e1a7d4d146101be575b600080fd5b34801561010f57600080fd5b5061013961011e366004611233565b6008602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561016257600080fd5b506101816101713660046110fb565b630a85bd0160e11b949350505050565b6040516001600160e01b0319909116815260200161014d565b3480156101a657600080fd5b506101b060015481565b60405190815260200161014d565b3480156101ca57600080fd5b506101de6101d9366004611233565b610389565b005b3480156101ec57600080fd5b506101de6101fb36600461124b565b6103fa565b34801561020c57600080fd5b506101de61021b366004611233565b6105a7565b34801561022c57600080fd5b50600254610139906001600160a01b031681565b34801561024c57600080fd5b5061026061025b3660046111d4565b61060c565b60405161014d9291906112a6565b34801561027a57600080fd5b506101b0610289366004611233565b60076020526000908152604090205481565b3480156102a757600080fd5b506101de6102b6366004611233565b610798565b3480156102c757600080fd5b506101de6102d6366004611208565b610955565b3480156102e757600080fd5b506101b06102f63660046110df565b610aab565b6101de610309366004611233565b610ad2565b34801561031a57600080fd5b5061026061032936600461124b565b610d0a565b34801561033a57600080fd5b506101de6103493660046110df565b610e7f565b34801561035a57600080fd5b506101b0610ef5565b34801561036f57600080fd5b50600054610139906201000090046001600160a01b031681565b6002546001600160a01b031633146103bc5760405162461bcd60e51b81526004016103b3906112f3565b60405180910390fd5b336108fc82156103cc57826103ce565b475b6040518115909202916000818181858888f193505050501580156103f6573d6000803e3d6000fd5b5050565b60035460011461041c5760405162461bcd60e51b81526004016103b3906112d4565b60026003558061045a5760405162461bcd60e51b815260206004820152600960248201526862616420707269636560b81b60448201526064016103b3565b600082815260076020526040902054156104a75760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481b1a5cdd195960921b60448201526064016103b3565b600054604051632142170760e11b815233600482015230602482015260448101849052620100009091046001600160a01b0316906342842e0e90606401600060405180830381600087803b1580156104fe57600080fd5b505af1158015610512573d6000803e3d6000fd5b50505060008381526007602090815260408083208590556008909152902080546001600160a01b031916331790555061054c600483610f06565b503360009081526006602052604090206105669083610f06565b50604051818152339083907f656fea2aeb2af9841f5b2d9a77be15564d1a00f76fff68c5435aec927eb4d5d69060200160405180910390a350506001600355565b6002546001600160a01b031633146105d15760405162461bcd60e51b81526004016103b3906112f3565b60018190556040518181527f15b86359c2a1e342ef965d15a848eda1666e575175d1907ea284dab1dcf64ffb9060200160405180910390a150565b6060808267ffffffffffffffff81111561063657634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561065f578160200160208202803683370190505b5091508267ffffffffffffffff81111561068957634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156106b2578160200160208202803683370190505b50905060005b8381101561078f576106eb6106cd8287611313565b6001600160a01b038816600090815260066020526040902090610f19565b83828151811061070b57634e487b7160e01b600052603260045260246000fd5b6020026020010181815250506007600084838151811061073b57634e487b7160e01b600052603260045260246000fd5b602002602001015181526020019081526020016000205482828151811061077257634e487b7160e01b600052603260045260246000fd5b60209081029190910101528061078781611381565b9150506106b8565b50935093915050565b6003546001146107ba5760405162461bcd60e51b81526004016103b3906112d4565b60026003556000818152600760205260409020546108075760405162461bcd60e51b815260206004820152600a6024820152691b9bdd081b1a5cdd195960b21b60448201526064016103b3565b6000818152600860205260409020546001600160a01b0316331461085a5760405162461bcd60e51b815260206004820152600a6024820152693737ba103634b9ba32b960b11b60448201526064016103b3565b6000818152600760209081526040808320839055600890915280822080546001600160a01b031916905590549051632142170760e11b815230600482015233602482015260448101839052620100009091046001600160a01b0316906342842e0e90606401600060405180830381600087803b1580156108d957600080fd5b505af11580156108ed573d6000803e3d6000fd5b50505050610905816004610f2590919063ffffffff16565b5033600090815260066020526040902061091f9082610f25565b50604051339082907fce7aa37f7d04162a8f0c50b2f6cc1771a3dbf74d67b074dc0c83c363637965af90600090a3506001600355565b600054610100900460ff168061096e575060005460ff16155b6109d15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016103b3565b600054610100900460ff161580156109f3576000805461ffff19166101011790555b6001600381905560028054336001600160a01b031990911681179091556000805462010000600160b01b031916620100006001600160a01b03881602178155918490556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36040518281527f15b86359c2a1e342ef965d15a848eda1666e575175d1907ea284dab1dcf64ffb9060200160405180910390a18015610aa6576000805461ff00191690555b505050565b6001600160a01b0381166000908152600660205260408120610acc90610f31565b92915050565b600354600114610af45760405162461bcd60e51b81526004016103b3906112d4565b600260035560008181526007602052604090205480610b425760405162461bcd60e51b815260206004820152600a6024820152691b9bdd081b1a5cdd195960b21b60448201526064016103b3565b803414610b815760405162461bcd60e51b815260206004820152600d60248201526c626164206d73672e76616c756560981b60448201526064016103b3565b600061271060015483610b94919061134b565b610b9e919061132b565b90506000610bac828461136a565b60008581526008602081815260408084208054600784528286208690559390925281546001600160a01b03191690915591549151632142170760e11b8152306004820152336024820152604481018890529293506001600160a01b03908116926201000090920416906342842e0e90606401600060405180830381600087803b158015610c3857600080fd5b505af1158015610c4c573d6000803e3d6000fd5b50506040516001600160a01b038416925084156108fc02915084906000818181858888f19350505050158015610c86573d6000803e3d6000fd5b50610c92600486610f25565b506001600160a01b0381166000908152600660205260409020610cb59086610f25565b50604080518581526020810185905233916001600160a01b0384169188917f5b3fa64172584174917e1b3a206fe9c25d3120cf366b3d05ad5b6183a15cf789910160405180910390a450506001600355505050565b6060808267ffffffffffffffff811115610d3457634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610d5d578160200160208202803683370190505b5091508267ffffffffffffffff811115610d8757634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610db0578160200160208202803683370190505b50905060005b83811015610e7757610dd3610dcb8287611313565b600490610f19565b838281518110610df357634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060076000848381518110610e2357634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002054828281518110610e5a57634e487b7160e01b600052603260045260246000fd5b602090810291909101015280610e6f81611381565b915050610db6565b509250929050565b6002546001600160a01b03163314610ea95760405162461bcd60e51b81526004016103b3906112f3565b600280546001600160a01b0319166001600160a01b03831690811790915560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6000610f016004610f31565b905090565b6000610f128383610f3b565b9392505050565b6000610f128383610f8a565b6000610f128383610fc2565b6000610acc825490565b6000818152600183016020526040812054610f8257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610acc565b506000610acc565b6000826000018281548110610faf57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b600081815260018301602052604081205480156110d5576000610fe660018361136a565b8554909150600090610ffa9060019061136a565b905081811461107b57600086600001828154811061102857634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061105957634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b855486908061109a57634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610acc565b6000915050610acc565b6000602082840312156110f0578081fd5b8135610f12816113c8565b60008060008060808587031215611110578283fd5b843561111b816113c8565b9350602085013561112b816113c8565b925060408501359150606085013567ffffffffffffffff8082111561114e578283fd5b818701915087601f830112611161578283fd5b813581811115611173576111736113b2565b604051601f8201601f19908116603f0116810190838211818310171561119b5761119b6113b2565b816040528281528a60208487010111156111b3578586fd5b82602086016020830137918201602001949094529598949750929550505050565b6000806000606084860312156111e8578283fd5b83356111f3816113c8565b95602085013595506040909401359392505050565b6000806040838503121561121a578182fd5b8235611225816113c8565b946020939093013593505050565b600060208284031215611244578081fd5b5035919050565b6000806040838503121561125d578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b8381101561129b5781518752958201959082019060010161127f565b509495945050505050565b6000604082526112b9604083018561126c565b82810360208401526112cb818561126c565b95945050505050565b602080825260059082015264216c6f636b60d81b604082015260600190565b60208082526006908201526510b7bbb732b960d11b604082015260600190565b600082198211156113265761132661139c565b500190565b60008261134657634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156113655761136561139c565b500290565b60008282101561137c5761137c61139c565b500390565b60006000198214156113955761139561139c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146113dd57600080fd5b5056fea2646970667358221220a2a9bfe425675719d9e3d04309fc9ca24db3a5eeb22108b19b831748b785c43464736f6c63430008030033

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.