factory add template update && proxy fix
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) ============
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/*
|
||||
Copyright 2020 DODO ZOO.
|
||||
SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
Copyright 2020 DODO ZOO.
|
||||
SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
*/
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ interface IDODOV2Proxy01 is IDODOV1Proxy01 {
|
||||
|
||||
function addDVMLiquidity(
|
||||
address dvmAddress,
|
||||
address to,
|
||||
address assetTo,
|
||||
uint256 baseInAmount,
|
||||
uint256 quoteInAmount,
|
||||
uint256 baseMinAmount,
|
||||
|
||||
@@ -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
|
||||
@@ -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")
|
||||
|
||||
@@ -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"));
|
||||
});
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user