tx · H3TA8KtNGa5P6zGyjD7AQ1fGmfPv4oc4e3beeUZNXyUS

3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA:  -0.01400000 Waves

2021.01.05 16:03 [2403919] smart account 3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA > SELF 0.00000000 Waves

{ "type": 13, "id": "H3TA8KtNGa5P6zGyjD7AQ1fGmfPv4oc4e3beeUZNXyUS", "fee": 1400000, "feeAssetId": null, "timestamp": 1609851685812, "version": 1, "sender": "3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA", "senderPublicKey": "5gGSWjBNTQGAMZViHK3qbn35JUNmbzqboicpdMuweapK", "proofs": [ "4VnLFQ54vsnafCMeimmRo6WimJWAGM9o7aqHCszGDq8agyQoBNDUgDZonsdnSKdRG4LggbriqWje91z9aoscsJC", "46r9TPwCQqmUmHXUFFg5Mc6GhZuMWqaScgwrWbgKBWbDVPS4wE6xYW3EDBG9SxF92eRCvUZET9XRCqpPw59eGFkk" ], "script": "base64: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AAAAEW1hdGNoZXJGZWVBc3NldElkBwkAAAAAAAACCAUAAAABbwAAABBtYXRjaGVyUHVibGljS2V5BQAAAA53ZXhjaFB1YmxpY0tleQcDAwMJAAAAAAAAAggFAAAAAW8AAAAJb3JkZXJUeXBlBQAAAANCdXkJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAACXBvcnRmb2xpbwgIBQAAAAFvAAAACWFzc2V0UGFpcgAAAApwcmljZUFzc2V0BwYDCQAAAAAAAAIIBQAAAAFvAAAACW9yZGVyVHlwZQUAAAAEU2VsbAkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAgFAAAAAW8AAAAJYXNzZXRQYWlyAAAAC2Ftb3VudEFzc2V0BwYDCQEAAAABIQAAAAEJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAlwb3J0Zm9saW8ICAUAAAABbwAAAAlhc3NldFBhaXIAAAAKcHJpY2VBc3NldAkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAgFAAAAAW8AAAAJYXNzZXRQYWlyAAAAC2Ftb3VudEFzc2V0BwcJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAACW91ckFzc2V0cwgIBQAAAAFvAAAACWFzc2V0UGFpcgAAAApwcmljZUFzc2V0BwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJb3VyQXNzZXRzCAgFAAAAAW8AAAAJYXNzZXRQYWlyAAAAC2Ftb3VudEFzc2V0BwMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAF01hc3NUcmFuc2ZlclRyYW5zYWN0aW9uBgkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABNUcmFuc2ZlclRyYW5zYWN0aW9uBAAAAAF0BQAAAAckbWF0Y2gwAwMDBQAAAAxpc1ZhbGlkQWRtaW4FAAAAEWlzVmFsaWRHdWFyYW50b3JzBwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAUAAAABdAAAAAdhc3NldElkBwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAUAAAABdAAAAApmZWVBc3NldElkBwMDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAFFNldFNjcmlwdFRyYW5zYWN0aW9uBgkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAA9EYXRhVHJhbnNhY3Rpb24FAAAADGlzVmFsaWRBZG1pbgdlih6A", "chainId": 87, "height": 2403919, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7jYEjH4WPoykvhHoPhVw1RkRwAR7tZWw2U8YkoxENYeQ Next: H2EgWAPxMQL6gX1dq7xm8u5pvCu8nzUpx1FRT3tMtd8v Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let scriptVersion = "8.01_20201226"
4+let scriptVersion = "2.0.1-alpha_20210105"
55
6-let percent = 100000
6+let percent = 10000
77
8-let decimal = 100000000
8+let usdMult = 1000000
99
10-let tfeePercent = 10000
10+let decMult = 100000000
1111
12-let fdappPercent = 30000
13-
14-let fmmtDecimal = 100000
15-
16-let usdtDecimal = 1000000
17-
18-let sTxFee = 500000
19-
20-let fmmtPrice = fraction((10 * usdtDecimal), decimal, fmmtDecimal)
21-
22-let wavesMatcher = base58'9cpfKN9suPNvfeUNphzxXMjcnn974eme8ZhWUjaktzU5'
12+let fmainPercent = (30 * (percent / 100))
2313
2414 let adminPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k'
2515
26-let mmbotPublicKey = base58'62KBavoHK4TtCYmURFVeNC8j3gL8Jo7WwcrweoBLWofc'
16+let robotPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k'
2717
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'')
18+let wexchPublicKey = base58'9cpfKN9suPNvfeUNphzxXMjcnn974eme8ZhWUjaktzU5'
19+
20+let guarantors = ([valueOrElse(getBinary(this, "guarantor1"), base58''), valueOrElse(getBinary(this, "guarantor2"), base58''), valueOrElse(getBinary(this, "guarantor3"), base58'')] :+ base58'')
2921
3022 let actualSize = value(indexOf(guarantors, base58''))
3123
3224 let minSignatures = ((actualSize / 2) + (actualSize % 2))
3325
34-let fmmtAsset = base58'7sqT7HvCVtcrCTQV72FM5so65wjzM164rzoqDZRsRXg7'
26+let fhfsAsset = base58'4wcCKU3Cu4ABpmfiwzufocvrQQuRX4QMHZ7TjpRwtAmn'
3527
36-let usdtAsset = base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ'
28+let ratsAsset = base58'Z7817F7hnbWYsVHykjPtn8sUjyuLLf8NPofdveb8CMD'
3729
3830 let xfeeAsset = base58'5EMfVQiB8NF4HuhaXrZzDM637whWuVBsduq59ZaCSNqk'
3931
40-let markets = [base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS', base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ']
41-
4232 let portfolio = [base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ', base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS', base58'474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu', base58'zMFqXuoyrn5w17PFurTqxB7GsS71fp9dfk6XFwxbPCy', base58'HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk', base58'B3uGHFRpSUuGEDWjqB9LWWxafQj8VTvpMucEyoxzws5H', base58'5WvPKSJXzVE2orvbkJ8wsQmmQKqTv9sGBPksV4adViw3', base58'BrjUWjndUanm5VsJkbUip8VRYy6LWJePtxya3FNv4TQa']
4333
44-let ourAssets = [fmmtAsset, xfeeAsset]
45-
46-let assetMults = [14, 2, 14, 14, 14, 14, 14, 14]
47-
48-let assetTickers = ["USDT", "BTC", "ETH", "BCH", "LTC", "DASH", "XMR", "ZEC"]
49-
50-let assetDecimals = [usdtDecimal, decimal, decimal, decimal, decimal, decimal, decimal, decimal]
34+let ourAssets = [fhfsAsset, xfeeAsset, ratsAsset]
5135
5236 let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x')
5337
54-let fdapp = Address(base58'3PEPsNg7aSWSSgdC6XweyJkvDXmwVoWeNHL')
38+let fmain = Address(base58'3PEPsNg7aSWSSgdC6XweyJkvDXmwVoWeNHL')
5539
5640 let fcold = Address(base58'3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA')
5741
58-let supplyDataKey = "7sqT7HvCVtcrCTQV72FM5so65wjzM164rzoqDZRsRXg7_supply"
59-
60-let profitDataKey = "34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ_profit"
61-
62-let testMode = getBooleanValue(fdapp, "testMode")
63-
64-let tradeSupply = getIntegerValue(admin, supplyDataKey)
65-
66-let spreadPercent = getIntegerValue(fdapp, "halfSpread")
67-
68-let investments = ((value(assetInfo(fmmtAsset)).quantity - (assetBalance(fdapp, fmmtAsset) + assetBalance(fcold, fmmtAsset))) - assetBalance(admin, fmmtAsset))
69-
70-let logEntryDataKey = "logEntry"
71-
72-let timestampDataKey = "timestamp"
73-
74-let tfeesDataKey = "teamPayouts"
75-
76-let statusDataKey = "tradeStatus"
77-
78-let versionDataKey = "scriptVersion"
79-
80-func validate (intValue,minValue) = if ((minValue > intValue))
81- then 0
82- else intValue
83-
42+let frats = Address(base58'3PJ7RB5CC3Bnn44RNR2hceZ6wKsULnMSxPi')
8443
8544 func valueOrMinimum (intValue,minValue) = if ((minValue > intValue))
8645 then minValue
9251 else intValue
9352
9453
95-func isAssetDisabled (assetId) = !(getBooleanValue(admin, toBase58String(assetId)))
54+func excessAmount (assetId) = {
55+ let fmainFunds = assetBalance(fmain, assetId)
56+ let totalFunds = (fmainFunds + assetBalance(fcold, assetId))
57+ let fmainSupply = fraction(totalFunds, fmainPercent, percent)
58+ valueOrMinimum((fmainSupply - fmainFunds), 0)
59+ }
9660
9761
98-func anyBankingAsset (baseId,quoteId) = if (containsElement(markets, baseId))
99- then true
100- else containsElement(markets, quoteId)
101-
102-
103-func isMarketDisabled (baseId,quoteId) = if (if (isAssetDisabled(baseId))
104- then true
105- else isAssetDisabled(quoteId))
106- then true
107- else (baseId == quoteId)
108-
109-
110-func assetIndex (ticker) = valueOrErrorMessage(indexOf(assetTickers, ticker), ("Supported assets: " + makeString(assetTickers, ", ")))
111-
112-
113-func assetFunds (assetId) = ((assetBalance(fdapp, assetId) + assetBalance(fcold, assetId)) - (if ((assetId == usdtAsset))
114- then getIntegerValue(admin, profitDataKey)
115- else 0))
116-
117-
118-func getAttachment (payments) = if ((size(payments) != 1))
119- then $Tuple2(base58'', 0)
120- else $Tuple2(payments[0].assetId, payments[0].amount)
121-
122-
123-func getScriptTransfer (address,amount,assetId) = if ((0 >= amount))
124- then nil
125- else [ScriptTransfer(address, amount, assetId)]
126-
127-
128-func rebalancingAmount (assetId) = if (isAssetDisabled(assetId))
129- then 0
130- else {
131- let fdappFunds = assetBalance(fdapp, assetId)
132- let totalFunds = (fdappFunds + assetBalance(fcold, assetId))
133- validate((fraction(totalFunds, fdappPercent, percent) - fdappFunds), (totalFunds / 100))
134- }
135-
136-
137-func airdropBalance (assetId) = if (containsElement((ourAssets ++ portfolio), assetId))
138- then throw(("Delete asset ID: " + toBase58String(assetId)))
62+func airdropBalance (assetId) = if (containsElement((portfolio ++ ourAssets), assetId))
63+ then throw(("Please delete the asset: " + toBase58String(assetId)))
13964 else if ((assetId == base58''))
14065 then 0
14166 else assetBalance(this, assetId)
14267
14368
144-func toFloatString (num,dec) = if ((num == 0))
145- then "0"
146- else if ((num > 0))
147- then toUtf8String(((toBytes(toString((num / dec))) + base58'o') + drop(toBytes(toString(((num % dec) + dec))), 1)))
148- else throw("Negative amounts are not allowed!")
149-
150-
15169 @Callable(i)
152-func getTeamFee () = if (if ((i.callerPublicKey != adminPublicKey))
153- then (i.callerPublicKey != mmbotPublicKey)
154- else false)
155- then throw("This action can only be performed by an administrator!")
156- else if ((size(i.payments) > 0))
157- then throw("Don't attach payment when calling this function ...")
70+func autoRebalance () = if ((size(i.payments) > 0))
71+ then throw("Don't attach payment when calling this function ...")
72+ else if (if ((i.callerPublicKey != adminPublicKey))
73+ then (i.callerPublicKey != robotPublicKey)
74+ else false)
75+ then throw("This action can only be performed by an administrator!")
15876 else {
159- let newPayouts = fraction(investments, tfeePercent, (percent - tfeePercent))
160- let oldPayouts = getIntegerValue(fcold, tfeesDataKey)
161- let outAmount = validate((newPayouts - oldPayouts), 0)
162- let logEntryDataValue = makeString(["DeFi Franklin (FMMT): getTeamFee () =>", "amount:", toFloatString(outAmount, fmmtDecimal), "FMMT"], " ")
163- if ((0 >= outAmount))
164- then throw("There are currently no payments available.")
165- else [ScriptTransfer(admin, outAmount, fmmtAsset), IntegerEntry(tfeesDataKey, newPayouts), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)]
77+ let fhfsFunds = assetBalance(fmain, fhfsAsset)
78+ let fhfsSupply = getIntegerValue(fmain, "fhfsSupply")
79+[ScriptTransfer(fmain, (fhfsSupply - fhfsFunds), 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])]
16680 }
16781
16882
16983
17084 @Callable(i)
171-func feeExchange () = {
172- let $t086618711 = getAttachment(i.payments)
173- let assetId = $t086618711._1
174- let deposit = $t086618711._2
175- let oldProfit = getIntegerValue(admin, profitDataKey)
176- let maxAmount = fraction(oldProfit, decimal, fmmtPrice)
177- if (if ((i.callerPublicKey != adminPublicKey))
178- then (i.callerPublicKey != mmbotPublicKey)
179- else false)
85+func airdropWasher (id0,id1,id2,id3,id4,id5,id6,id7,id8,id9) = if ((size(i.payments) > 0))
86+ then throw("Don't attach payment when calling this function ...")
87+ else if ((i.callerPublicKey != adminPublicKey))
18088 then throw("This action can only be performed by an administrator!")
181- else if ((assetId == fmmtAsset))
182- then {
183- let usdtMult = assetMults[value(indexOf(portfolio, usdtAsset))]
184- let usdtFunds = (fraction(investments, fmmtPrice, decimal) / usdtMult)
185- let usdtFactor = fraction(usdtFunds, spreadPercent, percent)
186- let fmmtFactor = fraction(usdtFactor, decimal, fmmtPrice)
187- let inAmount = ((valueOrMaximum(deposit, maxAmount) / fmmtFactor) * fmmtFactor)
188- let refundAmount = validate((deposit - inAmount), 0)
189- let outAmount = fraction(inAmount, usdtFactor, fmmtFactor)
190- let profitMult = ((oldProfit / usdtFactor) - (inAmount / fmmtFactor))
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"], " ")
192- if ((0 >= outAmount))
193- then throw(logEntryDataValue)
194- else [ScriptTransfer(admin, outAmount, usdtAsset), ((getScriptTransfer(admin, refundAmount, fmmtAsset) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))]
195- }
196- else throw(makeString(["Please attach the FMMT payment (max amount:", toFloatString(maxAmount, fmmtDecimal), "FMMT)."], " "))
197- }
198-
199-
200-
201-@Callable(i)
202-func autoRebalance () = if (if (if ((i.callerPublicKey != adminPublicKey))
203- then (i.callerPublicKey != mmbotPublicKey)
204- else false)
205- then !(containsElement(guarantors, i.callerPublicKey))
206- else false)
207- then throw("This action can only be performed by an administrator or guarantor!")
208- else if ((size(i.payments) > 0))
209- then throw("Don't attach payment when calling this function ...")
210- else {
211- let fmmtAmount = (tradeSupply - assetBalance(fdapp, fmmtAsset))
212- let xfeeAmount = valueOrMaximum(sTxFee, assetBalance(this, xfeeAsset))
213- let recipient = fdapp
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]))
215- let logEntryDataValue = ("DeFi Franklin (FMMT): autoRebalance () => tx: " + toBase58String(i.transactionId))
216- if ((size(scriptTransfers) == 0))
217- then throw("There are currently no transfers available.")
218- else ((((scriptTransfers ++ getScriptTransfer(recipient, fmmtAmount, fmmtAsset)) ++ getScriptTransfer(i.caller, xfeeAmount, xfeeAsset)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
219- }
220-
221-
222-
223-@Callable(i)
224-func setScriptVersion () = if ((i.callerPublicKey != adminPublicKey))
225- then throw("This action can only be performed by an administrator!")
226- else if ((size(i.payments) > 0))
227- then throw("Don't attach payment when calling this function ...")
228- else {
229- let newVersion = scriptVersion
230- let oldVersion = getStringValue(this, versionDataKey)
231- let version = split(newVersion, "_")
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)], "-")], " ")
233- if ((newVersion == oldVersion))
234- then throw(("The script version has already been updated. Version: " + oldVersion))
235- else [StringEntry(versionDataKey, newVersion), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)]
236- }
237-
238-
239-
240-@Callable(i)
241-func airdropWasher (id0,id1,id2,id3,id4,id5,id6,id7,id8,id9) = if ((i.callerPublicKey != adminPublicKey))
242- then throw("This action can only be performed by an administrator!")
243- else if ((size(i.payments) > 0))
244- then throw("Don't attach payment when calling this function ...")
245- else {
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))
247- let logEntryDataValue = ("DeFi Franklin (FMMT): airdropWasher () => tx: " + toBase58String(i.transactionId))
248- if ((size(scriptTransfers) == 0))
249- then throw("There are currently no transfers available.")
250- else ((scriptTransfers :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
251- }
89+ 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)]
25290
25391
25492 @Verifier(tx)
25593 func verify () = {
256- let isValidOwner = sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
257- let isValidMMBot = if (isValidOwner)
258- then true
259- else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], mmbotPublicKey)
260- let isValidAdmin = if (isValidOwner)
261- then true
262- else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], adminPublicKey)
263- let isValidGuarantors = ((((((if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], guarantors[0]))
94+ let isValidGuarantors = ((((if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], guarantors[0]))
26495 then 1
26596 else 0) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[2], guarantors[1]))
26697 then 1
26798 else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[3], guarantors[2]))
26899 then 1
269- else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[4], guarantors[3]))
270- then 1
271- else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[5], guarantors[4]))
272- then 1
273100 else 0)) >= minSignatures)
274- let maxAmount = validate((tradeSupply - assetBalance(fdapp, fmmtAsset)), 0)
101+ let isValidOwner = sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
102+ let isValidAdmin = if (isValidOwner)
103+ then true
104+ else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], adminPublicKey)
105+ let isValidRobot = if (isValidOwner)
106+ then true
107+ else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], robotPublicKey)
275108 match tx {
276109 case b: BurnTransaction =>
277110 if (if (isValidOwner)
111+ then !(containsElement(portfolio, b.assetId))
112+ else false)
278113 then !(containsElement(ourAssets, b.assetId))
279- else false)
280- then !(containsElement(portfolio, b.assetId))
281114 else false
282115 case l: LeaseCancelTransaction|LeaseTransaction =>
283116 isValidOwner
284117 case o: Order =>
285- if (if (if (if (if (isValidMMBot)
286- then (o.matcherPublicKey == wavesMatcher)
118+ if (if (if (if (if (isValidRobot)
119+ then !(isDefined(o.matcherFeeAssetId))
287120 else false)
288- then !(containsElement(ourAssets, o.assetPair.priceAsset))
289- else false)
290- then !(containsElement(ourAssets, o.assetPair.amountAsset))
121+ then (o.matcherPublicKey == wexchPublicKey)
291122 else false)
292123 then if (if (if ((o.orderType == Buy))
293124 then !(containsElement(portfolio, o.assetPair.priceAsset))
301132 then !(containsElement(portfolio, o.assetPair.amountAsset))
302133 else false
303134 else false)
304- then if (!(isDefined(o.matcherFeeAssetId)))
305- then true
306- else (o.matcherFeeAssetId == o.assetPair.priceAsset)
135+ then !(containsElement(ourAssets, o.assetPair.priceAsset))
136+ else false)
137+ then !(containsElement(ourAssets, o.assetPair.amountAsset))
307138 else false
308- case t: TransferTransaction =>
309- if (if (if (if (isValidOwner)
310- then (t.assetId != fmmtAsset)
139+ case t: MassTransferTransaction|TransferTransaction =>
140+ if (if (if (isValidAdmin)
141+ then isValidGuarantors
311142 else false)
312143 then !(containsElement(portfolio, t.assetId))
313144 else false)
314145 then !(containsElement(portfolio, t.feeAssetId))
315- else false)
316- then true
317- else if (if (if (isValidAdmin)
318- then true
319- else isValidGuarantors)
320- then (addressFromRecipient(t.recipient) == fdapp)
321- else false)
322- then if ((t.assetId != fmmtAsset))
323- then true
324- else (maxAmount >= t.amount)
325- else false
326- case m: MassTransferTransaction =>
327- if (if (isValidAdmin)
328- then isValidGuarantors
329- else false)
330- then if ((m.assetId == usdtAsset))
331- then true
332- else if ((m.assetId != fmmtAsset))
333- then !(containsElement(portfolio, m.assetId))
334- else false
335146 else false
336147 case _: SetScriptTransaction|DataTransaction =>
337- if (isValidAdmin)
338- then isValidGuarantors
339- else false
148+ isValidAdmin
340149 case _ =>
341150 false
342151 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let scriptVersion = "8.01_20201226"
4+let scriptVersion = "2.0.1-alpha_20210105"
55
6-let percent = 100000
6+let percent = 10000
77
8-let decimal = 100000000
8+let usdMult = 1000000
99
10-let tfeePercent = 10000
10+let decMult = 100000000
1111
12-let fdappPercent = 30000
13-
14-let fmmtDecimal = 100000
15-
16-let usdtDecimal = 1000000
17-
18-let sTxFee = 500000
19-
20-let fmmtPrice = fraction((10 * usdtDecimal), decimal, fmmtDecimal)
21-
22-let wavesMatcher = base58'9cpfKN9suPNvfeUNphzxXMjcnn974eme8ZhWUjaktzU5'
12+let fmainPercent = (30 * (percent / 100))
2313
2414 let adminPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k'
2515
26-let mmbotPublicKey = base58'62KBavoHK4TtCYmURFVeNC8j3gL8Jo7WwcrweoBLWofc'
16+let robotPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k'
2717
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'')
18+let wexchPublicKey = base58'9cpfKN9suPNvfeUNphzxXMjcnn974eme8ZhWUjaktzU5'
19+
20+let guarantors = ([valueOrElse(getBinary(this, "guarantor1"), base58''), valueOrElse(getBinary(this, "guarantor2"), base58''), valueOrElse(getBinary(this, "guarantor3"), base58'')] :+ base58'')
2921
3022 let actualSize = value(indexOf(guarantors, base58''))
3123
3224 let minSignatures = ((actualSize / 2) + (actualSize % 2))
3325
34-let fmmtAsset = base58'7sqT7HvCVtcrCTQV72FM5so65wjzM164rzoqDZRsRXg7'
26+let fhfsAsset = base58'4wcCKU3Cu4ABpmfiwzufocvrQQuRX4QMHZ7TjpRwtAmn'
3527
36-let usdtAsset = base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ'
28+let ratsAsset = base58'Z7817F7hnbWYsVHykjPtn8sUjyuLLf8NPofdveb8CMD'
3729
3830 let xfeeAsset = base58'5EMfVQiB8NF4HuhaXrZzDM637whWuVBsduq59ZaCSNqk'
3931
40-let markets = [base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS', base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ']
41-
4232 let portfolio = [base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ', base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS', base58'474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu', base58'zMFqXuoyrn5w17PFurTqxB7GsS71fp9dfk6XFwxbPCy', base58'HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk', base58'B3uGHFRpSUuGEDWjqB9LWWxafQj8VTvpMucEyoxzws5H', base58'5WvPKSJXzVE2orvbkJ8wsQmmQKqTv9sGBPksV4adViw3', base58'BrjUWjndUanm5VsJkbUip8VRYy6LWJePtxya3FNv4TQa']
4333
44-let ourAssets = [fmmtAsset, xfeeAsset]
45-
46-let assetMults = [14, 2, 14, 14, 14, 14, 14, 14]
47-
48-let assetTickers = ["USDT", "BTC", "ETH", "BCH", "LTC", "DASH", "XMR", "ZEC"]
49-
50-let assetDecimals = [usdtDecimal, decimal, decimal, decimal, decimal, decimal, decimal, decimal]
34+let ourAssets = [fhfsAsset, xfeeAsset, ratsAsset]
5135
5236 let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x')
5337
54-let fdapp = Address(base58'3PEPsNg7aSWSSgdC6XweyJkvDXmwVoWeNHL')
38+let fmain = Address(base58'3PEPsNg7aSWSSgdC6XweyJkvDXmwVoWeNHL')
5539
5640 let fcold = Address(base58'3P8v4dR4UD8nGeLQmorw6BmCo424GvGBXCA')
5741
58-let supplyDataKey = "7sqT7HvCVtcrCTQV72FM5so65wjzM164rzoqDZRsRXg7_supply"
59-
60-let profitDataKey = "34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ_profit"
61-
62-let testMode = getBooleanValue(fdapp, "testMode")
63-
64-let tradeSupply = getIntegerValue(admin, supplyDataKey)
65-
66-let spreadPercent = getIntegerValue(fdapp, "halfSpread")
67-
68-let investments = ((value(assetInfo(fmmtAsset)).quantity - (assetBalance(fdapp, fmmtAsset) + assetBalance(fcold, fmmtAsset))) - assetBalance(admin, fmmtAsset))
69-
70-let logEntryDataKey = "logEntry"
71-
72-let timestampDataKey = "timestamp"
73-
74-let tfeesDataKey = "teamPayouts"
75-
76-let statusDataKey = "tradeStatus"
77-
78-let versionDataKey = "scriptVersion"
79-
80-func validate (intValue,minValue) = if ((minValue > intValue))
81- then 0
82- else intValue
83-
42+let frats = Address(base58'3PJ7RB5CC3Bnn44RNR2hceZ6wKsULnMSxPi')
8443
8544 func valueOrMinimum (intValue,minValue) = if ((minValue > intValue))
8645 then minValue
8746 else intValue
8847
8948
9049 func valueOrMaximum (intValue,maxValue) = if ((intValue > maxValue))
9150 then maxValue
9251 else intValue
9352
9453
95-func isAssetDisabled (assetId) = !(getBooleanValue(admin, toBase58String(assetId)))
54+func excessAmount (assetId) = {
55+ let fmainFunds = assetBalance(fmain, assetId)
56+ let totalFunds = (fmainFunds + assetBalance(fcold, assetId))
57+ let fmainSupply = fraction(totalFunds, fmainPercent, percent)
58+ valueOrMinimum((fmainSupply - fmainFunds), 0)
59+ }
9660
9761
98-func anyBankingAsset (baseId,quoteId) = if (containsElement(markets, baseId))
99- then true
100- else containsElement(markets, quoteId)
101-
102-
103-func isMarketDisabled (baseId,quoteId) = if (if (isAssetDisabled(baseId))
104- then true
105- else isAssetDisabled(quoteId))
106- then true
107- else (baseId == quoteId)
108-
109-
110-func assetIndex (ticker) = valueOrErrorMessage(indexOf(assetTickers, ticker), ("Supported assets: " + makeString(assetTickers, ", ")))
111-
112-
113-func assetFunds (assetId) = ((assetBalance(fdapp, assetId) + assetBalance(fcold, assetId)) - (if ((assetId == usdtAsset))
114- then getIntegerValue(admin, profitDataKey)
115- else 0))
116-
117-
118-func getAttachment (payments) = if ((size(payments) != 1))
119- then $Tuple2(base58'', 0)
120- else $Tuple2(payments[0].assetId, payments[0].amount)
121-
122-
123-func getScriptTransfer (address,amount,assetId) = if ((0 >= amount))
124- then nil
125- else [ScriptTransfer(address, amount, assetId)]
126-
127-
128-func rebalancingAmount (assetId) = if (isAssetDisabled(assetId))
129- then 0
130- else {
131- let fdappFunds = assetBalance(fdapp, assetId)
132- let totalFunds = (fdappFunds + assetBalance(fcold, assetId))
133- validate((fraction(totalFunds, fdappPercent, percent) - fdappFunds), (totalFunds / 100))
134- }
135-
136-
137-func airdropBalance (assetId) = if (containsElement((ourAssets ++ portfolio), assetId))
138- then throw(("Delete asset ID: " + toBase58String(assetId)))
62+func airdropBalance (assetId) = if (containsElement((portfolio ++ ourAssets), assetId))
63+ then throw(("Please delete the asset: " + toBase58String(assetId)))
13964 else if ((assetId == base58''))
14065 then 0
14166 else assetBalance(this, assetId)
14267
14368
144-func toFloatString (num,dec) = if ((num == 0))
145- then "0"
146- else if ((num > 0))
147- then toUtf8String(((toBytes(toString((num / dec))) + base58'o') + drop(toBytes(toString(((num % dec) + dec))), 1)))
148- else throw("Negative amounts are not allowed!")
149-
150-
15169 @Callable(i)
152-func getTeamFee () = if (if ((i.callerPublicKey != adminPublicKey))
153- then (i.callerPublicKey != mmbotPublicKey)
154- else false)
155- then throw("This action can only be performed by an administrator!")
156- else if ((size(i.payments) > 0))
157- then throw("Don't attach payment when calling this function ...")
70+func autoRebalance () = if ((size(i.payments) > 0))
71+ then throw("Don't attach payment when calling this function ...")
72+ else if (if ((i.callerPublicKey != adminPublicKey))
73+ then (i.callerPublicKey != robotPublicKey)
74+ else false)
75+ then throw("This action can only be performed by an administrator!")
15876 else {
159- let newPayouts = fraction(investments, tfeePercent, (percent - tfeePercent))
160- let oldPayouts = getIntegerValue(fcold, tfeesDataKey)
161- let outAmount = validate((newPayouts - oldPayouts), 0)
162- let logEntryDataValue = makeString(["DeFi Franklin (FMMT): getTeamFee () =>", "amount:", toFloatString(outAmount, fmmtDecimal), "FMMT"], " ")
163- if ((0 >= outAmount))
164- then throw("There are currently no payments available.")
165- else [ScriptTransfer(admin, outAmount, fmmtAsset), IntegerEntry(tfeesDataKey, newPayouts), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)]
77+ let fhfsFunds = assetBalance(fmain, fhfsAsset)
78+ let fhfsSupply = getIntegerValue(fmain, "fhfsSupply")
79+[ScriptTransfer(fmain, (fhfsSupply - fhfsFunds), 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])]
16680 }
16781
16882
16983
17084 @Callable(i)
171-func feeExchange () = {
172- let $t086618711 = getAttachment(i.payments)
173- let assetId = $t086618711._1
174- let deposit = $t086618711._2
175- let oldProfit = getIntegerValue(admin, profitDataKey)
176- let maxAmount = fraction(oldProfit, decimal, fmmtPrice)
177- if (if ((i.callerPublicKey != adminPublicKey))
178- then (i.callerPublicKey != mmbotPublicKey)
179- else false)
85+func airdropWasher (id0,id1,id2,id3,id4,id5,id6,id7,id8,id9) = if ((size(i.payments) > 0))
86+ then throw("Don't attach payment when calling this function ...")
87+ else if ((i.callerPublicKey != adminPublicKey))
18088 then throw("This action can only be performed by an administrator!")
181- else if ((assetId == fmmtAsset))
182- then {
183- let usdtMult = assetMults[value(indexOf(portfolio, usdtAsset))]
184- let usdtFunds = (fraction(investments, fmmtPrice, decimal) / usdtMult)
185- let usdtFactor = fraction(usdtFunds, spreadPercent, percent)
186- let fmmtFactor = fraction(usdtFactor, decimal, fmmtPrice)
187- let inAmount = ((valueOrMaximum(deposit, maxAmount) / fmmtFactor) * fmmtFactor)
188- let refundAmount = validate((deposit - inAmount), 0)
189- let outAmount = fraction(inAmount, usdtFactor, fmmtFactor)
190- let profitMult = ((oldProfit / usdtFactor) - (inAmount / fmmtFactor))
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"], " ")
192- if ((0 >= outAmount))
193- then throw(logEntryDataValue)
194- else [ScriptTransfer(admin, outAmount, usdtAsset), ((getScriptTransfer(admin, refundAmount, fmmtAsset) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))]
195- }
196- else throw(makeString(["Please attach the FMMT payment (max amount:", toFloatString(maxAmount, fmmtDecimal), "FMMT)."], " "))
197- }
198-
199-
200-
201-@Callable(i)
202-func autoRebalance () = if (if (if ((i.callerPublicKey != adminPublicKey))
203- then (i.callerPublicKey != mmbotPublicKey)
204- else false)
205- then !(containsElement(guarantors, i.callerPublicKey))
206- else false)
207- then throw("This action can only be performed by an administrator or guarantor!")
208- else if ((size(i.payments) > 0))
209- then throw("Don't attach payment when calling this function ...")
210- else {
211- let fmmtAmount = (tradeSupply - assetBalance(fdapp, fmmtAsset))
212- let xfeeAmount = valueOrMaximum(sTxFee, assetBalance(this, xfeeAsset))
213- let recipient = fdapp
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]))
215- let logEntryDataValue = ("DeFi Franklin (FMMT): autoRebalance () => tx: " + toBase58String(i.transactionId))
216- if ((size(scriptTransfers) == 0))
217- then throw("There are currently no transfers available.")
218- else ((((scriptTransfers ++ getScriptTransfer(recipient, fmmtAmount, fmmtAsset)) ++ getScriptTransfer(i.caller, xfeeAmount, xfeeAsset)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
219- }
220-
221-
222-
223-@Callable(i)
224-func setScriptVersion () = if ((i.callerPublicKey != adminPublicKey))
225- then throw("This action can only be performed by an administrator!")
226- else if ((size(i.payments) > 0))
227- then throw("Don't attach payment when calling this function ...")
228- else {
229- let newVersion = scriptVersion
230- let oldVersion = getStringValue(this, versionDataKey)
231- let version = split(newVersion, "_")
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)], "-")], " ")
233- if ((newVersion == oldVersion))
234- then throw(("The script version has already been updated. Version: " + oldVersion))
235- else [StringEntry(versionDataKey, newVersion), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)]
236- }
237-
238-
239-
240-@Callable(i)
241-func airdropWasher (id0,id1,id2,id3,id4,id5,id6,id7,id8,id9) = if ((i.callerPublicKey != adminPublicKey))
242- then throw("This action can only be performed by an administrator!")
243- else if ((size(i.payments) > 0))
244- then throw("Don't attach payment when calling this function ...")
245- else {
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))
247- let logEntryDataValue = ("DeFi Franklin (FMMT): airdropWasher () => tx: " + toBase58String(i.transactionId))
248- if ((size(scriptTransfers) == 0))
249- then throw("There are currently no transfers available.")
250- else ((scriptTransfers :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
251- }
89+ 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)]
25290
25391
25492 @Verifier(tx)
25593 func verify () = {
256- let isValidOwner = sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
257- let isValidMMBot = if (isValidOwner)
258- then true
259- else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], mmbotPublicKey)
260- let isValidAdmin = if (isValidOwner)
261- then true
262- else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], adminPublicKey)
263- let isValidGuarantors = ((((((if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], guarantors[0]))
94+ let isValidGuarantors = ((((if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], guarantors[0]))
26495 then 1
26596 else 0) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[2], guarantors[1]))
26697 then 1
26798 else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[3], guarantors[2]))
26899 then 1
269- else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[4], guarantors[3]))
270- then 1
271- else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[5], guarantors[4]))
272- then 1
273100 else 0)) >= minSignatures)
274- let maxAmount = validate((tradeSupply - assetBalance(fdapp, fmmtAsset)), 0)
101+ let isValidOwner = sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
102+ let isValidAdmin = if (isValidOwner)
103+ then true
104+ else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], adminPublicKey)
105+ let isValidRobot = if (isValidOwner)
106+ then true
107+ else sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], robotPublicKey)
275108 match tx {
276109 case b: BurnTransaction =>
277110 if (if (isValidOwner)
111+ then !(containsElement(portfolio, b.assetId))
112+ else false)
278113 then !(containsElement(ourAssets, b.assetId))
279- else false)
280- then !(containsElement(portfolio, b.assetId))
281114 else false
282115 case l: LeaseCancelTransaction|LeaseTransaction =>
283116 isValidOwner
284117 case o: Order =>
285- if (if (if (if (if (isValidMMBot)
286- then (o.matcherPublicKey == wavesMatcher)
118+ if (if (if (if (if (isValidRobot)
119+ then !(isDefined(o.matcherFeeAssetId))
287120 else false)
288- then !(containsElement(ourAssets, o.assetPair.priceAsset))
289- else false)
290- then !(containsElement(ourAssets, o.assetPair.amountAsset))
121+ then (o.matcherPublicKey == wexchPublicKey)
291122 else false)
292123 then if (if (if ((o.orderType == Buy))
293124 then !(containsElement(portfolio, o.assetPair.priceAsset))
294125 else false)
295126 then true
296127 else if ((o.orderType == Sell))
297128 then !(containsElement(portfolio, o.assetPair.amountAsset))
298129 else false)
299130 then true
300131 else if (!(containsElement(portfolio, o.assetPair.priceAsset)))
301132 then !(containsElement(portfolio, o.assetPair.amountAsset))
302133 else false
303134 else false)
304- then if (!(isDefined(o.matcherFeeAssetId)))
305- then true
306- else (o.matcherFeeAssetId == o.assetPair.priceAsset)
135+ then !(containsElement(ourAssets, o.assetPair.priceAsset))
136+ else false)
137+ then !(containsElement(ourAssets, o.assetPair.amountAsset))
307138 else false
308- case t: TransferTransaction =>
309- if (if (if (if (isValidOwner)
310- then (t.assetId != fmmtAsset)
139+ case t: MassTransferTransaction|TransferTransaction =>
140+ if (if (if (isValidAdmin)
141+ then isValidGuarantors
311142 else false)
312143 then !(containsElement(portfolio, t.assetId))
313144 else false)
314145 then !(containsElement(portfolio, t.feeAssetId))
315- else false)
316- then true
317- else if (if (if (isValidAdmin)
318- then true
319- else isValidGuarantors)
320- then (addressFromRecipient(t.recipient) == fdapp)
321- else false)
322- then if ((t.assetId != fmmtAsset))
323- then true
324- else (maxAmount >= t.amount)
325- else false
326- case m: MassTransferTransaction =>
327- if (if (isValidAdmin)
328- then isValidGuarantors
329- else false)
330- then if ((m.assetId == usdtAsset))
331- then true
332- else if ((m.assetId != fmmtAsset))
333- then !(containsElement(portfolio, m.assetId))
334- else false
335146 else false
336147 case _: SetScriptTransaction|DataTransaction =>
337- if (isValidAdmin)
338- then isValidGuarantors
339- else false
148+ isValidAdmin
340149 case _ =>
341150 false
342151 }
343152 }
344153

github/deemru/w8io/6500d08 
134.63 ms