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:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let ScriptVersion = "1. | |
4 | + | let ScriptVersion = "2.1.0-beta_20210113" | |
5 | 5 | ||
6 | 6 | let percent = 10000 | |
7 | 7 | ||
9 | 9 | ||
10 | 10 | let decMult = 100000000 | |
11 | 11 | ||
12 | - | let | |
12 | + | let oneWeek = (604800 * 1000) | |
13 | 13 | ||
14 | - | let | |
14 | + | let fhfsPrice = (100 * usdMult) | |
15 | 15 | ||
16 | - | let avgMonth = ((31556952 * 1000) / 12) | |
17 | - | ||
18 | - | let openTimestamp = (1609573796 * 1000) | |
16 | + | let salePercent = ((30 * percent) / 100) | |
19 | 17 | ||
20 | 18 | let adminPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k' | |
21 | 19 | ||
39 | 37 | ||
40 | 38 | let xfeeAsset = base58'5EMfVQiB8NF4HuhaXrZzDM637whWuVBsduq59ZaCSNqk' | |
41 | 39 | ||
42 | - | let portfolio = [ | |
40 | + | let portfolio = [base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ', base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS', base58'474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu', base58'zMFqXuoyrn5w17PFurTqxB7GsS71fp9dfk6XFwxbPCy', base58'HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk', base58'B3uGHFRpSUuGEDWjqB9LWWxafQj8VTvpMucEyoxzws5H', base58'5WvPKSJXzVE2orvbkJ8wsQmmQKqTv9sGBPksV4adViw3', base58'BrjUWjndUanm5VsJkbUip8VRYy6LWJePtxya3FNv4TQa'] | |
43 | 41 | ||
44 | 42 | let ourAssets = [fhfsAsset, xfeeAsset, ratsAsset] | |
43 | + | ||
44 | + | let majorSize = 1 | |
45 | + | ||
46 | + | let majorMult = 2 | |
47 | + | ||
48 | + | let altMult = (majorMult * (size(portfolio) - majorSize)) | |
45 | 49 | ||
46 | 50 | let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x') | |
47 | 51 | ||
72 | 76 | else val | |
73 | 77 | ||
74 | 78 | ||
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 | + | } | |
78 | 89 | ||
79 | 90 | ||
80 | 91 | func airdropBalance (assetId) = if (containsElement((portfolio ++ ourAssets), assetId)) | |
84 | 95 | else assetBalance(this, assetId) | |
85 | 96 | ||
86 | 97 | ||
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 | + | } | |
130 | 160 | } | |
131 | 161 | ||
132 | 162 | ||
133 | 163 | @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)) | |
141 | 182 | } | |
142 | 183 | ||
143 | 184 | ||
144 | 185 | ||
145 | 186 | @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) | |
169 | 194 | 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)) | |
176 | 197 | } | |
177 | 198 | ||
178 | 199 | ||
179 | 200 | ||
180 | 201 | @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)) | |
182 | 207 | ||
183 | 208 | ||
184 | 209 | ||
185 | 210 | @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 | + | } | |
196 | 227 | ||
197 | 228 | ||
198 | 229 | @Verifier(tx) | |
227 | 258 | then (o.matcherPublicKey == wexchPublicKey) | |
228 | 259 | else false) | |
229 | 260 | then if (if (if ((o.orderType == Buy)) | |
230 | - | then containsElement(portfolio, o.assetPair. | |
261 | + | then !(containsElement(portfolio, o.assetPair.priceAsset)) | |
231 | 262 | else false) | |
232 | 263 | then true | |
233 | 264 | else if ((o.orderType == Sell)) | |
234 | - | then containsElement(portfolio, o.assetPair. | |
265 | + | then !(containsElement(portfolio, o.assetPair.amountAsset)) | |
235 | 266 | else false) | |
236 | 267 | then true | |
237 | 268 | else if (!(containsElement(portfolio, o.assetPair.priceAsset))) | |
243 | 274 | then !(containsElement(ourAssets, o.assetPair.amountAsset)) | |
244 | 275 | else false | |
245 | 276 | case t: MassTransferTransaction|TransferTransaction => | |
246 | - | if (if (isValidAdmin) | |
277 | + | if (if (if (isValidAdmin) | |
247 | 278 | then isValidGuarantors | |
248 | 279 | else false) | |
249 | 280 | then !(containsElement(portfolio, t.assetId)) | |
281 | + | else false) | |
282 | + | then !(containsElement(portfolio, t.feeAssetId)) | |
250 | 283 | else false | |
251 | 284 | case _: SetScriptTransaction|DataTransaction => | |
252 | 285 | if (isValidAdmin) |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let ScriptVersion = "1. | |
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 | - | let | |
12 | + | let oneWeek = (604800 * 1000) | |
13 | 13 | ||
14 | - | let | |
14 | + | let fhfsPrice = (100 * usdMult) | |
15 | 15 | ||
16 | - | let avgMonth = ((31556952 * 1000) / 12) | |
17 | - | ||
18 | - | let openTimestamp = (1609573796 * 1000) | |
16 | + | let salePercent = ((30 * percent) / 100) | |
19 | 17 | ||
20 | 18 | let adminPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k' | |
21 | 19 | ||
22 | 20 | let robotPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k' | |
23 | 21 | ||
24 | 22 | let wexchPublicKey = base58'9cpfKN9suPNvfeUNphzxXMjcnn974eme8ZhWUjaktzU5' | |
25 | 23 | ||
26 | 24 | let guarantors = ([valueOrElse(getBinary(this, "guarantor1"), base58''), valueOrElse(getBinary(this, "guarantor2"), base58''), valueOrElse(getBinary(this, "guarantor3"), base58'')] :+ base58'') | |
27 | 25 | ||
28 | 26 | let actualSize = value(indexOf(guarantors, base58'')) | |
29 | 27 | ||
30 | 28 | let minSignatures = ((actualSize / 2) + (actualSize % 2)) | |
31 | 29 | ||
32 | 30 | let usdtAsset = base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ' | |
33 | 31 | ||
34 | 32 | let usdcAsset = base58'6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ' | |
35 | 33 | ||
36 | 34 | let fhfsAsset = base58'4wcCKU3Cu4ABpmfiwzufocvrQQuRX4QMHZ7TjpRwtAmn' | |
37 | 35 | ||
38 | 36 | let ratsAsset = base58'Z7817F7hnbWYsVHykjPtn8sUjyuLLf8NPofdveb8CMD' | |
39 | 37 | ||
40 | 38 | let xfeeAsset = base58'5EMfVQiB8NF4HuhaXrZzDM637whWuVBsduq59ZaCSNqk' | |
41 | 39 | ||
42 | - | let portfolio = [ | |
40 | + | let portfolio = [base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ', base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS', base58'474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu', base58'zMFqXuoyrn5w17PFurTqxB7GsS71fp9dfk6XFwxbPCy', base58'HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk', base58'B3uGHFRpSUuGEDWjqB9LWWxafQj8VTvpMucEyoxzws5H', base58'5WvPKSJXzVE2orvbkJ8wsQmmQKqTv9sGBPksV4adViw3', base58'BrjUWjndUanm5VsJkbUip8VRYy6LWJePtxya3FNv4TQa'] | |
43 | 41 | ||
44 | 42 | let ourAssets = [fhfsAsset, xfeeAsset, ratsAsset] | |
43 | + | ||
44 | + | let majorSize = 1 | |
45 | + | ||
46 | + | let majorMult = 2 | |
47 | + | ||
48 | + | let altMult = (majorMult * (size(portfolio) - majorSize)) | |
45 | 49 | ||
46 | 50 | let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x') | |
47 | 51 | ||
48 | 52 | let fmain = Address(base58'3PEPsNg7aSWSSgdC6XweyJkvDXmwVoWeNHL') | |
49 | 53 | ||
50 | 54 | let fcold = Address(base58'3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA') | |
51 | 55 | ||
52 | 56 | let frats = Address(base58'3PJ7RB5CC3Bnn44RNR2hceZ6wKsULnMSxPi') | |
53 | 57 | ||
54 | 58 | let fhfsTotal = (assetBalance(fmain, fhfsAsset) + assetBalance(fcold, fhfsAsset)) | |
55 | 59 | ||
56 | 60 | let fhfsFunds = (value(assetInfo(fhfsAsset)).quantity - fhfsTotal) | |
57 | 61 | ||
58 | 62 | let ratsTotal = (assetBalance(frats, ratsAsset) + assetBalance(fcold, ratsAsset)) | |
59 | 63 | ||
60 | 64 | let ratsFunds = (value(assetInfo(ratsAsset)).quantity - ratsTotal) | |
61 | 65 | ||
62 | 66 | let usdxFunds = (assetBalance(frats, usdtAsset) + assetBalance(frats, usdcAsset)) | |
63 | 67 | ||
64 | 68 | func round (xVal) = ((xVal + 1) / 2) | |
65 | 69 | ||
66 | 70 | ||
67 | 71 | func fractionRound (val,num,den) = round(fraction((2 * val), num, den)) | |
68 | 72 | ||
69 | 73 | ||
70 | 74 | func valueOrMinimum (val,minVal) = if ((minVal > val)) | |
71 | 75 | then minVal | |
72 | 76 | else val | |
73 | 77 | ||
74 | 78 | ||
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 | + | } | |
78 | 89 | ||
79 | 90 | ||
80 | 91 | func airdropBalance (assetId) = if (containsElement((portfolio ++ ourAssets), assetId)) | |
81 | 92 | then throw(makeString(["AirdropWasher () =>", "Please remove the asset ID:", toBase58String(assetId)], " ")) | |
82 | 93 | else if ((assetId == base58'')) | |
83 | 94 | then 0 | |
84 | 95 | else assetBalance(this, assetId) | |
85 | 96 | ||
86 | 97 | ||
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 | + | } | |
130 | 160 | } | |
131 | 161 | ||
132 | 162 | ||
133 | 163 | @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)) | |
141 | 182 | } | |
142 | 183 | ||
143 | 184 | ||
144 | 185 | ||
145 | 186 | @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) | |
169 | 194 | 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)) | |
176 | 197 | } | |
177 | 198 | ||
178 | 199 | ||
179 | 200 | ||
180 | 201 | @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)) | |
182 | 207 | ||
183 | 208 | ||
184 | 209 | ||
185 | 210 | @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 | + | } | |
196 | 227 | ||
197 | 228 | ||
198 | 229 | @Verifier(tx) | |
199 | 230 | func verify () = { | |
200 | 231 | let isValidOwner = sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
201 | 232 | let isValidAdmin = if (isValidOwner) | |
202 | 233 | then true | |
203 | 234 | else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], adminPublicKey) | |
204 | 235 | let isValidRobot = if (isValidOwner) | |
205 | 236 | then true | |
206 | 237 | else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], robotPublicKey) | |
207 | 238 | let isValidGuarantors = ((((if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], guarantors[0])) | |
208 | 239 | then 1 | |
209 | 240 | else 0) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[2], guarantors[1])) | |
210 | 241 | then 1 | |
211 | 242 | else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[3], guarantors[2])) | |
212 | 243 | then 1 | |
213 | 244 | else 0)) >= minSignatures) | |
214 | 245 | match tx { | |
215 | 246 | case _: LeaseCancelTransaction|LeaseTransaction => | |
216 | 247 | isValidOwner | |
217 | 248 | case b: BurnTransaction => | |
218 | 249 | if (if (isValidOwner) | |
219 | 250 | then !(containsElement(portfolio, b.assetId)) | |
220 | 251 | else false) | |
221 | 252 | then !(containsElement(ourAssets, b.assetId)) | |
222 | 253 | else false | |
223 | 254 | case o: Order => | |
224 | 255 | if (if (if (if (if (isValidRobot) | |
225 | 256 | then !(isDefined(o.matcherFeeAssetId)) | |
226 | 257 | else false) | |
227 | 258 | then (o.matcherPublicKey == wexchPublicKey) | |
228 | 259 | else false) | |
229 | 260 | then if (if (if ((o.orderType == Buy)) | |
230 | - | then containsElement(portfolio, o.assetPair. | |
261 | + | then !(containsElement(portfolio, o.assetPair.priceAsset)) | |
231 | 262 | else false) | |
232 | 263 | then true | |
233 | 264 | else if ((o.orderType == Sell)) | |
234 | - | then containsElement(portfolio, o.assetPair. | |
265 | + | then !(containsElement(portfolio, o.assetPair.amountAsset)) | |
235 | 266 | else false) | |
236 | 267 | then true | |
237 | 268 | else if (!(containsElement(portfolio, o.assetPair.priceAsset))) | |
238 | 269 | then !(containsElement(portfolio, o.assetPair.amountAsset)) | |
239 | 270 | else false | |
240 | 271 | else false) | |
241 | 272 | then !(containsElement(ourAssets, o.assetPair.priceAsset)) | |
242 | 273 | else false) | |
243 | 274 | then !(containsElement(ourAssets, o.assetPair.amountAsset)) | |
244 | 275 | else false | |
245 | 276 | case t: MassTransferTransaction|TransferTransaction => | |
246 | - | if (if (isValidAdmin) | |
277 | + | if (if (if (isValidAdmin) | |
247 | 278 | then isValidGuarantors | |
248 | 279 | else false) | |
249 | 280 | then !(containsElement(portfolio, t.assetId)) | |
281 | + | else false) | |
282 | + | then !(containsElement(portfolio, t.feeAssetId)) | |
250 | 283 | else false | |
251 | 284 | case _: SetScriptTransaction|DataTransaction => | |
252 | 285 | if (isValidAdmin) | |
253 | 286 | then isValidGuarantors | |
254 | 287 | else false | |
255 | 288 | case _ => | |
256 | 289 | false | |
257 | 290 | } | |
258 | 291 | } | |
259 | 292 |
github/deemru/w8io/0e76f2f 75.67 ms ◑