From 0fdc266d2b5610694d98689c445cffffea90972c Mon Sep 17 00:00:00 2001 From: owen05 Date: Thu, 27 May 2021 20:07:47 +0800 Subject: [PATCH] add dodoCollection --- config/bsc-config.js | 3 + config/kovan-config.js | 5 +- .../DODOMemberSystem/impl/MemAggregator.sol | 57 ------------- .../DODOMemberSystem/impl/MemPermission.sol | 27 ------ .../DODOMemberSystem/impl/MemSourceHold.sol | 27 ------ .../DODOMemberSystem/impl/MemSourceStake.sol | 85 ------------------- contracts/Factory/DODONFT.sol | 43 ++++++++++ contracts/Factory/DODONFT1155.sol | 57 +++++++++++++ deploy-nft.txt | 12 +++ migrations/5_deploy_nft.js | 39 ++++++++- truffle-config.js | 3 +- 11 files changed, 159 insertions(+), 199 deletions(-) delete mode 100644 contracts/DODOMemberSystem/impl/MemAggregator.sol delete mode 100644 contracts/DODOMemberSystem/impl/MemPermission.sol delete mode 100644 contracts/DODOMemberSystem/impl/MemSourceHold.sol delete mode 100644 contracts/DODOMemberSystem/impl/MemSourceStake.sol create mode 100644 contracts/Factory/DODONFT.sol create mode 100644 contracts/Factory/DODONFT1155.sol diff --git a/config/bsc-config.js b/config/bsc-config.js index 31754d5..fec2456 100644 --- a/config/bsc-config.js +++ b/config/bsc-config.js @@ -72,6 +72,9 @@ module.exports = { InitializableERC1155: "", NFTTokenFactory: "", + DodoNftErc721: "", + DodoNftErc1155: "", + DODONFTRegistry: "", DODONFTProxy: "", diff --git a/config/kovan-config.js b/config/kovan-config.js index 2839dda..159200b 100644 --- a/config/kovan-config.js +++ b/config/kovan-config.js @@ -70,6 +70,9 @@ module.exports = { InitializableERC1155: "0xc4d86FFB26EB6EcAe80D3f1e2c8519832Fd478B2", NFTTokenFactory: "0x834D13Ca0322Ccfe67596f09Cc26Ee3584297B94", + DodoNftErc721: "", + DodoNftErc1155: "", + DODONFTRegistry: "0x579eBcC668b5517F733587091C35D495FE8d6b68", DODONFTProxy: "0xe121c6C90735e2Ca12e21708F2F379A55Ce61426", @@ -85,6 +88,6 @@ module.exports = { //================= DropsV2 ================== DropsFeeModel: "0xDBe1C360050638C9d0f28f23B51b198C8B70D9eA", - DropsProxy: "0xa3a23cee044F995a97D86defeABf769bAd57c7c8" + DropsProxy: "0xa3a23cee044F995a97D86defeABf769bAd57c7c8", } } \ No newline at end of file diff --git a/contracts/DODOMemberSystem/impl/MemAggregator.sol b/contracts/DODOMemberSystem/impl/MemAggregator.sol deleted file mode 100644 index e519cd8..0000000 --- a/contracts/DODOMemberSystem/impl/MemAggregator.sol +++ /dev/null @@ -1,57 +0,0 @@ -/* - - Copyright 2020 DODO ZOO. - SPDX-License-Identifier: Apache-2.0 - -*/ - -pragma solidity 0.6.9; -pragma experimental ABIEncoderV2; - -import {Ownable} from "../../lib/Ownable.sol"; -import {SafeMath} from "../../lib/SafeMath.sol"; -import {DecimalMath} from "../../lib/DecimalMath.sol"; - -interface IMemSource { - function getMemLevel(address user) external returns (uint256); -} - -contract MemRegistry is Ownable { - using SafeMath for uint256; - - address[] internal _VALID_MEM_SOURCE_LIST_; - mapping(address => bool) internal _VALID_MEM_SOURCE_; - mapping(address => uint256) internal _MEM_SOURCE_WEIGHT_; - - function getMemLevel(address user) public returns (uint256 memLevel) { - for (uint8 i = 0; i < _VALID_MEM_SOURCE_LIST_.length; i++) { - address _source = _VALID_MEM_SOURCE_LIST_[i]; - memLevel = memLevel.add( - IMemSource(_source).getMemLevel(user).mul(_MEM_SOURCE_WEIGHT_[_source]) - ); - } - } - - function setMemSourceWeight(address source, uint256 weight) external onlyOwner { - _MEM_SOURCE_WEIGHT_[source] = weight; - } - - function addMemSource(address source) external onlyOwner { - require(!_VALID_MEM_SOURCE_[source], "SOURCE_ALREADY_EXIST"); - _VALID_MEM_SOURCE_LIST_.push(source); - _VALID_MEM_SOURCE_[source] = true; - } - - function removeMemSource(address source) external onlyOwner { - require(_VALID_MEM_SOURCE_[source], "SOURCE_NOT_EXIST"); - for (uint8 i = 0; i <= _VALID_MEM_SOURCE_LIST_.length - 1; i++) { - if (_VALID_MEM_SOURCE_LIST_[i] == source) { - _VALID_MEM_SOURCE_LIST_[i] = _VALID_MEM_SOURCE_LIST_[_VALID_MEM_SOURCE_LIST_ - .length - 1]; - _VALID_MEM_SOURCE_LIST_.pop(); - break; - } - } - _VALID_MEM_SOURCE_[source] = false; - } -} diff --git a/contracts/DODOMemberSystem/impl/MemPermission.sol b/contracts/DODOMemberSystem/impl/MemPermission.sol deleted file mode 100644 index 89288d6..0000000 --- a/contracts/DODOMemberSystem/impl/MemPermission.sol +++ /dev/null @@ -1,27 +0,0 @@ -/* - - Copyright 2020 DODO ZOO. - SPDX-License-Identifier: Apache-2.0 - -*/ - -pragma solidity 0.6.9; -pragma experimental ABIEncoderV2; - -import {Ownable} from "../../lib/Ownable.sol"; -import {IPermissionManager} from "../../lib/PermissionManager.sol"; -import {IMemSource} from "./MemSourceStake.sol"; - -contract MemPermission is Ownable { - uint256 public _MEM_LEVEL_THRESHOLD_; - address public _MEM_LEVEL_SOURCE_; - - constructor(address memLevelSource, uint256 memLevelThreshold) public { - _MEM_LEVEL_THRESHOLD_ = memLevelThreshold; - _MEM_LEVEL_SOURCE_ = memLevelSource; - } - - function isAllowed(address account) external returns (bool) { - return IMemSource(_MEM_LEVEL_SOURCE_).getMemLevel(account) >= _MEM_LEVEL_THRESHOLD_; - } -} diff --git a/contracts/DODOMemberSystem/impl/MemSourceHold.sol b/contracts/DODOMemberSystem/impl/MemSourceHold.sol deleted file mode 100644 index ef31c09..0000000 --- a/contracts/DODOMemberSystem/impl/MemSourceHold.sol +++ /dev/null @@ -1,27 +0,0 @@ -/* - - Copyright 2020 DODO ZOO. - SPDX-License-Identifier: Apache-2.0 - -*/ - -pragma solidity 0.6.9; -pragma experimental ABIEncoderV2; - -import {Ownable} from "../../lib/Ownable.sol"; -import {IMemSource} from "./MemAggregator.sol"; -import {IERC20} from "../../intf/IERC20.sol"; - -contract MemSourceHold is Ownable, IMemSource { - address public _DODO_TOKEN_; - - constructor(address dodoToken) public { - _DODO_TOKEN_ = dodoToken; - } - - // ============ View Function ============ - - function getMemLevel(address user) external override returns (uint256) { - return IERC20(_DODO_TOKEN_).balanceOf(user); - } -} diff --git a/contracts/DODOMemberSystem/impl/MemSourceStake.sol b/contracts/DODOMemberSystem/impl/MemSourceStake.sol deleted file mode 100644 index 6a2cb50..0000000 --- a/contracts/DODOMemberSystem/impl/MemSourceStake.sol +++ /dev/null @@ -1,85 +0,0 @@ -/* - - Copyright 2020 DODO ZOO. - SPDX-License-Identifier: Apache-2.0 - -*/ - -pragma solidity 0.6.9; -pragma experimental ABIEncoderV2; - -import {Ownable} from "../../lib/Ownable.sol"; -import {IMemSource} from "./MemAggregator.sol"; -import {IERC20} from "../../intf/IERC20.sol"; -import {SafeMath} from "../../lib/SafeMath.sol"; -import {SafeERC20} from "../../lib/SafeERC20.sol"; -import {DecimalMath} from "../../lib/DecimalMath.sol"; - -contract MemSourceStake is Ownable, IMemSource { - using SafeMath for uint256; - using SafeERC20 for IERC20; - - address public _DODO_TOKEN_; - uint256 public _DODO_RESERVE_; - uint256 public _COLD_DOWN_DURATION_; - - mapping(address => uint256) internal _STAKED_DODO_; - mapping(address => uint256) internal _PENDING_DODO_; - mapping(address => uint256) internal _EXECUTE_TIME_; - - constructor(address dodoToken) public { - _DODO_TOKEN_ = dodoToken; - } - - // ============ Owner Function ============ - - function setColdDownDuration(uint256 coldDownDuration) external onlyOwner { - _COLD_DOWN_DURATION_ = coldDownDuration; - } - - // ============ DODO Function ============ - - function admitStakedDODO(address to) external { - uint256 dodoInput = IERC20(_DODO_TOKEN_).balanceOf(address(this)).sub(_DODO_RESERVE_); - _STAKED_DODO_[to] = _STAKED_DODO_[to].add(dodoInput); - _sync(); - } - - function stakeDODO(uint256 amount) external { - _transferDODOIn(msg.sender, amount); - _STAKED_DODO_[msg.sender] = _STAKED_DODO_[msg.sender].add(amount); - _sync(); - } - - function requestDODOWithdraw(uint256 amount) external { - _STAKED_DODO_[msg.sender] = _STAKED_DODO_[msg.sender].sub(amount); - _PENDING_DODO_[msg.sender] = _PENDING_DODO_[msg.sender].add(amount); - _EXECUTE_TIME_[msg.sender] = block.timestamp.add(_COLD_DOWN_DURATION_); - } - - function withdrawDODO() external { - require(_EXECUTE_TIME_[msg.sender] <= block.timestamp, "WITHDRAW_COLD_DOWN"); - _transferDODOOut(msg.sender, _PENDING_DODO_[msg.sender]); - _PENDING_DODO_[msg.sender] = 0; - } - - // ============ Balance Function ============ - - function _transferDODOIn(address from, uint256 amount) internal { - IERC20(_DODO_TOKEN_).transferFrom(from, address(this), amount); - } - - function _transferDODOOut(address to, uint256 amount) internal { - IERC20(_DODO_TOKEN_).transfer(to, amount); - } - - function _sync() internal { - _DODO_RESERVE_ = IERC20(_DODO_TOKEN_).balanceOf(address(this)); - } - - // ============ View Function ============ - - function getMemLevel(address user) external override returns (uint256) { - return _STAKED_DODO_[user]; - } -} diff --git a/contracts/Factory/DODONFT.sol b/contracts/Factory/DODONFT.sol new file mode 100644 index 0000000..4e21717 --- /dev/null +++ b/contracts/Factory/DODONFT.sol @@ -0,0 +1,43 @@ +/* + + Copyright 2021 DODO ZOO. + SPDX-License-Identifier: Apache-2.0 + +*/ + +pragma solidity 0.6.9; + +import {ERC721URIStorage} from "../external/ERC721/ERC721URIStorage.sol"; +import {InitializableOwnable} from "../lib/InitializableOwnable.sol"; + +contract DODONFT is ERC721URIStorage, InitializableOwnable { + + uint256 public _CUR_TOKENID_; + + // ============ Event ============= + event DODONFTMint(address creator, uint256 tokenId); + event DODONFTBurn(uint256 tokenId); + + function init( + address owner, + string memory name, + string memory symbol + ) public { + initOwner(owner); + _name = name; + _symbol = symbol; + } + + function mint(string calldata uri) external { + _safeMint(msg.sender, _CUR_TOKENID_); + _setTokenURI(_CUR_TOKENID_, uri); + emit DODONFTMint(msg.sender, _CUR_TOKENID_); + _CUR_TOKENID_ = _CUR_TOKENID_ + 1; + } + + function burn(uint256 tokenId) external onlyOwner { + require(tokenId < _CUR_TOKENID_, "TOKENID_INVALID"); + _burn(tokenId); + emit DODONFTBurn(tokenId); + } +} \ No newline at end of file diff --git a/contracts/Factory/DODONFT1155.sol b/contracts/Factory/DODONFT1155.sol new file mode 100644 index 0000000..04d7661 --- /dev/null +++ b/contracts/Factory/DODONFT1155.sol @@ -0,0 +1,57 @@ +/* + + Copyright 2021 DODO ZOO. + SPDX-License-Identifier: Apache-2.0 + +*/ + +pragma solidity 0.6.9; + +import {ERC1155} from "../external/ERC1155/ERC1155.sol"; +import {Strings} from "../external/utils/Strings.sol"; +import {InitializableOwnable} from "../lib/InitializableOwnable.sol"; + +contract DODONFT1155 is ERC1155, InitializableOwnable { + using Strings for uint256; + + uint256 public _CUR_TOKENID_; + string internal _baseUri = ""; + mapping (uint256 => string) private _tokenURIs; + + // ============ Event ============= + event DODONFTMint(address creator, uint256 tokenId, uint256 amount); + event DODONFTBurn(address account, uint256 tokenId, uint256 amount); + + + function mint(string calldata uri, uint256 amount) external { + _mint(msg.sender, _CUR_TOKENID_, amount, ""); + _setTokenURI(_CUR_TOKENID_, uri); + emit DODONFTMint(msg.sender, _CUR_TOKENID_, amount); + _CUR_TOKENID_ = _CUR_TOKENID_ + 1; + } + + function burn(address account, uint256 tokenId, uint256 amount) external onlyOwner { + require(tokenId < _CUR_TOKENID_, "TOKENID_INVALID"); + _burn(account, tokenId, amount); + emit DODONFTBurn(account, tokenId, amount); + } + + function uri(uint256 tokenId) public view override returns (string memory) { + string memory _tokenURI = _tokenURIs[tokenId]; + string memory base = _baseUri; + + if (bytes(base).length == 0) { + return _tokenURI; + } + + if (bytes(_tokenURI).length > 0) { + return string(abi.encodePacked(base, _tokenURI)); + } + + return super.uri(tokenId); + } + + function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal { + _tokenURIs[tokenId] = _tokenURI; + } +} \ No newline at end of file diff --git a/deploy-nft.txt b/deploy-nft.txt index 7f80638..2b96aaa 100644 --- a/deploy-nft.txt +++ b/deploy-nft.txt @@ -344,3 +344,15 @@ Init DODONFTProxyAddress Tx: 0x6b72dd067b291dfb731af0304ceb0127e6b82696a0dca40e6 DODOApproveProxy unlockAddProxy tx: 0x181aea8369c404f6626b17f843a61e7c51511730360fd112e8b45f89ac2a1865 DODOApproveProxy addDODOProxy tx: 0x65363a442ef5cf984374d9add8a0c5f97a0cd72f34dba0a1ed1243aa9e5d4ee8 Add AdminList on DODONFTRegistry Tx: 0x67c34c94a14ba9ee7639f7ff0ba8379eff062d219f16177398803d853b45f253 +==================================================== +network type: kovan +Deploy time: 2021/5/27 下午7:32:05 +Deploy type: DODO Collections +==================================================== +network type: kovan +Deploy time: 2021/5/27 下午7:33:49 +Deploy type: DODO Collections +DodoNftErc721Address: 0x98f2A8d6100635Ecb40ADA1B1FFb1ff4f0b3c5D8 +Init DodoNftErc721 Tx: 0x13011015953cf45401c13204bf8b89c85daa00b238eb588d8570bd2d5886b31e +DodoNftErc1155Address: 0xE9C572287936dB1B0a951ca0768C1b0d26b62A04 +Init DodoNftErc1155 Tx: 0xb2fe57187897820c91a35a66b2480d5ff03aef8a1c354780539894c1ec0074a2 diff --git a/migrations/5_deploy_nft.js b/migrations/5_deploy_nft.js index 1f00e12..e916893 100644 --- a/migrations/5_deploy_nft.js +++ b/migrations/5_deploy_nft.js @@ -15,6 +15,9 @@ const InitializableERC721 = artifacts.require("InitializableERC721"); const InitializableERC1155 = artifacts.require("InitializableERC1155"); const NFTTokenFactory = artifacts.require("NFTTokenFactory"); +const DodoNftErc721 = artifacts.require("DODONFT"); +const DodoNftErc1155 = artifacts.require("DODONFT1155"); + const DODODropsV1 = artifacts.require("MysteryBoxKAKA"); const RandomGenerator = artifacts.require("RandomGenerator"); @@ -45,6 +48,9 @@ module.exports = async (deployer, network, accounts) => { let RandomGeneratorAddress = CONFIG.RandomGenerator; let RandomPool = CONFIG.RandomPool; + let DodoNftErc721Address = CONFIG.DodoNftErc721; + let DodoNftErc1155Address = CONFIG.DodoNftErc1155; + let multiSigAddress = CONFIG.multiSigAddress; let defaultMaintainer = CONFIG.defaultMaintainer; @@ -76,6 +82,37 @@ module.exports = async (deployer, network, accounts) => { } } + if (deploySwitch.COLLECTIONS) { + logger.log("===================================================="); + logger.log("network type: " + network); + logger.log("Deploy time: " + new Date().toLocaleString()); + logger.log("Deploy type: DODO Collections"); + + //ERC721 + if (DodoNftErc721Address == "") { + await deployer.deploy(DodoNftErc721); + DodoNftErc721Address = DodoNftErc721.address; + logger.log("DodoNftErc721Address: ", DodoNftErc721Address); + const DodoNftErc721Instance = await DodoNftErc721.at(DodoNftErc721Address); + var tx = await DodoNftErc721Instance.init( + multiSigAddress, + "DODONFT", + "DODONFT" + ); + logger.log("Init DodoNftErc721 Tx:", tx.tx); + } + + //ERC1155 + if (DodoNftErc1155Address == "") { + await deployer.deploy(DodoNftErc1155); + DodoNftErc1155Address = DodoNftErc1155.address; + logger.log("DodoNftErc1155Address: ", DodoNftErc1155Address); + const DodoNftErc1155Instance = await DodoNftErc1155.at(DodoNftErc1155Address); + var tx = await DodoNftErc1155Instance.initOwner(multiSigAddress); + logger.log("Init DodoNftErc1155 Tx:", tx.tx); + } + } + if (deploySwitch.DEPLOY_NFT) { logger.log("===================================================="); logger.log("network type: " + network); @@ -180,7 +217,7 @@ module.exports = async (deployer, network, accounts) => { const DODONFTRegistrynstance = await DODONFTRegistry.at(DODONFTRegistryAddress); var tx = await DODONFTRegistrynstance.addAdminList(DODONFTProxyAddress); - logger.log("Add AdminList on DODONFTRegistry Tx:", tx.tx); + logger.log("Add AdminList on DODONFTRegistry Tx:", tx.tx); } } }; diff --git a/truffle-config.js b/truffle-config.js index 33031ce..e5d7359 100644 --- a/truffle-config.js +++ b/truffle-config.js @@ -61,8 +61,9 @@ module.exports = { CpProxy: false, ERC20V2Factory: false, DEPLOY_NFT: false, + COLLECTIONS: false, MYSTERYBOX_V1: false, - Drops_V2: true + Drops_V2: false, }, networks: {