ETH Price: $3,814.09 (+5.08%)

Contract

0xE5B7a3369FAce9623Da22f579B2951CAA92F9B7D
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Age:1H
Reset Filter

Transaction Hash
Method
Block
From
To

There are no matching entries

Update your filters to view other transactions

Advanced mode:
Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TheHoursArt

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 400 runs

Other Settings:
default evmVersion
File 1 of 10 : TheHoursArt.sol
// SPDX-License-Identifier: GPL-3.0
/// @title TheHours2Art.sol
/// @author Lawrence X Rogers
/// @dev this contract handles the assembly of mints into a TheHours SVG

pragma solidity ^0.8.19;
import "./Jackson2SVGs.sol";
import "./ArtParams.sol";
import "./Mint.sol";
import "hardhat/console.sol";
import "contracts/interfaces/ITheHours.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

contract TheHoursArt is Jackson2SVGs, ITheHoursArt {
    using Strings for uint256;
    using Strings for int256;
    using Mint for bytes32;

    uint8 constant MINT_TYPE_INDEX = 0;

    /// @notice generates an SVG from a list of mints, up to index @index
    function generateSVG(bytes32[] memory mints, uint256 index)
        external
        pure
        returns (bytes memory svg)
    {
        uint256 effectsTotal = countEffects(mints);
        bytes[] memory effectsQueue = new bytes[](effectsTotal);
        uint256 effectsIndex = 0;
        bytes memory bgColor = "nobackgroundspecified";

        for (uint256 i1 = index + 1; i1 > 0; i1--) {
            uint256 i = i1 - 1;
            bytes32 mint = mints[i];
            if (mint.isBackground() && bgColor.length == 21) {
                bgColor = extractColor(mint, 1);
            }
            else {
                if (mint.isBackground()) continue;
                else if (mint.isShape()) {
                    svg = bytes.concat(getShapeSVG(mint), svg);
                } else {
                    svg = bytes.concat("</g></g>", svg);
                    effectsQueue[effectsIndex++] = getEffectSVG(mint, i);
                }
            }
        }
        
        for (int256 i = int256(effectsIndex) - 1; i >= 0; i--) {
            svg = bytes.concat(effectsQueue[uint256(i)], svg);
        }
        
        if (bgColor.length == 21) { // length of "nobackgroundspecified"
            bgColor = "white";
        }
        return abi.encodePacked(svg_begin, bgColor, svg_begin_2, svg, svg_end);
    }

    /// @notice checks which type of shape the Mint is, and calls the corresponding function
    function getShapeSVG(bytes32 mint)
        internal
        pure
        returns (bytes memory shapeSVG)
    {
        if (mint.mintType() == MINT_TYPE_RECTANGLE) {
            return getRectangleSVG(mint);
        } else if (mint.mintType() == MINT_TYPE_CIRCLE) {
            return getCircleSVG(mint);
        }
    }

    /// @notice checks which type of Effect the Mint is, and calls the corresponding function
    function getEffectSVG(bytes32 mint, uint256 id)
        internal
        pure
        returns (bytes memory)
    {
        if (mint.mintType() == MINT_TYPE_ROTATE) return getRotateSVG(mint);    
        else if (mint.mintType() == MINT_TYPE_QUAD) return getQuadSVG(mint, id);
        else if (mint.mintType() == MINT_TYPE_SHEAR) return getShearSVG(mint, id);
        else if (mint.mintType() == MINT_TYPE_WINDOW_RECTANGLE) return getWindowRectangleSVG(mint, id);
        else if (mint.mintType() == MINT_TYPE_WINDOW_CIRCLE) return getWindowCircleSVG(mint, id);
        else if (mint.mintType() == MINT_TYPE_TILE) return getTileSVG(mint, id);
        else if (mint.mintType() == MINT_TYPE_SCALE) return getScaleSVG(mint);
        else if (mint.mintType() == MINT_TYPE_ITALICIZE) return getItalicizeSVG(mint);
        return "";
    }

    function countEffects(bytes32[] memory mints)
        internal
        pure
        returns (uint256 count)
    {
        for (uint256 i = 0; i < mints.length; i++) {
            if (mints[i].isEffect()) count++;
        }
    }
}

File 2 of 10 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

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

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

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

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

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

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

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

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

File 3 of 10 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 4 of 10 : Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

File 5 of 10 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

import "./math/Math.sol";

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

File 6 of 10 : ArtParams.sol
pragma solidity ^0.8.10;
uint256 constant MINT_TYPES_COUNT = 11;
uint256 constant MINT_TYPE_NONE = 255;
uint256 constant MINT_TYPE_RECTANGLE = 0;
uint256 constant MINT_TYPE_CIRCLE = 1;
uint256 constant MINT_TYPE_ROTATE = 2;
uint256 constant MINT_TYPE_QUAD = 3;
uint256 constant MINT_TYPE_SHEAR = 4;
uint256 constant MINT_TYPE_BACKGROUND = 5;
uint256 constant MINT_TYPE_WINDOW_RECTANGLE = 6;
uint256 constant MINT_TYPE_WINDOW_CIRCLE = 7;
uint256 constant MINT_TYPE_TILE = 8;
uint256 constant MINT_TYPE_SCALE = 9;
uint256 constant MINT_TYPE_ITALICIZE = 10;
int256 constant MIN_OPACITY = 40;
int256 constant MAX_OPACITY = 80;
int256 constant PAINTABLE_MIN_X = -140;
int256 constant PAINTABLE_MIN_Y = -190;
int256 constant RECTANGLE_MIN_WIDTH = 5;
int256 constant CIRCLE_MIN_RADIUS = 5;
int256 constant CIRCLE_MAX_RADIUS = 300;
int256 constant QUAD_MIN_AMOUNT = -100;
int256 constant QUAD_MAX_AMOUNT = 250;
int256 constant SHEAR_MIN_SLICES = 2;
int256 constant SHEAR_MAX_SLICES = 6;
int256 constant SHEAR_MIN_AMOUNT = -600;
int256 constant SHEAR_MAX_AMOUNT = 600;
int256 constant WINDOW_RECTANGLE_MIN_WIDTH = 50;
int256 constant WINDOW_CIRCLE_MIN_RADIUS = 50;
bytes constant svg_begin = hex"0a202020203c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f7376672220786d6c6e733a786c696e6b3d2022687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b222076696577426f783d222d313530202d3230302033303020343030223e3c7265637420783d222d3135302220793d222d323030222077696474683d2233303022206865696768743d22343030222066696c6c3d22";
bytes constant svg_begin_2 = hex"22202f3e2020202020202020202020200a20202020202020203c636c6970506174682069643d2263616e766173223e0a2020202020202020202020203c7265637420783d222d3134302220793d222d313930222077696474683d2232383022206865696768743d22333830222f3e0a20202020202020203c2f636c6970506174683e0a20202020202020203c672069643d2274686563616e76617322207374796c653d22636c69702d706174683a75726c282363616e76617329223e";
bytes constant svg_end = hex"3c2f673e3c2f7376673e";

File 7 of 10 : ITheHours.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.10;

import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol";

interface ITheHours is IERC721 {
    function mint(bytes32 _mintDetails, address _to) external;

    function validateBid(bytes32 mintDetails, bool isInAllowlist)
        external
        returns (bool);

    function tokenCounter() external returns (uint256);

    function finished() external returns (bool);
}

interface ITheHoursArt {
    function generateSVG(bytes32[] memory mints, uint256 index) external view returns (bytes memory svg);
}

File 8 of 10 : Jackson2SVGs.sol
// SPDX-License-Identifier: GPL-3.0
/// @title Jackson2SVGs
/// @dev this contract contains all the code to convert
/// mints (as bytes32) into SVG snippets.

pragma solidity ^0.8.19;

import "./ArtParams.sol";
import "./Mint.sol";
import "hardhat/console.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

contract Jackson2SVGs {
    using Mint for bytes32;
    using Strings for uint256;
    
    /// SHAPES ******************************************

    function getRectangleSVG(bytes32 mint) internal pure returns (bytes memory rectangleSVG) {
        rectangleSVG = abi.encodePacked(
            "<rect x='", intToString(byteToInt(mint[1], PAINTABLE_MIN_X, PAINTABLE_MIN_X * -1)),
            "' y='", intToString(byteToInt(mint[2], PAINTABLE_MIN_Y, PAINTABLE_MIN_Y * -1)),
            "' width='", intToString(byteToInt(mint[3], RECTANGLE_MIN_WIDTH, PAINTABLE_MIN_X * -2)),
            "' height='", intToString(byteToInt(mint[4], RECTANGLE_MIN_WIDTH, PAINTABLE_MIN_Y * -2)),
            "' fill='", extractColor(mint, 5),
            "' opacity='0.", intToString(byteToInt(mint[8], MIN_OPACITY, MAX_OPACITY)),
            "' />");
    }

    function getCircleSVG(bytes32 mint) internal pure returns (bytes memory) {
        return abi.encodePacked(
            "<circle cx='", intToString(byteToInt(mint[1], PAINTABLE_MIN_X, PAINTABLE_MIN_X * -1)),
            "' cy='", intToString(byteToInt(mint[2], PAINTABLE_MIN_Y, PAINTABLE_MIN_Y * -1)),
            "' r='", intToString(byteToInt(mint[3], CIRCLE_MIN_RADIUS, CIRCLE_MAX_RADIUS)),
            "' fill='", extractColor(mint, 4),
            "' opacity='0.", intToString(byteToInt(mint[7], MIN_OPACITY, MAX_OPACITY)),
            "' />");
    }

    /// EFFECTS ******************************************

    function getRotateSVG(bytes32 mint) internal pure returns (bytes memory) {
        return abi.encodePacked('<g transform="rotate(', intToString(byteToInt(mint[1], -180, 180)), ')" ><g>');
    }

    function getQuadSVG(bytes32 mint, uint id) internal pure returns (bytes memory) {
        int a = byteToInt(mint[1], QUAD_MIN_AMOUNT, QUAD_MAX_AMOUNT);
        string memory amount = intToString(a);
        string memory nAmount = intToString(a * -1);
        
        return abi.encodePacked(
            '<filter id="quad', id.toString(),
            '" x="-140" y="-190" width="280" height="380">',
            '<feOffset in="SourceGraphic" x="-140" y="-190" width="140" height="190" dx="', nAmount, '" dy="', nAmount, '" result="o1"/>',
            '<feOffset in="SourceGraphic" x="0" y="-190" width="140" height="190" dx="', amount, '" dy="',nAmount,'" result="o2"/>',
            '<feOffset in="SourceGraphic" x="-140" y="0" width="140" height="190" dx="', nAmount, '" dy="', amount,'" result="o3"/>',
            '<feOffset in="SourceGraphic" x="0" y="0" width="140" height="190" dx="', amount, '" dy="', amount, '" result="o4"/>',
            '<feMerge><feMergeNode in="o1"/><feMergeNode in="o2" /><feMergeNode in="o3"/><feMergeNode in="o4"/></feMerge>',
            '</filter><g filter="url(#quad', id.toString(), ')"><g>'
        );
    }

    function getShearSVG(bytes32 mint, uint id) internal pure returns (bytes memory) {
        int amount = byteToInt(mint[1], SHEAR_MIN_AMOUNT, SHEAR_MAX_AMOUNT);
        int slices = byteToInt(mint[2], SHEAR_MIN_SLICES, SHEAR_MAX_SLICES);

        bytes memory offsetsSVG = '';
        int sliceWidth = 280 / slices;
        for (int i = 0; i < slices; i++) {
            int dy = ((((i * 100) - ((slices * 100) - 100)/2) / slices) * amount) / 100;

            offsetsSVG = abi.encodePacked(offsetsSVG,
                '<feOffset in="SourceGraphic" x="',
                intToString(-140 + (sliceWidth * i)),
                '" y="-190" width="', intToString(sliceWidth), '" height="380" dy="',
                intToString(dy),
                '" result="d', intToString(i), '"/>');
        }

        bytes memory mergeSVG = '<feMerge>';
        for (uint i = 0; i < uint(slices); i++) {
            mergeSVG = abi.encodePacked(mergeSVG, '<feMergeNode in="d', i.toString(), '"/>');
        }
        mergeSVG = abi.encodePacked(mergeSVG, '</feMerge>');

        return abi.encodePacked(
            '<filter id="shear', id.toString(),
            '" x="-140" y="-190" width="280" height="380">',
            offsetsSVG,
            mergeSVG,
            '</filter><g filter="url(#shear', id.toString(), ')"><g>'
        );
    }

    function getWindowRectangleSVG(bytes32 mint, uint id) internal pure returns (bytes memory) {
        return abi.encodePacked(
            "<mask id='maskr", id.toString(),
            "'><rect x='", intToString(byteToInt(mint[1], PAINTABLE_MIN_X, PAINTABLE_MIN_X * -1)),
            "' y='", intToString(byteToInt(mint[2], PAINTABLE_MIN_Y, PAINTABLE_MIN_Y * -1)),
            "' width='", intToString(byteToInt(mint[3], WINDOW_RECTANGLE_MIN_WIDTH, PAINTABLE_MIN_X * -2)),
            "' height='", intToString(byteToInt(mint[4], WINDOW_RECTANGLE_MIN_WIDTH, PAINTABLE_MIN_Y * -2)),
            "' fill='white'/></mask><g mask='url(#maskr", id.toString(), ")'><g>"
        );
    }

    function getWindowCircleSVG(bytes32 mint, uint id) internal pure returns (bytes memory) {
        return abi.encodePacked(
            "<mask id='maskc", id.toString(),
            "'><circle cx='", intToString(byteToInt(mint[1], PAINTABLE_MIN_X, PAINTABLE_MIN_X * -1)),
            "' cy='", intToString(byteToInt(mint[2], PAINTABLE_MIN_Y, PAINTABLE_MIN_Y * -1)),
            "' r='", intToString(byteToInt(mint[3], WINDOW_CIRCLE_MIN_RADIUS, CIRCLE_MAX_RADIUS)),
            "' fill='white'/></mask><g mask='url(#maskc", id.toString(), ")'><g>"
        );
    }

    function getTileSVG(bytes32 mint, uint id) internal pure returns (bytes memory) {
        return abi.encodePacked(
            "<filter id='tile", id.toString(), "' x='-140' y='-190' width='280' height='380'><feOffset dx='0' x='"
            , intToString(byteToInt(mint[1], PAINTABLE_MIN_X, PAINTABLE_MIN_X * -1)),
            "' y='", intToString(byteToInt(mint[2], PAINTABLE_MIN_Y, PAINTABLE_MIN_Y * -1)),
            "' width='", intToString(byteToInt(mint[3], WINDOW_RECTANGLE_MIN_WIDTH, PAINTABLE_MIN_X * -2)),
            "' height='", intToString(byteToInt(mint[4], WINDOW_RECTANGLE_MIN_WIDTH, PAINTABLE_MIN_Y * -2)),
            "' result='in'/><feTile in='in' x='-140' y='-190' width='280' height='380'/></filter><g filter='url(#tile", id.toString(), ")'><g>"
        );
    }

    function getScaleSVG(bytes32 mint) internal pure returns (bytes memory) {
        return abi.encodePacked(
            "<g transform='scale(", toDecimal(byteToInt(mint[1], 50, 200)), " ", toDecimal(byteToInt(mint[2], 50, 200)), ")'><g>"
        );
    }

    function getItalicizeSVG(bytes32 mint) internal pure returns (bytes memory) {
        return abi.encodePacked("<g transform='skewX(", intToString(byteToInt(mint[1], -50, 50)), ")'><g>"
        );
    }

    /// UTILITY FUNCTIONS ********************************

    function intToString(int i) internal pure returns (string memory) {
        if (i >= 0) {
            return uint(i).toString();
        }
        else {
            return string(abi.encodePacked("-", uint(i * -1).toString()));
        }
    }

    // ONLY POSITIVE INTEGERS OUT OF 100
    function toDecimal(int i) internal pure returns (bytes memory) {
        int whole = (i / 100);
        int decimal = (i % 100);
        string memory point = decimal >= 10 ? "." : (decimal > 0 ? ".0" : ".00");
        return abi.encodePacked(intToString(whole), point, intToString(decimal));
    }

    function extractColor(bytes32 mint, uint index) internal pure returns (bytes memory) {
        return abi.encodePacked("rgb(",
                Strings.toString(uint8(mint[index])), ",",
                Strings.toString(uint8(mint[index + 1])), ",",
                Strings.toString(uint8(mint[index + 2])),
            ")");
    }

    function byteToInt(bytes1 _byte, int min, int max) internal pure returns (int theInt) {
        int percent = (int16(uint16(uint8(_byte)) * 100) / 255);
        int i = min + (percent * (max - min) / 100);
        return i;
    }
}

File 9 of 10 : Mint.sol
// SPDX-License-Identifier: GPL-3.0
/// @title Mint.sol
/// @author Lawrence X Rogers
/// @dev this Library has some useful utility functions for the Mints stored as Bytes32

pragma solidity ^0.8.10;
import "./ArtParams.sol";

library Mint {
    function mintType(bytes32 mint) internal pure returns (uint256) {
        return uint256(uint8(mint[0]));
    }

    function isShape(bytes32 mint) internal pure returns (bool) {
        return mintType(mint) <= MINT_TYPE_CIRCLE;
    }

    function isBackground(bytes32 mint) internal pure returns (bool) {
        return mintType(mint) == MINT_TYPE_BACKGROUND;
    }

    function isEffect(bytes32 mint) internal pure returns (bool) {
        return mintType(mint) > MINT_TYPE_CIRCLE && mintType(mint) != MINT_TYPE_BACKGROUND;
    }

    function isFinishingTouch(bytes32 mint) internal pure returns (bool) {
        return mint[31] == 0x01;
    }
}

File 10 of 10 : console.sol
// SPDX-License-Identifier: MIT
pragma solidity >= 0.4.22 <0.9.0;

library console {
	address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

	function _sendLogPayload(bytes memory payload) private view {
		uint256 payloadLength = payload.length;
		address consoleAddress = CONSOLE_ADDRESS;
		assembly {
			let payloadStart := add(payload, 32)
			let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
		}
	}

	function log() internal view {
		_sendLogPayload(abi.encodeWithSignature("log()"));
	}

	function logInt(int256 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
	}

	function logUint(uint256 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
	}

	function logString(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function logBool(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function logAddress(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function logBytes(bytes memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
	}

	function logBytes1(bytes1 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
	}

	function logBytes2(bytes2 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
	}

	function logBytes3(bytes3 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
	}

	function logBytes4(bytes4 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
	}

	function logBytes5(bytes5 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
	}

	function logBytes6(bytes6 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
	}

	function logBytes7(bytes7 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
	}

	function logBytes8(bytes8 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
	}

	function logBytes9(bytes9 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
	}

	function logBytes10(bytes10 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
	}

	function logBytes11(bytes11 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
	}

	function logBytes12(bytes12 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
	}

	function logBytes13(bytes13 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
	}

	function logBytes14(bytes14 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
	}

	function logBytes15(bytes15 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
	}

	function logBytes16(bytes16 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
	}

	function logBytes17(bytes17 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
	}

	function logBytes18(bytes18 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
	}

	function logBytes19(bytes19 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
	}

	function logBytes20(bytes20 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
	}

	function logBytes21(bytes21 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
	}

	function logBytes22(bytes22 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
	}

	function logBytes23(bytes23 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
	}

	function logBytes24(bytes24 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
	}

	function logBytes25(bytes25 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
	}

	function logBytes26(bytes26 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
	}

	function logBytes27(bytes27 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
	}

	function logBytes28(bytes28 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
	}

	function logBytes29(bytes29 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
	}

	function logBytes30(bytes30 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
	}

	function logBytes31(bytes31 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
	}

	function logBytes32(bytes32 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
	}

	function log(uint256 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
	}

	function log(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function log(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function log(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function log(uint256 p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
	}

	function log(uint256 p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
	}

	function log(uint256 p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
	}

	function log(uint256 p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
	}

	function log(string memory p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
	}

	function log(string memory p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
	}

	function log(string memory p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
	}

	function log(string memory p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
	}

	function log(bool p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
	}

	function log(bool p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
	}

	function log(bool p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
	}

	function log(bool p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
	}

	function log(address p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
	}

	function log(address p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
	}

	function log(address p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
	}

	function log(address p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
	}

	function log(uint256 p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
	}

	function log(uint256 p0, uint256 p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
	}

	function log(uint256 p0, uint256 p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
	}

	function log(uint256 p0, uint256 p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
	}

	function log(uint256 p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
	}

	function log(uint256 p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
	}

	function log(uint256 p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
	}

	function log(uint256 p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
	}

	function log(uint256 p0, bool p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
	}

	function log(uint256 p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
	}

	function log(uint256 p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
	}

	function log(uint256 p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
	}

	function log(uint256 p0, address p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
	}

	function log(uint256 p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
	}

	function log(uint256 p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
	}

	function log(uint256 p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
	}

	function log(string memory p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
	}

	function log(string memory p0, uint256 p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
	}

	function log(string memory p0, uint256 p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
	}

	function log(string memory p0, uint256 p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
	}

	function log(string memory p0, address p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
	}

	function log(string memory p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
	}

	function log(string memory p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
	}

	function log(string memory p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
	}

	function log(bool p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
	}

	function log(bool p0, uint256 p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
	}

	function log(bool p0, uint256 p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
	}

	function log(bool p0, uint256 p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
	}

	function log(bool p0, bool p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
	}

	function log(bool p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
	}

	function log(bool p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
	}

	function log(bool p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
	}

	function log(bool p0, address p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
	}

	function log(bool p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
	}

	function log(bool p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
	}

	function log(bool p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
	}

	function log(address p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
	}

	function log(address p0, uint256 p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
	}

	function log(address p0, uint256 p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
	}

	function log(address p0, uint256 p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
	}

	function log(address p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
	}

	function log(address p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
	}

	function log(address p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
	}

	function log(address p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
	}

	function log(address p0, bool p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
	}

	function log(address p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
	}

	function log(address p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
	}

	function log(address p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
	}

	function log(address p0, address p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
	}

	function log(address p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
	}

	function log(address p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
	}

	function log(address p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
	}

	function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, uint256 p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
	}

	function log(uint256 p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint256 p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint256 p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint256 p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint256 p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint256 p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint256 p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
	}

}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bytes32[]","name":"mints","type":"bytes32[]"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"generateSVG","outputs":[{"internalType":"bytes","name":"svg","type":"bytes"}],"stateMutability":"pure","type":"function"}]

6080806040523461001657612299908161001c8239f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c634d6747bb1461002757600080fd5b346106685760403660031901126106685760043567ffffffffffffffff8111610668573660238201121561066857806004013590610064826106f9565b9161007260405193846106d7565b8083526024602084019160051b8301019136831161066857602401905b828210610658576000602435856060835b82518110156100f7576100b38184610750565b5160001a6001811190816100eb575b506100d6575b6100d19061077a565b6100a0565b936100e36100d19161077a565b9490506100c8565b600591501415866100c2565b5092610102816106f9565b9061011060405192836106d7565b80825261011f601f19916106f9565b0160005b81811061064757505060009160405161013b8161066d565b601581527f6e6f6261636b67726f756e6473706563696669656400000000000000000000006020820152936001810180911161048e5790815b6104a45750506000199182810190811360011661048e5791905b60008312156104625761042f60408587601582511461043d575b610414602084516101b88161069f565b60ac81527f0a202020203c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f8282019081527f72672f323030302f7376672220786d6c6e733a786c696e6b3d2022687474703a878301527f2f2f7777772e77332e6f72672f313939392f786c696e6b222076696577426f7860608301527f3d222d313530202d3230302033303020343030223e3c7265637420783d222d3160808301527f35302220793d222d323030222077696474683d2233303022206865696768743d60a08301526b111a181811103334b6361e9160a11b60c08301528651909461029c8261069f565b60bc8252610408848301917f22202f3e2020202020202020202020200a20202020202020203c636c6970506183527f74682069643d2263616e766173223e0a2020202020202020202020203c7265638a8501527f7420783d222d3134302220793d222d313930222077696474683d22323830222060608501527f6865696768743d22333830222f3e0a20202020202020203c2f636c697050617460808501527f683e0a20202020202020203c672069643d2274686563616e766173222073747960a08501527f6c653d22636c69702d706174683a75726c282363616e76617329223e0000000060c08501528951926103938461066d565b600a845286840194691e17b39f1e17b9bb339f60b11b86526103e78c519b8c986103c58b8b019d8e9251928391610711565b89016103d9825180938d8085019101610711565b01915180938a840190610711565b016103fa82518093898085019101610711565b019151809386840190610711565b010380855201836106d7565b82519384926020845251809281602086015285850190610711565b601f01601f19168101030190f35b9050815161044a8161066d565b6005815264776869746560d81b6020820152906101a8565b909193610479906104738684610750565b51610789565b93600160ff1b811461048e578201919061018e565b634e487b7160e01b600052601160045260246000fd5b90938460001981011161048e576104bf600019860183610750565b519060058260001a1480809161063c575b1561059157505061057e60276104e88360011a6107c0565b6105006104f78560021a6107c0565b9460031a6107c0565b602960f81b604051958693630e4cec4560e31b602086015261052c815180926020602489019101610711565b8401600b60fa1b908160248201528251906105508260259560208785019101610711565b019182015282519061056b8260269560208785019101610711565b01918201520360078101845201826106d7565b935b801561048e57600019019081610174565b90959190156105a05750610580565b9095906001600082901a116105c757906105bc6105c192610928565b610789565b94610580565b959061061a6106369161060e60405191671e17b39f1e17b39f60c11b60208401528281516105fe8160289460208686019101610711565b81010360088101845201826106d7565b97600019840190611077565b946106248161077a565b9561062f8287610750565b5284610750565b50610580565b5060158251146104d0565b806060602080938601015201610123565b813581526020918201910161008f565b600080fd5b6040810190811067ffffffffffffffff82111761068957604052565b634e487b7160e01b600052604160045260246000fd5b60e0810190811067ffffffffffffffff82111761068957604052565b6020810190811067ffffffffffffffff82111761068957604052565b90601f8019910116810190811067ffffffffffffffff82111761068957604052565b67ffffffffffffffff81116106895760051b60200190565b60005b8381106107245750506000910152565b8181015183820152602001610714565b67ffffffffffffffff811161068957601f01601f191660200190565b80518210156107645760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b600019811461048e5760010190565b60206107be9193929360405194816107aa8793518092868087019101610711565b820161040882518093868085019101610711565b565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008082101561091a575b506d04ee2d6d415b85acef81000000008083101561090b575b50662386f26fc10000808310156108fc575b506305f5e100808310156108ed575b50612710808310156108de575b5060648210156108ce575b600a809210156108c4575b6001908160218186019561085987610734565b9661086760405198896106d7565b808852610876601f1991610734565b01366020890137860101905b61088e575b5050505090565b600019019083906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a8353049182156108bf57919082610882565b610887565b9160010191610846565b919060646002910491019161083b565b60049193920491019138610830565b60089193920491019138610823565b60109193920491019138610814565b60209193920491019138610802565b6040935081049150386107e9565b600090606081831a80610c0157505061094e6109498260011a60f81b610eed565b610e72565b906109616109498260021a60f81b610f35565b9260648260031a029061ffff91828116908103610bed5760ff9060010b0560010b61011390818102918183051490151715610bed5761094960646109a59205610ecb565b9160648460041a02908116908103610bed5760ff9060010b0560010b9061017791828102928184051490151715610bd95750606490056109e490610ecb565b6109ed90610e72565b918060051a6109fb906107c0565b908060061a610a09906107c0565b938160071a610a17906107c0565b91604051809360209788830196630e4cec4560e31b8852805190818b60248701920191610a4392610711565b830190600b60fa1b91826024820152815191828c60258401920191610a6792610711565b01906025820152815191828a60268401920191610a8392610711565b0160268101602960f81b905203600781018452602701610aa390846106d7565b60081a60f81b610ab290610f7d565b610abb90610e72565b93604051978897878901683c7265637420783d2760b81b9052805190818960298c01920191610ae992610711565b880160298101642720793d2760d81b90528151918289602e8401920191610b0f92610711565b01602e810168272077696474683d2760b81b9052815191828860378401920191610b3892610711565b01603781016927206865696768743d2760b01b9052815191828760418401920191610b6292610711565b01906041820167272066696c6c3d2760c01b905251918260498301610b8692610711565b0190604982016c139037b830b1b4ba3c9e93981760991b90528051809360568401920191610bb392610711565b0160568101631390179f60e11b905203603a81018252605a01610bd690826106d7565b90565b634e487b7160e01b81526011600452602490fd5b634e487b7160e01b82526011600452602482fd5b90939290600114610c10575050565b90919250610c266109498360011a60f81b610eed565b91610c396109498260021a60f81b610f35565b9160648260031a0261ffff8116908103610bed5760ff9060010b0560010b9061012791828102928184051490151715610bd9575092610bd692605092610e06630e4cec4560e31b610c926109496064610d789a05610ecb565b92610dde610ca28260041a6107c0565b94610d4c610949610cb58560051a6107c0565b94610d416027610cc78360061a6107c0565b97604051988991610d2860209e8f908186019e8f52610cef815180928460248a019101610711565b850192600b60fa1b93846024820152610d118251809385602585019101610711565b019260258401528351938491602685019101610711565b01602960f81b60268201520360078101895201876106d7565b60071a60f81b610f7d565b96602c6040519c8d809b6b3c636972636c652063783d2760a01b8b8301528a8151948593019101610711565b890165272063793d2760d01b602c820152610d9c825180938a603285019101610711565b01642720723d2760d81b6032820152610dbe8251809389603785019101610711565b019167272066696c6c3d2760c01b6037840152518093603f840190610711565b01916c139037b830b1b4ba3c9e93981760991b603f8401528351938491604c85019101610711565b01631390179f60e11b604c8201520360308101845201826106d7565b908160000391808305600019149015171561048e57565b9060648202918083056064149015171561048e57565b818102929160008212600160ff1b82141661048e57818405149015171561048e57565b60008112610e8357610bd6906107c0565b610e8f610e9491610e22565b6107c0565b610bd660216040518093602d60f81b6020830152610ebb8151809260208686019101610711565b81010360018101845201826106d7565b908160050191821260011661048e57565b908160320191821260011661048e57565b60649060f81c0261ffff811690810361048e5760ff9060010b0560010b6101189081810291818305149015171561048e576064900580608b19019081121560011661048e5790565b60649060f81c0261ffff811690810361048e5760ff9060010b0560010b61017c9081810291818305149015171561048e57606490058060bd19019081121560011661048e5790565b60649060f81c0261ffff811690810361048e5760ff9060010b0560010b60288102908082056028149015171561048e57606490058060280190811260011661048e5790565b60649060f81c0261ffff811690810361048e5760ff9060010b0560010b60968102908082056096149015171561048e576064610bd69105610edc565b60649060f81c0261ffff811690810361048e5760ff9060010b0560010b60e681029080820560e6149015171561048e576064610bd69105610edc565b60649060f81c0261ffff811690810361048e5760ff9060010b0560010b61014a9081810291818305149015171561048e576064610bd69105610edc565b60009080821a600280820361113e575050606491925060011a0261ffff8116908103610bed5760ff9060010b0560010b61016890818102918183051490151715610bed5760649005908160b3190191821215600116610bd957506110da90610e72565b610bd6603c60405180937f3c67207472616e73666f726d3d22726f74617465280000000000000000000000602083015261111e815180926020603586019101610711565b8101661491101f1e339f60c91b603582015203601c8101845201826106d7565b6003820361154d57505060649060011a0261ffff8116908103610bed5760ff9060010b0560010b61015e90818102918183051490151715610bed576064900590816063190191821215600116610bd95750610207816111ab6109496111a5610bd695610e72565b92610e22565b936111be6111b8826107c0565b916107c0565b60405195869361123960306020956f0f199a5b1d195c881a590f489c5d585960821b878901526111f68151809289858c019101610711565b870101602d907f2220783d222d3134302220793d222d313930222077696474683d22323830222081526c3432b4b3b43a1e91199c18111f60991b60208201520190565b7f3c66654f666673657420696e3d22536f75726365477261706869632220783d228082527f2d3134302220793d222d313930222077696474683d2231343022206865696768868301526b3a1e91189c981110323c1e9160a11b6040830152835184870193926112ac82604c830187610711565b0190651110323c9e9160d11b8281604c819501528651906112d1826052830189610711565b01956e11103932b9bab63a1e91379891179f60891b60528801528260618801527f302220793d222d313930222077696474683d2231343022206865696768743d22608188015268189c981110323c1e9160b91b908160a189015285518a87019861133f8260aa83018c610711565b018360aa8201528151906113578260b083018b610711565b01916e11103932b9bab63a1e91379911179f60891b60b08401528460bf8401527f2d3134302220793d2230222077696474683d2231343022206865696768743d2260df84015260ff83015251906113b5826101089889840190610711565b0194850152825161010e946113cd8287830189610711565b6e11103932b9bab63a1e91379991179f60891b91019485015261011d8401527f302220793d2230222077696474683d2231343022206865696768743d2231393061013d840152651110323c1e9160d11b61015d8401528151610163936114368286830188610711565b0192830152519061144e826101699485840190610711565b01906e11103932b9bab63a1e91379a11179f60891b908201527f3c66654d657267653e3c66654d657267654e6f646520696e3d226f31222f3e3c6101788201527f66654d657267654e6f646520696e3d226f3222202f3e3c66654d657267654e6f6101988201527f646520696e3d226f33222f3e3c66654d657267654e6f646520696e3d226f34226101b88201526b179f1e17b332a6b2b933b29f60a11b6101d88201527f3c2f66696c7465723e3c672066696c7465723d2275726c2823717561640000006101e482015261152e82518093610201958685019101610711565b01906514911f1e339f60d11b90820152036101e78101845201826106d7565b9293600493909291808503611a865750606494600161ffff84821a8802818116908103611a735760ff90830b05820b6104b090818102918183051490151715611a735788900594856102571901958612158316611a7357841a8802908116908103611a605760ff90820b05810b80841b90808205881490151715611a6057879005938484019485128216611a605760409384516115e9816106bb565b8481529886159283611a4d57859493926101188990059291906000198a145b8a881261182d5750505050505050508151926116238461066d565b60098452602093681e3332a6b2b933b29f60b91b8582015291905b80821061179e5750508151808480820184819551928391019161166092610711565b8101858101691e17b332a6b2b933b29f60b11b905203600a81018252602a0161168990826106d7565b83611693866107c0565b9561169d906107c0565b93519788968288017f3c66696c7465722069643d2273686561720000000000000000000000000000009052805190818460318b019201916116dd92610711565b7f2220783d222d3134302220793d222d313930222077696474683d2232383022206031918901918201526c3432b4b3b43a1e91199c18111f60991b6051820152605e0181819251938491019161173292610711565b0191829151809361174292610711565b01907f3c2f66696c7465723e3c672066696c7465723d2275726c282373686561720000825280518093601e840192019161177b92610711565b016514911f1e339f60d11b601e820152039081018252602401610bd690826106d7565b90916118279061182160356117b2866107c0565b9288885194826117cb8794518092858088019101610711565b83017f3c66654d657267654e6f646520696e3d2264000000000000000000000000000083820152611806825180936032958685019101610711565b01906211179f60e91b908201520360158101845201826106d7565b9261077a565b9061163e565b909192939495969c61183e8e610e39565b6118478c610e39565b60631981019081138a16611a1257849005908a8282039212818312811691831390151617611a255787611a3957600160ff1b81148316611a255761189b8f91611893878f8a9305610e4f565b059188610e4f565b608b198101908112158a16611a12578f7f2220793d222d313930222077696474683d220000000000000000000000000000938d8a926119e2957f22206865696768743d22333830222064793d220000000000000000000000000061191561190f61190f61190960739a610e72565b98610e72565b93610e72565b938051998a97876119318a99518092602080809d019101610711565b89017f3c66654f666673657420696e3d22536f75726365477261706869632220783d228982015261196a825180938b8785019101610711565b019182015282519061198482605295898785019101610711565b019182015281519061199e82606594878685019101610711565b01906a08881c995cdd5b1d0f489960aa1b908201526119c7825180936070958685019101610711565b01906211179f60e91b908201520360538101845201826106d7565b9c6001600160ff1b0381146119ff57870196959493929190611608565b634e487b7160e01b895260118d52602489fd5b634e487b7160e01b8b5260118f5260248bfd5b50634e487b7160e01b895260118d52602489fd5b50634e487b7160e01b895260128d52602489fd5b634e487b7160e01b865260128a52602486fd5b634e487b7160e01b835260118752602483fd5b634e487b7160e01b845260118852602484fd5b91949093929160068103611c295750509160829183611c0b611aaa610bd6966107c0565b91611af46111b8610949611ad76109498c611acd6109498260011a60f81b610eed565b9a1a60f81b610f35565b9a611aea6109498260031a60f81b610ffe565b971a60f81b61103a565b936040519889966020956e1e36b0b9b59034b21e93b6b0b9b5b960891b878a0152611b288151809289602f8d019101610711565b88016a273e3c7265637420783d2760a81b602f820152611b518251809389603a85019101610711565b01642720793d2760d81b603a820152611b738251809388603f85019101610711565b0168272077696474683d2760b81b603f820152611b998251809387604885019101610711565b016927206865696768743d2760b01b6048820152611bc08251809386605285019101610711565b01917f272066696c6c3d277768697465272f3e3c2f6d61736b3e3c67206d61736b3d276052840152693ab9361411b6b0b9b5b960b11b60728401528351938491607c85019101610711565b016514939f1e339f60d11b607c8201520360628101845201826106d7565b9192909160078103611ded5750611c3f836107c0565b916064611c6561094988611c5b6109498260011a60f81b610eed565b981a60f81b610f35565b9660031a0261ffff8116908103611dda5760ff9060010b0560010b9160fa83029280840560fa1490151715611dc757505091610bd69391611da9611cb9611cb3610949606460789805610edc565b936107c0565b926040519788956020946e3c6d61736b2069643d276d61736b6360881b86890152611ced8151809288602f8c019101610711565b87016d273e3c636972636c652063783d2760901b602f820152611d198251809388603d85019101610711565b0165272063793d2760d01b603d820152611d3c8251809387604385019101610711565b01642720723d2760d81b6043820152611d5e8251809386604885019101610711565b01917f272066696c6c3d277768697465272f3e3c2f6d61736b3e3c67206d61736b3d2760488401526975726c28236d61736b6360b01b60688401528351938491607285019101610711565b016514939f1e339f60d11b60728201520360588101845201826106d7565b634e487b7160e01b825260119052602490fd5b506011602492634e487b7160e01b835252fd5b9394939092919060088103611ff85750509260f79184611fda611e13610bd696976107c0565b91611e366111b8610949611ad76109498c611acd6109498260011a60f81b610eed565b936040519889966020956f3c66696c7465722069643d2774696c6560801b878a0152611e6b815180928960308d019101610711565b88017f2720783d272d3134302720793d272d313930272077696474683d27323830272060308201527f6865696768743d27333830273e3c66654f66667365742064783d27302720783d6050820152602760f81b6070820152611ed68251809389607185019101610711565b01642720793d2760d81b6071820152611ef88251809388607685019101610711565b0168272077696474683d2760b81b6076820152611f1e8251809387607f85019101610711565b016927206865696768743d2760b01b607f820152611f458251809386608985019101610711565b01917f2720726573756c743d27696e272f3e3c666554696c6520696e3d27696e27207860898401527f3d272d3134302720793d272d313930272077696474683d27323830272068656960a98401527f6768743d27333830272f3e3c2f66696c7465723e3c672066696c7465723d277560c984015267726c282374696c6560c01b60e9840152835193849160f185019101610711565b016514939f1e339f60d11b60f18201520360d78101845201826106d7565b909150600981036120b257505050603b61203361202483612029612024610bd69660011a60f81b610fc2565b612179565b951a60f81b610fc2565b926040519384917f3c67207472616e73666f726d3d277363616c65280000000000000000000000006020840152612074815180926020603487019101610711565b8201600160fd1b6034820152612094825180936020603585019101610711565b016514939f1e339f60d11b603582015203601b8101845201826106d7565b600a9193929450146120d2575060405191506120cd826106bb565b815290565b60649060011a0261ffff8116908103611dda576120f960ff60649260010b0560010b610e39565b0591826031190192831215600116611dc757505061211690610e72565b610bd6603a60405180937f3c67207472616e73666f726d3d27736b65775828000000000000000000000000602083015261215a815180926020603486019101610711565b81016514939f1e339f60d11b603482015203601a8101845201826106d7565b610bd6606482076000600a821261220957506121bb6121b5606460405161219f8161066d565b60018152601760f91b6020820152955b05610e72565b91610e72565b9260405193849183516121d681602096878088019101610711565b83016121ea82518093878085019101610711565b016121fd82518093868085019101610711565b010380845201826106d7565b81131561223a576121bb6121b560646040516122248161066d565b600281526102e360f41b60208201525b956121af565b6121bb6121b5606460405161224e8161066d565b600381526202e30360ec1b602082015261223456fea2646970667358221220103003941542e56ab3757a060a98e701cd3d822cd964b80ace64701f32418ba464736f6c63430008130033

Deployed Bytecode

0x6080604052600436101561001257600080fd5b60003560e01c634d6747bb1461002757600080fd5b346106685760403660031901126106685760043567ffffffffffffffff8111610668573660238201121561066857806004013590610064826106f9565b9161007260405193846106d7565b8083526024602084019160051b8301019136831161066857602401905b828210610658576000602435856060835b82518110156100f7576100b38184610750565b5160001a6001811190816100eb575b506100d6575b6100d19061077a565b6100a0565b936100e36100d19161077a565b9490506100c8565b600591501415866100c2565b5092610102816106f9565b9061011060405192836106d7565b80825261011f601f19916106f9565b0160005b81811061064757505060009160405161013b8161066d565b601581527f6e6f6261636b67726f756e6473706563696669656400000000000000000000006020820152936001810180911161048e5790815b6104a45750506000199182810190811360011661048e5791905b60008312156104625761042f60408587601582511461043d575b610414602084516101b88161069f565b60ac81527f0a202020203c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f8282019081527f72672f323030302f7376672220786d6c6e733a786c696e6b3d2022687474703a878301527f2f2f7777772e77332e6f72672f313939392f786c696e6b222076696577426f7860608301527f3d222d313530202d3230302033303020343030223e3c7265637420783d222d3160808301527f35302220793d222d323030222077696474683d2233303022206865696768743d60a08301526b111a181811103334b6361e9160a11b60c08301528651909461029c8261069f565b60bc8252610408848301917f22202f3e2020202020202020202020200a20202020202020203c636c6970506183527f74682069643d2263616e766173223e0a2020202020202020202020203c7265638a8501527f7420783d222d3134302220793d222d313930222077696474683d22323830222060608501527f6865696768743d22333830222f3e0a20202020202020203c2f636c697050617460808501527f683e0a20202020202020203c672069643d2274686563616e766173222073747960a08501527f6c653d22636c69702d706174683a75726c282363616e76617329223e0000000060c08501528951926103938461066d565b600a845286840194691e17b39f1e17b9bb339f60b11b86526103e78c519b8c986103c58b8b019d8e9251928391610711565b89016103d9825180938d8085019101610711565b01915180938a840190610711565b016103fa82518093898085019101610711565b019151809386840190610711565b010380855201836106d7565b82519384926020845251809281602086015285850190610711565b601f01601f19168101030190f35b9050815161044a8161066d565b6005815264776869746560d81b6020820152906101a8565b909193610479906104738684610750565b51610789565b93600160ff1b811461048e578201919061018e565b634e487b7160e01b600052601160045260246000fd5b90938460001981011161048e576104bf600019860183610750565b519060058260001a1480809161063c575b1561059157505061057e60276104e88360011a6107c0565b6105006104f78560021a6107c0565b9460031a6107c0565b602960f81b604051958693630e4cec4560e31b602086015261052c815180926020602489019101610711565b8401600b60fa1b908160248201528251906105508260259560208785019101610711565b019182015282519061056b8260269560208785019101610711565b01918201520360078101845201826106d7565b935b801561048e57600019019081610174565b90959190156105a05750610580565b9095906001600082901a116105c757906105bc6105c192610928565b610789565b94610580565b959061061a6106369161060e60405191671e17b39f1e17b39f60c11b60208401528281516105fe8160289460208686019101610711565b81010360088101845201826106d7565b97600019840190611077565b946106248161077a565b9561062f8287610750565b5284610750565b50610580565b5060158251146104d0565b806060602080938601015201610123565b813581526020918201910161008f565b600080fd5b6040810190811067ffffffffffffffff82111761068957604052565b634e487b7160e01b600052604160045260246000fd5b60e0810190811067ffffffffffffffff82111761068957604052565b6020810190811067ffffffffffffffff82111761068957604052565b90601f8019910116810190811067ffffffffffffffff82111761068957604052565b67ffffffffffffffff81116106895760051b60200190565b60005b8381106107245750506000910152565b8181015183820152602001610714565b67ffffffffffffffff811161068957601f01601f191660200190565b80518210156107645760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b600019811461048e5760010190565b60206107be9193929360405194816107aa8793518092868087019101610711565b820161040882518093868085019101610711565b565b806000917a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008082101561091a575b506d04ee2d6d415b85acef81000000008083101561090b575b50662386f26fc10000808310156108fc575b506305f5e100808310156108ed575b50612710808310156108de575b5060648210156108ce575b600a809210156108c4575b6001908160218186019561085987610734565b9661086760405198896106d7565b808852610876601f1991610734565b01366020890137860101905b61088e575b5050505090565b600019019083906f181899199a1a9b1b9c1cb0b131b232b360811b8282061a8353049182156108bf57919082610882565b610887565b9160010191610846565b919060646002910491019161083b565b60049193920491019138610830565b60089193920491019138610823565b60109193920491019138610814565b60209193920491019138610802565b6040935081049150386107e9565b600090606081831a80610c0157505061094e6109498260011a60f81b610eed565b610e72565b906109616109498260021a60f81b610f35565b9260648260031a029061ffff91828116908103610bed5760ff9060010b0560010b61011390818102918183051490151715610bed5761094960646109a59205610ecb565b9160648460041a02908116908103610bed5760ff9060010b0560010b9061017791828102928184051490151715610bd95750606490056109e490610ecb565b6109ed90610e72565b918060051a6109fb906107c0565b908060061a610a09906107c0565b938160071a610a17906107c0565b91604051809360209788830196630e4cec4560e31b8852805190818b60248701920191610a4392610711565b830190600b60fa1b91826024820152815191828c60258401920191610a6792610711565b01906025820152815191828a60268401920191610a8392610711565b0160268101602960f81b905203600781018452602701610aa390846106d7565b60081a60f81b610ab290610f7d565b610abb90610e72565b93604051978897878901683c7265637420783d2760b81b9052805190818960298c01920191610ae992610711565b880160298101642720793d2760d81b90528151918289602e8401920191610b0f92610711565b01602e810168272077696474683d2760b81b9052815191828860378401920191610b3892610711565b01603781016927206865696768743d2760b01b9052815191828760418401920191610b6292610711565b01906041820167272066696c6c3d2760c01b905251918260498301610b8692610711565b0190604982016c139037b830b1b4ba3c9e93981760991b90528051809360568401920191610bb392610711565b0160568101631390179f60e11b905203603a81018252605a01610bd690826106d7565b90565b634e487b7160e01b81526011600452602490fd5b634e487b7160e01b82526011600452602482fd5b90939290600114610c10575050565b90919250610c266109498360011a60f81b610eed565b91610c396109498260021a60f81b610f35565b9160648260031a0261ffff8116908103610bed5760ff9060010b0560010b9061012791828102928184051490151715610bd9575092610bd692605092610e06630e4cec4560e31b610c926109496064610d789a05610ecb565b92610dde610ca28260041a6107c0565b94610d4c610949610cb58560051a6107c0565b94610d416027610cc78360061a6107c0565b97604051988991610d2860209e8f908186019e8f52610cef815180928460248a019101610711565b850192600b60fa1b93846024820152610d118251809385602585019101610711565b019260258401528351938491602685019101610711565b01602960f81b60268201520360078101895201876106d7565b60071a60f81b610f7d565b96602c6040519c8d809b6b3c636972636c652063783d2760a01b8b8301528a8151948593019101610711565b890165272063793d2760d01b602c820152610d9c825180938a603285019101610711565b01642720723d2760d81b6032820152610dbe8251809389603785019101610711565b019167272066696c6c3d2760c01b6037840152518093603f840190610711565b01916c139037b830b1b4ba3c9e93981760991b603f8401528351938491604c85019101610711565b01631390179f60e11b604c8201520360308101845201826106d7565b908160000391808305600019149015171561048e57565b9060648202918083056064149015171561048e57565b818102929160008212600160ff1b82141661048e57818405149015171561048e57565b60008112610e8357610bd6906107c0565b610e8f610e9491610e22565b6107c0565b610bd660216040518093602d60f81b6020830152610ebb8151809260208686019101610711565b81010360018101845201826106d7565b908160050191821260011661048e57565b908160320191821260011661048e57565b60649060f81c0261ffff811690810361048e5760ff9060010b0560010b6101189081810291818305149015171561048e576064900580608b19019081121560011661048e5790565b60649060f81c0261ffff811690810361048e5760ff9060010b0560010b61017c9081810291818305149015171561048e57606490058060bd19019081121560011661048e5790565b60649060f81c0261ffff811690810361048e5760ff9060010b0560010b60288102908082056028149015171561048e57606490058060280190811260011661048e5790565b60649060f81c0261ffff811690810361048e5760ff9060010b0560010b60968102908082056096149015171561048e576064610bd69105610edc565b60649060f81c0261ffff811690810361048e5760ff9060010b0560010b60e681029080820560e6149015171561048e576064610bd69105610edc565b60649060f81c0261ffff811690810361048e5760ff9060010b0560010b61014a9081810291818305149015171561048e576064610bd69105610edc565b60009080821a600280820361113e575050606491925060011a0261ffff8116908103610bed5760ff9060010b0560010b61016890818102918183051490151715610bed5760649005908160b3190191821215600116610bd957506110da90610e72565b610bd6603c60405180937f3c67207472616e73666f726d3d22726f74617465280000000000000000000000602083015261111e815180926020603586019101610711565b8101661491101f1e339f60c91b603582015203601c8101845201826106d7565b6003820361154d57505060649060011a0261ffff8116908103610bed5760ff9060010b0560010b61015e90818102918183051490151715610bed576064900590816063190191821215600116610bd95750610207816111ab6109496111a5610bd695610e72565b92610e22565b936111be6111b8826107c0565b916107c0565b60405195869361123960306020956f0f199a5b1d195c881a590f489c5d585960821b878901526111f68151809289858c019101610711565b870101602d907f2220783d222d3134302220793d222d313930222077696474683d22323830222081526c3432b4b3b43a1e91199c18111f60991b60208201520190565b7f3c66654f666673657420696e3d22536f75726365477261706869632220783d228082527f2d3134302220793d222d313930222077696474683d2231343022206865696768868301526b3a1e91189c981110323c1e9160a11b6040830152835184870193926112ac82604c830187610711565b0190651110323c9e9160d11b8281604c819501528651906112d1826052830189610711565b01956e11103932b9bab63a1e91379891179f60891b60528801528260618801527f302220793d222d313930222077696474683d2231343022206865696768743d22608188015268189c981110323c1e9160b91b908160a189015285518a87019861133f8260aa83018c610711565b018360aa8201528151906113578260b083018b610711565b01916e11103932b9bab63a1e91379911179f60891b60b08401528460bf8401527f2d3134302220793d2230222077696474683d2231343022206865696768743d2260df84015260ff83015251906113b5826101089889840190610711565b0194850152825161010e946113cd8287830189610711565b6e11103932b9bab63a1e91379991179f60891b91019485015261011d8401527f302220793d2230222077696474683d2231343022206865696768743d2231393061013d840152651110323c1e9160d11b61015d8401528151610163936114368286830188610711565b0192830152519061144e826101699485840190610711565b01906e11103932b9bab63a1e91379a11179f60891b908201527f3c66654d657267653e3c66654d657267654e6f646520696e3d226f31222f3e3c6101788201527f66654d657267654e6f646520696e3d226f3222202f3e3c66654d657267654e6f6101988201527f646520696e3d226f33222f3e3c66654d657267654e6f646520696e3d226f34226101b88201526b179f1e17b332a6b2b933b29f60a11b6101d88201527f3c2f66696c7465723e3c672066696c7465723d2275726c2823717561640000006101e482015261152e82518093610201958685019101610711565b01906514911f1e339f60d11b90820152036101e78101845201826106d7565b9293600493909291808503611a865750606494600161ffff84821a8802818116908103611a735760ff90830b05820b6104b090818102918183051490151715611a735788900594856102571901958612158316611a7357841a8802908116908103611a605760ff90820b05810b80841b90808205881490151715611a6057879005938484019485128216611a605760409384516115e9816106bb565b8481529886159283611a4d57859493926101188990059291906000198a145b8a881261182d5750505050505050508151926116238461066d565b60098452602093681e3332a6b2b933b29f60b91b8582015291905b80821061179e5750508151808480820184819551928391019161166092610711565b8101858101691e17b332a6b2b933b29f60b11b905203600a81018252602a0161168990826106d7565b83611693866107c0565b9561169d906107c0565b93519788968288017f3c66696c7465722069643d2273686561720000000000000000000000000000009052805190818460318b019201916116dd92610711565b7f2220783d222d3134302220793d222d313930222077696474683d2232383022206031918901918201526c3432b4b3b43a1e91199c18111f60991b6051820152605e0181819251938491019161173292610711565b0191829151809361174292610711565b01907f3c2f66696c7465723e3c672066696c7465723d2275726c282373686561720000825280518093601e840192019161177b92610711565b016514911f1e339f60d11b601e820152039081018252602401610bd690826106d7565b90916118279061182160356117b2866107c0565b9288885194826117cb8794518092858088019101610711565b83017f3c66654d657267654e6f646520696e3d2264000000000000000000000000000083820152611806825180936032958685019101610711565b01906211179f60e91b908201520360158101845201826106d7565b9261077a565b9061163e565b909192939495969c61183e8e610e39565b6118478c610e39565b60631981019081138a16611a1257849005908a8282039212818312811691831390151617611a255787611a3957600160ff1b81148316611a255761189b8f91611893878f8a9305610e4f565b059188610e4f565b608b198101908112158a16611a12578f7f2220793d222d313930222077696474683d220000000000000000000000000000938d8a926119e2957f22206865696768743d22333830222064793d220000000000000000000000000061191561190f61190f61190960739a610e72565b98610e72565b93610e72565b938051998a97876119318a99518092602080809d019101610711565b89017f3c66654f666673657420696e3d22536f75726365477261706869632220783d228982015261196a825180938b8785019101610711565b019182015282519061198482605295898785019101610711565b019182015281519061199e82606594878685019101610711565b01906a08881c995cdd5b1d0f489960aa1b908201526119c7825180936070958685019101610711565b01906211179f60e91b908201520360538101845201826106d7565b9c6001600160ff1b0381146119ff57870196959493929190611608565b634e487b7160e01b895260118d52602489fd5b634e487b7160e01b8b5260118f5260248bfd5b50634e487b7160e01b895260118d52602489fd5b50634e487b7160e01b895260128d52602489fd5b634e487b7160e01b865260128a52602486fd5b634e487b7160e01b835260118752602483fd5b634e487b7160e01b845260118852602484fd5b91949093929160068103611c295750509160829183611c0b611aaa610bd6966107c0565b91611af46111b8610949611ad76109498c611acd6109498260011a60f81b610eed565b9a1a60f81b610f35565b9a611aea6109498260031a60f81b610ffe565b971a60f81b61103a565b936040519889966020956e1e36b0b9b59034b21e93b6b0b9b5b960891b878a0152611b288151809289602f8d019101610711565b88016a273e3c7265637420783d2760a81b602f820152611b518251809389603a85019101610711565b01642720793d2760d81b603a820152611b738251809388603f85019101610711565b0168272077696474683d2760b81b603f820152611b998251809387604885019101610711565b016927206865696768743d2760b01b6048820152611bc08251809386605285019101610711565b01917f272066696c6c3d277768697465272f3e3c2f6d61736b3e3c67206d61736b3d276052840152693ab9361411b6b0b9b5b960b11b60728401528351938491607c85019101610711565b016514939f1e339f60d11b607c8201520360628101845201826106d7565b9192909160078103611ded5750611c3f836107c0565b916064611c6561094988611c5b6109498260011a60f81b610eed565b981a60f81b610f35565b9660031a0261ffff8116908103611dda5760ff9060010b0560010b9160fa83029280840560fa1490151715611dc757505091610bd69391611da9611cb9611cb3610949606460789805610edc565b936107c0565b926040519788956020946e3c6d61736b2069643d276d61736b6360881b86890152611ced8151809288602f8c019101610711565b87016d273e3c636972636c652063783d2760901b602f820152611d198251809388603d85019101610711565b0165272063793d2760d01b603d820152611d3c8251809387604385019101610711565b01642720723d2760d81b6043820152611d5e8251809386604885019101610711565b01917f272066696c6c3d277768697465272f3e3c2f6d61736b3e3c67206d61736b3d2760488401526975726c28236d61736b6360b01b60688401528351938491607285019101610711565b016514939f1e339f60d11b60728201520360588101845201826106d7565b634e487b7160e01b825260119052602490fd5b506011602492634e487b7160e01b835252fd5b9394939092919060088103611ff85750509260f79184611fda611e13610bd696976107c0565b91611e366111b8610949611ad76109498c611acd6109498260011a60f81b610eed565b936040519889966020956f3c66696c7465722069643d2774696c6560801b878a0152611e6b815180928960308d019101610711565b88017f2720783d272d3134302720793d272d313930272077696474683d27323830272060308201527f6865696768743d27333830273e3c66654f66667365742064783d27302720783d6050820152602760f81b6070820152611ed68251809389607185019101610711565b01642720793d2760d81b6071820152611ef88251809388607685019101610711565b0168272077696474683d2760b81b6076820152611f1e8251809387607f85019101610711565b016927206865696768743d2760b01b607f820152611f458251809386608985019101610711565b01917f2720726573756c743d27696e272f3e3c666554696c6520696e3d27696e27207860898401527f3d272d3134302720793d272d313930272077696474683d27323830272068656960a98401527f6768743d27333830272f3e3c2f66696c7465723e3c672066696c7465723d277560c984015267726c282374696c6560c01b60e9840152835193849160f185019101610711565b016514939f1e339f60d11b60f18201520360d78101845201826106d7565b909150600981036120b257505050603b61203361202483612029612024610bd69660011a60f81b610fc2565b612179565b951a60f81b610fc2565b926040519384917f3c67207472616e73666f726d3d277363616c65280000000000000000000000006020840152612074815180926020603487019101610711565b8201600160fd1b6034820152612094825180936020603585019101610711565b016514939f1e339f60d11b603582015203601b8101845201826106d7565b600a9193929450146120d2575060405191506120cd826106bb565b815290565b60649060011a0261ffff8116908103611dda576120f960ff60649260010b0560010b610e39565b0591826031190192831215600116611dc757505061211690610e72565b610bd6603a60405180937f3c67207472616e73666f726d3d27736b65775828000000000000000000000000602083015261215a815180926020603486019101610711565b81016514939f1e339f60d11b603482015203601a8101845201826106d7565b610bd6606482076000600a821261220957506121bb6121b5606460405161219f8161066d565b60018152601760f91b6020820152955b05610e72565b91610e72565b9260405193849183516121d681602096878088019101610711565b83016121ea82518093878085019101610711565b016121fd82518093868085019101610711565b010380845201826106d7565b81131561223a576121bb6121b560646040516122248161066d565b600281526102e360f41b60208201525b956121af565b6121bb6121b5606460405161224e8161066d565b600381526202e30360ec1b602082015261223456fea2646970667358221220103003941542e56ab3757a060a98e701cd3d822cd964b80ace64701f32418ba464736f6c63430008130033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.