cp audit-fix && update event
This commit is contained in:
@@ -74,22 +74,22 @@ contract CPFunding is CPStorage {
|
||||
address _poolBaseToken;
|
||||
address _poolQuoteToken;
|
||||
uint256 _poolI;
|
||||
if (poolQuote == baseDepth) {
|
||||
if (poolQuote.mul(_UNUSED_BASE_) == poolQuote.add(ownerQuote).mul(poolBase)) {
|
||||
_poolBaseToken = address(_BASE_TOKEN_);
|
||||
_poolQuoteToken = address(_QUOTE_TOKEN_);
|
||||
_poolI = 1;
|
||||
} else if (poolQuote < baseDepth) {
|
||||
} else if (poolQuote.mul(_UNUSED_BASE_) < poolQuote.add(ownerQuote).mul(poolBase)) {
|
||||
// poolI up round
|
||||
_poolBaseToken = address(_BASE_TOKEN_);
|
||||
_poolQuoteToken = address(_QUOTE_TOKEN_);
|
||||
uint256 ratio = DecimalMath.ONE.sub(DecimalMath.divCeil(poolQuote, baseDepth));
|
||||
uint256 ratio = DecimalMath.ONE.sub(DecimalMath.divFloor(poolQuote, baseDepth));
|
||||
_poolI = avgPrice.mul(ratio).mul(ratio).divCeil(DecimalMath.ONE2);
|
||||
} else if (poolQuote > baseDepth) {
|
||||
} else if (poolQuote.mul(_UNUSED_BASE_) > poolQuote.add(ownerQuote).mul(poolBase)) {
|
||||
// poolI down round
|
||||
_poolBaseToken = address(_QUOTE_TOKEN_);
|
||||
_poolQuoteToken = address(_BASE_TOKEN_);
|
||||
uint256 ratio = DecimalMath.ONE.sub(DecimalMath.divFloor(baseDepth, poolQuote));
|
||||
_poolI = DecimalMath.reciprocalFloor(avgPrice).mul(ratio).mul(ratio).div(
|
||||
uint256 ratio = DecimalMath.ONE.sub(DecimalMath.divCeil(baseDepth, poolQuote));
|
||||
_poolI = ratio.mul(ratio).div(avgPrice).div(
|
||||
DecimalMath.ONE2
|
||||
);
|
||||
}
|
||||
@@ -113,7 +113,7 @@ contract CPFunding is CPStorage {
|
||||
|
||||
// in case something wrong with base token contract
|
||||
function emergencySettle() external phaseSettlement preventReentrant {
|
||||
require(block.timestamp > _PHASE_CALM_ENDTIME_.add(_SETTLEMENT_EXPIRE_), "NOT_EMERGENCY");
|
||||
require(block.timestamp >= _PHASE_CALM_ENDTIME_.add(_SETTLEMENT_EXPIRE_), "NOT_EMERGENCY");
|
||||
_settle();
|
||||
_UNUSED_QUOTE_ = _QUOTE_TOKEN_.balanceOf(address(this));
|
||||
_UNUSED_BASE_ = _BASE_TOKEN_.balanceOf(address(this));
|
||||
|
||||
@@ -27,6 +27,13 @@ contract DPPTrader is DPPVault {
|
||||
address trader
|
||||
);
|
||||
|
||||
event DODOFlashLoan(
|
||||
address borrower,
|
||||
address assetTo,
|
||||
uint256 baseAmount,
|
||||
uint256 quoteAmount
|
||||
);
|
||||
|
||||
// ============ Modifiers ============
|
||||
|
||||
modifier isBuyAllow(address trader) {
|
||||
@@ -77,7 +84,7 @@ contract DPPTrader is DPPVault {
|
||||
address(_QUOTE_TOKEN_),
|
||||
baseInput,
|
||||
receiveQuoteAmount,
|
||||
tx.origin
|
||||
msg.sender
|
||||
);
|
||||
}
|
||||
|
||||
@@ -113,7 +120,7 @@ contract DPPTrader is DPPVault {
|
||||
address(_BASE_TOKEN_),
|
||||
quoteInput,
|
||||
receiveBaseAmount,
|
||||
tx.origin
|
||||
msg.sender
|
||||
);
|
||||
}
|
||||
|
||||
@@ -160,7 +167,7 @@ contract DPPTrader is DPPVault {
|
||||
address(_BASE_TOKEN_),
|
||||
quoteInput,
|
||||
receiveBaseAmount,
|
||||
tx.origin
|
||||
msg.sender
|
||||
);
|
||||
}
|
||||
|
||||
@@ -186,11 +193,13 @@ contract DPPTrader is DPPVault {
|
||||
address(_QUOTE_TOKEN_),
|
||||
baseInput,
|
||||
receiveQuoteAmount,
|
||||
tx.origin
|
||||
msg.sender
|
||||
);
|
||||
}
|
||||
|
||||
_sync();
|
||||
|
||||
emit DODOFlashLoan(msg.sender, assetTo, baseAmount, quoteAmount);
|
||||
}
|
||||
|
||||
// ============ Query Functions ============
|
||||
|
||||
@@ -23,7 +23,10 @@ contract DPPVault is DPPStorage {
|
||||
|
||||
// ============ Events ============
|
||||
|
||||
event Reset();
|
||||
event Reset(
|
||||
uint256 newLpFeeRate,
|
||||
uint256 newMtFeeRate
|
||||
);
|
||||
|
||||
// ============ View Functions ============
|
||||
|
||||
@@ -32,6 +35,16 @@ contract DPPVault is DPPStorage {
|
||||
quoteReserve = _QUOTE_RESERVE_;
|
||||
}
|
||||
|
||||
function getUserFeeRate(address user) external view returns (uint256 lpFeeRate, uint256 mtFeeRate) {
|
||||
lpFeeRate = _LP_FEE_RATE_MODEL_.getFeeRate(user);
|
||||
mtFeeRate = _MT_FEE_RATE_MODEL_.getFeeRate(user);
|
||||
}
|
||||
|
||||
function getUserTradePermission(address user) external view returns (bool isBuyAllow, bool isSellAllow) {
|
||||
isBuyAllow = (!_BUYING_CLOSE_ && _TRADE_PERMISSION_.isAllowed(user));
|
||||
isSellAllow = (!_SELLING_CLOSE_ && _TRADE_PERMISSION_.isAllowed(user));
|
||||
}
|
||||
|
||||
// ============ Get Input ============
|
||||
|
||||
function getBaseInput() public view returns (uint256 input) {
|
||||
@@ -75,7 +88,7 @@ contract DPPVault is DPPStorage {
|
||||
_transferQuoteOut(assetTo, quoteOutAmount);
|
||||
_resetTargetAndReserve();
|
||||
_checkIK();
|
||||
emit Reset();
|
||||
emit Reset(newLpFeeRate, newMtFeeRate);
|
||||
}
|
||||
|
||||
function _setRState() internal {
|
||||
|
||||
@@ -15,11 +15,11 @@ import {IDODOCallee} from "../../intf/IDODOCallee.sol";
|
||||
contract DVMFunding is DVMVault {
|
||||
// ============ Events ============
|
||||
|
||||
event BuyShares(address indexed to, uint256 increaseShares, uint256 totalShares);
|
||||
event BuyShares(address to, uint256 increaseShares, uint256 totalShares);
|
||||
|
||||
event SellShares(
|
||||
address indexed payer,
|
||||
address indexed to,
|
||||
address payer,
|
||||
address to,
|
||||
uint256 decreaseShares,
|
||||
uint256 totalShares
|
||||
);
|
||||
|
||||
@@ -28,6 +28,13 @@ contract DVMTrader is DVMVault {
|
||||
address trader
|
||||
);
|
||||
|
||||
event DODOFlashLoan(
|
||||
address borrower,
|
||||
address assetTo,
|
||||
uint256 baseAmount,
|
||||
uint256 quoteAmount
|
||||
);
|
||||
|
||||
// ============ Modifiers ============
|
||||
|
||||
modifier isBuyAllow(address trader) {
|
||||
@@ -70,7 +77,7 @@ contract DVMTrader is DVMVault {
|
||||
address(_QUOTE_TOKEN_),
|
||||
baseInput,
|
||||
receiveQuoteAmount,
|
||||
tx.origin
|
||||
msg.sender
|
||||
);
|
||||
}
|
||||
|
||||
@@ -94,7 +101,7 @@ contract DVMTrader is DVMVault {
|
||||
address(_BASE_TOKEN_),
|
||||
quoteInput,
|
||||
receiveBaseAmount,
|
||||
tx.origin
|
||||
msg.sender
|
||||
);
|
||||
}
|
||||
|
||||
@@ -112,7 +119,7 @@ contract DVMTrader is DVMVault {
|
||||
|
||||
uint256 baseBalance = _BASE_TOKEN_.balanceOf(address(this));
|
||||
uint256 quoteBalance = _QUOTE_TOKEN_.balanceOf(address(this));
|
||||
|
||||
|
||||
// no input -> pure loss
|
||||
require(
|
||||
baseBalance >= _BASE_RESERVE_ || quoteBalance >= _QUOTE_RESERVE_,
|
||||
@@ -147,11 +154,13 @@ contract DVMTrader is DVMVault {
|
||||
address(_QUOTE_TOKEN_),
|
||||
baseInput,
|
||||
receiveQuoteAmount,
|
||||
tx.origin
|
||||
msg.sender
|
||||
);
|
||||
}
|
||||
|
||||
_sync();
|
||||
|
||||
emit DODOFlashLoan(msg.sender, assetTo, baseAmount, quoteAmount);
|
||||
}
|
||||
|
||||
// ============ Query Functions ============
|
||||
|
||||
@@ -35,6 +35,16 @@ contract DVMVault is DVMStorage {
|
||||
quoteReserve = _QUOTE_RESERVE_;
|
||||
}
|
||||
|
||||
function getUserFeeRate(address user) external view returns (uint256 lpFeeRate, uint256 mtFeeRate) {
|
||||
lpFeeRate = _LP_FEE_RATE_MODEL_.getFeeRate(user);
|
||||
mtFeeRate = _MT_FEE_RATE_MODEL_.getFeeRate(user);
|
||||
}
|
||||
|
||||
function getUserTradePermission(address user) external view returns (bool isBuyAllow, bool isSellAllow) {
|
||||
isBuyAllow = (!_BUYING_CLOSE_ && _TRADE_PERMISSION_.isAllowed(user));
|
||||
isSellAllow = (!_SELLING_CLOSE_ && _TRADE_PERMISSION_.isAllowed(user));
|
||||
}
|
||||
|
||||
// ============ Asset In ============
|
||||
|
||||
function getBaseInput() public view returns (uint256 input) {
|
||||
|
||||
@@ -35,9 +35,9 @@ contract CrowdPoolingFactory {
|
||||
// ============ Events ============
|
||||
|
||||
event NewCP(
|
||||
address indexed baseToken,
|
||||
address indexed quoteToken,
|
||||
address indexed creator,
|
||||
address baseToken,
|
||||
address quoteToken,
|
||||
address creator,
|
||||
address cp
|
||||
);
|
||||
|
||||
|
||||
@@ -38,10 +38,12 @@ contract DPPFactory is InitializableOwnable {
|
||||
// ============ Events ============
|
||||
|
||||
event NewDPP(
|
||||
address indexed baseToken,
|
||||
address indexed quoteToken,
|
||||
address indexed creator,
|
||||
address dpp
|
||||
address baseToken,
|
||||
address quoteToken,
|
||||
address creator,
|
||||
address dpp,
|
||||
uint256 lpFeeRate,
|
||||
uint256 mtFeeRate
|
||||
);
|
||||
|
||||
// ============ Functions ============
|
||||
@@ -104,7 +106,7 @@ contract DPPFactory is InitializableOwnable {
|
||||
|
||||
_REGISTRY_[baseToken][quoteToken].push(dppAddress);
|
||||
_USER_REGISTRY_[creator].push(dppAddress);
|
||||
emit NewDPP(baseToken, quoteToken, creator, dppAddress);
|
||||
emit NewDPP(baseToken, quoteToken, creator, dppAddress, lpFeeRate, mtFeeRate);
|
||||
}
|
||||
|
||||
function _createFeeRateModel(address owner, uint256 feeRate)
|
||||
|
||||
@@ -10,7 +10,7 @@ pragma experimental ABIEncoderV2;
|
||||
|
||||
import {InitializableOwnable} from "../lib/InitializableOwnable.sol";
|
||||
import {ICloneFactory} from "../lib/CloneFactory.sol";
|
||||
import {IConstFeeRateModel} from "../lib/ConstFeeRateModel.sol";
|
||||
import {IFeeRateModel} from "../lib/FeeRateModel.sol";
|
||||
import {IDVM} from "../DODOVendingMachine/intf/IDVM.sol";
|
||||
import {IDVMAdmin} from "../DODOVendingMachine/intf/IDVMAdmin.sol";
|
||||
import {IPermissionManager} from "../lib/PermissionManager.sol";
|
||||
@@ -47,10 +47,12 @@ contract DVMFactory is InitializableOwnable {
|
||||
// ============ Events ============
|
||||
|
||||
event NewDVM(
|
||||
address indexed baseToken,
|
||||
address indexed quoteToken,
|
||||
address indexed creator,
|
||||
address dvm
|
||||
address baseToken,
|
||||
address quoteToken,
|
||||
address creator,
|
||||
address dvm,
|
||||
uint256 lpFeeRate,
|
||||
uint256 mtFeeRate
|
||||
);
|
||||
|
||||
// ============ Functions ============
|
||||
@@ -98,7 +100,7 @@ contract DVMFactory is InitializableOwnable {
|
||||
}
|
||||
_REGISTRY_[baseToken][quoteToken].push(newVendingMachine);
|
||||
_USER_REGISTRY_[creator].push(newVendingMachine);
|
||||
emit NewDVM(baseToken, quoteToken, creator, newVendingMachine);
|
||||
emit NewDVM(baseToken, quoteToken, creator, newVendingMachine, lpFeeRate, mtFeeRate);
|
||||
}
|
||||
|
||||
function _createFeeRateModel(address owner, uint256 feeRate)
|
||||
@@ -106,7 +108,7 @@ contract DVMFactory is InitializableOwnable {
|
||||
returns (address feeRateModel)
|
||||
{
|
||||
feeRateModel = ICloneFactory(_CLONE_FACTORY_).clone(_FEE_RATE_MODEL_TEMPLATE_);
|
||||
IConstFeeRateModel(feeRateModel).init(owner, feeRate);
|
||||
IFeeRateModel(feeRateModel).init(owner, feeRate);
|
||||
}
|
||||
|
||||
function _createPermissionManager(address owner) internal returns (address permissionManager) {
|
||||
|
||||
@@ -9,10 +9,6 @@ pragma solidity 0.6.9;
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
import {ICloneFactory} from "../lib/CloneFactory.sol";
|
||||
import {IConstFeeRateModel} from "../lib/ConstFeeRateModel.sol";
|
||||
import {IDVM} from "../DODOVendingMachine/intf/IDVM.sol";
|
||||
import {IDVMAdmin} from "../DODOVendingMachine/intf/IDVMAdmin.sol";
|
||||
import {IPermissionManager} from "../lib/PermissionManager.sol";
|
||||
import {InitializableERC20} from "../external/ERC20/InitializableERC20.sol";
|
||||
import {InitializableMintableERC20} from "../external/ERC20/InitializableMintableERC20.sol";
|
||||
|
||||
@@ -25,7 +21,7 @@ contract ERC20Factory {
|
||||
|
||||
// ============ Events ============
|
||||
|
||||
event NewERC20(address indexed erc20, address indexed creator, bool isMintable);
|
||||
event NewERC20(address erc20, address creator, bool isMintable);
|
||||
|
||||
// ============ Functions ============
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ pragma experimental ABIEncoderV2;
|
||||
|
||||
import {Ownable} from "../lib/Ownable.sol";
|
||||
import {ICloneFactory} from "../lib/CloneFactory.sol";
|
||||
import {IConstFeeRateModel} from "../lib/ConstFeeRateModel.sol";
|
||||
import {IFeeRateModel} from "../lib/FeeRateModel.sol";
|
||||
import {IDVM} from "../DODOVendingMachine/intf/IDVM.sol";
|
||||
import {IDVMAdmin} from "../DODOVendingMachine/intf/IDVMAdmin.sol";
|
||||
import {IPermissionManager} from "../lib/PermissionManager.sol";
|
||||
@@ -49,11 +49,12 @@ contract UnownedDVMFactory {
|
||||
|
||||
// ============ Events ============
|
||||
|
||||
event NewDVM(
|
||||
address indexed baseToken,
|
||||
address indexed quoteToken,
|
||||
address indexed creator,
|
||||
address dvm
|
||||
event NewUnOwnedDVM(
|
||||
address baseToken,
|
||||
address quoteToken,
|
||||
address creator,
|
||||
address dvm,
|
||||
uint256 lpFeeRate
|
||||
);
|
||||
|
||||
// ============ Functions ============
|
||||
@@ -102,7 +103,7 @@ contract UnownedDVMFactory {
|
||||
}
|
||||
_REGISTRY_[baseToken][quoteToken].push(newVendingMachine);
|
||||
_USER_REGISTRY_[creator].push(newVendingMachine);
|
||||
emit NewDVM(baseToken, quoteToken, creator, newVendingMachine);
|
||||
emit NewUnOwnedDVM(baseToken, quoteToken, creator, newVendingMachine, lpFeeRate);
|
||||
}
|
||||
|
||||
function _createFeeRateModel(address owner, uint256 feeRate)
|
||||
@@ -110,7 +111,7 @@ contract UnownedDVMFactory {
|
||||
returns (address feeRateModel)
|
||||
{
|
||||
feeRateModel = ICloneFactory(_CLONE_FACTORY_).clone(_FEE_RATE_MODEL_TEMPLATE_);
|
||||
IConstFeeRateModel(feeRateModel).init(owner, feeRate);
|
||||
IFeeRateModel(feeRateModel).init(owner, feeRate);
|
||||
}
|
||||
|
||||
// ============ View Functions ============
|
||||
|
||||
@@ -40,11 +40,12 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable
|
||||
// ============ Events ============
|
||||
|
||||
event OrderHistory(
|
||||
address indexed fromToken,
|
||||
address indexed toToken,
|
||||
address indexed sender,
|
||||
address fromToken,
|
||||
address toToken,
|
||||
address sender,
|
||||
uint256 fromAmount,
|
||||
uint256 returnAmount
|
||||
uint256 returnAmount,
|
||||
uint8 sourceFlag
|
||||
);
|
||||
|
||||
// ============ Modifiers ============
|
||||
@@ -342,7 +343,8 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable
|
||||
toToken,
|
||||
assetTo,
|
||||
msg.value,
|
||||
returnAmount
|
||||
returnAmount,
|
||||
0
|
||||
);
|
||||
}
|
||||
|
||||
@@ -387,7 +389,8 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable
|
||||
_ETH_ADDRESS_,
|
||||
assetTo,
|
||||
fromTokenAmount,
|
||||
returnAmount
|
||||
returnAmount,
|
||||
0
|
||||
);
|
||||
}
|
||||
|
||||
@@ -432,7 +435,8 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable
|
||||
toToken,
|
||||
assetTo,
|
||||
fromTokenAmount,
|
||||
returnAmount
|
||||
returnAmount,
|
||||
0
|
||||
);
|
||||
}
|
||||
|
||||
@@ -487,7 +491,8 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, InitializableOwnable
|
||||
toToken,
|
||||
msg.sender,
|
||||
fromTokenAmount,
|
||||
returnAmount
|
||||
returnAmount,
|
||||
3
|
||||
);
|
||||
}
|
||||
|
||||
@@ -538,7 +543,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);
|
||||
emit OrderHistory(fromToken, toToken, msg.sender, fromTokenAmount, returnAmount, 1);
|
||||
}
|
||||
|
||||
function mixSwapV1(
|
||||
@@ -594,7 +599,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);
|
||||
emit OrderHistory(_fromToken, _toToken, msg.sender, fromTokenAmount, returnAmount, 2);
|
||||
}
|
||||
|
||||
//============ CrowdPooling Functions (create & bid) ============
|
||||
|
||||
@@ -13,7 +13,7 @@ import {InitializableOwnable} from "./InitializableOwnable.sol";
|
||||
interface IPermissionManager {
|
||||
function initOwner(address) external;
|
||||
|
||||
function isAllowed(address) external returns (bool);
|
||||
function isAllowed(address) external view returns (bool);
|
||||
}
|
||||
|
||||
contract PermissionManager is InitializableOwnable {
|
||||
|
||||
@@ -66,3 +66,11 @@ network type: bsclive
|
||||
Deploy time: 2020/12/15 下午6:45:35
|
||||
Deploy type: Proxy
|
||||
DODOSwapCalcHelperAddress: 0xb0199C2c8ADF1E6c1e41De60A62E993406Cb8C02
|
||||
====================================================
|
||||
network type: bsclive
|
||||
Deploy time: 2020/12/16 上午10:40:39
|
||||
Deploy type: Proxy
|
||||
DODOApprove Address: 0xa128Ba44B2738A558A1fdC06d6303d52D3Cef8c1
|
||||
DODOProxyV1 Address: 0x0cA2d4BC266B1ad7a0787409AD7a0331D78Eea90
|
||||
Set DODOProxyV1 Owner tx: 0x35c8405b4b4dfbac83971c622f4e086dc0f850ade69da408792eb9a835a683f4
|
||||
Set DODOApprove Owner And Init Set Proxy tx: 0xb381ac8a87a834a6ab8cc63064153dd2c65261e7c43e5d1a504bcae11fb42a10
|
||||
|
||||
@@ -36,8 +36,7 @@ module.exports = async (deployer, network, accounts) => {
|
||||
DODOApproveAddress = "";
|
||||
chiAddress = "0x0000000000000000000000000000000000000000";
|
||||
DODOSwapCalcHelperAddress = "0xb0199C2c8ADF1E6c1e41De60A62E993406Cb8C02";
|
||||
//TODO:待生成替换
|
||||
ownerAddress = accounts[0];
|
||||
ownerAddress = "0x4073f2b9bB95774531b9e23d206a308c614A943a";
|
||||
} else return;
|
||||
|
||||
if (DEPLOY_ROUTE) {
|
||||
@@ -80,7 +79,7 @@ module.exports = async (deployer, network, accounts) => {
|
||||
logger.log("Set DODOApprove Owner And Init Set Proxy tx: ", tx.tx);
|
||||
|
||||
// var tx1 = await DODOProxyV1Instance.addWhiteList("0x111111125434b319222cdbf8c261674adb56f3ae");
|
||||
// var tx2 = await DODOProxyV1Instance.addWhiteList("0xf740b67da229f2f10bcbd38a7979992fcc71b8eb");
|
||||
// var tx2 = await DODOProxyV1Instance.addWhiteList("0xdef1c0ded9bec7f1a1670819833240f027b25eff");
|
||||
// logger.log("AddWhiteList tx1: ", tx1.tx);
|
||||
// logger.log("AddWhiteList tx2: ", tx2.tx);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user