From 1fe5d58a0aebde85da8fe97638819567fbb25b3a Mon Sep 17 00:00:00 2001 From: TakaYuPP Date: Fri, 19 Dec 2025 11:45:57 +0900 Subject: [PATCH 1/7] fix: refund bug in the registerInSystem of Qraffle SC --- src/contracts/QRaffle.h | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/contracts/QRaffle.h b/src/contracts/QRaffle.h index ae4f1a4c7..6df78dea7 100644 --- a/src/contracts/QRaffle.h +++ b/src/contracts/QRaffle.h @@ -446,6 +446,10 @@ struct QRAFFLE : public ContractBase } if (state.numberOfRegisters >= QRAFFLE_MAX_MEMBER) { + if (qpi.invocationReward() > 0) + { + qpi.transfer(qpi.invocator(), qpi.invocationReward()); + } output.returnCode = QRAFFLE_MAX_MEMBER_REACHED; locals.log = QRAFFLELogger{ QRAFFLE_CONTRACT_INDEX, QRAFFLE_maxMemberReached, 0 }; LOG_INFO(locals.log); @@ -454,13 +458,14 @@ struct QRAFFLE : public ContractBase if (input.useQXMR) { + // refund the invocation reward if the user uses QXMR for registration + if (qpi.invocationReward() > 0) + { + qpi.transfer(qpi.invocator(), qpi.invocationReward()); + } // Use QXMR tokens for registration if (qpi.numberOfPossessedShares(QRAFFLE_QXMR_ASSET_NAME, state.QXMRIssuer, qpi.invocator(), qpi.invocator(), SELF_INDEX, SELF_INDEX) < QRAFFLE_QXMR_REGISTER_AMOUNT) { - if (qpi.invocationReward() > 0) - { - qpi.transfer(qpi.invocator(), qpi.invocationReward()); - } output.returnCode = QRAFFLE_INSUFFICIENT_QXMR; locals.log = QRAFFLELogger{ QRAFFLE_CONTRACT_INDEX, QRAFFLE_insufficientQXMR, 0 }; LOG_INFO(locals.log); @@ -470,10 +475,6 @@ struct QRAFFLE : public ContractBase // Transfer QXMR tokens to the contract if (qpi.transferShareOwnershipAndPossession(QRAFFLE_QXMR_ASSET_NAME, state.QXMRIssuer, qpi.invocator(), qpi.invocator(), QRAFFLE_QXMR_REGISTER_AMOUNT, SELF) < 0) { - if (qpi.invocationReward() > 0) - { - qpi.transfer(qpi.invocator(), qpi.invocationReward()); - } output.returnCode = QRAFFLE_INSUFFICIENT_QXMR; locals.log = QRAFFLELogger{ QRAFFLE_CONTRACT_INDEX, QRAFFLE_insufficientQXMR, 0 }; LOG_INFO(locals.log); From ef388aadb286c156505868dd98b2e01128b3f95b Mon Sep 17 00:00:00 2001 From: TakaYuPP Date: Fri, 19 Dec 2025 11:54:03 +0900 Subject: [PATCH 2/7] fix: missing refund logic --- src/contracts/QRaffle.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/contracts/QRaffle.h b/src/contracts/QRaffle.h index 6df78dea7..cb070fbf8 100644 --- a/src/contracts/QRaffle.h +++ b/src/contracts/QRaffle.h @@ -515,6 +515,10 @@ struct QRAFFLE : public ContractBase PUBLIC_PROCEDURE_WITH_LOCALS(logoutInSystem) { + if (qpi.invocationReward() > 0) + { + qpi.transfer(qpi.invocator(), qpi.invocationReward()); + } if (qpi.invocator() == state.initialRegister1 || qpi.invocator() == state.initialRegister2 || qpi.invocator() == state.initialRegister3 || qpi.invocator() == state.initialRegister4 || qpi.invocator() == state.initialRegister5) { output.returnCode = QRAFFLE_INITIAL_REGISTER_CANNOT_LOGOUT; @@ -579,6 +583,10 @@ struct QRAFFLE : public ContractBase PUBLIC_PROCEDURE_WITH_LOCALS(submitEntryAmount) { + if (qpi.invocationReward() > 0) + { + qpi.transfer(qpi.invocator(), qpi.invocationReward()); + } if (input.amount < QRAFFLE_MIN_QRAFFLE_AMOUNT || input.amount > QRAFFLE_MAX_QRAFFLE_AMOUNT) { output.returnCode = QRAFFLE_INVALID_ENTRY_AMOUNT; @@ -611,6 +619,10 @@ struct QRAFFLE : public ContractBase PUBLIC_PROCEDURE_WITH_LOCALS(submitProposal) { + if (qpi.invocationReward() > 0) + { + qpi.transfer(qpi.invocator(), qpi.invocationReward()); + } if (state.registers.contains(qpi.invocator()) == 0) { output.returnCode = QRAFFLE_UNREGISTERED; @@ -646,6 +658,10 @@ struct QRAFFLE : public ContractBase PUBLIC_PROCEDURE_WITH_LOCALS(voteInProposal) { + if (qpi.invocationReward() > 0) + { + qpi.transfer(qpi.invocator(), qpi.invocationReward()); + } if (state.registers.contains(qpi.invocator()) == 0) { output.returnCode = QRAFFLE_UNREGISTERED; @@ -728,6 +744,10 @@ struct QRAFFLE : public ContractBase { if (state.numberOfQuRaffleMembers >= QRAFFLE_MAX_MEMBER) { + if (qpi.invocationReward() > 0) + { + qpi.transfer(qpi.invocator(), qpi.invocationReward()); + } output.returnCode = QRAFFLE_MAX_MEMBER_REACHED; locals.log = QRAFFLELogger{ QRAFFLE_CONTRACT_INDEX, QRAFFLE_maxMemberReachedForQuRaffle, 0 }; LOG_INFO(locals.log); @@ -787,6 +807,10 @@ struct QRAFFLE : public ContractBase } if (input.indexOfTokenRaffle >= state.numberOfActiveTokenRaffle) { + if (qpi.invocationReward() > 0) + { + qpi.transfer(qpi.invocator(), qpi.invocationReward()); + } output.returnCode = QRAFFLE_INVALID_TOKEN_RAFFLE; locals.log = QRAFFLELogger{ QRAFFLE_CONTRACT_INDEX, QRAFFLE_invalidTokenRaffle, 0 }; LOG_INFO(locals.log); @@ -823,6 +847,10 @@ struct QRAFFLE : public ContractBase { if (qpi.invocationReward() < QRAFFLE_TRANSFER_SHARE_FEE) { + if (qpi.invocationReward() > 0) + { + qpi.transfer(qpi.invocator(), qpi.invocationReward()); + } locals.log = QRAFFLELogger{ QRAFFLE_CONTRACT_INDEX, QRAFFLE_insufficientQubic, 0 }; LOG_INFO(locals.log); return ; From 641b294ff18d8f9cf4e5a5f37ea918e7b50dd206 Mon Sep 17 00:00:00 2001 From: TakaYuPP Date: Fri, 19 Dec 2025 12:22:51 +0900 Subject: [PATCH 3/7] increase the amount of QXMR to register in system --- src/contracts/QRaffle.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/contracts/QRaffle.h b/src/contracts/QRaffle.h index cb070fbf8..798cd7a01 100644 --- a/src/contracts/QRaffle.h +++ b/src/contracts/QRaffle.h @@ -1,12 +1,12 @@ using namespace QPI; constexpr uint64 QRAFFLE_REGISTER_AMOUNT = 1000000000ull; -constexpr uint64 QRAFFLE_QXMR_REGISTER_AMOUNT = 100000000ull; +constexpr uint64 QRAFFLE_QXMR_REGISTER_AMOUNT = 250000000ull; constexpr uint64 QRAFFLE_MAX_QRE_AMOUNT = 1000000000ull; constexpr uint64 QRAFFLE_ASSET_NAME = 19505638103142993; constexpr uint64 QRAFFLE_QXMR_ASSET_NAME = 1380800593; // QXMR token asset name constexpr uint32 QRAFFLE_LOGOUT_FEE = 50000000; -constexpr uint32 QRAFFLE_QXMR_LOGOUT_FEE = 5000000; // QXMR logout fee +constexpr uint32 QRAFFLE_QXMR_LOGOUT_FEE = 12500000; // QXMR logout fee constexpr uint32 QRAFFLE_TRANSFER_SHARE_FEE = 100; constexpr uint32 QRAFFLE_BURN_FEE = 10; // percent constexpr uint32 QRAFFLE_REGISTER_FEE = 5; // percent From 28a19dc6484dc3fd3f4a6d3088b3886a0b37258a Mon Sep 17 00:00:00 2001 From: TakaYuPP Date: Wed, 24 Dec 2025 08:58:29 +0900 Subject: [PATCH 4/7] fix: wrong double payment for the TransferShareManagementRight --- src/contracts/QRaffle.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/contracts/QRaffle.h b/src/contracts/QRaffle.h index 798cd7a01..480ced32d 100644 --- a/src/contracts/QRaffle.h +++ b/src/contracts/QRaffle.h @@ -887,7 +887,6 @@ struct QRAFFLE : public ContractBase { // success output.transferredNumberOfShares = input.numberOfShares; - qpi.transfer(id(QX_CONTRACT_INDEX, 0, 0, 0), QRAFFLE_TRANSFER_SHARE_FEE); if (qpi.invocationReward() > QRAFFLE_TRANSFER_SHARE_FEE) { qpi.transfer(qpi.invocator(), qpi.invocationReward() - QRAFFLE_TRANSFER_SHARE_FEE); From 224f6254153cdda44d9fc690c4725a3b6408d8a3 Mon Sep 17 00:00:00 2001 From: TakaYuPP Date: Wed, 24 Dec 2025 15:07:57 +0900 Subject: [PATCH 5/7] fix: reject too low entryamount for the token raffles --- src/contracts/QRaffle.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/contracts/QRaffle.h b/src/contracts/QRaffle.h index 480ced32d..2147fc16f 100644 --- a/src/contracts/QRaffle.h +++ b/src/contracts/QRaffle.h @@ -19,6 +19,7 @@ constexpr uint32 QRAFFLE_MAX_MEMBER = 65536; constexpr uint32 QRAFFLE_DEFAULT_QRAFFLE_AMOUNT = 10000000ull; constexpr uint32 QRAFFLE_MIN_QRAFFLE_AMOUNT = 1000000ull; constexpr uint32 QRAFFLE_MAX_QRAFFLE_AMOUNT = 1000000000ull; +constexpr uint32 QRAFFLE_MIN_TOKEN_RAFFLE_AMOUNT = 100000; constexpr sint32 QRAFFLE_SUCCESS = 0; constexpr sint32 QRAFFLE_INSUFFICIENT_FUND = 1; @@ -623,6 +624,13 @@ struct QRAFFLE : public ContractBase { qpi.transfer(qpi.invocator(), qpi.invocationReward()); } + if (input.entryAmount < QRAFFLE_MIN_TOKEN_RAFFLE_AMOUNT) + { + output.returnCode = QRAFFLE_INVALID_ENTRY_AMOUNT; + locals.log = QRAFFLELogger{ QRAFFLE_CONTRACT_INDEX, QRAFFLE_invalidEntryAmount, 0 }; + LOG_INFO(locals.log); + return ; + } if (state.registers.contains(qpi.invocator()) == 0) { output.returnCode = QRAFFLE_UNREGISTERED; From 652d983d4558d24018abc3b9ace7d9b600680008 Mon Sep 17 00:00:00 2001 From: TakaYuPP Date: Wed, 24 Dec 2025 16:12:12 +0900 Subject: [PATCH 6/7] Remove minimum token raffle amount validation Removed the minimum token raffle amount check from the entry validation process.(revert previous commit) --- src/contracts/QRaffle.h | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/contracts/QRaffle.h b/src/contracts/QRaffle.h index 2147fc16f..480ced32d 100644 --- a/src/contracts/QRaffle.h +++ b/src/contracts/QRaffle.h @@ -19,7 +19,6 @@ constexpr uint32 QRAFFLE_MAX_MEMBER = 65536; constexpr uint32 QRAFFLE_DEFAULT_QRAFFLE_AMOUNT = 10000000ull; constexpr uint32 QRAFFLE_MIN_QRAFFLE_AMOUNT = 1000000ull; constexpr uint32 QRAFFLE_MAX_QRAFFLE_AMOUNT = 1000000000ull; -constexpr uint32 QRAFFLE_MIN_TOKEN_RAFFLE_AMOUNT = 100000; constexpr sint32 QRAFFLE_SUCCESS = 0; constexpr sint32 QRAFFLE_INSUFFICIENT_FUND = 1; @@ -624,13 +623,6 @@ struct QRAFFLE : public ContractBase { qpi.transfer(qpi.invocator(), qpi.invocationReward()); } - if (input.entryAmount < QRAFFLE_MIN_TOKEN_RAFFLE_AMOUNT) - { - output.returnCode = QRAFFLE_INVALID_ENTRY_AMOUNT; - locals.log = QRAFFLELogger{ QRAFFLE_CONTRACT_INDEX, QRAFFLE_invalidEntryAmount, 0 }; - LOG_INFO(locals.log); - return ; - } if (state.registers.contains(qpi.invocator()) == 0) { output.returnCode = QRAFFLE_UNREGISTERED; From 6563d0bce34de45e27adfbc80f15c712c33917fd Mon Sep 17 00:00:00 2001 From: TakaYuPP Date: Fri, 26 Dec 2025 20:25:24 +0900 Subject: [PATCH 7/7] fix: revenue distribution for the multiple holding --- src/contracts/QRaffle.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/contracts/QRaffle.h b/src/contracts/QRaffle.h index 480ced32d..b10b30ea7 100644 --- a/src/contracts/QRaffle.h +++ b/src/contracts/QRaffle.h @@ -1331,7 +1331,7 @@ struct QRAFFLE : public ContractBase while (locals.idx != NULL_INDEX) { locals.shareholder = state.shareholdersList.key(locals.idx); - qpi.transferShareOwnershipAndPossession(QRAFFLE_QXMR_ASSET_NAME, state.QXMRIssuer, SELF, SELF, div(state.epochQXMRRevenue, 676), locals.shareholder); + qpi.transferShareOwnershipAndPossession(QRAFFLE_QXMR_ASSET_NAME, state.QXMRIssuer, SELF, SELF, div(state.epochQXMRRevenue, 676) * qpi.numberOfShares(locals.QraffleAsset, AssetOwnershipSelect::byOwner(locals.shareholder), AssetPossessionSelect::byPossessor(locals.shareholder)), locals.shareholder); locals.idx = state.shareholdersList.nextElementIndex(locals.idx); } state.epochQXMRRevenue -= div(state.epochQXMRRevenue, 676) * 676; @@ -1372,7 +1372,7 @@ struct QRAFFLE : public ContractBase while (locals.idx != NULL_INDEX) { locals.shareholder = state.shareholdersList.key(locals.idx); - qpi.transferShareOwnershipAndPossession(locals.acTokenRaffle.token.assetName, locals.acTokenRaffle.token.issuer, SELF, SELF, div(locals.shareholderRevenue, 676), locals.shareholder); + qpi.transferShareOwnershipAndPossession(locals.acTokenRaffle.token.assetName, locals.acTokenRaffle.token.issuer, SELF, SELF, div(locals.shareholderRevenue, 676) * qpi.numberOfShares(locals.acTokenRaffle.token, AssetOwnershipSelect::byOwner(locals.shareholder), AssetPossessionSelect::byPossessor(locals.shareholder)), locals.shareholder); locals.idx = state.shareholdersList.nextElementIndex(locals.idx); }