CELO Price: $0.11 (-1.15%)
Gas: 25 GWei

Contract

0x7B841C609d95CbafE0771d4A05d2C0415922737B

Overview

CELO Balance

Celo Mainnet LogoCelo Mainnet LogoCelo Mainnet Logo0 CELO

CELO Value

$0.00

More Info

Private Name Tags

Multichain Info

Transaction Hash
Block
From
To
Complete Crosswo...572455072026-01-23 5:31:052 days ago1769146265IN
0x7B841C60...15922737B
0 CELO0.0089825126.69300907
Complete Crosswo...572092092026-01-22 19:26:073 days ago1769109967IN
0x7B841C60...15922737B
0 CELO0.005303126.5
Complete Crosswo...567762542026-01-17 19:10:128 days ago1768677012IN
0x7B841C60...15922737B
0 CELO0.0093468725.001
Complete Crosswo...567154532026-01-17 2:16:519 days ago1768616211IN
0x7B841C60...15922737B
0 CELO0.007622325.001
Complete Crosswo...567072512026-01-17 0:00:099 days ago1768608009IN
0x7B841C60...15922737B
0 CELO0.0122883926.5
Complete Crosswo...567013542026-01-16 22:21:529 days ago1768602112IN
0x7B841C60...15922737B
0 CELO0.0116944226.5
Complete Crosswo...567013092026-01-16 22:21:079 days ago1768602067IN
0x7B841C60...15922737B
0 CELO0.0125965826.5
Create Public Cr...567008272026-01-16 22:13:059 days ago1768601585IN
0x7B841C60...15922737B
100 CELO0.0376896525.001
Complete Crosswo...566104562026-01-15 21:06:5410 days ago1768511214IN
0x7B841C60...15922737B
0 CELO0.0099779326.5
Complete Crosswo...566045692026-01-15 19:28:4710 days ago1768505327IN
0x7B841C60...15922737B
0 CELO0.0116902826.5
Complete Crosswo...565980222026-01-15 17:39:4010 days ago1768498780IN
0x7B841C60...15922737B
0 CELO0.0116912426.5
Complete Crosswo...565543842026-01-15 5:32:2210 days ago1768455142IN
0x7B841C60...15922737B
0 CELO0.0110308125.001
Complete Crosswo...565482772026-01-15 3:50:3510 days ago1768449035IN
0x7B841C60...15922737B
0 CELO0.0125981726.5
Create Public Cr...565464842026-01-15 3:20:4210 days ago1768447242IN
0x7B841C60...15922737B
150 CELO0.0317159125.001
Complete Crosswo...555816202026-01-03 23:19:3822 days ago1767482378IN
0x7B841C60...15922737B
0 CELO0.0126745526.5
Create Public Cr...555815892026-01-03 23:19:0722 days ago1767482347IN
0x7B841C60...15922737B
1 CELO0.0187388626.5

Latest 3 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
567008272026-01-16 22:13:059 days ago1768601585
0x7B841C60...15922737B
100 CELO
565464842026-01-15 3:20:4210 days ago1768447242
0x7B841C60...15922737B
150 CELO
555815892026-01-03 23:19:0722 days ago1767482347
0x7B841C60...15922737B
1 CELO

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CrosswordBoard

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
No with 0 runs

Other Settings:
paris EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 7 : CrosswordBoard.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Pausable.sol";

import "./libraries/ValidationLib.sol";
import "./libraries/ErrorMessages.sol";

// Interfaces for the modular contracts
interface ICrosswordCore {
    struct CrosswordCompletion {
        address user;
        uint256 completionTimestamp;
        uint256 durationMs;
    }
    function setCrossword(bytes32 crosswordId, string memory crosswordData) external;
    function getCurrentCrossword() external view returns (bytes32, string memory, uint256);
    function setSigner(address newSigner) external;
    function completeCrossword(bytes32 crosswordId, uint256 durationMs, string calldata username, string calldata displayName, string calldata pfpUrl, bytes calldata signature) external;
    function completeCrosswordForUser(address user, bytes32 crosswordId, uint256 durationMs, string calldata username, string calldata displayName, string calldata pfpUrl, bytes calldata signature) external;
    function userCompletedCrossword(bytes32 crosswordId, address user) external view returns (bool);
    function getCrosswordCompletions(bytes32 crosswordId) external view returns (CrosswordCompletion[] memory);
    function emergencyClearCrossword() external;
    function pause() external;
    function unpause() external;
}

interface ICrosswordPrizes {
    function createCrossword(bytes32 crosswordId, address token, uint256 prizePool, uint256[] calldata winnerPercentages, uint256 endTime) external payable;
    function createCrosswordWithoutValue(bytes32 crosswordId, address token, uint256 prizePool, uint256[] calldata winnerPercentages, uint256 endTime) external;
    function activateCrossword(bytes32 crosswordId) external;
    function claimPrize(bytes32 crosswordId) external;
    function isWinner(bytes32 crosswordId, address user) external view returns (bool);
    function getUserRank(bytes32 crosswordId, address user) external view returns (uint256);
    function recordCompletion(bytes32 crosswordId, address user) external returns (bool awardedPrize);
    function getCrosswordDetails(bytes32 crosswordId) external view returns (
        address token,
        uint256 totalPrizePool,
        uint256[] memory winnerPercentages,
        address[] memory winners,
        uint256 activationTime,
        uint256 endTime,
        uint8 state,  // 0=Inactive, 1=Active, 2=Complete
        bool isFinalized
    );
    function pause() external;
    function unpause() external;
    function grantOperatorRole(address operator) external;
    function receiveNativeCELOForCrossword(bytes32 crosswordId) external payable;
    function setFundingContract(address _fundingContract) external;
}

interface IUserProfiles {
    function updateProfile(string calldata username, string calldata displayName, string calldata pfpUrl, string calldata bio, string calldata website) external;
    function getUserProfile(address user) external view returns (string memory, string memory, string memory, uint256);
    function pause() external;
    function unpause() external;
}

interface IConfigManager {
    function getBoolConfigWithDefault(string calldata key, bool defaultValue) external view returns (bool);
    function pause() external;
    function unpause() external;
}

interface IAdminManager {
    function isAdminAddress(address addr) external view returns (bool);
    function pause() external;
    function unpause() external;
}

interface IPublicCrosswordManager {
    function createCrossword(bytes32 crosswordId, string memory name, string memory crosswordData, string memory sponsoredBy) external payable;
    function createCrosswordWithNativeCELOPrizePool(bytes32 crosswordId, string memory name, string memory crosswordData, string memory sponsoredBy, uint256 maxWinners, uint256 prizePool, uint256[] calldata winnerPercentages, uint256 endTime) external payable;
    function createCrosswordWithPrizePool(bytes32 crosswordId, string memory name, string memory crosswordData, string memory sponsoredBy, uint256 maxWinners, address token, uint256 prizePool, uint256[] calldata winnerPercentages, uint256 endTime) external;
    function activateCrossword(bytes32 crosswordId) external;
    function getCrosswordDetails(bytes32 crosswordId) external view returns (
        string memory name,
        string memory sponsoredBy,
        string memory crosswordData,
        address token,
        uint256 totalPrizePool,
        uint256 maxWinners,
        uint256[] memory winnerPercentages,
        uint256 activationTime,
        uint256 endTime,
        uint256 createdAt,
        bool isActive,
        bool isCompleted,
        address creator
    );
    function getActiveCrosswordIds() external view returns (bytes32[] memory);
    function getAllCrosswordIds() external view returns (bytes32[] memory);
    function pause() external;
    function unpause() external;
}

/**
 * @title CrosswordBoard (Modularized Version)
 * @dev Coordinator contract for the modularized Celo Crossword Learning App
 * This contract coordinates between the modular contracts to provide unified functionality.
 */
contract CrosswordBoard is Ownable, ReentrancyGuard, Pausable {
    // Contract addresses
    ICrosswordCore public crosswordCore;
    ICrosswordPrizes public crosswordPrizes;
    IUserProfiles public userProfiles;
    IConfigManager public configManager;
    IAdminManager public adminManager;
    IPublicCrosswordManager public publicCrosswordManager;

    // Events
    event ContractsUpdated(address core, address prizes, address profiles, address config, address admin, address publicManager);

    /**
     * @dev Constructor - sets the addresses of the modular contracts
     */
    constructor(
        address _crosswordCore,
        address _crosswordPrizes,
        address _userProfiles,
        address _configManager,
        address _adminManager,
        address _publicCrosswordManager
    ) Ownable(msg.sender) {
        updateContractAddresses(
            _crosswordCore,
            _crosswordPrizes,
            _userProfiles,
            _configManager,
            _adminManager,
            _publicCrosswordManager
        );
    }

    /**
     * @dev Update the addresses of the modular contracts
     */
    function updateContractAddresses(
        address _crosswordCore,
        address _crosswordPrizes,
        address _userProfiles,
        address _configManager,
        address _adminManager,
        address _publicCrosswordManager
    ) public onlyOwner {
        ValidationLib.validateNonZeroAddress(_crosswordCore, ErrorMessages.CROSSWORDBOARD_CORE_ZERO);
        ValidationLib.validateNonZeroAddress(_crosswordPrizes, ErrorMessages.CROSSWORDBOARD_PRIZES_ZERO);
        ValidationLib.validateNonZeroAddress(_userProfiles, ErrorMessages.CROSSWORDBOARD_PROFILES_ZERO);
        ValidationLib.validateNonZeroAddress(_configManager, ErrorMessages.CROSSWORDBOARD_CONFIG_ZERO);
        ValidationLib.validateNonZeroAddress(_adminManager, ErrorMessages.CROSSWORDBOARD_ADMIN_ZERO);
        ValidationLib.validateNonZeroAddress(_publicCrosswordManager, ErrorMessages.CROSSWORDBOARD_ADMIN_ZERO); // Reusing error message

        crosswordCore = ICrosswordCore(_crosswordCore);
        crosswordPrizes = ICrosswordPrizes(_crosswordPrizes);
        userProfiles = IUserProfiles(_userProfiles);
        configManager = IConfigManager(_configManager);
        adminManager = IAdminManager(_adminManager);
        publicCrosswordManager = IPublicCrosswordManager(_publicCrosswordManager);

        emit ContractsUpdated(_crosswordCore, _crosswordPrizes, _userProfiles, _configManager, _adminManager, _publicCrosswordManager);
    }

    // Convenience functions that delegate to the appropriate contracts

    // Crossword Core Functions
    function setCrossword(bytes32 crosswordId, string memory crosswordData) external {
        crosswordCore.setCrossword(crosswordId, crosswordData);
    }

    function getCurrentCrossword() external view returns (bytes32, string memory, uint256) {
        return crosswordCore.getCurrentCrossword();
    }

    function setSigner(address newSigner) external {
        crosswordCore.setSigner(newSigner);
    }

    function completeCrossword(bytes32 crosswordId, uint256 durationMs, string calldata username, string calldata displayName, string calldata pfpUrl, bytes calldata signature) external {
        crosswordCore.completeCrosswordForUser(msg.sender, crosswordId, durationMs, username, displayName, pfpUrl, signature);
        // Record completion in prizes contract to determine if user is a winner
        bool awardedPrize = crosswordPrizes.recordCompletion(crosswordId, msg.sender);
        // If user was awarded a prize, they are a winner
        if (awardedPrize) {
            // User can now claim their prize manually via the leaderboard
        }
    }

    function userCompletedCrossword(bytes32 crosswordId, address user) external view returns (bool) {
        return crosswordCore.userCompletedCrossword(crosswordId, user);
    }

    function emergencyClearCrossword() external {
        crosswordCore.emergencyClearCrossword();
    }

    // Crossword Prizes Functions
    function createCrossword(bytes32 crosswordId, address token, uint256 prizePool, uint256[] calldata winnerPercentages, uint256 endTime) external payable {
        crosswordPrizes.createCrossword{value: msg.value}(crosswordId, token, prizePool, winnerPercentages, endTime);
    }

    function activateCrossword(bytes32 crosswordId) external {
        crosswordPrizes.activateCrossword(crosswordId);
    }

    function claimPrize(bytes32 crosswordId) external {
        crosswordPrizes.claimPrize(crosswordId);
    }

    function isWinner(bytes32 crosswordId, address user) external view returns (bool) {
        return crosswordPrizes.isWinner(crosswordId, user);
    }

    function getUserRank(bytes32 crosswordId, address user) external view returns (uint256) {
        return crosswordPrizes.getUserRank(crosswordId, user);
    }

    // Public Crossword Manager Functions
    function createPublicCrossword(
        bytes32 crosswordId,
        string memory name,
        string memory crosswordData,
        string memory sponsoredBy
    ) external payable {
        publicCrosswordManager.createCrossword{value: msg.value}(crosswordId, name, crosswordData, sponsoredBy);

        // For crosswords without prize pools, we still need to ensure they exist in prizes contract
        // to track completions properly, but with zero prize pool
        try crosswordPrizes.createCrosswordWithoutValue(
            crosswordId, address(0), 0, new uint256[](0), 0
        ) {
            // If successful, activate it
            try crosswordPrizes.activateCrossword(crosswordId) {
                // Success
            } catch {
                // If activation fails, that's OK for no-prize crosswords
            }
        } catch {
            // If creating in prizes contract fails, that's OK - it might already exist
        }
    }

    function createPublicCrosswordWithNativeCELOPrizePool(
        bytes32 crosswordId,
        string memory name,
        string memory crosswordData,
        string memory sponsoredBy,
        uint256 maxWinners,
        uint256 prizePool,
        uint256[] calldata winnerPercentages,
        uint256 endTime
    ) external payable {
        require(msg.value == prizePool, "Value must equal prize pool");

        // Create the crossword in the public manager first (for tracking)
        publicCrosswordManager.createCrosswordWithNativeCELOPrizePool{value: 0}(
            crosswordId,
            name,
            crosswordData,
            sponsoredBy,
            maxWinners,
            prizePool,
            winnerPercentages,
            endTime
        );

        // Create the crossword in the prizes contract and fund it with the received value
        crosswordPrizes.createCrossword{value: msg.value}(
            crosswordId,
            address(0), // native CELO
            prizePool,
            winnerPercentages,
            endTime
        );

        // Activate the crossword in prizes contract to allow completions
        crosswordPrizes.activateCrossword(crosswordId);
    }

    /**
     * @dev Function to fund the CrosswordPrizes contract with native CELO for a specific crossword
     * @param crosswordId The ID of the crossword to fund
     */
    function fundCrosswordPrizes(bytes32 crosswordId) external payable onlyOwner whenNotPaused {
        crosswordPrizes.receiveNativeCELOForCrossword{value: msg.value}(crosswordId);
    }

    /**
     * @dev Function to set the funding contract for CrosswordPrizes (should be called by admin)
     * @param fundingContractAddr The address of the funding contract
     */
    function setFundingContractForPrizes(address fundingContractAddr) external onlyOwner whenNotPaused {
        crosswordPrizes.setFundingContract(fundingContractAddr);
    }

    function createPublicCrosswordWithPrizePool(
        bytes32 crosswordId,
        string memory name,
        string memory crosswordData,
        string memory sponsoredBy,
        uint256 maxWinners,
        address token,
        uint256 prizePool,
        uint256[] calldata winnerPercentages,
        uint256 endTime
    ) external {
        // Create the crossword in the public manager first (for tracking)
        publicCrosswordManager.createCrosswordWithPrizePool(
            crosswordId, name, crosswordData, sponsoredBy, maxWinners, token, prizePool, winnerPercentages, endTime
        );

        // Also create in prizes contract to track completions and prizes
        crosswordPrizes.createCrosswordWithoutValue(
            crosswordId, token, prizePool, winnerPercentages, endTime
        );

        // Activate the crossword in prizes contract to allow completions
        crosswordPrizes.activateCrossword(crosswordId);
    }

    function activatePublicCrossword(bytes32 crosswordId) external {
        publicCrosswordManager.activateCrossword(crosswordId);
    }

    function getPublicCrosswordDetails(bytes32 crosswordId) external view returns (
        string memory name,
        string memory sponsoredBy,
        string memory crosswordData,
        address token,
        uint256 totalPrizePool,
        uint256 maxWinners,
        uint256[] memory winnerPercentages,
        uint256 activationTime,
        uint256 endTime,
        uint256 createdAt,
        bool isActive,
        bool isCompleted,
        address creator
    ) {
        return publicCrosswordManager.getCrosswordDetails(crosswordId);
    }

    function getActivePublicCrosswords() external view returns (bytes32[] memory) {
        return publicCrosswordManager.getActiveCrosswordIds();
    }

    function getAllPublicCrosswords() external view returns (bytes32[] memory) {
        return publicCrosswordManager.getAllCrosswordIds();
    }

    function getCompletedCrosswords() external view returns (bytes32[] memory) {
        bytes32[] memory allCrosswordIds = publicCrosswordManager.getAllCrosswordIds();
        bytes32[] memory completedCrosswords = new bytes32[](allCrosswordIds.length);
        uint256 completedCount = 0;

        for (uint256 i = 0; i < allCrosswordIds.length; i++) {
            try crosswordPrizes.getCrosswordDetails(allCrosswordIds[i]) returns (
                address,
                uint256,
                uint256[] memory,
                address[] memory,
                uint256,
                uint256,
                uint8 state,
                bool isFinalized
            ) {
                // Check if the crossword is complete in the prizes contract
                // State 2 corresponds to Complete (0=Inactive, 1=Active, 2=Complete)
                if (state == 2 || isFinalized) {
                    completedCrosswords[completedCount] = allCrosswordIds[i];
                    completedCount++;
                }
            } catch {
                // If the crossword doesn't exist in prizes contract, skip it
                continue;
            }
        }

        // Create result array with exact size
        bytes32[] memory result = new bytes32[](completedCount);
        for (uint256 i = 0; i < completedCount; i++) {
            result[i] = completedCrosswords[i];
        }

        return result;
    }

    /**
     * @dev Aggregated getCrosswordDetails for backward compatibility and easier frontend usage
     */
    function getCrosswordDetails(bytes32 crosswordId) external view returns (
        address token,
        uint256 totalPrizePool,
        uint256[] memory winnerPercentages,
        ICrosswordCore.CrosswordCompletion[] memory completions,
        uint256 activationTime,
        uint256 endTime,
        uint8 state,
        string memory name,
        string memory gridData,
        string memory sponsoredBy
    ) {
        // Get metadata from PublicCrosswordManager
        (name, sponsoredBy, gridData, , , , , , , , , , ) = publicCrosswordManager.getCrosswordDetails(crosswordId);

        // Get prize and state from CrosswordPrizes
        try crosswordPrizes.getCrosswordDetails(crosswordId) returns (
            address _token,
            uint256 _totalPrizePool,
            uint256[] memory _winnerPercentages,
            address[] memory,
            uint256 _activationTime,
            uint256 _endTime,
            uint8 _state,
            bool
        ) {
            token = _token;
            totalPrizePool = _totalPrizePool;
            winnerPercentages = _winnerPercentages;
            activationTime = _activationTime;
            endTime = _endTime;
            state = _state;
        } catch {
            // If not found in prizes, metadata fields might still hold partial info
            token = address(0);
            totalPrizePool = 0;
            activationTime = 0;
            endTime = 0;
            state = 0;
        }

        // Get completions from CrosswordCore
        completions = crosswordCore.getCrosswordCompletions(crosswordId);

        return (
            token,
            totalPrizePool,
            winnerPercentages,
            completions,
            activationTime,
            endTime,
            state,
            name,
            gridData,
            sponsoredBy
        );
    }

    // User Profile Functions
    function updateProfile(string calldata username, string calldata displayName, string calldata pfpUrl, string calldata bio, string calldata website) external {
        userProfiles.updateProfile(username, displayName, pfpUrl, bio, website);
    }

    // Config Management Functions
    function isReturnHomeButtonVisible() external view returns (bool) {
        return configManager.getBoolConfigWithDefault("home_button_visible", true);
    }

    // Admin Management Functions
    function isAdminAddress(address addr) external view returns (bool) {
        return adminManager.isAdminAddress(addr);
    }

    // Pause/Unpause - all contracts
    function pauseAll() external {
        require(adminManager.isAdminAddress(msg.sender), ErrorMessages.CROSSWORDBOARD_NOT_ADMIN);
        crosswordCore.pause();
        crosswordPrizes.pause();
        userProfiles.pause();
        configManager.pause();
        adminManager.pause();
        publicCrosswordManager.pause();
    }

    function unpauseAll() external {
        require(adminManager.isAdminAddress(msg.sender), ErrorMessages.CROSSWORDBOARD_NOT_ADMIN);
        crosswordCore.unpause();
        crosswordPrizes.unpause();
        userProfiles.unpause();
        configManager.unpause();
        adminManager.unpause();
        publicCrosswordManager.unpause();
    }

    // Fallback function to accept native CELO
    receive() external payable {
        // Funds received are assumed to be for prize pools and handled by the prizes contract
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../utils/Context.sol";

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

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.3.0) (utils/Pausable.sol)

pragma solidity ^0.8.20;

import {Context} from "../utils/Context.sol";

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

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

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

    /**
     * @dev The operation failed because the contract is paused.
     */
    error EnforcedPause();

    /**
     * @dev The operation failed because the contract is not paused.
     */
    error ExpectedPause();

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

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

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

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        if (paused()) {
            revert EnforcedPause();
        }
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        if (!paused()) {
            revert ExpectedPause();
        }
    }

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

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)

pragma solidity ^0.8.20;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,
 * consider using {ReentrancyGuardTransient} instead.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant NOT_ENTERED = 1;
    uint256 private constant ENTERED = 2;

    uint256 private _status;

    /**
     * @dev Unauthorized reentrant call.
     */
    error ReentrancyGuardReentrantCall();

    constructor() {
        _status = NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be NOT_ENTERED
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

        // Any calls to nonReentrant after this point will fail
        _status = ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == ENTERED;
    }
}

File 6 of 7 : ErrorMessages.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

/**
 * @title ErrorMessages
 * @dev Library for standard error messages
 */
library ErrorMessages {
    // Validation errors
    string public constant ZERO_ADDRESS = "Zero address";
    string public constant INVALID_SENDER = "Invalid sender";
    string public constant VALUE_MISMATCH = "Value mismatch";
    string public constant PRIZE_GT_ZERO = "Prize > 0";
    string public constant DURATION_GT_ZERO = "Duration > 0";
    string public constant DATA_EMPTY = "Data empty";
    string public constant ALREADY_EXISTS = "Already exists";
    string public constant DOES_NOT_EXIST = "Does not exist";
    string public constant ALREADY_COMPLETED = "Already completed";
    string public constant NO_CROSSWORD = "No crossword";
    string public constant SIGNER_NOT_SET = "Signer not set";
    string public constant MAX_COMPLETIONS = "Max completions";
    string public constant INSUFFICIENT_BALANCE = "Insufficient balance";
    string public constant TRANSFER_FAILED = "Transfer failed";
    string public constant INVALID_SIGNATURE = "Invalid signature";
    string public constant INVALID_RANK = "Invalid rank";
    string public constant WINDOW_NOT_ELAPSED = "Window not elapsed";
    string public constant TOO_MANY_WINNERS = "Too many winners";
    string public constant PERCENTAGE_TOO_HIGH = "Percentage too high";
    string public constant TOTAL_GT_100 = "Total > 100%";
    string public constant END_TIME_TOO_FAR = "End time too far";
    string public constant MAX_EXCEEDS_LIMIT = "Max exceeds limit";
    string public constant ALREADY_CLAIMED = "Already claimed";
    string public constant NOT_A_WINNER = "Not a winner";
    string public constant NOT_OWNER_OR_ADMIN = "Not owner or admin";
    string public constant NOT_ACTIVE_COMPLETE = "Not active/complete";
    string public constant DEADLINE_PASSED = "Deadline passed";
    string public constant TOKEN_NOT_ALLOWED = "Token not allowed";
    string public constant PRIZE_POOL_GT_ZERO = "Prize > 0";
    
    string public constant INVALID_END_TIME = "Invalid end time";
    
    // String validation errors
    string public constant INVALID_USERNAME = "Invalid username";
    string public constant INVALID_DISPLAY_NAME = "Invalid display name";
    string public constant PFPURL_TOO_LONG = "Pfp URL too long";
    string public constant BIO_TOO_LONG = "bio too long";
    string public constant WEBSITE_TOO_LONG = "website too long";
    
    // UserProfiles specific errors
    string public constant USERPROFILES_INVALID_USERNAME = "UserProfiles: invalid username length";
    string public constant USERPROFILES_INVALID_DISPLAY_NAME = "UserProfiles: invalid display name length";
    string public constant USERPROFILES_PFPURL_TOO_LONG = "UserProfiles: pfpUrl too long";
    
    // AdminManager specific errors
    string public constant ADMINMANAGER_ZERO_ADDRESS = "AdminManager: admin address cannot be zero";
    string public constant ADMINMANAGER_ALREADY_EXISTS = "AdminManager: admin already exists";
    string public constant ADMINMANAGER_DOES_NOT_EXIST = "AdminManager: admin does not exist";
    string public constant ADMINMANAGER_CANNOT_REMOVE_OWNER = "AdminManager: cannot remove owner";
    string public constant OPERATOR_ZERO_ADDRESS = "AdminManager: operator address cannot be zero";
    
    // CrosswordBoard specific errors
    string public constant CROSSWORDBOARD_CORE_ZERO = "CrosswordBoard: core address cannot be zero";
    string public constant CROSSWORDBOARD_PRIZES_ZERO = "CrosswordBoard: prizes address cannot be zero";
    string public constant CROSSWORDBOARD_PROFILES_ZERO = "CrosswordBoard: profiles address cannot be zero";
    string public constant CROSSWORDBOARD_CONFIG_ZERO = "CrosswordBoard: config address cannot be zero";
    string public constant CROSSWORDBOARD_ADMIN_ZERO = "CrosswordBoard: admin address cannot be zero";
    string public constant CROSSWORDBOARD_NOT_ADMIN = "CrosswordBoard: caller is not an admin";
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

/**
 * @title ValidationLib
 * @dev Library for common validation functions
 */
library ValidationLib {
    /**
     * @dev Validates that an address is not zero
     */
    function validateNonZeroAddress(address addr, string memory errorMessage) internal pure {
        require(addr != address(0), errorMessage);
    }

    /**
     * @dev Validates string length is within bounds
     */
    function validateStringLength(string memory str, uint256 minLength, uint256 maxLength, string memory errorMessage) internal pure {
        uint256 len = bytes(str).length;
        require(len >= minLength && len <= maxLength, errorMessage);
    }

    /**
     * @dev Validates string length is within bounds (only minimum)
     */
    function validateStringLengthMin(string memory str, uint256 minLength, string memory errorMessage) internal pure {
        uint256 len = bytes(str).length;
        require(len >= minLength, errorMessage);
    }

    /**
     * @dev Validates string length is within bounds (only maximum)
     */
    function validateStringLengthMax(string memory str, uint256 maxLength, string memory errorMessage) internal pure {
        uint256 len = bytes(str).length;
        require(len <= maxLength, errorMessage);
    }

    /**
     * @dev Validates uint256 value is greater than zero
     */
    function validateGreaterThanZero(uint256 value, string memory errorMessage) internal pure {
        require(value > 0, errorMessage);
    }

    /**
     * @dev Validates uint256 value is within bounds
     */
    function validateRange(uint256 value, uint256 minValue, uint256 maxValue, string memory errorMessage) internal pure {
        require(value >= minValue && value <= maxValue, errorMessage);
    }

    /**
     * @dev Validates uint256 value is within bounds (only minimum)
     */
    function validateMinValue(uint256 value, uint256 minValue, string memory errorMessage) internal pure {
        require(value >= minValue, errorMessage);
    }

    /**
     * @dev Validates uint256 value is within bounds (only maximum)
     */
    function validateMaxValue(uint256 value, uint256 maxValue, string memory errorMessage) internal pure {
        require(value <= maxValue, errorMessage);
    }
}

Settings
{
  "evmVersion": "paris",
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "optimizer": {
    "details": {
      "constantOptimizer": true,
      "cse": true,
      "deduplicate": true,
      "inliner": true,
      "jumpdestRemover": true,
      "orderLiterals": true,
      "peephole": true,
      "simpleCounterForLoopUncheckedIncrement": true,
      "yul": true,
      "yulDetails": {
        "optimizerSteps": "dhfoDgvlFnTUtnIfxxxxxxx:fDnTOcmuO",
        "stackAllocation": true
      }
    },
    "runs": 0
  },
  "remappings": [],
  "viaIR": true,
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_crosswordCore","type":"address"},{"internalType":"address","name":"_crosswordPrizes","type":"address"},{"internalType":"address","name":"_userProfiles","type":"address"},{"internalType":"address","name":"_configManager","type":"address"},{"internalType":"address","name":"_adminManager","type":"address"},{"internalType":"address","name":"_publicCrosswordManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"core","type":"address"},{"indexed":false,"internalType":"address","name":"prizes","type":"address"},{"indexed":false,"internalType":"address","name":"profiles","type":"address"},{"indexed":false,"internalType":"address","name":"config","type":"address"},{"indexed":false,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"address","name":"publicManager","type":"address"}],"name":"ContractsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"}],"name":"activateCrossword","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"}],"name":"activatePublicCrossword","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminManager","outputs":[{"internalType":"contract IAdminManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"}],"name":"claimPrize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"},{"internalType":"uint256","name":"durationMs","type":"uint256"},{"internalType":"string","name":"username","type":"string"},{"internalType":"string","name":"displayName","type":"string"},{"internalType":"string","name":"pfpUrl","type":"string"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"completeCrossword","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"configManager","outputs":[{"internalType":"contract IConfigManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"prizePool","type":"uint256"},{"internalType":"uint256[]","name":"winnerPercentages","type":"uint256[]"},{"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"createCrossword","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"crosswordData","type":"string"},{"internalType":"string","name":"sponsoredBy","type":"string"}],"name":"createPublicCrossword","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"crosswordData","type":"string"},{"internalType":"string","name":"sponsoredBy","type":"string"},{"internalType":"uint256","name":"maxWinners","type":"uint256"},{"internalType":"uint256","name":"prizePool","type":"uint256"},{"internalType":"uint256[]","name":"winnerPercentages","type":"uint256[]"},{"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"createPublicCrosswordWithNativeCELOPrizePool","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"crosswordData","type":"string"},{"internalType":"string","name":"sponsoredBy","type":"string"},{"internalType":"uint256","name":"maxWinners","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"prizePool","type":"uint256"},{"internalType":"uint256[]","name":"winnerPercentages","type":"uint256[]"},{"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"createPublicCrosswordWithPrizePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"crosswordCore","outputs":[{"internalType":"contract ICrosswordCore","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"crosswordPrizes","outputs":[{"internalType":"contract ICrosswordPrizes","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyClearCrossword","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"}],"name":"fundCrosswordPrizes","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getActivePublicCrosswords","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllPublicCrosswords","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCompletedCrosswords","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"}],"name":"getCrosswordDetails","outputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"totalPrizePool","type":"uint256"},{"internalType":"uint256[]","name":"winnerPercentages","type":"uint256[]"},{"components":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"completionTimestamp","type":"uint256"},{"internalType":"uint256","name":"durationMs","type":"uint256"}],"internalType":"struct ICrosswordCore.CrosswordCompletion[]","name":"completions","type":"tuple[]"},{"internalType":"uint256","name":"activationTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint8","name":"state","type":"uint8"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"gridData","type":"string"},{"internalType":"string","name":"sponsoredBy","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentCrossword","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"string","name":"","type":"string"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"}],"name":"getPublicCrosswordDetails","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"sponsoredBy","type":"string"},{"internalType":"string","name":"crosswordData","type":"string"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"totalPrizePool","type":"uint256"},{"internalType":"uint256","name":"maxWinners","type":"uint256"},{"internalType":"uint256[]","name":"winnerPercentages","type":"uint256[]"},{"internalType":"uint256","name":"activationTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"},{"internalType":"bool","name":"isCompleted","type":"bool"},{"internalType":"address","name":"creator","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"},{"internalType":"address","name":"user","type":"address"}],"name":"getUserRank","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isAdminAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isReturnHomeButtonVisible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"},{"internalType":"address","name":"user","type":"address"}],"name":"isWinner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicCrosswordManager","outputs":[{"internalType":"contract IPublicCrosswordManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"},{"internalType":"string","name":"crosswordData","type":"string"}],"name":"setCrossword","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"fundingContractAddr","type":"address"}],"name":"setFundingContractForPrizes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSigner","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_crosswordCore","type":"address"},{"internalType":"address","name":"_crosswordPrizes","type":"address"},{"internalType":"address","name":"_userProfiles","type":"address"},{"internalType":"address","name":"_configManager","type":"address"},{"internalType":"address","name":"_adminManager","type":"address"},{"internalType":"address","name":"_publicCrosswordManager","type":"address"}],"name":"updateContractAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"username","type":"string"},{"internalType":"string","name":"displayName","type":"string"},{"internalType":"string","name":"pfpUrl","type":"string"},{"internalType":"string","name":"bio","type":"string"},{"internalType":"string","name":"website","type":"string"}],"name":"updateProfile","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"crosswordId","type":"bytes32"},{"internalType":"address","name":"user","type":"address"}],"name":"userCompletedCrossword","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"userProfiles","outputs":[{"internalType":"contract IUserProfiles","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523461002f5761002061001461010c565b94939093929192610132565b6040516131a9908161084e8239f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761006b57604052565b610034565b9061008461007d60405190565b928361004a565b565b6001600160a01b031690565b90565b61009e81610086565b0361002f57565b9050519061008482610095565b909160c08284031261002f576100c883836100a5565b926100d681602085016100a5565b926100e482604083016100a5565b926100926100f584606085016100a5565b9360a061010582608087016100a5565b94016100a5565b61012a6139f78038038061011f81610070565b9283398101906100b2565b909192939495565b90610084959493929161014433610149565b6106c0565b61008490610195565b6100926100926100929290565b6100926001610152565b90600019905b9181191691161790565b61018861009261019092610152565b600154610169565b600155565b61019e906101e1565b6100846101a961015f565b610179565b6100866100926100929290565b610092906101ae565b6101cd90610086565b9052565b60208101929161008491906101c4565b60006101ec816101bb565b6101f581610086565b6101fe84610086565b1461020e575050610084906106fe565b631e4fbdf760e01b8252819061022790600483016101d1565b0390fd5b90610084959493929161023c610753565b6105b2565b6001600160401b03811161006b57602090601f01601f19160190565b0190565b61027361026e602b610241565b610070565b90602b8252565b61028761026e602d610241565b90602d8252565b61029b61026e602f610241565b90602f8252565b6102af61026e602c610241565b90602c8252565b6102be610261565b7f43726f7373776f7264426f6172643a20636f726520616464726573732063616e60208201526a6e6f74206265207a65726f60a81b604082015290565b6100926102b6565b6100926102fb565b61031361027a565b7f43726f7373776f7264426f6172643a207072697a65732061646472657373206360208201526c616e6e6f74206265207a65726f60981b604082015290565b61009261030b565b610092610352565b61036a61028e565b7f43726f7373776f7264426f6172643a2070726f66696c6573206164647265737360208201526e2063616e6e6f74206265207a65726f60881b604082015290565b610092610362565b6100926103ab565b6103c361027a565b7f43726f7373776f7264426f6172643a20636f6e6669672061646472657373206360208201526c616e6e6f74206265207a65726f60981b604082015290565b6100926103bb565b610092610402565b61041a6102a2565b7f43726f7373776f7264426f6172643a2061646d696e206164647265737320636160208201526b6e6e6f74206265207a65726f60a01b604082015290565b610092610412565b610092610458565b61009290610086906001600160a01b031682565b61009290610468565b6100929061047c565b90610100600160a81b039060081b61016f565b6104b06100926104b892610485565b60025461048e565b600255565b906001600160a01b039061016f565b6104db6100926104e392610485565b6003546104bd565b600355565b6104f76100926104ff92610485565b6004546104bd565b600455565b61051361009261051b92610485565b6005546104bd565b600555565b61052f61009261053792610485565b6006546104bd565b600655565b61054b61009261055392610485565b6007546104bd565b600755565b91946105a16105ab9298979561059760a09661058d6100849a61058360c08a019e60008b01906101c4565b60208901906101c4565b60408701906101c4565b60608501906101c4565b60808301906101c4565b01906101c4565b92936106bb929591946105cc6105c6610303565b86610824565b6105dd6105d761035a565b87610824565b6105ee6105e86103b3565b88610824565b6105ff6105f961040a565b82610824565b61061061060a610460565b83610824565b61062161061b610460565b84610824565b61063261062d86610485565b6104a1565b61064361063e87610485565b6104cc565b61065461064f88610485565b6104e8565b61066561066082610485565b610504565b61067661067183610485565b610520565b61068761068284610485565b61053c565b7f49e1de879727329b7d4d720127457a2857bcb190b237b00840edb50feb9361e0966106b260405190565b96879687610558565b0390a1565b90610084959493929161022b565b61009290610086565b6100926000546106ce565b6106f16100926106f992610485565b6000546104bd565b600055565b6107066106d7565b90610710816106e2565b61074361073d7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610485565b91610485565b9161074d60405190565b600090a3565b61075b610845565b339061076f61076983610086565b91610086565b036107775750565b63118cdaa760e01b60009081529081906102279060046101d1565b60005b8381106107a55750506000910152565b8181015183820152602001610795565b6107d66107df60209361025d936107ca815190565b80835293849260200190565b95869101610792565b601f01601f191690565b6020808252610092929101906107b5565b156108025750565b6102279061080f60405190565b62461bcd60e51b8152918291600483016107e9565b906100849161083e61076961083960006101bb565b610086565b14156107fa565b6100926106d756fe60e0604052600436101561001b575b361561001957600080fd5b005b60003560e01c80630236bb5a1461027b57806303ff1a96146102765780630a713d68146102715780630f9969481461026c578063182296c3146102675780631a831f16146102625780631dc626b11461025d578063317d609b1461025857806339a84e5a146102535780633ab2648a1461024e57806340553dcd1461024957806347ce16f614610244578063595c6a671461023f5780635c975abb1461023a5780636c19e78314610235578063715018a6146102305780637807bd3c1461022b5780637849dbaa146102265780637e82686314610221578063842a42e31461021c5780638a2ddd03146102175780638da5cb5b146102125780639745808a1461020d5780639cc19f5b14610208578063a210b6a414610203578063a5f00e7d146101fe578063b043e032146101f9578063b0fc9440146101f4578063b55c3f97146101ef578063c4dc53d3146101ea578063ca0ab075146101e5578063cd10f4c6146101e0578063d9e268f7146101db578063ec03a37a146101d6578063f2fde38b146101d1578063f4b53f71146101cc578063f6ebc190146101c75763f8e5cbdb0361000e57611022565b610f42565b610ed4565b610ebe565b610e86565b610d16565b610cf3565b610c1b565b610bf9565b610be0565b610bbe565b610b9b565b610aee565b610ad5565b610aaf565b610a85565b610a60565b610a31565b610a1b565b610a0a565b6109e2565b61094f565b6108d1565b6108bb565b6108a2565b61088c565b610871565b6107b1565b61078d565b6106d9565b6105f9565b6104d9565b61049b565b61046a565b6103e2565b610349565b61032e565b6102d6565b6001600160a01b031690565b61029590610280565b90565b6102a18161028c565b036102a857565b600080fd5b905035906102ba82610298565b565b602060048203126102a8576102959060046102ad565b9052565b346102a8576103016102ef6102ea366102bc565b61109d565b60405191829182901515815260200190565b0390f35b806102a1565b905035906102ba82610305565b602060048203126102a85761029590600461030b565b346102a85761034461033f36610318565b61112b565b604051005b346102a85761034461035a36610318565b6111b7565b600460009103126102a857565b60009103126102a857565b0190565b9061039b61039461038a845190565b8084529260200190565b9260200190565b9060005b8181106103ac5750505090565b9091926103c96103c26001928651815260200190565b9460200190565b92910161039f565b60208082526102959291019061037b565b346102a8576103f03661035f565b6103016103fb611274565b604051918291826103d1565b610295916008021c610280565b610280565b906102959154610407565b61029560006007610419565b61041461029561029592610280565b61029590610430565b6102959061043f565b6102d290610448565b6020810192916102ba9190610451565b346102a8576104783661035f565b610301610483610424565b6040519182918261045a565b61029560016002610419565b346102a8576104a93661035f565b61030161048361048f565b906004916040838203126102a8576102959060206104d2828661030b565b94016102ad565b346102a8576103016102ef6104ed366104b4565b90611305565b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761052a57604052565b6104f3565b604051906102ba606083610509565b906102ba61054b60405190565b9283610509565b6001600160401b03811161052a57602090601f01601f19160190565b90826000939282370152565b9092919261058f61058a82610552565b61053e565b93818552818301116102a8576102ba91602085019061056e565b9080601f830112156102a8578160206102959335910161057a565b9060046040818403126102a8576105db838261030b565b9260208201356001600160401b0381116102a85761029592016105a9565b346102a85761034461060a366105c4565b90611361565b909182601f830112156102a8578135916001600160401b0383116102a85760200192600183028401116102a857565b60049060c0828203126102a857610656818361030b565b92610664826020850161030b565b926001600160401b039160408201358381116102a85784610686918401610610565b93909460608401358281116102a857816106a1918601610610565b93909460808101358481116102a857836106bc918301610610565b93909460a08301359081116102a8576106d59201610610565b9091565b346102a8576103446106ea3661063f565b9897909796919695929594939461142e565b909182601f830112156102a8578135916001600160401b0383116102a85760200192602083028401116102a857565b60049160a0838303126102a857610742828461030b565b9261075083602083016102ad565b9261075e816040840161030b565b9260608301356001600160401b0381116102a857826107846080946102959387016106fc565b9490950161030b565b6103446107993661072b565b94939093929192611588565b61029560006003610419565b346102a8576107bf3661035f565b6103016104836107a5565b906004610100818403126102a8576107e2838261030b565b926001600160401b039260208301358481116102a857826108049185016105a9565b9360408401358181116102a8578361081d9186016105a9565b9360608101358281116102a857846108369183016105a9565b93610844816080840161030b565b936108528260a0850161030b565b9360c08401359081116102a8578261078460e0946102959387016106fc565b61034461087d366107ca565b979690969591959492946116d8565b346102a85761089a3661035f565b610344611943565b346102a8576108b03661035f565b6103016102ef611bcd565b346102a8576103446108cc366102bc565b611bd5565b346102a8576108df3661035f565b610344611c1a565b60046080818303126102a8576108fd828261030b565b926001600160401b039160208101358381116102a8578461091f9183016105a9565b9360408201358481116102a857816109389184016105a9565b9360608301359081116102a85761029592016105a9565b61034461095b366108e7565b92919091611ccd565b60005b8381106109775750506000910152565b8181015183820152602001610967565b6109a86109b16020936103779361099c815190565b80835293849260200190565b95869101610964565b601f01601f191690565b90815292916102ba916040906109dd9060608701908782036020890152610987565b940152565b346102a8576109f03661035f565b6103016109fb611eb2565b604051919391938493846109bb565b610344610a1636610318565b611f72565b346102a857610a293661035f565b610344611f7b565b346102a857610a3f3661035f565b610344611fb4565b6102d29061028c565b6020810192916102ba9190610a47565b346102a857610a6e3661035f565b610301610a79612037565b60405191829182610a50565b346102a857610301610a9f610a99366104b4565b90612053565b6040519182918290815260200190565b346102a8576103016102ef610ac3366104b4565b906120c3565b61029560006006610419565b346102a857610ae33661035f565b610301610483610ac9565b346102a857610afc3661035f565b6103016102ef6120f1565b60049060a0828203126102a8576001600160401b0382358181116102a85782610b31918501610610565b93909460208201358381116102a85784610b4c918401610610565b93909460408401358281116102a85781610b67918601610610565b93909460608101358481116102a85783610b82918301610610565b93909460808301359081116102a8576106d59201610610565b346102a857610344610bac36610b07565b989790979691969592959493946121b2565b346102a857610344610bcf36610318565b6121f0565b61029560006004610419565b346102a857610bee3661035f565b610301610483610bd4565b346102a857610344610c0a366102bc565b612258565b61029560006005610419565b346102a857610c293661035f565b610301610483610c0f565b90600491610120838203126102a857610c4d818461030b565b926001600160401b039160208201358381116102a85781610c6f9184016105a9565b9360408301358481116102a85782610c889185016105a9565b9360608401358181116102a85783610ca19186016105a9565b93610caf846080830161030b565b93610cbd8160a084016102ad565b93610ccb8260c0850161030b565b9360e08401359081116102a857610ce7836102959286016106fc565b9390946101000161030b565b346102a857610344610d0436610c34565b989790979691969592959493946122e9565b346102a857610d243661035f565b6103016103fb61243b565b90610d3e61039461038a845190565b9060005b818110610d4f5750505090565b909192610d656103c26001928651815260200190565b929101610d42565b906040806102ba93610d8760008201516000860190610a47565b610d9660208201516020860152565b0151910152565b9061037781606093610d6d565b90610db961039461038a845190565b9060005b818110610dca5750505090565b909192610ddd6103c26001928651610d9d565b929101610dbd565b9895610e5190610e4a610e428c610e6899986102959f9d98610e779d97610e3491610e27610e5b9b610e206101408801946000890190610a47565b6020870152565b8482036040860152610d2f565b916060818403910152610daa565b9660808d0152565b60a08b0152565b60ff1660c0890152565b86820360e0880152610987565b90848203610100860152610987565b91610120818403910152610987565b346102a857610301610e9f610e9a36610318565b6127c4565b96610eb59a989a96919695929594939460405190565b9a8b9a8b610de5565b346102a857610344610ecf366102bc565b6129bc565b346102a857610ee23661035f565b6103016103fb612a24565b9060049060c0828403126102a857610f0583836102ad565b92610f1381602085016102ad565b92610f2182604083016102ad565b92610295610f3284606085016102ad565b9360a06104d282608087016102ad565b346102a857610344610f5336610eed565b94939093929192612fd1565b9890610fef61101b999f9e9c96956102ba9e99610fe26110119a6101809f988f610fde6110079c610fd7610fcc60a095610fbe610fff9f610fb0610ff79f6101a08a01908a820360008c0152610987565b9088820360208a0152610987565b908682036040880152610987565b986060850190610a47565b6080830152565b0152565b8c820360c08e0152610d2f565b9e60e08b0152565b610100890152565b610120870152565b1515610140850152565b1515610160830152565b0190610a47565b346102a85761030161103b61103636610318565b612fdf565b996110549d9b9d99919998929897939796949660405190565b9d8e9d8e610f5f565b61029560065461028c565b8015156102a1565b905051906102ba82611068565b906020828203126102a85761029591611070565b6040513d6000823e3d90fd5b60206110ce6110b26110ad61105d565b610448565b630236bb5a6110d96110c360405190565b958694859360e01b90565b835260048301610a50565b91815a930392fa90811561111b576000916110f2575090565b610295915060203d602011611114575b61110c8183610509565b81019061107d565b503d611102565b611091565b61029560075461028c565b6111366110ad611120565b630a713d6890803b156102a85761115e9161116c61115360405190565b948594859360e01b90565b835260048301526024820190565b600094858094825a940393f1801561111b57611186575050565b816102ba92903d106111a5575b61119d8183610509565b81019061036c565b503d611193565b61029560035461028c565b6111366110ad6111ac565b6001600160401b03811161052a5760208091020190565b905051906102ba82610305565b929190926111f661058a856111c2565b938085526020928380870192028301928184116102a857915b83831061121d575050505050565b84809161122a84866111d9565b81520192019161120f565b9080601f830112156102a8578151610295926020016111e6565b906020828203126102a85781516001600160401b0381116102a8576102959201611235565b61129c60006112846110ad611120565b6319e2ba7c9061129360405190565b93849260e01b90565b8252816004810191815a930392fa90811561111b576000916112bc575090565b61029591503d806000833e6112d18183610509565b81019061124f565b6102959060081c610280565b6102956002546112d9565b9081526040810192916102ba9160209061101b565b9061133e602091611314600090565b506113206110ad6112e5565b906110d9631dc626b19161133360405190565b968795869460e01b90565b8452600484016112f0565b90815260406020820181905261029592910190610987565b9061136d6110ad6112e5565b63317d609b813b156102a85761116c6113949361138960405190565b958695869460e01b90565b845260048401611349565b91906109b1816113b6816103779560209181520190565b809561056e565b99979592906102959b9995611412956113f76114049460408f610fde6114209e996113f060e08401996000850190610a47565b6020830152565b8c830360608e015261139f565b9189830360808b015261139f565b9186830360a088015261139f565b9260c081850391015261139f565b9892979196909394956114426110ad6112e5565b9663f982c36296883b156102a8578b9a61146e9a61147a9861146360405190565b9d8e9d8e9c60e01b90565b8c523360048d016113bd565b600094858094825a940393f1801561111b576114fd575b5060206114bf6114a26110ad6111ac565b63d9cbe53c846114cc6114b460405190565b978895869460e01b90565b84523390600485016112f0565b92825a940393f190811561111b57506114e25750565b6114fa9060203d6020116111145761110c8183610509565b50565b61151390823d84116111a55761119d8183610509565b38611491565b9037565b8183529091602001916001600160fb1b0381116102a857829160206103779202938491611519565b969593946102ba9561157b6080956115746109dd9661156a8d97600060a08a01990152565b60208d0190610a47565b60408b0152565b88830360608a015261151d565b94919293906115986110ad6111ac565b92633ab2648a92843b156102a8576000966115c5966115d0946115ba60405190565b9a8b998a9860e01b90565b885260048801611545565b815a9103923491f1801561111b576115e55750565b6102ba90600061119d8183610509565b156115fc57565b60405162461bcd60e51b815260206004820152601b60248201527a15985b1d59481b5d5cdd08195c5d585b081c1c9a5e99481c1bdbdb602a1b604482015280606481015b0390fd5b6102956102956102959290565b9998969195610e4a6116ad8c6109dd989761169f6102ba9d986116916116b59860e09e6116846101008801926000890152565b8682036020880152610987565b908482036040860152610987565b916060818403910152610987565b9560808d0152565b88830360c08a015261151d565b6104146102956102959290565b610295906116c2565b96949290979593916116f16116ea8590565b34146115f5565b6116fc6110ad611120565b63427b88ee60009a61170d8c611644565b90833b156102a8578a8a8a8f988f9a8c9161173a9a6117459761172f60405190565b9e8f9d8e9c60e01b90565b8c5260048c01611651565b92825a940393f1801561111b57611822575b506117636110ad6111ac565b90633ab2648a90611773886116cf565b95833b156102a8578895611799956117a59361178e60405190565b998a98899760e01b90565b87528b60048801611545565b815a9103923491f1801561111b57611806575b506117c46110ad6111ac565b630a713d68813b156102a85783916117e391836117f161133360405190565b845260048401526024830190565b92825a940393f1801561111b57611186575050565b61181c90833d85116111a55761119d8183610509565b386117b8565b61183890873d89116111a55761119d8183610509565b38611757565b61184b61058a6026610552565b9060268252565b61185f61058a602b610552565b90602b8252565b61187361058a602d610552565b90602d8252565b61188761058a602f610552565b90602f8252565b61189b61058a602c610552565b90602c8252565b6118aa61183e565b7f43726f7373776f7264426f6172643a2063616c6c6572206973206e6f7420616e6020820152651030b236b4b760d11b604082015290565b6102956118a2565b6102956118e2565b602080825261029592910190610987565b1561190b5750565b6116409061191860405190565b62461bcd60e51b8152918291600483016118f2565b61029560045461028c565b61029560055461028c565b61194e6110ad61105d565b630236bb5a61196661195f60405190565b9160e01b90565b81526020816004938161197b33878301610a50565b91815a930392fa801561111b576119a391600091611b98575b5061199d6118ea565b90611903565b6119ae6110ad6112e5565b90638456cb5991803b156102a8576119d2926119c960405190565b93849160e01b90565b8082529181848101600096878094825a940393f1801561111b57611b7c575b506119fd6110ad6111ac565b803b156102a85783611a0e60405190565b838152918290818387820192825a940393f1801561111b57611b60575b50611a376110ad61192d565b803b156102a85783611a4860405190565b838152918290818387820192825a940393f1801561111b57611b44575b50611a716110ad611938565b803b156102a85783611a8260405190565b838152918290818387820192825a940393f1801561111b57611b28575b50611aab6110ad61105d565b803b156102a85783611abc60405190565b838152918290818387820192825a940393f1801561111b57611b0c575b50611ae56110ad611120565b91823b156102a8576117f192849283611afd60405190565b95869485938452830160000190565b611b2290843d86116111a55761119d8183610509565b38611ad9565b611b3e90843d86116111a55761119d8183610509565b38611a9f565b611b5a90843d86116111a55761119d8183610509565b38611a65565b611b7690843d86116111a55761119d8183610509565b38611a2b565b611b9290843d86116111a55761119d8183610509565b386119f1565b611bb1915060203d6020116111145761110c8183610509565b38611994565b610295905b60ff1690565b610295600254611bb7565b610295611bc2565b611be06110ad6112e5565b636c19e78390803b156102a8576110ce9161116c61115360405190565b611c05613082565b6102ba6102ba611c1560006116cf565b6130dd565b6102ba611bfd565b9261169161169f92610295969461168460808801926000890152565b90611c4b61058a836111c2565b918252565b369037565b906102ba611c6b611c6584611c3e565b936111c2565b601f190160208401611c50565b6102d290611644565b6102ba94611cb882989795611cae608096611ca4611cc597600060a08901980152565b60208c0190610a47565b60408a0190611c78565b8782036060890152610d2f565b940190611c78565b929091611cdb6110ad611120565b9063d25e3fc690823b156102a857611d0593611d1191611cfa60405190565b968796879560e01b90565b85528860048601611c22565b916000948593815a9103923491f1801561111b57611e0f575b50611d366110ad6111ac565b63f39130e5611d44836116cf565b91611d56611d5185611644565b611c55565b90803b156102a857849283611d7f81611d73958161178e60405190565b87528c60048801611c81565b92825a940393f19081611df3575b50611d96575050565b611da16110ad6111ac565b630a713d68813b156102a85782916117e39183611dc06114b460405190565b92825a940393f19182611dd6575b50506102ba57565b81611dec92903d106111a55761119d8183610509565b3880611dce565b611e0990833d85116111a55761119d8183610509565b38611d8d565b611e2590823d84116111a55761119d8183610509565b38611d2a565b90929192611e3b61058a82610552565b93818552818301116102a8576102ba916020850190610964565b9080601f830112156102a857815161029592602001611e2b565b90916060828403126102a857611e8583836111d9565b602083015190936001600160401b0382116102a8576040611eab82610295948701611e55565b94016111d9565b611eda90611ec16110ad6112e5565b90637849dbaa91611ed160405190565b93849360e01b90565b835282600481016000958693815a930392fa91821561111b578390848094611f04575b5050929190565b9150919350611f2592503d8091833e611f1d8183610509565b810190611e6f565b913880949294611efd565b6102ba90611f3c613082565b6102ba90611f48613132565b611f536110ad6111ac565b63e7b09cea813b156102a85760009161115e916115d06110c360405190565b6102ba90611f30565b611f866110ad6112e5565b63842a42e3813b156102a857611fa891611f9f60405190565b92839260e01b90565b8252816004810161116c565b611fbf6110ad61105d565b630236bb5a611fd061195f60405190565b815260208160049381611fe533878301610a50565b91815a930392fa801561111b5761200691600091611b98575061199d6118ea565b6120116110ad6112e5565b90633f4ba83a91803b156102a8576119d2926119c960405190565b61029560005461028c565b61029561202c565b906020828203126102a857610295916111d9565b9061133e602091612062600090565b5061206e6110ad6111ac565b90612081639745808a9161133360405190565b91815a930392fa90811561111b5760009161209a575090565b610295915060203d6020116120bc575b6120b48183610509565b81019061203f565b503d6120aa565b9061133e6020916120d2600090565b506120de6110ad6111ac565b906110d9639cc19f5b9161133360405190565b61211060206121016110ad611938565b636bc122c99061129360405190565b8252604060048301526013604483015272686f6d655f627574746f6e5f76697369626c6560681b60648301526001602483015281608481016110d9565b98969491612196936102959b999561217a8c612188946121a49b9660a0830192600081850391015261139f565b8c810360208e01529161139f565b9189830360408b015261139f565b91868303606088015261139f565b92608081850391015261139f565b9893969197929590946121c66110ad61192d565b9763b043e03297893b156102a8576121e59a61116c9861146360405190565b8c5260048c0161214d565b6121fb6110ad6111ac565b63b0fc944090803b156102a85761115e9161116c61115360405190565b6102ba90612224613082565b6102ba90612230613132565b61223b6110ad6111ac565b631c294efd90803b156102a8576110ce9161116c61115360405190565b6102ba90612218565b9a9997926109dd966122cb8d9760806122c66102ba9e996122b88c6101009f99986122aa6122d59a6122dc9d61229d6101208601926000870152565b8482036020860152610987565b916040818403910152610987565b8c810360608e015290610987565b990152565b60a08d0190610a47565b60c08b0152565b88830360e08a015261151d565b9896949795939290919860805260c0526123046110ad611120565b97883b156102a857848489612341958a958a9561232060405190565b60a0526330df0a5760e21b60a0515260c05191608051600460a05101612261565b9560009687915a8360a0519360a05190039260a05192f1801561111b5761240a575b61236e6110ad6111ac565b9163f39130e591833b156102a857879561239195879361239f936115ba60405190565b885260805160048901611545565b92825a940393f1801561111b576123ee575b506123bd6110ad6111ac565b630a713d6890803b156102a8576123d991839161129360405190565b825260805160048301528183602482016117f1565b61240490823d84116111a55761119d8183610509565b386123b1565b853d8711612434575b8061242361242f9260a051610509565b60a0510160a05161036c565b612363565b503d612413565b61129c600061244b6110ad611120565b63321c7dc49061129360405190565b905051906102ba82610298565b9291909261247761058a856111c2565b938085526020928380870192028301928184116102a857915b83831061249e575050505050565b8480916124ab84866111d9565b815201920191612490565b9080601f830112156102a857815161029592602001612467565b916101a0838303126102a85782516001600160401b0392908381116102a857816124fb918601611e55565b9360208101518481116102a85782612514918301611e55565b9360408201518181116102a8578361252d918401611e55565b9361253b846060850161245a565b9361254981608086016111d9565b936125578260a083016111d9565b9360c08201519081116102a857826125709183016124b6565b9261257e8360e084016111d9565b9261258d8161010085016111d9565b9261259c8261012083016111d9565b926102956125ae846101408501611070565b936125bd816101608601611070565b936101800161245a565b929190926125d761058a856111c2565b938085526020928380870192028301928184116102a857915b8383106125fe575050505050565b84809161260b848661245a565b8152019201916125f0565b9080601f830112156102a8578151610295926020016125c7565b60ff81166102a1565b905051906102ba82612630565b9190610100838203126102a85761265d818461245a565b9261266b82602083016111d9565b604082015190936001600160401b039390918481116102a857816126909185016124b6565b9360608401519081116102a857816126a9918501612616565b926126b782608083016111d9565b926102956126c88460a085016111d9565b9360e06126d88260c08701612639565b9401611070565b611bbc6102956102959290565b91906060838203126102a85761272b90604061270661052f565b94612711838261245a565b865261272083602083016111d9565b6020870152016111d9565b6040830152565b92919261274161058a836111c2565b93828552602090602086019060608095028401938185116102a857915b84831061276d57505050505050565b83869161277a84866126ec565b81520192019161275e565b9080601f830112156102a857815161029592602001612732565b906020828203126102a85781516001600160401b0381116102a8576102959201612785565b6060906127e5906127d66110ad611120565b63ec03a37a91611ed160405190565b808452600484018290529183602481016000968793815a930392fa91821561111b57849085948694612935575b508561281f6110ad6111ac565b9161282960405190565b928391825281612840876004830190815260200190565b91815a930392fa86908792889389938a938b9381612904575b506128ef5750505050505061286d856116cf565b9261287786611644565b9485988695612885896126df565b955b8961115e6128966110ad6112e5565b63a090a3566128a76110c360405190565b91815a930392fa998a1561111b57809a6128ca575b505099989796959493929190565b6128e7929a503d8091833e6128df8183610509565b81019061279f565b9738806128bc565b909197949b9298939a50909a99979695612887565b9450955050505061292791503d8089833e61291f8183610509565b810190612646565b509396909492959195612859565b915093506129569192503d8086833e61294e8183610509565b8101906124d0565b505050505050505050949093929194612812565b6102ba90612976613082565b6000612981816116cf565b61298a8161028c565b6129938461028c565b146129a35750506102ba906130dd565b631e4fbdf760e01b825281906116409060048301610a50565b6102ba9061296a565b634e487b7160e01b600052603260045260246000fd5b906129e4825190565b8110156129f5576020809102010190565b6129c5565b634e487b7160e01b600052601160045260246000fd5b6000198114612a1f5760010190565b6129fa565b612a33906112846110ad611120565b8252600490828281016000968793815a930392fa91821561111b578492612bbc575b50612a61611d51835190565b90612a6b85611644565b94855b612a79610295865190565b811015612b7057612a8b6110ad6111ac565b82612ab363ec03a37a92612aa6612aa2868b6129db565b5190565b93612ac16110c360405190565b835289830190815260200190565b91815a930392fa908184918593612b4c575b50612ae7575050600101612a6e565b612a6e565b612afb612af460026126df565b9160ff1690565b14908115612b44575b50612b12575b600101612a6e565b95612b3c612ae291612b37612b2a612aa28b8a6129db565b612b3483896129db565b52565b612a10565b969050612b0a565b905038612b04565b909250612b6391503d8086833e61291f8183610509565b9795509550505050612ad3565b509391925050612b88612b8285611c55565b93611644565b845b811015612bb557612bae81612ba8612b2a612aa2612b8a95886129db565b60010190565b9050612b88565b5092505090565b612bd19192503d8086833e6112d18183610509565b9038612a55565b906102ba9594939291612be9613082565b612ec3565b612bf6611852565b7f43726f7373776f7264426f6172643a20636f726520616464726573732063616e60208201526a6e6f74206265207a65726f60a81b604082015290565b610295612bee565b610295612c33565b612c4b611866565b7f43726f7373776f7264426f6172643a207072697a65732061646472657373206360208201526c616e6e6f74206265207a65726f60981b604082015290565b610295612c43565b610295612c8a565b612ca261187a565b7f43726f7373776f7264426f6172643a2070726f66696c6573206164647265737360208201526e2063616e6e6f74206265207a65726f60881b604082015290565b610295612c9a565b610295612ce3565b612cfb611866565b7f43726f7373776f7264426f6172643a20636f6e6669672061646472657373206360208201526c616e6e6f74206265207a65726f60981b604082015290565b610295612cf3565b610295612d3a565b612d5261188e565b7f43726f7373776f7264426f6172643a2061646d696e206164647265737320636160208201526b6e6e6f74206265207a65726f60a01b604082015290565b610295612d4a565b610295612d90565b90610100600160a81b039060081b5b9181191691161790565b612dc8610295612dd092610448565b600254612da0565b600255565b906001600160a01b0390612daf565b612df3610295612dfb92610448565b600354612dd5565b600355565b612e0f610295612e1792610448565b600454612dd5565b600455565b612e2b610295612e3392610448565b600554612dd5565b600555565b612e47610295612e4f92610448565b600654612dd5565b600655565b612e63610295612e6b92610448565b600754612dd5565b600755565b9194612eb961101b92989795612eaf60a096612ea56102ba9a612e9b60c08a019e60008b0190610a47565b6020890190610a47565b6040870190610a47565b6060850190610a47565b6080830190610a47565b9293612fcc92959194612edd612ed7612c3b565b86613152565b612eee612ee8612c92565b87613152565b612eff612ef9612ceb565b88613152565b612f10612f0a612d42565b82613152565b612f21612f1b612d98565b83613152565b612f32612f2c612d98565b84613152565b612f43612f3e86610448565b612db9565b612f54612f4f87610448565b612de4565b612f65612f6088610448565b612e00565b612f76612f7182610448565b612e1c565b612f87612f8283610448565b612e38565b612f98612f9384610448565b612e54565b7f49e1de879727329b7d4d720127457a2857bcb190b237b00840edb50feb9361e096612fc360405190565b96879687612e70565b0390a1565b906102ba9594939291612bd8565b9061115e90612fef6110ad611120565b63ec03a37a61300b61300060405190565b958695869360e01b90565b6000958693815a930392fa91821561111b57839084809481948294839484809481948294839484809461304a575b50509c9b9a99989796959493929190565b9b509b50509b50505050505050505061306d92503d8091833e61294e8183610509565b91939597999b38809e929496989a9c9e613039565b61308a612037565b339061309e6130988361028c565b9161028c565b036130a65750565b63118cdaa760e01b6000908152908190611640906004610a50565b6130d06102956130d892610448565b600054612dd5565b600055565b6130e561202c565b906130ef816130c1565b61312261311c7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610448565b91610448565b9161312c60405190565b600090a3565b61313a611bcd565b61314057565b63d93c066560e01b6000908152600490fd5b906102ba9161316c61309861316760006116cf565b61028c565b141561190356fea2646970667358221220fd154c64e78673eaafb57cf38dbfc977a11789040b454dd4a275e539bea7842a64736f6c634300081c00330000000000000000000000007b79e1cb9a344cf8856b4db1131bf65fb6a6fba2000000000000000000000000754b33d8aded1c6bf4821ea68158c42b434d781f0000000000000000000000004019cd85790a2706b0fc3bd9845c2c16742af0e5000000000000000000000000321dcef35e3da483304226ac679b8898c4ee08070000000000000000000000008944ffc503388174aff351cb1c6f87958d6e5bb3000000000000000000000000dc2b0c154f48c7e235872208a6f3093647a236a7

Deployed Bytecode

0x60e0604052600436101561001b575b361561001957600080fd5b005b60003560e01c80630236bb5a1461027b57806303ff1a96146102765780630a713d68146102715780630f9969481461026c578063182296c3146102675780631a831f16146102625780631dc626b11461025d578063317d609b1461025857806339a84e5a146102535780633ab2648a1461024e57806340553dcd1461024957806347ce16f614610244578063595c6a671461023f5780635c975abb1461023a5780636c19e78314610235578063715018a6146102305780637807bd3c1461022b5780637849dbaa146102265780637e82686314610221578063842a42e31461021c5780638a2ddd03146102175780638da5cb5b146102125780639745808a1461020d5780639cc19f5b14610208578063a210b6a414610203578063a5f00e7d146101fe578063b043e032146101f9578063b0fc9440146101f4578063b55c3f97146101ef578063c4dc53d3146101ea578063ca0ab075146101e5578063cd10f4c6146101e0578063d9e268f7146101db578063ec03a37a146101d6578063f2fde38b146101d1578063f4b53f71146101cc578063f6ebc190146101c75763f8e5cbdb0361000e57611022565b610f42565b610ed4565b610ebe565b610e86565b610d16565b610cf3565b610c1b565b610bf9565b610be0565b610bbe565b610b9b565b610aee565b610ad5565b610aaf565b610a85565b610a60565b610a31565b610a1b565b610a0a565b6109e2565b61094f565b6108d1565b6108bb565b6108a2565b61088c565b610871565b6107b1565b61078d565b6106d9565b6105f9565b6104d9565b61049b565b61046a565b6103e2565b610349565b61032e565b6102d6565b6001600160a01b031690565b61029590610280565b90565b6102a18161028c565b036102a857565b600080fd5b905035906102ba82610298565b565b602060048203126102a8576102959060046102ad565b9052565b346102a8576103016102ef6102ea366102bc565b61109d565b60405191829182901515815260200190565b0390f35b806102a1565b905035906102ba82610305565b602060048203126102a85761029590600461030b565b346102a85761034461033f36610318565b61112b565b604051005b346102a85761034461035a36610318565b6111b7565b600460009103126102a857565b60009103126102a857565b0190565b9061039b61039461038a845190565b8084529260200190565b9260200190565b9060005b8181106103ac5750505090565b9091926103c96103c26001928651815260200190565b9460200190565b92910161039f565b60208082526102959291019061037b565b346102a8576103f03661035f565b6103016103fb611274565b604051918291826103d1565b610295916008021c610280565b610280565b906102959154610407565b61029560006007610419565b61041461029561029592610280565b61029590610430565b6102959061043f565b6102d290610448565b6020810192916102ba9190610451565b346102a8576104783661035f565b610301610483610424565b6040519182918261045a565b61029560016002610419565b346102a8576104a93661035f565b61030161048361048f565b906004916040838203126102a8576102959060206104d2828661030b565b94016102ad565b346102a8576103016102ef6104ed366104b4565b90611305565b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761052a57604052565b6104f3565b604051906102ba606083610509565b906102ba61054b60405190565b9283610509565b6001600160401b03811161052a57602090601f01601f19160190565b90826000939282370152565b9092919261058f61058a82610552565b61053e565b93818552818301116102a8576102ba91602085019061056e565b9080601f830112156102a8578160206102959335910161057a565b9060046040818403126102a8576105db838261030b565b9260208201356001600160401b0381116102a85761029592016105a9565b346102a85761034461060a366105c4565b90611361565b909182601f830112156102a8578135916001600160401b0383116102a85760200192600183028401116102a857565b60049060c0828203126102a857610656818361030b565b92610664826020850161030b565b926001600160401b039160408201358381116102a85784610686918401610610565b93909460608401358281116102a857816106a1918601610610565b93909460808101358481116102a857836106bc918301610610565b93909460a08301359081116102a8576106d59201610610565b9091565b346102a8576103446106ea3661063f565b9897909796919695929594939461142e565b909182601f830112156102a8578135916001600160401b0383116102a85760200192602083028401116102a857565b60049160a0838303126102a857610742828461030b565b9261075083602083016102ad565b9261075e816040840161030b565b9260608301356001600160401b0381116102a857826107846080946102959387016106fc565b9490950161030b565b6103446107993661072b565b94939093929192611588565b61029560006003610419565b346102a8576107bf3661035f565b6103016104836107a5565b906004610100818403126102a8576107e2838261030b565b926001600160401b039260208301358481116102a857826108049185016105a9565b9360408401358181116102a8578361081d9186016105a9565b9360608101358281116102a857846108369183016105a9565b93610844816080840161030b565b936108528260a0850161030b565b9360c08401359081116102a8578261078460e0946102959387016106fc565b61034461087d366107ca565b979690969591959492946116d8565b346102a85761089a3661035f565b610344611943565b346102a8576108b03661035f565b6103016102ef611bcd565b346102a8576103446108cc366102bc565b611bd5565b346102a8576108df3661035f565b610344611c1a565b60046080818303126102a8576108fd828261030b565b926001600160401b039160208101358381116102a8578461091f9183016105a9565b9360408201358481116102a857816109389184016105a9565b9360608301359081116102a85761029592016105a9565b61034461095b366108e7565b92919091611ccd565b60005b8381106109775750506000910152565b8181015183820152602001610967565b6109a86109b16020936103779361099c815190565b80835293849260200190565b95869101610964565b601f01601f191690565b90815292916102ba916040906109dd9060608701908782036020890152610987565b940152565b346102a8576109f03661035f565b6103016109fb611eb2565b604051919391938493846109bb565b610344610a1636610318565b611f72565b346102a857610a293661035f565b610344611f7b565b346102a857610a3f3661035f565b610344611fb4565b6102d29061028c565b6020810192916102ba9190610a47565b346102a857610a6e3661035f565b610301610a79612037565b60405191829182610a50565b346102a857610301610a9f610a99366104b4565b90612053565b6040519182918290815260200190565b346102a8576103016102ef610ac3366104b4565b906120c3565b61029560006006610419565b346102a857610ae33661035f565b610301610483610ac9565b346102a857610afc3661035f565b6103016102ef6120f1565b60049060a0828203126102a8576001600160401b0382358181116102a85782610b31918501610610565b93909460208201358381116102a85784610b4c918401610610565b93909460408401358281116102a85781610b67918601610610565b93909460608101358481116102a85783610b82918301610610565b93909460808301359081116102a8576106d59201610610565b346102a857610344610bac36610b07565b989790979691969592959493946121b2565b346102a857610344610bcf36610318565b6121f0565b61029560006004610419565b346102a857610bee3661035f565b610301610483610bd4565b346102a857610344610c0a366102bc565b612258565b61029560006005610419565b346102a857610c293661035f565b610301610483610c0f565b90600491610120838203126102a857610c4d818461030b565b926001600160401b039160208201358381116102a85781610c6f9184016105a9565b9360408301358481116102a85782610c889185016105a9565b9360608401358181116102a85783610ca19186016105a9565b93610caf846080830161030b565b93610cbd8160a084016102ad565b93610ccb8260c0850161030b565b9360e08401359081116102a857610ce7836102959286016106fc565b9390946101000161030b565b346102a857610344610d0436610c34565b989790979691969592959493946122e9565b346102a857610d243661035f565b6103016103fb61243b565b90610d3e61039461038a845190565b9060005b818110610d4f5750505090565b909192610d656103c26001928651815260200190565b929101610d42565b906040806102ba93610d8760008201516000860190610a47565b610d9660208201516020860152565b0151910152565b9061037781606093610d6d565b90610db961039461038a845190565b9060005b818110610dca5750505090565b909192610ddd6103c26001928651610d9d565b929101610dbd565b9895610e5190610e4a610e428c610e6899986102959f9d98610e779d97610e3491610e27610e5b9b610e206101408801946000890190610a47565b6020870152565b8482036040860152610d2f565b916060818403910152610daa565b9660808d0152565b60a08b0152565b60ff1660c0890152565b86820360e0880152610987565b90848203610100860152610987565b91610120818403910152610987565b346102a857610301610e9f610e9a36610318565b6127c4565b96610eb59a989a96919695929594939460405190565b9a8b9a8b610de5565b346102a857610344610ecf366102bc565b6129bc565b346102a857610ee23661035f565b6103016103fb612a24565b9060049060c0828403126102a857610f0583836102ad565b92610f1381602085016102ad565b92610f2182604083016102ad565b92610295610f3284606085016102ad565b9360a06104d282608087016102ad565b346102a857610344610f5336610eed565b94939093929192612fd1565b9890610fef61101b999f9e9c96956102ba9e99610fe26110119a6101809f988f610fde6110079c610fd7610fcc60a095610fbe610fff9f610fb0610ff79f6101a08a01908a820360008c0152610987565b9088820360208a0152610987565b908682036040880152610987565b986060850190610a47565b6080830152565b0152565b8c820360c08e0152610d2f565b9e60e08b0152565b610100890152565b610120870152565b1515610140850152565b1515610160830152565b0190610a47565b346102a85761030161103b61103636610318565b612fdf565b996110549d9b9d99919998929897939796949660405190565b9d8e9d8e610f5f565b61029560065461028c565b8015156102a1565b905051906102ba82611068565b906020828203126102a85761029591611070565b6040513d6000823e3d90fd5b60206110ce6110b26110ad61105d565b610448565b630236bb5a6110d96110c360405190565b958694859360e01b90565b835260048301610a50565b91815a930392fa90811561111b576000916110f2575090565b610295915060203d602011611114575b61110c8183610509565b81019061107d565b503d611102565b611091565b61029560075461028c565b6111366110ad611120565b630a713d6890803b156102a85761115e9161116c61115360405190565b948594859360e01b90565b835260048301526024820190565b600094858094825a940393f1801561111b57611186575050565b816102ba92903d106111a5575b61119d8183610509565b81019061036c565b503d611193565b61029560035461028c565b6111366110ad6111ac565b6001600160401b03811161052a5760208091020190565b905051906102ba82610305565b929190926111f661058a856111c2565b938085526020928380870192028301928184116102a857915b83831061121d575050505050565b84809161122a84866111d9565b81520192019161120f565b9080601f830112156102a8578151610295926020016111e6565b906020828203126102a85781516001600160401b0381116102a8576102959201611235565b61129c60006112846110ad611120565b6319e2ba7c9061129360405190565b93849260e01b90565b8252816004810191815a930392fa90811561111b576000916112bc575090565b61029591503d806000833e6112d18183610509565b81019061124f565b6102959060081c610280565b6102956002546112d9565b9081526040810192916102ba9160209061101b565b9061133e602091611314600090565b506113206110ad6112e5565b906110d9631dc626b19161133360405190565b968795869460e01b90565b8452600484016112f0565b90815260406020820181905261029592910190610987565b9061136d6110ad6112e5565b63317d609b813b156102a85761116c6113949361138960405190565b958695869460e01b90565b845260048401611349565b91906109b1816113b6816103779560209181520190565b809561056e565b99979592906102959b9995611412956113f76114049460408f610fde6114209e996113f060e08401996000850190610a47565b6020830152565b8c830360608e015261139f565b9189830360808b015261139f565b9186830360a088015261139f565b9260c081850391015261139f565b9892979196909394956114426110ad6112e5565b9663f982c36296883b156102a8578b9a61146e9a61147a9861146360405190565b9d8e9d8e9c60e01b90565b8c523360048d016113bd565b600094858094825a940393f1801561111b576114fd575b5060206114bf6114a26110ad6111ac565b63d9cbe53c846114cc6114b460405190565b978895869460e01b90565b84523390600485016112f0565b92825a940393f190811561111b57506114e25750565b6114fa9060203d6020116111145761110c8183610509565b50565b61151390823d84116111a55761119d8183610509565b38611491565b9037565b8183529091602001916001600160fb1b0381116102a857829160206103779202938491611519565b969593946102ba9561157b6080956115746109dd9661156a8d97600060a08a01990152565b60208d0190610a47565b60408b0152565b88830360608a015261151d565b94919293906115986110ad6111ac565b92633ab2648a92843b156102a8576000966115c5966115d0946115ba60405190565b9a8b998a9860e01b90565b885260048801611545565b815a9103923491f1801561111b576115e55750565b6102ba90600061119d8183610509565b156115fc57565b60405162461bcd60e51b815260206004820152601b60248201527a15985b1d59481b5d5cdd08195c5d585b081c1c9a5e99481c1bdbdb602a1b604482015280606481015b0390fd5b6102956102956102959290565b9998969195610e4a6116ad8c6109dd989761169f6102ba9d986116916116b59860e09e6116846101008801926000890152565b8682036020880152610987565b908482036040860152610987565b916060818403910152610987565b9560808d0152565b88830360c08a015261151d565b6104146102956102959290565b610295906116c2565b96949290979593916116f16116ea8590565b34146115f5565b6116fc6110ad611120565b63427b88ee60009a61170d8c611644565b90833b156102a8578a8a8a8f988f9a8c9161173a9a6117459761172f60405190565b9e8f9d8e9c60e01b90565b8c5260048c01611651565b92825a940393f1801561111b57611822575b506117636110ad6111ac565b90633ab2648a90611773886116cf565b95833b156102a8578895611799956117a59361178e60405190565b998a98899760e01b90565b87528b60048801611545565b815a9103923491f1801561111b57611806575b506117c46110ad6111ac565b630a713d68813b156102a85783916117e391836117f161133360405190565b845260048401526024830190565b92825a940393f1801561111b57611186575050565b61181c90833d85116111a55761119d8183610509565b386117b8565b61183890873d89116111a55761119d8183610509565b38611757565b61184b61058a6026610552565b9060268252565b61185f61058a602b610552565b90602b8252565b61187361058a602d610552565b90602d8252565b61188761058a602f610552565b90602f8252565b61189b61058a602c610552565b90602c8252565b6118aa61183e565b7f43726f7373776f7264426f6172643a2063616c6c6572206973206e6f7420616e6020820152651030b236b4b760d11b604082015290565b6102956118a2565b6102956118e2565b602080825261029592910190610987565b1561190b5750565b6116409061191860405190565b62461bcd60e51b8152918291600483016118f2565b61029560045461028c565b61029560055461028c565b61194e6110ad61105d565b630236bb5a61196661195f60405190565b9160e01b90565b81526020816004938161197b33878301610a50565b91815a930392fa801561111b576119a391600091611b98575b5061199d6118ea565b90611903565b6119ae6110ad6112e5565b90638456cb5991803b156102a8576119d2926119c960405190565b93849160e01b90565b8082529181848101600096878094825a940393f1801561111b57611b7c575b506119fd6110ad6111ac565b803b156102a85783611a0e60405190565b838152918290818387820192825a940393f1801561111b57611b60575b50611a376110ad61192d565b803b156102a85783611a4860405190565b838152918290818387820192825a940393f1801561111b57611b44575b50611a716110ad611938565b803b156102a85783611a8260405190565b838152918290818387820192825a940393f1801561111b57611b28575b50611aab6110ad61105d565b803b156102a85783611abc60405190565b838152918290818387820192825a940393f1801561111b57611b0c575b50611ae56110ad611120565b91823b156102a8576117f192849283611afd60405190565b95869485938452830160000190565b611b2290843d86116111a55761119d8183610509565b38611ad9565b611b3e90843d86116111a55761119d8183610509565b38611a9f565b611b5a90843d86116111a55761119d8183610509565b38611a65565b611b7690843d86116111a55761119d8183610509565b38611a2b565b611b9290843d86116111a55761119d8183610509565b386119f1565b611bb1915060203d6020116111145761110c8183610509565b38611994565b610295905b60ff1690565b610295600254611bb7565b610295611bc2565b611be06110ad6112e5565b636c19e78390803b156102a8576110ce9161116c61115360405190565b611c05613082565b6102ba6102ba611c1560006116cf565b6130dd565b6102ba611bfd565b9261169161169f92610295969461168460808801926000890152565b90611c4b61058a836111c2565b918252565b369037565b906102ba611c6b611c6584611c3e565b936111c2565b601f190160208401611c50565b6102d290611644565b6102ba94611cb882989795611cae608096611ca4611cc597600060a08901980152565b60208c0190610a47565b60408a0190611c78565b8782036060890152610d2f565b940190611c78565b929091611cdb6110ad611120565b9063d25e3fc690823b156102a857611d0593611d1191611cfa60405190565b968796879560e01b90565b85528860048601611c22565b916000948593815a9103923491f1801561111b57611e0f575b50611d366110ad6111ac565b63f39130e5611d44836116cf565b91611d56611d5185611644565b611c55565b90803b156102a857849283611d7f81611d73958161178e60405190565b87528c60048801611c81565b92825a940393f19081611df3575b50611d96575050565b611da16110ad6111ac565b630a713d68813b156102a85782916117e39183611dc06114b460405190565b92825a940393f19182611dd6575b50506102ba57565b81611dec92903d106111a55761119d8183610509565b3880611dce565b611e0990833d85116111a55761119d8183610509565b38611d8d565b611e2590823d84116111a55761119d8183610509565b38611d2a565b90929192611e3b61058a82610552565b93818552818301116102a8576102ba916020850190610964565b9080601f830112156102a857815161029592602001611e2b565b90916060828403126102a857611e8583836111d9565b602083015190936001600160401b0382116102a8576040611eab82610295948701611e55565b94016111d9565b611eda90611ec16110ad6112e5565b90637849dbaa91611ed160405190565b93849360e01b90565b835282600481016000958693815a930392fa91821561111b578390848094611f04575b5050929190565b9150919350611f2592503d8091833e611f1d8183610509565b810190611e6f565b913880949294611efd565b6102ba90611f3c613082565b6102ba90611f48613132565b611f536110ad6111ac565b63e7b09cea813b156102a85760009161115e916115d06110c360405190565b6102ba90611f30565b611f866110ad6112e5565b63842a42e3813b156102a857611fa891611f9f60405190565b92839260e01b90565b8252816004810161116c565b611fbf6110ad61105d565b630236bb5a611fd061195f60405190565b815260208160049381611fe533878301610a50565b91815a930392fa801561111b5761200691600091611b98575061199d6118ea565b6120116110ad6112e5565b90633f4ba83a91803b156102a8576119d2926119c960405190565b61029560005461028c565b61029561202c565b906020828203126102a857610295916111d9565b9061133e602091612062600090565b5061206e6110ad6111ac565b90612081639745808a9161133360405190565b91815a930392fa90811561111b5760009161209a575090565b610295915060203d6020116120bc575b6120b48183610509565b81019061203f565b503d6120aa565b9061133e6020916120d2600090565b506120de6110ad6111ac565b906110d9639cc19f5b9161133360405190565b61211060206121016110ad611938565b636bc122c99061129360405190565b8252604060048301526013604483015272686f6d655f627574746f6e5f76697369626c6560681b60648301526001602483015281608481016110d9565b98969491612196936102959b999561217a8c612188946121a49b9660a0830192600081850391015261139f565b8c810360208e01529161139f565b9189830360408b015261139f565b91868303606088015261139f565b92608081850391015261139f565b9893969197929590946121c66110ad61192d565b9763b043e03297893b156102a8576121e59a61116c9861146360405190565b8c5260048c0161214d565b6121fb6110ad6111ac565b63b0fc944090803b156102a85761115e9161116c61115360405190565b6102ba90612224613082565b6102ba90612230613132565b61223b6110ad6111ac565b631c294efd90803b156102a8576110ce9161116c61115360405190565b6102ba90612218565b9a9997926109dd966122cb8d9760806122c66102ba9e996122b88c6101009f99986122aa6122d59a6122dc9d61229d6101208601926000870152565b8482036020860152610987565b916040818403910152610987565b8c810360608e015290610987565b990152565b60a08d0190610a47565b60c08b0152565b88830360e08a015261151d565b9896949795939290919860805260c0526123046110ad611120565b97883b156102a857848489612341958a958a9561232060405190565b60a0526330df0a5760e21b60a0515260c05191608051600460a05101612261565b9560009687915a8360a0519360a05190039260a05192f1801561111b5761240a575b61236e6110ad6111ac565b9163f39130e591833b156102a857879561239195879361239f936115ba60405190565b885260805160048901611545565b92825a940393f1801561111b576123ee575b506123bd6110ad6111ac565b630a713d6890803b156102a8576123d991839161129360405190565b825260805160048301528183602482016117f1565b61240490823d84116111a55761119d8183610509565b386123b1565b853d8711612434575b8061242361242f9260a051610509565b60a0510160a05161036c565b612363565b503d612413565b61129c600061244b6110ad611120565b63321c7dc49061129360405190565b905051906102ba82610298565b9291909261247761058a856111c2565b938085526020928380870192028301928184116102a857915b83831061249e575050505050565b8480916124ab84866111d9565b815201920191612490565b9080601f830112156102a857815161029592602001612467565b916101a0838303126102a85782516001600160401b0392908381116102a857816124fb918601611e55565b9360208101518481116102a85782612514918301611e55565b9360408201518181116102a8578361252d918401611e55565b9361253b846060850161245a565b9361254981608086016111d9565b936125578260a083016111d9565b9360c08201519081116102a857826125709183016124b6565b9261257e8360e084016111d9565b9261258d8161010085016111d9565b9261259c8261012083016111d9565b926102956125ae846101408501611070565b936125bd816101608601611070565b936101800161245a565b929190926125d761058a856111c2565b938085526020928380870192028301928184116102a857915b8383106125fe575050505050565b84809161260b848661245a565b8152019201916125f0565b9080601f830112156102a8578151610295926020016125c7565b60ff81166102a1565b905051906102ba82612630565b9190610100838203126102a85761265d818461245a565b9261266b82602083016111d9565b604082015190936001600160401b039390918481116102a857816126909185016124b6565b9360608401519081116102a857816126a9918501612616565b926126b782608083016111d9565b926102956126c88460a085016111d9565b9360e06126d88260c08701612639565b9401611070565b611bbc6102956102959290565b91906060838203126102a85761272b90604061270661052f565b94612711838261245a565b865261272083602083016111d9565b6020870152016111d9565b6040830152565b92919261274161058a836111c2565b93828552602090602086019060608095028401938185116102a857915b84831061276d57505050505050565b83869161277a84866126ec565b81520192019161275e565b9080601f830112156102a857815161029592602001612732565b906020828203126102a85781516001600160401b0381116102a8576102959201612785565b6060906127e5906127d66110ad611120565b63ec03a37a91611ed160405190565b808452600484018290529183602481016000968793815a930392fa91821561111b57849085948694612935575b508561281f6110ad6111ac565b9161282960405190565b928391825281612840876004830190815260200190565b91815a930392fa86908792889389938a938b9381612904575b506128ef5750505050505061286d856116cf565b9261287786611644565b9485988695612885896126df565b955b8961115e6128966110ad6112e5565b63a090a3566128a76110c360405190565b91815a930392fa998a1561111b57809a6128ca575b505099989796959493929190565b6128e7929a503d8091833e6128df8183610509565b81019061279f565b9738806128bc565b909197949b9298939a50909a99979695612887565b9450955050505061292791503d8089833e61291f8183610509565b810190612646565b509396909492959195612859565b915093506129569192503d8086833e61294e8183610509565b8101906124d0565b505050505050505050949093929194612812565b6102ba90612976613082565b6000612981816116cf565b61298a8161028c565b6129938461028c565b146129a35750506102ba906130dd565b631e4fbdf760e01b825281906116409060048301610a50565b6102ba9061296a565b634e487b7160e01b600052603260045260246000fd5b906129e4825190565b8110156129f5576020809102010190565b6129c5565b634e487b7160e01b600052601160045260246000fd5b6000198114612a1f5760010190565b6129fa565b612a33906112846110ad611120565b8252600490828281016000968793815a930392fa91821561111b578492612bbc575b50612a61611d51835190565b90612a6b85611644565b94855b612a79610295865190565b811015612b7057612a8b6110ad6111ac565b82612ab363ec03a37a92612aa6612aa2868b6129db565b5190565b93612ac16110c360405190565b835289830190815260200190565b91815a930392fa908184918593612b4c575b50612ae7575050600101612a6e565b612a6e565b612afb612af460026126df565b9160ff1690565b14908115612b44575b50612b12575b600101612a6e565b95612b3c612ae291612b37612b2a612aa28b8a6129db565b612b3483896129db565b52565b612a10565b969050612b0a565b905038612b04565b909250612b6391503d8086833e61291f8183610509565b9795509550505050612ad3565b509391925050612b88612b8285611c55565b93611644565b845b811015612bb557612bae81612ba8612b2a612aa2612b8a95886129db565b60010190565b9050612b88565b5092505090565b612bd19192503d8086833e6112d18183610509565b9038612a55565b906102ba9594939291612be9613082565b612ec3565b612bf6611852565b7f43726f7373776f7264426f6172643a20636f726520616464726573732063616e60208201526a6e6f74206265207a65726f60a81b604082015290565b610295612bee565b610295612c33565b612c4b611866565b7f43726f7373776f7264426f6172643a207072697a65732061646472657373206360208201526c616e6e6f74206265207a65726f60981b604082015290565b610295612c43565b610295612c8a565b612ca261187a565b7f43726f7373776f7264426f6172643a2070726f66696c6573206164647265737360208201526e2063616e6e6f74206265207a65726f60881b604082015290565b610295612c9a565b610295612ce3565b612cfb611866565b7f43726f7373776f7264426f6172643a20636f6e6669672061646472657373206360208201526c616e6e6f74206265207a65726f60981b604082015290565b610295612cf3565b610295612d3a565b612d5261188e565b7f43726f7373776f7264426f6172643a2061646d696e206164647265737320636160208201526b6e6e6f74206265207a65726f60a01b604082015290565b610295612d4a565b610295612d90565b90610100600160a81b039060081b5b9181191691161790565b612dc8610295612dd092610448565b600254612da0565b600255565b906001600160a01b0390612daf565b612df3610295612dfb92610448565b600354612dd5565b600355565b612e0f610295612e1792610448565b600454612dd5565b600455565b612e2b610295612e3392610448565b600554612dd5565b600555565b612e47610295612e4f92610448565b600654612dd5565b600655565b612e63610295612e6b92610448565b600754612dd5565b600755565b9194612eb961101b92989795612eaf60a096612ea56102ba9a612e9b60c08a019e60008b0190610a47565b6020890190610a47565b6040870190610a47565b6060850190610a47565b6080830190610a47565b9293612fcc92959194612edd612ed7612c3b565b86613152565b612eee612ee8612c92565b87613152565b612eff612ef9612ceb565b88613152565b612f10612f0a612d42565b82613152565b612f21612f1b612d98565b83613152565b612f32612f2c612d98565b84613152565b612f43612f3e86610448565b612db9565b612f54612f4f87610448565b612de4565b612f65612f6088610448565b612e00565b612f76612f7182610448565b612e1c565b612f87612f8283610448565b612e38565b612f98612f9384610448565b612e54565b7f49e1de879727329b7d4d720127457a2857bcb190b237b00840edb50feb9361e096612fc360405190565b96879687612e70565b0390a1565b906102ba9594939291612bd8565b9061115e90612fef6110ad611120565b63ec03a37a61300b61300060405190565b958695869360e01b90565b6000958693815a930392fa91821561111b57839084809481948294839484809481948294839484809461304a575b50509c9b9a99989796959493929190565b9b509b50509b50505050505050505061306d92503d8091833e61294e8183610509565b91939597999b38809e929496989a9c9e613039565b61308a612037565b339061309e6130988361028c565b9161028c565b036130a65750565b63118cdaa760e01b6000908152908190611640906004610a50565b6130d06102956130d892610448565b600054612dd5565b600055565b6130e561202c565b906130ef816130c1565b61312261311c7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610448565b91610448565b9161312c60405190565b600090a3565b61313a611bcd565b61314057565b63d93c066560e01b6000908152600490fd5b906102ba9161316c61309861316760006116cf565b61028c565b141561190356fea2646970667358221220fd154c64e78673eaafb57cf38dbfc977a11789040b454dd4a275e539bea7842a64736f6c634300081c0033

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

0000000000000000000000007b79e1cb9a344cf8856b4db1131bf65fb6a6fba2000000000000000000000000754b33d8aded1c6bf4821ea68158c42b434d781f0000000000000000000000004019cd85790a2706b0fc3bd9845c2c16742af0e5000000000000000000000000321dcef35e3da483304226ac679b8898c4ee08070000000000000000000000008944ffc503388174aff351cb1c6f87958d6e5bb3000000000000000000000000dc2b0c154f48c7e235872208a6f3093647a236a7

-----Decoded View---------------
Arg [0] : _crosswordCore (address): 0x7B79e1Cb9a344cf8856B4Db1131bF65fB6A6fBA2
Arg [1] : _crosswordPrizes (address): 0x754b33D8AdEd1c6bF4821Ea68158C42B434d781f
Arg [2] : _userProfiles (address): 0x4019Cd85790A2706b0fc3BD9845C2c16742Af0e5
Arg [3] : _configManager (address): 0x321dcEF35e3DA483304226AC679B8898C4eE0807
Arg [4] : _adminManager (address): 0x8944ffC503388174AfF351cb1C6F87958D6E5Bb3
Arg [5] : _publicCrosswordManager (address): 0xDC2b0C154f48c7e235872208A6F3093647A236A7

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000007b79e1cb9a344cf8856b4db1131bf65fb6a6fba2
Arg [1] : 000000000000000000000000754b33d8aded1c6bf4821ea68158c42b434d781f
Arg [2] : 0000000000000000000000004019cd85790a2706b0fc3bd9845c2c16742af0e5
Arg [3] : 000000000000000000000000321dcef35e3da483304226ac679b8898c4ee0807
Arg [4] : 0000000000000000000000008944ffc503388174aff351cb1c6f87958d6e5bb3
Arg [5] : 000000000000000000000000dc2b0c154f48c7e235872208a6f3093647a236a7


Block Transaction Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
0x7B841C609d95CbafE0771d4A05d2C0415922737B
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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.