DODO Token

This commit is contained in:
mingda
2020-09-17 15:04:11 +08:00
parent ff6dfdd3e7
commit 98023df93c
8 changed files with 1620 additions and 15 deletions

View File

@@ -65,6 +65,13 @@ describe("DODO ZOO", () => {
// console.log(await ctx.DODOZoo.methods.getDODOs().call())
})
// it.only("remove dodo", async () => {
// console.log(await ctx.DODOZoo.methods.getDODOs().call())
// await ctx.DODOZoo.methods.removeDODO(ctx.DODO.options.address).send(ctx.sendParam(ctx.Deployer))
// console.log(await ctx.DODOZoo.methods.getDODO(ctx.BASE.options.address, ctx.QUOTE.options.address).call())
// console.log(await ctx.DODOZoo.methods.getDODOs().call())
// })
it("dodo register control flow", async () => {
await ctx.DODOZoo.methods.removeDODO(ctx.DODO.options.address).send(ctx.sendParam(ctx.Deployer))
assert.equal(await ctx.DODOZoo.methods.getDODO(ctx.BASE.options.address, ctx.QUOTE.options.address).call(), "0x0000000000000000000000000000000000000000")

View File

@@ -52,11 +52,15 @@ describe("Trader", () => {
describe("R goes above ONE", () => {
it("buy when R equals ONE", async () => {
<<<<<<< Updated upstream
await logGas(
ctx.DODO.methods.buyBaseToken(decimalStr("1"), decimalStr("110"), "0x"),
ctx.sendParam(trader),
"buy base token when balanced"
);
=======
await logGas(ctx.DODO.methods.buyBaseToken(decimalStr("1"), decimalStr("110"), "0x"), ctx.sendParam(trader), "buy base token when balanced")
>>>>>>> Stashed changes
// trader balances
assert.equal(
await ctx.BASE.methods.balanceOf(trader).call(),
@@ -92,6 +96,7 @@ describe("Trader", () => {
});
it("buy when R is ABOVE ONE", async () => {
<<<<<<< Updated upstream
await ctx.DODO.methods
.buyBaseToken(decimalStr("1"), decimalStr("110"), "0x")
.send(ctx.sendParam(trader));
@@ -100,6 +105,10 @@ describe("Trader", () => {
ctx.sendParam(trader),
"buy when R is ABOVE ONE"
);
=======
await ctx.DODO.methods.buyBaseToken(decimalStr("1"), decimalStr("110"), "0x").send(ctx.sendParam(trader))
await logGas(ctx.DODO.methods.buyBaseToken(decimalStr("1"), decimalStr("130"), "0x"), ctx.sendParam(trader), "buy when R is ABOVE ONE")
>>>>>>> Stashed changes
// trader balances
assert.equal(
await ctx.BASE.methods.balanceOf(trader).call(),
@@ -130,6 +139,7 @@ describe("Trader", () => {
});
it("sell when R is ABOVE ONE", async () => {
<<<<<<< Updated upstream
await ctx.DODO.methods
.buyBaseToken(decimalStr("1"), decimalStr("110"), "0x")
.send(ctx.sendParam(trader));
@@ -142,6 +152,10 @@ describe("Trader", () => {
ctx.sendParam(trader),
"sell when R is ABOVE ONE"
);
=======
await ctx.DODO.methods.buyBaseToken(decimalStr("1"), decimalStr("110"), "0x").send(ctx.sendParam(trader))
await logGas(ctx.DODO.methods.sellBaseToken(decimalStr("0.5"), decimalStr("40"), "0x"), ctx.sendParam(trader), "sell when R is ABOVE ONE")
>>>>>>> Stashed changes
// trader balances
assert.equal(
await ctx.BASE.methods.balanceOf(trader).call(),
@@ -172,6 +186,7 @@ describe("Trader", () => {
});
it("sell when R is ABOVE ONE and RStatus back to ONE", async () => {
<<<<<<< Updated upstream
await ctx.DODO.methods
.buyBaseToken(decimalStr("1"), decimalStr("110"), "0x")
.send(ctx.sendParam(trader));
@@ -184,6 +199,10 @@ describe("Trader", () => {
ctx.sendParam(trader),
"sell when R is ABOVE ONE and RStatus back to ONE"
);
=======
await ctx.DODO.methods.buyBaseToken(decimalStr("1"), decimalStr("110"), "0x").send(ctx.sendParam(trader))
await logGas(ctx.DODO.methods.sellBaseToken("1003002430889317763", decimalStr("90"), "0x"), ctx.sendParam(trader), "sell when R is ABOVE ONE and RStatus back to ONE")
>>>>>>> Stashed changes
// R status
assert.equal(await ctx.DODO.methods._R_STATUS_().call(), "0");
// trader balances
@@ -225,6 +244,7 @@ describe("Trader", () => {
});
it("sell when R is ABOVE ONE and RStatus becomes BELOW ONE", async () => {
<<<<<<< Updated upstream
await ctx.DODO.methods
.buyBaseToken(decimalStr("1"), decimalStr("110"), "0x")
.send(ctx.sendParam(trader));
@@ -233,6 +253,10 @@ describe("Trader", () => {
ctx.sendParam(trader),
"sell when R is ABOVE ONE and RStatus becomes BELOW ONE [gas cost worst case]"
);
=======
await ctx.DODO.methods.buyBaseToken(decimalStr("1"), decimalStr("110"), "0x").send(ctx.sendParam(trader))
await logGas(ctx.DODO.methods.sellBaseToken(decimalStr("2"), decimalStr("90"), "0x"), ctx.sendParam(trader), "sell when R is ABOVE ONE and RStatus becomes BELOW ONE [gas cost worst case]")
>>>>>>> Stashed changes
// R status
assert.equal(await ctx.DODO.methods._R_STATUS_().call(), "2");
// trader balances
@@ -276,11 +300,15 @@ describe("Trader", () => {
describe("R goes below ONE", () => {
it("sell when R equals ONE", async () => {
<<<<<<< Updated upstream
await logGas(
ctx.DODO.methods.sellBaseToken(decimalStr("1"), decimalStr("90"), "0x"),
ctx.sendParam(trader),
"sell base token when balanced"
);
=======
await logGas(ctx.DODO.methods.sellBaseToken(decimalStr("1"), decimalStr("90"), "0x"), ctx.sendParam(trader), "sell base token when balanced")
>>>>>>> Stashed changes
// trader balances
assert.equal(
await ctx.BASE.methods.balanceOf(trader).call(),
@@ -316,6 +344,7 @@ describe("Trader", () => {
});
it("sell when R is BELOW ONE", async () => {
<<<<<<< Updated upstream
await ctx.DODO.methods
.sellBaseToken(decimalStr("3"), decimalStr("90"), "0x")
.send(ctx.sendParam(trader));
@@ -324,6 +353,10 @@ describe("Trader", () => {
ctx.sendParam(trader),
"sell when R is BELOW ONE"
);
=======
await ctx.DODO.methods.sellBaseToken(decimalStr("3"), decimalStr("90"), "0x").send(ctx.sendParam(trader))
await logGas(ctx.DODO.methods.sellBaseToken(decimalStr("3"), decimalStr("90"), "0x"), ctx.sendParam(trader), "sell when R is BELOW ONE")
>>>>>>> Stashed changes
// trader balances
assert.equal(
await ctx.BASE.methods.balanceOf(trader).call(),
@@ -354,6 +387,7 @@ describe("Trader", () => {
});
it("buy when R is BELOW ONE", async () => {
<<<<<<< Updated upstream
await ctx.DODO.methods
.sellBaseToken(decimalStr("1"), decimalStr("90"), "0x")
.send(ctx.sendParam(trader));
@@ -366,6 +400,10 @@ describe("Trader", () => {
ctx.sendParam(trader),
"buy when R is BELOW ONE"
);
=======
await ctx.DODO.methods.sellBaseToken(decimalStr("1"), decimalStr("90"), "0x").send(ctx.sendParam(trader))
await logGas(ctx.DODO.methods.buyBaseToken(decimalStr("0.5"), decimalStr("60"), "0x"), ctx.sendParam(trader), "buy when R is BELOW ONE")
>>>>>>> Stashed changes
// trader balances
assert.equal(
await ctx.BASE.methods.balanceOf(trader).call(),
@@ -396,6 +434,7 @@ describe("Trader", () => {
});
it("buy when R is BELOW ONE and RStatus back to ONE", async () => {
<<<<<<< Updated upstream
await ctx.DODO.methods
.sellBaseToken(decimalStr("1"), decimalStr("90"), "0x")
.send(ctx.sendParam(trader));
@@ -408,6 +447,10 @@ describe("Trader", () => {
ctx.sendParam(trader),
"buy when R is BELOW ONE and RStatus back to ONE"
);
=======
await ctx.DODO.methods.sellBaseToken(decimalStr("1"), decimalStr("90"), "0x").send(ctx.sendParam(trader))
await logGas(ctx.DODO.methods.buyBaseToken("997008973080757728", decimalStr("110"), "0x"), ctx.sendParam(trader), "buy when R is BELOW ONE and RStatus back to ONE")
>>>>>>> Stashed changes
// R status
assert.equal(await ctx.DODO.methods._R_STATUS_().call(), "0");
// trader balances
@@ -449,6 +492,7 @@ describe("Trader", () => {
});
it("buy when R is BELOW ONE and RStatus becomes ABOVE ONE", async () => {
<<<<<<< Updated upstream
await ctx.DODO.methods
.sellBaseToken(decimalStr("1"), decimalStr("90"), "0x")
.send(ctx.sendParam(trader));
@@ -457,6 +501,10 @@ describe("Trader", () => {
ctx.sendParam(trader),
"buy when R is BELOW ONE and RStatus becomes ABOVE ONE [gas cost worst case]"
);
=======
await ctx.DODO.methods.sellBaseToken(decimalStr("1"), decimalStr("90"), "0x").send(ctx.sendParam(trader))
await logGas(ctx.DODO.methods.buyBaseToken(decimalStr("2"), decimalStr("220"), "0x"), ctx.sendParam(trader), "buy when R is BELOW ONE and RStatus becomes ABOVE ONE [gas cost worst case]")
>>>>>>> Stashed changes
// R status
assert.equal(await ctx.DODO.methods._R_STATUS_().call(), "1");
// trader balances

View File

@@ -97,6 +97,7 @@ describe("Uniswap Arbitrageur", () => {
await ctx.setOraclePrice(decimalStr("100"));
// dodo price 100 uniswap price 200
// buy at dodo
<<<<<<< Updated upstream
await logGas(
UniswapArbitrageur.methods.executeBuyArbitrage(decimalStr("1")),
ctx.sendParam(keeper),
@@ -107,11 +108,17 @@ describe("Uniswap Arbitrageur", () => {
"79836384956601695518"
);
});
=======
logGas(await UniswapArbitrageur.methods.executeBuyArbitrage(decimalStr("1")), ctx.sendParam(keeper), "arbitrage buy at dodo not reverse")
assert.equal(await ctx.QUOTE.methods.balanceOf(keeper).call(), "79836384956601695518")
})
>>>>>>> Stashed changes
it("sell at dodo", async () => {
await ctx.setOraclePrice(decimalStr("300"));
// dodo price 300 uniswap price 200
// sell at dodo
<<<<<<< Updated upstream
await logGas(
UniswapArbitrageur.methods.executeSellArbitrage(decimalStr("1")),
ctx.sendParam(keeper),
@@ -123,12 +130,19 @@ describe("Uniswap Arbitrageur", () => {
);
});
});
=======
logGas(await UniswapArbitrageur.methods.executeSellArbitrage(decimalStr("1")), ctx.sendParam(keeper), "arbitrage sell at dodo not reverse")
assert.equal(await ctx.BASE.methods.balanceOf(keeper).call(), "252761069524143743")
})
})
>>>>>>> Stashed changes
describe("arbitrage with reverse pair", () => {
it("buy at dodo", async () => {
await ctx.setOraclePrice(decimalStr("100"));
// dodo price 100 uniswap price 200
// buy at dodo
<<<<<<< Updated upstream
await logGas(
UniswapArbitrageurReverse.methods.executeBuyArbitrage(decimalStr("1")),
ctx.sendParam(keeper),
@@ -139,11 +153,17 @@ describe("Uniswap Arbitrageur", () => {
"79836384956601695518"
);
});
=======
logGas(await UniswapArbitrageurReverse.methods.executeBuyArbitrage(decimalStr("1")), ctx.sendParam(keeper), "arbitrage buy at dodo reverse")
assert.equal(await ctx.QUOTE.methods.balanceOf(keeper).call(), "79836384956601695518")
})
>>>>>>> Stashed changes
it("sell at dodo", async () => {
await ctx.setOraclePrice(decimalStr("300"));
// dodo price 300 uniswap price 200
// sell at dodo
<<<<<<< Updated upstream
await logGas(
UniswapArbitrageurReverse.methods.executeSellArbitrage(decimalStr("1")),
ctx.sendParam(keeper),
@@ -155,6 +175,12 @@ describe("Uniswap Arbitrageur", () => {
);
});
});
=======
logGas(await UniswapArbitrageurReverse.methods.executeSellArbitrage(decimalStr("1")), ctx.sendParam(keeper), "arbitrage sell at dodo reverse")
assert.equal(await ctx.BASE.methods.balanceOf(keeper).call(), "252761069524143743")
})
})
>>>>>>> Stashed changes
describe("revert cases", () => {
it("price not match", async () => {

View File

@@ -13,6 +13,7 @@ if (process.env["COVERAGE"]) {
const CloneFactory = require(`${jsonPath}CloneFactory.json`)
const DODO = require(`${jsonPath}DODO.json`)
const DODOZoo = require(`${jsonPath}DODOZoo.json`)
// const DODOWild = require(`${jsonPath}DODOWild.json`)
const DODOEthProxy = require(`${jsonPath}DODOEthProxy.json`)
const WETH = require(`${jsonPath}WETH9.json`)
const TestERC20 = require(`${jsonPath}TestERC20.json`)
@@ -20,6 +21,8 @@ const NaiveOracle = require(`${jsonPath}NaiveOracle.json`)
const DODOLpToken = require(`${jsonPath}DODOLpToken.json`)
const Uniswap = require(`${jsonPath}UniswapV2Pair.json`)
const UniswapArbitrageur = require(`${jsonPath}UniswapArbitrageur.json`)
const DODOToken = require(`${jsonPath}DODOToken.json`)
const LockedTokenVault = require(`${jsonPath}LockedTokenVault.json`)
import { getDefaultWeb3 } from './EVM';
import { Contract } from 'web3-eth-contract';
@@ -30,10 +33,13 @@ export const TEST_ERC20_CONTRACT_NAME = "TestERC20"
export const NAIVE_ORACLE_CONTRACT_NAME = "NaiveOracle"
export const DODO_LP_TOKEN_CONTRACT_NAME = "DODOLpToken"
export const DODO_ZOO_CONTRACT_NAME = "DOOZoo"
export const DODO_WILD_CONTRACT_NAME = "DOOWild"
export const DODO_ETH_PROXY_CONTRACT_NAME = "DODOEthProxy"
export const WETH_CONTRACT_NAME = "WETH"
export const UNISWAP_CONTRACT_NAME = "Uniswap"
export const UNISWAP_ARBITRAGEUR_CONTRACT_NAME = "UniswapArbitrageur"
export const DODO_TOKEN_CONTRACT_NAME = "DODOToken"
export const LOCKED_TOKEN_VAULT_CONTRACT_NAME = "LockedTokenVault"
var contractMap: { [name: string]: any } = {}
contractMap[CLONE_FACTORY_CONTRACT_NAME] = CloneFactory
@@ -46,6 +52,8 @@ contractMap[DODO_ETH_PROXY_CONTRACT_NAME] = DODOEthProxy
contractMap[WETH_CONTRACT_NAME] = WETH
contractMap[UNISWAP_CONTRACT_NAME] = Uniswap
contractMap[UNISWAP_ARBITRAGEUR_CONTRACT_NAME] = UniswapArbitrageur
contractMap[DODO_TOKEN_CONTRACT_NAME] = DODOToken
contractMap[LOCKED_TOKEN_VAULT_CONTRACT_NAME] = LockedTokenVault
interface ContractJson {
abi: any;

View File

@@ -3,9 +3,25 @@ function calculateSlippage(buyPercentage: number) {
console.log(buyPercentage, ":", ((1 / (1 - buyPercentage)) * k - k) * 100, "%")
}
function calculateLoss(priceGap: number) {
const feeRate = 0.0025
const k = 0.1
let amountPartial = Math.sqrt(priceGap / k + 1) - 1
let loss = amountPartial * (priceGap - feeRate * 2)
console.log(priceGap, ":", loss * 100, "%")
}
// calculateSlippage(0.01)
// calculateSlippage(0.05)
// calculateSlippage(0.1)
// calculateSlippage(0.2)
// calculateSlippage(0.5)
// calculateSlippage(0.7)
// calculateLoss(0.006)
// calculateLoss(0.007)
// calculateLoss(0.008)
// calculateLoss(0.009)
// calculateLoss(0.01)
// calculateLoss(0.02)
// calculateLoss(0.03)