add dodoCollection

This commit is contained in:
owen05
2021-05-27 20:07:47 +08:00
parent eba59077c7
commit 0fdc266d2b
11 changed files with 159 additions and 199 deletions

View File

@@ -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;
}
}

View File

@@ -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_;
}
}

View File

@@ -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);
}
}

View File

@@ -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];
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}
}