From ad552cf969c57c254a1760aabb483d7a62afbb1e Mon Sep 17 00:00:00 2001 From: mingda Date: Sat, 11 Jul 2020 11:50:33 +0800 Subject: [PATCH] fix test --- test/Admin.test.ts | 2 +- test/DODOEthProxy.test.ts | 30 ++++++++++++++--- test/DODOZoo.test.ts | 10 ++++-- test/LiquidityProvider.test.ts | 60 ++++++++++++++++----------------- test/LongTailTokenlMode.test.ts | 6 ++-- test/StableCoinMode.test.ts | 8 ++--- test/Trader.test.ts | 60 ++++++++++++++++++--------------- test/utils/Context.ts | 6 ++-- 8 files changed, 108 insertions(+), 74 deletions(-) diff --git a/test/Admin.test.ts b/test/Admin.test.ts index 44080e5..400c00c 100644 --- a/test/Admin.test.ts +++ b/test/Admin.test.ts @@ -221,7 +221,7 @@ describe("Admin", () => { await ctx.DODO.methods.withdrawAllBase().send(ctx.sendParam(lp1)) await ctx.DODO.methods.withdrawAllQuote().send(ctx.sendParam(lp1)) assert.equal(await ctx.BASE.methods.balanceOf(lp1).call(), decimalStr("105")) - assert.equal(await ctx.QUOTE.methods.balanceOf(lp1).call(), "9540265973590798352834") + assert.equal(await ctx.QUOTE.methods.balanceOf(lp1).call(), "9540265973590798352835") }) it("final settlement revert cases", async () => { diff --git a/test/DODOEthProxy.test.ts b/test/DODOEthProxy.test.ts index db3e7d7..8be69d2 100644 --- a/test/DODOEthProxy.test.ts +++ b/test/DODOEthProxy.test.ts @@ -10,6 +10,7 @@ import * as contracts from "./utils/Contracts"; import * as assert from "assert" import { decimalStr, MAX_UINT256 } from './utils/Converter'; import { Contract } from "web3-eth-contract"; +import { logGas } from './utils/Log'; let lp: string let trader: string @@ -37,7 +38,6 @@ async function init(ctx: DODOContext): Promise { DODOEthProxy = await contracts.newContract(contracts.DODO_ETH_PROXY_CONTRACT_NAME, [ctx.DODOZoo.options.address, WETH.options.address]) - // env lp = ctx.spareAccounts[0] trader = ctx.spareAccounts[1] @@ -76,16 +76,38 @@ describe("DODO ETH PROXY", () => { describe("buy&sell eth directly", () => { it("buy", async () => { let buyAmount = "1" - await DODOEthProxy.methods.buyEthWith(ctx.QUOTE.options.address, decimalStr(buyAmount), decimalStr("200")).send(ctx.sendParam(trader)) + logGas(await DODOEthProxy.methods.buyEthWith(ctx.QUOTE.options.address, decimalStr(buyAmount), decimalStr("200")).send(ctx.sendParam(trader)), "buy with eth directly") assert.equal(await ctx.DODO.methods._BASE_BALANCE_().call(), decimalStr("8.999")) assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "898581839502056240973") ctx.Web3 }) it("sell", async () => { let sellAmount = "1" - await DODOEthProxy.methods.sellEthTo(ctx.QUOTE.options.address, decimalStr(sellAmount), decimalStr("50")).send(ctx.sendParam(trader, sellAmount)) + logGas(await DODOEthProxy.methods.sellEthTo(ctx.QUOTE.options.address, decimalStr(sellAmount), decimalStr("50")).send(ctx.sendParam(trader, sellAmount)), "sell to eth directly") assert.equal(await ctx.DODO.methods._BASE_BALANCE_().call(), decimalStr("11")) - assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "1098617454226610630664") + assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "1098617454226610630663") + }) + }) + + describe("withdraw eth directly", () => { + it("withdraw", async () => { + let baseLpTokenAddress = await ctx.DODO.methods._BASE_CAPITAL_TOKEN_().call() + let baseLpToken = contracts.getContractWithAddress(contracts.TEST_ERC20_CONTRACT_NAME, baseLpTokenAddress) + await baseLpToken.methods.approve(DODOEthProxy.options.address, MAX_UINT256).send(ctx.sendParam(lp)) + await DODOEthProxy.methods.withdrawEth(decimalStr("5"), ctx.QUOTE.options.address).send(ctx.sendParam(lp)) + + assert.equal(await ctx.DODO.methods.getLpBaseBalance(lp).call(), decimalStr("5")) + // console.log(await ctx.Web3.eth.getBalance(lp)) eth balance confirmed + }) + + it("withdraw all", async () => { + let baseLpTokenAddress = await ctx.DODO.methods._BASE_CAPITAL_TOKEN_().call() + let baseLpToken = contracts.getContractWithAddress(contracts.TEST_ERC20_CONTRACT_NAME, baseLpTokenAddress) + await baseLpToken.methods.approve(DODOEthProxy.options.address, MAX_UINT256).send(ctx.sendParam(lp)) + await DODOEthProxy.methods.withdrawAllEth(ctx.QUOTE.options.address).send(ctx.sendParam(lp)) + + assert.equal(await ctx.DODO.methods.getLpBaseBalance(lp).call(), "0") + // console.log(await ctx.Web3.eth.getBalance(lp)) eth balance confirmed }) }) diff --git a/test/DODOZoo.test.ts b/test/DODOZoo.test.ts index 83b0a0f..ce3ddd7 100644 --- a/test/DODOZoo.test.ts +++ b/test/DODOZoo.test.ts @@ -44,8 +44,8 @@ describe("DODO ZOO", () => { }) it("breed new dodo", async () => { - let newBase = await newContract(TEST_ERC20_CONTRACT_NAME) - let newQuote = await newContract(TEST_ERC20_CONTRACT_NAME) + let newBase = await newContract(TEST_ERC20_CONTRACT_NAME, ["AnotherBase", 18]) + let newQuote = await newContract(TEST_ERC20_CONTRACT_NAME, ["AnotherQuote", 18]) await assert.rejects( ctx.DODOZoo.methods.breedDODO(ctx.Supervisor, ctx.Maintainer, newBase.options.address, newQuote.options.address, ctx.ORACLE.options.address, "0", "0", "1", "0").send(ctx.sendParam(ctx.Maintainer)), /NOT_OWNER/ @@ -56,6 +56,8 @@ describe("DODO ZOO", () => { assert.equal(await newDODO.methods._BASE_TOKEN_().call(), newBase.options.address) assert.equal(await newDODO.methods._QUOTE_TOKEN_().call(), newQuote.options.address) + await newDODO.methods.claimOwnership().send(ctx.sendParam(ctx.Deployer)) + // could not init twice await assert.rejects( newDODO.methods.init(ctx.Supervisor, ctx.Maintainer, ctx.QUOTE.options.address, ctx.BASE.options.address, ctx.ORACLE.options.address, "0", "0", "1", "0").send(ctx.sendParam(ctx.Deployer)), @@ -63,6 +65,10 @@ describe("DODO ZOO", () => { ) }) + it("remove dodo", async () => { + await ctx.DODOZoo.methods.removeDODO(ctx.BASE.options.address, ctx.QUOTE.options.address).send(ctx.sendParam(ctx.Deployer)) + assert.equal(await ctx.DODOZoo.methods.getDODO(ctx.BASE.options.address, ctx.QUOTE.options.address).call(), "0x0000000000000000000000000000000000000000") + }) }) }) \ No newline at end of file diff --git a/test/LiquidityProvider.test.ts b/test/LiquidityProvider.test.ts index 658c318..95f7306 100644 --- a/test/LiquidityProvider.test.ts +++ b/test/LiquidityProvider.test.ts @@ -100,13 +100,13 @@ describe("LiquidityProvider", () => { // lp1 & lp2 would both have profit because the curve becomes flatter // but the withdraw penalty is greater than this free profit - assert.equal(await ctx.DODO.methods.getLpBaseBalance(lp1).call(), "10163234422929069690") + assert.equal(await ctx.DODO.methods.getLpBaseBalance(lp1).call(), "10163234422929069723") assert.equal(await ctx.DODO.methods.getLpQuoteBalance(lp1).call(), decimalStr("1000")) - assert.equal(await ctx.DODO.methods.getLpBaseBalance(lp2).call(), "5076114129127759275") + assert.equal(await ctx.DODO.methods.getLpBaseBalance(lp2).call(), "5076114129127759292") assert.equal(await ctx.DODO.methods.getLpQuoteBalance(lp2).call(), decimalStr("100")) - assert.equal(await ctx.DODO.methods.getWithdrawBasePenalty(decimalStr("5")).call(), "228507420047606043") + assert.equal(await ctx.DODO.methods.getWithdrawBasePenalty(decimalStr("5")).call(), "228507420047606093") assert.equal(await ctx.DODO.methods.getWithdrawQuotePenalty(decimalStr("100")).call(), "0") }) @@ -115,13 +115,13 @@ describe("LiquidityProvider", () => { await ctx.DODO.methods.depositQuote(decimalStr("1000")).send(ctx.sendParam(lp1)) await ctx.DODO.methods.buyBaseToken(decimalStr("5"), decimalStr("1000")).send(ctx.sendParam(trader)) - assert.equal(await ctx.DODO.methods.getWithdrawBasePenalty(decimalStr("4")).call(), "1065045389392391670") + assert.equal(await ctx.DODO.methods.getWithdrawBasePenalty(decimalStr("4")).call(), "1065045389392391665") assert.equal(await ctx.DODO.methods.getWithdrawQuotePenalty(decimalStr("100")).call(), "0") await ctx.DODO.methods.withdrawBase(decimalStr("4")).send(ctx.sendParam(lp1)) - assert.equal(await ctx.BASE.methods.balanceOf(lp1).call(), "92934954610607608330") - assert.equal(await ctx.DODO.methods._BASE_BALANCE_().call(), "2060045389392391670") - assert.equal(await ctx.DODO.methods._TARGET_BASE_TOKEN_AMOUNT_().call(), "7075045389392391670") + assert.equal(await ctx.BASE.methods.balanceOf(lp1).call(), "92934954610607608335") + assert.equal(await ctx.DODO.methods._BASE_BALANCE_().call(), "2060045389392391665") + assert.equal(await ctx.DODO.methods._TARGET_BASE_TOKEN_AMOUNT_().call(), "7075045389392391665") await ctx.DODO.methods.withdrawQuote(decimalStr("100")).send(ctx.sendParam(lp1)) assert.equal(await ctx.QUOTE.methods.balanceOf(lp1).call(), decimalStr("9100")) @@ -137,19 +137,19 @@ describe("LiquidityProvider", () => { await ctx.DODO.methods.sellBaseToken(decimalStr("5"), decimalStr("200")).send(ctx.sendParam(trader)) assert.equal(await ctx.DODO.methods.getLpBaseBalance(lp1).call(), decimalStr("10")) - assert.equal(await ctx.DODO.methods.getLpQuoteBalance(lp1).call(), "1000978629616255274293") + assert.equal(await ctx.DODO.methods.getLpQuoteBalance(lp1).call(), "1000978629616255276996") await ctx.DODO.methods.depositQuote(decimalStr("500")).send(ctx.sendParam(lp2)) await ctx.DODO.methods.depositBase(decimalStr("5")).send(ctx.sendParam(lp2)) assert.equal(await ctx.DODO.methods.getLpBaseBalance(lp1).call(), decimalStr("10")) - assert.equal(await ctx.DODO.methods.getLpQuoteBalance(lp1).call(), "1012529270910521748792") + assert.equal(await ctx.DODO.methods.getLpQuoteBalance(lp1).call(), "1012529270910521756641") assert.equal(await ctx.DODO.methods.getLpBaseBalance(lp2).call(), decimalStr("5")) - assert.equal(await ctx.DODO.methods.getLpQuoteBalance(lp2).call(), "505769674273013520099") + assert.equal(await ctx.DODO.methods.getLpQuoteBalance(lp2).call(), "505769674273013522654") assert.equal(await ctx.DODO.methods.getWithdrawBasePenalty(decimalStr("5")).call(), "0") - assert.equal(await ctx.DODO.methods.getWithdrawQuotePenalty(decimalStr("500")).call(), "17320315567279994599") + assert.equal(await ctx.DODO.methods.getWithdrawQuotePenalty(decimalStr("500")).call(), "17320315567280002300") }) it("withdraw", async () => { @@ -158,12 +158,12 @@ describe("LiquidityProvider", () => { await ctx.DODO.methods.sellBaseToken(decimalStr("5"), decimalStr("200")).send(ctx.sendParam(trader)) assert.equal(await ctx.DODO.methods.getWithdrawBasePenalty(decimalStr("4")).call(), "0") - assert.equal(await ctx.DODO.methods.getWithdrawQuotePenalty(decimalStr("100")).call(), "7389428846238898052") + assert.equal(await ctx.DODO.methods.getWithdrawQuotePenalty(decimalStr("100")).call(), "7389428846238900753") await ctx.DODO.methods.withdrawQuote(decimalStr("100")).send(ctx.sendParam(lp1)) - assert.equal(await ctx.QUOTE.methods.balanceOf(lp1).call(), "9092610571153761101948") - assert.equal(await ctx.DODO.methods._QUOTE_BALANCE_().call(), "447655402437037250886") - assert.equal(await ctx.DODO.methods._TARGET_QUOTE_TOKEN_AMOUNT_().call(), "908310739520405634819") + assert.equal(await ctx.QUOTE.methods.balanceOf(lp1).call(), "9092610571153761099247") + assert.equal(await ctx.DODO.methods._QUOTE_BALANCE_().call(), "447655402437037253588") + assert.equal(await ctx.DODO.methods._TARGET_QUOTE_TOKEN_AMOUNT_().call(), "908310739520405637520") await ctx.DODO.methods.withdrawBase(decimalStr("4")).send(ctx.sendParam(lp1)) assert.equal(await ctx.BASE.methods.balanceOf(lp1).call(), decimalStr("94")) @@ -181,12 +181,12 @@ describe("LiquidityProvider", () => { await ctx.setOraclePrice(decimalStr("80")); assert.equal(await ctx.DODO.methods.getLpBaseBalance(lp1).call(), decimalStr("10")) - assert.equal(await ctx.DODO.methods.getLpQuoteBalance(lp1).call(), "914362409397559034505") + assert.equal(await ctx.DODO.methods.getLpQuoteBalance(lp1).call(), "914362409397559037208") await ctx.setOraclePrice(decimalStr("120")) assert.equal(await ctx.DODO.methods.getLpBaseBalance(lp1).call(), decimalStr("10")) - assert.equal(await ctx.DODO.methods.getLpQuoteBalance(lp1).call(), "1085284653936129403614") + assert.equal(await ctx.DODO.methods.getLpQuoteBalance(lp1).call(), "1085284653936129406317") }) it("quote side lp don't has pnl when R is ABOVE ONE", async () => { @@ -201,7 +201,7 @@ describe("LiquidityProvider", () => { await ctx.setOraclePrice(decimalStr("120")) - assert.equal(await ctx.DODO.methods.getLpBaseBalance(lp1).call(), "9234731968726215538") + assert.equal(await ctx.DODO.methods.getLpBaseBalance(lp1).call(), "9234731968726215588") assert.equal(await ctx.DODO.methods.getLpQuoteBalance(lp1).call(), decimalStr("1000")) }) @@ -281,13 +281,13 @@ describe("LiquidityProvider", () => { await ctx.DODO.methods.sellBaseToken(decimalStr("1"), decimalStr("0")).send(ctx.sendParam(trader)) assert.equal(await ctx.DODO.methods._R_STATUS_().call(), "2") - assert.equal(await ctx.DODO.methods._TARGET_BASE_TOKEN_AMOUNT_().call(), "9234731968726215513") + assert.equal(await ctx.DODO.methods._TARGET_BASE_TOKEN_AMOUNT_().call(), "9234731968726215603") assert.equal(await ctx.DODO.methods._TARGET_QUOTE_TOKEN_AMOUNT_().call(), "1105993618321025490") await ctx.DODO.methods.depositQuote("1").send(ctx.sendParam(lp2)) - assert.equal(await ctx.DODO.methods.getQuoteCapitalBalanceOf(lp2).call(), "7221653398290522326") - assert.equal(await ctx.DODO.methods.getLpQuoteBalance(lp2).call(), "7221653398290522382") - assert.equal(await ctx.DODO.methods.getLpBaseBalance(lp1).call(), "9234731968726215513") + assert.equal(await ctx.DODO.methods.getQuoteCapitalBalanceOf(lp2).call(), "7221653398290521828") + assert.equal(await ctx.DODO.methods.getLpQuoteBalance(lp2).call(), "7221653398290521884") + assert.equal(await ctx.DODO.methods.getLpBaseBalance(lp1).call(), "9234731968726215603") }) it("single side deposit (base) & oracle change introduces profit", async () => { @@ -303,8 +303,8 @@ describe("LiquidityProvider", () => { assert.equal(await ctx.DODO.methods._TARGET_QUOTE_TOKEN_AMOUNT_().call(), "1105408308382702868") await ctx.DODO.methods.depositQuote("1").send(ctx.sendParam(lp2)) - assert.equal(await ctx.DODO.methods.getQuoteCapitalBalanceOf(lp2).call(), "21553269260529319697") - assert.equal(await ctx.DODO.methods.getLpQuoteBalance(lp2).call(), "21553269260529319725") + assert.equal(await ctx.DODO.methods.getQuoteCapitalBalanceOf(lp2).call(), "21553269260529319669") + assert.equal(await ctx.DODO.methods.getLpQuoteBalance(lp2).call(), "21553269260529319697") assert.equal(await ctx.DODO.methods.getLpBaseBalance(lp1).call(), "11138732839027528584") }) @@ -318,12 +318,12 @@ describe("LiquidityProvider", () => { assert.equal(await ctx.DODO.methods._R_STATUS_().call(), "1") assert.equal(await ctx.DODO.methods._TARGET_BASE_TOKEN_AMOUNT_().call(), "9980000000000000") - assert.equal(await ctx.DODO.methods._TARGET_QUOTE_TOKEN_AMOUNT_().call(), "914362409397559031579") + assert.equal(await ctx.DODO.methods._TARGET_QUOTE_TOKEN_AMOUNT_().call(), "914362409397559035414") await ctx.DODO.methods.depositBase("1").send(ctx.sendParam(lp2)) assert.equal(await ctx.DODO.methods.getBaseCapitalBalanceOf(lp2).call(), "10247647352975730") assert.equal(await ctx.DODO.methods.getLpBaseBalance(lp2).call(), "10247647352975730") - assert.equal(await ctx.DODO.methods.getLpQuoteBalance(lp1).call(), "914362409397559031579") + assert.equal(await ctx.DODO.methods.getLpQuoteBalance(lp1).call(), "914362409397559035414") }) it("deposit and withdraw immediately", async () => { @@ -334,13 +334,13 @@ describe("LiquidityProvider", () => { await ctx.DODO.methods.depositBase(decimalStr("5")).send(ctx.sendParam(lp2)) - assert.equal(await ctx.DODO.methods.getLpBaseBalance(lp1).call(), "10163234422929069690") - assert.equal(await ctx.DODO.methods.getLpBaseBalance(lp2).call(), "5076114129127759275") + assert.equal(await ctx.DODO.methods.getLpBaseBalance(lp1).call(), "10163234422929069723") + assert.equal(await ctx.DODO.methods.getLpBaseBalance(lp2).call(), "5076114129127759292") await ctx.DODO.methods.withdrawAllBase().send(ctx.sendParam(lp2)) - assert.equal(await ctx.BASE.methods.balanceOf(lp2).call(), "99841132414635941818") - assert.equal(await ctx.DODO.methods.getLpBaseBalance(lp1).call(), "10182702153814588570") + assert.equal(await ctx.BASE.methods.balanceOf(lp2).call(), "99841132414635941792") + assert.equal(await ctx.DODO.methods.getLpBaseBalance(lp1).call(), "10182702153814588648") }) }) diff --git a/test/LongTailTokenlMode.test.ts b/test/LongTailTokenlMode.test.ts index bdc7707..cc2d19d 100644 --- a/test/LongTailTokenlMode.test.ts +++ b/test/LongTailTokenlMode.test.ts @@ -63,19 +63,19 @@ describe("Trader", () => { // avg price = 12.475 await ctx.DODO.methods.buyBaseToken(decimalStr("1000"), decimalStr("100000")).send(ctx.sendParam(trader)) assert.equal(await ctx.BASE.methods.balanceOf(trader).call(), decimalStr("2000")) - assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "9975050000000000000020000") + assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "9975049999999999999970000") // 50% depth // avg price = 19.9 await ctx.DODO.methods.buyBaseToken(decimalStr("3000"), decimalStr("300000")).send(ctx.sendParam(trader)) assert.equal(await ctx.BASE.methods.balanceOf(trader).call(), decimalStr("5000")) - assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "9900500000000000000260000") + assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "9900499999999999999970000") // 80% depth // avg price = 49.6 await ctx.DODO.methods.buyBaseToken(decimalStr("3000"), decimalStr("300000")).send(ctx.sendParam(trader)) assert.equal(await ctx.BASE.methods.balanceOf(trader).call(), decimalStr("8000")) - assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "9603200000000000001130000") + assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "9603199999999999999970000") }) it("user has no pnl if buy and sell immediately", async () => { diff --git a/test/StableCoinMode.test.ts b/test/StableCoinMode.test.ts index c1bd248..204a88f 100644 --- a/test/StableCoinMode.test.ts +++ b/test/StableCoinMode.test.ts @@ -61,12 +61,12 @@ describe("Trader", () => { // 99.9% depth avg price 1.00010109 await ctx.DODO.methods.buyBaseToken(decimalStr("8990"), decimalStr("10000")).send(ctx.sendParam(trader)) assert.equal(await ctx.BASE.methods.balanceOf(trader).call(), decimalStr("19990")) - assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "8990031967821738650") + assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "8990031967806921648") // sell to 99.9% depth avg price 0.9999 await ctx.DODO.methods.sellBaseToken(decimalStr("19980"), decimalStr("19970")).send(ctx.sendParam(trader)) assert.equal(await ctx.BASE.methods.balanceOf(trader).call(), decimalStr("10")) - assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "19986992950440794519885") + assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "19986992950440794518402") }) it("huge sell trading amount", async () => { @@ -76,7 +76,7 @@ describe("Trader", () => { await ctx.DODO.methods.sellBaseToken(decimalStr("20000"), decimalStr("0")).send(ctx.sendParam(trader)) assert.equal(await ctx.BASE.methods.balanceOf(trader).call(), decimalStr("0")) - assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "19998999990001000029998") + assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "19998999990001000029997") }) it("huge buy trading amount", async () => { @@ -97,7 +97,7 @@ describe("Trader", () => { await ctx.DODO.methods.buyBaseToken(decimalStr("9990"), decimalStr("10000")).send(ctx.sendParam(trader)) // penalty only 0.2% even if withdraw make pool utilization rate raise to 99.5% - assert.equal(await ctx.DODO.methods.getWithdrawBasePenalty(decimalStr("5")).call(), "9981962500000000") + assert.equal(await ctx.DODO.methods.getWithdrawBasePenalty(decimalStr("5")).call(), "9981967500000000") }) }) }) \ No newline at end of file diff --git a/test/Trader.test.ts b/test/Trader.test.ts index 1fbbd59..58fcdb7 100644 --- a/test/Trader.test.ts +++ b/test/Trader.test.ts @@ -48,7 +48,7 @@ describe("Trader", () => { describe("R goes above ONE", () => { it("buy when R equals ONE", async () => { - logGas(await ctx.DODO.methods.buyBaseToken(decimalStr("1"), decimalStr("110")).send(ctx.sendParam(trader)), "buy base token") + logGas(await ctx.DODO.methods.buyBaseToken(decimalStr("1"), decimalStr("110")).send(ctx.sendParam(trader)), "buy base token when balanced") // trader balances assert.equal(await ctx.BASE.methods.balanceOf(trader).call(), decimalStr("11")) assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "898581839502056240973") @@ -58,25 +58,27 @@ describe("Trader", () => { // dodo balances assert.equal(await ctx.DODO.methods._BASE_BALANCE_().call(), decimalStr("8.999")) assert.equal(await ctx.DODO.methods._QUOTE_BALANCE_().call(), "1101418160497943759027") + // price update + assert.equal(await ctx.DODO.methods.getMidPrice().call(), "102353368821735563400") }) it("buy when R is ABOVE ONE", async () => { await ctx.DODO.methods.buyBaseToken(decimalStr("1"), decimalStr("110")).send(ctx.sendParam(trader)) - await ctx.DODO.methods.buyBaseToken(decimalStr("1"), decimalStr("130")).send(ctx.sendParam(trader)) + logGas(await ctx.DODO.methods.buyBaseToken(decimalStr("1"), decimalStr("130")).send(ctx.sendParam(trader)), "buy when R is ABOVE ONE") // trader balances assert.equal(await ctx.BASE.methods.balanceOf(trader).call(), decimalStr("12")) - assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "794367183433412077753") + assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "794367183433412077653") // 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")) // dodo balances assert.equal(await ctx.DODO.methods._BASE_BALANCE_().call(), decimalStr("7.998")) - assert.equal(await ctx.DODO.methods._QUOTE_BALANCE_().call(), "1205632816566587922247") + assert.equal(await ctx.DODO.methods._QUOTE_BALANCE_().call(), "1205632816566587922347") }) it("sell when R is ABOVE ONE", async () => { await ctx.DODO.methods.buyBaseToken(decimalStr("1"), decimalStr("110")).send(ctx.sendParam(trader)) - await ctx.DODO.methods.sellBaseToken(decimalStr("0.5"), decimalStr("40")).send(ctx.sendParam(trader)) + logGas(await ctx.DODO.methods.sellBaseToken(decimalStr("0.5"), decimalStr("40")).send(ctx.sendParam(trader)), "sell when R is ABOVE ONE") // trader balances assert.equal(await ctx.BASE.methods.balanceOf(trader).call(), decimalStr("10.5")) assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "949280846351657143136") @@ -90,7 +92,7 @@ describe("Trader", () => { it("sell when R is ABOVE ONE and RStatus back to ONE", async () => { await ctx.DODO.methods.buyBaseToken(decimalStr("1"), decimalStr("110")).send(ctx.sendParam(trader)) - await ctx.DODO.methods.sellBaseToken("1003002430889317763", decimalStr("90")).send(ctx.sendParam(trader)) + logGas(await ctx.DODO.methods.sellBaseToken("1003002430889317763", decimalStr("90")).send(ctx.sendParam(trader)), "sell when R is ABOVE ONE and RStatus back to ONE") // R status assert.equal(await ctx.DODO.methods._R_STATUS_().call(), "0") // trader balances @@ -109,18 +111,18 @@ describe("Trader", () => { it("sell when R is ABOVE ONE and RStatus becomes BELOW ONE", async () => { await ctx.DODO.methods.buyBaseToken(decimalStr("1"), decimalStr("110")).send(ctx.sendParam(trader)) - logGas(await ctx.DODO.methods.sellBaseToken(decimalStr("2"), decimalStr("90")).send(ctx.sendParam(trader)), "sell base token gas cost worst case") + logGas(await ctx.DODO.methods.sellBaseToken(decimalStr("2"), decimalStr("90")).send(ctx.sendParam(trader)), "sell when R is ABOVE ONE and RStatus becomes BELOW ONE [gas cost worst case]") // R status assert.equal(await ctx.DODO.methods._R_STATUS_().call(), "2") // trader balances assert.equal(await ctx.BASE.methods.balanceOf(trader).call(), decimalStr("9")) - assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "1098020621600061709145") + assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "1098020621600061709144") // maintainer balances assert.equal(await ctx.BASE.methods.balanceOf(ctx.Maintainer).call(), decimalStr("0.001")) assert.equal(await ctx.QUOTE.methods.balanceOf(ctx.Maintainer).call(), "200038898794388634") // dodo balances assert.equal(await ctx.DODO.methods._BASE_BALANCE_().call(), decimalStr("10.999")) - assert.equal(await ctx.DODO.methods._QUOTE_BALANCE_().call(), "901779339501143902221") + assert.equal(await ctx.DODO.methods._QUOTE_BALANCE_().call(), "901779339501143902222") // target status assert.equal(await ctx.DODO.methods._TARGET_BASE_TOKEN_AMOUNT_().call(), "10002002430889317763") assert.equal(await ctx.DODO.methods._TARGET_QUOTE_TOKEN_AMOUNT_().call(), "1000400077797588777268") @@ -129,82 +131,84 @@ describe("Trader", () => { describe("R goes below ONE", () => { it("sell when R equals ONE", async () => { - logGas(await ctx.DODO.methods.sellBaseToken(decimalStr("1"), decimalStr("90")).send(ctx.sendParam(trader)), "sell base token") + logGas(await ctx.DODO.methods.sellBaseToken(decimalStr("1"), decimalStr("90")).send(ctx.sendParam(trader)), "sell base token when balanced") // trader balances assert.equal(await ctx.BASE.methods.balanceOf(trader).call(), decimalStr("9")) - assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "1098617454226610630664") + assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "1098617454226610630663") // maintainer balances assert.equal(await ctx.BASE.methods.balanceOf(ctx.Maintainer).call(), "0") assert.equal(await ctx.QUOTE.methods.balanceOf(ctx.Maintainer).call(), "98914196817061816") // dodo balances assert.equal(await ctx.DODO.methods._BASE_BALANCE_().call(), decimalStr("11")) - assert.equal(await ctx.DODO.methods._QUOTE_BALANCE_().call(), "901283631576572307520") + assert.equal(await ctx.DODO.methods._QUOTE_BALANCE_().call(), "901283631576572307521") + // price update + assert.equal(await ctx.DODO.methods.getMidPrice().call(), "97736983274307939149") }) it("sell when R is BELOW ONE", async () => { await ctx.DODO.methods.sellBaseToken(decimalStr("3"), decimalStr("90")).send(ctx.sendParam(trader)) - await ctx.DODO.methods.sellBaseToken(decimalStr("3"), decimalStr("90")).send(ctx.sendParam(trader)) + logGas(await ctx.DODO.methods.sellBaseToken(decimalStr("3"), decimalStr("90")).send(ctx.sendParam(trader)), "sell when R is BELOW ONE") // trader balances assert.equal(await ctx.BASE.methods.balanceOf(trader).call(), decimalStr("4")) - assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "1535961012052716726546") + assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "1535961012052716726151") // maintainer balances assert.equal(await ctx.BASE.methods.balanceOf(ctx.Maintainer).call(), "0") assert.equal(await ctx.QUOTE.methods.balanceOf(ctx.Maintainer).call(), "537573733252474148") // dodo balances assert.equal(await ctx.DODO.methods._BASE_BALANCE_().call(), decimalStr("16")) - assert.equal(await ctx.DODO.methods._QUOTE_BALANCE_().call(), "463501414214030799306") + assert.equal(await ctx.DODO.methods._QUOTE_BALANCE_().call(), "463501414214030799701") }) it("buy when R is BELOW ONE", async () => { await ctx.DODO.methods.sellBaseToken(decimalStr("1"), decimalStr("90")).send(ctx.sendParam(trader)) - await ctx.DODO.methods.buyBaseToken(decimalStr("0.5"), decimalStr("60")).send(ctx.sendParam(trader)) + logGas(await ctx.DODO.methods.buyBaseToken(decimalStr("0.5"), decimalStr("60")).send(ctx.sendParam(trader)), "buy when R is BELOW ONE") // trader balances assert.equal(await ctx.BASE.methods.balanceOf(trader).call(), decimalStr("9.5")) - assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "1049294316148665165351") + assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "1049294316148665165453") // maintainer balances assert.equal(await ctx.BASE.methods.balanceOf(ctx.Maintainer).call(), decimalStr("0.0005")) assert.equal(await ctx.QUOTE.methods.balanceOf(ctx.Maintainer).call(), "98914196817061816") // dodo balances assert.equal(await ctx.DODO.methods._BASE_BALANCE_().call(), decimalStr("10.4995")) - assert.equal(await ctx.DODO.methods._QUOTE_BALANCE_().call(), "950606769654517772833") + assert.equal(await ctx.DODO.methods._QUOTE_BALANCE_().call(), "950606769654517772731") }) it("buy when R is BELOW ONE and RStatus back to ONE", async () => { await ctx.DODO.methods.sellBaseToken(decimalStr("1"), decimalStr("90")).send(ctx.sendParam(trader)) - await ctx.DODO.methods.buyBaseToken("997008973080757728", decimalStr("110")).send(ctx.sendParam(trader)) + logGas(await ctx.DODO.methods.buyBaseToken("997008973080757728", decimalStr("110")).send(ctx.sendParam(trader)), "buy when R is BELOW ONE and RStatus back to ONE") // R status assert.equal(await ctx.DODO.methods._R_STATUS_().call(), "0") // trader balances assert.equal(await ctx.BASE.methods.balanceOf(trader).call(), "9997008973080757728") - assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "999703024198699420514") + assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "999703024198699411500") // maintainer balances assert.equal(await ctx.BASE.methods.balanceOf(ctx.Maintainer).call(), "997008973080757") assert.equal(await ctx.QUOTE.methods.balanceOf(ctx.Maintainer).call(), "98914196817061816") // dodo balances assert.equal(await ctx.DODO.methods._BASE_BALANCE_().call(), "10001994017946161515") - assert.equal(await ctx.DODO.methods._QUOTE_BALANCE_().call(), "1000198061604483517670") + assert.equal(await ctx.DODO.methods._QUOTE_BALANCE_().call(), "1000198061604483526684") // target status assert.equal(await ctx.DODO.methods._TARGET_BASE_TOKEN_AMOUNT_().call(), "10001994017946161515") - assert.equal(await ctx.DODO.methods._TARGET_QUOTE_TOKEN_AMOUNT_().call(), "1000198061604483517670") + assert.equal(await ctx.DODO.methods._TARGET_QUOTE_TOKEN_AMOUNT_().call(), "1000198061604483526684") }) it("buy when R is BELOW ONE and RStatus becomes ABOVE ONE", async () => { await ctx.DODO.methods.sellBaseToken(decimalStr("1"), decimalStr("90")).send(ctx.sendParam(trader)) - logGas(await ctx.DODO.methods.buyBaseToken(decimalStr("2"), decimalStr("220")).send(ctx.sendParam(trader)), "buy base token gas cost worst case") + logGas(await ctx.DODO.methods.buyBaseToken(decimalStr("2"), decimalStr("220")).send(ctx.sendParam(trader)), "buy when R is BELOW ONE and RStatus becomes ABOVE ONE [gas cost worst case]") // R status assert.equal(await ctx.DODO.methods._R_STATUS_().call(), "1") // trader balances assert.equal(await ctx.BASE.methods.balanceOf(trader).call(), decimalStr("11")) - assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "897977789597854412810") + assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "897977789597854403796") // 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(), "98914196817061816") // dodo balances assert.equal(await ctx.DODO.methods._BASE_BALANCE_().call(), decimalStr("8.998")) - assert.equal(await ctx.DODO.methods._QUOTE_BALANCE_().call(), "1101923296205328525374") + assert.equal(await ctx.DODO.methods._QUOTE_BALANCE_().call(), "1101923296205328534388") // target status assert.equal(await ctx.DODO.methods._TARGET_BASE_TOKEN_AMOUNT_().call(), "10004000000000000000") - assert.equal(await ctx.DODO.methods._TARGET_QUOTE_TOKEN_AMOUNT_().call(), "1000198061604483517670") + assert.equal(await ctx.DODO.methods._TARGET_QUOTE_TOKEN_AMOUNT_().call(), "1000198061604483526684") }) }) @@ -243,8 +247,8 @@ describe("Trader", () => { // nearly drain out quote pool // because the fee donated is greater than remaining quote pool // quote lp earn a considerable profit - assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "1996900220185135480814") - assert.equal(await ctx.DODO.methods.getLpQuoteBalance(lp).call(), "4574057156329524018663") + assert.equal(await ctx.QUOTE.methods.balanceOf(trader).call(), "1996900220185135480813") + assert.equal(await ctx.DODO.methods.getLpQuoteBalance(lp).call(), "4574057156329524019750") }) }) diff --git a/test/utils/Context.ts b/test/utils/Context.ts index 945da2e..d50f03c 100644 --- a/test/utils/Context.ts +++ b/test/utils/Context.ts @@ -66,8 +66,8 @@ export class DODOContext { this.EVM = new EVM this.Web3 = getDefaultWeb3() this.DODOZoo = await contracts.newContract(contracts.DODO_ZOO_CONTRACT_NAME) - this.BASE = await contracts.newContract(contracts.TEST_ERC20_CONTRACT_NAME) - this.QUOTE = await contracts.newContract(contracts.TEST_ERC20_CONTRACT_NAME) + this.BASE = await contracts.newContract(contracts.TEST_ERC20_CONTRACT_NAME, ["TestBase", 18]) + this.QUOTE = await contracts.newContract(contracts.TEST_ERC20_CONTRACT_NAME, ["TestQuote", 18]) this.ORACLE = await contracts.newContract(contracts.NAIVE_ORACLE_CONTRACT_NAME) const allAccounts = await this.Web3.eth.getAccounts(); @@ -93,6 +93,8 @@ export class DODOContext { this.BaseCapital = contracts.getContractWithAddress(contracts.DODO_LP_TOKEN_CONTRACT_NAME, await this.DODO.methods._BASE_CAPITAL_TOKEN_().call()) this.QuoteCapital = contracts.getContractWithAddress(contracts.DODO_LP_TOKEN_CONTRACT_NAME, await this.DODO.methods._QUOTE_CAPITAL_TOKEN_().call()) + this.DODO.methods.claimOwnership().send(this.sendParam(this.Deployer)) + console.log(log.blueText("[Init dodo context]")) }