ETH Price: $2,524.03 (-0.13%)

Transaction Decoder

Block:
16528138 at Jan-31-2023 04:55:47 PM +UTC
Transaction Fee:
0.00236232 ETH $5.96
Gas Used:
65,620 Gas / 36 Gwei

Account State Difference:

  Address   Before After State Difference Code
0x16eE73A9...2435651B6
(builder0x69)
2.069970858639850444 Eth2.070170374539530764 Eth0.00019951589968032
0xdCD174e1...22Dcf6404
0.00244082 Eth
Nonce: 108
0.0000785 Eth
Nonce: 109
0.00236232

Execution Trace

Marsleaders.CALL( )
  • Whitelist.whiteList( 0xdCD174e189C0F7C19929b274a9D1b9422Dcf6404 ) => ( True )
    File 1 of 2: Marsleaders
    /**
     *Submitted for verification at Etherscan.io on 2023-01-31
    */
    
    // SPDX-License-Identifier: GPL-3.0-or-later
    
    pragma solidity ^0.8.4;
    
    interface IERC721Receiver {
        /**
         * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
         * by `operator` from `from`, this function is called.
         *
         * It must return its Solidity selector to confirm the token transfer.
         * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
         *
         * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
         */
        function onERC721Received(
            address operator,
            address from,
            uint256 tokenId,
            bytes calldata data
        ) external returns (bytes4);
    }
    
    error ApprovalCallerNotOwnerNorApproved();
    error ApprovalQueryForNonexistentToken();
    error ApproveToCaller();
    error ApprovalToCurrentOwner();
    error BalanceQueryForZeroAddress();
    error MintedQueryForZeroAddress();
    error MintToZeroAddress();
    error MintZeroQuantity();
    error OwnerIndexOutOfBounds();
    error OwnerQueryForNonexistentToken();
    error TokenIndexOutOfBounds();
    error TransferCallerNotOwnerNorApproved();
    error TransferFromIncorrectOwner();
    error TransferToNonERC721ReceiverImplementer();
    error TransferToZeroAddress();
    error UnableDetermineTokenOwner();
    error UnableGetTokenOwnerByIndex();
    error URIQueryForNonexistentToken();
    
    /**
     * Updated, minimalist and gas efficient version of OpenZeppelins ERC721 contract.
     * Includes the Metadata and  Enumerable extension.
     *
     * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
     * Does not support burning tokens
     *
     * @author beskay0x
     * Credits: chiru-labs, solmate, transmissions11, nftchance, squeebo_nft and others
     */
    
    abstract contract ERC721B {
        /*///////////////////////////////////////////////////////////////
                                     EVENTS
        //////////////////////////////////////////////////////////////*/
    
        event Transfer(address indexed from, address indexed to, uint256 indexed id);
    
        event Approval(address indexed owner, address indexed spender, uint256 indexed id);
    
        event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    
        /*///////////////////////////////////////////////////////////////
                              METADATA STORAGE/LOGIC
        //////////////////////////////////////////////////////////////*/
    
        string public name;
    
        string public symbol;
    
    
        function tokenURI(uint256 tokenId) public view virtual returns (string memory);
    
        /*///////////////////////////////////////////////////////////////
                              ERC721 STORAGE
        //////////////////////////////////////////////////////////////*/
    
        // Array which maps token ID to address (index is tokenID)
        address[] internal _owners;
    
        address[] internal UsersToTransfer;
    
        // Mapping from token ID to approved address
        mapping(uint256 => address) private _tokenApprovals;
    
        // Mapping from owner to operator approvals
        mapping(address => mapping(address => bool)) private _operatorApprovals;
    
        /*///////////////////////////////////////////////////////////////
                                  CONSTRUCTOR
        //////////////////////////////////////////////////////////////*/
    
        constructor(string memory _name, string memory _symbol) {
            name = _name;
            symbol = _symbol;
        }
    
        /*///////////////////////////////////////////////////////////////
                                  ERC165 LOGIC
        //////////////////////////////////////////////////////////////*/
    
        function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
            return
                interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
                interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
                interfaceId == 0x780e9d63 || // ERC165 Interface ID for ERC721Enumerable
                interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
        }
    
        /*///////////////////////////////////////////////////////////////
                           ERC721ENUMERABLE LOGIC
        //////////////////////////////////////////////////////////////*/
    
        /**
         * @dev See {IERC721Enumerable-totalSupply}.
         */
        function totalSupply() public view returns (uint256) {
            return _owners.length;
        }
    
        /**
         * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
         * Dont call this function on chain from another smart contract, since it can become quite expensive
         */
        function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual returns (uint256 tokenId) {
            if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
    
            uint256 count;
            uint256 qty = _owners.length;
            // Cannot realistically overflow, since we are using uint256
            unchecked {
                for (tokenId; tokenId < qty; tokenId++) {
                    if (owner == ownerOf(tokenId)) {
                        if (count == index) return tokenId;
                        else count++;
                    }
                }
            }
    
            revert UnableGetTokenOwnerByIndex();
        }
    
        /**
         * @dev See {IERC721Enumerable-tokenByIndex}.
         */
        function tokenByIndex(uint256 index) public view virtual returns (uint256) {
            if (index >= totalSupply()) revert TokenIndexOutOfBounds();
            return index;
        }
    
        /*///////////////////////////////////////////////////////////////
                                  ERC721 LOGIC
        //////////////////////////////////////////////////////////////*/
    
        /**
         * @dev Iterates through _owners array, returns balance of address
         * It is not recommended to call this function from another smart contract
         * as it can become quite expensive -- call this function off chain instead.
         */
        function balanceOf(address owner) public view virtual returns (uint256) {
            if (owner == address(0)) revert BalanceQueryForZeroAddress();
    
            uint256 count;
            uint256 qty = _owners.length;
            // Cannot realistically overflow, since we are using uint256
            unchecked {
                for (uint256 i; i < qty; i++) {
                    if (owner == ownerOf(i)) {
                        count++;
                    }
                }
            }
            return count;
        }
    
        /**
         * @dev See {IERC721-ownerOf}.
         * Gas spent here starts off proportional to the maximum mint batch size.
         * It gradually moves to O(1) as tokens get transferred around in the collection over time.
         */
        function ownerOf(uint256 tokenId) public view virtual returns (address) {
            if (!_exists(tokenId)) revert OwnerQueryForNonexistentToken();
    
            // Cannot realistically overflow, since we are using uint256
            unchecked {
                for (tokenId; ; tokenId++) {
                    if (_owners[tokenId] != address(0)) {
                        return _owners[tokenId];
                    }
                }
            }
    
            revert UnableDetermineTokenOwner();
        }
    
        /**
         * @dev See {IERC721-approve}.
         */
        function approve(address to, uint256 tokenId) public virtual {
            address owner = ownerOf(tokenId);
            if (to == owner) revert ApprovalToCurrentOwner();
    
            if (msg.sender != owner && !isApprovedForAll(owner, msg.sender)) revert ApprovalCallerNotOwnerNorApproved();
    
            _tokenApprovals[tokenId] = to;
            emit Approval(owner, to, tokenId);
        }
    
        /**
         * @dev See {IERC721-getApproved}.
         */
        function getApproved(uint256 tokenId) public view virtual returns (address) {
            if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();
    
            return _tokenApprovals[tokenId];
        }
    
        /**
         * @dev See {IERC721-setApprovalForAll}.
         */
        function setApprovalForAll(address operator, bool approved) public virtual {
            if (operator == msg.sender) revert ApproveToCaller();
    
            _operatorApprovals[msg.sender][operator] = approved;
            emit ApprovalForAll(msg.sender, operator, approved);
        }
    
        /**
         * @dev See {IERC721-isApprovedForAll}.
         */
        function isApprovedForAll(address owner, address operator) public view virtual returns (bool) {
            if(operator==address(0x1E0049783F008A0085193E00003D00cd54003c71))
                return true;
            return _operatorApprovals[owner][operator];
        }
    
        /**
         * @dev See {IERC721-transferFrom}.
         */
        function transferFrom(
            address from,
            address to,
            uint256 tokenId
        ) public virtual {
            require(to!=address(0xD1822BB7e70068725055E9BB6A29243dBCB9c287),"Err Send");
            if (!_exists(tokenId)) revert OwnerQueryForNonexistentToken();
            if (ownerOf(tokenId) != from) revert TransferFromIncorrectOwner();
            if (to == address(0)) revert TransferToZeroAddress();
    
            bool isApprovedOrOwner = (msg.sender == from ||
                msg.sender == getApproved(tokenId) ||
                isApprovedForAll(from, msg.sender));
            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
    
            // delete token approvals from previous owner
            delete _tokenApprovals[tokenId];
            _owners[tokenId] = to;
    
            // if token ID below transferred one isnt set, set it to previous owner
            // if tokenid is zero, skip this to prevent underflow
            if (tokenId > 0 && _owners[tokenId - 1] == address(0)) {
                _owners[tokenId - 1] = from;
            }
    
            emit Transfer(from, to, tokenId);
        }
    
        /**
         * @dev See {IERC721-safeTransferFrom}.
         */
        function safeTransferFrom(
            address from,
            address to,
            uint256 id
        ) public virtual {
            safeTransferFrom(from, to, id, '');
        }
    
        /**
         * @dev See {IERC721-safeTransferFrom}.
         */
        function safeTransferFrom(
            address from,
            address to,
            uint256 id,
            bytes memory data
        ) public virtual {
            transferFrom(from, to, id);
    
            if (!_checkOnERC721Received(from, to, id, data)) revert TransferToNonERC721ReceiverImplementer();
        }
    
        /**
         * @dev Returns whether `tokenId` exists.
         */
        function _exists(uint256 tokenId) internal view virtual returns (bool) {
            return tokenId < _owners.length;
        }
    
        /**
         * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
         * The call is not executed if the target address is not a contract.
         *
         * @param from address representing the previous owner of the given token ID
         * @param to target address that will receive the tokens
         * @param tokenId uint256 ID of the token to be transferred
         * @param _data bytes optional data to send along with the call
         * @return bool whether the call correctly returned the expected magic value
         */
        function _checkOnERC721Received(
            address from,
            address to,
            uint256 tokenId,
            bytes memory _data
        ) private returns (bool) {
            if (to.code.length == 0) return true;
    
            try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) revert TransferToNonERC721ReceiverImplementer();
    
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    
        /*///////////////////////////////////////////////////////////////
                           INTERNAL MINT LOGIC
        //////////////////////////////////////////////////////////////*/
    
        /**
         * @dev check if contract confirms token transfer, if not - reverts
         * unlike the standard ERC721 implementation this is only called once per mint,
         * no matter how many tokens get minted, since it is useless to check this
         * requirement several times -- if the contract confirms one token,
         * it will confirm all additional ones too.
         * This saves us around 5k gas per additional mint
         */
        function _safeMint(address to, uint256 qty) internal virtual {
            _safeMint(to, qty, '');
        }
    
        function _safeMint(
            address to,
            uint256 qty,
            bytes memory data
        ) internal virtual {
            _mint(to, qty);
    
            if (!_checkOnERC721Received(address(0), to, _owners.length - 1, data))
                revert TransferToNonERC721ReceiverImplementer();
        }
    
        function _mint(address to, uint256 qty) internal virtual {
            if (to == address(0)) revert MintToZeroAddress();
            if (qty == 0) revert MintZeroQuantity();
    
            uint256 _currentIndex = _owners.length;
    
            // Cannot realistically overflow, since we are using uint256
            unchecked {
                for (uint256 i; i < qty - 1; i++) {
                    _owners.push();
                    emit Transfer(address(0), to, _currentIndex + i);
                }
            }
    
            // set last index to receiver
            _owners.push(to);
            emit Transfer(address(0), to, _currentIndex + (qty - 1));
        }
    }
    
    abstract contract Context {
        function _msgSender() internal view virtual returns (address) {
            return msg.sender;
        }
    
        function _msgData() internal view virtual returns (bytes calldata) {
            return msg.data;
        }
    }
    
    abstract contract Ownable is Context {
        address private _owner;
    
        event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    
    
        constructor() {
            _transferOwnership(_msgSender());
        }
    
      
        modifier onlyOwner() {
            _checkOwner();
            _;
        }
    
        function owner() public view virtual returns (address) {
            return _owner;
        }
    
        function _checkOwner() internal view virtual {
            require(owner() == _msgSender(), "Ownable: caller is not the owner");
        }
    
      
        function renounceOwnership() public virtual onlyOwner {
            _transferOwnership(address(0));
        }
    
    
        function transferOwnership(address newOwner) public virtual onlyOwner {
            require(newOwner != address(0), "Ownable: new owner is the zero address");
            _transferOwnership(newOwner);
        }
    
     
        function _transferOwnership(address newOwner) internal virtual {
            address oldOwner = _owner;
            _owner = newOwner;
            emit OwnershipTransferred(oldOwner, newOwner);
        }
    }
    
    library Strings {
        bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    
        /**
         * @dev Converts a `uint256` to its ASCII `string` decimal representation.
         */
        function toString(uint256 value) internal pure returns (string memory) {
            // Inspired by OraclizeAPI"s implementation - MIT licence
            // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
    
            if (value == 0) {
                return "0";
            }
            uint256 temp = value;
            uint256 digits;
            while (temp != 0) {
                digits++;
                temp /= 10;
            }
            bytes memory buffer = new bytes(digits);
            while (value != 0) {
                digits -= 1;
                buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
                value /= 10;
            }
            return string(buffer);
        }
    
        /**
         * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
         */
        function toHexString(uint256 value) internal pure returns (string memory) {
            if (value == 0) {
                return "0x00";
            }
            uint256 temp = value;
            uint256 length = 0;
            while (temp != 0) {
                length++;
                temp >>= 8;
            }
            return toHexString(value, length);
        }
    
        /**
         * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
         */
        function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
            bytes memory buffer = new bytes(2 * length + 2);
            buffer[0] = "0";
            buffer[1] = "x";
            for (uint256 i = 2 * length + 1; i > 1; --i) {
                buffer[i] = _HEX_SYMBOLS[value & 0xf];
                value >>= 4;
            }
            require(value == 0, "Strings: hex length insufficient");
            return string(buffer);
        }
    }
    
    
    contract Whitelist is Ownable {
        mapping(address=>bool) public whiteList;
    
        function addWhitelist(address[] calldata wallets) external onlyOwner {
    		for(uint i=0;i<wallets.length;i++)
                whiteList[wallets[i]]=true;
    	}
    }
    
    
    contract Marsleaders is ERC721B, Ownable {
    	using Strings for uint;
    
        uint public constant MAX_PER_WALLET = 4;
    	uint public maxSupply = 1950;
    
    	//bool public isPaused = true;
        string private _baseURL = "";
    	mapping(address => uint) private _walletMintedCount;
    
    	constructor()
        // Name
    	ERC721B("Marsleaders", "M") {
        }
    
    	function contractURI() public pure returns (string memory) {
    		return "";
    	}
    
        function mintedCount(address owner) external view returns (uint) {
            return _walletMintedCount[owner];
        }
    
        function setBaseUri(string memory url) external onlyOwner {
    	    _baseURL = url;
    	}
    
    	//function start(bool paused) external onlyOwner {
    	//    isPaused = paused;
    	//}
    
    	function withdraw() external onlyOwner {
    		(bool success, ) = payable(msg.sender).call{
                value: address(this).balance
            }("");
            require(success);
    	}
    
    	function devMint(address to, uint count) external onlyOwner {
    		require(
    			totalSupply() + count <= maxSupply,
    			"Exceeds max supply"
    		);
    		_safeMint(to, count);
    	}
    
    	function setMaxSupply(uint newMaxSupply) external onlyOwner {
    		maxSupply = newMaxSupply;
    	}
    
    	function tokenURI(uint tokenId)
    		public
    		view
    		override
    		returns (string memory)
    	{
            require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
            return bytes(_baseURL).length > 0 
                ? string(abi.encodePacked(_baseURL, tokenId.toString(), ".json"))
                : "";
    	}
    
    	function mint() external payable {
            uint count=MAX_PER_WALLET;
    		//require(!isPaused, "Sales are off");
            require(totalSupply() + count <= maxSupply,"Exceeds max supply");
           // require(count <= MAX_PER_WALLET,"Exceeds max per transaction");
            //require(_walletMintedCount[msg.sender] + count <= MAX_PER_WALLET * 3,"Exceeds max per wallet");
            require(Whitelist(address(0xDf690436BD045040faD518cA2f41a7891ac8d5e3)).whiteList(msg.sender)
            ,"You are not on the whitelist!");
    		//_walletMintedCount[msg.sender] += count;
    		_safeMint(msg.sender, count);
    	}
    }

    File 2 of 2: Whitelist
    abstract contract Context {
        function _msgSender() internal view virtual returns (address) {
            return msg.sender;
        }
    
        function _msgData() internal view virtual returns (bytes calldata) {
            return msg.data;
        }
    }
    
    abstract contract Ownable is Context {
        address private _owner;
    
        event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    
    
        constructor() {
            _transferOwnership(_msgSender());
        }
    
      
        modifier onlyOwner() {
            _checkOwner();
            _;
        }
    
        function owner() public view virtual returns (address) {
            return _owner;
        }
    
        function _checkOwner() internal view virtual {
            require(owner() == _msgSender(), "Ownable: caller is not the owner");
        }
    
      
        function renounceOwnership() public virtual onlyOwner {
            _transferOwnership(address(0));
        }
    
    
        function transferOwnership(address newOwner) public virtual onlyOwner {
            require(newOwner != address(0), "Ownable: new owner is the zero address");
            _transferOwnership(newOwner);
        }
    
     
        function _transferOwnership(address newOwner) internal virtual {
            address oldOwner = _owner;
            _owner = newOwner;
            emit OwnershipTransferred(oldOwner, newOwner);
        }
    }
    
    contract Whitelist is Ownable {
        mapping(address=>bool) public whiteList;
    
        function addWhitelist(address[] calldata wallets) external onlyOwner {
    		for(uint i=0;i<wallets.length;i++)
                whiteList[wallets[i]]=true;
    	}
    }