Skip to content
80 changes: 54 additions & 26 deletions src/contracts/QRaffle.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -514,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;
Expand Down Expand Up @@ -578,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;
Expand Down Expand Up @@ -610,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;
Expand Down Expand Up @@ -645,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;
Expand Down Expand Up @@ -727,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);
Expand Down Expand Up @@ -786,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);
Expand Down Expand Up @@ -822,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 ;
Expand Down Expand Up @@ -858,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);
Expand Down Expand Up @@ -1211,6 +1239,21 @@ struct QRAFFLE : public ContractBase
locals.winnerIndex = (uint32)mod(locals.r, state.numberOfQuRaffleMembers * 1ull);
locals.winner = state.quRaffleMembers.get(locals.winnerIndex);

// Get QRAFFLE asset shareholders
locals.QraffleAsset.assetName = QRAFFLE_ASSET_NAME;
locals.QraffleAsset.issuer = NULL_ID;
locals.iter.begin(locals.QraffleAsset);
while (!locals.iter.reachedEnd())
{
locals.shareholder = locals.iter.possessor();
if (state.shareholdersList.contains(locals.shareholder) == 0)
{
state.shareholdersList.add(locals.shareholder);
}

locals.iter.next();
}

if (state.numberOfQuRaffleMembers > 0)
{
// Calculate fee distributions
Expand Down Expand Up @@ -1284,26 +1327,11 @@ struct QRAFFLE : public ContractBase

if (state.epochQXMRRevenue >= 676)
{
// Process QRAFFLE asset shareholders and log
locals.QraffleAsset.assetName = QRAFFLE_ASSET_NAME;
locals.QraffleAsset.issuer = NULL_ID;
locals.iter.begin(locals.QraffleAsset);
while (!locals.iter.reachedEnd())
{
locals.shareholder = locals.iter.possessor();
if (state.shareholdersList.contains(locals.shareholder) == 0)
{
state.shareholdersList.add(locals.shareholder);
}

locals.iter.next();
}

locals.idx = state.shareholdersList.nextElementIndex(NULL_INDEX);
while (locals.idx != NULL_INDEX)
{
locals.shareholder = state.shareholdersList.key(locals.idx);
qpi.transferShareOwnershipAndPossession(QRAFFLE_QXMR_ASSET_NAME, state.QXMRIssuer, SELF, SELF, div<uint64>(state.epochQXMRRevenue, 676), locals.shareholder);
qpi.transferShareOwnershipAndPossession(QRAFFLE_QXMR_ASSET_NAME, state.QXMRIssuer, SELF, SELF, div<uint64>(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<uint64>(state.epochQXMRRevenue, 676) * 676;
Expand Down Expand Up @@ -1344,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<uint64>(locals.shareholderRevenue, 676), locals.shareholder);
qpi.transferShareOwnershipAndPossession(locals.acTokenRaffle.token.assetName, locals.acTokenRaffle.token.issuer, SELF, SELF, div<uint64>(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);
}

Expand Down
Loading