tx · HA7xiL7ndmW9mkk1AxofddnJsBGtt4jgkurKJZjXnusb

3NA3yH1QryPynpwGhEYR3W3LSneJK73rWeL:  -0.01000000 Waves

2022.06.06 17:23 [2084611] smart account 3NA3yH1QryPynpwGhEYR3W3LSneJK73rWeL > SELF 0.00000000 Waves

{ "type": 13, "id": "HA7xiL7ndmW9mkk1AxofddnJsBGtt4jgkurKJZjXnusb", "fee": 1000000, "feeAssetId": null, "timestamp": 1654525392179, "version": 2, "chainId": 84, "sender": "3NA3yH1QryPynpwGhEYR3W3LSneJK73rWeL", "senderPublicKey": "6Ji8AyKFQegAeGHgCr6CYZgm3xxVSbQ9A884zpfzxS77", "proofs": [ "4W6i3sT6FnBNfjHQxEkXDhVi6SMkHFm1eH1aZF6GCCe9QWvf4hs89FPTBqmCGx6PWCQba8zvZCeKTxkpWxpn98LN" ], "script": "base64:AAIFAAAAAAAAABMIAhIDCgEIEgQKAggBEgQKAggYAAAADwAAAAAUc3Rha2VBbW91bnRUaHJlc2hvbGQAAAAAAAAAAAEAAAAAEWxvY2tQZXJpb2RzSW5EYXlzCQAETAAAAAIAAAAAAAAAAAEJAARMAAAAAgAAAAAAAAAACgkABEwAAAACAAAAAAAAAAAeCQAETAAAAAIAAAAAAAAAAFoJAARMAAAAAgAAAAAAAAAAtAUAAAADbmlsAAAAABhwb3NzaWJsZVRva2Vuc0ZvclJld2FyZHMJAARMAAAAAgIAAAAGUkVEU21iCQAETAAAAAICAAAABHJCVEMFAAAAA25pbAAAAAAHaG91cnMyNAAAAAAABSZcAAAAAAAKYXByOG9mMjAyMgAAAAGABnh4AAAAAAAQY3VycmVudFRpbWVzdGFtcAgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAAAAAAB2tleUluaXQCAAAABGluaXQAAAAACmtleUFzc2V0SWQCAAAAB2Fzc2V0SWQAAAAACGtleVRvdGFsAgAAAAxzdGFrZWRfdG90YWwBAAAACWtleVN0YWtlZAAAAAEAAAAHYWRkcmVzcwUAAAAHYWRkcmVzcwAAAAAGaXNJbml0CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGwAAAAIFAAAABHRoaXMFAAAAB2tleUluaXQHAAAAAAdhc3NldElkCQACWQAAAAEJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMFAAAACmtleUFzc2V0SWQAAAAAC3RvdGFsU3Rha2VkCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAIa2V5VG90YWwJAAEsAAAAAgkAASwAAAACAgAAABJDYW4ndCByZWFkIGZpZWxkICcFAAAACGtleVRvdGFsAgAAAAEnAQAAABRleHRyYWN0UGF5bWVudEFtb3VudAAAAAEAAAAIcGF5bWVudHMDCQEAAAACIT0AAAACCQABkAAAAAEFAAAACHBheW1lbnRzAAAAAAAAAAABCQAAAgAAAAECAAAAF1NpbmdsZSBwYXltZW50IHJlcXVpcmVkAwkBAAAAAiE9AAAAAggJAAGRAAAAAgUAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAUAAAAHYXNzZXRJZAkAAAIAAAABAgAAAB1Pbmx5IFJFRFNtYiB0b2tlbiBpcyBhY2NlcHRlZAMJAABmAAAAAgUAAAAUc3Rha2VBbW91bnRUaHJlc2hvbGQICQABkQAAAAIFAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAkAAAIAAAABCQABLAAAAAICAAAALlBheW1lbnQgYW1vdW50IG11c3QgYmUgZ3JlYXRlciB0aGVuIHRocmVzaG9sZCAJAAGkAAAAAQUAAAAUc3Rha2VBbW91bnRUaHJlc2hvbGQICQABkQAAAAIFAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAEAAAAWZ2V0Q3VycmVudFN0YWtlZEFtb3VudAAAAAEAAAAEdXNlcgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQEAAAAJa2V5U3Rha2VkAAAAAQUAAAAEdXNlcgAAAAAAAAAAAAAAAAMAAAADaW52AQAAAARpbml0AAAAAQAAAA9oYXNocmF0ZUFzc2V0SWQEAAAACm5ld0Fzc2V0SWQICQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAPsAAAAAQkAAlkAAAABBQAAAA9oYXNocmF0ZUFzc2V0SWQCAAAAEENhbid0IGZpbmQgYXNzZXQAAAACaWQDBQAAAAZpc0luaXQJAAACAAAAAQIAAAAUREFwcCBpcyBhbHJlYWR5IGluaXQJAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIFAAAAB2tleUluaXQGCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAICAAAAB2Fzc2V0SWQJAAJYAAAAAQUAAAAKbmV3QXNzZXRJZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAIa2V5VG90YWwAAAAAAAAAAAAFAAAAA25pbAAAAANpbnYBAAAABXN0YWtlAAAAAgAAAAtmb3JSZXdhcmRJbgAAAApkYXlzVG9NaW5lBAAAAAljYWxsZXJTdHIJAAQlAAAAAQgFAAAAA2ludgAAAAZjYWxsZXIEAAAACXBtdEFtb3VudAkBAAAAFGV4dHJhY3RQYXltZW50QW1vdW50AAAAAQgFAAAAA2ludgAAAAhwYXltZW50cwQAAAAaYmVnaW5uaW5nT2ZOZXhEYXlUaW1lc3RhbXAJAABlAAAAAgkAAGQAAAACBQAAABBjdXJyZW50VGltZXN0YW1wBQAAAAdob3VyczI0CQAAagAAAAIFAAAAEGN1cnJlbnRUaW1lc3RhbXAFAAAAB2hvdXJzMjQEAAAAEmxvY2tVbnRpbFRpbWVzdGFtcAkAAGQAAAACBQAAABpiZWdpbm5pbmdPZk5leERheVRpbWVzdGFtcAkAAGgAAAACBQAAAApkYXlzVG9NaW5lBQAAAAdob3VyczI0BAAAAApzdGFraW5nS2V5CQABLAAAAAIJAAEsAAAAAgUAAAAJY2FsbGVyU3RyAgAAAAlfc3Rha2luZ18JAAJYAAAAAQgFAAAAA2ludgAAAA10cmFuc2FjdGlvbklkBAAAAAxzdGFraW5nVmFsdWUJAAS5AAAAAgkABEwAAAACCQABpAAAAAEFAAAACXBtdEFtb3VudAkABEwAAAACBQAAAAtmb3JSZXdhcmRJbgkABEwAAAACCQABpAAAAAEFAAAACmRheXNUb01pbmUJAARMAAAAAgkAAaQAAAABBQAAABBjdXJyZW50VGltZXN0YW1wCQAETAAAAAIJAAGkAAAAAQUAAAASbG9ja1VudGlsVGltZXN0YW1wBQAAAANuaWwCAAAAASwEAAAADHVzZXJUb3RhbEtleQkAASwAAAACBQAAAAljYWxsZXJTdHICAAAADF9sb2NrZWRUb3RhbAMJAQAAAAlpc0RlZmluZWQAAAABCQAEHQAAAAIFAAAABHRoaXMFAAAACnN0YWtpbmdLZXkJAAACAAAAAQkAASwAAAACCQABLAAAAAICAAAACVN0YWtpbmcgJwUAAAAKc3Rha2luZ0tleQIAAAAQJyBhbHJlYWR5IGV4aXN0cwMJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAAEWxvY2tQZXJpb2RzSW5EYXlzBQAAAApkYXlzVG9NaW5lCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAABtVbnN1cHBvcnRlZCBudW1iZXIgb2YgZGF5cyAJAAGkAAAAAQUAAAAKZGF5c1RvTWluZQIAAAAIIHRvIG1pbmUDCQEAAAABIQAAAAEJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAABhwb3NzaWJsZVRva2Vuc0ZvclJld2FyZHMFAAAAC2ZvclJld2FyZEluCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAABlVbnN1cHBvcnRlZCByZXdhcmQgdHlwZSAnBQAAAAtmb3JSZXdhcmRJbgIAAAABJwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAApzdGFraW5nS2V5BQAAAAxzdGFraW5nVmFsdWUJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADHVzZXJUb3RhbEtleQkAAGQAAAACCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAADHVzZXJUb3RhbEtleQAAAAAAAAAAAAUAAAAJcG10QW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAhrZXlUb3RhbAkAAGQAAAACBQAAAAt0b3RhbFN0YWtlZAUAAAAJcG10QW1vdW50BQAAAANuaWwAAAADaW52AQAAAAh3aXRoZHJhdwAAAAIAAAAEdXNlcgAAAAdzdGFraW5nBAAAAAt1c2VyQWRkcmVzcwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEJgAAAAEFAAAABHVzZXIJAAEsAAAAAgkAASwAAAACAgAAABpDYW4ndCBwYXJzZSB1c2VyIGFkZHJlc3MgJwUAAAAEdXNlcgIAAAABJwoBAAAADmV4dHJhY3RTdGFraW5nAAAAAgAAAANhY2MAAAAEdHhJZAQAAAAKcGFyYW1ldGVycwQAAAADdmFsCQAEtQAAAAIJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABB0AAAACBQAAAAR0aGlzCQABLAAAAAIJAAEsAAAAAgUAAAAEdXNlcgIAAAAJX3N0YWtpbmdfBQAAAAR0eElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAhTdGFraW5nIAUAAAAEdHhJZAIAAAAYIGRvZXNuJ3QgZXhpc3QgZm9yIHVzZXIgBQAAAAR1c2VyAgAAAAEsAwkBAAAAAiE9AAAAAgkAAZAAAAABBQAAAAN2YWwAAAAAAAAAAAUJAAACAAAAAQkAASwAAAACAgAAACJDYW4ndCBwYXJzZSBwYXJhbWV0ZXJzIG9mIHN0YWtpbmcgBQAAAAR0eElkBQAAAAN2YWwEAAAACyR0MDM3NDMzODMxCQAFFAAAAAIJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAApwYXJhbWV0ZXJzAAAAAAAAAAAACQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAKcGFyYW1ldGVycwAAAAAAAAAABAQAAAAGYW1vdW50CAUAAAALJHQwMzc0MzM4MzEAAAACXzEEAAAACWxvY2tVbnRpbAgFAAAACyR0MDM3NDMzODMxAAAAAl8yAwkAAGYAAAACBQAAAAlsb2NrVW50aWwFAAAAEGN1cnJlbnRUaW1lc3RhbXAJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAbVW5hYmxlIHRvIHdpdGhkcmF3IHN0YWtpbmcgBQAAAAR0eElkAgAAACIgYmVjYXVzZSBpdCBpcyBzdGlsbCBsb2NrZWQgdW50aWwgCQABpAAAAAEFAAAACWxvY2tVbnRpbAkABRQAAAACCQAETQAAAAIIBQAAAANhY2MAAAACXzEJAQAAAAtEZWxldGVFbnRyeQAAAAEJAAEsAAAAAgkAASwAAAACBQAAAAR1c2VyAgAAAAFfBQAAAAR0eElkCQAAZAAAAAIIBQAAAANhY2MAAAACXzIFAAAABmFtb3VudAQAAAALJHQwNDA5MTQxNjkKAAAAAAIkbAUAAAAHc3Rha2luZwoAAAAAAiRzCQABkAAAAAEFAAAAAiRsCgAAAAAFJGFjYzAJAAUUAAAAAgUAAAADbmlsAAAAAAAAAAAACgEAAAAFJGYwXzEAAAACAAAAAiRhAAAAAiRpAwkAAGcAAAACBQAAAAIkaQUAAAACJHMFAAAAAiRhCQEAAAAOZXh0cmFjdFN0YWtpbmcAAAACBQAAAAIkYQkAAZEAAAACBQAAAAIkbAUAAAACJGkKAQAAAAUkZjBfMgAAAAIAAAACJGEAAAACJGkDCQAAZwAAAAIFAAAAAiRpBQAAAAIkcwUAAAACJGEJAAACAAAAAQIAAAAUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQAAAAUkZjBfMgAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIJAQAAAAUkZjBfMQAAAAIFAAAABSRhY2MwAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAACAAAAAAAAAAADAAAAAAAAAAAEAAAAAAAAAAAFAAAAAAAAAAAGAAAAAAAAAAAHAAAAAAAAAAAIAAAAAAAAAAAJAAAAAAAAAAAKBAAAAAt1bnN0YWtlTGlzdAgFAAAACyR0MDQwOTE0MTY5AAAAAl8xBAAAAA10b3RhbFVuc3Rha2VkCAUAAAALJHQwNDA5MTQxNjkAAAACXzIEAAAADHVzZXJUb3RhbEtleQkAASwAAAACCQAEJQAAAAEIBQAAAANpbnYAAAAGY2FsbGVyAgAAAAxfbG9ja2VkVG90YWwEAAAACXVzZXJUb3RhbAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAAx1c2VyVG90YWxLZXkAAAAAAAAAAAAEAAAADnVzZXJUb3RhbEFmdGVyCQAAZQAAAAIFAAAACXVzZXJUb3RhbAUAAAANdG90YWxVbnN0YWtlZAMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAA2ludgAAAAhwYXltZW50cwAAAAAAAAAAAAkAAAIAAAABAgAAAC1UaGVyZSBzaG91bGQgYmUgbm8gcGF5bWVudHMgZm9yIHRoaXMgZnVuY3Rpb24DAwkBAAAAAiE9AAAAAggFAAAAA2ludgAAAAZjYWxsZXIFAAAABHRoaXMJAQAAAAIhPQAAAAIFAAAAC3VzZXJBZGRyZXNzCAUAAAADaW52AAAABmNhbGxlcgcJAAACAAAAAQIAAABMT25seSB1c2VycyB0aGVtc2VsdmVzIGNhbiB3aXRoZHJhdyB0aGVpciB1bmxvY2tlZCBzdGFraW5nLCBvciBhZG1pbiBmb3IgdGhlbQMDAwkAAGYAAAACAAAAAAAAAAAABQAAAAl1c2VyVG90YWwGCQAAZgAAAAIAAAAAAAAAAAAFAAAADXRvdGFsVW5zdGFrZWQGCQAAZgAAAAIAAAAAAAAAAAAFAAAADnVzZXJUb3RhbEFmdGVyCQAAAgAAAAECAAAAD25lZ2F0aXZlIHJlc3VsdAkABE4AAAACBQAAAAt1bnN0YWtlTGlzdAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAIa2V5VG90YWwJAABlAAAAAgUAAAALdG90YWxTdGFrZWQFAAAADXRvdGFsVW5zdGFrZWQJAARMAAAAAgMJAABmAAAAAgUAAAAOdXNlclRvdGFsQWZ0ZXIAAAAAAAAAAAAJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAx1c2VyVG90YWxLZXkJAABlAAAAAgUAAAAJdXNlclRvdGFsBQAAAA10b3RhbFVuc3Rha2VkCQEAAAALRGVsZXRlRW50cnkAAAABBQAAAAx1c2VyVG90YWxLZXkJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAALdXNlckFkZHJlc3MFAAAADXRvdGFsVW5zdGFrZWQFAAAAB2Fzc2V0SWQFAAAAA25pbAAAAACpRM3m", "height": 2084611, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: 6DaPD16Yqps9GjwdXMDWTy14yvGCJztqcJJ1qbG8WrFb Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 5 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let stakeAmountThreshold = 1
5+
6+let lockPeriodsInDays = [1, 10, 30, 90, 180]
7+
8+let possibleTokensForRewards = ["REDSmb", "rBTC"]
9+
10+let hours24 = 86400000
11+
12+let apr8of2022 = 1649376000000
13+
14+let currentTimestamp = lastBlock.timestamp
15+
16+let keyInit = "init"
17+
18+let keyAssetId = "assetId"
19+
20+let keyTotal = "staked_total"
21+
22+func keyStaked (address) = address
23+
24+
25+let isInit = valueOrElse(getBoolean(this, keyInit), false)
26+
27+let assetId = fromBase58String(getStringValue(this, keyAssetId))
28+
29+let totalStaked = valueOrErrorMessage(getInteger(this, keyTotal), (("Can't read field '" + keyTotal) + "'"))
30+
31+func extractPaymentAmount (payments) = if ((size(payments) != 1))
32+ then throw("Single payment required")
33+ else if ((payments[0].assetId != assetId))
34+ then throw("Only REDSmb token is accepted")
35+ else if ((stakeAmountThreshold > payments[0].amount))
36+ then throw(("Payment amount must be greater then threshold " + toString(stakeAmountThreshold)))
37+ else payments[0].amount
38+
39+
40+func getCurrentStakedAmount (user) = valueOrElse(getInteger(this, keyStaked(user)), 0)
41+
42+
43+@Callable(inv)
44+func init (hashrateAssetId) = {
45+ let newAssetId = valueOrErrorMessage(assetInfo(fromBase58String(hashrateAssetId)), "Can't find asset").id
46+ if (isInit)
47+ then throw("DApp is already init")
48+ else [BooleanEntry(keyInit, true), StringEntry("assetId", toBase58String(newAssetId)), IntegerEntry(keyTotal, 0)]
49+ }
50+
51+
52+
53+@Callable(inv)
54+func stake (forRewardIn,daysToMine) = {
55+ let callerStr = toString(inv.caller)
56+ let pmtAmount = extractPaymentAmount(inv.payments)
57+ let beginningOfNexDayTimestamp = ((currentTimestamp + hours24) - (currentTimestamp % hours24))
58+ let lockUntilTimestamp = (beginningOfNexDayTimestamp + (daysToMine * hours24))
59+ let stakingKey = ((callerStr + "_staking_") + toBase58String(inv.transactionId))
60+ let stakingValue = makeString([toString(pmtAmount), forRewardIn, toString(daysToMine), toString(currentTimestamp), toString(lockUntilTimestamp)], ",")
61+ let userTotalKey = (callerStr + "_lockedTotal")
62+ if (isDefined(getString(this, stakingKey)))
63+ then throw((("Staking '" + stakingKey) + "' already exists"))
64+ else if (!(containsElement(lockPeriodsInDays, daysToMine)))
65+ then throw((("Unsupported number of days " + toString(daysToMine)) + " to mine"))
66+ else if (!(containsElement(possibleTokensForRewards, forRewardIn)))
67+ then throw((("Unsupported reward type '" + forRewardIn) + "'"))
68+ else [StringEntry(stakingKey, stakingValue), IntegerEntry(userTotalKey, (valueOrElse(getInteger(this, userTotalKey), 0) + pmtAmount)), IntegerEntry(keyTotal, (totalStaked + pmtAmount))]
69+ }
70+
71+
72+
73+@Callable(inv)
74+func withdraw (user,staking) = {
75+ let userAddress = valueOrErrorMessage(addressFromString(user), (("Can't parse user address '" + user) + "'"))
76+ func extractStaking (acc,txId) = {
77+ let parameters = {
78+ let val = split(valueOrErrorMessage(getString(this, ((user + "_staking_") + txId)), ((("Staking " + txId) + " doesn't exist for user ") + user)), ",")
79+ if ((size(val) != 5))
80+ then throw(("Can't parse parameters of staking " + txId))
81+ else val
82+ }
83+ let $t037433831 = $Tuple2(parseIntValue(parameters[0]), parseIntValue(parameters[4]))
84+ let amount = $t037433831._1
85+ let lockUntil = $t037433831._2
86+ if ((lockUntil > currentTimestamp))
87+ then throw(((("Unable to withdraw staking " + txId) + " because it is still locked until ") + toString(lockUntil)))
88+ else $Tuple2((acc._1 :+ DeleteEntry(((user + "_") + txId))), (acc._2 + amount))
89+ }
90+
91+ let $t040914169 = {
92+ let $l = staking
93+ let $s = size($l)
94+ let $acc0 = $Tuple2(nil, 0)
95+ func $f0_1 ($a,$i) = if (($i >= $s))
96+ then $a
97+ else extractStaking($a, $l[$i])
98+
99+ func $f0_2 ($a,$i) = if (($i >= $s))
100+ then $a
101+ else throw("List size exceeds 10")
102+
103+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
104+ }
105+ let unstakeList = $t040914169._1
106+ let totalUnstaked = $t040914169._2
107+ let userTotalKey = (toString(inv.caller) + "_lockedTotal")
108+ let userTotal = valueOrElse(getInteger(this, userTotalKey), 0)
109+ let userTotalAfter = (userTotal - totalUnstaked)
110+ if ((size(inv.payments) != 0))
111+ then throw("There should be no payments for this function")
112+ else if (if ((inv.caller != this))
113+ then (userAddress != inv.caller)
114+ else false)
115+ then throw("Only users themselves can withdraw their unlocked staking, or admin for them")
116+ else if (if (if ((0 > userTotal))
117+ then true
118+ else (0 > totalUnstaked))
119+ then true
120+ else (0 > userTotalAfter))
121+ then throw("negative result")
122+ else (unstakeList ++ [IntegerEntry(keyTotal, (totalStaked - totalUnstaked)), if ((userTotalAfter > 0))
123+ then IntegerEntry(userTotalKey, (userTotal - totalUnstaked))
124+ else DeleteEntry(userTotalKey), ScriptTransfer(userAddress, totalUnstaked, assetId)])
125+ }
126+
127+

github/deemru/w8io/873ac7e 
18.36 ms