MembershipFactory::upgradeTier accepts fromTierIndex from zero to six. And zero is the top tier, which can't be upgraded by the protocol's business logic. When the user inputs fromTierIndex, it just reports a program error. It's better to show this is the max tier, can't be upgraded, and improve the users's experience.
function upgradeTier(address daoMembershipAddress, uint256 fromTierIndex) external {
require(daos[daoMembershipAddress].daoType == DAOType.SPONSORED, "Upgrade not allowed.");
require(daos[daoMembershipAddress].noOfTiers >= fromTierIndex + 1, "No higher tier available.");
IMembershipERC1155(daoMembershipAddress).burn(_msgSender(), fromTierIndex, 2);
IMembershipERC1155(daoMembershipAddress).mint(_msgSender(), fromTierIndex - 1, 1);
emit UserJoinedDAO(_msgSender(), daoMembershipAddress, fromTierIndex - 1);
}
describe("POC upgrade tier", function () {
beforeEach(async function () {
DAOType = { GENERAL: 0, PRIVATE: 1, SPONSORED: 2 };
DAOConfig = {
ensname: "testdao.eth",
daoType: DAOType.SPONSORED,
currency: testERC20.target,
maxMembers: 100,
noOfTiers: 7,
};
TierConfig = [
{ price: 300, amount: 10, minted: 0, power: 12 },
{ price: 200, amount: 10, minted: 0, power: 6 },
{ price: 100, amount: 10, minted: 0, power: 3 },
{ price: 300, amount: 10, minted: 0, power: 12 },
{ price: 200, amount: 10, minted: 0, power: 6 },
{ price: 100, amount: 10, minted: 0, power: 3 },
{ price: 100, amount: 10, minted: 0, power: 3 },
];
await currencyManager.addCurrency(testERC20.target);
await membershipFactory.createNewDAOMembership(DAOConfig, TierConfig);
const ensAddress = await membershipFactory.getENSAddress("testdao.eth");
membershipERC1155 = await MembershipERC1155.attach(ensAddress);
});
it("POC allow user to upgrade tier", async function () {
await testERC20.mint(addr1.address, 300);
await testERC20.connect(addr1).approve(membershipFactory.target, 300);
await expect(
membershipFactory.connect(addr1).joinDAO(membershipERC1155.target, 6)
).to.emit(membershipFactory, "UserJoinedDAO");
await testERC20.mint(addr1.address, 300);
await testERC20.connect(addr1).approve(membershipFactory.target, 300);
await expect(
membershipFactory.connect(addr1).joinDAO(membershipERC1155.target, 6)
).to.emit(membershipFactory, "UserJoinedDAO");
await membershipFactory
.connect(addr1)
.upgradeTier(membershipERC1155.target, 6);
});
});