Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Iimprove token incentive scripts #139

Merged
merged 2 commits into from
Jan 3, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,123 +1,29 @@
import { BigNumber } from "@ethersproject/bignumber";
import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers";
import { isProtocolNetworkName, ZetaProtocolNetwork } from "@zetachain/protocol-contracts";
import { isProtocolNetworkName } from "@zetachain/protocol-contracts";
import { parseEther } from "ethers/lib/utils";
import { ethers, network } from "hardhat";

import {
ERC20__factory,
RewardDistributor__factory,
RewardDistributorFactory,
RewardDistributorFactory__factory,
SystemContract,
SystemContract__factory,
} from "../../typechain-types";
import { getChainId, getSystemContractAddress, getZEVMAppAddress } from "../address.helpers";
import { SystemContract__factory } from "../../typechain-types";
import { getSystemContractAddress } from "../address.helpers";
import { addReward } from "./helpers";

const SYSTEM_CONTRACT = getSystemContractAddress();

const networkName = network.name;
const REWARD_DURATION = BigNumber.from("604800").mul(8); // 1 week * 8
const REWARDS_AMOUNT = parseEther("500");
const REWARD_CONTRACT_ADDRESS = "0x0dee8b6e2d2035a798b67c68d47f941718a62263"; //@dev: change this to the address of the reward contract

const getZRC20Address = async (systemContract: SystemContract, network: ZetaProtocolNetwork) => {
const tokenAddress = await systemContract.gasCoinZRC20ByChainId(getChainId(network));
return tokenAddress;
};

const deployRewardByNetwork = async (
deployer: SignerWithAddress,
systemContract: SystemContract,
networkName: ZetaProtocolNetwork,
rewardDistributorFactory: RewardDistributorFactory
) => {
const tokenAddress = await getZRC20Address(systemContract, networkName);
const zetaTokenAddress = await systemContract.wZetaContractAddress();

const tx = await rewardDistributorFactory.createTokenIncentive(
deployer.address,
deployer.address,
zetaTokenAddress,
// @dev: now we send both tokens so contract calculate internaly LP address
zetaTokenAddress,
tokenAddress
);

const receipt = await tx.wait();

const event = receipt.events?.find((e) => e.event === "RewardDistributorCreated");

const { rewardDistributorContract: rewardDistributorContractAddress } = event?.args as any;

console.log("RewardDistributor deployed to:", rewardDistributorContractAddress);

return rewardDistributorContractAddress;
};

const addReward = async (
deployer: SignerWithAddress,
systemContract: SystemContract,
rewardDistributorContractAddress: string
) => {
const zetaTokenAddress = await systemContract.wZetaContractAddress();

const rewardDistributorContract = await RewardDistributor__factory.connect(
rewardDistributorContractAddress,
deployer
);

const ZETA = ERC20__factory.connect(zetaTokenAddress, deployer);
const tx = await ZETA.transfer(rewardDistributorContract.address, REWARDS_AMOUNT.mul(1));
await tx.wait();
await rewardDistributorContract.setRewardsDuration(REWARD_DURATION);
await rewardDistributorContract.notifyRewardAmount(REWARDS_AMOUNT);

console.log("Reward added to:", rewardDistributorContract.address);
};

async function main() {
const main = async () => {
const [deployer] = await ethers.getSigners();
if (!isProtocolNetworkName(networkName)) throw new Error("Invalid network name");
const systemContract = await SystemContract__factory.connect(SYSTEM_CONTRACT, deployer);
const networkName = network.name;

const factoryContractAddress = getZEVMAppAddress("rewardDistributorFactory");
if (!isProtocolNetworkName(networkName)) throw new Error("Invalid network name");

const rewardDistributorFactory = RewardDistributorFactory__factory.connect(factoryContractAddress, deployer);
let rewardContractAddress = "";
// @dev: you can write your own address here to add reward to an existing contract
// rewardContractAddress = "0x0dee8b6e2d2035a798b67c68d47f941718a62263";
rewardContractAddress = await deployRewardByNetwork(
deployer,
systemContract,
"goerli_testnet",
rewardDistributorFactory
);
await addReward(deployer, systemContract, rewardContractAddress);
const systemContractAddress = getSystemContractAddress();
const systemContract = await SystemContract__factory.connect(systemContractAddress, deployer);

rewardContractAddress = await deployRewardByNetwork(
deployer,
systemContract,
"bsc_testnet",
rewardDistributorFactory
);
await addReward(deployer, systemContract, rewardContractAddress);
rewardContractAddress = await deployRewardByNetwork(
deployer,
systemContract,
"btc_testnet",
rewardDistributorFactory
);
await addReward(deployer, systemContract, rewardContractAddress);
rewardContractAddress = await deployRewardByNetwork(
deployer,
systemContract,
"mumbai_testnet",
rewardDistributorFactory
);
await addReward(deployer, systemContract, rewardContractAddress);
}
await addReward(deployer, systemContract, REWARD_CONTRACT_ADDRESS, REWARD_DURATION, REWARDS_AMOUNT);
};

main().catch((error) => {
main().catch(error => {

Check failure on line 26 in packages/zevm-app-contracts/scripts/liquidity-incentives/add-reward.ts

View workflow job for this annotation

GitHub Actions / build

Replace `error` with `(error)`
console.error(error);
process.exit(1);
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import { BigNumber } from "@ethersproject/bignumber";
import { isProtocolNetworkName } from "@zetachain/protocol-contracts";
import { parseEther } from "ethers/lib/utils";
import { ethers, network } from "hardhat";

import { RewardDistributorFactory__factory, SystemContract__factory } from "../../typechain-types";
import { getSystemContractAddress, getZEVMAppAddress } from "../address.helpers";
import { addReward, deployRewardByNetwork } from "./helpers";

const REWARD_DURATION = BigNumber.from("604800").mul(8); // 1 week * 8
const REWARDS_AMOUNT = parseEther("500");

const main = async () => {
const [deployer] = await ethers.getSigners();
const networkName = network.name;

if (!isProtocolNetworkName(networkName)) throw new Error("Invalid network name");
const systemContractAddress = getSystemContractAddress();
const systemContract = await SystemContract__factory.connect(systemContractAddress, deployer);

const factoryContractAddress = getZEVMAppAddress("rewardDistributorFactory");

const rewardDistributorFactory = RewardDistributorFactory__factory.connect(factoryContractAddress, deployer);
let rewardContractAddress = "";
// @dev: you can write your own address here to add reward to an existing contract
// rewardContractAddress = "0x0dee8b6e2d2035a798b67c68d47f941718a62263";
rewardContractAddress = await deployRewardByNetwork(
deployer,
systemContract,
"goerli_testnet",
rewardDistributorFactory
);
await addReward(deployer, systemContract, rewardContractAddress, REWARD_DURATION, REWARDS_AMOUNT);

rewardContractAddress = await deployRewardByNetwork(
deployer,
systemContract,
"bsc_testnet",
rewardDistributorFactory
);
await addReward(deployer, systemContract, rewardContractAddress, REWARD_DURATION, REWARDS_AMOUNT);
rewardContractAddress = await deployRewardByNetwork(
deployer,
systemContract,
"btc_testnet",
rewardDistributorFactory
);
await addReward(deployer, systemContract, rewardContractAddress, REWARD_DURATION, REWARDS_AMOUNT);
rewardContractAddress = await deployRewardByNetwork(
deployer,
systemContract,
"mumbai_testnet",
rewardDistributorFactory
);
await addReward(deployer, systemContract, rewardContractAddress, REWARD_DURATION, REWARDS_AMOUNT);
};

main().catch(error => {

Check failure on line 58 in packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-default-rewards.ts

View workflow job for this annotation

GitHub Actions / build

Replace `error` with `(error)`
console.error(error);
process.exit(1);
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { BigNumber } from "@ethersproject/bignumber";
import { isProtocolNetworkName } from "@zetachain/protocol-contracts";
import { parseEther } from "ethers/lib/utils";
import { ethers, network } from "hardhat";

import { RewardDistributorFactory__factory, SystemContract__factory } from "../../typechain-types";
import { getSystemContractAddress, getZEVMAppAddress } from "../address.helpers";
import { addReward, deployRewardByToken } from "./helpers";

const REWARD_DURATION = BigNumber.from("604800").mul(8); // 1 week * 8
const REWARDS_AMOUNT = parseEther("500");
const TOKEN_ADDRESS = "0x0dee8b6e2d2035a798b67c68d47f941718a62263";

const main = async () => {
const [deployer] = await ethers.getSigners();
const networkName = network.name;

if (!isProtocolNetworkName(networkName)) throw new Error("Invalid network name");

const systemContractAddress = getSystemContractAddress();
const systemContract = await SystemContract__factory.connect(systemContractAddress, deployer);

const factoryContractAddress = getZEVMAppAddress("rewardDistributorFactory");

const rewardDistributorFactory = RewardDistributorFactory__factory.connect(factoryContractAddress, deployer);

const rewardContractAddress = await deployRewardByToken(
deployer,
systemContract,
TOKEN_ADDRESS,
rewardDistributorFactory
);
await addReward(deployer, systemContract, rewardContractAddress, REWARD_DURATION, REWARDS_AMOUNT);
};

main().catch(error => {

Check failure on line 36 in packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-token-reward.ts

View workflow job for this annotation

GitHub Actions / build

Replace `error` with `(error)`
console.error(error);
process.exit(1);
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { BigNumber } from "@ethersproject/bignumber";
import { isProtocolNetworkName } from "@zetachain/protocol-contracts";
import { parseEther } from "ethers/lib/utils";
import { ethers, network } from "hardhat";

import { RewardDistributorFactory__factory, SystemContract__factory } from "../../typechain-types";
import { getSystemContractAddress, getZEVMAppAddress } from "../address.helpers";
import { addReward, deployRewardByNetwork } from "./helpers";

const REWARD_DURATION = BigNumber.from("604800").mul(8); // 1 week * 8
const REWARDS_AMOUNT = parseEther("500");
const NETWORK_NAME = "goerli_testnet"; // @dev: change to your network name

const main = async () => {
const [deployer] = await ethers.getSigners();
const networkName = network.name;

if (!isProtocolNetworkName(networkName)) throw new Error("Invalid network name");

const systemContractAddress = getSystemContractAddress();
const systemContract = await SystemContract__factory.connect(systemContractAddress, deployer);

const factoryContractAddress = getZEVMAppAddress("rewardDistributorFactory");

const rewardDistributorFactory = RewardDistributorFactory__factory.connect(factoryContractAddress, deployer);

const rewardContractAddress = await deployRewardByNetwork(
deployer,
systemContract,
NETWORK_NAME,
rewardDistributorFactory
);
await addReward(deployer, systemContract, rewardContractAddress, REWARD_DURATION, REWARDS_AMOUNT);
};

main().catch(error => {

Check failure on line 36 in packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-zrc20-reward.ts

View workflow job for this annotation

GitHub Actions / build

Replace `error` with `(error)`
console.error(error);
process.exit(1);
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
import { BigNumber } from "@ethersproject/bignumber";
import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers";
import { ZetaProtocolNetwork } from "@zetachain/protocol-contracts";
import { parseEther } from "ethers/lib/utils";

import {
ERC20__factory,
RewardDistributor__factory,
RewardDistributorFactory,
SystemContract

Check failure on line 10 in packages/zevm-app-contracts/scripts/liquidity-incentives/helpers.ts

View workflow job for this annotation

GitHub Actions / build

Insert `,`
} from "../../typechain-types";
import { getChainId } from "../address.helpers";

export const deployRewardByToken = async (
deployer: SignerWithAddress,
systemContract: SystemContract,
tokenAddress: string,
rewardDistributorFactory: RewardDistributorFactory
) => {
const zetaTokenAddress = await systemContract.wZetaContractAddress();

const tx = await rewardDistributorFactory.createTokenIncentive(
deployer.address,
deployer.address,
zetaTokenAddress,
// @dev: now we send both tokens so contract calculate internaly LP address
zetaTokenAddress,
tokenAddress
);

const receipt = await tx.wait();

const event = receipt.events?.find(e => e.event === "RewardDistributorCreated");

Check failure on line 33 in packages/zevm-app-contracts/scripts/liquidity-incentives/helpers.ts

View workflow job for this annotation

GitHub Actions / build

Replace `e` with `(e)`

const { rewardDistributorContract: rewardDistributorContractAddress } = event?.args as any;

console.log("RewardDistributor deployed to:", rewardDistributorContractAddress);

return rewardDistributorContractAddress;
};

const getZRC20Address = async (systemContract: SystemContract, network: ZetaProtocolNetwork) => {
const tokenAddress = await systemContract.gasCoinZRC20ByChainId(getChainId(network));
return tokenAddress;
};

export const deployRewardByNetwork = async (
deployer: SignerWithAddress,
systemContract: SystemContract,
networkName: ZetaProtocolNetwork,
rewardDistributorFactory: RewardDistributorFactory
) => {
const tokenAddress = await getZRC20Address(systemContract, networkName);
const rewardContractAddress = await deployRewardByToken(
deployer,
systemContract,
tokenAddress,
rewardDistributorFactory
);
return rewardContractAddress;
};

export const addReward = async (
deployer: SignerWithAddress,
systemContract: SystemContract,
rewardDistributorContractAddress: string,
rewardAmount: BigNumber = parseEther("500"),
rewardDuration: BigNumber = BigNumber.from("604800").mul(8) // 1 week * 8
) => {
const zetaTokenAddress = await systemContract.wZetaContractAddress();

const rewardDistributorContract = await RewardDistributor__factory.connect(
rewardDistributorContractAddress,
deployer
);

const ZETA = ERC20__factory.connect(zetaTokenAddress, deployer);
const tx = await ZETA.transfer(rewardDistributorContract.address, rewardAmount.mul(1));
await tx.wait();
await rewardDistributorContract.setRewardsDuration(rewardDuration);
await rewardDistributorContract.notifyRewardAmount(rewardAmount);

console.log("Reward added to:", rewardDistributorContract.address);
};
Loading