From 85ba335233baae7a19c968e8b913a9a346600953 Mon Sep 17 00:00:00 2001 From: owen05 Date: Fri, 9 Apr 2021 14:58:30 +0800 Subject: [PATCH] ing --- config/kovan-config.js | 11 +-- .../impl/NFTCollateralVault.sol | 9 +-- .../SmartRoute/helper/DODONFTRouteHelper.sol | 68 +++++++++++++++++++ contracts/SmartRoute/proxies/DODONFTProxy.sol | 3 +- deploy-nft.txt | 32 +++++++++ migrations/5_deploy_nft.js | 24 ++++++- test/DODONFT/nftMainFlow.test.ts | 39 ++++++++++- 7 files changed, 172 insertions(+), 14 deletions(-) create mode 100644 contracts/SmartRoute/helper/DODONFTRouteHelper.sol diff --git a/config/kovan-config.js b/config/kovan-config.js index 0f334bc..17da4a3 100644 --- a/config/kovan-config.js +++ b/config/kovan-config.js @@ -65,13 +65,14 @@ module.exports = { ConstFeeRateModel: "0xBDAcEcF886a4F0C509260d9678D5673C3E8fa4b7", FeeDistributor: "0x989F9eFaA19c6A06945Db4439b9a7935dD573A66", Fragment: "0x36ed21f19B0cf0c1E571A8C3A6953a5778E48B5a", - NFTCollateralVault: "0x78B7AFf2E5fA95B1E7E16679645FB65a850ed6AB", + NFTCollateralVault: "0x5a317a617FBF89d55bBfe40A76E526FCD74E4545", + DODONFTRouteHelper: "0xAE683548702be6d651e179e5F9313272bb18596A", - InitializableERC721: "", - InitializableERC1155: "", - NFTTokenFactory: "", + InitializableERC721: "0x7563414479593394460d1bbaFE2Fc3E29D804007", + InitializableERC1155: "0xb971B0df71fB1778351F25a0e3bfe0C3eF06E1d1", + NFTTokenFactory: "0x38c109aF4f3454172BA4eecf5676aA213b589e75", DODONFTRegistry: "0xF405372b7808363DCfbb5Eb81204889B7a69Aa3e", - DODONFTProxy: "0x41Eb1FFC3d6474Ee4f4Aaf335a09cD411ADDDf1f", + DODONFTProxy: "0x41c5eDe987bd61c75925Ab2657256D75270a55D4", } } \ No newline at end of file diff --git a/contracts/CollateralVault/impl/NFTCollateralVault.sol b/contracts/CollateralVault/impl/NFTCollateralVault.sol index 7944c5e..f6136b2 100644 --- a/contracts/CollateralVault/impl/NFTCollateralVault.sol +++ b/contracts/CollateralVault/impl/NFTCollateralVault.sol @@ -13,9 +13,10 @@ import {IERC721} from "../../intf/IERC721.sol"; import {IERC721Receiver} from "../../intf/IERC721Receiver.sol"; import {IERC1155} from "../../intf/IERC1155.sol"; import {IERC1155Receiver} from "../../intf/IERC1155Receiver.sol"; +import {ReentrancyGuard} from "../../lib/ReentrancyGuard.sol"; -contract NFTCollateralVault is InitializableOwnable, IERC721Receiver, IERC1155Receiver { +contract NFTCollateralVault is InitializableOwnable, IERC721Receiver, IERC1155Receiver,ReentrancyGuard { using SafeMath for uint256; // ============ Storage ============ @@ -51,11 +52,11 @@ contract NFTCollateralVault is InitializableOwnable, IERC721Receiver, IERC1155Re emit OwnershipTransferred(_OWNER_, newOwner); } - function createFragment(address nftProxy, bytes calldata data) external onlyOwner { + function createFragment(address nftProxy, bytes calldata data) external preventReentrant onlyOwner { require(nftProxy != address(0), "DODONftVault: PROXY_INVALID"); _OWNER_ = nftProxy; - (bool success, ) = nftProxy.call(data); - require(success, "DODONftVault: TRANSFER_OWNER_FAILED"); + nftProxy.call(data); + // require(success, "DODONftVault: TRANSFER_OWNER_FAILED"); emit OwnershipTransferred(_OWNER_, nftProxy); emit CreateFragment(); } diff --git a/contracts/SmartRoute/helper/DODONFTRouteHelper.sol b/contracts/SmartRoute/helper/DODONFTRouteHelper.sol new file mode 100644 index 0000000..80ed426 --- /dev/null +++ b/contracts/SmartRoute/helper/DODONFTRouteHelper.sol @@ -0,0 +1,68 @@ +/* + + Copyright 2020 DODO ZOO. + SPDX-License-Identifier: Apache-2.0 + +*/ + +pragma solidity 0.6.9; +pragma experimental ABIEncoderV2; + +import {IDODOV2} from "../intf/IDODOV2.sol"; + +contract DODONFTRouteHelper { + address public immutable _NFT_REGISTER_; + + struct PairDetail { + uint256 i; + uint256 K; + uint256 B; + uint256 Q; + uint256 B0; + uint256 Q0; + uint256 R; + uint256 lpFeeRate; + uint256 mtFeeRate; + address baseToken; + address quoteToken; + address curPair; + uint256 pairVersion; + } + + constructor(address nftRegistry) public { + _NFT_REGISTER_ = nftRegistry; + } + + function getPairDetail(address token0,address token1,address userAddr) external view returns (PairDetail[] memory res) { + (address[] memory baseToken0DVM, address[] memory baseToken1DVM) = IDODOV2(_NFT_REGISTER_).getDODOPoolBidirection(token0,token1); + uint256 len = baseToken0DVM.length + baseToken1DVM.length; + res = new PairDetail[](len); + for(uint8 i = 0; i < len; i++) { + PairDetail memory curRes = PairDetail(0,0,0,0,0,0,0,0,0,address(0),address(0),address(0),2); + address cur; + if(i < baseToken0DVM.length) { + cur = baseToken0DVM[i]; + curRes.baseToken = token0; + curRes.quoteToken = token1; + } else { + cur = baseToken1DVM[i - baseToken0DVM.length]; + curRes.baseToken = token1; + curRes.quoteToken = token0; + } + + ( + curRes.i, + curRes.K, + curRes.B, + curRes.Q, + curRes.B0, + curRes.Q0, + curRes.R + ) = IDODOV2(cur).getPMMStateForCall(); + + (curRes.lpFeeRate, curRes.mtFeeRate) = IDODOV2(cur).getUserFeeRate(userAddr); + curRes.curPair = cur; + res[i] = curRes; + } + } +} \ No newline at end of file diff --git a/contracts/SmartRoute/proxies/DODONFTProxy.sol b/contracts/SmartRoute/proxies/DODONFTProxy.sol index a47f1e1..c7afaa4 100644 --- a/contracts/SmartRoute/proxies/DODONFTProxy.sol +++ b/contracts/SmartRoute/proxies/DODONFTProxy.sol @@ -94,7 +94,8 @@ contract DODONFTProxy is ReentrancyGuard, InitializableOwnable { ICollateralVault(newVault).init(msg.sender, name, baseURI); emit CreateNFTCollateralVault(msg.sender, newVault, name, baseURI); } - + + //Stake 碎片 function createFragment( address quoteToken, address vaultPreOwner, diff --git a/deploy-nft.txt b/deploy-nft.txt index 4ca49ca..ae97240 100644 --- a/deploy-nft.txt +++ b/deploy-nft.txt @@ -26,3 +26,35 @@ Deploy type: NFT multiSigAddress: 0x7e83d9d94837eE82F0cc18a691da6f42F03F1d86 DODOApproveProxy unlockAddProxy tx: 0xfda8786e258102a264db7642e6dcdd86780f30747eb3fc8f9bea2db7dfa8aefa DODOApproveProxy addDODOProxy tx: 0x899bfa16da6c91141e120bb00687c614fbbe8181bdbcb027315fcc0c9a9a76c5 +==================================================== +network type: kovan +Deploy time: 2021/4/9 上午9:59:52 +Deploy type: NFT +multiSigAddress: 0x7e83d9d94837eE82F0cc18a691da6f42F03F1d86 +==================================================== +network type: kovan +Deploy time: 2021/4/9 上午10:06:22 +Deploy type: NFT +multiSigAddress: 0x7e83d9d94837eE82F0cc18a691da6f42F03F1d86 +ERC721Address: 0x7563414479593394460d1bbaFE2Fc3E29D804007 +ERC1155Address: 0xb971B0df71fB1778351F25a0e3bfe0C3eF06E1d1 +NFTTokenFactoryAddress: 0x38c109aF4f3454172BA4eecf5676aA213b589e75 +DODONFTRouteHelperAddress: 0xAE683548702be6d651e179e5F9313272bb18596A +DODOApproveProxy unlockAddProxy tx: 0xd95d184faf652a03e2e7261d352fbf6586d9720d687da356f71a601423f58442 +DODOApproveProxy addDODOProxy tx: 0x379ae35106f43b77488adce056f37903f035c1a372a1b6ec64adbe9eaeef8b2d +==================================================== +network type: kovan +Deploy time: 2021/4/9 下午2:35:06 +Deploy type: NFT +multiSigAddress: 0x7e83d9d94837eE82F0cc18a691da6f42F03F1d86 +NFTTokenFactoryAddress: 0x0Fb11568CE1Ca7ED643C7ccb249331e19F3742b0 +==================================================== +network type: kovan +Deploy time: 2021/4/9 下午2:37:51 +Deploy type: NFT +multiSigAddress: 0x7e83d9d94837eE82F0cc18a691da6f42F03F1d86 +NFTCollateralVaultAddress: 0x5a317a617FBF89d55bBfe40A76E526FCD74E4545 +DODONFTProxyAddress: 0x41c5eDe987bd61c75925Ab2657256D75270a55D4 +Init DODONFTProxyAddress Tx: 0x8193cc72ebbc27e024d44f25cad6bb74def48130339f4ab589989dbb6a157ad6 +DODOApproveProxy unlockAddProxy tx: 0xef8154df211142848d99cbd5c80410ca32fa4503b9715642aa463c0d77aecdc8 +DODOApproveProxy addDODOProxy tx: 0x01ec3075e3bc5a27f2cd8eeb0a8d86b2aad7f80981fd48fc6fcb3bc527ebcb61 diff --git a/migrations/5_deploy_nft.js b/migrations/5_deploy_nft.js index 0e2eb95..2c77f58 100644 --- a/migrations/5_deploy_nft.js +++ b/migrations/5_deploy_nft.js @@ -11,6 +11,7 @@ const Fragment = artifacts.require("Fragment"); const FeeDistributor = artifacts.require("FeeDistributor"); const DODONFTRegistry = artifacts.require("DODONFTRegistry"); const DODONFTProxy = artifacts.require("DODONFTProxy"); +const DODONFTRouteHelper = artifacts.require("DODONFTRouteHelper"); const InitializableERC721 = artifacts.require("InitializableERC721"); const InitializableERC1155 = artifacts.require("InitializableERC1155"); @@ -31,6 +32,7 @@ module.exports = async (deployer, network, accounts) => { let FeeDistributorAddress = CONFIG.FeeDistributor; let FragmentAddress = CONFIG.Fragment; let NFTCollateralVaultAddress = CONFIG.NFTCollateralVault; + let DODONFTRouteHelperAddress = CONFIG.DODONFTRouteHelper; let DODONFTRegistryAddress = CONFIG.DODONFTRegistry; let DODONFTProxyAddress = CONFIG.DODONFTProxy; @@ -81,13 +83,31 @@ module.exports = async (deployer, network, accounts) => { const DODONFTRegistrynstance = await DODONFTRegistry.at(DODONFTRegistryAddress); var tx = await DODONFTRegistrynstance.initOwner(multiSigAddress); logger.log("Init DODONFTRegistryAddress Tx:", tx.tx); + + await deployer.deploy( + DODONFTRouteHelper, + DODONFTRegistryAddress + ); + DODONFTRouteHelperAddress = DODONFTRouteHelper.address; + logger.log("DODONFTRouteHelperAddress: ", DODONFTRouteHelperAddress); + } + + + //DODONFTRouteHelper + if (DODONFTRouteHelperAddress == "") { + await deployer.deploy( + DODONFTRouteHelper, + DODONFTRegistryAddress + ); + DODONFTRouteHelperAddress = DODONFTRouteHelper.address; + logger.log("DODONFTRouteHelperAddress: ", DODONFTRouteHelperAddress); } //Vault if (NFTCollateralVaultAddress == "") { await deployer.deploy(NFTCollateralVault); - NFTTokenFactoryAddress = NFTCollateralVault.address; - logger.log("NFTTokenFactoryAddress: ", NFTTokenFactoryAddress); + NFTCollateralVaultAddress = NFTCollateralVault.address; + logger.log("NFTCollateralVaultAddress: ", NFTCollateralVaultAddress); } //Frag diff --git a/test/DODONFT/nftMainFlow.test.ts b/test/DODONFT/nftMainFlow.test.ts index 396dfb5..a67d65e 100644 --- a/test/DODONFT/nftMainFlow.test.ts +++ b/test/DODONFT/nftMainFlow.test.ts @@ -85,8 +85,43 @@ describe("DODONFT", () => { assert(nftInfo.tokenId, '0') }); - it("createFragment", async () => { - + it.only("createFragment", async () => { + var erc721Address = await createERC721(ctx); + var vaultAddress = await createNFTVault(ctx); + var nftVaultInstance = contracts.getContractWithAddress(contracts.NFT_VAULT, vaultAddress); + var erc721Instance = contracts.getContractWithAddress(contracts.ERC721, erc721Address); + await erc721Instance.methods.safeTransferFrom(author, vaultAddress, 0).send(ctx.sendParam(author)); + + var quoteToken = ctx.USDT.options.address; + var vaultPreOwner = author; + var stakeToken = "0x0000000000000000000000000000000000000000"; + var dvmParams = [ + "0", + "10000000000000000", + "1000000", + "1000000000000000000" + ]; + var fragParams = [ + "100000000000000000000000000", + "200000000000000000", + "1617976800" + ] + var isOpenTwap = false + var callData = ctx.NFTProxy.methods.createFragment( + quoteToken, + vaultPreOwner, + stakeToken, + dvmParams, + fragParams, + isOpenTwap + ).encodeABI(); + console.log("data:",callData); + + await logGas(await nftVaultInstance.methods.createFragment( + ctx.NFTProxy.options.address, + callData + ), ctx.sendParam(author), "createFragment"); + }); it("stakeToFeeDistributor", async () => {