tx · F3pPfnFbEWxMzYX39GsCYZehHA6Nm2Yzac68kBzX6K4L

3PGyATMeRWox58ZsAX8EF4JoEDCLzsHifmp:  -0.01000000 Waves

2023.09.20 22:08 [3829901] smart account 3PGyATMeRWox58ZsAX8EF4JoEDCLzsHifmp > SELF 0.00000000 Waves

{ "type": 13, "id": "F3pPfnFbEWxMzYX39GsCYZehHA6Nm2Yzac68kBzX6K4L", "fee": 1000000, "feeAssetId": null, "timestamp": 1695236938396, "version": 2, "chainId": 87, "sender": "3PGyATMeRWox58ZsAX8EF4JoEDCLzsHifmp", "senderPublicKey": "88LEuLyG6WWqn6CxRefbwUwcgbV8M9qBKqbxRokVuGMj", "proofs": [ "43uER3nqhWBBG4ypZb4CdZxPJcBies8dJcgoMz2JTQTVHA8R8Nf1G8wsf9xohduWbjTa44jxV1Kqk3Ngj2d6fSxG" ], "script": "base64:BgIVCAISABIDCgEBEgQKAgICEgQKAgEEEgADU0VQAgJfXwAPcmVwdXRhdGlvbkFzc2V0ASBSDUX5Hu+dDoJ9IoSDMka9tZ0K6G9XzGwdBcTtE/lf9AAMcHJvcG9zYWxUaW1lCQBoAgkAaAIJAGgCCQBoAgDoBwA8ADwAGAADARFjb3VudFByb3Bvc2Fsc0tleQACAmNwAQtwcm9wb3NhbEtleQEKcHJvcG9zYWxJZAkAuQkCCQDMCAICAXAJAMwIAgkApAMBBQpwcm9wb3NhbElkBQNuaWwFA1NFUAEdZ3JlYXRlc3RVc2VyVm90ZVVzZXJUaW1lc3RhbXABBHVzZXIJALkJAgkAzAgCAgJ1dAkAzAgCCQDYBAEIBQR1c2VyBWJ5dGVzBQNuaWwFA1NFUAEQdXNlckRlcG9zaXRlZEtleQEEdXNlcgkAuQkCCQDMCAICAnVkCQDMCAIJANgEAQgFBHVzZXIFYnl0ZXMFA25pbAUDU0VQARN1c2VyUHJvcG9zYWxWb3RlS2V5Agpwcm9wb3NhbElkBHVzZXIJALkJAgkAzAgCAgJ1cAkAzAgCCQCkAwEFCnByb3Bvc2FsSWQJAMwIAgkA2AQBCAUEdXNlcgVieXRlcwUDbmlsBQNTRVABC3NldFByb3Bvc2FsCAJpZAdjcmVhdG9yBXRpdGxlBHRleHQRdGltZXN0YW1wQ3JlYXRpb24NY291bnRWb3Rlc0ZvchFDb3VudFZvdGVzQWdhaW5zdAlmaW5hbGl6ZWQJAQtTdHJpbmdFbnRyeQIJAQtwcm9wb3NhbEtleQEFAmlkCQC7CQIJAMwIAgkA3AQBCAUHY3JlYXRvcgVieXRlcwkAzAgCBQV0aXRsZQkAzAgCBQR0ZXh0CQDMCAIJAKQDAQURdGltZXN0YW1wQ3JlYXRpb24JAMwIAgkApAMBBQ1jb3VudFZvdGVzRm9yCQDMCAIJAKQDAQURQ291bnRWb3Rlc0FnYWluc3QJAMwIAgkApQMBBQlmaW5hbGl6ZWQFA25pbAUDU0VQAQtnZXRQcm9wb3NhbAECaWQEC3NhdmVkU3RyaW5nCQC1CQIEByRtYXRjaDAJAJ0IAgUEdGhpcwkBC3Byb3Bvc2FsS2V5AQUCaWQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwBQFzCQACAQIScHJvcG9zYWwgbm90IGZvdW5kBQNTRVAJAJkKBwkBB0FkZHJlc3MBCQDdBAEJAJEDAgULc2F2ZWRTdHJpbmcAAAkAkQMCBQtzYXZlZFN0cmluZwABCQCRAwIFC3NhdmVkU3RyaW5nAAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQtzYXZlZFN0cmluZwADCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgULc2F2ZWRTdHJpbmcABAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFC3NhdmVkU3RyaW5nAAUDCQAAAgkAkQMCBQtzYXZlZFN0cmluZwAGAgR0cnVlBgcBFGlzUGF5UmVwdXRhdGlvbkFzc2V0AQFpAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQMJAAACCAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQFD3JlcHV0YXRpb25Bc3NldAYJAAIBAhZvbmx5IHJlcHV0YXRpb24gYXNzZXRzCQACAQIOb25seSAxIHBheW1lbnQBHGdldEdyZWF0ZXN0VXNlclZvdGVUaW1lc3RhbXABBHVzZXIEByRtYXRjaDAJAJoIAgUEdGhpcwkBHWdyZWF0ZXN0VXNlclZvdGVVc2VyVGltZXN0YW1wAQUEdXNlcgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAESZ2V0VW5sb2NrVGltZXN0YW1wAQR1c2VyCQBkAgkBHGdldEdyZWF0ZXN0VXNlclZvdGVUaW1lc3RhbXABBQR1c2VyBQxwcm9wb3NhbFRpbWUBDmNvdW50UHJvcG9zYWxzAAQHJG1hdGNoMAkAmggCBQR0aGlzCQERY291bnRQcm9wb3NhbHNLZXkAAwkAAQIFByRtYXRjaDACA0ludAQBYQUHJG1hdGNoMAUBYQAAARx1c2VyRGVwb3NpdGVkUmVwdXRhdGlvbkFzc2V0AQR1c2VyBAckbWF0Y2gwCQCaCAIFBHRoaXMJARB1c2VyRGVwb3NpdGVkS2V5AQUEdXNlcgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAEPaXNQcm9wb3NhbEFsaXZlAQJpZAMDCQBmAgkBDmNvdW50UHJvcG9zYWxzAAUCaWQJAGYCCQBkAggJAQtnZXRQcm9wb3NhbAEFAmlkAl80BQxwcm9wb3NhbFRpbWUIBQlsYXN0QmxvY2sJdGltZXN0YW1wBwYJAAIBAhJwcm9wb3NhbCBub3QgYWxpdmUBC3NldFVzZXJWb3RlBApwcm9wb3NhbElkBHVzZXIYcHJvcG9zYWxDcmVhdGVkVGltZXN0YW1wCXZvdGVQb3dlcgQKdW5sb2NrVGltZQkAlgMBCQDMCAIFGHByb3Bvc2FsQ3JlYXRlZFRpbWVzdGFtcAkAzAgCCQEcZ2V0R3JlYXRlc3RVc2VyVm90ZVRpbWVzdGFtcAEFBHVzZXIFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBE3VzZXJQcm9wb3NhbFZvdGVLZXkCBQpwcm9wb3NhbElkBQR1c2VyBQl2b3RlUG93ZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJAR1ncmVhdGVzdFVzZXJWb3RlVXNlclRpbWVzdGFtcAEFBHVzZXIFCnVubG9ja1RpbWUFA25pbAELZ2V0VXNlclZvdGUCCnByb3Bvc2FsSWQEdXNlcgQHJG1hdGNoMAkAnwgBCQETdXNlclByb3Bvc2FsVm90ZUtleQIFCnByb3Bvc2FsSWQFBHVzZXIDCQABAgUHJG1hdGNoMAIDSW50BAFpBQckbWF0Y2gwBQFpAAAEAWkBB2RlcG9zaXQABAZjaGVja3MJAMwIAgkBFGlzUGF5UmVwdXRhdGlvbkFzc2V0AQUBaQUDbmlsAwkAAAIFBmNoZWNrcwUGY2hlY2tzBA1jdXJyZW50QW1vdW50CQEcdXNlckRlcG9zaXRlZFJlcHV0YXRpb25Bc3NldAEIBQFpBmNhbGxlcgQJbmV3QW1vdW50CQBkAgUNY3VycmVudEFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJARB1c2VyRGVwb3NpdGVkS2V5AQgFAWkGY2FsbGVyBQluZXdBbW91bnQFA25pbAkAAgECE29ubHlSZXB1dGF0aW9uQXNzZXQBaQEId2l0aGRyYXcBBmFtb3VudAQNY3VycmVudEFtb3VudAQHJG1hdGNoMAkAmggCBQR0aGlzCQEQdXNlckRlcG9zaXRlZEtleQEIBQFpBmNhbGxlcgMJAAECBQckbWF0Y2gwAgNJbnQEAWEFByRtYXRjaDAFAWEAAAQJbmV3QW1vdW50CQBlAgUNY3VycmVudEFtb3VudAUGYW1vdW50AwkAZgIAAAUGYW1vdW50CQACAQIeQ2FuJ3Qgd2l0aGRyYXcgbmVnYXRpdmUgYW1vdW50AwkAZgIJARJnZXRVbmxvY2tUaW1lc3RhbXABCAUBaQZjYWxsZXIIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQACAQIGTG9ja2VkAwkAZgIAAAUJbmV3QW1vdW50CQACAQISTm90IGVub3VnaCBiYWxhbmNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEQdXNlckRlcG9zaXRlZEtleQEIBQFpBmNhbGxlcgUJbmV3QW1vdW50CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgUGYW1vdW50BQ9yZXB1dGF0aW9uQXNzZXQFA25pbAFpAQ5jcmVhdGVQcm9wb3NhbAIFdGl0bGUEdGV4dAQFY291bnQJAQ5jb3VudFByb3Bvc2FscwAJAMwIAgkBC3NldFByb3Bvc2FsCAUFY291bnQIBQFpBmNhbGxlcgkA3AQBBQV0aXRsZQkA3AQBBQR0ZXh0CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAAAAAAHCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQERY291bnRQcm9wb3NhbHNLZXkACQBkAgUFY291bnQAAQUDbmlsAWkBBHZvdGUCCnByb3Bvc2FsSWQEdm90ZQMJAQEhAQkBD2lzUHJvcG9zYWxBbGl2ZQEFCnByb3Bvc2FsSWQJAAIBAhBwcm9wb3NhbE5vdEFsaXZlBAhwcm9wb3NhbAkBC2dldFByb3Bvc2FsAQUKcHJvcG9zYWxJZAQLcHJldml1c1ZvdGUJAQtnZXRVc2VyVm90ZQIFCnByb3Bvc2FsSWQIBQFpBmNhbGxlcgQJdm90ZVBvd2VyCQEcdXNlckRlcG9zaXRlZFJlcHV0YXRpb25Bc3NldAEIBQFpBmNhbGxlcgQIbWludXNGb3IDCQBmAgULcHJldml1c1ZvdGUAAAULcHJldml1c1ZvdGUAAAQMbWludXNBZ2FpbnN0AwkAZgIAAAULcHJldml1c1ZvdGUJAQEtAQULcHJldml1c1ZvdGUAAAQHcGx1c0ZvcgMJAAACBQR2b3RlBgUJdm90ZVBvd2VyAAAEC3BsdXNBZ2FpbnN0AwkAAAIFBHZvdGUHBQl2b3RlUG93ZXIAAAkAzggCCQDMCAIJAQtzZXRQcm9wb3NhbAgFCnByb3Bvc2FsSWQIBQhwcm9wb3NhbAJfMQgFCHByb3Bvc2FsAl8yCAUIcHJvcG9zYWwCXzMIBQhwcm9wb3NhbAJfNAkAZAIJAGUCCAUIcHJvcG9zYWwCXzUFCG1pbnVzRm9yBQdwbHVzRm9yCQBkAgkAZQIIBQhwcm9wb3NhbAJfNgUMbWludXNBZ2FpbnN0BQtwbHVzQWdhaW5zdAgFCHByb3Bvc2FsAl83BQNuaWwJAQtzZXRVc2VyVm90ZQQFCnByb3Bvc2FsSWQIBQFpBmNhbGxlcggFCHByb3Bvc2FsAl80AwUEdm90ZQUJdm90ZVBvd2VyCQEBLQEFCXZvdGVQb3dlcgECdHgBBnZlcmlmeQAJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAIBQJ0eA9zZW5kZXJQdWJsaWNLZXk+O50V", "height": 3829901, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: 9dnpMqevURxs5rACF5jsjawNqHVUxHdGRLsxTdctVKPq Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let SEP = "__"
5+
6+let reputationAsset = base58'6XJAscmejGPTLAdKsg12MynB5rNQzNiZz8Yj81SWeFrj'
7+
8+let proposalTime = ((((1000 * 60) * 60) * 24) * 3)
9+
10+func countProposalsKey () = "cp"
11+
12+
13+func proposalKey (proposalId) = makeString(["p", toString(proposalId)], SEP)
14+
15+
16+func greatestUserVoteUserTimestamp (user) = makeString(["ut", toBase58String(user.bytes)], SEP)
17+
18+
19+func userDepositedKey (user) = makeString(["ud", toBase58String(user.bytes)], SEP)
20+
21+
22+func userProposalVoteKey (proposalId,user) = makeString(["up", toString(proposalId), toBase58String(user.bytes)], SEP)
23+
24+
25+func setProposal (id,creator,title,text,timestampCreation,countVotesFor,CountVotesAgainst,finalized) = StringEntry(proposalKey(id), makeString_11C([toBase16String(creator.bytes), title, text, toString(timestampCreation), toString(countVotesFor), toString(CountVotesAgainst), toString(finalized)], SEP))
26+
27+
28+func getProposal (id) = {
29+ let savedString = split( match getString(this, proposalKey(id)) {
30+ case s: String =>
31+ s
32+ case _ =>
33+ throw("proposal not found")
34+ }, SEP)
35+ $Tuple7(Address(fromBase16String(savedString[0])), savedString[1], savedString[2], parseIntValue(savedString[3]), parseIntValue(savedString[4]), parseIntValue(savedString[5]), if ((savedString[6] == "true"))
36+ then true
37+ else false)
38+ }
39+
40+
41+func isPayReputationAsset (i) = if ((size(i.payments) == 1))
42+ then if ((i.payments[0].assetId == reputationAsset))
43+ then true
44+ else throw("only reputation assets")
45+ else throw("only 1 payment")
46+
47+
48+func getGreatestUserVoteTimestamp (user) = match getInteger(this, greatestUserVoteUserTimestamp(user)) {
49+ case a: Int =>
50+ a
51+ case _ =>
52+ 0
53+}
54+
55+
56+func getUnlockTimestamp (user) = (getGreatestUserVoteTimestamp(user) + proposalTime)
57+
58+
59+func countProposals () = match getInteger(this, countProposalsKey()) {
60+ case a: Int =>
61+ a
62+ case _ =>
63+ 0
64+}
65+
66+
67+func userDepositedReputationAsset (user) = match getInteger(this, userDepositedKey(user)) {
68+ case a: Int =>
69+ a
70+ case _ =>
71+ 0
72+}
73+
74+
75+func isProposalAlive (id) = if (if ((countProposals() > id))
76+ then ((getProposal(id)._4 + proposalTime) > lastBlock.timestamp)
77+ else false)
78+ then true
79+ else throw("proposal not alive")
80+
81+
82+func setUserVote (proposalId,user,proposalCreatedTimestamp,votePower) = {
83+ let unlockTime = max([proposalCreatedTimestamp, getGreatestUserVoteTimestamp(user)])
84+[IntegerEntry(userProposalVoteKey(proposalId, user), votePower), IntegerEntry(greatestUserVoteUserTimestamp(user), unlockTime)]
85+ }
86+
87+
88+func getUserVote (proposalId,user) = match getInteger(userProposalVoteKey(proposalId, user)) {
89+ case i: Int =>
90+ i
91+ case _ =>
92+ 0
93+}
94+
95+
96+@Callable(i)
97+func deposit () = {
98+ let checks = [isPayReputationAsset(i)]
99+ if ((checks == checks))
100+ then {
101+ let currentAmount = userDepositedReputationAsset(i.caller)
102+ let newAmount = (currentAmount + i.payments[0].amount)
103+[IntegerEntry(userDepositedKey(i.caller), newAmount)]
104+ }
105+ else throw("onlyReputationAsset")
106+ }
107+
108+
109+
110+@Callable(i)
111+func withdraw (amount) = {
112+ let currentAmount = match getInteger(this, userDepositedKey(i.caller)) {
113+ case a: Int =>
114+ a
115+ case _ =>
116+ 0
117+ }
118+ let newAmount = (currentAmount - amount)
119+ if ((0 > amount))
120+ then throw("Can't withdraw negative amount")
121+ else if ((getUnlockTimestamp(i.caller) > lastBlock.timestamp))
122+ then throw("Locked")
123+ else if ((0 > newAmount))
124+ then throw("Not enough balance")
125+ else [IntegerEntry(userDepositedKey(i.caller), newAmount), ScriptTransfer(i.caller, amount, reputationAsset)]
126+ }
127+
128+
129+
130+@Callable(i)
131+func createProposal (title,text) = {
132+ let count = countProposals()
133+[setProposal(count, i.caller, toBase16String(title), toBase16String(text), lastBlock.timestamp, 0, 0, false), IntegerEntry(countProposalsKey(), (count + 1))]
134+ }
135+
136+
137+
138+@Callable(i)
139+func vote (proposalId,vote) = if (!(isProposalAlive(proposalId)))
140+ then throw("proposalNotAlive")
141+ else {
142+ let proposal = getProposal(proposalId)
143+ let previusVote = getUserVote(proposalId, i.caller)
144+ let votePower = userDepositedReputationAsset(i.caller)
145+ let minusFor = if ((previusVote > 0))
146+ then previusVote
147+ else 0
148+ let minusAgainst = if ((0 > previusVote))
149+ then -(previusVote)
150+ else 0
151+ let plusFor = if ((vote == true))
152+ then votePower
153+ else 0
154+ let plusAgainst = if ((vote == false))
155+ then votePower
156+ else 0
157+ ([setProposal(proposalId, proposal._1, proposal._2, proposal._3, proposal._4, ((proposal._5 - minusFor) + plusFor), ((proposal._6 - minusAgainst) + plusAgainst), proposal._7)] ++ setUserVote(proposalId, i.caller, proposal._4, if (vote)
158+ then votePower
159+ else -(votePower)))
160+ }
161+
162+
163+@Verifier(tx)
164+func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
165+

github/deemru/w8io/3ef1775 
21.93 ms