From 167634cd0c7821a165e16704d68d3be3650a5447 Mon Sep 17 00:00:00 2001 From: mingda Date: Tue, 1 Dec 2020 00:02:33 +0800 Subject: [PATCH] support k=0 case and fix test --- contracts/DODOPrivatePool/impl/DPPStorage.sol | 2 +- contracts/DODOVendingMachine/impl/DVM.sol | 4 +- .../DODOVendingMachine/impl/DVMFunding.sol | 2 +- test/DVM/AMMLikeCase.test.ts | 23 ++- test/DVM/ConstPriceCase.test.ts | 131 ++++++++++++++++++ test/DVM/funding.test.ts | 4 + 6 files changed, 149 insertions(+), 17 deletions(-) create mode 100644 test/DVM/ConstPriceCase.test.ts diff --git a/contracts/DODOPrivatePool/impl/DPPStorage.sol b/contracts/DODOPrivatePool/impl/DPPStorage.sol index 578859c..c06541c 100644 --- a/contracts/DODOPrivatePool/impl/DPPStorage.sol +++ b/contracts/DODOPrivatePool/impl/DPPStorage.sol @@ -127,7 +127,7 @@ contract DPPStorage is InitializableOwnable, ReentrancyGuard { function _checkIK() internal view { uint256 k = _K_.get(); uint256 i = _I_.get(); - require(k > 0 && k <= 1e18, "K_OUT_OF_RANGE"); + require(k <= 1e18, "K_OUT_OF_RANGE"); require(i > 0 && i <= 1e36, "I_OUT_OF_RANGE"); } } diff --git a/contracts/DODOVendingMachine/impl/DVM.sol b/contracts/DODOVendingMachine/impl/DVM.sol index a47ea18..a6987f1 100644 --- a/contracts/DODOVendingMachine/impl/DVM.sol +++ b/contracts/DODOVendingMachine/impl/DVM.sol @@ -38,7 +38,7 @@ contract DVM is DVMTrader, DVMFunding { require(i > 0 && i <= 10**36); _I_ = i; - require(k > 0 && k <= 10**18); + require(k <= 10**18); _K_ = k; _LP_FEE_RATE_MODEL_ = IFeeRateModel(lpFeeRateModel); @@ -64,7 +64,7 @@ contract DVM is DVMTrader, DVMFunding { // keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'), 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f, keccak256(bytes(name)), - keccak256(bytes('1')), + keccak256(bytes("1")), chainId, address(this) ) diff --git a/contracts/DODOVendingMachine/impl/DVMFunding.sol b/contracts/DODOVendingMachine/impl/DVMFunding.sol index 08fa562..3212430 100644 --- a/contracts/DODOVendingMachine/impl/DVMFunding.sol +++ b/contracts/DODOVendingMachine/impl/DVMFunding.sol @@ -75,7 +75,7 @@ contract DVMFunding is DVMVault { bytes calldata data, uint256 deadline ) external preventReentrant returns (uint256 baseAmount, uint256 quoteAmount) { - require(deadline >= block.timestamp, "DODOV2 DVMFUNDING: EXPIRED"); + require(deadline >= block.timestamp, "TIME_EXPIRED"); require(shareAmount <= _SHARES_[msg.sender], "DLP_NOT_ENOUGH"); uint256 baseBalance = _BASE_TOKEN_.balanceOf(address(this)); uint256 quoteBalance = _QUOTE_TOKEN_.balanceOf(address(this)); diff --git a/test/DVM/AMMLikeCase.test.ts b/test/DVM/AMMLikeCase.test.ts index 54c8087..3352868 100644 --- a/test/DVM/AMMLikeCase.test.ts +++ b/test/DVM/AMMLikeCase.test.ts @@ -55,39 +55,37 @@ describe("AMMLikeCase", () => { it("basic state", async () => { console.log(await ctx.DVM.methods.getMidPrice().call()) - console.log(await ctx.DVM.methods.getBase0().call()) }) it("buy", async () => { - - console.log("BASE0 before buy", await ctx.DVM.methods.getBase0().call()) - // buy await ctx.transferQuoteToDVM(trader, decimalStr("200")) await ctx.DVM.methods.sellQuote(trader).send(ctx.sendParam(trader)) - console.log("BASE0 after buy", await ctx.DVM.methods.getBase0().call()) + // trader balances assert.equal( await ctx.BASE.methods.balanceOf(trader).call(), - "11661666666528194443" + "11661666666528194445" ); assert.equal( await ctx.QUOTE.methods.balanceOf(trader).call(), decimalStr("800") ); + // vault balances assert.equal( await ctx.BASE.methods.balanceOf(ctx.DVM.options.address).call(), - "8336666666805277779" + "8336666666805277778" ); assert.equal( await ctx.QUOTE.methods.balanceOf(ctx.DVM.options.address).call(), decimalStr("1200") ); + // maintainer balances assert.equal( await ctx.BASE.methods.balanceOf(ctx.Maintainer).call(), - "1666666666527778" + "1666666666527777" ); assert.equal( await ctx.QUOTE.methods.balanceOf(ctx.Maintainer).call(), @@ -97,12 +95,9 @@ describe("AMMLikeCase", () => { it("sell", async () => { - console.log("BASE0 before sell", await ctx.DVM.methods.getBase0().call()) - // sell await ctx.transferBaseToDVM(trader, decimalStr("1")) await ctx.DVM.methods.sellBase(trader).send(ctx.sendParam(trader)) - console.log("BASE0 after sell", await ctx.DVM.methods.getBase0().call()) // trader balances assert.equal( @@ -111,8 +106,9 @@ describe("AMMLikeCase", () => { ); assert.equal( await ctx.QUOTE.methods.balanceOf(trader).call(), - "1090636363645427272727" + "1090636363645427272728" ); + // vault balances assert.equal( await ctx.BASE.methods.balanceOf(ctx.DVM.options.address).call(), @@ -122,6 +118,7 @@ describe("AMMLikeCase", () => { await ctx.QUOTE.methods.balanceOf(ctx.DVM.options.address).call(), "909272727263654545454" ); + // maintainer balances assert.equal( await ctx.BASE.methods.balanceOf(ctx.Maintainer).call(), @@ -129,7 +126,7 @@ describe("AMMLikeCase", () => { ); assert.equal( await ctx.QUOTE.methods.balanceOf(ctx.Maintainer).call(), - "90909090918181819" + "90909090918181818" ); }); }); diff --git a/test/DVM/ConstPriceCase.test.ts b/test/DVM/ConstPriceCase.test.ts new file mode 100644 index 0000000..00bf4d0 --- /dev/null +++ b/test/DVM/ConstPriceCase.test.ts @@ -0,0 +1,131 @@ +/* + + Copyright 2020 DODO ZOO. + SPDX-License-Identifier: Apache-2.0 + +*/ + +// import * as assert from 'assert'; + +import { decimalStr } from '../utils/Converter'; +import { DVMContext, getDVMContext } from '../utils/DVMContext'; +import { assert } from 'chai'; + +let lp: string; +let trader: string; + +async function init(ctx: DVMContext): Promise { + lp = ctx.SpareAccounts[0]; + trader = ctx.SpareAccounts[1]; + + await ctx.mintTestToken(lp, decimalStr("10"), decimalStr("1000")); + await ctx.mintTestToken(trader, decimalStr("10"), decimalStr("1000")); + + await ctx.transferBaseToDVM(lp, decimalStr("10")) + await ctx.transferQuoteToDVM(lp, decimalStr("1000")) + await ctx.DVM.methods.buyShares(lp).send(ctx.sendParam(lp)); +} + +describe("ConstPriceCase", () => { + let snapshotId: string; + let ctx: DVMContext; + + before(async () => { + let AMMLikeDVMContextInitConfig = { + lpFeeRate: decimalStr("0.002"), + mtFeeRate: decimalStr("0.001"), + k: "0", + i: decimalStr("100"), + }; + ctx = await getDVMContext(AMMLikeDVMContextInitConfig); + await init(ctx); + }); + + beforeEach(async () => { + snapshotId = await ctx.EVM.snapshot(); + }); + + afterEach(async () => { + await ctx.EVM.reset(snapshotId); + }); + + describe("trade", () => { + + it("basic state", async () => { + assert.equal(await ctx.DVM.methods.getMidPrice().call(), decimalStr("100")) + }) + + it("buy", async () => { + // buy + await ctx.transferQuoteToDVM(trader, decimalStr("200")) + await ctx.DVM.methods.sellQuote(trader).send(ctx.sendParam(trader)) + + // trader balances + assert.equal( + await ctx.BASE.methods.balanceOf(trader).call(), + decimalStr("11.994") + ); + assert.equal( + await ctx.QUOTE.methods.balanceOf(trader).call(), + decimalStr("800") + ); + + // vault balances + assert.equal( + await ctx.BASE.methods.balanceOf(ctx.DVM.options.address).call(), + decimalStr("8.004") + ); + assert.equal( + await ctx.QUOTE.methods.balanceOf(ctx.DVM.options.address).call(), + decimalStr("1200") + ); + + // maintainer balances + assert.equal( + await ctx.BASE.methods.balanceOf(ctx.Maintainer).call(), + decimalStr("0.002") + ); + assert.equal( + await ctx.QUOTE.methods.balanceOf(ctx.Maintainer).call(), + decimalStr("0") + ); + }); + + it("sell", async () => { + + // sell + await ctx.transferBaseToDVM(trader, decimalStr("1")) + await ctx.DVM.methods.sellBase(trader).send(ctx.sendParam(trader)) + + // trader balances + assert.equal( + await ctx.BASE.methods.balanceOf(trader).call(), + decimalStr("9") + ); + assert.equal( + await ctx.QUOTE.methods.balanceOf(trader).call(), + decimalStr("1099.7") + ); + + // vault balances + assert.equal( + await ctx.BASE.methods.balanceOf(ctx.DVM.options.address).call(), + decimalStr("11") + ); + assert.equal( + await ctx.QUOTE.methods.balanceOf(ctx.DVM.options.address).call(), + decimalStr("900.2") + ); + + // maintainer balances + assert.equal( + await ctx.BASE.methods.balanceOf(ctx.Maintainer).call(), + "0" + ); + assert.equal( + await ctx.QUOTE.methods.balanceOf(ctx.Maintainer).call(), + decimalStr("0.1") + ); + }); + }); +}); diff --git a/test/DVM/funding.test.ts b/test/DVM/funding.test.ts index fe16e8b..0807742 100644 --- a/test/DVM/funding.test.ts +++ b/test/DVM/funding.test.ts @@ -195,6 +195,10 @@ describe("Funding", () => { ctx.DVM.methods.sellShares(vaultShares, bob, 0, decimalStr("10000"), "0x", MAX_UINT256).send(ctx.sendParam(lp)), "WITHDRAW_NOT_ENOUGH" ) + await truffleAssert.reverts( + ctx.DVM.methods.sellShares(vaultShares, bob, 0, decimalStr("10000"), "0x", "0").send(ctx.sendParam(lp)), + "TIME_EXPIRED" + ) }) }) });