tx · 2bBhzQNT7c1Nbknae4pPQ4jvVTkwEkiYuJtb17vhAX5c

3N2ZMk4cgrAycknCJj4WQw7p4VKzjCaQLY6:  -0.00500000 Waves

2023.03.16 13:56 [2492488] smart account 3N2ZMk4cgrAycknCJj4WQw7p4VKzjCaQLY6 > SELF 0.00000000 Waves

{ "type": 13, "id": "2bBhzQNT7c1Nbknae4pPQ4jvVTkwEkiYuJtb17vhAX5c", "fee": 500000, "feeAssetId": null, "timestamp": 1678964196136, "version": 2, "chainId": 84, "sender": "3N2ZMk4cgrAycknCJj4WQw7p4VKzjCaQLY6", "senderPublicKey": "DyT36swE2zmmGypg6UzejMq6onfJzQjnTZuLsdFm3oNt", "proofs": [ "4mc9WT1RGychRbKcWcJXove54x6rzR2CqBHwgk26TrkNhY448UkBMnvo4ptUqqqq4FykFJtcyeHZPv3W6Cu9QXBw" ], "script": null, "height": 2492488, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EzKn51NAzWfUvZq1N4yMAZ2bUg67Z4mrA4dXQKNRxW8k Next: H2dBAQtiq8Cy8CZr8MALxXyNhYW49s7qhKsMtE4XGpZh Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
2-{-# SCRIPT_TYPE ACCOUNT #-}
3-{-# CONTENT_TYPE DAPP #-}
4-let SEP = "__"
5-
6-func keyManagerPublicKey () = "%s__managerPublicKey"
7-
8-
9-func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
10-
11-
12-func keyUser (address) = makeString(["%s", address], SEP)
13-
14-
15-func keyRevoked (address) = makeString(["%s%s", "revoked", address], SEP)
16-
17-
18-func keyRevokedTotal () = makeString(["%s", "revokedTotal"], SEP)
19-
20-
21-func keyUserVestingStart (address) = makeString(["%s%s", "vestingStart", address], SEP)
22-
23-
24-func keyUserVestingEnd (address) = makeString(["%s%s", "vestingEnd", address], SEP)
25-
26-
27-func keyUserAmountPerBlock (address) = makeString(["%s%s", "amountPerBlock", address], SEP)
28-
29-
30-func keyWxAssetId () = makeString(["%s", "wxAssetId"], SEP)
31-
32-
33-func throwErr (msg) = throw(makeString(["vesting.ride:", msg], " "))
34-
35-
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-}
54-
55-
56-func mustManager (i) = {
57- let pd = throwErr("permission denied")
58- match managerPublicKeyOrUnit() {
59- case pk: ByteVector =>
60- if ((i.callerPublicKey == pk))
61- then true
62- else pd
63- case _: Unit =>
64- if ((i.caller == this))
65- then true
66- else pd
67- case _ =>
68- throw("Match error")
69- }
70- }
71-
72-
73-func valueUserS (totalAmount,remainingAmount,claimedWXAmount,lastClaimedHeight) = makeString(["%d%d%d%d%d", totalAmount, remainingAmount, "0", claimedWXAmount, lastClaimedHeight], SEP)
74-
75-
76-func valueUser (totalAmount,remainingAmount,claimedWXAmount,lastClaimedHeight) = valueUserS(toString(totalAmount), toString(remainingAmount), toString(claimedWXAmount), toString(lastClaimedHeight))
77-
78-
79-func getUserTotalAmount (address) = parseIntValue(split(value(getString(keyUser(address))), SEP)[1])
80-
81-
82-func getUserRemainingAmount (address) = parseIntValue(split(value(getString(keyUser(address))), SEP)[2])
83-
84-
85-func getUserClaimedAmount (address) = parseIntValue(split(value(getString(keyUser(address))), SEP)[3])
86-
87-
88-func getUserLastClaimedHeight (address) = parseIntValue(split(value(getString(keyUser(address))), SEP)[5])
89-
90-
91-func availableToClaimNow (address) = {
92- let isRevokedUser = valueOrElse(getBoolean(keyRevoked(address)), false)
93- if (isRevokedUser)
94- then getUserRemainingAmount(address)
95- else {
96- let lastHeight = getUserLastClaimedHeight(address)
97- if ((lastHeight >= height))
98- then 0
99- else {
100- let end = value(getInteger(keyUserVestingEnd(address)))
101- if ((height > end))
102- then getUserRemainingAmount(address)
103- else {
104- let unclaimedPeriod = (height - lastHeight)
105- (value(getInteger(keyUserAmountPerBlock(address))) * unclaimedPeriod)
106- }
107- }
108- }
109- }
110-
111-
112-func claimInternal (address) = {
113- let addr = addressFromStringValue(address)
114- let wx = fromBase58String(value(getString(keyWxAssetId())))
115- let amount = availableToClaimNow(address)
116- let ensureAmount = if ((amount != 0))
117- then true
118- else throwErr("nothing to claim")
119- if ((ensureAmount == ensureAmount))
120- then {
121- let totalAmount = getUserTotalAmount(address)
122- let remainingAmount = getUserRemainingAmount(address)
123- let claimedWXAmount = getUserClaimedAmount(address)
124- let isRevokedUser = valueOrElse(getBoolean(keyRevoked(address)), false)
125- if (isRevokedUser)
126- then [ScriptTransfer(addr, remainingAmount, wx), StringEntry(keyUser(address), valueUser(totalAmount, 0, (claimedWXAmount + remainingAmount), height))]
127- else [ScriptTransfer(addr, amount, wx), StringEntry(keyUser(address), valueUser(totalAmount, (remainingAmount - amount), (claimedWXAmount + amount), height))]
128- }
129- else throw("Strict value is not equal to itself.")
130- }
131-
132-
133-@Callable(i)
134-func constructor (wxAssetId) = {
135- let check = mustManager(i)
136- if ((check == check))
137- then [StringEntry(keyWxAssetId(), wxAssetId)]
138- else throw("Strict value is not equal to itself.")
139- }
140-
141-
142-
143-@Callable(i)
144-func withdrawRevoked () = {
145- let amount = valueOrElse(getInteger(keyRevokedTotal()), 0)
146- let wx = fromBase58String(value(getString(keyWxAssetId())))
147- let checks = [mustManager(i), if ((amount > 0))
148- then true
149- else throwErr("revoked amount is zero, nothing to withdraw")]
150- if ((checks == checks))
151- then [ScriptTransfer(i.caller, amount, wx), IntegerEntry(keyRevokedTotal(), 0)]
152- else throw("Strict value is not equal to itself.")
153- }
154-
155-
156-
157-@Callable(i)
158-func createDepositFor (address,blocksDuration) = {
159- let amount = i.payments[0].amount
160- let endHeight = (height + blocksDuration)
161- let vestingLen = (endHeight - height)
162- let amountPerBlock = (amount / vestingLen)
163- let checks = [if ((endHeight > height))
164- then true
165- else throwErr("endHeight must be more than height"), if ((getString(keyUser(address)) == unit))
166- then true
167- else throwErr("deposit for user already exists"), if ((toBase58String(value(i.payments[0].assetId)) == value(getString(keyWxAssetId()))))
168- then true
169- else throwErr("attached payment is not WX"), if ((amountPerBlock != 0))
170- then true
171- else throwErr("attached amount too small or blocksDuration too large — will claimed zero per block")]
172- if ((checks == checks))
173- then [StringEntry(keyUser(address), valueUser(amount, amount, 0, height)), IntegerEntry(keyUserVestingStart(address), height), IntegerEntry(keyUserVestingEnd(address), endHeight), IntegerEntry(keyUserAmountPerBlock(address), amountPerBlock)]
174- else throw("Strict value is not equal to itself.")
175- }
176-
177-
178-
179-@Callable(i)
180-func increaseDepositFor (address) = {
181- let availableToClaim = availableToClaimNow(address)
182- let forceClaim = if ((availableToClaim > 0))
183- then claimInternal(address)
184- else unit
185- if ((forceClaim == forceClaim))
186- then {
187- let amount = i.payments[0].amount
188- let endHeight = value(getInteger(keyUserVestingEnd(address)))
189- let vestingLen = (endHeight - height)
190- let amountPerBlock = value(getInteger(keyUserAmountPerBlock(address)))
191- let incAmountPerBlock = (amount / vestingLen)
192- let userTotalAmount = getUserTotalAmount(address)
193- let userRemainingAmount = getUserRemainingAmount(address)
194- let userClaimedAmount = getUserClaimedAmount(address)
195- let userLastClaimedHeight = getUserLastClaimedHeight(address)
196- let checks = [if ((valueOrElse(getBoolean(keyRevoked(address)), false) == false))
197- then true
198- else throwErr("deposit for user is revoked"), if ((getString(keyUser(address)) != unit))
199- then true
200- else throwErr("deposit for user doesn't exists"), if ((toBase58String(value(i.payments[0].assetId)) == value(getString(keyWxAssetId()))))
201- then true
202- else throwErr("attached payment is not WX"), if ((incAmountPerBlock != 0))
203- then true
204- else throwErr("attached amount too small — increase is zero per block")]
205- if ((checks == checks))
206- then [StringEntry(keyUser(address), valueUser((userTotalAmount + amount), (userRemainingAmount + amount), userClaimedAmount, userLastClaimedHeight)), IntegerEntry(keyUserAmountPerBlock(address), (amountPerBlock + incAmountPerBlock))]
207- else throw("Strict value is not equal to itself.")
208- }
209- else throw("Strict value is not equal to itself.")
210- }
211-
212-
213-
214-@Callable(i)
215-func revokeDepositFor (address) = {
216- let totalAmount = getUserTotalAmount(address)
217- let remainingAmount = getUserRemainingAmount(address)
218- let claimedWXAmount = getUserClaimedAmount(address)
219- let lastClaimedHeight = getUserLastClaimedHeight(address)
220- let unclaimedAmountNow = availableToClaimNow(address)
221- let revokedTotal = valueOrElse(getInteger(keyRevokedTotal()), 0)
222- let amountToRevoke = (remainingAmount - unclaimedAmountNow)
223- let newRevokedTotal = (revokedTotal + amountToRevoke)
224- let checks = [mustManager(i), if ((getString(keyUser(address)) != unit))
225- then true
226- else throwErr("deposit for user is not exists"), if ((newRevokedTotal > revokedTotal))
227- then true
228- else throwErr("newRevokedTotal can't be less or equal than revokedTotal")]
229- if ((checks == checks))
230- then [BooleanEntry(keyRevoked(address), true), IntegerEntry(keyRevokedTotal(), newRevokedTotal), StringEntry(keyUser(address), valueUser(totalAmount, unclaimedAmountNow, claimedWXAmount, lastClaimedHeight))]
231- else throw("Strict value is not equal to itself.")
232- }
233-
234-
235-
236-@Callable(i)
237-func claim () = claimInternal(toBase58String(i.caller.bytes))
238-
239-
240-
241-@Callable(i)
242-func claimREADONLY (address) = {
243- let amount = availableToClaimNow(address)
244- $Tuple2(nil, amount)
245- }
246-
247-
248-
249-@Callable(i)
250-func stats (address) = $Tuple2(nil, [value(getInteger(keyUserVestingStart(address))), value(getInteger(keyUserVestingEnd(address))), getUserTotalAmount(address), getUserClaimedAmount(address), getUserRemainingAmount(address), availableToClaimNow(address)])
251-
252-
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-
288-@Verifier(tx)
289-func verify () = {
290- let targetPublicKey = match managerPublicKeyOrUnit() {
291- case pk: ByteVector =>
292- pk
293- case _: Unit =>
294- tx.senderPublicKey
295- case _ =>
296- throw("Match error")
297- }
298- sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
299- }
300-
1+# no script

github/deemru/w8io/169f3d6 
37.86 ms