fix test
This commit is contained in:
@@ -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 () => {
|
||||
|
||||
@@ -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<void> {
|
||||
|
||||
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
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
@@ -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")
|
||||
})
|
||||
|
||||
})
|
||||
})
|
||||
@@ -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")
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
@@ -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 () => {
|
||||
|
||||
@@ -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")
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -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")
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
@@ -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]"))
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user