diff --git a/src/contracts/QRaffle.h b/src/contracts/QRaffle.h index 4c5fc6ccb..a053c0f87 100644 --- a/src/contracts/QRaffle.h +++ b/src/contracts/QRaffle.h @@ -330,6 +330,7 @@ struct QRAFFLE : public ContractBase uint64 entryAmount; uint32 numberOfMembers; uint32 winnerIndex; + uint32 numberOfDaoMembers; sint32 returnCode; }; @@ -425,6 +426,9 @@ struct QRAFFLE : public ContractBase id charityAddress, feeAddress, QXMRIssuer; uint64 epochRevenue, epochQXMRRevenue, qREAmount, totalBurnAmount, totalCharityAmount, totalShareholderAmount, totalRegisterAmount, totalFeeAmount, totalWinnerAmount, largestWinnerAmount; uint32 numberOfRegisters, numberOfQuRaffleMembers, numberOfEntryAmountSubmitted, numberOfProposals, numberOfActiveTokenRaffle, numberOfEndedTokenRaffle; + + // New state variables added at the end to avoid breaking existing state + Array daoMemberCount; // Number of DAO members (registers) at each epoch struct registerInSystem_locals { @@ -1109,6 +1113,7 @@ struct QRAFFLE : public ContractBase output.entryAmount = state.QuRaffles.get(input.epoch).entryAmount; output.numberOfMembers = state.QuRaffles.get(input.epoch).numberOfMembers; output.winnerIndex = state.QuRaffles.get(input.epoch).winnerIndex; + output.numberOfDaoMembers = state.daoMemberCount.get(input.epoch); output.returnCode = QRAFFLE_SUCCESS; } @@ -1311,6 +1316,7 @@ struct QRAFFLE : public ContractBase locals.qraffle.numberOfMembers = state.numberOfQuRaffleMembers; locals.qraffle.winnerIndex = locals.winnerIndex; state.QuRaffles.set(qpi.epoch(), locals.qraffle); + state.daoMemberCount.set(qpi.epoch(), state.numberOfRegisters); // Store DAO member count for this epoch // Log QuRaffle completion with detailed information locals.endEpochLog = QRAFFLEEndEpochLogger{ diff --git a/test/contract_qraffle.cpp b/test/contract_qraffle.cpp index afbf3e503..2f8f7346e 100644 --- a/test/contract_qraffle.cpp +++ b/test/contract_qraffle.cpp @@ -160,13 +160,15 @@ class QRaffleChecker : public QRAFFLE } void quRaffleWinnerChecker(uint16 epoch, const id& expectedWinner, uint64 expectedReceived, - uint64 expectedEntryAmount, uint32 expectedMembers, uint32 expectedWinnerIndex) + uint64 expectedEntryAmount, uint32 expectedMembers, uint32 expectedWinnerIndex, + uint32 expectedDaoMembers) { EXPECT_EQ(QuRaffles.get(epoch).epochWinner, expectedWinner); EXPECT_EQ(QuRaffles.get(epoch).receivedAmount, expectedReceived); EXPECT_EQ(QuRaffles.get(epoch).entryAmount, expectedEntryAmount); EXPECT_EQ(QuRaffles.get(epoch).numberOfMembers, expectedMembers); EXPECT_EQ(QuRaffles.get(epoch).winnerIndex, expectedWinnerIndex); + EXPECT_EQ(daoMemberCount.get(epoch), expectedDaoMembers); } uint64 getQuRaffleEntryAmount() @@ -1053,6 +1055,8 @@ TEST(ContractQraffle, GetFunctions) EXPECT_GT(endedQuRaffle.receivedAmount, 0); EXPECT_EQ(endedQuRaffle.entryAmount, 10000000); EXPECT_EQ(endedQuRaffle.numberOfMembers, memberCount); + EXPECT_GT(endedQuRaffle.numberOfDaoMembers, 0u); // NEW: Verify DAO members stored + EXPECT_EQ(endedQuRaffle.numberOfDaoMembers, qraffle.getState()->getNumberOfRegisters()); // NEW: Match current count // Test with future epoch auto futureQuRaffle = qraffle.getEndedQuRaffle(1); @@ -1167,7 +1171,8 @@ TEST(ContractQraffle, EndEpoch) auto quRaffle = qraffle.getEndedQuRaffle(0); EXPECT_EQ(quRaffle.returnCode, QRAFFLE_SUCCESS); qraffle.getState()->quRaffleWinnerChecker(0, quRaffle.epochWinner, quRaffle.receivedAmount, - quRaffle.entryAmount, quRaffle.numberOfMembers, quRaffle.winnerIndex); + quRaffle.entryAmount, quRaffle.numberOfMembers, quRaffle.winnerIndex, + quRaffle.numberOfDaoMembers); qraffle.endEpoch(); // Check that token raffles were processed