diff --git a/contracts/addresses.json b/contracts/addresses.json index e202b535..09041964 100644 --- a/contracts/addresses.json +++ b/contracts/addresses.json @@ -63,11 +63,8 @@ "chainName": "chaos-testnet" }, "974399131": { - "OpenNFTsFactoryV3": "0x4bE9f887dEc53e9670574b058a821455416C2415", - "OpenNFTsResolver": "0xfc575CF9e97A2F5De94E313961627316BB911b81", - "OpenNFTsResolverold": "0x3D63c30D4d99ca4FE669EEED21876D16C7aA0F21", - "OpenNFTsV4Skale": "0xD6df6445cC83533f7199348BE7F6D4857cD500Ab", - "OpenNFTsV4Skaleold": "0x9297AEB48733Ab66226D4Cff9C0135d9f895E0A4", + "OpenNFTsResolver": "0xb5c8CB0846317d82af2DbF90713716B01A2f680a", + "OpenNFTsV4Skale": "0x25F56b5527F5634752Fd2C85564E8d2484cAAEF3", "chainName": "calypso-testnet" }, "137": { @@ -290,6 +287,7 @@ "OpenNFTsFactoryV3": "0xb5c8CB0846317d82af2DbF90713716B01A2f680a", "OpenNFTsResolver": "0x25F56b5527F5634752Fd2C85564E8d2484cAAEF3", "OpenNFTsV4": "0xd1ca741de2d2975822ADf4646Cf0A8AE3Df51c78", + "OpenNFTsV4Skale_last": "0xaBC576652433154Ab5F9cF1A2F4f0457d7690cc6", "chainName": "amoy" }, "81457": { diff --git a/contracts/flatten/OpenNFTsV4Skale.sol b/contracts/flatten/OpenNFTsV4Skale.sol index 2daa701a..d4f7bfe2 100644 --- a/contracts/flatten/OpenNFTsV4Skale.sol +++ b/contracts/flatten/OpenNFTsV4Skale.sol @@ -1,71 +1,24 @@ // SPDX-License-Identifier: MIT -// -// Derived from Kredeum NFTs -// https://github.com/Kredeum/kredeum -// -// ___ ___ ___ ___ ___ ___ ___ -// / /\ / /\ / /\ /__/\ /__/\ / /\ ___ / /\ -// / /::\ / /::\ / /:/_ \ \:\ \ \:\ / /:/_ / /\ / /:/_ -// / /:/\:\ / /:/\:\ / /:/ /\ \ \:\ \ \:\ / /:/ /\ / /:/ / /:/ /\ -// / /:/ \:\ / /:/~/:/ / /:/ /:/_ _____\__\:\ _____\__\:\ / /:/ /:/ / /:/ / /:/ /::\ -// /__/:/ \__\:\ /__/:/ /:/ /__/:/ /:/ /\ /__/::::::::\ /__/::::::::\ /__/:/ /:/ / /::\ /__/:/ /:/\:\ -// \ \:\ / /:/ \ \:\/:/ \ \:\/:/ /:/ \ \:\~~\~~\/ \ \:\~~\~~\/ \ \:\/:/ /__/:/\:\ \ \:\/:/~/:/ -// \ \:\ /:/ \ \::/ \ \::/ /:/ \ \:\ ~~~ \ \:\ ~~~ \ \::/ \__\/ \:\ \ \::/ /:/ -// \ \:\/:/ \ \:\ \ \:\/:/ \ \:\ \ \:\ \ \:\ \ \:\ \__\/ /:/ -// \ \::/ \ \:\ \ \::/ \ \:\ \ \:\ \ \:\ \__\/ /__/:/ -// \__\/ \__\/ \__\/ \__\/ \__\/ \__\/ \__\/ -// -// -// OpenERC165 -// (supports) -// | -// ——————————————————————————————————————————————————— -// | | | -// OpenERC721 OpenERC173 OpenCloneable -// (NFT) (ownable) | -// | | | -// —————————————————————————— | | -// | | | | -// OpenERC721Metadata OpenERC721Enumerable | | -// | | | | -// ——————————————————————————————————————————————————— -// | -// OpenNFTsV4Skale —— IOpenNFTsV4Skale -// -pragma solidity ^0.8.9; - -// -// EIP-721: Non-Fungible Token Standard -// https://eips.ethereum.org/EIPS/eip-721 -// -// Derived from OpenZeppelin Contracts (token/ERC721/ERC721.sol) -// https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC721/ERC721.sol -// -// OpenERC165 -// | -// OpenERC721 —— IERC721 -// +pragma solidity ^0.8.19 ^0.8.9; -// -// EIP-165: Standard Interface Detection -// https://eips.ethereum.org/EIPS/eip-165 -// -// Derived from OpenZeppelin Contracts (utils/introspection/ERC165.sol) -// https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/utils/introspection/ERC165.sol -// -// OpenERC165 —— IERC165 -// +// lib/OpenNFTs/contracts/interfaces/IERC165.sol interface IERC165 { function supportsInterface(bytes4 interfaceId) external view returns (bool); } -abstract contract OpenERC165 is IERC165 { - function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { - return interfaceId == 0x01ffc9a7; // type(IERC165).interfaceId - } +// lib/OpenNFTs/contracts/interfaces/IERC173.sol + +interface IERC173 { + event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); + + function transferOwnership(address newOwner) external; + + function owner() external view returns (address currentOwner); } +// lib/OpenNFTs/contracts/interfaces/IERC721.sol + interface IERC721 { event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); @@ -92,12 +45,204 @@ interface IERC721 { function isApprovedForAll(address owner, address operator) external view returns (bool); } +// lib/OpenNFTs/contracts/interfaces/IERC721Enumerable.sol + +interface IERC721Enumerable { + function totalSupply() external view returns (uint256); + + function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); + + function tokenByIndex(uint256 index) external view returns (uint256); +} + +// lib/OpenNFTs/contracts/interfaces/IERC721Metadata.sol + +interface IERC721Metadata { + function name() external view returns (string memory); + + function symbol() external view returns (string memory); + + function tokenURI(uint256 tokenId) external view returns (string memory); +} + +// lib/OpenNFTs/contracts/interfaces/IERC721TokenReceiver.sol + interface IERC721TokenReceiver { function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } +// lib/OpenNFTs/contracts/interfaces/IOpenCloneable.sol + +interface IOpenCloneable { + function initialize(string memory name, string memory symbol, address owner, bytes memory params) + external; + + function initialized() external view returns (bool); + + function template() external view returns (string memory); + + function version() external view returns (uint256); + + function parent() external view returns (address); +} + +// src/interfaces/IOpenNFTsV4.sol + +interface IOpenNFTsV4 { + function mint(string memory tokenURI) external returns (uint256 tokenID); + + function mint(address minter, string memory tokenURI) external returns (uint256 tokenID); + + function burn(uint256 tokenID) external; + + function open() external view returns (bool); +} + +// src/interfaces/IOpenNFTsV4Skale.sol + +interface IOpenNFTsV4Skale { + function setTokenUriMaxLength(uint256 tokenUriMaxLength_) external; + + function setCooldownPeriod(uint256 cooldownPeriod_) external; +} + +// lib/OpenNFTs/contracts/OpenERC/OpenERC165.sol + +// +// EIP-165: Standard Interface Detection +// https://eips.ethereum.org/EIPS/eip-165 +// +// Derived from OpenZeppelin Contracts (utils/introspection/ERC165.sol) +// https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/utils/introspection/ERC165.sol +// +// OpenERC165 —— IERC165 +// + +abstract contract OpenERC165 is IERC165 { + function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { + return interfaceId == 0x01ffc9a7; // type(IERC165).interfaceId + } +} + +// lib/OpenNFTs/contracts/OpenCloner/OpenCloneable.sol + +// +// Derived from Kredeum NFTs +// https://github.com/Kredeum/kredeum +// +// OpenERC165 +// | +// OpenCloneable —— IOpenCloneable +// + +abstract contract OpenCloneable is IOpenCloneable, OpenERC165 { + bool public initialized; + string public template; + uint256 public version; + + function parent() external view override(IOpenCloneable) returns (address parent_) { + // eip1167 deployed code = 45 bytes = 10 bytes + 20 bytes address + 15 bytes + // extract bytes 10 to 30: shift 2 bytes (16 bits) then truncate to address 20 bytes (uint160) + return (address(this).code.length == 45) + ? address(uint160(uint256(bytes32(address(this).code)) >> 16)) + : address(0); + } + + function initialize(string memory name, string memory symbol, address owner, bytes memory params) + public + virtual + override(IOpenCloneable); + + function supportsInterface(bytes4 interfaceId) + public + view + virtual + override(OpenERC165) + returns (bool) + { + return interfaceId == type(IOpenCloneable).interfaceId || super.supportsInterface(interfaceId); + } + + function _initialize(string memory template_, uint256 version_) internal { + require(initialized == false, "Already initialized"); + initialized = true; + + template = template_; + version = version_; + } +} + +// lib/OpenNFTs/contracts/OpenERC/OpenERC173.sol + +// +// EIP-173: Contract Ownership Standard +// https://eips.ethereum.org/EIPS/eip-173 +// +// Derived from OpenZeppelin Contracts (access/Ownable.sol) +// https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/access/Ownable.sol +// +// OpenERC165 +// | +// OpenERC173 —— IERC173 +// + +abstract contract OpenERC173 is IERC173, OpenERC165 { + bool private _openERC173Initialized; + address private _owner; + + modifier onlyOwner() { + require(_owner == msg.sender, "Not owner"); + _; + } + + function transferOwnership(address newOwner) external override(IERC173) onlyOwner { + _transferOwnership(newOwner); + } + + function owner() public view override(IERC173) returns (address) { + return _owner; + } + + function supportsInterface(bytes4 interfaceId) + public + view + virtual + override(OpenERC165) + returns (bool) + { + return interfaceId == 0x7f5828d0 || super.supportsInterface(interfaceId); + } + + function _initialize(address owner_) internal { + require(_openERC173Initialized == false, "Already initialized"); + _openERC173Initialized = true; + + _transferOwnership(owner_); + } + + function _transferOwnership(address newOwner) internal { + address oldOwner = _owner; + _owner = newOwner; + emit OwnershipTransferred(oldOwner, newOwner); + } +} + +// lib/OpenNFTs/contracts/OpenERC/OpenERC721.sol + +// +// EIP-721: Non-Fungible Token Standard +// https://eips.ethereum.org/EIPS/eip-721 +// +// Derived from OpenZeppelin Contracts (token/ERC721/ERC721.sol) +// https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC721/ERC721.sol +// +// OpenERC165 +// | +// OpenERC721 —— IERC721 +// + abstract contract OpenERC721 is IERC721, OpenERC165 { // Mapping from token ID to owner address mapping(uint256 => address) private _owners; @@ -218,153 +363,73 @@ abstract contract OpenERC721 is IERC721, OpenERC165 { require(owner != address(0), "Invalid token ID"); assert(_balances[owner] > 0); - - _balances[owner] -= 1; - delete _tokenApprovals[tokenID]; - delete _owners[tokenID]; - - emit Transfer(owner, address(0), tokenID); - } - - function _transferFromBefore(address from, address to, uint256 tokenID) internal virtual {} - - function _isOwnerOrOperator(address spender, uint256 tokenID) - internal - view - virtual - returns (bool ownerOrOperator) - { - address tokenOwner = ownerOf(tokenID); - ownerOrOperator = (tokenOwner == spender || isApprovedForAll(tokenOwner, spender)); - } - - function _safeTransferFrom(address from, address to, uint256 tokenID, bytes memory data) private { - require(_isERC721Receiver(from, to, tokenID, data), "Not ERC721Receiver"); - - _transferFrom(from, to, tokenID); - } - - function _transferFrom(address from, address to, uint256 tokenID) - private - onlyTokenOwnerOrApproved(tokenID) - { - require(from != address(0), "Transfer from zero address"); - require(to != address(0), "Transfer to zero address"); - require(from == ownerOf(tokenID), "From not owner"); - - _transferFromBefore(from, to, tokenID); - - delete _tokenApprovals[tokenID]; - - if (from != to) { - _balances[from] -= 1; - _balances[to] += 1; - _owners[tokenID] = to; - } - - emit Transfer(from, to, tokenID); - } - - function _isERC721Receiver(address from, address to, uint256 tokenID, bytes memory data) - private - returns (bool) - { - return to.code.length == 0 - || IERC721TokenReceiver(to).onERC721Received(msg.sender, from, tokenID, data) - == IERC721TokenReceiver.onERC721Received.selector; - } - - function _isOwnerOrApproved(address spender, uint256 tokenID) - private - view - returns (bool ownerOrApproved) - { - ownerOrApproved = (_isOwnerOrOperator(spender, tokenID) || (getApproved(tokenID) == spender)); - } -} - -// -// EIP-721: Non-Fungible Token Standard -// https://eips.ethereum.org/EIPS/eip-721 -// -// Derived from OpenZeppelin Contracts (token/ERC721/ERC721.sol) -// https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC721/ERC721.sol -// -// OpenERC165 -// | -// OpenERC721 -// | -// OpenERC721Metadata —— IERC721Metadata -// - -interface IERC721Metadata { - function name() external view returns (string memory); - - function symbol() external view returns (string memory); - - function tokenURI(uint256 tokenId) external view returns (string memory); -} - -abstract contract OpenERC721Metadata is IERC721Metadata, OpenERC721 { - bool private _openERC721MetadataInitialized; - string private _name; - string private _symbol; - mapping(uint256 => string) private _tokenURIs; - - function name() external view virtual override(IERC721Metadata) returns (string memory) { - return _name; - } - - function symbol() external view virtual override(IERC721Metadata) returns (string memory) { - return _symbol; - } - - function tokenURI(uint256 tokenID) - external - view - virtual - override(IERC721Metadata) - existsToken(tokenID) - returns (string memory) - { - return _tokenURIs[tokenID]; + + _balances[owner] -= 1; + delete _tokenApprovals[tokenID]; + delete _owners[tokenID]; + + emit Transfer(owner, address(0), tokenID); } - function supportsInterface(bytes4 interfaceId) - public + function _transferFromBefore(address from, address to, uint256 tokenID) internal virtual {} + + function _isOwnerOrOperator(address spender, uint256 tokenID) + internal view virtual - override(OpenERC721) - returns (bool) + returns (bool ownerOrOperator) { - return interfaceId == 0x5b5e139f || super.supportsInterface(interfaceId); + address tokenOwner = ownerOf(tokenID); + ownerOrOperator = (tokenOwner == spender || isApprovedForAll(tokenOwner, spender)); } - function _initialize(string memory name_, string memory symbol_) internal { - require(_openERC721MetadataInitialized == false, "Already initialized"); - _openERC721MetadataInitialized = true; + function _safeTransferFrom(address from, address to, uint256 tokenID, bytes memory data) private { + require(_isERC721Receiver(from, to, tokenID, data), "Not ERC721Receiver"); - _name = name_; - _symbol = symbol_; + _transferFrom(from, to, tokenID); } - function _mint(address to, string memory newTokenURI, uint256 tokenID) - internal - virtual - override(OpenERC721) + function _transferFrom(address from, address to, uint256 tokenID) + private + onlyTokenOwnerOrApproved(tokenID) { - _tokenURIs[tokenID] = newTokenURI; + require(from != address(0), "Transfer from zero address"); + require(to != address(0), "Transfer to zero address"); + require(from == ownerOf(tokenID), "From not owner"); - super._mint(to, newTokenURI, tokenID); + _transferFromBefore(from, to, tokenID); + + delete _tokenApprovals[tokenID]; + + if (from != to) { + _balances[from] -= 1; + _balances[to] += 1; + _owners[tokenID] = to; + } + + emit Transfer(from, to, tokenID); } - function _burn(uint256 tokenID) internal virtual override(OpenERC721) { - delete _tokenURIs[tokenID]; + function _isERC721Receiver(address from, address to, uint256 tokenID, bytes memory data) + private + returns (bool) + { + return to.code.length == 0 + || IERC721TokenReceiver(to).onERC721Received(msg.sender, from, tokenID, data) + == IERC721TokenReceiver.onERC721Received.selector; + } - super._burn(tokenID); + function _isOwnerOrApproved(address spender, uint256 tokenID) + private + view + returns (bool ownerOrApproved) + { + ownerOrApproved = (_isOwnerOrOperator(spender, tokenID) || (getApproved(tokenID) == spender)); } } +// lib/OpenNFTs/contracts/OpenERC/OpenERC721Enumerable.sol + // // EIP-721: Non-Fungible Token Standard // https://eips.ethereum.org/EIPS/eip-721 @@ -380,14 +445,6 @@ abstract contract OpenERC721Metadata is IERC721Metadata, OpenERC721 { // OpenERC721Enumerable —— IERC721Enumerable // -interface IERC721Enumerable { - function totalSupply() external view returns (uint256); - - function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); - - function tokenByIndex(uint256 index) external view returns (uint256); -} - abstract contract OpenERC721Enumerable is IERC721Enumerable, OpenERC721 { // Array of all tokens ID uint256[] private _allTokens; @@ -493,141 +550,117 @@ abstract contract OpenERC721Enumerable is IERC721Enumerable, OpenERC721 { } } +// lib/OpenNFTs/contracts/OpenERC/OpenERC721Metadata.sol + // -// EIP-173: Contract Ownership Standard -// https://eips.ethereum.org/EIPS/eip-173 +// EIP-721: Non-Fungible Token Standard +// https://eips.ethereum.org/EIPS/eip-721 // -// Derived from OpenZeppelin Contracts (access/Ownable.sol) -// https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/access/Ownable.sol +// Derived from OpenZeppelin Contracts (token/ERC721/ERC721.sol) +// https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC721/ERC721.sol // -// OpenERC165 -// | -// OpenERC173 —— IERC173 +// OpenERC165 +// | +// OpenERC721 +// | +// OpenERC721Metadata —— IERC721Metadata // -interface IERC173 { - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); - - function transferOwnership(address newOwner) external; - - function owner() external view returns (address currentOwner); -} - -abstract contract OpenERC173 is IERC173, OpenERC165 { - bool private _openERC173Initialized; - address private _owner; - - modifier onlyOwner() { - require(_owner == msg.sender, "Not owner"); - _; - } +abstract contract OpenERC721Metadata is IERC721Metadata, OpenERC721 { + bool private _openERC721MetadataInitialized; + string private _name; + string private _symbol; + mapping(uint256 => string) private _tokenURIs; - function transferOwnership(address newOwner) external override(IERC173) onlyOwner { - _transferOwnership(newOwner); + function name() external view virtual override(IERC721Metadata) returns (string memory) { + return _name; } - function owner() public view override(IERC173) returns (address) { - return _owner; + function symbol() external view virtual override(IERC721Metadata) returns (string memory) { + return _symbol; } - function supportsInterface(bytes4 interfaceId) - public + function tokenURI(uint256 tokenID) + external view virtual - override(OpenERC165) - returns (bool) + override(IERC721Metadata) + existsToken(tokenID) + returns (string memory) { - return interfaceId == 0x7f5828d0 || super.supportsInterface(interfaceId); - } - - function _initialize(address owner_) internal { - require(_openERC173Initialized == false, "Already initialized"); - _openERC173Initialized = true; - - _transferOwnership(owner_); - } - - function _transferOwnership(address newOwner) internal { - address oldOwner = _owner; - _owner = newOwner; - emit OwnershipTransferred(oldOwner, newOwner); - } -} - -// -// Derived from Kredeum NFTs -// https://github.com/Kredeum/kredeum -// -// OpenERC165 -// | -// OpenCloneable —— IOpenCloneable -// - -interface IOpenCloneable { - function initialize(string memory name, string memory symbol, address owner, bytes memory params) - external; - - function initialized() external view returns (bool); - - function template() external view returns (string memory); - - function version() external view returns (uint256); - - function parent() external view returns (address); -} - -abstract contract OpenCloneable is IOpenCloneable, OpenERC165 { - bool public initialized; - string public template; - uint256 public version; - - function parent() external view override(IOpenCloneable) returns (address parent_) { - // eip1167 deployed code = 45 bytes = 10 bytes + 20 bytes address + 15 bytes - // extract bytes 10 to 30: shift 2 bytes (16 bits) then truncate to address 20 bytes (uint160) - return (address(this).code.length == 45) - ? address(uint160(uint256(bytes32(address(this).code)) >> 16)) - : address(0); + return _tokenURIs[tokenID]; } - function initialize(string memory name, string memory symbol, address owner, bytes memory params) - public - virtual - override(IOpenCloneable); - function supportsInterface(bytes4 interfaceId) public view virtual - override(OpenERC165) + override(OpenERC721) returns (bool) { - return interfaceId == type(IOpenCloneable).interfaceId || super.supportsInterface(interfaceId); + return interfaceId == 0x5b5e139f || super.supportsInterface(interfaceId); } - function _initialize(string memory template_, uint256 version_) internal { - require(initialized == false, "Already initialized"); - initialized = true; + function _initialize(string memory name_, string memory symbol_) internal { + require(_openERC721MetadataInitialized == false, "Already initialized"); + _openERC721MetadataInitialized = true; - template = template_; - version = version_; + _name = name_; + _symbol = symbol_; } -} -interface IOpenNFTsV4 { - function mint(string memory tokenURI) external returns (uint256 tokenID); + function _mint(address to, string memory newTokenURI, uint256 tokenID) + internal + virtual + override(OpenERC721) + { + _tokenURIs[tokenID] = newTokenURI; - function mint(address minter, string memory tokenURI) external returns (uint256 tokenID); + super._mint(to, newTokenURI, tokenID); + } - function burn(uint256 tokenID) external; + function _burn(uint256 tokenID) internal virtual override(OpenERC721) { + delete _tokenURIs[tokenID]; - function open() external view returns (bool); + super._burn(tokenID); + } } -interface IOpenNFTsV4Skale { - function setTokenUriMaxLength(uint256 tokenUriMaxLength_) external; +// src/OpenNFTsV4Skale.sol - function setCooldownPeriod(uint256 cooldownPeriod_) external; -} +// +// Derived from Kredeum NFTs +// https://github.com/Kredeum/kredeum +// +// ___ ___ ___ ___ ___ ___ ___ +// / /\ / /\ / /\ /__/\ /__/\ / /\ ___ / /\ +// / /::\ / /::\ / /:/_ \ \:\ \ \:\ / /:/_ / /\ / /:/_ +// / /:/\:\ / /:/\:\ / /:/ /\ \ \:\ \ \:\ / /:/ /\ / /:/ / /:/ /\ +// / /:/ \:\ / /:/~/:/ / /:/ /:/_ _____\__\:\ _____\__\:\ / /:/ /:/ / /:/ / /:/ /::\ +// /__/:/ \__\:\ /__/:/ /:/ /__/:/ /:/ /\ /__/::::::::\ /__/::::::::\ /__/:/ /:/ / /::\ /__/:/ /:/\:\ +// \ \:\ / /:/ \ \:\/:/ \ \:\/:/ /:/ \ \:\~~\~~\/ \ \:\~~\~~\/ \ \:\/:/ /__/:/\:\ \ \:\/:/~/:/ +// \ \:\ /:/ \ \::/ \ \::/ /:/ \ \:\ ~~~ \ \:\ ~~~ \ \::/ \__\/ \:\ \ \::/ /:/ +// \ \:\/:/ \ \:\ \ \:\/:/ \ \:\ \ \:\ \ \:\ \ \:\ \__\/ /:/ +// \ \::/ \ \:\ \ \::/ \ \:\ \ \:\ \ \:\ \__\/ /__/:/ +// \__\/ \__\/ \__\/ \__\/ \__\/ \__\/ \__\/ +// +// +// OpenERC165 +// (supports) +// | +// ——————————————————————————————————————————————————— +// | | | +// OpenERC721 OpenERC173 OpenCloneable +// (NFT) (ownable) | +// | | | +// —————————————————————————— | | +// | | | | +// OpenERC721Metadata OpenERC721Enumerable | | +// | | | | +// ——————————————————————————————————————————————————— +// | +// OpenNFTsV4Skale —— IOpenNFTsV4Skale +// /// @title OpenNFTs smartcontract contract OpenNFTsV4Skale is @@ -648,7 +681,7 @@ contract OpenNFTsV4Skale is uint256 public tokenUriMaxLength = type(uint256).max; /// @notice minimum time between two Mints - uint256 public cooldownPeriod = type(uint256).max; + uint256 public cooldownPeriod; /// @notice timestamp of next possible Mint per User mapping(address => uint256) private _cooldown; @@ -749,3 +782,4 @@ contract OpenNFTsV4Skale is super._transferFromBefore(from, to, tokenID); } } + diff --git a/contracts/scripts/DeployAllCurrent.s.sol b/contracts/scripts/DeployAllCurrent.s.sol index 9a68775a..b37a2033 100644 --- a/contracts/scripts/DeployAllCurrent.s.sol +++ b/contracts/scripts/DeployAllCurrent.s.sol @@ -6,28 +6,18 @@ import "forge-std/Script.sol"; import {DeployOpenNFTsFactoryV3} from "./deploy/DeployOpenNFTsFactoryV3.s.sol"; import {DeployOpenNFTsResolver} from "./deploy/DeployOpenNFTsResolver.s.sol"; import {DeployOpenNFTsV4} from "./deploy/DeployOpenNFTsV4.s.sol"; -import {DeployOpenNFTsV4Skale} from "./deploy/DeployOpenNFTsV4Skale.s.sol"; import {DeployOpenAutoMarket} from "./deploy/DeployOpenAutoMarket.s.sol"; -contract DeployAllCurrent is - DeployOpenNFTsFactoryV3, - DeployOpenNFTsResolver, - DeployOpenNFTsV4, - DeployOpenNFTsV4Skale, - DeployOpenAutoMarket -{ +contract DeployAllCurrent is DeployOpenNFTsFactoryV3, DeployOpenNFTsResolver, DeployOpenNFTsV4, DeployOpenAutoMarket { function run() public - override( - DeployOpenNFTsFactoryV3, DeployOpenNFTsResolver, DeployOpenNFTsV4, DeployOpenNFTsV4Skale, DeployOpenAutoMarket - ) + override(DeployOpenNFTsFactoryV3, DeployOpenNFTsResolver, DeployOpenNFTsV4, DeployOpenAutoMarket) { console.log("chainId %s msg.sender @%s", block.chainid, msg.sender); deployOpenNFTsFactoryV3(); deployOpenNFTsResolver(); - deployOpenNFTsV4Skale(); - // deployOpenNFTsV4(); - // deployOpenAutoMarket(); + deployOpenNFTsV4(); + deployOpenAutoMarket(); } } diff --git a/contracts/scripts/DeployAllSkale.s.sol b/contracts/scripts/DeployAllSkale.s.sol new file mode 100644 index 00000000..f213d5e7 --- /dev/null +++ b/contracts/scripts/DeployAllSkale.s.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: MITs +pragma solidity 0.8.19; + +import "forge-std/Script.sol"; + +import {DeployOpenNFTsResolverSkale} from "./deploy/skale/DeployOpenNFTsResolverSkale.s.sol"; +import {DeployOpenNFTsV4Skale} from "./deploy/skale/DeployOpenNFTsV4Skale.s.sol"; + +contract DeployAllCurrent is DeployOpenNFTsResolverSkale, DeployOpenNFTsV4Skale { + function run() public override(DeployOpenNFTsResolverSkale, DeployOpenNFTsV4Skale) { + console.log("chainId %s msg.sender @%s", block.chainid, msg.sender); + + deployOpenNFTsResolver(); + deployOpenNFTsV4Skale(); + } +} diff --git a/contracts/scripts/deploy/DeployOpenNFTsV4Skale.s.sol b/contracts/scripts/deploy/DeployOpenNFTsV4Skale.s.sol deleted file mode 100644 index db724ec6..00000000 --- a/contracts/scripts/deploy/DeployOpenNFTsV4Skale.s.sol +++ /dev/null @@ -1,41 +0,0 @@ -// SPDX-License-Identifier: MITs -pragma solidity 0.8.19; - -import {DeployLite} from "@forge-deploy-lite/DeployLite.s.sol"; - -import {OpenNFTsFactoryV3} from "src/OpenNFTsFactoryV3.sol"; -import {OpenNFTsV4Skale} from "src/OpenNFTsV4Skale.sol"; - -contract DeployOpenNFTsV4Skale is DeployLite { - function deployOpenNFTsV4Skale() public returns (address) { - address openNFTsFactoryV3 = readAddress("OpenNFTsFactoryV3"); - - require( - msg.sender == OpenNFTsFactoryV3(openNFTsFactoryV3).owner(), "Deployer must be OpenNFTsFactoryV3 owner !" - ); - - DeployState state = deployState("OpenNFTsV4Skale"); - - if (state == DeployState.None) { - vm.startBroadcast(msg.sender); - - address openNFTsV4Skale = deploy("OpenNFTsV4Skale"); - - bool[] memory options = new bool[](1); - options[0] = true; - OpenNFTsV4Skale(openNFTsV4Skale).initialize( - "OpenNFTsV4", "ONFTSKL", msg.sender, abi.encode(abi.encode(0, address(0), 0, options), address(0), 0) - ); - - OpenNFTsFactoryV3(openNFTsFactoryV3).setTemplate("OpenNFTsV4Skale", openNFTsV4Skale); - - vm.stopBroadcast(); - } - - return readAddress("OpenNFTsV4Skale"); - } - - function run() public virtual { - deployOpenNFTsV4Skale(); - } -} diff --git a/contracts/scripts/deploy/skale/DeployOpenNFTsResolverSkale.s.sol b/contracts/scripts/deploy/skale/DeployOpenNFTsResolverSkale.s.sol new file mode 100644 index 00000000..69944b25 --- /dev/null +++ b/contracts/scripts/deploy/skale/DeployOpenNFTsResolverSkale.s.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: MITs +pragma solidity 0.8.19; + +import "forge-std/Script.sol"; + +import {DeployLite} from "@forge-deploy-lite/DeployLite.s.sol"; + +contract DeployOpenNFTsResolverSkale is DeployLite { + function deployOpenNFTsResolver() public returns (address) { + return deployLite("OpenNFTsResolver", abi.encode(msg.sender, address(0))); + } + + function run() public virtual { + deployOpenNFTsResolver(); + } +} diff --git a/contracts/scripts/deploy/skale/DeployOpenNFTsV4Skale.s.sol b/contracts/scripts/deploy/skale/DeployOpenNFTsV4Skale.s.sol new file mode 100644 index 00000000..884e32dc --- /dev/null +++ b/contracts/scripts/deploy/skale/DeployOpenNFTsV4Skale.s.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MITs +pragma solidity 0.8.19; + +import {DeployLite} from "@forge-deploy-lite/DeployLite.s.sol"; + +import {OpenNFTsV4Skale} from "src/OpenNFTsV4Skale.sol"; + +contract DeployOpenNFTsV4Skale is DeployLite { + function deployOpenNFTsV4Skale() public returns (address) { + address openNFTsV4Skale = deployLite("OpenNFTsV4Skale"); + + bool initialized = OpenNFTsV4Skale(openNFTsV4Skale).initialized(); + + if (!initialized) { + bool[] memory options = new bool[](1); + options[0] = true; + + vm.broadcast(); + OpenNFTsV4Skale(openNFTsV4Skale).initialize( + "OpenNFTsV4", "ONFTSKL", msg.sender, abi.encode(abi.encode(0, address(0), 0, options), address(0), 0) + ); + } + return openNFTsV4Skale; + } + + function run() public virtual { + deployOpenNFTsV4Skale(); + } +}