Files
dodo-contractV2/test/Route/Route.test.ts
2020-11-10 18:38:34 +08:00

172 lines
4.6 KiB
TypeScript

/*
Copyright 2020 DODO ZOO.
SPDX-License-Identifier: Apache-2.0
*/
// import * as assert from 'assert';
import BigNumber from 'bignumber.js';
import { DODOContext, getDODOContext } from '../utils-v1/Context';
import { decimalStr,MAX_UINT256 } from '../utils-v1/Converter';
import { logGas } from '../utils-v1/Log';
let lp: string;
let trader: string;
async function init(ctx: DODOContext): Promise<void> {
await ctx.setOraclePrice(decimalStr("100"));
lp = ctx.spareAccounts[0];
trader = ctx.spareAccounts[1];
await ctx.approveDODO(lp);
await ctx.approveDODO(trader);
await ctx.mintTestToken(lp, decimalStr("10"), decimalStr("1000"));
await ctx.mintTestToken(trader, decimalStr("10"), decimalStr("1000"));
await ctx.DODO.methods
.depositBaseTo(lp, decimalStr("10"))
.send(ctx.sendParam(lp));
await ctx.DODO.methods
.depositQuoteTo(lp, decimalStr("1000"))
.send(ctx.sendParam(lp));
}
async function calcRoute(ctx: DODOContext) {
let fromTokenAmount = decimalStr("1");
//路径
let routes = [
{
address: ctx.BASE.options.address,
decimals: 18
},
{
address: ctx.QUOTE.options.address,
decimals: 18
}
]
//路径上交易对
let pairs = [
{
pair: ctx.DODO.options.address,
base: ctx.BASE.options.address
}
]
let callPairs: string[] = []
let datas: string = ""
let starts: number[] = []
let gAndV: number[] = []
let swapAmount = fromTokenAmount
for (let i = 0; i < pairs.length; i++) {
let curPair = pairs[i]
callPairs.push(curPair.pair)
//TODO: hardcode
let curContact =ctx.DODO;
let curData = ''
if (curPair.base === routes[i].address) {
curData = await curContact.methods.sellBaseToken(swapAmount, 0, []).encodeABI()
swapAmount = await curContact.methods.querySellBaseToken(swapAmount).call();
} else {
curData = await curContact.methods.buyBaseToken(swapAmount, 0, []).encodABI()
swapAmount = await curContact.methods.queryBuyBaseToken(swapAmount).call();
}
starts.push(datas.length)
gAndV.push(0)
datas += curData
}
let toAmount = new BigNumber(swapAmount).multipliedBy(0.99).toFixed(0, BigNumber.ROUND_DOWN)
return ctx.SmartSwap.methods.dodoSwap(
ctx.BASE.options.address,
ctx.QUOTE.options.address,
fromTokenAmount,
toAmount,
callPairs,
datas,
starts,
gAndV
)
}
describe("Trader", () => {
let snapshotId: string;
let ctx: DODOContext;
before(async () => {
ctx = await getDODOContext();
await init(ctx);
});
beforeEach(async () => {
snapshotId = await ctx.EVM.snapshot();
});
afterEach(async () => {
await ctx.EVM.reset(snapshotId);
});
describe("hit currently pair", () => {
it("base to quote", async () => {
var beforeBalance = await ctx.BASE.methods.balanceOf(trader).call()
// await ctx.BASE.methods.approve(ctx.SmartApprove.options.address,MAX_UINT256).send(ctx.sendParam(trader))
console.log("beforeBalance",beforeBalance)
await logGas(await calcRoute(ctx), ctx.sendParam(trader), "buy token")
var afterBalance = await ctx.BASE.methods.balanceOf(trader).call()
console.log("afterBalance",afterBalance)
// // trader balances
// assert.equal(
// await ctx.BASE.methods.balanceOf(trader).call(),
// decimalStr("11")
// );
// assert.equal(
// await ctx.QUOTE.methods.balanceOf(trader).call(),
// "898581839502056240973"
// );
});
});
// describe("Revert cases", () => {
// it("price limit", async () => {
// await assert.rejects(
// ctx.DODO.methods
// .buyBaseToken(decimalStr("1"), decimalStr("100"), "0x")
// .send(ctx.sendParam(trader)),
// /BUY_BASE_COST_TOO_MUCH/
// );
// await assert.rejects(
// ctx.DODO.methods
// .sellBaseToken(decimalStr("1"), decimalStr("100"), "0x")
// .send(ctx.sendParam(trader)),
// /SELL_BASE_RECEIVE_NOT_ENOUGH/
// );
// });
// it("base balance limit", async () => {
// await assert.rejects(
// ctx.DODO.methods
// .buyBaseToken(decimalStr("11"), decimalStr("10000"), "0x")
// .send(ctx.sendParam(trader)),
// /DODO_BASE_BALANCE_NOT_ENOUGH/
// );
// await ctx.DODO.methods
// .buyBaseToken(decimalStr("1"), decimalStr("200"), "0x")
// .send(ctx.sendParam(trader));
// await assert.rejects(
// ctx.DODO.methods
// .buyBaseToken(decimalStr("11"), decimalStr("10000"), "0x")
// .send(ctx.sendParam(trader)),
// /DODO_BASE_BALANCE_NOT_ENOUGH/
// );
// });
// });
});