tx · 9pdYD91n9ytfJR45UqyvdZHWVVfWisCGNjzrFvrN7wif

3PJ7RB5CC3Bnn44RNR2hceZ6wKsULnMSxPi:  -0.01400000 Waves

2021.01.13 14:37 [2415382] smart account 3PJ7RB5CC3Bnn44RNR2hceZ6wKsULnMSxPi > SELF 0.00000000 Waves

{ "type": 13, "id": "9pdYD91n9ytfJR45UqyvdZHWVVfWisCGNjzrFvrN7wif", "fee": 1400000, "feeAssetId": null, "timestamp": 1610537598756, "version": 1, "sender": "3PJ7RB5CC3Bnn44RNR2hceZ6wKsULnMSxPi", "senderPublicKey": "G5ztBKfbizrqVQWMZknsgbG2HS91eJ7QgHh7X3AznjoW", "proofs": [ "c82WDjNQG5rgYNrzdwwzP9Wpa8JT4fkLVRi9i1dAtoCkjT7xJqo9gHGDdXHoyBKhCP7PRi6H71CvAsoUhHwx8MK", "3M7H85qgTHdM2jba5UY6ezmphLpY1JyLa8hxZaeNEQxkUiSFiYQdFUuy7s2bNUBxzVF7pnBDbeDwgssZeR9yDGCA" ], "script": "base64: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YXRjaGVyRmVlQXNzZXRJZAcJAAAAAAAAAggFAAAAAW8AAAAQbWF0Y2hlclB1YmxpY0tleQUAAAAOd2V4Y2hQdWJsaWNLZXkHAwMDCQAAAAAAAAIIBQAAAAFvAAAACW9yZGVyVHlwZQUAAAADQnV5CQEAAAABIQAAAAEJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAlwb3J0Zm9saW8ICAUAAAABbwAAAAlhc3NldFBhaXIAAAAKcHJpY2VBc3NldAcGAwkAAAAAAAACCAUAAAABbwAAAAlvcmRlclR5cGUFAAAABFNlbGwJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAACXBvcnRmb2xpbwgIBQAAAAFvAAAACWFzc2V0UGFpcgAAAAthbW91bnRBc3NldAcGAwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAgFAAAAAW8AAAAJYXNzZXRQYWlyAAAACnByaWNlQXNzZXQJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAACXBvcnRmb2xpbwgIBQAAAAFvAAAACWFzc2V0UGFpcgAAAAthbW91bnRBc3NldAcHCQEAAAABIQAAAAEJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAlvdXJBc3NldHMICAUAAAABbwAAAAlhc3NldFBhaXIAAAAKcHJpY2VBc3NldAcJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAACW91ckFzc2V0cwgIBQAAAAFvAAAACWFzc2V0UGFpcgAAAAthbW91bnRBc3NldAcDAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABdNYXNzVHJhbnNmZXJUcmFuc2FjdGlvbgYJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAATVHJhbnNmZXJUcmFuc2FjdGlvbgQAAAABdAUAAAAHJG1hdGNoMAMDAwUAAAAMaXNWYWxpZEFkbWluBQAAABFpc1ZhbGlkR3VhcmFudG9ycwcJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAACXBvcnRmb2xpbwgFAAAAAXQAAAAHYXNzZXRJZAcJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAACXBvcnRmb2xpbwgFAAAAAXQAAAAKZmVlQXNzZXRJZAcDAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABRTZXRTY3JpcHRUcmFuc2FjdGlvbgYJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAPRGF0YVRyYW5zYWN0aW9uAwUAAAAMaXNWYWxpZEFkbWluBQAAABFpc1ZhbGlkR3VhcmFudG9ycwcHxtS3uQ==", "chainId": 87, "height": 2415382, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 98QLn1NsQfmmqtYhXpjbRsjALHUibArpvXUSLxojWPpT Next: DcrEWWntZno6yxieTze2yxH7PLmDxqCN7xumMmnCRUmt Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let ScriptVersion = "1.2.2-beta_20210110"
4+let ScriptVersion = "2.1.0-beta_20210113"
55
66 let percent = 10000
77
99
1010 let decMult = 100000000
1111
12-let feePerc = 20
12+let oneWeek = (604800 * 1000)
1313
14-let minAmount = (1 * usdMult)
14+let fhfsPrice = (100 * usdMult)
1515
16-let avgMonth = ((31556952 * 1000) / 12)
17-
18-let openTimestamp = (1609573796 * 1000)
16+let salePercent = ((30 * percent) / 100)
1917
2018 let adminPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k'
2119
3937
4038 let xfeeAsset = base58'5EMfVQiB8NF4HuhaXrZzDM637whWuVBsduq59ZaCSNqk'
4139
42-let portfolio = [usdtAsset, usdcAsset]
40+let portfolio = [base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ', base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS', base58'474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu', base58'zMFqXuoyrn5w17PFurTqxB7GsS71fp9dfk6XFwxbPCy', base58'HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk', base58'B3uGHFRpSUuGEDWjqB9LWWxafQj8VTvpMucEyoxzws5H', base58'5WvPKSJXzVE2orvbkJ8wsQmmQKqTv9sGBPksV4adViw3', base58'BrjUWjndUanm5VsJkbUip8VRYy6LWJePtxya3FNv4TQa']
4341
4442 let ourAssets = [fhfsAsset, xfeeAsset, ratsAsset]
43+
44+let majorSize = 1
45+
46+let majorMult = 2
47+
48+let altMult = (majorMult * (size(portfolio) - majorSize))
4549
4650 let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x')
4751
7276 else val
7377
7478
75-func getAttachment (payments,idx) = if ((idx >= size(payments)))
76- then $Tuple2(base58'', 0)
77- else $Tuple2(payments[idx].assetId, payments[idx].amount)
79+func adminTimestamp (publicKey) = if ((publicKey != adminPublicKey))
80+ then nil
81+ else [IntegerEntry("timestamp", lastBlock.timestamp)]
82+
83+
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+ }
7889
7990
8091 func airdropBalance (assetId) = if (containsElement((portfolio ++ ourAssets), assetId))
8495 else assetBalance(this, assetId)
8596
8697
87-func adminTimestamp (publicKey) = if ((publicKey != adminPublicKey))
88- then nil
89- else [IntegerEntry("timestamp", lastBlock.timestamp)]
90-
91-
92-func toFloatString (val,dec) = if ((0 > val))
93- then throw("Unexpected error: negative values are not allowed!")
94- else if ((val > 0))
95- then toUtf8String(((toBytes(toString((val / dec))) + base58'o') + take(drop(toBytes(toString(((val % dec) + dec))), 1), 8)))
96- else "0"
97-
98-
99-func withdraw (i,assetId) = {
100- let $t052255276 = getAttachment(i.payments, 0)
101- let asset0 = $t052255276._1
102- let amount0 = $t052255276._2
103- let $t052795330 = getAttachment(i.payments, 1)
104- let asset1 = $t052795330._1
105- let amount1 = $t052795330._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))
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+ }
130160 }
131161
132162
133163 @Callable(i)
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, (3 * 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))) + "% / 3mo);"), "mean price:", toFloatString(meanPrice, decMult), "USDx / RATS"], " "))
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))
141182 }
142183
143184
144185
145186 @Callable(i)
146-func DepositFunds () = {
147- let userFunds = assetBalance(i.caller, fhfsAsset)
148- let $t070777128 = getAttachment(i.payments, 0)
149- let asset0 = $t070777128._1
150- let amount0 = $t070777128._2
151- let $t071317182 = getAttachment(i.payments, 1)
152- let asset1 = $t071317182._1
153- let amount1 = $t071317182._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))
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)
169194 else false)
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))
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))
176197 }
177198
178199
179200
180201 @Callable(i)
181-func WithdrawUSDT () = withdraw(i, usdtAsset)
202+func AirdropWasher (id0,id1,id2,id3,id4,id5,id6,id7,id8,id9) = if ((size(i.payments) > 0))
203+ then throw(makeString(["AirdropWasher (...) =>", "Don't attach payment when calling this function ..."], " "))
204+ else if ((i.callerPublicKey != adminPublicKey))
205+ then throw(makeString(["AirdropWasher (...) =>", "This action can only be performed by an administrator!"], " "))
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))
182207
183208
184209
185210 @Callable(i)
186-func WithdrawUSDC () = withdraw(i, usdcAsset)
187-
188-
189-
190-@Callable(i)
191-func AirdropWasher (id0,id1,id2,id3,id4,id5,id6,id7,id8,id9) = if ((size(i.payments) > 0))
192- then throw("AirdropWasher () => Don't attach payment when calling this function ...")
193- else if ((i.callerPublicKey != adminPublicKey))
194- then throw("AirdropWasher () => This action can only be performed by an administrator!")
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))
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+ }
196227
197228
198229 @Verifier(tx)
227258 then (o.matcherPublicKey == wexchPublicKey)
228259 else false)
229260 then if (if (if ((o.orderType == Buy))
230- then containsElement(portfolio, o.assetPair.amountAsset)
261+ then !(containsElement(portfolio, o.assetPair.priceAsset))
231262 else false)
232263 then true
233264 else if ((o.orderType == Sell))
234- then containsElement(portfolio, o.assetPair.priceAsset)
265+ then !(containsElement(portfolio, o.assetPair.amountAsset))
235266 else false)
236267 then true
237268 else if (!(containsElement(portfolio, o.assetPair.priceAsset)))
243274 then !(containsElement(ourAssets, o.assetPair.amountAsset))
244275 else false
245276 case t: MassTransferTransaction|TransferTransaction =>
246- if (if (isValidAdmin)
277+ if (if (if (isValidAdmin)
247278 then isValidGuarantors
248279 else false)
249280 then !(containsElement(portfolio, t.assetId))
281+ else false)
282+ then !(containsElement(portfolio, t.feeAssetId))
250283 else false
251284 case _: SetScriptTransaction|DataTransaction =>
252285 if (isValidAdmin)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let ScriptVersion = "1.2.2-beta_20210110"
4+let ScriptVersion = "2.1.0-beta_20210113"
55
66 let percent = 10000
77
88 let usdMult = 1000000
99
1010 let decMult = 100000000
1111
12-let feePerc = 20
12+let oneWeek = (604800 * 1000)
1313
14-let minAmount = (1 * usdMult)
14+let fhfsPrice = (100 * usdMult)
1515
16-let avgMonth = ((31556952 * 1000) / 12)
17-
18-let openTimestamp = (1609573796 * 1000)
16+let salePercent = ((30 * percent) / 100)
1917
2018 let adminPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k'
2119
2220 let robotPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k'
2321
2422 let wexchPublicKey = base58'9cpfKN9suPNvfeUNphzxXMjcnn974eme8ZhWUjaktzU5'
2523
2624 let guarantors = ([valueOrElse(getBinary(this, "guarantor1"), base58''), valueOrElse(getBinary(this, "guarantor2"), base58''), valueOrElse(getBinary(this, "guarantor3"), base58'')] :+ base58'')
2725
2826 let actualSize = value(indexOf(guarantors, base58''))
2927
3028 let minSignatures = ((actualSize / 2) + (actualSize % 2))
3129
3230 let usdtAsset = base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ'
3331
3432 let usdcAsset = base58'6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ'
3533
3634 let fhfsAsset = base58'4wcCKU3Cu4ABpmfiwzufocvrQQuRX4QMHZ7TjpRwtAmn'
3735
3836 let ratsAsset = base58'Z7817F7hnbWYsVHykjPtn8sUjyuLLf8NPofdveb8CMD'
3937
4038 let xfeeAsset = base58'5EMfVQiB8NF4HuhaXrZzDM637whWuVBsduq59ZaCSNqk'
4139
42-let portfolio = [usdtAsset, usdcAsset]
40+let portfolio = [base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ', base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS', base58'474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu', base58'zMFqXuoyrn5w17PFurTqxB7GsS71fp9dfk6XFwxbPCy', base58'HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk', base58'B3uGHFRpSUuGEDWjqB9LWWxafQj8VTvpMucEyoxzws5H', base58'5WvPKSJXzVE2orvbkJ8wsQmmQKqTv9sGBPksV4adViw3', base58'BrjUWjndUanm5VsJkbUip8VRYy6LWJePtxya3FNv4TQa']
4341
4442 let ourAssets = [fhfsAsset, xfeeAsset, ratsAsset]
43+
44+let majorSize = 1
45+
46+let majorMult = 2
47+
48+let altMult = (majorMult * (size(portfolio) - majorSize))
4549
4650 let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x')
4751
4852 let fmain = Address(base58'3PEPsNg7aSWSSgdC6XweyJkvDXmwVoWeNHL')
4953
5054 let fcold = Address(base58'3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA')
5155
5256 let frats = Address(base58'3PJ7RB5CC3Bnn44RNR2hceZ6wKsULnMSxPi')
5357
5458 let fhfsTotal = (assetBalance(fmain, fhfsAsset) + assetBalance(fcold, fhfsAsset))
5559
5660 let fhfsFunds = (value(assetInfo(fhfsAsset)).quantity - fhfsTotal)
5761
5862 let ratsTotal = (assetBalance(frats, ratsAsset) + assetBalance(fcold, ratsAsset))
5963
6064 let ratsFunds = (value(assetInfo(ratsAsset)).quantity - ratsTotal)
6165
6266 let usdxFunds = (assetBalance(frats, usdtAsset) + assetBalance(frats, usdcAsset))
6367
6468 func round (xVal) = ((xVal + 1) / 2)
6569
6670
6771 func fractionRound (val,num,den) = round(fraction((2 * val), num, den))
6872
6973
7074 func valueOrMinimum (val,minVal) = if ((minVal > val))
7175 then minVal
7276 else val
7377
7478
75-func getAttachment (payments,idx) = if ((idx >= size(payments)))
76- then $Tuple2(base58'', 0)
77- else $Tuple2(payments[idx].assetId, payments[idx].amount)
79+func adminTimestamp (publicKey) = if ((publicKey != adminPublicKey))
80+ then nil
81+ else [IntegerEntry("timestamp", lastBlock.timestamp)]
82+
83+
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+ }
7889
7990
8091 func airdropBalance (assetId) = if (containsElement((portfolio ++ ourAssets), assetId))
8192 then throw(makeString(["AirdropWasher () =>", "Please remove the asset ID:", toBase58String(assetId)], " "))
8293 else if ((assetId == base58''))
8394 then 0
8495 else assetBalance(this, assetId)
8596
8697
87-func adminTimestamp (publicKey) = if ((publicKey != adminPublicKey))
88- then nil
89- else [IntegerEntry("timestamp", lastBlock.timestamp)]
90-
91-
92-func toFloatString (val,dec) = if ((0 > val))
93- then throw("Unexpected error: negative values are not allowed!")
94- else if ((val > 0))
95- then toUtf8String(((toBytes(toString((val / dec))) + base58'o') + take(drop(toBytes(toString(((val % dec) + dec))), 1), 8)))
96- else "0"
97-
98-
99-func withdraw (i,assetId) = {
100- let $t052255276 = getAttachment(i.payments, 0)
101- let asset0 = $t052255276._1
102- let amount0 = $t052255276._2
103- let $t052795330 = getAttachment(i.payments, 1)
104- let asset1 = $t052795330._1
105- let amount1 = $t052795330._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))
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+ }
130160 }
131161
132162
133163 @Callable(i)
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, (3 * 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))) + "% / 3mo);"), "mean price:", toFloatString(meanPrice, decMult), "USDx / RATS"], " "))
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))
141182 }
142183
143184
144185
145186 @Callable(i)
146-func DepositFunds () = {
147- let userFunds = assetBalance(i.caller, fhfsAsset)
148- let $t070777128 = getAttachment(i.payments, 0)
149- let asset0 = $t070777128._1
150- let amount0 = $t070777128._2
151- let $t071317182 = getAttachment(i.payments, 1)
152- let asset1 = $t071317182._1
153- let amount1 = $t071317182._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))
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)
169194 else false)
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))
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))
176197 }
177198
178199
179200
180201 @Callable(i)
181-func WithdrawUSDT () = withdraw(i, usdtAsset)
202+func AirdropWasher (id0,id1,id2,id3,id4,id5,id6,id7,id8,id9) = if ((size(i.payments) > 0))
203+ then throw(makeString(["AirdropWasher (...) =>", "Don't attach payment when calling this function ..."], " "))
204+ else if ((i.callerPublicKey != adminPublicKey))
205+ then throw(makeString(["AirdropWasher (...) =>", "This action can only be performed by an administrator!"], " "))
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))
182207
183208
184209
185210 @Callable(i)
186-func WithdrawUSDC () = withdraw(i, usdcAsset)
187-
188-
189-
190-@Callable(i)
191-func AirdropWasher (id0,id1,id2,id3,id4,id5,id6,id7,id8,id9) = if ((size(i.payments) > 0))
192- then throw("AirdropWasher () => Don't attach payment when calling this function ...")
193- else if ((i.callerPublicKey != adminPublicKey))
194- then throw("AirdropWasher () => This action can only be performed by an administrator!")
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))
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+ }
196227
197228
198229 @Verifier(tx)
199230 func verify () = {
200231 let isValidOwner = sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
201232 let isValidAdmin = if (isValidOwner)
202233 then true
203234 else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], adminPublicKey)
204235 let isValidRobot = if (isValidOwner)
205236 then true
206237 else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], robotPublicKey)
207238 let isValidGuarantors = ((((if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], guarantors[0]))
208239 then 1
209240 else 0) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[2], guarantors[1]))
210241 then 1
211242 else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[3], guarantors[2]))
212243 then 1
213244 else 0)) >= minSignatures)
214245 match tx {
215246 case _: LeaseCancelTransaction|LeaseTransaction =>
216247 isValidOwner
217248 case b: BurnTransaction =>
218249 if (if (isValidOwner)
219250 then !(containsElement(portfolio, b.assetId))
220251 else false)
221252 then !(containsElement(ourAssets, b.assetId))
222253 else false
223254 case o: Order =>
224255 if (if (if (if (if (isValidRobot)
225256 then !(isDefined(o.matcherFeeAssetId))
226257 else false)
227258 then (o.matcherPublicKey == wexchPublicKey)
228259 else false)
229260 then if (if (if ((o.orderType == Buy))
230- then containsElement(portfolio, o.assetPair.amountAsset)
261+ then !(containsElement(portfolio, o.assetPair.priceAsset))
231262 else false)
232263 then true
233264 else if ((o.orderType == Sell))
234- then containsElement(portfolio, o.assetPair.priceAsset)
265+ then !(containsElement(portfolio, o.assetPair.amountAsset))
235266 else false)
236267 then true
237268 else if (!(containsElement(portfolio, o.assetPair.priceAsset)))
238269 then !(containsElement(portfolio, o.assetPair.amountAsset))
239270 else false
240271 else false)
241272 then !(containsElement(ourAssets, o.assetPair.priceAsset))
242273 else false)
243274 then !(containsElement(ourAssets, o.assetPair.amountAsset))
244275 else false
245276 case t: MassTransferTransaction|TransferTransaction =>
246- if (if (isValidAdmin)
277+ if (if (if (isValidAdmin)
247278 then isValidGuarantors
248279 else false)
249280 then !(containsElement(portfolio, t.assetId))
281+ else false)
282+ then !(containsElement(portfolio, t.feeAssetId))
250283 else false
251284 case _: SetScriptTransaction|DataTransaction =>
252285 if (isValidAdmin)
253286 then isValidGuarantors
254287 else false
255288 case _ =>
256289 false
257290 }
258291 }
259292

github/deemru/w8io/0e76f2f 
75.67 ms