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:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let ScriptVersion = "2.1.0-beta_20210113"
4+let ScriptVersion = "1.2.3-beta_20210113"
55
66 let percent = 10000
77
99
1010 let decMult = 100000000
1111
12-let oneWeek = (604800 * 1000)
12+let feePerc = 20
1313
14-let fhfsPrice = (100 * usdMult)
14+let minAmount = (1 * usdMult)
1515
16-let salePercent = ((30 * percent) / 100)
16+let avgMonth = ((31556952 * 1000) / 12)
17+
18+let openTimestamp = (1609573796 * 1000)
1719
1820 let adminPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k'
1921
3739
3840 let xfeeAsset = base58'5EMfVQiB8NF4HuhaXrZzDM637whWuVBsduq59ZaCSNqk'
3941
40-let portfolio = [base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ', base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS', base58'474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu', base58'zMFqXuoyrn5w17PFurTqxB7GsS71fp9dfk6XFwxbPCy', base58'HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk', base58'B3uGHFRpSUuGEDWjqB9LWWxafQj8VTvpMucEyoxzws5H', base58'5WvPKSJXzVE2orvbkJ8wsQmmQKqTv9sGBPksV4adViw3', base58'BrjUWjndUanm5VsJkbUip8VRYy6LWJePtxya3FNv4TQa']
42+let portfolio = [usdtAsset, usdcAsset]
4143
4244 let ourAssets = [fhfsAsset, xfeeAsset, ratsAsset]
43-
44-let majorSize = 1
45-
46-let majorMult = 2
47-
48-let altMult = (majorMult * (size(portfolio) - majorSize))
4945
5046 let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x')
5147
8177 else [IntegerEntry("timestamp", lastBlock.timestamp)]
8278
8379
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)
8983
9084
9185 func airdropBalance (assetId) = if (containsElement((portfolio ++ ourAssets), assetId))
9589 else assetBalance(this, assetId)
9690
9791
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))
160130 }
161131
162132
163133 @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"], " "))
182141 }
183142
184143
185144
186145 @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))
194169 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))
197176 }
177+
178+
179+
180+@Callable(i)
181+func WithdrawUSDT () = withdraw(i, usdtAsset)
182+
183+
184+
185+@Callable(i)
186+func WithdrawUSDC () = withdraw(i, usdcAsset)
198187
199188
200189
204193 else if ((i.callerPublicKey != adminPublicKey))
205194 then throw(makeString(["AirdropWasher (...) =>", "This action can only be performed by an administrator!"], " "))
206195 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- }
227196
228197
229198 @Verifier(tx)
258227 then (o.matcherPublicKey == wexchPublicKey)
259228 else false)
260229 then if (if (if ((o.orderType == Buy))
261- then !(containsElement(portfolio, o.assetPair.priceAsset))
230+ then containsElement(portfolio, o.assetPair.amountAsset)
262231 else false)
263232 then true
264233 else if ((o.orderType == Sell))
265- then !(containsElement(portfolio, o.assetPair.amountAsset))
234+ then containsElement(portfolio, o.assetPair.priceAsset)
266235 else false)
267236 then true
268237 else if (!(containsElement(portfolio, o.assetPair.priceAsset)))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let ScriptVersion = "2.1.0-beta_20210113"
4+let ScriptVersion = "1.2.3-beta_20210113"
55
66 let percent = 10000
77
88 let usdMult = 1000000
99
1010 let decMult = 100000000
1111
12-let oneWeek = (604800 * 1000)
12+let feePerc = 20
1313
14-let fhfsPrice = (100 * usdMult)
14+let minAmount = (1 * usdMult)
1515
16-let salePercent = ((30 * percent) / 100)
16+let avgMonth = ((31556952 * 1000) / 12)
17+
18+let openTimestamp = (1609573796 * 1000)
1719
1820 let adminPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k'
1921
2022 let robotPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k'
2123
2224 let wexchPublicKey = base58'9cpfKN9suPNvfeUNphzxXMjcnn974eme8ZhWUjaktzU5'
2325
2426 let guarantors = ([valueOrElse(getBinary(this, "guarantor1"), base58''), valueOrElse(getBinary(this, "guarantor2"), base58''), valueOrElse(getBinary(this, "guarantor3"), base58'')] :+ base58'')
2527
2628 let actualSize = value(indexOf(guarantors, base58''))
2729
2830 let minSignatures = ((actualSize / 2) + (actualSize % 2))
2931
3032 let usdtAsset = base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ'
3133
3234 let usdcAsset = base58'6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ'
3335
3436 let fhfsAsset = base58'4wcCKU3Cu4ABpmfiwzufocvrQQuRX4QMHZ7TjpRwtAmn'
3537
3638 let ratsAsset = base58'Z7817F7hnbWYsVHykjPtn8sUjyuLLf8NPofdveb8CMD'
3739
3840 let xfeeAsset = base58'5EMfVQiB8NF4HuhaXrZzDM637whWuVBsduq59ZaCSNqk'
3941
40-let portfolio = [base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ', base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS', base58'474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu', base58'zMFqXuoyrn5w17PFurTqxB7GsS71fp9dfk6XFwxbPCy', base58'HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk', base58'B3uGHFRpSUuGEDWjqB9LWWxafQj8VTvpMucEyoxzws5H', base58'5WvPKSJXzVE2orvbkJ8wsQmmQKqTv9sGBPksV4adViw3', base58'BrjUWjndUanm5VsJkbUip8VRYy6LWJePtxya3FNv4TQa']
42+let portfolio = [usdtAsset, usdcAsset]
4143
4244 let ourAssets = [fhfsAsset, xfeeAsset, ratsAsset]
43-
44-let majorSize = 1
45-
46-let majorMult = 2
47-
48-let altMult = (majorMult * (size(portfolio) - majorSize))
4945
5046 let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x')
5147
5248 let fmain = Address(base58'3PEPsNg7aSWSSgdC6XweyJkvDXmwVoWeNHL')
5349
5450 let fcold = Address(base58'3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA')
5551
5652 let frats = Address(base58'3PJ7RB5CC3Bnn44RNR2hceZ6wKsULnMSxPi')
5753
5854 let fhfsTotal = (assetBalance(fmain, fhfsAsset) + assetBalance(fcold, fhfsAsset))
5955
6056 let fhfsFunds = (value(assetInfo(fhfsAsset)).quantity - fhfsTotal)
6157
6258 let ratsTotal = (assetBalance(frats, ratsAsset) + assetBalance(fcold, ratsAsset))
6359
6460 let ratsFunds = (value(assetInfo(ratsAsset)).quantity - ratsTotal)
6561
6662 let usdxFunds = (assetBalance(frats, usdtAsset) + assetBalance(frats, usdcAsset))
6763
6864 func round (xVal) = ((xVal + 1) / 2)
6965
7066
7167 func fractionRound (val,num,den) = round(fraction((2 * val), num, den))
7268
7369
7470 func valueOrMinimum (val,minVal) = if ((minVal > val))
7571 then minVal
7672 else val
7773
7874
7975 func adminTimestamp (publicKey) = if ((publicKey != adminPublicKey))
8076 then nil
8177 else [IntegerEntry("timestamp", lastBlock.timestamp)]
8278
8379
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)
8983
9084
9185 func airdropBalance (assetId) = if (containsElement((portfolio ++ ourAssets), assetId))
9286 then throw(makeString(["AirdropWasher () =>", "Please remove the asset ID:", toBase58String(assetId)], " "))
9387 else if ((assetId == base58''))
9488 then 0
9589 else assetBalance(this, assetId)
9690
9791
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))
160130 }
161131
162132
163133 @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"], " "))
182141 }
183142
184143
185144
186145 @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))
194169 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))
197176 }
177+
178+
179+
180+@Callable(i)
181+func WithdrawUSDT () = withdraw(i, usdtAsset)
182+
183+
184+
185+@Callable(i)
186+func WithdrawUSDC () = withdraw(i, usdcAsset)
198187
199188
200189
201190 @Callable(i)
202191 func AirdropWasher (id0,id1,id2,id3,id4,id5,id6,id7,id8,id9) = if ((size(i.payments) > 0))
203192 then throw(makeString(["AirdropWasher (...) =>", "Don't attach payment when calling this function ..."], " "))
204193 else if ((i.callerPublicKey != adminPublicKey))
205194 then throw(makeString(["AirdropWasher (...) =>", "This action can only be performed by an administrator!"], " "))
206195 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- }
227196
228197
229198 @Verifier(tx)
230199 func verify () = {
231200 let isValidOwner = sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
232201 let isValidAdmin = if (isValidOwner)
233202 then true
234203 else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], adminPublicKey)
235204 let isValidRobot = if (isValidOwner)
236205 then true
237206 else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], robotPublicKey)
238207 let isValidGuarantors = ((((if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], guarantors[0]))
239208 then 1
240209 else 0) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[2], guarantors[1]))
241210 then 1
242211 else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[3], guarantors[2]))
243212 then 1
244213 else 0)) >= minSignatures)
245214 match tx {
246215 case _: LeaseCancelTransaction|LeaseTransaction =>
247216 isValidOwner
248217 case b: BurnTransaction =>
249218 if (if (isValidOwner)
250219 then !(containsElement(portfolio, b.assetId))
251220 else false)
252221 then !(containsElement(ourAssets, b.assetId))
253222 else false
254223 case o: Order =>
255224 if (if (if (if (if (isValidRobot)
256225 then !(isDefined(o.matcherFeeAssetId))
257226 else false)
258227 then (o.matcherPublicKey == wexchPublicKey)
259228 else false)
260229 then if (if (if ((o.orderType == Buy))
261- then !(containsElement(portfolio, o.assetPair.priceAsset))
230+ then containsElement(portfolio, o.assetPair.amountAsset)
262231 else false)
263232 then true
264233 else if ((o.orderType == Sell))
265- then !(containsElement(portfolio, o.assetPair.amountAsset))
234+ then containsElement(portfolio, o.assetPair.priceAsset)
266235 else false)
267236 then true
268237 else if (!(containsElement(portfolio, o.assetPair.priceAsset)))
269238 then !(containsElement(portfolio, o.assetPair.amountAsset))
270239 else false
271240 else false)
272241 then !(containsElement(ourAssets, o.assetPair.priceAsset))
273242 else false)
274243 then !(containsElement(ourAssets, o.assetPair.amountAsset))
275244 else false
276245 case t: MassTransferTransaction|TransferTransaction =>
277246 if (if (if (isValidAdmin)
278247 then isValidGuarantors
279248 else false)
280249 then !(containsElement(portfolio, t.assetId))
281250 else false)
282251 then !(containsElement(portfolio, t.feeAssetId))
283252 else false
284253 case _: SetScriptTransaction|DataTransaction =>
285254 if (isValidAdmin)
286255 then isValidGuarantors
287256 else false
288257 case _ =>
289258 false
290259 }
291260 }
292261

github/deemru/w8io/3ef1775 
93.57 ms