tx · 4hjhVa9avX3SA43YBAFMtMMKqFkjQVTgMa8uHVMARvkd 3P4dgXSMby8XiF7f7dby1wCzLbkYHZY9gd3: -0.00500000 Waves 2022.09.20 15:11 [3302891] smart account 3P4dgXSMby8XiF7f7dby1wCzLbkYHZY9gd3 > SELF 0.00000000 Waves
{ "type": 13, "id": "4hjhVa9avX3SA43YBAFMtMMKqFkjQVTgMa8uHVMARvkd", "fee": 500000, "feeAssetId": null, "timestamp": 1663675962368, "version": 1, "sender": "3P4dgXSMby8XiF7f7dby1wCzLbkYHZY9gd3", "senderPublicKey": "6BDK9EfwxBV71JDR9eE96szFTZTyXfwhNZAxou9UPij8", "proofs": [ "5h9S2UvxryBF6HtayFqjMR22BBWVnqR8UxBbLaSFyTRaR4sfrj5hT279nzzMWMihcVWrtofhRAvjLz8misaYN5f2" ], "script": "base64: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AAAAAgUAAAALdXNlckFkZHJlc3MJAARMAAAAAgAAAAAAAAAAAAUAAAADbmlsBQAAAANuaWwEAAAAEm5ld1VzZXJWb3RpbmdQb3dlcgkAAGQAAAACCQEAAAAFYXNJbnQAAAABCQABkQAAAAIFAAAACG5zYnREYXRhAAAAAAAAAAAABQAAAA1nbnNidEZyb21TdXJmAwkAAGcAAAACAAAAAAAAAAAABQAAABJuZXdVc2VyVm90aW5nUG93ZXIJAAACAAAAAQIAAAAYbm90IGVub3VnaCBnbnNidCB0byB2b3RlBAAAABJzZWxlY3RlZE9wdGlvbnNBcnIJAAS1AAAAAgUAAAAWbmV3VXNlclNlbGVjdGVkT3B0aW9ucwIAAAABOgQAAAARcHJldlVzZXJDaG9pY2VLRVkJAQAAAA9rZXlVc2VyTGFzdFZvdGUAAAABBQAAAAt1c2VyQWRkcmVzcwQAAAAXcHJldlVzZXJTZWxlY3RlZE9wdGlvbnMJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAARcHJldlVzZXJDaG9pY2VLRVkFAAAAFm5ld1VzZXJTZWxlY3RlZE9wdGlvbnMEAAAAGnByZXZVc2VyU2VsZWN0ZWRPcHRpb25zQXJyCQAEtQAAAAIFAAAAF3ByZXZVc2VyU2VsZWN0ZWRPcHRpb25zAgAAAAE6BAAAABZwcmV2VXNlclZvdGluZ1Bvd2VyS0VZCQEAAAASa2V5VXNlclZvdGluZ1Bvd2VyAAAAAQUAAAALdXNlckFkZHJlc3MEAAAAE3ByZXZVc2VyVm90aW5nUG93ZXIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAWcHJldlVzZXJWb3RpbmdQb3dlcktFWQAAAAAAAAAAAAoBAAAADHJlZnJlc2hWb3RlcwAAAAIAAAAEZGF0YQAAAANpZHgEAAAADW5ld1VzZXJDaG9pY2UJAAGRAAAAAgUAAAASc2VsZWN0ZWRPcHRpb25zQXJyBQAAAANpZHgEAAAADnByZXZVc2VyQ2hvaWNlCQABkQAAAAIFAAAAGnByZXZVc2VyU2VsZWN0ZWRPcHRpb25zQXJyBQAAAANpZHgEAAAAE25ld1RvdGFsQnlDaG9pY2VLRVkJAAS5AAAAAgkABEwAAAACAgAAAAR2b3RlCQAETAAAAAIFAAAADW5ld1VzZXJDaG9pY2UFAAAAA25pbAIAAAABXwQAAAAWbmV3VG90YWxCeUNob2ljZUFtb3VudAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABNuZXdUb3RhbEJ5Q2hvaWNlS0VZAAAAAAAAAAAABAAAABRwcmV2VG90YWxCeUNob2ljZUtFWQkABLkAAAACCQAETAAAAAICAAAABHZvdGUJAARMAAAAAgUAAAAOcHJldlVzZXJDaG9pY2UFAAAAA25pbAIAAAABXwQAAAAXcHJldlRvdGFsQnlDaG9pY2VBbW91bnQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAUcHJldlRvdGFsQnlDaG9pY2VLRVkAAAAAAAAAAAAEAAAADXJlZnJlc2hUb3RhbHMDCQEAAAACIT0AAAACBQAAAA1uZXdVc2VyQ2hvaWNlBQAAAA5wcmV2VXNlckNob2ljZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAUcHJldlRvdGFsQnlDaG9pY2VLRVkJAABlAAAAAgUAAAAXcHJldlRvdGFsQnlDaG9pY2VBbW91bnQFAAAAE3ByZXZVc2VyVm90aW5nUG93ZXIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAE25ld1RvdGFsQnlDaG9pY2VLRVkJAABkAAAAAgUAAAAWbmV3VG90YWxCeUNob2ljZUFtb3VudAUAAAASbmV3VXNlclZvdGluZ1Bvd2VyBQAAAANuaWwJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAE25ld1RvdGFsQnlDaG9pY2VLRVkJAABlAAAAAgkAAGQAAAACBQAAABZuZXdUb3RhbEJ5Q2hvaWNlQW1vdW50BQAAABJuZXdVc2VyVm90aW5nUG93ZXIFAAAAE3ByZXZVc2VyVm90aW5nUG93ZXIFAAAAA25pbAkABE4AAAACBQAAAARkYXRhBQAAAA1yZWZyZXNoVG90YWxzBAAAAAVpZHhlcwkABEwAAAACAAAAAAAAAAAACQAETAAAAAIAAAAAAAAAAAEFAAAAA25pbAkABE4AAAACCgAAAAACJGwFAAAABWlkeGVzCgAAAAACJHMJAAGQAAAAAQUAAAACJGwKAAAAAAUkYWNjMAUAAAADbmlsCgEAAAAFJGYwXzEAAAACAAAAAiRhAAAAAiRpAwkAAGcAAAACBQAAAAIkaQUAAAACJHMFAAAAAiRhCQEAAAAMcmVmcmVzaFZvdGVzAAAAAgUAAAACJGEJAAGRAAAAAgUAAAACJGwFAAAAAiRpCgEAAAAFJGYwXzIAAAACAAAAAiRhAAAAAiRpAwkAAGcAAAACBQAAAAIkaQUAAAACJHMFAAAAAiRhCQAAAgAAAAECAAAAE0xpc3Qgc2l6ZSBleGNlZWRzIDIJAQAAAAUkZjBfMgAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIFAAAABSRhY2MwAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABZwcmV2VXNlclZvdGluZ1Bvd2VyS0VZBQAAABJuZXdVc2VyVm90aW5nUG93ZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAARcHJldlVzZXJDaG9pY2VLRVkFAAAAFm5ld1VzZXJTZWxlY3RlZE9wdGlvbnMFAAAAA25pbAAAAAAkRF2K", "chainId": 87, "height": 3302891, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5oJYkzKQXtLCaLq1FFV4ND5xzh5143wo9msh7cnHTVQ5 Next: 3cNdTqrUgu3ayaEUKTUKfZdMVWYRHSELKSEfQHVD57pe Diff:
Old | New | Differences | |
---|---|---|---|
23 | 23 | ||
24 | 24 | let nsbtStakingContract = Address(base58'3P8w8NXZUtYdCA13tHbDY5sW4mC27ZFJgG3') | |
25 | 25 | ||
26 | + | let surfStakingContract = Address(base58'3PBiotFpqjRMkkeFBccnQNUXUopy7KFez5C') | |
27 | + | ||
26 | 28 | let availableVotes = split(assetsString, ",") | |
27 | 29 | ||
28 | 30 | func keyUserBalance (userAddr) = makeString(["balance", toString(userAddr)], "_") | |
42 | 44 | else if ((height >= heightEnd)) | |
43 | 45 | then throw("vote finished") | |
44 | 46 | else { | |
47 | + | let surfData = asAnyList(invoke(surfStakingContract, "surfStakingSYSREADONLY", [userAddress, 0], nil)) | |
48 | + | let gnsbtFromSurfEffectiveHeight = asInt(surfData[4]) | |
49 | + | let gnsbtFromSurf = if ((gnsbtFromSurfEffectiveHeight > heightEnd)) | |
50 | + | then 0 | |
51 | + | else asInt(surfData[2]) | |
45 | 52 | let nsbtData = asAnyList(invoke(nsbtStakingContract, "nsbtStakingSYSREADONLY", [userAddress, 0], nil)) | |
46 | - | let newUserVotingPower = asInt(nsbtData[0]) | |
53 | + | let newUserVotingPower = (asInt(nsbtData[0]) + gnsbtFromSurf) | |
47 | 54 | if ((0 >= newUserVotingPower)) | |
48 | 55 | then throw("not enough gnsbt to vote") | |
49 | 56 | else { |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 5 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let heightEnd = valueOrErrorMessage(getInteger(this, "height_end"), "height_end is not specified in state") | |
5 | 5 | ||
6 | 6 | let assetsString = valueOrErrorMessage(getString(this, "available_assets"), "Assets list is not specified in state") | |
7 | 7 | ||
8 | 8 | func asAnyList (val) = match val { | |
9 | 9 | case valAnyLyst: List[Any] => | |
10 | 10 | valAnyLyst | |
11 | 11 | case _ => | |
12 | 12 | throw("fail to cast into List[Any]") | |
13 | 13 | } | |
14 | 14 | ||
15 | 15 | ||
16 | 16 | func asInt (val) = match val { | |
17 | 17 | case valInt: Int => | |
18 | 18 | valInt | |
19 | 19 | case _ => | |
20 | 20 | throw("fail to cast into Int") | |
21 | 21 | } | |
22 | 22 | ||
23 | 23 | ||
24 | 24 | let nsbtStakingContract = Address(base58'3P8w8NXZUtYdCA13tHbDY5sW4mC27ZFJgG3') | |
25 | 25 | ||
26 | + | let surfStakingContract = Address(base58'3PBiotFpqjRMkkeFBccnQNUXUopy7KFez5C') | |
27 | + | ||
26 | 28 | let availableVotes = split(assetsString, ",") | |
27 | 29 | ||
28 | 30 | func keyUserBalance (userAddr) = makeString(["balance", toString(userAddr)], "_") | |
29 | 31 | ||
30 | 32 | ||
31 | 33 | func keyUserVotingPower (userAddr) = makeString(["votingPower", userAddr], "_") | |
32 | 34 | ||
33 | 35 | ||
34 | 36 | func keyUserLastVote (userAddr) = makeString(["last_vote", userAddr], "_") | |
35 | 37 | ||
36 | 38 | ||
37 | 39 | @Callable(contextObj) | |
38 | 40 | func castVote (newUserSelectedOptions) = { | |
39 | 41 | let userAddress = toString(contextObj.caller) | |
40 | 42 | if ((containsElement(availableVotes, newUserSelectedOptions) == false)) | |
41 | 43 | then throw("Incorrect vote!") | |
42 | 44 | else if ((height >= heightEnd)) | |
43 | 45 | then throw("vote finished") | |
44 | 46 | else { | |
47 | + | let surfData = asAnyList(invoke(surfStakingContract, "surfStakingSYSREADONLY", [userAddress, 0], nil)) | |
48 | + | let gnsbtFromSurfEffectiveHeight = asInt(surfData[4]) | |
49 | + | let gnsbtFromSurf = if ((gnsbtFromSurfEffectiveHeight > heightEnd)) | |
50 | + | then 0 | |
51 | + | else asInt(surfData[2]) | |
45 | 52 | let nsbtData = asAnyList(invoke(nsbtStakingContract, "nsbtStakingSYSREADONLY", [userAddress, 0], nil)) | |
46 | - | let newUserVotingPower = asInt(nsbtData[0]) | |
53 | + | let newUserVotingPower = (asInt(nsbtData[0]) + gnsbtFromSurf) | |
47 | 54 | if ((0 >= newUserVotingPower)) | |
48 | 55 | then throw("not enough gnsbt to vote") | |
49 | 56 | else { | |
50 | 57 | let selectedOptionsArr = split(newUserSelectedOptions, ":") | |
51 | 58 | let prevUserChoiceKEY = keyUserLastVote(userAddress) | |
52 | 59 | let prevUserSelectedOptions = valueOrElse(getString(this, prevUserChoiceKEY), newUserSelectedOptions) | |
53 | 60 | let prevUserSelectedOptionsArr = split(prevUserSelectedOptions, ":") | |
54 | 61 | let prevUserVotingPowerKEY = keyUserVotingPower(userAddress) | |
55 | 62 | let prevUserVotingPower = valueOrElse(getInteger(this, prevUserVotingPowerKEY), 0) | |
56 | 63 | func refreshVotes (data,idx) = { | |
57 | 64 | let newUserChoice = selectedOptionsArr[idx] | |
58 | 65 | let prevUserChoice = prevUserSelectedOptionsArr[idx] | |
59 | 66 | let newTotalByChoiceKEY = makeString(["vote", newUserChoice], "_") | |
60 | 67 | let newTotalByChoiceAmount = valueOrElse(getInteger(this, newTotalByChoiceKEY), 0) | |
61 | 68 | let prevTotalByChoiceKEY = makeString(["vote", prevUserChoice], "_") | |
62 | 69 | let prevTotalByChoiceAmount = valueOrElse(getInteger(this, prevTotalByChoiceKEY), 0) | |
63 | 70 | let refreshTotals = if ((newUserChoice != prevUserChoice)) | |
64 | 71 | then [IntegerEntry(prevTotalByChoiceKEY, (prevTotalByChoiceAmount - prevUserVotingPower)), IntegerEntry(newTotalByChoiceKEY, (newTotalByChoiceAmount + newUserVotingPower))] | |
65 | 72 | else [IntegerEntry(newTotalByChoiceKEY, ((newTotalByChoiceAmount + newUserVotingPower) - prevUserVotingPower))] | |
66 | 73 | (data ++ refreshTotals) | |
67 | 74 | } | |
68 | 75 | ||
69 | 76 | let idxes = [0, 1] | |
70 | 77 | ({ | |
71 | 78 | let $l = idxes | |
72 | 79 | let $s = size($l) | |
73 | 80 | let $acc0 = nil | |
74 | 81 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
75 | 82 | then $a | |
76 | 83 | else refreshVotes($a, $l[$i]) | |
77 | 84 | ||
78 | 85 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
79 | 86 | then $a | |
80 | 87 | else throw("List size exceeds 2") | |
81 | 88 | ||
82 | 89 | $f0_2($f0_1($f0_1($acc0, 0), 1), 2) | |
83 | 90 | } ++ [IntegerEntry(prevUserVotingPowerKEY, newUserVotingPower), StringEntry(prevUserChoiceKEY, newUserSelectedOptions)]) | |
84 | 91 | } | |
85 | 92 | } | |
86 | 93 | } | |
87 | 94 | ||
88 | 95 |
github/deemru/w8io/0e76f2f 34.77 ms ◑