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_createDAOWithZeroPrice() public {
vm.startPrank(alice);
DAOInputConfig memory daoConfig = DAOInputConfig("DAO", DAOType.PUBLIC, address(currency), 100, 3);
TierConfig[] memory tiersConfig = new TierConfig[]();
tiersConfig[0] = TierConfig(10, 0, 30, 0);
tiersConfig[1] = TierConfig(10, 0, 20, 0);
tiersConfig[2] = TierConfig(10, 0, 10, 0);
address daoAddress = membershipFactory.createNewDAOMembership(daoConfig, tiersConfig);
vm.stopPrank();
vm.startPrank(bob);
uint256 balanceProtocolBefore = currency.balanceOf(owpWallet);
uint256 balanceBobBefore = currency.balanceOf(bob);
membershipFactory.joinDAO(daoAddress, 0);
membershipFactory.joinDAO(daoAddress, 1);
membershipFactory.joinDAO(daoAddress, 2);
uint256 balanceProtocolAfter = currency.balanceOf(owpWallet);
uint256 balanceBobAfter = currency.balanceOf(bob);
assertEq(balanceProtocolAfter - balanceProtocolBefore, 0);
assertEq(balanceBobAfter - balanceBobBefore, 0);
}
}
because the main resource of protocol fee is from user joining a DAO, this would create a loss of potential income, and user can use the feature for free.
function createNewDAOMembership(DAOInputConfig calldata daoConfig, TierConfig[] calldata tierConfigs)
external returns (address) {
.
.
.
DAOConfig storage dao = daos[address(proxy)];
@@ -84,10 +100,13 @@ contract MembershipFactory is AccessControl, NativeMetaTransaction {
for (uint256 i = 0; i < tierConfigs.length; i++) {
require(tierConfigs[i].minted == 0, "Invalid tier config");
+ require(tierConfigs[i].price > 0, "Invalid tier config");
dao.tiers.push(tierConfigs[i]);
}