tx · 5auzK33jZDqtAYnTx6utEJdJSdVjSikFGaMYvsTEE4SX 3PJ7RB5CC3Bnn44RNR2hceZ6wKsULnMSxPi: -0.01400000 Waves 2021.02.12 14:09 [2458632] smart account 3PJ7RB5CC3Bnn44RNR2hceZ6wKsULnMSxPi > SELF 0.00000000 Waves
{ "type": 13, "id": "5auzK33jZDqtAYnTx6utEJdJSdVjSikFGaMYvsTEE4SX", "fee": 1400000, "feeAssetId": null, "timestamp": 1613127196461, "version": 1, "sender": "3PJ7RB5CC3Bnn44RNR2hceZ6wKsULnMSxPi", "senderPublicKey": "G5ztBKfbizrqVQWMZknsgbG2HS91eJ7QgHh7X3AznjoW", "proofs": [ "2oDBLtddsH4ZV2ycyyRbZGa2pwPBmQev9uMfbXuyMfCTRavW4Ey2xJmNtn4W8S4JTkV4BBYim97JYWY1dxgFW4Ti", "5ApJDE7Qd1xbbzeaE3GGr8w7nnTbQYDvBbxLBaZZWZm9fKc1Tv5CkTfGv8FkzDHFSbassWdPWBFVCT3AeXkbCzph" ], "script": "base64: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ZXRzCAUAAAABYgAAAAdhc3NldElkBwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAFT3JkZXIEAAAAAW8FAAAAByRtYXRjaDADAwMDAwUAAAAMaXNWYWxpZFJvYm90CQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABCAUAAAABbwAAABFtYXRjaGVyRmVlQXNzZXRJZAcJAAAAAAAAAggFAAAAAW8AAAAQbWF0Y2hlclB1YmxpY0tleQUAAAAQbWF0Y2hlclB1YmxpY0tleQcDAwMJAAAAAAAAAggFAAAAAW8AAAAJb3JkZXJUeXBlBQAAAANCdXkJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAlwb3J0Zm9saW8ICAUAAAABbwAAAAlhc3NldFBhaXIAAAALYW1vdW50QXNzZXQHBgMJAAAAAAAAAggFAAAAAW8AAAAJb3JkZXJUeXBlBQAAAARTZWxsCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAgFAAAAAW8AAAAJYXNzZXRQYWlyAAAACnByaWNlQXNzZXQHBgMJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAACXBvcnRmb2xpbwgIBQAAAAFvAAAACWFzc2V0UGFpcgAAAApwcmljZUFzc2V0CQEAAAABIQAAAAEJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAlwb3J0Zm9saW8ICAUAAAABbwAAAAlhc3NldFBhaXIAAAALYW1vdW50QXNzZXQHBwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJb3VyQXNzZXRzCAgFAAAAAW8AAAAJYXNzZXRQYWlyAAAACnByaWNlQXNzZXQHCQEAAAABIQAAAAEJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAlvdXJBc3NldHMICAUAAAABbwAAAAlhc3NldFBhaXIAAAALYW1vdW50QXNzZXQHAwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAXTWFzc1RyYW5zZmVyVHJhbnNhY3Rpb24GCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAE1RyYW5zZmVyVHJhbnNhY3Rpb24EAAAAAXQFAAAAByRtYXRjaDADAwMFAAAADGlzVmFsaWRBZG1pbgUAAAARaXNWYWxpZEd1YXJhbnRvcnMHCQEAAAABIQAAAAEJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAlwb3J0Zm9saW8IBQAAAAF0AAAAB2Fzc2V0SWQHCQEAAAABIQAAAAEJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAlwb3J0Zm9saW8IBQAAAAF0AAAACmZlZUFzc2V0SWQHAwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAUU2V0U2NyaXB0VHJhbnNhY3Rpb24GCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAD0RhdGFUcmFuc2FjdGlvbgMFAAAADGlzVmFsaWRBZG1pbgUAAAARaXNWYWxpZEd1YXJhbnRvcnMHBwr3AeQ=", "chainId": 87, "height": 2458632, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7pf7bRfnH1vgQYpxJuXnVf5QjfBs3HsDrR2Q9mTxafaW Next: A7JjWzNJ3oSFiwM1fZrLtTG4qDuduPb486Ab6RDDUhqE Diff:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let ScriptVersion = "1.3. | |
4 | + | let ScriptVersion = "1.3.6-beta_20210212" | |
5 | 5 | ||
6 | 6 | let percent = 10000 | |
7 | 7 | ||
23 | 23 | ||
24 | 24 | let robotPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k' | |
25 | 25 | ||
26 | - | let | |
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 | ||
111 | 111 | ||
112 | 112 | ||
113 | 113 | func withdraw (i,assetId) = { | |
114 | - | let $t055085559 = getAttachment(i.payments, 0) | |
115 | - | let asset0 = $t055085559._1 | |
116 | - | let amount0 = $t055085559._2 | |
117 | - | let $t055625613 = getAttachment(i.payments, 1) | |
118 | - | let asset1 = $t055625613._1 | |
119 | - | let amount1 = $t055625613._2 | |
114 | + | let userFunds = assetBalance(i.caller, fhfsAsset) | |
115 | + | let $t055615612 = getAttachment(i.payments, 0) | |
116 | + | let asset0 = $t055615612._1 | |
117 | + | let amount0 = $t055615612._2 | |
118 | + | let $t056155666 = getAttachment(i.payments, 1) | |
119 | + | let asset1 = $t056155666._1 | |
120 | + | let amount1 = $t056155666._2 | |
120 | 121 | let inAmount = (amount0 + amount1) | |
121 | 122 | let outAmount = fractionRound(inAmount, usdxFunds, ratsFunds) | |
123 | + | let grossFee = fractionRound(outAmount, feePerc, percent) | |
124 | + | let discount = fractionRound(grossFee, userFunds, fhfsFunds) | |
125 | + | let feeAmount = valueOrMinimum((grossFee - discount), 0) | |
126 | + | let netAmount = valueOrMinimum((outAmount - feeAmount), 0) | |
122 | 127 | let thisFunds = assetBalance(this, assetId) | |
123 | 128 | let maxAmount = fraction(thisFunds, ratsFunds, usdxFunds) | |
124 | 129 | let assetSymbol = if ((assetId == usdtAsset)) | |
138 | 143 | then (asset1 != ratsAsset) | |
139 | 144 | else false) | |
140 | 145 | then throw(makeString([("Withdraw" + assetSymbol), "() =>", "Please attach only Rat's Share (RATS) assets!", "Max. amount:", toFloatString(maxAmount, usdMult), "RATS"], " ")) | |
141 | - | else ([ScriptTransfer(i.caller, | |
146 | + | else ([ScriptTransfer(admin, feeAmount, assetId), ScriptTransfer(i.caller, netAmount, assetId)] ++ adminTimestamp(i.callerPublicKey)) | |
142 | 147 | } | |
143 | 148 | ||
144 | 149 | ||
145 | 150 | @Callable(i) | |
146 | 151 | func GetMeanPrice () = { | |
147 | - | let netReturn = valueOrMinimum((usdxFunds - ratsFunds), 0) | |
148 | - | let meanPrice = fractionRound(decMult, usdxFunds, ratsFunds) | |
149 | 152 | let decimals = (size(toString(percent)) - 1) | |
150 | 153 | let duration = (lastBlock.timestamp - openTimestamp) | |
151 | 154 | let exponent = fractionRound(decMult, (3 * avgMonth), duration) | |
152 | - | let averageROI = (pow(meanPrice, 8, exponent, 8, decimals, HALFUP) - percent) | |
153 | - | throw(makeString(["GetMeanPrice () =>", "balance:", (toDollarString(fractionRound(usdxFunds, centMult, usdMult), centMult) + ";"), "net return:", toDollarString(fractionRound(netReturn, centMult, usdMult), centMult), (("(+" + toFloatString(averageROI, (percent / 100))) + "% / 3Mo);"), "mean price:", toDollarString(meanPrice, decMult), "/ RATS"], " ")) | |
155 | + | let meanPrice = fractionRound(decMult, usdxFunds, ratsFunds) | |
156 | + | let meanReturn = (pow(meanPrice, 8, exponent, 8, decimals, HALFUP) - percent) | |
157 | + | throw(makeString(["GetMeanPrice () =>", "balance:", (toDollarString(fractionRound(usdxFunds, centMult, usdMult), centMult) + ";"), "mean price:", toDollarString(meanPrice, decMult), "/ RATS;", "mean return:", (toFloatString(meanReturn, (percent / 100)) + "% / 3Mo")], " ")) | |
154 | 158 | } | |
155 | 159 | ||
156 | 160 | ||
157 | 161 | ||
158 | 162 | @Callable(i) | |
159 | 163 | func DepositFunds () = { | |
160 | - | let userFunds = assetBalance(i.caller, fhfsAsset) | |
161 | - | let $t073477398 = getAttachment(i.payments, 0) | |
162 | - | let asset0 = $t073477398._1 | |
163 | - | let amount0 = $t073477398._2 | |
164 | - | let $t074017452 = getAttachment(i.payments, 1) | |
165 | - | let asset1 = $t074017452._1 | |
166 | - | let amount1 = $t074017452._2 | |
164 | + | let $t075047555 = getAttachment(i.payments, 0) | |
165 | + | let asset0 = $t075047555._1 | |
166 | + | let amount0 = $t075047555._2 | |
167 | + | let $t075587609 = getAttachment(i.payments, 1) | |
168 | + | let asset1 = $t075587609._1 | |
169 | + | let amount1 = $t075587609._2 | |
167 | 170 | let inAmount = (amount0 + amount1) | |
168 | 171 | let outAmount = fractionRound(inAmount, ratsFunds, usdxFunds) | |
169 | - | let grossFee = fractionRound(outAmount, feePerc, percent) | |
170 | - | let discount = fractionRound(grossFee, userFunds, fhfsFunds) | |
171 | - | let feeAmount = valueOrMinimum((grossFee - discount), 0) | |
172 | - | let netAmount = valueOrMinimum((outAmount - feeAmount), 0) | |
173 | 172 | if (if (if ((minAmount > inAmount)) | |
174 | 173 | then true | |
175 | 174 | else if ((amount0 > 0)) | |
180 | 179 | then !(containsElement(portfolio, asset1)) | |
181 | 180 | else false) | |
182 | 181 | then throw(makeString(["DepositFunds () =>", "Please attach Tether (USDT) and/or USD Coin (USDC) assets!", "Min. total:", toDollarString(fraction(minAmount, centMult, usdMult), centMult)], " ")) | |
183 | - | else ([ScriptTransfer( | |
182 | + | else ([ScriptTransfer(i.caller, outAmount, ratsAsset)] ++ adminTimestamp(i.callerPublicKey)) | |
184 | 183 | } | |
185 | 184 | ||
186 | 185 | ||
234 | 233 | if (if (if (if (if (isValidRobot) | |
235 | 234 | then !(isDefined(o.matcherFeeAssetId)) | |
236 | 235 | else false) | |
237 | - | then (o.matcherPublicKey == | |
236 | + | then (o.matcherPublicKey == matcherPublicKey) | |
238 | 237 | else false) | |
239 | 238 | then if (if (if ((o.orderType == Buy)) | |
240 | 239 | then containsElement(portfolio, o.assetPair.amountAsset) |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let ScriptVersion = "1.3. | |
4 | + | let ScriptVersion = "1.3.6-beta_20210212" | |
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 | - | let | |
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 | 66 | func round (xVal) = ((xVal + 1) / 2) | |
67 | 67 | ||
68 | 68 | ||
69 | 69 | func fractionRound (val,num,den) = round(fraction((2 * val), num, den)) | |
70 | 70 | ||
71 | 71 | ||
72 | 72 | func valueOrMinimum (val,minVal) = if ((minVal > val)) | |
73 | 73 | then minVal | |
74 | 74 | else val | |
75 | 75 | ||
76 | 76 | ||
77 | 77 | func toFloatString (val,mult) = toUtf8String(if ((1 > mult)) | |
78 | 78 | then throw("Unexpected error: The multiplier must be greater than zero!") | |
79 | 79 | else if ((val == 0)) | |
80 | 80 | then base58'q' | |
81 | 81 | else if ((val > 0)) | |
82 | 82 | then ((toBytes(toString((val / mult))) + (if ((mult > 1)) | |
83 | 83 | then base58'o' | |
84 | 84 | else base58'')) + take(drop(toBytes(toString(((val % mult) + mult))), 1), 8)) | |
85 | 85 | else throw("Unexpected error: Negative values are not allowed!")) | |
86 | 86 | ||
87 | 87 | ||
88 | 88 | func toDollarString (val,mult) = toUtf8String((base58'd' + toBytes(toFloatString(val, mult)))) | |
89 | 89 | ||
90 | 90 | ||
91 | 91 | func adminTimestamp (publicKey) = if ((publicKey != adminPublicKey)) | |
92 | 92 | then nil | |
93 | 93 | else [IntegerEntry("timestamp", lastBlock.timestamp)] | |
94 | 94 | ||
95 | 95 | ||
96 | 96 | func getAttachment (payments,idx) = if ((idx >= size(payments))) | |
97 | 97 | then $Tuple2(base58'', 0) | |
98 | 98 | else $Tuple2(payments[idx].assetId, payments[idx].amount) | |
99 | 99 | ||
100 | 100 | ||
101 | 101 | func getTransfer (recipient,amount,assetId) = if ((1 > amount)) | |
102 | 102 | then nil | |
103 | 103 | else [ScriptTransfer(recipient, amount, assetId)] | |
104 | 104 | ||
105 | 105 | ||
106 | 106 | func airdropBalance (assetId) = if (containsElement((portfolio ++ ourAssets), assetId)) | |
107 | 107 | then throw(makeString(["AirdropWasher () =>", "Please remove the asset ID:", toBase58String(assetId)], " ")) | |
108 | 108 | else if ((assetId == base58'')) | |
109 | 109 | then 0 | |
110 | 110 | else assetBalance(this, assetId) | |
111 | 111 | ||
112 | 112 | ||
113 | 113 | func withdraw (i,assetId) = { | |
114 | - | let $t055085559 = getAttachment(i.payments, 0) | |
115 | - | let asset0 = $t055085559._1 | |
116 | - | let amount0 = $t055085559._2 | |
117 | - | let $t055625613 = getAttachment(i.payments, 1) | |
118 | - | let asset1 = $t055625613._1 | |
119 | - | let amount1 = $t055625613._2 | |
114 | + | let userFunds = assetBalance(i.caller, fhfsAsset) | |
115 | + | let $t055615612 = getAttachment(i.payments, 0) | |
116 | + | let asset0 = $t055615612._1 | |
117 | + | let amount0 = $t055615612._2 | |
118 | + | let $t056155666 = getAttachment(i.payments, 1) | |
119 | + | let asset1 = $t056155666._1 | |
120 | + | let amount1 = $t056155666._2 | |
120 | 121 | let inAmount = (amount0 + amount1) | |
121 | 122 | let outAmount = fractionRound(inAmount, usdxFunds, ratsFunds) | |
123 | + | let grossFee = fractionRound(outAmount, feePerc, percent) | |
124 | + | let discount = fractionRound(grossFee, userFunds, fhfsFunds) | |
125 | + | let feeAmount = valueOrMinimum((grossFee - discount), 0) | |
126 | + | let netAmount = valueOrMinimum((outAmount - feeAmount), 0) | |
122 | 127 | let thisFunds = assetBalance(this, assetId) | |
123 | 128 | let maxAmount = fraction(thisFunds, ratsFunds, usdxFunds) | |
124 | 129 | let assetSymbol = if ((assetId == usdtAsset)) | |
125 | 130 | then "USDT" | |
126 | 131 | else if ((assetId == usdcAsset)) | |
127 | 132 | then "USDC" | |
128 | 133 | else throw("Unexpected error: This asset cannot be withdrawn!") | |
129 | 134 | if (if (if (if ((1 > inAmount)) | |
130 | 135 | then true | |
131 | 136 | else (inAmount > maxAmount)) | |
132 | 137 | then true | |
133 | 138 | else if ((amount0 > 0)) | |
134 | 139 | then (asset0 != ratsAsset) | |
135 | 140 | else false) | |
136 | 141 | then true | |
137 | 142 | else if ((amount1 > 0)) | |
138 | 143 | then (asset1 != ratsAsset) | |
139 | 144 | else false) | |
140 | 145 | then throw(makeString([("Withdraw" + assetSymbol), "() =>", "Please attach only Rat's Share (RATS) assets!", "Max. amount:", toFloatString(maxAmount, usdMult), "RATS"], " ")) | |
141 | - | else ([ScriptTransfer(i.caller, | |
146 | + | else ([ScriptTransfer(admin, feeAmount, assetId), ScriptTransfer(i.caller, netAmount, assetId)] ++ adminTimestamp(i.callerPublicKey)) | |
142 | 147 | } | |
143 | 148 | ||
144 | 149 | ||
145 | 150 | @Callable(i) | |
146 | 151 | func GetMeanPrice () = { | |
147 | - | let netReturn = valueOrMinimum((usdxFunds - ratsFunds), 0) | |
148 | - | let meanPrice = fractionRound(decMult, usdxFunds, ratsFunds) | |
149 | 152 | let decimals = (size(toString(percent)) - 1) | |
150 | 153 | let duration = (lastBlock.timestamp - openTimestamp) | |
151 | 154 | let exponent = fractionRound(decMult, (3 * avgMonth), duration) | |
152 | - | let averageROI = (pow(meanPrice, 8, exponent, 8, decimals, HALFUP) - percent) | |
153 | - | throw(makeString(["GetMeanPrice () =>", "balance:", (toDollarString(fractionRound(usdxFunds, centMult, usdMult), centMult) + ";"), "net return:", toDollarString(fractionRound(netReturn, centMult, usdMult), centMult), (("(+" + toFloatString(averageROI, (percent / 100))) + "% / 3Mo);"), "mean price:", toDollarString(meanPrice, decMult), "/ RATS"], " ")) | |
155 | + | let meanPrice = fractionRound(decMult, usdxFunds, ratsFunds) | |
156 | + | let meanReturn = (pow(meanPrice, 8, exponent, 8, decimals, HALFUP) - percent) | |
157 | + | throw(makeString(["GetMeanPrice () =>", "balance:", (toDollarString(fractionRound(usdxFunds, centMult, usdMult), centMult) + ";"), "mean price:", toDollarString(meanPrice, decMult), "/ RATS;", "mean return:", (toFloatString(meanReturn, (percent / 100)) + "% / 3Mo")], " ")) | |
154 | 158 | } | |
155 | 159 | ||
156 | 160 | ||
157 | 161 | ||
158 | 162 | @Callable(i) | |
159 | 163 | func DepositFunds () = { | |
160 | - | let userFunds = assetBalance(i.caller, fhfsAsset) | |
161 | - | let $t073477398 = getAttachment(i.payments, 0) | |
162 | - | let asset0 = $t073477398._1 | |
163 | - | let amount0 = $t073477398._2 | |
164 | - | let $t074017452 = getAttachment(i.payments, 1) | |
165 | - | let asset1 = $t074017452._1 | |
166 | - | let amount1 = $t074017452._2 | |
164 | + | let $t075047555 = getAttachment(i.payments, 0) | |
165 | + | let asset0 = $t075047555._1 | |
166 | + | let amount0 = $t075047555._2 | |
167 | + | let $t075587609 = getAttachment(i.payments, 1) | |
168 | + | let asset1 = $t075587609._1 | |
169 | + | let amount1 = $t075587609._2 | |
167 | 170 | let inAmount = (amount0 + amount1) | |
168 | 171 | let outAmount = fractionRound(inAmount, ratsFunds, usdxFunds) | |
169 | - | let grossFee = fractionRound(outAmount, feePerc, percent) | |
170 | - | let discount = fractionRound(grossFee, userFunds, fhfsFunds) | |
171 | - | let feeAmount = valueOrMinimum((grossFee - discount), 0) | |
172 | - | let netAmount = valueOrMinimum((outAmount - feeAmount), 0) | |
173 | 172 | if (if (if ((minAmount > inAmount)) | |
174 | 173 | then true | |
175 | 174 | else if ((amount0 > 0)) | |
176 | 175 | then !(containsElement(portfolio, asset0)) | |
177 | 176 | else false) | |
178 | 177 | then true | |
179 | 178 | else if ((amount1 > 0)) | |
180 | 179 | then !(containsElement(portfolio, asset1)) | |
181 | 180 | else false) | |
182 | 181 | then throw(makeString(["DepositFunds () =>", "Please attach Tether (USDT) and/or USD Coin (USDC) assets!", "Min. total:", toDollarString(fraction(minAmount, centMult, usdMult), centMult)], " ")) | |
183 | - | else ([ScriptTransfer( | |
182 | + | else ([ScriptTransfer(i.caller, outAmount, ratsAsset)] ++ adminTimestamp(i.callerPublicKey)) | |
184 | 183 | } | |
185 | 184 | ||
186 | 185 | ||
187 | 186 | ||
188 | 187 | @Callable(i) | |
189 | 188 | func WithdrawUSDT () = withdraw(i, usdtAsset) | |
190 | 189 | ||
191 | 190 | ||
192 | 191 | ||
193 | 192 | @Callable(i) | |
194 | 193 | func WithdrawUSDC () = withdraw(i, usdcAsset) | |
195 | 194 | ||
196 | 195 | ||
197 | 196 | ||
198 | 197 | @Callable(i) | |
199 | 198 | func AirdropWasher (id0,id1,id2,id3,id4,id5,id6,id7,id8,id9) = if ((size(i.payments) > 0)) | |
200 | 199 | then throw(makeString(["AirdropWasher (...) =>", "Don't attach payment when calling this function ..."], " ")) | |
201 | 200 | else if (if ((i.callerPublicKey != adminPublicKey)) | |
202 | 201 | then !(containsElement(guarantors, i.callerPublicKey)) | |
203 | 202 | else false) | |
204 | 203 | then throw(makeString(["AirdropWasher (...) =>", "This action can only be performed by an administrator!"], " ")) | |
205 | 204 | 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)) | |
206 | 205 | ||
207 | 206 | ||
208 | 207 | @Verifier(tx) | |
209 | 208 | func verify () = { | |
210 | 209 | let isValidOwner = sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
211 | 210 | let isValidAdmin = if (isValidOwner) | |
212 | 211 | then true | |
213 | 212 | else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], adminPublicKey) | |
214 | 213 | let isValidRobot = if (isValidOwner) | |
215 | 214 | then true | |
216 | 215 | else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], robotPublicKey) | |
217 | 216 | let isValidGuarantors = ((((if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], guarantors[0])) | |
218 | 217 | then 1 | |
219 | 218 | else 0) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[2], guarantors[1])) | |
220 | 219 | then 1 | |
221 | 220 | else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[3], guarantors[2])) | |
222 | 221 | then 1 | |
223 | 222 | else 0)) >= minSignatures) | |
224 | 223 | match tx { | |
225 | 224 | case _: LeaseCancelTransaction|LeaseTransaction => | |
226 | 225 | isValidOwner | |
227 | 226 | case b: BurnTransaction => | |
228 | 227 | if (if (isValidOwner) | |
229 | 228 | then !(containsElement(portfolio, b.assetId)) | |
230 | 229 | else false) | |
231 | 230 | then !(containsElement(ourAssets, b.assetId)) | |
232 | 231 | else false | |
233 | 232 | case o: Order => | |
234 | 233 | if (if (if (if (if (isValidRobot) | |
235 | 234 | then !(isDefined(o.matcherFeeAssetId)) | |
236 | 235 | else false) | |
237 | - | then (o.matcherPublicKey == | |
236 | + | then (o.matcherPublicKey == matcherPublicKey) | |
238 | 237 | else false) | |
239 | 238 | then if (if (if ((o.orderType == Buy)) | |
240 | 239 | then containsElement(portfolio, o.assetPair.amountAsset) | |
241 | 240 | else false) | |
242 | 241 | then true | |
243 | 242 | else if ((o.orderType == Sell)) | |
244 | 243 | then containsElement(portfolio, o.assetPair.priceAsset) | |
245 | 244 | else false) | |
246 | 245 | then true | |
247 | 246 | else if (!(containsElement(portfolio, o.assetPair.priceAsset))) | |
248 | 247 | then !(containsElement(portfolio, o.assetPair.amountAsset)) | |
249 | 248 | else false | |
250 | 249 | else false) | |
251 | 250 | then !(containsElement(ourAssets, o.assetPair.priceAsset)) | |
252 | 251 | else false) | |
253 | 252 | then !(containsElement(ourAssets, o.assetPair.amountAsset)) | |
254 | 253 | else false | |
255 | 254 | case t: MassTransferTransaction|TransferTransaction => | |
256 | 255 | if (if (if (isValidAdmin) | |
257 | 256 | then isValidGuarantors | |
258 | 257 | else false) | |
259 | 258 | then !(containsElement(portfolio, t.assetId)) | |
260 | 259 | else false) | |
261 | 260 | then !(containsElement(portfolio, t.feeAssetId)) | |
262 | 261 | else false | |
263 | 262 | case _: SetScriptTransaction|DataTransaction => | |
264 | 263 | if (isValidAdmin) | |
265 | 264 | then isValidGuarantors | |
266 | 265 | else false | |
267 | 266 | case _ => | |
268 | 267 | false | |
269 | 268 | } | |
270 | 269 | } | |
271 | 270 |
github/deemru/w8io/873ac7e 76.97 ms ◑![]()