tx · B54LQr15EsadxDybBcq2uZwve92WCf3pDJKVieaFBVKo

3Mz29fiz3zgY9JDbiHKANvHsFgQutdfu4Ua:  -0.01400000 Waves

2021.03.18 13:39 [1443066] smart account 3Mz29fiz3zgY9JDbiHKANvHsFgQutdfu4Ua > SELF 0.00000000 Waves

{ "type": 13, "id": "B54LQr15EsadxDybBcq2uZwve92WCf3pDJKVieaFBVKo", "fee": 1400000, "feeAssetId": null, "timestamp": 1616064053726, "version": 2, "chainId": 84, "sender": "3Mz29fiz3zgY9JDbiHKANvHsFgQutdfu4Ua", "senderPublicKey": "CTyHhnVTxf16Z4CmGGneAK8WB5g2QyT4MB8kUn8vPPcu", "proofs": [ "4QcsFs17mwaktiEUFZrvFwLvrjz6szwARWQrkWPn522xVFWyTPaMxtPWhX2WnZouohqEBxNeWwMi1pcK12Q4NVa2" ], "script": "base64:AAIEAAAAAAAAAAsIAhIDCgEIEgASAAAAABoAAAAACXNlcGFyYXRvcgIAAAADX19fAAAAABpoYXJkY29yZWRNYXhpbXVtRGVwb3NpdEZlZQAAAAAAAAAAZAAAAAARaGFyZGNvcmVkRGFwcE5hbWUCAAAABkZPS09GRgAAAAAYaGFyZGNvcmVkQXNzZXRJZEZvcldhdmVzAgAAAAVXQVZFUwAAAAAPa2V5QXNzZXRUb1N0YWtlCQABLAAAAAIFAAAAEWhhcmRjb3JlZERhcHBOYW1lAgAAAA5fQXNzZXRUb1N0YWtlXwAAAAAUa2V5QXNzZXRzVG9TdGFrZUxpc3QJAAEsAAAAAgUAAAARaGFyZGNvcmVkRGFwcE5hbWUCAAAAEl9Bc3NldHNUb1N0YWtlTGlzdAAAAAAUa2V5RGVmYXVsdERlcG9zaXRGZWUJAAEsAAAAAgUAAAARaGFyZGNvcmVkRGFwcE5hbWUCAAAAEl9EZWZhdWx0RGVwb3NpdEZlZQAAAAASa2V5U3VmZml4SXNFbmFibGVkAgAAAApfaXNFbmFibGVkAAAAABJrZXlTdWZmaXhNaW5BbW91bnQCAAAADl9taW5pbXVtQW1vdW50AAAAABRrZXlTdWZmaXhBZnRlckhlaWdodAIAAAAdX2FsbG93U3Rha2luZ0FmdGVyQmxvY2tIZWlnaHQAAAAAE2tleVN1ZmZpeEJsb2NrRGVsYXkCAAAAH19CbG9ja3NEZWxheUFmdGVyRGVwb3NpdFRvU3Rha2UAAAAAFmtleVN1ZmZpeEVuYWJsZVNwZWNGZWUCAAAAGV9lbmFibGVTcGVjaWZpY0RlcG9zaXRGZWUAAAAAEGtleVN1ZmZpeFNwZWNGZWUCAAAAE19zcGVjaWZpY0RlcG9zaXRGZWUAAAAAC2tleVRyZWFzdXJ5CQABLAAAAAIFAAAAEWhhcmRjb3JlZERhcHBOYW1lAgAAAApfVHJlYXN1cnlfAAAAABJrZXlTZXR0aW5nc0FkZHJlc3MJAAEsAAAAAgUAAAARaGFyZGNvcmVkRGFwcE5hbWUCAAAAEF9TZXR0aW5nc0FkZHJlc3MAAAAACGtleU5vbmNlCQABLAAAAAIFAAAAEWhhcmRjb3JlZERhcHBOYW1lAgAAAAZfTm9uY2UAAAAAEGtleVN0YWtpbmdBbW91bnQJAAEsAAAAAgUAAAARaGFyZGNvcmVkRGFwcE5hbWUCAAAAD19TdGFraW5nQW1vdW50XwAAAAAYa2V5SXNzdWVkU3Rha2luZ0NvbnRyYWN0CQABLAAAAAIFAAAAEWhhcmRjb3JlZERhcHBOYW1lAgAAABFfSXNzdWVkU0NvbnRyYWN0XwAAAAAYa2V5QnVybmVkU3Rha2luZ0NvbnRyYWN0CQABLAAAAAIFAAAAEWhhcmRjb3JlZERhcHBOYW1lAgAAABFfQnVybmVkU0NvbnRyYWN0XwAAAAASa2V5QVRTQ29udHJhY3ROYW1lCQABLAAAAAIFAAAAEWhhcmRjb3JlZERhcHBOYW1lAgAAAAlDb250cmFjdDEBAAAAEmdldFNldHRpbmdzQWRkcmVzcwAAAAAJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAAR0aGlzBQAAABJrZXlTZXR0aW5nc0FkZHJlc3MBAAAABmlzU2VsZgAAAAEAAAAGY2FsbGVyAwkAAAAAAAACBQAAAAR0aGlzBQAAAAZjYWxsZXIGCQAAAAAAAAIFAAAABmNhbGxlcgkBAAAAEmdldFNldHRpbmdzQWRkcmVzcwAAAAABAAAADmNhbGNEZXBvc2l0RmVlAAAAAgAAAA9kZXBvc2l0ZWRBbW91bnQAAAAHZmVlUGVyYwQAAAADZmVlCQAAaQAAAAIJAABoAAAAAgUAAAAPZGVwb3NpdGVkQW1vdW50BQAAAAdmZWVQZXJjAAAAAAAAACcQAwkAAGYAAAACAAAAAAAAAAABBQAAAANmZWUAAAAAAAAAAAEFAAAAA2ZlZQEAAAAWZ2V0QXNzZXREZXBvc2l0RmVlUGVyYwAAAAEAAAAKYXNzZXRJZFN0cgQAAAAPc2V0dGluZ3NBZGRyZXNzCQEAAAASZ2V0U2V0dGluZ3NBZGRyZXNzAAAAAAQAAAAJa2V5T3JpZ2luCQABLAAAAAIFAAAAD2tleUFzc2V0VG9TdGFrZQUAAAAKYXNzZXRJZFN0cgQAAAAUaXNTcGVjaWZpY0ZlZUVuYWJsZWQJAQAAABFAZXh0ck5hdGl2ZSgxMDUxKQAAAAIFAAAAD3NldHRpbmdzQWRkcmVzcwkAASwAAAACBQAAAAlrZXlPcmlnaW4FAAAAFmtleVN1ZmZpeEVuYWJsZVNwZWNGZWUDCQAAAAAAAAIFAAAAFGlzU3BlY2lmaWNGZWVFbmFibGVkBgQAAAALc3BlY2lmaWNGZWUJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAAD3NldHRpbmdzQWRkcmVzcwkAASwAAAACBQAAAAlrZXlPcmlnaW4FAAAAEGtleVN1ZmZpeFNwZWNGZWUDCQAAZgAAAAIFAAAAC3NwZWNpZmljRmVlBQAAABpoYXJkY29yZWRNYXhpbXVtRGVwb3NpdEZlZQUAAAAaaGFyZGNvcmVkTWF4aW11bURlcG9zaXRGZWUDCQAAZgAAAAIAAAAAAAAAAAAFAAAAC3NwZWNpZmljRmVlAAAAAAAAAAAABQAAAAtzcGVjaWZpY0ZlZQQAAAARZGVmYXVsdERlcG9zaXRGZWUJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAAD3NldHRpbmdzQWRkcmVzcwUAAAAUa2V5RGVmYXVsdERlcG9zaXRGZWUDCQAAZgAAAAIFAAAAEWRlZmF1bHREZXBvc2l0RmVlBQAAABpoYXJkY29yZWRNYXhpbXVtRGVwb3NpdEZlZQUAAAAaaGFyZGNvcmVkTWF4aW11bURlcG9zaXRGZWUDCQAAZgAAAAIAAAAAAAAAAAAFAAAAEWRlZmF1bHREZXBvc2l0RmVlAAAAAAAAAAAABQAAABFkZWZhdWx0RGVwb3NpdEZlZQEAAAARZ2V0SW50VmFsdWVPclplcm8AAAABAAAAB2tleU5hbWUEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAEdGhpcwUAAAAHa2V5TmFtZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAVpc0ludAUAAAAHJG1hdGNoMAUAAAAFaXNJbnQAAAAAAAAAAAABAAAAC2dldE5ld05vbmNlAAAAAAQAAAAJaW5jck5vbmNlCQAAZAAAAAIJAQAAABFnZXRJbnRWYWx1ZU9yWmVybwAAAAEFAAAACGtleU5vbmNlAAAAAAAAAAABCQAETAAAAAIJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAASwAAAACCQABpAAAAAEFAAAACWluY3JOb25jZQkAAaQAAAABBQAAAAZoZWlnaHQJAARMAAAAAgUAAAAJaW5j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DXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADGNvbnRyYWN0SW5mbwAAAAAAAAAAAwQAAAAIZmVlVG9QYXkJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAxjb250cmFjdEluZm8AAAAAAAAAAAQEAAAADmFtb3VudFRvUmV0dXJuCQAAZQAAAAIFAAAADWFtb3VudFRvU3Rha2UFAAAACGZlZVRvUGF5AwkAAGYAAAACBQAAABNzdGFydGluZ0Jsb2NrSGVpZ2h0BQAAAAZoZWlnaHQJAAACAAAAAQIAAAAdc3RhcnRpbmdCbG9ja0hlaWdodCBjb3JydXB0ZWQDAwkAAGYAAAACAAAAAAAAAAABBQAAAA1hbW91bnRUb1N0YWtlBgkAAGYAAAACBQAAAA1hbW91bnRUb1N0YWtlCAUAAAAHQVRTSW5mbwAAAAhxdWFudGl0eQkAAAIAAAABAgAAABdhbW91bnRUb1N0YWtlIGNvcnJ1cHRlZAMDCQAAZgAAAAIAAAAAAAAAAAEFAAAACGZlZVRvUGF5BgkAAGYAAAACBQAAAAhmZWVUb1BheQUAAAANYW1vdW50VG9TdGFrZQkAAAIAAAABAgAAABJmZWVUb1BheSBjb3JydXB0ZWQDAwkAAGYAAAACAAAAAAAAAAABBQAAAA5hbW91bnRUb1JldHVybgYJAABmAAAAAgUAAAAOYW1vdW50VG9SZXR1cm4IBQAAAAdBVFNJbmZvAAAACHF1YW50aXR5CQAAAgAAAAECAAAAGGFtb3VudFRvUmV0dXJuIGNvcnJ1cHRlZAMJAABmAAAAAgUAAAAOYW1vdW50VG9SZXR1cm4JAAPwAAAAAgUAAAAEdGhpcwgFAAAAB0FUU0luZm8AAAACaWQJAAACAAAAAQIAAAATQVRTIGJhbGFuY2UgdG9vIGxvdwQAAAAIQVRTSWRTdHIJAAJYAAAAAQgFAAAAB0FUU0luZm8AAAACaWQEAAAAEG5ld1N0YWtpbmdBbW91bnQJAABlAAAAAgkBAAAAEWdldEludFZhbHVlT3JaZXJvAAAAAQkAASwAAAACBQAAABBrZXlTdGFraW5nQW1vdW50BQAAAAhBVFNJZFN0cgUAAAANYW1vdW50VG9TdGFrZQQAAAAPbmV3QnVybmVkQW1vdW50CQAAZAAAAAIJAQAAABFnZXRJbnRWYWx1ZU9yWmVybwAAAAEJAAEsAAAAAgUAAAAYa2V5QnVybmVkU3Rha2luZ0NvbnRyYWN0BQAAAAhBVFNJZFN0cgAAAAAAAAAAAQQAAAALbmV3VHJlYXN1cnkJAABkAAAAAgkBAAAAEWdldEludFZhbHVlT3JaZXJvAAAAAQkAASwAAAACBQAAAAtrZXlUcmVhc3VyeQUAAAAIQVRTSWRTdHIFAAAACGZlZVRvUGF5CQAETAAAAAIJAQAAAARCdXJuAAAAAgUAAAAKY29udHJhY3RJZAAAAAAAAAAAAQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAABBrZXlTdGFraW5nQW1vdW50BQAAAAhBVFNJZFN0cgUAAAAQbmV3U3Rha2luZ0Ftb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAABhrZXlCdXJuZWRTdGFraW5nQ29udHJhY3QFAAAACEFUU0lkU3RyBQAAAA9uZXdCdXJuZWRBbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgUAAAALa2V5VHJlYXN1cnkFAAAACEFUU0lkU3RyBQAAAAtuZXdUcmVhc3VyeQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADmFtb3VudFRvUmV0dXJuCAUAAAAHQVRTSW5mbwAAAAJpZAUAAAADbmlsAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAIBQAAAAJ0eAAAAA9zZW5kZXJQdWJsaWNLZXkIksRN", "height": 1443066, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: LwaV4KasN4hYdxErbUy5RtMcugPoKgF6KZajdGZVfeK Next: 7RDvmhKMvLc4ZUw1ENArFHKnfcjAV4KEdA4okpThQsn5 Diff:
OldNewDifferences
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "___"
55
6-let keyLockableAsset = "dApp_LockableAsset_"
6+let hardcoredMaximumDepositFee = 100
77
8-let keyLockableAssetsList = "dApp_LockableAssetsList"
8+let hardcoredDappName = "FOKOFF"
99
10-func checkAsset (assetId) = match assetInfo(assetId) {
11- case isAsset: Asset =>
12- true
10+let hardcoredAssetIdForWaves = "WAVES"
11+
12+let keyAssetToStake = (hardcoredDappName + "_AssetToStake_")
13+
14+let keyAssetsToStakeList = (hardcoredDappName + "_AssetsToStakeList")
15+
16+let keyDefaultDepositFee = (hardcoredDappName + "_DefaultDepositFee")
17+
18+let keySuffixIsEnabled = "_isEnabled"
19+
20+let keySuffixMinAmount = "_minimumAmount"
21+
22+let keySuffixAfterHeight = "_allowStakingAfterBlockHeight"
23+
24+let keySuffixBlockDelay = "_BlocksDelayAfterDepositToStake"
25+
26+let keySuffixEnableSpecFee = "_enableSpecificDepositFee"
27+
28+let keySuffixSpecFee = "_specificDepositFee"
29+
30+let keyTreasury = (hardcoredDappName + "_Treasury_")
31+
32+let keySettingsAddress = (hardcoredDappName + "_SettingsAddress")
33+
34+let keyNonce = (hardcoredDappName + "_Nonce")
35+
36+let keyStakingAmount = (hardcoredDappName + "_StakingAmount_")
37+
38+let keyIssuedStakingContract = (hardcoredDappName + "_IssuedSContract_")
39+
40+let keyBurnedStakingContract = (hardcoredDappName + "_BurnedSContract_")
41+
42+let keyATSContractName = (hardcoredDappName + "Contract1")
43+
44+func getSettingsAddress () = Address(fromBase58String(getStringValue(this, keySettingsAddress)))
45+
46+
47+func isSelf (caller) = if ((this == caller))
48+ then true
49+ else (caller == getSettingsAddress())
50+
51+
52+func calcDepositFee (depositedAmount,feePerc) = {
53+ let fee = ((depositedAmount * feePerc) / 10000)
54+ if ((1 > fee))
55+ then 1
56+ else fee
57+ }
58+
59+
60+func getAssetDepositFeePerc (assetIdStr) = {
61+ let settingsAddress = getSettingsAddress()
62+ let keyOrigin = (keyAssetToStake + assetIdStr)
63+ let isSpecificFeeEnabled = getBooleanValue(settingsAddress, (keyOrigin + keySuffixEnableSpecFee))
64+ if ((isSpecificFeeEnabled == true))
65+ then {
66+ let specificFee = getIntegerValue(settingsAddress, (keyOrigin + keySuffixSpecFee))
67+ if ((specificFee > hardcoredMaximumDepositFee))
68+ then hardcoredMaximumDepositFee
69+ else if ((0 > specificFee))
70+ then 0
71+ else specificFee
72+ }
73+ else {
74+ let defaultDepositFee = getIntegerValue(settingsAddress, keyDefaultDepositFee)
75+ if ((defaultDepositFee > hardcoredMaximumDepositFee))
76+ then hardcoredMaximumDepositFee
77+ else if ((0 > defaultDepositFee))
78+ then 0
79+ else defaultDepositFee
80+ }
81+ }
82+
83+
84+func getIntValueOrZero (keyName) = match getInteger(this, keyName) {
85+ case isInt: Int =>
86+ isInt
1387 case _ =>
14- false
88+ 0
1589 }
1690
1791
18-func addEntryToStringList (stringList,entry) = if ((1 > size(stringList)))
19- then entry
20- else ((stringList + separator) + entry)
21-
22-
23-func isLockableAsset (assetIdStr) = match getString(this, (keyLockableAsset + assetIdStr)) {
24- case isLockable: String =>
25- true
26- case _ =>
27- false
28-}
92+func getNewNonce () = {
93+ let incrNonce = (getIntValueOrZero(keyNonce) + 1)
94+[parseIntValue((toString(incrNonce) + toString(height))), incrNonce]
95+ }
2996
3097
3198 @Callable(i)
32-func init () = [StringEntry(keyLockableAssetsList, "")]
99+func updateSettingsAddress (newAddress) = if ((this != i.caller))
100+ then throw("Access denied")
101+ else [StringEntry(keySettingsAddress, newAddress)]
33102
34103
35104
36105 @Callable(i)
37-func opAddLockableAsset (assetIdStr) = {
38- let assetId = fromBase58String(assetIdStr)
39- if ((this != i.caller))
40- then throw("Access denied")
41- else if ((checkAsset(assetId) == false))
42- then throw("Not an existing asset")
43- else if ((isLockableAsset(assetIdStr) == true))
44- then throw("Asset is already lockable")
106+func depositAssetToStake () = if ((isSelf(i.caller) != false))
107+ then throw("dApp can't act for self")
108+ else if ((size(i.payments) != 1))
109+ then throw("Not a valid amount of payments (require 1)")
110+ else {
111+ let amount = i.payments[0].amount
112+ let assetIdStr = match i.payments[0].assetId {
113+ case isAsset: ByteVector =>
114+ toBase58String(isAsset)
115+ case _ =>
116+ hardcoredAssetIdForWaves
117+ }
118+ let keyOrigin = (keyAssetToStake + assetIdStr)
119+ let settingAddress = getSettingsAddress()
120+ let isEnabled = getBooleanValue(settingAddress, (keyOrigin + keySuffixIsEnabled))
121+ let minimumAmount = getIntegerValue(settingAddress, (keyOrigin + keySuffixMinAmount))
122+ if ((isEnabled != true))
123+ then throw("Disabled")
124+ else if ((minimumAmount > amount))
125+ then throw("Below minimum amount")
126+ else {
127+ let depositFee = calcDepositFee(amount, getAssetDepositFeePerc(assetIdStr))
128+ let nonce = getNewNonce()
129+ let ATSContractDesc = ((((((((toString(height) + separator) + toBase58String(i.caller.bytes)) + separator) + assetIdStr) + separator) + toString(amount)) + separator) + toString(depositFee))
130+ let ATSContract = Issue(keyATSContractName, ATSContractDesc, 1, 0, false, unit, nonce[0])
131+ let ATSContractId = calculateAssetId(ATSContract)
132+ let newStakingAmount = (getIntValueOrZero((keyStakingAmount + assetIdStr)) + amount)
133+ let newIssuedAmount = (getIntValueOrZero((keyIssuedStakingContract + assetIdStr)) + 1)
134+[IntegerEntry(keyNonce, nonce[1]), IntegerEntry((keyStakingAmount + assetIdStr), newStakingAmount), IntegerEntry((keyIssuedStakingContract + assetIdStr), newIssuedAmount), ATSContract, ScriptTransfer(i.caller, ATSContract.quantity, ATSContractId)]
135+ }
136+ }
137+
138+
139+
140+@Callable(i)
141+func withdrawAssetToStake () = if ((isSelf(i.caller) != false))
142+ then throw("dApp can't act for self")
143+ else if ((size(i.payments) != 1))
144+ then throw("Not a valid amount of payments (require 1)")
145+ else {
146+ let contractId = match i.payments[0].assetId {
147+ case isBV: ByteVector =>
148+ isBV
149+ case _ =>
150+ throw("Contract is an Asset, not Waves")
151+ }
152+ let contractDetails = match assetInfo(contractId) {
153+ case isAsset: Asset =>
154+ isAsset
155+ case _ =>
156+ throw("Contract should be an existing Asset")
157+ }
158+ if (if (if (if (if ((contractDetails.issuer != this))
159+ then true
160+ else (contractDetails.decimals != 0))
161+ then true
162+ else (contractDetails.quantity != 1))
163+ then true
164+ else (contractDetails.reissuable != false))
165+ then true
166+ else (contractDetails.name != keyATSContractName))
167+ then throw("Corrupted Contract")
45168 else {
46- let updatedLockableAssetsList = addEntryToStringList(getStringValue(this, keyLockableAssetsList), assetIdStr)
47-[StringEntry(keyLockableAssetsList, updatedLockableAssetsList), StringEntry((keyLockableAsset + assetIdStr), "test")]
169+ let contractInfo = split(contractDetails.description, separator)
170+ let startingBlockHeight = parseIntValue(contractInfo[0])
171+ let stakerAddress = addressFromStringValue(contractInfo[1])
172+ let ATSInfo = match assetInfo(fromBase58String(contractInfo[2])) {
173+ case isAsset: Asset =>
174+ isAsset
175+ case _ =>
176+ throw("ATS Contract not recognized")
48177 }
49- }
178+ let amountToStake = parseIntValue(contractInfo[3])
179+ let feeToPay = parseIntValue(contractInfo[4])
180+ let amountToReturn = (amountToStake - feeToPay)
181+ if ((startingBlockHeight > height))
182+ then throw("startingBlockHeight corrupted")
183+ else if (if ((1 > amountToStake))
184+ then true
185+ else (amountToStake > ATSInfo.quantity))
186+ then throw("amountToStake corrupted")
187+ else if (if ((1 > feeToPay))
188+ then true
189+ else (feeToPay > amountToStake))
190+ then throw("feeToPay corrupted")
191+ else if (if ((1 > amountToReturn))
192+ then true
193+ else (amountToReturn > ATSInfo.quantity))
194+ then throw("amountToReturn corrupted")
195+ else if ((amountToReturn > assetBalance(this, ATSInfo.id)))
196+ then throw("ATS balance too low")
197+ else {
198+ let ATSIdStr = toBase58String(ATSInfo.id)
199+ let newStakingAmount = (getIntValueOrZero((keyStakingAmount + ATSIdStr)) - amountToStake)
200+ let newBurnedAmount = (getIntValueOrZero((keyBurnedStakingContract + ATSIdStr)) + 1)
201+ let newTreasury = (getIntValueOrZero((keyTreasury + ATSIdStr)) + feeToPay)
202+[Burn(contractId, 1), IntegerEntry((keyStakingAmount + ATSIdStr), newStakingAmount), IntegerEntry((keyBurnedStakingContract + ATSIdStr), newBurnedAmount), IntegerEntry((keyTreasury + ATSIdStr), newTreasury), ScriptTransfer(i.caller, amountToReturn, ATSInfo.id)]
203+ }
204+ }
205+ }
50206
51207
52208 @Verifier(tx)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "___"
55
6-let keyLockableAsset = "dApp_LockableAsset_"
6+let hardcoredMaximumDepositFee = 100
77
8-let keyLockableAssetsList = "dApp_LockableAssetsList"
8+let hardcoredDappName = "FOKOFF"
99
10-func checkAsset (assetId) = match assetInfo(assetId) {
11- case isAsset: Asset =>
12- true
10+let hardcoredAssetIdForWaves = "WAVES"
11+
12+let keyAssetToStake = (hardcoredDappName + "_AssetToStake_")
13+
14+let keyAssetsToStakeList = (hardcoredDappName + "_AssetsToStakeList")
15+
16+let keyDefaultDepositFee = (hardcoredDappName + "_DefaultDepositFee")
17+
18+let keySuffixIsEnabled = "_isEnabled"
19+
20+let keySuffixMinAmount = "_minimumAmount"
21+
22+let keySuffixAfterHeight = "_allowStakingAfterBlockHeight"
23+
24+let keySuffixBlockDelay = "_BlocksDelayAfterDepositToStake"
25+
26+let keySuffixEnableSpecFee = "_enableSpecificDepositFee"
27+
28+let keySuffixSpecFee = "_specificDepositFee"
29+
30+let keyTreasury = (hardcoredDappName + "_Treasury_")
31+
32+let keySettingsAddress = (hardcoredDappName + "_SettingsAddress")
33+
34+let keyNonce = (hardcoredDappName + "_Nonce")
35+
36+let keyStakingAmount = (hardcoredDappName + "_StakingAmount_")
37+
38+let keyIssuedStakingContract = (hardcoredDappName + "_IssuedSContract_")
39+
40+let keyBurnedStakingContract = (hardcoredDappName + "_BurnedSContract_")
41+
42+let keyATSContractName = (hardcoredDappName + "Contract1")
43+
44+func getSettingsAddress () = Address(fromBase58String(getStringValue(this, keySettingsAddress)))
45+
46+
47+func isSelf (caller) = if ((this == caller))
48+ then true
49+ else (caller == getSettingsAddress())
50+
51+
52+func calcDepositFee (depositedAmount,feePerc) = {
53+ let fee = ((depositedAmount * feePerc) / 10000)
54+ if ((1 > fee))
55+ then 1
56+ else fee
57+ }
58+
59+
60+func getAssetDepositFeePerc (assetIdStr) = {
61+ let settingsAddress = getSettingsAddress()
62+ let keyOrigin = (keyAssetToStake + assetIdStr)
63+ let isSpecificFeeEnabled = getBooleanValue(settingsAddress, (keyOrigin + keySuffixEnableSpecFee))
64+ if ((isSpecificFeeEnabled == true))
65+ then {
66+ let specificFee = getIntegerValue(settingsAddress, (keyOrigin + keySuffixSpecFee))
67+ if ((specificFee > hardcoredMaximumDepositFee))
68+ then hardcoredMaximumDepositFee
69+ else if ((0 > specificFee))
70+ then 0
71+ else specificFee
72+ }
73+ else {
74+ let defaultDepositFee = getIntegerValue(settingsAddress, keyDefaultDepositFee)
75+ if ((defaultDepositFee > hardcoredMaximumDepositFee))
76+ then hardcoredMaximumDepositFee
77+ else if ((0 > defaultDepositFee))
78+ then 0
79+ else defaultDepositFee
80+ }
81+ }
82+
83+
84+func getIntValueOrZero (keyName) = match getInteger(this, keyName) {
85+ case isInt: Int =>
86+ isInt
1387 case _ =>
14- false
88+ 0
1589 }
1690
1791
18-func addEntryToStringList (stringList,entry) = if ((1 > size(stringList)))
19- then entry
20- else ((stringList + separator) + entry)
21-
22-
23-func isLockableAsset (assetIdStr) = match getString(this, (keyLockableAsset + assetIdStr)) {
24- case isLockable: String =>
25- true
26- case _ =>
27- false
28-}
92+func getNewNonce () = {
93+ let incrNonce = (getIntValueOrZero(keyNonce) + 1)
94+[parseIntValue((toString(incrNonce) + toString(height))), incrNonce]
95+ }
2996
3097
3198 @Callable(i)
32-func init () = [StringEntry(keyLockableAssetsList, "")]
99+func updateSettingsAddress (newAddress) = if ((this != i.caller))
100+ then throw("Access denied")
101+ else [StringEntry(keySettingsAddress, newAddress)]
33102
34103
35104
36105 @Callable(i)
37-func opAddLockableAsset (assetIdStr) = {
38- let assetId = fromBase58String(assetIdStr)
39- if ((this != i.caller))
40- then throw("Access denied")
41- else if ((checkAsset(assetId) == false))
42- then throw("Not an existing asset")
43- else if ((isLockableAsset(assetIdStr) == true))
44- then throw("Asset is already lockable")
106+func depositAssetToStake () = if ((isSelf(i.caller) != false))
107+ then throw("dApp can't act for self")
108+ else if ((size(i.payments) != 1))
109+ then throw("Not a valid amount of payments (require 1)")
110+ else {
111+ let amount = i.payments[0].amount
112+ let assetIdStr = match i.payments[0].assetId {
113+ case isAsset: ByteVector =>
114+ toBase58String(isAsset)
115+ case _ =>
116+ hardcoredAssetIdForWaves
117+ }
118+ let keyOrigin = (keyAssetToStake + assetIdStr)
119+ let settingAddress = getSettingsAddress()
120+ let isEnabled = getBooleanValue(settingAddress, (keyOrigin + keySuffixIsEnabled))
121+ let minimumAmount = getIntegerValue(settingAddress, (keyOrigin + keySuffixMinAmount))
122+ if ((isEnabled != true))
123+ then throw("Disabled")
124+ else if ((minimumAmount > amount))
125+ then throw("Below minimum amount")
126+ else {
127+ let depositFee = calcDepositFee(amount, getAssetDepositFeePerc(assetIdStr))
128+ let nonce = getNewNonce()
129+ let ATSContractDesc = ((((((((toString(height) + separator) + toBase58String(i.caller.bytes)) + separator) + assetIdStr) + separator) + toString(amount)) + separator) + toString(depositFee))
130+ let ATSContract = Issue(keyATSContractName, ATSContractDesc, 1, 0, false, unit, nonce[0])
131+ let ATSContractId = calculateAssetId(ATSContract)
132+ let newStakingAmount = (getIntValueOrZero((keyStakingAmount + assetIdStr)) + amount)
133+ let newIssuedAmount = (getIntValueOrZero((keyIssuedStakingContract + assetIdStr)) + 1)
134+[IntegerEntry(keyNonce, nonce[1]), IntegerEntry((keyStakingAmount + assetIdStr), newStakingAmount), IntegerEntry((keyIssuedStakingContract + assetIdStr), newIssuedAmount), ATSContract, ScriptTransfer(i.caller, ATSContract.quantity, ATSContractId)]
135+ }
136+ }
137+
138+
139+
140+@Callable(i)
141+func withdrawAssetToStake () = if ((isSelf(i.caller) != false))
142+ then throw("dApp can't act for self")
143+ else if ((size(i.payments) != 1))
144+ then throw("Not a valid amount of payments (require 1)")
145+ else {
146+ let contractId = match i.payments[0].assetId {
147+ case isBV: ByteVector =>
148+ isBV
149+ case _ =>
150+ throw("Contract is an Asset, not Waves")
151+ }
152+ let contractDetails = match assetInfo(contractId) {
153+ case isAsset: Asset =>
154+ isAsset
155+ case _ =>
156+ throw("Contract should be an existing Asset")
157+ }
158+ if (if (if (if (if ((contractDetails.issuer != this))
159+ then true
160+ else (contractDetails.decimals != 0))
161+ then true
162+ else (contractDetails.quantity != 1))
163+ then true
164+ else (contractDetails.reissuable != false))
165+ then true
166+ else (contractDetails.name != keyATSContractName))
167+ then throw("Corrupted Contract")
45168 else {
46- let updatedLockableAssetsList = addEntryToStringList(getStringValue(this, keyLockableAssetsList), assetIdStr)
47-[StringEntry(keyLockableAssetsList, updatedLockableAssetsList), StringEntry((keyLockableAsset + assetIdStr), "test")]
169+ let contractInfo = split(contractDetails.description, separator)
170+ let startingBlockHeight = parseIntValue(contractInfo[0])
171+ let stakerAddress = addressFromStringValue(contractInfo[1])
172+ let ATSInfo = match assetInfo(fromBase58String(contractInfo[2])) {
173+ case isAsset: Asset =>
174+ isAsset
175+ case _ =>
176+ throw("ATS Contract not recognized")
48177 }
49- }
178+ let amountToStake = parseIntValue(contractInfo[3])
179+ let feeToPay = parseIntValue(contractInfo[4])
180+ let amountToReturn = (amountToStake - feeToPay)
181+ if ((startingBlockHeight > height))
182+ then throw("startingBlockHeight corrupted")
183+ else if (if ((1 > amountToStake))
184+ then true
185+ else (amountToStake > ATSInfo.quantity))
186+ then throw("amountToStake corrupted")
187+ else if (if ((1 > feeToPay))
188+ then true
189+ else (feeToPay > amountToStake))
190+ then throw("feeToPay corrupted")
191+ else if (if ((1 > amountToReturn))
192+ then true
193+ else (amountToReturn > ATSInfo.quantity))
194+ then throw("amountToReturn corrupted")
195+ else if ((amountToReturn > assetBalance(this, ATSInfo.id)))
196+ then throw("ATS balance too low")
197+ else {
198+ let ATSIdStr = toBase58String(ATSInfo.id)
199+ let newStakingAmount = (getIntValueOrZero((keyStakingAmount + ATSIdStr)) - amountToStake)
200+ let newBurnedAmount = (getIntValueOrZero((keyBurnedStakingContract + ATSIdStr)) + 1)
201+ let newTreasury = (getIntValueOrZero((keyTreasury + ATSIdStr)) + feeToPay)
202+[Burn(contractId, 1), IntegerEntry((keyStakingAmount + ATSIdStr), newStakingAmount), IntegerEntry((keyBurnedStakingContract + ATSIdStr), newBurnedAmount), IntegerEntry((keyTreasury + ATSIdStr), newTreasury), ScriptTransfer(i.caller, amountToReturn, ATSInfo.id)]
203+ }
204+ }
205+ }
50206
51207
52208 @Verifier(tx)
53209 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
54210

github/deemru/w8io/169f3d6 
50.15 ms