Skip to content

Commit ce47d94

Browse files
authored
feat: Iimprove token incentive scripts (#139)
* feat: Iimprove token incentive scripts * lint
1 parent 48f0398 commit ce47d94

File tree

5 files changed

+235
-106
lines changed

5 files changed

+235
-106
lines changed

packages/zevm-app-contracts/scripts/liquidity-incentives/add-reward.ts

Lines changed: 12 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -1,121 +1,27 @@
11
import { BigNumber } from "@ethersproject/bignumber";
2-
import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers";
3-
import { isProtocolNetworkName, ZetaProtocolNetwork } from "@zetachain/protocol-contracts";
2+
import { isProtocolNetworkName } from "@zetachain/protocol-contracts";
43
import { parseEther } from "ethers/lib/utils";
54
import { ethers, network } from "hardhat";
65

7-
import {
8-
ERC20__factory,
9-
RewardDistributor__factory,
10-
RewardDistributorFactory,
11-
RewardDistributorFactory__factory,
12-
SystemContract,
13-
SystemContract__factory,
14-
} from "../../typechain-types";
15-
import { getChainId, getSystemContractAddress, getZEVMAppAddress } from "../address.helpers";
6+
import { SystemContract__factory } from "../../typechain-types";
7+
import { getSystemContractAddress } from "../address.helpers";
8+
import { addReward } from "./helpers";
169

17-
const SYSTEM_CONTRACT = getSystemContractAddress();
18-
19-
const networkName = network.name;
2010
const REWARD_DURATION = BigNumber.from("604800").mul(8); // 1 week * 8
2111
const REWARDS_AMOUNT = parseEther("500");
12+
const REWARD_CONTRACT_ADDRESS = "0x0dee8b6e2d2035a798b67c68d47f941718a62263"; //@dev: change this to the address of the reward contract
2213

23-
const getZRC20Address = async (systemContract: SystemContract, network: ZetaProtocolNetwork) => {
24-
const tokenAddress = await systemContract.gasCoinZRC20ByChainId(getChainId(network));
25-
return tokenAddress;
26-
};
27-
28-
const deployRewardByNetwork = async (
29-
deployer: SignerWithAddress,
30-
systemContract: SystemContract,
31-
networkName: ZetaProtocolNetwork,
32-
rewardDistributorFactory: RewardDistributorFactory
33-
) => {
34-
const tokenAddress = await getZRC20Address(systemContract, networkName);
35-
const zetaTokenAddress = await systemContract.wZetaContractAddress();
36-
37-
const tx = await rewardDistributorFactory.createTokenIncentive(
38-
deployer.address,
39-
deployer.address,
40-
zetaTokenAddress,
41-
// @dev: now we send both tokens so contract calculate internaly LP address
42-
zetaTokenAddress,
43-
tokenAddress
44-
);
45-
46-
const receipt = await tx.wait();
47-
48-
const event = receipt.events?.find((e) => e.event === "RewardDistributorCreated");
49-
50-
const { rewardDistributorContract: rewardDistributorContractAddress } = event?.args as any;
51-
52-
console.log("RewardDistributor deployed to:", rewardDistributorContractAddress);
53-
54-
return rewardDistributorContractAddress;
55-
};
56-
57-
const addReward = async (
58-
deployer: SignerWithAddress,
59-
systemContract: SystemContract,
60-
rewardDistributorContractAddress: string
61-
) => {
62-
const zetaTokenAddress = await systemContract.wZetaContractAddress();
63-
64-
const rewardDistributorContract = await RewardDistributor__factory.connect(
65-
rewardDistributorContractAddress,
66-
deployer
67-
);
68-
69-
const ZETA = ERC20__factory.connect(zetaTokenAddress, deployer);
70-
const tx = await ZETA.transfer(rewardDistributorContract.address, REWARDS_AMOUNT.mul(1));
71-
await tx.wait();
72-
await rewardDistributorContract.setRewardsDuration(REWARD_DURATION);
73-
await rewardDistributorContract.notifyRewardAmount(REWARDS_AMOUNT);
74-
75-
console.log("Reward added to:", rewardDistributorContract.address);
76-
};
77-
78-
async function main() {
14+
const main = async () => {
7915
const [deployer] = await ethers.getSigners();
80-
if (!isProtocolNetworkName(networkName)) throw new Error("Invalid network name");
81-
const systemContract = await SystemContract__factory.connect(SYSTEM_CONTRACT, deployer);
16+
const networkName = network.name;
8217

83-
const factoryContractAddress = getZEVMAppAddress("rewardDistributorFactory");
18+
if (!isProtocolNetworkName(networkName)) throw new Error("Invalid network name");
8419

85-
const rewardDistributorFactory = RewardDistributorFactory__factory.connect(factoryContractAddress, deployer);
86-
let rewardContractAddress = "";
87-
// @dev: you can write your own address here to add reward to an existing contract
88-
// rewardContractAddress = "0x0dee8b6e2d2035a798b67c68d47f941718a62263";
89-
rewardContractAddress = await deployRewardByNetwork(
90-
deployer,
91-
systemContract,
92-
"goerli_testnet",
93-
rewardDistributorFactory
94-
);
95-
await addReward(deployer, systemContract, rewardContractAddress);
20+
const systemContractAddress = getSystemContractAddress();
21+
const systemContract = await SystemContract__factory.connect(systemContractAddress, deployer);
9622

97-
rewardContractAddress = await deployRewardByNetwork(
98-
deployer,
99-
systemContract,
100-
"bsc_testnet",
101-
rewardDistributorFactory
102-
);
103-
await addReward(deployer, systemContract, rewardContractAddress);
104-
rewardContractAddress = await deployRewardByNetwork(
105-
deployer,
106-
systemContract,
107-
"btc_testnet",
108-
rewardDistributorFactory
109-
);
110-
await addReward(deployer, systemContract, rewardContractAddress);
111-
rewardContractAddress = await deployRewardByNetwork(
112-
deployer,
113-
systemContract,
114-
"mumbai_testnet",
115-
rewardDistributorFactory
116-
);
117-
await addReward(deployer, systemContract, rewardContractAddress);
118-
}
23+
await addReward(deployer, systemContract, REWARD_CONTRACT_ADDRESS, REWARD_DURATION, REWARDS_AMOUNT);
24+
};
11925

12026
main().catch((error) => {
12127
console.error(error);
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import { BigNumber } from "@ethersproject/bignumber";
2+
import { isProtocolNetworkName } from "@zetachain/protocol-contracts";
3+
import { parseEther } from "ethers/lib/utils";
4+
import { ethers, network } from "hardhat";
5+
6+
import { RewardDistributorFactory__factory, SystemContract__factory } from "../../typechain-types";
7+
import { getSystemContractAddress, getZEVMAppAddress } from "../address.helpers";
8+
import { addReward, deployRewardByNetwork } from "./helpers";
9+
10+
const REWARD_DURATION = BigNumber.from("604800").mul(8); // 1 week * 8
11+
const REWARDS_AMOUNT = parseEther("500");
12+
13+
const main = async () => {
14+
const [deployer] = await ethers.getSigners();
15+
const networkName = network.name;
16+
17+
if (!isProtocolNetworkName(networkName)) throw new Error("Invalid network name");
18+
const systemContractAddress = getSystemContractAddress();
19+
const systemContract = await SystemContract__factory.connect(systemContractAddress, deployer);
20+
21+
const factoryContractAddress = getZEVMAppAddress("rewardDistributorFactory");
22+
23+
const rewardDistributorFactory = RewardDistributorFactory__factory.connect(factoryContractAddress, deployer);
24+
let rewardContractAddress = "";
25+
// @dev: you can write your own address here to add reward to an existing contract
26+
// rewardContractAddress = "0x0dee8b6e2d2035a798b67c68d47f941718a62263";
27+
rewardContractAddress = await deployRewardByNetwork(
28+
deployer,
29+
systemContract,
30+
"goerli_testnet",
31+
rewardDistributorFactory
32+
);
33+
await addReward(deployer, systemContract, rewardContractAddress, REWARD_DURATION, REWARDS_AMOUNT);
34+
35+
rewardContractAddress = await deployRewardByNetwork(
36+
deployer,
37+
systemContract,
38+
"bsc_testnet",
39+
rewardDistributorFactory
40+
);
41+
await addReward(deployer, systemContract, rewardContractAddress, REWARD_DURATION, REWARDS_AMOUNT);
42+
rewardContractAddress = await deployRewardByNetwork(
43+
deployer,
44+
systemContract,
45+
"btc_testnet",
46+
rewardDistributorFactory
47+
);
48+
await addReward(deployer, systemContract, rewardContractAddress, REWARD_DURATION, REWARDS_AMOUNT);
49+
rewardContractAddress = await deployRewardByNetwork(
50+
deployer,
51+
systemContract,
52+
"mumbai_testnet",
53+
rewardDistributorFactory
54+
);
55+
await addReward(deployer, systemContract, rewardContractAddress, REWARD_DURATION, REWARDS_AMOUNT);
56+
};
57+
58+
main().catch((error) => {
59+
console.error(error);
60+
process.exit(1);
61+
});
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { BigNumber } from "@ethersproject/bignumber";
2+
import { isProtocolNetworkName } from "@zetachain/protocol-contracts";
3+
import { parseEther } from "ethers/lib/utils";
4+
import { ethers, network } from "hardhat";
5+
6+
import { RewardDistributorFactory__factory, SystemContract__factory } from "../../typechain-types";
7+
import { getSystemContractAddress, getZEVMAppAddress } from "../address.helpers";
8+
import { addReward, deployRewardByToken } from "./helpers";
9+
10+
const REWARD_DURATION = BigNumber.from("604800").mul(8); // 1 week * 8
11+
const REWARDS_AMOUNT = parseEther("500");
12+
const TOKEN_ADDRESS = "0x0dee8b6e2d2035a798b67c68d47f941718a62263";
13+
14+
const main = async () => {
15+
const [deployer] = await ethers.getSigners();
16+
const networkName = network.name;
17+
18+
if (!isProtocolNetworkName(networkName)) throw new Error("Invalid network name");
19+
20+
const systemContractAddress = getSystemContractAddress();
21+
const systemContract = await SystemContract__factory.connect(systemContractAddress, deployer);
22+
23+
const factoryContractAddress = getZEVMAppAddress("rewardDistributorFactory");
24+
25+
const rewardDistributorFactory = RewardDistributorFactory__factory.connect(factoryContractAddress, deployer);
26+
27+
const rewardContractAddress = await deployRewardByToken(
28+
deployer,
29+
systemContract,
30+
TOKEN_ADDRESS,
31+
rewardDistributorFactory
32+
);
33+
await addReward(deployer, systemContract, rewardContractAddress, REWARD_DURATION, REWARDS_AMOUNT);
34+
};
35+
36+
main().catch((error) => {
37+
console.error(error);
38+
process.exit(1);
39+
});
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { BigNumber } from "@ethersproject/bignumber";
2+
import { isProtocolNetworkName } from "@zetachain/protocol-contracts";
3+
import { parseEther } from "ethers/lib/utils";
4+
import { ethers, network } from "hardhat";
5+
6+
import { RewardDistributorFactory__factory, SystemContract__factory } from "../../typechain-types";
7+
import { getSystemContractAddress, getZEVMAppAddress } from "../address.helpers";
8+
import { addReward, deployRewardByNetwork } from "./helpers";
9+
10+
const REWARD_DURATION = BigNumber.from("604800").mul(8); // 1 week * 8
11+
const REWARDS_AMOUNT = parseEther("500");
12+
const NETWORK_NAME = "goerli_testnet"; // @dev: change to your network name
13+
14+
const main = async () => {
15+
const [deployer] = await ethers.getSigners();
16+
const networkName = network.name;
17+
18+
if (!isProtocolNetworkName(networkName)) throw new Error("Invalid network name");
19+
20+
const systemContractAddress = getSystemContractAddress();
21+
const systemContract = await SystemContract__factory.connect(systemContractAddress, deployer);
22+
23+
const factoryContractAddress = getZEVMAppAddress("rewardDistributorFactory");
24+
25+
const rewardDistributorFactory = RewardDistributorFactory__factory.connect(factoryContractAddress, deployer);
26+
27+
const rewardContractAddress = await deployRewardByNetwork(
28+
deployer,
29+
systemContract,
30+
NETWORK_NAME,
31+
rewardDistributorFactory
32+
);
33+
await addReward(deployer, systemContract, rewardContractAddress, REWARD_DURATION, REWARDS_AMOUNT);
34+
};
35+
36+
main().catch((error) => {
37+
console.error(error);
38+
process.exit(1);
39+
});
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import { BigNumber } from "@ethersproject/bignumber";
2+
import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers";
3+
import { ZetaProtocolNetwork } from "@zetachain/protocol-contracts";
4+
import { parseEther } from "ethers/lib/utils";
5+
6+
import {
7+
ERC20__factory,
8+
RewardDistributor__factory,
9+
RewardDistributorFactory,
10+
SystemContract,
11+
} from "../../typechain-types";
12+
import { getChainId } from "../address.helpers";
13+
14+
export const deployRewardByToken = async (
15+
deployer: SignerWithAddress,
16+
systemContract: SystemContract,
17+
tokenAddress: string,
18+
rewardDistributorFactory: RewardDistributorFactory
19+
) => {
20+
const zetaTokenAddress = await systemContract.wZetaContractAddress();
21+
22+
const tx = await rewardDistributorFactory.createTokenIncentive(
23+
deployer.address,
24+
deployer.address,
25+
zetaTokenAddress,
26+
// @dev: now we send both tokens so contract calculate internaly LP address
27+
zetaTokenAddress,
28+
tokenAddress
29+
);
30+
31+
const receipt = await tx.wait();
32+
33+
const event = receipt.events?.find((e) => e.event === "RewardDistributorCreated");
34+
35+
const { rewardDistributorContract: rewardDistributorContractAddress } = event?.args as any;
36+
37+
console.log("RewardDistributor deployed to:", rewardDistributorContractAddress);
38+
39+
return rewardDistributorContractAddress;
40+
};
41+
42+
const getZRC20Address = async (systemContract: SystemContract, network: ZetaProtocolNetwork) => {
43+
const tokenAddress = await systemContract.gasCoinZRC20ByChainId(getChainId(network));
44+
return tokenAddress;
45+
};
46+
47+
export const deployRewardByNetwork = async (
48+
deployer: SignerWithAddress,
49+
systemContract: SystemContract,
50+
networkName: ZetaProtocolNetwork,
51+
rewardDistributorFactory: RewardDistributorFactory
52+
) => {
53+
const tokenAddress = await getZRC20Address(systemContract, networkName);
54+
const rewardContractAddress = await deployRewardByToken(
55+
deployer,
56+
systemContract,
57+
tokenAddress,
58+
rewardDistributorFactory
59+
);
60+
return rewardContractAddress;
61+
};
62+
63+
export const addReward = async (
64+
deployer: SignerWithAddress,
65+
systemContract: SystemContract,
66+
rewardDistributorContractAddress: string,
67+
rewardAmount: BigNumber = parseEther("500"),
68+
rewardDuration: BigNumber = BigNumber.from("604800").mul(8) // 1 week * 8
69+
) => {
70+
const zetaTokenAddress = await systemContract.wZetaContractAddress();
71+
72+
const rewardDistributorContract = await RewardDistributor__factory.connect(
73+
rewardDistributorContractAddress,
74+
deployer
75+
);
76+
77+
const ZETA = ERC20__factory.connect(zetaTokenAddress, deployer);
78+
const tx = await ZETA.transfer(rewardDistributorContract.address, rewardAmount.mul(1));
79+
await tx.wait();
80+
await rewardDistributorContract.setRewardsDuration(rewardDuration);
81+
await rewardDistributorContract.notifyRewardAmount(rewardAmount);
82+
83+
console.log("Reward added to:", rewardDistributorContract.address);
84+
};

0 commit comments

Comments
 (0)