tx · 55pTYzhb9wVEyVEcPJt5WFoThkTjq4Dhwto5SEPZGaFQ

3MqqypuxFqtQdRA2ELKnSecQNc3zbXqnX7n:  -0.01000000 Waves

2023.09.07 14:52 [2744932] smart account 3MqqypuxFqtQdRA2ELKnSecQNc3zbXqnX7n > SELF 0.00000000 Waves

{ "type": 13, "id": "55pTYzhb9wVEyVEcPJt5WFoThkTjq4Dhwto5SEPZGaFQ", "fee": 1000000, "feeAssetId": null, "timestamp": 1694087527897, "version": 2, "chainId": 84, "sender": "3MqqypuxFqtQdRA2ELKnSecQNc3zbXqnX7n", "senderPublicKey": "Gr8QxYx8tu8T3uReBDE584Ch5Q1Xmmxf8tmrKUBbRrLA", "proofs": [ "58gXkEmKGfnDG7pKkFtmN3dwqjj6AtfPxkVZM6aSHbvpN2S6SgrkF87ctN2HcgseGNYuqSEAJ8RUPjnqm5R6DbvE" ], "script": "base64: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", "height": 2744932, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 5 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let currentLockIdKey = "currentLockId"
5+
6+let SEP = "__"
7+
8+let MULT10 = 10000000000
9+
10+func asPayment (v) = match v {
11+ case p: AttachedPayment =>
12+ p
13+ case _ =>
14+ throw("fail to cast into AttachedPayment")
15+}
16+
17+
18+func asByteVector (v) = match v {
19+ case p: ByteVector =>
20+ p
21+ case _ =>
22+ throw("fail to cast into ByteVector")
23+}
24+
25+
26+func keyIds (address) = ((address + SEP) + "ids")
27+
28+
29+func maxTakeableAmount (lockHeight,vestingPeriod,amount,takedAmount) = if ((amount == takedAmount))
30+ then 0
31+ else {
32+ let blocksPassed = (height - lockHeight)
33+ if ((blocksPassed >= vestingPeriod))
34+ then (amount - takedAmount)
35+ else {
36+ let perBlockUnlock = fraction(toBigInt(amount), toBigInt(MULT10), toBigInt(vestingPeriod), HALFUP)
37+ let availableUnlock = fraction(perBlockUnlock, toBigInt(blocksPassed), toBigInt(MULT10), HALFUP)
38+ (toInt(availableUnlock) - takedAmount)
39+ }
40+ }
41+
42+
43+@Callable(i)
44+func lock (period) = if ((size(i.payments) != 1))
45+ then throw("One Payment expected")
46+ else {
47+ let payment = asPayment(i.payments[0])
48+ if ((0 >= payment.amount))
49+ then throw("Amount must be positive")
50+ else if ((1440 > period))
51+ then throw("24 hours is minimum vesting period")
52+ else {
53+ let currentLockId = valueOrElse(getInteger(currentLockIdKey), 0)
54+ let callerAddressString = toBase58String(i.caller.bytes)
55+ let paymentAssetIdString = if (!(isDefined(payment.assetId)))
56+ then "WAVES"
57+ else toBase58String(asByteVector(payment.assetId))
58+ let key = ((callerAddressString + SEP) + toString(currentLockId))
59+ let data = ((((((((toString(height) + SEP) + toString(payment.amount)) + SEP) + "0") + SEP) + toString(period)) + SEP) + paymentAssetIdString)
60+ let previosUserIds = valueOrElse(getString(keyIds(callerAddressString)), "")
61+ let newUserIds = if ((size(previosUserIds) == 0))
62+ then toString(currentLockId)
63+ else ((previosUserIds + SEP) + toString(currentLockId))
64+[StringEntry(key, data), StringEntry(keyIds(callerAddressString), newUserIds), IntegerEntry(currentLockIdKey, (currentLockId + 1))]
65+ }
66+ }
67+
68+
69+
70+@Callable(i)
71+func withdraw (amount,lockId) = if (if ((0 >= amount))
72+ then true
73+ else (0 > lockId))
74+ then throw("Amount must be positive or wrong lock id")
75+ else {
76+ let callerAddressString = toBase58String(i.caller.bytes)
77+ let key = ((callerAddressString + SEP) + toString(lockId))
78+ let dataArray = split(getStringValue(key), SEP)
79+ if ((size(dataArray) != 5))
80+ then throw("Internal error")
81+ else {
82+ let storedHeight = dataArray[0]
83+ let storedAmount = dataArray[1]
84+ let storedTakedAmount = dataArray[2]
85+ let storedVestingPeriod = dataArray[3]
86+ let storedAssetId = dataArray[4]
87+ let availableAmount = maxTakeableAmount(parseIntValue(storedHeight), parseIntValue(storedVestingPeriod), parseIntValue(storedAmount), parseIntValue(storedTakedAmount))
88+ if ((amount > availableAmount))
89+ then throw(("Requested amount is two big, max available amount is: " + toString(availableAmount)))
90+ else {
91+ let newData = ((((((((storedHeight + SEP) + storedAmount) + SEP) + toString((parseIntValue(storedTakedAmount) + amount))) + SEP) + storedVestingPeriod) + SEP) + storedAssetId)
92+ let assetIdToTransfer = if ((storedAssetId == "WAVES"))
93+ then unit
94+ else fromBase58String(storedAssetId)
95+[StringEntry(key, newData), ScriptTransfer(i.caller, amount, assetIdToTransfer)]
96+ }
97+ }
98+ }
99+
100+
101+@Verifier(tx)
102+func verify () = false
103+

github/deemru/w8io/03bedc9 
19.09 ms