tx · 65qqmELsakEgRktR76573hD1E1gefrMYzdx5YMXN8tQp

3PLv5piJAdCShTHLVN7QMEcZC4Ai65HB5cB:  -0.00500000 Waves

2023.02.21 20:07 [3525217] smart account 3PLv5piJAdCShTHLVN7QMEcZC4Ai65HB5cB > SELF 0.00000000 Waves

{ "type": 13, "id": "65qqmELsakEgRktR76573hD1E1gefrMYzdx5YMXN8tQp", "fee": 500000, "feeAssetId": null, "timestamp": 1676999251226, "version": 1, "sender": "3PLv5piJAdCShTHLVN7QMEcZC4Ai65HB5cB", "senderPublicKey": "EQY2UiQ53q5krymuYMXtDcfbosRxvFq3A6bhyXuL2vRm", "proofs": [ "64heByC3Wwk2ZjXAWgz6sgBYPz41jpk7wVrSDsQhxtk2GHzio3XWRAbfKmbBuYfZMSRPcgRMhfPH3BuLFYK6r9eE" ], "script": "base64:BgIMCAISABIECgIBARIAIAADU0VQAgJfXwAHTElTVFNFUAIBOgASZ292SWR4UHJvcG9zYWxUeElkAAEACmdvdklkeFR5cGUAAgAMZ292SWR4QXV0aG9yAAMACWdvdklkeFVybAAEAAtnb3ZJZHhUaXRsZQAFABJnb3ZJZHhDcmVhdGlvblRpbWUABgALZ292SWR4U3RhcnQABwAJZ292SWR4RW5kAAgAC2dvdklkeFR4SWRzAAkADGdvdklkeFF1b3J1bQAKAA1nb3ZJZHhPcHRpb25zAAsAE2dvdlN0YXR1c0lkeElzVmFsaWQAAQASZ292U3RhdHVzSWR4V2luT3B0AAIAFGdvdlN0YXR1c0lkeFdpblZvdGVzAAMAFmdvdlN0YXR1c0lkeFRvdGFsVm90ZXMABAAVZ292U3RhdHVzSWR4U2NBcHBsaWVkAAUAEmdvdlN0YXR1c0lkeFNjVGltZQAGABZnb3ZTdGF0dXNJZHhJc0NhbmNlbGVkAAcAB3Nuc2J0SWQBIHX2kOj6JBQ1L7WnAt8ZCN18kZ1dvoMYzBUeZy1Ep16tABZnbnNidEdvdmVybmFuY2VBZGRyZXNzCQEHQWRkcmVzcwEBGgFX2g09NdqUHFeiGmPiD6Rp5xvJ8UFzMfoSAQxnZXRJbnRPclplcm8BA2tleQkBC3ZhbHVlT3JFbHNlAgkAnwgBBQNrZXkAAAEMZ2V0SW50T3JGYWlsAQNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnwgBBQNrZXkJAKwCAgkArAICAgVLZXkgJwUDa2V5Ag4nIGlzIG5vdCBleGlzdAEPZ2V0U3RyaW5nT3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFB2FkZHJlc3MFA2tleQkArAICCQCsAgICBUtleSAnBQNrZXkCDicgaXMgbm90IGV4aXN0AR1tYWtlUHJvcG9zYWxTdGF0dXNEYXRhQnlJZEtleQEKcHJvcG9zYWxJZAkAuQkCCQDMCAICBCVzJWQJAMwIAgIScHJvcG9zYWxTdGF0dXNEYXRhCQDMCAIJAKQDAQUKcHJvcG9zYWxJZAUDbmlsBQNTRVABF21ha2VQcm9wb3NhbERhdGFCeUlkS2V5AQpwcm9wb3NhbElkCQC5CQIJAMwIAgIEJXMlZAkAzAgCAgxwcm9wb3NhbERhdGEJAMwIAgkApAMBBQpwcm9wb3NhbElkBQNuaWwFA1NFUAESbWFrZVVzZXJEZXBvc2l0S2V5AQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIHZGVwb3NpdAkAzAgCCQClCAEFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAEfbWFrZVByb3Bvc2FsVm90ZXNCeUlkQW5kVXNlcktleQIKcHJvcG9zYWxJZAt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBiVzJWQlcwkAzAgCAgt2b3Rlc0J5VXNlcgkAzAgCCQCkAwEFCnByb3Bvc2FsSWQJAMwIAgkApQgBBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABIG1ha2VQcm9wb3NhbENob2ljZUJ5SWRBbmRVc2VyS2V5Agpwcm9wb3NhbElkC3VzZXJBZGRyZXNzCQC5CQIJAMwIAgIGJXMlZCVzCQDMCAICDG9wdGlvbkJ5VXNlcgkAzAgCCQCkAwEFCnByb3Bvc2FsSWQJAMwIAgkApQgBBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVABIW1ha2VQcm9wb3NhbFZvdGVzQnlJZEFuZE9wdGlvbktleQIKcHJvcG9zYWxJZAZvcHRpb24JALkJAgkAzAgCAgYlcyVkJWQJAMwIAgINdm90ZXNCeU9wdGlvbgkAzAgCCQCkAwEFCnByb3Bvc2FsSWQJAMwIAgkApAMBBQZvcHRpb24FA25pbAUDU0VQARZtYWtlVXNlclJlbGVhc2VUaW1lS2V5AQt1c2VyQWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgILcmVsZWFzZVRpbWUJAMwIAgkApQgBBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVADAWkBB2RlcG9zaXQABAdwYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAADCQAAAggFAWkGY2FsbGVyBQR0aGlzCQACAQINQWNjZXNzIGRlbmllZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECIU9ubHkgb25lIHNOU0JUIHBheW1lbnQgaXMgYWxsb3dlZAMJAQIhPQIIBQdwYXltZW50B2Fzc2V0SWQFB3Nuc2J0SWQJAAIBAhJPbmx5IHNOU0JUIGFsbG93ZWQEDnVzZXJEZXBvc2l0S2V5CQESbWFrZVVzZXJEZXBvc2l0S2V5AQgFAWkGY2FsbGVyBA5vbGRVc2VyRGVwb3NpdAkBDGdldEludE9yWmVybwEFDnVzZXJEZXBvc2l0S2V5BA5uZXdVc2VyRGVwb3NpdAkAZAIFDm9sZFVzZXJEZXBvc2l0CAUHcGF5bWVudAZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIFDnVzZXJEZXBvc2l0S2V5BQ5uZXdVc2VyRGVwb3NpdAUDbmlsAWkBCGNhc3RWb3RlAgpwcm9wb3NhbElkBmNob2ljZQMJAAACCAUBaQZjYWxsZXIFBHRoaXMJAAIBAg1BY2Nlc3MgZGVuaWVkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIXUGF5bWVudHMgYXJlIHByb2hpYml0ZWQECXVzZXJWb3RlcwkBDGdldEludE9yRmFpbAEJARJtYWtlVXNlckRlcG9zaXRLZXkBCAUBaQZjYWxsZXIEC2R5bmFtaWNEYXRhCQC1CQIJAQ9nZXRTdHJpbmdPckZhaWwCBRZnbnNidEdvdmVybmFuY2VBZGRyZXNzCQEdbWFrZVByb3Bvc2FsU3RhdHVzRGF0YUJ5SWRLZXkBBQpwcm9wb3NhbElkBQNTRVADCQAAAgkAkQMCBQtkeW5hbWljRGF0YQUWZ292U3RhdHVzSWR4SXNDYW5jZWxlZAIEdHJ1ZQkAAgECGlZvdGluZyBpcyBjYW5jZWxlZCBieSB0ZWFtBAhwcm9wRGF0YQkAtQkCCQEPZ2V0U3RyaW5nT3JGYWlsAgUWZ25zYnRHb3Zlcm5hbmNlQWRkcmVzcwkBF21ha2VQcm9wb3NhbERhdGFCeUlkS2V5AQUKcHJvcG9zYWxJZAUDU0VQBAVzdGFydAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCHByb3BEYXRhBQtnb3ZJZHhTdGFydAQDZW5kCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUIcHJvcERhdGEFCWdvdklkeEVuZAQDbm93CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAMJAGYCBQVzdGFydAUDbm93CQACAQIWVm90aW5nIG5vdCBzdGFydGVkIHlldAMJAGcCBQNub3cFA2VuZAkAAgECF1ZvdGluZyBhbHJlYWR5IGZpbmlzaGVkBBBhdmFpbGFibGVPcHRpb25zCQC1CQIJAJEDAgUIcHJvcERhdGEFDWdvdklkeE9wdGlvbnMFB0xJU1RTRVAECm51bU9wdGlvbnMJAJADAQUQYXZhaWxhYmxlT3B0aW9ucwMJAGcCAAEFCm51bU9wdGlvbnMJAAIBAhdUb28gZmV3IGNob2ljZXMgdG8gdm90ZQMJAGYCBQZjaG9pY2UFCm51bU9wdGlvbnMJAAIBCQCsAgICG1Vua25vd24gY2hvaWNlISBNdXN0IGJlIDAuLgkApAMBBQpudW1PcHRpb25zBA11c2VyQ2hvaWNlS2V5CQEgbWFrZVByb3Bvc2FsQ2hvaWNlQnlJZEFuZFVzZXJLZXkCBQpwcm9wb3NhbElkCAUBaQZjYWxsZXIEDHVzZXJWb3Rlc0tleQkBH21ha2VQcm9wb3NhbFZvdGVzQnlJZEFuZFVzZXJLZXkCBQpwcm9wb3NhbElkCAUBaQZjYWxsZXIEEnVzZXJSZWxlYXNlVGltZUtleQkBFm1ha2VVc2VyUmVsZWFzZVRpbWVLZXkBCAUBaQZjYWxsZXIEDW9sZFVzZXJDaG9pY2UJAJ8IAQUNdXNlckNob2ljZUtleQQMb2xkVXNlclZvdGVzCQCfCAEFDHVzZXJWb3Rlc0tleQQLcmVsZWFzZVRpbWUJAJYDAQkAzAgCBQNlbmQJAMwIAgkBDGdldEludE9yWmVybwEFEnVzZXJSZWxlYXNlVGltZUtleQUDbmlsBBB2b3Rlc0J5T3B0aW9uS2V5CQEhbWFrZVByb3Bvc2FsVm90ZXNCeUlkQW5kT3B0aW9uS2V5AgUKcHJvcG9zYWxJZAUGY2hvaWNlBA12b3Rlc0J5T3B0aW9uAwMDCQEJaXNEZWZpbmVkAQUNb2xkVXNlckNob2ljZQkBCWlzRGVmaW5lZAEFDG9sZFVzZXJWb3RlcwcJAAACCQEFdmFsdWUBBQ1vbGRVc2VyQ2hvaWNlBQZjaG9pY2UHCQBlAgkAZAIJAQxnZXRJbnRPclplcm8BBRB2b3Rlc0J5T3B0aW9uS2V5BQl1c2VyVm90ZXMJAQV2YWx1ZQEFDG9sZFVzZXJWb3RlcwkAZAIJAQxnZXRJbnRPclplcm8BBRB2b3Rlc0J5T3B0aW9uS2V5BQl1c2VyVm90ZXMEGG9wdGlvbmFsVm90ZXNCeU9wdGlvbk9sZAMDAwkBASEBCQEJaXNEZWZpbmVkAQUNb2xkVXNlckNob2ljZQYJAQEhAQkBCWlzRGVmaW5lZAEFDG9sZFVzZXJWb3RlcwYJAAACBQ1vbGRVc2VyQ2hvaWNlBQZjaG9pY2UFA25pbAQTb2xkVm90ZXNCeU9wdGlvbktleQkBIW1ha2VQcm9wb3NhbFZvdGVzQnlJZEFuZE9wdGlvbktleQIFCnByb3Bvc2FsSWQJAQV2YWx1ZQEFDW9sZFVzZXJDaG9pY2UJAMwIAgkBDEludGVnZXJFbnRyeQIFE29sZFZvdGVzQnlPcHRpb25LZXkJAGUCCQEMZ2V0SW50T3JaZXJvAQUTb2xkVm90ZXNCeU9wdGlvbktleQkBBXZhbHVlAQUMb2xkVXNlclZvdGVzBQNuaWwJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUNdXNlckNob2ljZUtleQUGY2hvaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQx1c2VyVm90ZXNLZXkFCXVzZXJWb3RlcwkAzAgCCQEMSW50ZWdlckVudHJ5AgUSdXNlclJlbGVhc2VUaW1lS2V5BQtyZWxlYXNlVGltZQkAzAgCCQEMSW50ZWdlckVudHJ5AgUQdm90ZXNCeU9wdGlvbktleQUNdm90ZXNCeU9wdGlvbgUDbmlsBRhvcHRpb25hbFZvdGVzQnlPcHRpb25PbGQBaQEId2l0aGRyYXcAAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwkAAgECDUFjY2VzcyBkZW5pZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAhdQYXltZW50cyBhcmUgcHJvaGliaXRlZAQOdXNlckRlcG9zaXRLZXkJARJtYWtlVXNlckRlcG9zaXRLZXkBCAUBaQZjYWxsZXIEC3VzZXJEZXBvc2l0CQEMZ2V0SW50T3JGYWlsAQUOdXNlckRlcG9zaXRLZXkECXRpbWVzdGFtcAgJAQV2YWx1ZQEJAO0HAQUGaGVpZ2h0CXRpbWVzdGFtcAQOcmVsZWFzZVRpbWVLZXkJARZtYWtlVXNlclJlbGVhc2VUaW1lS2V5AQgFAWkGY2FsbGVyBAtyZWxlYXNlVGltZQkBDGdldEludE9yWmVybwEFDnJlbGVhc2VUaW1lS2V5AwkAZwIFC3JlbGVhc2VUaW1lBQl0aW1lc3RhbXAJAAIBCQCsAgICO1lvdXIgc05TQlQgYXJlIHRha2luZyBwYXJ0IGluIHZvdGluZywgY2Fubm90IHVuc3Rha2UgdW50aWwgCQCkAwEFC3JlbGVhc2VUaW1lCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgULdXNlckRlcG9zaXQFB3Nuc2J0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQUOdXNlckRlcG9zaXRLZXkFA25pbAD4J1Ey", "chainId": 87, "height": 3525217, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: B6z98D11MhYGazc2jP6AP7gnourEQEBGWusbn3MvxhBN Next: none Diff:
OldNewDifferences
118118 let numOptions = size(availableOptions)
119119 if ((1 >= numOptions))
120120 then throw("Too few choices to vote")
121- else if ((choice >= numOptions))
122- then throw(("Unknown choice! Must be 0.." + toString((numOptions - 1))))
121+ else if ((choice > numOptions))
122+ then throw(("Unknown choice! Must be 0.." + toString(numOptions)))
123123 else {
124124 let userChoiceKey = makeProposalChoiceByIdAndUserKey(proposalId, i.caller)
125125 let userVotesKey = makeProposalVotesByIdAndUserKey(proposalId, i.caller)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let LISTSEP = ":"
77
88 let govIdxProposalTxId = 1
99
1010 let govIdxType = 2
1111
1212 let govIdxAuthor = 3
1313
1414 let govIdxUrl = 4
1515
1616 let govIdxTitle = 5
1717
1818 let govIdxCreationTime = 6
1919
2020 let govIdxStart = 7
2121
2222 let govIdxEnd = 8
2323
2424 let govIdxTxIds = 9
2525
2626 let govIdxQuorum = 10
2727
2828 let govIdxOptions = 11
2929
3030 let govStatusIdxIsValid = 1
3131
3232 let govStatusIdxWinOpt = 2
3333
3434 let govStatusIdxWinVotes = 3
3535
3636 let govStatusIdxTotalVotes = 4
3737
3838 let govStatusIdxScApplied = 5
3939
4040 let govStatusIdxScTime = 6
4141
4242 let govStatusIdxIsCanceled = 7
4343
4444 let snsbtId = base58'8wUmN9Y15f3JR4KZfE81XLXpkdgwnqoBNG6NmocZpKQx'
4545
4646 let gnsbtGovernanceAddress = Address(base58'3PMoqtw9NCk1JDrNq24Pji6xqtuG3PYRy8m')
4747
4848 func getIntOrZero (key) = valueOrElse(getInteger(key), 0)
4949
5050
5151 func getIntOrFail (key) = valueOrErrorMessage(getInteger(key), (("Key '" + key) + "' is not exist"))
5252
5353
5454 func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), (("Key '" + key) + "' is not exist"))
5555
5656
5757 func makeProposalStatusDataByIdKey (proposalId) = makeString(["%s%d", "proposalStatusData", toString(proposalId)], SEP)
5858
5959
6060 func makeProposalDataByIdKey (proposalId) = makeString(["%s%d", "proposalData", toString(proposalId)], SEP)
6161
6262
6363 func makeUserDepositKey (userAddress) = makeString(["%s%s", "deposit", toString(userAddress)], SEP)
6464
6565
6666 func makeProposalVotesByIdAndUserKey (proposalId,userAddress) = makeString(["%s%d%s", "votesByUser", toString(proposalId), toString(userAddress)], SEP)
6767
6868
6969 func makeProposalChoiceByIdAndUserKey (proposalId,userAddress) = makeString(["%s%d%s", "optionByUser", toString(proposalId), toString(userAddress)], SEP)
7070
7171
7272 func makeProposalVotesByIdAndOptionKey (proposalId,option) = makeString(["%s%d%d", "votesByOption", toString(proposalId), toString(option)], SEP)
7373
7474
7575 func makeUserReleaseTimeKey (userAddress) = makeString(["%s%s", "releaseTime", toString(userAddress)], SEP)
7676
7777
7878 @Callable(i)
7979 func deposit () = {
8080 let payment = value(i.payments[0])
8181 if ((i.caller == this))
8282 then throw("Access denied")
8383 else if ((size(i.payments) != 1))
8484 then throw("Only one sNSBT payment is allowed")
8585 else if ((payment.assetId != snsbtId))
8686 then throw("Only sNSBT allowed")
8787 else {
8888 let userDepositKey = makeUserDepositKey(i.caller)
8989 let oldUserDeposit = getIntOrZero(userDepositKey)
9090 let newUserDeposit = (oldUserDeposit + payment.amount)
9191 [IntegerEntry(userDepositKey, newUserDeposit)]
9292 }
9393 }
9494
9595
9696
9797 @Callable(i)
9898 func castVote (proposalId,choice) = if ((i.caller == this))
9999 then throw("Access denied")
100100 else if ((size(i.payments) != 0))
101101 then throw("Payments are prohibited")
102102 else {
103103 let userVotes = getIntOrFail(makeUserDepositKey(i.caller))
104104 let dynamicData = split(getStringOrFail(gnsbtGovernanceAddress, makeProposalStatusDataByIdKey(proposalId)), SEP)
105105 if ((dynamicData[govStatusIdxIsCanceled] == "true"))
106106 then throw("Voting is canceled by team")
107107 else {
108108 let propData = split(getStringOrFail(gnsbtGovernanceAddress, makeProposalDataByIdKey(proposalId)), SEP)
109109 let start = parseIntValue(propData[govIdxStart])
110110 let end = parseIntValue(propData[govIdxEnd])
111111 let now = lastBlock.timestamp
112112 if ((start > now))
113113 then throw("Voting not started yet")
114114 else if ((now >= end))
115115 then throw("Voting already finished")
116116 else {
117117 let availableOptions = split(propData[govIdxOptions], LISTSEP)
118118 let numOptions = size(availableOptions)
119119 if ((1 >= numOptions))
120120 then throw("Too few choices to vote")
121- else if ((choice >= numOptions))
122- then throw(("Unknown choice! Must be 0.." + toString((numOptions - 1))))
121+ else if ((choice > numOptions))
122+ then throw(("Unknown choice! Must be 0.." + toString(numOptions)))
123123 else {
124124 let userChoiceKey = makeProposalChoiceByIdAndUserKey(proposalId, i.caller)
125125 let userVotesKey = makeProposalVotesByIdAndUserKey(proposalId, i.caller)
126126 let userReleaseTimeKey = makeUserReleaseTimeKey(i.caller)
127127 let oldUserChoice = getInteger(userChoiceKey)
128128 let oldUserVotes = getInteger(userVotesKey)
129129 let releaseTime = max([end, getIntOrZero(userReleaseTimeKey)])
130130 let votesByOptionKey = makeProposalVotesByIdAndOptionKey(proposalId, choice)
131131 let votesByOption = if (if (if (isDefined(oldUserChoice))
132132 then isDefined(oldUserVotes)
133133 else false)
134134 then (value(oldUserChoice) == choice)
135135 else false)
136136 then ((getIntOrZero(votesByOptionKey) + userVotes) - value(oldUserVotes))
137137 else (getIntOrZero(votesByOptionKey) + userVotes)
138138 let optionalVotesByOptionOld = if (if (if (!(isDefined(oldUserChoice)))
139139 then true
140140 else !(isDefined(oldUserVotes)))
141141 then true
142142 else (oldUserChoice == choice))
143143 then nil
144144 else {
145145 let oldVotesByOptionKey = makeProposalVotesByIdAndOptionKey(proposalId, value(oldUserChoice))
146146 [IntegerEntry(oldVotesByOptionKey, (getIntOrZero(oldVotesByOptionKey) - value(oldUserVotes)))]
147147 }
148148 ([IntegerEntry(userChoiceKey, choice), IntegerEntry(userVotesKey, userVotes), IntegerEntry(userReleaseTimeKey, releaseTime), IntegerEntry(votesByOptionKey, votesByOption)] ++ optionalVotesByOptionOld)
149149 }
150150 }
151151 }
152152 }
153153
154154
155155
156156 @Callable(i)
157157 func withdraw () = if ((i.caller == this))
158158 then throw("Access denied")
159159 else if ((size(i.payments) != 0))
160160 then throw("Payments are prohibited")
161161 else {
162162 let userDepositKey = makeUserDepositKey(i.caller)
163163 let userDeposit = getIntOrFail(userDepositKey)
164164 let timestamp = value(blockInfoByHeight(height)).timestamp
165165 let releaseTimeKey = makeUserReleaseTimeKey(i.caller)
166166 let releaseTime = getIntOrZero(releaseTimeKey)
167167 if ((releaseTime >= timestamp))
168168 then throw(("Your sNSBT are taking part in voting, cannot unstake until " + toString(releaseTime)))
169169 else [ScriptTransfer(i.caller, userDeposit, snsbtId), DeleteEntry(userDepositKey)]
170170 }
171171
172172

github/deemru/w8io/3ef1775 
36.16 ms