tx · 8uVBGk44tCj1RQ96mmP4ebFpuK2jxCWV7AvjyRYT34BM

3MqV2hxYA4F3eyVzMPfpPXkmvQMVjhWJ2Zz:  -0.01300000 Waves

2023.05.10 13:17 [2571657] smart account 3MqV2hxYA4F3eyVzMPfpPXkmvQMVjhWJ2Zz > SELF 0.00000000 Waves

{ "type": 13, "id": "8uVBGk44tCj1RQ96mmP4ebFpuK2jxCWV7AvjyRYT34BM", "fee": 1300000, "feeAssetId": null, "timestamp": 1683713858979, "version": 2, "chainId": 84, "sender": "3MqV2hxYA4F3eyVzMPfpPXkmvQMVjhWJ2Zz", "senderPublicKey": "E7cYpzqL1fF9VQjL3m4zr3xXfV289rCkrfE2fJyAHMqR", "proofs": [ "5uC582yvvg2QRhv8kejPjZbwMxyseQoC9w4S8chPedhaYYo7uYPtWZHRySeLoboDSQayrwHUJUydyhfi22mPUpek" ], "script": "base64:AAIFAAAAAAAAA60IAhIDCgEIEgASBAoCCAESAwoBCBIDCgEIEgASAwoBCBIDCgEIIgNTRVAiE2tleU1hbmFnZXJQdWJsaWNLZXkiFmtleU1hbmFnZXJWYXVsdEFkZHJlc3MiB2tleVVzZXIiB2FkZHJlc3MiCmtleVJldm9rZWQiD2tleVJldm9rZWRUb3RhbCITa2V5VXNlclZlc3RpbmdTdGFydCIRa2V5VXNlclZlc3RpbmdFbmQiFWtleVVzZXJBbW91bnRQZXJCbG9jayIMa2V5V3hBc3NldElkIhxnZXRNYW5hZ2VyVmF1bHRBZGRyZXNzT3JUaGlzIgckbWF0Y2gwIgFzIgh0aHJvd0VyciIDbXNnIhZtYW5hZ2VyUHVibGljS2V5T3JVbml0IhNtYW5hZ2VyVmF1bHRBZGRyZXNzIgttdXN0TWFuYWdlciIBaSICcGQiAnBrIgp2YWx1ZVVzZXJTIgt0b3RhbEFtb3VudCIPcmVtYWluaW5nQW1vdW50Ig9jbGFpbWVkV1hBbW91bnQiEWxhc3RDbGFpbWVkSGVpZ2h0Igl2YWx1ZVVzZXIiEmdldFVzZXJUb3RhbEFtb3VudCIWZ2V0VXNlclJlbWFpbmluZ0Ftb3VudCIUZ2V0VXNlckNsYWltZWRBbW91bnQiGGdldFVzZXJMYXN0Q2xhaW1lZEhlaWdodCITYXZhaWxhYmxlVG9DbGFpbU5vdyINaXNSZXZva2VkVXNlciIKbGFzdEhlaWdodCIDZW5kIg91bmNsYWltZWRQZXJpb2QiDWNsYWltSW50ZXJuYWwiBGFkZHIiAnd4IgZhbW91bnQiDGVuc3VyZUFtb3VudCIJd3hBc3NldElkIgVjaGVjayIGY2hlY2tzIg5ibG9ja3NEdXJhdGlvbiIJZW5kSGVpZ2h0Igp2ZXN0aW5nTGVuIg5hbW91bnRQZXJCbG9jayIQYXZhaWxhYmxlVG9DbGFpbSIKZm9yY2VDbGFpbSIRaW5jQW1vdW50UGVyQmxvY2siD3VzZXJUb3RhbEFtb3VudCITdXNlclJlbWFpbmluZ0Ftb3VudCIRdXNlckNsYWltZWRBbW91bnQiFXVzZXJMYXN0Q2xhaW1lZEhlaWdodCISdW5jbGFpbWVkQW1vdW50Tm93IgxyZXZva2VkVG90YWwiDmFtb3VudFRv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", "height": 2571657, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6HpQ5VSxDgKF4Jd3PzNpGoZyuYbFUfxhYt7VLjoJJENz Next: none Diff:
OldNewDifferences
66 func keyManagerPublicKey () = "%s__managerPublicKey"
77
88
9-func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
9+func keyManagerVaultAddress () = "%s__managerVaultAddress"
1010
1111
1212 func keyUser (address) = makeString(["%s", address], SEP)
3030 func keyWxAssetId () = makeString(["%s", "wxAssetId"], SEP)
3131
3232
33+func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
34+ case s: String =>
35+ addressFromStringValue(s)
36+ case _ =>
37+ this
38+}
39+
40+
3341 func throwErr (msg) = throw(makeString(["vesting.ride:", msg], " "))
3442
3543
36-func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
37- case s: String =>
38- fromBase58String(s)
39- case _: Unit =>
40- unit
41- case _ =>
42- throw("Match error")
43-}
44-
45-
46-func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
47- case s: String =>
48- fromBase58String(s)
49- case _: Unit =>
50- unit
51- case _ =>
52- throw("Match error")
53-}
44+func managerPublicKeyOrUnit () = {
45+ let managerVaultAddress = getManagerVaultAddressOrThis()
46+ match getString(managerVaultAddress, keyManagerPublicKey()) {
47+ case s: String =>
48+ fromBase58String(s)
49+ case _: Unit =>
50+ unit
51+ case _ =>
52+ throw("Match error")
53+ }
54+ }
5455
5556
5657 func mustManager (i) = {
250251 func stats (address) = $Tuple2(nil, [value(getInteger(keyUserVestingStart(address))), value(getInteger(keyUserVestingEnd(address))), getUserTotalAmount(address), getUserClaimedAmount(address), getUserRemainingAmount(address), availableToClaimNow(address)])
251252
252253
253-
254-@Callable(i)
255-func setManager (pendingManagerPublicKey) = {
256- let checkCaller = mustManager(i)
257- if ((checkCaller == checkCaller))
258- then {
259- let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
260- if ((checkManagerPublicKey == checkManagerPublicKey))
261- then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
262- else throw("Strict value is not equal to itself.")
263- }
264- else throw("Strict value is not equal to itself.")
265- }
266-
267-
268-
269-@Callable(i)
270-func confirmManager () = {
271- let pm = pendingManagerPublicKeyOrUnit()
272- let hasPM = if (isDefined(pm))
273- then true
274- else throwErr("no pending manager")
275- if ((hasPM == hasPM))
276- then {
277- let checkPM = if ((i.callerPublicKey == value(pm)))
278- then true
279- else throwErr("you are not pending manager")
280- if ((checkPM == checkPM))
281- then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
282- else throw("Strict value is not equal to itself.")
283- }
284- else throw("Strict value is not equal to itself.")
285- }
286-
287-
288254 @Verifier(tx)
289255 func verify () = {
290256 let targetPublicKey = match managerPublicKeyOrUnit() {
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 func keyManagerPublicKey () = "%s__managerPublicKey"
77
88
9-func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
9+func keyManagerVaultAddress () = "%s__managerVaultAddress"
1010
1111
1212 func keyUser (address) = makeString(["%s", address], SEP)
1313
1414
1515 func keyRevoked (address) = makeString(["%s%s", "revoked", address], SEP)
1616
1717
1818 func keyRevokedTotal () = makeString(["%s", "revokedTotal"], SEP)
1919
2020
2121 func keyUserVestingStart (address) = makeString(["%s%s", "vestingStart", address], SEP)
2222
2323
2424 func keyUserVestingEnd (address) = makeString(["%s%s", "vestingEnd", address], SEP)
2525
2626
2727 func keyUserAmountPerBlock (address) = makeString(["%s%s", "amountPerBlock", address], SEP)
2828
2929
3030 func keyWxAssetId () = makeString(["%s", "wxAssetId"], SEP)
3131
3232
33+func getManagerVaultAddressOrThis () = match getString(keyManagerVaultAddress()) {
34+ case s: String =>
35+ addressFromStringValue(s)
36+ case _ =>
37+ this
38+}
39+
40+
3341 func throwErr (msg) = throw(makeString(["vesting.ride:", msg], " "))
3442
3543
36-func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
37- case s: String =>
38- fromBase58String(s)
39- case _: Unit =>
40- unit
41- case _ =>
42- throw("Match error")
43-}
44-
45-
46-func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
47- case s: String =>
48- fromBase58String(s)
49- case _: Unit =>
50- unit
51- case _ =>
52- throw("Match error")
53-}
44+func managerPublicKeyOrUnit () = {
45+ let managerVaultAddress = getManagerVaultAddressOrThis()
46+ match getString(managerVaultAddress, keyManagerPublicKey()) {
47+ case s: String =>
48+ fromBase58String(s)
49+ case _: Unit =>
50+ unit
51+ case _ =>
52+ throw("Match error")
53+ }
54+ }
5455
5556
5657 func mustManager (i) = {
5758 let pd = throwErr("permission denied")
5859 match managerPublicKeyOrUnit() {
5960 case pk: ByteVector =>
6061 if ((i.callerPublicKey == pk))
6162 then true
6263 else pd
6364 case _: Unit =>
6465 if ((i.caller == this))
6566 then true
6667 else pd
6768 case _ =>
6869 throw("Match error")
6970 }
7071 }
7172
7273
7374 func valueUserS (totalAmount,remainingAmount,claimedWXAmount,lastClaimedHeight) = makeString(["%d%d%d%d%d", totalAmount, remainingAmount, "0", claimedWXAmount, lastClaimedHeight], SEP)
7475
7576
7677 func valueUser (totalAmount,remainingAmount,claimedWXAmount,lastClaimedHeight) = valueUserS(toString(totalAmount), toString(remainingAmount), toString(claimedWXAmount), toString(lastClaimedHeight))
7778
7879
7980 func getUserTotalAmount (address) = parseIntValue(split(value(getString(keyUser(address))), SEP)[1])
8081
8182
8283 func getUserRemainingAmount (address) = parseIntValue(split(value(getString(keyUser(address))), SEP)[2])
8384
8485
8586 func getUserClaimedAmount (address) = parseIntValue(split(value(getString(keyUser(address))), SEP)[3])
8687
8788
8889 func getUserLastClaimedHeight (address) = parseIntValue(split(value(getString(keyUser(address))), SEP)[5])
8990
9091
9192 func availableToClaimNow (address) = {
9293 let isRevokedUser = valueOrElse(getBoolean(keyRevoked(address)), false)
9394 if (isRevokedUser)
9495 then getUserRemainingAmount(address)
9596 else {
9697 let lastHeight = getUserLastClaimedHeight(address)
9798 if ((lastHeight >= height))
9899 then 0
99100 else {
100101 let end = value(getInteger(keyUserVestingEnd(address)))
101102 if ((height > end))
102103 then getUserRemainingAmount(address)
103104 else {
104105 let unclaimedPeriod = (height - lastHeight)
105106 (value(getInteger(keyUserAmountPerBlock(address))) * unclaimedPeriod)
106107 }
107108 }
108109 }
109110 }
110111
111112
112113 func claimInternal (address) = {
113114 let addr = addressFromStringValue(address)
114115 let wx = fromBase58String(value(getString(keyWxAssetId())))
115116 let amount = availableToClaimNow(address)
116117 let ensureAmount = if ((amount != 0))
117118 then true
118119 else throwErr("nothing to claim")
119120 if ((ensureAmount == ensureAmount))
120121 then {
121122 let totalAmount = getUserTotalAmount(address)
122123 let remainingAmount = getUserRemainingAmount(address)
123124 let claimedWXAmount = getUserClaimedAmount(address)
124125 let isRevokedUser = valueOrElse(getBoolean(keyRevoked(address)), false)
125126 if (isRevokedUser)
126127 then [ScriptTransfer(addr, remainingAmount, wx), StringEntry(keyUser(address), valueUser(totalAmount, 0, (claimedWXAmount + remainingAmount), height))]
127128 else [ScriptTransfer(addr, amount, wx), StringEntry(keyUser(address), valueUser(totalAmount, (remainingAmount - amount), (claimedWXAmount + amount), height))]
128129 }
129130 else throw("Strict value is not equal to itself.")
130131 }
131132
132133
133134 @Callable(i)
134135 func constructor (wxAssetId) = {
135136 let check = mustManager(i)
136137 if ((check == check))
137138 then [StringEntry(keyWxAssetId(), wxAssetId)]
138139 else throw("Strict value is not equal to itself.")
139140 }
140141
141142
142143
143144 @Callable(i)
144145 func withdrawRevoked () = {
145146 let amount = valueOrElse(getInteger(keyRevokedTotal()), 0)
146147 let wx = fromBase58String(value(getString(keyWxAssetId())))
147148 let checks = [mustManager(i), if ((amount > 0))
148149 then true
149150 else throwErr("revoked amount is zero, nothing to withdraw")]
150151 if ((checks == checks))
151152 then [ScriptTransfer(i.caller, amount, wx), IntegerEntry(keyRevokedTotal(), 0)]
152153 else throw("Strict value is not equal to itself.")
153154 }
154155
155156
156157
157158 @Callable(i)
158159 func createDepositFor (address,blocksDuration) = {
159160 let amount = i.payments[0].amount
160161 let endHeight = (height + blocksDuration)
161162 let vestingLen = (endHeight - height)
162163 let amountPerBlock = (amount / vestingLen)
163164 let checks = [if ((endHeight > height))
164165 then true
165166 else throwErr("endHeight must be more than height"), if ((getString(keyUser(address)) == unit))
166167 then true
167168 else throwErr("deposit for user already exists"), if ((toBase58String(value(i.payments[0].assetId)) == value(getString(keyWxAssetId()))))
168169 then true
169170 else throwErr("attached payment is not WX"), if ((amountPerBlock != 0))
170171 then true
171172 else throwErr("attached amount too small or blocksDuration too large — will claimed zero per block")]
172173 if ((checks == checks))
173174 then [StringEntry(keyUser(address), valueUser(amount, amount, 0, height)), IntegerEntry(keyUserVestingStart(address), height), IntegerEntry(keyUserVestingEnd(address), endHeight), IntegerEntry(keyUserAmountPerBlock(address), amountPerBlock)]
174175 else throw("Strict value is not equal to itself.")
175176 }
176177
177178
178179
179180 @Callable(i)
180181 func increaseDepositFor (address) = {
181182 let availableToClaim = availableToClaimNow(address)
182183 let forceClaim = if ((availableToClaim > 0))
183184 then claimInternal(address)
184185 else unit
185186 if ((forceClaim == forceClaim))
186187 then {
187188 let amount = i.payments[0].amount
188189 let endHeight = value(getInteger(keyUserVestingEnd(address)))
189190 let vestingLen = (endHeight - height)
190191 let amountPerBlock = value(getInteger(keyUserAmountPerBlock(address)))
191192 let incAmountPerBlock = (amount / vestingLen)
192193 let userTotalAmount = getUserTotalAmount(address)
193194 let userRemainingAmount = getUserRemainingAmount(address)
194195 let userClaimedAmount = getUserClaimedAmount(address)
195196 let userLastClaimedHeight = getUserLastClaimedHeight(address)
196197 let checks = [if ((valueOrElse(getBoolean(keyRevoked(address)), false) == false))
197198 then true
198199 else throwErr("deposit for user is revoked"), if ((getString(keyUser(address)) != unit))
199200 then true
200201 else throwErr("deposit for user doesn't exists"), if ((toBase58String(value(i.payments[0].assetId)) == value(getString(keyWxAssetId()))))
201202 then true
202203 else throwErr("attached payment is not WX"), if ((incAmountPerBlock != 0))
203204 then true
204205 else throwErr("attached amount too small — increase is zero per block")]
205206 if ((checks == checks))
206207 then [StringEntry(keyUser(address), valueUser((userTotalAmount + amount), (userRemainingAmount + amount), userClaimedAmount, userLastClaimedHeight)), IntegerEntry(keyUserAmountPerBlock(address), (amountPerBlock + incAmountPerBlock))]
207208 else throw("Strict value is not equal to itself.")
208209 }
209210 else throw("Strict value is not equal to itself.")
210211 }
211212
212213
213214
214215 @Callable(i)
215216 func revokeDepositFor (address) = {
216217 let totalAmount = getUserTotalAmount(address)
217218 let remainingAmount = getUserRemainingAmount(address)
218219 let claimedWXAmount = getUserClaimedAmount(address)
219220 let lastClaimedHeight = getUserLastClaimedHeight(address)
220221 let unclaimedAmountNow = availableToClaimNow(address)
221222 let revokedTotal = valueOrElse(getInteger(keyRevokedTotal()), 0)
222223 let amountToRevoke = (remainingAmount - unclaimedAmountNow)
223224 let newRevokedTotal = (revokedTotal + amountToRevoke)
224225 let checks = [mustManager(i), if ((getString(keyUser(address)) != unit))
225226 then true
226227 else throwErr("deposit for user is not exists"), if ((newRevokedTotal > revokedTotal))
227228 then true
228229 else throwErr("newRevokedTotal can't be less or equal than revokedTotal")]
229230 if ((checks == checks))
230231 then [BooleanEntry(keyRevoked(address), true), IntegerEntry(keyRevokedTotal(), newRevokedTotal), StringEntry(keyUser(address), valueUser(totalAmount, unclaimedAmountNow, claimedWXAmount, lastClaimedHeight))]
231232 else throw("Strict value is not equal to itself.")
232233 }
233234
234235
235236
236237 @Callable(i)
237238 func claim () = claimInternal(toBase58String(i.caller.bytes))
238239
239240
240241
241242 @Callable(i)
242243 func claimREADONLY (address) = {
243244 let amount = availableToClaimNow(address)
244245 $Tuple2(nil, amount)
245246 }
246247
247248
248249
249250 @Callable(i)
250251 func stats (address) = $Tuple2(nil, [value(getInteger(keyUserVestingStart(address))), value(getInteger(keyUserVestingEnd(address))), getUserTotalAmount(address), getUserClaimedAmount(address), getUserRemainingAmount(address), availableToClaimNow(address)])
251252
252253
253-
254-@Callable(i)
255-func setManager (pendingManagerPublicKey) = {
256- let checkCaller = mustManager(i)
257- if ((checkCaller == checkCaller))
258- then {
259- let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
260- if ((checkManagerPublicKey == checkManagerPublicKey))
261- then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
262- else throw("Strict value is not equal to itself.")
263- }
264- else throw("Strict value is not equal to itself.")
265- }
266-
267-
268-
269-@Callable(i)
270-func confirmManager () = {
271- let pm = pendingManagerPublicKeyOrUnit()
272- let hasPM = if (isDefined(pm))
273- then true
274- else throwErr("no pending manager")
275- if ((hasPM == hasPM))
276- then {
277- let checkPM = if ((i.callerPublicKey == value(pm)))
278- then true
279- else throwErr("you are not pending manager")
280- if ((checkPM == checkPM))
281- then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
282- else throw("Strict value is not equal to itself.")
283- }
284- else throw("Strict value is not equal to itself.")
285- }
286-
287-
288254 @Verifier(tx)
289255 func verify () = {
290256 let targetPublicKey = match managerPublicKeyOrUnit() {
291257 case pk: ByteVector =>
292258 pk
293259 case _: Unit =>
294260 tx.senderPublicKey
295261 case _ =>
296262 throw("Match error")
297263 }
298264 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
299265 }
300266

github/deemru/w8io/169f3d6 
58.48 ms