diff --git a/contracts/DODOVendingMachine/impl/DVM.sol b/contracts/DODOVendingMachine/impl/DVM.sol index 5f95151..8d353e9 100644 --- a/contracts/DODOVendingMachine/impl/DVM.sol +++ b/contracts/DODOVendingMachine/impl/DVM.sol @@ -38,6 +38,8 @@ contract DVM is DVMTrader, DVMFunding { _GAS_PRICE_LIMIT_ = IExternalValue(gasPriceSource); _MAINTAINER_ = maintainer; _I_ = i; + + require(k > 0 && k <= 10**18); _K_ = k; string memory connect = "_"; diff --git a/test/DVM/AMMLikeCase.test.ts b/test/DVM/AMMLikeCase.test.ts new file mode 100644 index 0000000..01c6f98 --- /dev/null +++ b/test/DVM/AMMLikeCase.test.ts @@ -0,0 +1,162 @@ +/* + + Copyright 2020 DODO ZOO. + SPDX-License-Identifier: Apache-2.0 + +*/ + +// import * as assert from 'assert'; + +import { decimalStr, gweiStr } from '../utils/Converter'; +import { logGas } from '../utils/Log'; +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.approveProxy(lp); + await ctx.approveProxy(trader); + + await ctx.mintTestToken(lp, decimalStr("10"), decimalStr("1000")); + await ctx.mintTestToken(trader, decimalStr("10"), decimalStr("1000")); + + await ctx.DVMProxy.methods + .depositToDVM(ctx.DVM.options.address, lp, decimalStr("10"), decimalStr("1000")) + .send(ctx.sendParam(lp)); + + console.log("deposit") +} + +describe("AMMLikeCase", () => { + let snapshotId: string; + let ctx: DVMContext; + + before(async () => { + let AMMLikeDVMContextInitConfig = { + lpFeeRate: decimalStr("0.002"), + mtFeeRate: decimalStr("0.001"), + k: decimalStr("1"), + i: "1", + }; + 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 () => { + console.log(await ctx.DVM.methods.getMidPrice().call()) + console.log(await ctx.DVM.methods.getBase0().call()) + }) + + it("buy & sell", async () => { + + console.log("BASE0 before buy", await ctx.DVM.methods.getBase0().call()) + + // buy + await logGas(ctx.DVMProxy.methods.sellQuoteOnDVM(ctx.DVM.options.address, trader, decimalStr("200"), decimalStr("1")), ctx.sendParam(trader), "buy base token") + console.log("BASE0 after buy", await ctx.DVM.methods.getBase0().call()) + // trader balances + console.log( + await ctx.BASE.methods.balanceOf(trader).call(), + "11946763594380080787" + ); + console.log( + await ctx.QUOTE.methods.balanceOf(trader).call(), + decimalStr("800") + ); + // vault balances + console.log( + await ctx.BASE.methods.balanceOf(ctx.DVM.options.address).call(), + "8051283784161162863" + ); + console.log( + await ctx.QUOTE.methods.balanceOf(ctx.DVM.options.address).call(), + decimalStr("200") + ); + // maintainer balances + console.log( + await ctx.BASE.methods.balanceOf(ctx.Maintainer).call(), + "1952621458756350" + ); + console.log( + await ctx.QUOTE.methods.balanceOf(ctx.Maintainer).call(), + decimalStr("0") + ); + + // // sell + // await logGas(ctx.DVMProxy.methods.sellBaseOnDVM(ctx.DVM.options.address, trader, decimalStr("1"), decimalStr("100")), ctx.sendParam(trader), "sell base token") + // console.log("BASE0 after sell", await ctx.DVM.methods.getBase0().call()) + // // trader balances + // assert.equal( + // await ctx.BASE.methods.balanceOf(trader).call(), + // "10946763594380080787" + // ); + // assert.equal( + // await ctx.QUOTE.methods.balanceOf(trader).call(), + // "903421810640399874603" + // ); + // // vault balances + // assert.equal( + // await ctx.BASE.methods.balanceOf(ctx.DVM.options.address).call(), + // "9051283784161162863" + // ); + // assert.equal( + // await ctx.QUOTE.methods.balanceOf(ctx.DVM.options.address).call(), + // "96474456349930717298" + // ); + // // maintainer balances + // assert.equal( + // await ctx.BASE.methods.balanceOf(ctx.Maintainer).call(), + // "1952621458756350" + // ); + // assert.equal( + // await ctx.QUOTE.methods.balanceOf(ctx.Maintainer).call(), + // "103733009669408099" + // ); + + // // buy when quoet is not 0 + // await logGas(ctx.DVMProxy.methods.sellQuoteOnDVM(ctx.DVM.options.address, trader, decimalStr("200"), decimalStr("1")), ctx.sendParam(trader), "buy base token") + // assert.equal("BASE0 after second buy", await ctx.DVM.methods.getBase0().call()) + // // trader balances + // assert.equal( + // await ctx.BASE.methods.balanceOf(trader).call(), + // "12837528824326616018" + // ); + // assert.equal( + // await ctx.QUOTE.methods.balanceOf(trader).call(), + // "703421810640399874603" + // ); + // // vault balances + // assert.equal( + // await ctx.BASE.methods.balanceOf(ctx.DVM.options.address).call(), + // "7158622099620899913" + // ); + // assert.equal( + // await ctx.QUOTE.methods.balanceOf(ctx.DVM.options.address).call(), + // "296474456349930717298" + // ); + // // maintainer balances + // assert.equal( + // await ctx.BASE.methods.balanceOf(ctx.Maintainer).call(), + // "3849076052484069" + // ); + // assert.equal( + // await ctx.QUOTE.methods.balanceOf(ctx.Maintainer).call(), + // "103733009669408099" + // ); + }); + }); +}); diff --git a/test/DVM/trader.test.ts b/test/DVM/trader.test.ts index 4cce507..d9cba34 100644 --- a/test/DVM/trader.test.ts +++ b/test/DVM/trader.test.ts @@ -7,7 +7,7 @@ // import * as assert from 'assert'; -import { decimalStr } from '../utils/Converter'; +import { decimalStr, gweiStr } from '../utils/Converter'; import { logGas } from '../utils/Log'; import { DVMContext, getDVMContext } from '../utils/DVMContext'; import { assert } from 'chai'; @@ -49,12 +49,13 @@ describe("Trader", () => { }); describe("trade", () => { - // it.only("basic check", async () => { - // console.log(await ctx.DVM.methods.getPMMState().call()) - // console.log(await ctx.DVM.methods.getLpFeeRate(ctx.Deployer).call()) - // console.log(await ctx.DVM.methods.getMtFeeRate(ctx.Deployer).call()) - // console.log(await ctx.DVM.methods.querySellQuote(ctx.Deployer, decimalStr("200")).call()) - // }) + it.only("basic check", async () => { + console.log(await ctx.DVM.methods.getVaultReserve().call()) + console.log(await ctx.DVM.methods.getPMMState().call()) + console.log(await ctx.DVM.methods.getMidPrice().call()) + console.log(await ctx.DVM.methods.querySellQuote(ctx.Deployer, decimalStr("200")).call()) + }) + it("buy & sell", async () => { console.log("BASE0 before buy", await ctx.DVM.methods.getBase0().call()) @@ -123,7 +124,7 @@ describe("Trader", () => { // buy when quoet is not 0 await logGas(ctx.DVMProxy.methods.sellQuoteOnDVM(ctx.DVM.options.address, trader, decimalStr("200"), decimalStr("1")), ctx.sendParam(trader), "buy base token") - assert.equal("BASE0 after second buy", await ctx.DVM.methods.getBase0().call()) + console.log("BASE0 after second buy", await ctx.DVM.methods.getBase0().call()) // trader balances assert.equal( await ctx.BASE.methods.balanceOf(trader).call(), @@ -152,5 +153,15 @@ describe("Trader", () => { "103733009669408099" ); }); + + it("flash loan", async () => { + + }) + + it("revert cases", async () => { + await assert.fail( + ctx.DVMProxy.methods.sellQuoteOnDVM(ctx.DVM.options.address, trader, decimalStr("200"), decimalStr("1")).send({ from: trader, gas: 300000, gasPrice: gweiStr("200") }), /GAS_PRICE_EXCEED/ + ) + }) }); -}); +}); \ No newline at end of file