tx · DN7jhGs21wgMBEH7XJMegDU6v1WdtCuPm2SnXkVY747P

3N4Kzbxu521DHPxcgrmZ4XUqN2kF6TqLTzs:  -0.01000000 Waves

2023.09.03 15:49 [2739209] smart account 3N4Kzbxu521DHPxcgrmZ4XUqN2kF6TqLTzs > SELF 0.00000000 Waves

{ "type": 13, "id": "DN7jhGs21wgMBEH7XJMegDU6v1WdtCuPm2SnXkVY747P", "fee": 1000000, "feeAssetId": null, "timestamp": 1693745388836, "version": 2, "chainId": 84, "sender": "3N4Kzbxu521DHPxcgrmZ4XUqN2kF6TqLTzs", "senderPublicKey": "8yQuxvQ2qLzXJrgbKZHbsfnNNjuU5wfHheyVujdALGsF", "proofs": [ "4MVwunSJGepxsq4hKiMbNxMk2E1ahLj4ygvNhb8GFrM5vZUJphaPTQVXZt7edWjsELArNFmvedQEQa2qxY5xHz2M" ], "script": "base64:BgIfCAISABIECgIIARIGCgQIAQEIEgQKAggBEgUKAwgBCBEADmxvdHRlcnlBc3NldElEASAi1eE3pAm1kH7yDd2K/R2HDGQ6c8cmK+ceUzFNVsLOiQEQZ2V0SW50ZWdlck9yRWxzZQIDa2V5A3ZhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQNrZXkFA3ZhbAEPZ2V0U3RyaW5nT3JFbHNlAgNrZXkDdmFsCQELdmFsdWVPckVsc2UCCQCiCAEFA2tleQUDdmFsAQ9zdHJpbmdLZXlFeGlzdHMBA2tleQMJAQlpc0RlZmluZWQBCQCiCAEFA2tleQYHAQJtawEBeAkAuQkCBQF4AgFfARVrZXlMb3R0ZXJ5VG90YWxTdGFrZWQBC2xvdHRlcnlOYW1lCQECbWsBCQDMCAICB2xvdHRlcnkJAMwIAgULbG90dGVyeU5hbWUJAMwIAgILdG90YWxTdGFrZWQFA25pbAETa2V5TG90dGVyeUFkclN0YWtlZAILbG90dGVyeU5hbWUDYWRyCQECbWsBCQDMCAICB2xvdHRlcnkJAMwIAgULbG90dGVyeU5hbWUJAMwIAgIDYWRyCQDMCAIFA2FkcgkAzAgCAgZzdGFrZWQFA25pbAETa2V5TG90dGVyeUFkckxvY2tlZAILbG90dGVyeU5hbWUDYWRyCQECbWsBCQDMCAICB2xvdHRlcnkJAMwIAgULbG90dGVyeU5hbWUJAMwIAgIDYWRyCQDMCAIFA2FkcgkAzAgCAgZsb2NrZWQFA25pbAEVa2V5TG90dGVyeUZpbmFsSGVpZ2h0AQtsb3R0ZXJ5TmFtZQkBAm1rAQkAzAgCAgdsb3R0ZXJ5CQDMCAIFC2xvdHRlcnlOYW1lCQDMCAICC2ZpbmFsSGVpZ2h0BQNuaWwBFGtleUxvdHRlcnlQcml6ZVZhbHVlAgtsb3R0ZXJ5TmFtZQdwcml6ZUlECQECbWsBCQDMCAICB2xvdHRlcnkJAMwIAgULbG90dGVyeU5hbWUJAMwIAgIFcHJpemUJAMwIAgkApAMBBQdwcml6ZUlECQDMCAICBXZhbHVlBQNuaWwBGGtleUxvdHRlcnlQcml6ZVRocmVzaG9sZAILbG90dGVyeU5hbWUHcHJpemVJRAkBAm1rAQkAzAgCAgdsb3R0ZXJ5CQDMCAIFC2xvdHRlcnlOYW1lCQDMCAICBXByaXplCQDMCAIJAKQDAQUHcHJpemVJRAkAzAgCAgl0aHJlc2hvbGQFA25pbAEVa2V5TG90dGVyeVByaXplUmFuZG9tAgtsb3R0ZXJ5TmFtZQdwcml6ZUlECQECbWsBCQDMCAICB2xvdHRlcnkJAMwIAgULbG90dGVyeU5hbWUJAMwIAgIFcHJpemUJAMwIAgkApAMBBQdwcml6ZUlECQDMCAICBnJhbmRvbQUDbmlsARVrZXlMb3R0ZXJ5UHJpemVXaW5uZXICC2xvdHRlcnlOYW1lB3ByaXplSUQJAQJtawEJAMwIAgIHbG90dGVyeQkAzAgCBQtsb3R0ZXJ5TmFtZQkAzAgCAgVwcml6ZQkAzAgCCQCkAwEFB3ByaXplSUQJAMwIAgIGd2lubmVyBQNuaWwBFmtleUxvdHRlcnlUaWNrZXRzT3duZXIDC2xvdHRlcnlOYW1lBGZyb20CdG8JAQJtawEJAMwIAgIHbG90dGVyeQkAzAgCBQtsb3R0ZXJ5TmFtZQkAzAgCAgRmcm9tCQDMCAIJAKQDAQUEZnJvbQkAzAgCAgJ0bwkAzAgCCQCkAwEFAnRvCQDMCAICBW93bmVyBQNuaWwAEl9hY3RpdmVMb3R0ZXJ5TmFtZQkBAm1rAQkAzAgCAgVwYXJhbQkAzAgCAhFhY3RpdmVMb3R0ZXJ5TmFtZQUDbmlsABJfZ2xvYmFsVG90YWxTdGFrZWQJAQJtawEJAMwIAgIFcGFyYW0JAMwIAgIRZ2xvYmFsVG90YWxTdGFrZWQFA25pbAERYWN0aXZlTG90dGVyeU5hbWUABAtsb3R0ZXJ5TmFtZQkBD2dldFN0cmluZ09yRWxzZQIFEl9hY3RpdmVMb3R0ZXJ5TmFtZQIAAwkAAAIFC2xvdHRlcnlOYW1lAgACAAQSbG90dGVyeUZpbmFsSGVpZ2h0CQERQGV4dHJOYXRpdmUoMTA1NSkBCQEVa2V5TG90dGVyeUZpbmFsSGVpZ2h0AQULbG90dGVyeU5hbWUDCQBnAgUGaGVpZ2h0BRJsb3R0ZXJ5RmluYWxIZWlnaHQCAAULbG90dGVyeU5hbWUFAWkBBXN0YWtlAAQLbG90dGVyeU5hbWUJARFhY3RpdmVMb3R0ZXJ5TmFtZQADCQAAAgULbG90dGVyeU5hbWUCAAkAAgECEkxvdHRlcnkgbm90IGFjdGl2ZQMJAAACCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAj9ObyBwYXltZW50IGFkZGVkLiBZb3UgbXVzdCBhdHRhY2ggYSBwYXltZW50IGluIERvZGxsbm9kZSB0b2tlbnMDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAkBUb28gbWFueSBwYXltZW50cyBhZGRlZC4gVGhlcmUgbXVzdCBiZSBvbmx5IG9uZSBhdHRhY2hlZCBwYXltZW50AwkBAiE9AggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBQ5sb3R0ZXJ5QXNzZXRJRAkAAgECRFdyb25nIHBheW1lbnQgYXNzZXRJRC4gWW91IG11c3QgYXR0YWNoIGEgcGF5bWVudCBpbiBEb2RsbG5vZGUgdG9rZW5zBAZhbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BA1jYWxsZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgQTX2xvdHRlcnlUb3RhbFN0YWtlZAkBFWtleUxvdHRlcnlUb3RhbFN0YWtlZAEFC2xvdHRlcnlOYW1lBBJsb3R0ZXJ5VG90YWxTdGFrZWQJARBnZXRJbnRlZ2VyT3JFbHNlAgUTX2xvdHRlcnlUb3RhbFN0YWtlZAAABBFfbG90dGVyeUFkclN0YWtlZAkBE2tleUxvdHRlcnlBZHJTdGFrZWQCBQtsb3R0ZXJ5TmFtZQUNY2FsbGVyQWRkcmVzcwQQbG90dGVyeUFkclN0YWtlZAkBEGdldEludGVnZXJPckVsc2UCBRFfbG90dGVyeUFkclN0YWtlZAAABAZfb3duZXIJARZrZXlMb3R0ZXJ5VGlja2V0c093bmVyAwULbG90dGVyeU5hbWUFEmxvdHRlcnlUb3RhbFN0YWtlZAkAZQIJAGQCBRJsb3R0ZXJ5VG90YWxTdGFrZWQFBmFtb3VudAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCBRNfbG90dGVyeVRvdGFsU3Rha2VkCQBkAgUSbG90dGVyeVRvdGFsU3Rha2VkBQZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFEV9sb3R0ZXJ5QWRyU3Rha2VkCQBkAgUQbG90dGVyeUFkclN0YWtlZAUGYW1vdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIFBl9vd25lcgUNY2FsbGVyQWRkcmVzcwUDbmlsAWkBDHN0YXJ0TG90dGVyeQILbG90dGVyeU5hbWUSbG90dGVyeUZpbmFsSGVpZ2h0AwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIKQWRtaW4gb25seQkAzAgCCQELU3RyaW5nRW50cnkCBRJfYWN0aXZlTG90dGVyeU5hbWUFC2xvdHRlcnlOYW1lCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEVa2V5TG90dGVyeUZpbmFsSGVpZ2h0AQULbG90dGVyeU5hbWUFEmxvdHRlcnlGaW5hbEhlaWdodAUDbmlsAWkBDGRlY2xhcmVQcml6ZQQLbG90dGVyeU5hbWUHcHJpemVJZA5wcml6ZVRocmVzaG9sZApwcml6ZVZhbHVlAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIKQWRtaW4gb25seQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGGtleUxvdHRlcnlQcml6ZVRocmVzaG9sZAIFC2xvdHRlcnlOYW1lBQdwcml6ZUlkBQ5wcml6ZVRocmVzaG9sZAkAzAgCCQELU3RyaW5nRW50cnkCCQEUa2V5TG90dGVyeVByaXplVmFsdWUCBQtsb3R0ZXJ5TmFtZQUHcHJpemVJZAUKcHJpemVWYWx1ZQUDbmlsAWkBFGZpbmFsYWl6ZVByaXplUmFuZG9tAgtsb3R0ZXJ5TmFtZQdwcml6ZUlkAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIKQWRtaW4gb25seQQSbG90dGVyeUZpbmFsSGVpZ2h0CQERQGV4dHJOYXRpdmUoMTA1NSkBCQEVa2V5TG90dGVyeUZpbmFsSGVpZ2h0AQULbG90dGVyeU5hbWUDCQBmAgkAZAIFEmxvdHRlcnlGaW5hbEhlaWdodAABBQZoZWlnaHQJAAIBAhdMb3R0ZXJ5IGlzIG5vdCBvdmVyIHlldAQRbG90dGVyeVByaXplVmFsdWUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEUa2V5TG90dGVyeVByaXplVmFsdWUCBQtsb3R0ZXJ5TmFtZQUHcHJpemVJZAIUUHJpemUgZG9lcyBub3QgZXhpc3QEE19sb3R0ZXJ5UHJpemVSYW5kb20JARVrZXlMb3R0ZXJ5UHJpemVSYW5kb20CBQtsb3R0ZXJ5TmFtZQUHcHJpemVJZAMJAQ9zdHJpbmdLZXlFeGlzdHMBBRNfbG90dGVyeVByaXplUmFuZG9tCQACAQIsVGhlIHByaXplIHJhbmRvbSBoYXMgYWxyZWFkeSBiZWVuIGZpbmFsYWl6ZWQEC2ZpbmFsQmxvY2swCQEFdmFsdWUBCQDtBwEFEmxvdHRlcnlGaW5hbEhlaWdodAQLZmluYWxCbG9jazEJAQV2YWx1ZQEJAO0HAQkAZAIFEmxvdHRlcnlGaW5hbEhlaWdodAABBA5wcml6ZVJhbmRvbVJhdwkAngMBCQD3AwEJAMsBAgkAywECCQDLAQIBCXaHZZZaLbXq8gkAmgMBBQdwcml6ZUlkCQEFdmFsdWUBCAULZmluYWxCbG9jazADdnJmCQEFdmFsdWUBCAULZmluYWxCbG9jazEDdnJmBAtwcml6ZVJhbmRvbQMJAL8CAgkAtgIBAAAFDnByaXplUmFuZG9tUmF3CQC+AgEFDnByaXplUmFuZG9tUmF3BQ5wcml6ZVJhbmRvbVJhdwkAzAgCCQELU3RyaW5nRW50cnkCBRNfbG90dGVyeVByaXplUmFuZG9tCQCmAwEFC3ByaXplUmFuZG9tBQNuaWwBaQEUZmluYWxhaXplUHJpemVXaW5uZXIDC2xvdHRlcnlOYW1lB3ByaXplSWQJd2lubmVyQWRyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIKQWRtaW4gb25seQQTX2xvdHRlcnlQcml6ZVdpbm5lcgkBFWtleUxvdHRlcnlQcml6ZVdpbm5lcgIFC2xvdHRlcnlOYW1lBQdwcml6ZUlkAwkBD3N0cmluZ0tleUV4aXN0cwEFE19sb3R0ZXJ5UHJpemVXaW5uZXIJAAIBAixUaGUgcHJpemUgd2lubmVyIGhhcyBhbHJlYWR5IGJlZW4gZmluYWxhaXplZAQRX2xvdHRlcnlBZHJTdGFrZWQJARNrZXlMb3R0ZXJ5QWRyU3Rha2VkAgULbG90dGVyeU5hbWUFCXdpbm5lckFkcgQQbG90dGVyeUFkclN0YWtlZAkBEGdldEludGVnZXJPckVsc2UCBRFfbG90dGVyeUFkclN0YWtlZAAABBFfbG90dGVyeUFkckxvY2tlZAkBE2tleUxvdHRlcnlBZHJMb2NrZWQCBQtsb3R0ZXJ5TmFtZQUJd2lubmVyQWRyBBBsb3R0ZXJ5QWRyTG9ja2VkCQEQZ2V0SW50ZWdlck9yRWxzZQIFEV9sb3R0ZXJ5QWRyTG9ja2VkAAAJAMwIAgkBDEludGVnZXJFbnRyeQIFEV9sb3R0ZXJ5QWRyU3Rha2VkAAAJAMwIAgkBDEludGVnZXJFbnRyeQIFEV9sb3R0ZXJ5QWRyTG9ja2VkCQBkAgUQbG90dGVyeUFkckxvY2tlZAUQbG90dGVyeUFkclN0YWtlZAkAzAgCCQELU3RyaW5nRW50cnkCBRNfbG90dGVyeVByaXplV2lubmVyBQl3aW5uZXJBZHIFA25pbAECdHgBBnZlcmlmeQAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXmvpWzk", "height": 2739209, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8SW79yERkseQURvtRNdZpXn41YYvGyR7r9wgcsRYQe8h Next: GKCL5iBWBeTaduHTMLGS9LwgiGYf8cbVMyc1Peum3dqQ Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let lotteryAssetID = fromBase58String("3Lz23mSUvT1EswcBn2sURYJG2at8rG5aFuUrTAwaPM6Q")
5-
6-let ticketSize = 1
4+let lotteryAssetID = base58'3Lz23mSUvT1EswcBn2sURYJG2at8rG5aFuUrTAwaPM6Q'
75
86 func getIntegerOrElse (key,val) = valueOrElse(getInteger(key), val)
97
119 func getStringOrElse (key,val) = valueOrElse(getString(key), val)
1210
1311
14-func mk (x) = makeString(x, "_")
12+func stringKeyExists (key) = if (isDefined(getString(key)))
13+ then true
14+ else false
1515
1616
17-func keyAdrTotalStaked (adr) = mk(["adr", adr, "totalStaked"])
17+func mk (x) = makeString(x, "_")
1818
1919
2020 func keyLotteryTotalStaked (lotteryName) = mk(["lottery", lotteryName, "totalStaked"])
3535 func keyLotteryPrizeThreshold (lotteryName,prizeID) = mk(["lottery", lotteryName, "prize", toString(prizeID), "threshold"])
3636
3737
38-func keyLotteryPrizeChoice (lotteryName,prizeID) = mk(["lottery", lotteryName, "prize", toString(prizeID), "choice"])
38+func keyLotteryPrizeRandom (lotteryName,prizeID) = mk(["lottery", lotteryName, "prize", toString(prizeID), "random"])
3939
4040
41-func keyLotteryPrizeRandom (lotteryName,prizeID) = mk(["lottery", lotteryName, "prize", toString(prizeID), "random"])
41+func keyLotteryPrizeWinner (lotteryName,prizeID) = mk(["lottery", lotteryName, "prize", toString(prizeID), "winner"])
4242
4343
4444 func keyLotteryTicketsOwner (lotteryName,from,to) = mk(["lottery", lotteryName, "from", toString(from), "to", toString(to), "owner"])
6767 if ((lotteryName == ""))
6868 then throw("Lottery not active")
6969 else if ((size(i.payments) == 0))
70- then throw("No payment added")
70+ then throw("No payment added. You must attach a payment in Dodllnode tokens")
7171 else if ((size(i.payments) != 1))
72- then throw("Too many payments added")
72+ then throw("Too many payments added. There must be only one attached payment")
7373 else if ((i.payments[0].assetId != lotteryAssetID))
74- then throw("Wrong payment assetId")
74+ then throw("Wrong payment assetID. You must attach a payment in Dodllnode tokens")
7575 else {
7676 let amount = i.payments[0].amount
77- let ticketAmount = (amount / ticketSize)
78- if ((ticketAmount == 0))
79- then throw("Not enough to buy at least one ticket")
80- else {
81- let callerAddress = toString(i.caller)
82- let _lotteryTotalStaked = keyLotteryTotalStaked(lotteryName)
83- let lotteryTotalStaked = getIntegerOrElse(_lotteryTotalStaked, 0)
84- let _owner = keyLotteryTicketsOwner(lotteryName, lotteryTotalStaked, ((lotteryTotalStaked + ticketAmount) - 1))
85- let _adrTotalStaked = keyAdrTotalStaked(callerAddress)
86- let adrTotalStaked = getIntegerOrElse(_adrTotalStaked, 0)
87- let _lotteryAdrStaked = keyLotteryAdrStaked(lotteryName, callerAddress)
88- let adrLotteryTotalStaked = getIntegerOrElse(_lotteryAdrStaked, 0)
89- let change = (amount - (ticketAmount * ticketSize))
90- let globalTotalStaked = getIntegerOrElse(_globalTotalStaked, 0)
91-[ScriptTransfer(i.caller, change, lotteryAssetID), StringEntry(_owner, callerAddress), IntegerEntry(_globalTotalStaked, (globalTotalStaked + ticketAmount)), IntegerEntry(_lotteryTotalStaked, (lotteryTotalStaked + ticketAmount)), IntegerEntry(_adrTotalStaked, (adrTotalStaked + ticketAmount)), IntegerEntry(_lotteryAdrStaked, (adrLotteryTotalStaked + ticketAmount))]
92- }
77+ let callerAddress = toString(i.caller)
78+ let _lotteryTotalStaked = keyLotteryTotalStaked(lotteryName)
79+ let lotteryTotalStaked = getIntegerOrElse(_lotteryTotalStaked, 0)
80+ let _lotteryAdrStaked = keyLotteryAdrStaked(lotteryName, callerAddress)
81+ let lotteryAdrStaked = getIntegerOrElse(_lotteryAdrStaked, 0)
82+ let _owner = keyLotteryTicketsOwner(lotteryName, lotteryTotalStaked, ((lotteryTotalStaked + amount) - 1))
83+[IntegerEntry(_lotteryTotalStaked, (lotteryTotalStaked + amount)), IntegerEntry(_lotteryAdrStaked, (lotteryAdrStaked + amount)), StringEntry(_owner, callerAddress)]
9384 }
9485 }
9586
118109 then throw("Lottery is not over yet")
119110 else {
120111 let lotteryPrizeValue = valueOrErrorMessage(getString(keyLotteryPrizeValue(lotteryName, prizeId)), "Prize does not exist")
121- let finalBlock0 = value(blockInfoByHeight(lotteryFinalHeight))
122- let finalBlock1 = value(blockInfoByHeight((lotteryFinalHeight + 1)))
123- let prizeRandomRaw = toBigInt(sha256((((base58'2WWKxchwx7zBB' + toBytes(prizeId)) + value(finalBlock0.vrf)) + value(finalBlock1.vrf))))
124- let prizeRandom = if ((toBigInt(0) > prizeRandomRaw))
125- then -(prizeRandomRaw)
126- else prizeRandomRaw
127-[StringEntry(keyLotteryPrizeRandom(lotteryName, prizeId), toString(prizeRandom))]
112+ let _lotteryPrizeRandom = keyLotteryPrizeRandom(lotteryName, prizeId)
113+ if (stringKeyExists(_lotteryPrizeRandom))
114+ then throw("The prize random has already been finalaized")
115+ else {
116+ let finalBlock0 = value(blockInfoByHeight(lotteryFinalHeight))
117+ let finalBlock1 = value(blockInfoByHeight((lotteryFinalHeight + 1)))
118+ let prizeRandomRaw = toBigInt(sha256((((base58'2WWKxchwx7zBB' + toBytes(prizeId)) + value(finalBlock0.vrf)) + value(finalBlock1.vrf))))
119+ let prizeRandom = if ((toBigInt(0) > prizeRandomRaw))
120+ then -(prizeRandomRaw)
121+ else prizeRandomRaw
122+[StringEntry(_lotteryPrizeRandom, toString(prizeRandom))]
123+ }
128124 }
129125 }
130126
131127
132128
133129 @Callable(i)
134-func declarePrizeWinner (lotteryName,prizeId,winnerAdr) = if ((i.caller != this))
130+func finalaizePrizeWinner (lotteryName,prizeId,winnerAdr) = if ((i.caller != this))
135131 then throw("Admin only")
136- else [StringEntry("", "")]
132+ else {
133+ let _lotteryPrizeWinner = keyLotteryPrizeWinner(lotteryName, prizeId)
134+ if (stringKeyExists(_lotteryPrizeWinner))
135+ then throw("The prize winner has already been finalaized")
136+ else {
137+ let _lotteryAdrStaked = keyLotteryAdrStaked(lotteryName, winnerAdr)
138+ let lotteryAdrStaked = getIntegerOrElse(_lotteryAdrStaked, 0)
139+ let _lotteryAdrLocked = keyLotteryAdrLocked(lotteryName, winnerAdr)
140+ let lotteryAdrLocked = getIntegerOrElse(_lotteryAdrLocked, 0)
141+[IntegerEntry(_lotteryAdrStaked, 0), IntegerEntry(_lotteryAdrLocked, (lotteryAdrLocked + lotteryAdrStaked)), StringEntry(_lotteryPrizeWinner, winnerAdr)]
142+ }
143+ }
137144
138145
139146 @Verifier(tx)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let lotteryAssetID = fromBase58String("3Lz23mSUvT1EswcBn2sURYJG2at8rG5aFuUrTAwaPM6Q")
5-
6-let ticketSize = 1
4+let lotteryAssetID = base58'3Lz23mSUvT1EswcBn2sURYJG2at8rG5aFuUrTAwaPM6Q'
75
86 func getIntegerOrElse (key,val) = valueOrElse(getInteger(key), val)
97
108
119 func getStringOrElse (key,val) = valueOrElse(getString(key), val)
1210
1311
14-func mk (x) = makeString(x, "_")
12+func stringKeyExists (key) = if (isDefined(getString(key)))
13+ then true
14+ else false
1515
1616
17-func keyAdrTotalStaked (adr) = mk(["adr", adr, "totalStaked"])
17+func mk (x) = makeString(x, "_")
1818
1919
2020 func keyLotteryTotalStaked (lotteryName) = mk(["lottery", lotteryName, "totalStaked"])
2121
2222
2323 func keyLotteryAdrStaked (lotteryName,adr) = mk(["lottery", lotteryName, "adr", adr, "staked"])
2424
2525
2626 func keyLotteryAdrLocked (lotteryName,adr) = mk(["lottery", lotteryName, "adr", adr, "locked"])
2727
2828
2929 func keyLotteryFinalHeight (lotteryName) = mk(["lottery", lotteryName, "finalHeight"])
3030
3131
3232 func keyLotteryPrizeValue (lotteryName,prizeID) = mk(["lottery", lotteryName, "prize", toString(prizeID), "value"])
3333
3434
3535 func keyLotteryPrizeThreshold (lotteryName,prizeID) = mk(["lottery", lotteryName, "prize", toString(prizeID), "threshold"])
3636
3737
38-func keyLotteryPrizeChoice (lotteryName,prizeID) = mk(["lottery", lotteryName, "prize", toString(prizeID), "choice"])
38+func keyLotteryPrizeRandom (lotteryName,prizeID) = mk(["lottery", lotteryName, "prize", toString(prizeID), "random"])
3939
4040
41-func keyLotteryPrizeRandom (lotteryName,prizeID) = mk(["lottery", lotteryName, "prize", toString(prizeID), "random"])
41+func keyLotteryPrizeWinner (lotteryName,prizeID) = mk(["lottery", lotteryName, "prize", toString(prizeID), "winner"])
4242
4343
4444 func keyLotteryTicketsOwner (lotteryName,from,to) = mk(["lottery", lotteryName, "from", toString(from), "to", toString(to), "owner"])
4545
4646
4747 let _activeLotteryName = mk(["param", "activeLotteryName"])
4848
4949 let _globalTotalStaked = mk(["param", "globalTotalStaked"])
5050
5151 func activeLotteryName () = {
5252 let lotteryName = getStringOrElse(_activeLotteryName, "")
5353 if ((lotteryName == ""))
5454 then ""
5555 else {
5656 let lotteryFinalHeight = getIntegerValue(keyLotteryFinalHeight(lotteryName))
5757 if ((height >= lotteryFinalHeight))
5858 then ""
5959 else lotteryName
6060 }
6161 }
6262
6363
6464 @Callable(i)
6565 func stake () = {
6666 let lotteryName = activeLotteryName()
6767 if ((lotteryName == ""))
6868 then throw("Lottery not active")
6969 else if ((size(i.payments) == 0))
70- then throw("No payment added")
70+ then throw("No payment added. You must attach a payment in Dodllnode tokens")
7171 else if ((size(i.payments) != 1))
72- then throw("Too many payments added")
72+ then throw("Too many payments added. There must be only one attached payment")
7373 else if ((i.payments[0].assetId != lotteryAssetID))
74- then throw("Wrong payment assetId")
74+ then throw("Wrong payment assetID. You must attach a payment in Dodllnode tokens")
7575 else {
7676 let amount = i.payments[0].amount
77- let ticketAmount = (amount / ticketSize)
78- if ((ticketAmount == 0))
79- then throw("Not enough to buy at least one ticket")
80- else {
81- let callerAddress = toString(i.caller)
82- let _lotteryTotalStaked = keyLotteryTotalStaked(lotteryName)
83- let lotteryTotalStaked = getIntegerOrElse(_lotteryTotalStaked, 0)
84- let _owner = keyLotteryTicketsOwner(lotteryName, lotteryTotalStaked, ((lotteryTotalStaked + ticketAmount) - 1))
85- let _adrTotalStaked = keyAdrTotalStaked(callerAddress)
86- let adrTotalStaked = getIntegerOrElse(_adrTotalStaked, 0)
87- let _lotteryAdrStaked = keyLotteryAdrStaked(lotteryName, callerAddress)
88- let adrLotteryTotalStaked = getIntegerOrElse(_lotteryAdrStaked, 0)
89- let change = (amount - (ticketAmount * ticketSize))
90- let globalTotalStaked = getIntegerOrElse(_globalTotalStaked, 0)
91-[ScriptTransfer(i.caller, change, lotteryAssetID), StringEntry(_owner, callerAddress), IntegerEntry(_globalTotalStaked, (globalTotalStaked + ticketAmount)), IntegerEntry(_lotteryTotalStaked, (lotteryTotalStaked + ticketAmount)), IntegerEntry(_adrTotalStaked, (adrTotalStaked + ticketAmount)), IntegerEntry(_lotteryAdrStaked, (adrLotteryTotalStaked + ticketAmount))]
92- }
77+ let callerAddress = toString(i.caller)
78+ let _lotteryTotalStaked = keyLotteryTotalStaked(lotteryName)
79+ let lotteryTotalStaked = getIntegerOrElse(_lotteryTotalStaked, 0)
80+ let _lotteryAdrStaked = keyLotteryAdrStaked(lotteryName, callerAddress)
81+ let lotteryAdrStaked = getIntegerOrElse(_lotteryAdrStaked, 0)
82+ let _owner = keyLotteryTicketsOwner(lotteryName, lotteryTotalStaked, ((lotteryTotalStaked + amount) - 1))
83+[IntegerEntry(_lotteryTotalStaked, (lotteryTotalStaked + amount)), IntegerEntry(_lotteryAdrStaked, (lotteryAdrStaked + amount)), StringEntry(_owner, callerAddress)]
9384 }
9485 }
9586
9687
9788
9889 @Callable(i)
9990 func startLottery (lotteryName,lotteryFinalHeight) = if ((i.caller != this))
10091 then throw("Admin only")
10192 else [StringEntry(_activeLotteryName, lotteryName), IntegerEntry(keyLotteryFinalHeight(lotteryName), lotteryFinalHeight)]
10293
10394
10495
10596 @Callable(i)
10697 func declarePrize (lotteryName,prizeId,prizeThreshold,prizeValue) = if ((i.caller != this))
10798 then throw("Admin only")
10899 else [IntegerEntry(keyLotteryPrizeThreshold(lotteryName, prizeId), prizeThreshold), StringEntry(keyLotteryPrizeValue(lotteryName, prizeId), prizeValue)]
109100
110101
111102
112103 @Callable(i)
113104 func finalaizePrizeRandom (lotteryName,prizeId) = if ((i.caller != this))
114105 then throw("Admin only")
115106 else {
116107 let lotteryFinalHeight = getIntegerValue(keyLotteryFinalHeight(lotteryName))
117108 if (((lotteryFinalHeight + 1) > height))
118109 then throw("Lottery is not over yet")
119110 else {
120111 let lotteryPrizeValue = valueOrErrorMessage(getString(keyLotteryPrizeValue(lotteryName, prizeId)), "Prize does not exist")
121- let finalBlock0 = value(blockInfoByHeight(lotteryFinalHeight))
122- let finalBlock1 = value(blockInfoByHeight((lotteryFinalHeight + 1)))
123- let prizeRandomRaw = toBigInt(sha256((((base58'2WWKxchwx7zBB' + toBytes(prizeId)) + value(finalBlock0.vrf)) + value(finalBlock1.vrf))))
124- let prizeRandom = if ((toBigInt(0) > prizeRandomRaw))
125- then -(prizeRandomRaw)
126- else prizeRandomRaw
127-[StringEntry(keyLotteryPrizeRandom(lotteryName, prizeId), toString(prizeRandom))]
112+ let _lotteryPrizeRandom = keyLotteryPrizeRandom(lotteryName, prizeId)
113+ if (stringKeyExists(_lotteryPrizeRandom))
114+ then throw("The prize random has already been finalaized")
115+ else {
116+ let finalBlock0 = value(blockInfoByHeight(lotteryFinalHeight))
117+ let finalBlock1 = value(blockInfoByHeight((lotteryFinalHeight + 1)))
118+ let prizeRandomRaw = toBigInt(sha256((((base58'2WWKxchwx7zBB' + toBytes(prizeId)) + value(finalBlock0.vrf)) + value(finalBlock1.vrf))))
119+ let prizeRandom = if ((toBigInt(0) > prizeRandomRaw))
120+ then -(prizeRandomRaw)
121+ else prizeRandomRaw
122+[StringEntry(_lotteryPrizeRandom, toString(prizeRandom))]
123+ }
128124 }
129125 }
130126
131127
132128
133129 @Callable(i)
134-func declarePrizeWinner (lotteryName,prizeId,winnerAdr) = if ((i.caller != this))
130+func finalaizePrizeWinner (lotteryName,prizeId,winnerAdr) = if ((i.caller != this))
135131 then throw("Admin only")
136- else [StringEntry("", "")]
132+ else {
133+ let _lotteryPrizeWinner = keyLotteryPrizeWinner(lotteryName, prizeId)
134+ if (stringKeyExists(_lotteryPrizeWinner))
135+ then throw("The prize winner has already been finalaized")
136+ else {
137+ let _lotteryAdrStaked = keyLotteryAdrStaked(lotteryName, winnerAdr)
138+ let lotteryAdrStaked = getIntegerOrElse(_lotteryAdrStaked, 0)
139+ let _lotteryAdrLocked = keyLotteryAdrLocked(lotteryName, winnerAdr)
140+ let lotteryAdrLocked = getIntegerOrElse(_lotteryAdrLocked, 0)
141+[IntegerEntry(_lotteryAdrStaked, 0), IntegerEntry(_lotteryAdrLocked, (lotteryAdrLocked + lotteryAdrStaked)), StringEntry(_lotteryPrizeWinner, winnerAdr)]
142+ }
143+ }
137144
138145
139146 @Verifier(tx)
140147 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
141148

github/deemru/w8io/169f3d6 
61.16 ms