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