update ercV3
This commit is contained in:
192
contracts/Factory/ERC20V3Factory.sol
Normal file
192
contracts/Factory/ERC20V3Factory.sol
Normal file
@@ -0,0 +1,192 @@
|
||||
/*
|
||||
|
||||
Copyright 2022 DODO ZOO.
|
||||
SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
*/
|
||||
|
||||
pragma solidity 0.6.9;
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
import {ICloneFactory} from "../lib/CloneFactory.sol";
|
||||
import {InitializableOwnable} from "../lib/InitializableOwnable.sol";
|
||||
|
||||
interface IStdERC20 {
|
||||
function init(
|
||||
address _creator,
|
||||
uint256 _totalSupply,
|
||||
string memory _name,
|
||||
string memory _symbol,
|
||||
uint8 _decimals
|
||||
) external;
|
||||
}
|
||||
|
||||
interface ICustomERC20 {
|
||||
function init(
|
||||
address _creator,
|
||||
uint256 _initSupply,
|
||||
string memory _name,
|
||||
string memory _symbol,
|
||||
uint8 _decimals,
|
||||
uint256 _tradeBurnRatio,
|
||||
uint256 _tradeFeeRatio,
|
||||
address _team
|
||||
) external;
|
||||
}
|
||||
|
||||
/**
|
||||
* @title DODO ERC20V2Factory
|
||||
* @author DODO Breeder
|
||||
*
|
||||
* @notice Help user to create erc20 token
|
||||
*/
|
||||
contract ERC20V3Factory is InitializableOwnable {
|
||||
// ============ Templates ============
|
||||
|
||||
address public immutable _CLONE_FACTORY_;
|
||||
address public _ERC20_TEMPLATE_;
|
||||
address public _CUSTOM_ERC20_TEMPLATE_;
|
||||
address public _CUSTOM_MINTABLE_ERC20_TEMPLATE_;
|
||||
uint256 public _CREATE_FEE_;
|
||||
|
||||
// ============ Events ============
|
||||
// 0 Std 1 TradeBurn or TradeFee 2 Mintable
|
||||
event NewERC20(address erc20, address creator, uint256 erc20Type);
|
||||
event ChangeCreateFee(uint256 newFee);
|
||||
event Withdraw(address account, uint256 amount);
|
||||
event ChangeStdTemplate(address newStdTemplate);
|
||||
event ChangeCustomTemplate(address newCustomTemplate);
|
||||
event ChangeCustomMintableTemplate(address newCustomMintableTemplate);
|
||||
|
||||
// ============ Registry ============
|
||||
// creator -> token address list
|
||||
mapping(address => address[]) public _USER_STD_REGISTRY_;
|
||||
mapping(address => address[]) public _USER_CUSTOM_REGISTRY_;
|
||||
mapping(address => address[]) public _USER_CUSTOM_MINTABLE_REGISTRY_;
|
||||
|
||||
// ============ Functions ============
|
||||
|
||||
fallback() external payable {}
|
||||
|
||||
receive() external payable {}
|
||||
|
||||
constructor(
|
||||
address cloneFactory,
|
||||
address erc20Template,
|
||||
address customErc20Template,
|
||||
address customMintableErc20Template,
|
||||
uint256 createFee
|
||||
) public {
|
||||
_CLONE_FACTORY_ = cloneFactory;
|
||||
_ERC20_TEMPLATE_ = erc20Template;
|
||||
_CUSTOM_ERC20_TEMPLATE_ = customErc20Template;
|
||||
_CUSTOM_MINTABLE_ERC20_TEMPLATE_ = customMintableErc20Template;
|
||||
_CREATE_FEE_ = createFee;
|
||||
}
|
||||
|
||||
function createStdERC20(
|
||||
uint256 totalSupply,
|
||||
string memory name,
|
||||
string memory symbol,
|
||||
uint8 decimals
|
||||
) external payable returns (address newERC20) {
|
||||
require(msg.value >= _CREATE_FEE_, "CREATE_FEE_NOT_ENOUGH");
|
||||
newERC20 = ICloneFactory(_CLONE_FACTORY_).clone(_ERC20_TEMPLATE_);
|
||||
IStdERC20(newERC20).init(msg.sender, totalSupply, name, symbol, decimals);
|
||||
_USER_STD_REGISTRY_[msg.sender].push(newERC20);
|
||||
emit NewERC20(newERC20, msg.sender, 0);
|
||||
}
|
||||
|
||||
function createCustomERC20(
|
||||
uint256 totalSupply,
|
||||
string memory name,
|
||||
string memory symbol,
|
||||
uint8 decimals,
|
||||
uint256 tradeBurnRatio,
|
||||
uint256 tradeFeeRatio,
|
||||
address teamAccount
|
||||
) external payable returns (address newCustomERC20) {
|
||||
require(msg.value >= _CREATE_FEE_, "CREATE_FEE_NOT_ENOUGH");
|
||||
newCustomERC20 = ICloneFactory(_CLONE_FACTORY_).clone(_CUSTOM_ERC20_TEMPLATE_);
|
||||
|
||||
ICustomERC20(newCustomERC20).init(
|
||||
msg.sender,
|
||||
totalSupply,
|
||||
name,
|
||||
symbol,
|
||||
decimals,
|
||||
tradeBurnRatio,
|
||||
tradeFeeRatio,
|
||||
teamAccount
|
||||
);
|
||||
|
||||
_USER_CUSTOM_REGISTRY_[msg.sender].push(newCustomERC20);
|
||||
|
||||
emit NewERC20(newCustomERC20, msg.sender, 1);
|
||||
}
|
||||
|
||||
function createCustomMintableERC20(
|
||||
uint256 initSupply,
|
||||
string memory name,
|
||||
string memory symbol,
|
||||
uint8 decimals,
|
||||
uint256 tradeBurnRatio,
|
||||
uint256 tradeFeeRatio,
|
||||
address teamAccount
|
||||
) external payable returns (address newCustomMintableERC20) {
|
||||
require(msg.value >= _CREATE_FEE_, "CREATE_FEE_NOT_ENOUGH");
|
||||
newCustomMintableERC20 = ICloneFactory(_CLONE_FACTORY_).clone(_CUSTOM_MINTABLE_ERC20_TEMPLATE_);
|
||||
|
||||
ICustomERC20(newCustomMintableERC20).init(
|
||||
msg.sender,
|
||||
initSupply,
|
||||
name,
|
||||
symbol,
|
||||
decimals,
|
||||
tradeBurnRatio,
|
||||
tradeFeeRatio,
|
||||
teamAccount
|
||||
);
|
||||
|
||||
_USER_CUSTOM_MINTABLE_REGISTRY_[msg.sender].push(newCustomMintableERC20);
|
||||
|
||||
emit NewERC20(newCustomMintableERC20, msg.sender, 2);
|
||||
}
|
||||
|
||||
|
||||
// ============ View ============
|
||||
function getTokenByUser(address user)
|
||||
external
|
||||
view
|
||||
returns (address[] memory stds,address[] memory customs,address[] memory mintables)
|
||||
{
|
||||
return (_USER_STD_REGISTRY_[user], _USER_CUSTOM_REGISTRY_[user], _USER_CUSTOM_MINTABLE_REGISTRY_[user]);
|
||||
}
|
||||
|
||||
// ============ Ownable =============
|
||||
function changeCreateFee(uint256 newFee) external onlyOwner {
|
||||
_CREATE_FEE_ = newFee;
|
||||
emit ChangeCreateFee(newFee);
|
||||
}
|
||||
|
||||
function withdraw() external onlyOwner {
|
||||
uint256 amount = address(this).balance;
|
||||
msg.sender.transfer(amount);
|
||||
emit Withdraw(msg.sender, amount);
|
||||
}
|
||||
|
||||
function updateStdTemplate(address newStdTemplate) external onlyOwner {
|
||||
_ERC20_TEMPLATE_ = newStdTemplate;
|
||||
emit ChangeStdTemplate(newStdTemplate);
|
||||
}
|
||||
|
||||
function updateCustomTemplate(address newCustomTemplate) external onlyOwner {
|
||||
_CUSTOM_ERC20_TEMPLATE_ = newCustomTemplate;
|
||||
emit ChangeCustomTemplate(newCustomTemplate);
|
||||
}
|
||||
|
||||
function updateCustomMintableTemplate(address newCustomMintableTemplate) external onlyOwner {
|
||||
_CUSTOM_MINTABLE_ERC20_TEMPLATE_ = newCustomMintableTemplate;
|
||||
emit ChangeCustomMintableTemplate(newCustomMintableTemplate);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user