Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 41 additions & 13 deletions src/contracts/QRaffle.h
Original file line number Diff line number Diff line change
@@ -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
Expand Down 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 @@ -1303,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<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