tx · J3FSn1T8kkUFB6ZUx7Njd1iddvdh5oW3NNgcxEF8FnzM

3N5QUR83YdtSxhxoFjPCs3Ngh2BAVtFE7E1:  -0.01000000 Waves

2022.04.04 17:51 [1993983] smart account 3N5QUR83YdtSxhxoFjPCs3Ngh2BAVtFE7E1 > SELF 0.00000000 Waves

{ "type": 13, "id": "J3FSn1T8kkUFB6ZUx7Njd1iddvdh5oW3NNgcxEF8FnzM", "fee": 1000000, "feeAssetId": null, "timestamp": 1649083909022, "version": 2, "chainId": 84, "sender": "3N5QUR83YdtSxhxoFjPCs3Ngh2BAVtFE7E1", "senderPublicKey": "J2hHGUChrqTSuvmLqT9DyWgn25qit1CEpMxEGDCSjuUi", "proofs": [ "4Z5funojMMgqadBh54eEK3NCSH1ud3PMmzAs5pPFcdxjekvU93qGWQjVv7zvkUPwpSvgyDAhbQeRnETra5TGVmKx" ], "script": "base64:AAIFAAAAAAAAAAcIAhIDCgEIAAAACAAAAAAJaGVpZ2h0RW5kCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwIAAAAKaGVpZ2h0X2VuZAIAAAAkaGVpZ2h0X2VuZCBpcyBub3Qgc3BlY2lmaWVkIGluIHN0YXRlAAAAAAxhc3NldHNTdHJpbmcJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzAgAAABBhdmFpbGFibGVfYXNzZXRzAgAAACVBc3NldHMgbGlzdCBpcyBub3Qgc3BlY2lmaWVkIGluIHN0YXRlAQAAABJhc1N3YXBQYXJhbXNTVFJVQ1QAAAABAAAAA3ZhbAQAAAAHJG1hdGNoMAUAAAADdmFsAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABkoSW50LCBJbnQsIEludCwgSW50LCBJbnQpBAAAAAZzdHJ1Y3QFAAAAByRtYXRjaDAFAAAABnN0cnVjdAkAAAIAAAABAgAAABVmYWlsIHRvIGNhc3QgaW50byBJbnQAAAAAEG5ldXRyaW5vQ29udHJhY3QJAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVTX5YnYYiLrMWyfu8rmkonHDc0g4nCta94AAAAADmF2YWlsYWJsZVZvdGVzCQAEtQAAAAIFAAAADGFzc2V0c1N0cmluZwIAAAABLAEAAAAOa2V5VXNlckJhbGFuY2UAAAABAAAACHVzZXJBZGRyCQAEuQAAAAIJAARMAAAAAgIAAAAHYmFsYW5jZQkABEwAAAACCQAEJQAAAAEFAAAACHVzZXJBZGRyBQAAAANuaWwCAAAAAV8BAAAAC2tleVVzZXJWb3RlAAAAAgAAAAh1c2VyQWRkcgAAAAR2b3RlCQAEuQAAAAIJAARMAAAAAgIAAAAEdm90ZQkABEwAAAACBQAAAAh1c2VyQWRkcgkABEwAAAACBQAAAAR2b3RlBQAAAANuaWwCAAAAAV8BAAAAD2tleVVzZXJMYXN0Vm90ZQAAAAEAAAAIdXNlckFkZHIJAAS5AAAAAgkABEwAAAACAgAAAAlsYXN0X3ZvdGUJAARMAAAAAgUAAAAIdXNlckFkZHIFAAAAA25pbAIAAAABXwAAAAEAAAAKY29udGV4dE9iagEAAAAIY2FzdFZvdGUAAAABAAAABHZvdGUEAAAAC3VzZXJBZGRyZXNzCQAEJQAAAAEIBQAAAApjb250ZXh0T2JqAAAABmNhbGxlcgMJAAAAAAAAAgkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAADmF2YWlsYWJsZVZvdGVzBQAAAAR2b3RlBwkAAAIAAAABAgAAAA9JbmNvcnJlY3Qgdm90ZSEEAAAACyR0MDEyNzAxNDQ3CQEAAAASYXNTd2FwUGFyYW1zU1RSVUNUAAAAAQkAA/wAAAAEBQAAABBuZXV0cmlub0NvbnRyYWN0AgAAABtzd2FwUGFyYW1zQnlVc2VyU1lTUkVBRE9OTFkJAARMAAAAAgUAAAALdXNlckFkZHJlc3MJAARMAAAAAgAAAAAAAAAAAAUAAAADbmlsBQAAAANuaWwEAAAADGxpbWl0TWF4VXNkbggFAAAACyR0MDEyNzAxNDQ3AAAAAl8xBAAAAApsaW1pdFNwZW50CAUAAAALJHQwMTI3MDE0NDcAAAACXzIEAAAADmJsY2tzMkxtdFJlc2V0CAUAAAALJHQwMTI3MDE0NDcAAAACXzMEAAAACGduc2J0QW10CAUAAAALJHQwMTI3MDE0NDcAAAACXzQEAAAADWduc2J0QW10VG90YWwIBQAAAAskdDAxMjcwMTQ0NwAAAAJfNQQAAAAPdXNlclZvdGluZ1Bvd2VyBQAAAAhnbnNidEFtdAQAAAAQdG90YWxUaGlzVm90ZUtleQkABLkAAAACCQAETAAAAAICAAAABHZvdGUJAARMAAAAAgUAAAAEdm90ZQUAAAADbmlsAgAAAAFfBAAAABN0b3RhbFRoaXNWb3RlQW1vdW50CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAEHRvdGFsVGhpc1ZvdGVLZXkAAAAAAAAAAAAEAAAAD3VzZXJUaGlzVm90ZUtleQkBAAAAC2tleVVzZXJWb3RlAAAAAgUAAAALdXNlckFkZHJlc3MFAAAABHZvdGUEAAAAD3VzZXJMYXN0Vm90ZUtleQkBAAAAD2tleVVzZXJMYXN0Vm90ZQAAAAEFAAAAC3VzZXJBZGRyZXNzBAAAAAx1c2VyTGFzdFZvdGUJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAAPdXNlckxhc3RWb3RlS2V5BQAAAAR2b3RlBAAAAB9yZW1vdmVBbW91bnRGb3JQcmV2aW91c1NhbWVWb3RlAwkAAAAAAAACBQAAAAx1c2VyTGFzdFZvdGUFAAAABHZvdGUJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAPdXNlclRoaXNWb3RlS2V5AAAAAAAAAAAAAAAAAAAAAAAABAAAABJyZWR1Y2VPbGRVc2VyVm90ZXMDCQAAAAAAAAIFAAAADHVzZXJMYXN0Vm90ZQUAAAAEdm90ZQUAAAADbmlsBAAAABVrZXlVc2VyTGFzdFZvdGVBbW91bnQJAQAAAAtrZXlVc2VyVm90ZQAAAAIFAAAAC3VzZXJBZGRyZXNzBQAAAAx1c2VyTGFzdFZvdGUEAAAAEHRvdGFsTGFzdFZvdGVLZXkJAAS5AAAAAgkABEwAAAACAgAAAAR2b3RlCQAETAAAAAIFAAAADHVzZXJMYXN0Vm90ZQUAAAADbmlsAgAAAAFfBAAAABNsYXN0Vm90ZVRvdGFsQW1vdW50CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAEHRvdGFsTGFzdFZvdGVLZXkAAAAAAAAAAAAEAAAAFGxhc3RWb3RlQnlVc2VyQW1vdW50CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAFWtleVVzZXJMYXN0Vm90ZUFtb3VudAAAAAAAAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAVa2V5VXNlckxhc3RWb3RlQW1vdW50AAAAAAAAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABB0b3RhbExhc3RWb3RlS2V5CQAAZQAAAAIFAAAAE2xhc3RWb3RlVG90YWxBbW91bnQFAAAAFGxhc3RWb3RlQnlVc2VyQW1vdW50BQAAAANuaWwDCQAAZwAAAAIFAAAABmhlaWdodAUAAAAJaGVpZ2h0RW5kCQAAAgAAAAECAAAADXZvdGUgZmluaXNoZWQJAAROAAAAAgUAAAAScmVkdWNlT2xkVXNlclZvdGVzCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABB0b3RhbFRoaXNWb3RlS2V5CQAAZQAAAAIJAABkAAAAAgUAAAATdG90YWxUaGlzVm90ZUFtb3VudAUAAAAPdXNlclZvdGluZ1Bvd2VyBQAAAB9yZW1vdmVBbW91bnRGb3JQcmV2aW91c1NhbWVWb3RlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAA91c2VyVGhpc1ZvdGVLZXkFAAAAD3VzZXJWb3RpbmdQb3dlcgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAA91c2VyTGFzdFZvdGVLZXkFAAAABHZvdGUFAAAAA25pbAAAAADdweXB", "height": 1993983, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DaDqRu6NEPojUuguq9J358nKdYLD3A2FqL1grQG95Lxu Next: 3HCuVqYFPepucfJhzkTB3BDNH7CyCBRNN4Z4wiTjxjTx Diff:
OldNewDifferences
1515
1616 let neutrinoContract = Address(base58'3N9be2mwrA52WJho6DiesZkk4351GvpnWuj')
1717
18-let assets = split(assetsString, ",")
18+let availableVotes = split(assetsString, ",")
1919
2020 func keyUserBalance (userAddr) = makeString(["balance", toString(userAddr)], "_")
2121
2222
23-func keyUserVoteKey (userAddr,vote) = makeString(["vote", userAddr, vote], "_")
23+func keyUserVote (userAddr,vote) = makeString(["vote", userAddr, vote], "_")
24+
25+
26+func keyUserLastVote (userAddr) = makeString(["last_vote", userAddr], "_")
2427
2528
2629 @Callable(contextObj)
27-func castVote (vote) = if ((containsElement(assets, vote) == false))
28- then throw("Incorrect vote!")
29- else {
30- let totalVoteKey = makeString(["vote", vote], "_")
31- let userVoteKey = keyUserVoteKey(toString(contextObj.caller), vote)
32- let $t011071301 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [toString(contextObj.caller), 0], nil))
33- let limitMaxUsdn = $t011071301._1
34- let limitSpent = $t011071301._2
35- let blcks2LmtReset = $t011071301._3
36- let gnsbtAmt = $t011071301._4
37- let gnsbtAmtTotal = $t011071301._5
38- let userVotingAmount = gnsbtAmt
39- let voteTotalAmount = valueOrElse(getInteger(this, totalVoteKey), 0)
40- let voteByUserAmount = valueOrElse(getInteger(this, userVoteKey), 0)
41- if ((height >= heightEnd))
42- then throw("vote finished")
43- else [IntegerEntry(totalVoteKey, ((voteTotalAmount + userVotingAmount) - voteByUserAmount)), IntegerEntry(userVoteKey, userVotingAmount)]
44- }
30+func castVote (vote) = {
31+ let userAddress = toString(contextObj.caller)
32+ if ((containsElement(availableVotes, vote) == false))
33+ then throw("Incorrect vote!")
34+ else {
35+ let $t012701447 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddress, 0], nil))
36+ let limitMaxUsdn = $t012701447._1
37+ let limitSpent = $t012701447._2
38+ let blcks2LmtReset = $t012701447._3
39+ let gnsbtAmt = $t012701447._4
40+ let gnsbtAmtTotal = $t012701447._5
41+ let userVotingPower = gnsbtAmt
42+ let totalThisVoteKey = makeString(["vote", vote], "_")
43+ let totalThisVoteAmount = valueOrElse(getInteger(this, totalThisVoteKey), 0)
44+ let userThisVoteKey = keyUserVote(userAddress, vote)
45+ let userLastVoteKey = keyUserLastVote(userAddress)
46+ let userLastVote = valueOrElse(getString(this, userLastVoteKey), vote)
47+ let removeAmountForPreviousSameVote = if ((userLastVote == vote))
48+ then valueOrElse(getInteger(this, userThisVoteKey), 0)
49+ else 0
50+ let reduceOldUserVotes = if ((userLastVote == vote))
51+ then nil
52+ else {
53+ let keyUserLastVoteAmount = keyUserVote(userAddress, userLastVote)
54+ let totalLastVoteKey = makeString(["vote", userLastVote], "_")
55+ let lastVoteTotalAmount = valueOrElse(getInteger(this, totalLastVoteKey), 0)
56+ let lastVoteByUserAmount = valueOrElse(getInteger(this, keyUserLastVoteAmount), 0)
57+[IntegerEntry(keyUserLastVoteAmount, 0), IntegerEntry(totalLastVoteKey, (lastVoteTotalAmount - lastVoteByUserAmount))]
58+ }
59+ if ((height >= heightEnd))
60+ then throw("vote finished")
61+ else (reduceOldUserVotes ++ [IntegerEntry(totalThisVoteKey, ((totalThisVoteAmount + userVotingPower) - removeAmountForPreviousSameVote)), IntegerEntry(userThisVoteKey, userVotingPower), StringEntry(userLastVoteKey, vote)])
62+ }
63+ }
4564
4665
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let heightEnd = valueOrErrorMessage(getInteger(this, "height_end"), "height_end is not specified in state")
55
66 let assetsString = valueOrErrorMessage(getString(this, "available_assets"), "Assets list is not specified in state")
77
88 func asSwapParamsSTRUCT (val) = match val {
99 case struct: (Int, Int, Int, Int, Int) =>
1010 struct
1111 case _ =>
1212 throw("fail to cast into Int")
1313 }
1414
1515
1616 let neutrinoContract = Address(base58'3N9be2mwrA52WJho6DiesZkk4351GvpnWuj')
1717
18-let assets = split(assetsString, ",")
18+let availableVotes = split(assetsString, ",")
1919
2020 func keyUserBalance (userAddr) = makeString(["balance", toString(userAddr)], "_")
2121
2222
23-func keyUserVoteKey (userAddr,vote) = makeString(["vote", userAddr, vote], "_")
23+func keyUserVote (userAddr,vote) = makeString(["vote", userAddr, vote], "_")
24+
25+
26+func keyUserLastVote (userAddr) = makeString(["last_vote", userAddr], "_")
2427
2528
2629 @Callable(contextObj)
27-func castVote (vote) = if ((containsElement(assets, vote) == false))
28- then throw("Incorrect vote!")
29- else {
30- let totalVoteKey = makeString(["vote", vote], "_")
31- let userVoteKey = keyUserVoteKey(toString(contextObj.caller), vote)
32- let $t011071301 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [toString(contextObj.caller), 0], nil))
33- let limitMaxUsdn = $t011071301._1
34- let limitSpent = $t011071301._2
35- let blcks2LmtReset = $t011071301._3
36- let gnsbtAmt = $t011071301._4
37- let gnsbtAmtTotal = $t011071301._5
38- let userVotingAmount = gnsbtAmt
39- let voteTotalAmount = valueOrElse(getInteger(this, totalVoteKey), 0)
40- let voteByUserAmount = valueOrElse(getInteger(this, userVoteKey), 0)
41- if ((height >= heightEnd))
42- then throw("vote finished")
43- else [IntegerEntry(totalVoteKey, ((voteTotalAmount + userVotingAmount) - voteByUserAmount)), IntegerEntry(userVoteKey, userVotingAmount)]
44- }
30+func castVote (vote) = {
31+ let userAddress = toString(contextObj.caller)
32+ if ((containsElement(availableVotes, vote) == false))
33+ then throw("Incorrect vote!")
34+ else {
35+ let $t012701447 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [userAddress, 0], nil))
36+ let limitMaxUsdn = $t012701447._1
37+ let limitSpent = $t012701447._2
38+ let blcks2LmtReset = $t012701447._3
39+ let gnsbtAmt = $t012701447._4
40+ let gnsbtAmtTotal = $t012701447._5
41+ let userVotingPower = gnsbtAmt
42+ let totalThisVoteKey = makeString(["vote", vote], "_")
43+ let totalThisVoteAmount = valueOrElse(getInteger(this, totalThisVoteKey), 0)
44+ let userThisVoteKey = keyUserVote(userAddress, vote)
45+ let userLastVoteKey = keyUserLastVote(userAddress)
46+ let userLastVote = valueOrElse(getString(this, userLastVoteKey), vote)
47+ let removeAmountForPreviousSameVote = if ((userLastVote == vote))
48+ then valueOrElse(getInteger(this, userThisVoteKey), 0)
49+ else 0
50+ let reduceOldUserVotes = if ((userLastVote == vote))
51+ then nil
52+ else {
53+ let keyUserLastVoteAmount = keyUserVote(userAddress, userLastVote)
54+ let totalLastVoteKey = makeString(["vote", userLastVote], "_")
55+ let lastVoteTotalAmount = valueOrElse(getInteger(this, totalLastVoteKey), 0)
56+ let lastVoteByUserAmount = valueOrElse(getInteger(this, keyUserLastVoteAmount), 0)
57+[IntegerEntry(keyUserLastVoteAmount, 0), IntegerEntry(totalLastVoteKey, (lastVoteTotalAmount - lastVoteByUserAmount))]
58+ }
59+ if ((height >= heightEnd))
60+ then throw("vote finished")
61+ else (reduceOldUserVotes ++ [IntegerEntry(totalThisVoteKey, ((totalThisVoteAmount + userVotingPower) - removeAmountForPreviousSameVote)), IntegerEntry(userThisVoteKey, userVotingPower), StringEntry(userLastVoteKey, vote)])
62+ }
63+ }
4564
4665

github/deemru/w8io/873ac7e 
25.44 ms