2022.04.12 16:53 [3070765] smart account 3PKNPHY8VX4XnrrvQ6ery7VqFtmmisD4aUX > SELF 0.00000000 Waves

{ "type": 13, "id": "g1PjQNjoxpnFy7y24ceNJ5QQYFmjegA33ZcsnK452bG", "fee": 1000000, "feeAssetId": null, "timestamp": 1649771652555, "version": 1, "sender": "3PKNPHY8VX4XnrrvQ6ery7VqFtmmisD4aUX", "senderPublicKey": "HAPfoagGYsU8zKTqRhYq6ouE8GZ9TERrtmnCaxdHaf1H", "proofs": [ "5vG256UY3gwhTshEQcuHXgZi8nhD25ZS2DdHFdUxyLbcB1BkZPHZ2NoTHgeLmAoz8p3Z2XzpNPuD41GiZSez6okP" ], "script": "base64:AAIFAAAAAAAAACAIAhIDCgEIEgMKAQgSAwoBCBIDCgEIEgMKAQgSAwoBCAAAACoBAAAAB3Rocm93SWYAAAACAAAACWNvbmRpdGlvbgAAAAVlcnJvcgMFAAAACWNvbmRpdGlvbgkAAAIAAAABBQAAAAVlcnJvcgYBAAAACHdyaXRlSW50AAAAAgAAAANrZXkAAAAFdmFsdWUDCQAAZgAAAAIAAAAAAAAAAAAFAAAABXZhbHVlCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAF3dyaXRpbmcgbmVnYXRpdmUgdmFsdWUgCQABpAAAAAEFAAAABXZhbHVlAgAAAAkgZm9yIGtleSAFAAAAA2tleQkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAA2tleQUAAAAFdmFsdWUBAAAAEHdyaXRlQ29uc3RTdHJpbmcAAAACAAAAA2tleQAAAAV2YWx1ZQMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAQdAAAAAgUAAAAEdGhpcwUAAAADa2V5CQEAAAALU3RyaW5nRW50cnkAAAACBQAAAANrZXkFAAAABXZhbHVlCQAAAgAAAAEJAAEsAAAAAgIAAAAVYWxyZWFkeSBpbml0aWFsaXplZDogBQAAAANrZXkBAAAADXdyaXRlQ29uc3RJbnQAAAACAAAAA2tleQAAAAV2YWx1ZQMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEJAAQaAAAAAgUAAAAEdGhpcwUAAAADa2V5CQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAADa2V5BQAAAAV2YWx1ZQkAAAIAAAABCQABLAAAAAICAAAAEGFscmVhZHkgZXhpc3RzOiAFAAAAA2tleQEAAAAIY2hhbmdlQnkAAAACAAAAA2tleQAAAAV2YWx1ZQkBAAAACHdyaXRlSW50AAAAAgUAAAADa2V5CQAAZAAAAAIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAADa2V5AAAAAAAAAAAABQAAAAV2YWx1ZQEAAAAFYXNJbnQAAAABAAAABXZhbHVlBAAAAAckbWF0Y2gwBQAAAAV2YWx1ZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAANpbnQFAAAAByRtYXRjaDAFAAAAA2ludAkAAAIAAAABAgAAABl3cm9uZyB0eXBlLCBleHBlY3RlZDogSW50AAAAABJjb25maWdBZGRyZXNzU3RvcmUCAAAADWNvbmZpZ0FkZHJlc3MAAAAADWNvbmZpZ0FkZHJlc3MJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAASY29uZmlnQWRkcmVzc1N0b3JlAgAAABh2b3Rpbmc6IG5vIGNvbmZpZ0FkZHJlc3MCAAAAFmludmFsaWQgY29uZmlnIGFkZHJlc3MAAAAAEm1heWJlT3JhY2xlQWRkcmVzcwQAAAAHJG1hdGNoMAkABB0AAAACBQAAAA1jb25maWdBZGRyZXNzAgAAAA5vcmFjbGVfYWRkcmVzcwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFzBQAAAAckbWF0Y2gwCQAEJgAAAAEFAAAAAXMFAAAABHVuaXQAAAAABkhFSUdIVAUAAAAGaGVpZ2h0AAAAAARCQVNFAAAAAAAAAAPoAQAAAAlvcEFsbG93ZWQAAAABAAAAAm9wBAAAAANhaWQCAAAABnZvdGluZwQAAAAHJG1hdGNoMAkAA/wAAAAEBQAAAA1jb25maWdBZGRyZXNzAgAAAAlvcEFsbG93ZWQJAARMAAAAAgUAAAADYWlkCQAETAAAAAIFAAAAAm9wBQAAAANuaWwFAAAAA25pbAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAHQm9vbGVhbgQAAAABYgUAAAAHJG1hdGNoMAMFAAAAAWIGCQAAAgAAAAECAAAAC25vdCBhbGxvd2VkCQAAAgAAAAECAAAAIW9wQWxsb3dlZDogdW5leHBlY3RlZCByZXN1bHQgdHlwZQAAAAAOZ1ZpcmVzQ29udHJhY3QJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABCYAAAABCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAANY29uZmlnQWRkcmVzcwIAAAASZGl2aWRlbmRzX2NvbnRyYWN0AgAAABVubyBkaXZpZGVuZHNfY29udHJhY3QCAAAAGmludmFsaWQgZGl2aWRlbmRzX2NvbnRyYWN0AQAAABNwcm9wb3NhbEhlaWdodFN0b3JlAAAAAQAAAAJpZAkAASwAAAACAgAAABBwcm9wb3NhbF9oZWlnaHRfBQAAAAJpZAEAAAAYcHJvcG9zYWxWb3RpbmdTdGFydFN0b3JlAAAAAQAAAAJpZAkAASwAAAACAgAAABVwcm9wb3NhbF92b3RpbmdzdGFydF8FAAAAAmlkAQAAABdwcm9wb3NhbEFwcGx5U3RhcnRTdG9yZQAAAAEAAAACaWQJAAEsAAAAAgIAAAAUcHJvcG9zYWxfYXBwbHlzdGFydF8FAAAAAmlkAQAAABZwcm9wb3NhbFZvdGluZ0VuZFN0b3JlAAAAAQAAAAJpZAkAASwAAAACAgAAABNwcm9wb3NhbF92b3RpbmdlbmRfBQAAAAJpZAEAAAAVcHJvcG9zYWxBcHBseUVuZFN0b3JlAAAAAQAAAAJpZAkAASwAAAACAgAAABJwcm9wb3NhbF9hcHBseWVuZF8FAAAAAmlkAQAAAA9wcm9wb3NhbEJ5U3RvcmUAAAABAAAAAmlkCQABLAAAAAICAAAADHByb3Bvc2FsX2J5XwUAAAACaWQBAAAAGHByb3Bvc2FsVG90YWxHVmlyZXNTdG9yZQAAAAEAAAACaWQJAAEsAAAAAgIAAAAQcHJvcG9zYWxfZ3ZpcmVzXwUAAAACaWQBAAAAFXByb3Bvc2FsVG90YWxZZXNTdG9yZQAAAAEAAAACaWQJAAEsAAAAAgIAAAANcHJvcG9zYWxfeWVzXwUAAAACaWQBAAAAFHByb3Bvc2FsVG90YWxOb1N0b3JlAAAAAQAAAAJpZAkAASwAAAACAgAAAAxwcm9wb3NhbF9ub18FAAAAAmlkAQAAABRwcm9wb3NhbFVzZXJZZXNTdG9yZQAAAAIAAAAEdXNlcgAAAAJpZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAASdXNlcl9wcm9wb3NhbF95ZXNfBQAAAAR1c2VyAgAAAAFfBQAAAAJpZAEAAAATcHJvcG9zYWxVc2VyTm9TdG9yZQAAAAIAAAAEdXNlcgAAAAJpZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAARdXNlcl9wcm9wb3NhbF9ub18FAAAABHVzZXICAAAAAV8FAAAAAmlkAQAAABp1c2VyTGFzdFByb3Bvc2VIZWlnaHRTdG9yZQAAAAEAAAAEdXNlcgkAASwAAAACAgAAABNwcm9wb3NlX2xhc3RoZWlnaHRfBQAAAAR1c2VyAQAAAAd1c2VyWWVzAAAAAgAAAAR1c2VyAAAAAmlkCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAABRwcm9wb3NhbFVzZXJZZXNTdG9yZQAAAAIFAAAABHVzZXIFAAAAAmlkAAAAAAAAAAAAAQAAAAZ1c2VyTm8AAAACAAAABHVzZXIAAAACaWQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAE3Byb3Bvc2FsVXNlck5vU3RvcmUAAAACBQAAAAR1c2VyBQAAAAJpZAAAAAAAAAAAAAEAAAAVdXNlckxhc3RQcm9wb3NlSGVpZ2h0AAAAAQAAAAR1c2VyCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAABp1c2VyTGFzdFByb3Bvc2VIZWlnaHRTdG9yZQAAAAEFAAAABHVzZXIA//////////8AAAAAEHVzZXJQcm9wb3NlRGVsYXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzAgAAABJ1c2VyX3Byb3Bvc2VfZGVsYXkCAAAAIXVzZXJfcHJvcG9zZV9kZWxheSBpcyBub3QgZGVmaW5lZAAAAAALcXVvcnVtUmF0aW8JAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzAgAAABVwcm9wb3NhbF9xdW9ydW1fcmF0aW8CAAAAInByb3Bvc2FsUXVvcnVtUmF0aW8gaXMgbm90IGRlZmluZWQAAAAAC3Bhc3NlZFJhdGlvCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANY29uZmlnQWRkcmVzcwIAAAAVcHJvcG9zYWxfcGFzc2VkX3JhdGlvAgAAACVwcm9wb3NhbFRocmVzaG9sZFJhdGlvIGlzIG5vdCBkZWZpbmVkAAAAABNwcm9wb3NhbE1pblJlcXVpcmVkCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANY29uZmlnQWRkcmVzcwIAAAAbcHJvcG9zYWxfbWluX3ZpcmVzX3JlcXVpcmVkAgAAABttaW4gcmVxdWlyZWQgaXMgbm90IGRlZmluZWQAAAAAEXZvdGluZ1N0YXJ0T2Zmc2V0CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANY29uZmlnQWRkcmVzcwIAAAAbcHJvcG9zYWxfdm90aW5nc3RhcnRfb2Zmc2V0AgAAACpwcm9wb3NhbF92b3RpbmdzdGFydF9vZmZzZXQgaXMgbm90IGRlZmluZWQAAAAAD3ZvdGluZ0VuZE9mZnNldAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAADWNvbmZpZ0FkZHJlc3MCAAAAGXByb3Bvc2FsX3ZvdGluZ2VuZF9vZmZzZXQCAAAAKHByb3Bvc2FsX3ZvdGluZ2VuZF9vZmZzZXQgaXMgbm90IGRlZmluZWQAAAAAEGFwcGx5U3RhcnRPZmZzZXQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzAgAAABpwcm9wb3NhbF9hcHBseXN0YXJ0X29mZnNldAIAAAApcHJvcG9zYWxfYXBwbHlzdGFydF9vZmZzZXQgaXMgbm90IGRlZmluZWQAAAAADmFwcGx5RW5kT2Zmc2V0CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANY29uZmlnQWRkcmVzcwIAAAAYcHJvcG9zYWxfYXBwbHllbmRfb2Zmc2V0AgAAACdwcm9wb3NhbF9hcHBseWVuZF9vZmZzZXQgaXMgbm90IGRlZmluZWQBAAAACnVzZXJHdmlyZXMAAAABAAAABHVzZXIJAQAAAAVhc0ludAAAAAEJAAP8AAAABAUAAAAOZ1ZpcmVzQ29udHJhY3QCAAAACXVzZXJQb3dlcgkABEwAAAACBQAAAAR1c2VyBQAAAANuaWwFAAAAA25pbAEAAAAOcHJvcG9zYWxFeGlzdHMAAAABAAAABHR4SWQEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAEdGhpcwkBAAAAE3Byb3Bvc2FsSGVpZ2h0U3RvcmUAAAABBQAAAAR0eElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAABXN0YXJ0BQAAAAckbWF0Y2gwBgcBAAAAEHByb3Bvc2FsT25Wb3RpbmcAAAABAAAABHR4SWQEAAAAC25vbkV4aXN0RXJyAgAAABZwcm9wb3NhbCBkb2Vzbid0IGV4aXN0AwkBAAAAASEAAAABCQEAAAAOcHJvcG9zYWxFeGlzdHMAAAABBQAAAAR0eElkCQAAAgAAAAEFAAAAC25vbkV4aXN0RXJyBAAAAAt2b3RpbmdTdGFydAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAABhwcm9wb3NhbFZvdGluZ1N0YXJ0U3RvcmUAAAABBQAAAAR0eElkBQAAAAtub25FeGlzdEVycgQAAAAJdm90aW5nRW5kCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAFnByb3Bvc2FsVm90aW5nRW5kU3RvcmUAAAABBQAAAAR0eElkBQAAAAtub25FeGlzdEVycgMJAABmAAAAAgUAAAALdm90aW5nU3RhcnQFAAAABkhFSUdIVAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAE52b3Rpbmcgbm90IHN0YXJ0ZWQgeWV0LCBkaXNjdXNzaW9uIGlzIGluIHByb2dyZXNzLCB2b3Rpbmcgd2lsbCBzdGFydCBhdCBibG9jayAJAAGkAAAAAQUAAAALdm90aW5nU3RhcnQCAAAACywgbm93IGl0J3MgCQABpAAAAAEFAAAABkhFSUdIVAMJAABmAAAAAgUAAAAGSEVJR0hUBQAAAAl2b3RpbmdFbmQJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAWdm90aW5nIGVuZGVkIGF0IGJsb2NrIAkAAaQAAAABBQAAAAl2b3RpbmdFbmQCAAAACywgbm93IGl0J3MgCQABpAAAAAEFAAAABkhFSUdIVAYBAAAAFHByb3Bvc2FsQmVmb3JlVm90aW5nAAAAAQAAAAR0eElkBAAAAAtub25FeGlzdEVycgIAAAAWcHJvcG9zYWwgZG9lc24ndCBleGlzdAMJAQAAAAEhAAAAAQkBAAAADnByb3Bvc2FsRXhpc3RzAAAAAQUAAAAEdHhJZAkAAAIAAAABBQAAAAtub25FeGlzdEVycgQAAAALdm90aW5nU3RhcnQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAYcHJvcG9zYWxWb3RpbmdTdGFydFN0b3JlAAAAAQUAAAAEdHhJZAUAAAALbm9uRXhpc3RFcnIDCQAAZwAAAAIFAAAABkhFSUdIVAUAAAALdm90aW5nU3RhcnQJAAACAAAAAQIAAAAgdm90aW5nIHN0YXJ0IGlzIGFscmVhZHkgaGFwcGVuZWQGAQAAAAt0b3RhbEdWaXJlcwAAAAAJAQAAAAVhc0ludAAAAAEJAAP8AAAABAUAAAAOZ1ZpcmVzQ29udHJhY3QCAAAAC3RvdGFsR3ZpcmVzBQAAAANuaWwFAAAAA25pbAEAAAAOYWR2aXNlUHJvcG9zYWwAAAABAAAABHR4SWQEAAAADnByb3Bvc2FsSGVpZ2h0CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAE3Byb3Bvc2FsSGVpZ2h0U3RvcmUAAAABBQAAAAR0eElkAgAAAAtubyBwcm9wb3NhbAQAAAALdm90aW5nU3RhcnQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAYcHJvcG9zYWxWb3RpbmdTdGFydFN0b3JlAAAAAQUAAAAEdHhJZAIAAAALbm8gcHJvcG9zYWwEAAAACXZvdGluZ0VuZAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAABZwcm9wb3NhbFZvdGluZ0VuZFN0b3JlAAAAAQUAAAAEdHhJZAIAAAALbm8gcHJvcG9zYWwEAAAACmFwcGx5U3RhcnQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAXcHJvcG9zYWxBcHBseVN0YXJ0U3RvcmUAAAABBQAAAAR0eElkAgAAAAtubyBwcm9wb3NhbAQAAAAIYXBwbHlF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cnkAAAABCQEAAAAYcHJvcG9zYWxWb3RpbmdTdGFydFN0b3JlAAAAAQUAAAAEdHhJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAWcHJvcG9zYWxWb3RpbmdFbmRTdG9yZQAAAAEFAAAABHR4SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAF3Byb3Bvc2FsQXBwbHlTdGFydFN0b3JlAAAAAQUAAAAEdHhJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAVcHJvcG9zYWxBcHBseUVuZFN0b3JlAAAAAQUAAAAEdHhJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAPcHJvcG9zYWxCeVN0b3JlAAAAAQUAAAAEdHhJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAYcHJvcG9zYWxUb3RhbEdWaXJlc1N0b3JlAAAAAQUAAAAEdHhJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAVcHJvcG9zYWxUb3RhbFllc1N0b3JlAAAAAQUAAAAEdHhJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAUcHJvcG9zYWxUb3RhbE5vU3RvcmUAAAABBQAAAAR0eElkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAABRwcm9wb3NhbFVzZXJZZXNTdG9yZQAAAAIFAAAABHVzZXIFAAAABHR4SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAE3Byb3Bvc2FsVXNlck5vU3RvcmUAAAACBQAAAAR1c2VyBQAAAAR0eElkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAABp1c2VyTGFzdFByb3Bvc2VIZWlnaHRTdG9yZQAAAAEFAAAABHVzZXIFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAAATtm88Q==", "chainId": 87, "height": 3070765, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DBrtTa69NH8c6ovJUXiXKxzgM6Lh4jn4PyHE1wBavGiZ Next: 5EWEVxciYqifAcuXViqRyYJXKebiei7jj27nNazVGyjt Diff:
OldNewDifferences
150150 }
151151
152152
153+func proposalBeforeVoting (txId) = {
154+ let nonExistErr = "proposal doesn't exist"
155+ if (!(proposalExists(txId)))
156+ then throw(nonExistErr)
157+ else {
158+ let votingStart = valueOrErrorMessage(getInteger(this, proposalVotingStartStore(txId)), nonExistErr)
159+ if ((HEIGHT >= votingStart))
160+ then throw("voting start is already happened")
161+ else true
162+ }
163+ }
164+
165+
153166 func totalGVires () = asInt(invoke(gViresContract, "totalGvires", nil, nil))
154167
155168
281294 }
282295
283296
297+
298+@Callable(i)
299+func retractProposal (txId) = {
300+ let checks = if (opAllowed("governance_retract_proposal_tx"))
301+ then proposalBeforeVoting(txId)
302+ else false
303+ if ((checks == checks))
304+ then {
305+ let by = valueOrErrorMessage(getString(this, proposalByStore(txId)), "proposal doesn't exist")
306+ let user = toString(i.caller)
307+ if ((by != user))
308+ then throw("only owner can retract proposal")
309+ else [DeleteEntry(proposalHeightStore(txId)), DeleteEntry(proposalVotingStartStore(txId)), DeleteEntry(proposalVotingEndStore(txId)), DeleteEntry(proposalApplyStartStore(txId)), DeleteEntry(proposalApplyEndStore(txId)), DeleteEntry(proposalByStore(txId)), DeleteEntry(proposalTotalGViresStore(txId)), DeleteEntry(proposalTotalYesStore(txId)), DeleteEntry(proposalTotalNoStore(txId)), DeleteEntry(proposalUserYesStore(user, txId)), DeleteEntry(proposalUserNoStore(user, txId)), DeleteEntry(userLastProposeHeightStore(user))]
310+ }
311+ else throw("Strict value is not equal to itself.")
312+ }
313+
314+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func throwIf (condition,error) = if (condition)
55 then throw(error)
66 else true
77
88
99 func writeInt (key,value) = if ((0 > value))
1010 then throw(((("writing negative value " + toString(value)) + " for key ") + key))
1111 else IntegerEntry(key, value)
1212
1313
1414 func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
1515 then StringEntry(key, value)
1616 else throw(("already initialized: " + key))
1717
1818
1919 func writeConstInt (key,value) = if (!(isDefined(getInteger(this, key))))
2020 then IntegerEntry(key, value)
2121 else throw(("already exists: " + key))
2222
2323
2424 func changeBy (key,value) = writeInt(key, (valueOrElse(getInteger(this, key), 0) + value))
2525
2626
2727 func asInt (value) = match value {
2828 case int: Int =>
2929 int
3030 case _ =>
3131 throw("wrong type, expected: Int")
3232 }
3333
3434
3535 let configAddressStore = "configAddress"
3636
3737 let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configAddressStore), "voting: no configAddress")), "invalid config address")
3838
3939 let maybeOracleAddress = match getString(configAddress, "oracle_address") {
4040 case s: String =>
4141 addressFromString(s)
4242 case _ =>
4343 unit
4444 }
4545
4646 let HEIGHT = height
4747
4848 let BASE = 1000
4949
5050 func opAllowed (op) = {
5151 let aid = "voting"
5252 match invoke(configAddress, "opAllowed", [aid, op], nil) {
5353 case b: Boolean =>
5454 if (b)
5555 then true
5656 else throw("not allowed")
5757 case _ =>
5858 throw("opAllowed: unexpected result type")
5959 }
6060 }
6161
6262
6363 let gViresContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "dividends_contract"), "no dividends_contract")), "invalid dividends_contract")
6464
6565 func proposalHeightStore (id) = ("proposal_height_" + id)
6666
6767
6868 func proposalVotingStartStore (id) = ("proposal_votingstart_" + id)
6969
7070
7171 func proposalApplyStartStore (id) = ("proposal_applystart_" + id)
7272
7373
7474 func proposalVotingEndStore (id) = ("proposal_votingend_" + id)
7575
7676
7777 func proposalApplyEndStore (id) = ("proposal_applyend_" + id)
7878
7979
8080 func proposalByStore (id) = ("proposal_by_" + id)
8181
8282
8383 func proposalTotalGViresStore (id) = ("proposal_gvires_" + id)
8484
8585
8686 func proposalTotalYesStore (id) = ("proposal_yes_" + id)
8787
8888
8989 func proposalTotalNoStore (id) = ("proposal_no_" + id)
9090
9191
9292 func proposalUserYesStore (user,id) = ((("user_proposal_yes_" + user) + "_") + id)
9393
9494
9595 func proposalUserNoStore (user,id) = ((("user_proposal_no_" + user) + "_") + id)
9696
9797
9898 func userLastProposeHeightStore (user) = ("propose_lastheight_" + user)
9999
100100
101101 func userYes (user,id) = valueOrElse(getInteger(this, proposalUserYesStore(user, id)), 0)
102102
103103
104104 func userNo (user,id) = valueOrElse(getInteger(this, proposalUserNoStore(user, id)), 0)
105105
106106
107107 func userLastProposeHeight (user) = valueOrElse(getInteger(this, userLastProposeHeightStore(user)), -1)
108108
109109
110110 let userProposeDelay = valueOrErrorMessage(getInteger(configAddress, "user_propose_delay"), "user_propose_delay is not defined")
111111
112112 let quorumRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_quorum_ratio"), "proposalQuorumRatio is not defined")
113113
114114 let passedRatio = valueOrErrorMessage(getInteger(configAddress, "proposal_passed_ratio"), "proposalThresholdRatio is not defined")
115115
116116 let proposalMinRequired = valueOrErrorMessage(getInteger(configAddress, "proposal_min_vires_required"), "min required is not defined")
117117
118118 let votingStartOffset = valueOrErrorMessage(getInteger(configAddress, "proposal_votingstart_offset"), "proposal_votingstart_offset is not defined")
119119
120120 let votingEndOffset = valueOrErrorMessage(getInteger(configAddress, "proposal_votingend_offset"), "proposal_votingend_offset is not defined")
121121
122122 let applyStartOffset = valueOrErrorMessage(getInteger(configAddress, "proposal_applystart_offset"), "proposal_applystart_offset is not defined")
123123
124124 let applyEndOffset = valueOrErrorMessage(getInteger(configAddress, "proposal_applyend_offset"), "proposal_applyend_offset is not defined")
125125
126126 func userGvires (user) = asInt(invoke(gViresContract, "userPower", [user], nil))
127127
128128
129129 func proposalExists (txId) = match getInteger(this, proposalHeightStore(txId)) {
130130 case start: Int =>
131131 true
132132 case _ =>
133133 false
134134 }
135135
136136
137137 func proposalOnVoting (txId) = {
138138 let nonExistErr = "proposal doesn't exist"
139139 if (!(proposalExists(txId)))
140140 then throw(nonExistErr)
141141 else {
142142 let votingStart = valueOrErrorMessage(getInteger(this, proposalVotingStartStore(txId)), nonExistErr)
143143 let votingEnd = valueOrErrorMessage(getInteger(this, proposalVotingEndStore(txId)), nonExistErr)
144144 if ((votingStart > HEIGHT))
145145 then throw(((("voting not started yet, discussion is in progress, voting will start at block " + toString(votingStart)) + ", now it's ") + toString(HEIGHT)))
146146 else if ((HEIGHT > votingEnd))
147147 then throw(((("voting ended at block " + toString(votingEnd)) + ", now it's ") + toString(HEIGHT)))
148148 else true
149149 }
150150 }
151151
152152
153+func proposalBeforeVoting (txId) = {
154+ let nonExistErr = "proposal doesn't exist"
155+ if (!(proposalExists(txId)))
156+ then throw(nonExistErr)
157+ else {
158+ let votingStart = valueOrErrorMessage(getInteger(this, proposalVotingStartStore(txId)), nonExistErr)
159+ if ((HEIGHT >= votingStart))
160+ then throw("voting start is already happened")
161+ else true
162+ }
163+ }
164+
165+
153166 func totalGVires () = asInt(invoke(gViresContract, "totalGvires", nil, nil))
154167
155168
156169 func adviseProposal (txId) = {
157170 let proposalHeight = valueOrErrorMessage(getInteger(this, proposalHeightStore(txId)), "no proposal")
158171 let votingStart = valueOrErrorMessage(getInteger(this, proposalVotingStartStore(txId)), "no proposal")
159172 let votingEnd = valueOrErrorMessage(getInteger(this, proposalVotingEndStore(txId)), "no proposal")
160173 let applyStart = valueOrErrorMessage(getInteger(this, proposalApplyStartStore(txId)), "no proposal")
161174 let applyEnd = valueOrErrorMessage(getInteger(this, proposalApplyEndStore(txId)), "no proposal")
162175 let votesYes = valueOrElse(getInteger(this, proposalTotalYesStore(txId)), 0)
163176 let votesNo = valueOrElse(getInteger(this, proposalTotalNoStore(txId)), 0)
164177 let totalGviresSnap = valueOrElse(getInteger(this, proposalTotalGViresStore(txId)), 0)
165178 let voteYes = votesYes
166179 let voteNo = votesNo
167180 let totalVotes = (voteYes + voteNo)
168181 let hasQuorum = if ((totalVotes > 0))
169182 then (((totalVotes * BASE) / totalGviresSnap) >= quorumRatio)
170183 else false
171184 let hasPassed = if ((totalVotes > 0))
172185 then (((voteYes * BASE) / totalVotes) >= passedRatio)
173186 else false
174187 let tooEarly = (applyStart >= HEIGHT)
175188 let tooLate = (HEIGHT >= applyEnd)
176189 let inBlockchainHeight = valueOrElse(transactionHeightById(fromBase58String(txId)), 0)
177190 let status = if ((votingStart > HEIGHT))
178191 then "discussion"
179192 else if ((votingEnd >= HEIGHT))
180193 then "voting"
181194 else if (!(hasQuorum))
182195 then "noQuorum"
183196 else if (!(hasPassed))
184197 then "votingFailed"
185198 else if (tooEarly)
186199 then "votingPassed"
187200 else if ((inBlockchainHeight > 0))
188201 then "inBlockchain"
189202 else if (!(tooLate))
190203 then "waitingForTx"
191204 else "failed"
192205 ((((((((((((((((((((((("proposal_id: " + txId) + ", proposal_status: ") + status) + ", proposal_by: ") + valueOrErrorMessage(getString(this, proposalByStore(txId)), "no proposal")) + ", proposal_height: ") + toString(proposalHeight)) + ", proposal_txheight: ") + toString(inBlockchainHeight)) + ", proposal_votingstart: ") + toString(votingStart)) + ", proposal_votingend: ") + toString(votingEnd)) + ", proposal_applystart: ") + toString(applyStart)) + ", proposal_applyend: ") + toString(applyEnd)) + ", proposal_gvires: ") + toString(totalGviresSnap)) + ", vote_yes: ") + toString(voteYes)) + ", vote_no: ") + toString(voteNo))
193206 }
194207
195208
196209 @Callable(i)
197210 func init (config) = [writeConstString(configAddressStore, config)]
198211
199212
200213
201214 @Callable(i)
202215 func propose (txId) = {
203216 let checks = opAllowed("governance_propose_tx")
204217 if ((checks == checks))
205218 then {
206219 let user = toString(i.caller)
207220 let gv = userGvires(user)
208221 if ((proposalMinRequired > gv))
209222 then throw((((("not enough gVires to make proposal." + " Minimum required = ") + toString(proposalMinRequired)) + ", actual: = ") + toString(gv)))
210223 else {
211224 let last = userLastProposeHeight(user)
212225 if (if ((last > -1))
213226 then ((last + userProposeDelay) > HEIGHT)
214227 else false)
215228 then throw(((("can't propose too often, last proroposal height: " + toString(last)) + ", blocks to wait: ") + toString(((last + userProposeDelay) - HEIGHT))))
216229 else [writeConstInt(proposalHeightStore(txId), HEIGHT), writeConstInt(proposalVotingStartStore(txId), (HEIGHT + votingStartOffset)), writeConstInt(proposalVotingEndStore(txId), (HEIGHT + votingEndOffset)), writeConstInt(proposalApplyStartStore(txId), (HEIGHT + applyStartOffset)), writeConstInt(proposalApplyEndStore(txId), (HEIGHT + applyEndOffset)), writeConstString(proposalByStore(txId), toString(i.caller)), writeInt(userLastProposeHeightStore(user), HEIGHT)]
217230 }
218231 }
219232 else throw("Strict value is not equal to itself.")
220233 }
221234
222235
223236
224237 @Callable(i)
225238 func voteYes (txId) = {
226239 let checks = if (opAllowed("governance_vote_tx"))
227240 then proposalOnVoting(txId)
228241 else false
229242 if ((checks == checks))
230243 then {
231244 let user = toString(i.caller)
232245 if ((userNo(user, txId) > 0))
233246 then throw("already voted against, please retract your vote first")
234247 else {
235248 let delta = (userGvires(user) - userYes(user, txId))
236249 let setGvires = IntegerEntry(proposalTotalGViresStore(txId), totalGVires())
237250 if ((0 >= delta))
238251 then [setGvires]
239252 else [setGvires, changeBy(proposalUserYesStore(user, txId), delta), changeBy(proposalTotalYesStore(txId), delta)]
240253 }
241254 }
242255 else throw("Strict value is not equal to itself.")
243256 }
244257
245258
246259
247260 @Callable(i)
248261 func voteNo (txId) = {
249262 let checks = if (opAllowed("governance_vote_tx"))
250263 then proposalOnVoting(txId)
251264 else false
252265 if ((checks == checks))
253266 then {
254267 let user = toString(i.caller)
255268 if ((userYes(user, txId) > 0))
256269 then throw("already voted for, please retract your vote first")
257270 else {
258271 let delta = (userGvires(user) - userNo(user, txId))
259272 let setGvires = IntegerEntry(proposalTotalGViresStore(txId), totalGVires())
260273 if ((0 >= delta))
261274 then [setGvires]
262275 else [setGvires, changeBy(proposalUserNoStore(user, txId), delta), changeBy(proposalTotalNoStore(txId), delta)]
263276 }
264277 }
265278 else throw("Strict value is not equal to itself.")
266279 }
267280
268281
269282
270283 @Callable(i)
271284 func retract (txId) = {
272285 let checks = if (opAllowed("governance_vote_tx"))
273286 then proposalOnVoting(txId)
274287 else false
275288 if ((checks == checks))
276289 then {
277290 let user = toString(i.caller)
278291 [changeBy(proposalTotalYesStore(txId), -(userYes(user, txId))), changeBy(proposalTotalNoStore(txId), -(userNo(user, txId))), DeleteEntry(proposalUserYesStore(user, txId)), DeleteEntry(proposalUserNoStore(user, txId))]
279292 }
280293 else throw("Strict value is not equal to itself.")
281294 }
282295
283296
297+
298+@Callable(i)
299+func retractProposal (txId) = {
300+ let checks = if (opAllowed("governance_retract_proposal_tx"))
301+ then proposalBeforeVoting(txId)
302+ else false
303+ if ((checks == checks))
304+ then {
305+ let by = valueOrErrorMessage(getString(this, proposalByStore(txId)), "proposal doesn't exist")
306+ let user = toString(i.caller)
307+ if ((by != user))
308+ then throw("only owner can retract proposal")
309+ else [DeleteEntry(proposalHeightStore(txId)), DeleteEntry(proposalVotingStartStore(txId)), DeleteEntry(proposalVotingEndStore(txId)), DeleteEntry(proposalApplyStartStore(txId)), DeleteEntry(proposalApplyEndStore(txId)), DeleteEntry(proposalByStore(txId)), DeleteEntry(proposalTotalGViresStore(txId)), DeleteEntry(proposalTotalYesStore(txId)), DeleteEntry(proposalTotalNoStore(txId)), DeleteEntry(proposalUserYesStore(user, txId)), DeleteEntry(proposalUserNoStore(user, txId)), DeleteEntry(userLastProposeHeightStore(user))]
310+ }
311+ else throw("Strict value is not equal to itself.")
312+ }
313+
314+

github/deemru/w8io/786bc32 
43.02 ms