tx · 7jYEjH4WPoykvhHoPhVw1RkRwAR7tZWw2U8YkoxENYeQ 3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA: -0.01400000 Waves 2020.12.26 20:53 [2389678] smart account 3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA > SELF 0.00000000 Waves
{ "type": 13, "id": "7jYEjH4WPoykvhHoPhVw1RkRwAR7tZWw2U8YkoxENYeQ", "fee": 1400000, "feeAssetId": null, "timestamp": 1609005220391, "version": 1, "sender": "3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA", "senderPublicKey": "5gGSWjBNTQGAMZViHK3qbn35JUNmbzqboicpdMuweapK", "proofs": [ "481Wrt8D5etHFq6Q5mYUc9QtzfiHfDNvg5Ld22abVRY525SbgLA8L1kwa5MAupnehT5pz3tWf8Pr4JiTnTBwyegZ", "5FJDucoayoxv3a2f4MDsctyXyuRH2bf9jb7S2kcutRKoTLq7CYzUFuGJLHbwk7xHSWrpVzc76xQiXuGhL2mBvkBB" ], "script": "base64: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ck5hdGl2ZSgxMDUwKQAAAAIFAAAABWZkYXBwAgAAAApoYWxmU3ByZWFkAAAAAAtpbnZlc3RtZW50cwkAAGUAAAACCQAAZQAAAAIICQEAAAAFdmFsdWUAAAABCQAD7AAAAAEFAAAACWZtbXRBc3NldAAAAAhxdWFudGl0eQkAAGQAAAACCQAD8AAAAAIFAAAABWZkYXBwBQAAAAlmbW10QXNzZXQJAAPwAAAAAgUAAAAFZmNvbGQFAAAACWZtbXRBc3NldAkAA/AAAAACBQAAAAVhZG1pbgUAAAAJZm1tdEFzc2V0AAAAAA9sb2dFbnRyeURhdGFLZXkCAAAACGxvZ0VudHJ5AAAAABB0aW1lc3RhbXBEYXRhS2V5AgAAAAl0aW1lc3RhbXAAAAAADHRmZWVzRGF0YUtleQIAAAALdGVhbVBheW91dHMAAAAADXN0YXR1c0RhdGFLZXkCAAAAC3RyYWRlU3RhdHVzAAAAAA52ZXJzaW9uRGF0YUtleQIAAAANc2NyaXB0VmVyc2lvbgEAAAAIdmFsaWRhdGUAAAACAAAACGludFZhbHVlAAAACG1pblZhbHVlAwkAAGYAAAACBQAAAAhtaW5WYWx1ZQUAAAAIaW50VmFsdWUAAAAAAAAAAAAFAAAACGludFZhbHVlAQAAAA52YWx1ZU9yTWluaW11bQAAAAIAAAAIaW50VmFsdWUAAAAIbWluVmFsdWUDCQAAZgAAAAIFAAAACG1pblZhbHVlBQAAAAhpbnRWYWx1ZQUAAAAIbWluVmFsdWUFAAAACGludFZhbHVlAQAAAA52YWx1ZU9yTWF4aW11bQAAAAIAAAAIaW50VmFsdWUAAAAIbWF4VmFsdWUDCQAAZgAAAAIFAAAACGludFZhbHVlBQAAAAhtYXhWYWx1ZQUAAAAIbWF4VmFsdWUFAAAACGludFZhbHVlAQAAAA9pc0Fzc2V0RGlzYWJsZWQAAAABAAAAB2Fzc2V0SWQJAQAAAAEhAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTEpAAAAAgUAAAAFYWRtaW4JAAJYAAAAAQUAAAAHYXNzZXRJZAEAAAAPYW55QmFua2luZ0Fzc2V0AAAAAgAAAAZiYXNlSWQAAAAHcXVvdGVJZAMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAdtYXJrZXRz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Z2VyRW50cnkAAAACBQAAAAx0ZmVlc0RhdGFLZXkFAAAACm5ld1BheW91dHMJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAPbG9nRW50cnlEYXRhS2V5BQAAABFsb2dFbnRyeURhdGFWYWx1ZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAQdGltZXN0YW1wRGF0YUtleQgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAFAAAAA25pbAAAAAFpAQAAAAtmZWVFeGNoYW5nZQAAAAAEAAAACyR0MDg2NjE4NzExCQEAAAANZ2V0QXR0YWNobWVudAAAAAEIBQAAAAFpAAAACHBheW1lbnRzBAAAAAdhc3NldElkCAUAAAALJHQwODY2MTg3MTEAAAACXzEEAAAAB2RlcG9zaXQIBQAAAAskdDA4NjYxODcxMQAAAAJfMgQAAAAJb2xkUHJvZml0CQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAVhZG1pbgUAAAANcHJvZml0RGF0YUtleQQAAAAJbWF4QW1vdW50CQAAawAAAAMFAAAACW9sZFByb2ZpdAUAAAAHZGVjaW1hbAUAAAAJZm1tdFByaWNlAwMJAQAAAAIhPQAAAAIIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQUAAAAOYWRtaW5QdWJsaWNLZXkJAQAAAAIhPQAAAAIIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQUAAAAObW1ib3RQdWJsaWNLZXkHCQAAAgAAAAECAAAANlRoaXMgYWN0aW9uIGNhbiBvbmx5IGJlIHBlcmZvcm1lZCBieSBhbiBhZG1pbmlzdHJhdG9yIQMJAAAAAAAAAgUAAAAHYXNzZXRJZAUAAAAJZm1tdEFzc2V0BAAAAAh1c2R0TXVsdAkAAZEAAAACBQAAAAphc3NldE11bHRzCQEAAAAFdmFsdWUAAAABCQAETwAAAAIFAAAACXBvcnRmb2xpbwUAAAAJdXNkdEFzc2V0BAAAAAl1c2R0RnVuZHMJAABpAAAAAgkAAGsAAAADBQAAAAtpbnZlc3RtZW50cwUAAAAJZm1tdFByaWNlBQAAAAdkZWNpbWFsBQAAAAh1c2R0TXVsdAQAAAAKdXNkdEZhY3RvcgkAAGsAAAAD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", "chainId": 87, "height": 2389678, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5g8uVUu6vdEQxyiqgRACyw3Zx6yVVEkuy9iLXxcRxNAZ Next: H3TA8KtNGa5P6zGyjD7AQ1fGmfPv4oc4e3beeUZNXyUS Diff:
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let scriptVersion = "8. | |
4 | + | let scriptVersion = "8.01_20201226" | |
5 | 5 | ||
6 | 6 | let percent = 100000 | |
7 | 7 | ||
11 | 11 | ||
12 | 12 | let fdappPercent = 30000 | |
13 | 13 | ||
14 | - | let | |
14 | + | let fmmtDecimal = 100000 | |
15 | 15 | ||
16 | - | let | |
16 | + | let usdtDecimal = 1000000 | |
17 | 17 | ||
18 | - | let fmmtSharePrice = fraction((10 * usdtDecimals), decimal, fmmtDecimals) | |
18 | + | let sTxFee = 500000 | |
19 | + | ||
20 | + | let fmmtPrice = fraction((10 * usdtDecimal), decimal, fmmtDecimal) | |
19 | 21 | ||
20 | 22 | let wavesMatcher = base58'9cpfKN9suPNvfeUNphzxXMjcnn974eme8ZhWUjaktzU5' | |
21 | 23 | ||
41 | 43 | ||
42 | 44 | let ourAssets = [fmmtAsset, xfeeAsset] | |
43 | 45 | ||
44 | - | let assetMults = [14, 2, 14, 14, 14, 14, 14, 14 | |
46 | + | let assetMults = [14, 2, 14, 14, 14, 14, 14, 14] | |
45 | 47 | ||
46 | 48 | let assetTickers = ["USDT", "BTC", "ETH", "BCH", "LTC", "DASH", "XMR", "ZEC"] | |
47 | 49 | ||
48 | - | let assetDecimals = [ | |
50 | + | let assetDecimals = [usdtDecimal, decimal, decimal, decimal, decimal, decimal, decimal, decimal] | |
49 | 51 | ||
50 | 52 | let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x') | |
51 | 53 | ||
56 | 58 | let supplyDataKey = "7sqT7HvCVtcrCTQV72FM5so65wjzM164rzoqDZRsRXg7_supply" | |
57 | 59 | ||
58 | 60 | let profitDataKey = "34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ_profit" | |
61 | + | ||
62 | + | let testMode = getBooleanValue(fdapp, "testMode") | |
59 | 63 | ||
60 | 64 | let tradeSupply = getIntegerValue(admin, supplyDataKey) | |
61 | 65 | ||
103 | 107 | else (baseId == quoteId) | |
104 | 108 | ||
105 | 109 | ||
106 | - | func assetIndex (ticker) = valueOrErrorMessage(indexOf(assetTickers, ticker), makeString( | |
110 | + | func assetIndex (ticker) = valueOrErrorMessage(indexOf(assetTickers, ticker), ("Supported assets: " + makeString(assetTickers, ", "))) | |
107 | 111 | ||
108 | 112 | ||
109 | 113 | func assetFunds (assetId) = ((assetBalance(fdapp, assetId) + assetBalance(fcold, assetId)) - (if ((assetId == usdtAsset)) | |
155 | 159 | let newPayouts = fraction(investments, tfeePercent, (percent - tfeePercent)) | |
156 | 160 | let oldPayouts = getIntegerValue(fcold, tfeesDataKey) | |
157 | 161 | let outAmount = validate((newPayouts - oldPayouts), 0) | |
158 | - | let logEntryDataValue = makeString(["DeFi Franklin (FMMT): getTeamFee () =>", "amount:", toFloatString(outAmount, | |
162 | + | let logEntryDataValue = makeString(["DeFi Franklin (FMMT): getTeamFee () =>", "amount:", toFloatString(outAmount, fmmtDecimal), "FMMT"], " ") | |
159 | 163 | if ((0 >= outAmount)) | |
160 | 164 | then throw("There are currently no payments available.") | |
161 | 165 | else [ScriptTransfer(admin, outAmount, fmmtAsset), IntegerEntry(tfeesDataKey, newPayouts), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)] | |
165 | 169 | ||
166 | 170 | @Callable(i) | |
167 | 171 | func feeExchange () = { | |
168 | - | let $ | |
169 | - | let assetId = $ | |
170 | - | let deposit = $ | |
172 | + | let $t086618711 = getAttachment(i.payments) | |
173 | + | let assetId = $t086618711._1 | |
174 | + | let deposit = $t086618711._2 | |
171 | 175 | let oldProfit = getIntegerValue(admin, profitDataKey) | |
172 | - | let maxAmount = fraction(oldProfit, decimal, | |
176 | + | let maxAmount = fraction(oldProfit, decimal, fmmtPrice) | |
173 | 177 | if (if ((i.callerPublicKey != adminPublicKey)) | |
174 | 178 | then (i.callerPublicKey != mmbotPublicKey) | |
175 | 179 | else false) | |
177 | 181 | else if ((assetId == fmmtAsset)) | |
178 | 182 | then { | |
179 | 183 | let usdtMult = assetMults[value(indexOf(portfolio, usdtAsset))] | |
180 | - | let usdtFunds = (fraction(investments, | |
184 | + | let usdtFunds = (fraction(investments, fmmtPrice, decimal) / usdtMult) | |
181 | 185 | let usdtFactor = fraction(usdtFunds, spreadPercent, percent) | |
182 | - | let fmmtFactor = fraction(usdtFactor, decimal, | |
186 | + | let fmmtFactor = fraction(usdtFactor, decimal, fmmtPrice) | |
183 | 187 | let inAmount = ((valueOrMaximum(deposit, maxAmount) / fmmtFactor) * fmmtFactor) | |
184 | 188 | let refundAmount = validate((deposit - inAmount), 0) | |
185 | - | let outAmount = fraction(inAmount, | |
189 | + | let outAmount = fraction(inAmount, usdtFactor, fmmtFactor) | |
186 | 190 | let profitMult = ((oldProfit / usdtFactor) - (inAmount / fmmtFactor)) | |
187 | - | let logEntryDataValue = makeString(["DeFi Franklin (FMMT): feeExchange", "(deposit:", toFloatString(inAmount, | |
191 | + | let logEntryDataValue = makeString(["DeFi Franklin (FMMT): feeExchange", "(deposit:", toFloatString(inAmount, fmmtDecimal), "FMMT) =>", "out amount:", toFloatString(outAmount, usdtDecimal), "USDT", "new profit:", toString(profitMult), "×", toFloatString(usdtFactor, usdtDecimal), "USDT", "=", toFloatString((profitMult * usdtFactor), usdtDecimal), "USDT"], " ") | |
188 | 192 | if ((0 >= outAmount)) | |
189 | 193 | then throw(logEntryDataValue) | |
190 | 194 | else [ScriptTransfer(admin, outAmount, usdtAsset), ((getScriptTransfer(admin, refundAmount, fmmtAsset) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))] | |
191 | 195 | } | |
192 | - | else throw(makeString(["Please attach the FMMT payment (max amount:", toFloatString(maxAmount, | |
196 | + | else throw(makeString(["Please attach the FMMT payment (max amount:", toFloatString(maxAmount, fmmtDecimal), "FMMT)."], " ")) | |
193 | 197 | } | |
194 | 198 | ||
195 | 199 | ||
204 | 208 | else if ((size(i.payments) > 0)) | |
205 | 209 | then throw("Don't attach payment when calling this function ...") | |
206 | 210 | else { | |
207 | - | let fmmtAmount = if (isAssetDisabled(fmmtAsset)) | |
208 | - | then 0 | |
209 | - | else (tradeSupply - assetBalance(fdapp, fmmtAsset)) | |
210 | - | let xfeeAmount = valueOrMaximum(500000, assetBalance(this, xfeeAsset)) | |
211 | + | let fmmtAmount = (tradeSupply - assetBalance(fdapp, fmmtAsset)) | |
212 | + | let xfeeAmount = valueOrMaximum(sTxFee, assetBalance(this, xfeeAsset)) | |
211 | 213 | let recipient = fdapp | |
212 | 214 | let scriptTransfers = (((((((getScriptTransfer(recipient, rebalancingAmount(portfolio[0]), portfolio[0]) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[1]), portfolio[1])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[2]), portfolio[2])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[3]), portfolio[3])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[4]), portfolio[4])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[5]), portfolio[5])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[6]), portfolio[6])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[7]), portfolio[7])) | |
213 | 215 | let logEntryDataValue = ("DeFi Franklin (FMMT): autoRebalance () => tx: " + toBase58String(i.transactionId)) |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 4 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | - | let scriptVersion = "8. | |
4 | + | let scriptVersion = "8.01_20201226" | |
5 | 5 | ||
6 | 6 | let percent = 100000 | |
7 | 7 | ||
8 | 8 | let decimal = 100000000 | |
9 | 9 | ||
10 | 10 | let tfeePercent = 10000 | |
11 | 11 | ||
12 | 12 | let fdappPercent = 30000 | |
13 | 13 | ||
14 | - | let | |
14 | + | let fmmtDecimal = 100000 | |
15 | 15 | ||
16 | - | let | |
16 | + | let usdtDecimal = 1000000 | |
17 | 17 | ||
18 | - | let fmmtSharePrice = fraction((10 * usdtDecimals), decimal, fmmtDecimals) | |
18 | + | let sTxFee = 500000 | |
19 | + | ||
20 | + | let fmmtPrice = fraction((10 * usdtDecimal), decimal, fmmtDecimal) | |
19 | 21 | ||
20 | 22 | let wavesMatcher = base58'9cpfKN9suPNvfeUNphzxXMjcnn974eme8ZhWUjaktzU5' | |
21 | 23 | ||
22 | 24 | let adminPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k' | |
23 | 25 | ||
24 | 26 | let mmbotPublicKey = base58'62KBavoHK4TtCYmURFVeNC8j3gL8Jo7WwcrweoBLWofc' | |
25 | 27 | ||
26 | 28 | let guarantors = ([valueOrElse(getBinary(this, "guarantor1"), base58''), valueOrElse(getBinary(this, "guarantor2"), base58''), valueOrElse(getBinary(this, "guarantor3"), base58''), valueOrElse(getBinary(this, "guarantor4"), base58''), valueOrElse(getBinary(this, "guarantor5"), base58'')] :+ base58'') | |
27 | 29 | ||
28 | 30 | let actualSize = value(indexOf(guarantors, base58'')) | |
29 | 31 | ||
30 | 32 | let minSignatures = ((actualSize / 2) + (actualSize % 2)) | |
31 | 33 | ||
32 | 34 | let fmmtAsset = base58'7sqT7HvCVtcrCTQV72FM5so65wjzM164rzoqDZRsRXg7' | |
33 | 35 | ||
34 | 36 | let usdtAsset = base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ' | |
35 | 37 | ||
36 | 38 | let xfeeAsset = base58'5EMfVQiB8NF4HuhaXrZzDM637whWuVBsduq59ZaCSNqk' | |
37 | 39 | ||
38 | 40 | let markets = [base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS', base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ'] | |
39 | 41 | ||
40 | 42 | let portfolio = [base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ', base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS', base58'474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu', base58'zMFqXuoyrn5w17PFurTqxB7GsS71fp9dfk6XFwxbPCy', base58'HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk', base58'B3uGHFRpSUuGEDWjqB9LWWxafQj8VTvpMucEyoxzws5H', base58'5WvPKSJXzVE2orvbkJ8wsQmmQKqTv9sGBPksV4adViw3', base58'BrjUWjndUanm5VsJkbUip8VRYy6LWJePtxya3FNv4TQa'] | |
41 | 43 | ||
42 | 44 | let ourAssets = [fmmtAsset, xfeeAsset] | |
43 | 45 | ||
44 | - | let assetMults = [14, 2, 14, 14, 14, 14, 14, 14 | |
46 | + | let assetMults = [14, 2, 14, 14, 14, 14, 14, 14] | |
45 | 47 | ||
46 | 48 | let assetTickers = ["USDT", "BTC", "ETH", "BCH", "LTC", "DASH", "XMR", "ZEC"] | |
47 | 49 | ||
48 | - | let assetDecimals = [ | |
50 | + | let assetDecimals = [usdtDecimal, decimal, decimal, decimal, decimal, decimal, decimal, decimal] | |
49 | 51 | ||
50 | 52 | let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x') | |
51 | 53 | ||
52 | 54 | let fdapp = Address(base58'3PEPsNg7aSWSSgdC6XweyJkvDXmwVoWeNHL') | |
53 | 55 | ||
54 | 56 | let fcold = Address(base58'3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA') | |
55 | 57 | ||
56 | 58 | let supplyDataKey = "7sqT7HvCVtcrCTQV72FM5so65wjzM164rzoqDZRsRXg7_supply" | |
57 | 59 | ||
58 | 60 | let profitDataKey = "34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ_profit" | |
61 | + | ||
62 | + | let testMode = getBooleanValue(fdapp, "testMode") | |
59 | 63 | ||
60 | 64 | let tradeSupply = getIntegerValue(admin, supplyDataKey) | |
61 | 65 | ||
62 | 66 | let spreadPercent = getIntegerValue(fdapp, "halfSpread") | |
63 | 67 | ||
64 | 68 | let investments = ((value(assetInfo(fmmtAsset)).quantity - (assetBalance(fdapp, fmmtAsset) + assetBalance(fcold, fmmtAsset))) - assetBalance(admin, fmmtAsset)) | |
65 | 69 | ||
66 | 70 | let logEntryDataKey = "logEntry" | |
67 | 71 | ||
68 | 72 | let timestampDataKey = "timestamp" | |
69 | 73 | ||
70 | 74 | let tfeesDataKey = "teamPayouts" | |
71 | 75 | ||
72 | 76 | let statusDataKey = "tradeStatus" | |
73 | 77 | ||
74 | 78 | let versionDataKey = "scriptVersion" | |
75 | 79 | ||
76 | 80 | func validate (intValue,minValue) = if ((minValue > intValue)) | |
77 | 81 | then 0 | |
78 | 82 | else intValue | |
79 | 83 | ||
80 | 84 | ||
81 | 85 | func valueOrMinimum (intValue,minValue) = if ((minValue > intValue)) | |
82 | 86 | then minValue | |
83 | 87 | else intValue | |
84 | 88 | ||
85 | 89 | ||
86 | 90 | func valueOrMaximum (intValue,maxValue) = if ((intValue > maxValue)) | |
87 | 91 | then maxValue | |
88 | 92 | else intValue | |
89 | 93 | ||
90 | 94 | ||
91 | 95 | func isAssetDisabled (assetId) = !(getBooleanValue(admin, toBase58String(assetId))) | |
92 | 96 | ||
93 | 97 | ||
94 | 98 | func anyBankingAsset (baseId,quoteId) = if (containsElement(markets, baseId)) | |
95 | 99 | then true | |
96 | 100 | else containsElement(markets, quoteId) | |
97 | 101 | ||
98 | 102 | ||
99 | 103 | func isMarketDisabled (baseId,quoteId) = if (if (isAssetDisabled(baseId)) | |
100 | 104 | then true | |
101 | 105 | else isAssetDisabled(quoteId)) | |
102 | 106 | then true | |
103 | 107 | else (baseId == quoteId) | |
104 | 108 | ||
105 | 109 | ||
106 | - | func assetIndex (ticker) = valueOrErrorMessage(indexOf(assetTickers, ticker), makeString( | |
110 | + | func assetIndex (ticker) = valueOrErrorMessage(indexOf(assetTickers, ticker), ("Supported assets: " + makeString(assetTickers, ", "))) | |
107 | 111 | ||
108 | 112 | ||
109 | 113 | func assetFunds (assetId) = ((assetBalance(fdapp, assetId) + assetBalance(fcold, assetId)) - (if ((assetId == usdtAsset)) | |
110 | 114 | then getIntegerValue(admin, profitDataKey) | |
111 | 115 | else 0)) | |
112 | 116 | ||
113 | 117 | ||
114 | 118 | func getAttachment (payments) = if ((size(payments) != 1)) | |
115 | 119 | then $Tuple2(base58'', 0) | |
116 | 120 | else $Tuple2(payments[0].assetId, payments[0].amount) | |
117 | 121 | ||
118 | 122 | ||
119 | 123 | func getScriptTransfer (address,amount,assetId) = if ((0 >= amount)) | |
120 | 124 | then nil | |
121 | 125 | else [ScriptTransfer(address, amount, assetId)] | |
122 | 126 | ||
123 | 127 | ||
124 | 128 | func rebalancingAmount (assetId) = if (isAssetDisabled(assetId)) | |
125 | 129 | then 0 | |
126 | 130 | else { | |
127 | 131 | let fdappFunds = assetBalance(fdapp, assetId) | |
128 | 132 | let totalFunds = (fdappFunds + assetBalance(fcold, assetId)) | |
129 | 133 | validate((fraction(totalFunds, fdappPercent, percent) - fdappFunds), (totalFunds / 100)) | |
130 | 134 | } | |
131 | 135 | ||
132 | 136 | ||
133 | 137 | func airdropBalance (assetId) = if (containsElement((ourAssets ++ portfolio), assetId)) | |
134 | 138 | then throw(("Delete asset ID: " + toBase58String(assetId))) | |
135 | 139 | else if ((assetId == base58'')) | |
136 | 140 | then 0 | |
137 | 141 | else assetBalance(this, assetId) | |
138 | 142 | ||
139 | 143 | ||
140 | 144 | func toFloatString (num,dec) = if ((num == 0)) | |
141 | 145 | then "0" | |
142 | 146 | else if ((num > 0)) | |
143 | 147 | then toUtf8String(((toBytes(toString((num / dec))) + base58'o') + drop(toBytes(toString(((num % dec) + dec))), 1))) | |
144 | 148 | else throw("Negative amounts are not allowed!") | |
145 | 149 | ||
146 | 150 | ||
147 | 151 | @Callable(i) | |
148 | 152 | func getTeamFee () = if (if ((i.callerPublicKey != adminPublicKey)) | |
149 | 153 | then (i.callerPublicKey != mmbotPublicKey) | |
150 | 154 | else false) | |
151 | 155 | then throw("This action can only be performed by an administrator!") | |
152 | 156 | else if ((size(i.payments) > 0)) | |
153 | 157 | then throw("Don't attach payment when calling this function ...") | |
154 | 158 | else { | |
155 | 159 | let newPayouts = fraction(investments, tfeePercent, (percent - tfeePercent)) | |
156 | 160 | let oldPayouts = getIntegerValue(fcold, tfeesDataKey) | |
157 | 161 | let outAmount = validate((newPayouts - oldPayouts), 0) | |
158 | - | let logEntryDataValue = makeString(["DeFi Franklin (FMMT): getTeamFee () =>", "amount:", toFloatString(outAmount, | |
162 | + | let logEntryDataValue = makeString(["DeFi Franklin (FMMT): getTeamFee () =>", "amount:", toFloatString(outAmount, fmmtDecimal), "FMMT"], " ") | |
159 | 163 | if ((0 >= outAmount)) | |
160 | 164 | then throw("There are currently no payments available.") | |
161 | 165 | else [ScriptTransfer(admin, outAmount, fmmtAsset), IntegerEntry(tfeesDataKey, newPayouts), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)] | |
162 | 166 | } | |
163 | 167 | ||
164 | 168 | ||
165 | 169 | ||
166 | 170 | @Callable(i) | |
167 | 171 | func feeExchange () = { | |
168 | - | let $ | |
169 | - | let assetId = $ | |
170 | - | let deposit = $ | |
172 | + | let $t086618711 = getAttachment(i.payments) | |
173 | + | let assetId = $t086618711._1 | |
174 | + | let deposit = $t086618711._2 | |
171 | 175 | let oldProfit = getIntegerValue(admin, profitDataKey) | |
172 | - | let maxAmount = fraction(oldProfit, decimal, | |
176 | + | let maxAmount = fraction(oldProfit, decimal, fmmtPrice) | |
173 | 177 | if (if ((i.callerPublicKey != adminPublicKey)) | |
174 | 178 | then (i.callerPublicKey != mmbotPublicKey) | |
175 | 179 | else false) | |
176 | 180 | then throw("This action can only be performed by an administrator!") | |
177 | 181 | else if ((assetId == fmmtAsset)) | |
178 | 182 | then { | |
179 | 183 | let usdtMult = assetMults[value(indexOf(portfolio, usdtAsset))] | |
180 | - | let usdtFunds = (fraction(investments, | |
184 | + | let usdtFunds = (fraction(investments, fmmtPrice, decimal) / usdtMult) | |
181 | 185 | let usdtFactor = fraction(usdtFunds, spreadPercent, percent) | |
182 | - | let fmmtFactor = fraction(usdtFactor, decimal, | |
186 | + | let fmmtFactor = fraction(usdtFactor, decimal, fmmtPrice) | |
183 | 187 | let inAmount = ((valueOrMaximum(deposit, maxAmount) / fmmtFactor) * fmmtFactor) | |
184 | 188 | let refundAmount = validate((deposit - inAmount), 0) | |
185 | - | let outAmount = fraction(inAmount, | |
189 | + | let outAmount = fraction(inAmount, usdtFactor, fmmtFactor) | |
186 | 190 | let profitMult = ((oldProfit / usdtFactor) - (inAmount / fmmtFactor)) | |
187 | - | let logEntryDataValue = makeString(["DeFi Franklin (FMMT): feeExchange", "(deposit:", toFloatString(inAmount, | |
191 | + | let logEntryDataValue = makeString(["DeFi Franklin (FMMT): feeExchange", "(deposit:", toFloatString(inAmount, fmmtDecimal), "FMMT) =>", "out amount:", toFloatString(outAmount, usdtDecimal), "USDT", "new profit:", toString(profitMult), "×", toFloatString(usdtFactor, usdtDecimal), "USDT", "=", toFloatString((profitMult * usdtFactor), usdtDecimal), "USDT"], " ") | |
188 | 192 | if ((0 >= outAmount)) | |
189 | 193 | then throw(logEntryDataValue) | |
190 | 194 | else [ScriptTransfer(admin, outAmount, usdtAsset), ((getScriptTransfer(admin, refundAmount, fmmtAsset) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))] | |
191 | 195 | } | |
192 | - | else throw(makeString(["Please attach the FMMT payment (max amount:", toFloatString(maxAmount, | |
196 | + | else throw(makeString(["Please attach the FMMT payment (max amount:", toFloatString(maxAmount, fmmtDecimal), "FMMT)."], " ")) | |
193 | 197 | } | |
194 | 198 | ||
195 | 199 | ||
196 | 200 | ||
197 | 201 | @Callable(i) | |
198 | 202 | func autoRebalance () = if (if (if ((i.callerPublicKey != adminPublicKey)) | |
199 | 203 | then (i.callerPublicKey != mmbotPublicKey) | |
200 | 204 | else false) | |
201 | 205 | then !(containsElement(guarantors, i.callerPublicKey)) | |
202 | 206 | else false) | |
203 | 207 | then throw("This action can only be performed by an administrator or guarantor!") | |
204 | 208 | else if ((size(i.payments) > 0)) | |
205 | 209 | then throw("Don't attach payment when calling this function ...") | |
206 | 210 | else { | |
207 | - | let fmmtAmount = if (isAssetDisabled(fmmtAsset)) | |
208 | - | then 0 | |
209 | - | else (tradeSupply - assetBalance(fdapp, fmmtAsset)) | |
210 | - | let xfeeAmount = valueOrMaximum(500000, assetBalance(this, xfeeAsset)) | |
211 | + | let fmmtAmount = (tradeSupply - assetBalance(fdapp, fmmtAsset)) | |
212 | + | let xfeeAmount = valueOrMaximum(sTxFee, assetBalance(this, xfeeAsset)) | |
211 | 213 | let recipient = fdapp | |
212 | 214 | let scriptTransfers = (((((((getScriptTransfer(recipient, rebalancingAmount(portfolio[0]), portfolio[0]) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[1]), portfolio[1])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[2]), portfolio[2])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[3]), portfolio[3])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[4]), portfolio[4])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[5]), portfolio[5])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[6]), portfolio[6])) ++ getScriptTransfer(recipient, rebalancingAmount(portfolio[7]), portfolio[7])) | |
213 | 215 | let logEntryDataValue = ("DeFi Franklin (FMMT): autoRebalance () => tx: " + toBase58String(i.transactionId)) | |
214 | 216 | if ((size(scriptTransfers) == 0)) | |
215 | 217 | then throw("There are currently no transfers available.") | |
216 | 218 | else ((((scriptTransfers ++ getScriptTransfer(recipient, fmmtAmount, fmmtAsset)) ++ getScriptTransfer(i.caller, xfeeAmount, xfeeAsset)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp)) | |
217 | 219 | } | |
218 | 220 | ||
219 | 221 | ||
220 | 222 | ||
221 | 223 | @Callable(i) | |
222 | 224 | func setScriptVersion () = if ((i.callerPublicKey != adminPublicKey)) | |
223 | 225 | then throw("This action can only be performed by an administrator!") | |
224 | 226 | else if ((size(i.payments) > 0)) | |
225 | 227 | then throw("Don't attach payment when calling this function ...") | |
226 | 228 | else { | |
227 | 229 | let newVersion = scriptVersion | |
228 | 230 | let oldVersion = getStringValue(this, versionDataKey) | |
229 | 231 | let version = split(newVersion, "_") | |
230 | 232 | let logEntryDataValue = makeString(["DeFi Franklin (FMMT): setScriptVersion () =>", "version:", (version[0] + ";"), "updated:", makeString([take(version[1], 4), take(drop(version[1], 4), 2), drop(version[1], 6)], "-")], " ") | |
231 | 233 | if ((newVersion == oldVersion)) | |
232 | 234 | then throw(("The script version has already been updated. Version: " + oldVersion)) | |
233 | 235 | else [StringEntry(versionDataKey, newVersion), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)] | |
234 | 236 | } | |
235 | 237 | ||
236 | 238 | ||
237 | 239 | ||
238 | 240 | @Callable(i) | |
239 | 241 | func airdropWasher (id0,id1,id2,id3,id4,id5,id6,id7,id8,id9) = if ((i.callerPublicKey != adminPublicKey)) | |
240 | 242 | then throw("This action can only be performed by an administrator!") | |
241 | 243 | else if ((size(i.payments) > 0)) | |
242 | 244 | then throw("Don't attach payment when calling this function ...") | |
243 | 245 | else { | |
244 | 246 | let scriptTransfers = (((((((((getScriptTransfer(admin, airdropBalance(id0), id0) ++ getScriptTransfer(admin, airdropBalance(id1), id1)) ++ getScriptTransfer(admin, airdropBalance(id2), id2)) ++ getScriptTransfer(admin, airdropBalance(id3), id3)) ++ getScriptTransfer(admin, airdropBalance(id4), id4)) ++ getScriptTransfer(admin, airdropBalance(id5), id5)) ++ getScriptTransfer(admin, airdropBalance(id6), id6)) ++ getScriptTransfer(admin, airdropBalance(id7), id7)) ++ getScriptTransfer(admin, airdropBalance(id8), id8)) ++ getScriptTransfer(admin, airdropBalance(id9), id9)) | |
245 | 247 | let logEntryDataValue = ("DeFi Franklin (FMMT): airdropWasher () => tx: " + toBase58String(i.transactionId)) | |
246 | 248 | if ((size(scriptTransfers) == 0)) | |
247 | 249 | then throw("There are currently no transfers available.") | |
248 | 250 | else ((scriptTransfers :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp)) | |
249 | 251 | } | |
250 | 252 | ||
251 | 253 | ||
252 | 254 | @Verifier(tx) | |
253 | 255 | func verify () = { | |
254 | 256 | let isValidOwner = sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey) | |
255 | 257 | let isValidMMBot = if (isValidOwner) | |
256 | 258 | then true | |
257 | 259 | else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], mmbotPublicKey) | |
258 | 260 | let isValidAdmin = if (isValidOwner) | |
259 | 261 | then true | |
260 | 262 | else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], adminPublicKey) | |
261 | 263 | let isValidGuarantors = ((((((if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], guarantors[0])) | |
262 | 264 | then 1 | |
263 | 265 | else 0) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[2], guarantors[1])) | |
264 | 266 | then 1 | |
265 | 267 | else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[3], guarantors[2])) | |
266 | 268 | then 1 | |
267 | 269 | else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[4], guarantors[3])) | |
268 | 270 | then 1 | |
269 | 271 | else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[5], guarantors[4])) | |
270 | 272 | then 1 | |
271 | 273 | else 0)) >= minSignatures) | |
272 | 274 | let maxAmount = validate((tradeSupply - assetBalance(fdapp, fmmtAsset)), 0) | |
273 | 275 | match tx { | |
274 | 276 | case b: BurnTransaction => | |
275 | 277 | if (if (isValidOwner) | |
276 | 278 | then !(containsElement(ourAssets, b.assetId)) | |
277 | 279 | else false) | |
278 | 280 | then !(containsElement(portfolio, b.assetId)) | |
279 | 281 | else false | |
280 | 282 | case l: LeaseCancelTransaction|LeaseTransaction => | |
281 | 283 | isValidOwner | |
282 | 284 | case o: Order => | |
283 | 285 | if (if (if (if (if (isValidMMBot) | |
284 | 286 | then (o.matcherPublicKey == wavesMatcher) | |
285 | 287 | else false) | |
286 | 288 | then !(containsElement(ourAssets, o.assetPair.priceAsset)) | |
287 | 289 | else false) | |
288 | 290 | then !(containsElement(ourAssets, o.assetPair.amountAsset)) | |
289 | 291 | else false) | |
290 | 292 | then if (if (if ((o.orderType == Buy)) | |
291 | 293 | then !(containsElement(portfolio, o.assetPair.priceAsset)) | |
292 | 294 | else false) | |
293 | 295 | then true | |
294 | 296 | else if ((o.orderType == Sell)) | |
295 | 297 | then !(containsElement(portfolio, o.assetPair.amountAsset)) | |
296 | 298 | else false) | |
297 | 299 | then true | |
298 | 300 | else if (!(containsElement(portfolio, o.assetPair.priceAsset))) | |
299 | 301 | then !(containsElement(portfolio, o.assetPair.amountAsset)) | |
300 | 302 | else false | |
301 | 303 | else false) | |
302 | 304 | then if (!(isDefined(o.matcherFeeAssetId))) | |
303 | 305 | then true | |
304 | 306 | else (o.matcherFeeAssetId == o.assetPair.priceAsset) | |
305 | 307 | else false | |
306 | 308 | case t: TransferTransaction => | |
307 | 309 | if (if (if (if (isValidOwner) | |
308 | 310 | then (t.assetId != fmmtAsset) | |
309 | 311 | else false) | |
310 | 312 | then !(containsElement(portfolio, t.assetId)) | |
311 | 313 | else false) | |
312 | 314 | then !(containsElement(portfolio, t.feeAssetId)) | |
313 | 315 | else false) | |
314 | 316 | then true | |
315 | 317 | else if (if (if (isValidAdmin) | |
316 | 318 | then true | |
317 | 319 | else isValidGuarantors) | |
318 | 320 | then (addressFromRecipient(t.recipient) == fdapp) | |
319 | 321 | else false) | |
320 | 322 | then if ((t.assetId != fmmtAsset)) | |
321 | 323 | then true | |
322 | 324 | else (maxAmount >= t.amount) | |
323 | 325 | else false | |
324 | 326 | case m: MassTransferTransaction => | |
325 | 327 | if (if (isValidAdmin) | |
326 | 328 | then isValidGuarantors | |
327 | 329 | else false) | |
328 | 330 | then if ((m.assetId == usdtAsset)) | |
329 | 331 | then true | |
330 | 332 | else if ((m.assetId != fmmtAsset)) | |
331 | 333 | then !(containsElement(portfolio, m.assetId)) | |
332 | 334 | else false | |
333 | 335 | else false | |
334 | 336 | case _: SetScriptTransaction|DataTransaction => | |
335 | 337 | if (isValidAdmin) | |
336 | 338 | then isValidGuarantors | |
337 | 339 | else false | |
338 | 340 | case _ => | |
339 | 341 | false | |
340 | 342 | } | |
341 | 343 | } | |
342 | 344 |
github/deemru/w8io/3ef1775 73.51 ms ◑