tx · GrMrugeVrFYz4LeWGuzwMAGCRe6NqpxXueZzMX3yCx4N

3PFRxT9CXG81Evr8MeVJGnQSjFP6cq1SHWL:  -0.01400000 Waves

2020.10.20 21:42 [2292962] smart account 3PFRxT9CXG81Evr8MeVJGnQSjFP6cq1SHWL > SELF 0.00000000 Waves

{ "type": 13, "id": "GrMrugeVrFYz4LeWGuzwMAGCRe6NqpxXueZzMX3yCx4N", "fee": 1400000, "feeAssetId": null, "timestamp": 1603219360920, "version": 2, "chainId": 87, "sender": "3PFRxT9CXG81Evr8MeVJGnQSjFP6cq1SHWL", "senderPublicKey": "Df9CNxLc26KjvgeE9TYkcT1ooBayf5PUfxNdgmFzD2WK", "proofs": [ "3uokuk9d4jkJ23FxmdEXwEeuc6tEpQRUnAEeUAQKSKqit6GfLQXJuWXZ9u84fBGS2ur7AFGRZMYD1pEGbzSE9gjQ", "5sJuduqZ1QCMVpM6eM7uzNmf1PSRTTYPrCBjT1WA1moPTSLfyzsdKcp9NZrt6jskLS1MCRUBxn34TNda9kG5FEWE" ], "script": "base64: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AAACBQAAAAtxdW90ZVRpY2tlcgkABEwAAAACAgAAACYgbWFya2V0IHBhaXIgaXMgdGVtcG9yYXJpbHkgc3VzcGVuZGVkLgUAAAADbmlsAgAAAAEgBAAAAAtiYXNlRGVjaW1hbAkBAAAADGFzc2V0RGVjaW1hbAAAAAEFAAAABmJhc2VJZAQAAAAMcXVvdGVEZWNpbWFsCQEAAAAMYXNzZXREZWNpbWFsAAAAAQUAAAAHcXVvdGVJZAQAAAAMcHJpY2VEZWNpbWFsCQAAawAAAAMFAAAADHF1b3RlRGVjaW1hbAUAAAAHZGVjaW1hbAUAAAALYmFzZURlY2ltYWwEAAAACyR0MDk3Mzc5Nzg3CQEAAAANZ2V0QXR0YWNobWVudAAAAAEIBQAAAAFpAAAACHBheW1lbnRzBAAAAAdkZXBvc2l0CAUAAAALJHQwOTczNzk3ODcAAAACXzEEAAAAB2Fzc2V0SWQIBQAAAAskdDA5NzM3OTc4NwAAAAJfMgQAAAALJHQwOTc5Mjk4NzUJAQAAAA5nZXRNYXJrZXRGdW5kcwAAAAIFAAAABmJhc2VJZAUAAAAHcXVvdGVJZAQAAAAJYmFzZUZ1bmRzCAUAAAALJHQwOTc5Mjk4NzUAAAACXzEEAAAACnF1b3RlRnVuZHMIBQAAAAskdDA5NzkyOTg3NQAAAAJfMgMJAAAAAAAAAgUAAAAHYXNzZXRJZAUAAAAHcXVvdGVJZAQAAAAIaW5BbW91bnQJAQAAAA52YWx1ZU9yTWF4aW11bQAAAAIFAAAAB2RlcG9zaXQJAABrAAAAAwUAAAAKcXVvdGVGdW5kcwUAAAANc3ByZWFkUGVyY2VudAUAAAAHcGVyY2VudAQAAAAJZmVlQW1vdW50CQAAawAAAAMFAAAACGluQW1vdW50BQAAAApmZWVQZXJjZW50BQAAAAdwZXJjZW50BAAAAAp0ZWFtUmV3YXJkCQAAawAAAAMFAAAACGluQW1vdW50BQAAAApmZWVQZXJjZW50CQAAaAAAAAIAAAAAAAAAAAoFAAAAB3BlcmNlbnQEAAAAC3F1b3RlQW1vdW50CQAAZQAAAAIFAAAACGluQW1vdW50BQAAAAlmZWVBbW91bnQEAAAACmJhc2VBbW91bnQJAABrAAAAAwUAAAAJYmFzZUZ1bmRzBQAAAAtxdW90ZUFtb3VudAkAAGQAAAACBQAAAApxdW90ZUZ1bmRzBQAAAAtxdW90ZUFtb3VudAQAAAAJb3V0QW1vdW50BQAAAApiYXNlQW1vdW50BAAAAAZyZWZ1bmQJAQAAAAh2YWxpZGF0ZQAAAAEJAABlAAAAAgUAAAAHZGVwb3NpdAUAAAAIaW5BbW91bnQEAAAADHByaWNlUGVyVW5pdAkAAGsAAAADBQAAAAtxdW90ZUFtb3VudAUAAAAHZGVjaW1hbAUAAAAKYmFzZUFtb3VudAQAAAARbG9nRW50cnlEYXRhVmFsdWUJAAS5AAAAAgkABEwAAAACAgAAAC1EZUZpIEZyYW5rbGluIChGTU1UKTogb3RjRXhjaGFuZ2UgKEJ1eSBPcmRlcjoJAARMAAAAAgUAAAAKYmFzZVRpY2tlcgkABEwAAAACAgAAAAEvCQAETAAAAAIJAAEsAAAAAgUAAAALcXVvdGVUaWNrZXICAAAABCkgPT4JAARMAAAAAgIAAAAGYm91Z2h0CQAETAAAAAIJAQAAAA10b0Zsb2F0U3RyaW5nAAAAAgUAAAAJb3V0QW1vdW50BQAAAAtiYXNlRGVjaW1hbAkABEwAAAACBQAAAApiYXNlVGlja2VyCQAETAAAAAICAAAAAsOXCQAETAAAAAICAAAACWFzayBwcmljZQkABEwAAAACCQEAAAANdG9GbG9hdFN0cmluZwAAAAIFAAAADHByaWNlUGVyVW5pdAUAAAAMcHJpY2VEZWNpbWFsCQAETAAAAAICAAAAAT0JAARMAAAAAgIAAAAKY29zdCBwcmljZQkABEwAAAACCQEAAAANdG9GbG9hdFN0cmluZwAAAAIFAAAACGluQW1vdW50BQAAAAxxdW90ZURlY2ltYWwJAARMAAAAAgUAAAALcXVvdGVUaWNrZXIJAARMAAAAAgIAAAAD4oiSCQAETAAAAAICAAAACXRyYWRlIGZlZQkABEwAAAACCQEAAAANdG9GbG9hdFN0cmluZwAAAAIFAAAACWZlZUFtb3VudAUAAAAMcXVvdGVEZWNpbWFsCQAETAAAAAIFAAAAC3F1b3RlVGlja2VyBQAAAANuaWwCAAAAASADAwkBAAAAASEAAAABBQAAAAR0ZXN0CQAAZgAAAAIFAAAACW91dEFtb3VudAAAAAAAAAAAAAcJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAlvdXRBbW91bnQFAAAABmJhc2VJZAkABE0AAAACCQAETQAAAAIJAAROAAAAAgkBAAAAEWdldFNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAZyZWZ1bmQFAAAAB3F1b3RlSWQJAQAAABFnZXRTY3JpcHRUcmFuc2ZlcgAAAAMFAAAABWZ0ZWFtBQAAAAp0ZWFtUmV3YXJkBQAAAAdxdW90ZUlkCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAA9sb2dFbnRyeURhdGFLZXkFAAAAEWxvZ0VudHJ5RGF0YVZhbHVlCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAQdGltZXN0YW1wRGF0YUtleQgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAJAAACAAAAAQUAAAARbG9nRW50cnlEYXRhVmFsdWUDCQAAAAAAAAIFAAAAB2Fzc2V0SWQFAAAABmJhc2VJZAQAAAAIaW5BbW91bnQJAQAAAA52YWx1ZU9yTWF4aW11bQAAAAIFAAAAB2RlcG9zaXQJAABrAAAAAwUAAAAJYmFzZUZ1bmRzBQAAAA1zcHJlYWRQZXJjZW50CQAAZQAAAAIFAAAAB3BlcmNlbnQFAAAADXNwcmVhZFBlcmNlbnQEAAAACmJhc2VBbW91bnQFAAAACGluQW1vdW50BAAAAAtxdW90ZUFtb3VudAkAAGsAAAADBQAAAApxdW90ZUZ1bmRzBQAAAApiYXNlQW1vdW50CQAAZAAAAAIFAAAACWJhc2VGdW5kcwUAAAAKYmFzZUFtb3VudAQAAAAJZmVlQW1vdW50CQAAawAAAAMFAAAAC3F1b3RlQW1vdW50BQAAAApmZWVQZXJjZW50BQAAAAdwZXJjZW50BAAAAAp0ZWFtUmV3YXJkCQAAawAAAAMFAAAAC3F1b3RlQW1vdW50BQAAAApmZWVQZXJjZW50CQAAaAAAAAIAAAAAAAAAAAoFAAAAB3BlcmNlbnQEAAAACW91dEFtb3VudAkAAGUAAAACBQAAAAtxdW90ZUFtb3VudAUAAAAJZmVlQW1vdW50BAAAAAZyZWZ1bmQJAQAAAAh2YWxpZGF0ZQAAAAEJAABlAAAAAgUAAAAHZGVwb3NpdAUAAAAIaW5BbW91bnQEAAAADHByaWNlUGVyVW5pdAkAAGsAAAADBQAAAAtxdW90ZUFtb3VudAUAAAAHZGVjaW1hbAUAAAAKYmFzZUFtb3VudAQAAAARbG9nRW50cnlEYXRhVmFsdWUJAAS5AAAAAgkABEwAAAACAgAAAC5EZUZpIEZyYW5rbGluIChGTU1UKTogb3RjRXhjaGFuZ2UgKFNlbGwgT3JkZXI6CQAETAAAAAIFAAAACmJhc2VUaWNrZXIJAARMAAAAAgIAAAABLwkABEwAAAACCQABLAAAAAIFAAAAC3F1b3RlVGlja2VyAgAAAAQpID0+CQAETAAAAAICAAAABHNvbGQJAARMAAAAAgkBAAAADXRvRmxvYXRTdHJpbmcAAAACBQAAAAhpbkFtb3VudAUAAAALYmFzZURlY2ltYWwJAARMAAAAAgUAAAAKYmFzZVRpY2tlcgkABEwAAAACAgAAAALDlwkABEwAAAACAgAAAAliaWQgcHJpY2UJAARMAAAAAgkBAAAADXRvRmxvYXRTdHJpbmcAAAACBQAAAAxwcmljZVBlclVuaXQFAAAADHByaWNlRGVjaW1hbAkABEwAAAACAgAAAAE9CQAETAAAAAICAAAADG5ldCBwcm9jZWVkcwkABEwAAAACCQEAAAANdG9GbG9hdFN0cmluZwAAAAIFAAAACW91dEFtb3VudAUAAAAMcXVvdGVEZWNpbWFsCQAETAAAAAIFAAAAC3F1b3RlVGlja2VyCQAETAAAAAICAAAAASsJAARMAAAAAgIAAAAJdHJhZGUgZmVlCQAETAAAAAIJAQAAAA10b0Zsb2F0U3RyaW5nAAAAAgUAAAAJZmVlQW1vdW50BQAAAAxxdW90ZURlY2ltYWwJAARMAAAAAgUAAAALcXVvdGVUaWNrZXIFAAAAA25pbAIAAAABIAMDCQEAAAABIQAAAAEFAAAABHRlc3QJAABmAAAAAgUAAAAJb3V0QW1vdW50AAAAAAAAAAAABwkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAACW91dEFtb3VudAUAAAAHcXVvdGVJZAkABE0AAAACCQAETQAAAAIJAAROAAAAAgkBAAAAEWdldFNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAZyZWZ1bmQFAAAABmJhc2VJZAkBAAAAEWdldFNjcmlwdFRyYW5zZmVyAAAAAwUAAAAFZnRlYW0FAAAACnRlYW1SZXdhcmQFAAAAB3F1b3RlSWQJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAD2xvZ0VudHJ5RGF0YUtleQUAAAARbG9nRW50cnlEYXRhVmFsdWUJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABB0aW1lc3RhbXBEYXRhS2V5CAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAkAAAIAAAABBQAAABFsb2dFbnRyeURhdGFWYWx1ZQkAAAIAAAABCQAEuQAAAAIJAARMAAAAAgIAAAAYUGxlYXNlIGF0dGFjaCBvbmUgb2YgdGhlCQAETAAAAAIFAAAACmJhc2VUaWNrZXIJAARMAAAAAgIAAAACb3IJAARMAAAAAgUAAAALcXVvdGVUaWNrZXIJAARMAAAAAgIAAAAHYXNzZXRzLgUAAAADbmlsAgAAAAEgAAAAAWkBAAAADWdldE1hcmtldERhdGEAAAACAAAAB2JUaWNrZXIAAAAHcVRpY2tlcgQAAAAJYmFzZUluZGV4CQEAAAAKYXNzZXRJbmRleAAAAAEFAAAAB2JUaWNrZXIEAAAACnF1b3RlSW5kZXgJAQAAAAphc3NldEluZGV4AAAAAQUAAAAHcVRpY2tlcgQAAAAGYmFzZUlkCQABkQAAAAIFAAAACXBvcnRmb2xpbwUAAAAJYmFzZUluZGV4BAAAAApiYXNlVGlja2VyCQABkQAAAAIFAAAACWhpVGlja2VycwUAAAAJYmFzZUluZGV4BAAAAAdxdW90ZUlkCQABkQAAAAIFAAAACXBvcnRmb2xpbwUAAAAKcXVvdGVJbmRleAQAAAALcXVvdGVUaWNrZXIJAAGRAAAAAgUAAAAJaGlUaWNrZXJzBQAAAApxdW90ZUluZGV4AwMDCQEAAAAJaXNEZWZpbmVkAAAAAQUAAAAGYmFzZUlkCQEAAAAPaXNBc3NldERpc2FibGVkAAAAAQUAAAAGYmFzZUlkBwYDCQEAAAAJaXNEZWZpbmVkAAAAAQUAAAAHcXVvdGVJZAkBAAAAD2lzQXNzZXREaXNhYmxlZAAAAAEFAAAAB3F1b3RlSWQHCQAAAgAA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", "height": 2292962, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DKzAK5nQtjx5YqkDVZPRAq2BnSE1AjpR4zCkEvBBKndx Next: GmQHohw4oXgsiTVoUixtGTyvfxn1tQLtTWFjAAspARh8 Diff:
OldNewDifferences
77
88 let decimal = 100000000
99
10-let teamFeePercent = 5
11-
12-let tradeFeePercent = 50
10+let feePercent = 50
1311
1412 let leasePercent = 8000
1513
1614 let fdappPercent = 20000
1715
18-let halfSpreadPercent = getIntegerValue(this, "halfSpread")
16+let spreadPercent = valueOrElse(getInteger(this, "halfSpread"), 500)
1917
2018 let adminPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k'
2119
201199 let baseDecimal = assetDecimal(baseId)
202200 let quoteDecimal = assetDecimal(quoteId)
203201 let priceDecimal = fraction(quoteDecimal, decimal, baseDecimal)
204- let $t098149864 = getAttachment(i.payments)
205- let deposit = $t098149864._1
206- let assetId = $t098149864._2
207- let $t098699952 = getMarketFunds(baseId, quoteId)
208- let baseFunds = $t098699952._1
209- let quoteFunds = $t098699952._2
202+ let $t097379787 = getAttachment(i.payments)
203+ let deposit = $t097379787._1
204+ let assetId = $t097379787._2
205+ let $t097929875 = getMarketFunds(baseId, quoteId)
206+ let baseFunds = $t097929875._1
207+ let quoteFunds = $t097929875._2
210208 if ((assetId == quoteId))
211209 then {
212- let inAmount = valueOrMaximum(deposit, fraction(quoteFunds, halfSpreadPercent, percent))
213- let teamFee = fraction(inAmount, teamFeePercent, percent)
214- let tradeFee = fraction(inAmount, tradeFeePercent, percent)
215- let quoteAmount = (inAmount - tradeFee)
210+ let inAmount = valueOrMaximum(deposit, fraction(quoteFunds, spreadPercent, percent))
211+ let feeAmount = fraction(inAmount, feePercent, percent)
212+ let teamReward = fraction(inAmount, feePercent, (10 * percent))
213+ let quoteAmount = (inAmount - feeAmount)
216214 let baseAmount = fraction(baseFunds, quoteAmount, (quoteFunds + quoteAmount))
217215 let outAmount = baseAmount
218216 let refund = validate((deposit - inAmount))
219217 let pricePerUnit = fraction(quoteAmount, decimal, baseAmount)
220- let logEntryDataValue = makeString(["DeFi Franklin (FMMT): otcExchange (Buy Order:", baseTicker, "/", (quoteTicker + ") =>"), "bought", toFloatString(outAmount, baseDecimal), baseTicker, "×", "ask price", toFloatString(pricePerUnit, priceDecimal), "=", "cost price", toFloatString(inAmount, quoteDecimal), quoteTicker, "−", "trade fee", toFloatString(tradeFee, quoteDecimal), quoteTicker], " ")
218+ let logEntryDataValue = makeString(["DeFi Franklin (FMMT): otcExchange (Buy Order:", baseTicker, "/", (quoteTicker + ") =>"), "bought", toFloatString(outAmount, baseDecimal), baseTicker, "×", "ask price", toFloatString(pricePerUnit, priceDecimal), "=", "cost price", toFloatString(inAmount, quoteDecimal), quoteTicker, "−", "trade fee", toFloatString(feeAmount, quoteDecimal), quoteTicker], " ")
221219 if (if (!(test))
222220 then (outAmount > 0)
223221 else false)
224- then [ScriptTransfer(i.caller, outAmount, baseId), (((getScriptTransfer(i.caller, refund, quoteId) ++ getScriptTransfer(fteam, teamFee, quoteId)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))]
222+ then [ScriptTransfer(i.caller, outAmount, baseId), (((getScriptTransfer(i.caller, refund, quoteId) ++ getScriptTransfer(fteam, teamReward, quoteId)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))]
225223 else throw(logEntryDataValue)
226224 }
227225 else if ((assetId == baseId))
228226 then {
229- let inAmount = valueOrMaximum(deposit, fraction(baseFunds, halfSpreadPercent, (percent - halfSpreadPercent)))
227+ let inAmount = valueOrMaximum(deposit, fraction(baseFunds, spreadPercent, (percent - spreadPercent)))
230228 let baseAmount = inAmount
231229 let quoteAmount = fraction(quoteFunds, baseAmount, (baseFunds + baseAmount))
232- let teamFee = fraction(quoteAmount, teamFeePercent, percent)
233- let tradeFee = fraction(quoteAmount, tradeFeePercent, percent)
234- let outAmount = (quoteAmount - tradeFee)
230+ let feeAmount = fraction(quoteAmount, feePercent, percent)
231+ let teamReward = fraction(quoteAmount, feePercent, (10 * percent))
232+ let outAmount = (quoteAmount - feeAmount)
235233 let refund = validate((deposit - inAmount))
236234 let pricePerUnit = fraction(quoteAmount, decimal, baseAmount)
237- let logEntryDataValue = makeString(["DeFi Franklin (FMMT): otcExchange (Sell Order:", baseTicker, "/", (quoteTicker + ") =>"), "sold", toFloatString(inAmount, baseDecimal), baseTicker, "×", "bid price", toFloatString(pricePerUnit, priceDecimal), "=", "net proceeds", toFloatString(outAmount, quoteDecimal), quoteTicker, "+", "trade fee", toFloatString(tradeFee, quoteDecimal), quoteTicker], " ")
235+ let logEntryDataValue = makeString(["DeFi Franklin (FMMT): otcExchange (Sell Order:", baseTicker, "/", (quoteTicker + ") =>"), "sold", toFloatString(inAmount, baseDecimal), baseTicker, "×", "bid price", toFloatString(pricePerUnit, priceDecimal), "=", "net proceeds", toFloatString(outAmount, quoteDecimal), quoteTicker, "+", "trade fee", toFloatString(feeAmount, quoteDecimal), quoteTicker], " ")
238236 if (if (!(test))
239237 then (outAmount > 0)
240238 else false)
241- then [ScriptTransfer(i.caller, outAmount, quoteId), (((getScriptTransfer(i.caller, refund, baseId) ++ getScriptTransfer(fteam, teamFee, quoteId)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))]
239+ then [ScriptTransfer(i.caller, outAmount, quoteId), (((getScriptTransfer(i.caller, refund, baseId) ++ getScriptTransfer(fteam, teamReward, quoteId)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))]
242240 else throw(logEntryDataValue)
243241 }
244242 else throw(makeString(["Please attach one of the", baseTicker, "or", quoteTicker, "assets."], " "))
264262 else false)
265263 then throw(makeString(["The", baseTicker, "/", quoteTicker, "market pair is temporarily suspended."], " "))
266264 else {
267- let spreadDecimal = fraction(decimal, halfSpreadPercent, percent)
268- let $t01388713948 = getMarketFunds(baseId, quoteId)
269- let baseFunds = $t01388713948._1
270- let quoteFunds = $t01388713948._2
265+ let spreadDecimal = fraction(decimal, spreadPercent, percent)
266+ let $t01380813869 = getMarketFunds(baseId, quoteId)
267+ let baseFunds = $t01380813869._1
268+ let quoteFunds = $t01380813869._2
271269 let minBidPrice = fraction(quoteFunds, (decimal - spreadDecimal), baseFunds)
272270 let maxAskPrice = -(fraction(quoteFunds, -((decimal + spreadDecimal)), baseFunds))
273271 let avgPrice = (((minBidPrice + 1) / 2) + (maxAskPrice / 2))
274272 let priceDecimal = fraction(assetDecimal(quoteId), decimal, assetDecimal(baseId))
275- let maxBidAmount = fraction(baseFunds, halfSpreadPercent, (percent - halfSpreadPercent))
276- let maxAskAmount = fraction(quoteFunds, halfSpreadPercent, percent)
277- throw(makeString(["DeFi Franklin (FMMT): getMarketData (Trade Pair:", baseTicker, "/", (quoteTicker + ") =>"), "avg price:", toFloatString(avgPrice, priceDecimal), "±", (toFloatString((halfSpreadPercent / 10), (percent / 1000)) + "%;"), "bid amount:", toFloatString(maxBidAmount, assetDecimal(baseId)), (baseTicker + ";"), "ask amount:", toFloatString(maxAskAmount, assetDecimal(quoteId)), (quoteTicker + ";"), "trade fee: 0.05% in", quoteTicker], " "))
273+ let maxBidAmount = fraction(baseFunds, spreadPercent, (percent - spreadPercent))
274+ let maxAskAmount = fraction(quoteFunds, spreadPercent, percent)
275+ throw(makeString(["DeFi Franklin (FMMT): getMarketData (Trade Pair:", baseTicker, "/", (quoteTicker + ") =>"), "avg price:", toFloatString(avgPrice, priceDecimal), "±", (toFloatString((spreadPercent / 10), (percent / 1000)) + "%;"), "bid amount:", toFloatString(maxBidAmount, assetDecimal(baseId)), (baseTicker + ";"), "ask amount:", toFloatString(maxAskAmount, assetDecimal(quoteId)), (quoteTicker + ";"), "trade fee: 0.05% in", quoteTicker], " "))
278276 }
279277 }
280278
282280
283281 @Callable(i)
284282 func quickWithdrawal () = {
285- let $t01504015090 = getAttachment(i.payments)
286- let deposit = $t01504015090._1
287- let assetId = $t01504015090._2
283+ let $t01494514995 = getAttachment(i.payments)
284+ let deposit = $t01494514995._1
285+ let assetId = $t01494514995._2
288286 let halfFunds = fraction(tradeSupply, (fdappPercent / 2), percent)
289287 if ((assetId == fmmtAsset))
290288 then {
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let scriptVersion = "v4.02-final_20201020"
55
66 let percent = 100000
77
88 let decimal = 100000000
99
10-let teamFeePercent = 5
11-
12-let tradeFeePercent = 50
10+let feePercent = 50
1311
1412 let leasePercent = 8000
1513
1614 let fdappPercent = 20000
1715
18-let halfSpreadPercent = getIntegerValue(this, "halfSpread")
16+let spreadPercent = valueOrElse(getInteger(this, "halfSpread"), 500)
1917
2018 let adminPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k'
2119
2220 let mmbotPublicKey = base58'62KBavoHK4TtCYmURFVeNC8j3gL8Jo7WwcrweoBLWofc'
2321
2422 let wxchgPublicKey = base58'9cpfKN9suPNvfeUNphzxXMjcnn974eme8ZhWUjaktzU5'
2523
2624 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'')
2725
2826 let actualSize = value(indexOf(guarantors, base58''))
2927
3028 let minSignatures = ((actualSize / 2) + (actualSize % 2))
3129
3230 let btcAsset = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
3331
3432 let ethAsset = base58'474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu'
3533
3634 let usdtAsset = base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ'
3735
3836 let fmmtAsset = base58'7sqT7HvCVtcrCTQV72FM5so65wjzM164rzoqDZRsRXg7'
3937
4038 let xfeeAsset = base58'5EMfVQiB8NF4HuhaXrZzDM637whWuVBsduq59ZaCSNqk'
4139
4240 let portfolio = ([usdtAsset, btcAsset, unit, ethAsset, base58'zMFqXuoyrn5w17PFurTqxB7GsS71fp9dfk6XFwxbPCy', base58'HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk', base58'B3uGHFRpSUuGEDWjqB9LWWxafQj8VTvpMucEyoxzws5H', base58'5WvPKSJXzVE2orvbkJ8wsQmmQKqTv9sGBPksV4adViw3', base58'BrjUWjndUanm5VsJkbUip8VRYy6LWJePtxya3FNv4TQa'] :+ fmmtAsset)
4341
4442 let loTickers = ["usdt", "btc", "waves", "eth", "bch", "ltc", "dash", "xmr", "zec", "fmmt"]
4543
4644 let hiTickers = ["USDT", "BTC", "WAVES", "ETH", "BCH", "LTC", "DASH", "XMR", "ZEC", "FMMT"]
4745
4846 let fixedAssets = [btcAsset, fmmtAsset]
4947
5048 let fixedAssetsSize = size(fixedAssets)
5149
5250 let otherAssetsSize = (size(portfolio) - fixedAssetsSize)
5351
5452 let fsale = Address(base58'3P6VEUyoBE1qdNuhUzbnFRLThuoe1pzS4B2')
5553
5654 let fdapp = Address(base58'3PFRxT9CXG81Evr8MeVJGnQSjFP6cq1SHWL')
5755
5856 let fcold = Address(base58'3PDUqa5qmnhPJfKPnBzUd5PisA42iawV6W7')
5957
6058 let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x')
6159
6260 let fteam = Address(base58'3P3TMgAUVtJKWHxQMdt8Ao6A1qnRyVmCSr2')
6361
6462 let saleFunds = (10000 * 100000)
6563
6664 let circSupply = ((value(assetInfo(fmmtAsset)).quantity - (assetBalance(this, fmmtAsset) + assetBalance(fcold, fmmtAsset))) - saleFunds)
6765
6866 let fteamFunds = assetBalance(fteam, fmmtAsset)
6967
7068 let tradeSupply = max([0, (circSupply - fteamFunds)])
7169
7270 let wavesRegular = wavesBalance(this).regular
7371
7472 let wavesAvailable = wavesBalance(this).available
7573
7674 let logEntryDataKey = "logEntry"
7775
7876 let timestampDataKey = "timestamp"
7977
8078 let versionDataKey = "scriptVersion"
8179
8280 func validate (posValue) = max([0, posValue])
8381
8482
8583 func valueOrMaximum (intValue,maxValue) = min([intValue, maxValue])
8684
8785
8886 func toFloatString (num,dec) = toUtf8String(if ((num == 0))
8987 then base58'q'
9088 else if ((num > 0))
9189 then ((toBytes(toString((num / dec))) + base58'o') + drop(toBytes(toString(((num % dec) + dec))), 1))
9290 else throw("Negative amounts are not allowed! Send a PM to the administrator ..."))
9391
9492
9593 func difference (fdappFunds,fcoldFunds) = {
9694 let minAmount = fraction(fcoldFunds, (percent / 100), (percent - fdappPercent))
9795 let diffAmount = (fdappFunds - fraction((fdappFunds + fcoldFunds), fdappPercent, percent))
9896 if ((minAmount > diffAmount))
9997 then 0
10098 else diffAmount
10199 }
102100
103101
104102 func rebalancingAmount (assetId) = match assetId {
105103 case id: ByteVector =>
106104 difference(assetBalance(this, id), assetBalance(fcold, id))
107105 case _ =>
108106 difference(wavesBalance(this).regular, wavesBalance(fcold).regular)
109107 }
110108
111109
112110 func getScriptTransfer (address,amount,assetId) = if ((amount > 0))
113111 then [ScriptTransfer(address, amount, assetId)]
114112 else nil
115113
116114
117115 func toDataKey (assetId) = toBase58String(valueOrElse(assetId, base58'WAVES'))
118116
119117
120118 func isAssetDisabled (assetId) = if (!(containsElement(fixedAssets, assetId)))
121119 then !(valueOrElse(getBoolean(admin, toDataKey(assetId)), false))
122120 else false
123121
124122
125123 func assetMult (assetId) = if ((assetId == fmmtAsset))
126124 then 1
127125 else if (containsElement(fixedAssets, assetId))
128126 then fixedAssetsSize
129127 else (fixedAssetsSize * otherAssetsSize)
130128
131129
132130 func assetIndex (ticker) = valueOrErrorMessage(if ((size(ticker) > 16))
133131 then indexOf(portfolio, fromBase58String(ticker))
134132 else valueOrElse(indexOf(loTickers, ticker), indexOf(hiTickers, ticker)), makeString(["The ", ticker, " asset is not supported!"], "\""))
135133
136134
137135 func assetDecimal (assetId) = match assetId {
138136 case id: ByteVector =>
139137 if ((id == fmmtAsset))
140138 then 100000
141139 else if ((id == usdtAsset))
142140 then 1000000
143141 else decimal
144142 case _ =>
145143 decimal
146144 }
147145
148146
149147 func assetFunds (assetId) = match assetId {
150148 case id: ByteVector =>
151149 if ((id == fmmtAsset))
152150 then tradeSupply
153151 else (assetBalance(this, id) + assetBalance(fcold, id))
154152 case _ =>
155153 (wavesBalance(this).regular + wavesBalance(fcold).regular)
156154 }
157155
158156
159157 func getAttachment (payments) = if ((size(payments) != 1))
160158 then $Tuple2(0, base58'')
161159 else $Tuple2(payments[0].amount, payments[0].assetId)
162160
163161
164162 func getMarketFunds (baseId,quoteId) = {
165163 let baseMult = assetMult(baseId)
166164 let quoteMult = assetMult(quoteId)
167165 let marketMult = max([baseMult, quoteMult])
168166 $Tuple2(fraction(assetFunds(baseId), baseMult, marketMult), fraction(assetFunds(quoteId), quoteMult, marketMult))
169167 }
170168
171169
172170 func withdrawalAmount (assetId,fmmtAmount) = match assetId {
173171 case id: ByteVector =>
174172 let total = (assetBalance(this, id) + assetBalance(fcold, id))
175173 let amount = fraction(total, fmmtAmount, tradeSupply)
176174 if ((assetBalance(this, id) >= amount))
177175 then amount
178176 else throw("Not enough balance! Send a PM to the administrator or guarantor ...")
179177 case _ =>
180178 let total = (wavesBalance(this).regular + wavesBalance(fcold).regular)
181179 let amount = fraction(total, fmmtAmount, tradeSupply)
182180 if ((wavesBalance(this).available >= amount))
183181 then amount
184182 else throw("Not enough balance! Send a PM to the administrator or guarantor ...")
185183 }
186184
187185
188186 @Callable(i)
189187 func otcExchange (test,bTicker,qTicker) = {
190188 let baseIndex = assetIndex(bTicker)
191189 let quoteIndex = assetIndex(qTicker)
192190 let baseId = portfolio[baseIndex]
193191 let baseTicker = hiTickers[baseIndex]
194192 let quoteId = portfolio[quoteIndex]
195193 let quoteTicker = hiTickers[quoteIndex]
196194 if (if (isAssetDisabled(baseId))
197195 then true
198196 else isAssetDisabled(quoteId))
199197 then throw(makeString(["The", baseTicker, "/", quoteTicker, " market pair is temporarily suspended."], " "))
200198 else {
201199 let baseDecimal = assetDecimal(baseId)
202200 let quoteDecimal = assetDecimal(quoteId)
203201 let priceDecimal = fraction(quoteDecimal, decimal, baseDecimal)
204- let $t098149864 = getAttachment(i.payments)
205- let deposit = $t098149864._1
206- let assetId = $t098149864._2
207- let $t098699952 = getMarketFunds(baseId, quoteId)
208- let baseFunds = $t098699952._1
209- let quoteFunds = $t098699952._2
202+ let $t097379787 = getAttachment(i.payments)
203+ let deposit = $t097379787._1
204+ let assetId = $t097379787._2
205+ let $t097929875 = getMarketFunds(baseId, quoteId)
206+ let baseFunds = $t097929875._1
207+ let quoteFunds = $t097929875._2
210208 if ((assetId == quoteId))
211209 then {
212- let inAmount = valueOrMaximum(deposit, fraction(quoteFunds, halfSpreadPercent, percent))
213- let teamFee = fraction(inAmount, teamFeePercent, percent)
214- let tradeFee = fraction(inAmount, tradeFeePercent, percent)
215- let quoteAmount = (inAmount - tradeFee)
210+ let inAmount = valueOrMaximum(deposit, fraction(quoteFunds, spreadPercent, percent))
211+ let feeAmount = fraction(inAmount, feePercent, percent)
212+ let teamReward = fraction(inAmount, feePercent, (10 * percent))
213+ let quoteAmount = (inAmount - feeAmount)
216214 let baseAmount = fraction(baseFunds, quoteAmount, (quoteFunds + quoteAmount))
217215 let outAmount = baseAmount
218216 let refund = validate((deposit - inAmount))
219217 let pricePerUnit = fraction(quoteAmount, decimal, baseAmount)
220- let logEntryDataValue = makeString(["DeFi Franklin (FMMT): otcExchange (Buy Order:", baseTicker, "/", (quoteTicker + ") =>"), "bought", toFloatString(outAmount, baseDecimal), baseTicker, "×", "ask price", toFloatString(pricePerUnit, priceDecimal), "=", "cost price", toFloatString(inAmount, quoteDecimal), quoteTicker, "−", "trade fee", toFloatString(tradeFee, quoteDecimal), quoteTicker], " ")
218+ let logEntryDataValue = makeString(["DeFi Franklin (FMMT): otcExchange (Buy Order:", baseTicker, "/", (quoteTicker + ") =>"), "bought", toFloatString(outAmount, baseDecimal), baseTicker, "×", "ask price", toFloatString(pricePerUnit, priceDecimal), "=", "cost price", toFloatString(inAmount, quoteDecimal), quoteTicker, "−", "trade fee", toFloatString(feeAmount, quoteDecimal), quoteTicker], " ")
221219 if (if (!(test))
222220 then (outAmount > 0)
223221 else false)
224- then [ScriptTransfer(i.caller, outAmount, baseId), (((getScriptTransfer(i.caller, refund, quoteId) ++ getScriptTransfer(fteam, teamFee, quoteId)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))]
222+ then [ScriptTransfer(i.caller, outAmount, baseId), (((getScriptTransfer(i.caller, refund, quoteId) ++ getScriptTransfer(fteam, teamReward, quoteId)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))]
225223 else throw(logEntryDataValue)
226224 }
227225 else if ((assetId == baseId))
228226 then {
229- let inAmount = valueOrMaximum(deposit, fraction(baseFunds, halfSpreadPercent, (percent - halfSpreadPercent)))
227+ let inAmount = valueOrMaximum(deposit, fraction(baseFunds, spreadPercent, (percent - spreadPercent)))
230228 let baseAmount = inAmount
231229 let quoteAmount = fraction(quoteFunds, baseAmount, (baseFunds + baseAmount))
232- let teamFee = fraction(quoteAmount, teamFeePercent, percent)
233- let tradeFee = fraction(quoteAmount, tradeFeePercent, percent)
234- let outAmount = (quoteAmount - tradeFee)
230+ let feeAmount = fraction(quoteAmount, feePercent, percent)
231+ let teamReward = fraction(quoteAmount, feePercent, (10 * percent))
232+ let outAmount = (quoteAmount - feeAmount)
235233 let refund = validate((deposit - inAmount))
236234 let pricePerUnit = fraction(quoteAmount, decimal, baseAmount)
237- let logEntryDataValue = makeString(["DeFi Franklin (FMMT): otcExchange (Sell Order:", baseTicker, "/", (quoteTicker + ") =>"), "sold", toFloatString(inAmount, baseDecimal), baseTicker, "×", "bid price", toFloatString(pricePerUnit, priceDecimal), "=", "net proceeds", toFloatString(outAmount, quoteDecimal), quoteTicker, "+", "trade fee", toFloatString(tradeFee, quoteDecimal), quoteTicker], " ")
235+ let logEntryDataValue = makeString(["DeFi Franklin (FMMT): otcExchange (Sell Order:", baseTicker, "/", (quoteTicker + ") =>"), "sold", toFloatString(inAmount, baseDecimal), baseTicker, "×", "bid price", toFloatString(pricePerUnit, priceDecimal), "=", "net proceeds", toFloatString(outAmount, quoteDecimal), quoteTicker, "+", "trade fee", toFloatString(feeAmount, quoteDecimal), quoteTicker], " ")
238236 if (if (!(test))
239237 then (outAmount > 0)
240238 else false)
241- then [ScriptTransfer(i.caller, outAmount, quoteId), (((getScriptTransfer(i.caller, refund, baseId) ++ getScriptTransfer(fteam, teamFee, quoteId)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))]
239+ then [ScriptTransfer(i.caller, outAmount, quoteId), (((getScriptTransfer(i.caller, refund, baseId) ++ getScriptTransfer(fteam, teamReward, quoteId)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))]
242240 else throw(logEntryDataValue)
243241 }
244242 else throw(makeString(["Please attach one of the", baseTicker, "or", quoteTicker, "assets."], " "))
245243 }
246244 }
247245
248246
249247
250248 @Callable(i)
251249 func getMarketData (bTicker,qTicker) = {
252250 let baseIndex = assetIndex(bTicker)
253251 let quoteIndex = assetIndex(qTicker)
254252 let baseId = portfolio[baseIndex]
255253 let baseTicker = hiTickers[baseIndex]
256254 let quoteId = portfolio[quoteIndex]
257255 let quoteTicker = hiTickers[quoteIndex]
258256 if (if (if (isDefined(baseId))
259257 then isAssetDisabled(baseId)
260258 else false)
261259 then true
262260 else if (isDefined(quoteId))
263261 then isAssetDisabled(quoteId)
264262 else false)
265263 then throw(makeString(["The", baseTicker, "/", quoteTicker, "market pair is temporarily suspended."], " "))
266264 else {
267- let spreadDecimal = fraction(decimal, halfSpreadPercent, percent)
268- let $t01388713948 = getMarketFunds(baseId, quoteId)
269- let baseFunds = $t01388713948._1
270- let quoteFunds = $t01388713948._2
265+ let spreadDecimal = fraction(decimal, spreadPercent, percent)
266+ let $t01380813869 = getMarketFunds(baseId, quoteId)
267+ let baseFunds = $t01380813869._1
268+ let quoteFunds = $t01380813869._2
271269 let minBidPrice = fraction(quoteFunds, (decimal - spreadDecimal), baseFunds)
272270 let maxAskPrice = -(fraction(quoteFunds, -((decimal + spreadDecimal)), baseFunds))
273271 let avgPrice = (((minBidPrice + 1) / 2) + (maxAskPrice / 2))
274272 let priceDecimal = fraction(assetDecimal(quoteId), decimal, assetDecimal(baseId))
275- let maxBidAmount = fraction(baseFunds, halfSpreadPercent, (percent - halfSpreadPercent))
276- let maxAskAmount = fraction(quoteFunds, halfSpreadPercent, percent)
277- throw(makeString(["DeFi Franklin (FMMT): getMarketData (Trade Pair:", baseTicker, "/", (quoteTicker + ") =>"), "avg price:", toFloatString(avgPrice, priceDecimal), "±", (toFloatString((halfSpreadPercent / 10), (percent / 1000)) + "%;"), "bid amount:", toFloatString(maxBidAmount, assetDecimal(baseId)), (baseTicker + ";"), "ask amount:", toFloatString(maxAskAmount, assetDecimal(quoteId)), (quoteTicker + ";"), "trade fee: 0.05% in", quoteTicker], " "))
273+ let maxBidAmount = fraction(baseFunds, spreadPercent, (percent - spreadPercent))
274+ let maxAskAmount = fraction(quoteFunds, spreadPercent, percent)
275+ throw(makeString(["DeFi Franklin (FMMT): getMarketData (Trade Pair:", baseTicker, "/", (quoteTicker + ") =>"), "avg price:", toFloatString(avgPrice, priceDecimal), "±", (toFloatString((spreadPercent / 10), (percent / 1000)) + "%;"), "bid amount:", toFloatString(maxBidAmount, assetDecimal(baseId)), (baseTicker + ";"), "ask amount:", toFloatString(maxAskAmount, assetDecimal(quoteId)), (quoteTicker + ";"), "trade fee: 0.05% in", quoteTicker], " "))
278276 }
279277 }
280278
281279
282280
283281 @Callable(i)
284282 func quickWithdrawal () = {
285- let $t01504015090 = getAttachment(i.payments)
286- let deposit = $t01504015090._1
287- let assetId = $t01504015090._2
283+ let $t01494514995 = getAttachment(i.payments)
284+ let deposit = $t01494514995._1
285+ let assetId = $t01494514995._2
288286 let halfFunds = fraction(tradeSupply, (fdappPercent / 2), percent)
289287 if ((assetId == fmmtAsset))
290288 then {
291289 let inAmount = valueOrMaximum(deposit, halfFunds)
292290 let refund = validate((deposit - inAmount))
293291 let scriptTransfers = [ScriptTransfer(i.caller, withdrawalAmount(portfolio[0], inAmount), portfolio[0]), ScriptTransfer(i.caller, withdrawalAmount(portfolio[1], inAmount), portfolio[1]), ScriptTransfer(i.caller, withdrawalAmount(portfolio[2], inAmount), portfolio[2]), ScriptTransfer(i.caller, withdrawalAmount(portfolio[3], inAmount), portfolio[3]), ScriptTransfer(i.caller, withdrawalAmount(portfolio[4], inAmount), portfolio[4]), ScriptTransfer(i.caller, withdrawalAmount(portfolio[5], inAmount), portfolio[5]), ScriptTransfer(i.caller, withdrawalAmount(portfolio[6], inAmount), portfolio[6]), ScriptTransfer(i.caller, withdrawalAmount(portfolio[7], inAmount), portfolio[7]), ScriptTransfer(i.caller, withdrawalAmount(portfolio[8], inAmount), portfolio[8])]
294292 let logEntryDataValue = makeString(["DeFi Franklin (FMMT): quickWithdrawal (Paid Amount:", toFloatString(inAmount, 100000), "FMMT) => tx:", toBase58String(i.transactionId)], " ")
295293 (((scriptTransfers ++ getScriptTransfer(i.caller, refund, fmmtAsset)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
296294 }
297295 else throw(makeString(["Please attach a payment (max amount:", toFloatString(halfFunds, 100000), "FMMT)."], " "))
298296 }
299297
300298
301299
302300 @Callable(i)
303301 func autoRebalance () = {
304302 let wavesDifference = rebalancingAmount(portfolio[2])
305303 if (if (if ((i.callerPublicKey != adminPublicKey))
306304 then (i.callerPublicKey != mmbotPublicKey)
307305 else false)
308306 then !(containsElement(guarantors, i.callerPublicKey))
309307 else false)
310308 then throw("This action can only be performed by an administrator or guarantor!")
311309 else if ((wavesDifference > wavesAvailable))
312310 then throw("Not enough Waves balance! Send a PM to the administrator or cancel the lease.")
313311 else if ((size(i.payments) > 0))
314312 then throw("Don't attach payment when calling this function ...")
315313 else {
316314 let fmmtDifference = (assetBalance(this, fmmtAsset) - saleFunds)
317315 let scriptTransfers = (((((((((getScriptTransfer(fcold, rebalancingAmount(portfolio[0]), portfolio[0]) ++ getScriptTransfer(fcold, rebalancingAmount(portfolio[1]), portfolio[1])) ++ getScriptTransfer(fcold, wavesDifference, unit)) ++ getScriptTransfer(fcold, rebalancingAmount(portfolio[3]), portfolio[3])) ++ getScriptTransfer(fcold, rebalancingAmount(portfolio[4]), portfolio[4])) ++ getScriptTransfer(fcold, rebalancingAmount(portfolio[5]), portfolio[5])) ++ getScriptTransfer(fcold, rebalancingAmount(portfolio[6]), portfolio[6])) ++ getScriptTransfer(fcold, rebalancingAmount(portfolio[7]), portfolio[7])) ++ getScriptTransfer(fcold, rebalancingAmount(portfolio[8]), portfolio[8])) ++ getScriptTransfer(fcold, fmmtDifference, fmmtAsset))
318316 let logEntryDataValue = ("DeFi Franklin (FMMT): autoRebalance () => tx: " + toBase58String(i.transactionId))
319317 if ((size(scriptTransfers) > 0))
320318 then (((scriptTransfers :+ ScriptTransfer(i.caller, 500000, unit)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
321319 else throw("There are currently no transfers available.")
322320 }
323321 }
324322
325323
326324
327325 @Callable(i)
328326 func setScriptVersion () = if ((i.callerPublicKey != adminPublicKey))
329327 then throw("This action can only be performed by an administrator!")
330328 else if ((size(i.payments) > 0))
331329 then throw("Don't attach payment when calling this function ...")
332330 else {
333331 let oldVersion = valueOrElse(getString(this, versionDataKey), "")
334332 let versionList = split(drop(scriptVersion, 1), "_")
335333 let logEntryDataValue = makeString(["DeFi Franklin (FMMT): setScriptVersion () =>", "version:", versionList[0], "(updated:", (makeString([take(versionList[1], 4), take(drop(versionList[1], 4), 2), drop(versionList[1], 6)], "-") + ")")], " ")
336334 if ((oldVersion != scriptVersion))
337335 then [ScriptTransfer(i.caller, 500000, unit), StringEntry(versionDataKey, scriptVersion), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)]
338336 else throw(("The script version has already been updated: " + scriptVersion))
339337 }
340338
341339
342340 @Verifier(tx)
343341 func verify () = {
344342 let isValidOwner = sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
345343 let isValidMMBot = if (isValidOwner)
346344 then true
347345 else sigVerify_8Kb(tx.bodyBytes, tx.proofs[1], mmbotPublicKey)
348346 let isValidAdmin = if (isValidOwner)
349347 then true
350348 else sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], adminPublicKey)
351349 let validGuarantors = (((((if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], guarantors[0]))
352350 then 1
353351 else 0) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[2], guarantors[1]))
354352 then 1
355353 else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[3], guarantors[2]))
356354 then 1
357355 else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[4], guarantors[3]))
358356 then 1
359357 else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[5], guarantors[4]))
360358 then 1
361359 else 0))
362360 let anyValidGuarantor = (validGuarantors > 0)
363361 let isValidGuarantors = (validGuarantors >= minSignatures)
364362 let wavesLease = (wavesRegular - wavesAvailable)
365363 let wavesFunds = (wavesRegular + wavesBalance(fcold).regular)
366364 let maxSaleAmount = validate((saleFunds - assetBalance(this, fmmtAsset)))
367365 let maxLeaseAmount = validate((fraction(wavesFunds, leasePercent, percent) - wavesLease))
368366 match tx {
369367 case o: Order =>
370368 if (if (if (isValidMMBot)
371369 then if (if (if ((o.orderType == Buy))
372370 then (o.assetPair.priceAsset != xfeeAsset)
373371 else false)
374372 then containsElement(portfolio, o.assetPair.amountAsset)
375373 else false)
376374 then true
377375 else if (if ((o.orderType == Sell))
378376 then (o.assetPair.amountAsset != xfeeAsset)
379377 else false)
380378 then containsElement(portfolio, o.assetPair.priceAsset)
381379 else false
382380 else false)
383381 then !(isDefined(o.matcherFeeAssetId))
384382 else false)
385383 then (o.matcherPublicKey == wxchgPublicKey)
386384 else false
387385 case t: TransferTransaction =>
388386 if (if (if (if (isValidOwner)
389387 then !(containsElement(portfolio, t.assetId))
390388 else false)
391389 then !(containsElement(portfolio, t.feeAssetId))
392390 else false)
393391 then true
394392 else if (if (if (isValidAdmin)
395393 then (t.assetId == fmmtAsset)
396394 else false)
397395 then (maxSaleAmount >= t.amount)
398396 else false)
399397 then (addressFromRecipient(t.recipient) == fsale)
400398 else false)
401399 then true
402400 else if (if (if (anyValidGuarantor)
403401 then (t.assetId != fmmtAsset)
404402 else false)
405403 then containsElement(portfolio, t.assetId)
406404 else false)
407405 then (addressFromRecipient(t.recipient) == fcold)
408406 else false
409407 case l: LeaseTransaction =>
410408 if (isValidMMBot)
411409 then (maxLeaseAmount >= l.amount)
412410 else false
413411 case _: LeaseCancelTransaction =>
414412 if (isValidMMBot)
415413 then true
416414 else anyValidGuarantor
417415 case _: SetScriptTransaction|DataTransaction =>
418416 if (isValidAdmin)
419417 then isValidGuarantors
420418 else false
421419 case _ =>
422420 false
423421 }
424422 }
425423

github/deemru/w8io/6500d08 
125.95 ms