Skip to content

Commit

Permalink
Add a test exchange ratio decrease logic
Browse files Browse the repository at this point in the history
  • Loading branch information
weiqiushi committed Aug 29, 2024
1 parent 81b6773 commit e09dc41
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 32 deletions.
29 changes: 22 additions & 7 deletions contracts/exchange.sol
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ contract Exchange is Initializable, UUPSUpgradeable, OwnableUpgradeable {
}

function getCircleBalance(uint256 circle) public view returns (uint256) {
//return 210 ether;
return 210 ether;

uint256 adjust_times = (circle-1) / adjust_period;
uint256 balance = initial_dmc_balance;
Expand Down Expand Up @@ -148,7 +148,7 @@ contract Exchange is Initializable, UUPSUpgradeable, OwnableUpgradeable {
dmc2gwt_rate = old_rate * 6 / 5;
}
// for test
// dmc2gwt_rate = 210;
dmc2gwt_rate = 210;
// console.log("increase dmc2gwt_rate to %d", dmc2gwt_rate);
}

Expand Down Expand Up @@ -257,12 +257,27 @@ contract Exchange is Initializable, UUPSUpgradeable, OwnableUpgradeable {
cycle_start_time = block.timestamp;
cycle_end_time = 0;
} else if (cycle_end_time > 0) {
uint256 gwt_ratio_change = (block.timestamp - cycle_end_time) * 100 / (block.timestamp - cycle_start_time);
if (gwt_ratio_change > 20) {
gwt_ratio_change = 20;
}
uint256 cycleDuration = cycle_end_time - cycle_start_time;
if (cycleDuration < 3 days) {
uint256 gwt_ratio_change = (block.timestamp - cycle_end_time) * 100 / (block.timestamp - cycle_start_time);
if (gwt_ratio_change > 20) {
gwt_ratio_change = 20;
}

test_gwt_ratio = test_gwt_ratio * (100 + gwt_ratio_change) / 100;
} else {
uint256 gwt_ratio_change = (cycleDuration - 3 days) * 100 / 3 days;
if (gwt_ratio_change > 20) {
gwt_ratio_change = 20;
}

test_gwt_ratio = test_gwt_ratio * (100 - gwt_ratio_change) / 100;

test_gwt_ratio = test_gwt_ratio * (100 + gwt_ratio_change) / 100;
if (test_gwt_ratio < 210) {
test_gwt_ratio = 210;

}
}

cycle_start_time = block.timestamp;
cycle_end_time = 0;
Expand Down
19 changes: 16 additions & 3 deletions test/test_exchange.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,28 +47,41 @@ describe("Exchange", function () {
await expect(exchange.freeMintGWT()).to.revertedWith("already free minted");

await (await dmc.transfer(await exchange.getAddress(), ethers.parseEther("1"))).wait();
console.log("test change dmc 1");

await expect(exchange.GWTToDMCForTest(ethers.parseEther("210"))).to.revertedWith("not start test cycle");

// 开启周期0,汇率210,初始余额1
await (await exchange.startNewTestCycle()).wait();
expect(await exchange.test_gwt_ratio()).to.equal(210);
expect(await exchange.test_dmc_balance()).to.equal(ethers.parseEther("1"));

console.log("test change dmc 2");
await (await gwt.approve(await exchange.getAddress(), ethers.parseEther("210"))).wait();
await expect(exchange.GWTToDMCForTest(ethers.parseEther("210"))).to.changeTokenBalance(dmc, signers[0], ethers.parseEther("1"));

await expect(exchange.GWTtoDMC(ethers.parseEther("210"))).to.be.revertedWith("contract in test mode");

// 开启周期1,汇率210*1.2=252,初始余额10
await (await dmc.approve(await exchange.getAddress(), ethers.parseEther("10"))).wait();
await (await exchange.addDMCXForTest(ethers.parseEther("10"))).wait();

expect(await exchange.test_gwt_ratio()).to.equal(252);
expect(await exchange.test_dmc_balance()).to.equal(ethers.parseEther("10"));

console.log("test change dmc 3");
await (await gwt.approve(await exchange.getAddress(), ethers.parseEther("504"))).wait();
await expect(exchange.GWTToDMCForTest(ethers.parseEther("504"))).to.changeTokenBalance(dmc, signers[0], ethers.parseEther("2"));

// 等待6天,结束周期1
mine(2, {interval: 6*24*60*60});
await (await gwt.approve(await exchange.getAddress(), ethers.parseEther("2016"))).wait();
await expect(exchange.GWTToDMCForTest(ethers.parseEther("2016"))).to.changeTokenBalance(dmc, signers[0], ethers.parseEther("8"));

// 开启周期2,汇率应该是252*0.8=201,小于210.改为210.初始余额2
await (await dmc.approve(await exchange.getAddress(), ethers.parseEther("2"))).wait();
await (await exchange.addDMCXForTest(ethers.parseEther("2"))).wait();

expect(await exchange.test_gwt_ratio()).to.equal(210);
expect(await exchange.test_dmc_balance()).to.equal(ethers.parseEther("2"));

})

it("enable prod mode", async () => {
Expand Down
74 changes: 52 additions & 22 deletions test/test_public_data.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { ethers, upgrades } from "hardhat";
import { expect } from "chai";
import { DMCToken, Exchange, GWTToken, OwnedNFTBridge, PublicDataStorage } from "../typechain-types";
import { DMC, Exchange, GWT, OwnedNFTBridge, PublicDataStorage } from "../typechain-types";

//import * as TestDatas from "../testDatas/test_data.json";
import fs from "node:fs";
Expand Down Expand Up @@ -29,8 +29,8 @@ let TestDatas: TestData[] = JSON.parse(fs.readFileSync("testDatas/test_data.json

describe("PublicDataStorage", function () {
let contract: PublicDataStorage;
let dmcToken: DMCToken;
let gwtToken: GWTToken;
let dmcToken: DMC;
let gwtToken: GWT;
let exchange: Exchange;
let signers: HardhatEthersSigner[];
let nftBridge: OwnedNFTBridge
Expand All @@ -39,10 +39,10 @@ describe("PublicDataStorage", function () {
let listLibrary = await (await ethers.getContractFactory("SortedScoreList")).deploy();
let proofLibrary = await (await ethers.getContractFactory("PublicDataProof")).deploy();

dmcToken = await (await ethers.deployContract("DMCToken", [ethers.parseEther("10000000"), [signers[0].address], [ethers.parseEther("10000000")]])).waitForDeployment()
gwtToken = await (await ethers.deployContract("GWTToken")).waitForDeployment()
dmcToken = await (await ethers.deployContract("DMC", [ethers.parseEther("10000000"), [signers[0].address], [ethers.parseEther("10000000")]])).waitForDeployment()
gwtToken = await (await ethers.deployContract("GWT", [[], []])).waitForDeployment()
exchange = await (await upgrades.deployProxy(await ethers.getContractFactory("Exchange"),
[await dmcToken.getAddress(), await gwtToken.getAddress()],
[await dmcToken.getAddress(), await gwtToken.getAddress(), ethers.ZeroAddress, 1000],
{
initializer: "initialize",
kind: "uups",
Expand All @@ -67,8 +67,6 @@ describe("PublicDataStorage", function () {
unsafeAllow: ["external-library-linking"],
})).waitForDeployment() as unknown as PublicDataStorage;

await (await gwtToken.enableTransfer([await contract.getAddress()])).wait();

nftBridge = await (await ethers.getContractFactory("OwnedNFTBridge")).deploy();
await (await contract.allowPublicDataContract([await nftBridge.getAddress()])).wait();
}
Expand All @@ -80,7 +78,7 @@ describe("PublicDataStorage", function () {
for (const signer of signers) {
await (await dmcToken.transfer(await signer.address, ethers.parseEther("1000"))).wait();
await (await dmcToken.connect(signer).approve(await exchange.getAddress(), ethers.parseEther("1000"))).wait();
await (await exchange.connect(signer).exchangeGWT(ethers.parseEther("1000"))).wait();
await (await exchange.connect(signer).DMCtoGWT(ethers.parseEther("1000"))).wait();
await (await gwtToken.connect(signer).approve(await contract.getAddress(), ethers.parseEther("210000"))).wait();
}

Expand All @@ -89,29 +87,60 @@ describe("PublicDataStorage", function () {
// large balance
await (await dmcToken.transfer(await signers[14].address, ethers.parseEther("1000000"))).wait();
await (await dmcToken.connect(signers[14]).approve(await exchange.getAddress(), ethers.parseEther("1000000"))).wait();
await (await exchange.connect(signers[14]).exchangeGWT(ethers.parseEther("1000000"))).wait();
await (await exchange.connect(signers[14]).DMCtoGWT(ethers.parseEther("1000000"))).wait();
await (await gwtToken.connect(signers[14]).approve(await contract.getAddress(), ethers.parseEther("210000000"))).wait();

await (await dmcToken.transfer(await signers[16].address, ethers.parseEther("1000000"))).wait();
await (await dmcToken.connect(signers[16]).approve(await exchange.getAddress(), ethers.parseEther("1000000"))).wait();
await (await exchange.connect(signers[16]).exchangeGWT(ethers.parseEther("1000000"))).wait();
await (await exchange.connect(signers[16]).DMCtoGWT(ethers.parseEther("1000000"))).wait();
await (await gwtToken.connect(signers[16]).approve(await contract.getAddress(), ethers.parseEther("210000000"))).wait();
});

it("check economic params", async() => {
let create_deposit_amount = {
datasize: [0.01, 0.02, 4, 5.2],
deposit_amount: [576, 576, 18432, 23961.6],
normal_lock:[3.84, 7.68, 1536, 1996.8],
immediate_lock: [213.84, 217.68, 4485.12, 5830.656]
}

for (let i = 0; i < create_deposit_amount.datasize.length; i++) {
let deposit = await contract.minCreateDepositAmount(create_deposit_amount.datasize[i]*1024*1024*1024, 96);
expect(deposit).to.equal(ethers.parseEther(create_deposit_amount.deposit_amount[i].toString()));

let normalLockAmount = await contract.getLockAmount(
create_deposit_amount.datasize[i]*1024*1024*1024,
0,
96,
ethers.parseEther((create_deposit_amount.deposit_amount[i] * 0.8).toString())
);
expect(normalLockAmount).to.equal(ethers.parseEther(create_deposit_amount.normal_lock.toString()))

let immediateLockAmount = await contract.getLockAmount(
create_deposit_amount.datasize[i]*1024*1024*1024,
1,
96,
ethers.parseEther((create_deposit_amount.deposit_amount[i] * 0.8).toString())
);
expect(immediateLockAmount).to.equal(ethers.parseEther(create_deposit_amount.immediate_lock.toString()))
}
})

it("set sys config", async () => {
let config = await contract.sysConfig();
let setConfig: PublicDataStorage.SysConfigStruct = {
minDepositRatio: config.minDepositRatio,
minPledgeRate: config.minPledgeRate,
minPublicDataStorageWeeks: config.minPublicDataStorageWeeks,
minLockWeeks: config.minLockWeeks,
blocksPerCycle: config.blocksPerCycle,
cycleMinTime: config.cycleMinTime,
topRewards: config.topRewards,
lockAfterShow: config.lockAfterShow,
showTimeout: config.showTimeout,
maxNonceBlockDistance: config.maxNonceBlockDistance,
minRankingScore: config.minRankingScore,
minDataSize: config.minDataSize,
createDepositRatio: config.createDepositRatio,
minImmediatelyLockAmount: config.minImmediatelyLockAmount,
};
setConfig.showTimeout = 720n;
setConfig.lockAfterShow = 720n;
Expand All @@ -122,7 +151,7 @@ describe("PublicDataStorage", function () {
expect((await contract.sysConfig()).showTimeout).to.equal(720);
})


/*
it("create public data", async () => {
// 需要的最小抵押:1/8 GB * 96(周) * 64(倍) = 768 GWT
await expect(contract.createPublicData(TestDatas[0].hash, 64, ethers.parseEther("768"), await nftBridge.getAddress()))
Expand Down Expand Up @@ -169,7 +198,7 @@ describe("PublicDataStorage", function () {
.emit(contract, "DepositData").withArgs(signers[15].address, TestDatas[9].hash, ethers.parseEther("168000"), ethers.parseEther("42000"));
expect(await contract.dataBalance(TestDatas[9].hash)).to.equal(ethers.parseEther("168000"));
expect((await gwtToken.balanceOf(signers[15].address))).to.equal(ethers.parseEther("0"));
expect((await gwtToken.balanceOf(signers[15].address))).to.equal(ethers.parseEther("42000"));
});
it("deposit data", async () => {
Expand Down Expand Up @@ -231,14 +260,14 @@ describe("PublicDataStorage", function () {
expect(await contract.dataBalance(TestDatas[8].hash)).to.equal(ethers.parseEther("168614.4"));
expect((await contract.getPublicData(TestDatas[8].hash)).sponsor).to.equal(signers[17].address);
expect((await gwtToken.balanceOf(signers[17].address))).to.equal(ethers.parseEther("0"));
// expect((await gwtToken.balanceOf(signers[17].address))).to.equal(ethers.parseEther("0"));
await (await dmcToken.transfer(await signers[17].address, ethers.parseEther("1"))).wait();
await (await dmcToken.connect(signers[17]).approve(await exchange.getAddress(), ethers.parseEther("1"))).wait();
await (await exchange.connect(signers[17]).exchangeGWT(ethers.parseEther("1"))).wait();
await (await exchange.connect(signers[17]).DMCtoGWT(ethers.parseEther("1"))).wait();
await (await gwtToken.connect(signers[17]).approve(await contract.getAddress(), ethers.parseEther("210"))).wait();
expect((await gwtToken.balanceOf(signers[17].address))).to.equal(ethers.parseEther("210"));
expect((await gwtToken.balanceOf(signers[17].address))).to.equal(ethers.parseEther("42252"));
});
it("deposit data and became sponser", async () => {
Expand Down Expand Up @@ -275,15 +304,16 @@ describe("PublicDataStorage", function () {
// Normal情况下,会锁定192 GWT,当balance / 10 * 2 > 192,即balance > 960时,才会有immediately show
let [tx, nonce_block] = await showData(signers[2], 1);
await expect(tx)
.emit(contract, "SupplierBalanceChanged").withArgs(signers[2].address, ethers.parseEther("9701.12"), ethers.parseEther("298.88"))
.emit(contract, "SupplierBalanceChanged").withArgs(signers[2].address, ethers.parseEther("9509.12"), ethers.parseEther("490.88"))
.emit(contract, "SupplierReward").withArgs(signers[2].address, TestDatas[0].hash, ethers.parseEther("149.44"));
await expect(tx).changeTokenBalance(gwtToken, signers[2].address, ethers.parseEther("149.44"));
});
it("show data and withdraw", async () => {
// 这个操作会锁定signers[2]的余额 1/8 GB * 24(周) * 64(倍) = 192 GWT
let [tx, nonce_block] = await showData(signers[2], 0);
await expect(tx).emit(contract, "SupplierBalanceChanged").withArgs(signers[2].address, ethers.parseEther("9509.12"), ethers.parseEther("490.88"));
await expect(tx).ok;
//.emit(contract, "SupplierBalanceChanged").withArgs(signers[2].address, ethers.parseEther("9509.12"), ethers.parseEther("490.88"));
await mine((await contract.sysConfig()).showTimeout);
Expand Down Expand Up @@ -317,7 +347,7 @@ describe("PublicDataStorage", function () {
expect(await contract.getCurrectLastShowed(TestDatas[0].hash)).have.ordered.members([signers[6].address, signers[7].address, signers[3].address, signers[4].address, signers[5].address]);
});

/*
it("suppliers withdraw cycle reward", async () => {
await mine((await contract.sysConfig()).blocksPerCycle);
Expand Down Expand Up @@ -349,5 +379,5 @@ describe("PublicDataStorage", function () {
// 上期奖池数量:84527.2
// 本期奖池数量:84527.2 - 67,621.76 - 4,226.36 + 67,621.76 * (1600-240) / 1600 = 12,679.08 + 57,478.496 = 70,157.576
})
})*/
});

0 comments on commit e09dc41

Please sign in to comment.