From 180c687a4ab847f037abee4c5578fc213b31ad42 Mon Sep 17 00:00:00 2001 From: owen05 Date: Mon, 30 Nov 2020 11:36:36 +0800 Subject: [PATCH] sell shares helper test --- contracts/SmartRoute/DODOV1Proxy01.sol | 7 +- .../{lib => helper}/DODOSellHelper.sol | 0 contracts/lib/DODOMath.sol | 2 +- test/Proxy/proxy.dpp.test.ts | 16 +- test/Proxy/proxy.dvm.test.ts | 389 +++++++++++++----- test/Proxy/proxy.mix.test.ts | 204 +++++++++ test/utils/Contracts.ts | 1 + test/utils/ProxyContext.ts | 6 + truffle-test.sh | 6 + 9 files changed, 505 insertions(+), 126 deletions(-) rename contracts/SmartRoute/{lib => helper}/DODOSellHelper.sol (100%) create mode 100644 test/Proxy/proxy.mix.test.ts diff --git a/contracts/SmartRoute/DODOV1Proxy01.sol b/contracts/SmartRoute/DODOV1Proxy01.sol index 585f268..5cbb5c4 100644 --- a/contracts/SmartRoute/DODOV1Proxy01.sol +++ b/contracts/SmartRoute/DODOV1Proxy01.sol @@ -7,7 +7,6 @@ pragma solidity 0.6.9; -import {Ownable} from "../lib/Ownable.sol"; import {IERC20} from "../intf/IERC20.sol"; import {UniversalERC20} from "./lib/UniversalERC20.sol"; import {SafeMath} from "../lib/SafeMath.sol"; @@ -16,7 +15,7 @@ import {IDODOApprove} from "../intf/IDODOApprove.sol"; import {IDODOV1} from "./intf/IDODOV1.sol"; import {IWETH} from "../intf/IWETH.sol"; -contract DODOV1Proxy01 is Ownable { +contract DODOV1Proxy01 { using SafeMath for uint256; using UniversalERC20 for IERC20; @@ -61,7 +60,7 @@ contract DODOV1Proxy01 is Ownable { address[] memory dodoPairs, uint8[] memory directions, uint256 deadline - ) public payable judgeExpired(deadline) returns (uint256 returnAmount) { + ) external payable judgeExpired(deadline) returns (uint256 returnAmount) { if (fromToken != ETH_ADDRESS) { IDODOApprove(dodoApprove).claimTokens( fromToken, @@ -121,7 +120,7 @@ contract DODOV1Proxy01 is Ownable { uint256 minReturnAmount, bytes memory callDataConcat, uint256 deadline - ) public payable judgeExpired(deadline) returns (uint256 returnAmount) { + ) external payable judgeExpired(deadline) returns (uint256 returnAmount) { if (fromToken != ETH_ADDRESS) { IDODOApprove(dodoApprove).claimTokens( fromToken, diff --git a/contracts/SmartRoute/lib/DODOSellHelper.sol b/contracts/SmartRoute/helper/DODOSellHelper.sol similarity index 100% rename from contracts/SmartRoute/lib/DODOSellHelper.sol rename to contracts/SmartRoute/helper/DODOSellHelper.sol diff --git a/contracts/lib/DODOMath.sol b/contracts/lib/DODOMath.sol index 408e92b..ad62a41 100644 --- a/contracts/lib/DODOMath.sol +++ b/contracts/lib/DODOMath.sol @@ -21,7 +21,7 @@ library DODOMath { using SafeMath for uint256; /* - Integrate dodo curve fron V1 to V2 + Integrate dodo curve from V1 to V2 require V0>=V1>=V2>0 res = (1-k)i(V1-V2)+ikV0*V0(1/V2-1/V1) let V1-V2=delta diff --git a/test/Proxy/proxy.dpp.test.ts b/test/Proxy/proxy.dpp.test.ts index f8e53eb..dd39e01 100644 --- a/test/Proxy/proxy.dpp.test.ts +++ b/test/Proxy/proxy.dpp.test.ts @@ -231,7 +231,7 @@ describe("DODOProxyV2.0", () => { assert.equal(new BigNumber(b_ETH).isGreaterThan(new BigNumber(a_ETH).plus(decimalStr("1"))),true); }); - it("swap - one hop", async () => { + it("swap - one jump", async () => { await ctx.mintTestToken(trader, ctx.DODO, decimalStr("1000")); var b_DOOD = await ctx.DODO.methods.balanceOf(trader).call(); var b_USDT = await ctx.USDT.methods.balanceOf(trader).call(); @@ -250,7 +250,7 @@ describe("DODOProxyV2.0", () => { dodoPairs, directions, Math.floor(new Date().getTime()/1000 + 60 * 10) - ),ctx.sendParam(trader),"swap - one hop"); + ),ctx.sendParam(trader),"swap - one jump"); var a_DOOD = await ctx.DODO.methods.balanceOf(trader).call(); var a_USDT = await ctx.USDT.methods.balanceOf(trader).call(); console.log("b_DOOD:" + b_DOOD + " a_DODO:" + a_DOOD); @@ -260,7 +260,7 @@ describe("DODOProxyV2.0", () => { }); - it("swap - two hop", async () => { + it("swap - two jump", async () => { await ctx.mintTestToken(trader, ctx.DODO, decimalStr("1000")); var b_DOOD = await ctx.DODO.methods.balanceOf(trader).call(); var b_WETH = await ctx.WETH.methods.balanceOf(trader).call(); @@ -281,7 +281,7 @@ describe("DODOProxyV2.0", () => { dodoPairs, directions, Math.floor(new Date().getTime()/1000 + 60 * 10) - ),ctx.sendParam(trader),"swap - two hop"); + ),ctx.sendParam(trader),"swap - two jump"); var a_DOOD = await ctx.DODO.methods.balanceOf(trader).call(); var a_WETH = await ctx.WETH.methods.balanceOf(trader).call(); console.log("b_DOOD:" + b_DOOD + " a_DODO:" + a_DOOD); @@ -290,7 +290,7 @@ describe("DODOProxyV2.0", () => { assert.equal(a_WETH,"247088897795331236"); }); - it("swap - two hop - inETH", async () => { + it("swap - two jump - inETH", async () => { var b_DOOD = await ctx.DODO.methods.balanceOf(trader).call(); var b_WETH = await ctx.WETH.methods.balanceOf(trader).call(); var b_ETH = await ctx.Web3.eth.getBalance(trader); @@ -310,7 +310,7 @@ describe("DODOProxyV2.0", () => { dodoPairs, directions, Math.floor(new Date().getTime()/1000 + 60 * 10) - ),ctx.sendParam(trader,"1"),"swap - two hop - inETH"); + ),ctx.sendParam(trader,"1"),"swap - two jump - inETH"); var a_DOOD = await ctx.DODO.methods.balanceOf(trader).call(); var a_WETH = await ctx.WETH.methods.balanceOf(trader).call(); var a_ETH = await ctx.Web3.eth.getBalance(trader); @@ -321,7 +321,7 @@ describe("DODOProxyV2.0", () => { }); - it("swap - two hop - outETH", async () => { + it("swap - two jump - outETH", async () => { await ctx.mintTestToken(trader, ctx.DODO, decimalStr("100000")); var b_DOOD = await ctx.DODO.methods.balanceOf(trader).call(); var b_WETH = await ctx.WETH.methods.balanceOf(trader).call(); @@ -342,7 +342,7 @@ describe("DODOProxyV2.0", () => { dodoPairs, directions, Math.floor(new Date().getTime()/1000 + 60 * 10) - ),ctx.sendParam(trader),"swap - two hop - outETH"); + ),ctx.sendParam(trader),"swap - two jump - outETH"); var a_DOOD = await ctx.DODO.methods.balanceOf(trader).call(); var a_WETH = await ctx.WETH.methods.balanceOf(trader).call(); var a_ETH = await ctx.Web3.eth.getBalance(trader); diff --git a/test/Proxy/proxy.dvm.test.ts b/test/Proxy/proxy.dvm.test.ts index 2a89fa2..a8a094c 100644 --- a/test/Proxy/proxy.dvm.test.ts +++ b/test/Proxy/proxy.dvm.test.ts @@ -7,6 +7,7 @@ // import * as assert from 'assert'; const ethUtil = require('ethereumjs-util'); +import { SignHelper } from "../utils/SignHelper"; import BigNumber from "bignumber.js"; import { decimalStr, MAX_UINT256, mweiStr } from '../utils/Converter'; import { logGas } from '../utils/Log'; @@ -14,7 +15,6 @@ import { ProxyContext, getProxyContext } from '../utils/ProxyContext'; import { assert } from 'chai'; import * as contracts from '../utils/Contracts'; import { Contract } from 'web3-eth-contract'; -import { SignHelper } from "../utils/SignHelper"; let lp: string; let project: string; @@ -89,7 +89,7 @@ async function initCreateDVM(ctx: ProxyContext, token0: string, token1:string, t token1Amount, config.lpFeeRate, config.mtFeeRate, - config.i, + i, config.k, Math.floor(new Date().getTime()/1000 + 60 * 10) ).send(ctx.sendParam(project,ethValue)); @@ -237,146 +237,309 @@ describe("DODOProxyV2.0", () => { assert.equal(a_dlp,"1000000000000000000"); }); - it("removeLiquidity", async () => { - var b_baseReserve = await DVM_DODO_USDT.methods._BASE_RESERVE_().call(); - var b_quoteReserve = await DVM_DODO_USDT.methods._QUOTE_RESERVE_().call(); - var b_dlp = await DVM_DODO_USDT.methods.balanceOf(project).call(); - var b_DODO = await ctx.DODO.methods.balanceOf(project).call(); - var b_USDT = await ctx.USDT.methods.balanceOf(project).call(); - assert.equal(b_baseReserve,decimalStr("100000")); - assert.equal(b_quoteReserve,mweiStr("30000")); - assert.equal(b_dlp,decimalStr("100000")); - assert.equal(b_DODO,decimalStr("900000")); - assert.equal(b_USDT,mweiStr("940000")); - await DVM_DODO_USDT.methods.approve(ctx.SmartApprove.options.address, MAX_UINT256).send(ctx.sendParam(project)); - await logGas(await ctx.DODOProxy.methods.removeDVMLiquidity( - dvm_DODO_USDT, - project, - decimalStr("100"), - decimalStr("0"), - mweiStr("0"), - 0, - Math.floor(new Date().getTime() / 1000 + 60 * 10) - ),ctx.sendParam(project),"removeLiquidity"); - var a_baseReserve = await DVM_DODO_USDT.methods._BASE_RESERVE_().call(); - var a_quoteReserve = await DVM_DODO_USDT.methods._QUOTE_RESERVE_().call(); - var a_dlp = await DVM_DODO_USDT.methods.balanceOf(project).call(); - var a_DODO = await ctx.DODO.methods.balanceOf(project).call(); - var a_USDT = await ctx.USDT.methods.balanceOf(project).call(); - assert.equal(a_baseReserve, decimalStr("99900")); - assert.equal(a_quoteReserve, mweiStr("29970")); - assert.equal(a_dlp, decimalStr("99900")); - assert.equal(a_DODO, decimalStr("900100")); - assert.equal(a_USDT, mweiStr("940030")); - }); - it("removeLiquidity - ETH", async () => { + it("sellShares - ETH helper", async () => { var b_baseReserve = await DVM_WETH_USDT.methods._BASE_RESERVE_().call(); var b_quoteReserve = await DVM_WETH_USDT.methods._QUOTE_RESERVE_().call(); var b_dlp = await DVM_WETH_USDT.methods.balanceOf(project).call(); var b_WETH = await ctx.WETH.methods.balanceOf(project).call(); var b_USDT = await ctx.USDT.methods.balanceOf(project).call(); var b_ETH = await ctx.Web3.eth.getBalance(project); - assert.equal(b_baseReserve, decimalStr("5")); + // console.log("b_baseReserve:" + b_baseReserve + " b_quoteReserve:" + b_quoteReserve + " b_dlp:" + b_dlp + " b_WETH:" + b_WETH + " b_USDT:" + b_USDT + " b_ETH:" + b_ETH); + assert.equal(b_baseReserve,decimalStr("5")); assert.equal(b_quoteReserve, mweiStr("30000")); - assert.equal(b_dlp, decimalStr("5")); - assert.equal(b_WETH, decimalStr("0")); + assert.equal(b_dlp,decimalStr("5")); + assert.equal(b_WETH,decimalStr("0")); assert.equal(b_USDT, mweiStr("940000")); - await DVM_WETH_USDT.methods.approve(ctx.SmartApprove.options.address, MAX_UINT256).send(ctx.sendParam(project)); - var tx = await logGas(await ctx.DODOProxy.methods.removeDVMLiquidity( - dvm_WETH_USDT, - project, + await logGas(await DVM_WETH_USDT.methods.sellShares( decimalStr("1"), + ctx.DODOCalleeHelper.options.address, decimalStr("0"), mweiStr("0"), - 1, + '0x00', Math.floor(new Date().getTime() / 1000 + 60 * 10) - ), ctx.sendParam(project), "removeLiquidity - ETH"); + ), ctx.sendParam(project),"sellShares - ETH helper"); + var a_baseReserve = await DVM_WETH_USDT.methods._BASE_RESERVE_().call(); var a_quoteReserve = await DVM_WETH_USDT.methods._QUOTE_RESERVE_().call(); var a_dlp = await DVM_WETH_USDT.methods.balanceOf(project).call(); var a_WETH = await ctx.WETH.methods.balanceOf(project).call(); var a_USDT = await ctx.USDT.methods.balanceOf(project).call(); var a_ETH = await ctx.Web3.eth.getBalance(project); - // console.log("a_baseReserve:" + a_baseReserve + " a_quoteReserve:" + a_quoteReserve + " a_dlp:" + a_dlp + " a_WETH:" + a_WETH + " a_USDT:" + a_USDT); + console.log("b_ETH:" + b_ETH + " a_ETH:" + a_ETH); assert.equal(a_baseReserve, decimalStr("4")); assert.equal(a_quoteReserve, mweiStr("24000")); assert.equal(a_dlp, decimalStr("4")); assert.equal(a_WETH, decimalStr("0")); assert.equal(a_USDT, mweiStr("946000")); - console.log("b_ETH:", b_ETH); - console.log("a_ETH:", a_ETH); assert.equal(new BigNumber(b_ETH).isGreaterThan(new BigNumber(a_ETH).minus(decimalStr("1"))), true); + }) + + it("swap - one jump", async () => { + await ctx.mintTestToken(trader, ctx.DODO, decimalStr("1000")); + var b_DOOD = await ctx.DODO.methods.balanceOf(trader).call(); + var b_USDT = await ctx.USDT.methods.balanceOf(trader).call(); + var dodoPairs = [ + dvm_DODO_USDT + ] + var directions = [ + 0 + ] + var tx = await logGas(await ctx.DODOProxy.methods.dodoSwapTokenToToken( + trader, + ctx.DODO.options.address, + ctx.USDT.options.address, + decimalStr("500"), + 1, + dodoPairs, + directions, + Math.floor(new Date().getTime() / 1000 + 60 * 10) + ), ctx.sendParam(trader), "swap - one jump"); + var a_DOOD = await ctx.DODO.methods.balanceOf(trader).call(); + var a_USDT = await ctx.USDT.methods.balanceOf(trader).call(); + console.log("b_DOOD:" + b_DOOD + " a_DODO:" + a_DOOD); + console.log("b_USDT:" + b_USDT + " a_USDT:" + a_USDT); + assert.equal(a_DOOD, decimalStr("500")); + assert.equal(a_USDT, "189227055"); }); - it("removeLiquidity - permit", async () => { - var b_baseReserve = await DVM_DODO_USDT.methods._BASE_RESERVE_().call(); - var b_quoteReserve = await DVM_DODO_USDT.methods._QUOTE_RESERVE_().call(); - var b_dlp = await DVM_DODO_USDT.methods.balanceOf(project).call(); - var b_DODO = await ctx.DODO.methods.balanceOf(project).call(); - var b_USDT = await ctx.USDT.methods.balanceOf(project).call(); - assert.equal(b_baseReserve, decimalStr("100000")); - assert.equal(b_quoteReserve, mweiStr("30000")); - assert.equal(b_dlp, decimalStr("100000")); - assert.equal(b_DODO, decimalStr("900000")); - assert.equal(b_USDT, mweiStr("940000")); - - var DOMAIN_SEPARATOR = await DVM_DODO_USDT.methods.DOMAIN_SEPARATOR().call(); - // var name = await DVM_DODO_USDT.methods.name().call(); - // typedData.domain.name = ctx.Web3.utils.sha3(name); - // typedData.domain.version = ctx.Web3.utils.sha3('1'); - // typedData.domain.chainId = await ctx.Web3.eth.getChainId(); - // typedData.domain.verifyingContract = dvm_DODO_USDT; - typedData.message.owner = project; - typedData.message.spender = ctx.SmartApprove.options.address; - var nonceStr = await DVM_DODO_USDT.methods.nonces(project).call(); - typedData.message.nonce = parseInt(nonceStr); - typedData.message.deadline = Math.floor(new Date().getTime() / 1000 + 60 * 10); - var resHash = new SignHelper().signHash(DOMAIN_SEPARATOR,typedData.message); - var sig = await ctx.Web3.eth.sign('0x' + resHash.toString('hex'), project); - // let r = sig.slice(0, 66) - // let s = '0x' + sig.slice(66, 130) - // let v = '0x1c' - const signRes = ethUtil.fromRpcSig(sig); - const prefix = Buffer.from("\x19Ethereum Signed Message:\n"); - const prefixedMsg = ethUtil.keccak256( - Buffer.concat([prefix, Buffer.from(String(resHash.length)), resHash]) - ); - console.log("add-prefix-degist:", "0x" + prefixedMsg.toString('hex')); - var pubKey = ethUtil.ecrecover(prefixedMsg, signRes.v,signRes.r,signRes.s) - // var pubKey = ethUtil.ecrecover(resHash, Buffer.from(v), Buffer.from(r), Buffer.from(s)) - var addrBuf = ethUtil.pubToAddress(pubKey); - console.log("project:" + project); - console.log("addr-web3-recover:" + ethUtil.bufferToHex(addrBuf)); - // var tx = await logGas(await DVM_DODO_USDT.methods.permit(project, typedData.message.spender, typedData.message.value, typedData.message.deadline, signRes.v, signRes.r, signRes.s), ctx.sendParam(project), "perimit test"); - // console.log("addr-sol-recover:" + tx.events['TestAddr'].returnValues['addr']); - // console.log("sol-domain:" + tx.events['TestAddr'].returnValues['domain']); - // console.log("sol-msg:" + tx.events['TestAddr'].returnValues['message']); - // console.log("sol-digest:" + tx.events['TestAddr'].returnValues['digest']); - // await logGas(await ctx.DODOProxy.methods.removeDVMLiquidityWithPermit( - // dvm_DODO_USDT, - // project, - // decimalStr("100"), - // decimalStr("0"), - // mweiStr("0"), - // 0, - // typedData.message.deadline, - // true, - // signRes.v, signRes.r, signRes.s - // ), ctx.sendParam(project), "removeLiquidity perimit"); - // var a_baseReserve = await DVM_DODO_USDT.methods._BASE_RESERVE_().call(); - // var a_quoteReserve = await DVM_DODO_USDT.methods._QUOTE_RESERVE_().call(); - // var a_dlp = await DVM_DODO_USDT.methods.balanceOf(project).call(); - // var a_DODO = await ctx.DODO.methods.balanceOf(project).call(); - // var a_USDT = await ctx.USDT.methods.balanceOf(project).call(); - // console.log("a_baseReserve:" + a_baseReserve + " a_quoteReserve:" + a_quoteReserve + " a_dlp:" + a_dlp + " a_DODO:" + a_DODO + " a_USDT:" + a_USDT); - // assert.equal(a_baseReserve, decimalStr("99900")); - // assert.equal(a_quoteReserve, mweiStr("29970")); - // assert.equal(a_dlp, decimalStr("99900")); - // assert.equal(a_DODO, decimalStr("900100")); - // assert.equal(a_USDT, mweiStr("940030")); + it("swap - two jump", async () => { + await ctx.mintTestToken(trader, ctx.DODO, decimalStr("1000")); + var b_DOOD = await ctx.DODO.methods.balanceOf(trader).call(); + var b_WETH = await ctx.WETH.methods.balanceOf(trader).call(); + var dodoPairs = [ + dvm_DODO_USDT, + dvm_WETH_USDT + ] + var directions = [ + 0, + 1 + ] + var tx = await logGas(await ctx.DODOProxy.methods.dodoSwapTokenToToken( + trader, + ctx.DODO.options.address, + ctx.WETH.options.address, + decimalStr("500"), + 1, + dodoPairs, + directions, + Math.floor(new Date().getTime() / 1000 + 60 * 10) + ), ctx.sendParam(trader), "swap - two jump"); + var a_DOOD = await ctx.DODO.methods.balanceOf(trader).call(); + var a_WETH = await ctx.WETH.methods.balanceOf(trader).call(); + console.log("b_DOOD:" + b_DOOD + " a_DODO:" + a_DOOD); + console.log("b_WETH:" + b_WETH + " a_WETH:" + a_WETH); + assert.equal(a_DOOD, decimalStr("500")); + assert.equal(a_WETH, "51466023624936494"); }); + it("swap - two jump - inETH", async () => { + var b_DOOD = await ctx.DODO.methods.balanceOf(trader).call(); + var b_WETH = await ctx.WETH.methods.balanceOf(trader).call(); + var b_ETH = await ctx.Web3.eth.getBalance(trader); + var dodoPairs = [ + dvm_WETH_USDT, + dvm_DODO_USDT + ] + var directions = [ + 0, + 1 + ] + var tx = await logGas(await ctx.DODOProxy.methods.dodoSwapETHToToken( + trader, + ctx.DODO.options.address, + decimalStr("1"), + 1, + dodoPairs, + directions, + Math.floor(new Date().getTime() / 1000 + 60 * 10) + ), ctx.sendParam(trader, "1"), "swap - two jump - inETH"); + var a_DOOD = await ctx.DODO.methods.balanceOf(trader).call(); + var a_WETH = await ctx.WETH.methods.balanceOf(trader).call(); + var a_ETH = await ctx.Web3.eth.getBalance(trader); + console.log("b_DOOD:" + b_DOOD + " a_DODO:" + a_DOOD); + console.log("b_WETH:" + b_WETH + " a_WETH:" + a_WETH); + console.log("b_ETH:" + b_ETH + " a_ETH:" + a_ETH); + assert.equal(a_DOOD, "7952984575630657240990"); + }); + + + it("swap - two jump - outETH", async () => { + await ctx.mintTestToken(trader, ctx.DODO, decimalStr("100000")); + var b_DOOD = await ctx.DODO.methods.balanceOf(trader).call(); + var b_WETH = await ctx.WETH.methods.balanceOf(trader).call(); + var b_ETH = await ctx.Web3.eth.getBalance(trader); + var dodoPairs = [ + dvm_DODO_USDT, + dvm_WETH_USDT + ] + var directions = [ + 0, + 1 + ] + var tx = await logGas(await ctx.DODOProxy.methods.dodoSwapTokenToETH( + trader, + ctx.DODO.options.address, + decimalStr("10000"), + 1, + dodoPairs, + directions, + Math.floor(new Date().getTime() / 1000 + 60 * 10) + ), ctx.sendParam(trader), "swap - two jump - outETH"); + var a_DOOD = await ctx.DODO.methods.balanceOf(trader).call(); + var a_WETH = await ctx.WETH.methods.balanceOf(trader).call(); + var a_ETH = await ctx.Web3.eth.getBalance(trader); + console.log("b_DOOD:" + b_DOOD + " a_DODO:" + a_DOOD); + console.log("b_WETH:" + b_WETH + " a_WETH:" + a_WETH); + console.log("b_ETH:" + b_ETH + " a_ETH:" + a_ETH); + assert.equal(a_DOOD, decimalStr("90000")); + assert.equal( + tx.events['OrderHistory'].returnValues['returnAmount'], + "859941980524143252" + ) + }); + + // it("removeLiquidity", async () => { + // var b_baseReserve = await DVM_DODO_USDT.methods._BASE_RESERVE_().call(); + // var b_quoteReserve = await DVM_DODO_USDT.methods._QUOTE_RESERVE_().call(); + // var b_dlp = await DVM_DODO_USDT.methods.balanceOf(project).call(); + // var b_DODO = await ctx.DODO.methods.balanceOf(project).call(); + // var b_USDT = await ctx.USDT.methods.balanceOf(project).call(); + // assert.equal(b_baseReserve,decimalStr("100000")); + // assert.equal(b_quoteReserve,mweiStr("30000")); + // assert.equal(b_dlp,decimalStr("100000")); + // assert.equal(b_DODO,decimalStr("900000")); + // assert.equal(b_USDT,mweiStr("940000")); + // await DVM_DODO_USDT.methods.approve(ctx.SmartApprove.options.address, MAX_UINT256).send(ctx.sendParam(project)); + // await logGas(await ctx.DODOProxy.methods.removeDVMLiquidity( + // dvm_DODO_USDT, + // project, + // decimalStr("100"), + // decimalStr("0"), + // mweiStr("0"), + // 0, + // Math.floor(new Date().getTime() / 1000 + 60 * 10) + // ),ctx.sendParam(project),"removeLiquidity"); + // var a_baseReserve = await DVM_DODO_USDT.methods._BASE_RESERVE_().call(); + // var a_quoteReserve = await DVM_DODO_USDT.methods._QUOTE_RESERVE_().call(); + // var a_dlp = await DVM_DODO_USDT.methods.balanceOf(project).call(); + // var a_DODO = await ctx.DODO.methods.balanceOf(project).call(); + // var a_USDT = await ctx.USDT.methods.balanceOf(project).call(); + // assert.equal(a_baseReserve, decimalStr("99900")); + // assert.equal(a_quoteReserve, mweiStr("29970")); + // assert.equal(a_dlp, decimalStr("99900")); + // assert.equal(a_DODO, decimalStr("900100")); + // assert.equal(a_USDT, mweiStr("940030")); + // }); + + // it("removeLiquidity - ETH", async () => { + // var b_baseReserve = await DVM_WETH_USDT.methods._BASE_RESERVE_().call(); + // var b_quoteReserve = await DVM_WETH_USDT.methods._QUOTE_RESERVE_().call(); + // var b_dlp = await DVM_WETH_USDT.methods.balanceOf(project).call(); + // var b_WETH = await ctx.WETH.methods.balanceOf(project).call(); + // var b_USDT = await ctx.USDT.methods.balanceOf(project).call(); + // var b_ETH = await ctx.Web3.eth.getBalance(project); + // assert.equal(b_baseReserve, decimalStr("5")); + // assert.equal(b_quoteReserve, mweiStr("30000")); + // assert.equal(b_dlp, decimalStr("5")); + // assert.equal(b_WETH, decimalStr("0")); + // assert.equal(b_USDT, mweiStr("940000")); + // await DVM_WETH_USDT.methods.approve(ctx.SmartApprove.options.address, MAX_UINT256).send(ctx.sendParam(project)); + // var tx = await logGas(await ctx.DODOProxy.methods.removeDVMLiquidity( + // dvm_WETH_USDT, + // project, + // decimalStr("1"), + // decimalStr("0"), + // mweiStr("0"), + // 1, + // Math.floor(new Date().getTime() / 1000 + 60 * 10) + // ), ctx.sendParam(project), "removeLiquidity - ETH"); + // var a_baseReserve = await DVM_WETH_USDT.methods._BASE_RESERVE_().call(); + // var a_quoteReserve = await DVM_WETH_USDT.methods._QUOTE_RESERVE_().call(); + // var a_dlp = await DVM_WETH_USDT.methods.balanceOf(project).call(); + // var a_WETH = await ctx.WETH.methods.balanceOf(project).call(); + // var a_USDT = await ctx.USDT.methods.balanceOf(project).call(); + // var a_ETH = await ctx.Web3.eth.getBalance(project); + // // console.log("a_baseReserve:" + a_baseReserve + " a_quoteReserve:" + a_quoteReserve + " a_dlp:" + a_dlp + " a_WETH:" + a_WETH + " a_USDT:" + a_USDT); + // assert.equal(a_baseReserve, decimalStr("4")); + // assert.equal(a_quoteReserve, mweiStr("24000")); + // assert.equal(a_dlp, decimalStr("4")); + // assert.equal(a_WETH, decimalStr("0")); + // assert.equal(a_USDT, mweiStr("946000")); + // console.log("b_ETH:", b_ETH); + // console.log("a_ETH:", a_ETH); + // assert.equal(new BigNumber(b_ETH).isGreaterThan(new BigNumber(a_ETH).minus(decimalStr("1"))), true); + // }); + + + // it("removeLiquidity - permit", async () => { + // var b_baseReserve = await DVM_DODO_USDT.methods._BASE_RESERVE_().call(); + // var b_quoteReserve = await DVM_DODO_USDT.methods._QUOTE_RESERVE_().call(); + // var b_dlp = await DVM_DODO_USDT.methods.balanceOf(project).call(); + // var b_DODO = await ctx.DODO.methods.balanceOf(project).call(); + // var b_USDT = await ctx.USDT.methods.balanceOf(project).call(); + // assert.equal(b_baseReserve, decimalStr("100000")); + // assert.equal(b_quoteReserve, mweiStr("30000")); + // assert.equal(b_dlp, decimalStr("100000")); + // assert.equal(b_DODO, decimalStr("900000")); + // assert.equal(b_USDT, mweiStr("940000")); + + // var DOMAIN_SEPARATOR = await DVM_DODO_USDT.methods.DOMAIN_SEPARATOR().call(); + // // var name = await DVM_DODO_USDT.methods.name().call(); + // // typedData.domain.name = ctx.Web3.utils.sha3(name); + // // typedData.domain.version = ctx.Web3.utils.sha3('1'); + // // typedData.domain.chainId = await ctx.Web3.eth.getChainId(); + // // typedData.domain.verifyingContract = dvm_DODO_USDT; + // typedData.message.owner = project; + // typedData.message.spender = ctx.SmartApprove.options.address; + // var nonceStr = await DVM_DODO_USDT.methods.nonces(project).call(); + // typedData.message.nonce = parseInt(nonceStr); + // typedData.message.deadline = Math.floor(new Date().getTime() / 1000 + 60 * 10); + // var resHash = new SignHelper().signHash(DOMAIN_SEPARATOR,typedData.message); + // var sig = await ctx.Web3.eth.sign('0x' + resHash.toString('hex'), project); + // // let r = sig.slice(0, 66) + // // let s = '0x' + sig.slice(66, 130) + // // let v = '0x1c' + // const signRes = ethUtil.fromRpcSig(sig); + // const prefix = Buffer.from("\x19Ethereum Signed Message:\n"); + // const prefixedMsg = ethUtil.keccak256( + // Buffer.concat([prefix, Buffer.from(String(resHash.length)), resHash]) + // ); + // console.log("add-prefix-degist:", "0x" + prefixedMsg.toString('hex')); + // var pubKey = ethUtil.ecrecover(prefixedMsg, signRes.v,signRes.r,signRes.s) + // // var pubKey = ethUtil.ecrecover(resHash, Buffer.from(v), Buffer.from(r), Buffer.from(s)) + // var addrBuf = ethUtil.pubToAddress(pubKey); + // console.log("project:" + project); + // console.log("addr-web3-recover:" + ethUtil.bufferToHex(addrBuf)); + // // var tx = await logGas(await DVM_DODO_USDT.methods.permit(project, typedData.message.spender, typedData.message.value, typedData.message.deadline, signRes.v, signRes.r, signRes.s), ctx.sendParam(project), "perimit test"); + // // console.log("addr-sol-recover:" + tx.events['TestAddr'].returnValues['addr']); + // // console.log("sol-domain:" + tx.events['TestAddr'].returnValues['domain']); + // // console.log("sol-msg:" + tx.events['TestAddr'].returnValues['message']); + // // console.log("sol-digest:" + tx.events['TestAddr'].returnValues['digest']); + // // await logGas(await ctx.DODOProxy.methods.removeDVMLiquidityWithPermit( + // // dvm_DODO_USDT, + // // project, + // // decimalStr("100"), + // // decimalStr("0"), + // // mweiStr("0"), + // // 0, + // // typedData.message.deadline, + // // true, + // // signRes.v, signRes.r, signRes.s + // // ), ctx.sendParam(project), "removeLiquidity perimit"); + // // var a_baseReserve = await DVM_DODO_USDT.methods._BASE_RESERVE_().call(); + // // var a_quoteReserve = await DVM_DODO_USDT.methods._QUOTE_RESERVE_().call(); + // // var a_dlp = await DVM_DODO_USDT.methods.balanceOf(project).call(); + // // var a_DODO = await ctx.DODO.methods.balanceOf(project).call(); + // // var a_USDT = await ctx.USDT.methods.balanceOf(project).call(); + // // console.log("a_baseReserve:" + a_baseReserve + " a_quoteReserve:" + a_quoteReserve + " a_dlp:" + a_dlp + " a_DODO:" + a_DODO + " a_USDT:" + a_USDT); + // // assert.equal(a_baseReserve, decimalStr("99900")); + // // assert.equal(a_quoteReserve, mweiStr("29970")); + // // assert.equal(a_dlp, decimalStr("99900")); + // // assert.equal(a_DODO, decimalStr("900100")); + // // assert.equal(a_USDT, mweiStr("940030")); + // }); + }); }); diff --git a/test/Proxy/proxy.mix.test.ts b/test/Proxy/proxy.mix.test.ts new file mode 100644 index 0000000..84c9cd0 --- /dev/null +++ b/test/Proxy/proxy.mix.test.ts @@ -0,0 +1,204 @@ +/* + + Copyright 2020 DODO ZOO. + SPDX-License-Identifier: Apache-2.0 + +*/ + +// import * as assert from 'assert'; +import { decimalStr, mweiStr } from '../utils/Converter'; +import { logGas } from '../utils/Log'; +import { ProxyContext, getProxyContext } from '../utils/ProxyContext'; +import { assert } from 'chai'; +import * as contracts from '../utils/Contracts'; +import { Contract } from 'web3-eth-contract'; + +let lp: string; +let project: string; +let trader: string; + +let config = { + lpFeeRate: decimalStr("0.002"), + mtFeeRate: decimalStr("0.001"), + k: decimalStr("0.1"), + i: decimalStr("100"), +}; + +async function init(ctx: ProxyContext): Promise { + lp = ctx.SpareAccounts[0]; + project = ctx.SpareAccounts[1]; + trader = ctx.SpareAccounts[2]; + + await ctx.mintTestToken(lp, ctx.DODO, decimalStr("1000000")); + await ctx.mintTestToken(project, ctx.DODO, decimalStr("1000000")); + + await ctx.mintTestToken(lp, ctx.USDT, mweiStr("1000000")); + await ctx.mintTestToken(project, ctx.USDT, mweiStr("1000000")); + + await ctx.approveProxy(lp); + await ctx.approveProxy(project); + await ctx.approveProxy(trader); +} + + +async function initCreateDPP(ctx: ProxyContext, token0: string, token1: string, token0Amount: string, token1Amount: string, ethValue: string, i: string): Promise { + let PROXY = ctx.DODOProxy; + await PROXY.methods.createDODOPrivatePool( + token0, + token1, + token0Amount, + token1Amount, + config.lpFeeRate, + config.mtFeeRate, + i, + config.k, + Math.floor(new Date().getTime() / 1000 + 60 * 10) + ).send(ctx.sendParam(project, ethValue)); + if (token0 == '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE') token0 = ctx.WETH.options.address; + if (token1 == '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE') token1 = ctx.WETH.options.address; + var addr = await ctx.DPPFactory.methods._REGISTRY_(token0, token1, 0).call(); + return addr; +} + +async function initCreateDVM(ctx: ProxyContext, token0: string, token1: string, token0Amount: string, token1Amount: string, ethValue: string, i: string): Promise { + let PROXY = ctx.DODOProxy; + await PROXY.methods.createDODOVendingMachine( + project, + token0, + token1, + token0Amount, + token1Amount, + config.lpFeeRate, + config.mtFeeRate, + i, + config.k, + Math.floor(new Date().getTime() / 1000 + 60 * 10) + ).send(ctx.sendParam(project, ethValue)); + if (token0 == '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE') token0 = ctx.WETH.options.address; + if (token1 == '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE') token1 = ctx.WETH.options.address; + var addr = await ctx.DVMFactory.methods._REGISTRY_(token0, token1, 0).call(); + return addr; +} + +describe("DODOProxyV2.0", () => { + let snapshotId: string; + let ctx: ProxyContext; + let dpp_DODO_USDT: string; + let dvm_WETH_USDT: string; + + before(async () => { + ctx = await getProxyContext(); + await init(ctx); + dpp_DODO_USDT = await initCreateDPP(ctx, ctx.DODO.options.address, ctx.USDT.options.address, decimalStr("100000"), mweiStr("30000"), "0", mweiStr("0.3")); + dvm_WETH_USDT = await initCreateDVM(ctx, '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE', ctx.USDT.options.address, decimalStr("5"), mweiStr("30000"), "5", mweiStr("600")); + console.log("dpp_DODO_USDT:", dpp_DODO_USDT); + console.log("dvm_WETH_USDT:", dvm_WETH_USDT); + }); + + beforeEach(async () => { + snapshotId = await ctx.EVM.snapshot(); + }); + + afterEach(async () => { + await ctx.EVM.reset(snapshotId); + }); + + describe("DODOProxy", () => { + + it("swap - two jump", async () => { + await ctx.mintTestToken(trader, ctx.DODO, decimalStr("1000")); + var b_DOOD = await ctx.DODO.methods.balanceOf(trader).call(); + var b_WETH = await ctx.WETH.methods.balanceOf(trader).call(); + var dodoPairs = [ + dpp_DODO_USDT, + dvm_WETH_USDT + ] + var directions = [ + 0, + 1 + ] + var tx = await logGas(await ctx.DODOProxy.methods.dodoSwapTokenToToken( + trader, + ctx.DODO.options.address, + ctx.WETH.options.address, + decimalStr("500"), + 1, + dodoPairs, + directions, + Math.floor(new Date().getTime() / 1000 + 60 * 10) + ), ctx.sendParam(trader), "swap - two jump"); + var a_DOOD = await ctx.DODO.methods.balanceOf(trader).call(); + var a_WETH = await ctx.WETH.methods.balanceOf(trader).call(); + console.log("b_DOOD:" + b_DOOD + " a_DODO:" + a_DOOD); + console.log("b_WETH:" + b_WETH + " a_WETH:" + a_WETH); + assert.equal(a_DOOD, decimalStr("500")); + assert.equal(a_WETH, "40729644076866177"); + }); + + it("swap - two jump - inETH", async () => { + var b_DOOD = await ctx.DODO.methods.balanceOf(trader).call(); + var b_WETH = await ctx.WETH.methods.balanceOf(trader).call(); + var b_ETH = await ctx.Web3.eth.getBalance(trader); + var dodoPairs = [ + dvm_WETH_USDT, + dpp_DODO_USDT + ] + var directions = [ + 0, + 1 + ] + var tx = await logGas(await ctx.DODOProxy.methods.dodoSwapETHToToken( + trader, + ctx.DODO.options.address, + decimalStr("1"), + 1, + dodoPairs, + directions, + Math.floor(new Date().getTime() / 1000 + 60 * 10) + ), ctx.sendParam(trader, "1"), "swap - two jump - inETH"); + var a_DOOD = await ctx.DODO.methods.balanceOf(trader).call(); + var a_WETH = await ctx.WETH.methods.balanceOf(trader).call(); + var a_ETH = await ctx.Web3.eth.getBalance(trader); + console.log("b_DOOD:" + b_DOOD + " a_DODO:" + a_DOOD); + console.log("b_WETH:" + b_WETH + " a_WETH:" + a_WETH); + console.log("b_ETH:" + b_ETH + " a_ETH:" + a_ETH); + assert.equal(a_DOOD, "10214032255413753721651"); + }); + + + it("swap - two jump - outETH", async () => { + await ctx.mintTestToken(trader, ctx.DODO, decimalStr("100000")); + var b_DOOD = await ctx.DODO.methods.balanceOf(trader).call(); + var b_WETH = await ctx.WETH.methods.balanceOf(trader).call(); + var b_ETH = await ctx.Web3.eth.getBalance(trader); + var dodoPairs = [ + dpp_DODO_USDT, + dvm_WETH_USDT + ] + var directions = [ + 0, + 1 + ] + var tx = await logGas(await ctx.DODOProxy.methods.dodoSwapTokenToETH( + trader, + ctx.DODO.options.address, + decimalStr("10000"), + 1, + dodoPairs, + directions, + Math.floor(new Date().getTime() / 1000 + 60 * 10) + ), ctx.sendParam(trader), "swap - two jump - outETH"); + var a_DOOD = await ctx.DODO.methods.balanceOf(trader).call(); + var a_WETH = await ctx.WETH.methods.balanceOf(trader).call(); + var a_ETH = await ctx.Web3.eth.getBalance(trader); + console.log("b_DOOD:" + b_DOOD + " a_DODO:" + a_DOOD); + console.log("b_WETH:" + b_WETH + " a_WETH:" + a_WETH); + console.log("b_ETH:" + b_ETH + " a_ETH:" + a_ETH); + assert.equal(a_DOOD, decimalStr("90000")); + assert.equal( + tx.events['OrderHistory'].returnValues['returnAmount'], + "711081782556285356" + ) + }); + }); +}); diff --git a/test/utils/Contracts.ts b/test/utils/Contracts.ts index 70d1b34..bbec31f 100644 --- a/test/utils/Contracts.ts +++ b/test/utils/Contracts.ts @@ -43,6 +43,7 @@ export const SMART_APPROVE = "DODOApprove" export const DODO_SELL_HELPER = "DODOSellHelper" export const DVM_ADMIN_NAME = "DVMAdmin" export const DPP_ADMIN_NAME = "DPPAdmin" +export const DODO_CALLEE_HELPER_NAME = "DODOCalleeHelper" interface ContractJson { abi: any; diff --git a/test/utils/ProxyContext.ts b/test/utils/ProxyContext.ts index 4238bd4..098c03d 100644 --- a/test/utils/ProxyContext.ts +++ b/test/utils/ProxyContext.ts @@ -27,6 +27,7 @@ export class ProxyContext { DVMFactory: Contract; DPPFactory: Contract; SmartApprove: Contract; + DODOCalleeHelper: Contract; //token DODO: Contract; @@ -113,6 +114,11 @@ export class ProxyContext { ["USDT Token", "USDT", 6] ); + this.DODOCalleeHelper = await contracts.newContract( + contracts.DODO_CALLEE_HELPER_NAME, + [this.WETH.options.address] + ) + console.log(log.blueText("[Init DVM context]")); } diff --git a/truffle-test.sh b/truffle-test.sh index 5843314..fa07378 100644 --- a/truffle-test.sh +++ b/truffle-test.sh @@ -11,6 +11,12 @@ then truffle test ./test/Proxy/proxy.dvm.test.ts fi +if [ "$1"x = "proxy-mix"x ] +then + truffle test ./test/Proxy/proxy.mix.test.ts +fi + + if [ "$1"x = "route"x ] then truffle test ./test/Route/route.test.ts