diff --git a/contracts/Factory/CrowdPoolingFactory.sol b/contracts/Factory/CrowdPoolingFactory.sol index 88730b9..aa6979e 100644 --- a/contracts/Factory/CrowdPoolingFactory.sol +++ b/contracts/Factory/CrowdPoolingFactory.sol @@ -20,12 +20,11 @@ contract CrowdPoolingFactory is InitializableOwnable { // ============ Templates ============ address public immutable _CLONE_FACTORY_; - address public immutable _CP_TEMPLATE_; address public immutable _DVM_FACTORY_; - address public immutable _DEFAULT_MAINTAINER_; address public immutable _DEFAULT_MT_FEE_RATE_MODEL_; address public immutable _DEFAULT_PERMISSION_MANAGER_; + address public _CP_TEMPLATE_; uint256 public _X_ = 50; //default uint256 public _Y_ = 0; //default @@ -145,6 +144,10 @@ contract CrowdPoolingFactory is InitializableOwnable { } // ============ Owner Functions ============ + function updateCPTemplate(address _newCPTemplate) external onlyOwner { + _CP_TEMPLATE_ = _newCPTemplate; + } + function setXY(uint256 x,uint256 y) public onlyOwner { require(x>0&&x<=100,"CP_FACTORY : INVALID_X"); _X_=x; diff --git a/contracts/Factory/DPPFactory.sol b/contracts/Factory/DPPFactory.sol index bce9058..f1891ca 100644 --- a/contracts/Factory/DPPFactory.sol +++ b/contracts/Factory/DPPFactory.sol @@ -18,10 +18,10 @@ contract DPPFactory is InitializableOwnable { // ============ Templates ============ address public immutable _CLONE_FACTORY_; - address public immutable _DPP_TEMPLATE_; address public immutable _DEFAULT_MAINTAINER_; address public immutable _DEFAULT_MT_FEE_RATE_MODEL_; address public immutable _DODO_APPROVE_; + address public _DPP_TEMPLATE_; address public _DPP_ADMIN_TEMPLATE_; // ============ Registry ============ @@ -115,6 +115,10 @@ contract DPPFactory is InitializableOwnable { _DPP_ADMIN_TEMPLATE_ = _newDPPAdminTemplate; } + function updateDppTemplate(address _newDPPTemplate) external onlyOwner { + _DPP_TEMPLATE_ = _newDPPTemplate; + } + function addPoolByAdmin( address creator, address baseToken, diff --git a/contracts/Factory/DVMFactory.sol b/contracts/Factory/DVMFactory.sol index 560e5d1..2b091df 100644 --- a/contracts/Factory/DVMFactory.sol +++ b/contracts/Factory/DVMFactory.sol @@ -26,9 +26,9 @@ contract DVMFactory is InitializableOwnable { // ============ Templates ============ address public immutable _CLONE_FACTORY_; - address public immutable _DVM_TEMPLATE_; address public immutable _DEFAULT_MAINTAINER_; address public immutable _DEFAULT_MT_FEE_RATE_MODEL_; + address public _DVM_TEMPLATE_; // ============ Registry ============ @@ -88,6 +88,10 @@ contract DVMFactory is InitializableOwnable { // ============ Admin Operation Functions ============ + function updateDvmTemplate(address _newDVMTemplate) external onlyOwner { + _DVM_TEMPLATE_ = _newDVMTemplate; + } + function addPoolByAdmin( address creator, address baseToken, diff --git a/contracts/SmartRoute/DODOIncentive.sol b/contracts/SmartRoute/DODOIncentive.sol index e60f83c..4d40b05 100644 --- a/contracts/SmartRoute/DODOIncentive.sol +++ b/contracts/SmartRoute/DODOIncentive.sol @@ -16,6 +16,13 @@ interface IDODOIncentive { function triggerIncentive(address fromToken,address toToken, address assetTo) external; } + +/** + * @title DODOIncentive + * @author DODO Breeder + * + * @notice Trade Incentive in DODO platform + */ contract DODOIncentive is InitializableOwnable { using SafeMath for uint256; using SafeERC20 for IERC20; diff --git a/contracts/SmartRoute/DODOV2Proxy01.sol b/contracts/SmartRoute/DODOV2Proxy01.sol index a1fd3a1..88a481e 100644 --- a/contracts/SmartRoute/DODOV2Proxy01.sol +++ b/contracts/SmartRoute/DODOV2Proxy01.sol @@ -22,6 +22,7 @@ import {DecimalMath} from "../lib/DecimalMath.sol"; import {ReentrancyGuard} from "../lib/ReentrancyGuard.sol"; import {InitializableOwnable} from "../lib/InitializableOwnable.sol"; +//TODO: add gas return && trade incentive && replace DODOV1Proxy02 contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable { using SafeMath for uint256; using UniversalERC20 for IERC20; @@ -44,8 +45,7 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable address toToken, address sender, uint256 fromAmount, - uint256 returnAmount, - uint256 sourceFlag + uint256 returnAmount ); // ============ Modifiers ============ @@ -139,7 +139,7 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable function addDVMLiquidity( address dvmAddress, - address to, + address assetTo, uint256 baseInAmount, uint256 quoteInAmount, uint256 baseMinAmount, @@ -158,8 +158,9 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable uint256 quoteAdjustedInAmount ) { + address _dvm = dvmAddress; (baseAdjustedInAmount, quoteAdjustedInAmount) = _addDVMLiquidity( - dvmAddress, + _dvm, baseInAmount, quoteInAmount ); @@ -167,12 +168,11 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable baseAdjustedInAmount >= baseMinAmount && quoteAdjustedInAmount >= quoteMinAmount, "DODOV2Proxy01: deposit amount is not enough" ); - address _dvm = dvmAddress; _deposit(msg.sender, _dvm, IDODOV2(_dvm)._BASE_TOKEN_(), baseAdjustedInAmount, flag == 1); _deposit(msg.sender, _dvm, IDODOV2(_dvm)._QUOTE_TOKEN_(), quoteAdjustedInAmount, flag == 2); - (shares, , ) = IDODOV2(_dvm).buyShares(to); + (shares, , ) = IDODOV2(_dvm).buyShares(assetTo); // refund dust eth if (flag == 1 && msg.value > baseAdjustedInAmount) msg.sender.transfer(msg.value - baseAdjustedInAmount); if (flag == 2 && msg.value > quoteAdjustedInAmount) msg.sender.transfer(msg.value - quoteAdjustedInAmount); @@ -306,8 +306,10 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable judgeExpired(deadLine) returns (uint256 returnAmount) { + require(dodoPairs.length > 0, "DODOV2Proxy01: PAIRS_EMPTY"); + require(minReturnAmount > 0, "DODOV2Proxy01: RETURN_AMOUNT_ZERO"); + uint256 originToTokenBalance = IERC20(toToken).balanceOf(msg.sender); - IWETH(_WETH_).deposit{value: msg.value}(); IWETH(_WETH_).transfer(dodoPairs[0], msg.value); @@ -335,8 +337,7 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable toToken, assetTo, msg.value, - returnAmount, - 0 + returnAmount ); } @@ -354,6 +355,9 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable judgeExpired(deadLine) returns (uint256 returnAmount) { + require(dodoPairs.length > 0, "DODOV2Proxy01: PAIRS_EMPTY"); + require(minReturnAmount > 0, "DODOV2Proxy01: RETURN_AMOUNT_ZERO"); + IDODOApprove(_DODO_APPROVE_).claimTokens(fromToken, msg.sender, dodoPairs[0], fromTokenAmount); for (uint256 i = 0; i < dodoPairs.length; i++) { @@ -381,8 +385,7 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable _ETH_ADDRESS_, assetTo, fromTokenAmount, - returnAmount, - 0 + returnAmount ); } @@ -401,6 +404,9 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable judgeExpired(deadLine) returns (uint256 returnAmount) { + require(dodoPairs.length > 0, "DODOV2Proxy01: PAIRS_EMPTY"); + require(minReturnAmount > 0, "DODOV2Proxy01: RETURN_AMOUNT_ZERO"); + uint256 originToTokenBalance = IERC20(toToken).balanceOf(msg.sender); IDODOApprove(_DODO_APPROVE_).claimTokens(fromToken, msg.sender, dodoPairs[0], fromTokenAmount); @@ -427,8 +433,7 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable toToken, assetTo, fromTokenAmount, - returnAmount, - 0 + returnAmount ); } @@ -436,7 +441,7 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable address fromToken, address toToken, address approveTarget, - address to, + address swapTarget, uint256 fromTokenAmount, uint256 minReturnAmount, bytes memory callDataConcat, @@ -448,8 +453,9 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable judgeExpired(deadLine) returns (uint256 returnAmount) { + require(minReturnAmount > 0, "DODOV2Proxy01: RETURN_AMOUNT_ZERO"); + uint256 toTokenOriginBalance = IERC20(toToken).universalBalanceOf(msg.sender); - if (fromToken != _ETH_ADDRESS_) { IDODOApprove(_DODO_APPROVE_).claimTokens( fromToken, @@ -460,15 +466,10 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable IERC20(fromToken).universalApproveMax(approveTarget, fromTokenAmount); } - require(isWhiteListed[to], "DODOV2Proxy01: Not Whitelist Contract"); - (bool success, ) = to.call{value: fromToken == _ETH_ADDRESS_ ? msg.value : 0}(callDataConcat); + require(isWhiteListed[swapTarget], "DODOV2Proxy01: Not Whitelist Contract"); + (bool success, ) = swapTarget.call{value: fromToken == _ETH_ADDRESS_ ? msg.value : 0}(callDataConcat); - require(success, "DODOV2Proxy01: Contract Swap execution Failed"); - - IERC20(fromToken).universalTransfer( - msg.sender, - IERC20(fromToken).universalBalanceOf(address(this)) - ); + require(success, "DODOV2Proxy01: External Swap execution Failed"); IERC20(toToken).universalTransfer( msg.sender, @@ -483,8 +484,7 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable toToken, msg.sender, fromTokenAmount, - returnAmount, - 3 + returnAmount ); } @@ -535,7 +535,7 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable require(returnAmount >= minReturnAmount, "DODOV2Proxy01: Return amount is not enough"); IERC20(toToken).universalTransfer(msg.sender, returnAmount); - emit OrderHistory(fromToken, toToken, msg.sender, fromTokenAmount, returnAmount, 1); + emit OrderHistory(fromToken, toToken, msg.sender, fromTokenAmount, returnAmount); } function mixSwapV1( @@ -591,7 +591,7 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable returnAmount = IERC20(_toToken).universalBalanceOf(msg.sender).sub(toTokenOriginBalance); require(returnAmount >= minReturnAmount, "DODOV2Proxy01: Return amount is not enough"); - emit OrderHistory(_fromToken, _toToken, msg.sender, fromTokenAmount, returnAmount, 2); + emit OrderHistory(_fromToken, _toToken, msg.sender, fromTokenAmount, returnAmount); } //============ CrowdPooling Functions (create & bid) ============ diff --git a/contracts/SmartRoute/helper/DODOCalleeHelper.sol b/contracts/SmartRoute/helper/DODOCalleeHelper.sol index 1e1f1d3..caac55c 100644 --- a/contracts/SmartRoute/helper/DODOCalleeHelper.sol +++ b/contracts/SmartRoute/helper/DODOCalleeHelper.sol @@ -1,6 +1,7 @@ /* -Copyright 2020 DODO ZOO. -SPDX-License-Identifier: Apache-2.0 + + Copyright 2020 DODO ZOO. + SPDX-License-Identifier: Apache-2.0 */ diff --git a/contracts/SmartRoute/intf/IDODOV2Proxy01.sol b/contracts/SmartRoute/intf/IDODOV2Proxy01.sol index 0531511..51b93de 100644 --- a/contracts/SmartRoute/intf/IDODOV2Proxy01.sol +++ b/contracts/SmartRoute/intf/IDODOV2Proxy01.sol @@ -55,7 +55,7 @@ interface IDODOV2Proxy01 is IDODOV1Proxy01 { function addDVMLiquidity( address dvmAddress, - address to, + address assetTo, uint256 baseInAmount, uint256 quoteInAmount, uint256 baseMinAmount, diff --git a/deploy-detail-v1.5.txt b/deploy-detail-v1.5.txt index 3501322..301e4cc 100644 --- a/deploy-detail-v1.5.txt +++ b/deploy-detail-v1.5.txt @@ -74,3 +74,11 @@ DODOApprove Address: 0xa128Ba44B2738A558A1fdC06d6303d52D3Cef8c1 DODOProxyV1 Address: 0x0cA2d4BC266B1ad7a0787409AD7a0331D78Eea90 Set DODOProxyV1 Owner tx: 0x35c8405b4b4dfbac83971c622f4e086dc0f850ade69da408792eb9a835a683f4 Set DODOApprove Owner And Init Set Proxy tx: 0xb381ac8a87a834a6ab8cc63064153dd2c65261e7c43e5d1a504bcae11fb42a10 +==================================================== +network type: kovan +Deploy time: 2021/1/6 下午6:53:44 +Deploy type: Proxy +DODOApprove Address: 0xE0eE1f72c0Ce4097F204beBD3B7fF508fb26292D +DODOProxyV1 Address: 0xf63baBc984ff05374dBCF0367Eaa2333663f2262 +Set DODOProxyV1 Owner tx: 0x2d00a39ad1904a34b8baa7d6a69bc634ea2bc2cff0038bec79e922b7d0687e76 +Set DODOApprove Owner And Init Set Proxy tx: 0xf368e47b184b3f0db035fa7a0838eabc46e6f24d98bc44cb0b1b1b8c73e31561 \ No newline at end of file diff --git a/test/DPP/trader.test.ts b/test/DPP/trader.test.ts index 67a9286..b2b3b0f 100644 --- a/test/DPP/trader.test.ts +++ b/test/DPP/trader.test.ts @@ -70,7 +70,7 @@ describe("DPP Trader", () => { it("first buy and then sell", async () => { // buy at R=1 await ctx.transferQuoteToDPP(trader, decimalStr("100")) - await ctx.DPP.methods.sellQuote(trader).send(ctx.sendParam(trader)) + await logGas(ctx.DPP.methods.sellQuote(trader), ctx.sendParam(trader), "sellQuote - buy at R=1") var balances = await ctx.getBalances(trader) assert.equal(balances.traderBase, "10986174542266106307") @@ -82,7 +82,7 @@ describe("DPP Trader", () => { // buy at R>1 await ctx.transferQuoteToDPP(trader, decimalStr("100")) - await ctx.DPP.methods.sellQuote(trader).send(ctx.sendParam(trader)) + await logGas(ctx.DPP.methods.sellQuote(trader), ctx.sendParam(trader), "sellQuote - buy at R>1") balances = await ctx.getBalances(trader) assert.equal(balances.traderBase, "11946772292527553373") @@ -94,7 +94,7 @@ describe("DPP Trader", () => { // sell at R>1 and R not change state await ctx.transferBaseToDPP(trader, decimalStr("1")) - await ctx.DPP.methods.sellBase(trader).send(ctx.sendParam(trader)) + await logGas(ctx.DPP.methods.sellBase(trader), ctx.sendParam(trader), "sellBase - sell at R>1 and R not change state") balances = await ctx.getBalances(trader) assert.equal(balances.traderBase, "10946772292527553373") @@ -106,7 +106,7 @@ describe("DPP Trader", () => { // sell at R>1 and R change state await ctx.transferBaseToDPP(trader, decimalStr("2")) - await ctx.DPP.methods.sellBase(trader).send(ctx.sendParam(trader)) + await logGas(ctx.DPP.methods.sellBase(trader), ctx.sendParam(trader), "sellBase - sell at R>1 and R change state") balances = await ctx.getBalances(trader) assert.equal(balances.traderBase, "8946772292527553373") @@ -124,7 +124,7 @@ describe("DPP Trader", () => { it("first sell and then buy", async () => { // sell at R=1 await ctx.transferBaseToDPP(trader, decimalStr("1")) - await ctx.DPP.methods.sellBase(trader).send(ctx.sendParam(trader)) + await logGas(ctx.DPP.methods.sellBase(trader), ctx.sendParam(trader), "sellBase - sell at R=1") var balances = await ctx.getBalances(trader) assert.equal(balances.traderBase, decimalStr("9")) @@ -136,7 +136,7 @@ describe("DPP Trader", () => { // buy at R>1 await ctx.transferBaseToDPP(trader, decimalStr("1")) - await ctx.DPP.methods.sellBase(trader).send(ctx.sendParam(trader)) + await logGas(ctx.DPP.methods.sellBase(trader), ctx.sendParam(trader), "sellBase - buy at R>1") balances = await ctx.getBalances(trader) assert.equal(balances.traderBase, decimalStr("8")) @@ -148,7 +148,7 @@ describe("DPP Trader", () => { // sell at R>1 and R not change state await ctx.transferQuoteToDPP(trader, decimalStr("100")) - await ctx.DPP.methods.sellQuote(trader).send(ctx.sendParam(trader)) + await logGas(ctx.DPP.methods.sellQuote(trader), ctx.sendParam(trader), "sell at R>1 and R not change state") balances = await ctx.getBalances(trader) assert.equal(balances.traderBase, "9034218146510053391") @@ -160,7 +160,7 @@ describe("DPP Trader", () => { // sell at R>1 and R change state await ctx.transferQuoteToDPP(trader, decimalStr("200")) - await ctx.DPP.methods.sellQuote(trader).send(ctx.sendParam(trader)) + await logGas(ctx.DPP.methods.sellQuote(trader), ctx.sendParam(trader), "sell at R>1 and R change state") balances = await ctx.getBalances(trader) assert.equal(balances.traderBase, "11026382738483432812") diff --git a/test/Proxy/proxy.dpp.test.ts b/test/Proxy/proxy.dpp.test.ts index a3cfb15..4599efc 100644 --- a/test/Proxy/proxy.dpp.test.ts +++ b/test/Proxy/proxy.dpp.test.ts @@ -155,11 +155,11 @@ describe("DODOProxyV2.0", () => { // ); // }); - it("resetDPP", async () => { + it.only("resetDPP", async () => { var beforeState = await DPP_DODO_USDT.methods.getPMMState().call(); assert.equal(beforeState.K, config.k); - assert.equal(beforeState.B0, decimalStr("100000")); - assert.equal(beforeState.Q0, mweiStr("20000")); + assert.equal(beforeState.B, decimalStr("100000")); + assert.equal(beforeState.Q, mweiStr("20000")); await logGas(await ctx.DODOProxyV2.methods.resetDODOPrivatePool( dpp_DODO_USDT, [config.lpFeeRate, mweiStr("0.2"), decimalStr("0.2")], @@ -171,8 +171,8 @@ describe("DODOProxyV2.0", () => { ), ctx.sendParam(project), "resetDPP"); var afterState = await DPP_DODO_USDT.methods.getPMMState().call(); assert.equal(afterState.K, decimalStr("0.2")); - assert.equal(afterState.B0, decimalStr("101000")); - assert.equal(afterState.Q0, mweiStr("21000")); + assert.equal(afterState.B, decimalStr("101000")); + assert.equal(afterState.Q, mweiStr("21000")); });