From 0e45da2c4df777e27aaeb6011ed47f513ed29bef Mon Sep 17 00:00:00 2001 From: owen05 Date: Fri, 18 Jun 2021 17:05:37 +0800 Subject: [PATCH] update --- contracts/DODODrops/DODODropsV2/DODODrops.sol | 7 ++ .../DODODrops/DODODropsV2/DropsERC1155.sol | 26 ++---- .../DODODrops/DODODropsV2/DropsERC721.sol | 11 +-- .../GeneralizedFragment/impl/Fragment.sol | 7 +- .../external/ERC20/InitializableFragERC20.sol | 92 +++++++++++++++++++ migrations/6_deploy_dropsV2.js | 48 +++++++--- package-lock.json | 41 +++++++-- package.json | 2 +- truffle-config.js | 1 + 9 files changed, 179 insertions(+), 56 deletions(-) create mode 100644 contracts/external/ERC20/InitializableFragERC20.sol diff --git a/contracts/DODODrops/DODODropsV2/DODODrops.sol b/contracts/DODODrops/DODODropsV2/DODODrops.sol index 47d73fd..c9c8086 100644 --- a/contracts/DODODrops/DODODropsV2/DODODrops.sol +++ b/contracts/DODODrops/DODODropsV2/DODODrops.sol @@ -242,6 +242,13 @@ contract DODODrops is InitializableMintableERC20, ReentrancyGuard { _setFixedAmountInfo(tokenIdList); } + function addFixedAmountInfo(uint256[] memory addTokenIdList) external notStart() onlyOwner { + for (uint256 i = 0; i < addTokenIdList.length; i++) { + _TOKEN_ID_LIST_.push(addTokenIdList[i]); + } + emit SetFixedAmountInfo(); + } + function setTokenIdMapByIndex(uint256 index, uint256[] memory tokenIds) external notStart() onlyOwner { require(_IS_PROB_MODE_, "ONLY_ALLOW_PROB_MODE"); require(tokenIds.length > 0 && index < _TOKEN_ID_MAP_.length,"PARAM_NOT_INVALID"); diff --git a/contracts/DODODrops/DODODropsV2/DropsERC1155.sol b/contracts/DODODrops/DODODropsV2/DropsERC1155.sol index 938bddc..bc002d4 100644 --- a/contracts/DODODrops/DODODropsV2/DropsERC1155.sol +++ b/contracts/DODODrops/DODODropsV2/DropsERC1155.sol @@ -10,10 +10,12 @@ pragma experimental ABIEncoderV2; import {ERC1155} from "../../external/ERC1155/ERC1155.sol"; import {InitializableOwnable} from "../../lib/InitializableOwnable.sol"; +import {Strings} from "../../external/utils/Strings.sol"; contract DropsERC1155 is ERC1155, InitializableOwnable { + using Strings for uint256; + mapping (address => bool) public _IS_ALLOWED_MINT_; - mapping (uint256 => string) private _tokenURIs; string internal _baseUri = ""; // ============ Event ============= @@ -43,25 +45,11 @@ contract DropsERC1155 is ERC1155, InitializableOwnable { _mint(account, id, amount, data); } - function batchSetTokenURI(uint256[] calldata ids, string[] calldata urls) external onlyOwner { - require(ids.length == urls.length, "NOT_MATCH"); - for(uint256 i = 0; i < ids.length; i++) { - _setTokenURI(ids[i], urls[i]); - } - } - function uri(uint256 tokenId) public view override returns (string memory) { - string memory _tokenURI = _tokenURIs[tokenId]; - string memory base = _baseUri; + string memory baseURI = _baseUri; - if (bytes(base).length == 0) { - return _tokenURI; - } - - return string(abi.encodePacked(base, _tokenURI)); - } - - function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal { - _tokenURIs[tokenId] = _tokenURI; + return bytes(baseURI).length > 0 + ? string(abi.encodePacked(baseURI, tokenId.toString())) + : ''; } } \ No newline at end of file diff --git a/contracts/DODODrops/DODODropsV2/DropsERC721.sol b/contracts/DODODrops/DODODropsV2/DropsERC721.sol index 576f6f8..97d93ca 100644 --- a/contracts/DODODrops/DODODropsV2/DropsERC721.sol +++ b/contracts/DODODrops/DODODropsV2/DropsERC721.sol @@ -8,10 +8,10 @@ pragma solidity 0.6.9; pragma experimental ABIEncoderV2; -import {ERC721URIStorage} from "../../external/ERC721/ERC721URIStorage.sol"; +import {ERC721Enumerable} from "../../external/ERC721/ERC721Enumerable.sol"; import {InitializableOwnable} from "../../lib/InitializableOwnable.sol"; -contract DropsERC721 is ERC721URIStorage, InitializableOwnable { +contract DropsERC721 is ERC721Enumerable, InitializableOwnable { mapping (address => bool) public _IS_ALLOWED_MINT_; // ============ Event ============= @@ -44,11 +44,4 @@ contract DropsERC721 is ERC721URIStorage, InitializableOwnable { require(_IS_ALLOWED_MINT_[msg.sender], "restricted"); _mint(to, tokenId); } - - function batchSetTokenURI(uint256[] calldata ids, string[] calldata urls) external onlyOwner { - require(ids.length == urls.length, "NOT_MATCH"); - for(uint256 i = 0; i < ids.length; i++) { - _setTokenURI(ids[i], urls[i]); - } - } } \ No newline at end of file diff --git a/contracts/GeneralizedFragment/impl/Fragment.sol b/contracts/GeneralizedFragment/impl/Fragment.sol index c963cdd..79e62f5 100644 --- a/contracts/GeneralizedFragment/impl/Fragment.sol +++ b/contracts/GeneralizedFragment/impl/Fragment.sol @@ -13,14 +13,14 @@ import {DecimalMath} from "../../lib/DecimalMath.sol"; import {IDVM} from "../../DODOVendingMachine/intf/IDVM.sol"; import {IDODOCallee} from "../../intf/IDODOCallee.sol"; import {IERC20} from "../../intf/IERC20.sol"; -import {InitializableERC20} from "../../external/ERC20/InitializableERC20.sol"; +import {InitializableFragERC20} from "../../external/ERC20/InitializableFragERC20.sol"; import {ICollateralVault} from "../../CollateralVault/intf/ICollateralVault.sol"; interface IBuyoutModel { function getBuyoutStatus(address fragAddr, address user) external view returns (int); } -contract Fragment is InitializableERC20 { +contract Fragment is InitializableFragERC20 { using SafeMath for uint256; using SafeERC20 for IERC20; @@ -77,8 +77,7 @@ contract Fragment is InitializableERC20 { // init FRAG meta data name = string(abi.encodePacked("DODO_FRAG_", _symbol)); symbol = string(abi.encodePacked("d_", _symbol)); - decimals = 18; - super.init(address(this), _totalSupply, name, symbol, decimals); + super.init(address(this), _totalSupply, name, symbol); // init FRAG distribution uint256 vaultPreOwnerBalance = DecimalMath.mulFloor(_totalSupply, ownerRatio); diff --git a/contracts/external/ERC20/InitializableFragERC20.sol b/contracts/external/ERC20/InitializableFragERC20.sol new file mode 100644 index 0000000..63f3495 --- /dev/null +++ b/contracts/external/ERC20/InitializableFragERC20.sol @@ -0,0 +1,92 @@ +/* + + Copyright 2020 DODO ZOO. + SPDX-License-Identifier: Apache-2.0 + +*/ + +pragma solidity 0.6.9; + +import {SafeMath} from "../../lib/SafeMath.sol"; + +contract InitializableFragERC20 { + using SafeMath for uint256; + + string public name; + string public symbol; + uint256 public totalSupply; + + bool public initialized; + + mapping(address => uint256) internal balances; + mapping(address => mapping(address => uint256)) internal allowed; + + event Transfer(address indexed from, address indexed to, uint256 amount); + event Approval(address indexed owner, address indexed spender, uint256 amount); + + function init( + address _creator, + uint256 _totalSupply, + string memory _name, + string memory _symbol + ) public { + require(!initialized, "TOKEN_INITIALIZED"); + initialized = true; + totalSupply = _totalSupply; + balances[_creator] = _totalSupply; + name = _name; + symbol = _symbol; + emit Transfer(address(0), _creator, _totalSupply); + } + + function decimals() public view returns (uint8) { + return 18; + } + + function transfer(address to, uint256 amount) public returns (bool) { + _transfer(msg.sender, to, amount); + return true; + } + + function balanceOf(address owner) public view returns (uint256 balance) { + return balances[owner]; + } + + function transferFrom( + address from, + address to, + uint256 amount + ) public returns (bool) { + require(to != address(0), "TO_ADDRESS_IS_EMPTY"); + require(amount <= balances[from], "BALANCE_NOT_ENOUGH"); + require(amount <= allowed[from][msg.sender], "ALLOWANCE_NOT_ENOUGH"); + + balances[from] = balances[from].sub(amount); + balances[to] = balances[to].add(amount); + allowed[from][msg.sender] = allowed[from][msg.sender].sub(amount); + emit Transfer(from, to, amount); + return true; + } + + function approve(address spender, uint256 amount) public returns (bool) { + allowed[msg.sender][spender] = amount; + emit Approval(msg.sender, spender, amount); + return true; + } + + function allowance(address owner, address spender) public view returns (uint256) { + return allowed[owner][spender]; + } + + function _transfer(address sender, address recipient, uint256 amount) internal { + require(sender != address(0), "FROM_ADDRESS_IS_EMPTY"); + require(recipient != address(0), "TO_ADDRESS_IS_EMPTY"); + require(amount <= balances[sender], "BALANCE_NOT_ENOUGH"); + + balances[sender] = balances[sender].sub(amount); + balances[recipient] = balances[recipient].add(amount); + + emit Transfer(sender, recipient, amount); + } + +} diff --git a/migrations/6_deploy_dropsV2.js b/migrations/6_deploy_dropsV2.js index 8580f9c..ae6ab34 100644 --- a/migrations/6_deploy_dropsV2.js +++ b/migrations/6_deploy_dropsV2.js @@ -33,16 +33,18 @@ module.exports = async (deployer, network, accounts) => { //配置信息 var isProb = false; - var isReveal = true; + var isReveal = false; var curTime = Math.floor(new Date().getTime() / 1000) - var baseUri = "" + var baseUri = "https://ipfs.io/ipfs/QmTTdGzUGkhQwZX8F6v3GEw9cJP3feaP69tuk41ZN2gqfR/" var name = "DROPS" var symbol = "DROPS" - var buyToken = CONFIG.DODO //DODO - var sellTimeIntervals = [curTime + 60 * 60 * 12, curTime + 60 * 60 * 24 * 2, curTime + 60 * 60 * 24 * 4] - var sellPrices = ["1000000000000000000", "2000000000000000000", "0"] - var sellAmount = [30, 50, 0] - var redeemTime = curTime + 60 * 60 * 12 + // var buyToken = CONFIG.DODO //DODO + var buyToken = "0x0aDCBAE18580120667f7Ff6c6451A426B13c67B7" //USDT Rinkeby + var sellTimeIntervals = [curTime + 60 * 60 * 0.1, curTime + 60 * 60 * 24 * 10, curTime + 60 * 60 * 24 * 20] + var sellPrices = ["1000000", "3000000", "0"] + var sellAmount = [500, 626, 0] + var redeemTime = curTime + 60 * 60 * 0.1 + var probIntervals = [4, 10, 50, 100, 105] var tokenIdMaps = [ [0], @@ -51,10 +53,11 @@ module.exports = async (deployer, network, accounts) => { [6, 7], [19, 30, 35, 40] ] + var tokenIdList = [] - for (var i = 0; i < 80; i++) { - tokenIdList.push(i + 1); - } + // for (var i = 1; i <= 300; i++) { + // tokenIdList.push(i); + // } if (deploySwitch.Drops_V2) { logger.log("===================================================="); @@ -148,17 +151,34 @@ module.exports = async (deployer, network, accounts) => { if (isProb) { const DropsERC1155Instance = await DropsERC1155.at(DropsERC1155Address); - var tx = await DropsERC1155Instance.addMintAccount(DropsProxyAddress); + var tx = await DropsERC1155Instance.addMintAccount(DODODropsAddress); logger.log("AddMinter DropsERC1155 Tx:", tx.tx); await DODODropsInstance.setProbInfo(probIntervals, tokenIdMaps); } else { const DropsERC721Instance = await DropsERC721.at(DropsERC721Address); - var tx = await DropsERC721Instance.addMintAccount(DropsProxyAddress); + var tx = await DropsERC721Instance.addMintAccount(DODODropsAddress); logger.log("AddMinter DropsERC721 Tx:", tx.tx); - - await DODODropsInstance.setFixedAmountInfo(tokenIdList); + for (var i = 1; i <= 300; i++) { + tokenIdList.push(i); + } + await DODODropsInstance.addFixedAmountInfo(tokenIdList); + tokenIdList = [] + for (var i = 301; i <= 600; i++) { + tokenIdList.push(i); + } + await DODODropsInstance.addFixedAmountInfo(tokenIdList); + tokenIdList = [] + for (var i = 601; i <= 900; i++) { + tokenIdList.push(i); + } + await DODODropsInstance.addFixedAmountInfo(tokenIdList); + tokenIdList = [] + for (var i = 901; i <= 1126; i++) { + tokenIdList.push(i); + } + await DODODropsInstance.addFixedAmountInfo(tokenIdList); } } } diff --git a/package-lock.json b/package-lock.json index 4c42688..0811459 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,7 @@ "web3-eth-contract": "^1.2.8" }, "devDependencies": { - "@truffle/hdwallet-provider": "1.2.6", + "@truffle/hdwallet-provider": "1.4.0", "chai": "^4.2.0", "ganache-cli": "^6.9.1", "prettier": "^2.0.5", @@ -906,9 +906,9 @@ "dev": true }, "node_modules/@truffle/hdwallet-provider": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@truffle/hdwallet-provider/-/hdwallet-provider-1.2.6.tgz", - "integrity": "sha512-g4n1ETH2y7KlqQYq0PMjuHaLxggU96RSj1p3i6dGCAgONyPyA+TD1wyot8M2dXp+RG/VVzZoVTuyFGyBs5EhXw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@truffle/hdwallet-provider/-/hdwallet-provider-1.4.0.tgz", + "integrity": "sha512-zCc4IWEtfAuKWWktZOaYFoHCvameQIz5Bk+S2ahCPxYMlWECWrbCMjoqqLojB1Hyz+IsvU1cspmr3E6PoO4ZmQ==", "dev": true, "dependencies": { "@trufflesuite/web3-provider-engine": "15.0.13-1", @@ -916,7 +916,8 @@ "bindings": "^1.5.0", "ethereum-cryptography": "^0.1.3", "ethereum-protocol": "^1.0.1", - "ethereumjs-tx": "^1.0.0", + "ethereumjs-common": "^1.5.0", + "ethereumjs-tx": "^2.1.2", "ethereumjs-util": "^6.1.0", "ethereumjs-wallet": "^1.0.1" } @@ -930,6 +931,17 @@ "@types/node": "*" } }, + "node_modules/@truffle/hdwallet-provider/node_modules/ethereumjs-tx": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", + "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", + "deprecated": "New package name format for new versions: @ethereumjs/tx. Please update.", + "dev": true, + "dependencies": { + "ethereumjs-common": "^1.5.0", + "ethereumjs-util": "^6.0.0" + } + }, "node_modules/@truffle/hdwallet-provider/node_modules/ethereumjs-util": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", @@ -14238,9 +14250,9 @@ "dev": true }, "@truffle/hdwallet-provider": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@truffle/hdwallet-provider/-/hdwallet-provider-1.2.6.tgz", - "integrity": "sha512-g4n1ETH2y7KlqQYq0PMjuHaLxggU96RSj1p3i6dGCAgONyPyA+TD1wyot8M2dXp+RG/VVzZoVTuyFGyBs5EhXw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@truffle/hdwallet-provider/-/hdwallet-provider-1.4.0.tgz", + "integrity": "sha512-zCc4IWEtfAuKWWktZOaYFoHCvameQIz5Bk+S2ahCPxYMlWECWrbCMjoqqLojB1Hyz+IsvU1cspmr3E6PoO4ZmQ==", "dev": true, "requires": { "@trufflesuite/web3-provider-engine": "15.0.13-1", @@ -14248,7 +14260,8 @@ "bindings": "^1.5.0", "ethereum-cryptography": "^0.1.3", "ethereum-protocol": "^1.0.1", - "ethereumjs-tx": "^1.0.0", + "ethereumjs-common": "^1.5.0", + "ethereumjs-tx": "^2.1.2", "ethereumjs-util": "^6.1.0", "ethereumjs-wallet": "^1.0.1" }, @@ -14262,6 +14275,16 @@ "@types/node": "*" } }, + "ethereumjs-tx": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz", + "integrity": "sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw==", + "dev": true, + "requires": { + "ethereumjs-common": "^1.5.0", + "ethereumjs-util": "^6.0.0" + } + }, "ethereumjs-util": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", diff --git a/package.json b/package.json index 7e1714c..b8026a9 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "web3-eth-contract": "^1.2.8" }, "devDependencies": { - "@truffle/hdwallet-provider": "1.2.6", + "@truffle/hdwallet-provider": "1.4.0", "chai": "^4.2.0", "ganache-cli": "^6.9.1", "prettier": "^2.0.5", diff --git a/truffle-config.js b/truffle-config.js index 3670a8c..f9a1c12 100644 --- a/truffle-config.js +++ b/truffle-config.js @@ -96,6 +96,7 @@ module.exports = { networkCheckTimeout: 100000, provider: function () { return new HDWalletProvider(privKey, "https://rinkeby.infura.io/v3/" + infuraId); + // return new HDWalletProvider(privKey, "https://eth-rinkeby.dodoex.io/"); }, gas: 10000000, gasPrice: 1500000000,