tx · 4sGezAcBwRRNFDzYKHLaexuuCc3riDG7rYYaYcWYsJAm

3PB7t8fi7QbEVzVcoeYp3k7JYgVaYy7DZDP:  -0.00600000 Waves

2022.09.20 20:01 [3303168] smart account 3PB7t8fi7QbEVzVcoeYp3k7JYgVaYy7DZDP > SELF 0.00000000 Waves

{ "type": 13, "id": "4sGezAcBwRRNFDzYKHLaexuuCc3riDG7rYYaYcWYsJAm", "fee": 600000, "feeAssetId": null, "timestamp": 1663693331953, "version": 1, "sender": "3PB7t8fi7QbEVzVcoeYp3k7JYgVaYy7DZDP", "senderPublicKey": "HrhLcmSgAxnTFSgRLEPuqPDCCbZRJGVoSXqgSRTVTY3C", "proofs": [ "35cLiHbg1hyGJ1TRTrAdWXJEQgLK3wpBD4wWBScQuB6Do459bQPPpEcLTgs443ej6ziVBMVyc9MumCQdd25mqdin" ], "script": "base64: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bnMgZGVuaWVkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAOaGVpZ2h0U3RhcnRLRVkAAAAABQAAAAtoZWlnaHRTdGFydAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADGhlaWdodEVuZEtFWQAAAAAFAAAACWhlaWdodEVuZAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAASYXZhaWxhYmxlQXNzZXRzS0VZAAAAAAUAAAAQYXZhaWxhYmxlX2Fzc2V0cwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAAUZ25zYnRfZnJvbU5zYnRfdG90YWwFAAAAEmduc2J0RnJvbU5zYnRUb3RhbAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAAUZ25zYnRfZnJvbVN1cmZfdG90YWwFAAAAEmduc2J0RnJvbVN1cmZUb3RhbAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAAGcXVvcnVtCQAAawAAAAMJAABkAAAAAgUAAAASZ25zYnRGcm9tTnNidFRvdGFsBQAAABJnbnNidEZyb21TdXJmVG90YWwFAAAADXF1b3J1bVBlcmNlbnQAAAAAAAAAAGQFAAAAA25pbAAAAApjb250ZXh0T2JqAQAAAAhjYXN0Vm90ZQAAAAEAAAAWbmV3VXNlclNlbGVjdGVkT3B0aW9ucwQAAAALdXNlckFkZHJlc3MJAAQlAAAAAQgFAAAACmNvbnRleHRPYmoAAAAGY2FsbGVyAwkAAAAAAAACCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAOYXZhaWxhYmxlVm90ZXMFAAAAFm5ld1VzZXJTZWxlY3RlZE9wdGlvbnMHCQAAAgAAAAECAAAAD0luY29ycmVjdCB2b3RlIQMJAABnAAAAAgUAAAAGaGVpZ2h0BQAAAAloZWlnaHRFbmQJAAACAAAAAQIAAAANdm90ZSBmaW5pc2hlZAQAAAAIc3VyZkRhdGEJAQAAAAlhc0FueUxpc3QAAAABCQAD/AAAAAQFAAAAE3N1cmZTdGFraW5nQ29udHJhY3QCAAAAFnN1cmZTdGFraW5nU1lTUkVBRE9OTFkJAARMAAAAAgUAAAALdXNlckFkZHJlc3MJAARMAAAAAgAAAAAAAAAAAAUAAAADbmlsBQAAAANuaWwEAAAAHGduc2J0RnJvbVN1cmZFZmZlY3RpdmVIZWlnaHQJAQAAAAVhc0ludAAAAAEJAAGRAAAAAgUAAAAIc3VyZkRhdGEAAAAAAAAAAAQEAAAADWduc2J0RnJvbVN1cmYDCQAAZgAAAAIFAAAAHGduc2J0RnJvbVN1cmZFZmZlY3RpdmVIZWlnaHQFAAAACWhlaWdodEVuZAAAAAAAAAAAAAkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAAhzdXJmRGF0YQAAAAAAAAAAAgQAAAAIbnNidERhdGEJAQAAAAlhc0FueUxpc3QAAAABCQAD/AAAAAQFAAAAE25zYnRTdGFraW5nQ29udHJhY3QCAAAAFm5zYnRTdGFraW5nU1lTUkVBRE9OTFkJAARMAAAAAgUAAAALdXNlckFkZHJlc3MJAARMAAAAAgAAAAAAAAAAAAUAAAADbmlsBQAAAANuaWwEAAAAEm5ld1VzZXJWb3RpbmdQb3dlcgkAAGQAAAACCQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAACG5zYnREYXRhAAAAAAAAAAAABQAAAA1nbnNidEZyb21TdXJmAwkAAGcAAAACAAAAAAAAAAAABQAAABJuZXdVc2VyVm90aW5nUG93ZXIJAAACAAAAAQIAAAAYbm90IGVub3VnaCBnbnNidCB0byB2b3RlBAAAABJzZWxlY3RlZE9wdGlvbnNBcnIJAAS1AAAAAgUAAAAWbmV3VXNlclNlbGVjdGVkT3B0aW9ucwIAAAABOgQAAAARcHJldlVzZXJDaG9pY2VLRVkJAQAAAA9rZXlVc2VyTGFzdFZvdGUAAAABBQAAAAt1c2VyQWRkcmVzcwQAAAAXcHJldlVzZXJTZWxlY3RlZE9wdGlvbnMJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAARcHJldlVzZXJDaG9pY2VLRVkFAAAAFm5ld1VzZXJTZWxlY3RlZE9wdGlvbnMEAAAAGnByZXZVc2VyU2VsZWN0ZWRPcHRpb25zQXJyCQAEtQAAAAIFAAAAF3ByZXZVc2VyU2VsZWN0ZWRPcHRpb25zAgAAAAE6BAAAABZwcmV2VXNlclZvdGluZ1Bvd2VyS0VZCQEAAAASa2V5VXNlclZvdGluZ1Bvd2VyAAAAAQUAAAALdXNlckFkZHJlc3MEAAAAE3ByZXZVc2VyVm90aW5nUG93ZXIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAWcHJldlVzZXJWb3RpbmdQb3dlcktFWQAAAAAAAAAAAAoBAAAADHJlZnJlc2hWb3RlcwAAAAIAAAAEZGF0YQAAAANpZHgEAAAADW5ld1VzZXJDaG9pY2UJAAGRAAAAAgUAAAASc2VsZWN0ZWRPcHRpb25zQXJyBQAAAANpZHgEAAAADnByZXZVc2VyQ2hvaWNlCQABkQAAAAIFAAAAGnByZXZVc2VyU2VsZWN0ZWRPcHRpb25zQXJyBQAAAANpZHgEAAAAE25ld1RvdGFsQnlDaG9pY2VLRVkJAAS5AAAAAgkABEwAAAACAgAAAAR2b3RlCQAETAAAAAIFAAAADW5ld1VzZXJDaG9pY2UFAAAAA25pbAIAAAABXwQAAAAWbmV3VG90YWxCeUNob2ljZUFtb3VudAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABNuZXdUb3RhbEJ5Q2hvaWNlS0VZAAAAAAAAAAAABAAAABRwcmV2VG90YWxCeUNob2ljZUtFWQkABLkAAAACCQAETAAAAAICAAAABHZvdGUJAARMAAAAAgUAAAAOcHJldlVzZXJDaG9pY2UFAAAAA25pbAIAAAABXwQAAAAXcHJldlRvdGFsQnlDaG9pY2VBbW91bnQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAUcHJldlRvdGFsQnlDaG9pY2VLRVkAAAAAAAAAAAAEAAAADXJlZnJlc2hUb3RhbHMDCQEAAAACIT0AAAACBQAAAA1uZXdVc2VyQ2hvaWNlBQAAAA5wcmV2VXNlckNob2ljZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAUcHJldlRvdGFsQnlDaG9pY2VLRVkJAABlAAAAAgUAAAAXcHJldlRvdGFsQnlDaG9pY2VBbW91bnQFAAAAE3ByZXZVc2VyVm90aW5nUG93ZXIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAE25ld1RvdGFsQnlDaG9pY2VLRVkJAABkAAAAAgUAAAAWbmV3VG90YWxCeUNob2ljZUFtb3VudAUAAAASbmV3VXNlclZvdGluZ1Bvd2VyBQAAAANuaWwJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAE25ld1RvdGFsQnlDaG9pY2VLRVkJAABlAAAAAgkAAGQAAAACBQAAABZuZXdUb3RhbEJ5Q2hvaWNlQW1vdW50BQAAABJuZXdVc2VyVm90aW5nUG93ZXIFAAAAE3ByZXZVc2VyVm90aW5nUG93ZXIFAAAAA25pbAkABE4AAAACBQAAAARkYXRhBQAAAA1yZWZyZXNoVG90YWxzBAAAAAVpZHhlcwkABEwAAAACAAAAAAAAAAAACQAETAAAAAIAAAAAAAAAAAEFAAAAA25pbAkABE4AAAACCgAAAAACJGwFAAAABWlkeGVzCgAAAAACJHMJAAGQAAAAAQUAAAACJGwKAAAAAAUkYWNjMAUAAAADbmlsCgEAAAAFJGYwXzEAAAACAAAAAiRhAAAAAiRpAwkAAGcAAAACBQAAAAIkaQUAAAACJHMFAAAAAiRhCQEAAAAMcmVmcmVzaFZvdGVzAAAAAgUAAAACJGEJAAGRAAAAAgUAAAACJGwFAAAAAiRpCgEAAAAFJGYwXzIAAAACAAAAAiRhAAAAAiRpAwkAAGcAAAACBQAAAAIkaQUAAAACJHMFAAAAAiRhCQAAAgAAAAECAAAAE0xpc3Qgc2l6ZSBleGNlZWRzIDIJAQAAAAUkZjBfMgAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIFAAAABSRhY2MwAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABZwcmV2VXNlclZvdGluZ1Bvd2VyS0VZBQAAABJuZXdVc2VyVm90aW5nUG93ZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAARcHJldlVzZXJDaG9pY2VLRVkFAAAAFm5ld1VzZXJTZWxlY3RlZE9wdGlvbnMFAAAAA25pbAAAAABZZUg8", "chainId": 87, "height": 3303168, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 5 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+func heightEndKEY () = "height_end"
5+
6+
7+func heightStartKEY () = "height_start"
8+
9+
10+func availableAssetsKEY () = "available_assets"
11+
12+
13+let heightEnd = valueOrErrorMessage(getInteger(this, heightEndKEY()), "height_end is not specified in state")
14+
15+let assetsString = valueOrErrorMessage(getString(this, availableAssetsKEY()), "Assets list is not specified in state")
16+
17+func asAnyList (val) = match val {
18+ case valAnyLyst: List[Any] =>
19+ valAnyLyst
20+ case _ =>
21+ throw("fail to cast into List[Any]")
22+}
23+
24+
25+func asInt (val) = match val {
26+ case valInt: Int =>
27+ valInt
28+ case _ =>
29+ throw("fail to cast into Int")
30+}
31+
32+
33+let nsbtStakingContract = Address(base58'3P8w8NXZUtYdCA13tHbDY5sW4mC27ZFJgG3')
34+
35+let surfStakingContract = Address(base58'3PBiotFpqjRMkkeFBccnQNUXUopy7KFez5C')
36+
37+let availableVotes = split(assetsString, ",")
38+
39+func keyUserBalance (userAddr) = makeString(["balance", toString(userAddr)], "_")
40+
41+
42+func keyUserVotingPower (userAddr) = makeString(["votingPower", userAddr], "_")
43+
44+
45+func keyUserLastVote (userAddr) = makeString(["last_vote", userAddr], "_")
46+
47+
48+@Callable(contextObj)
49+func constructor (available_assets,heightStart,heightEnd,quorumPercent) = {
50+ let surfData = asAnyList(invoke(surfStakingContract, "surfStakingSYSREADONLY", ["", 0], nil))
51+ let gnsbtFromSurfTotal = asInt(surfData[3])
52+ let nsbtData = asAnyList(invoke(nsbtStakingContract, "nsbtStakingSYSREADONLY", ["", 0], nil))
53+ let gnsbtFromNsbtTotal = asInt(nsbtData[1])
54+ if ((contextObj.caller != this))
55+ then throw("permissions denied")
56+ else [IntegerEntry(heightStartKEY(), heightStart), IntegerEntry(heightEndKEY(), heightEnd), StringEntry(availableAssetsKEY(), available_assets), IntegerEntry("gnsbt_fromNsbt_total", gnsbtFromNsbtTotal), IntegerEntry("gnsbt_fromSurf_total", gnsbtFromSurfTotal), IntegerEntry("quorum", fraction((gnsbtFromNsbtTotal + gnsbtFromSurfTotal), quorumPercent, 100))]
57+ }
58+
59+
60+
61+@Callable(contextObj)
62+func castVote (newUserSelectedOptions) = {
63+ let userAddress = toString(contextObj.caller)
64+ if ((containsElement(availableVotes, newUserSelectedOptions) == false))
65+ then throw("Incorrect vote!")
66+ else if ((height >= heightEnd))
67+ then throw("vote finished")
68+ else {
69+ let surfData = asAnyList(invoke(surfStakingContract, "surfStakingSYSREADONLY", [userAddress, 0], nil))
70+ let gnsbtFromSurfEffectiveHeight = asInt(surfData[4])
71+ let gnsbtFromSurf = if ((gnsbtFromSurfEffectiveHeight > heightEnd))
72+ then 0
73+ else asInt(surfData[2])
74+ let nsbtData = asAnyList(invoke(nsbtStakingContract, "nsbtStakingSYSREADONLY", [userAddress, 0], nil))
75+ let newUserVotingPower = (asInt(nsbtData[0]) + gnsbtFromSurf)
76+ if ((0 >= newUserVotingPower))
77+ then throw("not enough gnsbt to vote")
78+ else {
79+ let selectedOptionsArr = split(newUserSelectedOptions, ":")
80+ let prevUserChoiceKEY = keyUserLastVote(userAddress)
81+ let prevUserSelectedOptions = valueOrElse(getString(this, prevUserChoiceKEY), newUserSelectedOptions)
82+ let prevUserSelectedOptionsArr = split(prevUserSelectedOptions, ":")
83+ let prevUserVotingPowerKEY = keyUserVotingPower(userAddress)
84+ let prevUserVotingPower = valueOrElse(getInteger(this, prevUserVotingPowerKEY), 0)
85+ func refreshVotes (data,idx) = {
86+ let newUserChoice = selectedOptionsArr[idx]
87+ let prevUserChoice = prevUserSelectedOptionsArr[idx]
88+ let newTotalByChoiceKEY = makeString(["vote", newUserChoice], "_")
89+ let newTotalByChoiceAmount = valueOrElse(getInteger(this, newTotalByChoiceKEY), 0)
90+ let prevTotalByChoiceKEY = makeString(["vote", prevUserChoice], "_")
91+ let prevTotalByChoiceAmount = valueOrElse(getInteger(this, prevTotalByChoiceKEY), 0)
92+ let refreshTotals = if ((newUserChoice != prevUserChoice))
93+ then [IntegerEntry(prevTotalByChoiceKEY, (prevTotalByChoiceAmount - prevUserVotingPower)), IntegerEntry(newTotalByChoiceKEY, (newTotalByChoiceAmount + newUserVotingPower))]
94+ else [IntegerEntry(newTotalByChoiceKEY, ((newTotalByChoiceAmount + newUserVotingPower) - prevUserVotingPower))]
95+ (data ++ refreshTotals)
96+ }
97+
98+ let idxes = [0, 1]
99+ ({
100+ let $l = idxes
101+ let $s = size($l)
102+ let $acc0 = nil
103+ func $f0_1 ($a,$i) = if (($i >= $s))
104+ then $a
105+ else refreshVotes($a, $l[$i])
106+
107+ func $f0_2 ($a,$i) = if (($i >= $s))
108+ then $a
109+ else throw("List size exceeds 2")
110+
111+ $f0_2($f0_1($f0_1($acc0, 0), 1), 2)
112+ } ++ [IntegerEntry(prevUserVotingPowerKEY, newUserVotingPower), StringEntry(prevUserChoiceKEY, newUserSelectedOptions)])
113+ }
114+ }
115+ }
116+
117+

github/deemru/w8io/3ef1775 
17.53 ms