ETH Price: $4,034.77 (+4.64%)

Token

FuckFTX (FFTX)
 

Overview

Max Total Supply

4 FFTX

Holders

3

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 FFTX
0x5e6db80c7f8d5da245d4249dcbee16e6596521d4
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x367F5FA4...591A1a8b6
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
FuckFTX

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 7 : FuckFTX.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import "./LilOwnable.sol";
import "./Strings.sol";
import "rari-capital/tokens/ERC721.sol";
import "rari-capital/utils/SafeTransferLib.sol";
import "rari-capital/utils/FixedPointMathLib.sol";

error DoesNotExist();
error NoTokensLeft();
error MintNotStarted();
error TooManyMints();
error EmptyBalance();

contract FuckFTX is LilOwnable, ERC721 {
    using Strings for uint256;

    address public hater;
    uint256 public constant TOTAL_SUPPLY = 101;
    bool public mintStarted = false;
    uint256 public totalSupply;
    string public baseURI;

    constructor() payable ERC721("FuckFTX", "FFTX") {
        hater = msg.sender;
    }
    
    modifier biggestHater() {
        require(msg.sender == hater, "Ownable: caller is not the biggest hater");
        _;
    }

    function mint(uint16 amount) external payable {
        if (amount > 1) revert TooManyMints();
        if (totalSupply + amount > TOTAL_SUPPLY) revert NoTokensLeft();
        if (!mintStarted) revert MintNotStarted();

        unchecked {
            for (uint16 index = 0; index < amount; index++) {
                _mint(msg.sender, totalSupply + 1);
                totalSupply++;
            }
        }
    }

    function tokenURI(uint256 id) public view virtual override returns (string memory) {
        return string(abi.encodePacked(baseURI, id.toString()));
    }

    function setBaseURI(string memory _newBaseURI) public biggestHater {
        baseURI = _newBaseURI;
    }

    function startMint() public biggestHater {
        mintStarted = true;
    }
    
    function pauseMint() public biggestHater {
        mintStarted = false;
    }

    function withdraw() external biggestHater {
        if (address(this).balance == 0) revert EmptyBalance();
        payable(hater).transfer(address(this).balance);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        pure
        override(LilOwnable, ERC721)
        returns (bool)
    {
        return
            interfaceId == 0x7f5828d0 || // ERC165 Interface ID for ERC173
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f || // ERC165 Interface ID for ERC165
            interfaceId == 0x01ffc9a7; // ERC165 Interface ID for ERC721Metadata
    }
}

File 2 of 7 : LilOwnable.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

error NotOwner();

abstract contract LilOwnable {
    address internal _owner;

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

    constructor() {
        _owner = msg.sender;
    }

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

    function transferOwnership(address _newOwner) external {
        if (msg.sender != _owner) revert NotOwner();

        _owner = _newOwner;
    }

    function renounceOwnership() public {
        if (msg.sender != _owner) revert NotOwner();

        _owner = address(0);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        pure
        virtual
        returns (bool)
    {
        return interfaceId == 0x7f5828d0; // ERC165 Interface ID for ERC173
    }
}

File 3 of 7 : Strings.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.13;

library Strings {
    /**
     * @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);
    }
}

File 4 of 7 : ERC721.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721 {
    /*//////////////////////////////////////////////////////////////
                                 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 id) public view virtual returns (string memory);

    /*//////////////////////////////////////////////////////////////
                      ERC721 BALANCE/OWNER STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) internal _ownerOf;

    mapping(address => uint256) internal _balanceOf;

    function ownerOf(uint256 id) public view virtual returns (address owner) {
        require((owner = _ownerOf[id]) != address(0), "NOT_MINTED");
    }

    function balanceOf(address owner) public view virtual returns (uint256) {
        require(owner != address(0), "ZERO_ADDRESS");

        return _balanceOf[owner];
    }

    /*//////////////////////////////////////////////////////////////
                         ERC721 APPROVAL STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) public getApproved;

    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }

    /*//////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 id) public virtual {
        address owner = _ownerOf[id];

        require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        require(from == _ownerOf[id], "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");

        require(
            msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id],
            "NOT_AUTHORIZED"
        );

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            _balanceOf[from]--;

            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes calldata data
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    /*//////////////////////////////////////////////////////////////
                              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 == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 id) internal virtual {
        require(to != address(0), "INVALID_RECIPIENT");

        require(_ownerOf[id] == address(0), "ALREADY_MINTED");

        // Counter overflow is incredibly unrealistic.
        unchecked {
            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

        emit Transfer(address(0), to, id);
    }

    function _burn(uint256 id) internal virtual {
        address owner = _ownerOf[id];

        require(owner != address(0), "NOT_MINTED");

        // Ownership check above ensures no underflow.
        unchecked {
            _balanceOf[owner]--;
        }

        delete _ownerOf[id];

        delete getApproved[id];

        emit Transfer(owner, address(0), id);
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL SAFE MINT LOGIC
    //////////////////////////////////////////////////////////////*/

    function _safeMint(address to, uint256 id) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _safeMint(
        address to,
        uint256 id,
        bytes memory data
    ) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }
}

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721TokenReceiver {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC721TokenReceiver.onERC721Received.selector;
    }
}

File 5 of 7 : SafeTransferLib.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

import {ERC20} from "../tokens/ERC20.sol";

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.
library SafeTransferLib {
    /*//////////////////////////////////////////////////////////////
                             ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address to, uint256 amount) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Transfer the ETH and store if it succeeded or not.
            success := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(success, "ETH_TRANSFER_FAILED");
    }

    /*//////////////////////////////////////////////////////////////
                            ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferFrom(
        ERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), from) // Append the "from" argument.
            mstore(add(freeMemoryPointer, 36), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)
            )
        }

        require(success, "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "TRANSFER_FAILED");
    }

    function safeApprove(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), to) // Append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "APPROVE_FAILED");
    }
}

File 6 of 7 : FixedPointMathLib.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Arithmetic library with operations for fixed-point numbers.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/FixedPointMathLib.sol)
/// @author Inspired by USM (https://github.com/usmfum/USM/blob/master/contracts/WadMath.sol)
library FixedPointMathLib {
    /*//////////////////////////////////////////////////////////////
                    SIMPLIFIED FIXED POINT OPERATIONS
    //////////////////////////////////////////////////////////////*/

    uint256 internal constant MAX_UINT256 = 2**256 - 1;

    uint256 internal constant WAD = 1e18; // The scalar of ETH and most ERC20s.

    function mulWadDown(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivDown(x, y, WAD); // Equivalent to (x * y) / WAD rounded down.
    }

    function mulWadUp(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivUp(x, y, WAD); // Equivalent to (x * y) / WAD rounded up.
    }

    function divWadDown(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivDown(x, WAD, y); // Equivalent to (x * WAD) / y rounded down.
    }

    function divWadUp(uint256 x, uint256 y) internal pure returns (uint256) {
        return mulDivUp(x, WAD, y); // Equivalent to (x * WAD) / y rounded up.
    }

    /*//////////////////////////////////////////////////////////////
                    LOW LEVEL FIXED POINT OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function mulDivDown(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Equivalent to require(denominator != 0 && (y == 0 || x <= type(uint256).max / y))
            if iszero(mul(denominator, iszero(mul(y, gt(x, div(MAX_UINT256, y)))))) {
                revert(0, 0)
            }

            // Divide x * y by the denominator.
            z := div(mul(x, y), denominator)
        }
    }

    function mulDivUp(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Equivalent to require(denominator != 0 && (y == 0 || x <= type(uint256).max / y))
            if iszero(mul(denominator, iszero(mul(y, gt(x, div(MAX_UINT256, y)))))) {
                revert(0, 0)
            }

            // If x * y modulo the denominator is strictly greater than 0,
            // 1 is added to round up the division of x * y by the denominator.
            z := add(gt(mod(mul(x, y), denominator), 0), div(mul(x, y), denominator))
        }
    }

    function rpow(
        uint256 x,
        uint256 n,
        uint256 scalar
    ) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            switch x
            case 0 {
                switch n
                case 0 {
                    // 0 ** 0 = 1
                    z := scalar
                }
                default {
                    // 0 ** n = 0
                    z := 0
                }
            }
            default {
                switch mod(n, 2)
                case 0 {
                    // If n is even, store scalar in z for now.
                    z := scalar
                }
                default {
                    // If n is odd, store x in z for now.
                    z := x
                }

                // Shifting right by 1 is like dividing by 2.
                let half := shr(1, scalar)

                for {
                    // Shift n right by 1 before looping to halve it.
                    n := shr(1, n)
                } n {
                    // Shift n right by 1 each iteration to halve it.
                    n := shr(1, n)
                } {
                    // Revert immediately if x ** 2 would overflow.
                    // Equivalent to iszero(eq(div(xx, x), x)) here.
                    if shr(128, x) {
                        revert(0, 0)
                    }

                    // Store x squared.
                    let xx := mul(x, x)

                    // Round to the nearest number.
                    let xxRound := add(xx, half)

                    // Revert if xx + half overflowed.
                    if lt(xxRound, xx) {
                        revert(0, 0)
                    }

                    // Set x to scaled xxRound.
                    x := div(xxRound, scalar)

                    // If n is even:
                    if mod(n, 2) {
                        // Compute z * x.
                        let zx := mul(z, x)

                        // If z * x overflowed:
                        if iszero(eq(div(zx, x), z)) {
                            // Revert if x is non-zero.
                            if iszero(iszero(x)) {
                                revert(0, 0)
                            }
                        }

                        // Round to the nearest number.
                        let zxRound := add(zx, half)

                        // Revert if zx + half overflowed.
                        if lt(zxRound, zx) {
                            revert(0, 0)
                        }

                        // Return properly scaled zxRound.
                        z := div(zxRound, scalar)
                    }
                }
            }
        }
    }

    /*//////////////////////////////////////////////////////////////
                        GENERAL NUMBER UTILITIES
    //////////////////////////////////////////////////////////////*/

    function sqrt(uint256 x) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            let y := x // We start y at x, which will help us make our initial estimate.

            z := 181 // The "correct" value is 1, but this saves a multiplication later.

            // This segment is to get a reasonable initial estimate for the Babylonian method. With a bad
            // start, the correct # of bits increases ~linearly each iteration instead of ~quadratically.

            // We check y >= 2^(k + 8) but shift right by k bits
            // each branch to ensure that if x >= 256, then y >= 256.
            if iszero(lt(y, 0x10000000000000000000000000000000000)) {
                y := shr(128, y)
                z := shl(64, z)
            }
            if iszero(lt(y, 0x1000000000000000000)) {
                y := shr(64, y)
                z := shl(32, z)
            }
            if iszero(lt(y, 0x10000000000)) {
                y := shr(32, y)
                z := shl(16, z)
            }
            if iszero(lt(y, 0x1000000)) {
                y := shr(16, y)
                z := shl(8, z)
            }

            // Goal was to get z*z*y within a small factor of x. More iterations could
            // get y in a tighter range. Currently, we will have y in [256, 256*2^16).
            // We ensured y >= 256 so that the relative difference between y and y+1 is small.
            // That's not possible if x < 256 but we can just verify those cases exhaustively.

            // Now, z*z*y <= x < z*z*(y+1), and y <= 2^(16+8), and either y >= 256, or x < 256.
            // Correctness can be checked exhaustively for x < 256, so we assume y >= 256.
            // Then z*sqrt(y) is within sqrt(257)/sqrt(256) of sqrt(x), or about 20bps.

            // For s in the range [1/256, 256], the estimate f(s) = (181/1024) * (s+1) is in the range
            // (1/2.84 * sqrt(s), 2.84 * sqrt(s)), with largest error when s = 1 and when s = 256 or 1/256.

            // Since y is in [256, 256*2^16), let a = y/65536, so that a is in [1/256, 256). Then we can estimate
            // sqrt(y) using sqrt(65536) * 181/1024 * (a + 1) = 181/4 * (y + 65536)/65536 = 181 * (y + 65536)/2^18.

            // There is no overflow risk here since y < 2^136 after the first branch above.
            z := shr(18, mul(z, add(y, 65536))) // A mul() is saved from starting z at 181.

            // Given the worst case multiplicative error of 2.84 above, 7 iterations should be enough.
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))

            // If x+1 is a perfect square, the Babylonian method cycles between
            // floor(sqrt(x)) and ceil(sqrt(x)). This statement ensures we return floor.
            // See: https://en.wikipedia.org/wiki/Integer_square_root#Using_only_integer_division
            // Since the ceil is rare, we save gas on the assignment and repeat division in the rare case.
            // If you don't care whether the floor or ceil square root is returned, you can remove this statement.
            z := sub(z, lt(div(x, z), z))
        }
    }

    function unsafeMod(uint256 x, uint256 y) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Mod x by y. Note this will return
            // 0 instead of reverting if y is zero.
            z := mod(x, y)
        }
    }

    function unsafeDiv(uint256 x, uint256 y) internal pure returns (uint256 r) {
        /// @solidity memory-safe-assembly
        assembly {
            // Divide x by y. Note this will return
            // 0 instead of reverting if y is zero.
            r := div(x, y)
        }
    }

    function unsafeDivUp(uint256 x, uint256 y) internal pure returns (uint256 z) {
        /// @solidity memory-safe-assembly
        assembly {
            // Add 1 to x * y if x % y > 0. Note this will
            // return 0 instead of reverting if y is zero.
            z := add(gt(mod(x, y), 0), div(x, y))
        }
    }
}

File 7 of 7 : ERC20.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

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

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

Settings
{
  "remappings": [
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/",
    "openzeppelin/=lib/openzeppelin-contracts/contracts/",
    "rari-capital/=lib/solmate/src/",
    "solmate/=lib/solmate/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"EmptyBalance","type":"error"},{"inputs":[],"name":"MintNotStarted","type":"error"},{"inputs":[],"name":"NoTokensLeft","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"TooManyMints","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hater","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"amount","type":"uint16"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6007805460ff60a01b1916815560808181526608ceac6d68ca8b60cb1b60a0908152610100604052600460c09081526308c8ca8b60e31b60e052600080546001600160a01b0319163317905591926200005b916001916200008c565b508051620000719060029060208401906200008c565b5050600780546001600160a01b03191633179055506200016e565b8280546200009a9062000132565b90600052602060002090601f016020900481019282620000be576000855562000109565b82601f10620000d957805160ff191683800117855562000109565b8280016001018555821562000109579182015b8281111562000109578251825591602001919060010190620000ec565b50620001179291506200011b565b5090565b5b808211156200011757600081556001016200011c565b600181811c908216806200014757607f821691505b6020821081036200016857634e487b7160e01b600052602260045260246000fd5b50919050565b6116dc806200017e6000396000f3fe6080604052600436106101815760003560e01c806370a08231116100d1578063a9722cf31161008a578063cd85cdb511610064578063cd85cdb514610441578063e005ae2b14610456578063e985e9c514610476578063f2fde38b146104b157600080fd5b8063a9722cf3146103e0578063b88d4fde14610401578063c87b56dd1461042157600080fd5b806370a0823114610343578063715018a6146103635780638da5cb5b14610378578063902d55a51461039657806395d89b41146103ab578063a22cb465146103c057600080fd5b806323cf0a221161013e57806342842e0e1161011857806342842e0e146102ce57806355f804b3146102ee5780636352211e1461030e5780636c0360eb1461032e57600080fd5b806323cf0a22146102915780632be09561146102a45780633ccfd60b146102b957600080fd5b806301ffc9a71461018657806306fdde03146101bb578063081812fc146101dd578063095ea7b31461022b57806318160ddd1461024d57806323b872dd14610271575b600080fd5b34801561019257600080fd5b506101a66101a1366004611112565b6104d1565b60405190151581526020015b60405180910390f35b3480156101c757600080fd5b506101d061053e565b6040516101b29190611166565b3480156101e957600080fd5b506102136101f8366004611199565b6005602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101b2565b34801561023757600080fd5b5061024b6102463660046111c9565b6105cc565b005b34801561025957600080fd5b5061026360085481565b6040519081526020016101b2565b34801561027d57600080fd5b5061024b61028c3660046111f3565b6106b3565b61024b61029f36600461122f565b61087a565b3480156102b057600080fd5b5061024b610935565b3480156102c557600080fd5b5061024b610974565b3480156102da57600080fd5b5061024b6102e93660046111f3565b6109fb565b3480156102fa57600080fd5b5061024b610309366004611269565b610af3565b34801561031a57600080fd5b50610213610329366004611199565b610b30565b34801561033a57600080fd5b506101d0610b87565b34801561034f57600080fd5b5061026361035e36600461131a565b610b94565b34801561036f57600080fd5b5061024b610bf7565b34801561038457600080fd5b506000546001600160a01b0316610213565b3480156103a257600080fd5b50610263606581565b3480156103b757600080fd5b506101d0610c34565b3480156103cc57600080fd5b5061024b6103db366004611335565b610c41565b3480156103ec57600080fd5b506007546101a690600160a01b900460ff1681565b34801561040d57600080fd5b5061024b61041c366004611371565b610cad565b34801561042d57600080fd5b506101d061043c366004611199565b610d95565b34801561044d57600080fd5b5061024b610dc9565b34801561046257600080fd5b50600754610213906001600160a01b031681565b34801561048257600080fd5b506101a661049136600461140c565b600660209081526000928352604080842090915290825290205460ff1681565b3480156104bd57600080fd5b5061024b6104cc36600461131a565b610e02565b60006307f5828d60e41b6001600160e01b03198316148061050257506380ac58cd60e01b6001600160e01b03198316145b8061051d5750635b5e139f60e01b6001600160e01b03198316145b8061053857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6001805461054b9061143f565b80601f01602080910402602001604051908101604052809291908181526020018280546105779061143f565b80156105c45780601f10610599576101008083540402835291602001916105c4565b820191906000526020600020905b8154815290600101906020018083116105a757829003601f168201915b505050505081565b6000818152600360205260409020546001600160a01b03163381148061061557506001600160a01b038116600090815260066020908152604080832033845290915290205460ff165b6106575760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000818152600360205260409020546001600160a01b038481169116146107095760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640161064e565b6001600160a01b0382166107535760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161064e565b336001600160a01b038416148061078d57506001600160a01b038316600090815260066020908152604080832033845290915290205460ff165b806107ae57506000818152600560205260409020546001600160a01b031633145b6107eb5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161064e565b6001600160a01b0380841660008181526004602090815260408083208054600019019055938616808352848320805460010190558583526003825284832080546001600160a01b03199081168317909155600590925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60018161ffff1611156108a05760405163ed302ecd60e01b815260040160405180910390fd5b60658161ffff166008546108b4919061148f565b11156108d357604051637364ba1760e01b815260040160405180910390fd5b600754600160a01b900460ff166108fd57604051630314872760e11b815260040160405180910390fd5b60005b8161ffff168161ffff1610156109315761091f33600854600101610e4f565b60088054600190810190915501610900565b5050565b6007546001600160a01b0316331461095f5760405162461bcd60e51b815260040161064e906114a7565b6007805460ff60a01b1916600160a01b179055565b6007546001600160a01b0316331461099e5760405162461bcd60e51b815260040161064e906114a7565b476000036109bf57604051631189da5b60e11b815260040160405180910390fd5b6007546040516001600160a01b03909116904780156108fc02916000818181858888f193505050501580156109f8573d6000803e3d6000fd5b50565b610a068383836106b3565b6001600160a01b0382163b1580610aaf5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610a7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa391906114ef565b6001600160e01b031916145b610aee5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161064e565b505050565b6007546001600160a01b03163314610b1d5760405162461bcd60e51b815260040161064e906114a7565b8051610931906009906020840190611063565b6000818152600360205260409020546001600160a01b031680610b825760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b604482015260640161064e565b919050565b6009805461054b9061143f565b60006001600160a01b038216610bdb5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640161064e565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314610c22576040516330cd747160e01b815260040160405180910390fd5b600080546001600160a01b0319169055565b6002805461054b9061143f565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610cb88585856106b3565b6001600160a01b0384163b1580610d4f5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610d009033908a9089908990899060040161150c565b6020604051808303816000875af1158015610d1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4391906114ef565b6001600160e01b031916145b610d8e5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161064e565b5050505050565b60606009610da283610f5a565b604051602001610db392919061157c565b6040516020818303038152906040529050919050565b6007546001600160a01b03163314610df35760405162461bcd60e51b815260040161064e906114a7565b6007805460ff60a01b19169055565b6000546001600160a01b03163314610e2d576040516330cd747160e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038216610e995760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161064e565b6000818152600360205260409020546001600160a01b031615610eef5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161064e565b6001600160a01b038216600081815260046020908152604080832080546001019055848352600390915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606081600003610f815750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610fab5780610f9581611622565b9150610fa49050600a83611651565b9150610f85565b60008167ffffffffffffffff811115610fc657610fc6611253565b6040519080825280601f01601f191660200182016040528015610ff0576020820181803683370190505b5090505b841561105b57611005600183611665565b9150611012600a8661167c565b61101d90603061148f565b60f81b81838151811061103257611032611690565b60200101906001600160f81b031916908160001a905350611054600a86611651565b9450610ff4565b949350505050565b82805461106f9061143f565b90600052602060002090601f01602090048101928261109157600085556110d7565b82601f106110aa57805160ff19168380011785556110d7565b828001600101855582156110d7579182015b828111156110d75782518255916020019190600101906110bc565b506110e39291506110e7565b5090565b5b808211156110e357600081556001016110e8565b6001600160e01b0319811681146109f857600080fd5b60006020828403121561112457600080fd5b813561112f816110fc565b9392505050565b60005b83811015611151578181015183820152602001611139565b83811115611160576000848401525b50505050565b6020815260008251806020840152611185816040850160208701611136565b601f01601f19169190910160400192915050565b6000602082840312156111ab57600080fd5b5035919050565b80356001600160a01b0381168114610b8257600080fd5b600080604083850312156111dc57600080fd5b6111e5836111b2565b946020939093013593505050565b60008060006060848603121561120857600080fd5b611211846111b2565b925061121f602085016111b2565b9150604084013590509250925092565b60006020828403121561124157600080fd5b813561ffff8116811461112f57600080fd5b634e487b7160e01b600052604160045260246000fd5b60006020828403121561127b57600080fd5b813567ffffffffffffffff8082111561129357600080fd5b818401915084601f8301126112a757600080fd5b8135818111156112b9576112b9611253565b604051601f8201601f19908116603f011681019083821181831017156112e1576112e1611253565b816040528281528760208487010111156112fa57600080fd5b826020860160208301376000928101602001929092525095945050505050565b60006020828403121561132c57600080fd5b61112f826111b2565b6000806040838503121561134857600080fd5b611351836111b2565b91506020830135801515811461136657600080fd5b809150509250929050565b60008060008060006080868803121561138957600080fd5b611392866111b2565b94506113a0602087016111b2565b935060408601359250606086013567ffffffffffffffff808211156113c457600080fd5b818801915088601f8301126113d857600080fd5b8135818111156113e757600080fd5b8960208285010111156113f957600080fd5b9699959850939650602001949392505050565b6000806040838503121561141f57600080fd5b611428836111b2565b9150611436602084016111b2565b90509250929050565b600181811c9082168061145357607f821691505b60208210810361147357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156114a2576114a2611479565b500190565b60208082526028908201527f4f776e61626c653a2063616c6c6572206973206e6f742074686520626967676560408201526739ba103430ba32b960c11b606082015260800190565b60006020828403121561150157600080fd5b815161112f816110fc565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b60008151611572818560208601611136565b9290920192915050565b600080845481600182811c91508083168061159857607f831692505b602080841082036115b757634e487b7160e01b86526022600452602486fd5b8180156115cb57600181146115dc57611609565b60ff19861689528489019650611609565b60008b81526020902060005b868110156116015781548b8201529085019083016115e8565b505084890196505b5050505050506116198185611560565b95945050505050565b60006001820161163457611634611479565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826116605761166061163b565b500490565b60008282101561167757611677611479565b500390565b60008261168b5761168b61163b565b500690565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220dde1ba73f022558a9f5440011347872a3dd5dc15b15c0ca461f6e472f00256a464736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106101815760003560e01c806370a08231116100d1578063a9722cf31161008a578063cd85cdb511610064578063cd85cdb514610441578063e005ae2b14610456578063e985e9c514610476578063f2fde38b146104b157600080fd5b8063a9722cf3146103e0578063b88d4fde14610401578063c87b56dd1461042157600080fd5b806370a0823114610343578063715018a6146103635780638da5cb5b14610378578063902d55a51461039657806395d89b41146103ab578063a22cb465146103c057600080fd5b806323cf0a221161013e57806342842e0e1161011857806342842e0e146102ce57806355f804b3146102ee5780636352211e1461030e5780636c0360eb1461032e57600080fd5b806323cf0a22146102915780632be09561146102a45780633ccfd60b146102b957600080fd5b806301ffc9a71461018657806306fdde03146101bb578063081812fc146101dd578063095ea7b31461022b57806318160ddd1461024d57806323b872dd14610271575b600080fd5b34801561019257600080fd5b506101a66101a1366004611112565b6104d1565b60405190151581526020015b60405180910390f35b3480156101c757600080fd5b506101d061053e565b6040516101b29190611166565b3480156101e957600080fd5b506102136101f8366004611199565b6005602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101b2565b34801561023757600080fd5b5061024b6102463660046111c9565b6105cc565b005b34801561025957600080fd5b5061026360085481565b6040519081526020016101b2565b34801561027d57600080fd5b5061024b61028c3660046111f3565b6106b3565b61024b61029f36600461122f565b61087a565b3480156102b057600080fd5b5061024b610935565b3480156102c557600080fd5b5061024b610974565b3480156102da57600080fd5b5061024b6102e93660046111f3565b6109fb565b3480156102fa57600080fd5b5061024b610309366004611269565b610af3565b34801561031a57600080fd5b50610213610329366004611199565b610b30565b34801561033a57600080fd5b506101d0610b87565b34801561034f57600080fd5b5061026361035e36600461131a565b610b94565b34801561036f57600080fd5b5061024b610bf7565b34801561038457600080fd5b506000546001600160a01b0316610213565b3480156103a257600080fd5b50610263606581565b3480156103b757600080fd5b506101d0610c34565b3480156103cc57600080fd5b5061024b6103db366004611335565b610c41565b3480156103ec57600080fd5b506007546101a690600160a01b900460ff1681565b34801561040d57600080fd5b5061024b61041c366004611371565b610cad565b34801561042d57600080fd5b506101d061043c366004611199565b610d95565b34801561044d57600080fd5b5061024b610dc9565b34801561046257600080fd5b50600754610213906001600160a01b031681565b34801561048257600080fd5b506101a661049136600461140c565b600660209081526000928352604080842090915290825290205460ff1681565b3480156104bd57600080fd5b5061024b6104cc36600461131a565b610e02565b60006307f5828d60e41b6001600160e01b03198316148061050257506380ac58cd60e01b6001600160e01b03198316145b8061051d5750635b5e139f60e01b6001600160e01b03198316145b8061053857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6001805461054b9061143f565b80601f01602080910402602001604051908101604052809291908181526020018280546105779061143f565b80156105c45780601f10610599576101008083540402835291602001916105c4565b820191906000526020600020905b8154815290600101906020018083116105a757829003601f168201915b505050505081565b6000818152600360205260409020546001600160a01b03163381148061061557506001600160a01b038116600090815260066020908152604080832033845290915290205460ff165b6106575760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000818152600360205260409020546001600160a01b038481169116146107095760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640161064e565b6001600160a01b0382166107535760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161064e565b336001600160a01b038416148061078d57506001600160a01b038316600090815260066020908152604080832033845290915290205460ff165b806107ae57506000818152600560205260409020546001600160a01b031633145b6107eb5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161064e565b6001600160a01b0380841660008181526004602090815260408083208054600019019055938616808352848320805460010190558583526003825284832080546001600160a01b03199081168317909155600590925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60018161ffff1611156108a05760405163ed302ecd60e01b815260040160405180910390fd5b60658161ffff166008546108b4919061148f565b11156108d357604051637364ba1760e01b815260040160405180910390fd5b600754600160a01b900460ff166108fd57604051630314872760e11b815260040160405180910390fd5b60005b8161ffff168161ffff1610156109315761091f33600854600101610e4f565b60088054600190810190915501610900565b5050565b6007546001600160a01b0316331461095f5760405162461bcd60e51b815260040161064e906114a7565b6007805460ff60a01b1916600160a01b179055565b6007546001600160a01b0316331461099e5760405162461bcd60e51b815260040161064e906114a7565b476000036109bf57604051631189da5b60e11b815260040160405180910390fd5b6007546040516001600160a01b03909116904780156108fc02916000818181858888f193505050501580156109f8573d6000803e3d6000fd5b50565b610a068383836106b3565b6001600160a01b0382163b1580610aaf5750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610a7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa391906114ef565b6001600160e01b031916145b610aee5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161064e565b505050565b6007546001600160a01b03163314610b1d5760405162461bcd60e51b815260040161064e906114a7565b8051610931906009906020840190611063565b6000818152600360205260409020546001600160a01b031680610b825760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b604482015260640161064e565b919050565b6009805461054b9061143f565b60006001600160a01b038216610bdb5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640161064e565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314610c22576040516330cd747160e01b815260040160405180910390fd5b600080546001600160a01b0319169055565b6002805461054b9061143f565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610cb88585856106b3565b6001600160a01b0384163b1580610d4f5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290610d009033908a9089908990899060040161150c565b6020604051808303816000875af1158015610d1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4391906114ef565b6001600160e01b031916145b610d8e5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161064e565b5050505050565b60606009610da283610f5a565b604051602001610db392919061157c565b6040516020818303038152906040529050919050565b6007546001600160a01b03163314610df35760405162461bcd60e51b815260040161064e906114a7565b6007805460ff60a01b19169055565b6000546001600160a01b03163314610e2d576040516330cd747160e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038216610e995760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161064e565b6000818152600360205260409020546001600160a01b031615610eef5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161064e565b6001600160a01b038216600081815260046020908152604080832080546001019055848352600390915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606081600003610f815750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610fab5780610f9581611622565b9150610fa49050600a83611651565b9150610f85565b60008167ffffffffffffffff811115610fc657610fc6611253565b6040519080825280601f01601f191660200182016040528015610ff0576020820181803683370190505b5090505b841561105b57611005600183611665565b9150611012600a8661167c565b61101d90603061148f565b60f81b81838151811061103257611032611690565b60200101906001600160f81b031916908160001a905350611054600a86611651565b9450610ff4565b949350505050565b82805461106f9061143f565b90600052602060002090601f01602090048101928261109157600085556110d7565b82601f106110aa57805160ff19168380011785556110d7565b828001600101855582156110d7579182015b828111156110d75782518255916020019190600101906110bc565b506110e39291506110e7565b5090565b5b808211156110e357600081556001016110e8565b6001600160e01b0319811681146109f857600080fd5b60006020828403121561112457600080fd5b813561112f816110fc565b9392505050565b60005b83811015611151578181015183820152602001611139565b83811115611160576000848401525b50505050565b6020815260008251806020840152611185816040850160208701611136565b601f01601f19169190910160400192915050565b6000602082840312156111ab57600080fd5b5035919050565b80356001600160a01b0381168114610b8257600080fd5b600080604083850312156111dc57600080fd5b6111e5836111b2565b946020939093013593505050565b60008060006060848603121561120857600080fd5b611211846111b2565b925061121f602085016111b2565b9150604084013590509250925092565b60006020828403121561124157600080fd5b813561ffff8116811461112f57600080fd5b634e487b7160e01b600052604160045260246000fd5b60006020828403121561127b57600080fd5b813567ffffffffffffffff8082111561129357600080fd5b818401915084601f8301126112a757600080fd5b8135818111156112b9576112b9611253565b604051601f8201601f19908116603f011681019083821181831017156112e1576112e1611253565b816040528281528760208487010111156112fa57600080fd5b826020860160208301376000928101602001929092525095945050505050565b60006020828403121561132c57600080fd5b61112f826111b2565b6000806040838503121561134857600080fd5b611351836111b2565b91506020830135801515811461136657600080fd5b809150509250929050565b60008060008060006080868803121561138957600080fd5b611392866111b2565b94506113a0602087016111b2565b935060408601359250606086013567ffffffffffffffff808211156113c457600080fd5b818801915088601f8301126113d857600080fd5b8135818111156113e757600080fd5b8960208285010111156113f957600080fd5b9699959850939650602001949392505050565b6000806040838503121561141f57600080fd5b611428836111b2565b9150611436602084016111b2565b90509250929050565b600181811c9082168061145357607f821691505b60208210810361147357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156114a2576114a2611479565b500190565b60208082526028908201527f4f776e61626c653a2063616c6c6572206973206e6f742074686520626967676560408201526739ba103430ba32b960c11b606082015260800190565b60006020828403121561150157600080fd5b815161112f816110fc565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b60008151611572818560208601611136565b9290920192915050565b600080845481600182811c91508083168061159857607f831692505b602080841082036115b757634e487b7160e01b86526022600452602486fd5b8180156115cb57600181146115dc57611609565b60ff19861689528489019650611609565b60008b81526020902060005b868110156116015781548b8201529085019083016115e8565b505084890196505b5050505050506116198185611560565b95945050505050565b60006001820161163457611634611479565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826116605761166061163b565b500490565b60008282101561167757611677611479565b500390565b60008261168b5761168b61163b565b500690565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220dde1ba73f022558a9f5440011347872a3dd5dc15b15c0ca461f6e472f00256a464736f6c634300080d0033

Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.