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:
Old | New | Differences | |
---|---|---|---|
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let separator = "___" | |
5 | 5 | ||
6 | - | let | |
6 | + | let hardcoredMaximumDepositFee = 100 | |
7 | 7 | ||
8 | - | let | |
8 | + | let hardcoredDappName = "FOKOFF" | |
9 | 9 | ||
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 | |
13 | 87 | case _ => | |
14 | - | | |
88 | + | 0 | |
15 | 89 | } | |
16 | 90 | ||
17 | 91 | ||
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 | + | } | |
29 | 96 | ||
30 | 97 | ||
31 | 98 | @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)] | |
33 | 102 | ||
34 | 103 | ||
35 | 104 | ||
36 | 105 | @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") | |
45 | 168 | 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") | |
48 | 177 | } | |
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 | + | } | |
50 | 206 | ||
51 | 207 | ||
52 | 208 | @Verifier(tx) |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let separator = "___" | |
5 | 5 | ||
6 | - | let | |
6 | + | let hardcoredMaximumDepositFee = 100 | |
7 | 7 | ||
8 | - | let | |
8 | + | let hardcoredDappName = "FOKOFF" | |
9 | 9 | ||
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 | |
13 | 87 | case _ => | |
14 | - | | |
88 | + | 0 | |
15 | 89 | } | |
16 | 90 | ||
17 | 91 | ||
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 | + | } | |
29 | 96 | ||
30 | 97 | ||
31 | 98 | @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)] | |
33 | 102 | ||
34 | 103 | ||
35 | 104 | ||
36 | 105 | @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") | |
45 | 168 | 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") | |
48 | 177 | } | |
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 | + | } | |
50 | 206 | ||
51 | 207 | ||
52 | 208 | @Verifier(tx) | |
53 | 209 | func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
54 | 210 |
github/deemru/w8io/169f3d6 50.15 ms ◑![]()