tx · FqNwz1mj1AML4DvZfSpJWA4xnQEWALdVds2yUWkHQzKh

3PM6Wsfm2ePMqbY5PQXMSDVpYfYgzHPWRhQ:  -0.01500000 Waves

2023.04.11 17:23 [3595663] smart account 3PM6Wsfm2ePMqbY5PQXMSDVpYfYgzHPWRhQ > SELF 0.00000000 Waves

{ "type": 13, "id": "FqNwz1mj1AML4DvZfSpJWA4xnQEWALdVds2yUWkHQzKh", "fee": 1500000, "feeAssetId": null, "timestamp": 1681223028601, "version": 1, "sender": "3PM6Wsfm2ePMqbY5PQXMSDVpYfYgzHPWRhQ", "senderPublicKey": "Azj6CQbpigVMo3cysDxKDiqtXexMNjVzgdMaoeXeEmar", "proofs": [ "5WdRG3VvsBfZ1JNcWHTv6tyBMwvN7hRXeczGdQNRKKtpiSqn6qQLgkp32mR7vSnu1cMWSJ5bvwwCMct5hm4TLteA" ], "script": "base64:AAIFAAAAAAAAACEIAhIDCgEIEgQKAggIEgMKAQgSAwoBCBIDCgEIEgMKAQgAAAAsAQAAAAd0aHJvd0lmAAAAAgAAAAljb25kaXRpb24AAAAFZXJyb3IDBQAAAAljb25kaXRpb24JAAACAAAAAQUAAAAFZXJyb3IGAQAAAAh3cml0ZUludAAAAAIAAAADa2V5AAAABXZhbHVlAwkAAGYAAAACAAAAAAAAAAAABQAAAAV2YWx1ZQkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABd3cml0aW5nIG5lZ2F0aXZlIHZhbHVlIAkAAaQAAAABBQAAAAV2YWx1ZQIAAAAJIGZvciBrZXkgBQAAAANrZXkJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAANrZXkFAAAABXZhbHVlAQAAABB3cml0ZUNvbnN0U3RyaW5nAAAAAgAAAANrZXkAAAAFdmFsdWUDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAADa2V5BQAAAAV2YWx1ZQkAAAIAAAABCQABLAAAAAICAAAAFWFscmVhZHkgaW5pdGlhbGl6ZWQ6IAUAAAADa2V5AQAAAA13cml0ZUNvbnN0SW50AAAAAgAAAANrZXkAAAAFdmFsdWUDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAA2tleQUAAAAFdmFsdWUJAAACAAAAAQkAASwAAAACAgAAABBhbHJlYWR5IGV4aXN0czogBQAAAANrZXkBAAAACGNoYW5nZUJ5AAAAAgAAAANrZXkAAAAFdmFsdWUJAQAAAAh3cml0ZUludAAAAAIFAAAAA2tleQkAAGQAAAACCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQAAAAAAAAAAAAUAAAAFdmFsdWUBAAAABWFzSW50AAAAAQAAAAV2YWx1ZQQAAAAHJG1hdGNoMAUAAAAFdmFsdWUDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAADaW50BQAAAAckbWF0Y2gwBQAAAANpbnQJAAACAAAAAQIAAAAZd3JvbmcgdHlwZSwgZXhwZWN0ZWQ6IEludAAAAAASY29uZmlnQWRkcmVzc1N0b3JlAgAAAA1jb25maWdBZGRyZXNzAAAAAA1jb25maWdBZGRyZXNzCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQmAAAAAQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAEmNvbmZpZ0FkZHJlc3NTdG9yZQIAAAAYdm90aW5nOiBubyBjb25maWdBZGRyZXNzAgAAABZpbnZhbGlkIGNvbmZpZyBhZGRyZXNzAAAAABR2b3RpbmdSZXN1bHRDb250cmFjdAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAA1jb25maWdBZGRyZXNzAgAAABZjb250cmFjdF92b3RpbmdfcmVzdWx0AgAAABlubyBjb250cmFjdF92b3RpbmdfcmVzdWx0AgAAAB5pbnZhbGlkIGNvbnRyYWN0X3ZvdGluZ19yZXN1bHQAAAAABkhFSUdIVAUAAAAGaGVpZ2h0AQAAAAZhZHZpc2UAAAAACQABLAAAAAICAAAACGhlaWdodDogCQABpAAAAAEFAAAABkhFSUdIVAAAAAAEQkFTRQAAAAAAAAAD6AEAAAAJb3BBbGxvd2VkAAAAAQAAAAJvcAQAAAABYQkAA/wAAAAEBQAAAA1jb25maWdBZGRyZXNzAgAAAAlvcEFsbG93ZWQJAARMAAAAAgUAAAACb3AFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAFhBQAAAAFhBgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAAAD3N0YWtpbmdDb250cmFjdAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAA1jb25maWdBZGRyZXNzAgAAABBjb250cmFjdF9zdGFraW5nAgAAABNubyBzdGFraW5nX2NvbnRyYWN0AgAAABdpbnZhbGlkIHN0YWtpbmdDb250cmFjdAEAAAAUcHJvcG9zYWxBZGRyZXNzU3RvcmUAAAABAAAAAmlkCQABLAAAAAICAAAAEXByb3Bvc2FsX2FkZHJlc3NfBQAAAAJpZAEAAAATcHJvcG9zYWxIZWlnaHRTdG9yZQAAAAEAAAACaWQJAAEsAAAAAgIAAAAQcHJvcG9zYWxfaGVpZ2h0XwUAAAACaWQBAAAAGHByb3Bvc2FsVm90aW5nU3RhcnRTdG9yZQAAAAEAAAACaWQJAAEsAAAAAgIAAAAVcHJvcG9zYWxfdm90aW5nc3RhcnRfBQAAAAJpZAEAAAAWcHJvcG9zYWxWb3RpbmdFbmRTdG9yZQAAAAEAAAACaWQJAAEsAAAAAgIAAAATcHJvcG9zYWxfdm90aW5nZW5kXwUAAAACaWQBAAAAD3Byb3Bvc2FsQnlTdG9yZQAAAAEAAAACaWQJAAEsAAAAAgIAAAAMcHJvcG9zYWxfYnlfBQAAAAJpZAEAAAAXcHJvcG9zYWxUb3RhbFBvd2VyU3RvcmUAAAABAAAAAmlkCQABLAAAAAICAAAAD3Byb3Bvc2FsX3Bvd2VyXwUAAAACaWQBAAAAFXByb3Bvc2FsVG90YWxZZXNTdG9yZQAAAAEAAAACaWQJAAEsAAAAAgIAAAANcHJvcG9zYWxfeWVzXwUAAAACaWQBAAAAFHByb3Bvc2FsVG90YWxOb1N0b3JlAAAAAQAAAAJpZAkAASwAAAACAgAAAAxwcm9wb3NhbF9ub18FAAAAAmlkAQAAABRwcm9wb3NhbFVzZXJZZXNTdG9yZQAAAAIAAAAEdXNlcgAAAAJpZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAASdXNlcl9wcm9wb3NhbF95ZXNfBQAAAAR1c2VyAgAAAAFfBQAAAAJpZAEAAAATcHJvcG9zYWxVc2VyTm9TdG9yZQAAAAIAAAAEdXNlcgAAAAJpZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAARdXNlcl9wcm9wb3NhbF9ub18FAAAABHVzZXICAAAAAV8FAAAAAmlkAQAAABp1c2VyTGFzdFByb3Bvc2VIZWlnaHRTdG9yZQAAAAEAAAAEdXNlcgkAASwAAAACAgAAABNwcm9wb3NlX2xhc3RoZWlnaHRfBQAAAAR1c2VyAQAAAAd1c2VyWWVzAAAAAgAAAAR1c2VyAAAAAmlkCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAABRwcm9wb3NhbFVzZXJZZXNTdG9yZQAAAAIFAAAABHVzZXIFAAAAAmlkAAAAAAAAAAAAAQAAAAZ1c2VyTm8AAAACAAAABHVzZXIAAAACaWQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAE3Byb3Bvc2FsVXNlck5vU3RvcmUAAAACBQAAAAR1c2VyBQAAAAJpZAAAAAAAAAAAAAEAAAAVdXNlckxhc3RQcm9wb3NlSGVpZ2h0AAAAAQAAAAR1c2VyCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAQAAABp1c2VyTGFzdFByb3Bvc2VIZWlnaHRTdG9yZQAAAAEFAAAABHVzZXIA//////////8AAAAAC3RoaXNBZGRyZXNzCQAEJQAAAAEFAAAABHRoaXMAAAAAEHVzZXJQcm9wb3NlRGVsYXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzCQABLAAAAAIFAAAAC3RoaXNBZGRyZXNzAgAAABNfdXNlcl9wcm9wb3NlX2RlbGF5AgAAACF1c2VyX3Byb3Bvc2VfZGVsYXkgaXMgbm90IGRlZmluZWQAAAAAC3F1b3J1bVJhdGlvCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANY29uZmlnQWRkcmVzcwkAASwAAAACBQAAAAt0aGlzQWRkcmVzcwIAAAAWX3Byb3Bvc2FsX3F1b3J1bV9yYXRpbwIAAAAicHJvcG9zYWxRdW9ydW1SYXRpbyBpcyBub3QgZGVmaW5lZAAAAAALcGFzc2VkUmF0aW8JAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzCQABLAAAAAIFAAAAC3RoaXNBZGRyZXNzAgAAABZfcHJvcG9zYWxfcGFzc2VkX3JhdGlvAgAAACVwcm9wb3NhbFRocmVzaG9sZFJhdGlvIGlzIG5vdCBkZWZpbmVkAAAAABNwcm9wb3NhbE1pblJlcXVpcmVkCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANY29uZmlnQWRkcmVzcwkAASwAAAACBQAAAAt0aGlzQWRkcmVzcwIAAAAcX3Byb3Bvc2FsX21pbl9wb3dlcl9yZXF1aXJlZAIAAAAbbWluIHJlcXVpcmVkIGlzIG5vdCBkZWZpbmVkAAAAABF2b3RpbmdTdGFydE9mZnNldAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAADWNvbmZpZ0FkZHJlc3MJAAEsAAAAAgUAAAALdGhpc0FkZHJlc3MCAAAAHF9wcm9wb3NhbF92b3RpbmdzdGFydF9vZmZzZXQCAAAAKnByb3Bvc2FsX3ZvdGluZ3N0YXJ0X29mZnNldCBpcyBub3QgZGVmaW5lZAAAAAAPdm90aW5nRW5kT2Zmc2V0CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANY29uZmlnQWRkcmVzcwkAASwAAAACBQAAAAt0aGlzQWRkcmVzcwIAAAAaX3Byb3Bvc2FsX3ZvdGluZ2VuZF9vZmZzZXQCAAAAKHByb3Bvc2FsX3ZvdGluZ2VuZF9vZmZzZXQgaXMgbm90IGRlZmluZWQAAAAAEGFwcGx5U3RhcnRPZmZzZXQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA1jb25maWdBZGRyZXNzCQABLAAAAAIFAAAAC3RoaXNBZGRyZXNzAgAAABtfcHJvcG9zYWxfYXBwbHlzdGFydF9vZmZzZXQCAAAAKXByb3Bvc2FsX2FwcGx5c3RhcnRfb2Zmc2V0IGlzIG5vdCBkZWZpbmVkAAAAAA5hcHBseUVuZE9mZnNldAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAADWNvbmZpZ0FkZHJlc3MJAAEsAAAAAgUAAAALdGhpc0FkZHJlc3MCAAAAGV9wcm9wb3NhbF9hcHBseWVuZF9vZmZzZXQCAAAAJ3Byb3Bvc2FsX2FwcGx5ZW5kX29mZnNldCBpcyBub3QgZGVmaW5lZAEAAAAJdXNlclBvd2VyAAAA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AABnAAAAAgkAAGkAAAACCQAAaAAAAAIFAAAACnRvdGFsVm90ZXMFAAAABEJBU0UFAAAACnRvdGFsUG93ZXIFAAAAC3F1b3J1bVJhdGlvBAAAAAloYXNQYXNzZWQJAABnAAAAAgkAAGkAAAACCQAAaAAAAAIFAAAACHZvdGVzWWVzBQAAAARCQVNFBQAAAAp0b3RhbFZvdGVzBQAAAAtwYXNzZWRSYXRpbwMFAAAACWhhc1F1b3J1bQUAAAAJaGFzUGFzc2VkBwEAAAAOYWR2aXNlUHJvcG9zYWwAAAABAAAABHR4SWQEAAAADnByb3Bvc2FsSGVpZ2h0CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQfAAAAAQkBAAAAE3Byb3Bvc2FsSGVpZ2h0U3RvcmUAAAABBQAAAAR0eElkAgAAAAtubyBwcm9wb3NhbAQAAAALdm90aW5nU3RhcnQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB8AAAABCQEAAAAYcHJvcG9zYWxWb3RpbmdTdGFydFN0b3JlAAAAAQUAAAAEdHhJZAIAAAALbm8gcHJvcG9zYWwEAAAACXZvdGluZ0VuZAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEHwAAAAEJAQAAABZwcm9wb3NhbFZvdGluZ0VuZFN0b3JlAAAAAQUAAAAEdHhJZAIAAAALbm8gcHJvcG9zYWwEAAAACHZvdGVzWWVzCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHwAAAAEJAQAAABVwcm9wb3NhbFRvdGFsWWVzU3RvcmUAAAABBQAAAAR0eElkAAAAAAAAAAAABAAAAAd2b3Rlc05vCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHwAAAAEJAQAAABRwcm9wb3NhbFRvdGFsTm9TdG9yZQAAAAEFAAAABHR4SWQAAAAAAAAAAAAEAAAADnRvdGFsUG93ZXJTbmFwCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHwAAAAEJAQAAABdwcm9wb3NhbFRvdGFsUG93ZXJTdG9yZQAAAAEFAAAABHR4SWQAAAAAAAAAAAAEAAAACnRvdGFsVm90ZXMJAABkAAAAAgUAAAAIdm90ZXNZZXMFAAAAB3ZvdGVzTm8EAAAACWhhc1F1b3J1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AAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAABVwcm9wb3NhbFRvdGFsWWVzU3RvcmUAAAABBQAAAAR0eElkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAABRwcm9wb3NhbFRvdGFsTm9TdG9yZQAAAAEFAAAABHR4SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAFHByb3Bvc2FsVXNlclllc1N0b3JlAAAAAgUAAAAEdXNlcgUAAAAEdHhJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAATcHJvcG9zYWxVc2VyTm9TdG9yZQAAAAIFAAAABHVzZXIFAAAABHR4SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAGnVzZXJMYXN0UHJvcG9zZUhlaWdodFN0b3JlAAAAAQUAAAAEdXNlcgkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAUcHJvcG9zYWxBZGRyZXNzU3RvcmUAAAABBQAAAAR0eElkBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAKtPWto=", "chainId": 87, "height": 3595663, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: 3iRPjdRUXQaEFX95iVfPocuUrq3Cx2FRtaeV7554Wnnh Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 5 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+func throwIf (condition,error) = if (condition)
5+ then throw(error)
6+ else true
7+
8+
9+func writeInt (key,value) = if ((0 > value))
10+ then throw(((("writing negative value " + toString(value)) + " for key ") + key))
11+ else IntegerEntry(key, value)
12+
13+
14+func writeConstString (key,value) = if (!(isDefined(getString(this, key))))
15+ then StringEntry(key, value)
16+ else throw(("already initialized: " + key))
17+
18+
19+func writeConstInt (key,value) = if (!(isDefined(getInteger(this, key))))
20+ then IntegerEntry(key, value)
21+ else throw(("already exists: " + key))
22+
23+
24+func changeBy (key,value) = writeInt(key, (valueOrElse(getInteger(this, key), 0) + value))
25+
26+
27+func asInt (value) = match value {
28+ case int: Int =>
29+ int
30+ case _ =>
31+ throw("wrong type, expected: Int")
32+}
33+
34+
35+let configAddressStore = "configAddress"
36+
37+let configAddress = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(this, configAddressStore), "voting: no configAddress")), "invalid config address")
38+
39+let votingResultContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_voting_result"), "no contract_voting_result")), "invalid contract_voting_result")
40+
41+let HEIGHT = height
42+
43+func advise () = ("height: " + toString(HEIGHT))
44+
45+
46+let BASE = 1000
47+
48+func opAllowed (op) = {
49+ let a = invoke(configAddress, "opAllowed", [op], nil)
50+ if ((a == a))
51+ then true
52+ else throw("Strict value is not equal to itself.")
53+ }
54+
55+
56+let stakingContract = valueOrErrorMessage(addressFromString(valueOrErrorMessage(getString(configAddress, "contract_staking"), "no staking_contract")), "invalid stakingContract")
57+
58+func proposalAddressStore (id) = ("proposal_address_" + id)
59+
60+
61+func proposalHeightStore (id) = ("proposal_height_" + id)
62+
63+
64+func proposalVotingStartStore (id) = ("proposal_votingstart_" + id)
65+
66+
67+func proposalVotingEndStore (id) = ("proposal_votingend_" + id)
68+
69+
70+func proposalByStore (id) = ("proposal_by_" + id)
71+
72+
73+func proposalTotalPowerStore (id) = ("proposal_power_" + id)
74+
75+
76+func proposalTotalYesStore (id) = ("proposal_yes_" + id)
77+
78+
79+func proposalTotalNoStore (id) = ("proposal_no_" + id)
80+
81+
82+func proposalUserYesStore (user,id) = ((("user_proposal_yes_" + user) + "_") + id)
83+
84+
85+func proposalUserNoStore (user,id) = ((("user_proposal_no_" + user) + "_") + id)
86+
87+
88+func userLastProposeHeightStore (user) = ("propose_lastheight_" + user)
89+
90+
91+func userYes (user,id) = valueOrElse(getInteger(this, proposalUserYesStore(user, id)), 0)
92+
93+
94+func userNo (user,id) = valueOrElse(getInteger(this, proposalUserNoStore(user, id)), 0)
95+
96+
97+func userLastProposeHeight (user) = valueOrElse(getInteger(this, userLastProposeHeightStore(user)), -1)
98+
99+
100+let thisAddress = toString(this)
101+
102+let userProposeDelay = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_user_propose_delay")), "user_propose_delay is not defined")
103+
104+let quorumRatio = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_proposal_quorum_ratio")), "proposalQuorumRatio is not defined")
105+
106+let passedRatio = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_proposal_passed_ratio")), "proposalThresholdRatio is not defined")
107+
108+let proposalMinRequired = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_proposal_min_power_required")), "min required is not defined")
109+
110+let votingStartOffset = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_proposal_votingstart_offset")), "proposal_votingstart_offset is not defined")
111+
112+let votingEndOffset = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_proposal_votingend_offset")), "proposal_votingend_offset is not defined")
113+
114+let applyStartOffset = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_proposal_applystart_offset")), "proposal_applystart_offset is not defined")
115+
116+let applyEndOffset = valueOrErrorMessage(getInteger(configAddress, (thisAddress + "_proposal_applyend_offset")), "proposal_applyend_offset is not defined")
117+
118+func userPower (user) = asInt(invoke(stakingContract, "userShares", [user], nil))
119+
120+
121+func proposalExists (txId) = match getInteger(this, proposalHeightStore(txId)) {
122+ case start: Int =>
123+ true
124+ case _ =>
125+ false
126+}
127+
128+
129+func proposalOnVoting (txId) = {
130+ let nonExistErr = "proposal doesn't exist"
131+ if (!(proposalExists(txId)))
132+ then throw(nonExistErr)
133+ else {
134+ let votingStart = valueOrErrorMessage(getInteger(this, proposalVotingStartStore(txId)), nonExistErr)
135+ let votingEnd = valueOrErrorMessage(getInteger(this, proposalVotingEndStore(txId)), nonExistErr)
136+ if ((votingStart > HEIGHT))
137+ then throw(((("voting not started yet, discussion is in progress, voting will start at block " + toString(votingStart)) + ", now it's ") + toString(HEIGHT)))
138+ else if ((HEIGHT > votingEnd))
139+ then throw(((("voting ended at block " + toString(votingEnd)) + ", now it's ") + toString(HEIGHT)))
140+ else true
141+ }
142+ }
143+
144+
145+func proposalBeforeVoting (txId) = {
146+ let nonExistErr = "proposal doesn't exist"
147+ if (!(proposalExists(txId)))
148+ then throw(nonExistErr)
149+ else {
150+ let votingStart = valueOrErrorMessage(getInteger(this, proposalVotingStartStore(txId)), nonExistErr)
151+ if ((HEIGHT >= votingStart))
152+ then throw("voting start is already happened")
153+ else true
154+ }
155+ }
156+
157+
158+func totalPowerStaked () = asInt(invoke(stakingContract, "totalShares", nil, nil))
159+
160+
161+func canBroadcast (id,yesInc,noInc) = {
162+ let votesYes = (valueOrElse(getInteger(("proposal_yes_" + id)), 0) + yesInc)
163+ let votesNo = (valueOrElse(getInteger(("proposal_no_" + id)), 0) + noInc)
164+ let totalPower = totalPowerStaked()
165+ let totalVotes = (votesYes + votesNo)
166+ let hasQuorum = (((totalVotes * BASE) / totalPower) >= quorumRatio)
167+ let hasPassed = (((votesYes * BASE) / totalVotes) >= passedRatio)
168+ if (hasQuorum)
169+ then hasPassed
170+ else false
171+ }
172+
173+
174+func adviseProposal (txId) = {
175+ let proposalHeight = valueOrErrorMessage(getInteger(proposalHeightStore(txId)), "no proposal")
176+ let votingStart = valueOrErrorMessage(getInteger(proposalVotingStartStore(txId)), "no proposal")
177+ let votingEnd = valueOrErrorMessage(getInteger(proposalVotingEndStore(txId)), "no proposal")
178+ let votesYes = valueOrElse(getInteger(proposalTotalYesStore(txId)), 0)
179+ let votesNo = valueOrElse(getInteger(proposalTotalNoStore(txId)), 0)
180+ let totalPowerSnap = valueOrElse(getInteger(proposalTotalPowerStore(txId)), 0)
181+ let totalVotes = (votesYes + votesNo)
182+ let hasQuorum = if ((totalVotes > 0))
183+ then (((totalVotes * BASE) / totalPowerSnap) >= quorumRatio)
184+ else false
185+ let hasPassed = if ((totalVotes > 0))
186+ then (((votesYes * BASE) / totalVotes) >= passedRatio)
187+ else false
188+ let inBlockchainHeight = valueOrElse(transactionHeightById(fromBase58String(txId)), 0)
189+ let status = if ((votingStart > HEIGHT))
190+ then "discussion"
191+ else if ((votingEnd >= HEIGHT))
192+ then "voting"
193+ else if (!(hasQuorum))
194+ then "noQuorum"
195+ else if (!(hasPassed))
196+ then "votingFailed"
197+ else if ((inBlockchainHeight > 0))
198+ then "inBlockchain"
199+ else "waitingForTx"
200+ ((((((((((((((((((("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_power: ") + toString(totalPowerSnap)) + ", vote_yes: ") + toString(votesYes)) + ", vote_no: ") + toString(votesNo))
201+ }
202+
203+
204+@Callable(i)
205+func init (config) = [writeConstString(configAddressStore, config)]
206+
207+
208+
209+@Callable(i)
210+func propose (address,txId) = {
211+ let checks = opAllowed("governance_propose_tx")
212+ if ((checks == checks))
213+ then {
214+ let user = toString(i.caller)
215+ let gv = userPower(user)
216+ if ((proposalMinRequired > gv))
217+ then throw((((("not enough staked power to make proposal." + " Minimum required = ") + toString(proposalMinRequired)) + ", actual: = ") + toString(gv)))
218+ else {
219+ let last = userLastProposeHeight(user)
220+ if (if ((last > -1))
221+ then ((last + userProposeDelay) > HEIGHT)
222+ else false)
223+ then throw(((("can't propose too often, last proroposal height: " + toString(last)) + ", blocks to wait: ") + toString(((last + userProposeDelay) - HEIGHT))))
224+ else [writeConstInt(proposalHeightStore(txId), HEIGHT), writeConstInt(proposalVotingStartStore(txId), (HEIGHT + votingStartOffset)), writeConstInt(proposalVotingEndStore(txId), (HEIGHT + votingEndOffset)), writeConstString(proposalByStore(txId), toString(i.caller)), writeInt(userLastProposeHeightStore(user), HEIGHT), writeConstString(proposalAddressStore(txId), address)]
225+ }
226+ }
227+ else throw("Strict value is not equal to itself.")
228+ }
229+
230+
231+
232+@Callable(i)
233+func voteYes (txId) = {
234+ let checks = if (opAllowed("governance_vote_tx"))
235+ then proposalOnVoting(txId)
236+ else false
237+ if ((checks == checks))
238+ then {
239+ let user = toString(i.caller)
240+ if ((userNo(user, txId) > 0))
241+ then throw("already voted against, please retract your vote first")
242+ else {
243+ let delta = (userPower(user) - userYes(user, txId))
244+ let setPower = IntegerEntry(proposalTotalPowerStore(txId), totalPowerStaked())
245+ if ((0 >= delta))
246+ then [setPower]
247+ else {
248+ let restake = invoke(stakingContract, "restakeFor", [user], nil)
249+ if ((restake == restake))
250+ then {
251+ let address = valueOrErrorMessage(getString(proposalAddressStore(txId)), "proposal address not found")
252+ let result = canBroadcast(txId, delta, 0)
253+ let setResult = invoke(votingResultContract, "setResult", [address, txId, result], nil)
254+ if ((setResult == setResult))
255+ then [setPower, changeBy(proposalUserYesStore(user, txId), delta), changeBy(proposalTotalYesStore(txId), delta)]
256+ else throw("Strict value is not equal to itself.")
257+ }
258+ else throw("Strict value is not equal to itself.")
259+ }
260+ }
261+ }
262+ else throw("Strict value is not equal to itself.")
263+ }
264+
265+
266+
267+@Callable(i)
268+func voteNo (txId) = {
269+ let checks = if (opAllowed("governance_vote_tx"))
270+ then proposalOnVoting(txId)
271+ else false
272+ if ((checks == checks))
273+ then {
274+ let user = toString(i.caller)
275+ if ((userYes(user, txId) > 0))
276+ then throw("already voted for, please retract your vote first")
277+ else {
278+ let delta = (userPower(user) - userNo(user, txId))
279+ let setPower = IntegerEntry(proposalTotalPowerStore(txId), totalPowerStaked())
280+ if ((0 >= delta))
281+ then [setPower]
282+ else {
283+ let restake = invoke(stakingContract, "restakeFor", [user], nil)
284+ if ((restake == restake))
285+ then {
286+ let address = valueOrErrorMessage(getString(proposalAddressStore(txId)), "proposal address not found")
287+ let result = canBroadcast(txId, 0, delta)
288+ let setResult = invoke(votingResultContract, "setResult", [address, txId, result], nil)
289+ if ((setResult == setResult))
290+ then [setPower, changeBy(proposalUserNoStore(user, txId), delta), changeBy(proposalTotalNoStore(txId), delta)]
291+ else throw("Strict value is not equal to itself.")
292+ }
293+ else throw("Strict value is not equal to itself.")
294+ }
295+ }
296+ }
297+ else throw("Strict value is not equal to itself.")
298+ }
299+
300+
301+
302+@Callable(i)
303+func retract (txId) = {
304+ let checks = if (opAllowed("governance_retract_vote"))
305+ then proposalOnVoting(txId)
306+ else false
307+ if ((checks == checks))
308+ then {
309+ let user = toString(i.caller)
310+ let yes = -(userYes(user, txId))
311+ let no = -(userNo(user, txId))
312+ let address = valueOrErrorMessage(getString(proposalAddressStore(txId)), "proposal address not found")
313+ let result = canBroadcast(txId, yes, no)
314+ let setResult = invoke(votingResultContract, "setResult", [address, txId, result], nil)
315+ if ((setResult == setResult))
316+ then [changeBy(proposalTotalYesStore(txId), yes), changeBy(proposalTotalNoStore(txId), no), DeleteEntry(proposalUserYesStore(user, txId)), DeleteEntry(proposalUserNoStore(user, txId))]
317+ else throw("Strict value is not equal to itself.")
318+ }
319+ else throw("Strict value is not equal to itself.")
320+ }
321+
322+
323+
324+@Callable(i)
325+func retractProposal (txId) = {
326+ let checks = if (opAllowed("governance_retract_proposal_tx"))
327+ then proposalBeforeVoting(txId)
328+ else false
329+ if ((checks == checks))
330+ then {
331+ let by = valueOrErrorMessage(getString(this, proposalByStore(txId)), "proposal doesn't exist")
332+ let user = toString(i.caller)
333+ if ((by != user))
334+ then throw("only owner can retract proposal")
335+ else [DeleteEntry(proposalHeightStore(txId)), DeleteEntry(proposalVotingStartStore(txId)), DeleteEntry(proposalVotingEndStore(txId)), DeleteEntry(proposalByStore(txId)), DeleteEntry(proposalTotalPowerStore(txId)), DeleteEntry(proposalTotalYesStore(txId)), DeleteEntry(proposalTotalNoStore(txId)), DeleteEntry(proposalUserYesStore(user, txId)), DeleteEntry(proposalUserNoStore(user, txId)), DeleteEntry(userLastProposeHeightStore(user)), DeleteEntry(proposalAddressStore(txId))]
336+ }
337+ else throw("Strict value is not equal to itself.")
338+ }
339+
340+

github/deemru/w8io/3ef1775 
28.60 ms