merge feature/nft
This commit is contained in:
43
contracts/Factory/DODONFT.sol
Normal file
43
contracts/Factory/DODONFT.sol
Normal 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);
|
||||
}
|
||||
}
|
||||
57
contracts/Factory/DODONFT1155.sol
Normal file
57
contracts/Factory/DODONFT1155.sol
Normal 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;
|
||||
}
|
||||
}
|
||||
75
contracts/Factory/NFTTokenFactory.sol
Normal file
75
contracts/Factory/NFTTokenFactory.sol
Normal file
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
|
||||
Copyright 2020 DODO ZOO.
|
||||
SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
*/
|
||||
pragma solidity 0.6.9;
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
import {ICloneFactory} from "../lib/CloneFactory.sol";
|
||||
import {InitializableERC721} from "../external/ERC721/InitializableERC721.sol";
|
||||
import {InitializableERC1155} from "../external/ERC1155/InitializableERC1155.sol";
|
||||
|
||||
/**
|
||||
* @title DODO NFTTokenFactory
|
||||
* @author DODO Breeder
|
||||
*
|
||||
* @notice Help user to create erc721 && erc1155 token
|
||||
*/
|
||||
contract NFTTokenFactory {
|
||||
// ============ Templates ============
|
||||
|
||||
address public immutable _CLONE_FACTORY_;
|
||||
address public immutable _ERC721_TEMPLATE_;
|
||||
address public immutable _ERC1155_TEMPLATE_;
|
||||
|
||||
// ============ Events ============
|
||||
|
||||
event NewERC721(address erc721, address creator);
|
||||
event NewERC1155(address erc1155, address creator);
|
||||
|
||||
// ============ Registry ============
|
||||
mapping(address => address[]) public _USER_ERC721_REGISTRY_;
|
||||
mapping(address => address[]) public _USER_ERC1155_REGISTRY_;
|
||||
|
||||
// ============ Functions ============
|
||||
|
||||
constructor(
|
||||
address cloneFactory,
|
||||
address erc721Template,
|
||||
address erc1155Tempalte
|
||||
) public {
|
||||
_CLONE_FACTORY_ = cloneFactory;
|
||||
_ERC721_TEMPLATE_ = erc721Template;
|
||||
_ERC1155_TEMPLATE_ = erc1155Tempalte;
|
||||
}
|
||||
|
||||
function createERC721(
|
||||
string memory uri
|
||||
) external returns (address newERC721) {
|
||||
newERC721 = ICloneFactory(_CLONE_FACTORY_).clone(_ERC721_TEMPLATE_);
|
||||
InitializableERC721(newERC721).init(msg.sender, "DODONFT", "DODONFT", uri);
|
||||
_USER_ERC721_REGISTRY_[msg.sender].push(newERC721);
|
||||
emit NewERC721(newERC721, msg.sender);
|
||||
}
|
||||
|
||||
function createERC1155(
|
||||
uint256 amount,
|
||||
string memory uri
|
||||
) external returns (address newERC1155) {
|
||||
newERC1155 = ICloneFactory(_CLONE_FACTORY_).clone(_ERC1155_TEMPLATE_);
|
||||
InitializableERC1155(newERC1155).init(msg.sender, amount, uri);
|
||||
_USER_ERC1155_REGISTRY_[msg.sender].push(newERC1155);
|
||||
emit NewERC1155(newERC1155, msg.sender);
|
||||
}
|
||||
|
||||
|
||||
function getERC721TokenByUser(address user)
|
||||
external
|
||||
view
|
||||
returns (address[] memory tokens)
|
||||
{
|
||||
return _USER_ERC721_REGISTRY_[user];
|
||||
}
|
||||
}
|
||||
113
contracts/Factory/Registries/DODONFTRegistry.sol
Normal file
113
contracts/Factory/Registries/DODONFTRegistry.sol
Normal file
@@ -0,0 +1,113 @@
|
||||
/*
|
||||
|
||||
Copyright 2020 DODO ZOO.
|
||||
SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
*/
|
||||
|
||||
pragma solidity 0.6.9;
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
import {InitializableOwnable} from "../../lib/InitializableOwnable.sol";
|
||||
import {IDVM} from "../../DODOVendingMachine/intf/IDVM.sol";
|
||||
import {IFragment} from "../../GeneralizedFragment/intf/IFragment.sol";
|
||||
|
||||
interface IDODONFTRegistry {
|
||||
function addRegistry(
|
||||
address vault,
|
||||
address fragment,
|
||||
address quoteToken,
|
||||
address dvm
|
||||
) external;
|
||||
|
||||
function removeRegistry(address fragment) external;
|
||||
}
|
||||
|
||||
/**
|
||||
* @title DODONFT Registry
|
||||
* @author DODO Breeder
|
||||
*
|
||||
* @notice Register DODONFT Pools
|
||||
*/
|
||||
contract DODONFTRegistry is InitializableOwnable, IDODONFTRegistry {
|
||||
|
||||
mapping (address => bool) public isAdminListed;
|
||||
|
||||
// ============ Registry ============
|
||||
// Vault -> Frag
|
||||
mapping(address => address) public _VAULT_FRAG_REGISTRY_;
|
||||
|
||||
// base -> quote -> DVM address list
|
||||
mapping(address => mapping(address => address[])) public _REGISTRY_;
|
||||
|
||||
// ============ Events ============
|
||||
|
||||
event NewRegistry(
|
||||
address vault,
|
||||
address fragment,
|
||||
address dvm
|
||||
);
|
||||
|
||||
event RemoveRegistry(address fragment);
|
||||
|
||||
|
||||
// ============ Admin Operation Functions ============
|
||||
|
||||
function addRegistry(
|
||||
address vault,
|
||||
address fragment,
|
||||
address quoteToken,
|
||||
address dvm
|
||||
) override external {
|
||||
require(isAdminListed[msg.sender], "ACCESS_DENIED");
|
||||
_VAULT_FRAG_REGISTRY_[vault] = fragment;
|
||||
_REGISTRY_[fragment][quoteToken].push(dvm);
|
||||
emit NewRegistry(vault, fragment, dvm);
|
||||
}
|
||||
|
||||
function removeRegistry(address fragment) override external {
|
||||
require(isAdminListed[msg.sender], "ACCESS_DENIED");
|
||||
address vault = IFragment(fragment)._COLLATERAL_VAULT_();
|
||||
address dvm = IFragment(fragment)._DVM_();
|
||||
|
||||
_VAULT_FRAG_REGISTRY_[vault] = address(0);
|
||||
|
||||
address quoteToken = IDVM(dvm)._QUOTE_TOKEN_();
|
||||
address[] memory registryList = _REGISTRY_[fragment][quoteToken];
|
||||
for (uint256 i = 0; i < registryList.length; i++) {
|
||||
if (registryList[i] == dvm) {
|
||||
if(i != registryList.length - 1) {
|
||||
_REGISTRY_[fragment][quoteToken][i] = _REGISTRY_[fragment][quoteToken][registryList.length - 1];
|
||||
}
|
||||
_REGISTRY_[fragment][quoteToken].pop();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
emit RemoveRegistry(fragment);
|
||||
}
|
||||
|
||||
function addAdminList (address contractAddr) external onlyOwner {
|
||||
isAdminListed[contractAddr] = true;
|
||||
}
|
||||
|
||||
function removeAdminList (address contractAddr) external onlyOwner {
|
||||
isAdminListed[contractAddr] = false;
|
||||
}
|
||||
|
||||
function getDODOPool(address baseToken, address quoteToken)
|
||||
external
|
||||
view
|
||||
returns (address[] memory pools)
|
||||
{
|
||||
return _REGISTRY_[baseToken][quoteToken];
|
||||
}
|
||||
|
||||
function getDODOPoolBidirection(address token0, address token1)
|
||||
external
|
||||
view
|
||||
returns (address[] memory baseToken0Pool, address[] memory baseToken1Pool)
|
||||
{
|
||||
return (_REGISTRY_[token0][token1], _REGISTRY_[token1][token0]);
|
||||
}
|
||||
}
|
||||
@@ -34,7 +34,7 @@ contract UpCrowdPoolingFactory is InitializableOwnable {
|
||||
|
||||
// ============ Settings =============
|
||||
uint256 public _FREEZE_DURATION_ = 30 days;
|
||||
uint256 public _CALM_DURATION_ = 0;
|
||||
uint256 public _CALM_DURATION_ = 600;
|
||||
uint256 public _VEST_DURATION_ = 0;
|
||||
uint256 public _CLIFF_RATE_ = 10**18;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user