Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
NftController
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.17; import "./INftController.sol"; import "contracts/lib/Ownable.sol"; import "contracts/lib/HasFactories.sol"; import "contracts/nft/IMintableNft.sol"; contract NftController is INftController, HasFactories, Ownable { uint256 immutable _maxMintCount; uint256 _mintedCount; bool _isGameOver; WinData _winData; bool _gameStarted; uint256 _startGameTime; constructor(uint256 maxCount_) { _maxMintCount = maxCount_; } function maxMintCount() external view returns (uint256) { return _maxMintCount; } function mintedCount() external view returns (uint256) { return _mintedCount; } function lappsedMintCount() external view returns (uint256) { return _maxMintCount - _mintedCount; } function addMintedCount(uint256 mintedCount_) external onlyFactory { _mintedCount += mintedCount_; require(_mintedCount <= _maxMintCount, "max mint count limit"); } function canFactoriesChange( address account ) internal view virtual override returns (bool) { return account == _owner; } function isGameOver() external view returns (bool) { return _isGameOver; } function checkCanMint() external view { require(!this.isGameOver(), "The game is over. Minting is closed"); require(_mintedCount < _maxMintCount, "No tokens left to mint"); } function setGameOver(WinData calldata data) external { _winData = data; _isGameOver = true; emit OnGameOver(data.winnerAddress, data.nftAddress, data.tokenId); } function winData() external view returns (WinData memory) { return _winData; } function startGame() external onlyOwner { _gameStarted = true; _startGameTime = block.timestamp; } function gameStarted() external view returns (bool) { return _gameStarted; } function startGameTime() external view returns (uint256) { return _startGameTime; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.17; struct WinData { address winnerAddress; address nftAddress; uint256 tokenId; } interface INftController { event OnGameOver( address indexed account, address nftAddress, uint256 tokenId ); function maxMintCount() external view returns (uint256); function mintedCount() external view returns (uint256); function addMintedCount(uint256 countToAdd) external; function lappsedMintCount() external view returns (uint256); function isGameOver() external view returns (bool); function checkCanMint() external view; function setGameOver(WinData calldata data) external; function winData() external view returns (WinData memory); function startGame() external; function gameStarted() external view returns (bool); function startGameTime() external view returns (uint256); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.17; abstract contract HasFactories { mapping(address => bool) _factories; modifier onlyFactory() { require(_factories[msg.sender], "only for factories"); _; } function setFactories( address[] calldata addresses, bool isFactoryValue ) external { require( canFactoriesChange(msg.sender), "account can not set factories" ); for (uint256 i = 0; i < addresses.length; ++i) { _factories[addresses[i]] = isFactoryValue; } } function isFactory(address addr) external view returns (bool) { return _factories[addr]; } function canFactoriesChange( address account ) internal view virtual returns (bool); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.17; interface IOwnable { function owner() external view returns (address); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); function transferOwnership(address newOwner) external; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.17; import "./IOwnable.sol"; contract Ownable is IOwnable { address _owner; constructor() { _owner = msg.sender; } modifier onlyOwner() { require(_owner == msg.sender, "caller is not the owner"); _; } function owner() external view virtual returns (address) { return _owner; } function transferOwnership(address newOwner) external override onlyOwner { address lastOwner = _owner; _owner = newOwner; emit OwnershipTransferred(lastOwner, newOwner); } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.17; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; interface IMintableNft is IERC721 { function mint(address to, uint256 price) external payable; function burn(uint256 tokenId) external; }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"maxCount_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"nftAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"OnGameOver","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"},{"inputs":[{"internalType":"uint256","name":"mintedCount_","type":"uint256"}],"name":"addMintedCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkCanMint","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gameStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isFactory","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isGameOver","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lappsedMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"isFactoryValue","type":"bool"}],"name":"setFactories","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"winnerAddress","type":"address"},{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"internalType":"struct WinData","name":"data","type":"tuple"}],"name":"setGameOver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startGame","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startGameTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"winData","outputs":[{"components":[{"internalType":"address","name":"winnerAddress","type":"address"},{"internalType":"address","name":"nftAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"internalType":"struct WinData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a060405234801561001057600080fd5b506040516109c43803806109c483398101604081905261002f91610049565b600180546001600160a01b03191633179055608052610062565b60006020828403121561005b57600080fd5b5051919050565b6080516109326100926000396000818161016101528181610404015281816104de01526105d501526109326000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80638c988f5611610097578063cf721b1511610066578063cf721b1514610249578063d65ab5f214610251578063f2fde38b14610259578063fc0d5a7b1461026c57600080fd5b80638c988f56146102005780638da5cb5b14610213578063a9ef531c1461022e578063b91b92c71461024157600080fd5b80632675d9c8116100d35780632675d9c81461015757806332c60eef1461015f5780635e123ce41461018f5780637365fd221461019a57600080fd5b806308a8ce1f146100fa5780630e04a7d81461010f5780630f04ba671461012b575b600080fd5b61010d61010836600461071e565b610274565b005b60035460ff165b60405190151581526020015b60405180910390f35b6101166101393660046107b9565b6001600160a01b031660009081526020819052604090205460ff1690565b61010d610347565b7f00000000000000000000000000000000000000000000000000000000000000005b604051908152602001610122565b60075460ff16610116565b60408051606080820183526000808352602080840182905292840152825180820184526004546001600160a01b03908116808352600554821683860190815260065493870193845286519182525190911693810193909352519282019290925201610122565b61010d61020e3660046107dd565b61046e565b6001546040516001600160a01b039091168152602001610122565b61010d61023c3660046107f6565b610545565b6101816105ce565b600254610181565b61010d610603565b61010d6102673660046107b9565b61066a565b600854610181565b6001546001600160a01b031633146102d35760405162461bcd60e51b815260206004820152601d60248201527f6163636f756e742063616e206e6f742073657420666163746f7269657300000060448201526064015b60405180910390fd5b60005b8281101561034157816000808686858181106102f4576102f461080e565b905060200201602081019061030991906107b9565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905561033a8161083a565b90506102d6565b50505050565b306001600160a01b0316630e04a7d86040518163ffffffff1660e01b8152600401602060405180830381865afa158015610385573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a99190610853565b156104025760405162461bcd60e51b815260206004820152602360248201527f5468652067616d65206973206f7665722e204d696e74696e6720697320636c6f6044820152621cd95960ea1b60648201526084016102ca565b7f00000000000000000000000000000000000000000000000000000000000000006002541061046c5760405162461bcd60e51b8152602060048201526016602482015275139bc81d1bdad95b9cc81b19599d081d1bc81b5a5b9d60521b60448201526064016102ca565b565b3360009081526020819052604090205460ff166104c25760405162461bcd60e51b81526020600482015260126024820152716f6e6c7920666f7220666163746f7269657360701b60448201526064016102ca565b80600260008282546104d49190610870565b90915550506002547f000000000000000000000000000000000000000000000000000000000000000010156105425760405162461bcd60e51b81526020600482015260146024820152731b585e081b5a5b9d0818dbdd5b9d081b1a5b5a5d60621b60448201526064016102ca565b50565b80600461055282826108a9565b50506003805460ff1916600117905561056e60208201826107b9565b6001600160a01b03167fde1209c8e4cbb90d77b42f71667b8f61621870d63645287977d7c169865d71456105a860408401602085016107b9565b604080516001600160a01b0390921682528085013560208301520160405180910390a250565b60006002547f00000000000000000000000000000000000000000000000000000000000000006105fe91906108e9565b905090565b6001546001600160a01b031633146106575760405162461bcd60e51b815260206004820152601760248201527631b0b63632b91034b9903737ba103a34329037bbb732b960491b60448201526064016102ca565b6007805460ff1916600117905542600855565b6001546001600160a01b031633146106be5760405162461bcd60e51b815260206004820152601760248201527631b0b63632b91034b9903737ba103a34329037bbb732b960491b60448201526064016102ca565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b801515811461054257600080fd5b60008060006040848603121561073357600080fd5b833567ffffffffffffffff8082111561074b57600080fd5b818601915086601f83011261075f57600080fd5b81358181111561076e57600080fd5b8760208260051b850101111561078357600080fd5b6020928301955093505084013561079981610710565b809150509250925092565b6001600160a01b038116811461054257600080fd5b6000602082840312156107cb57600080fd5b81356107d6816107a4565b9392505050565b6000602082840312156107ef57600080fd5b5035919050565b60006060828403121561080857600080fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161084c5761084c610824565b5060010190565b60006020828403121561086557600080fd5b81516107d681610710565b8082018082111561088357610883610824565b92915050565b80546001600160a01b0319166001600160a01b0392909216919091179055565b81356108b4816107a4565b6108be8183610889565b5060208201356108cd816107a4565b6108da8160018401610889565b50604082013560028201555050565b818103818111156108835761088361082456fea2646970667358221220798229ea172b8cd24f554a8bd16b5ba7fd1eaad347b846b16015936727facdb164736f6c634300081100330000000000000000000000000000000000000000000000000000000000000bb8
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100f55760003560e01c80638c988f5611610097578063cf721b1511610066578063cf721b1514610249578063d65ab5f214610251578063f2fde38b14610259578063fc0d5a7b1461026c57600080fd5b80638c988f56146102005780638da5cb5b14610213578063a9ef531c1461022e578063b91b92c71461024157600080fd5b80632675d9c8116100d35780632675d9c81461015757806332c60eef1461015f5780635e123ce41461018f5780637365fd221461019a57600080fd5b806308a8ce1f146100fa5780630e04a7d81461010f5780630f04ba671461012b575b600080fd5b61010d61010836600461071e565b610274565b005b60035460ff165b60405190151581526020015b60405180910390f35b6101166101393660046107b9565b6001600160a01b031660009081526020819052604090205460ff1690565b61010d610347565b7f0000000000000000000000000000000000000000000000000000000000000bb85b604051908152602001610122565b60075460ff16610116565b60408051606080820183526000808352602080840182905292840152825180820184526004546001600160a01b03908116808352600554821683860190815260065493870193845286519182525190911693810193909352519282019290925201610122565b61010d61020e3660046107dd565b61046e565b6001546040516001600160a01b039091168152602001610122565b61010d61023c3660046107f6565b610545565b6101816105ce565b600254610181565b61010d610603565b61010d6102673660046107b9565b61066a565b600854610181565b6001546001600160a01b031633146102d35760405162461bcd60e51b815260206004820152601d60248201527f6163636f756e742063616e206e6f742073657420666163746f7269657300000060448201526064015b60405180910390fd5b60005b8281101561034157816000808686858181106102f4576102f461080e565b905060200201602081019061030991906107b9565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905561033a8161083a565b90506102d6565b50505050565b306001600160a01b0316630e04a7d86040518163ffffffff1660e01b8152600401602060405180830381865afa158015610385573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a99190610853565b156104025760405162461bcd60e51b815260206004820152602360248201527f5468652067616d65206973206f7665722e204d696e74696e6720697320636c6f6044820152621cd95960ea1b60648201526084016102ca565b7f0000000000000000000000000000000000000000000000000000000000000bb86002541061046c5760405162461bcd60e51b8152602060048201526016602482015275139bc81d1bdad95b9cc81b19599d081d1bc81b5a5b9d60521b60448201526064016102ca565b565b3360009081526020819052604090205460ff166104c25760405162461bcd60e51b81526020600482015260126024820152716f6e6c7920666f7220666163746f7269657360701b60448201526064016102ca565b80600260008282546104d49190610870565b90915550506002547f0000000000000000000000000000000000000000000000000000000000000bb810156105425760405162461bcd60e51b81526020600482015260146024820152731b585e081b5a5b9d0818dbdd5b9d081b1a5b5a5d60621b60448201526064016102ca565b50565b80600461055282826108a9565b50506003805460ff1916600117905561056e60208201826107b9565b6001600160a01b03167fde1209c8e4cbb90d77b42f71667b8f61621870d63645287977d7c169865d71456105a860408401602085016107b9565b604080516001600160a01b0390921682528085013560208301520160405180910390a250565b60006002547f0000000000000000000000000000000000000000000000000000000000000bb86105fe91906108e9565b905090565b6001546001600160a01b031633146106575760405162461bcd60e51b815260206004820152601760248201527631b0b63632b91034b9903737ba103a34329037bbb732b960491b60448201526064016102ca565b6007805460ff1916600117905542600855565b6001546001600160a01b031633146106be5760405162461bcd60e51b815260206004820152601760248201527631b0b63632b91034b9903737ba103a34329037bbb732b960491b60448201526064016102ca565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b801515811461054257600080fd5b60008060006040848603121561073357600080fd5b833567ffffffffffffffff8082111561074b57600080fd5b818601915086601f83011261075f57600080fd5b81358181111561076e57600080fd5b8760208260051b850101111561078357600080fd5b6020928301955093505084013561079981610710565b809150509250925092565b6001600160a01b038116811461054257600080fd5b6000602082840312156107cb57600080fd5b81356107d6816107a4565b9392505050565b6000602082840312156107ef57600080fd5b5035919050565b60006060828403121561080857600080fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161084c5761084c610824565b5060010190565b60006020828403121561086557600080fd5b81516107d681610710565b8082018082111561088357610883610824565b92915050565b80546001600160a01b0319166001600160a01b0392909216919091179055565b81356108b4816107a4565b6108be8183610889565b5060208201356108cd816107a4565b6108da8160018401610889565b50604082013560028201555050565b818103818111156108835761088361082456fea2646970667358221220798229ea172b8cd24f554a8bd16b5ba7fd1eaad347b846b16015936727facdb164736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000bb8
-----Decoded View---------------
Arg [0] : maxCount_ (uint256): 3000
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000bb8
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.