2020-10-27 02:53:23 +08:00
/ *
Copyright 2020 DODO ZOO .
SPDX - License - Identifier : Apache - 2.0
* /
// import * as assert from 'assert';
2020-11-23 21:26:18 +08:00
import { decimalStr , gweiStr } from '../utils/Converter' ;
2020-10-27 02:53:23 +08:00
import { logGas } from '../utils/Log' ;
import { DVMContext , getDVMContext } from '../utils/DVMContext' ;
import { assert } from 'chai' ;
2020-11-24 00:20:23 +08:00
import { EXTERNAL_VALUE_NAME , getContractWithAddress } from '../utils/Contracts' ;
const truffleAssert = require ( 'truffle-assertions' ) ;
2020-10-27 02:53:23 +08:00
let lp : string ;
let trader : string ;
async function init ( ctx : DVMContext ) : Promise < void > {
lp = ctx . SpareAccounts [ 0 ] ;
trader = ctx . SpareAccounts [ 1 ] ;
2020-11-20 18:58:35 +08:00
await ctx . approveProxy ( lp ) ;
await ctx . approveProxy ( trader ) ;
2020-10-27 02:53:23 +08:00
await ctx . mintTestToken ( lp , decimalStr ( "10" ) , decimalStr ( "1000" ) ) ;
await ctx . mintTestToken ( trader , decimalStr ( "10" ) , decimalStr ( "1000" ) ) ;
2020-11-20 18:58:35 +08:00
await ctx . DVMProxy . methods
2020-10-27 02:53:23 +08:00
. depositToDVM ( ctx . DVM . options . address , lp , decimalStr ( "10" ) , decimalStr ( "0" ) )
. send ( ctx . sendParam ( lp ) ) ;
console . log ( "deposit" )
}
describe ( "Trader" , ( ) = > {
let snapshotId : string ;
let ctx : DVMContext ;
before ( async ( ) = > {
ctx = await getDVMContext ( ) ;
await init ( ctx ) ;
} ) ;
beforeEach ( async ( ) = > {
snapshotId = await ctx . EVM . snapshot ( ) ;
} ) ;
afterEach ( async ( ) = > {
await ctx . EVM . reset ( snapshotId ) ;
} ) ;
describe ( "trade" , ( ) = > {
2020-11-24 00:20:23 +08:00
// 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())
// console.log(ctx.BASE.options.address)
// console.log(await ctx.DVM.methods._BASE_TOKEN_().call())
// console.log(ctx.QUOTE.options.address)
// console.log(await ctx.DVM.methods._QUOTE_TOKEN_().call())
// })
// it.only("mannually buy", async () => {
// await ctx.QUOTE.methods.transfer(ctx.DVM.options.address, decimalStr("100")).send(ctx.sendParam(lp))
// console.log(await ctx.DVM.methods.getQuoteInput().call())
// console.log(await ctx.DVM.methods.querySellQuote(lp, decimalStr("100")).call())
// await ctx.DVM.methods.sellQuote(lp).send(ctx.sendParam(lp))
// })
2020-11-23 21:26:18 +08:00
2020-10-27 02:53:23 +08:00
it ( "buy & sell" , async ( ) = > {
2020-11-05 14:10:59 +08:00
console . log ( "BASE0 before buy" , await ctx . DVM . methods . getBase0 ( ) . call ( ) )
2020-10-27 02:53:23 +08:00
// buy
2020-11-20 18:58:35 +08:00
await logGas ( ctx . DVMProxy . methods . sellQuoteOnDVM ( ctx . DVM . options . address , trader , decimalStr ( "200" ) , decimalStr ( "1" ) ) , ctx . sendParam ( trader ) , "buy base token" )
2020-11-05 14:10:59 +08:00
console . log ( "BASE0 after buy" , await ctx . DVM . methods . getBase0 ( ) . call ( ) )
2020-10-27 02:53:23 +08:00
// trader balances
assert . equal (
await ctx . BASE . methods . balanceOf ( trader ) . call ( ) ,
"11946763594380080787"
) ;
assert . equal (
await ctx . QUOTE . methods . balanceOf ( trader ) . call ( ) ,
decimalStr ( "800" )
) ;
// vault balances
assert . equal (
2020-11-20 18:58:35 +08:00
await ctx . BASE . methods . balanceOf ( ctx . DVM . options . address ) . call ( ) ,
2020-10-27 02:53:23 +08:00
"8051283784161162863"
) ;
assert . equal (
2020-11-20 18:58:35 +08:00
await ctx . QUOTE . methods . balanceOf ( ctx . DVM . options . address ) . call ( ) ,
2020-10-27 02:53:23 +08:00
decimalStr ( "200" )
) ;
// maintainer balances
assert . equal (
await ctx . BASE . methods . balanceOf ( ctx . Maintainer ) . call ( ) ,
"1952621458756350"
) ;
assert . equal (
await ctx . QUOTE . methods . balanceOf ( ctx . Maintainer ) . call ( ) ,
decimalStr ( "0" )
) ;
// sell
2020-11-20 18:58:35 +08:00
await logGas ( ctx . DVMProxy . methods . sellBaseOnDVM ( ctx . DVM . options . address , trader , decimalStr ( "1" ) , decimalStr ( "100" ) ) , ctx . sendParam ( trader ) , "sell base token" )
2020-11-05 14:10:59 +08:00
console . log ( "BASE0 after sell" , await ctx . DVM . methods . getBase0 ( ) . call ( ) )
2020-10-27 02:53:23 +08:00
// 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 (
2020-11-20 18:58:35 +08:00
await ctx . BASE . methods . balanceOf ( ctx . DVM . options . address ) . call ( ) ,
2020-10-27 02:53:23 +08:00
"9051283784161162863"
) ;
assert . equal (
2020-11-20 18:58:35 +08:00
await ctx . QUOTE . methods . balanceOf ( ctx . DVM . options . address ) . call ( ) ,
2020-10-27 02:53:23 +08:00
"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"
) ;
2020-11-11 23:48:29 +08:00
// buy when quoet is not 0
2020-11-20 18:58:35 +08:00
await logGas ( ctx . DVMProxy . methods . sellQuoteOnDVM ( ctx . DVM . options . address , trader , decimalStr ( "200" ) , decimalStr ( "1" ) ) , ctx . sendParam ( trader ) , "buy base token" )
2020-11-23 21:26:18 +08:00
console . log ( "BASE0 after second buy" , await ctx . DVM . methods . getBase0 ( ) . call ( ) )
2020-11-11 23:48:29 +08:00
// trader balances
2020-11-20 19:55:32 +08:00
assert . equal (
2020-11-11 23:48:29 +08:00
await ctx . BASE . methods . balanceOf ( trader ) . call ( ) ,
2020-11-24 00:20:23 +08:00
"12837528824326616010"
2020-11-11 23:48:29 +08:00
) ;
2020-11-20 19:55:32 +08:00
assert . equal (
2020-11-11 23:48:29 +08:00
await ctx . QUOTE . methods . balanceOf ( trader ) . call ( ) ,
"703421810640399874603"
) ;
// vault balances
2020-11-20 19:55:32 +08:00
assert . equal (
2020-11-20 18:58:35 +08:00
await ctx . BASE . methods . balanceOf ( ctx . DVM . options . address ) . call ( ) ,
2020-11-24 00:20:23 +08:00
"7158622099620899921"
2020-11-11 23:48:29 +08:00
) ;
2020-11-20 19:55:32 +08:00
assert . equal (
2020-11-20 18:58:35 +08:00
await ctx . QUOTE . methods . balanceOf ( ctx . DVM . options . address ) . call ( ) ,
2020-11-11 23:48:29 +08:00
"296474456349930717298"
) ;
// maintainer balances
2020-11-20 19:55:32 +08:00
assert . equal (
2020-11-11 23:48:29 +08:00
await ctx . BASE . methods . balanceOf ( ctx . Maintainer ) . call ( ) ,
"3849076052484069"
) ;
2020-11-20 19:55:32 +08:00
assert . equal (
2020-11-11 23:48:29 +08:00
await ctx . QUOTE . methods . balanceOf ( ctx . Maintainer ) . call ( ) ,
"103733009669408099"
) ;
2020-10-27 02:53:23 +08:00
} ) ;
2020-11-23 21:26:18 +08:00
it ( "flash loan" , async ( ) = > {
} )
2020-11-24 00:20:23 +08:00
it . only ( "revert cases" , async ( ) = > {
var gasPriceLimitContract = getContractWithAddress ( EXTERNAL_VALUE_NAME , await ctx . DVM . methods . _GAS_PRICE_LIMIT_ ( ) . call ( ) )
await gasPriceLimitContract . methods . set ( gweiStr ( "10" ) ) . send ( ctx . sendParam ( ctx . Deployer ) )
await truffleAssert . reverts (
ctx . DVMProxy . methods . sellQuoteOnDVM ( ctx . DVM . options . address , trader , decimalStr ( "200" ) , decimalStr ( "1" ) ) . send ( { from : trader , gas : 300000 , gasPrice : gweiStr ( "200" ) } ) , "GAS_PRICE_EXCEED"
2020-11-23 21:26:18 +08:00
)
} )
2020-10-27 02:53:23 +08:00
} ) ;
2020-11-23 21:26:18 +08:00
} ) ;