tx · 5q7NqzRNaUknEiir5JFQtCPkKaHdz5q1pHMt8r7bUzVx

3MsmgWBZKrHwbVbSQiqmStRiFyg5hkfxxa2:  -0.00300000 Waves

2022.08.16 17:08 [2187131] smart account 3MsmgWBZKrHwbVbSQiqmStRiFyg5hkfxxa2 > SELF 0.00000000 Waves

{ "type": 13, "id": "5q7NqzRNaUknEiir5JFQtCPkKaHdz5q1pHMt8r7bUzVx", "fee": 300000, "feeAssetId": null, "timestamp": 1660658891025, "version": 2, "chainId": 84, "sender": "3MsmgWBZKrHwbVbSQiqmStRiFyg5hkfxxa2", "senderPublicKey": "9TejtrnvgE7MvzMR4DcLbf3dqUzovyt4BKEmCsqha2z", "proofs": [ "5PvBHS9RrqeM2AQR5bxKHWver1qTP1d2ZtLkMEnkbfx6nT5RZhPTtwRShgrj2uy4PakkXzUyMymXGAxKzjmZZa2p" ], "script": "base64:AAIFAAAAAAAAAAcIAhIDCgEIAAAACQAAAAAJaGVpZ2h0RW5kCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwIAAAAKaGVpZ2h0X2VuZAIAAAAkaGVpZ2h0X2VuZCBpcyBub3Qgc3BlY2lmaWVkIGluIHN0YXRlAAAAAAxhc3NldHNTdHJpbmcJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzAgAAABBhdmFpbGFibGVfYXNzZXRzAgAAACVBc3NldHMgbGlzdCBpcyBub3Qgc3BlY2lmaWVkIGluIHN0YXRlAQAAAAlhc0FueUxpc3QAAAABAAAAA3ZhbAQAAAAHJG1hdGNoMAUAAAADdmFsAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAlMaXN0W0FueV0EAAAACnZhbEFueUx5c3QFAAAAByRtYXRjaDAFAAAACnZhbEFueUx5c3QJAAACAAAAAQIAAAAbZmFpbCB0byBjYXN0IGludG8gTGlzdFtBbnldAQAAAAVhc0ludAAAAAEAAAADdmFsBAAAAAckbWF0Y2gwBQAAAAN2YWwDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAAGdmFsSW50BQAAAAckbWF0Y2gwBQAAAAZ2YWxJbnQJAAACAAAAAQIAAAAVZmFpbCB0byBjYXN0IGludG8gSW50AAAAABNuc2J0U3Rha2luZ0NvbnRyYWN0CQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFUOrz+4umfUdrssqn6lKJS7u88U0ntbQvvAAAAAA5hdmFpbGFibGVWb3RlcwkABLUAAAACBQAAAAxhc3NldHNTdHJpbmcCAAAAASwBAAAADmtleVVzZXJCYWxhbmNlAAAAAQAAAAh1c2VyQWRkcgkABLkAAAACCQAETAAAAAICAAAAB2JhbGFuY2UJAARMAAAAAgkABCUAAAABBQAAAAh1c2VyQWRkcgUAAAADbmlsAgAAAAFfAQAAAAtrZXlVc2VyVm90ZQAAAAIAAAAIdXNlckFkZHIAAAAEdm90ZQkABLkAAAACCQAETAAAAAICAAAABHZvdGUJAARMAAAAAgUAAAAIdXNlckFkZHIJAARMAAAAAgUAAAAEdm90ZQUAAAADbmlsAgAAAAFfAQAAAA9rZXlVc2VyTGFzdFZvdGUAAAABAAAACHVzZXJBZGRyCQAEuQAAAAIJAARMAAAAAgIAAAAJbGFzdF92b3RlCQAETAAAAAIFAAAACHVzZXJBZGRyBQAAAANuaWwCAAAAAV8AAAABAAAACmNvbnRleHRPYmoBAAAACGNhc3RWb3RlAAAAAQAAAA1uZXdVc2VyQ2hvaWNlBAAAAAt1c2VyQWRkcmVzcwkABCUAAAABCAUAAAAKY29udGV4dE9iagAAAAZjYWxsZXIDCQAAAAAAAAIJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAA5hdmFpbGFibGVWb3RlcwUAAAANbmV3VXNlckNob2ljZQcJAAACAAAAAQIAAAAPSW5jb3JyZWN0IHZvdGUhAwkAAGcAAAACBQAAAAZoZWlnaHQFAAAACWhlaWdodEVuZAkAAAIAAAABAgAAAA12b3RlIGZpbmlzaGVkBAAAAAhuc2J0RGF0YQkBAAAACWFzQW55TGlzdAAAAAEJAAP8AAAABAUAAAATbnNidFN0YWtpbmdDb250cmFjdAIAAAAWbnNidFN0YWtpbmdTWVNSRUFET05MWQkABEwAAAACBQAAAAt1c2VyQWRkcmVzcwUAAAADbmlsBQAAAANuaWwEAAAAEm5ld1VzZXJWb3RpbmdQb3dlcgkBAAAABWFzSW50AAAAAQkAAZEAAAACBQAAAAhuc2J0RGF0YQAAAAAAAAAAAAQAAAATbmV3VG90YWxCeUNob2ljZUtFWQkABLkAAAACCQAETAAAAAICAAAABHZvdGUJAARMAAAAAgUAAAANbmV3VXNlckNob2ljZQUAAAADbmlsAgAAAAFfBAAAABZuZXdUb3RhbEJ5Q2hvaWNlQW1vdW50CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAE25ld1RvdGFsQnlDaG9pY2VLRVkAAAAAAAAAAAAEAAAAFW5ld1VzZXJWb3RpbmdQb3dlcktFWQkBAAAAC2tleVVzZXJWb3RlAAAAAgUAAAALdXNlckFkZHJlc3MFAAAADW5ld1VzZXJDaG9pY2UEAAAAEXByZXZVc2VyQ2hvaWNlS0VZCQEAAAAPa2V5VXNlckxhc3RWb3RlAAAAAQUAAAALdXNlckFkZHJlc3MEAAAADnByZXZVc2VyQ2hvaWNlCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAEXByZXZVc2VyQ2hvaWNlS0VZBQAAAA1uZXdVc2VyQ2hvaWNlBAAAABZwcmV2VXNlclZvdGluZ1Bvd2VyS0VZCQEAAAALa2V5VXNlclZvdGUAAAACBQAAAAt1c2VyQWRkcmVzcwUAAAAOcHJldlVzZXJDaG9pY2UEAAAAE3ByZXZVc2VyVm90aW5nUG93ZXIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAWcHJldlVzZXJWb3RpbmdQb3dlcktFWQAAAAAAAAAAAAQAAAAUcHJldlRvdGFsQnlDaG9pY2VLRVkJAAS5AAAAAgkABEwAAAACAgAAAAR2b3RlCQAETAAAAAIFAAAADnByZXZVc2VyQ2hvaWNlBQAAAANuaWwCAAAAAV8EAAAAF3ByZXZUb3RhbEJ5Q2hvaWNlQW1vdW50CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAFHByZXZUb3RhbEJ5Q2hvaWNlS0VZAAAAAAAAAAAABAAAAA1yZWZyZXNoVG90YWxzAwkBAAAAAiE9AAAAAgUAAAAOcHJldlVzZXJDaG9pY2UFAAAADW5ld1VzZXJDaG9pY2UJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAFnByZXZVc2VyVm90aW5nUG93ZXJLRVkAAAAAAAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAFHByZXZUb3RhbEJ5Q2hvaWNlS0VZCQAAZQAAAAIFAAAAF3ByZXZUb3RhbEJ5Q2hvaWNlQW1vdW50BQAAABNwcmV2VXNlclZvdGluZ1Bvd2VyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABNuZXdUb3RhbEJ5Q2hvaWNlS0VZCQAAZAAAAAIFAAAAFm5ld1RvdGFsQnlDaG9pY2VBbW91bnQFAAAAEm5ld1VzZXJWb3RpbmdQb3dlcgUAAAADbmlsCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABNuZXdUb3RhbEJ5Q2hvaWNlS0VZCQAAZQAAAAIJAABkAAAAAgUAAAAWbmV3VG90YWxCeUNob2ljZUFtb3VudAUAAAASbmV3VXNlclZvdGluZ1Bvd2VyBQAAABNwcmV2VXNlclZvdGluZ1Bvd2VyBQAAAANuaWwJAAROAAAAAgUAAAANcmVmcmVzaFRvdGFscwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAVbmV3VXNlclZvdGluZ1Bvd2VyS0VZBQAAABJuZXdVc2VyVm90aW5nUG93ZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAARcHJldlVzZXJDaG9pY2VLRVkFAAAADW5ld1VzZXJDaG9pY2UFAAAAA25pbAAAAACsLJ9i", "height": 2187131, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HaM2bFQuteMT4pz8zqMq3W448jdq8UkiLqNXSj1dmWej Next: HmvHufMZAcVfrfdrQTyhJBEXQRXuSaBsKjYBvFJYxoDC Diff:
OldNewDifferences
55
66 let assetsString = valueOrErrorMessage(getString(this, "available_assets"), "Assets list is not specified in state")
77
8-func asSwapParamsSTRUCT (val) = match val {
9- case struct: (Int, Int, Int, Int, Int) =>
10- struct
8+func asAnyList (val) = match val {
9+ case valAnyLyst: List[Any] =>
10+ valAnyLyst
11+ case _ =>
12+ throw("fail to cast into List[Any]")
13+}
14+
15+
16+func asInt (val) = match val {
17+ case valInt: Int =>
18+ valInt
1119 case _ =>
1220 throw("fail to cast into Int")
1321 }
1422
1523
16-let neutrinoContract = Address(base58'3N9be2mwrA52WJho6DiesZkk4351GvpnWuj')
24+let nsbtStakingContract = Address(base58'3MuGfNhF98CNBCfthhoJEo6SYUv7zTgkK4J')
1725
18-let assets = split(assetsString, ",")
26+let availableVotes = split(assetsString, ",")
1927
2028 func keyUserBalance (userAddr) = makeString(["balance", toString(userAddr)], "_")
2129
2230
23-func keyUserVoteKey (userAddr,vote) = makeString(["vote", userAddr, vote], "_")
31+func keyUserVote (userAddr,vote) = makeString(["vote", userAddr, vote], "_")
32+
33+
34+func keyUserLastVote (userAddr) = makeString(["last_vote", userAddr], "_")
2435
2536
2637 @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 $t011001294 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [toString(contextObj.caller), 0], nil))
33- let limitMaxUsdn = $t011001294._1
34- let limitSpent = $t011001294._2
35- let blcks2LmtReset = $t011001294._3
36- let gnsbtAmt = $t011001294._4
37- let gnsbtAmtTotal = $t011001294._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))
38+func castVote (newUserChoice) = {
39+ let userAddress = toString(contextObj.caller)
40+ if ((containsElement(availableVotes, newUserChoice) == false))
41+ then throw("Incorrect vote!")
42+ else if ((height >= heightEnd))
4243 then throw("vote finished")
43- else [IntegerEntry(totalVoteKey, ((voteTotalAmount + userVotingAmount) - voteByUserAmount)), IntegerEntry(userVoteKey, userVotingAmount)]
44- }
44+ else {
45+ let nsbtData = asAnyList(invoke(nsbtStakingContract, "nsbtStakingSYSREADONLY", [userAddress], nil))
46+ 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)
50+ let prevUserChoiceKEY = keyUserLastVote(userAddress)
51+ let prevUserChoice = valueOrElse(getString(this, prevUserChoiceKEY), newUserChoice)
52+ let prevUserVotingPowerKEY = keyUserVote(userAddress, prevUserChoice)
53+ 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)])
60+ }
61+ }
4562
4663
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
8-func asSwapParamsSTRUCT (val) = match val {
9- case struct: (Int, Int, Int, Int, Int) =>
10- struct
8+func asAnyList (val) = match val {
9+ case valAnyLyst: List[Any] =>
10+ valAnyLyst
11+ case _ =>
12+ throw("fail to cast into List[Any]")
13+}
14+
15+
16+func asInt (val) = match val {
17+ case valInt: Int =>
18+ valInt
1119 case _ =>
1220 throw("fail to cast into Int")
1321 }
1422
1523
16-let neutrinoContract = Address(base58'3N9be2mwrA52WJho6DiesZkk4351GvpnWuj')
24+let nsbtStakingContract = Address(base58'3MuGfNhF98CNBCfthhoJEo6SYUv7zTgkK4J')
1725
18-let assets = split(assetsString, ",")
26+let availableVotes = split(assetsString, ",")
1927
2028 func keyUserBalance (userAddr) = makeString(["balance", toString(userAddr)], "_")
2129
2230
23-func keyUserVoteKey (userAddr,vote) = makeString(["vote", userAddr, vote], "_")
31+func keyUserVote (userAddr,vote) = makeString(["vote", userAddr, vote], "_")
32+
33+
34+func keyUserLastVote (userAddr) = makeString(["last_vote", userAddr], "_")
2435
2536
2637 @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 $t011001294 = asSwapParamsSTRUCT(invoke(neutrinoContract, "swapParamsByUserSYSREADONLY", [toString(contextObj.caller), 0], nil))
33- let limitMaxUsdn = $t011001294._1
34- let limitSpent = $t011001294._2
35- let blcks2LmtReset = $t011001294._3
36- let gnsbtAmt = $t011001294._4
37- let gnsbtAmtTotal = $t011001294._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))
38+func castVote (newUserChoice) = {
39+ let userAddress = toString(contextObj.caller)
40+ if ((containsElement(availableVotes, newUserChoice) == false))
41+ then throw("Incorrect vote!")
42+ else if ((height >= heightEnd))
4243 then throw("vote finished")
43- else [IntegerEntry(totalVoteKey, ((voteTotalAmount + userVotingAmount) - voteByUserAmount)), IntegerEntry(userVoteKey, userVotingAmount)]
44- }
44+ else {
45+ let nsbtData = asAnyList(invoke(nsbtStakingContract, "nsbtStakingSYSREADONLY", [userAddress], nil))
46+ 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)
50+ let prevUserChoiceKEY = keyUserLastVote(userAddress)
51+ let prevUserChoice = valueOrElse(getString(this, prevUserChoiceKEY), newUserChoice)
52+ let prevUserVotingPowerKEY = keyUserVote(userAddress, prevUserChoice)
53+ 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)])
60+ }
61+ }
4562
4663

github/deemru/w8io/169f3d6 
37.65 ms