namillum
Version:
Bubble Protocol SDK
312 lines (269 loc) • 10.5 kB
text/typescript
import { anyValue } from "@nomicfoundation/hardhat-chai-matchers/withArgs";
import { expect } from "chai";
import hre, { ethers } from "hardhat";
import { Contract, Signer } from "ethers";
import hre from "hardhat";
import { ScillaContract } from "hardhat-scilla-plugin";
import * as utils from "../utils/utils.ts";
let WALLET_INDEX_0 = 0;
let WALLET_INDEX_1 = 1;
let WALLET_INDEX_2 = 2;
const DEBUG = false;
describe(utils.TestGeneral(0, "TestParams"), function () {
// let hello: Contract;
let scillaRewardsParamsContract: ScillaContract;
before(async function () {
utils.ensureZilliqa();
utils.setZilliqaSignerToAccountByHardhatWallet(WALLET_INDEX_0);
let owner =
utils.getZilliqaAddressForAccountByHardhatWallet(WALLET_INDEX_0);
if (DEBUG) {
console.log(`Address ${owner}`);
}
scillaRewardsParamsContract = await hre.deployScillaContract(
"RewardsParams",
owner
);
utils.checkScillaTransactionSuccess(scillaRewardsParamsContract);
if (DEBUG) {
console.log(
`Rewards Params Contract: ${scillaRewardsParamsContract.address}`
);
}
// console.log(`${JSON.stringify(scillaRewardsParamsContract)}`);
});
it("Contract should be deployed successfully", async function () {
expect(scillaRewardsParamsContract.address).to.be.properAddress;
});
// check the default values after contract deployment
it("Admin should be the first wallet", async function () {
let firstAdmin =
utils.getZilliqaAddressForAccountByHardhatWallet(WALLET_INDEX_0);
expect(await scillaRewardsParamsContract.contractadmin()).to.be.eq(
firstAdmin.toLowerCase()
);
});
it("Percent precision should be 100", async function () {
expect(await scillaRewardsParamsContract.percent_precision()).to.be.eq(100);
});
it("Default base reward should be 2000", async function () {
expect(await scillaRewardsParamsContract.base_reward_in_percent()).to.be.eq(
2000
);
});
it("Default lookup reward should be 4000", async function () {
expect(
await scillaRewardsParamsContract.lookup_reward_in_percent()
).to.be.eq(4000);
});
it("Default node reward should be 4000", async function () {
expect(await scillaRewardsParamsContract.node_reward_in_percent()).to.be.eq(
4000
);
});
it("Default coinbase reward per ds should be 204000000000000000", async function () {
expect(await scillaRewardsParamsContract.coinbase_reward_per_ds()).to.be.eq(
204000000000000000
);
});
it("Default reward mul in millis should be 1668", async function () {
expect(
await scillaRewardsParamsContract.reward_each_mul_in_millis()
).to.be.eq(1668);
});
it("Default base_reward mul in millis should be 4726", async function () {
expect(
await scillaRewardsParamsContract.base_reward_mul_in_millis()
).to.be.eq(4726);
});
// changing the parameters by admin
it("Admin can change base reward to 25", async function () {
let result1 = await scillaRewardsParamsContract.ChangeBaseReward(25);
expect(await scillaRewardsParamsContract.base_reward_in_percent()).to.be.eq(
25
);
});
it("Admin can change lookup reward to 35", async function () {
let result1 = await scillaRewardsParamsContract.ChangeLookupReward(35);
expect(
await scillaRewardsParamsContract.lookup_reward_in_percent()
).to.be.eq(35);
});
it("Admin can change node reward to 25", async function () {
let result1 = await scillaRewardsParamsContract.ChangeNodeReward(25);
expect(await scillaRewardsParamsContract.node_reward_in_percent()).to.be.eq(
25
);
});
it("Admin can change coinbase reward per ds to 180000000000000000", async function () {
let result1 = await scillaRewardsParamsContract.ChangeCoinbaseReward(
180000000000000000
);
expect(await scillaRewardsParamsContract.coinbase_reward_per_ds()).to.be.eq(
180000000000000000
);
});
it("Admin can change reward_each_mul_in_millis to 400", async function () {
let result1 = await scillaRewardsParamsContract.ChangeRewardEachMulInMillis(
400
);
expect(
await scillaRewardsParamsContract.reward_each_mul_in_millis()
).to.be.eq(400);
});
it("Admin can change reward_base_mul_in_millis to 392", async function () {
let result1 = await scillaRewardsParamsContract.ChangeBaseRewardMulInMillis(
392
);
expect(
await scillaRewardsParamsContract.base_reward_mul_in_millis()
).to.be.eq(392);
});
// negative test cases
it("A non admin wallet cannot set base reward", async function () {
let acc_2 =
utils.getZilliqaAccountForAccountByHardhatWallet(WALLET_INDEX_2);
const CALL_CONTRACT_FAILED = 7;
try {
let result = await scillaRewardsParamsContract
.connect(acc_2)
.ChangeBaseReward(35);
expect(result.receipt.success).to.be.false;
expect(result.receipt.errors["0"].length).to.equal(1);
expect(result.receipt.errors[0][0]).to.equal(CALL_CONTRACT_FAILED);
} catch (error) {
console.log("Error: ", error);
}
// verify that the base reward has not changed
expect(await scillaRewardsParamsContract.base_reward_in_percent()).to.be.eq(
25
);
});
it("A non admin wallet cannot set lookup reward", async function () {
let acc_2 =
utils.getZilliqaAccountForAccountByHardhatWallet(WALLET_INDEX_2);
const CALL_CONTRACT_FAILED = 7;
try {
let result = await scillaRewardsParamsContract
.connect(acc_2)
.ChangeLookupReward(50);
expect(result.receipt.success).to.be.false;
expect(result.receipt.errors["0"].length).to.equal(1);
expect(result.receipt.errors[0][0]).to.equal(CALL_CONTRACT_FAILED);
} catch (error) {
console.log("Error: ", error);
}
// verify that the lookup reward has not changed
expect(
await scillaRewardsParamsContract.lookup_reward_in_percent()
).to.be.eq(35);
});
it("A non admin wallet cannot set coinbase reward per ds", async function () {
let acc_2 =
utils.getZilliqaAccountForAccountByHardhatWallet(WALLET_INDEX_2);
const CALL_CONTRACT_FAILED = 7;
try {
let result = await scillaRewardsParamsContract
.connect(acc_2)
.ChangeCoinbaseReward(190000000000000000);
expect(result.receipt.success).to.be.false;
expect(result.receipt.errors["0"].length).to.equal(1);
expect(result.receipt.errors[0][0]).to.equal(CALL_CONTRACT_FAILED);
} catch (error) {
console.log("Error: ", error);
}
// verify that the coinbase reward has not changed
expect(await scillaRewardsParamsContract.coinbase_reward_per_ds()).to.be.eq(
180000000000000000
);
});
it("A non admin wallet cannot set a new admin", async function () {
let acc_2 =
utils.getZilliqaAccountForAccountByHardhatWallet(WALLET_INDEX_2);
let newAdmin =
utils.getZilliqaAddressForAccountByHardhatWallet(WALLET_INDEX_2);
const CALL_CONTRACT_FAILED = 7;
try {
let result = await scillaRewardsParamsContract
.connect(acc_2)
.UpdateAdmin(newAdmin);
expect(result.receipt.success).to.be.false;
expect(result.receipt.errors["0"].length).to.equal(1);
expect(result.receipt.errors[0][0]).to.equal(CALL_CONTRACT_FAILED);
} catch (error) {
console.log("Error: ", error);
}
// verify that the admin has not changed
let firstAdmin =
utils.getZilliqaAddressForAccountByHardhatWallet(WALLET_INDEX_0);
expect(await scillaRewardsParamsContract.contractadmin()).to.be.eq(
firstAdmin.toLowerCase()
);
});
// test setting new admin
it("The current admin can set a new admin", async function () {
// utils.setZilliqaSignerToAccountByHardhatWallet(WALLET_INDEX_0);
let acc_0 =
utils.getZilliqaAccountForAccountByHardhatWallet(WALLET_INDEX_0);
let newAdmin =
utils.getZilliqaAddressForAccountByHardhatWallet(WALLET_INDEX_1);
if (DEBUG) {
console.log(`Admin changing to: ${newAdmin}`);
}
let result1 = await scillaRewardsParamsContract
.connect(acc_0)
.UpdateAdmin(newAdmin);
// let us check the state of the stagingcontractadmin
let stagingcontractadmin =
await scillaRewardsParamsContract.stagingcontractadmin();
expect(stagingcontractadmin.arguments[0]).to.equal(newAdmin.toLowerCase());
// this change does not change the admin, it has to be claimed by the new admin wallet
// so the admin should remain unchanged
let firstAdmin =
utils.getZilliqaAddressForAccountByHardhatWallet(WALLET_INDEX_0);
expect(await scillaRewardsParamsContract.contractadmin()).to.be.eq(
firstAdmin.toLowerCase()
);
});
// a negative case for claiming to be a new admin
it("A non-target wallet cannot claim new admin", async function () {
let acc_2 =
utils.getZilliqaAccountForAccountByHardhatWallet(WALLET_INDEX_2);
const CALL_CONTRACT_FAILED = 7;
try {
let result = await scillaRewardsParamsContract
.connect(acc_2)
.ClaimAdmin();
expect(result.receipt.success).to.be.false;
expect(result.receipt.errors["0"].length).to.equal(1);
expect(result.receipt.errors[0][0]).to.equal(CALL_CONTRACT_FAILED);
} catch (error) {
console.log("Error: ", error);
}
// there should be no change of admin
let firstAdmin =
utils.getZilliqaAddressForAccountByHardhatWallet(WALLET_INDEX_0);
expect(await scillaRewardsParamsContract.contractadmin()).to.be.eq(
firstAdmin.toLowerCase()
);
// there should be no change of staging admin
let stagingcontractadmin =
await scillaRewardsParamsContract.stagingcontractadmin();
let targetAdmin =
utils.getZilliqaAddressForAccountByHardhatWallet(WALLET_INDEX_1);
expect(stagingcontractadmin.arguments[0]).to.equal(
targetAdmin.toLowerCase()
);
});
// the designated wallet should be able to claim the new admin
it("Target new admin wallet can claim new admin", async function () {
let acc_1 =
utils.getZilliqaAccountForAccountByHardhatWallet(WALLET_INDEX_1);
let result2 = await scillaRewardsParamsContract.connect(acc_1).ClaimAdmin();
let targetAdmin =
utils.getZilliqaAddressForAccountByHardhatWallet(WALLET_INDEX_1);
expect(await scillaRewardsParamsContract.contractadmin()).to.be.eq(
targetAdmin.toLowerCase()
);
});
});