tx · 7b6h3TcpRosYCzHEpdsUabBBsNHhg8ZihomaZhJQ21gm

3PFRxT9CXG81Evr8MeVJGnQSjFP6cq1SHWL:  -0.01400000 Waves

2020.10.19 02:16 [2290363] smart account 3PFRxT9CXG81Evr8MeVJGnQSjFP6cq1SHWL > SELF 0.00000000 Waves

{ "type": 13, "id": "7b6h3TcpRosYCzHEpdsUabBBsNHhg8ZihomaZhJQ21gm", "fee": 1400000, "feeAssetId": null, "timestamp": 1603062954189, "version": 2, "chainId": 87, "sender": "3PFRxT9CXG81Evr8MeVJGnQSjFP6cq1SHWL", "senderPublicKey": "Df9CNxLc26KjvgeE9TYkcT1ooBayf5PUfxNdgmFzD2WK", "proofs": [ "NiTYQ9ASdXkUrZaMehmT621bUnV4o4dA3TyyaLNnzTh8A3Ex4K59iZiYkJgWGgKNe9S385KEAgPbr4vQt7B9EL1", "3ZqiRCBUsFPcBVQqABmMcwkK9mNZG8AQmymmz1VRKhtHBsgKbZpqXhrsJQ15yWoHtGBvzgKAxkcm4ahKYwxwBgUY" ], "script": "base64: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c3NldElkCAUAAAALJHQwOTI5NTk0MjkAAAACXzIEAAAAC2Jhc2VEZWNpbWFsCQEAAAAMYXNzZXREZWNpbWFsAAAAAQUAAAAGYmFzZUlkBAAAAAxxdW90ZURlY2ltYWwJAQAAAAxhc3NldERlY2ltYWwAAAABBQAAAAdxdW90ZUlkBAAAAAxwcmljZURlY2ltYWwJAABrAAAAAwUAAAAMcXVvdGVEZWNpbWFsBQAAAAdkZWNpbWFsBQAAAAtiYXNlRGVjaW1hbAQAAAALJHQwOTU5Nzk2ODAJAQAAAA5nZXRNYXJrZXRGdW5kcwAAAAIFAAAABmJhc2VJZAUAAAAHcXVvdGVJZAQAAAAJYmFzZUZ1bmRzCAUAAAALJHQwOTU5Nzk2ODAAAAACXzEEAAAACnF1b3RlRnVuZHMIBQAAAAskdDA5NTk3OTY4MAAAAAJfMgMJAAAAAAAAAgUAAAAHYXNzZXRJZAUAAAAHcXVvdGVJZAQAAAAIaW5BbW91bnQJAQAAAA52YWx1ZU9yTWF4aW11bQAAAAIFAAAAB2RlcG9zaXQJAABrAAAAAwUAAAAKcXVvdGVGdW5kcwUAAAAKaGFsZlNwcmVhZAUAAAAHcGVyY2VudAQAAAAJZmVlQW1vdW50CQAAawAAAAMFAAAACGluQW1vdW50BQAAAAh0cmFkZUZlZQUAAAAHcGVyY2VudAQAAAANdGVhbUZlZUFtb3VudAkAAGsAAAADBQAAAAhpbkFtb3VudAUAAAAHdGVhbUZlZQUAAAAHcGVyY2VudAQAAAALcXVvdGVBbW91bnQJAABlAAAAAgUAAAAIaW5BbW91bnQFAAAACWZlZUFtb3VudAQAAAAKYmFzZUFtb3VudAkAAGsAAAADBQAAAAliYXNlRnVuZHMFAAAAC3F1b3RlQW1vdW50CQAAZAAAAAIFAAAACnF1b3RlRnVuZHMFAAAAC3F1b3RlQW1vdW50BAAAAAlvdXRBbW91bnQFAAAACmJhc2VBbW91bnQEAAAABnJlZnVuZAkBAAAACHZhbGlkYXRlAAAAAQkAAGUAAAACBQAAAAdkZXBvc2l0BQAAAAhpbkFtb3VudAQAAAAMcHJpY2VQZXJVbml0CQAAawAAAAMFAAAAC3F1b3RlQW1vdW50BQAAAAdkZWNpbWFsBQAAAApiYXNlQW1vdW50BAAAABFsb2dFbnRyeURhdGFWYWx1ZQkABLkAAAACCQAETAAAAAICAAAALURlRmkgRnJhbmtsaW4gKEZNTVQpOiBvdGNFeGNoYW5nZSAoQnV5IE9yZGVyOgkABEwAAAACBQAAAAhiYXNlQ29kZQkABEwAAAACAgAAAAEvCQAETAAAAAIJAAEsAAAAAgUAAAAJcXVvdGVDb2RlAgAAAAQpID0+CQAETAAAAAICAAAABmJvdWdodAkABEwAAAACCQEAAAANdG9GbG9hdFN0cmluZwAAAAIFAAAACW91dEFtb3VudAUAAAALYmFzZURlY2ltYWwJAARMAAAAAgUAAAAIYmFzZUNvZGUJAARMAAAAAgIAAAACw5cJAARMAAAAAgIAAAAJYXNrIHByaWNlCQAETAAAAAIJAQAAAA10b0Zsb2F0U3RyaW5nAAAAAgUAAAAMcHJpY2VQZXJVbml0BQAAAAxwcmljZURlY2ltYWwJAARMAAAAAgIAAAABPQkABEwAAAACAgAAAApjb3N0IHByaWNlCQAETAAAAAIJAQAAAA10b0Zsb2F0U3RyaW5nAAAAAgUAAAAIaW5BbW91bnQFAAAADHF1b3RlRGVjaW1hbAkABEwAAAACBQAAAAlxdW90ZUNvZGUJAARMAAAAAgIAAAAD4oiSCQAETAAAAAICAAAACXRyYWRlIGZlZQkABEwAAAACCQEAAAANdG9GbG9hdFN0cmluZwAAAAIFAAAACWZlZUFtb3VudAUAAAAMcXVvdGVEZWNpbWFsCQAETAAAAAIFAAAACXF1b3RlQ29kZQkABEwAAAACAgAAAAcoMC4wNSUpBQAAAANuaWwCAAAAASADAwkBAAAAASEAAAABBQAAAAR0ZXN0CQAAZgAAAAIFAAAACW91dEFtb3VudAAAAAAAAAAAAAcJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAlvdXRBbW91bnQFAAAABmJhc2VJZAkABE0AAAACCQAETQAAAAIJAAROAAAAAgkBAAAAEWdldFNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAZyZWZ1bmQFAAAAB3F1b3RlSWQJAQAAABFnZXRTY3JpcHRUcmFuc2ZlcgAAAAMFAAAABWZ0ZWFtBQAAAA10ZWFtRmVlQW1vdW50BQAAAAdxdW90ZUlkCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAA9sb2dFbnRyeURhdGFLZXkFAAAAEWxvZ0VudHJ5RGF0YVZhbHVlCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAQdGltZXN0YW1wRGF0YUtleQgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAJAAACAAAAAQUAAAARbG9nRW50cnlEYXRhVmFsdWUDCQAAAAAAAAIFAAAAB2Fzc2V0SWQFAAAABmJhc2VJZAQAAAAIaW5BbW91bnQJAQAAAA52YWx1ZU9yTWF4aW11bQAAAAIFAAAAB2RlcG9zaXQJAABrAAAAAwUAAAAJYmFzZUZ1bmRzBQAAAApoYWxmU3ByZWFkCQAAZQAAAAIFAAAAB3BlcmNlbnQFAAAACmhhbGZTcHJlYWQEAAAACmJhc2VBbW91bnQFAAAACGluQW1vdW50BAAAAAtxdW90ZUFtb3VudAkAAGsAAAADBQAAAApxdW90ZUZ1bmRzBQAAAApiYXNlQW1vdW50CQAAZAAAAAIFAAAACWJhc2VGdW5kcwUAAAAKYmFzZUFtb3VudAQAAAAJZmVlQW1vdW50CQAAawAAAAMFAAAAC3F1b3RlQW1vdW50BQAAAAh0cmFkZUZlZQUAAAAHcGVyY2VudAQAAAANdGVhbUZlZUFtb3VudAkAAGsAAAADBQAAAAtxdW90ZUFtb3VudAUAAAAHdGVhbUZlZQUAAAAHcGVyY2VudAQAAAAJb3V0QW1vdW50CQAAZQAAAAIFAAAAC3F1b3RlQW1vdW50BQAAAAlmZWVBbW91bnQEAAAABnJlZnVuZAkBAAAACHZhbGlkYXRlAAAAAQkAAGUAAAACBQAAAAdkZXBvc2l0BQAAAAhpbkFtb3VudAQAAAAMcHJpY2VQZXJVbml0CQAAawAAAAMFAAAAC3F1b3RlQW1vdW50BQAAAAdkZWNpbWFsBQAAAApiYXNlQW1vdW50BAAAABFsb2dFbnRyeURhdGFWYWx1ZQkABLkAAAACCQAETAAAAAICAAAALkRlRmkgRnJhbmtsaW4gKEZNTVQpOiBvdGNFeGNoYW5nZSAoU2VsbCBPcmRlcjoJAARMAAAAAgUAAAAIYmFzZUNvZGUJAARMAAAAAgIAAAABLwkABEwAAAAC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AQAAABFnZXRTY3JpcHRUcmFuc2ZlcgAAAAMFAAAABWZjb2xkCQEAAAARcmViYWxhbmNpbmdBbW91bnQAAAABCQABkQAAAAIFAAAACXBvcnRmb2xpbwAAAAAAAAAABgkAAZEAAAACBQAAAAlwb3J0Zm9saW8AAAAAAAAAAAYJAQAAABFnZXRTY3JpcHRUcmFuc2ZlcgAAAAMFAAAABWZjb2xkCQEAAAARcmViYWxhbmNpbmdBbW91bnQAAAABCQABkQAAAAIFAAAACXBvcnRmb2xpbwAAAAAAAAAABwkAAZEAAAACBQAAAAlwb3J0Zm9saW8AAAAAAAAAAAcJAQAAABFnZXRTY3JpcHRUcmFuc2ZlcgAAAAMFAAAABWZjb2xkCQEAAAARcmViYWxhbmNpbmdBbW91bnQAAAABCQABkQAAAAIFAAAACXBvcnRmb2xpbwAAAAAAAAAACAkAAZEAAAACBQAAAAlwb3J0Zm9saW8AAAAAAAAAAAgJAQAAABFnZXRTY3JpcHRUcmFuc2ZlcgAAAAMFAAAABWZjb2xkBQAAAApmbW10QW1vdW50BQAAAAlmbW10QXNzZXQEAAAAEWxvZ0VudHJ5RGF0YVZhbHVlCQABLAAAAAICAAAALkRlRmkgRnJhbmtsaW4gKEZNTVQpOiBhdXRvUmViYWxhbmNlICgpID0+IHR4OiAJAAJYAAAAAQgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAMJAABmAAAAAgkAAZAAAAABBQAAAA9zY3JpcHRUcmFuc2ZlcnMAAAAAAAAAAAAJAARNAAAAAgkABE0AAAACBQAAAA9zY3JpcHRUcmFuc2ZlcnMJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAD2xvZ0VudHJ5RGF0YUtleQUAAAARbG9nRW50cnlEYXRhVmFsdWUJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABB0aW1lc3RhbXBEYXRhS2V5CAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAkAAAIAAAABAgAAACtUaGVyZSBhcmUgY3VycmVudGx5IG5vIHRyYW5zZmVycyBhdmFpbGFibGUuAAAAAWkBAAAAEHNldFNjcmlwdFZlcnNpb24AAAAAAwkBAAAAAiE9AAAAAggFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BQAA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AAIICAUAAAABbwAAAAlhc3NldFBhaXIAAAAKcHJpY2VBc3NldAUAAAAJeGZlZUFzc2V0BwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAACXBvcnRmb2xpbwgIBQAAAAFvAAAACWFzc2V0UGFpcgAAAAthbW91bnRBc3NldAcGAwMJAAAAAAAAAggFAAAAAW8AAAAJb3JkZXJUeXBlBQAAAARTZWxsCQEAAAACIT0AAAACCAgFAAAAAW8AAAAJYXNzZXRQYWlyAAAAC2Ftb3VudEFzc2V0BQAAAAl4ZmVlQXNzZXQHCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAgFAAAAAW8AAAAJYXNzZXRQYWlyAAAACnByaWNlQXNzZXQHBwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAAAW8AAAARbWF0Y2hlckZlZUFzc2V0SWQHCQAAAAAAAAIIBQAAAAFvAAAAEG1hdGNoZXJQdWJsaWNLZXkFAAAADnd4Y2hnUHVibGljS2V5BwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAATVHJhbnNmZXJUcmFuc2FjdGlvbgQAAAABdAUAAAAHJG1hdGNoMAMDAwMFAAAADGlzVmFsaWRPd25lcgkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAUAAAABdAAAAAdhc3NldElkBwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAUAAAABdAAAAApmZWVBc3NldElkBwYDAwMFAAAADGlzVmFsaWRBZG1pbgkAAAAAAAACCAUAAAABdAAAAAdhc3NldElkBQAAAAlmbW10QXNzZXQHCQAAZwAAAAIFAAAADW1heFNhbGVBbW91bnQIBQAAAAF0AAAABmFtb3VudAcJAAAAAAAAAgkABCQAAAABCAUAAAABdAAAAAlyZWNpcGllbnQFAAAABWZzYWxlBwYDAwMFAAAAEWFueVZhbGlkR3VhcmFudG9yCQEAAAACIT0AAAACCAUAAAABdAAAAAdhc3NldElkBQAAAAlmbW10QXNzZXQHCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAAJcG9ydGZvbGlvCAUAAAABdAAAAAdhc3NldElkBwkAAAAAAAACCQAEJAAAAAEIBQAAAAF0AAAACXJlY2lwaWVudAUAAAAFZmNvbGQHAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABBMZWFzZVRyYW5zYWN0aW9uBAAAAAFsBQAAAAckbWF0Y2gwAwUAAAAMaXNWYWxpZE1NQm90CQAAZwAAAAIFAAAADm1heExlYXNlQW1vdW50CAUAAAABbAAAAAZhbW91bnQHAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABZMZWFzZUNhbmNlbFRyYW5zYWN0aW9uAwUAAAAMaXNWYWxpZE1NQm90BgUAAAARYW55VmFsaWRHdWFyYW50b3IDAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABRTZXRTY3JpcHRUcmFuc2FjdGlvbgYJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAPRGF0YVRyYW5zYWN0aW9uAwUAAAAMaXNWYWxpZEFkbWluBQAAABFpc1ZhbGlkR3VhcmFudG9ycwcHEA3YLw==", "height": 2290363, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9nUMtJ2XUy4XpP9g8eDJdHe2FiQdUfMAwrFBNwaaF7fT Next: 796BerZRqJY6NNiAhp8Ch1yLXbc249trWQyC8BF7ba7B Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let scriptVersion = "v4.00-beta_20201018"
4+let scriptVersion = "v4.01-beta_20201019"
55
66 let percent = 100000
77
8080 func validate (num) = max([0, num])
8181
8282
83-func orMaximum (num,val) = min([num, val])
83+func valueOrMaximum (num,val) = min([num, val])
8484
8585
8686 func toFloatString (num,dec) = toUtf8String(if ((num == 0))
8787 then base58'q'
8888 else if ((num > 0))
8989 then ((toBytes(toString((num / dec))) + base58'o') + drop(toBytes(toString(((num % dec) + dec))), 1))
90- else throw("Negative amounts are not allowed!"))
90+ else throw("Negative amounts are not allowed! Send a PM to the administrator ..."))
9191
9292
9393 func difference (fdappFunds,fcoldFunds) = validate((fdappFunds - fraction((fdappFunds + fcoldFunds), fdappPercent, percent)))
165165 let amount = fraction(total, fmmtAmount, validate((fmmtFunds - fteamFunds)))
166166 if ((assetBalance(this, id) >= amount))
167167 then amount
168- else throw("Not enough balance! Send PM to administrator or guarantors ...")
168+ else throw("Not enough balance! Send a PM to the administrator or guarantor ...")
169169 case _ =>
170170 let total = (wavesBalance(fdapp).regular + wavesBalance(fcold).regular)
171171 let amount = fraction(total, fmmtAmount, validate((fmmtFunds - fteamFunds)))
172172 if ((wavesAvailable >= amount))
173173 then amount
174- else throw("Not enough balance! Send PM to administrator or guarantors ...")
174+ else throw("Not enough balance! Send a PM to the administrator or guarantor ...")
175175 }
176176
177177
178178 @Callable(i)
179-func otcExchange (test,bAsset,qAsset) = {
180- let $t089418986 = getAssetData(bAsset)
181- let baseId = $t089418986._1
182- let baseCode = $t089418986._2
183- let $t089899036 = getAssetData(qAsset)
184- let quoteId = $t089899036._1
185- let quoteCode = $t089899036._2
179+func otcExchange (test,bsAsset,qtAsset) = {
180+ let $t089989044 = getAssetData(bsAsset)
181+ let baseId = $t089989044._1
182+ let baseCode = $t089989044._2
183+ let $t090479095 = getAssetData(qtAsset)
184+ let quoteId = $t090479095._1
185+ let quoteCode = $t090479095._2
186186 if (if (isAssetDisabled(baseId))
187187 then true
188188 else isAssetDisabled(quoteId))
189189 then throw(makeString(["The", baseCode, "/", quoteCode, " market pair is temporarily suspended."], " "))
190190 else {
191- let $t092369370 = if ((size(i.payments) != 1))
191+ let $t092959429 = if ((size(i.payments) != 1))
192192 then $Tuple2(0, base58'')
193193 else $Tuple2(i.payments[0].amount, i.payments[0].assetId)
194- let deposit = $t092369370._1
195- let assetId = $t092369370._2
194+ let deposit = $t092959429._1
195+ let assetId = $t092959429._2
196196 let baseDecimal = assetDecimal(baseId)
197197 let quoteDecimal = assetDecimal(quoteId)
198198 let priceDecimal = fraction(quoteDecimal, decimal, baseDecimal)
199- let $t095389621 = getMarketFunds(baseId, quoteId)
200- let baseFunds = $t095389621._1
201- let quoteFunds = $t095389621._2
199+ let $t095979680 = getMarketFunds(baseId, quoteId)
200+ let baseFunds = $t095979680._1
201+ let quoteFunds = $t095979680._2
202202 if ((assetId == quoteId))
203203 then {
204- let inAmount = orMaximum(deposit, fraction(quoteFunds, halfSpread, percent))
204+ let inAmount = valueOrMaximum(deposit, fraction(quoteFunds, halfSpread, percent))
205205 let feeAmount = fraction(inAmount, tradeFee, percent)
206206 let teamFeeAmount = fraction(inAmount, teamFee, percent)
207207 let quoteAmount = (inAmount - feeAmount)
209209 let outAmount = baseAmount
210210 let refund = validate((deposit - inAmount))
211211 let pricePerUnit = fraction(quoteAmount, decimal, baseAmount)
212- let logEntryDataValue = makeString(["DeFi Franklin (FMMT): otcExchange(Buy Order, Pair:", baseCode, "/", (quoteCode + ") =>"), "bought", toFloatString(outAmount, baseDecimal), baseCode, "×", "ask price", toFloatString(pricePerUnit, priceDecimal), "=", "cost price", toFloatString(inAmount, quoteDecimal), quoteCode, "−", "commission", toFloatString(feeAmount, quoteDecimal), quoteCode], " ")
212+ let logEntryDataValue = makeString(["DeFi Franklin (FMMT): otcExchange (Buy Order:", baseCode, "/", (quoteCode + ") =>"), "bought", toFloatString(outAmount, baseDecimal), baseCode, "×", "ask price", toFloatString(pricePerUnit, priceDecimal), "=", "cost price", toFloatString(inAmount, quoteDecimal), quoteCode, "−", "trade fee", toFloatString(feeAmount, quoteDecimal), quoteCode, "(0.05%)"], " ")
213213 if (if (!(test))
214214 then (outAmount > 0)
215215 else false)
218218 }
219219 else if ((assetId == baseId))
220220 then {
221- let inAmount = orMaximum(deposit, fraction(baseFunds, halfSpread, (percent - halfSpread)))
221+ let inAmount = valueOrMaximum(deposit, fraction(baseFunds, halfSpread, (percent - halfSpread)))
222222 let baseAmount = inAmount
223223 let quoteAmount = fraction(quoteFunds, baseAmount, (baseFunds + baseAmount))
224224 let feeAmount = fraction(quoteAmount, tradeFee, percent)
226226 let outAmount = (quoteAmount - feeAmount)
227227 let refund = validate((deposit - inAmount))
228228 let pricePerUnit = fraction(quoteAmount, decimal, baseAmount)
229- let logEntryDataValue = makeString(["DeFi Franklin (FMMT): otcExchange(Sell Order, Pair:", baseCode, "/", (quoteCode + ") =>"), "sold", toFloatString(inAmount, baseDecimal), baseCode, "×", "bid price", toFloatString(pricePerUnit, priceDecimal), "=", "net proceeds", toFloatString(outAmount, quoteDecimal), quoteCode, "+", "commission", toFloatString(feeAmount, quoteDecimal), quoteCode], " ")
229+ let logEntryDataValue = makeString(["DeFi Franklin (FMMT): otcExchange (Sell Order:", baseCode, "/", (quoteCode + ") =>"), "sold", toFloatString(inAmount, baseDecimal), baseCode, "×", "bid price", toFloatString(pricePerUnit, priceDecimal), "=", "net proceeds", toFloatString(outAmount, quoteDecimal), quoteCode, "+", "trade fee", toFloatString(feeAmount, quoteDecimal), quoteCode, "(0.05%)"], " ")
230230 if (if (!(test))
231231 then (outAmount > 0)
232232 else false)
233233 then [ScriptTransfer(i.caller, outAmount, quoteId), (((getScriptTransfer(i.caller, refund, baseId) ++ getScriptTransfer(fteam, teamFeeAmount, quoteId)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))]
234234 else throw(logEntryDataValue)
235235 }
236- else throw(makeString(["Please attach one of the", baseCode, "or", quoteCode, "assets ..."], " "))
236+ else throw(makeString(["Please attach one of the", baseCode, "or", quoteCode, "assets."], " "))
237237 }
238238 }
239239
240240
241241
242242 @Callable(i)
243-func getMarketData (bAsset,qAsset) = {
244- let $t01295513000 = getAssetData(bAsset)
245- let baseId = $t01295513000._1
246- let baseCode = $t01295513000._2
247- let $t01300313050 = getAssetData(qAsset)
248- let quoteId = $t01300313050._1
249- let quoteCode = $t01300313050._2
243+func getMarketData (bsAsset,qtAsset) = {
244+ let $t01303313079 = getAssetData(bsAsset)
245+ let baseId = $t01303313079._1
246+ let baseCode = $t01303313079._2
247+ let $t01308213130 = getAssetData(qtAsset)
248+ let quoteId = $t01308213130._1
249+ let quoteCode = $t01308213130._2
250250 if (if (if (isDefined(baseId))
251251 then isAssetDisabled(baseId)
252252 else false)
257257 then throw(makeString(["The", baseCode, "/", quoteCode, "market pair is temporarily suspended."], " "))
258258 else {
259259 let spreadDecimal = fraction(halfSpread, decimal, percent)
260- let $t01336513426 = getMarketFunds(baseId, quoteId)
261- let baseFunds = $t01336513426._1
262- let quoteFunds = $t01336513426._2
260+ let $t01344513506 = getMarketFunds(baseId, quoteId)
261+ let baseFunds = $t01344513506._1
262+ let quoteFunds = $t01344513506._2
263263 let minBidPrice = fraction(quoteFunds, (decimal - spreadDecimal), baseFunds)
264264 let maxAskPrice = -(fraction(quoteFunds, -((decimal + spreadDecimal)), baseFunds))
265265 let avgPrice = (((minBidPrice + 1) / 2) + (maxAskPrice / 2))
266266 let priceDecimal = fraction(assetDecimal(quoteId), decimal, assetDecimal(baseId))
267267 let maxBidAmount = fraction(baseFunds, halfSpread, (percent - halfSpread))
268268 let maxAskAmount = fraction(quoteFunds, halfSpread, percent)
269- throw(makeString(["DeFi Franklin (FMMT): getMarketData(Pair:", baseCode, "/", (quoteCode + ") =>"), "max spread:", makeString(["±", toFloatString((halfSpread / 10), (percent / 1000)), "%;"], ""), "average price:", (toFloatString(avgPrice, priceDecimal) + ";"), "max bid amount:", toFloatString(maxBidAmount, assetDecimal(baseId)), (baseCode + ";"), "max ask amount:", toFloatString(maxAskAmount, assetDecimal(quoteId)), quoteCode], " "))
269+ throw(makeString(["DeFi Franklin (FMMT): getMarketData (Trade Pair:", baseCode, "/", (quoteCode + ") =>"), "average price:", toFloatString(avgPrice, priceDecimal), "±", (toFloatString((halfSpread / 10), (percent / 1000)) + "%;"), "max bid amount:", toFloatString(maxBidAmount, assetDecimal(baseId)), (baseCode + ";"), "max ask amount:", toFloatString(maxAskAmount, assetDecimal(quoteId)), quoteCode], " "))
270270 }
271271 }
272272
274274
275275 @Callable(i)
276276 func quickWithdrawal () = {
277- let $t01442614556 = if ((size(i.payments) != 1))
277+ let $t01447314603 = if ((size(i.payments) != 1))
278278 then $Tuple2(0, base58'')
279279 else $Tuple2(i.payments[0].amount, i.payments[0].assetId)
280- let deposit = $t01442614556._1
281- let assetId = $t01442614556._2
282- let maxInput = fraction(assetFunds(fmmtAsset), (fdappPercent / 2), percent)
280+ let deposit = $t01447314603._1
281+ let assetId = $t01447314603._2
282+ let halfFunds = fraction(validate((fmmtFunds - fteamFunds)), (fdappPercent / 2), percent)
283283 if ((assetId == fmmtAsset))
284284 then {
285- let inAmount = orMaximum(deposit, maxInput)
285+ let inAmount = valueOrMaximum(deposit, halfFunds)
286286 let refund = validate((deposit - inAmount))
287287 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])] ++ getScriptTransfer(i.caller, refund, fmmtAsset))
288- let logEntryDataValue = ("DeFi Franklin (FMMT): quickWithdrawal() => tx: " + toBase58String(i.transactionId))
288+ let logEntryDataValue = makeString(["DeFi Franklin (FMMT): quickWithdrawal (Paid Amount:", toFloatString(inAmount, 100000), "FMMT) => tx:", toBase58String(i.transactionId)], " ")
289289 ((scriptTransfers :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
290290 }
291- else throw(makeString(["Please attach the FMMT asset (max amount:", toFloatString(maxInput, assetDecimal(fmmtAsset)), "FMMT) ..."], " "))
291+ else throw(makeString(["Please attach a payment (max amount:", toFloatString(halfFunds, 100000), "FMMT)."], " "))
292292 }
293293
294294
301301 else false)
302302 then !(containsElement(guarantors, i.callerPublicKey))
303303 else false)
304- then throw("Only the administrator and guarantors can perform this function!")
304+ then throw("This action can only be performed by an administrator or guarantor!")
305305 else if ((wavesAmount > wavesAvailable))
306- then throw("Not enough Waves balance! Send PM to administrator or cancel the lease ...")
306+ then throw("Not enough Waves balance! Send a PM to the administrator or cancel the lease.")
307307 else if ((size(i.payments) > 0))
308308 then throw("Don't attach payment when calling this function ...")
309309 else {
310310 let fmmtAmount = validate((assetBalance(fdapp, fmmtAsset) - maxFunds))
311311 let scriptTransfers = (((((((((getScriptTransfer(fcold, rebalancingAmount(portfolio[0]), portfolio[0]) ++ getScriptTransfer(fcold, rebalancingAmount(portfolio[1]), portfolio[1])) ++ getScriptTransfer(fcold, wavesAmount, 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, fmmtAmount, fmmtAsset))
312- let logEntryDataValue = ("DeFi Franklin (FMMT): autoRebalance() => tx: " + toBase58String(i.transactionId))
312+ let logEntryDataValue = ("DeFi Franklin (FMMT): autoRebalance () => tx: " + toBase58String(i.transactionId))
313313 if ((size(scriptTransfers) > 0))
314314 then ((scriptTransfers :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
315- else throw("There are currently no transfers available!")
315+ else throw("There are currently no transfers available.")
316316 }
317317 }
318318
320320
321321 @Callable(i)
322322 func setScriptVersion () = if ((i.callerPublicKey != adminPublicKey))
323- then throw("Only the administrator can perform this function!")
323+ then throw("This action can only be performed by an administrator!")
324324 else if ((size(i.payments) > 0))
325325 then throw("Don't attach payment when calling this function ...")
326326 else {
327327 let oldVersion = valueOrElse(getString(this, versionDataKey), "")
328328 let versionList = split(drop(scriptVersion, 1), "_")
329- let logEntryDataValue = makeString(["DeFi Franklin (FMMT): setScriptVersion() =>", "date:", (makeString([take(versionList[1], 4), take(drop(versionList[1], 4), 2), drop(versionList[1], 6)], "-") + ";"), "version:", versionList[0]], " ")
329+ 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)], "-") + ")")], " ")
330330 if ((oldVersion != scriptVersion))
331331 then [StringEntry(versionDataKey, scriptVersion), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)]
332332 else throw(("The script version has already been updated: " + scriptVersion))
342342 let isValidAdmin = if (isValidOwner)
343343 then true
344344 else sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], adminPublicKey)
345- let isValidGuarantors = ((((((if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], guarantors[0]))
345+ let validGuarantors = (((((if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], guarantors[0]))
346346 then 1
347347 else 0) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[2], guarantors[1]))
348348 then 1
352352 then 1
353353 else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[5], guarantors[4]))
354354 then 1
355- else 0)) >= minSignatures)
355+ else 0))
356+ let anyValidGuarantor = (validGuarantors > 0)
357+ let isValidGuarantors = (validGuarantors >= minSignatures)
356358 let wavesLease = (wavesRegular - wavesAvailable)
357359 let wavesFunds = (wavesRegular + wavesBalance(fcold).regular)
358360 let maxSaleAmount = validate((maxFunds - assetBalance(fsale, fmmtAsset)))
359361 let maxLeaseAmount = validate((fraction(wavesFunds, leasePercent, percent) - wavesLease))
360362 match tx {
361- case b: BurnTransaction =>
362- if (if (isValidOwner)
363- then (b.assetId != xfeeAsset)
364- else false)
365- then !(containsElement(portfolio, b.assetId))
366- else false
367363 case o: Order =>
368364 if (if (if (isValidMMBot)
369365 then if (if (if ((o.orderType == Buy))
397393 then (addressFromRecipient(t.recipient) == fsale)
398394 else false)
399395 then true
400- else if (if (if (isValidGuarantors)
396+ else if (if (if (anyValidGuarantor)
401397 then (t.assetId != fmmtAsset)
402398 else false)
403399 then containsElement(portfolio, t.assetId)
411407 case _: LeaseCancelTransaction =>
412408 if (isValidMMBot)
413409 then true
414- else isValidGuarantors
410+ else anyValidGuarantor
415411 case _: SetScriptTransaction|DataTransaction =>
416412 if (isValidAdmin)
417413 then isValidGuarantors
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let scriptVersion = "v4.00-beta_20201018"
4+let scriptVersion = "v4.01-beta_20201019"
55
66 let percent = 100000
77
88 let decimal = 100000000
99
1010 let teamFee = 5
1111
1212 let tradeFee = 50
1313
1414 let leasePercent = 8000
1515
1616 let fdappPercent = 20000
1717
1818 let halfSpread = getIntegerValue(this, "halfSpread")
1919
2020 let adminPublicKey = base58'JDYJq5RKnSXKLYUQfL89zWPdM3QH5hW8JUTpjnTYV95k'
2121
2222 let mmbotPublicKey = base58'62KBavoHK4TtCYmURFVeNC8j3gL8Jo7WwcrweoBLWofc'
2323
2424 let wxchgPublicKey = base58'9cpfKN9suPNvfeUNphzxXMjcnn974eme8ZhWUjaktzU5'
2525
2626 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'')
2727
2828 let actualSize = value(indexOf(guarantors, base58''))
2929
3030 let minSignatures = ((actualSize / 2) + (actualSize % 2))
3131
3232 let btcAsset = base58'8LQW8f7P5d5PZM7GtZEBgaqRPGSzS3DfPuiXrURJ4AJS'
3333
3434 let ethAsset = base58'474jTeYx2r2Va35794tCScAXWJG9hU2HcgxzMowaZUnu'
3535
3636 let usdtAsset = base58'34N9YcEETLWn93qYQ64EsP1x89tSruJU44RrEMSXXEPJ'
3737
3838 let fmmtAsset = base58'7sqT7HvCVtcrCTQV72FM5so65wjzM164rzoqDZRsRXg7'
3939
4040 let xfeeAsset = base58'5EMfVQiB8NF4HuhaXrZzDM637whWuVBsduq59ZaCSNqk'
4141
4242 let portfolio = ([usdtAsset, btcAsset, unit, ethAsset, base58'zMFqXuoyrn5w17PFurTqxB7GsS71fp9dfk6XFwxbPCy', base58'HZk1mbfuJpmxU1Fs4AX5MWLVYtctsNcg6e2C6VKqK8zk', base58'B3uGHFRpSUuGEDWjqB9LWWxafQj8VTvpMucEyoxzws5H', base58'5WvPKSJXzVE2orvbkJ8wsQmmQKqTv9sGBPksV4adViw3', base58'BrjUWjndUanm5VsJkbUip8VRYy6LWJePtxya3FNv4TQa'] :+ fmmtAsset)
4343
4444 let loAssetCodes = ["usdt", "btc", "waves", "eth", "bch", "ltc", "dash", "xmr", "zec", "fmmt"]
4545
4646 let hiAssetCodes = ["USDT", "BTC", "WAVES", "ETH", "BCH", "LTC", "DASH", "XMR", "ZEC", "FMMT"]
4747
4848 let fixedAssets = [btcAsset, fmmtAsset]
4949
5050 let fixedAssetsSize = size(fixedAssets)
5151
5252 let otherAssetsSize = (size(portfolio) - fixedAssetsSize)
5353
5454 let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x')
5555
5656 let fteam = Address(base58'3P3TMgAUVtJKWHxQMdt8Ao6A1qnRyVmCSr2')
5757
5858 let fsale = Address(base58'3P6VEUyoBE1qdNuhUzbnFRLThuoe1pzS4B2')
5959
6060 let fdapp = Address(base58'3PFRxT9CXG81Evr8MeVJGnQSjFP6cq1SHWL')
6161
6262 let fcold = Address(base58'3PDUqa5qmnhPJfKPnBzUd5PisA42iawV6W7')
6363
6464 let maxFunds = (10000 * 100000)
6565
6666 let fmmtFunds = ((value(assetInfo(fmmtAsset)).quantity - (assetBalance(fdapp, fmmtAsset) + assetBalance(fcold, fmmtAsset))) - maxFunds)
6767
6868 let fteamFunds = assetBalance(fteam, fmmtAsset)
6969
7070 let wavesRegular = wavesBalance(this).regular
7171
7272 let wavesAvailable = wavesBalance(this).available
7373
7474 let logEntryDataKey = "logEntry"
7575
7676 let timestampDataKey = "timestamp"
7777
7878 let versionDataKey = "scriptVersion"
7979
8080 func validate (num) = max([0, num])
8181
8282
83-func orMaximum (num,val) = min([num, val])
83+func valueOrMaximum (num,val) = min([num, val])
8484
8585
8686 func toFloatString (num,dec) = toUtf8String(if ((num == 0))
8787 then base58'q'
8888 else if ((num > 0))
8989 then ((toBytes(toString((num / dec))) + base58'o') + drop(toBytes(toString(((num % dec) + dec))), 1))
90- else throw("Negative amounts are not allowed!"))
90+ else throw("Negative amounts are not allowed! Send a PM to the administrator ..."))
9191
9292
9393 func difference (fdappFunds,fcoldFunds) = validate((fdappFunds - fraction((fdappFunds + fcoldFunds), fdappPercent, percent)))
9494
9595
9696 func rebalancingAmount (assetId) = match assetId {
9797 case id: ByteVector =>
9898 difference(assetBalance(fdapp, id), assetBalance(fcold, id))
9999 case _ =>
100100 difference(wavesRegular, wavesBalance(fcold).regular)
101101 }
102102
103103
104104 func getScriptTransfer (address,amount,assetId) = if ((amount > 0))
105105 then [ScriptTransfer(address, amount, assetId)]
106106 else nil
107107
108108
109109 func toDataKey (assetId) = toBase58String(valueOrElse(assetId, base58'WAVES'))
110110
111111
112112 func isAssetDisabled (assetId) = if (!(containsElement(fixedAssets, assetId)))
113113 then !(valueOrElse(getBoolean(admin, toDataKey(assetId)), false))
114114 else false
115115
116116
117117 func getAssetData (assetName) = {
118118 let index = valueOrErrorMessage(if ((size(assetName) > 16))
119119 then indexOf(portfolio, fromBase58String(assetName))
120120 else valueOrElse(indexOf(loAssetCodes, assetName), indexOf(hiAssetCodes, assetName)), makeString(["The ", assetName, " asset is not supported!"], "\""))
121121 $Tuple2(portfolio[index], hiAssetCodes[index])
122122 }
123123
124124
125125 func assetMult (assetId) = if ((assetId == fmmtAsset))
126126 then 1
127127 else if (containsElement(fixedAssets, assetId))
128128 then fixedAssetsSize
129129 else (fixedAssetsSize * otherAssetsSize)
130130
131131
132132 func assetFunds (assetId) = match assetId {
133133 case id: ByteVector =>
134134 if ((id == fmmtAsset))
135135 then validate((fmmtFunds - fteamFunds))
136136 else (assetBalance(fdapp, id) + assetBalance(fcold, id))
137137 case _ =>
138138 (wavesBalance(fdapp).regular + wavesBalance(fcold).regular)
139139 }
140140
141141
142142 func getMarketFunds (baseId,quoteId) = {
143143 let baseMult = assetMult(baseId)
144144 let quoteMult = assetMult(quoteId)
145145 let marketMult = max([baseMult, quoteMult])
146146 $Tuple2(fraction(assetFunds(baseId), baseMult, marketMult), fraction(assetFunds(quoteId), quoteMult, marketMult))
147147 }
148148
149149
150150 func assetDecimal (assetId) = match assetId {
151151 case id: ByteVector =>
152152 if ((id == fmmtAsset))
153153 then 100000
154154 else if ((id == usdtAsset))
155155 then 1000000
156156 else decimal
157157 case _ =>
158158 decimal
159159 }
160160
161161
162162 func withdrawalAmount (assetId,fmmtAmount) = match assetId {
163163 case id: ByteVector =>
164164 let total = (assetBalance(fdapp, id) + assetBalance(fcold, id))
165165 let amount = fraction(total, fmmtAmount, validate((fmmtFunds - fteamFunds)))
166166 if ((assetBalance(this, id) >= amount))
167167 then amount
168- else throw("Not enough balance! Send PM to administrator or guarantors ...")
168+ else throw("Not enough balance! Send a PM to the administrator or guarantor ...")
169169 case _ =>
170170 let total = (wavesBalance(fdapp).regular + wavesBalance(fcold).regular)
171171 let amount = fraction(total, fmmtAmount, validate((fmmtFunds - fteamFunds)))
172172 if ((wavesAvailable >= amount))
173173 then amount
174- else throw("Not enough balance! Send PM to administrator or guarantors ...")
174+ else throw("Not enough balance! Send a PM to the administrator or guarantor ...")
175175 }
176176
177177
178178 @Callable(i)
179-func otcExchange (test,bAsset,qAsset) = {
180- let $t089418986 = getAssetData(bAsset)
181- let baseId = $t089418986._1
182- let baseCode = $t089418986._2
183- let $t089899036 = getAssetData(qAsset)
184- let quoteId = $t089899036._1
185- let quoteCode = $t089899036._2
179+func otcExchange (test,bsAsset,qtAsset) = {
180+ let $t089989044 = getAssetData(bsAsset)
181+ let baseId = $t089989044._1
182+ let baseCode = $t089989044._2
183+ let $t090479095 = getAssetData(qtAsset)
184+ let quoteId = $t090479095._1
185+ let quoteCode = $t090479095._2
186186 if (if (isAssetDisabled(baseId))
187187 then true
188188 else isAssetDisabled(quoteId))
189189 then throw(makeString(["The", baseCode, "/", quoteCode, " market pair is temporarily suspended."], " "))
190190 else {
191- let $t092369370 = if ((size(i.payments) != 1))
191+ let $t092959429 = if ((size(i.payments) != 1))
192192 then $Tuple2(0, base58'')
193193 else $Tuple2(i.payments[0].amount, i.payments[0].assetId)
194- let deposit = $t092369370._1
195- let assetId = $t092369370._2
194+ let deposit = $t092959429._1
195+ let assetId = $t092959429._2
196196 let baseDecimal = assetDecimal(baseId)
197197 let quoteDecimal = assetDecimal(quoteId)
198198 let priceDecimal = fraction(quoteDecimal, decimal, baseDecimal)
199- let $t095389621 = getMarketFunds(baseId, quoteId)
200- let baseFunds = $t095389621._1
201- let quoteFunds = $t095389621._2
199+ let $t095979680 = getMarketFunds(baseId, quoteId)
200+ let baseFunds = $t095979680._1
201+ let quoteFunds = $t095979680._2
202202 if ((assetId == quoteId))
203203 then {
204- let inAmount = orMaximum(deposit, fraction(quoteFunds, halfSpread, percent))
204+ let inAmount = valueOrMaximum(deposit, fraction(quoteFunds, halfSpread, percent))
205205 let feeAmount = fraction(inAmount, tradeFee, percent)
206206 let teamFeeAmount = fraction(inAmount, teamFee, percent)
207207 let quoteAmount = (inAmount - feeAmount)
208208 let baseAmount = fraction(baseFunds, quoteAmount, (quoteFunds + quoteAmount))
209209 let outAmount = baseAmount
210210 let refund = validate((deposit - inAmount))
211211 let pricePerUnit = fraction(quoteAmount, decimal, baseAmount)
212- let logEntryDataValue = makeString(["DeFi Franklin (FMMT): otcExchange(Buy Order, Pair:", baseCode, "/", (quoteCode + ") =>"), "bought", toFloatString(outAmount, baseDecimal), baseCode, "×", "ask price", toFloatString(pricePerUnit, priceDecimal), "=", "cost price", toFloatString(inAmount, quoteDecimal), quoteCode, "−", "commission", toFloatString(feeAmount, quoteDecimal), quoteCode], " ")
212+ let logEntryDataValue = makeString(["DeFi Franklin (FMMT): otcExchange (Buy Order:", baseCode, "/", (quoteCode + ") =>"), "bought", toFloatString(outAmount, baseDecimal), baseCode, "×", "ask price", toFloatString(pricePerUnit, priceDecimal), "=", "cost price", toFloatString(inAmount, quoteDecimal), quoteCode, "−", "trade fee", toFloatString(feeAmount, quoteDecimal), quoteCode, "(0.05%)"], " ")
213213 if (if (!(test))
214214 then (outAmount > 0)
215215 else false)
216216 then [ScriptTransfer(i.caller, outAmount, baseId), (((getScriptTransfer(i.caller, refund, quoteId) ++ getScriptTransfer(fteam, teamFeeAmount, quoteId)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))]
217217 else throw(logEntryDataValue)
218218 }
219219 else if ((assetId == baseId))
220220 then {
221- let inAmount = orMaximum(deposit, fraction(baseFunds, halfSpread, (percent - halfSpread)))
221+ let inAmount = valueOrMaximum(deposit, fraction(baseFunds, halfSpread, (percent - halfSpread)))
222222 let baseAmount = inAmount
223223 let quoteAmount = fraction(quoteFunds, baseAmount, (baseFunds + baseAmount))
224224 let feeAmount = fraction(quoteAmount, tradeFee, percent)
225225 let teamFeeAmount = fraction(quoteAmount, teamFee, percent)
226226 let outAmount = (quoteAmount - feeAmount)
227227 let refund = validate((deposit - inAmount))
228228 let pricePerUnit = fraction(quoteAmount, decimal, baseAmount)
229- let logEntryDataValue = makeString(["DeFi Franklin (FMMT): otcExchange(Sell Order, Pair:", baseCode, "/", (quoteCode + ") =>"), "sold", toFloatString(inAmount, baseDecimal), baseCode, "×", "bid price", toFloatString(pricePerUnit, priceDecimal), "=", "net proceeds", toFloatString(outAmount, quoteDecimal), quoteCode, "+", "commission", toFloatString(feeAmount, quoteDecimal), quoteCode], " ")
229+ let logEntryDataValue = makeString(["DeFi Franklin (FMMT): otcExchange (Sell Order:", baseCode, "/", (quoteCode + ") =>"), "sold", toFloatString(inAmount, baseDecimal), baseCode, "×", "bid price", toFloatString(pricePerUnit, priceDecimal), "=", "net proceeds", toFloatString(outAmount, quoteDecimal), quoteCode, "+", "trade fee", toFloatString(feeAmount, quoteDecimal), quoteCode, "(0.05%)"], " ")
230230 if (if (!(test))
231231 then (outAmount > 0)
232232 else false)
233233 then [ScriptTransfer(i.caller, outAmount, quoteId), (((getScriptTransfer(i.caller, refund, baseId) ++ getScriptTransfer(fteam, teamFeeAmount, quoteId)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))]
234234 else throw(logEntryDataValue)
235235 }
236- else throw(makeString(["Please attach one of the", baseCode, "or", quoteCode, "assets ..."], " "))
236+ else throw(makeString(["Please attach one of the", baseCode, "or", quoteCode, "assets."], " "))
237237 }
238238 }
239239
240240
241241
242242 @Callable(i)
243-func getMarketData (bAsset,qAsset) = {
244- let $t01295513000 = getAssetData(bAsset)
245- let baseId = $t01295513000._1
246- let baseCode = $t01295513000._2
247- let $t01300313050 = getAssetData(qAsset)
248- let quoteId = $t01300313050._1
249- let quoteCode = $t01300313050._2
243+func getMarketData (bsAsset,qtAsset) = {
244+ let $t01303313079 = getAssetData(bsAsset)
245+ let baseId = $t01303313079._1
246+ let baseCode = $t01303313079._2
247+ let $t01308213130 = getAssetData(qtAsset)
248+ let quoteId = $t01308213130._1
249+ let quoteCode = $t01308213130._2
250250 if (if (if (isDefined(baseId))
251251 then isAssetDisabled(baseId)
252252 else false)
253253 then true
254254 else if (isDefined(quoteId))
255255 then isAssetDisabled(quoteId)
256256 else false)
257257 then throw(makeString(["The", baseCode, "/", quoteCode, "market pair is temporarily suspended."], " "))
258258 else {
259259 let spreadDecimal = fraction(halfSpread, decimal, percent)
260- let $t01336513426 = getMarketFunds(baseId, quoteId)
261- let baseFunds = $t01336513426._1
262- let quoteFunds = $t01336513426._2
260+ let $t01344513506 = getMarketFunds(baseId, quoteId)
261+ let baseFunds = $t01344513506._1
262+ let quoteFunds = $t01344513506._2
263263 let minBidPrice = fraction(quoteFunds, (decimal - spreadDecimal), baseFunds)
264264 let maxAskPrice = -(fraction(quoteFunds, -((decimal + spreadDecimal)), baseFunds))
265265 let avgPrice = (((minBidPrice + 1) / 2) + (maxAskPrice / 2))
266266 let priceDecimal = fraction(assetDecimal(quoteId), decimal, assetDecimal(baseId))
267267 let maxBidAmount = fraction(baseFunds, halfSpread, (percent - halfSpread))
268268 let maxAskAmount = fraction(quoteFunds, halfSpread, percent)
269- throw(makeString(["DeFi Franklin (FMMT): getMarketData(Pair:", baseCode, "/", (quoteCode + ") =>"), "max spread:", makeString(["±", toFloatString((halfSpread / 10), (percent / 1000)), "%;"], ""), "average price:", (toFloatString(avgPrice, priceDecimal) + ";"), "max bid amount:", toFloatString(maxBidAmount, assetDecimal(baseId)), (baseCode + ";"), "max ask amount:", toFloatString(maxAskAmount, assetDecimal(quoteId)), quoteCode], " "))
269+ throw(makeString(["DeFi Franklin (FMMT): getMarketData (Trade Pair:", baseCode, "/", (quoteCode + ") =>"), "average price:", toFloatString(avgPrice, priceDecimal), "±", (toFloatString((halfSpread / 10), (percent / 1000)) + "%;"), "max bid amount:", toFloatString(maxBidAmount, assetDecimal(baseId)), (baseCode + ";"), "max ask amount:", toFloatString(maxAskAmount, assetDecimal(quoteId)), quoteCode], " "))
270270 }
271271 }
272272
273273
274274
275275 @Callable(i)
276276 func quickWithdrawal () = {
277- let $t01442614556 = if ((size(i.payments) != 1))
277+ let $t01447314603 = if ((size(i.payments) != 1))
278278 then $Tuple2(0, base58'')
279279 else $Tuple2(i.payments[0].amount, i.payments[0].assetId)
280- let deposit = $t01442614556._1
281- let assetId = $t01442614556._2
282- let maxInput = fraction(assetFunds(fmmtAsset), (fdappPercent / 2), percent)
280+ let deposit = $t01447314603._1
281+ let assetId = $t01447314603._2
282+ let halfFunds = fraction(validate((fmmtFunds - fteamFunds)), (fdappPercent / 2), percent)
283283 if ((assetId == fmmtAsset))
284284 then {
285- let inAmount = orMaximum(deposit, maxInput)
285+ let inAmount = valueOrMaximum(deposit, halfFunds)
286286 let refund = validate((deposit - inAmount))
287287 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])] ++ getScriptTransfer(i.caller, refund, fmmtAsset))
288- let logEntryDataValue = ("DeFi Franklin (FMMT): quickWithdrawal() => tx: " + toBase58String(i.transactionId))
288+ let logEntryDataValue = makeString(["DeFi Franklin (FMMT): quickWithdrawal (Paid Amount:", toFloatString(inAmount, 100000), "FMMT) => tx:", toBase58String(i.transactionId)], " ")
289289 ((scriptTransfers :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
290290 }
291- else throw(makeString(["Please attach the FMMT asset (max amount:", toFloatString(maxInput, assetDecimal(fmmtAsset)), "FMMT) ..."], " "))
291+ else throw(makeString(["Please attach a payment (max amount:", toFloatString(halfFunds, 100000), "FMMT)."], " "))
292292 }
293293
294294
295295
296296 @Callable(i)
297297 func autoRebalance () = {
298298 let wavesAmount = rebalancingAmount(portfolio[2])
299299 if (if (if ((i.callerPublicKey != adminPublicKey))
300300 then (i.callerPublicKey != mmbotPublicKey)
301301 else false)
302302 then !(containsElement(guarantors, i.callerPublicKey))
303303 else false)
304- then throw("Only the administrator and guarantors can perform this function!")
304+ then throw("This action can only be performed by an administrator or guarantor!")
305305 else if ((wavesAmount > wavesAvailable))
306- then throw("Not enough Waves balance! Send PM to administrator or cancel the lease ...")
306+ then throw("Not enough Waves balance! Send a PM to the administrator or cancel the lease.")
307307 else if ((size(i.payments) > 0))
308308 then throw("Don't attach payment when calling this function ...")
309309 else {
310310 let fmmtAmount = validate((assetBalance(fdapp, fmmtAsset) - maxFunds))
311311 let scriptTransfers = (((((((((getScriptTransfer(fcold, rebalancingAmount(portfolio[0]), portfolio[0]) ++ getScriptTransfer(fcold, rebalancingAmount(portfolio[1]), portfolio[1])) ++ getScriptTransfer(fcold, wavesAmount, 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, fmmtAmount, fmmtAsset))
312- let logEntryDataValue = ("DeFi Franklin (FMMT): autoRebalance() => tx: " + toBase58String(i.transactionId))
312+ let logEntryDataValue = ("DeFi Franklin (FMMT): autoRebalance () => tx: " + toBase58String(i.transactionId))
313313 if ((size(scriptTransfers) > 0))
314314 then ((scriptTransfers :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
315- else throw("There are currently no transfers available!")
315+ else throw("There are currently no transfers available.")
316316 }
317317 }
318318
319319
320320
321321 @Callable(i)
322322 func setScriptVersion () = if ((i.callerPublicKey != adminPublicKey))
323- then throw("Only the administrator can perform this function!")
323+ then throw("This action can only be performed by an administrator!")
324324 else if ((size(i.payments) > 0))
325325 then throw("Don't attach payment when calling this function ...")
326326 else {
327327 let oldVersion = valueOrElse(getString(this, versionDataKey), "")
328328 let versionList = split(drop(scriptVersion, 1), "_")
329- let logEntryDataValue = makeString(["DeFi Franklin (FMMT): setScriptVersion() =>", "date:", (makeString([take(versionList[1], 4), take(drop(versionList[1], 4), 2), drop(versionList[1], 6)], "-") + ";"), "version:", versionList[0]], " ")
329+ 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)], "-") + ")")], " ")
330330 if ((oldVersion != scriptVersion))
331331 then [StringEntry(versionDataKey, scriptVersion), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)]
332332 else throw(("The script version has already been updated: " + scriptVersion))
333333 }
334334
335335
336336 @Verifier(tx)
337337 func verify () = {
338338 let isValidOwner = sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
339339 let isValidMMBot = if (isValidOwner)
340340 then true
341341 else sigVerify_8Kb(tx.bodyBytes, tx.proofs[1], mmbotPublicKey)
342342 let isValidAdmin = if (isValidOwner)
343343 then true
344344 else sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], adminPublicKey)
345- let isValidGuarantors = ((((((if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], guarantors[0]))
345+ let validGuarantors = (((((if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], guarantors[0]))
346346 then 1
347347 else 0) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[2], guarantors[1]))
348348 then 1
349349 else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[3], guarantors[2]))
350350 then 1
351351 else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[4], guarantors[3]))
352352 then 1
353353 else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[5], guarantors[4]))
354354 then 1
355- else 0)) >= minSignatures)
355+ else 0))
356+ let anyValidGuarantor = (validGuarantors > 0)
357+ let isValidGuarantors = (validGuarantors >= minSignatures)
356358 let wavesLease = (wavesRegular - wavesAvailable)
357359 let wavesFunds = (wavesRegular + wavesBalance(fcold).regular)
358360 let maxSaleAmount = validate((maxFunds - assetBalance(fsale, fmmtAsset)))
359361 let maxLeaseAmount = validate((fraction(wavesFunds, leasePercent, percent) - wavesLease))
360362 match tx {
361- case b: BurnTransaction =>
362- if (if (isValidOwner)
363- then (b.assetId != xfeeAsset)
364- else false)
365- then !(containsElement(portfolio, b.assetId))
366- else false
367363 case o: Order =>
368364 if (if (if (isValidMMBot)
369365 then if (if (if ((o.orderType == Buy))
370366 then (o.assetPair.priceAsset != xfeeAsset)
371367 else false)
372368 then containsElement(portfolio, o.assetPair.amountAsset)
373369 else false)
374370 then true
375371 else if (if ((o.orderType == Sell))
376372 then (o.assetPair.amountAsset != xfeeAsset)
377373 else false)
378374 then containsElement(portfolio, o.assetPair.priceAsset)
379375 else false
380376 else false)
381377 then !(isDefined(o.matcherFeeAssetId))
382378 else false)
383379 then (o.matcherPublicKey == wxchgPublicKey)
384380 else false
385381 case t: TransferTransaction =>
386382 if (if (if (if (isValidOwner)
387383 then !(containsElement(portfolio, t.assetId))
388384 else false)
389385 then !(containsElement(portfolio, t.feeAssetId))
390386 else false)
391387 then true
392388 else if (if (if (isValidAdmin)
393389 then (t.assetId == fmmtAsset)
394390 else false)
395391 then (maxSaleAmount >= t.amount)
396392 else false)
397393 then (addressFromRecipient(t.recipient) == fsale)
398394 else false)
399395 then true
400- else if (if (if (isValidGuarantors)
396+ else if (if (if (anyValidGuarantor)
401397 then (t.assetId != fmmtAsset)
402398 else false)
403399 then containsElement(portfolio, t.assetId)
404400 else false)
405401 then (addressFromRecipient(t.recipient) == fcold)
406402 else false
407403 case l: LeaseTransaction =>
408404 if (isValidMMBot)
409405 then (maxLeaseAmount >= l.amount)
410406 else false
411407 case _: LeaseCancelTransaction =>
412408 if (isValidMMBot)
413409 then true
414- else isValidGuarantors
410+ else anyValidGuarantor
415411 case _: SetScriptTransaction|DataTransaction =>
416412 if (isValidAdmin)
417413 then isValidGuarantors
418414 else false
419415 case _ =>
420416 false
421417 }
422418 }
423419

github/deemru/w8io/3ef1775 
110.21 ms