From 57aed40871233c30ae50d01ab93242fd9bddfbbb Mon Sep 17 00:00:00 2001 From: Mohammad Ranjbar Z Date: Tue, 24 Sep 2024 12:45:29 +0330 Subject: [PATCH 1/7] Add new chain to givEconomy guide related to https://github.com/Giveth/giveth-dapps-v2/issues/4723#issuecomment-2370621560 --- README.md | 9 +- add-new-chain-to-givEconomy-guide.md | 136 +++++++++++++++++++++++++++ 2 files changed, 143 insertions(+), 2 deletions(-) create mode 100644 add-new-chain-to-givEconomy-guide.md diff --git a/README.md b/README.md index 2332d28..18f6b80 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ $ npm run generate-merkle-root Total distributed tokens: 14430863000000000000000000 ``` -* Get merkletree root +* Get merkletree root ``` $ cat ./files/merkle_distributor_xdai_result.json | jq '.merkleRoot' "0x05176bac832b5a9cd000091d231638fe0e854801c447aae625ed2f710c026196" @@ -42,7 +42,10 @@ $ cat ./files/merkle_distributor_xdai_result.json | jq '.merkleRoot' ## Deploy **To select the gasPrice you need to edit the hardhat.config.ts** -### xDAI +## Add new chain guide +See [Add new chain to givEconomy guide](add-new-chain-to-givEconomy-guide.md) + +### xDAI ``` /Users/amin/.nvm/versions/node/v14.17.5/bin/node /Users/amin/.nvm/versions/node/v14.17.5/lib/node_modules/npm/bin/npm-cli.js run deploy:xDAI --scripts-prepend-node-path=auto @@ -361,3 +364,5 @@ tokenDistro.hasRole(tokenDistro.DISTRIBUTOR_ROLE(),giveth_uni_reward.address) tr tokenDistro.hasRole(tokenDistro.DISTRIBUTOR_ROLE(),giveth_bal.address) true tokenDistro.hasRole(tokenDistro.DISTRIBUTOR_ROLE(),unigiv.address) true ``` + + diff --git a/add-new-chain-to-givEconomy-guide.md b/add-new-chain-to-givEconomy-guide.md new file mode 100644 index 0000000..d271d84 --- /dev/null +++ b/add-new-chain-to-givEconomy-guide.md @@ -0,0 +1,136 @@ +## Deploy GIV test token +1. Open ethereum remix, and use erc20 token template + +``` +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.20; + + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; +import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol"; + + +contract MyToken is ERC20, Ownable, ERC20Permit { + constructor(address initialOwner) + ERC20("Giveth", "GIV") + Ownable(initialOwner) + ERC20Permit("Giveth") + {} + + + function mint(address to, uint256 amount) public onlyOwner { + _mint(to, amount); + } +} +``` + +2. Deploy contract on the network +3. Verify contract (Use flatten in remix and then upload it in the remix) +4. Transfer ownership if it's needed https://cardona-zkevm.polygonscan.com/address/0xa77390562986f5d08f5aecf5d3fb82bd16b44548#writeContract +5. Mint tokens in block explorer https://cardona-zkevm.polygonscan.com/address/0xa77390562986f5d08f5aecf5d3fb82bd16b44548#writeContract + +## Deploy token distro +1. Install foundry on your system https://book.getfoundry.sh/getting-started/installation +2. Run this command `Foundryup` +3. Clone this project https://github.com/giveth/giveconomy-foundry +4. `forge build` +5. Edit these parameters +``` + address givTokenOptimismMainnet = 0x528CDc92eAB044E1E39FE43B9514bfdAB4412B98; // address of giv token deployed on previous step + + // initiliaze params for token distro + uint256 totalTokens = 2000000000000000000000000000; + uint256 startTime = 1640361600; // read from previous published smart contract + // like https://cardona-zkevm.polygonscan.com/address/0xa77390562986f5d08f5aecf5d3fb82bd16b44548#readContract + uint256 cliffPeriod = 0; + uint256 duration = 157680000; // read from previous published smart contract + uint256 initialPercentage = 1000; // read from previous published smart contract +``` +in below file https://github.com/Giveth/giveconomy-foundry/blob/develop/script/deployTokenDistro.s.sol + +6. Fill `.env` file in the project with these data +``` +PRIVATE_KEY=// I should start with 0x +ETHERSCAN_API_KEY= // from block explorer of that specific chain +VERIFIER_URL=https://api-cardona-zkevm.polygonscan.com/api // You can find it in block explorer +// like https://docs.polygonscan.com/v/polygon-zkevm/getting-started/endpoint-urls + +``` +7. Edit https://github.com/Giveth/giveconomy-foundry/blob/develop/foundry.toml and add this line(for zkevm cardona, +for other chains you should change them based on the chain + +``` +cardona = { key = "${ETHERSCAN_API_KEY}", url = "https://api-cardona-zkevm.polygonscan.com/api", chain = 2442 } +``` + +8. Enter this command to check everything is working locally + +`forge script script/deployTokenDistro.s.sol --rpc-url {rpcUrl} --legacy --chain 2442 {Desired chainId}` + + +9. Enter this command to broadcast and verify the smart contracts on blockchain + +`forge script script/deployTokenDistro.s.sol --rpc-url {rpcUrl} --verify --broadcast --legacy --chain 2442 {Desired chainId}` + +9. Verify contract with proxy admin in the block explorer + +This is example of published `tokenDistro`: https://cardona-zkevm.polygonscan.com/address/0x2df3e67be4e441cddd2d29c3d41dfd7d516f18e6 + +## Mint GIV test token for token distro +We go to [token page in the block explorer](https://cardona-zkevm.polygonscan.com/address/0xa77390562986f5d08f5aecf5d3fb82bd16b44548#writeContract) and mint as much as token that we need for token distro address + +## Deploy Unipool givPower +1. change some parms in below file +https://github.com/Giveth/giveconomy-foundry/blob/develop/script/deployUnipoolGIVpower.s.sol + +``` + address givTokenAddressOptimismSepolia = 0x2f2c819210191750F2E11F7CfC5664a0eB4fd5e6; + // address tokenDistroOptimismMainnet = 0xE3Ac7b3e6B4065f4765d76fDC215606483BF3bD1; + address tokenDistroOptimismSepolia = 0x301C739CF6bfb6B47A74878BdEB13f92F13Ae5E7; + ProxyAdmin unipoolGIVpowerProxyAdmin = ProxyAdmin(address(0x3b197F5cDa3516bD49e193df6F1273f3f16d414a)); +``` +all of these params are achieved in the previous steps + +2. Deploy it with foundry +`forge script script/deployUnipoolGIVpower.s.sol --rpc-url {rpcUrl} --legacy --chain 2442 --verify --broadcast` + +3. Verify contract with proxy admin in the block explorer + +4. We call `notifyRewardAmount` method and set some reward for the contract https://cardona-zkevm.polygonscan.com/address/0x7e9f30a74fcdf035018bc007f9930aa171863e33#writeProxyContract the `rewardDistributor` address can call it (on unipool smart contract) + +5. Call `transferOwnership` if it's needed + +6. Call `setRewardDistribution` on Unipool GivPower to set the wallet address which will call the `notifyRewardAmount` + +7. Check the address of `DISTRIBUTOR_ROLE` in tokenDistro contract https://cardona-zkevm.polygonscan.com/address/0x2df3e67be4e441cddd2d29c3d41dfd7d516f18e6#readProxyContract + +8. Call `grantRole` in `tokenDistro` https://cardona-zkevm.polygonscan.com/address/0x2df3e67be4e441cddd2d29c3d41dfd7d516f18e6#writeProxyContract and grant `DISTRIBUTOR_ROLE` to givPower unipool address + +9. Call `assign()` method in tokenDistro and assign the reward token amount to unipool givPower + + +## Test +1. Call `stake` method in unipoolGivPower contract +2. See the giviverse expansion percentage in https://giveth.io/givstream +3. Call the `getReward()` method in unipool givPower contract. the `result * percentage = the amount we show in harvest modal` + +## Add subgraph configs +Should add new network in https://github.com/Giveth/giveconomy-subgraph/blob/develop/networks.yaml with needed addresses (all addresses should be in the notion file) + +## Integrate with Frontend +You can know how to do it with looking at below PR +https://github.com/Giveth/giveth-dapps-v2/pull/4562/files +(LM adress is the UnipoolGivPower address, for staging ENV you should add configs to `development.tsx` and for produciton you need to add the configs to `production.tsx` + +## Notify Reward Bot +1. We have a wallet address that is in charge for this purpose, we have th private key of that address in the server, so we should make sure call`setRewardDistribution` on Unipool GivPower to set the wallet address of this private key as `reward distributor` +2. We write a script in `giv-token-contract` to call it with crontab jobs https://github.com/Giveth/giv-token-contracts/commit/5188586beed3e0f73c7e0b9bbaf653134184a215 +3. We should transfer some monet the reward distributor address for the gas fee on the new chain that we want ( if reward distributor doesnt have gas, the no`notifyRewardAmount` tx can't be executed +4. Setup the crontab on the server to execute this script periodically + +## Giv unlcok bot +1. Copy a folder of https://github.com/Giveth/givpower-bot in the server, then change config values to the new chain and bring up the docker compose, then this app will unlcok the GIVs when it's the time +2. Make sure that the wallet address of the private key that we put in the config have enough gas fee in it +3. Sometimes some weird things can happen, for instance we had a problem on ZKEVM unlcok bot that Amin fixed that with this PR +https://github.com/Giveth/givpower-bot/pull/8 From 16da2011c6027ca4caad57ca9702e2ca44c05654 Mon Sep 17 00:00:00 2001 From: mohammadranjbarz Date: Wed, 25 Sep 2024 17:02:28 +0330 Subject: [PATCH 2/7] Update add-new-chain-to-givEconomy-guide.md Co-authored-by: Amin Latifi --- add-new-chain-to-givEconomy-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/add-new-chain-to-givEconomy-guide.md b/add-new-chain-to-givEconomy-guide.md index d271d84..96cacad 100644 --- a/add-new-chain-to-givEconomy-guide.md +++ b/add-new-chain-to-givEconomy-guide.md @@ -131,6 +131,6 @@ https://github.com/Giveth/giveth-dapps-v2/pull/4562/files ## Giv unlcok bot 1. Copy a folder of https://github.com/Giveth/givpower-bot in the server, then change config values to the new chain and bring up the docker compose, then this app will unlcok the GIVs when it's the time -2. Make sure that the wallet address of the private key that we put in the config have enough gas fee in it +2. Make sure that the wallet address of the private key that we put in the config has enough gas in it 3. Sometimes some weird things can happen, for instance we had a problem on ZKEVM unlcok bot that Amin fixed that with this PR https://github.com/Giveth/givpower-bot/pull/8 From c48339667fb809847cbb77b3ab21abf85b372f41 Mon Sep 17 00:00:00 2001 From: mohammadranjbarz Date: Wed, 25 Sep 2024 17:02:36 +0330 Subject: [PATCH 3/7] Update add-new-chain-to-givEconomy-guide.md Co-authored-by: Amin Latifi --- add-new-chain-to-givEconomy-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/add-new-chain-to-givEconomy-guide.md b/add-new-chain-to-givEconomy-guide.md index 96cacad..f7af59e 100644 --- a/add-new-chain-to-givEconomy-guide.md +++ b/add-new-chain-to-givEconomy-guide.md @@ -126,7 +126,7 @@ https://github.com/Giveth/giveth-dapps-v2/pull/4562/files ## Notify Reward Bot 1. We have a wallet address that is in charge for this purpose, we have th private key of that address in the server, so we should make sure call`setRewardDistribution` on Unipool GivPower to set the wallet address of this private key as `reward distributor` 2. We write a script in `giv-token-contract` to call it with crontab jobs https://github.com/Giveth/giv-token-contracts/commit/5188586beed3e0f73c7e0b9bbaf653134184a215 -3. We should transfer some monet the reward distributor address for the gas fee on the new chain that we want ( if reward distributor doesnt have gas, the no`notifyRewardAmount` tx can't be executed +3. Transfer some gas to the reward distributor address if it doesn't have enough to make `notifyRewardAmount` transactions 4. Setup the crontab on the server to execute this script periodically ## Giv unlcok bot From bb8ed51b184a99407a3203c93adbb0ba22e0a80e Mon Sep 17 00:00:00 2001 From: mohammadranjbarz Date: Wed, 25 Sep 2024 17:02:55 +0330 Subject: [PATCH 4/7] Update add-new-chain-to-givEconomy-guide.md Co-authored-by: Amin Latifi --- add-new-chain-to-givEconomy-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/add-new-chain-to-givEconomy-guide.md b/add-new-chain-to-givEconomy-guide.md index f7af59e..08330d4 100644 --- a/add-new-chain-to-givEconomy-guide.md +++ b/add-new-chain-to-givEconomy-guide.md @@ -103,7 +103,7 @@ all of these params are achieved in the previous steps 6. Call `setRewardDistribution` on Unipool GivPower to set the wallet address which will call the `notifyRewardAmount` -7. Check the address of `DISTRIBUTOR_ROLE` in tokenDistro contract https://cardona-zkevm.polygonscan.com/address/0x2df3e67be4e441cddd2d29c3d41dfd7d516f18e6#readProxyContract +7. Check the Role ID of `DISTRIBUTOR_ROLE` in tokenDistro contract https://cardona-zkevm.polygonscan.com/address/0x2df3e67be4e441cddd2d29c3d41dfd7d516f18e6#readProxyContract 8. Call `grantRole` in `tokenDistro` https://cardona-zkevm.polygonscan.com/address/0x2df3e67be4e441cddd2d29c3d41dfd7d516f18e6#writeProxyContract and grant `DISTRIBUTOR_ROLE` to givPower unipool address From f1c06cbefc6260b28a9cd61f81ac8ef3876a385d Mon Sep 17 00:00:00 2001 From: mohammadranjbarz Date: Wed, 25 Sep 2024 17:03:11 +0330 Subject: [PATCH 5/7] Update add-new-chain-to-givEconomy-guide.md Co-authored-by: Amin Latifi --- add-new-chain-to-givEconomy-guide.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/add-new-chain-to-givEconomy-guide.md b/add-new-chain-to-givEconomy-guide.md index 08330d4..8f008b7 100644 --- a/add-new-chain-to-givEconomy-guide.md +++ b/add-new-chain-to-givEconomy-guide.md @@ -73,7 +73,9 @@ cardona = { key = "${ETHERSCAN_API_KEY}", url = "https://api-cardona-zkevm.polyg `forge script script/deployTokenDistro.s.sol --rpc-url {rpcUrl} --verify --broadcast --legacy --chain 2442 {Desired chainId}` -9. Verify contract with proxy admin in the block explorer +9. Open the block-explorer website's smart contract page (code section) and declare it as a proxy. +image + This is example of published `tokenDistro`: https://cardona-zkevm.polygonscan.com/address/0x2df3e67be4e441cddd2d29c3d41dfd7d516f18e6 From 6434ddba2e61cc783ebf2b2b136b2b5bda24648c Mon Sep 17 00:00:00 2001 From: mohammadranjbarz Date: Mon, 7 Oct 2024 13:19:33 +0330 Subject: [PATCH 6/7] Update add-new-chain-to-givEconomy-guide.md Co-authored-by: Amin Latifi --- add-new-chain-to-givEconomy-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/add-new-chain-to-givEconomy-guide.md b/add-new-chain-to-givEconomy-guide.md index 8f008b7..1dda049 100644 --- a/add-new-chain-to-givEconomy-guide.md +++ b/add-new-chain-to-givEconomy-guide.md @@ -118,7 +118,7 @@ all of these params are achieved in the previous steps 3. Call the `getReward()` method in unipool givPower contract. the `result * percentage = the amount we show in harvest modal` ## Add subgraph configs -Should add new network in https://github.com/Giveth/giveconomy-subgraph/blob/develop/networks.yaml with needed addresses (all addresses should be in the notion file) +Should add new network in https://github.com/Giveth/giveconomy-subgraph/blob/develop/networks.yaml with corresponding addresses and start block (all addresses should be in the notion file) ## Integrate with Frontend You can know how to do it with looking at below PR From bd6a4cc9d45421865371e77801410af425469bff Mon Sep 17 00:00:00 2001 From: Mohammad Ranjbar Z Date: Mon, 7 Oct 2024 13:19:52 +0330 Subject: [PATCH 7/7] Update ne chain integration guide --- add-new-chain-to-givEconomy-guide.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/add-new-chain-to-givEconomy-guide.md b/add-new-chain-to-givEconomy-guide.md index 8f008b7..7ad7a54 100644 --- a/add-new-chain-to-givEconomy-guide.md +++ b/add-new-chain-to-givEconomy-guide.md @@ -97,11 +97,19 @@ all of these params are achieved in the previous steps 2. Deploy it with foundry `forge script script/deployUnipoolGIVpower.s.sol --rpc-url {rpcUrl} --legacy --chain 2442 --verify --broadcast` -3. Verify contract with proxy admin in the block explorer +3. Proxy admin got verified automatically, what we do tell the block explorer to look at the upgradable contract as an upgradable one (with proxy and implementation) 4. We call `notifyRewardAmount` method and set some reward for the contract https://cardona-zkevm.polygonscan.com/address/0x7e9f30a74fcdf035018bc007f9930aa171863e33#writeProxyContract the `rewardDistributor` address can call it (on unipool smart contract) 5. Call `transferOwnership` if it's needed +Below items are a pre-release deployment checklist for zkevm chain integration, it can be good to look at it https://www.notion.so/giveth/Deployment-52935e6579034f1b940bbef161e82229 +- [x] Grant Distributor Role to the Unipool GIVPower on Token Distro https://zkevm.polygonscan.com/tx/0x2f9f1bf5f06a14aced38381b2c77a7cb52ea217c94f6268d4c0fb473e99ca793 +- [x] Set notify reward role to notify reward bot on Unipool Givpower https://zkevm.polygonscan.com/tx/0xfffb1ddb8cc09219c2fad53336788ac469b96013f43789833e39d0324d164ad6 +- [x] Transfer Unipool GIVPower ownership to multisig https://zkevm.polygonscan.com/tx/0x87b3aa1021cedba39d61abad3b6e0b25b32bf801d33ce11770457437ed967fc4 +- [x] Transfer Unipool GIVPower upgradability power to multisig https://zkevm.polygonscan.com/tx/0x24fe2338f04057c62552bcdda0353bf45944f0eca994bf3a59625eacc91d0926 +- [x] Grant Admin role to Multisig on Token Distro https://zkevm.polygonscan.com/tx/0x1c1761c95f2e533b9d5417af0f2e5d5d781e7f5f3836d527fd4a43b55828439a +- [x] Revoke Mohammad Admin Permission On TokenDistro https://zkevm.polygonscan.com/tx/0xebdf88ecf7f6e1d8ef56c24c169c48bf0d62478732e7eb6c3f55f991282e119a +- [x] Transfer TokenDistro Upgradability power to Giveth Multisig https://zkevm.polygonscan.com/tx/0x24fe2338f04057c62552bcdda0353bf45944f0eca994bf3a59625eacc91d0926 6. Call `setRewardDistribution` on Unipool GivPower to set the wallet address which will call the `notifyRewardAmount` @@ -114,10 +122,11 @@ all of these params are achieved in the previous steps ## Test 1. Call `stake` method in unipoolGivPower contract -2. See the giviverse expansion percentage in https://giveth.io/givstream +2. See the GIViverse expansion percentage in https://giveth.io/givstream 3. Call the `getReward()` method in unipool givPower contract. the `result * percentage = the amount we show in harvest modal` ## Add subgraph configs + Should add new network in https://github.com/Giveth/giveconomy-subgraph/blob/develop/networks.yaml with needed addresses (all addresses should be in the notion file) ## Integrate with Frontend