tx · 31wgkFGNAuu96w2uJwbxnYkRERnHmroP5khKd7fWKpmp

3MsmgWBZKrHwbVbSQiqmStRiFyg5hkfxxa2:  -0.00400000 Waves

2022.08.18 16:45 [2189989] smart account 3MsmgWBZKrHwbVbSQiqmStRiFyg5hkfxxa2 > SELF 0.00000000 Waves

{ "type": 13, "id": "31wgkFGNAuu96w2uJwbxnYkRERnHmroP5khKd7fWKpmp", "fee": 400000, "feeAssetId": null, "timestamp": 1660830344481, "version": 2, "chainId": 84, "sender": "3MsmgWBZKrHwbVbSQiqmStRiFyg5hkfxxa2", "senderPublicKey": "9TejtrnvgE7MvzMR4DcLbf3dqUzovyt4BKEmCsqha2z", "proofs": [ "2hsSYjHLHs4RgsWUJGa8emE8fUqDsW6h9eERqWuLzZNj3ohfgobLAZHVJg5T7b5DVPYsEMziTNj5EeFFVdp4eG5e" ], "script": "base64:AAIFAAAAAAAAAAcIAhIDCgEIAAAACQAAAAAJaGVpZ2h0RW5kCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwIAAAAKaGVpZ2h0X2VuZAIAAAAkaGVpZ2h0X2VuZCBpcyBub3Qgc3BlY2lmaWVkIGluIHN0YXRlAAAAAAxhc3NldHNTdHJpbmcJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzAgAAABBhdmFpbGFibGVfYXNzZXRzAgAAACVBc3NldHMgbGlzdCBpcyBub3Qgc3BlY2lmaWVkIGluIHN0YXRlAQAAAAlhc0FueUxpc3QAAAABAAAAA3ZhbAQAAAAHJG1hdGNoMAUAAAADdmFsAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAlMaXN0W0FueV0EAAAACnZhbEFueUx5c3QFAAAAByRtYXRjaDAFAAAACnZhbEFueUx5c3QJAAACAAAAAQIAAAAbZmFpbCB0byBjYXN0IGludG8gTGlzdFtBbnldAQAAAAVhc0ludAAAAAEAAAADdmFsBAAAAAckbWF0Y2gwBQAAAAN2YWwDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAAGdmFsSW50BQAAAAckbWF0Y2gwBQAAAAZ2YWxJbnQJAAACAAAAAQIAAAAVZmFpbCB0byBjYXN0IGludG8gSW50AAAAABNuc2J0U3Rha2luZ0NvbnRyYWN0CQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFUOrz+4umfUdrssqn6lKJS7u88U0ntbQvvAAAAAA5hdmFpbGFibGVWb3RlcwkABLUAAAACBQAAAAxhc3NldHNTdHJpbmcCAAAAASwBAAAADmtleVVzZXJCYWxhbmNlAAAAAQAAAAh1c2VyQWRkcgkABLkAAAACCQAETAAAAAICAAAAB2JhbGFuY2UJAARMAAAAAgkABCUAAAABBQAAAAh1c2VyQWRkcgUAAAADbmlsAgAAAAFfAQAAABJrZXlVc2VyVm90aW5nUG93ZXIAAAABAAAACHVzZXJBZGRyCQAEuQAAAAIJAARMAAAAAgIAAAALdm90aW5nUG93ZXIJAARMAAAAAgUAAAAIdXNlckFkZHIFAAAAA25pbAIAAAABXwEAAAAPa2V5VXNlckxhc3RWb3RlAAAAAQAAAAh1c2VyQWRkcgkABLkAAAACCQAETAAAAAICAAAACWxhc3Rfdm90ZQkABEwAAAACBQAAAAh1c2VyQWRkcgUAAAADbmlsAgAAAAFfAAAAAQAAAApjb250ZXh0T2JqAQAAAAhjYXN0Vm90ZQAAAAEAAAAWbmV3VXNlclNlbGVjdGVkT3B0aW9ucwQAAAALdXNlckFkZHJlc3MJAAQlAAAAAQgFAAAACmNvbnRleHRPYmoAAAAGY2FsbGVyAwkAAAAAAAACCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAOYXZhaWxhYmxlVm90ZXMFAAAAFm5ld1VzZXJTZWxlY3RlZE9wdGlvbnMHCQAAAgAAAAECAAAAD0luY29ycmVjdCB2b3RlIQMJAABnAAAAAgUAAAAGaGVpZ2h0BQAAAAloZWlnaHRFbmQJAAACAAAAAQIAAAANdm90ZSBmaW5pc2hlZAQAAAAIbnNidERhdGEJAQAAAAlhc0FueUxpc3QAAAABCQAD/AAAAAQFAAAAE25zYnRTdGFraW5nQ29udHJhY3QCAAAAFm5zYnRTdGFraW5nU1lTUkVBRE9OTFkJAARMAAAAAgUAAAALdXNlckFkZHJlc3MJAARMAAAAAgAAAAAAAAAAAAUAAAADbmlsBQAAAANuaWwEAAAAEm5ld1VzZXJWb3RpbmdQb3dlcgkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAAhuc2J0RGF0YQAAAAAAAAAAAAQAAAASc2VsZWN0ZWRPcHRpb25zQXJyCQAEtQAAAAIFAAAAFm5ld1VzZXJTZWxlY3RlZE9wdGlvbnMCAAAAAToEAAAAEXByZXZVc2VyQ2hvaWNlS0VZCQEAAAAPa2V5VXNlckxhc3RWb3RlAAAAAQUAAAALdXNlckFkZHJlc3MEAAAAF3ByZXZVc2VyU2VsZWN0ZWRPcHRpb25zCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAEXByZXZVc2VyQ2hvaWNlS0VZBQAAABZuZXdVc2VyU2VsZWN0ZWRPcHRpb25zBAAAABpwcmV2VXNlclNlbGVjdGVkT3B0aW9uc0FycgkABLUAAAACBQAAABdwcmV2VXNlclNlbGVjdGVkT3B0aW9ucwIAAAABOgQAAAAWcHJldlVzZXJWb3RpbmdQb3dlcktFWQkBAAAAEmtleVVzZXJWb3RpbmdQb3dlcgAAAAEFAAAAC3VzZXJBZGRyZXNzBAAAABNwcmV2VXNlclZvdGluZ1Bvd2VyCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAFnByZXZVc2VyVm90aW5nUG93ZXJLRVkAAAAAAAAAAAAKAQAAAAxyZWZyZXNoVm90ZXMAAAACAAAABGRhdGEAAAADaWR4BAAAAA1uZXdVc2VyQ2hvaWNlCQABkQAAAAIFAAAAEnNlbGVjdGVkT3B0aW9uc0FycgUAAAADaWR4BAAAAA5wcmV2VXNlckNob2ljZQkAAZEAAAACBQAAABpwcmV2VXNlclNlbGVjdGVkT3B0aW9uc0FycgUAAAADaWR4BAAAABNuZXdUb3RhbEJ5Q2hvaWNlS0VZCQAEuQAAAAIJAARMAAAAAgIAAAAEdm90ZQkABEwAAAACBQAAAA1uZXdVc2VyQ2hvaWNlBQAAAANuaWwCAAAAAV8EAAAAFm5ld1RvdGFsQnlDaG9pY2VBbW91bnQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAATbmV3VG90YWxCeUNob2ljZUtFWQAAAAAAAAAAAAQAAAAUcHJldlRvdGFsQnlDaG9pY2VLRVkJAAS5AAAAAgkABEwAAAACAgAAAAR2b3RlCQAETAAAAAIFAAAADnByZXZVc2VyQ2hvaWNlBQAAAANuaWwCAAAAAV8EAAAAF3ByZXZUb3RhbEJ5Q2hvaWNlQW1vdW50CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAFHByZXZUb3RhbEJ5Q2hvaWNlS0VZAAAAAAAAAAAABAAAAA1yZWZyZXNoVG90YWxzAwkBAAAAAiE9AAAAAgUAAAANbmV3VXNlckNob2ljZQUAAAAOcHJldlVzZXJDaG9pY2UJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAFHByZXZUb3RhbEJ5Q2hvaWNlS0VZCQAAZQAAAAIFAAAAF3ByZXZUb3RhbEJ5Q2hvaWNlQW1vdW50BQAAABNwcmV2VXNlclZvdGluZ1Bvd2VyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABNuZXdUb3RhbEJ5Q2hvaWNlS0VZCQAAZAAAAAIFAAAAFm5ld1RvdGFsQnlDaG9pY2VBbW91bnQFAAAAEm5ld1VzZXJWb3RpbmdQb3dlcgUAAAADbmlsCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABNuZXdUb3RhbEJ5Q2hvaWNlS0VZCQAAZQAAAAIJAABkAAAAAgUAAAAWbmV3VG90YWxCeUNob2ljZUFtb3VudAUAAAASbmV3VXNlclZvdGluZ1Bvd2VyBQAAABNwcmV2VXNlclZvdGluZ1Bvd2VyBQAAAANuaWwJAAROAAAAAgUAAAAEZGF0YQUAAAANcmVmcmVzaFRvdGFscwQAAAAFaWR4ZXMJAARMAAAAAgAAAAAAAAAAAAkABEwAAAACAAAAAAAAAAABCQAETAAAAAIAAAAAAAAAAAIJAARMAAAAAgAAAAAAAAAAAwUAAAADbmlsCQAETgAAAAIKAAAAAAIkbAUAAAAFaWR4ZXMKAAAAAAIkcwkAAZAAAAABBQAAAAIkbAoAAAAABSRhY2MwBQAAAANuaWwKAQAAAAUkZjBfMQAAAAIAAAACJGEAAAACJGkDCQAAZwAAAAIFAAAAAiRpBQAAAAIkcwUAAAACJGEJAQAAAAxyZWZyZXNoVm90ZXMAAAACBQAAAAIkYQkAAZEAAAACBQAAAAIkbAUAAAACJGkKAQAAAAUkZjBfMgAAAAIAAAACJGEAAAACJGkDCQAAZwAAAAIFAAAAAiRpBQAAAAIkcwUAAAACJGEJAAACAAAAAQIAAAATTGlzdCBzaXplIGV4Y2VlZHMgNQkBAAAABSRmMF8yAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgkBAAAABSRmMF8xAAAAAgUAAAAFJGFjYzAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAIAAAAAAAAAAAMAAAAAAAAAAAQAAAAAAAAAAAUJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAFnByZXZVc2VyVm90aW5nUG93ZXJLRVkFAAAAEm5ld1VzZXJWb3RpbmdQb3dlcgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAABFwcmV2VXNlckNob2ljZUtFWQUAAAAWbmV3VXNlclNlbGVjdGVkT3B0aW9ucwUAAAADbmlsAAAAACMEUm4=", "height": 2189989, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HqPH2XfFfm5dbm4LucqGwnMmq56j2JkftfLyg8zUMUfx Next: 5XtE28HZSbSLvCddhM8i7MPU2k55iMfcPjUB1u1Wmj6m Diff:
OldNewDifferences
2828 func keyUserBalance (userAddr) = makeString(["balance", toString(userAddr)], "_")
2929
3030
31-func keyUserVote (userAddr,vote) = makeString(["vote", userAddr, vote], "_")
31+func keyUserVotingPower (userAddr) = makeString(["votingPower", userAddr], "_")
3232
3333
3434 func keyUserLastVote (userAddr) = makeString(["last_vote", userAddr], "_")
3535
3636
3737 @Callable(contextObj)
38-func castVote (newUserChoice) = {
38+func castVote (newUserSelectedOptions) = {
3939 let userAddress = toString(contextObj.caller)
40- if ((containsElement(availableVotes, newUserChoice) == false))
40+ if ((containsElement(availableVotes, newUserSelectedOptions) == false))
4141 then throw("Incorrect vote!")
4242 else if ((height >= heightEnd))
4343 then throw("vote finished")
4444 else {
4545 let nsbtData = asAnyList(invoke(nsbtStakingContract, "nsbtStakingSYSREADONLY", [userAddress, 0], nil))
4646 let newUserVotingPower = asInt(nsbtData[0])
47- let newTotalByChoiceKEY = makeString(["vote", newUserChoice], "_")
48- let newTotalByChoiceAmount = valueOrElse(getInteger(this, newTotalByChoiceKEY), 0)
49- let newUserVotingPowerKEY = keyUserVote(userAddress, newUserChoice)
47+ let selectedOptionsArr = split(newUserSelectedOptions, ":")
5048 let prevUserChoiceKEY = keyUserLastVote(userAddress)
51- let prevUserChoice = valueOrElse(getString(this, prevUserChoiceKEY), newUserChoice)
52- let prevUserVotingPowerKEY = keyUserVote(userAddress, prevUserChoice)
49+ let prevUserSelectedOptions = valueOrElse(getString(this, prevUserChoiceKEY), newUserSelectedOptions)
50+ let prevUserSelectedOptionsArr = split(prevUserSelectedOptions, ":")
51+ let prevUserVotingPowerKEY = keyUserVotingPower(userAddress)
5352 let prevUserVotingPower = valueOrElse(getInteger(this, prevUserVotingPowerKEY), 0)
54- let prevTotalByChoiceKEY = makeString(["vote", prevUserChoice], "_")
55- let prevTotalByChoiceAmount = valueOrElse(getInteger(this, prevTotalByChoiceKEY), 0)
56- let refreshTotals = if ((prevUserChoice != newUserChoice))
57- then [IntegerEntry(prevUserVotingPowerKEY, 0), IntegerEntry(prevTotalByChoiceKEY, (prevTotalByChoiceAmount - prevUserVotingPower)), IntegerEntry(newTotalByChoiceKEY, (newTotalByChoiceAmount + newUserVotingPower))]
58- else [IntegerEntry(newTotalByChoiceKEY, ((newTotalByChoiceAmount + newUserVotingPower) - prevUserVotingPower))]
59- (refreshTotals ++ [IntegerEntry(newUserVotingPowerKEY, newUserVotingPower), StringEntry(prevUserChoiceKEY, newUserChoice)])
53+ func refreshVotes (data,idx) = {
54+ let newUserChoice = selectedOptionsArr[idx]
55+ let prevUserChoice = prevUserSelectedOptionsArr[idx]
56+ let newTotalByChoiceKEY = makeString(["vote", newUserChoice], "_")
57+ let newTotalByChoiceAmount = valueOrElse(getInteger(this, newTotalByChoiceKEY), 0)
58+ let prevTotalByChoiceKEY = makeString(["vote", prevUserChoice], "_")
59+ let prevTotalByChoiceAmount = valueOrElse(getInteger(this, prevTotalByChoiceKEY), 0)
60+ let refreshTotals = if ((newUserChoice != prevUserChoice))
61+ then [IntegerEntry(prevTotalByChoiceKEY, (prevTotalByChoiceAmount - prevUserVotingPower)), IntegerEntry(newTotalByChoiceKEY, (newTotalByChoiceAmount + newUserVotingPower))]
62+ else [IntegerEntry(newTotalByChoiceKEY, ((newTotalByChoiceAmount + newUserVotingPower) - prevUserVotingPower))]
63+ (data ++ refreshTotals)
64+ }
65+
66+ let idxes = [0, 1, 2, 3]
67+ ({
68+ let $l = idxes
69+ let $s = size($l)
70+ let $acc0 = nil
71+ func $f0_1 ($a,$i) = if (($i >= $s))
72+ then $a
73+ else refreshVotes($a, $l[$i])
74+
75+ func $f0_2 ($a,$i) = if (($i >= $s))
76+ then $a
77+ else throw("List size exceeds 5")
78+
79+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
80+ } ++ [IntegerEntry(prevUserVotingPowerKEY, newUserVotingPower), StringEntry(prevUserChoiceKEY, newUserSelectedOptions)])
6081 }
6182 }
6283
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 asAnyList (val) = match val {
99 case valAnyLyst: List[Any] =>
1010 valAnyLyst
1111 case _ =>
1212 throw("fail to cast into List[Any]")
1313 }
1414
1515
1616 func asInt (val) = match val {
1717 case valInt: Int =>
1818 valInt
1919 case _ =>
2020 throw("fail to cast into Int")
2121 }
2222
2323
2424 let nsbtStakingContract = Address(base58'3MuGfNhF98CNBCfthhoJEo6SYUv7zTgkK4J')
2525
2626 let availableVotes = split(assetsString, ",")
2727
2828 func keyUserBalance (userAddr) = makeString(["balance", toString(userAddr)], "_")
2929
3030
31-func keyUserVote (userAddr,vote) = makeString(["vote", userAddr, vote], "_")
31+func keyUserVotingPower (userAddr) = makeString(["votingPower", userAddr], "_")
3232
3333
3434 func keyUserLastVote (userAddr) = makeString(["last_vote", userAddr], "_")
3535
3636
3737 @Callable(contextObj)
38-func castVote (newUserChoice) = {
38+func castVote (newUserSelectedOptions) = {
3939 let userAddress = toString(contextObj.caller)
40- if ((containsElement(availableVotes, newUserChoice) == false))
40+ if ((containsElement(availableVotes, newUserSelectedOptions) == false))
4141 then throw("Incorrect vote!")
4242 else if ((height >= heightEnd))
4343 then throw("vote finished")
4444 else {
4545 let nsbtData = asAnyList(invoke(nsbtStakingContract, "nsbtStakingSYSREADONLY", [userAddress, 0], nil))
4646 let newUserVotingPower = asInt(nsbtData[0])
47- let newTotalByChoiceKEY = makeString(["vote", newUserChoice], "_")
48- let newTotalByChoiceAmount = valueOrElse(getInteger(this, newTotalByChoiceKEY), 0)
49- let newUserVotingPowerKEY = keyUserVote(userAddress, newUserChoice)
47+ let selectedOptionsArr = split(newUserSelectedOptions, ":")
5048 let prevUserChoiceKEY = keyUserLastVote(userAddress)
51- let prevUserChoice = valueOrElse(getString(this, prevUserChoiceKEY), newUserChoice)
52- let prevUserVotingPowerKEY = keyUserVote(userAddress, prevUserChoice)
49+ let prevUserSelectedOptions = valueOrElse(getString(this, prevUserChoiceKEY), newUserSelectedOptions)
50+ let prevUserSelectedOptionsArr = split(prevUserSelectedOptions, ":")
51+ let prevUserVotingPowerKEY = keyUserVotingPower(userAddress)
5352 let prevUserVotingPower = valueOrElse(getInteger(this, prevUserVotingPowerKEY), 0)
54- let prevTotalByChoiceKEY = makeString(["vote", prevUserChoice], "_")
55- let prevTotalByChoiceAmount = valueOrElse(getInteger(this, prevTotalByChoiceKEY), 0)
56- let refreshTotals = if ((prevUserChoice != newUserChoice))
57- then [IntegerEntry(prevUserVotingPowerKEY, 0), IntegerEntry(prevTotalByChoiceKEY, (prevTotalByChoiceAmount - prevUserVotingPower)), IntegerEntry(newTotalByChoiceKEY, (newTotalByChoiceAmount + newUserVotingPower))]
58- else [IntegerEntry(newTotalByChoiceKEY, ((newTotalByChoiceAmount + newUserVotingPower) - prevUserVotingPower))]
59- (refreshTotals ++ [IntegerEntry(newUserVotingPowerKEY, newUserVotingPower), StringEntry(prevUserChoiceKEY, newUserChoice)])
53+ func refreshVotes (data,idx) = {
54+ let newUserChoice = selectedOptionsArr[idx]
55+ let prevUserChoice = prevUserSelectedOptionsArr[idx]
56+ let newTotalByChoiceKEY = makeString(["vote", newUserChoice], "_")
57+ let newTotalByChoiceAmount = valueOrElse(getInteger(this, newTotalByChoiceKEY), 0)
58+ let prevTotalByChoiceKEY = makeString(["vote", prevUserChoice], "_")
59+ let prevTotalByChoiceAmount = valueOrElse(getInteger(this, prevTotalByChoiceKEY), 0)
60+ let refreshTotals = if ((newUserChoice != prevUserChoice))
61+ then [IntegerEntry(prevTotalByChoiceKEY, (prevTotalByChoiceAmount - prevUserVotingPower)), IntegerEntry(newTotalByChoiceKEY, (newTotalByChoiceAmount + newUserVotingPower))]
62+ else [IntegerEntry(newTotalByChoiceKEY, ((newTotalByChoiceAmount + newUserVotingPower) - prevUserVotingPower))]
63+ (data ++ refreshTotals)
64+ }
65+
66+ let idxes = [0, 1, 2, 3]
67+ ({
68+ let $l = idxes
69+ let $s = size($l)
70+ let $acc0 = nil
71+ func $f0_1 ($a,$i) = if (($i >= $s))
72+ then $a
73+ else refreshVotes($a, $l[$i])
74+
75+ func $f0_2 ($a,$i) = if (($i >= $s))
76+ then $a
77+ else throw("List size exceeds 5")
78+
79+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
80+ } ++ [IntegerEntry(prevUserVotingPowerKEY, newUserVotingPower), StringEntry(prevUserChoiceKEY, newUserSelectedOptions)])
6081 }
6182 }
6283
6384

github/deemru/w8io/169f3d6 
26.35 ms