2020.10.20 18:28 [2292767] smart account 3PFRxT9CXG81Evr8MeVJGnQSjFP6cq1SHWL > SELF 0.00000000 Waves

{ "type": 13, "id": "DKzAK5nQtjx5YqkDVZPRAq2BnSE1AjpR4zCkEvBBKndx", "fee": 1400000, "feeAssetId": null, "timestamp": 1603207754367, "version": 2, "chainId": 87, "sender": "3PFRxT9CXG81Evr8MeVJGnQSjFP6cq1SHWL", "senderPublicKey": "Df9CNxLc26KjvgeE9TYkcT1ooBayf5PUfxNdgmFzD2WK", "proofs": [ "3JXiC2u1MSoSwxxW982y6QxnBFJzCwmbCYzRZbLuz4ALKDoYQF165Ud8984XsWy1WKa6bMnMGBM9mjDRnPF3RerS", "2oLa2v4PSusHoNS5x6zYDxpZiAwszDsqLaK8YYjPRGLUC7bqTnzFvaMgyS2g11RpgnSAzB4jLxpoRGTrHsqipKAN" ], "script": "base64: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ZVRpY2tlcgkABEwAAAACAgAAAAEvCQAETAAAAAIFAAAAC3F1b3RlVGlja2VyCQAETAAAAAICAAAAJiBtYXJrZXQgcGFpciBpcyB0ZW1wb3JhcmlseSBzdXNwZW5kZWQuBQAAAANuaWwCAAAAASAEAAAAC2Jhc2VEZWNpbWFsCQEAAAAMYXNzZXREZWNpbWFsAAAAAQUAAAAGYmFzZUlkBAAAAAxxdW90ZURlY2ltYWwJAQAAAAxhc3NldERlY2ltYWwAAAABBQAAAAdxdW90ZUlkBAAAAAxwcmljZURlY2ltYWwJAABrAAAAAwUAAAAMcXVvdGVEZWNpbWFsBQAAAAdkZWNpbWFsBQAAAAtiYXNlRGVjaW1hbAQAAAALJHQwOTgxNDk4NjQJAQAAAA1nZXRBdHRhY2htZW50AAAAAQgFAAAAAWkAAAAIcGF5bWVudHMEAAAAB2RlcG9zaXQIBQAAAAskdDA5ODE0OTg2NAAAAAJfMQQAAAAHYXNzZXRJZAgFAAAACyR0MDk4MTQ5ODY0AAAAAl8yBAAAAAskdDA5ODY5OTk1MgkBAAAADmdldE1hcmtldEZ1bmRzAAAAAgUAAAAGYmFzZUlkBQAAAAdxdW90ZUlkBAAAAAliYXNlRnVuZHMIBQAAAAskdDA5ODY5OTk1MgAAAAJfMQQAAAAKcXVvdGVGdW5kcwgFAAAACyR0MDk4Njk5OTUyAAAAAl8yAwkAAAAAAAACBQAAAAdhc3NldElkBQAAAAdxdW90ZUlkBAAAAAhpbkFtb3VudAkBAAAADnZhbHVlT3JNYXhpbXVtAAAAAgUAAAAHZGVwb3NpdAkAAGsAAAADBQAAAApxdW90ZUZ1bmRzBQAAABFoYWxmU3ByZWFkUGVyY2VudAUAAAAHcGVyY2VudAQAAAAHdGVhbUZlZQkAAGsAAAADBQAAAAhpbkFtb3VudAUAAAAOdGVhbUZlZVBlcmNlbnQFAAAAB3BlcmNlbnQEAAAACHRyYWRlRmVlCQAAawAAAAMFAAAACGluQW1vdW50BQAAAA90cmFkZUZlZVBlcmNlbnQFAAAAB3BlcmNlbnQEAAAAC3F1b3RlQW1vdW50CQAAZQAAAAIFAAAACGluQW1vdW50BQAAAAh0cmFkZUZlZQQAAAAKYmFzZUFtb3VudAkAAGsAAAADBQAAAAliYXNlRnVuZHMFAAAAC3F1b3RlQW1vdW50CQAAZAAAAAIFAAAACnF1b3RlRnVuZHMFAAAAC3F1b3RlQW1vdW50BAAAAAlvdXRBbW91bnQFAAAACmJhc2VBbW91bnQEAAAABnJlZnVuZAkBAAAACHZhbGlkYXRlAAAAAQkAAGUAAAACBQAAAAdkZXBvc2l0BQAAAAhpbkFtb3VudAQAAAAMcHJpY2VQZXJVbml0CQAAawAAAAMFAAAAC3F1b3RlQW1vdW50BQAAAAdkZWNpbWFsBQAAAApiYXNlQW1vdW50BAAAABFsb2dFbnRyeURhdGFWYWx1ZQkABLkAAAACCQAETAAAAAICAAAALURlRmkgRnJhbmtsaW4gKEZNTVQpOiBvdGNFeGNoYW5nZSAoQnV5IE9yZGVyOgkABEwAAAACBQAAAApiYXNlVGlja2VyCQAETAAAAAICAAAAAS8JAARMAAAAAgkAASwAAAACBQAAAAtxdW90ZVRpY2tlcgIAAAAEKSA9PgkABEwAAAACAgAAAAZib3VnaHQJAARMAAAAAgkBAAAADXRvRmxvYXRTdHJpbmcAAAACBQAAAAlvdXRBbW91bnQFAAAAC2Jhc2VEZWNpbWFsCQAETAAAAAIFAAAACmJhc2VUaWNrZXIJAARMAAAAAgIAAAACw5cJAARMAAAAAgIAAAAJYXNrIHByaWNlCQAETAAAAAIJAQAAAA10b0Zsb2F0U3RyaW5nAAAAAgUAAAAMcHJpY2VQZXJVbml0BQAAAAxwcmljZURlY2ltYWwJAARMAAAAAgIAAAABPQkABEwAAAACAgAAAApjb3N0IHByaWNlCQAETAAAAAIJAQAAAA10b0Zsb2F0U3RyaW5nAAAAAgUAAAAIaW5BbW91bnQFAAAADHF1b3RlRGVjaW1hbAkABEwAAAACBQAAAAtxdW90ZVRpY2tlcgkABEwAAAACAgAAAAPiiJIJAARMAAAAAgIAAAAJdHJhZGUgZmVlCQAETAAAAAIJAQAAAA10b0Zsb2F0U3RyaW5nAAAAAgUAAAAIdHJhZGVGZWUFAAAADHF1b3RlRGVjaW1hbAkABEwAAAACBQAAAAtxdW90ZVRpY2tlcgUAAAADbmlsAgAAAAEgAwMJAQAAAAEhAAAAAQUAAAAEdGVzdAkAAGYAAAACBQAAAAlvdXRBbW91bnQAAAAAAAAAAAAHCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAJb3V0QW1vdW50BQAAAAZiYXNlSWQJAARNAAAAAgkABE0AAAACCQAETgAAAAIJAQAAABFnZXRTY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAGcmVmdW5kBQAAAAdxdW90ZUlkCQEAAAARZ2V0U2NyaXB0VHJhbnNmZXIAAAADBQAAAAVmdGVhbQUAAAAHdGVhbUZlZQUAAAAHcXVvdGVJZAkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAPbG9nRW50cnlEYXRhS2V5BQAAABFsb2dFbnRyeURhdGFWYWx1ZQkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEHRpbWVzdGFtcERhdGFLZXkIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wCQAAAgAAAAEFAAAAEWxvZ0VudHJ5RGF0YVZhbHVlAwkAAAAAAAACBQAAAAdhc3NldElkBQAAAAZiYXNlSWQEAAAACGluQW1vdW50CQEAAAAOdmFsdWVPck1heGltdW0AAAACBQAAAAdkZXBvc2l0CQAAawAAAAMFAAAACWJhc2VGdW5kcwUAAAARaGFsZlNwcmVhZFBlcmNlbnQJAABlAAAAAgUAAAAHcGVyY2VudAUAAAARaGFsZlNwcmVhZFBlcmNlbnQEAAAACmJhc2VBbW91bnQFAAAACGluQW1vdW50BAAAAAtxdW90ZUFtb3VudAkAAGsAAAADBQAAAApxdW90ZUZ1bmRzBQAAAApiYXNlQW1vdW50CQAAZAAAAAIFAAAACWJhc2VGdW5kcwUAAAAKYmFzZUFtb3VudAQAAAAHdGVhbUZlZQkAAGsAAAADBQAAAAtxdW90ZUFtb3VudAUAAAAOdGVhbUZlZVBlcmNlbnQFAAAAB3BlcmNlbnQEAAAACHRyYWRlRmVlCQAAawAAAAMFAAAAC3F1b3RlQW1vdW50BQAAAA90cmFkZUZlZVBlcmNlbnQFAAAAB3BlcmNlbnQEAAAACW91dEFtb3VudAkAAGUAAAACBQAAAAtxdW90ZUFtb3VudAUAAAAIdHJhZGVGZWUEAAAABnJlZnVuZAkBAAAACHZhbGlkYXRlAAAAAQkAAGUAAAACBQAAAAdkZXBvc2l0BQAAAAhpbkFtb3VudAQAAAAMcHJpY2VQZXJVbml0CQAAawAAAAMFAAAAC3F1b3RlQW1vdW50BQAAAAdkZWNpbWFsBQAAAApiYXNlQW1vdW50BAAAABFsb2dFbnRyeURhdGFWYWx1ZQkABLkAAAACCQAETAAAAAICAAAALkRlRmkgRnJhbmtsaW4gKEZNTVQpOiBvdGNFeGNoYW5nZSAoU2VsbCBPcmRlcjoJAARMAAAAAgUAAAAKYmFzZVRpY2tlcgkABEwAAAACAgAAAAEvCQAETAAAAAIJAAEsAAAAAgUAAAALcXVvdGVUaWNrZXICAAAABCkgPT4JAARMAAAAAgIAAAAEc29sZAkABEwAAAACCQEAAAANdG9GbG9hdFN0cmluZwAAAAIFAAAACGluQW1vdW50BQAAAAtiYXNlRGVjaW1hbAkABEwAAAACBQAAAApiYXNlVGlja2VyCQAETAAAAAICAAAAAsOXCQAETAAAAAICAAAACWJpZCBwcmljZQkABEwAAAACCQEAAAANdG9GbG9hdFN0cmluZwAAAAIFAAAADHByaWNlUGVyVW5pdAUAAAAMcHJpY2VEZWNpbWFsCQAETAAAAAICAAAAAT0JAARMAAAAAgIAAAAMbmV0IHByb2NlZWRzCQAETAAAAAIJAQAAAA10b0Zsb2F0U3RyaW5nAAAAAgUAAAAJb3V0QW1vdW50BQAAAAxxdW90ZURlY2ltYWwJAARMAAAAAgUAAAALcXVvdGVUaWNrZXIJAARMAAAAAgIAAAABKwkABEwAAAACAgAAAAl0cmFkZSBmZWUJAARMAAAAAgkBAAAADXRvRmxvYXRTdHJpbmcAAAACBQAAAAh0cmFkZUZlZQUAAAAMcXVvdGVEZWNpbWFsCQAETAAAAAIFAAAAC3F1b3RlVGlja2VyBQAAAANuaWwCAAAAASADAwkBAAAAASEAAAABBQAAAAR0ZXN0CQAAZgAAAAIFAAAACW91dEFtb3VudAAAAAAAAAAAAAcJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAlvdXRBbW91bnQFAAAAB3F1b3RlSWQJAARNAAAAAgkABE0AAAACCQAETgAAAAIJAQAAABFnZXRTY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAGcmVmdW5kBQAAAAZiYXNlSWQJAQAAABFnZXRTY3JpcHRUcmFuc2ZlcgAAAAMFAAAABWZ0ZWFtBQAAAAd0ZWFtRmVlBQAAAAdxdW90ZUlkCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAA9sb2dFbnRyeURhdGFLZXkFAAAAEWxvZ0VudHJ5RGF0YVZhbHVlCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAQdGltZXN0YW1wRGF0YUtleQgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAJAAACAAAAAQUAAAARbG9nRW50cnlEYXRhVmFsdWUJAAACAAAAAQkABLkAAAACCQAETAAAAAICAAAAGFBsZWFzZSBhdHRhY2ggb25lIG9mIHRoZQkABEwAAAACBQAAAApiYXNlVGlja2VyCQAETAAAAAICAAAAAm9yCQAETAAAAAIFAAAAC3F1b3RlVGlja2VyCQAETAAAAAICAAAAB2Fzc2V0cy4FAAAAA25pbAIAAAABIAAAAAFpAQAAAA1nZXRNYXJrZXREYXRhAAAAAgAAAAdiVGlja2VyAAAAB3FUaWNrZXIEAAAACWJhc2VJbmRleAkBAAAACmFzc2V0SW5kZXgAAAABBQAAAAdiVGlja2VyBAAAAApxdW90ZUluZGV4CQEAAAAKYXNzZXRJbmRleAAAAAEFAAAAB3FUaWNrZXIEAAAABmJhc2VJZAkAAZEAAAACBQAAAAlwb3J0Zm9saW8FAAAACWJhc2VJbmRleAQAAAAKYmFzZVRpY2tlcgkAAZEAAAACBQAAAAloaVRpY2tlcnMFAAAACWJhc2VJbmRleAQAAAAHcXVvdGVJZAkAAZEAAAACBQAAAAlwb3J0Zm9saW8FAAAACnF1b3RlSW5kZXgEAAAAC3F1b3RlVGlja2VyCQABkQAAAAIFAAAACWhpVGlja2VycwUAAAAKcXVvdGVJbmRleAMDAwkBAAAACWlzRGVmaW5lZAAAAAEFAAAABmJhc2VJZAkBAAAAD2lzQXNzZXREaXNhYmxlZAAAAAEFAAAABmJhc2VJZAcGAwkBAAAACWlzRGVmaW5lZAAAAAEFAAAAB3F1b3RlSWQJAQAAAA9pc0Fzc2V0RGlzYWJsZWQAAAABBQAAAAdxdW90ZUlkBwkA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", "height": 2292767, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4xgeSZVBo5bhCRDZGfxZeN3vWR5jw2SgxkZu13PT3kMy Next: GrMrugeVrFYz4LeWGuzwMAGCRe6NqpxXueZzMX3yCx4N Diff:
OldNewDifferences
5151
5252 let otherAssetsSize = (size(portfolio) - fixedAssetsSize)
5353
54-let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x')
55-
56-let fteam = Address(base58'3P3TMgAUVtJKWHxQMdt8Ao6A1qnRyVmCSr2')
57-
5854 let fsale = Address(base58'3P6VEUyoBE1qdNuhUzbnFRLThuoe1pzS4B2')
5955
6056 let fdapp = Address(base58'3PFRxT9CXG81Evr8MeVJGnQSjFP6cq1SHWL')
6157
6258 let fcold = Address(base58'3PDUqa5qmnhPJfKPnBzUd5PisA42iawV6W7')
6359
60+let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x')
61+
62+let fteam = Address(base58'3P3TMgAUVtJKWHxQMdt8Ao6A1qnRyVmCSr2')
63+
6464 let saleFunds = (10000 * 100000)
6565
66-let circSupply = ((value(assetInfo(fmmtAsset)).quantity - (assetBalance(fdapp, fmmtAsset) + assetBalance(fcold, fmmtAsset))) - saleFunds)
66+let circSupply = ((value(assetInfo(fmmtAsset)).quantity - (assetBalance(this, fmmtAsset) + assetBalance(fcold, fmmtAsset))) - saleFunds)
6767
6868 let fteamFunds = assetBalance(fteam, fmmtAsset)
6969
7979
8080 let versionDataKey = "scriptVersion"
8181
82-func validate (num) = max([0, num])
82+func validate (posValue) = max([0, posValue])
8383
8484
85-func valueOrMaximum (num,val) = min([num, val])
85+func valueOrMaximum (intValue,maxValue) = min([intValue, maxValue])
8686
8787
8888 func toFloatString (num,dec) = toUtf8String(if ((num == 0))
9292 else throw("Negative amounts are not allowed! Send a PM to the administrator ..."))
9393
9494
95-func difference (fdappFunds,fcoldFunds) = validate((fdappFunds - fraction((fdappFunds + fcoldFunds), fdappPercent, percent)))
95+func difference (fdappFunds,fcoldFunds) = {
96+ let minAmount = fraction(fcoldFunds, (percent / 100), (percent - fdappPercent))
97+ let diffAmount = (fdappFunds - fraction((fdappFunds + fcoldFunds), fdappPercent, percent))
98+ if ((minAmount > diffAmount))
99+ then 0
100+ else diffAmount
101+ }
96102
97103
98104 func rebalancingAmount (assetId) = match assetId {
99105 case id: ByteVector =>
100- difference(assetBalance(fdapp, id), assetBalance(fcold, id))
106+ difference(assetBalance(this, id), assetBalance(fcold, id))
101107 case _ =>
102- difference(wavesRegular, wavesBalance(fcold).regular)
108+ difference(wavesBalance(this).regular, wavesBalance(fcold).regular)
103109 }
104110
105111
144150 case id: ByteVector =>
145151 if ((id == fmmtAsset))
146152 then tradeSupply
147- else (assetBalance(fdapp, id) + assetBalance(fcold, id))
153+ else (assetBalance(this, id) + assetBalance(fcold, id))
148154 case _ =>
149- (wavesBalance(fdapp).regular + wavesBalance(fcold).regular)
155+ (wavesBalance(this).regular + wavesBalance(fcold).regular)
150156 }
151157
152158
165171
166172 func withdrawalAmount (assetId,fmmtAmount) = match assetId {
167173 case id: ByteVector =>
168- let total = (assetBalance(fdapp, id) + assetBalance(fcold, id))
174+ let total = (assetBalance(this, id) + assetBalance(fcold, id))
169175 let amount = fraction(total, fmmtAmount, tradeSupply)
170176 if ((assetBalance(this, id) >= amount))
171177 then amount
172178 else throw("Not enough balance! Send a PM to the administrator or guarantor ...")
173179 case _ =>
174- let total = (wavesBalance(fdapp).regular + wavesBalance(fcold).regular)
180+ let total = (wavesBalance(this).regular + wavesBalance(fcold).regular)
175181 let amount = fraction(total, fmmtAmount, tradeSupply)
176- if ((wavesAvailable >= amount))
182+ if ((wavesBalance(this).available >= amount))
177183 then amount
178184 else throw("Not enough balance! Send a PM to the administrator or guarantor ...")
179185 }
195201 let baseDecimal = assetDecimal(baseId)
196202 let quoteDecimal = assetDecimal(quoteId)
197203 let priceDecimal = fraction(quoteDecimal, decimal, baseDecimal)
198- let $t096379687 = getAttachment(i.payments)
199- let deposit = $t096379687._1
200- let assetId = $t096379687._2
201- let $t096929775 = getMarketFunds(baseId, quoteId)
202- let baseFunds = $t096929775._1
203- let quoteFunds = $t096929775._2
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
204210 if ((assetId == quoteId))
205211 then {
206212 let inAmount = valueOrMaximum(deposit, fraction(quoteFunds, halfSpreadPercent, percent))
259265 then throw(makeString(["The", baseTicker, "/", quoteTicker, "market pair is temporarily suspended."], " "))
260266 else {
261267 let spreadDecimal = fraction(decimal, halfSpreadPercent, percent)
262- let $t01371013771 = getMarketFunds(baseId, quoteId)
263- let baseFunds = $t01371013771._1
264- let quoteFunds = $t01371013771._2
268+ let $t01388713948 = getMarketFunds(baseId, quoteId)
269+ let baseFunds = $t01388713948._1
270+ let quoteFunds = $t01388713948._2
265271 let minBidPrice = fraction(quoteFunds, (decimal - spreadDecimal), baseFunds)
266272 let maxAskPrice = -(fraction(quoteFunds, -((decimal + spreadDecimal)), baseFunds))
267273 let avgPrice = (((minBidPrice + 1) / 2) + (maxAskPrice / 2))
276282
277283 @Callable(i)
278284 func quickWithdrawal () = {
279- let $t01486314913 = getAttachment(i.payments)
280- let deposit = $t01486314913._1
281- let assetId = $t01486314913._2
285+ let $t01504015090 = getAttachment(i.payments)
286+ let deposit = $t01504015090._1
287+ let assetId = $t01504015090._2
282288 let halfFunds = fraction(tradeSupply, (fdappPercent / 2), percent)
283289 if ((assetId == fmmtAsset))
284290 then {
285291 let inAmount = valueOrMaximum(deposit, halfFunds)
286292 let refund = validate((deposit - inAmount))
287- 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))
293+ 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])]
288294 let logEntryDataValue = makeString(["DeFi Franklin (FMMT): quickWithdrawal (Paid Amount:", toFloatString(inAmount, 100000), "FMMT) => tx:", toBase58String(i.transactionId)], " ")
289- ((scriptTransfers :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
295+ (((scriptTransfers ++ getScriptTransfer(i.caller, refund, fmmtAsset)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
290296 }
291297 else throw(makeString(["Please attach a payment (max amount:", toFloatString(halfFunds, 100000), "FMMT)."], " "))
292298 }
295301
296302 @Callable(i)
297303 func autoRebalance () = {
298- let wavesAmount = rebalancingAmount(portfolio[2])
304+ let wavesDifference = rebalancingAmount(portfolio[2])
299305 if (if (if ((i.callerPublicKey != adminPublicKey))
300306 then (i.callerPublicKey != mmbotPublicKey)
301307 else false)
302308 then !(containsElement(guarantors, i.callerPublicKey))
303309 else false)
304310 then throw("This action can only be performed by an administrator or guarantor!")
305- else if ((wavesAmount > wavesAvailable))
311+ else if ((wavesDifference > wavesAvailable))
306312 then throw("Not enough Waves balance! Send a PM to the administrator or cancel the lease.")
307313 else if ((size(i.payments) > 0))
308314 then throw("Don't attach payment when calling this function ...")
309315 else {
310- let fmmtAmount = validate((assetBalance(fdapp, fmmtAsset) - saleFunds))
311- 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))
316+ let fmmtDifference = (assetBalance(this, fmmtAsset) - saleFunds)
317+ 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))
312318 let logEntryDataValue = ("DeFi Franklin (FMMT): autoRebalance () => tx: " + toBase58String(i.transactionId))
313319 if ((size(scriptTransfers) > 0))
314320 then (((scriptTransfers :+ ScriptTransfer(i.caller, 500000, unit)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
328334 let versionList = split(drop(scriptVersion, 1), "_")
329335 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)], "-") + ")")], " ")
330336 if ((oldVersion != scriptVersion))
331- then [StringEntry(versionDataKey, scriptVersion), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)]
337+ then [ScriptTransfer(i.caller, 500000, unit), StringEntry(versionDataKey, scriptVersion), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)]
332338 else throw(("The script version has already been updated: " + scriptVersion))
333339 }
334340
357363 let isValidGuarantors = (validGuarantors >= minSignatures)
358364 let wavesLease = (wavesRegular - wavesAvailable)
359365 let wavesFunds = (wavesRegular + wavesBalance(fcold).regular)
360- let maxSaleAmount = validate((saleFunds - assetBalance(fsale, fmmtAsset)))
366+ let maxSaleAmount = validate((saleFunds - assetBalance(this, fmmtAsset)))
361367 let maxLeaseAmount = validate((fraction(wavesFunds, leasePercent, percent) - wavesLease))
362368 match tx {
363369 case o: Order =>
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
1010 let teamFeePercent = 5
1111
1212 let tradeFeePercent = 50
1313
1414 let leasePercent = 8000
1515
1616 let fdappPercent = 20000
1717
1818 let halfSpreadPercent = 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 loTickers = ["usdt", "btc", "waves", "eth", "bch", "ltc", "dash", "xmr", "zec", "fmmt"]
4545
4646 let hiTickers = ["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
54-let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x')
55-
56-let fteam = Address(base58'3P3TMgAUVtJKWHxQMdt8Ao6A1qnRyVmCSr2')
57-
5854 let fsale = Address(base58'3P6VEUyoBE1qdNuhUzbnFRLThuoe1pzS4B2')
5955
6056 let fdapp = Address(base58'3PFRxT9CXG81Evr8MeVJGnQSjFP6cq1SHWL')
6157
6258 let fcold = Address(base58'3PDUqa5qmnhPJfKPnBzUd5PisA42iawV6W7')
6359
60+let admin = Address(base58'3PLRw83NCgHKKFfeJi8XWZ4fypqJJxm2x2x')
61+
62+let fteam = Address(base58'3P3TMgAUVtJKWHxQMdt8Ao6A1qnRyVmCSr2')
63+
6464 let saleFunds = (10000 * 100000)
6565
66-let circSupply = ((value(assetInfo(fmmtAsset)).quantity - (assetBalance(fdapp, fmmtAsset) + assetBalance(fcold, fmmtAsset))) - saleFunds)
66+let circSupply = ((value(assetInfo(fmmtAsset)).quantity - (assetBalance(this, fmmtAsset) + assetBalance(fcold, fmmtAsset))) - saleFunds)
6767
6868 let fteamFunds = assetBalance(fteam, fmmtAsset)
6969
7070 let tradeSupply = max([0, (circSupply - fteamFunds)])
7171
7272 let wavesRegular = wavesBalance(this).regular
7373
7474 let wavesAvailable = wavesBalance(this).available
7575
7676 let logEntryDataKey = "logEntry"
7777
7878 let timestampDataKey = "timestamp"
7979
8080 let versionDataKey = "scriptVersion"
8181
82-func validate (num) = max([0, num])
82+func validate (posValue) = max([0, posValue])
8383
8484
85-func valueOrMaximum (num,val) = min([num, val])
85+func valueOrMaximum (intValue,maxValue) = min([intValue, maxValue])
8686
8787
8888 func toFloatString (num,dec) = toUtf8String(if ((num == 0))
8989 then base58'q'
9090 else if ((num > 0))
9191 then ((toBytes(toString((num / dec))) + base58'o') + drop(toBytes(toString(((num % dec) + dec))), 1))
9292 else throw("Negative amounts are not allowed! Send a PM to the administrator ..."))
9393
9494
95-func difference (fdappFunds,fcoldFunds) = validate((fdappFunds - fraction((fdappFunds + fcoldFunds), fdappPercent, percent)))
95+func difference (fdappFunds,fcoldFunds) = {
96+ let minAmount = fraction(fcoldFunds, (percent / 100), (percent - fdappPercent))
97+ let diffAmount = (fdappFunds - fraction((fdappFunds + fcoldFunds), fdappPercent, percent))
98+ if ((minAmount > diffAmount))
99+ then 0
100+ else diffAmount
101+ }
96102
97103
98104 func rebalancingAmount (assetId) = match assetId {
99105 case id: ByteVector =>
100- difference(assetBalance(fdapp, id), assetBalance(fcold, id))
106+ difference(assetBalance(this, id), assetBalance(fcold, id))
101107 case _ =>
102- difference(wavesRegular, wavesBalance(fcold).regular)
108+ difference(wavesBalance(this).regular, wavesBalance(fcold).regular)
103109 }
104110
105111
106112 func getScriptTransfer (address,amount,assetId) = if ((amount > 0))
107113 then [ScriptTransfer(address, amount, assetId)]
108114 else nil
109115
110116
111117 func toDataKey (assetId) = toBase58String(valueOrElse(assetId, base58'WAVES'))
112118
113119
114120 func isAssetDisabled (assetId) = if (!(containsElement(fixedAssets, assetId)))
115121 then !(valueOrElse(getBoolean(admin, toDataKey(assetId)), false))
116122 else false
117123
118124
119125 func assetMult (assetId) = if ((assetId == fmmtAsset))
120126 then 1
121127 else if (containsElement(fixedAssets, assetId))
122128 then fixedAssetsSize
123129 else (fixedAssetsSize * otherAssetsSize)
124130
125131
126132 func assetIndex (ticker) = valueOrErrorMessage(if ((size(ticker) > 16))
127133 then indexOf(portfolio, fromBase58String(ticker))
128134 else valueOrElse(indexOf(loTickers, ticker), indexOf(hiTickers, ticker)), makeString(["The ", ticker, " asset is not supported!"], "\""))
129135
130136
131137 func assetDecimal (assetId) = match assetId {
132138 case id: ByteVector =>
133139 if ((id == fmmtAsset))
134140 then 100000
135141 else if ((id == usdtAsset))
136142 then 1000000
137143 else decimal
138144 case _ =>
139145 decimal
140146 }
141147
142148
143149 func assetFunds (assetId) = match assetId {
144150 case id: ByteVector =>
145151 if ((id == fmmtAsset))
146152 then tradeSupply
147- else (assetBalance(fdapp, id) + assetBalance(fcold, id))
153+ else (assetBalance(this, id) + assetBalance(fcold, id))
148154 case _ =>
149- (wavesBalance(fdapp).regular + wavesBalance(fcold).regular)
155+ (wavesBalance(this).regular + wavesBalance(fcold).regular)
150156 }
151157
152158
153159 func getAttachment (payments) = if ((size(payments) != 1))
154160 then $Tuple2(0, base58'')
155161 else $Tuple2(payments[0].amount, payments[0].assetId)
156162
157163
158164 func getMarketFunds (baseId,quoteId) = {
159165 let baseMult = assetMult(baseId)
160166 let quoteMult = assetMult(quoteId)
161167 let marketMult = max([baseMult, quoteMult])
162168 $Tuple2(fraction(assetFunds(baseId), baseMult, marketMult), fraction(assetFunds(quoteId), quoteMult, marketMult))
163169 }
164170
165171
166172 func withdrawalAmount (assetId,fmmtAmount) = match assetId {
167173 case id: ByteVector =>
168- let total = (assetBalance(fdapp, id) + assetBalance(fcold, id))
174+ let total = (assetBalance(this, id) + assetBalance(fcold, id))
169175 let amount = fraction(total, fmmtAmount, tradeSupply)
170176 if ((assetBalance(this, id) >= amount))
171177 then amount
172178 else throw("Not enough balance! Send a PM to the administrator or guarantor ...")
173179 case _ =>
174- let total = (wavesBalance(fdapp).regular + wavesBalance(fcold).regular)
180+ let total = (wavesBalance(this).regular + wavesBalance(fcold).regular)
175181 let amount = fraction(total, fmmtAmount, tradeSupply)
176- if ((wavesAvailable >= amount))
182+ if ((wavesBalance(this).available >= amount))
177183 then amount
178184 else throw("Not enough balance! Send a PM to the administrator or guarantor ...")
179185 }
180186
181187
182188 @Callable(i)
183189 func otcExchange (test,bTicker,qTicker) = {
184190 let baseIndex = assetIndex(bTicker)
185191 let quoteIndex = assetIndex(qTicker)
186192 let baseId = portfolio[baseIndex]
187193 let baseTicker = hiTickers[baseIndex]
188194 let quoteId = portfolio[quoteIndex]
189195 let quoteTicker = hiTickers[quoteIndex]
190196 if (if (isAssetDisabled(baseId))
191197 then true
192198 else isAssetDisabled(quoteId))
193199 then throw(makeString(["The", baseTicker, "/", quoteTicker, " market pair is temporarily suspended."], " "))
194200 else {
195201 let baseDecimal = assetDecimal(baseId)
196202 let quoteDecimal = assetDecimal(quoteId)
197203 let priceDecimal = fraction(quoteDecimal, decimal, baseDecimal)
198- let $t096379687 = getAttachment(i.payments)
199- let deposit = $t096379687._1
200- let assetId = $t096379687._2
201- let $t096929775 = getMarketFunds(baseId, quoteId)
202- let baseFunds = $t096929775._1
203- let quoteFunds = $t096929775._2
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
204210 if ((assetId == quoteId))
205211 then {
206212 let inAmount = valueOrMaximum(deposit, fraction(quoteFunds, halfSpreadPercent, percent))
207213 let teamFee = fraction(inAmount, teamFeePercent, percent)
208214 let tradeFee = fraction(inAmount, tradeFeePercent, percent)
209215 let quoteAmount = (inAmount - tradeFee)
210216 let baseAmount = fraction(baseFunds, quoteAmount, (quoteFunds + quoteAmount))
211217 let outAmount = baseAmount
212218 let refund = validate((deposit - inAmount))
213219 let pricePerUnit = fraction(quoteAmount, decimal, baseAmount)
214220 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], " ")
215221 if (if (!(test))
216222 then (outAmount > 0)
217223 else false)
218224 then [ScriptTransfer(i.caller, outAmount, baseId), (((getScriptTransfer(i.caller, refund, quoteId) ++ getScriptTransfer(fteam, teamFee, quoteId)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))]
219225 else throw(logEntryDataValue)
220226 }
221227 else if ((assetId == baseId))
222228 then {
223229 let inAmount = valueOrMaximum(deposit, fraction(baseFunds, halfSpreadPercent, (percent - halfSpreadPercent)))
224230 let baseAmount = inAmount
225231 let quoteAmount = fraction(quoteFunds, baseAmount, (baseFunds + baseAmount))
226232 let teamFee = fraction(quoteAmount, teamFeePercent, percent)
227233 let tradeFee = fraction(quoteAmount, tradeFeePercent, percent)
228234 let outAmount = (quoteAmount - tradeFee)
229235 let refund = validate((deposit - inAmount))
230236 let pricePerUnit = fraction(quoteAmount, decimal, baseAmount)
231237 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], " ")
232238 if (if (!(test))
233239 then (outAmount > 0)
234240 else false)
235241 then [ScriptTransfer(i.caller, outAmount, quoteId), (((getScriptTransfer(i.caller, refund, baseId) ++ getScriptTransfer(fteam, teamFee, quoteId)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))]
236242 else throw(logEntryDataValue)
237243 }
238244 else throw(makeString(["Please attach one of the", baseTicker, "or", quoteTicker, "assets."], " "))
239245 }
240246 }
241247
242248
243249
244250 @Callable(i)
245251 func getMarketData (bTicker,qTicker) = {
246252 let baseIndex = assetIndex(bTicker)
247253 let quoteIndex = assetIndex(qTicker)
248254 let baseId = portfolio[baseIndex]
249255 let baseTicker = hiTickers[baseIndex]
250256 let quoteId = portfolio[quoteIndex]
251257 let quoteTicker = hiTickers[quoteIndex]
252258 if (if (if (isDefined(baseId))
253259 then isAssetDisabled(baseId)
254260 else false)
255261 then true
256262 else if (isDefined(quoteId))
257263 then isAssetDisabled(quoteId)
258264 else false)
259265 then throw(makeString(["The", baseTicker, "/", quoteTicker, "market pair is temporarily suspended."], " "))
260266 else {
261267 let spreadDecimal = fraction(decimal, halfSpreadPercent, percent)
262- let $t01371013771 = getMarketFunds(baseId, quoteId)
263- let baseFunds = $t01371013771._1
264- let quoteFunds = $t01371013771._2
268+ let $t01388713948 = getMarketFunds(baseId, quoteId)
269+ let baseFunds = $t01388713948._1
270+ let quoteFunds = $t01388713948._2
265271 let minBidPrice = fraction(quoteFunds, (decimal - spreadDecimal), baseFunds)
266272 let maxAskPrice = -(fraction(quoteFunds, -((decimal + spreadDecimal)), baseFunds))
267273 let avgPrice = (((minBidPrice + 1) / 2) + (maxAskPrice / 2))
268274 let priceDecimal = fraction(assetDecimal(quoteId), decimal, assetDecimal(baseId))
269275 let maxBidAmount = fraction(baseFunds, halfSpreadPercent, (percent - halfSpreadPercent))
270276 let maxAskAmount = fraction(quoteFunds, halfSpreadPercent, percent)
271277 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], " "))
272278 }
273279 }
274280
275281
276282
277283 @Callable(i)
278284 func quickWithdrawal () = {
279- let $t01486314913 = getAttachment(i.payments)
280- let deposit = $t01486314913._1
281- let assetId = $t01486314913._2
285+ let $t01504015090 = getAttachment(i.payments)
286+ let deposit = $t01504015090._1
287+ let assetId = $t01504015090._2
282288 let halfFunds = fraction(tradeSupply, (fdappPercent / 2), percent)
283289 if ((assetId == fmmtAsset))
284290 then {
285291 let inAmount = valueOrMaximum(deposit, halfFunds)
286292 let refund = validate((deposit - inAmount))
287- 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))
293+ 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])]
288294 let logEntryDataValue = makeString(["DeFi Franklin (FMMT): quickWithdrawal (Paid Amount:", toFloatString(inAmount, 100000), "FMMT) => tx:", toBase58String(i.transactionId)], " ")
289- ((scriptTransfers :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
295+ (((scriptTransfers ++ getScriptTransfer(i.caller, refund, fmmtAsset)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
290296 }
291297 else throw(makeString(["Please attach a payment (max amount:", toFloatString(halfFunds, 100000), "FMMT)."], " "))
292298 }
293299
294300
295301
296302 @Callable(i)
297303 func autoRebalance () = {
298- let wavesAmount = rebalancingAmount(portfolio[2])
304+ let wavesDifference = rebalancingAmount(portfolio[2])
299305 if (if (if ((i.callerPublicKey != adminPublicKey))
300306 then (i.callerPublicKey != mmbotPublicKey)
301307 else false)
302308 then !(containsElement(guarantors, i.callerPublicKey))
303309 else false)
304310 then throw("This action can only be performed by an administrator or guarantor!")
305- else if ((wavesAmount > wavesAvailable))
311+ else if ((wavesDifference > wavesAvailable))
306312 then throw("Not enough Waves balance! Send a PM to the administrator or cancel the lease.")
307313 else if ((size(i.payments) > 0))
308314 then throw("Don't attach payment when calling this function ...")
309315 else {
310- let fmmtAmount = validate((assetBalance(fdapp, fmmtAsset) - saleFunds))
311- 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))
316+ let fmmtDifference = (assetBalance(this, fmmtAsset) - saleFunds)
317+ 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))
312318 let logEntryDataValue = ("DeFi Franklin (FMMT): autoRebalance () => tx: " + toBase58String(i.transactionId))
313319 if ((size(scriptTransfers) > 0))
314320 then (((scriptTransfers :+ ScriptTransfer(i.caller, 500000, unit)) :+ StringEntry(logEntryDataKey, logEntryDataValue)) :+ IntegerEntry(timestampDataKey, lastBlock.timestamp))
315321 else throw("There are currently no transfers available.")
316322 }
317323 }
318324
319325
320326
321327 @Callable(i)
322328 func setScriptVersion () = if ((i.callerPublicKey != adminPublicKey))
323329 then throw("This action can only be performed by an administrator!")
324330 else if ((size(i.payments) > 0))
325331 then throw("Don't attach payment when calling this function ...")
326332 else {
327333 let oldVersion = valueOrElse(getString(this, versionDataKey), "")
328334 let versionList = split(drop(scriptVersion, 1), "_")
329335 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)], "-") + ")")], " ")
330336 if ((oldVersion != scriptVersion))
331- then [StringEntry(versionDataKey, scriptVersion), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)]
337+ then [ScriptTransfer(i.caller, 500000, unit), StringEntry(versionDataKey, scriptVersion), StringEntry(logEntryDataKey, logEntryDataValue), IntegerEntry(timestampDataKey, lastBlock.timestamp)]
332338 else throw(("The script version has already been updated: " + scriptVersion))
333339 }
334340
335341
336342 @Verifier(tx)
337343 func verify () = {
338344 let isValidOwner = sigVerify_32Kb(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
339345 let isValidMMBot = if (isValidOwner)
340346 then true
341347 else sigVerify_8Kb(tx.bodyBytes, tx.proofs[1], mmbotPublicKey)
342348 let isValidAdmin = if (isValidOwner)
343349 then true
344350 else sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], adminPublicKey)
345351 let validGuarantors = (((((if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[1], guarantors[0]))
346352 then 1
347353 else 0) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[2], guarantors[1]))
348354 then 1
349355 else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[3], guarantors[2]))
350356 then 1
351357 else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[4], guarantors[3]))
352358 then 1
353359 else 0)) + (if (sigVerify_32Kb(tx.bodyBytes, tx.proofs[5], guarantors[4]))
354360 then 1
355361 else 0))
356362 let anyValidGuarantor = (validGuarantors > 0)
357363 let isValidGuarantors = (validGuarantors >= minSignatures)
358364 let wavesLease = (wavesRegular - wavesAvailable)
359365 let wavesFunds = (wavesRegular + wavesBalance(fcold).regular)
360- let maxSaleAmount = validate((saleFunds - assetBalance(fsale, fmmtAsset)))
366+ let maxSaleAmount = validate((saleFunds - assetBalance(this, fmmtAsset)))
361367 let maxLeaseAmount = validate((fraction(wavesFunds, leasePercent, percent) - wavesLease))
362368 match tx {
363369 case o: Order =>
364370 if (if (if (isValidMMBot)
365371 then if (if (if ((o.orderType == Buy))
366372 then (o.assetPair.priceAsset != xfeeAsset)
367373 else false)
368374 then containsElement(portfolio, o.assetPair.amountAsset)
369375 else false)
370376 then true
371377 else if (if ((o.orderType == Sell))
372378 then (o.assetPair.amountAsset != xfeeAsset)
373379 else false)
374380 then containsElement(portfolio, o.assetPair.priceAsset)
375381 else false
376382 else false)
377383 then !(isDefined(o.matcherFeeAssetId))
378384 else false)
379385 then (o.matcherPublicKey == wxchgPublicKey)
380386 else false
381387 case t: TransferTransaction =>
382388 if (if (if (if (isValidOwner)
383389 then !(containsElement(portfolio, t.assetId))
384390 else false)
385391 then !(containsElement(portfolio, t.feeAssetId))
386392 else false)
387393 then true
388394 else if (if (if (isValidAdmin)
389395 then (t.assetId == fmmtAsset)
390396 else false)
391397 then (maxSaleAmount >= t.amount)
392398 else false)
393399 then (addressFromRecipient(t.recipient) == fsale)
394400 else false)
395401 then true
396402 else if (if (if (anyValidGuarantor)
397403 then (t.assetId != fmmtAsset)
398404 else false)
399405 then containsElement(portfolio, t.assetId)
400406 else false)
401407 then (addressFromRecipient(t.recipient) == fcold)
402408 else false
403409 case l: LeaseTransaction =>
404410 if (isValidMMBot)
405411 then (maxLeaseAmount >= l.amount)
406412 else false
407413 case _: LeaseCancelTransaction =>
408414 if (isValidMMBot)
409415 then true
410416 else anyValidGuarantor
411417 case _: SetScriptTransaction|DataTransaction =>
412418 if (isValidAdmin)
413419 then isValidGuarantors
414420 else false
415421 case _ =>
416422 false
417423 }
418424 }
419425

github/deemru/w8io/786bc32 
117.49 ms