From 10a6a5bd90092cf658f3d4331da2f160ef46dc3d Mon Sep 17 00:00:00 2001 From: Andres Aiello Date: Wed, 27 Dec 2023 17:52:31 -0300 Subject: [PATCH 1/2] feat: Iimprove token incentive scripts --- .../liquidity-incentives/add-reward.ts | 120 ++---------------- .../deploy-default-rewards.ts | 61 +++++++++ .../deploy-token-reward.ts | 39 ++++++ .../deploy-zrc20-reward.ts | 39 ++++++ .../scripts/liquidity-incentives/helpers.ts | 84 ++++++++++++ 5 files changed, 236 insertions(+), 107 deletions(-) create mode 100644 packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-default-rewards.ts create mode 100644 packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-token-reward.ts create mode 100644 packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-zrc20-reward.ts create mode 100644 packages/zevm-app-contracts/scripts/liquidity-incentives/helpers.ts diff --git a/packages/zevm-app-contracts/scripts/liquidity-incentives/add-reward.ts b/packages/zevm-app-contracts/scripts/liquidity-incentives/add-reward.ts index f00c455a..ca5cd42a 100644 --- a/packages/zevm-app-contracts/scripts/liquidity-incentives/add-reward.ts +++ b/packages/zevm-app-contracts/scripts/liquidity-incentives/add-reward.ts @@ -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 => { console.error(error); process.exit(1); }); diff --git a/packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-default-rewards.ts b/packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-default-rewards.ts new file mode 100644 index 00000000..0c467542 --- /dev/null +++ b/packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-default-rewards.ts @@ -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 => { + console.error(error); + process.exit(1); +}); diff --git a/packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-token-reward.ts b/packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-token-reward.ts new file mode 100644 index 00000000..9d2911f0 --- /dev/null +++ b/packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-token-reward.ts @@ -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 => { + console.error(error); + process.exit(1); +}); diff --git a/packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-zrc20-reward.ts b/packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-zrc20-reward.ts new file mode 100644 index 00000000..4f6a76e4 --- /dev/null +++ b/packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-zrc20-reward.ts @@ -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 => { + console.error(error); + process.exit(1); +}); diff --git a/packages/zevm-app-contracts/scripts/liquidity-incentives/helpers.ts b/packages/zevm-app-contracts/scripts/liquidity-incentives/helpers.ts new file mode 100644 index 00000000..025e24fa --- /dev/null +++ b/packages/zevm-app-contracts/scripts/liquidity-incentives/helpers.ts @@ -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 +} 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"); + + 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); +}; From 6d064368da04f62566fc73f0b776e0d8ec4f06fc Mon Sep 17 00:00:00 2001 From: Andres Aiello Date: Wed, 27 Dec 2023 19:21:49 -0300 Subject: [PATCH 2/2] lint --- .../scripts/liquidity-incentives/add-reward.ts | 2 +- .../scripts/liquidity-incentives/deploy-default-rewards.ts | 2 +- .../scripts/liquidity-incentives/deploy-token-reward.ts | 2 +- .../scripts/liquidity-incentives/deploy-zrc20-reward.ts | 2 +- .../scripts/liquidity-incentives/helpers.ts | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/zevm-app-contracts/scripts/liquidity-incentives/add-reward.ts b/packages/zevm-app-contracts/scripts/liquidity-incentives/add-reward.ts index ca5cd42a..aee56866 100644 --- a/packages/zevm-app-contracts/scripts/liquidity-incentives/add-reward.ts +++ b/packages/zevm-app-contracts/scripts/liquidity-incentives/add-reward.ts @@ -23,7 +23,7 @@ const main = async () => { await addReward(deployer, systemContract, REWARD_CONTRACT_ADDRESS, REWARD_DURATION, REWARDS_AMOUNT); }; -main().catch(error => { +main().catch((error) => { console.error(error); process.exit(1); }); diff --git a/packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-default-rewards.ts b/packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-default-rewards.ts index 0c467542..2b4feb22 100644 --- a/packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-default-rewards.ts +++ b/packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-default-rewards.ts @@ -55,7 +55,7 @@ const main = async () => { await addReward(deployer, systemContract, rewardContractAddress, REWARD_DURATION, REWARDS_AMOUNT); }; -main().catch(error => { +main().catch((error) => { console.error(error); process.exit(1); }); diff --git a/packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-token-reward.ts b/packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-token-reward.ts index 9d2911f0..2c777db4 100644 --- a/packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-token-reward.ts +++ b/packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-token-reward.ts @@ -33,7 +33,7 @@ const main = async () => { await addReward(deployer, systemContract, rewardContractAddress, REWARD_DURATION, REWARDS_AMOUNT); }; -main().catch(error => { +main().catch((error) => { console.error(error); process.exit(1); }); diff --git a/packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-zrc20-reward.ts b/packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-zrc20-reward.ts index 4f6a76e4..ef8ff3db 100644 --- a/packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-zrc20-reward.ts +++ b/packages/zevm-app-contracts/scripts/liquidity-incentives/deploy-zrc20-reward.ts @@ -33,7 +33,7 @@ const main = async () => { await addReward(deployer, systemContract, rewardContractAddress, REWARD_DURATION, REWARDS_AMOUNT); }; -main().catch(error => { +main().catch((error) => { console.error(error); process.exit(1); }); diff --git a/packages/zevm-app-contracts/scripts/liquidity-incentives/helpers.ts b/packages/zevm-app-contracts/scripts/liquidity-incentives/helpers.ts index 025e24fa..29c0748f 100644 --- a/packages/zevm-app-contracts/scripts/liquidity-incentives/helpers.ts +++ b/packages/zevm-app-contracts/scripts/liquidity-incentives/helpers.ts @@ -7,7 +7,7 @@ import { ERC20__factory, RewardDistributor__factory, RewardDistributorFactory, - SystemContract + SystemContract, } from "../../typechain-types"; import { getChainId } from "../address.helpers"; @@ -30,7 +30,7 @@ export const deployRewardByToken = async ( const receipt = await tx.wait(); - const event = receipt.events?.find(e => e.event === "RewardDistributorCreated"); + const event = receipt.events?.find((e) => e.event === "RewardDistributorCreated"); const { rewardDistributorContract: rewardDistributorContractAddress } = event?.args as any;