2021.03.03 02:01 [2485341] smart account 3PJ7RB5CC3Bnn44RNR2hceZ6wKsULnMSxPi > SELF 0.00000000 Waves
{ "type": 13, "id": "3ju4YVc3jH4qVnuoyNcCAENgc4zrVma2kdioQLGN1o28", "fee": 1400000, "feeAssetId": null, "timestamp": 1614725996635, "version": 1, "sender": "3PJ7RB5CC3Bnn44RNR2hceZ6wKsULnMSxPi", "senderPublicKey": "G5ztBKfbizrqVQWMZknsgbG2HS91eJ7QgHh7X3AznjoW", "proofs": [ "28QDCLSsxMh8zxAHti8HUsyeqTqCmxhoPk3yZqaR5V4vZSpiYW2a4nX9GL3Zb5Q2Q8Jp1PZHrynr8WySjCcyQb3U", "2jPVgTYzin3dNN5KBFqvoVGSSX3qk54JnPwRtn4dLTdprKdX3sthuKm51PNbeHDbkjbn5xextE343ZMpRV4vqpYr" ], "script": "base64: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AAABBQAAAAdhc3NldElkBQAAAANuaWwCAAAAASADCQAAAAAAAAIFAAAAB2Fzc2V0SWQBAAAAAAAAAAAAAAAAAAkAA/AAAAACBQAAAAR0aGlzBQAAAAdhc3NldElkAQAAAAh3aXRoZHJhdwAAAAIAAAABaQAAAAdhc3NldElkBAAAAAskdDA1NTUzNTYwNAkBAAAADWdldEF0dGFjaG1lbnQAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAGYXNzZXQwCAUAAAALJHQwNTU1MzU2MDQAAAACXzEEAAAAB2Ftb3VudDAIBQAAAAskdDA1NTUzNTYwNAAAAAJfMgQAAAALJHQwNTYwNzU2NTgJAQAAAA1nZXRBdHRhY2htZW50AAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEEAAAABmFzc2V0MQgFAAAACyR0MDU2MDc1NjU4AAAAAl8xBAAAAAdhbW91bnQxCAUAAAALJHQwNTYwNzU2NTgAAAACXzIEAAAACXRoaXNGdW5kcwkAA/AAAAACBQAAAAR0aGlzBQAAAAdhc3NldElkBAAAAApyYXRzQW1vdW50CQEAAAANZnJhY3Rpb25Sb3VuZAAAAAMJAABkAAAAAgUAAAAHYW1vdW50MAUAAAAHYW1vdW50MQUAAAAJdGhpc0Z1bmRzBQAAAAl1c2R4RnVuZHMEAAAACnVzZHhBbW91bnQJAQAAAA1mcmFjdGlvblJvdW5kAAAAAwUAAAAJdXNkeEZ1bmRzBQAAAApyYXRzQW1vdW50BQAAAAlyYXRzRnVuZHMEAAAAC3VzZXJCYWxhbmNlCQAD8AAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAJZmhmc0Fzc2V0BAAAAAhncm9zc0ZlZQkBAAAADWZyYWN0aW9uUm91bmQAAAADBQAAAAp1c2R4QW1vdW50BQAAAAdmZWVQZXJjBQAAAAdwZXJjZW50BAAAAAhkaXNjb3VudAkBAAAADWZyYWN0aW9uUm91bmQAAAADBQAAAAhncm9zc0ZlZQUAAAALdXNlckJhbGFuY2UFAAAACWZoZnNGdW5kcwQAAAAJZmVlQW1vdW50CQEAAAAOdmFsdWVPck1pbmltdW0AAAACCQAAZQAAAAIFAAAACGdyb3NzRmVlBQAAAAhkaXNjb3Vu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aGVyRmVlQXNzZXRJZAkAAAAAAAACCAgFAAAAAW8AAAAJYXNzZXRQYWlyAAAACnByaWNlQXNzZXQFAAAACXJhdHNBc3NldAcHCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAgFAAAAAW8AAAAJYXNzZXRQYWlyAAAAC2Ftb3VudEFzc2V0BwYDAwkAAAAAAAACCAUAAAABbwAAAAlvcmRlclR5cGUFAAAABFNlbGwDCQAAAAAAAAIIBQAAAAFvAAAAEW1hdGNoZXJGZWVBc3NldElkCAgFAAAAAW8AAAAJYXNzZXRQYWlyAAAAC2Ftb3VudEFzc2V0BgMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAAFvAAAAEW1hdGNoZXJGZWVBc3NldElkCQAAAAAAAAIICAUAAAABbwAAAAlhc3NldFBhaXIAAAALYW1vdW50QXNzZXQFAAAACXJhdHNBc3NldAcHCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAgFAAAAAW8AAAAJYXNzZXRQYWlyAAAACnByaWNlQXNzZXQHBgMDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABCAUAAAABbwAAABFtYXRjaGVyRmVlQXNzZXRJZAkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABE4AAAACBQAAAAlwb3J0Zm9saW8FAAAACW91ckFzc2V0cwgIBQAAAAFvAAAACWFzc2V0UGFpcgAAAApwcmljZUFzc2V0BwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABE4AAAACBQAAAAlwb3J0Zm9saW8FAAAACW91ckFzc2V0cwgIBQAAAAFvAAAACWFzc2V0UGFpcgAAAAthbW91bnRBc3NldAcHAwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAXTWFzc1RyYW5zZmVyVHJhbnNhY3Rpb24GCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAE1RyYW5zZmVyVHJhbnNhY3Rpb24EAAAAAXQFAAAAByRtYXRjaDADAwUAAAAMaXNWYWxpZEFkbWluBQAAABFpc1ZhbGlkR3VhcmFudG9ycwcJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAACXBvcnRmb2xpbwgFAAAAAXQAAAAHYXNzZXRJZAcDAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABRTZXRTY3JpcHRUcmFuc2FjdGlvbgYJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAPRGF0YVRyYW5zYWN0aW9uAwUAAAAMaXNWYWxpZEFkbWluBQAAABFpc1ZhbGlkR3VhcmFudG9ycwcHmOWKGQ==", "chainId": 87, "height": 2485341, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CVWGC6UpxdjKKVfc627hQ3m8rXJT8ghUyuF21ovVHphR Next: DCin2PmKB31c54v5JEnFAm64FY8BPWzEJGfYU6bQmX9 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 = "1.6.0-beta_20210303" | |
5 | 5 | ||
6 | 6 | let percent = 10000 | |
7 | 7 | ||
63 | 63 | ||
64 | 64 | let usdxFunds = (assetBalance(frats, usdtAsset) + assetBalance(frats, usdcAsset)) | |
65 | 65 | ||
66 | - | func round (xVal) = ((xVal + 1) / 2) | |
66 | + | func round (xVal) = ((xVal + (if ((0 > xVal)) | |
67 | + | then 0 | |
68 | + | else 1)) / 2) | |
67 | 69 | ||
68 | 70 | ||
69 | 71 | func fractionRound (val,num,den) = round(fraction((2 * val), num, den)) | |
111 | 113 | ||
112 | 114 | ||
113 | 115 | func withdraw (i,assetId) = { | |
114 | - | let $ | |
115 | - | let asset0 = $ | |
116 | - | let amount0 = $ | |
117 | - | let $ | |
118 | - | let asset1 = $ | |
119 | - | let amount1 = $ | |
120 | - | let | |
121 | - | let ratsAmount = fractionRound((amount0 + amount1), | |
116 | + | let $t055535604 = getAttachment(i.payments, 0) | |
117 | + | let asset0 = $t055535604._1 | |
118 | + | let amount0 = $t055535604._2 | |
119 | + | let $t056075658 = getAttachment(i.payments, 1) | |
120 | + | let asset1 = $t056075658._1 | |
121 | + | let amount1 = $t056075658._2 | |
122 | + | let thisFunds = assetBalance(this, assetId) | |
123 | + | let ratsAmount = fractionRound((amount0 + amount1), thisFunds, usdxFunds) | |
122 | 124 | let usdxAmount = fractionRound(usdxFunds, ratsAmount, ratsFunds) | |
123 | 125 | let userBalance = assetBalance(i.caller, fhfsAsset) | |
124 | 126 | let grossFee = fractionRound(usdxAmount, feePerc, percent) | |
144 | 146 | let decimals = (size(toString(percent)) - 1) | |
145 | 147 | let duration = (lastBlock.timestamp - openTimestamp) | |
146 | 148 | let exponent = fractionRound(decMult, (12 * avgMonth), duration) | |
147 | - | let $ | |
149 | + | let $t068037038 = if ((10000 > (usdxFunds / usdMult))) | |
148 | 150 | then $Tuple2(1, "") | |
149 | 151 | else if ((10000000 > (usdxFunds / usdMult))) | |
150 | 152 | then $Tuple2(1000, "K") | |
151 | 153 | else if ((10000000000 > (usdxFunds / usdMult))) | |
152 | 154 | then $Tuple2(1000000, "M") | |
153 | 155 | else $Tuple2(1000000000, "B") | |
154 | - | let unitMult = $ | |
155 | - | let unitPrefix = $ | |
156 | + | let unitMult = $t068037038._1 | |
157 | + | let unitPrefix = $t068037038._2 | |
156 | 158 | let balance = fraction(centMult, usdxFunds, usdMult) | |
157 | 159 | let meanPrice = fractionRound(decMult, usdxFunds, ratsFunds) | |
158 | 160 | let annualReturn = (pow(meanPrice, 8, exponent, 8, decimals, HALFUP) - percent) | |
163 | 165 | ||
164 | 166 | @Callable(i) | |
165 | 167 | func DepositFunds () = { | |
166 | - | let $t075347585 = getAttachment(i.payments, 0) | |
167 | - | let asset0 = $t075347585._1 | |
168 | - | let amount0 = $t075347585._2 | |
169 | - | let $t075887639 = getAttachment(i.payments, 1) | |
170 | - | let asset1 = $t075887639._1 | |
171 | - | let amount1 = $t075887639._2 | |
172 | - | let usdxAmount = (amount0 + amount1) | |
173 | - | let ratsAmount = fractionRound(ratsFunds, usdxAmount, usdxFunds) | |
174 | - | if (if (if ((minAmount > usdxAmount)) | |
168 | + | let usdtFunds = assetBalance(this, usdtAsset) | |
169 | + | let usdcFunds = assetBalance(this, usdcAsset) | |
170 | + | let halfRange = valueOrElse(getInteger(this, "halfRange"), 80) | |
171 | + | let proportion = if ((usdcFunds > usdtFunds)) | |
172 | + | then (pow(fractionRound(decMult, (2 * usdtFunds), usdxFunds), 8, 5, 1, 8, HALFUP) - decMult) | |
173 | + | else (decMult - pow(fractionRound(decMult, (2 * usdcFunds), usdxFunds), 8, 5, 1, 8, HALFUP)) | |
174 | + | let correction = (fractionRound(proportion, halfRange, percent) + decMult) | |
175 | + | let $t080458096 = getAttachment(i.payments, 0) | |
176 | + | let asset0 = $t080458096._1 | |
177 | + | let amount0 = $t080458096._2 | |
178 | + | let $t080998150 = getAttachment(i.payments, 1) | |
179 | + | let asset1 = $t080998150._1 | |
180 | + | let amount1 = $t080998150._2 | |
181 | + | let maxAmount = max([usdxFunds, (1000 * minAmount)]) | |
182 | + | let usdtAmount = ((if ((asset0 == usdtAsset)) | |
183 | + | then amount0 | |
184 | + | else 0) + (if ((asset1 == usdtAsset)) | |
185 | + | then amount1 | |
186 | + | else 0)) | |
187 | + | let usdcAmount = ((if ((asset0 == usdcAsset)) | |
188 | + | then amount0 | |
189 | + | else 0) + (if ((asset1 == usdcAsset)) | |
190 | + | then amount1 | |
191 | + | else 0)) | |
192 | + | let ratsAmount = (fractionRound(fractionRound(ratsFunds, usdtAmount, usdxFunds), decMult, correction) + fractionRound(fractionRound(ratsFunds, usdcAmount, usdxFunds), correction, decMult)) | |
193 | + | if (if (if (if ((minAmount > (amount0 + amount1))) | |
194 | + | then true | |
195 | + | else ((amount0 + amount1) > maxAmount)) | |
175 | 196 | then true | |
176 | 197 | else if ((amount0 > 0)) | |
177 | 198 | then !(containsElement(portfolio, asset0)) | |
180 | 201 | else if ((amount1 > 0)) | |
181 | 202 | then !(containsElement(portfolio, asset1)) | |
182 | 203 | else false) | |
183 | - | then throw(makeString(["DepositFunds () =>", "Please attach Tether (USDT) and/or USD Coin (USDC) assets!", "Min. total:", toDollarString(fraction(centMult, minAmount, usdMult), centMult)], " ")) | |
204 | + | then throw(makeString(["DepositFunds () =>", "Please attach Tether (USDT) and/or USD Coin (USDC) assets!", "Min. total:", (toDollarString(fraction(centMult, minAmount, usdMult), centMult) + ";"), "Max. total:", toDollarString(fraction(centMult, maxAmount, usdMult), centMult)], " ")) | |
184 | 205 | else ([ScriptTransfer(i.caller, ratsAmount, ratsAsset)] ++ adminTimestamp(i.callerPublicKey)) | |
185 | 206 | } | |
186 | 207 |
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 = "1.6.0-beta_20210303" | |
5 | 5 | ||
6 | 6 | let percent = 10000 | |
7 | 7 | ||
8 | 8 | let usdMult = 1000000 | |
9 | 9 | ||
10 | 10 | let decMult = 100000000 | |
11 | 11 | ||
12 | 12 | let centMult = (usdMult / 10000) | |
13 | 13 | ||
14 | 14 | let feePerc = ((2 * percent) / 100) | |
15 | 15 | ||
16 | 16 | let minAmount = (1 * usdMult) | |
17 | 17 | ||
18 | 18 | let avgMonth = ((31556952 / 12) * 1000) | |
19 | 19 | ||
20 | 20 | let openTimestamp = (1609573796 * 1000) | |
21 | 21 | ||
22 | 22 | let adminPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k' | |
23 | 23 | ||
24 | 24 | let robotPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k' | |
25 | 25 | ||
26 | 26 | let matcherPublicKey = base58'9cpfKN9suPNvfeUNphzxXMjcnn974eme8ZhWUjaktzU5' | |
27 | 27 | ||
28 | 28 | let guarantors = ([valueOrElse(getBinary(this, "guarantor1"), base58''), valueOrElse(getBinary(this, "guarantor2"), base58''), valueOrElse(getBinary(this, "guarantor3"), base58'')] :+ base58'') | |
29 | 29 | ||
30 | 30 | let actualSize = value(indexOf(guarantors, base58'')) | |
31 | 31 | ||
32 | 32 | let minSignatures = ((actualSize / 2) + (actualSize % 2)) | |
33 | 33 | ||
34 | 34 | let usdtAsset = base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ' | |
35 | 35 | ||
36 | 36 | let usdcAsset = base58'6XtHjpXbs9RRJP2Sr9GUyVqzACcby9TkThHXnjVC5CDJ' | |
37 | 37 | ||
38 | 38 | let fhfsAsset = base58'4wcCKU3Cu4ABpmfiwzufocvrQQuRX4QMHZ7TjpRwtAmn' | |
39 | 39 | ||
40 | 40 | let ratsAsset = base58'Z7817F7hnbWYsVHykjPtn8sUjyuLLf8NPofdveb8CMD' | |
41 | 41 | ||
42 | 42 | let xfeeAsset = base58'5EMfVQiB8NF4HuhaXrZzDM637whWuVBsduq59ZaCSNqk' | |
43 | 43 | ||
44 | 44 | let portfolio = [usdtAsset, usdcAsset] | |
45 | 45 | ||
46 | 46 | let ourAssets = [fhfsAsset, xfeeAsset, ratsAsset] | |
47 | 47 | ||
48 | 48 | let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x') | |
49 | 49 | ||
50 | 50 | let fmain = Address(base58'3PEPsNg7aSWSSgdC6XweyJkvDXmwVoWeNHL') | |
51 | 51 | ||
52 | 52 | let fcold = Address(base58'3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA') | |
53 | 53 | ||
54 | 54 | let frats = Address(base58'3PJ7RB5CC3Bnn44RNR2hceZ6wKsULnMSxPi') | |
55 | 55 | ||
56 | 56 | let fhfsTotal = (assetBalance(fmain, fhfsAsset) + assetBalance(fcold, fhfsAsset)) | |
57 | 57 | ||
58 | 58 | let fhfsFunds = (value(assetInfo(fhfsAsset)).quantity - fhfsTotal) | |
59 | 59 | ||
60 | 60 | let ratsTotal = (assetBalance(frats, ratsAsset) + assetBalance(fcold, ratsAsset)) | |
61 | 61 | ||
62 | 62 | let ratsFunds = (value(assetInfo(ratsAsset)).quantity - ratsTotal) | |
63 | 63 | ||
64 | 64 | let usdxFunds = (assetBalance(frats, usdtAsset) + assetBalance(frats, usdcAsset)) | |
65 | 65 | ||
66 | - | func round (xVal) = ((xVal + 1) / 2) | |
66 | + | func round (xVal) = ((xVal + (if ((0 > xVal)) | |
67 | + | then 0 | |
68 | + | else 1)) / 2) | |
67 | 69 | ||
68 | 70 | ||
69 | 71 | func fractionRound (val,num,den) = round(fraction((2 * val), num, den)) | |
70 | 72 | ||
71 | 73 | ||
72 | 74 | func valueOrMinimum (val,minVal) = if ((minVal > val)) | |
73 | 75 | then minVal | |
74 | 76 | else val | |
75 | 77 | ||
76 | 78 | ||
77 | 79 | func toFloatString (val,mult) = toUtf8String(if ((1 > mult)) | |
78 | 80 | then throw("Unexpected error: The multiplier must be greater than zero!") | |
79 | 81 | else if ((val == 0)) | |
80 | 82 | then base58'q' | |
81 | 83 | else if ((val > 0)) | |
82 | 84 | then ((toBytes(toString((val / mult))) + (if ((mult > 1)) | |
83 | 85 | then base58'o' | |
84 | 86 | else base58'')) + take(drop(toBytes(toString(((val % mult) + mult))), 1), 8)) | |
85 | 87 | else throw("Unexpected error: Negative values are not allowed!")) | |
86 | 88 | ||
87 | 89 | ||
88 | 90 | func toDollarString (val,mult) = toUtf8String((base58'd' + toBytes(toFloatString(val, mult)))) | |
89 | 91 | ||
90 | 92 | ||
91 | 93 | func adminTimestamp (publicKey) = if ((publicKey != adminPublicKey)) | |
92 | 94 | then nil | |
93 | 95 | else [IntegerEntry("timestamp", lastBlock.timestamp)] | |
94 | 96 | ||
95 | 97 | ||
96 | 98 | func getAttachment (payments,idx) = if ((idx >= size(payments))) | |
97 | 99 | then $Tuple2(base58'', 0) | |
98 | 100 | else $Tuple2(payments[idx].assetId, payments[idx].amount) | |
99 | 101 | ||
100 | 102 | ||
101 | 103 | func getTransfer (recipient,amount,assetId) = if ((1 > amount)) | |
102 | 104 | then nil | |
103 | 105 | else [ScriptTransfer(recipient, amount, assetId)] | |
104 | 106 | ||
105 | 107 | ||
106 | 108 | func airdropBalance (assetId) = if (containsElement((portfolio ++ ourAssets), assetId)) | |
107 | 109 | then throw(makeString(["AirdropWasher () =>", "Please remove the asset ID:", toBase58String(assetId)], " ")) | |
108 | 110 | else if ((assetId == base58'')) | |
109 | 111 | then 0 | |
110 | 112 | else assetBalance(this, assetId) | |
111 | 113 | ||
112 | 114 | ||
113 | 115 | func withdraw (i,assetId) = { | |
114 | - | let $ | |
115 | - | let asset0 = $ | |
116 | - | let amount0 = $ | |
117 | - | let $ | |
118 | - | let asset1 = $ | |
119 | - | let amount1 = $ | |
120 | - | let | |
121 | - | let ratsAmount = fractionRound((amount0 + amount1), | |
116 | + | let $t055535604 = getAttachment(i.payments, 0) | |
117 | + | let asset0 = $t055535604._1 | |
118 | + | let amount0 = $t055535604._2 | |
119 | + | let $t056075658 = getAttachment(i.payments, 1) | |
120 | + | let asset1 = $t056075658._1 | |
121 | + | let amount1 = $t056075658._2 | |
122 | + | let thisFunds = assetBalance(this, assetId) | |
123 | + | let ratsAmount = fractionRound((amount0 + amount1), thisFunds, usdxFunds) | |
122 | 124 | let usdxAmount = fractionRound(usdxFunds, ratsAmount, ratsFunds) | |
123 | 125 | let userBalance = assetBalance(i.caller, fhfsAsset) | |
124 | 126 | let grossFee = fractionRound(usdxAmount, feePerc, percent) | |
125 | 127 | let discount = fractionRound(grossFee, userBalance, fhfsFunds) | |
126 | 128 | let feeAmount = valueOrMinimum((grossFee - discount), 0) | |
127 | 129 | let outAmount = valueOrMinimum((usdxAmount - feeAmount), 0) | |
128 | 130 | if (if (if ((1 > ratsAmount)) | |
129 | 131 | then true | |
130 | 132 | else if ((amount0 > 0)) | |
131 | 133 | then (asset0 != ratsAsset) | |
132 | 134 | else false) | |
133 | 135 | then true | |
134 | 136 | else if ((amount1 > 0)) | |
135 | 137 | then (asset1 != ratsAsset) | |
136 | 138 | else false) | |
137 | 139 | then throw(makeString(["WithdrawFunds () =>", "Please attach Ratatouille's Share (RATS) asset!", "Max. amount:", toFloatString(ratsFunds, usdMult), "RATS"], " ")) | |
138 | 140 | else [ScriptTransfer(admin, feeAmount, assetId), ScriptTransfer(i.caller, outAmount, assetId)] | |
139 | 141 | } | |
140 | 142 | ||
141 | 143 | ||
142 | 144 | @Callable(i) | |
143 | 145 | func GetDappInfo () = { | |
144 | 146 | let decimals = (size(toString(percent)) - 1) | |
145 | 147 | let duration = (lastBlock.timestamp - openTimestamp) | |
146 | 148 | let exponent = fractionRound(decMult, (12 * avgMonth), duration) | |
147 | - | let $ | |
149 | + | let $t068037038 = if ((10000 > (usdxFunds / usdMult))) | |
148 | 150 | then $Tuple2(1, "") | |
149 | 151 | else if ((10000000 > (usdxFunds / usdMult))) | |
150 | 152 | then $Tuple2(1000, "K") | |
151 | 153 | else if ((10000000000 > (usdxFunds / usdMult))) | |
152 | 154 | then $Tuple2(1000000, "M") | |
153 | 155 | else $Tuple2(1000000000, "B") | |
154 | - | let unitMult = $ | |
155 | - | let unitPrefix = $ | |
156 | + | let unitMult = $t068037038._1 | |
157 | + | let unitPrefix = $t068037038._2 | |
156 | 158 | let balance = fraction(centMult, usdxFunds, usdMult) | |
157 | 159 | let meanPrice = fractionRound(decMult, usdxFunds, ratsFunds) | |
158 | 160 | let annualReturn = (pow(meanPrice, 8, exponent, 8, decimals, HALFUP) - percent) | |
159 | 161 | throw(makeString(["GetDappInfo () =>", "balance:", ((toDollarString((balance / unitMult), centMult) + unitPrefix) + ";"), "mean price:", toDollarString(meanPrice, decMult), "/ RATS;", "annual return:", (toFloatString(annualReturn, (percent / 100)) + "%")], " ")) | |
160 | 162 | } | |
161 | 163 | ||
162 | 164 | ||
163 | 165 | ||
164 | 166 | @Callable(i) | |
165 | 167 | func DepositFunds () = { | |
166 | - | let $t075347585 = getAttachment(i.payments, 0) | |
167 | - | let asset0 = $t075347585._1 | |
168 | - | let amount0 = $t075347585._2 | |
169 | - | let $t075887639 = getAttachment(i.payments, 1) | |
170 | - | let asset1 = $t075887639._1 | |
171 | - | let amount1 = $t075887639._2 | |
172 | - | let usdxAmount = (amount0 + amount1) | |
173 | - | let ratsAmount = fractionRound(ratsFunds, usdxAmount, usdxFunds) | |
174 | - | if (if (if ((minAmount > usdxAmount)) | |
168 | + | let usdtFunds = assetBalance(this, usdtAsset) | |
169 | + | let usdcFunds = assetBalance(this, usdcAsset) | |
170 | + | let halfRange = valueOrElse(getInteger(this, "halfRange"), 80) | |
171 | + | let proportion = if ((usdcFunds > usdtFunds)) | |
172 | + | then (pow(fractionRound(decMult, (2 * usdtFunds), usdxFunds), 8, 5, 1, 8, HALFUP) - decMult) | |
173 | + | else (decMult - pow(fractionRound(decMult, (2 * usdcFunds), usdxFunds), 8, 5, 1, 8, HALFUP)) | |
174 | + | let correction = (fractionRound(proportion, halfRange, percent) + decMult) | |
175 | + | let $t080458096 = getAttachment(i.payments, 0) | |
176 | + | let asset0 = $t080458096._1 | |
177 | + | let amount0 = $t080458096._2 | |
178 | + | let $t080998150 = getAttachment(i.payments, 1) | |
179 | + | let asset1 = $t080998150._1 | |
180 | + | let amount1 = $t080998150._2 | |
181 | + | let maxAmount = max([usdxFunds, (1000 * minAmount)]) | |
182 | + | let usdtAmount = ((if ((asset0 == usdtAsset)) | |
183 | + | then amount0 | |
184 | + | else 0) + (if ((asset1 == usdtAsset)) | |
185 | + | then amount1 | |
186 | + | else 0)) | |
187 | + | let usdcAmount = ((if ((asset0 == usdcAsset)) | |
188 | + | then amount0 | |
189 | + | else 0) + (if ((asset1 == usdcAsset)) | |
190 | + | then amount1 | |
191 | + | else 0)) | |
192 | + | let ratsAmount = (fractionRound(fractionRound(ratsFunds, usdtAmount, usdxFunds), decMult, correction) + fractionRound(fractionRound(ratsFunds, usdcAmount, usdxFunds), correction, decMult)) | |
193 | + | if (if (if (if ((minAmount > (amount0 + amount1))) | |
194 | + | then true | |
195 | + | else ((amount0 + amount1) > maxAmount)) | |
175 | 196 | then true | |
176 | 197 | else if ((amount0 > 0)) | |
177 | 198 | then !(containsElement(portfolio, asset0)) | |
178 | 199 | else false) | |
179 | 200 | then true | |
180 | 201 | else if ((amount1 > 0)) | |
181 | 202 | then !(containsElement(portfolio, asset1)) | |
182 | 203 | else false) | |
183 | - | then throw(makeString(["DepositFunds () =>", "Please attach Tether (USDT) and/or USD Coin (USDC) assets!", "Min. total:", toDollarString(fraction(centMult, minAmount, usdMult), centMult)], " ")) | |
204 | + | then throw(makeString(["DepositFunds () =>", "Please attach Tether (USDT) and/or USD Coin (USDC) assets!", "Min. total:", (toDollarString(fraction(centMult, minAmount, usdMult), centMult) + ";"), "Max. total:", toDollarString(fraction(centMult, maxAmount, usdMult), centMult)], " ")) | |
184 | 205 | else ([ScriptTransfer(i.caller, ratsAmount, ratsAsset)] ++ adminTimestamp(i.callerPublicKey)) | |
185 | 206 | } | |
186 | 207 | ||
187 | 208 | ||
188 | 209 | ||
189 | 210 | @Callable(i) | |
190 | 211 | func WithdrawFunds () = ((withdraw(i, usdtAsset) ++ withdraw(i, usdcAsset)) ++ adminTimestamp(i.callerPublicKey)) | |
191 | 212 | ||
192 | 213 | ||
193 | 214 | ||
194 | 215 | @Callable(i) | |
195 | 216 | func AirdropWasher (id0,id1,id2,id3,id4,id5,id6,id7,id8,id9) = if ((size(i.payments) > 0)) | |
196 | 217 | then throw(makeString(["AirdropWasher (...) =>", "Don't attach payment when calling this function ..."], " ")) | |
197 | 218 | else if (if ((i.callerPublicKey != adminPublicKey)) | |
198 | 219 | then !(containsElement(guarantors, i.callerPublicKey)) | |
199 | 220 | else false) | |
200 | 221 | then throw(makeString(["AirdropWasher (...) =>", "This action can only be performed by an administrator!"], " ")) | |
201 | 222 | else ((((((((((getTransfer(admin, airdropBalance(id0), id0) ++ getTransfer(admin, airdropBalance(id1), id1)) ++ getTransfer(admin, airdropBalance(id2), id2)) ++ getTransfer(admin, airdropBalance(id3), id3)) ++ getTransfer(admin, airdropBalance(id4), id4)) ++ getTransfer(admin, airdropBalance(id5), id5)) ++ getTransfer(admin, airdropBalance(id6), id6)) ++ getTransfer(admin, airdropBalance(id7), id7)) ++ getTransfer(admin, airdropBalance(id8), id8)) ++ getTransfer(admin, airdropBalance(id9), id9)) ++ adminTimestamp(i.callerPublicKey)) | |
202 | 223 | ||
203 | 224 | ||
204 | 225 | @Verifier(tx) | |
205 | 226 | func verify () = { | |
206 | 227 | let isValidOwner = sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
207 | 228 | let isValidAdmin = if (isValidOwner) | |
208 | 229 | then true | |
209 | 230 | else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], adminPublicKey) | |
210 | 231 | let isValidRobot = if (isValidOwner) | |
211 | 232 | then true | |
212 | 233 | else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], robotPublicKey) | |
213 | 234 | let isValidGuarantors = ((((if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], guarantors[0])) | |
214 | 235 | then 1 | |
215 | 236 | else 0) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[2], guarantors[1])) | |
216 | 237 | then 1 | |
217 | 238 | else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[3], guarantors[2])) | |
218 | 239 | then 1 | |
219 | 240 | else 0)) >= minSignatures) | |
220 | 241 | match tx { | |
221 | 242 | case _: LeaseCancelTransaction|LeaseTransaction => | |
222 | 243 | isValidOwner | |
223 | 244 | case b: BurnTransaction => | |
224 | 245 | if (if (isValidOwner) | |
225 | 246 | then !(containsElement(portfolio, b.assetId)) | |
226 | 247 | else false) | |
227 | 248 | then !(containsElement(ourAssets, b.assetId)) | |
228 | 249 | else false | |
229 | 250 | case o: Order => | |
230 | 251 | if (if (isValidRobot) | |
231 | 252 | then (o.matcherPublicKey == matcherPublicKey) | |
232 | 253 | else false) | |
233 | 254 | then if (if (if (if ((o.orderType == Buy)) | |
234 | 255 | then if ((o.matcherFeeAssetId == o.assetPair.priceAsset)) | |
235 | 256 | then true | |
236 | 257 | else if (!(isDefined(o.matcherFeeAssetId))) | |
237 | 258 | then (o.assetPair.priceAsset == ratsAsset) | |
238 | 259 | else false | |
239 | 260 | else false) | |
240 | 261 | then containsElement(portfolio, o.assetPair.amountAsset) | |
241 | 262 | else false) | |
242 | 263 | then true | |
243 | 264 | else if (if ((o.orderType == Sell)) | |
244 | 265 | then if ((o.matcherFeeAssetId == o.assetPair.amountAsset)) | |
245 | 266 | then true | |
246 | 267 | else if (!(isDefined(o.matcherFeeAssetId))) | |
247 | 268 | then (o.assetPair.amountAsset == ratsAsset) | |
248 | 269 | else false | |
249 | 270 | else false) | |
250 | 271 | then containsElement(portfolio, o.assetPair.priceAsset) | |
251 | 272 | else false) | |
252 | 273 | then true | |
253 | 274 | else if (if (!(isDefined(o.matcherFeeAssetId))) | |
254 | 275 | then !(containsElement((portfolio ++ ourAssets), o.assetPair.priceAsset)) | |
255 | 276 | else false) | |
256 | 277 | then !(containsElement((portfolio ++ ourAssets), o.assetPair.amountAsset)) | |
257 | 278 | else false | |
258 | 279 | else false | |
259 | 280 | case t: MassTransferTransaction|TransferTransaction => | |
260 | 281 | if (if (isValidAdmin) | |
261 | 282 | then isValidGuarantors | |
262 | 283 | else false) | |
263 | 284 | then !(containsElement(portfolio, t.assetId)) | |
264 | 285 | else false | |
265 | 286 | case _: SetScriptTransaction|DataTransaction => | |
266 | 287 | if (isValidAdmin) | |
267 | 288 | then isValidGuarantors | |
268 | 289 | else false | |
269 | 290 | case _ => | |
270 | 291 | false | |
271 | 292 | } | |
272 | 293 | } | |
273 | 294 |
github/deemru/w8io/786bc32 84.85 ms ◑