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:
Old | New | Differences | |
---|---|---|---|
15 | 15 | ||
16 | 16 | let neutrinoContract = Address(base58'3N9be2mwrA52WJho6DiesZkk4351GvpnWuj') | |
17 | 17 | ||
18 | - | let | |
18 | + | let availableVotes = split(assetsString, ",") | |
19 | 19 | ||
20 | 20 | func keyUserBalance (userAddr) = makeString(["balance", toString(userAddr)], "_") | |
21 | 21 | ||
22 | 22 | ||
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], "_") | |
24 | 27 | ||
25 | 28 | ||
26 | 29 | @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 | + | } | |
45 | 64 | ||
46 | 65 |
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 asSwapParamsSTRUCT (val) = match val { | |
9 | 9 | case struct: (Int, Int, Int, Int, Int) => | |
10 | 10 | struct | |
11 | 11 | case _ => | |
12 | 12 | throw("fail to cast into Int") | |
13 | 13 | } | |
14 | 14 | ||
15 | 15 | ||
16 | 16 | let neutrinoContract = Address(base58'3N9be2mwrA52WJho6DiesZkk4351GvpnWuj') | |
17 | 17 | ||
18 | - | let | |
18 | + | let availableVotes = split(assetsString, ",") | |
19 | 19 | ||
20 | 20 | func keyUserBalance (userAddr) = makeString(["balance", toString(userAddr)], "_") | |
21 | 21 | ||
22 | 22 | ||
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], "_") | |
24 | 27 | ||
25 | 28 | ||
26 | 29 | @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 | + | } | |
45 | 64 | ||
46 | 65 |
github/deemru/w8io/873ac7e 25.44 ms ◑![]()