diff --git a/contracts/SmartRoute/helper/DODOSwapCalcHelper.sol b/contracts/SmartRoute/helper/DODOSwapCalcHelper.sol new file mode 100644 index 0000000..bc9de75 --- /dev/null +++ b/contracts/SmartRoute/helper/DODOSwapCalcHelper.sol @@ -0,0 +1,40 @@ +/* + + Copyright 2020 DODO ZOO. + SPDX-License-Identifier: Apache-2.0 + +*/ + +pragma solidity 0.6.9; + +import {IDODOV1} from "../intf/IDODOV1.sol"; +import {IDODOSellHelper} from "./DODOSellHelper.sol"; + +contract DODOSwapCalcHelper { + address public immutable _DODO_SELL_HELPER_; + + constructor(address dodoSellHelper) public { + _DODO_SELL_HELPER_ = dodoSellHelper; + } + + function calcReturnAmountV1( + uint256 fromTokenAmount, + address[] memory dodoPairs, + uint8[] memory directions + ) external view returns (uint256 returnAmount,uint256[] memory midPrices) { + returnAmount = fromTokenAmount; + midPrices = new uint256[](dodoPairs.length); + for (uint256 i = 0; i < dodoPairs.length; i++) { + address curDodoPair = dodoPairs[i]; + if (directions[i] == 0) { + returnAmount = IDODOV1(curDodoPair).querySellBaseToken(returnAmount); + } else { + returnAmount = IDODOSellHelper(_DODO_SELL_HELPER_).querySellQuoteToken( + curDodoPair, + returnAmount + ); + } + midPrices[i] = IDODOV1(curDodoPair).getMidPrice(); + } + } +} diff --git a/contracts/SmartRoute/intf/IDODOV1.sol b/contracts/SmartRoute/intf/IDODOV1.sol index 0f748fb..953f5ca 100644 --- a/contracts/SmartRoute/intf/IDODOV1.sol +++ b/contracts/SmartRoute/intf/IDODOV1.sol @@ -77,4 +77,6 @@ interface IDODOV1 { function getExpectedTarget() external view returns (uint256 baseTarget, uint256 quoteTarget); function getOraclePrice() external view returns (uint256); + + function getMidPrice() external view returns (uint256 midPrice); } diff --git a/deploy-detail-v1.5.txt b/deploy-detail-v1.5.txt index 12f781a..beef31c 100644 --- a/deploy-detail-v1.5.txt +++ b/deploy-detail-v1.5.txt @@ -1,3 +1,12 @@ ==================================================== network type: kovan -Deploy time: 2020/12/7 下午3:15:48 +Deploy time: 2020/12/9 下午10:11:50 +DODOSwapCalcHelper Address: 0x096b90D15AB8319f6829C96E7062556b74806988 +==================================================== +network type: bsclive +Deploy time: 2020/12/9 下午10:14:15 +DODOSwapCalcHelper Address: 0xED3Ac3335a24331F1704df8CB456C88dCA282782 +==================================================== +network type: live +Deploy time: 2020/12/9 下午10:16:19 +DODOSwapCalcHelper Address: 0x22C1a736DBE8200E6DF2f3D8F97c0D5749c1E257 diff --git a/migrations/2_deploy_v1.5.js b/migrations/2_deploy_v1.5.js index 92c542e..ea149b1 100644 --- a/migrations/2_deploy_v1.5.js +++ b/migrations/2_deploy_v1.5.js @@ -5,17 +5,20 @@ let logger = new console.Console(file, file); const DODOApprove = artifacts.require("DODOApprove"); const DODOProxyV1 = artifacts.require("DODOV1Proxy01"); const DODOSellHelper = artifacts.require("DODOSellHelper"); +const DODOSwapCalcHelper = artifacts.require("DODOSwapCalcHelper"); -const DEPLOY_ROUTE = false; +const DEPLOY_ROUTE = true; module.exports = async (deployer, network, accounts) => { let DODOSellHelperAddress = ""; let WETHAddress = ""; let DODOApproveAddress = ""; let chiAddress = ""; + let DODOSwapCalcHelperAddress = ""; if (network == "kovan") { DODOSellHelperAddress = "0xbdEae617F2616b45DCB69B287D52940a76035Fe3"; WETHAddress = "0x5eca15b12d959dfcf9c71c59f8b467eb8c6efd0b"; + DODOSwapCalcHelperAddress = ""; // DODOApproveAddress = "0xbcf0fC05860b14cB3D62D1d4C7f531Ad2F28E0fE"; DODOApproveAddress = "0x0C4a80B2e234448E5f6fD86e7eFA733d985004c8"; chiAddress = "0x0000000000004946c0e9f43f4dee607b0ef1fa1c"; @@ -24,19 +27,22 @@ module.exports = async (deployer, network, accounts) => { WETHAddress = "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"; DODOApproveAddress = "0x4eC851895d85bfa6835241b3157ae10FfFD3BebC"; chiAddress = "0x0000000000004946c0e9F43F4Dee607b0eF1fA1c"; + DODOSwapCalcHelperAddress = ""; } else if (network == "bsclive") { DODOSellHelperAddress = "0x0F859706AeE7FcF61D5A8939E8CB9dBB6c1EDA33"; WETHAddress = "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c"; DODOApproveAddress = "0x19DA73be23Cea6bFA804Ec020041b8F3971BC522"; chiAddress = "0x0000000000000000000000000000000000000000"; + DODOSwapCalcHelperAddress = ""; } else return; - logger.log("===================================================="); - logger.log("network type: " + network); - logger.log("Deploy time: " + new Date().toLocaleString()); - if (DEPLOY_ROUTE) { - logger.log("Deploy type: Proxy"); + + logger.log("===================================================="); + logger.log("network type: " + network); + logger.log("Deploy time: " + new Date().toLocaleString()); + + // logger.log("Deploy type: Proxy"); if (DODOApproveAddress == "") { await deployer.deploy(DODOApprove); DODOApproveAddress = DODOApprove.address; @@ -45,19 +51,25 @@ module.exports = async (deployer, network, accounts) => { await deployer.deploy(DODOSellHelper); DODOSellHelperAddress = DODOSellHelper.address; } - logger.log("DODOApprove Address: ", DODOApproveAddress); - logger.log("DODOSellHelper Address: ", DODOSellHelperAddress); - await deployer.deploy( - DODOProxyV1, - DODOApproveAddress, - DODOSellHelperAddress, - WETHAddress, - chiAddress - ); - logger.log("DODOProxyV1 Address: ", DODOProxyV1.address); + if (DODOSwapCalcHelperAddress == "") { + await deployer.deploy(DODOSwapCalcHelper, DODOSellHelperAddress); + DODOSwapCalcHelperAddress = DODOSwapCalcHelper.address; + } + // logger.log("DODOApprove Address: ", DODOApproveAddress); + // logger.log("DODOSellHelper Address: ", DODOSellHelperAddress); + logger.log("DODOSwapCalcHelper Address: ", DODOSwapCalcHelperAddress); - const DODOApproveInstance = await DODOApprove.at(DODOApproveAddress); - var tx = await DODOApproveInstance.setDODOProxy(DODOProxyV1.address); - logger.log("DODOApprovce setProxy tx: ", tx.tx); + // await deployer.deploy( + // DODOProxyV1, + // DODOApproveAddress, + // DODOSellHelperAddress, + // WETHAddress, + // chiAddress + // ); + // logger.log("DODOProxyV1 Address: ", DODOProxyV1.address); + + // const DODOApproveInstance = await DODOApprove.at(DODOApproveAddress); + // var tx = await DODOApproveInstance.setDODOProxy(DODOProxyV1.address); + // logger.log("DODOApprovce setProxy tx: ", tx.tx); } }; diff --git a/migrations/3_deploy_v2.js b/migrations/3_deploy_v2.js index 91020c7..04f7db5 100644 --- a/migrations/3_deploy_v2.js +++ b/migrations/3_deploy_v2.js @@ -19,7 +19,7 @@ const DODOProxyV2 = artifacts.require("DODOV2Proxy01"); const DODOSellHelper = artifacts.require("DODOSellHelper"); const DODOCalleeHelper = artifacts.require("DODOCalleeHelper"); -const DEPLOY_V2 = true; +const DEPLOY_V2 = false; module.exports = async (deployer, network, accounts) => { let DODOSellHelperAddress = ""; @@ -72,11 +72,11 @@ module.exports = async (deployer, network, accounts) => { //Template } else return; - logger.log("===================================================="); - logger.log("network type: " + network); - logger.log("Deploy time: " + new Date().toLocaleString()); if (DEPLOY_V2) { + logger.log("===================================================="); + logger.log("network type: " + network); + logger.log("Deploy time: " + new Date().toLocaleString()); logger.log("Deploy type: V2"); if (CloneFactoryAddress == "") { await deployer.deploy(CloneFactory); diff --git a/test/Route/Route.test.ts b/test/Route/Route.test.ts index da051f1..720975b 100644 --- a/test/Route/Route.test.ts +++ b/test/Route/Route.test.ts @@ -105,10 +105,19 @@ async function calcRoute(ctx: DODOContext, fromTokenAmount: string, slippage: nu } } + var [returmAmount, midPrices] = await ctx.DODOSwapCalcHelper.methods.calcReturnAmountV1( + fromTokenAmount, + dodoPairs, + directions, + ).call(); + console.log("returnAmount:", returmAmount) + console.log("localAmount:", swapAmount) + console.log("midPrices:", midPrices) + let toAmount = new BigNumber(swapAmount).multipliedBy(1 - slippage).toFixed(0, BigNumber.ROUND_DOWN) // console.log("minAmount:",toAmount); - let deadline = Math.floor(new Date().getTime()/1000 + 60 * 10); + let deadline = Math.floor(new Date().getTime() / 1000 + 60 * 10); return ctx.DODOProxyV1.methods.dodoSwapV1( routes[0].address, @@ -144,7 +153,7 @@ describe("Trader", () => { }); describe("route calc test", () => { - it.only("DODO to USDT directly swap", async () => { + it("DODO to USDT directly swap", async () => { var b_DODO = await ctx.DODO.methods.balanceOf(trader).call() var b_USDT = await ctx.USDT.methods.balanceOf(trader).call() var c_b_CHI = await ctx.CHI.methods.balanceOf(ctx.DODOProxyV1.options.address).call() diff --git a/test/utils-v1/Contracts.ts b/test/utils-v1/Contracts.ts index 48138b6..afd14ab 100644 --- a/test/utils-v1/Contracts.ts +++ b/test/utils-v1/Contracts.ts @@ -32,6 +32,7 @@ const SmartApprove = require(`${jsonPath2}DODOApprove.json`) const DODOSellHelper = require(`${jsonPath2}DODOSellHelper.json`) const WETH = require(`${jsonPath2}WETH9.json`) const CHI = require(`${jsonPath2}ChiToken.json`) +const DODOSwapCalcHelper = require(`${jsonPath2}DODOSwapCalcHelper.json`) /******/ import { getDefaultWeb3 } from './EVM'; @@ -57,6 +58,7 @@ export const SMART_SWAP = "DODOV1Proxy01" export const SMART_APPROVE = "DODOApprove" export const DODO_SELL_HELPER = "DODOSellHelper" export const CHI_TOKEN = "ChiToken" +export const DODO_SWAP_CALC_HELPER = "DODOSwapCalcHelper" /******/ var contractMap: { [name: string]: any } = {} @@ -79,6 +81,7 @@ contractMap[SMART_SWAP] = SmartSwap contractMap[SMART_APPROVE] = SmartApprove contractMap[DODO_SELL_HELPER] = DODOSellHelper contractMap[CHI_TOKEN] = CHI +contractMap[DODO_SWAP_CALC_HELPER] = DODOSwapCalcHelper /******/ interface ContractJson { diff --git a/test/utils-v1/ProxyContextV1.ts b/test/utils-v1/ProxyContextV1.ts index 57c9688..61988ba 100644 --- a/test/utils-v1/ProxyContextV1.ts +++ b/test/utils-v1/ProxyContextV1.ts @@ -74,6 +74,8 @@ export class DODOContext { DODOProxyV1: Contract; DODOApprove: Contract; DODOSellHelper: Contract; + //Helper + DODOSwapCalcHelper: Contract; constructor() { } @@ -238,6 +240,10 @@ export class DODOContext { await this.DODOApprove.methods.setDODOProxy(this.DODOProxyV1.options.address).send(this.sendParam(this.Deployer)); // await this.CHI.methods.transfer(this.DODOProxyV1.options.address,140).send(this.sendParam(this.Deployer)); + + this.DODOSwapCalcHelper = await contracts.newContract( + contracts.DODO_SWAP_CALC_HELPER,[this.DODOSellHelper.options.address] + ); console.log(log.blueText("[Init dodo context]")); } diff --git a/truffle-config.js b/truffle-config.js index 582f062..fdbcedc 100644 --- a/truffle-config.js +++ b/truffle-config.js @@ -68,7 +68,7 @@ module.exports = { return new HDWalletProvider(privKey, "https://mainnet.infura.io/v3/" + infuraId); }, gas: 3000000, - gasPrice: 45000000000, + gasPrice: 50000000000, network_id: 1, skipDryRun: true },