From fd7fcfd1916b75e9325013de7463fa209a700a01 Mon Sep 17 00:00:00 2001 From: gs8nrv <55771972+GuillaumeNervoXS@users.noreply.github.com> Date: Wed, 4 Dec 2024 20:01:53 +0100 Subject: [PATCH] feat: add foundry scripts for reallocation testing --- helpers/fork.sh | 13 +++- package.json | 4 +- scripts/foundry/ClaimDistributor.s.sol | 58 +++++++++++++++ .../foundry/ReallocateCampaignRewards.s.sol | 43 +++++++++++ scripts/foundry/UpdateCampaign.s.sol | 72 ++++++++++--------- scripts/foundry/UpdateRoute.s.sol | 35 +++++++++ 6 files changed, 187 insertions(+), 38 deletions(-) create mode 100644 scripts/foundry/ClaimDistributor.s.sol create mode 100644 scripts/foundry/ReallocateCampaignRewards.s.sol create mode 100644 scripts/foundry/UpdateRoute.s.sol diff --git a/helpers/fork.sh b/helpers/fork.sh index ea784a1..6102bbf 100644 --- a/helpers/fork.sh +++ b/helpers/fork.sh @@ -30,8 +30,17 @@ function main { exit 1 fi - echo "Forking $uri" - anvil --fork-url $uri + echo "What block do you want to fork ? (Can leave empty for instant)" + + read block + + if [ -z "$block" ]; then + echo "Forking $uri" + anvil --fork-url $uri + else + echo "Forking $uri at block $block" + anvil --fork-url $uri --fork-block-number $block + fi } main diff --git a/package.json b/package.json index fc3d420..4080011 100644 --- a/package.json +++ b/package.json @@ -39,8 +39,8 @@ "check-upgradeability": "hardhat run scripts/checkUpgradeability.ts", "impersonate": "cast rpc anvil_impersonateAccount", "impersonate:script": "FOUNDRY_PROFILE=dev forge script --skip test --fork-url fork --broadcast -vvvv --gas-price 0 --priority-gas-price 0 --unlocked --sender", - "impersonate:setBalance": "cast rpc anvil_setBalance 0x19c41f6607b2c0e80e84baadaf886b17565f278e 1000000000000000000", - "fork:advanceTime": "cast rpc evm_increaseTime 3600 && cast rpc anvil_mine", + "impersonate:setBalance": "cast rpc anvil_setBalance 0x0022228a2cc5E7eF0274A7Baa600d44da5aB5776 1000000000000000000", + "fork:advanceTime": "cast rpc evm_increaseTime 704800 && cast rpc anvil_mine", "license": "hardhat prepend-spdx-license", "node:fork": "FORK=true hardhat node", "size": "yarn hardhat:compile && hardhat size-contracts", diff --git a/scripts/foundry/ClaimDistributor.s.sol b/scripts/foundry/ClaimDistributor.s.sol new file mode 100644 index 0000000..5a1c45a --- /dev/null +++ b/scripts/foundry/ClaimDistributor.s.sol @@ -0,0 +1,58 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.8.17; + +import { console } from "forge-std/console.sol"; +import { Distributor } from "contracts/Distributor.sol"; +import { MockToken, IERC20 } from "contracts/mock/MockToken.sol"; +import { CommonUtils, ContractType } from "utils/src/CommonUtils.sol"; +import { CHAIN_BASE } from "utils/src/Constants.sol"; +import { StdAssertions } from "forge-std/Test.sol"; + +contract ClaimDistributor is CommonUtils, StdAssertions { + function run() external { + uint256 deployerPrivateKey = vm.envUint("DEPLOYER_PRIVATE_KEY"); + address deployer = vm.addr(deployerPrivateKey); + + /// TODO: COMPLETE + uint256 chainId = CHAIN_BASE; + IERC20 rewardToken = IERC20(0xC011882d0f7672D8942e7fE2248C174eeD640c8f); + address claimer = 0x15775b23340C0f50E0428D674478B0e9D3D0a759; + uint256 balanceToClaim = 1918683165360; + bytes32[][] memory proofs = new bytes32[][](1); + address[] memory users = new address[](1); + address[] memory tokens = new address[](1); + uint256[] memory amounts = new uint256[](1); + proofs[0] = new bytes32[](17); + proofs[0][0] = bytes32(0xb4273243bd0ec5add5e6d803f13bf6866ed1904d24626766ab2836454ba1ec0a); + proofs[0][1] = bytes32(0x3ee0ead23e2fe3f664ccb5e13683f27e27a4d7fefa8405545fb6421244630375); + proofs[0][2] = bytes32(0x69f54e33351af15236b33bb4695470f1af96cd1a9f154aa511ff16faa6886791); + proofs[0][3] = bytes32(0xa9d77ad46850fbfb8c196c693acdbb0c6241a2e561a8b0073ec71297a565673d); + proofs[0][4] = bytes32(0xe1b57f280e556c7f217e8d375f0cef7977a9467d5496d32bb8ec461f0d4c4f19); + proofs[0][5] = bytes32(0x0fc7ddc7cc9ecc7f7b0be5692f671394f6245ffdabe5c0fd2062eb71b7c11826); + proofs[0][6] = bytes32(0x94445a98fe6679760e5ac2edeacfe0bfa397f805c7adeaf3558a82accb78f201); + proofs[0][7] = bytes32(0x14a6fec66cdfece5c73ec44196f1414326236131ff9a60350cca603e54985c4e); + proofs[0][8] = bytes32(0x84679751230af3e3242ea1cecfc8daee3d2187ab647281cbf8c52e649a43e84c); + proofs[0][9] = bytes32(0xc0fc15960178fe4d542c93e64ec58648e5ff17bd02b27f841bd6ab838fc5ee67); + proofs[0][10] = bytes32(0x9b84efe5d11bc4de32ecd204c3962dd9270694d93a50e2840d763eaeac6c194b); + proofs[0][11] = bytes32(0x5c8025dbe663cf4b4e19fbc7b1e54259af5822fd774fd60a98e7c7a60112efe0); + proofs[0][12] = bytes32(0x301b573f9a6503ebe00ff7031a33cd41170d8b4c09a31fcafb9feb7529400a79); + proofs[0][13] = bytes32(0xc89942ad2dcb0ac96d2620ef9475945bdbe6d40a9f6c4e9f6d9437a953bf881c); + proofs[0][14] = bytes32(0xce6ca90077dc547f9a52a24d2636d659642fbae1d16c81c9e47c5747a472c63f); + proofs[0][15] = bytes32(0xe34667d2e10b515dd1f7b29dcd7990d25ea9caa7a7de571c4fb221c0a8fc82a1); + proofs[0][16] = bytes32(0x8316d6488fd22b823cc35ee673297ea2a753f0a89e5384ef20b38d053c881628); + users[0] = claimer; + tokens[0] = address(rewardToken); + amounts[0] = balanceToClaim; + /// END + + Distributor distributor = Distributor(_chainToContract(chainId, ContractType.Distributor)); + + vm.startBroadcast(claimer); + + distributor.claim(users, tokens, amounts, proofs); + + assertEq(rewardToken.balanceOf(claimer), balanceToClaim); + + vm.stopBroadcast(); + } +} diff --git a/scripts/foundry/ReallocateCampaignRewards.s.sol b/scripts/foundry/ReallocateCampaignRewards.s.sol new file mode 100644 index 0000000..1c8f10f --- /dev/null +++ b/scripts/foundry/ReallocateCampaignRewards.s.sol @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.8.17; + +import { console } from "forge-std/console.sol"; +import { DistributionCreator, DistributionParameters, CampaignParameters } from "contracts/DistributionCreator.sol"; +import { MockToken, IERC20 } from "contracts/mock/MockToken.sol"; +import { CommonUtils, ContractType } from "utils/src/CommonUtils.sol"; +import { CHAIN_BASE } from "utils/src/Constants.sol"; +import { StdAssertions } from "forge-std/Test.sol"; +import { ERC4626 } from "@openzeppelin/contracts/token/ERC20/extensions/ERC4626.sol"; + +contract ReallocateCampaignRewards is CommonUtils, StdAssertions { + function run() external { + uint256 deployerPrivateKey = vm.envUint("DEPLOYER_PRIVATE_KEY"); + address deployer = vm.addr(deployerPrivateKey); + + /// TODO: COMPLETE + uint256 chainId = CHAIN_BASE; + IERC20 rewardToken = IERC20(0xC011882d0f7672D8942e7fE2248C174eeD640c8f); + uint256 amount = 97 ether; // after fees + bytes32 campaignId = 0x1d1231a7a6958431a5760b929c56f0e44a20f06e92a52324c19a2e4d2ec529bc; + address to = 0xA9DdD91249DFdd450E81E1c56Ab60E1A62651701; + address[] memory froms = new address[](2); + froms[0] = 0x15775b23340C0f50E0428D674478B0e9D3D0a759; + froms[1] = 0xe4BB74804edf5280c9203f034036f7CB15196078; + /// END + + DistributionCreator distributionCreator = DistributionCreator( + _chainToContract(chainId, ContractType.DistributionCreator) + ); + uint32 timestamp = uint32(block.timestamp); + + vm.startBroadcast(deployer); + + distributionCreator.reallocateCampaignRewards(campaignId, froms, to); + + assertEq(distributionCreator.campaignReallocation(campaignId, froms[0]), to); + assertEq(distributionCreator.campaignListReallocation(campaignId, 0), froms[0]); + assertEq(distributionCreator.campaignListReallocation(campaignId, 1), froms[1]); + + vm.stopBroadcast(); + } +} diff --git a/scripts/foundry/UpdateCampaign.s.sol b/scripts/foundry/UpdateCampaign.s.sol index 9e7ff86..c1bb952 100644 --- a/scripts/foundry/UpdateCampaign.s.sol +++ b/scripts/foundry/UpdateCampaign.s.sol @@ -18,9 +18,9 @@ contract UpdateCampaign is CommonUtils, StdAssertions { uint256 chainId = CHAIN_BASE; IERC20 rewardToken = IERC20(0xC011882d0f7672D8942e7fE2248C174eeD640c8f); uint256 amount = 97 ether; // after fees - bytes32 campaignId = 0xba2af37b09cc7627766d25a587bb481cede79c7e7db30ce68ca01f0555cdd828; - uint32 startTimestamp = uint32(1732191162); - uint32 duration = 3600 * 10; + bytes32 campaignId = 0x6628165d9b509afe46d9009fecc7012c68cc0ce24aafdc4ce11f23a01ccc1a22; + uint32 startTimestamp = uint32(1733155692); + uint32 duration = 3600 * 6; /// END DistributionCreator distributionCreator = DistributionCreator( @@ -35,6 +35,10 @@ contract UpdateCampaign is CommonUtils, StdAssertions { vm.startBroadcast(deployer); + // It will be less than that but we don't care + MockToken(address(rewardToken)).mint(deployer, amount); + rewardToken.approve(address(distributionCreator), amount); + // IERC20(0x0000206329b97DB379d5E1Bf586BbDB969C63274).approve( // address(0xbEEfa1aBfEbE621DF50ceaEF9f54FdB73648c92C), // 100_000 ether @@ -53,17 +57,17 @@ contract UpdateCampaign is CommonUtils, StdAssertions { // hex"" // ); - // // ERC20 distrib - // uint32 campaignType = 1; - // bytes memory campaignData = abi.encode( - // 0x70F796946eD919E4Bc6cD506F8dACC45E4539771, - // new address[](0), - // new address[](0), - // "", - // new bytes[](0), - // new bytes[](0), - // hex"" - // ); + // ERC20 distrib + uint32 campaignType = 1; + bytes memory campaignData = abi.encode( + 0x70F796946eD919E4Bc6cD506F8dACC45E4539771, + new address[](0), + new address[](0), + "", + new bytes[](0), + new bytes[](0), + hex"" + ); // // Silo distrib // address[] memory whitelist = new address[](1); @@ -78,22 +82,22 @@ contract UpdateCampaign is CommonUtils, StdAssertions { // hex"" // ); - // CLAMM distrib - uint32 campaignType = 2; - bytes memory campaignData = abi.encode( - 0x5280d5E63b416277d0F81FAe54Bb1e0444cAbDAA, - 5100, - 1700, - 3200, - false, - address(0), - 1, - new address[](0), - new address[](0), - "", - new bytes[](0), - hex"" - ); + // // CLAMM distrib + // uint32 campaignType = 2; + // bytes memory campaignData = abi.encode( + // 0x5280d5E63b416277d0F81FAe54Bb1e0444cAbDAA, + // 5100, + // 1700, + // 3200, + // false, + // address(0), + // 1, + // new address[](0), + // new address[](0), + // "", + // new bytes[](0), + // hex"" + // ); distributionCreator.overrideCampaign( campaignId, @@ -126,12 +130,12 @@ contract UpdateCampaign is CommonUtils, StdAssertions { assertEq(campaignStartTimestamp, startTimestamp); assertEq(campaignDuration, duration); assertEq(campaignCampaignData, campaignData); - // assertLt(distributionCreator.campaignOverridesTimestamp(campaignId, 0), timestamp); - // assertLt(distributionCreator.campaignOverridesTimestamp(campaignId, 1), timestamp); + assertLt(distributionCreator.campaignOverridesTimestamp(campaignId, 0), timestamp); + assertLt(distributionCreator.campaignOverridesTimestamp(campaignId, 1), timestamp); // assertLt(distributionCreator.campaignOverridesTimestamp(campaignId, 2), timestamp); - assertGe(distributionCreator.campaignOverridesTimestamp(campaignId, 0), timestamp); + assertGe(distributionCreator.campaignOverridesTimestamp(campaignId, 2), timestamp); vm.expectRevert(); - distributionCreator.campaignOverridesTimestamp(campaignId, 1); + distributionCreator.campaignOverridesTimestamp(campaignId, 3); vm.stopBroadcast(); } diff --git a/scripts/foundry/UpdateRoute.s.sol b/scripts/foundry/UpdateRoute.s.sol new file mode 100644 index 0000000..505adad --- /dev/null +++ b/scripts/foundry/UpdateRoute.s.sol @@ -0,0 +1,35 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.8.17; + +import { console } from "forge-std/console.sol"; +import { Distributor, MerkleTree } from "contracts/Distributor.sol"; +import { MockToken, IERC20 } from "contracts/mock/MockToken.sol"; +import { CommonUtils, ContractType } from "utils/src/CommonUtils.sol"; +import { CHAIN_BASE } from "utils/src/Constants.sol"; +import { StdAssertions } from "forge-std/Test.sol"; + +contract UpdateRoute is CommonUtils, StdAssertions { + function run() external { + uint256 deployerPrivateKey = vm.envUint("DEPLOYER_PRIVATE_KEY"); + address deployer = vm.addr(deployerPrivateKey); + + /// TODO: COMPLETE + uint256 chainId = CHAIN_BASE; + MerkleTree memory newTree = MerkleTree({ + merkleRoot: 0xb402de8ed2f573c780a39e6d41aa5276706c439849d1e4925d379f2aa8913577, + ipfsHash: bytes32(0) + }); + address updater = 0x435046800Fb9149eE65159721A92cB7d50a7534b; + /// END + + Distributor distributor = Distributor(_chainToContract(chainId, ContractType.Distributor)); + + vm.startBroadcast(updater); + + distributor.updateTree(newTree); + + vm.stopBroadcast(); + + // You then need to wait 1 hour to be effective + } +}