Contract 0xb96697FA4A3361Ba35B774a42c58dACcaAd1B8E1 1

 

Contract Overview

Balance:
0 MATIC

MATIC Value:
$0.00

Token:
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xefea3f4699787e4489a2dd859020a94a1c3a942685fb78349d0a6450d7705722Place Bid338751202022-10-03 10:39:3536 mins ago0xe0a46c097c698e8b14a61b6e9690fa1821aed880 IN  0xb96697fa4a3361ba35b774a42c58daccaad1b8e10 MATIC0.007587960004 30.000000019
0x31a1ec97a8f98f7ab246f07926409d0f1e854be9bb426e88b9d0ee8a2ecb253fPlace Bid338750772022-10-03 10:38:0937 mins ago0xe0a46c097c698e8b14a61b6e9690fa1821aed880 IN  0xb96697fa4a3361ba35b774a42c58daccaad1b8e10 MATIC0.007728337264 30.555000018
0xbaae39f1a226162af7d0c54af3c14e9ff4ac54443ab737de72dfdb846bfdad7dPlace Bid338750482022-10-03 10:37:0738 mins ago0xe0a46c097c698e8b14a61b6e9690fa1821aed880 IN  0xb96697fa4a3361ba35b774a42c58daccaad1b8e10 MATIC0.007587960004 30.000000017
0xe4a30170c078ddecac0669b955ea28b515c1732ce10b41b0029b1bbefbbb00b6Place Bid338748152022-10-03 10:29:0546 mins ago0xe0a46c097c698e8b14a61b6e9690fa1821aed880 IN  0xb96697fa4a3361ba35b774a42c58daccaad1b8e10 MATIC0.007869450003 30.000000014
0x098bfa142ea81702406f4f99a8e4d646b5e7eb312079c1c6d755b4881d382f9aPlace Bid338530912022-10-02 21:47:1513 hrs 28 mins ago0x8cc62392f579da67f3e5f2b7f6874bb1baf9c742 IN  0xb96697fa4a3361ba35b774a42c58daccaad1b8e10 MATIC0.004577601361 33.610641808
0x4f52faf055962f777f7f8d6b7ee20658e0af3b63723c4d2c669270e4343feae0Place Bid338480682022-10-02 18:54:3316 hrs 21 mins ago0xe0a46c097c698e8b14a61b6e9690fa1821aed880 IN  0xb96697fa4a3361ba35b774a42c58daccaad1b8e10 MATIC0.007869090003 30.000000013
0xb9a1c60d6a6578cb8122e57b70eea2deaf258c9edcff396cdf2d9af70cee51ffPlace Bid338480502022-10-02 18:53:5316 hrs 21 mins ago0x8cc62392f579da67f3e5f2b7f6874bb1baf9c742 IN  0xb96697fa4a3361ba35b774a42c58daccaad1b8e10 MATIC0.007587600003 30.000000015
0x76e025f6a787c926c5ee29ce3762d62a0b44189e344ae661838695a4b12f4e95Place Bid338479782022-10-02 18:51:2516 hrs 24 mins ago0x8cc62392f579da67f3e5f2b7f6874bb1baf9c742 IN  0xb96697fa4a3361ba35b774a42c58daccaad1b8e10 MATIC0.004692864736 34.453917469
0x3fca24d5f7573499d8f08b91643d9496ec17112b4362e4e443d69b80ca5eb251Place Bid338470522022-10-02 18:19:3716 hrs 56 mins ago0xe0a46c097c698e8b14a61b6e9690fa1821aed880 IN  0xb96697fa4a3361ba35b774a42c58daccaad1b8e10 MATIC0.007900819343 30.118208738
0xe59e57a9924c1a7198004cbf5d434b2ff973f56f8b24fd02b3e16422124f485bPlace Bid338470062022-10-02 18:18:0116 hrs 57 mins ago0xe0a46c097c698e8b14a61b6e9690fa1821aed880 IN  0xb96697fa4a3361ba35b774a42c58daccaad1b8e10 MATIC0.008416295445 32.084689955
0x6396def892322d728805f02b552362ce49f4079a400e1dc0682c5c8234b2afe3Place Bid338467942022-10-02 18:10:4517 hrs 4 mins ago0xe0a46c097c698e8b14a61b6e9690fa1821aed880 IN  0xb96697fa4a3361ba35b774a42c58daccaad1b8e10 MATIC0.007900457993 30.118208998
0x27bb0ca834a9ba2ab8cfd8dbd6426c73f9eacd19d85ddef86517a5804d483f51Place Bid338467072022-10-02 18:07:4317 hrs 7 mins ago0xe0a46c097c698e8b14a61b6e9690fa1821aed880 IN  0xb96697fa4a3361ba35b774a42c58daccaad1b8e10 MATIC0.009256550289 36.598728015
0x66b586334534c794a3d06347421aa185137408f7bf7ba27c6bd2f60154633234Place Bid338465632022-10-02 18:02:4717 hrs 12 mins ago0xe0a46c097c698e8b14a61b6e9690fa1821aed880 IN  0xb96697fa4a3361ba35b774a42c58daccaad1b8e10 MATIC0.007587960005 30.000000022
0x30995d91d650b1ac55347c850e6761eb4a38403a421546587d2fdfff35169742Place Bid338465352022-10-02 18:01:5117 hrs 13 mins ago0xe0a46c097c698e8b14a61b6e9690fa1821aed880 IN  0xb96697fa4a3361ba35b774a42c58daccaad1b8e10 MATIC0.008015034832 30.555000029
0x0d3e8a8bf8bdf6da9325829a848cfdf4ff83cf6835752b74b621d3a8b89b07c4Place Bid338465042022-10-02 18:00:4517 hrs 14 mins ago0xe0a46c097c698e8b14a61b6e9690fa1821aed880 IN  0xb96697fa4a3361ba35b774a42c58daccaad1b8e10 MATIC0.008396703153 32.010000014
0xaa2761786448f9103bae35357fb3b3dd9dc5f3cdf425e7a0c44e32f4e207bfdaPlace Bid338463332022-10-02 17:54:5117 hrs 20 mins ago0xe0a46c097c698e8b14a61b6e9690fa1821aed880 IN  0xb96697fa4a3361ba35b774a42c58daccaad1b8e10 MATIC0.008722677355 32.136128988
0x729ddabcccebd17b4bed524bf96603d3b6f2b4fda506cdfa4c45f069379e035ePlace Bid338462902022-10-02 17:53:2517 hrs 22 mins ago0xe0a46c097c698e8b14a61b6e9690fa1821aed880 IN  0xb96697fa4a3361ba35b774a42c58daccaad1b8e10 MATIC0.00787554368 31.136999985
0x5a8e78f9ea4460e3d993a6b78e5e6abca694dae20e8158b8c7b0fe8b9b1d2580Place Bid338462542022-10-02 17:52:0917 hrs 23 mins ago0xe0a46c097c698e8b14a61b6e9690fa1821aed880 IN  0xb96697fa4a3361ba35b774a42c58daccaad1b8e10 MATIC0.008114859798 32.084690014
0x718c1caa740f3c0f460202a77c525fc6edc50b74d758635fc219f14958de1a77Place Bid338460412022-10-02 17:44:5117 hrs 30 mins ago0xe0a46c097c698e8b14a61b6e9690fa1821aed880 IN  0xb96697fa4a3361ba35b774a42c58daccaad1b8e10 MATIC0.007890946473 30.080573
0xdf3e2870e0a292497b46ab302be37f027d454696fd33db8a20102f303dbab1d5Place Bid338458672022-10-02 17:38:5117 hrs 36 mins ago0xe0a46c097c698e8b14a61b6e9690fa1821aed880 IN  0xb96697fa4a3361ba35b774a42c58daccaad1b8e10 MATIC0.007587600003 30.000000014
0x618f43f21f5f766965777724d242bab57541b4852acbee4505bc0cdd88abf59aPlace Bid338457352022-10-02 17:34:1917 hrs 41 mins ago0xe0a46c097c698e8b14a61b6e9690fa1821aed880 IN  0xb96697fa4a3361ba35b774a42c58daccaad1b8e10 MATIC0.007587600003 30.000000015
0x202bfd2d9879d063ec4b709c23cf5ef50bd297161bdd3d7857c46cacc5a2e8fePlace Bid338456022022-10-02 17:29:4517 hrs 45 mins ago0xe0a46c097c698e8b14a61b6e9690fa1821aed880 IN  0xb96697fa4a3361ba35b774a42c58daccaad1b8e10 MATIC0.008096353325 32.01000002
0x5831db4c571a4e9912aa3bae4c0ae1d74a37947a9eee88e710ad184c7c48c612Place Bid338455592022-10-02 17:28:1517 hrs 47 mins ago0xe0a46c097c698e8b14a61b6e9690fa1821aed880 IN  0xb96697fa4a3361ba35b774a42c58daccaad1b8e10 MATIC0.008142510003 30.000000012
0xeb81886169cfcea3ef4c9b5f5908cd5bf7fdf3dbbe017ab61f021d09c918a862Place Bid338454922022-10-02 17:25:5717 hrs 49 mins ago0xe0a46c097c698e8b14a61b6e9690fa1821aed880 IN  0xb96697fa4a3361ba35b774a42c58daccaad1b8e10 MATIC0.007587960002 30.000000011
0x591c5a10b187636e6949c3027d5c874e0e51e5364e25bf6e2a979888c571f41fPlace Bid338454512022-10-02 17:24:3517 hrs 51 mins ago0xe0a46c097c698e8b14a61b6e9690fa1821aed880 IN  0xb96697fa4a3361ba35b774a42c58daccaad1b8e10 MATIC0.007587960002 30.000000011
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ERC721Bid

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 1 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 9 : ERC721Bid.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/Address.sol";

import "../commons/Ownable.sol";
import "../commons/Pausable.sol";
import "../commons/ContextMixin.sol";
import "../commons/NativeMetaTransaction.sol";
import "./ERC721BidStorage.sol";


contract ERC721Bid is Ownable, Pausable, ERC721BidStorage, NativeMetaTransaction {
    using Address for address;

    /**
    * @dev Constructor of the contract.
    * @param _owner - owner
    * @param _feesCollector - fees collector
    * @param _manaToken - Address of the ERC20 accepted for this marketplace
    * @param _royaltiesManager - Royalties manager contract
    * @param _feesCollectorCutPerMillion - fees collector cut per million
    * @param _royaltiesCutPerMillion - royalties cut per million
    */
    constructor(
        address _owner,
        address _feesCollector,
        address _manaToken,
        IRoyaltiesManager _royaltiesManager,
        uint256 _feesCollectorCutPerMillion,
        uint256 _royaltiesCutPerMillion
    ) Pausable() {
         // EIP712 init
        _initializeEIP712('Decentraland Bid', '2');

        // Address init
        setFeesCollector(_feesCollector);
        setRoyaltiesManager(_royaltiesManager);

        // Fee init
        setFeesCollectorCutPerMillion(_feesCollectorCutPerMillion);
        setRoyaltiesCutPerMillion(_royaltiesCutPerMillion);

        manaToken = ERC20Interface(_manaToken);
        // Set owner
        transferOwnership(_owner);
    }

    /**
    * @dev Place a bid for an ERC721 token.
    * @param _tokenAddress - address of the ERC721 token
    * @param _tokenId - uint256 of the token id
    * @param _price - uint256 of the price for the bid
    * @param _duration - uint256 of the duration in seconds for the bid
    */
    function placeBid(
        address _tokenAddress,
        uint256 _tokenId,
        uint256 _price,
        uint256 _duration
    )
        public
    {
        _placeBid(
            _tokenAddress,
            _tokenId,
            _price,
            _duration,
            ""
        );
    }

    /**
    * @dev Place a bid for an ERC721 token with fingerprint.
    * @param _tokenAddress - address of the ERC721 token
    * @param _tokenId - uint256 of the token id
    * @param _price - uint256 of the price for the bid
    * @param _duration - uint256 of the duration in seconds for the bid
    * @param _fingerprint - bytes of ERC721 token fingerprint
    */
    function placeBid(
        address _tokenAddress,
        uint256 _tokenId,
        uint256 _price,
        uint256 _duration,
        bytes memory _fingerprint
    )
        public
    {
        _placeBid(
            _tokenAddress,
            _tokenId,
            _price,
            _duration,
            _fingerprint
        );
    }

    /**
    * @dev Place a bid for an ERC721 token with fingerprint.
    * @notice Tokens can have multiple bids by different users.
    * Users can have only one bid per token.
    * If the user places a bid and has an active bid for that token,
    * the older one will be replaced with the new one.
    * @param _tokenAddress - address of the ERC721 token
    * @param _tokenId - uint256 of the token id
    * @param _price - uint256 of the price for the bid
    * @param _duration - uint256 of the duration in seconds for the bid
    * @param _fingerprint - bytes of ERC721 token fingerprint
    */
    function _placeBid(
        address _tokenAddress,
        uint256 _tokenId,
        uint256 _price,
        uint256 _duration,
        bytes memory _fingerprint
    )
        private
        whenNotPaused()
    {
        _requireERC721(_tokenAddress);
        _requireComposableERC721(_tokenAddress, _tokenId, _fingerprint);
        address sender = _msgSender();

        require(_price > 0, "ERC721Bid#_placeBid: PRICE_MUST_BE_GT_0");

        _requireBidderBalance(sender, _price);

        require(
            _duration >= MIN_BID_DURATION,
            "ERC721Bid#_placeBid: DURATION_MUST_BE_GTE_MIN_BID_DURATION"
        );

        require(
            _duration <= MAX_BID_DURATION,
            "ERC721Bid#_placeBid: DURATION_MUST_BE_LTE_MAX_BID_DURATION"
        );

        ERC721Interface token = ERC721Interface(_tokenAddress);
        address tokenOwner = token.ownerOf(_tokenId);
        require(
            tokenOwner != address(0) && tokenOwner != sender,
            "ERC721Bid#_placeBid: ALREADY_OWNED_TOKEN"
        );

        uint256 expiresAt = block.timestamp + _duration;

        bytes32 bidId = keccak256(
            abi.encodePacked(
                block.timestamp,
                sender,
                _tokenAddress,
                _tokenId,
                _price,
                _duration,
                _fingerprint
            )
        );

        uint256 bidIndex;

        if (_bidderHasABid(_tokenAddress, _tokenId, sender)) {
            bytes32 oldBidId;
            (bidIndex, oldBidId,,,) = getBidByBidder(_tokenAddress, _tokenId, sender);

            // Delete old bid reference
            delete bidIndexByBidId[oldBidId];
        } else {
            // Use the bid counter to assign the index if there is not an active bid.
            bidIndex = bidCounterByToken[_tokenAddress][_tokenId];
            // Increase bid counter
            bidCounterByToken[_tokenAddress][_tokenId]++;
        }

        // Set bid references
        bidIdByTokenAndBidder[_tokenAddress][_tokenId][sender] = bidId;
        bidIndexByBidId[bidId] = bidIndex;

        // Save Bid
        bidsByToken[_tokenAddress][_tokenId][bidIndex] = Bid({
            id: bidId,
            bidder: sender,
            tokenAddress: _tokenAddress,
            tokenId: _tokenId,
            price: _price,
            expiresAt: expiresAt,
            fingerprint: _fingerprint
        });

        emit BidCreated(
            bidId,
            _tokenAddress,
            _tokenId,
            sender,
            _price,
            expiresAt,
            _fingerprint
        );
    }

    /**
    * @dev Used as the only way to accept a bid.
    * The token owner should send the token to this contract using safeTransferFrom.
    * The last parameter (bytes) should be the bid id.
    * @notice  The ERC721 smart contract calls this function on the recipient
    * after a `safetransfer`. This function MAY throw to revert and reject the
    * transfer. Return of other than the magic value MUST result in the
    * transaction being reverted.
    * Note:
    * Contract address is always the message sender.
    * This method should be seen as 'acceptBid'.
    * It validates that the bid id matches an active bid for the bid token.
    * @param _from The address which previously owned the token
    * @param _tokenId The NFT identifier which is being transferred
    * @param _data Additional data with no specified format
    * @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    */
    function onERC721Received(
        address _from,
        address /*_to*/,
        uint256 _tokenId,
        bytes memory _data
    )
        public
        whenNotPaused()
        returns (bytes4)
    {
        bytes32 bidId = _bytesToBytes32(_data);
        uint256 bidIndex = bidIndexByBidId[bidId];

        Bid memory bid = _getBid(msg.sender, _tokenId, bidIndex);

        // Check if the bid is valid.
        require(
            // solium-disable-next-line operator-whitespace
            bid.id == bidId &&
            bid.expiresAt >= block.timestamp,
            "ERC721Bid#onERC721Received: INVALID_BID"
        );

        address bidder = bid.bidder;
        uint256 price = bid.price;

        // Check fingerprint if necessary
        _requireComposableERC721(msg.sender, _tokenId, bid.fingerprint);

        // Check if bidder has funds
        _requireBidderBalance(bidder, price);

        // Delete bid references from contract storage
        delete bidsByToken[msg.sender][_tokenId][bidIndex];
        delete bidIndexByBidId[bidId];
        delete bidIdByTokenAndBidder[msg.sender][_tokenId][bidder];

        // Reset bid counter to invalidate other bids placed for the token
        delete bidCounterByToken[msg.sender][_tokenId];

        // Transfer token to bidder
        ERC721Interface(msg.sender).transferFrom(address(this), bidder, _tokenId);

        uint256 feesCollectorShareAmount;
        uint256 royaltiesShareAmount;
        address royaltiesReceiver;

        // Royalties share
        if (royaltiesCutPerMillion > 0) {
            royaltiesShareAmount = (price * royaltiesCutPerMillion) / ONE_MILLION;

            (bool success, bytes memory res) = address(royaltiesManager).staticcall(
                abi.encodeWithSelector(
                    royaltiesManager.getRoyaltiesReceiver.selector,
                    msg.sender,
                    _tokenId
                )
            );

            if (success) {
                (royaltiesReceiver) = abi.decode(res, (address));
                if (royaltiesReceiver != address(0)) {
                require(
                    manaToken.transferFrom(bidder, royaltiesReceiver, royaltiesShareAmount),
                    "ERC721Bid#onERC721Received: TRANSFER_FEES_TO_ROYALTIES_RECEIVER_FAILED"
                );
                }
            }
        }

        // Fees collector share
        {
            feesCollectorShareAmount = (price * feesCollectorCutPerMillion) / ONE_MILLION;
            uint256 totalFeeCollectorShareAmount = feesCollectorShareAmount;

            if (royaltiesShareAmount > 0 && royaltiesReceiver == address(0)) {
                totalFeeCollectorShareAmount += royaltiesShareAmount;
            }

            if (totalFeeCollectorShareAmount > 0) {
                require(
                    manaToken.transferFrom(bidder, feesCollector, totalFeeCollectorShareAmount),
                    "ERC721Bid#onERC721Received: TRANSFER_FEES_TO_FEES_COLLECTOR_FAILED"
                );
            }
        }

        // Transfer MANA from bidder to seller
        require(
            manaToken.transferFrom(bidder, _from, price - royaltiesShareAmount - feesCollectorShareAmount),
            "ERC721Bid#onERC721Received:: TRANSFER_AMOUNT_TO_TOKEN_OWNER_FAILED"
        );

        emit BidAccepted(
            bidId,
            msg.sender,
            _tokenId,
            bidder,
            _from,
            price,
            royaltiesShareAmount + feesCollectorShareAmount
        );

        return ERC721_Received;
    }

    /**
    * @dev Remove expired bids
    * @param _tokenAddresses - address[] of the ERC721 tokens
    * @param _tokenIds - uint256[] of the token ids
    * @param _bidders - address[] of the bidders
    */
    function removeExpiredBids(address[] memory _tokenAddresses, uint256[] memory _tokenIds, address[] memory _bidders)
    public
    {
        uint256 loopLength = _tokenAddresses.length;

        require(
            loopLength == _tokenIds.length && loopLength == _bidders.length ,
            "ERC721Bid#removeExpiredBids: LENGHT_MISMATCH"
        );

        for (uint256 i = 0; i < loopLength; i++) {
            _removeExpiredBid(_tokenAddresses[i], _tokenIds[i], _bidders[i]);
        }
    }

    /**
    * @dev Remove expired bid
    * @param _tokenAddress - address of the ERC721 token
    * @param _tokenId - uint256 of the token id
    * @param _bidder - address of the bidder
    */
    function _removeExpiredBid(address _tokenAddress, uint256 _tokenId, address _bidder)
    internal
    {
        (uint256 bidIndex, bytes32 bidId,,,uint256 expiresAt) = getBidByBidder(
            _tokenAddress,
            _tokenId,
            _bidder
        );

        require(expiresAt < block.timestamp, "ERC721Bid#_removeExpiredBid: BID_NOT_EXPIRED");

        _cancelBid(
            bidIndex,
            bidId,
            _tokenAddress,
            _tokenId,
            _bidder
        );
    }

    /**
    * @dev Cancel a bid for an ERC721 token
    * @param _tokenAddress - address of the ERC721 token
    * @param _tokenId - uint256 of the token id
    */
    function cancelBid(address _tokenAddress, uint256 _tokenId) public whenNotPaused() {
        address sender = _msgSender();
        // Get active bid
        (uint256 bidIndex, bytes32 bidId,,,) = getBidByBidder(
            _tokenAddress,
            _tokenId,
            sender
        );

        _cancelBid(
            bidIndex,
            bidId,
            _tokenAddress,
            _tokenId,
            sender
        );
    }

    /**
    * @dev Cancel a bid for an ERC721 token
    * @param _bidIndex - uint256 of the index of the bid
    * @param _bidId - bytes32 of the bid id
    * @param _tokenAddress - address of the ERC721 token
    * @param _tokenId - uint256 of the token id
    * @param _bidder - address of the bidder
    */
    function _cancelBid(
        uint256 _bidIndex,
        bytes32 _bidId,
        address _tokenAddress,
        uint256 _tokenId,
        address _bidder
    )
        internal
    {
        // Delete bid references
        delete bidIndexByBidId[_bidId];
        delete bidIdByTokenAndBidder[_tokenAddress][_tokenId][_bidder];

        // Check if the bid is at the end of the mapping
        uint256 lastBidIndex = bidCounterByToken[_tokenAddress][_tokenId] - 1;
        if (lastBidIndex != _bidIndex) {
            // Move last bid to the removed place
            Bid storage lastBid = bidsByToken[_tokenAddress][_tokenId][lastBidIndex];
            bidsByToken[_tokenAddress][_tokenId][_bidIndex] = lastBid;
            bidIndexByBidId[lastBid.id] = _bidIndex;
        }

        // Delete empty index
        delete bidsByToken[_tokenAddress][_tokenId][lastBidIndex];

        // Decrease bids counter
        bidCounterByToken[_tokenAddress][_tokenId]--;

        // emit BidCancelled event
        emit BidCancelled(
            _bidId,
            _tokenAddress,
            _tokenId,
            _bidder
        );
    }

     /**
    * @dev Check if the bidder has a bid for an specific token.
    * @param _tokenAddress - address of the ERC721 token
    * @param _tokenId - uint256 of the token id
    * @param _bidder - address of the bidder
    * @return bool whether the bidder has an active bid
    */
    function _bidderHasABid(address _tokenAddress, uint256 _tokenId, address _bidder)
        internal
        view
        returns (bool)
    {
        bytes32 bidId = bidIdByTokenAndBidder[_tokenAddress][_tokenId][_bidder];
        uint256 bidIndex = bidIndexByBidId[bidId];
        // Bid index should be inside bounds
        if (bidIndex < bidCounterByToken[_tokenAddress][_tokenId]) {
            Bid memory bid = bidsByToken[_tokenAddress][_tokenId][bidIndex];
            return bid.bidder == _bidder;
        }
        return false;
    }

    /**
    * @dev Get the active bid id and index by a bidder and an specific token.
    * @notice If the bidder has not a valid bid, the transaction will be reverted.
    * @param _tokenAddress - address of the ERC721 token
    * @param _tokenId - uint256 of the token id
    * @param _bidder - address of the bidder
    * @return bidIndex - uint256 of the bid index to be used within bidsByToken mapping
    * @return bidId - bytes32 of the bid id
    * @return bidder - address of the bidder address
    * @return price - uint256 of the bid price
    * @return expiresAt - uint256 of the expiration time
    */
    function getBidByBidder(address _tokenAddress, uint256 _tokenId, address _bidder)
        public
        view
        returns (
            uint256 bidIndex,
            bytes32 bidId,
            address bidder,
            uint256 price,
            uint256 expiresAt
        )
    {
        bidId = bidIdByTokenAndBidder[_tokenAddress][_tokenId][_bidder];
        bidIndex = bidIndexByBidId[bidId];
        (bidId, bidder, price, expiresAt) = getBidByToken(_tokenAddress, _tokenId, bidIndex);
        if (_bidder != bidder) {
            revert("ERC721Bid#getBidByBidder: BIDDER_HAS_NOT_ACTIVE_BIDS_FOR_TOKEN");
        }
    }

    /**
    * @dev Get an ERC721 token bid by index
    * @param _tokenAddress - address of the ERC721 token
    * @param _tokenId - uint256 of the token id
    * @param _index - uint256 of the index
    * @return bytes32 of the bid id
    * @return address of the bidder address
    * @return uint256 of the bid price
    * @return uint256 of the expiration time
    */
    function getBidByToken(address _tokenAddress, uint256 _tokenId, uint256 _index)
        public
        view
        returns (bytes32, address, uint256, uint256)
    {

        Bid memory bid = _getBid(_tokenAddress, _tokenId, _index);
        return (
            bid.id,
            bid.bidder,
            bid.price,
            bid.expiresAt
        );
    }

    /**
    * @dev Get the active bid id and index by a bidder and an specific token.
    * @notice If the index is not valid, it will revert.
    * @param _tokenAddress - address of the ERC721 token
    * @param _tokenId - uint256 of the index
    * @param _index - uint256 of the index
    * @return Bid
    */
    function _getBid(address _tokenAddress, uint256 _tokenId, uint256 _index)
        internal
        view
        returns (Bid memory)
    {
        require(_index < bidCounterByToken[_tokenAddress][_tokenId], "ERC721Bid#_getBid: INVALID_INDEX");
        return bidsByToken[_tokenAddress][_tokenId][_index];
    }

    /**
    * @dev Sets the share cut for the fees collector of the contract that's
    *  charged to the seller on a successful sale
    * @param _feesCollectorCutPerMillion - fees for the collector
    */
    function setFeesCollectorCutPerMillion(uint256 _feesCollectorCutPerMillion) public onlyOwner {
        feesCollectorCutPerMillion = _feesCollectorCutPerMillion;

        require(
            feesCollectorCutPerMillion + royaltiesCutPerMillion < 1000000,
            "ERC721Bid#setFeesCollectorCutPerMillion: TOTAL_FEES_MUST_BE_BETWEEN_0_AND_999999"
        );

        emit ChangedFeesCollectorCutPerMillion(feesCollectorCutPerMillion);
    }

    /**
    * @dev Sets the share cut for the royalties that's
    *  charged to the seller on a successful sale
    * @param _royaltiesCutPerMillion - fees for royalties
    */
    function setRoyaltiesCutPerMillion(uint256 _royaltiesCutPerMillion) public onlyOwner {
        royaltiesCutPerMillion = _royaltiesCutPerMillion;

        require(
            feesCollectorCutPerMillion + royaltiesCutPerMillion < 1000000,
            "ERC721Bid#setRoyaltiesCutPerMillion: TOTAL_FEES_MUST_BE_BETWEEN_0_AND_999999"
        );

        emit ChangedRoyaltiesCutPerMillion(royaltiesCutPerMillion);
    }

    /**
    * @notice Set the fees collector
    * @param _newFeesCollector - fees collector
    */
    function setFeesCollector(address _newFeesCollector) onlyOwner public {
        require(_newFeesCollector != address(0), "ERC721Bid#setFeesCollector: INVALID_FEES_COLLECTOR");

        emit FeesCollectorSet(feesCollector, _newFeesCollector);
        feesCollector = _newFeesCollector;
    }

    /**
    * @notice Set the royalties manager
    * @param _newRoyaltiesManager - royalties manager
    */
    function setRoyaltiesManager(IRoyaltiesManager _newRoyaltiesManager) onlyOwner public {
        require(address(_newRoyaltiesManager).isContract(), "ERC721Bid#setRoyaltiesManager: INVALID_ROYALTIES_MANAGER");


        emit RoyaltiesManagerSet(royaltiesManager, _newRoyaltiesManager);
        royaltiesManager = _newRoyaltiesManager;
    }

     /**
    * @dev Pause the contract
    */
    function pause() external onlyOwner {
        _pause();
    }

    /**
    * @dev Convert bytes to bytes32
    * @param _data - bytes
    * @return bytes32
    */
    function _bytesToBytes32(bytes memory _data) internal pure returns (bytes32) {
        require(_data.length == 32, "ERC721Bid#_bytesToBytes32: DATA_LENGHT_SHOULD_BE_32");

        bytes32 bidId;
        // solium-disable-next-line security/no-inline-assembly
        assembly {
            bidId := mload(add(_data, 0x20))
        }
        return bidId;
    }

    /**
    * @dev Check if the token has a valid ERC721 implementation
    * @param _tokenAddress - address of the token
    */
    function _requireERC721(address _tokenAddress) internal view {
        require(_tokenAddress.isContract(), "ERC721Bid#_requireERC721: ADDRESS_NOT_A_CONTRACT");

        ERC721Interface token = ERC721Interface(_tokenAddress);
        require(
            token.supportsInterface(ERC721_Interface),
            "ERC721Bid#_requireERC721: INVALID_CONTRACT_IMPLEMENTATION"
        );
    }

    /**
    * @dev Check if the token has a valid Composable ERC721 implementation
    * And its fingerprint is valid
    * @param _tokenAddress - address of the token
    * @param _tokenId - uint256 of the index
    * @param _fingerprint - bytes of the fingerprint
    */
    function _requireComposableERC721(
        address _tokenAddress,
        uint256 _tokenId,
        bytes memory _fingerprint
    )
        internal
        view
    {
        ERC721Verifiable composableToken = ERC721Verifiable(_tokenAddress);
        if (composableToken.supportsInterface(ERC721Composable_ValidateFingerprint)) {
            require(
                composableToken.verifyFingerprint(_tokenId, _fingerprint),
                "ERC721Bid#_requireComposableERC721: INVALID_FINGERPRINT"
            );
        }
    }

    /**
    * @dev Check if the bidder has balance and the contract has enough allowance
    * to use bidder MANA on his belhalf
    * @param _bidder - address of bidder
    * @param _amount - uint256 of amount
    */
    function _requireBidderBalance(address _bidder, uint256 _amount) internal view {
        require(
            manaToken.balanceOf(_bidder) >= _amount,
            "ERC721Bid#_requireBidderBalance: INSUFFICIENT_FUNDS"
        );
        require(
            manaToken.allowance(_bidder, address(this)) >= _amount,
            "ERC721Bid#_requireBidderBalance: CONTRACT_NOT_AUTHORIZED"
        );
    }
}

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

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 3 of 9 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0;

import "./ContextMixin.sol";

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

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

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

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

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

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

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

File 4 of 9 : Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0;

import "./ContextMixin.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is ContextMixin {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor () {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 5 of 9 : ContextMixin.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;


contract ContextMixin {
    function _msgSender()
        internal
        view
        returns (address sender)
    {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(
                    mload(add(array, index)),
                    0xffffffffffffffffffffffffffffffffffffffff
                )
            }
        } else {
            sender = msg.sender;
        }
        return sender;
    }
}

File 6 of 9 : NativeMetaTransaction.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;


import { EIP712Base } from "./EIP712Base.sol";

contract NativeMetaTransaction is EIP712Base {
    bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256(
        bytes(
            "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
        )
    );
    event MetaTransactionExecuted(
        address userAddress,
        address relayerAddress,
        bytes functionSignature
    );
    mapping(address => uint256) nonces;

    /*
     * Meta transaction structure.
     * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
     * He should call the desired function directly in that case.
     */
    struct MetaTransaction {
        uint256 nonce;
        address from;
        bytes functionSignature;
    }

    function executeMetaTransaction(
        address userAddress,
        bytes memory functionSignature,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) public payable returns (bytes memory) {
        MetaTransaction memory metaTx = MetaTransaction({
            nonce: nonces[userAddress],
            from: userAddress,
            functionSignature: functionSignature
        });

        require(
            verify(userAddress, metaTx, sigR, sigS, sigV),
            "NMT#executeMetaTransaction: SIGNER_AND_SIGNATURE_DO_NOT_MATCH"
        );

        // increase nonce for user (to avoid re-use)
        nonces[userAddress] = nonces[userAddress] + 1;

        emit MetaTransactionExecuted(
            userAddress,
            msg.sender,
            functionSignature
        );

        // Append userAddress and relayer address at the end to extract it from calling context
        (bool success, bytes memory returnData) = address(this).call(
            abi.encodePacked(functionSignature, userAddress)
        );
        require(success, "NMT#executeMetaTransaction: CALL_FAILED");

        return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    META_TRANSACTION_TYPEHASH,
                    metaTx.nonce,
                    metaTx.from,
                    keccak256(metaTx.functionSignature)
                )
            );
    }

    function getNonce(address user) public view returns (uint256 nonce) {
        nonce = nonces[user];
    }

    function verify(
        address signer,
        MetaTransaction memory metaTx,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        require(signer != address(0), "NMT#verify: INVALID_SIGNER");
        return
            signer ==
            ecrecover(
                toTypedMessageHash(hashMetaTransaction(metaTx)),
                sigV,
                sigR,
                sigS
            );
    }
}

File 7 of 9 : ERC721BidStorage.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../interfaces/IRoyaltiesManager.sol";


/**
 * @title Interface for contracts conforming to ERC-20
 */
interface ERC20Interface {
    function balanceOf(address from) external view returns (uint256);
    function transferFrom(address from, address to, uint tokens) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
}


/**
 * @title Interface for contracts conforming to ERC-721
 */
interface ERC721Interface {
    function ownerOf(uint256 _tokenId) external view returns (address _owner);
    function transferFrom(address _from, address _to, uint256 _tokenId) external;
    function supportsInterface(bytes4) external view returns (bool);
}


interface ERC721Verifiable is ERC721Interface {
    function verifyFingerprint(uint256, bytes memory) external view returns (bool);
}


contract ERC721BidStorage {
    // 182 days - 26 weeks - 6 months
    uint256 public constant MAX_BID_DURATION = 182 days;
    uint256 public constant MIN_BID_DURATION = 1 minutes;
    uint256 public constant ONE_MILLION = 1000000;
    bytes4 public constant ERC721_Interface = 0x80ac58cd;
    bytes4 public constant ERC721_Received = 0x150b7a02;
    bytes4 public constant ERC721Composable_ValidateFingerprint = 0x8f9f4b63;

    struct Bid {
        // Bid Id
        bytes32 id;
        // Bidder address
        address bidder;
        // ERC721 address
        address tokenAddress;
        // ERC721 token id
        uint256 tokenId;
        // Price for the bid in wei
        uint256 price;
        // Time when this bid ends
        uint256 expiresAt;
        // Fingerprint for composable
        bytes fingerprint;
    }

    // MANA token
    ERC20Interface public manaToken;

    // Bid by token address => token id => bid index => bid
    mapping(address => mapping(uint256 => mapping(uint256 => Bid))) internal bidsByToken;
    // Bid count by token address => token id => bid counts
    mapping(address => mapping(uint256 => uint256)) public bidCounterByToken;
    // Index of the bid at bidsByToken mapping by bid id => bid index
    mapping(bytes32 => uint256) public bidIndexByBidId;
    // Bid id by token address => token id => bidder address => bidId
    mapping(address => mapping(uint256 => mapping(address => bytes32))) public bidIdByTokenAndBidder;


    address public feesCollector;
    IRoyaltiesManager public royaltiesManager;

    uint256 public feesCollectorCutPerMillion;
    uint256 public royaltiesCutPerMillion;

    // EVENTS
    event BidCreated(
      bytes32 _id,
      address indexed _tokenAddress,
      uint256 indexed _tokenId,
      address indexed _bidder,
      uint256 _price,
      uint256 _expiresAt,
      bytes _fingerprint
    );

    event BidAccepted(
      bytes32 _id,
      address indexed _tokenAddress,
      uint256 indexed _tokenId,
      address _bidder,
      address indexed _seller,
      uint256 _price,
      uint256 _fee
    );

    event BidCancelled(
      bytes32 _id,
      address indexed _tokenAddress,
      uint256 indexed _tokenId,
      address indexed _bidder
    );

    event ChangedFeesCollectorCutPerMillion(uint256 _feesCollectorCutPerMillion);
    event ChangedRoyaltiesCutPerMillion(uint256 _royaltiesCutPerMillion);
    event FeesCollectorSet(address indexed _oldFeesCollector, address indexed _newFeesCollector);
    event RoyaltiesManagerSet(IRoyaltiesManager indexed _oldRoyaltiesManager, IRoyaltiesManager indexed _newRoyaltiesManager);
}

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

pragma solidity ^0.8.0;


contract EIP712Base {
    struct EIP712Domain {
        string name;
        string version;
        address verifyingContract;
        bytes32 salt;
    }

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(
        bytes(
            "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
        )
    );
    bytes32 public domainSeparator;

    // supposed to be called once while initializing.
    // one of the contractsa that inherits this contract follows proxy pattern
    // so it is not possible to do this in a constructor
    function _initializeEIP712(
        string memory name,
        string memory version
    )
        internal
    {
        domainSeparator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes(version)),
                address(this),
                bytes32(getChainId())
            )
        );
    }

    function getChainId() public view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }

    /**
     * Accept message hash and returns hash message in EIP712 compatible form
     * So that it can be used to recover signer from signature signed using EIP712 formatted data
     * https://eips.ethereum.org/EIPS/eip-712
     * "\\x19" makes the encoding deterministic
     * "\\x01" is the version byte to make it compatible to EIP-191
     */
    function toTypedMessageHash(bytes32 messageHash)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", domainSeparator, messageHash)
            );
    }
}

File 9 of 9 : IRoyaltiesManager.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IRoyaltiesManager {
  function getRoyaltiesReceiver(address _contractAddress, uint256 _tokenId) external view returns (address);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_feesCollector","type":"address"},{"internalType":"address","name":"_manaToken","type":"address"},{"internalType":"contract IRoyaltiesManager","name":"_royaltiesManager","type":"address"},{"internalType":"uint256","name":"_feesCollectorCutPerMillion","type":"uint256"},{"internalType":"uint256","name":"_royaltiesCutPerMillion","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_id","type":"bytes32"},{"indexed":true,"internalType":"address","name":"_tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_bidder","type":"address"},{"indexed":true,"internalType":"address","name":"_seller","type":"address"},{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"BidAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_id","type":"bytes32"},{"indexed":true,"internalType":"address","name":"_tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"_bidder","type":"address"}],"name":"BidCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_id","type":"bytes32"},{"indexed":true,"internalType":"address","name":"_tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"_bidder","type":"address"},{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_expiresAt","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"_fingerprint","type":"bytes"}],"name":"BidCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_feesCollectorCutPerMillion","type":"uint256"}],"name":"ChangedFeesCollectorCutPerMillion","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_royaltiesCutPerMillion","type":"uint256"}],"name":"ChangedRoyaltiesCutPerMillion","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_oldFeesCollector","type":"address"},{"indexed":true,"internalType":"address","name":"_newFeesCollector","type":"address"}],"name":"FeesCollectorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","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":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IRoyaltiesManager","name":"_oldRoyaltiesManager","type":"address"},{"indexed":true,"internalType":"contract IRoyaltiesManager","name":"_newRoyaltiesManager","type":"address"}],"name":"RoyaltiesManagerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"ERC721Composable_ValidateFingerprint","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERC721_Interface","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERC721_Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_BID_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_BID_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ONE_MILLION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"bidCounterByToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"bidIdByTokenAndBidder","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"bidIndexByBidId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"cancelBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"feesCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feesCollectorCutPerMillion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_bidder","type":"address"}],"name":"getBidByBidder","outputs":[{"internalType":"uint256","name":"bidIndex","type":"uint256"},{"internalType":"bytes32","name":"bidId","type":"bytes32"},{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"expiresAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getBidByToken","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manaToken","outputs":[{"internalType":"contract ERC20Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","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":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"placeBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"},{"internalType":"bytes","name":"_fingerprint","type":"bytes"}],"name":"placeBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokenAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"address[]","name":"_bidders","type":"address[]"}],"name":"removeExpiredBids","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltiesCutPerMillion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltiesManager","outputs":[{"internalType":"contract IRoyaltiesManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newFeesCollector","type":"address"}],"name":"setFeesCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feesCollectorCutPerMillion","type":"uint256"}],"name":"setFeesCollectorCutPerMillion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_royaltiesCutPerMillion","type":"uint256"}],"name":"setRoyaltiesCutPerMillion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IRoyaltiesManager","name":"_newRoyaltiesManager","type":"address"}],"name":"setRoyaltiesManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040516200402c3803806200402c8339810160408190526200003491620005fa565b6000620000406200012e565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350916000805160206200400c833981519152908290a3506000805460ff60a01b19169055604080518082018252601081526f111958d95b9d1c985b185b9908109a5960821b602080830191909152825180840190935260018352601960f91b90830152620000d0916200018d565b620000db8562000204565b620000e683620002d8565b620000f182620003b8565b620000fc8162000475565b600180546001600160a01b0319166001600160a01b038616179055620001228662000528565b505050505050620008fa565b6000333014156200018757600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506200018a9050565b50335b90565b6040518060800160405280604f815260200162003fbd604f9139805190602001208280519060200120828051906020012030620001cf620005e160201b60201c565b604051620001e595949392919060200162000675565b60408051601f198184030181529190528051602090910120600a555050565b6200020e6200012e565b6001600160a01b031662000221620005e5565b6001600160a01b031614620002535760405162461bcd60e51b81526004016200024a9062000796565b60405180910390fd5b6001600160a01b0381166200027c5760405162461bcd60e51b81526004016200024a90620006e7565b6006546040516001600160a01b038084169216907f58283f7e46512bbcb30558fa508283f23fac7be18fb20bfdf6d4bbf83c529d5390600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b620002e26200012e565b6001600160a01b0316620002f5620005e5565b6001600160a01b0316146200031e5760405162461bcd60e51b81526004016200024a9062000796565b6200033d816001600160a01b0316620005f460201b620013ea1760201c565b6200035c5760405162461bcd60e51b81526004016200024a9062000739565b6007546040516001600160a01b038084169216907f7af757e60ce7c97cfab72d633ae4d05ffe9be9afbba020aa2f484a600db8df6d90600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b620003c26200012e565b6001600160a01b0316620003d5620005e5565b6001600160a01b031614620003fe5760405162461bcd60e51b81526004016200024a9062000796565b6008819055600954620f424090620004179083620008bc565b10620004375760405162461bcd60e51b81526004016200024a906200083d565b7fd33ed052f0041ea5512df480eb51801acb8fec4a7e89c6086fdd5caaa650981e6008546040516200046a9190620008b3565b60405180910390a150565b6200047f6200012e565b6001600160a01b031662000492620005e5565b6001600160a01b031614620004bb5760405162461bcd60e51b81526004016200024a9062000796565b6009819055600854620f424090620004d5908390620008bc565b10620004f55760405162461bcd60e51b81526004016200024a90620007cb565b7fba54fecf3e91476de2d7bd3248ee80a9060cddc82a6ac0933b232e051eafdaf36009546040516200046a9190620008b3565b620005326200012e565b6001600160a01b031662000545620005e5565b6001600160a01b0316146200056e5760405162461bcd60e51b81526004016200024a9062000796565b6001600160a01b038116620005975760405162461bcd60e51b81526004016200024a90620006a1565b600080546040516001600160a01b03808516939216916000805160206200400c83398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b4690565b6000546001600160a01b031690565b3b151590565b60008060008060008060c0878903121562000613578182fd5b86516200062081620008e1565b60208801519096506200063381620008e1565b60408801519095506200064681620008e1565b60608801519094506200065981620008e1565b809350506080870151915060a087015190509295509295509295565b948552602085019390935260408401919091526001600160a01b03166060830152608082015260a00190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526032908201527f4552433732314269642373657446656573436f6c6c6563746f723a20494e56416040820152712624a22fa322a2a9afa1a7a62622a1aa27a960711b606082015260800190565b60208082526038908201527f45524337323142696423736574526f79616c746965734d616e616765723a204960408201527f4e56414c49445f524f59414c544945535f4d414e414745520000000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252604c908201527f45524337323142696423736574526f79616c746965734375745065724d696c6c60408201527f696f6e3a20544f54414c5f464545535f4d5553545f42455f4245545745454e5f60608201526b305f414e445f39393939393960a01b608082015260a00190565b60208082526050908201527f4552433732314269642373657446656573436f6c6c6563746f7243757450657260408201527f4d696c6c696f6e3a20544f54414c5f464545535f4d5553545f42455f4245545760608201526f45454e5f305f414e445f39393939393960801b608082015260a00190565b90815260200190565b60008219821115620008dc57634e487b7160e01b81526011600452602481fd5b500190565b6001600160a01b0381168114620008f757600080fd5b50565b6136b3806200090a6000396000f3fe6080604052600436106101885760003560e01c8062f052f61461018d5780630c53c51c146101c757806312712f7c146101e7578063150b7a0214610209578063279dc1e41461022957806328bd196a146102565780632b4c32be146102765780632d0335ab1461028b5780633408e470146102ab578063373071f2146102c057806339b6b1e5146102e257806342a6c4dd1461030257806348f4e32b146103325780634c81a727146103475780635c975abb1461035c578063688f09da1461037e578063715018a61461039e57806374c97c99146103b357806381281be8146103d55780638456cb59146103f55780638780dfcf1461040a5780638da5cb5b1461042a57806393dc06e11461043f578063967b00491461045f5780639869b736146104745780639cf160f614610489578063a750066e1461049e578063ac063725146104b3578063b5eea644146104d3578063ce1056cb146104f3578063ce2243b414610513578063f2fde38b14610528578063f698da2514610548578063f88a12171461055d575b600080fd5b34801561019957600080fd5b506101ad6101a83660046126a5565b610572565b6040516101be9594939291906133d9565b60405180910390f35b6101da6101d5366004612600565b610606565b6040516101be9190612b35565b3480156101f357600080fd5b506101fc610786565b6040516101be9190612b20565b34801561021557600080fd5b506101fc610224366004612597565b610791565b34801561023557600080fd5b506102496102443660046126a5565b610d1a565b6040516101be9190612a82565b34801561026257600080fd5b5061024961027136600461267a565b610d3d565b34801561028257600080fd5b506101fc610d5a565b34801561029757600080fd5b506102496102a636600461255f565b610d65565b3480156102b757600080fd5b50610249610d80565b3480156102cc57600080fd5b506102e06102db36600461255f565b610d85565b005b3480156102ee57600080fd5b506102e06102fd36600461267a565b610e46565b34801561030e57600080fd5b5061032261031d3660046126e6565b610ea0565b6040516101be9493929190612a8b565b34801561033e57600080fd5b50610249610ed7565b34801561035357600080fd5b506101fc610edd565b34801561036857600080fd5b50610371610ee8565b6040516101be9190612a77565b34801561038a57600080fd5b506102e061039936600461255f565b610ef8565b3480156103aa57600080fd5b506102e0610fc1565b3480156103bf57600080fd5b506103c8611038565b6040516101be91906129d7565b3480156103e157600080fd5b506102e06103f036600461271a565b611047565b34801561040157600080fd5b506102e0611069565b34801561041657600080fd5b506102e06104253660046128b6565b6110b2565b34801561043657600080fd5b506103c8611161565b34801561044b57600080fd5b506102e061045a3660046128b6565b611170565b34801561046b57600080fd5b506103c8611215565b34801561048057600080fd5b50610249611224565b34801561049557600080fd5b506103c861122b565b3480156104aa57600080fd5b5061024961123a565b3480156104bf57600080fd5b506102e06104ce366004612754565b611241565b3480156104df57600080fd5b506102496104ee3660046128b6565b61124e565b3480156104ff57600080fd5b506102e061050e3660046127be565b611260565b34801561051f57600080fd5b5061024961132b565b34801561053457600080fd5b506102e061054336600461255f565b611331565b34801561055457600080fd5b506102496113df565b34801561056957600080fd5b506102496113e5565b6001600160a01b0380841660009081526005602090815260408083208684528252808320938516835292815282822054808352600490915291812054919080806105bd888887610ea0565b929650909450925090506001600160a01b03868116908416146105fb5760405162461bcd60e51b81526004016105f290613061565b60405180910390fd5b939792965093509350565b60408051606081810183526001600160a01b0388166000818152600b60209081529085902054845283015291810186905261064487828787876113f0565b6106605760405162461bcd60e51b81526004016105f290612d2e565b6001600160a01b0387166000908152600b6020526040902054610684906001613472565b6001600160a01b0388166000908152600b60205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b906106d490899033908a90612a05565b60405180910390a1600080306001600160a01b0316888a6040516020016106fc92919061292e565b60408051601f198184030181529082905261071691612912565b6000604051808303816000865af19150503d8060008114610753576040519150601f19603f3d011682016040523d82523d6000602084013e610758565b606091505b50915091508161077a5760405162461bcd60e51b81526004016105f290612efc565b98975050505050505050565b638f9f4b6360e01b81565b600061079b610ee8565b156107b85760405162461bcd60e51b81526004016105f290612e4a565b60006107c383611496565b6000818152600460205260408120549192506107e03387846114c1565b8051909150831480156107f75750428160a0015110155b6108135760405162461bcd60e51b81526004016105f2906132be565b6020810151608082015160c083015161082f9033908a9061161f565b6108398282611743565b3360009081526002602081815260408084208c8552825280842088855290915282208281556001810180546001600160a01b03199081169091559181018054909216909155600381018290556004810182905560058101829055906108a160068301826122db565b5050600085815260046020818152604080842084905533808552600583528185208d865283528185206001600160a01b03881686528352818520859055808552600383528185208d86529092528084209390935591516323b872dd60e01b81526323b872dd9161091791309187918e9101612a3a565b600060405180830381600087803b15801561093157600080fd5b505af1158015610945573d6000803e3d6000fd5b505050506000806000806009541115610b0657620f42406009548561096a91906134aa565b610974919061348a565b9150600080600760009054906101000a90046001600160a01b03166001600160a01b031663cca1d0b760e01b338f6040516024016109b3929190612a5e565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516109f19190612912565b600060405180830381855afa9150503d8060008114610a2c576040519150601f19603f3d011682016040523d82523d6000602084013e610a31565b606091505b50915091508115610b035780806020019051810190610a50919061257b565b92506001600160a01b03831615610b03576001546040516323b872dd60e01b81526001600160a01b03909116906323b872dd90610a95908a9087908990600401612a3a565b602060405180830381600087803b158015610aaf57600080fd5b505af1158015610ac3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae79190612896565b610b035760405162461bcd60e51b81526004016105f290612b48565b50505b620f424060085485610b1891906134aa565b610b22919061348a565b9250828215801590610b3b57506001600160a01b038216155b15610b4d57610b4a8382613472565b90505b8015610bfa576001546006546040516323b872dd60e01b81526001600160a01b03928316926323b872dd92610b8c928b92909116908690600401612a3a565b602060405180830381600087803b158015610ba657600080fd5b505af1158015610bba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bde9190612896565b610bfa5760405162461bcd60e51b81526004016105f290612cd8565b506001546001600160a01b03166323b872dd868f86610c19878a6134c9565b610c2391906134c9565b6040518463ffffffff1660e01b8152600401610c4193929190612a3a565b602060405180830381600087803b158015610c5b57600080fd5b505af1158015610c6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c939190612896565b610caf5760405162461bcd60e51b81526004016105f290612d8b565b6001600160a01b038d168b337f4e5ca6c6c06fa8d62f2930830e0d370de70f108bd89213de0b51141775e695bd8b8989610ce98a8a613472565b604051610cf99493929190612a8b565b60405180910390a450630a85bd0160e11b9c9b505050505050505050505050565b600560209081526000938452604080852082529284528284209052825290205481565b600360209081526000928352604080842090915290825290205481565b6380ac58cd60e01b81565b6001600160a01b03166000908152600b602052604090205490565b465b90565b610d8d611885565b6001600160a01b0316610d9e611161565b6001600160a01b031614610dc45760405162461bcd60e51b81526004016105f290612f9c565b6001600160a01b038116610dea5760405162461bcd60e51b81526004016105f290612c2e565b6006546040516001600160a01b038084169216907f58283f7e46512bbcb30558fa508283f23fac7be18fb20bfdf6d4bbf83c529d5390600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b610e4e610ee8565b15610e6b5760405162461bcd60e51b81526004016105f290612e4a565b6000610e75611885565b9050600080610e85858585610572565b50505091509150610e9982828787876118e1565b5050505050565b6000806000806000610eb38888886114c1565b80516020820151608083015160a090930151919b909a509198509650945050505050565b60085481565b630a85bd0160e11b81565b600054600160a01b900460ff1690565b610f00611885565b6001600160a01b0316610f11611161565b6001600160a01b031614610f375760405162461bcd60e51b81526004016105f290612f9c565b610f49816001600160a01b03166113ea565b610f655760405162461bcd60e51b81526004016105f290612c80565b6007546040516001600160a01b038084169216907f7af757e60ce7c97cfab72d633ae4d05ffe9be9afbba020aa2f484a600db8df6d90600090a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b610fc9611885565b6001600160a01b0316610fda611161565b6001600160a01b0316146110005760405162461bcd60e51b81526004016105f290612f9c565b600080546040516001600160a01b039091169060008051602061361e833981519152908390a3600080546001600160a01b0319169055565b6001546001600160a01b031681565b6110638484848460405180602001604052806000815250611b05565b50505050565b611071611885565b6001600160a01b0316611082611161565b6001600160a01b0316146110a85760405162461bcd60e51b81526004016105f290612f9c565b6110b0611f3c565b565b6110ba611885565b6001600160a01b03166110cb611161565b6001600160a01b0316146110f15760405162461bcd60e51b81526004016105f290612f9c565b6008819055600954620f4240906111089083613472565b106111255760405162461bcd60e51b81526004016105f290613248565b7fd33ed052f0041ea5512df480eb51801acb8fec4a7e89c6086fdd5caaa650981e6008546040516111569190612a82565b60405180910390a150565b6000546001600160a01b031690565b611178611885565b6001600160a01b0316611189611161565b6001600160a01b0316146111af5760405162461bcd60e51b81526004016105f290612f9c565b6009819055600854620f4240906111c7908390613472565b106111e45760405162461bcd60e51b81526004016105f2906131d6565b7fba54fecf3e91476de2d7bd3248ee80a9060cddc82a6ac0933b232e051eafdaf36009546040516111569190612a82565b6007546001600160a01b031681565b620f424081565b6006546001600160a01b031681565b62eff10081565b610e998585858585611b05565b60046020526000908152604090205481565b82518251811480156112725750815181145b61128e5760405162461bcd60e51b81526004016105f2906130be565b60005b81811015610e99576113198582815181106112bc57634e487b7160e01b600052603260045260246000fd5b60200260200101518583815181106112e457634e487b7160e01b600052603260045260246000fd5b602002602001015185848151811061130c57634e487b7160e01b600052603260045260246000fd5b6020026020010151611fb4565b806113238161355e565b915050611291565b60095481565b611339611885565b6001600160a01b031661134a611161565b6001600160a01b0316146113705760405162461bcd60e51b81526004016105f290612f9c565b6001600160a01b0381166113965760405162461bcd60e51b81526004016105f290612ba2565b600080546040516001600160a01b038085169392169160008051602061361e83398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600a5481565b603c81565b3b151590565b60006001600160a01b0386166114185760405162461bcd60e51b81526004016105f29061310a565b600161142b61142687612000565b61205e565b8386866040516000815260200160405260405161144b9493929190612b02565b6020604051602081039080840390855afa15801561146d573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b600081516020146114b95760405162461bcd60e51b81526004016105f290612ea9565b506020015190565b6114c961231a565b6001600160a01b0384166000908152600360209081526040808320868452909152902054821061150b5760405162461bcd60e51b81526004016105f290612e74565b6001600160a01b0380851660009081526002602081815260408084208885528252808420878552825292839020835160e08101855281548152600182015486169281019290925291820154909316918301919091526003810154606083015260048101546080830152600581015460a083015260068101805460c08401919061159390613523565b80601f01602080910402602001604051908101604052809291908181526020018280546115bf90613523565b801561160c5780601f106115e15761010080835404028352916020019161160c565b820191906000526020600020905b8154815290600101906020018083116115ef57829003601f168201915b50505050508152505090505b9392505050565b6040516301ffc9a760e01b815283906001600160a01b038216906301ffc9a79061165490638f9f4b6360e01b90600401612b20565b60206040518083038186803b15801561166c57600080fd5b505afa158015611680573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a49190612896565b1561106357604051638f9f4b6360e01b81526001600160a01b03821690638f9f4b63906116d79086908690600401613405565b60206040518083038186803b1580156116ef57600080fd5b505afa158015611703573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117279190612896565b6110635760405162461bcd60e51b81526004016105f290612df3565b6001546040516370a0823160e01b815282916001600160a01b0316906370a08231906117739086906004016129d7565b60206040518083038186803b15801561178b57600080fd5b505afa15801561179f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c391906128ce565b10156117e15760405162461bcd60e51b81526004016105f29061334c565b600154604051636eb1769f60e11b815282916001600160a01b03169063dd62ed3e9061181390869030906004016129eb565b60206040518083038186803b15801561182b57600080fd5b505afa15801561183f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186391906128ce565b10156118815760405162461bcd60e51b81526004016105f290612be8565b5050565b6000333014156118dc57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150610d829050565b503390565b60008481526004602090815260408083208390556001600160a01b03808716808552600584528285208786528452828520918616855290835281842084905583526003825280832085845290915281205461193e906001906134c9565b9050858114611a0a576001600160a01b03848116600090815260026020818152604080842088855282528084208685529091528083208a845292208254815560018084015490820180549186166001600160a01b03199283161790558383015492820180549390951692169190911790925560038082015490830155600480820154908301556005808201549083015560068082018054929384939092830191906119e890613523565b6119f392919061236c565b505090546000908152600460205260409020879055505b6001600160a01b0384166000908152600260208181526040808420878552825280842085855290915282208281556001810180546001600160a01b0319908116909155918101805490921690915560038101829055600481018290556005810182905590611a7b60068301826122db565b50506001600160a01b03841660009081526003602090815260408083208684529091528120805491611aac8361350c565b9190505550816001600160a01b031683856001600160a01b03167fc43098075c34b8b92567bd49f08f55e397ebf82dd82072e3eb1be525c4506f5f88604051611af59190612a82565b60405180910390a4505050505050565b611b0d610ee8565b15611b2a5760405162461bcd60e51b81526004016105f290612e4a565b611b3385612075565b611b3e85858361161f565b6000611b48611885565b905060008411611b6a5760405162461bcd60e51b81526004016105f290613305565b611b748185611743565b603c831015611b955760405162461bcd60e51b81526004016105f29061313e565b62eff100831115611bb85760405162461bcd60e51b81526004016105f290612fd1565b6040516331a9108f60e11b815286906000906001600160a01b03831690636352211e90611be9908a90600401612a82565b60206040518083038186803b158015611c0157600080fd5b505afa158015611c15573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c39919061257b565b90506001600160a01b03811615801590611c655750826001600160a01b0316816001600160a01b031614155b611c815760405162461bcd60e51b81526004016105f290613019565b6000611c8d8642613472565b9050600042858b8b8b8b8b604051602001611cae979695949392919061297b565b6040516020818303038152906040528051906020012090506000611cd38b8b88612144565b15611d00576000611ce58c8c89610572565b5050506000908152600460205260408120559150611d399050565b506001600160a01b038a1660009081526003602090815260408083208c84529091528120805491829190611d338361355e565b91905055505b81600560008d6001600160a01b03166001600160a01b0316815260200190815260200160002060008c81526020019081526020016000206000886001600160a01b03166001600160a01b03168152602001908152602001600020819055508060046000848152602001908152602001600020819055506040518060e00160405280838152602001876001600160a01b031681526020018c6001600160a01b031681526020018b81526020018a815260200184815260200188815250600260008d6001600160a01b03166001600160a01b0316815260200190815260200160002060008c815260200190815260200160002060008381526020019081526020016000206000820151816000015560208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550606082015181600301556080820151816004015560a0820151816005015560c0820151816006019080519060200190611ed99291906123f7565b50905050856001600160a01b03168a8c6001600160a01b03167fe45b7709f1eed66d6e28f43b32f2003da0f0c40b92f75a8994370516e048620f858d888d604051611f279493929190612ad3565b60405180910390a45050505050505050505050565b611f44610ee8565b15611f615760405162461bcd60e51b81526004016105f290612e4a565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f9d611885565b604051611faa91906129d7565b60405180910390a1565b6000806000611fc4868686610572565b9450505092509250428110611feb5760405162461bcd60e51b81526004016105f29061338d565b611ff883838888886118e1565b505050505050565b60006040518060800160405280604381526020016135db60439139805160209182012083518483015160408087015180519086012090516120419501612aaf565b604051602081830303815290604052805190602001209050919050565b6000600a5482604051602001612041929190612960565b612087816001600160a01b03166113ea565b6120a35760405162461bcd60e51b81526004016105f290613186565b6040516301ffc9a760e01b815281906001600160a01b038216906301ffc9a7906120d8906380ac58cd60e01b90600401612b20565b60206040518083038186803b1580156120f057600080fd5b505afa158015612104573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121289190612896565b6118815760405162461bcd60e51b81526004016105f290612f43565b6001600160a01b038084166000818152600560209081526040808320878452825280832094861683529381528382205480835260048252848320549383526003825284832087845290915292812054909291908110156122cf576001600160a01b0380871660009081526002602081815260408084208a855282528084208685528252808420815160e08101835281548152600182015487169381019390935292830154909416938101939093526003810154606084015260048101546080840152600581015460a084015260068101805492939260c08401919061222890613523565b80601f016020809104026020016040519081016040528092919081815260200182805461225490613523565b80156122a15780601f10612276576101008083540402835291602001916122a1565b820191906000526020600020905b81548152906001019060200180831161228457829003601f168201915b5050505050815250509050846001600160a01b031681602001516001600160a01b0316149350505050611618565b50600095945050505050565b5080546122e790613523565b6000825580601f106122f95750612317565b601f016020900490600052602060002090810190612317919061246b565b50565b6040518060e001604052806000801916815260200160006001600160a01b0316815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001606081525090565b82805461237890613523565b90600052602060002090601f01602090048101928261239a57600085556123e7565b82601f106123ab57805485556123e7565b828001600101855582156123e757600052602060002091601f016020900482015b828111156123e75782548255916001019190600101906123cc565b506123f392915061246b565b5090565b82805461240390613523565b90600052602060002090601f01602090048101928261242557600085556123e7565b82601f1061243e57805160ff19168380011785556123e7565b828001600101855582156123e7579182015b828111156123e7578251825591602001919060010190612450565b5b808211156123f3576000815560010161246c565b600082601f830112612490578081fd5b813560206124a56124a08361344f565b613426565b82815281810190858301838502870184018810156124c1578586fd5b855b858110156124e85781356124d6816135a5565b845292840192908401906001016124c3565b5090979650505050505050565b600082601f830112612505578081fd5b81356001600160401b0381111561251e5761251e61358f565b612531601f8201601f1916602001613426565b818152846020838601011115612545578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215612570578081fd5b8135611618816135a5565b60006020828403121561258c578081fd5b8151611618816135a5565b600080600080608085870312156125ac578283fd5b84356125b7816135a5565b935060208501356125c7816135a5565b92506040850135915060608501356001600160401b038111156125e8578182fd5b6125f4878288016124f5565b91505092959194509250565b600080600080600060a08688031215612617578081fd5b8535612622816135a5565b945060208601356001600160401b0381111561263c578182fd5b612648888289016124f5565b9450506040860135925060608601359150608086013560ff8116811461266c578182fd5b809150509295509295909350565b6000806040838503121561268c578182fd5b8235612697816135a5565b946020939093013593505050565b6000806000606084860312156126b9578283fd5b83356126c4816135a5565b92506020840135915060408401356126db816135a5565b809150509250925092565b6000806000606084860312156126fa578283fd5b8335612705816135a5565b95602085013595506040909401359392505050565b6000806000806080858703121561272f578182fd5b843561273a816135a5565b966020860135965060408601359560600135945092505050565b600080600080600060a0868803121561276b578283fd5b8535612776816135a5565b945060208601359350604086013592506060860135915060808601356001600160401b038111156127a5578182fd5b6127b1888289016124f5565b9150509295509295909350565b6000806000606084860312156127d2578081fd5b83356001600160401b03808211156127e8578283fd5b6127f487838801612480565b945060209150818601358181111561280a578384fd5b8601601f8101881361281a578384fd5b80356128286124a08261344f565b81815284810190838601868402850187018c1015612844578788fd5b8794505b83851015612866578035835260019490940193918601918601612848565b509650505050604086013591508082111561287f578283fd5b5061288c86828701612480565b9150509250925092565b6000602082840312156128a7578081fd5b81518015158114611618578182fd5b6000602082840312156128c7578081fd5b5035919050565b6000602082840312156128df578081fd5b5051919050565b600081518084526128fe8160208601602086016134e0565b601f01601f19169290920160200192915050565b600082516129248184602087016134e0565b9190910192915050565b600083516129408184602088016134e0565b60609390931b6001600160601b0319169190920190815260140192915050565b61190160f01b81526002810192909252602282015260420190565b600088825260018060601b0319808960601b166020840152808860601b1660348401525085604883015284606883015283608883015282516129c48160a88501602087016134e0565b9190910160a80198975050505050505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03848116825283166020820152606060408201819052600090612a31908301846128e6565b95945050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b90815260200190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b93845260208401929092526001600160a01b03166040830152606082015260800190565b600085825284602083015283604083015260806060830152612af860808301846128e6565b9695505050505050565b93845260ff9290921660208401526040830152606082015260800190565b6001600160e01b031991909116815260200190565b60006020825261161860208301846128e6565b602080825260469082015260008051602061365e83398151915260408201527f534645525f464545535f544f5f524f59414c544945535f52454345495645525f60608201526511905253115160d21b608082015260a00190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526038908201526000805160206135bb8339815191526040820152770810d3d395149050d517d393d517d055551213d49256915160421b606082015260800190565b60208082526032908201527f4552433732314269642373657446656573436f6c6c6563746f723a20494e56416040820152712624a22fa322a2a9afa1a7a62622a1aa27a960711b606082015260800190565b60208082526038908201527f45524337323142696423736574526f79616c746965734d616e616765723a2049604082015277272b20a624a22fa927aca0a62a24a2a9afa6a0a720a3a2a960411b606082015260800190565b602080825260429082015260008051602061365e83398151915260408201527f534645525f464545535f544f5f464545535f434f4c4c4543544f525f4641494c606082015261115160f21b608082015260a00190565b6020808252603d908201527f4e4d5423657865637574654d6574615472616e73616374696f6e3a205349474e60408201527f45525f414e445f5349474e41545552455f444f5f4e4f545f4d41544348000000606082015260800190565b60208082526042908201527f455243373231426964236f6e45524337323152656365697665643a3a2054524160408201527f4e534645525f414d4f554e545f544f5f544f4b454e5f4f574e45525f4641494c606082015261115160f21b608082015260a00190565b60208082526037908201527f455243373231426964235f72657175697265436f6d706f7361626c65455243376040820152760c8c4e881253959053125117d1925391d1549414925395604a1b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252818101527f455243373231426964235f6765744269643a20494e56414c49445f494e444558604082015260600190565b60208082526033908201527f455243373231426964235f6279746573546f427974657333323a20444154415f6040820152722622a723a42a2fa9a427aaa6222fa122af999960691b606082015260800190565b60208082526027908201527f4e4d5423657865637574654d6574615472616e73616374696f6e3a2043414c4c60408201526617d1905253115160ca1b606082015260800190565b60208082526039908201527f455243373231426964235f726571756972654552433732313a20494e56414c49604082015278222fa1a7a72a2920a1aa2fa4a6a82622a6a2a72a20aa24a7a760391b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252603a9082015260008051602061363e83398151915260408201527929aa2fa122afa62a22afa6a0ac2fa124a22fa22aa920aa24a7a760311b606082015260800190565b60208082526028908201527f455243373231426964235f706c6163654269643a20414c52454144595f4f574e60408201526722a22faa27a5a2a760c11b606082015260800190565b6020808252603e908201527f4552433732314269642367657442696442794269646465723a2042494444455260408201527f5f4841535f4e4f545f4143544956455f424944535f464f525f544f4b454e0000606082015260800190565b6020808252602c908201527f4552433732314269642372656d6f766545787069726564426964733a204c454e60408201526b08e90a8be9a92a69a82a886960a31b606082015260800190565b6020808252601a90820152792726aa11bb32b934b33c9d1024a72b20a624a22fa9a4a3a722a960311b604082015260600190565b6020808252603a9082015260008051602061363e83398151915260408201527929aa2fa122afa3aa22afa6a4a72fa124a22fa22aa920aa24a7a760311b606082015260800190565b60208082526030908201527f455243373231426964235f726571756972654552433732313a2041444452455360408201526f14d7d393d517d057d0d3d395149050d560821b606082015260800190565b6020808252604c908201527f45524337323142696423736574526f79616c746965734375745065724d696c6c60408201527f696f6e3a20544f54414c5f464545535f4d5553545f42455f4245545745454e5f60608201526b305f414e445f39393939393960a01b608082015260a00190565b60208082526050908201527f4552433732314269642373657446656573436f6c6c6563746f7243757450657260408201527f4d696c6c696f6e3a20544f54414c5f464545535f4d5553545f42455f4245545760608201526f45454e5f305f414e445f39393939393960801b608082015260a00190565b60208082526027908201527f455243373231426964236f6e45524337323152656365697665643a20494e564160408201526613125117d0925160ca1b606082015260800190565b60208082526027908201527f455243373231426964235f706c6163654269643a2050524943455f4d5553545f604082015266042455f47545f360cc1b606082015260800190565b60208082526033908201526000805160206135bb83398151915260408201527220494e53554646494349454e545f46554e445360681b606082015260800190565b6020808252602c908201527f455243373231426964235f72656d6f7665457870697265644269643a2042494460408201526b17d393d517d156141254915160a21b606082015260800190565b94855260208501939093526001600160a01b039190911660408401526060830152608082015260a00190565b60008382526040602083015261341e60408301846128e6565b949350505050565b6040518181016001600160401b03811182821017156134475761344761358f565b604052919050565b60006001600160401b038211156134685761346861358f565b5060209081020190565b6000821982111561348557613485613579565b500190565b6000826134a557634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156134c4576134c4613579565b500290565b6000828210156134db576134db613579565b500390565b60005b838110156134fb5781810151838201526020016134e3565b838111156110635750506000910152565b60008161351b5761351b613579565b506000190190565b60028104600182168061353757607f821691505b6020821081141561355857634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561357257613572613579565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461231757600080fdfe455243373231426964235f7265717569726542696464657242616c616e63653a4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e6174757265298be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0455243373231426964235f706c6163654269643a204455524154494f4e5f4d55455243373231426964236f6e45524337323152656365697665643a205452414ea26469706673582212205d7d5b90a495c911b5a5e6b829801b9f79188f243c35934814d1beeeecc2b65864736f6c63430008000033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c74298be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e00000000000000000000000000e659a116e161d8e502f9036babda51334f2667e000000000000000000000000b08e3e7cc815213304d884c88ca476ebc50eaab2000000000000000000000000a1c57f48f0deb89f569dfbe6e2b7f46d33606fd400000000000000000000000090958d4531258ca11d18396d4174a007edbc2b42000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061a8

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

0000000000000000000000000e659a116e161d8e502f9036babda51334f2667e000000000000000000000000b08e3e7cc815213304d884c88ca476ebc50eaab2000000000000000000000000a1c57f48f0deb89f569dfbe6e2b7f46d33606fd400000000000000000000000090958d4531258ca11d18396d4174a007edbc2b42000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000061a8

-----Decoded View---------------
Arg [0] : _owner (address): 0x0e659a116e161d8e502f9036babda51334f2667e
Arg [1] : _feesCollector (address): 0xb08e3e7cc815213304d884c88ca476ebc50eaab2
Arg [2] : _manaToken (address): 0xa1c57f48f0deb89f569dfbe6e2b7f46d33606fd4
Arg [3] : _royaltiesManager (address): 0x90958d4531258ca11d18396d4174a007edbc2b42
Arg [4] : _feesCollectorCutPerMillion (uint256): 0
Arg [5] : _royaltiesCutPerMillion (uint256): 25000

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000e659a116e161d8e502f9036babda51334f2667e
Arg [1] : 000000000000000000000000b08e3e7cc815213304d884c88ca476ebc50eaab2
Arg [2] : 000000000000000000000000a1c57f48f0deb89f569dfbe6e2b7f46d33606fd4
Arg [3] : 00000000000000000000000090958d4531258ca11d18396d4174a007edbc2b42
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 00000000000000000000000000000000000000000000000000000000000061a8


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
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.