tx · DcrEWWntZno6yxieTze2yxH7PLmDxqCN7xumMmnCRUmt 3PJ7RB5CC3Bnn44RNR2hceZ6wKsULnMSxPi: -0.01400000 Waves 2021.01.13 14:42 [2415386] smart account 3PJ7RB5CC3Bnn44RNR2hceZ6wKsULnMSxPi > SELF 0.00000000 Waves
{ "type": 13, "id": "DcrEWWntZno6yxieTze2yxH7PLmDxqCN7xumMmnCRUmt", "fee": 1400000, "feeAssetId": null, "timestamp": 1610538057370, "version": 1, "sender": "3PJ7RB5CC3Bnn44RNR2hceZ6wKsULnMSxPi", "senderPublicKey": "G5ztBKfbizrqVQWMZknsgbG2HS91eJ7QgHh7X3AznjoW", "proofs": [ "3PurkxJn4nN1riumPjLaifGt3c5srL3NB97HXsMsLpDRZdP3L79XBw455FqHQzdsCyo3TvN2mDR5CdGzaMcRoqYk", "3e1uC4MxSRapZaYMs9rdP4Ldr4KByaedZh9CuxNzfJhLdDb8RMo5if4Vp5ydSsUGgrdCMLh5mpJhm18qF6owAnww" ], "script": "base64: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eQUAAAAOd2V4Y2hQdWJsaWNLZXkHAwMDCQAAAAAAAAIIBQAAAAFvAAAACW9yZGVyVHlwZQUAAAADQnV5CQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAgFAAAAAW8AAAAJYXNzZXRQYWlyAAAAC2Ftb3VudEFzc2V0BwYDCQAAAAAAAAIIBQAAAAFvAAAACW9yZGVyVHlwZQUAAAAEU2VsbAkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAACXBvcnRmb2xpbwgIBQAAAAFvAAAACWFzc2V0UGFpcgAAAApwcmljZUFzc2V0BwYDCQEAAAABIQAAAAEJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAlwb3J0Zm9saW8ICAUAAAABbwAAAAlhc3NldFBhaXIAAAAKcHJpY2VBc3NldAkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAgFAAAAAW8AAAAJYXNzZXRQYWlyAAAAC2Ftb3VudEFzc2V0BwcJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAACW91ckFzc2V0cwgIBQAAAAFvAAAACWFzc2V0UGFpcgAAAApwcmljZUFzc2V0BwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJb3VyQXNzZXRzCAgFAAAAAW8AAAAJYXNzZXRQYWlyAAAAC2Ftb3VudEFzc2V0BwMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAF01hc3NUcmFuc2ZlclRyYW5zYWN0aW9uBgkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABNUcmFuc2ZlclRyYW5zYWN0aW9uBAAAAAF0BQAAAAckbWF0Y2gwAwMDBQAAAAxpc1ZhbGlkQWRtaW4FAAAAEWlzVmFsaWRHdWFyYW50b3JzBwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAUAAAABdAAAAAdhc3NldElkBwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAUAAAABdAAAAApmZWVBc3NldElkBwMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAFFNldFNjcmlwdFRyYW5zYWN0aW9uBgkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAA9EYXRhVHJhbnNhY3Rpb24DBQAAAAxpc1ZhbGlkQWRtaW4FAAAAEWlzVmFsaWRHdWFyYW50b3JzBwf0kjzD", "chainId": 87, "height": 2415386, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9pdYD91n9ytfJR45UqyvdZHWVVfWisCGNjzrFvrN7wif Next: GwJQUokVqMd1MJ4R6FtLLPRUC8a8tgwE1TjxqwPeSNSF Diff:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let ScriptVersion = "2. | |
4 | + | let ScriptVersion = "1.2.3-beta_20210113" | |
5 | 5 | ||
6 | 6 | let percent = 10000 | |
7 | 7 | ||
9 | 9 | ||
10 | 10 | let decMult = 100000000 | |
11 | 11 | ||
12 | - | let | |
12 | + | let feePerc = 20 | |
13 | 13 | ||
14 | - | let | |
14 | + | let minAmount = (1 * usdMult) | |
15 | 15 | ||
16 | - | let salePercent = ((30 * percent) / 100) | |
16 | + | let avgMonth = ((31556952 * 1000) / 12) | |
17 | + | ||
18 | + | let openTimestamp = (1609573796 * 1000) | |
17 | 19 | ||
18 | 20 | let adminPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k' | |
19 | 21 | ||
37 | 39 | ||
38 | 40 | let xfeeAsset = base58'5EMfVQiB8NF4HuhaXrZzDM637whWuVBsduq59ZaCSNqk' | |
39 | 41 | ||
40 | - | let portfolio = [ | |
42 | + | let portfolio = [usdtAsset, usdcAsset] | |
41 | 43 | ||
42 | 44 | let ourAssets = [fhfsAsset, xfeeAsset, ratsAsset] | |
43 | - | ||
44 | - | let majorSize = 1 | |
45 | - | ||
46 | - | let majorMult = 2 | |
47 | - | ||
48 | - | let altMult = (majorMult * (size(portfolio) - majorSize)) | |
49 | 45 | ||
50 | 46 | let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x') | |
51 | 47 | ||
81 | 77 | else [IntegerEntry("timestamp", lastBlock.timestamp)] | |
82 | 78 | ||
83 | 79 | ||
84 | - | func excessAmount (assetId) = { | |
85 | - | let fmainFunds = assetBalance(fmain, assetId) | |
86 | - | let totalFunds = (fmainFunds + assetBalance(fcold, assetId)) | |
87 | - | valueOrMinimum((fraction(totalFunds, salePercent, percent) - fmainFunds), 0) | |
88 | - | } | |
80 | + | func getAttachment (payments,idx) = if ((idx >= size(payments))) | |
81 | + | then $Tuple2(base58'', 0) | |
82 | + | else $Tuple2(payments[idx].assetId, payments[idx].amount) | |
89 | 83 | ||
90 | 84 | ||
91 | 85 | func airdropBalance (assetId) = if (containsElement((portfolio ++ ourAssets), assetId)) | |
95 | 89 | else assetBalance(this, assetId) | |
96 | 90 | ||
97 | 91 | ||
98 | - | func toDateTimeString (timestamp) = { | |
99 | - | let sp = toBytes(" ") | |
100 | - | let zd = toBytes(" UTC") | |
101 | - | let norm = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365] | |
102 | - | let leap = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366] | |
103 | - | let epoch = (((((1969 * 365) + (1969 / 4)) - (1969 / 100)) + (1969 / 400)) + 366) | |
104 | - | let ce = (timestamp + ((epoch * 86400) * 1000)) | |
105 | - | if (((-12212553600 * 1000) > timestamp)) | |
106 | - | then throw("ISO 8601: Only years after 1583 inclusive are allowed!") | |
107 | - | else { | |
108 | - | let date = { | |
109 | - | let yyyy = ((ce / (31556952 * 1000)) - 1) | |
110 | - | let ytd = ((ce / (86400 * 1000)) - (((((yyyy * 365) + (yyyy / 4)) - (yyyy / 100)) + (yyyy / 400)) + 366)) | |
111 | - | let months = if (if (if ((((yyyy + 1) % 4) == 0)) | |
112 | - | then (((yyyy + 1) % 100) != 0) | |
113 | - | else false) | |
114 | - | then true | |
115 | - | else (((yyyy + 1) % 400) == 0)) | |
116 | - | then leap | |
117 | - | else norm | |
118 | - | let mm = if (if ((0 > ytd)) | |
119 | - | then true | |
120 | - | else (ytd >= months[12])) | |
121 | - | then throw("Unexpected error: Value overflow for months!") | |
122 | - | else if ((ytd >= months[11])) | |
123 | - | then 11 | |
124 | - | else if ((ytd >= months[10])) | |
125 | - | then 10 | |
126 | - | else if ((ytd >= months[9])) | |
127 | - | then 9 | |
128 | - | else if ((ytd >= months[8])) | |
129 | - | then 8 | |
130 | - | else if ((ytd >= months[7])) | |
131 | - | then 7 | |
132 | - | else if ((ytd >= months[6])) | |
133 | - | then 6 | |
134 | - | else if ((ytd >= months[5])) | |
135 | - | then 5 | |
136 | - | else if ((ytd >= months[4])) | |
137 | - | then 4 | |
138 | - | else if ((ytd >= months[3])) | |
139 | - | then 3 | |
140 | - | else if ((ytd >= months[2])) | |
141 | - | then 2 | |
142 | - | else if ((ytd >= months[1])) | |
143 | - | then 1 | |
144 | - | else 0 | |
145 | - | let dd = (ytd - months[mm]) | |
146 | - | ((((drop(toBytes(toString((yyyy + 1))), 0) + base58'n') + drop(toBytes(toString((mm + 101))), 1)) + base58'n') + drop(toBytes(toString((dd + 101))), 1)) | |
147 | - | } | |
148 | - | let time = { | |
149 | - | let rd = (ce % (86400 * 1000)) | |
150 | - | let hh = (rd / (3600 * 1000)) | |
151 | - | let rh = (rd % (3600 * 1000)) | |
152 | - | let mm = (rh / (60 * 1000)) | |
153 | - | let rm = (rh % (60 * 1000)) | |
154 | - | let ss = (rm / 1000) | |
155 | - | let ms = (rm % 1000) | |
156 | - | ((((drop(toBytes(toString((hh + 100))), 1) + base58'21') + drop(toBytes(toString((mm + 100))), 1)) + base58'21') + drop(toBytes(toString((ss + 100))), 1)) | |
157 | - | } | |
158 | - | toUtf8String((((date + sp) + time) + zd)) | |
159 | - | } | |
92 | + | func toFloatString (val,dec) = toUtf8String(if ((val == 0)) | |
93 | + | then base58'q' | |
94 | + | else if ((val > 0)) | |
95 | + | then ((toBytes(toString((val / dec))) + base58'o') + take(drop(toBytes(toString(((val % dec) + dec))), 1), 8)) | |
96 | + | else throw("Unexpected error: Negative values are not allowed!")) | |
97 | + | ||
98 | + | ||
99 | + | func withdraw (i,assetId) = { | |
100 | + | let $t055455596 = getAttachment(i.payments, 0) | |
101 | + | let asset0 = $t055455596._1 | |
102 | + | let amount0 = $t055455596._2 | |
103 | + | let $t055995650 = getAttachment(i.payments, 1) | |
104 | + | let asset1 = $t055995650._1 | |
105 | + | let amount1 = $t055995650._2 | |
106 | + | let thisFunds = assetBalance(this, assetId) | |
107 | + | let maxAmount = fractionRound(thisFunds, ratsFunds, usdxFunds) | |
108 | + | let inAmount = (amount0 + amount1) | |
109 | + | let outAmount = fractionRound(inAmount, usdxFunds, ratsFunds) | |
110 | + | let feeAmount = fractionRound(outAmount, feePerc, percent) | |
111 | + | let netAmount = valueOrMinimum((outAmount - feeAmount), 0) | |
112 | + | let assetSymbol = if ((assetId == usdtAsset)) | |
113 | + | then "USDT" | |
114 | + | else if ((assetId == usdcAsset)) | |
115 | + | then "USDC" | |
116 | + | else throw("Unexpected error: This asset cannot be withdrawn!") | |
117 | + | if (if (if (if ((1 > inAmount)) | |
118 | + | then true | |
119 | + | else (inAmount > maxAmount)) | |
120 | + | then true | |
121 | + | else if ((amount0 > 0)) | |
122 | + | then (asset0 != ratsAsset) | |
123 | + | else false) | |
124 | + | then true | |
125 | + | else if ((amount1 > 0)) | |
126 | + | then (asset1 != ratsAsset) | |
127 | + | else false) | |
128 | + | then throw(makeString([("Withdraw" + assetSymbol), "() =>", "Please attach only Rat's Share (RATS) assets!", "Max. amount:", toFloatString(maxAmount, usdMult), "RATS"], " ")) | |
129 | + | else ([ScriptTransfer(i.caller, netAmount, assetId)] ++ adminTimestamp(i.callerPublicKey)) | |
160 | 130 | } | |
161 | 131 | ||
162 | 132 | ||
163 | 133 | @Callable(i) | |
164 | - | func AutoFixProfit (newMult) = { | |
165 | - | let oldProfit = valueOrElse(getInteger(this, "fixedProfit"), 0) | |
166 | - | let riskPercent = valueOrElse(getInteger(this, "riskPercent"), (percent / 100)) | |
167 | - | let usdtFunds = fraction(fhfsFunds, fhfsPrice, decMult) | |
168 | - | let riskAmount = fraction(usdtFunds, riskPercent, (altMult * percent)) | |
169 | - | let minMult = ((oldProfit / riskAmount) + 1) | |
170 | - | let newProfit = (newMult * riskAmount) | |
171 | - | let usdtAmount = valueOrMinimum((newProfit - oldProfit), 0) | |
172 | - | let ratsAmount = fractionRound(usdtAmount, ratsFunds, usdxFunds) | |
173 | - | if ((minMult > newMult)) | |
174 | - | then throw(makeString([(("AutoFixProfit (" + toString(newMult)) + ") =>"), "Inavlid value! Min. multiplier:", toString(minMult)], " ")) | |
175 | - | else if ((size(i.payments) > 0)) | |
176 | - | then throw(makeString(["AutoFixProfit (...) =>", "Don't attach payment when calling this function ..."], " ")) | |
177 | - | else if (if ((i.callerPublicKey != adminPublicKey)) | |
178 | - | then (i.callerPublicKey != robotPublicKey) | |
179 | - | else false) | |
180 | - | then throw(makeString(["AutoFixProfit (...) =>", "This action can only be performed by an administrator!"], " ")) | |
181 | - | else ([IntegerEntry("fixedProfit", newProfit), ScriptTransfer(frats, usdtAmount, usdtAsset), ScriptTransfer(fmain, ratsAmount, ratsAsset)] ++ adminTimestamp(i.callerPublicKey)) | |
134 | + | func GetMeanPrice () = { | |
135 | + | let return = valueOrMinimum((usdxFunds - ratsFunds), 0) | |
136 | + | let meanPrice = fractionRound(decMult, usdxFunds, ratsFunds) | |
137 | + | let duration = (lastBlock.timestamp - openTimestamp) | |
138 | + | let exponent = fractionRound(decMult, (12 * avgMonth), duration) | |
139 | + | let meanReturn = (pow(meanPrice, 8, exponent, 8, 4, HALFUP) - percent) | |
140 | + | throw(makeString(["GetMeanPrice () =>", "balance:", toFloatString(usdxFunds, usdMult), "USDx;", "gross return:", toFloatString(return, usdMult), "USDx", (("(" + toFloatString(meanReturn, (percent / 100))) + "% / an);"), "mean price:", toFloatString(meanPrice, decMult), "USDx / RATS"], " ")) | |
182 | 141 | } | |
183 | 142 | ||
184 | 143 | ||
185 | 144 | ||
186 | 145 | @Callable(i) | |
187 | - | func AutoRebalance () = { | |
188 | - | let fhfsSupply = valueOrElse(getInteger(fmain, "fhfsSupply"), (100 * decMult)) | |
189 | - | let fhfsExcessAmount = valueOrMinimum((fhfsSupply - assetBalance(fmain, fhfsAsset)), 0) | |
190 | - | if ((size(i.payments) > 0)) | |
191 | - | then throw(makeString(["AutoRebalance () =>", "Don't attach payment when calling this function ..."], " ")) | |
192 | - | else if (if ((i.callerPublicKey != adminPublicKey)) | |
193 | - | then (i.callerPublicKey != robotPublicKey) | |
146 | + | func DepositFunds () = { | |
147 | + | let userFunds = assetBalance(i.caller, fhfsAsset) | |
148 | + | let $t073977448 = getAttachment(i.payments, 0) | |
149 | + | let asset0 = $t073977448._1 | |
150 | + | let amount0 = $t073977448._2 | |
151 | + | let $t074517502 = getAttachment(i.payments, 1) | |
152 | + | let asset1 = $t074517502._1 | |
153 | + | let amount1 = $t074517502._2 | |
154 | + | let inAmount = (amount0 + amount1) | |
155 | + | let outAmount = fractionRound(inAmount, ratsFunds, usdxFunds) | |
156 | + | let serviceFee = if (if (if (((100 * minAmount) > userFunds)) | |
157 | + | then (i.callerPublicKey != adminPublicKey) | |
158 | + | else false) | |
159 | + | then !(containsElement(guarantors, i.callerPublicKey)) | |
160 | + | else false) | |
161 | + | then (10 * feePerc) | |
162 | + | else feePerc | |
163 | + | let feeAmount = fractionRound(outAmount, serviceFee, percent) | |
164 | + | let netAmount = valueOrMinimum((outAmount - feeAmount), 0) | |
165 | + | if (if (if ((minAmount > inAmount)) | |
166 | + | then true | |
167 | + | else if ((amount0 > 0)) | |
168 | + | then !(containsElement(portfolio, asset0)) | |
194 | 169 | else false) | |
195 | - | then throw(makeString(["AutoRebalance () =>", "This action can only be performed by an administrator!"], " ")) | |
196 | - | else ([ScriptTransfer(fmain, fhfsExcessAmount, fhfsAsset), ScriptTransfer(fmain, excessAmount(portfolio[0]), portfolio[0]), ScriptTransfer(fmain, excessAmount(portfolio[1]), portfolio[1]), ScriptTransfer(fmain, excessAmount(portfolio[2]), portfolio[2]), ScriptTransfer(fmain, excessAmount(portfolio[3]), portfolio[3]), ScriptTransfer(fmain, excessAmount(portfolio[4]), portfolio[4]), ScriptTransfer(fmain, excessAmount(portfolio[5]), portfolio[5]), ScriptTransfer(fmain, excessAmount(portfolio[6]), portfolio[6]), ScriptTransfer(fmain, excessAmount(portfolio[7]), portfolio[7])] ++ adminTimestamp(i.callerPublicKey)) | |
170 | + | then true | |
171 | + | else if ((amount1 > 0)) | |
172 | + | then !(containsElement(portfolio, asset1)) | |
173 | + | else false) | |
174 | + | then throw(makeString(["DepositFunds () =>", "Please attach Tether (USDT) and/or USD Coin (USDC) assets!", "Min. total:", toFloatString(fraction(minAmount, 100, usdMult), 100), "USDx"], " ")) | |
175 | + | else ([ScriptTransfer(admin, feeAmount, ratsAsset), ScriptTransfer(i.caller, netAmount, ratsAsset)] ++ adminTimestamp(i.callerPublicKey)) | |
197 | 176 | } | |
177 | + | ||
178 | + | ||
179 | + | ||
180 | + | @Callable(i) | |
181 | + | func WithdrawUSDT () = withdraw(i, usdtAsset) | |
182 | + | ||
183 | + | ||
184 | + | ||
185 | + | @Callable(i) | |
186 | + | func WithdrawUSDC () = withdraw(i, usdcAsset) | |
198 | 187 | ||
199 | 188 | ||
200 | 189 | ||
204 | 193 | else if ((i.callerPublicKey != adminPublicKey)) | |
205 | 194 | then throw(makeString(["AirdropWasher (...) =>", "This action can only be performed by an administrator!"], " ")) | |
206 | 195 | else ([ScriptTransfer(admin, airdropBalance(id0), id0), ScriptTransfer(admin, airdropBalance(id1), id1), ScriptTransfer(admin, airdropBalance(id2), id2), ScriptTransfer(admin, airdropBalance(id3), id3), ScriptTransfer(admin, airdropBalance(id4), id4), ScriptTransfer(admin, airdropBalance(id5), id5), ScriptTransfer(admin, airdropBalance(id6), id6), ScriptTransfer(admin, airdropBalance(id7), id7), ScriptTransfer(admin, airdropBalance(id8), id8), ScriptTransfer(admin, airdropBalance(id9), id9)] ++ adminTimestamp(i.callerPublicKey)) | |
207 | - | ||
208 | - | ||
209 | - | ||
210 | - | @Callable(i) | |
211 | - | func EmergencyExit () = { | |
212 | - | let lastTimestamp = max([valueOrElse(getInteger(fmain, "timestamp"), 0), valueOrElse(getInteger(fcold, "timestamp"), 0), valueOrElse(getInteger(frats, "timestamp"), 0)]) | |
213 | - | let minTimestamp = (lastTimestamp + oneWeek) | |
214 | - | let isAdmin = (i.callerPublicKey == adminPublicKey) | |
215 | - | if (if (!(isAdmin)) | |
216 | - | then (minTimestamp > lastBlock.timestamp) | |
217 | - | else false) | |
218 | - | then throw(makeString(["EmergencyExit () =>", "Will be unlocked after the date:", toDateTimeString(minTimestamp)], " ")) | |
219 | - | else if ((size(i.payments) > 0)) | |
220 | - | then throw(makeString(["EmergencyExit () =>", "Don't attach payment when calling this function ..."], " ")) | |
221 | - | else if (if (!(isAdmin)) | |
222 | - | then !(containsElement(guarantors, i.callerPublicKey)) | |
223 | - | else false) | |
224 | - | then throw(makeString(["EmergencyExit () =>", "This action can only be performed by one of the guarantors!"], " ")) | |
225 | - | else ([BooleanEntry("emergency", !(isAdmin)), ScriptTransfer(fmain, assetBalance(fcold, portfolio[0]), portfolio[0]), ScriptTransfer(fmain, assetBalance(fcold, portfolio[1]), portfolio[1]), ScriptTransfer(fmain, assetBalance(fcold, portfolio[2]), portfolio[2]), ScriptTransfer(fmain, assetBalance(fcold, portfolio[3]), portfolio[3]), ScriptTransfer(fmain, assetBalance(fcold, portfolio[4]), portfolio[4]), ScriptTransfer(fmain, assetBalance(fcold, portfolio[5]), portfolio[5]), ScriptTransfer(fmain, assetBalance(fcold, portfolio[6]), portfolio[6]), ScriptTransfer(fmain, assetBalance(fcold, portfolio[7]), portfolio[7])] ++ adminTimestamp(i.callerPublicKey)) | |
226 | - | } | |
227 | 196 | ||
228 | 197 | ||
229 | 198 | @Verifier(tx) | |
258 | 227 | then (o.matcherPublicKey == wexchPublicKey) | |
259 | 228 | else false) | |
260 | 229 | then if (if (if ((o.orderType == Buy)) | |
261 | - | then | |
230 | + | then containsElement(portfolio, o.assetPair.amountAsset) | |
262 | 231 | else false) | |
263 | 232 | then true | |
264 | 233 | else if ((o.orderType == Sell)) | |
265 | - | then | |
234 | + | then containsElement(portfolio, o.assetPair.priceAsset) | |
266 | 235 | else false) | |
267 | 236 | then true | |
268 | 237 | else if (!(containsElement(portfolio, o.assetPair.priceAsset))) |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let ScriptVersion = "2. | |
4 | + | let ScriptVersion = "1.2.3-beta_20210113" | |
5 | 5 | ||
6 | 6 | let percent = 10000 | |
7 | 7 | ||
8 | 8 | let usdMult = 1000000 | |
9 | 9 | ||
10 | 10 | let decMult = 100000000 | |
11 | 11 | ||
12 | - | let | |
12 | + | let feePerc = 20 | |
13 | 13 | ||
14 | - | let | |
14 | + | let minAmount = (1 * usdMult) | |
15 | 15 | ||
16 | - | let salePercent = ((30 * percent) / 100) | |
16 | + | let avgMonth = ((31556952 * 1000) / 12) | |
17 | + | ||
18 | + | let openTimestamp = (1609573796 * 1000) | |
17 | 19 | ||
18 | 20 | let adminPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k' | |
19 | 21 | ||
20 | 22 | let robotPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k' | |
21 | 23 | ||
22 | 24 | let wexchPublicKey = base58'9cpfKN9suPNvfeUNphzxXMjcnn974eme8ZhWUjaktzU5' | |
23 | 25 | ||
24 | 26 | let guarantors = ([valueOrElse(getBinary(this, "guarantor1"), base58''), valueOrElse(getBinary(this, "guarantor2"), base58''), valueOrElse(getBinary(this, "guarantor3"), base58'')] :+ base58'') | |
25 | 27 | ||
26 | 28 | let actualSize = value(indexOf(guarantors, base58'')) | |
27 | 29 | ||
28 | 30 | let minSignatures = ((actualSize / 2) + (actualSize % 2)) | |
29 | 31 | ||
30 | 32 | let usdtAsset = base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ' | |
31 | 33 | ||
32 | 34 | let usdcAsset = base58'6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ' | |
33 | 35 | ||
34 | 36 | let fhfsAsset = base58'4wcCKU3Cu4ABpmfiwzufocvrQQuRX4QMHZ7TjpRwtAmn' | |
35 | 37 | ||
36 | 38 | let ratsAsset = base58'Z7817F7hnbWYsVHykjPtn8sUjyuLLf8NPofdveb8CMD' | |
37 | 39 | ||
38 | 40 | let xfeeAsset = base58'5EMfVQiB8NF4HuhaXrZzDM637whWuVBsduq59ZaCSNqk' | |
39 | 41 | ||
40 | - | let portfolio = [ | |
42 | + | let portfolio = [usdtAsset, usdcAsset] | |
41 | 43 | ||
42 | 44 | let ourAssets = [fhfsAsset, xfeeAsset, ratsAsset] | |
43 | - | ||
44 | - | let majorSize = 1 | |
45 | - | ||
46 | - | let majorMult = 2 | |
47 | - | ||
48 | - | let altMult = (majorMult * (size(portfolio) - majorSize)) | |
49 | 45 | ||
50 | 46 | let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x') | |
51 | 47 | ||
52 | 48 | let fmain = Address(base58'3PEPsNg7aSWSSgdC6XweyJkvDXmwVoWeNHL') | |
53 | 49 | ||
54 | 50 | let fcold = Address(base58'3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA') | |
55 | 51 | ||
56 | 52 | let frats = Address(base58'3PJ7RB5CC3Bnn44RNR2hceZ6wKsULnMSxPi') | |
57 | 53 | ||
58 | 54 | let fhfsTotal = (assetBalance(fmain, fhfsAsset) + assetBalance(fcold, fhfsAsset)) | |
59 | 55 | ||
60 | 56 | let fhfsFunds = (value(assetInfo(fhfsAsset)).quantity - fhfsTotal) | |
61 | 57 | ||
62 | 58 | let ratsTotal = (assetBalance(frats, ratsAsset) + assetBalance(fcold, ratsAsset)) | |
63 | 59 | ||
64 | 60 | let ratsFunds = (value(assetInfo(ratsAsset)).quantity - ratsTotal) | |
65 | 61 | ||
66 | 62 | let usdxFunds = (assetBalance(frats, usdtAsset) + assetBalance(frats, usdcAsset)) | |
67 | 63 | ||
68 | 64 | func round (xVal) = ((xVal + 1) / 2) | |
69 | 65 | ||
70 | 66 | ||
71 | 67 | func fractionRound (val,num,den) = round(fraction((2 * val), num, den)) | |
72 | 68 | ||
73 | 69 | ||
74 | 70 | func valueOrMinimum (val,minVal) = if ((minVal > val)) | |
75 | 71 | then minVal | |
76 | 72 | else val | |
77 | 73 | ||
78 | 74 | ||
79 | 75 | func adminTimestamp (publicKey) = if ((publicKey != adminPublicKey)) | |
80 | 76 | then nil | |
81 | 77 | else [IntegerEntry("timestamp", lastBlock.timestamp)] | |
82 | 78 | ||
83 | 79 | ||
84 | - | func excessAmount (assetId) = { | |
85 | - | let fmainFunds = assetBalance(fmain, assetId) | |
86 | - | let totalFunds = (fmainFunds + assetBalance(fcold, assetId)) | |
87 | - | valueOrMinimum((fraction(totalFunds, salePercent, percent) - fmainFunds), 0) | |
88 | - | } | |
80 | + | func getAttachment (payments,idx) = if ((idx >= size(payments))) | |
81 | + | then $Tuple2(base58'', 0) | |
82 | + | else $Tuple2(payments[idx].assetId, payments[idx].amount) | |
89 | 83 | ||
90 | 84 | ||
91 | 85 | func airdropBalance (assetId) = if (containsElement((portfolio ++ ourAssets), assetId)) | |
92 | 86 | then throw(makeString(["AirdropWasher () =>", "Please remove the asset ID:", toBase58String(assetId)], " ")) | |
93 | 87 | else if ((assetId == base58'')) | |
94 | 88 | then 0 | |
95 | 89 | else assetBalance(this, assetId) | |
96 | 90 | ||
97 | 91 | ||
98 | - | func toDateTimeString (timestamp) = { | |
99 | - | let sp = toBytes(" ") | |
100 | - | let zd = toBytes(" UTC") | |
101 | - | let norm = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365] | |
102 | - | let leap = [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366] | |
103 | - | let epoch = (((((1969 * 365) + (1969 / 4)) - (1969 / 100)) + (1969 / 400)) + 366) | |
104 | - | let ce = (timestamp + ((epoch * 86400) * 1000)) | |
105 | - | if (((-12212553600 * 1000) > timestamp)) | |
106 | - | then throw("ISO 8601: Only years after 1583 inclusive are allowed!") | |
107 | - | else { | |
108 | - | let date = { | |
109 | - | let yyyy = ((ce / (31556952 * 1000)) - 1) | |
110 | - | let ytd = ((ce / (86400 * 1000)) - (((((yyyy * 365) + (yyyy / 4)) - (yyyy / 100)) + (yyyy / 400)) + 366)) | |
111 | - | let months = if (if (if ((((yyyy + 1) % 4) == 0)) | |
112 | - | then (((yyyy + 1) % 100) != 0) | |
113 | - | else false) | |
114 | - | then true | |
115 | - | else (((yyyy + 1) % 400) == 0)) | |
116 | - | then leap | |
117 | - | else norm | |
118 | - | let mm = if (if ((0 > ytd)) | |
119 | - | then true | |
120 | - | else (ytd >= months[12])) | |
121 | - | then throw("Unexpected error: Value overflow for months!") | |
122 | - | else if ((ytd >= months[11])) | |
123 | - | then 11 | |
124 | - | else if ((ytd >= months[10])) | |
125 | - | then 10 | |
126 | - | else if ((ytd >= months[9])) | |
127 | - | then 9 | |
128 | - | else if ((ytd >= months[8])) | |
129 | - | then 8 | |
130 | - | else if ((ytd >= months[7])) | |
131 | - | then 7 | |
132 | - | else if ((ytd >= months[6])) | |
133 | - | then 6 | |
134 | - | else if ((ytd >= months[5])) | |
135 | - | then 5 | |
136 | - | else if ((ytd >= months[4])) | |
137 | - | then 4 | |
138 | - | else if ((ytd >= months[3])) | |
139 | - | then 3 | |
140 | - | else if ((ytd >= months[2])) | |
141 | - | then 2 | |
142 | - | else if ((ytd >= months[1])) | |
143 | - | then 1 | |
144 | - | else 0 | |
145 | - | let dd = (ytd - months[mm]) | |
146 | - | ((((drop(toBytes(toString((yyyy + 1))), 0) + base58'n') + drop(toBytes(toString((mm + 101))), 1)) + base58'n') + drop(toBytes(toString((dd + 101))), 1)) | |
147 | - | } | |
148 | - | let time = { | |
149 | - | let rd = (ce % (86400 * 1000)) | |
150 | - | let hh = (rd / (3600 * 1000)) | |
151 | - | let rh = (rd % (3600 * 1000)) | |
152 | - | let mm = (rh / (60 * 1000)) | |
153 | - | let rm = (rh % (60 * 1000)) | |
154 | - | let ss = (rm / 1000) | |
155 | - | let ms = (rm % 1000) | |
156 | - | ((((drop(toBytes(toString((hh + 100))), 1) + base58'21') + drop(toBytes(toString((mm + 100))), 1)) + base58'21') + drop(toBytes(toString((ss + 100))), 1)) | |
157 | - | } | |
158 | - | toUtf8String((((date + sp) + time) + zd)) | |
159 | - | } | |
92 | + | func toFloatString (val,dec) = toUtf8String(if ((val == 0)) | |
93 | + | then base58'q' | |
94 | + | else if ((val > 0)) | |
95 | + | then ((toBytes(toString((val / dec))) + base58'o') + take(drop(toBytes(toString(((val % dec) + dec))), 1), 8)) | |
96 | + | else throw("Unexpected error: Negative values are not allowed!")) | |
97 | + | ||
98 | + | ||
99 | + | func withdraw (i,assetId) = { | |
100 | + | let $t055455596 = getAttachment(i.payments, 0) | |
101 | + | let asset0 = $t055455596._1 | |
102 | + | let amount0 = $t055455596._2 | |
103 | + | let $t055995650 = getAttachment(i.payments, 1) | |
104 | + | let asset1 = $t055995650._1 | |
105 | + | let amount1 = $t055995650._2 | |
106 | + | let thisFunds = assetBalance(this, assetId) | |
107 | + | let maxAmount = fractionRound(thisFunds, ratsFunds, usdxFunds) | |
108 | + | let inAmount = (amount0 + amount1) | |
109 | + | let outAmount = fractionRound(inAmount, usdxFunds, ratsFunds) | |
110 | + | let feeAmount = fractionRound(outAmount, feePerc, percent) | |
111 | + | let netAmount = valueOrMinimum((outAmount - feeAmount), 0) | |
112 | + | let assetSymbol = if ((assetId == usdtAsset)) | |
113 | + | then "USDT" | |
114 | + | else if ((assetId == usdcAsset)) | |
115 | + | then "USDC" | |
116 | + | else throw("Unexpected error: This asset cannot be withdrawn!") | |
117 | + | if (if (if (if ((1 > inAmount)) | |
118 | + | then true | |
119 | + | else (inAmount > maxAmount)) | |
120 | + | then true | |
121 | + | else if ((amount0 > 0)) | |
122 | + | then (asset0 != ratsAsset) | |
123 | + | else false) | |
124 | + | then true | |
125 | + | else if ((amount1 > 0)) | |
126 | + | then (asset1 != ratsAsset) | |
127 | + | else false) | |
128 | + | then throw(makeString([("Withdraw" + assetSymbol), "() =>", "Please attach only Rat's Share (RATS) assets!", "Max. amount:", toFloatString(maxAmount, usdMult), "RATS"], " ")) | |
129 | + | else ([ScriptTransfer(i.caller, netAmount, assetId)] ++ adminTimestamp(i.callerPublicKey)) | |
160 | 130 | } | |
161 | 131 | ||
162 | 132 | ||
163 | 133 | @Callable(i) | |
164 | - | func AutoFixProfit (newMult) = { | |
165 | - | let oldProfit = valueOrElse(getInteger(this, "fixedProfit"), 0) | |
166 | - | let riskPercent = valueOrElse(getInteger(this, "riskPercent"), (percent / 100)) | |
167 | - | let usdtFunds = fraction(fhfsFunds, fhfsPrice, decMult) | |
168 | - | let riskAmount = fraction(usdtFunds, riskPercent, (altMult * percent)) | |
169 | - | let minMult = ((oldProfit / riskAmount) + 1) | |
170 | - | let newProfit = (newMult * riskAmount) | |
171 | - | let usdtAmount = valueOrMinimum((newProfit - oldProfit), 0) | |
172 | - | let ratsAmount = fractionRound(usdtAmount, ratsFunds, usdxFunds) | |
173 | - | if ((minMult > newMult)) | |
174 | - | then throw(makeString([(("AutoFixProfit (" + toString(newMult)) + ") =>"), "Inavlid value! Min. multiplier:", toString(minMult)], " ")) | |
175 | - | else if ((size(i.payments) > 0)) | |
176 | - | then throw(makeString(["AutoFixProfit (...) =>", "Don't attach payment when calling this function ..."], " ")) | |
177 | - | else if (if ((i.callerPublicKey != adminPublicKey)) | |
178 | - | then (i.callerPublicKey != robotPublicKey) | |
179 | - | else false) | |
180 | - | then throw(makeString(["AutoFixProfit (...) =>", "This action can only be performed by an administrator!"], " ")) | |
181 | - | else ([IntegerEntry("fixedProfit", newProfit), ScriptTransfer(frats, usdtAmount, usdtAsset), ScriptTransfer(fmain, ratsAmount, ratsAsset)] ++ adminTimestamp(i.callerPublicKey)) | |
134 | + | func GetMeanPrice () = { | |
135 | + | let return = valueOrMinimum((usdxFunds - ratsFunds), 0) | |
136 | + | let meanPrice = fractionRound(decMult, usdxFunds, ratsFunds) | |
137 | + | let duration = (lastBlock.timestamp - openTimestamp) | |
138 | + | let exponent = fractionRound(decMult, (12 * avgMonth), duration) | |
139 | + | let meanReturn = (pow(meanPrice, 8, exponent, 8, 4, HALFUP) - percent) | |
140 | + | throw(makeString(["GetMeanPrice () =>", "balance:", toFloatString(usdxFunds, usdMult), "USDx;", "gross return:", toFloatString(return, usdMult), "USDx", (("(" + toFloatString(meanReturn, (percent / 100))) + "% / an);"), "mean price:", toFloatString(meanPrice, decMult), "USDx / RATS"], " ")) | |
182 | 141 | } | |
183 | 142 | ||
184 | 143 | ||
185 | 144 | ||
186 | 145 | @Callable(i) | |
187 | - | func AutoRebalance () = { | |
188 | - | let fhfsSupply = valueOrElse(getInteger(fmain, "fhfsSupply"), (100 * decMult)) | |
189 | - | let fhfsExcessAmount = valueOrMinimum((fhfsSupply - assetBalance(fmain, fhfsAsset)), 0) | |
190 | - | if ((size(i.payments) > 0)) | |
191 | - | then throw(makeString(["AutoRebalance () =>", "Don't attach payment when calling this function ..."], " ")) | |
192 | - | else if (if ((i.callerPublicKey != adminPublicKey)) | |
193 | - | then (i.callerPublicKey != robotPublicKey) | |
146 | + | func DepositFunds () = { | |
147 | + | let userFunds = assetBalance(i.caller, fhfsAsset) | |
148 | + | let $t073977448 = getAttachment(i.payments, 0) | |
149 | + | let asset0 = $t073977448._1 | |
150 | + | let amount0 = $t073977448._2 | |
151 | + | let $t074517502 = getAttachment(i.payments, 1) | |
152 | + | let asset1 = $t074517502._1 | |
153 | + | let amount1 = $t074517502._2 | |
154 | + | let inAmount = (amount0 + amount1) | |
155 | + | let outAmount = fractionRound(inAmount, ratsFunds, usdxFunds) | |
156 | + | let serviceFee = if (if (if (((100 * minAmount) > userFunds)) | |
157 | + | then (i.callerPublicKey != adminPublicKey) | |
158 | + | else false) | |
159 | + | then !(containsElement(guarantors, i.callerPublicKey)) | |
160 | + | else false) | |
161 | + | then (10 * feePerc) | |
162 | + | else feePerc | |
163 | + | let feeAmount = fractionRound(outAmount, serviceFee, percent) | |
164 | + | let netAmount = valueOrMinimum((outAmount - feeAmount), 0) | |
165 | + | if (if (if ((minAmount > inAmount)) | |
166 | + | then true | |
167 | + | else if ((amount0 > 0)) | |
168 | + | then !(containsElement(portfolio, asset0)) | |
194 | 169 | else false) | |
195 | - | then throw(makeString(["AutoRebalance () =>", "This action can only be performed by an administrator!"], " ")) | |
196 | - | else ([ScriptTransfer(fmain, fhfsExcessAmount, fhfsAsset), ScriptTransfer(fmain, excessAmount(portfolio[0]), portfolio[0]), ScriptTransfer(fmain, excessAmount(portfolio[1]), portfolio[1]), ScriptTransfer(fmain, excessAmount(portfolio[2]), portfolio[2]), ScriptTransfer(fmain, excessAmount(portfolio[3]), portfolio[3]), ScriptTransfer(fmain, excessAmount(portfolio[4]), portfolio[4]), ScriptTransfer(fmain, excessAmount(portfolio[5]), portfolio[5]), ScriptTransfer(fmain, excessAmount(portfolio[6]), portfolio[6]), ScriptTransfer(fmain, excessAmount(portfolio[7]), portfolio[7])] ++ adminTimestamp(i.callerPublicKey)) | |
170 | + | then true | |
171 | + | else if ((amount1 > 0)) | |
172 | + | then !(containsElement(portfolio, asset1)) | |
173 | + | else false) | |
174 | + | then throw(makeString(["DepositFunds () =>", "Please attach Tether (USDT) and/or USD Coin (USDC) assets!", "Min. total:", toFloatString(fraction(minAmount, 100, usdMult), 100), "USDx"], " ")) | |
175 | + | else ([ScriptTransfer(admin, feeAmount, ratsAsset), ScriptTransfer(i.caller, netAmount, ratsAsset)] ++ adminTimestamp(i.callerPublicKey)) | |
197 | 176 | } | |
177 | + | ||
178 | + | ||
179 | + | ||
180 | + | @Callable(i) | |
181 | + | func WithdrawUSDT () = withdraw(i, usdtAsset) | |
182 | + | ||
183 | + | ||
184 | + | ||
185 | + | @Callable(i) | |
186 | + | func WithdrawUSDC () = withdraw(i, usdcAsset) | |
198 | 187 | ||
199 | 188 | ||
200 | 189 | ||
201 | 190 | @Callable(i) | |
202 | 191 | func AirdropWasher (id0,id1,id2,id3,id4,id5,id6,id7,id8,id9) = if ((size(i.payments) > 0)) | |
203 | 192 | then throw(makeString(["AirdropWasher (...) =>", "Don't attach payment when calling this function ..."], " ")) | |
204 | 193 | else if ((i.callerPublicKey != adminPublicKey)) | |
205 | 194 | then throw(makeString(["AirdropWasher (...) =>", "This action can only be performed by an administrator!"], " ")) | |
206 | 195 | else ([ScriptTransfer(admin, airdropBalance(id0), id0), ScriptTransfer(admin, airdropBalance(id1), id1), ScriptTransfer(admin, airdropBalance(id2), id2), ScriptTransfer(admin, airdropBalance(id3), id3), ScriptTransfer(admin, airdropBalance(id4), id4), ScriptTransfer(admin, airdropBalance(id5), id5), ScriptTransfer(admin, airdropBalance(id6), id6), ScriptTransfer(admin, airdropBalance(id7), id7), ScriptTransfer(admin, airdropBalance(id8), id8), ScriptTransfer(admin, airdropBalance(id9), id9)] ++ adminTimestamp(i.callerPublicKey)) | |
207 | - | ||
208 | - | ||
209 | - | ||
210 | - | @Callable(i) | |
211 | - | func EmergencyExit () = { | |
212 | - | let lastTimestamp = max([valueOrElse(getInteger(fmain, "timestamp"), 0), valueOrElse(getInteger(fcold, "timestamp"), 0), valueOrElse(getInteger(frats, "timestamp"), 0)]) | |
213 | - | let minTimestamp = (lastTimestamp + oneWeek) | |
214 | - | let isAdmin = (i.callerPublicKey == adminPublicKey) | |
215 | - | if (if (!(isAdmin)) | |
216 | - | then (minTimestamp > lastBlock.timestamp) | |
217 | - | else false) | |
218 | - | then throw(makeString(["EmergencyExit () =>", "Will be unlocked after the date:", toDateTimeString(minTimestamp)], " ")) | |
219 | - | else if ((size(i.payments) > 0)) | |
220 | - | then throw(makeString(["EmergencyExit () =>", "Don't attach payment when calling this function ..."], " ")) | |
221 | - | else if (if (!(isAdmin)) | |
222 | - | then !(containsElement(guarantors, i.callerPublicKey)) | |
223 | - | else false) | |
224 | - | then throw(makeString(["EmergencyExit () =>", "This action can only be performed by one of the guarantors!"], " ")) | |
225 | - | else ([BooleanEntry("emergency", !(isAdmin)), ScriptTransfer(fmain, assetBalance(fcold, portfolio[0]), portfolio[0]), ScriptTransfer(fmain, assetBalance(fcold, portfolio[1]), portfolio[1]), ScriptTransfer(fmain, assetBalance(fcold, portfolio[2]), portfolio[2]), ScriptTransfer(fmain, assetBalance(fcold, portfolio[3]), portfolio[3]), ScriptTransfer(fmain, assetBalance(fcold, portfolio[4]), portfolio[4]), ScriptTransfer(fmain, assetBalance(fcold, portfolio[5]), portfolio[5]), ScriptTransfer(fmain, assetBalance(fcold, portfolio[6]), portfolio[6]), ScriptTransfer(fmain, assetBalance(fcold, portfolio[7]), portfolio[7])] ++ adminTimestamp(i.callerPublicKey)) | |
226 | - | } | |
227 | 196 | ||
228 | 197 | ||
229 | 198 | @Verifier(tx) | |
230 | 199 | func verify () = { | |
231 | 200 | let isValidOwner = sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
232 | 201 | let isValidAdmin = if (isValidOwner) | |
233 | 202 | then true | |
234 | 203 | else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], adminPublicKey) | |
235 | 204 | let isValidRobot = if (isValidOwner) | |
236 | 205 | then true | |
237 | 206 | else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], robotPublicKey) | |
238 | 207 | let isValidGuarantors = ((((if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], guarantors[0])) | |
239 | 208 | then 1 | |
240 | 209 | else 0) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[2], guarantors[1])) | |
241 | 210 | then 1 | |
242 | 211 | else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[3], guarantors[2])) | |
243 | 212 | then 1 | |
244 | 213 | else 0)) >= minSignatures) | |
245 | 214 | match tx { | |
246 | 215 | case _: LeaseCancelTransaction|LeaseTransaction => | |
247 | 216 | isValidOwner | |
248 | 217 | case b: BurnTransaction => | |
249 | 218 | if (if (isValidOwner) | |
250 | 219 | then !(containsElement(portfolio, b.assetId)) | |
251 | 220 | else false) | |
252 | 221 | then !(containsElement(ourAssets, b.assetId)) | |
253 | 222 | else false | |
254 | 223 | case o: Order => | |
255 | 224 | if (if (if (if (if (isValidRobot) | |
256 | 225 | then !(isDefined(o.matcherFeeAssetId)) | |
257 | 226 | else false) | |
258 | 227 | then (o.matcherPublicKey == wexchPublicKey) | |
259 | 228 | else false) | |
260 | 229 | then if (if (if ((o.orderType == Buy)) | |
261 | - | then | |
230 | + | then containsElement(portfolio, o.assetPair.amountAsset) | |
262 | 231 | else false) | |
263 | 232 | then true | |
264 | 233 | else if ((o.orderType == Sell)) | |
265 | - | then | |
234 | + | then containsElement(portfolio, o.assetPair.priceAsset) | |
266 | 235 | else false) | |
267 | 236 | then true | |
268 | 237 | else if (!(containsElement(portfolio, o.assetPair.priceAsset))) | |
269 | 238 | then !(containsElement(portfolio, o.assetPair.amountAsset)) | |
270 | 239 | else false | |
271 | 240 | else false) | |
272 | 241 | then !(containsElement(ourAssets, o.assetPair.priceAsset)) | |
273 | 242 | else false) | |
274 | 243 | then !(containsElement(ourAssets, o.assetPair.amountAsset)) | |
275 | 244 | else false | |
276 | 245 | case t: MassTransferTransaction|TransferTransaction => | |
277 | 246 | if (if (if (isValidAdmin) | |
278 | 247 | then isValidGuarantors | |
279 | 248 | else false) | |
280 | 249 | then !(containsElement(portfolio, t.assetId)) | |
281 | 250 | else false) | |
282 | 251 | then !(containsElement(portfolio, t.feeAssetId)) | |
283 | 252 | else false | |
284 | 253 | case _: SetScriptTransaction|DataTransaction => | |
285 | 254 | if (isValidAdmin) | |
286 | 255 | then isValidGuarantors | |
287 | 256 | else false | |
288 | 257 | case _ => | |
289 | 258 | false | |
290 | 259 | } | |
291 | 260 | } | |
292 | 261 |
github/deemru/w8io/3ef1775 93.57 ms ◑