tx · B6z98D11MhYGazc2jP6AP7gnourEQEBGWusbn3MvxhBN

3PLv5piJAdCShTHLVN7QMEcZC4Ai65HB5cB:  -0.00500000 Waves

2023.02.20 20:17 [3523790] smart account 3PLv5piJAdCShTHLVN7QMEcZC4Ai65HB5cB > SELF 0.00000000 Waves

{ "type": 13, "id": "B6z98D11MhYGazc2jP6AP7gnourEQEBGWusbn3MvxhBN", "fee": 500000, "feeAssetId": null, "timestamp": 1676913519916, "version": 1, "sender": "3PLv5piJAdCShTHLVN7QMEcZC4Ai65HB5cB", "senderPublicKey": "EQY2UiQ53q5krymuYMXtDcfbosRxvFq3A6bhyXuL2vRm", "proofs": [ "317bRiojbfQQzC5eN5QGgqEebL4moDN4UkRjLqvYc5pwoxWFrmhfZFQGgX2zjdTPF7yhTF9LAK9bMZu8hK5uu95S" ], "script": "base64:BgIMCAISABIECgIBARIAIAADU0VQAgJfXwAHTElTVFNFUAIBOgASZ292SWR4UHJvcG9zYWxUeElkAAEACmdvdklkeFR5cGUAAgAMZ292SWR4QXV0aG9yAAMACWdvdklkeFVybAAEAAtnb3ZJZHhUaXRsZQAFABJnb3ZJZHhDcmVhdGlvblRpbWUABgALZ292SWR4U3RhcnQABwAJZ292SWR4RW5kAAgAC2dvdklkeFR4SWRzAAkADGdvdklkeFF1b3J1bQAKAA1nb3ZJZHhPcHRpb25zAAsAE2dvdlN0YXR1c0lkeElzVmFsaWQAAQASZ292U3RhdHVzSWR4V2luT3B0AAIAFGdvdlN0YXR1c0lkeFdpblZvdGVzAAMAFmdvdlN0YXR1c0lkeFRvdGFsVm90ZXMABAAVZ292U3RhdHVzSWR4U2NBcHBsaWVkAAUAEmdvdlN0YXR1c0lkeFNjVGltZQAGABZnb3ZTdGF0dXNJZHhJc0NhbmNlbGVkAAcAB3Nuc2J0SWQBIHX2kOj6JBQ1L7WnAt8ZCN18kZ1dvoMYzBUeZy1Ep16tABZnbnNidEdvdmVybmFuY2VBZGRyZXNzCQEHQWRkcmVzcwEBGgFX2g09NdqUHFeiGmPiD6Rp5xvJ8UFzMfoSAQxnZXRJbnRPclplcm8BA2tleQkBC3ZhbHVlT3JFbHNlAgkAnwgBBQNrZXkAAAEMZ2V0SW50T3JGYWlsAQNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBQNrZXkJAKwCAgkArAICAgVLZXkgJwUDa2V5Ag4nIGlzIG5vdCBleGlzdAEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkArAICCQCsAgICBUtleSAnBQNrZXkCDicgaXMgbm90IGV4aXN0AR1tYWtlUHJvcG9zYWxTdGF0dXNEYXRhQnlJZEtleQEKcHJvcG9zYWxJZAkAuQkCCQDMCAICBCVzJWQJAMwIAgIScHJvcG9zYWxTdGF0dXNEYXRhCQDMCAIJAKQDAQUKcHJvcG9zYWxJZAUDbmlsBQNTRVABF21ha2VQcm9wb3NhbERhdGFCeUlkS2V5AQpwcm9wb3NhbElkCQC5CQIJAMwIAgIEJXMlZAkAzAgCAgxwcm9wb3NhbERhdGEJAMwIAgkApAMBBQpwcm9wb3NhbElkBQNuaWwFA1NFUAESbWFrZVVzZXJEZXBvc2l0S2V5AQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIHZGVwb3NpdAkAzAgCCQClCAEFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAEfbWFrZVByb3Bvc2FsVm90ZXNCeUlkQW5kVXNlcktleQIKcHJvcG9zYWxJZAt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBiVzJWQlcwkAzAgCAgt2b3Rlc0J5VXNlcgkAzAgCCQCkAwEFCnByb3Bvc2FsSWQJAMwIAgkApQgBBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABIG1ha2VQcm9wb3NhbENob2ljZUJ5SWRBbmRVc2VyS2V5Agpwcm9wb3NhbElkC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIGJXMlZCVzCQDMCAICDG9wdGlvbkJ5VXNlcgkAzAgCCQCkAwEFCnByb3Bvc2FsSWQJAMwIAgkApQgBBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABIW1ha2VQcm9wb3NhbFZvdGVzQnlJZEFuZE9wdGlvbktleQIKcHJvcG9zYWxJZAZvcHRpb24JALkJAgkAzAgCAgYlcyVkJWQJAMwIAgINdm90ZXNCeU9wdGlvbgkAzAgCCQCkAwEFCnByb3Bvc2FsSWQJAMwIAgkApAMBBQZvcHRpb24FA25pbAUDU0VQARZtYWtlVXNlclJlbGVhc2VUaW1lS2V5AQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgILcmVsZWFzZVRpbWUJAMwIAgkApQgBBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVADAWkBB2RlcG9zaXQABAdwYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAADCQAAAggFAWkGY2FsbGVyBQR0aGlzCQACAQINQWNjZXNzIGRlbmllZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECIU9ubHkgb25lIHNOU0JUIHBheW1lbnQgaXMgYWxsb3dlZAMJAQIhPQIIBQdwYXltZW50B2Fzc2V0SWQFB3Nuc2J0SWQJAAIBAhJPbmx5IHNOU0JUIGFsbG93ZWQEDnVzZXJEZXBvc2l0S2V5CQESbWFrZVVzZXJEZXBvc2l0S2V5AQgFAWkGY2FsbGVyBA5vbGRVc2VyRGVwb3NpdAkBDGdldEludE9yWmVybwEFDnVzZXJEZXBvc2l0S2V5BA5uZXdVc2VyRGVwb3NpdAkAZAIFDm9sZFVzZXJEZXBvc2l0CAUHcGF5bWVudAZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFDnVzZXJEZXBvc2l0S2V5BQ5uZXdVc2VyRGVwb3NpdAUDbmlsAWkBCGNhc3RWb3RlAgpwcm9wb3NhbElkBmNob2ljZQMJAAACCAUBaQZjYWxsZXIFBHRoaXMJAAIBAg1BY2Nlc3MgZGVuaWVkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIXUGF5bWVudHMgYXJlIHByb2hpYml0ZWQECXVzZXJWb3RlcwkBDGdldEludE9yRmFpbAEJARJtYWtlVXNlckRlcG9zaXRLZXkBCAUBaQZjYWxsZXIEC2R5bmFtaWNEYXRhCQC1CQIJAQ9nZXRTdHJpbmdPckZhaWwCBRZnbnNidEdvdmVybmFuY2VBZGRyZXNzCQEdbWFrZVByb3Bvc2FsU3RhdHVzRGF0YUJ5SWRLZXkBBQpwcm9wb3NhbElkBQNTRVADCQAAAgkAkQMCBQtkeW5hbWljRGF0YQUWZ292U3RhdHVzSWR4SXNDYW5jZWxlZAIEdHJ1ZQkAAgECGlZvdGluZyBpcyBjYW5jZWxlZCBieSB0ZWFtBAhwcm9wRGF0YQkAtQkCCQEPZ2V0U3RyaW5nT3JGYWlsAgUWZ25zYnRHb3Zlcm5hbmNlQWRkcmVzcwkBF21ha2VQcm9wb3NhbERhdGFCeUlkS2V5AQUKcHJvcG9zYWxJZAUDU0VQBAVzdGFydAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCHByb3BEYXRhBQtnb3ZJZHhTdGFydAQDZW5kCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIcHJvcERhdGEFCWdvdklkeEVuZAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAMJAGYCBQVzdGFydAUDbm93CQACAQIWVm90aW5nIG5vdCBzdGFydGVkIHlldAMJAGcCBQNub3cFA2VuZAkAAgECF1ZvdGluZyBhbHJlYWR5IGZpbmlzaGVkBBBhdmFpbGFibGVPcHRpb25zCQC1CQIJAJEDAgUIcHJvcERhdGEFDWdvdklkeE9wdGlvbnMFB0xJU1RTRVAECm51bU9wdGlvbnMJAJADAQUQYXZhaWxhYmxlT3B0aW9ucwMJAGcCAAEFCm51bU9wdGlvbnMJAAIBAhdUb28gZmV3IGNob2ljZXMgdG8gdm90ZQMJAGcCBQZjaG9pY2UFCm51bU9wdGlvbnMJAAIBCQCsAgICG1Vua25vd24gY2hvaWNlISBNdXN0IGJlIDAuLgkApAMBCQBlAgUKbnVtT3B0aW9ucwABBA11c2VyQ2hvaWNlS2V5CQEgbWFrZVByb3Bvc2FsQ2hvaWNlQnlJZEFuZFVzZXJLZXkCBQpwcm9wb3NhbElkCAUBaQZjYWxsZXIEDHVzZXJWb3Rlc0tleQkBH21ha2VQcm9wb3NhbFZvdGVzQnlJZEFuZFVzZXJLZXkCBQpwcm9wb3NhbElkCAUBaQZjYWxsZXIEEnVzZXJSZWxlYXNlVGltZUtleQkBFm1ha2VVc2VyUmVsZWFzZVRpbWVLZXkBCAUBaQZjYWxsZXIEDW9sZFVzZXJDaG9pY2UJAJ8IAQUNdXNlckNob2ljZUtleQQMb2xkVXNlclZvdGVzCQCfCAEFDHVzZXJWb3Rlc0tleQQLcmVsZWFzZVRpbWUJAJYDAQkAzAgCBQNlbmQJAMwIAgkBDGdldEludE9yWmVybwEFEnVzZXJSZWxlYXNlVGltZUtleQUDbmlsBBB2b3Rlc0J5T3B0aW9uS2V5CQEhbWFrZVByb3Bvc2FsVm90ZXNCeUlkQW5kT3B0aW9uS2V5AgUKcHJvcG9zYWxJZAUGY2hvaWNlBA12b3Rlc0J5T3B0aW9uAwMDCQEJaXNEZWZpbmVkAQUNb2xkVXNlckNob2ljZQkBCWlzRGVmaW5lZAEFDG9sZFVzZXJWb3RlcwcJAAACCQEFdmFsdWUBBQ1vbGRVc2VyQ2hvaWNlBQZjaG9pY2UHCQBlAgkAZAIJAQxnZXRJbnRPclplcm8BBRB2b3Rlc0J5T3B0aW9uS2V5BQl1c2VyVm90ZXMJAQV2YWx1ZQEFDG9sZFVzZXJWb3RlcwkAZAIJAQxnZXRJbnRPclplcm8BBRB2b3Rlc0J5T3B0aW9uS2V5BQl1c2VyVm90ZXMEGG9wdGlvbmFsVm90ZXNCeU9wdGlvbk9sZAMDAwkBASEBCQEJaXNEZWZpbmVkAQUNb2xkVXNlckNob2ljZQYJAQEhAQkBCWlzRGVmaW5lZAEFDG9sZFVzZXJWb3RlcwYJAAACBQ1vbGRVc2VyQ2hvaWNlBQZjaG9pY2UFA25pbAQTb2xkVm90ZXNCeU9wdGlvbktleQkBIW1ha2VQcm9wb3NhbFZvdGVzQnlJZEFuZE9wdGlvbktleQIFCnByb3Bvc2FsSWQJAQV2YWx1ZQEFDW9sZFVzZXJDaG9pY2UJAMwIAgkBDEludGVnZXJFbnRyeQIFE29sZFZvdGVzQnlPcHRpb25LZXkJAGUCCQEMZ2V0SW50T3JaZXJvAQUTb2xkVm90ZXNCeU9wdGlvbktleQkBBXZhbHVlAQUMb2xkVXNlclZvdGVzBQNuaWwJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUNdXNlckNob2ljZUtleQUGY2hvaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQx1c2VyVm90ZXNLZXkFCXVzZXJWb3RlcwkAzAgCCQEMSW50ZWdlckVudHJ5AgUSdXNlclJlbGVhc2VUaW1lS2V5BQtyZWxlYXNlVGltZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUQdm90ZXNCeU9wdGlvbktleQUNdm90ZXNCeU9wdGlvbgUDbmlsBRhvcHRpb25hbFZvdGVzQnlPcHRpb25PbGQBaQEId2l0aGRyYXcAAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwkAAgECDUFjY2VzcyBkZW5pZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhdQYXltZW50cyBhcmUgcHJvaGliaXRlZAQOdXNlckRlcG9zaXRLZXkJARJtYWtlVXNlckRlcG9zaXRLZXkBCAUBaQZjYWxsZXIEC3VzZXJEZXBvc2l0CQEMZ2V0SW50T3JGYWlsAQUOdXNlckRlcG9zaXRLZXkECXRpbWVzdGFtcAgJAQV2YWx1ZQEJAO0HAQUGaGVpZ2h0CXRpbWVzdGFtcAQOcmVsZWFzZVRpbWVLZXkJARZtYWtlVXNlclJlbGVhc2VUaW1lS2V5AQgFAWkGY2FsbGVyBAtyZWxlYXNlVGltZQkBDGdldEludE9yWmVybwEFDnJlbGVhc2VUaW1lS2V5AwkAZwIFC3JlbGVhc2VUaW1lBQl0aW1lc3RhbXAJAAIBCQCsAgICO1lvdXIgc05TQlQgYXJlIHRha2luZyBwYXJ0IGluIHZvdGluZywgY2Fubm90IHVuc3Rha2UgdW50aWwgCQCkAwEFC3JlbGVhc2VUaW1lCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgULdXNlckRlcG9zaXQFB3Nuc2J0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQUOdXNlckRlcG9zaXRLZXkFA25pbAA1GXvU", "chainId": 87, "height": 3523790, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: 65qqmELsakEgRktR76573hD1E1gefrMYzdx5YMXN8tQp Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let SEP = "__"
5+
6+let LISTSEP = ":"
7+
8+let govIdxProposalTxId = 1
9+
10+let govIdxType = 2
11+
12+let govIdxAuthor = 3
13+
14+let govIdxUrl = 4
15+
16+let govIdxTitle = 5
17+
18+let govIdxCreationTime = 6
19+
20+let govIdxStart = 7
21+
22+let govIdxEnd = 8
23+
24+let govIdxTxIds = 9
25+
26+let govIdxQuorum = 10
27+
28+let govIdxOptions = 11
29+
30+let govStatusIdxIsValid = 1
31+
32+let govStatusIdxWinOpt = 2
33+
34+let govStatusIdxWinVotes = 3
35+
36+let govStatusIdxTotalVotes = 4
37+
38+let govStatusIdxScApplied = 5
39+
40+let govStatusIdxScTime = 6
41+
42+let govStatusIdxIsCanceled = 7
43+
44+let snsbtId = base58'8wUmN9Y15f3JR4KZfE81XLXpkdgwnqoBNG6NmocZpKQx'
45+
46+let gnsbtGovernanceAddress = Address(base58'3PMoqtw9NCk1JDrNq24Pji6xqtuG3PYRy8m')
47+
48+func getIntOrZero (key) = valueOrElse(getInteger(key), 0)
49+
50+
51+func getIntOrFail (key) = valueOrErrorMessage(getInteger(key), (("Key '" + key) + "' is not exist"))
52+
53+
54+func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), (("Key '" + key) + "' is not exist"))
55+
56+
57+func makeProposalStatusDataByIdKey (proposalId) = makeString(["%s%d", "proposalStatusData", toString(proposalId)], SEP)
58+
59+
60+func makeProposalDataByIdKey (proposalId) = makeString(["%s%d", "proposalData", toString(proposalId)], SEP)
61+
62+
63+func makeUserDepositKey (userAddress) = makeString(["%s%s", "deposit", toString(userAddress)], SEP)
64+
65+
66+func makeProposalVotesByIdAndUserKey (proposalId,userAddress) = makeString(["%s%d%s", "votesByUser", toString(proposalId), toString(userAddress)], SEP)
67+
68+
69+func makeProposalChoiceByIdAndUserKey (proposalId,userAddress) = makeString(["%s%d%s", "optionByUser", toString(proposalId), toString(userAddress)], SEP)
70+
71+
72+func makeProposalVotesByIdAndOptionKey (proposalId,option) = makeString(["%s%d%d", "votesByOption", toString(proposalId), toString(option)], SEP)
73+
74+
75+func makeUserReleaseTimeKey (userAddress) = makeString(["%s%s", "releaseTime", toString(userAddress)], SEP)
76+
77+
78+@Callable(i)
79+func deposit () = {
80+ let payment = value(i.payments[0])
81+ if ((i.caller == this))
82+ then throw("Access denied")
83+ else if ((size(i.payments) != 1))
84+ then throw("Only one sNSBT payment is allowed")
85+ else if ((payment.assetId != snsbtId))
86+ then throw("Only sNSBT allowed")
87+ else {
88+ let userDepositKey = makeUserDepositKey(i.caller)
89+ let oldUserDeposit = getIntOrZero(userDepositKey)
90+ let newUserDeposit = (oldUserDeposit + payment.amount)
91+[IntegerEntry(userDepositKey, newUserDeposit)]
92+ }
93+ }
94+
95+
96+
97+@Callable(i)
98+func castVote (proposalId,choice) = if ((i.caller == this))
99+ then throw("Access denied")
100+ else if ((size(i.payments) != 0))
101+ then throw("Payments are prohibited")
102+ else {
103+ let userVotes = getIntOrFail(makeUserDepositKey(i.caller))
104+ let dynamicData = split(getStringOrFail(gnsbtGovernanceAddress, makeProposalStatusDataByIdKey(proposalId)), SEP)
105+ if ((dynamicData[govStatusIdxIsCanceled] == "true"))
106+ then throw("Voting is canceled by team")
107+ else {
108+ let propData = split(getStringOrFail(gnsbtGovernanceAddress, makeProposalDataByIdKey(proposalId)), SEP)
109+ let start = parseIntValue(propData[govIdxStart])
110+ let end = parseIntValue(propData[govIdxEnd])
111+ let now = lastBlock.timestamp
112+ if ((start > now))
113+ then throw("Voting not started yet")
114+ else if ((now >= end))
115+ then throw("Voting already finished")
116+ else {
117+ let availableOptions = split(propData[govIdxOptions], LISTSEP)
118+ let numOptions = size(availableOptions)
119+ if ((1 >= numOptions))
120+ then throw("Too few choices to vote")
121+ else if ((choice >= numOptions))
122+ then throw(("Unknown choice! Must be 0.." + toString((numOptions - 1))))
123+ else {
124+ let userChoiceKey = makeProposalChoiceByIdAndUserKey(proposalId, i.caller)
125+ let userVotesKey = makeProposalVotesByIdAndUserKey(proposalId, i.caller)
126+ let userReleaseTimeKey = makeUserReleaseTimeKey(i.caller)
127+ let oldUserChoice = getInteger(userChoiceKey)
128+ let oldUserVotes = getInteger(userVotesKey)
129+ let releaseTime = max([end, getIntOrZero(userReleaseTimeKey)])
130+ let votesByOptionKey = makeProposalVotesByIdAndOptionKey(proposalId, choice)
131+ let votesByOption = if (if (if (isDefined(oldUserChoice))
132+ then isDefined(oldUserVotes)
133+ else false)
134+ then (value(oldUserChoice) == choice)
135+ else false)
136+ then ((getIntOrZero(votesByOptionKey) + userVotes) - value(oldUserVotes))
137+ else (getIntOrZero(votesByOptionKey) + userVotes)
138+ let optionalVotesByOptionOld = if (if (if (!(isDefined(oldUserChoice)))
139+ then true
140+ else !(isDefined(oldUserVotes)))
141+ then true
142+ else (oldUserChoice == choice))
143+ then nil
144+ else {
145+ let oldVotesByOptionKey = makeProposalVotesByIdAndOptionKey(proposalId, value(oldUserChoice))
146+[IntegerEntry(oldVotesByOptionKey, (getIntOrZero(oldVotesByOptionKey) - value(oldUserVotes)))]
147+ }
148+ ([IntegerEntry(userChoiceKey, choice), IntegerEntry(userVotesKey, userVotes), IntegerEntry(userReleaseTimeKey, releaseTime), IntegerEntry(votesByOptionKey, votesByOption)] ++ optionalVotesByOptionOld)
149+ }
150+ }
151+ }
152+ }
153+
154+
155+
156+@Callable(i)
157+func withdraw () = if ((i.caller == this))
158+ then throw("Access denied")
159+ else if ((size(i.payments) != 0))
160+ then throw("Payments are prohibited")
161+ else {
162+ let userDepositKey = makeUserDepositKey(i.caller)
163+ let userDeposit = getIntOrFail(userDepositKey)
164+ let timestamp = value(blockInfoByHeight(height)).timestamp
165+ let releaseTimeKey = makeUserReleaseTimeKey(i.caller)
166+ let releaseTime = getIntOrZero(releaseTimeKey)
167+ if ((releaseTime >= timestamp))
168+ then throw(("Your sNSBT are taking part in voting, cannot unstake until " + toString(releaseTime)))
169+ else [ScriptTransfer(i.caller, userDeposit, snsbtId), DeleteEntry(userDepositKey)]
170+ }
171+
172+

github/deemru/w8io/6500d08 
106.14 ms