tx · CsmgPkxdWZMtKvGVNTEJpTykPrbJP81GPE9St88paLte

3N4Kzbxu521DHPxcgrmZ4XUqN2kF6TqLTzs:  -0.01000000 Waves

2023.09.14 16:53 [2755155] smart account 3N4Kzbxu521DHPxcgrmZ4XUqN2kF6TqLTzs > SELF 0.00000000 Waves

{ "type": 13, "id": "CsmgPkxdWZMtKvGVNTEJpTykPrbJP81GPE9St88paLte", "fee": 1000000, "feeAssetId": null, "timestamp": 1694699616102, "version": 2, "chainId": 84, "sender": "3N4Kzbxu521DHPxcgrmZ4XUqN2kF6TqLTzs", "senderPublicKey": "8yQuxvQ2qLzXJrgbKZHbsfnNNjuU5wfHheyVujdALGsF", "proofs": [ "4E3EyV9T7a1zv3tqWfL4rPKREwhf89R1AMS94Q5PTTEnXYGrB3xNyQ8PRqSmBw5CcV7G9Ax93KAF5akyLxg32poW" ], "script": "base64:BgIMCAISAwoBCBIDCgEIDwECbWsBAXgJALkJAgUBeAIBXwEIa2V5QWxpYXMBBWFsaWFzCQECbWsBCQDMCAICBWFsaWFzCQDMCAIFBWFsaWFzBQNuaWwBDWtleUFkclByb2plY3QBA2FkcgkBAm1rAQkAzAgCAgNhZHIJAMwIAgUDYWRyCQDMCAICB3Byb2plY3QFA25pbAERa2V5UHJvamVjdEVuYWJsZWQBB3Byb2plY3QJAQJtawEJAMwIAgIHcHJvamVjdAkAzAgCBQdwcm9qZWN0CQDMCAICB2VuYWJsZWQFA25pbAESa2V5UHJvamVjdEFkckFkbWluAgdwcm9qZWN0A2FkcgkBAm1rAQkAzAgCAgdwcm9qZWN0CQDMCAIFB3Byb2plY3QJAMwIAgIDYWRyCQDMCAIFA2FkcgkAzAgCAgVhZG1pbgUDbmlsARRrZXlQcm9qZWN0QWRySW52b2tlcgIHcHJvamVjdANhZHIJAQJtawEJAMwIAgIHcHJvamVjdAkAzAgCBQdwcm9qZWN0CQDMCAICA2FkcgkAzAgCBQNhZHIJAMwIAgIHaW52b2tlcgUDbmlsARBnZXRJbnRlZ2VyT3JaZXJvAQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUDa2V5AAABEGdldFN0cmluZ09yRW1wdHkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAoggBBQNrZXkCAAEQZ2V0U3RyaW5nT3JFcnJvcgIDa2V5A21zZwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEFA2tleQUDbXNnARNnZXRBZHJTdHJpbmdPckVycm9yAwNhZHIDa2V5A21zZwkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFA2FkcgUDa2V5BQNtc2cBEWdldEJvb2xlYW5PckZhbHNlAQNrZXkJAQt2YWx1ZU9yRWxzZQIJAKAIAQUDa2V5BwEPc3RyaW5nS2V5RXhpc3RzAQNrZXkDCQEJaXNEZWZpbmVkAQkAoggBBQNrZXkGBwEMZ2V0T3JhY2xlQWRyAAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBEGdldFN0cmluZ09yRXJyb3ICCQEIa2V5QWxpYXMBAgZvcmFjbGUCG09yYWNsZSBhZGRyZXMgbm90IHNwZWNpZmllZAELdGhpc1Byb2plY3QACQETZ2V0QWRyU3RyaW5nT3JFcnJvcgMJAQxnZXRPcmFjbGVBZHIACQENa2V5QWRyUHJvamVjdAEJAKUIAQUEdGhpcwIaUHJvamVjdCBuYW1lIG5vdCBzcGVjaWZpZWQBCG5vdEFkbWluAQFpCQEBIQEJARFnZXRCb29sZWFuT3JGYWxzZQEJARJrZXlQcm9qZWN0QWRyQWRtaW4CCQELdGhpc1Byb2plY3QACQClCAEIBQFpBmNhbGxlcgIBaQEJc2V0T3JhY2xlAQlvcmFjbGVBZHIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAgpBZG1pbiBvbmx5CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQhrZXlBbGlhcwECBm9yYWNsZQUJb3JhY2xlQWRyBQNuaWwBaQEEdGVzdAEHdGVzdEFkcgkAzAgCCQELU3RyaW5nRW50cnkCAgNzdHIFB3Rlc3RBZHIFA25pbAECdHgBBnZlcmlmeQAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXlvZ8Lq", "height": 2755155, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FDMsfhsuZi2tm5SDvhD3tPWmnSNHLM7W1gMnLzV2H53v Next: GEY4LwM1whQmck3dbpWJZyEgZurL8EzbaP5UAwknBhEj Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let lotteryAssetID = base58'3Lz23mSUvT1EswcBn2sURYJG2at8rG5aFuUrTAwaPM6Q'
5-
6-func getIntegerOrElse (key,val) = valueOrElse(getInteger(key), val)
4+func mk (x) = makeString(x, "_")
75
86
9-func getStringOrElse (key,val) = valueOrElse(getString(key), val)
7+func keyAlias (alias) = mk(["alias", alias])
8+
9+
10+func keyAdrProject (adr) = mk(["adr", adr, "project"])
11+
12+
13+func keyProjectEnabled (project) = mk(["project", project, "enabled"])
14+
15+
16+func keyProjectAdrAdmin (project,adr) = mk(["project", project, "adr", adr, "admin"])
17+
18+
19+func keyProjectAdrInvoker (project,adr) = mk(["project", project, "adr", adr, "invoker"])
20+
21+
22+func getIntegerOrZero (key) = valueOrElse(getInteger(key), 0)
23+
24+
25+func getStringOrEmpty (key) = valueOrElse(getString(key), "")
26+
27+
28+func getStringOrError (key,msg) = valueOrErrorMessage(getString(key), msg)
29+
30+
31+func getAdrStringOrError (adr,key,msg) = valueOrErrorMessage(getString(adr, key), msg)
32+
33+
34+func getBooleanOrFalse (key) = valueOrElse(getBoolean(key), false)
1035
1136
1237 func stringKeyExists (key) = if (isDefined(getString(key)))
1439 else false
1540
1641
17-func mk (x) = makeString(x, "_")
42+func getOracleAdr () = addressFromStringValue(getStringOrError(keyAlias("oracle"), "Oracle addres not specified"))
1843
1944
20-func keyLotteryTotalStaked (lotteryName) = mk(["lottery", lotteryName, "totalStaked"])
45+func thisProject () = getAdrStringOrError(getOracleAdr(), keyAdrProject(toString(this)), "Project name not specified")
2146
2247
23-func keyLotteryAdrStaked (lotteryName,adr) = mk(["lottery", lotteryName, "adr", adr, "staked"])
24-
25-
26-func keyLotteryAdrLocked (lotteryName,adr) = mk(["lottery", lotteryName, "adr", adr, "locked"])
27-
28-
29-func keyLotteryFinalHeight (lotteryName) = mk(["lottery", lotteryName, "finalHeight"])
30-
31-
32-func keyLotteryStartHeight (lotteryName) = mk(["lottery", lotteryName, "startHeight"])
33-
34-
35-func keyLotteryPrizeValue (lotteryName,prizeID) = mk(["lottery", lotteryName, "prize", toString(prizeID), "value"])
36-
37-
38-func keyLotteryPrizeThreshold (lotteryName,prizeID) = mk(["lottery", lotteryName, "prize", toString(prizeID), "threshold"])
39-
40-
41-func keyLotteryPrizeRandom (lotteryName,prizeID) = mk(["lottery", lotteryName, "prize", toString(prizeID), "random"])
42-
43-
44-func keyLotteryPrizeWinner (lotteryName,prizeID) = mk(["lottery", lotteryName, "prize", toString(prizeID), "winner"])
45-
46-
47-func keyLotteryTicketsOwner (lotteryName,from,to) = mk(["lottery", lotteryName, "from", toString(from), "to", toString(to), "owner"])
48-
49-
50-let _activeLotteryName = mk(["param", "activeLotteryName"])
51-
52-let _globalTotalStaked = mk(["param", "globalTotalStaked"])
53-
54-func activeLotteryName () = {
55- let lotteryName = getStringOrElse(_activeLotteryName, "")
56- if ((lotteryName == ""))
57- then ""
58- else {
59- let lotteryFinalHeight = getIntegerValue(keyLotteryFinalHeight(lotteryName))
60- if ((height >= lotteryFinalHeight))
61- then ""
62- else lotteryName
63- }
64- }
48+func notAdmin (i) = !(getBooleanOrFalse(keyProjectAdrAdmin(thisProject(), toString(i.caller))))
6549
6650
6751 @Callable(i)
68-func stake () = {
69- let lotteryName = activeLotteryName()
70- if ((lotteryName == ""))
71- then throw("Lottery not active")
72- else if ((size(i.payments) == 0))
73- then throw("No payment added. You must attach a payment in Dodllnode tokens")
74- else if ((size(i.payments) != 1))
75- then throw("Too many payments added. There must be only one attached payment")
76- else if ((i.payments[0].assetId != lotteryAssetID))
77- then throw("Wrong payment assetID. You must attach a payment in Dodllnode tokens")
78- else {
79- let amount = i.payments[0].amount
80- if ((1 > amount))
81- then throw("Not enough payment to purchase even a single ticket.")
82- else {
83- let callerAddress = toString(i.caller)
84- let _lotteryTotalStaked = keyLotteryTotalStaked(lotteryName)
85- let lotteryTotalStaked = getIntegerOrElse(_lotteryTotalStaked, 0)
86- let _lotteryAdrStaked = keyLotteryAdrStaked(lotteryName, callerAddress)
87- let lotteryAdrStaked = getIntegerOrElse(_lotteryAdrStaked, 0)
88- let _owner = keyLotteryTicketsOwner(lotteryName, lotteryTotalStaked, ((lotteryTotalStaked + amount) - 1))
89-[IntegerEntry(_lotteryTotalStaked, (lotteryTotalStaked + amount)), IntegerEntry(_lotteryAdrStaked, (lotteryAdrStaked + amount)), StringEntry(_owner, callerAddress)]
90- }
91- }
92- }
52+func setOracle (oracleAdr) = if ((i.caller != this))
53+ then throw("Admin only")
54+ else [StringEntry(keyAlias("oracle"), oracleAdr)]
9355
9456
9557
9658 @Callable(i)
97-func initLottery (lotteryName,lotteryFinalHeight) = if ((i.caller != this))
98- then throw("Admin only")
99- else [StringEntry(_activeLotteryName, lotteryName), IntegerEntry(keyLotteryStartHeight(lotteryName), height), IntegerEntry(keyLotteryFinalHeight(lotteryName), lotteryFinalHeight)]
100-
101-
102-
103-@Callable(i)
104-func declarePrize (lotteryName,prizeId,prizeThreshold,prizeValue) = if ((i.caller != this))
105- then throw("Admin only")
106- else [IntegerEntry(keyLotteryPrizeThreshold(lotteryName, prizeId), prizeThreshold), StringEntry(keyLotteryPrizeValue(lotteryName, prizeId), prizeValue)]
107-
108-
109-
110-@Callable(i)
111-func finalaizePrizeRandom (lotteryName,prizeId) = if ((i.caller != this))
112- then throw("Admin only")
113- else {
114- let lotteryFinalHeight = getIntegerValue(keyLotteryFinalHeight(lotteryName))
115- if (((lotteryFinalHeight + 1) > height))
116- then throw("Lottery is not over yet")
117- else {
118- let lotteryPrizeValue = valueOrErrorMessage(getString(keyLotteryPrizeValue(lotteryName, prizeId)), "Prize does not exist")
119- let _lotteryPrizeRandom = keyLotteryPrizeRandom(lotteryName, prizeId)
120- if (stringKeyExists(_lotteryPrizeRandom))
121- then throw("The prize random has already been finalaized")
122- else {
123- let finalBlock0 = value(blockInfoByHeight(lotteryFinalHeight))
124- let finalBlock1 = value(blockInfoByHeight((lotteryFinalHeight + 1)))
125- let prizeRandomRaw = toBigInt(sha256((((base58'2WWKxchwx7zBB' + toBytes(prizeId)) + value(finalBlock0.vrf)) + value(finalBlock1.vrf))))
126- let prizeRandom = if ((toBigInt(0) > prizeRandomRaw))
127- then -(prizeRandomRaw)
128- else prizeRandomRaw
129-[StringEntry(_lotteryPrizeRandom, toString(prizeRandom))]
130- }
131- }
132- }
133-
134-
135-
136-@Callable(i)
137-func finalaizePrizeWinner (lotteryName,prizeId,winnerAdr) = if ((i.caller != this))
138- then throw("Admin only")
139- else {
140- let _lotteryPrizeWinner = keyLotteryPrizeWinner(lotteryName, prizeId)
141- if (stringKeyExists(_lotteryPrizeWinner))
142- then throw("The prize winner has already been finalaized")
143- else {
144- let _lotteryAdrStaked = keyLotteryAdrStaked(lotteryName, winnerAdr)
145- let lotteryAdrStaked = getIntegerOrElse(_lotteryAdrStaked, 0)
146- let _lotteryAdrLocked = keyLotteryAdrLocked(lotteryName, winnerAdr)
147- let lotteryAdrLocked = getIntegerOrElse(_lotteryAdrLocked, 0)
148-[IntegerEntry(_lotteryAdrStaked, 0), IntegerEntry(_lotteryAdrLocked, (lotteryAdrLocked + lotteryAdrStaked)), StringEntry(_lotteryPrizeWinner, winnerAdr)]
149- }
150- }
59+func test (testAdr) = [StringEntry("str", testAdr)]
15160
15261
15362 @Verifier(tx)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let lotteryAssetID = base58'3Lz23mSUvT1EswcBn2sURYJG2at8rG5aFuUrTAwaPM6Q'
5-
6-func getIntegerOrElse (key,val) = valueOrElse(getInteger(key), val)
4+func mk (x) = makeString(x, "_")
75
86
9-func getStringOrElse (key,val) = valueOrElse(getString(key), val)
7+func keyAlias (alias) = mk(["alias", alias])
8+
9+
10+func keyAdrProject (adr) = mk(["adr", adr, "project"])
11+
12+
13+func keyProjectEnabled (project) = mk(["project", project, "enabled"])
14+
15+
16+func keyProjectAdrAdmin (project,adr) = mk(["project", project, "adr", adr, "admin"])
17+
18+
19+func keyProjectAdrInvoker (project,adr) = mk(["project", project, "adr", adr, "invoker"])
20+
21+
22+func getIntegerOrZero (key) = valueOrElse(getInteger(key), 0)
23+
24+
25+func getStringOrEmpty (key) = valueOrElse(getString(key), "")
26+
27+
28+func getStringOrError (key,msg) = valueOrErrorMessage(getString(key), msg)
29+
30+
31+func getAdrStringOrError (adr,key,msg) = valueOrErrorMessage(getString(adr, key), msg)
32+
33+
34+func getBooleanOrFalse (key) = valueOrElse(getBoolean(key), false)
1035
1136
1237 func stringKeyExists (key) = if (isDefined(getString(key)))
1338 then true
1439 else false
1540
1641
17-func mk (x) = makeString(x, "_")
42+func getOracleAdr () = addressFromStringValue(getStringOrError(keyAlias("oracle"), "Oracle addres not specified"))
1843
1944
20-func keyLotteryTotalStaked (lotteryName) = mk(["lottery", lotteryName, "totalStaked"])
45+func thisProject () = getAdrStringOrError(getOracleAdr(), keyAdrProject(toString(this)), "Project name not specified")
2146
2247
23-func keyLotteryAdrStaked (lotteryName,adr) = mk(["lottery", lotteryName, "adr", adr, "staked"])
24-
25-
26-func keyLotteryAdrLocked (lotteryName,adr) = mk(["lottery", lotteryName, "adr", adr, "locked"])
27-
28-
29-func keyLotteryFinalHeight (lotteryName) = mk(["lottery", lotteryName, "finalHeight"])
30-
31-
32-func keyLotteryStartHeight (lotteryName) = mk(["lottery", lotteryName, "startHeight"])
33-
34-
35-func keyLotteryPrizeValue (lotteryName,prizeID) = mk(["lottery", lotteryName, "prize", toString(prizeID), "value"])
36-
37-
38-func keyLotteryPrizeThreshold (lotteryName,prizeID) = mk(["lottery", lotteryName, "prize", toString(prizeID), "threshold"])
39-
40-
41-func keyLotteryPrizeRandom (lotteryName,prizeID) = mk(["lottery", lotteryName, "prize", toString(prizeID), "random"])
42-
43-
44-func keyLotteryPrizeWinner (lotteryName,prizeID) = mk(["lottery", lotteryName, "prize", toString(prizeID), "winner"])
45-
46-
47-func keyLotteryTicketsOwner (lotteryName,from,to) = mk(["lottery", lotteryName, "from", toString(from), "to", toString(to), "owner"])
48-
49-
50-let _activeLotteryName = mk(["param", "activeLotteryName"])
51-
52-let _globalTotalStaked = mk(["param", "globalTotalStaked"])
53-
54-func activeLotteryName () = {
55- let lotteryName = getStringOrElse(_activeLotteryName, "")
56- if ((lotteryName == ""))
57- then ""
58- else {
59- let lotteryFinalHeight = getIntegerValue(keyLotteryFinalHeight(lotteryName))
60- if ((height >= lotteryFinalHeight))
61- then ""
62- else lotteryName
63- }
64- }
48+func notAdmin (i) = !(getBooleanOrFalse(keyProjectAdrAdmin(thisProject(), toString(i.caller))))
6549
6650
6751 @Callable(i)
68-func stake () = {
69- let lotteryName = activeLotteryName()
70- if ((lotteryName == ""))
71- then throw("Lottery not active")
72- else if ((size(i.payments) == 0))
73- then throw("No payment added. You must attach a payment in Dodllnode tokens")
74- else if ((size(i.payments) != 1))
75- then throw("Too many payments added. There must be only one attached payment")
76- else if ((i.payments[0].assetId != lotteryAssetID))
77- then throw("Wrong payment assetID. You must attach a payment in Dodllnode tokens")
78- else {
79- let amount = i.payments[0].amount
80- if ((1 > amount))
81- then throw("Not enough payment to purchase even a single ticket.")
82- else {
83- let callerAddress = toString(i.caller)
84- let _lotteryTotalStaked = keyLotteryTotalStaked(lotteryName)
85- let lotteryTotalStaked = getIntegerOrElse(_lotteryTotalStaked, 0)
86- let _lotteryAdrStaked = keyLotteryAdrStaked(lotteryName, callerAddress)
87- let lotteryAdrStaked = getIntegerOrElse(_lotteryAdrStaked, 0)
88- let _owner = keyLotteryTicketsOwner(lotteryName, lotteryTotalStaked, ((lotteryTotalStaked + amount) - 1))
89-[IntegerEntry(_lotteryTotalStaked, (lotteryTotalStaked + amount)), IntegerEntry(_lotteryAdrStaked, (lotteryAdrStaked + amount)), StringEntry(_owner, callerAddress)]
90- }
91- }
92- }
52+func setOracle (oracleAdr) = if ((i.caller != this))
53+ then throw("Admin only")
54+ else [StringEntry(keyAlias("oracle"), oracleAdr)]
9355
9456
9557
9658 @Callable(i)
97-func initLottery (lotteryName,lotteryFinalHeight) = if ((i.caller != this))
98- then throw("Admin only")
99- else [StringEntry(_activeLotteryName, lotteryName), IntegerEntry(keyLotteryStartHeight(lotteryName), height), IntegerEntry(keyLotteryFinalHeight(lotteryName), lotteryFinalHeight)]
100-
101-
102-
103-@Callable(i)
104-func declarePrize (lotteryName,prizeId,prizeThreshold,prizeValue) = if ((i.caller != this))
105- then throw("Admin only")
106- else [IntegerEntry(keyLotteryPrizeThreshold(lotteryName, prizeId), prizeThreshold), StringEntry(keyLotteryPrizeValue(lotteryName, prizeId), prizeValue)]
107-
108-
109-
110-@Callable(i)
111-func finalaizePrizeRandom (lotteryName,prizeId) = if ((i.caller != this))
112- then throw("Admin only")
113- else {
114- let lotteryFinalHeight = getIntegerValue(keyLotteryFinalHeight(lotteryName))
115- if (((lotteryFinalHeight + 1) > height))
116- then throw("Lottery is not over yet")
117- else {
118- let lotteryPrizeValue = valueOrErrorMessage(getString(keyLotteryPrizeValue(lotteryName, prizeId)), "Prize does not exist")
119- let _lotteryPrizeRandom = keyLotteryPrizeRandom(lotteryName, prizeId)
120- if (stringKeyExists(_lotteryPrizeRandom))
121- then throw("The prize random has already been finalaized")
122- else {
123- let finalBlock0 = value(blockInfoByHeight(lotteryFinalHeight))
124- let finalBlock1 = value(blockInfoByHeight((lotteryFinalHeight + 1)))
125- let prizeRandomRaw = toBigInt(sha256((((base58'2WWKxchwx7zBB' + toBytes(prizeId)) + value(finalBlock0.vrf)) + value(finalBlock1.vrf))))
126- let prizeRandom = if ((toBigInt(0) > prizeRandomRaw))
127- then -(prizeRandomRaw)
128- else prizeRandomRaw
129-[StringEntry(_lotteryPrizeRandom, toString(prizeRandom))]
130- }
131- }
132- }
133-
134-
135-
136-@Callable(i)
137-func finalaizePrizeWinner (lotteryName,prizeId,winnerAdr) = if ((i.caller != this))
138- then throw("Admin only")
139- else {
140- let _lotteryPrizeWinner = keyLotteryPrizeWinner(lotteryName, prizeId)
141- if (stringKeyExists(_lotteryPrizeWinner))
142- then throw("The prize winner has already been finalaized")
143- else {
144- let _lotteryAdrStaked = keyLotteryAdrStaked(lotteryName, winnerAdr)
145- let lotteryAdrStaked = getIntegerOrElse(_lotteryAdrStaked, 0)
146- let _lotteryAdrLocked = keyLotteryAdrLocked(lotteryName, winnerAdr)
147- let lotteryAdrLocked = getIntegerOrElse(_lotteryAdrLocked, 0)
148-[IntegerEntry(_lotteryAdrStaked, 0), IntegerEntry(_lotteryAdrLocked, (lotteryAdrLocked + lotteryAdrStaked)), StringEntry(_lotteryPrizeWinner, winnerAdr)]
149- }
150- }
59+func test (testAdr) = [StringEntry("str", testAdr)]
15160
15261
15362 @Verifier(tx)
15463 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
15564

github/deemru/w8io/c3f4982 
46.48 ms