tx · CTvrV6qhmSxiMpCsBQPY4gXacNQpyhtuynMb88Ua5kLD

3MzNgrEUhroThbrRs5DXGbo7x8nu84NqPfU:  -0.14000000 Waves

2022.06.02 14:17 [2078639] smart account 3MzNgrEUhroThbrRs5DXGbo7x8nu84NqPfU > SELF 0.00000000 Waves

{ "type": 13, "id": "CTvrV6qhmSxiMpCsBQPY4gXacNQpyhtuynMb88Ua5kLD", "fee": 14000000, "feeAssetId": null, "timestamp": 1654168519532, "version": 2, "chainId": 84, "sender": "3MzNgrEUhroThbrRs5DXGbo7x8nu84NqPfU", "senderPublicKey": "9rfquow4nYxXdYLnj2FRCVCi9ZUa2BSBci3YMueg53DF", "proofs": [ "5pVR3Z8X62hcQUXz2kRWy1X2Huo52ynxgvTUwey7jGsS7Hx77YP8kT16HpLW68NdnScBiU6wg5T144PGoYsZK5UJ", "3kNsdY4nDUzjztLscrAaUyALNdC2XgTZGFMuPx66JNPQ1Jh5ebhfeXe5t1McqizQcj4uyHYhnCZH6jdNmsmAt9X" ], "script": "base64:AAIFAAAAAAAAEmgIAhIAEgASBAoCAQESABIECgIBARIAEgASABIFCgMEAQgSABoMCgFBEgckbWF0Y2gwGgsKAUISBnN0cmluZxoMCgFDEgdub3RoaW5nGhEKAUQSDGFkbWluUHViS2V5MRoRCgFFEgxhZG1pblB1YktleTIaEQoBRhIMYWRtaW5QdWJLZXkzGhYKAUcSEWFkbWluUHViS2V5SW52b2tlGhQKAUgSD21vbmV5Qm94QWRkcmVzcxoPCgFJEgpnb3ZBZGRyZXNzGhcKAUoSEnN0YWtpbmdVU0ROQWRkcmVzcxoJCgFLEgRVU0ROGhIKAUwSDXN0YWtpbmdBc3NldHMaCwoBTRIGYWN0aXZlGhAKAU4SC3N0ckFzc2V0SWRBGhAKAU8SC3N0ckFzc2V0SWRCGg0KAVASCGFzc2V0SWRBGg0KAVESCGFzc2V0SWRCGg8KAVISCmFzc2V0TmFtZUEaBwoBUxICaWQaCgoBVBIFd2F2ZXMaDwoBVRIKYXNzZXROYW1lQhoNCgFWEghiYWxhbmNlQRoNCgFXEghiYWxhbmNlQhoRCgFYEgxzaGFyZUFzc2V0SWQaFQoBWRIQc2hhcmVBc3NldFN1cHBseRoOCgFaEglpbnZhcmlhbnQaDAoBYRIHdmVyc2lvbhofCgJhQRIZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQhoWCgJhQhIQaGFzRW5vdWdoQmFsYW5jZRoOCgJhQxIIc2tld25lc3MaBwoCYUQSAXgaBwoCYUUSAXkaEwoCYUYSDWludmFyaWFudENhbGMaCAoCYUcSAnNrGhkKAmFIEhNjYWxjdWxhdGVTZW5kQW1vdW50GhsKAmFJEhVhbW91bnRUb1NlbmRFc3RpbWF0ZWQaGwoCYUoSFW1pblRva2VuUmVjZWl2ZUFtb3VudBoYCgJhSxISdG9rZW5SZWNlaXZlQW1vdW50Gg0KAmFMEgd0b2tlbklkGiMKAmFNEh13b3JzdEFsbG93ZWROZXdJbnZhcmlhbnRSYXRpbxokCgJhThIeZGVsdGFCZXR3ZWVuTWF4QW5kTWluU2VuZFZhbHVlGhMKAmFPEg1nZXRTdGVwQW1vdW50GgkKAmFQEgNhY2MaCgoCYVESBHN0ZXAaEgoCYVISDGFtb3VudFRvU2VuZBoTCgJhUxINc3RlcEludmFyaWFudBoVCgJhVBIPYW1vdW50VG9TZW5kTWluGhIKAmFVEgxpbnZFc3RpbWF0ZWQaBwoCYVYSAWEaCAoCYVcSAiRsGggKAmFYEgIkcxoLCgJhWRIFJGFjYzAaCwoCYVoSBSRmMF8xGgkKAmFhEgNmZWUaEwoCYWISDWZlZUdvdmVybmFuY2UaDwoCYWMSCWZlZVNjYWxlNhoMCgJhZBIGc2NhbGUzGgwKAmFlEgZzY2FsZTgaDQoCYWYSB3NjYWxlMTYaFAoCYWcSDnNsaXBwYWdlU2NhbGUzGg0KAmFoEgdkaWdpdHM4GhMKAmFpEg1kQXBwVGhyZXNob2xkGhkKAmFqEhNkQXBwVGhyZXNob2xkU2NhbGUyGhsKAmFrEhVleGNoYW5nZVJhdGlvTGltaXRNaW4aGwoCYWwSFWV4Y2hhbmdlUmF0aW9MaW1pdE1heBoLCgJhbRIFYWxwaGEaEQoCYW4SC2FscGhhRGlnaXRzGgoKAmFvEgRiZXRhGhQKAmFwEg5hY2NvdW50QmFsYW5jZRoNCgJhcRIHYXNzZXRJZBoSCgJhchIMc3Rha2VkQW1vdW50GhwKAmFzEhZzdGFrZWRBbW91bnRDYWxjdWxhdGVkGgkKAmF0EgNhSWQaBwoCYXUSAWkaEwoCYXYSDXN0YWtlZEFtb3VudEEaEwoCYXcSDXN0YWtlZEFtb3VudEIaFwoCYXgSEWF2YWlsYWJsZUJhbGFuY2VBGhcKAmF5EhFhdmFpbGFibGVCYWxhbmNlQhofCgJhehIZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQRoNCgFiEghrVmVyc2lvbhoRCgJiQRILJHQwOTQ5ODk1NjQaGgoCYkISFGNhbGN1bGF0ZUZlZURpc2NvdW50Gg4KAmJDEgh1c2VyQWRkchoQCgJiRBIKc3dvcEFtb3VudBoUCgJiRRIOZGlzY291bnRWYWx1ZXMaDwoCYkYSCWRpc2NvdW50cxoTCgJiRxINJHQwMTA3MzYxMDgxMxoQCgJiSBIKcG10QW1vdW50QRoRCgJiSRILcG10QXNzZXRJZEEaEwoCYkoSDSR0MDEwODE4MTA4OTUaEAoCYksSCnBtdEFtb3VudEIaEQoCYkwSC3BtdEFzc2V0SWRCGhMKAmJNEg0kdDAxMDkwMDEwOTc3GhQKAmJOEg5wbXRTdHJBc3NldElkQRoTCgJiTxINcG10QXNzZXROYW1lQRoSCgJiUBIMcG10RGVjaW1hbHNBGhMKAmJREg0kdDAxMDk4MjExMDU5GhQKAmJSEg5wbXRTdHJBc3NldElkQhoTCgJiUxINcG10QXNzZXROYW1lQhoSCgJiVBIMcG10RGVjaW1hbHNCGg8KAmJVEglzaGFyZU5hbWUaFgoCYlYSEHNoYXJlRGVzY3JpcHRpb24aEwoCYlcSDXNoYXJlRGVjaW1hbHMaGAoCYlgSEnNoYXJlSW5pdGlhbFN1cHBseRoQCgJiWRIKc2hhcmVJc3N1ZRoSCgJiWhIMc2hhcmVJc3N1ZUlkGggKAmJhEgIkYRoICgJiYhICJGkaCwoCYmMSBSRmMF8yGhUKAmJkEg90dXBsZVNlbmRCZXR0ZXIaEgoCYmUSDGdldEFzc2V0SW5mbxoOCgJiZhIIc3RyaW5nSWQaCgoCYmcSBGluZm8aDQoCYmgSB3N1c3BlbmQaCwoCYmkSBWNhdXNlGhMKAmJqEg10aHJvd0lzQWN0aXZlGg4KAmJrEghpc0FjdGl2ZRoRCgJibBILaXNBZG1pbkNhbGwaEQoCYm0SC3Rocm93QXNzZXRzGhUKAmJuEg90aHJvd09uZVBheW1lbnQaFAoCYm8SDnRocm93VGhyZXNob2xkGg8KAmJwEgl0aHJlc2hvbGQaDQoCYnESB2Ftb3VudEEaDQoCYnISB2Ftb3VudEIaFwoCYnMSEXN1c3BlbmRTdXNwaWNpb3VzGh4KAmJ0EhhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMaCwoCYnUSBXN0YWtlGhcKAmJ2EhFjYWxjU3Rha2luZ1BhcmFtcxoMCgJidxIGYW1vdW50GhEKAmJ4EgskdDA5MzQ2OTQxMhoKCgJieRIEY2FsbBoRCgJiehILc3Rha2luZ0FkZHIaDAoBYxIHa0FjdGl2ZRoiCgJjQRIcc2xpcHBhZ2VWYWx1ZU1heEZvclJlcGxlbmlzaBodCgJjQhIXc2xpcHBhZ2VWYWx1ZU1pbkZvclN3YXAaEwoCY0MSDSR0MDE3Mjc5MTc5MjEaFwoCY0QSEXZpcnR1YWxSZXBsZW5pc2hBGhcKAmNFEhF2aXJ0dWFsUmVwbGVuaXNoQhoXCgJjRhIRYmFsYW5jZUFmdGVyU3dhcEEaFwoCY0cSEWJhbGFuY2VBZnRlclN3YXBCGhEKAmNIEgtuZXdCYWxhbmNlQRoRCgJjSRILbmV3QmFsYW5jZUIaEgoCY0oSDGludmFyaWFudE5ldxorCgJjSxIlcmF0aW9WaXJ0dWFsQmFsYW5jZVRvVmlydHVhbFJlcGxlbmlzaBoZCgJjTBITZEFwcFRocmVzaG9sZEFtb3VudBojCgJjTRIdc2hhcmVUb2tlblRvUGF5QW1vdW50QWZ0ZXJGZWUaIAoCY04SGnNoYXJlVG9rZW5Hb3Zlcm5hbmNlUmV3YXJkGhwKAmNPEhZnb3Zlcm5hbmNlUmV3YXJkVG9rZW5BGhwKAmNQEhZnb3Zlcm5hbmNlUmV3YXJkVG9rZW5CGhMKAmNREg0kdDAxOTkwODIwMjAzGhEKAmNSEgtzdGFrZUFtb3VudBoTCgJjUxINdW5zdGFrZUFtb3VudBoSCgJjVBIMdW5zdGFrZUFzc2V0GhMKAmNVEg0kdDAyMTQ5MDIxNTY1GhIKAmNWEgxhbW91bnRUb1BheUEaEgoCY1cSDGFtb3VudFRvUGF5QhoeCgJjWBIYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlGhgKAmNZEhJtaW5BbW91bnRUb1JlY2VpdmUaEwoCY1oSDSR0MDIzMTE2MjMxOTEaGQoCY2ESE2ludmFyaWFudENhbGN1bGF0ZWQaDAoCY2ISBnN0YWtlMRoMCgJjYxIGc3Rha2UyGhkKAmNkEhNyYXRpb1NoYXJlVG9rZW5zSW5BGhkKAmNlEhNyYXRpb1NoYXJlVG9rZW5zSW5CGhMKAmNmEg0kdDAxMzcwNzEzNzg0GhMKAmNnEg0kdDAxMzc4OTEzOTA2GhMKAmNoEg0kdDAxMzkxMTE0NDE1GgkKAmNpEgNwbXQaDAoCY2oSBmNoYW5nZRoTCgJjaxINY2hhbmdlQXNzZXRJZBoVCgJjbBIPc2hhcmVUb2tlblJhdGlvGhsKAmNtEhVzaGFyZVRva2VuVG9QYXlBbW91bnQaGQoCY24SE3ZpcnR1YWxTd2FwVG9rZW5QYXkaGQoCY28SE3ZpcnR1YWxTd2FwVG9rZW5HZXQaEwoCY3ASDSR0MDE2MTQ4MTYyMjMaDwoCY3ESCXBtdEFtb3VudBoQCgJjchIKcG10QXNzZXRJZBoTCgJjcxINJHQwMTYyMjgxNjMwMRoTCgJjdBINcG10U3RyQXNzZXRJZBoSCgJjdRIMcG10QXNzZXROYW1lGhEKAmN2EgtwbXREZWNpbWFscxoVCgJjdxIPcG10TWluVGhyZXNob2xkGiMKAmN4Eh10aHJlc2hvbGRWYWx1ZUZvck1pblRvbGVyYW5jZRoPCgJjeRIJdG9sZXJhbmNlGiIKAmN6EhxzbGlwcGFnZVZhbHVlTWluRm9yUmVwbGVuaXNoGg4KAWQSCWtBc3NldElkQRoRCgJkYRILc2VuZEFzc2V0SWQaEQoCZGISC2ZlZURpc2NvdW50GhYKAmRjEhBnb3Zlcm5hbmNlUmV3YXJkGhQKAmRkEg5hbW91bnRNaW51c0ZlZRoTCgJkZRINJHQwMjQ2NDQyNDkwNhoTCgJkZhINJHQwMjUyMDUyNTI3OBoTCgJkZxINJHQwMjUyOTEyNTM2OBoUCgJkaBIOc2VuZFN0ckFzc2V0SWQaEwoCZGkSDXNlbmRBc3NldE5hbWUaEgoCZGoSDHNlbmREZWNpbWFscxoTCgJkaxINYW1vdW50RW5yb2xsQRoTCgJkbBINYW1vdW50RW5yb2xsQhoTCgJkbRINYXNzZXRJZFN0cmluZxoTCgJkbhINJHQwMjgzNzIyODQ3NRoKCgJkbxIEYWRkchoMCgJkcBIGcGFyYW1zGg4KAmRxEghwYXltZW50cxoJCgJkchIDaW52GggKAmRzEgJ0eBoMCgJkdBIGdmVyaWZ5GhkKAmR1EhNtdWx0aVNpZ25lZEJ5QWRtaW5zGhgKAmR2EhJhZG1pblB1YktleTFTaWduZWQaGAoCZHcSEmFkbWluUHViS2V5MlNpZ25lZBoYCgJkeBISYWRtaW5QdWJLZXkzU2lnbmVkGhkKAmR5EhNjYWxsVGFrZUludG9BY2NvdW50GhMKAmR6Eg1zaWduZWRCeUFkbWluGg4KAWUSCWtBc3NldElkQhoOCgFmEglrQmFsYW5jZUEaDgoBZxIJa0JhbGFuY2VCGhIKAWgSDWtTaGFyZUFzc2V0SWQaFgoBaRIRa1NoYXJlQXNzZXRTdXBwbHkaCQoBahIEa0ZlZRoPCgFrEgprSW52YXJpYW50GgsKAWwSBmtDYXVzZRoRCgFtEgxrVVNETkFkZHJlc3MaEQoBbhIMa0VVUk5BZGRyZXNzGg8KAW8SCmtEaXNj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", "height": 2078639, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CGDGjCZRTBGECNyweEmcPH3jiHCTaovEUcKjNaJhD4Po Next: 6KC4SoaVhtXtoMyjezydzWkdQQh6T6fsVYY6GCfteiPB Diff:
OldNewDifferences
343343 if (if ((swopAmount >= parseIntValue(discountValues[0])))
344344 then (parseIntValue(discountValues[1]) > swopAmount)
345345 else false)
346- then (100 - parseIntValue(discounts[0]))
346+ then (feeScale6 - parseIntValue(discounts[0]))
347347 else if (if ((swopAmount >= parseIntValue(discountValues[1])))
348348 then (parseIntValue(discountValues[2]) > swopAmount)
349349 else false)
350- then (100 - parseIntValue(discounts[1]))
350+ then (feeScale6 - parseIntValue(discounts[1]))
351351 else if (if ((swopAmount >= parseIntValue(discountValues[2])))
352352 then (parseIntValue(discountValues[3]) > swopAmount)
353353 else false)
354- then (100 - parseIntValue(discounts[2]))
354+ then (feeScale6 - parseIntValue(discounts[2]))
355355 else if (if ((swopAmount >= parseIntValue(discountValues[3])))
356356 then (parseIntValue(discountValues[4]) > swopAmount)
357357 else false)
358- then (100 - parseIntValue(discounts[3]))
358+ then (feeScale6 - parseIntValue(discounts[3]))
359359 else if ((swopAmount >= parseIntValue(discountValues[4])))
360- then (100 - parseIntValue(discounts[4]))
361- else 100
360+ then (feeScale6 - parseIntValue(discounts[4]))
361+ else feeScale6
362362 }
363363
364364
365365 @Callable(i)
366366 func init () = {
367- let $t01070010777 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
368- let pmtAmountA = $t01070010777._1
369- let pmtAssetIdA = $t01070010777._2
370- let $t01078210859 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
371- let pmtAmountB = $t01078210859._1
372- let pmtAssetIdB = $t01078210859._2
373- let $t01086410941 = getAssetInfo(pmtAssetIdA)
374- let pmtStrAssetIdA = $t01086410941._1
375- let pmtAssetNameA = $t01086410941._2
376- let pmtDecimalsA = $t01086410941._3
377- let $t01094611023 = getAssetInfo(pmtAssetIdB)
378- let pmtStrAssetIdB = $t01094611023._1
379- let pmtAssetNameB = $t01094611023._2
380- let pmtDecimalsB = $t01094611023._3
367+ let $t01073610813 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
368+ let pmtAmountA = $t01073610813._1
369+ let pmtAssetIdA = $t01073610813._2
370+ let $t01081810895 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
371+ let pmtAmountB = $t01081810895._1
372+ let pmtAssetIdB = $t01081810895._2
373+ let $t01090010977 = getAssetInfo(pmtAssetIdA)
374+ let pmtStrAssetIdA = $t01090010977._1
375+ let pmtAssetNameA = $t01090010977._2
376+ let pmtDecimalsA = $t01090010977._3
377+ let $t01098211059 = getAssetInfo(pmtAssetIdB)
378+ let pmtStrAssetIdB = $t01098211059._1
379+ let pmtAssetNameB = $t01098211059._2
380+ let pmtDecimalsB = $t01098211059._3
381381 if (isDefined(getBoolean(this, kActive)))
382382 then throwIsActive()
383383 else if ((pmtAssetIdA == pmtAssetIdB))
414414 let pmtAssetIdB = i.payments[1].assetId
415415 let ratioShareTokensInA = fraction(scale8, i.payments[0].amount, balanceA)
416416 let ratioShareTokensInB = fraction(scale8, i.payments[1].amount, balanceB)
417- let $t01367113748 = getAssetInfo(pmtAssetIdA)
418- let pmtStrAssetIdA = $t01367113748._1
419- let pmtAssetNameA = $t01367113748._2
420- let pmtDecimalsA = $t01367113748._3
421- let $t01375313870 = getAssetInfo(pmtAssetIdB)
422- let pmtStrAssetIdB = $t01375313870._1
423- let pmtAssetNameB = $t01375313870._2
424- let pmtDecimalsB = $t01375313870._3
425- let $t01387514379 = if ((ratioShareTokensInB > ratioShareTokensInA))
417+ let $t01370713784 = getAssetInfo(pmtAssetIdA)
418+ let pmtStrAssetIdA = $t01370713784._1
419+ let pmtAssetNameA = $t01370713784._2
420+ let pmtDecimalsA = $t01370713784._3
421+ let $t01378913906 = getAssetInfo(pmtAssetIdB)
422+ let pmtStrAssetIdB = $t01378913906._1
423+ let pmtAssetNameB = $t01378913906._2
424+ let pmtDecimalsB = $t01378913906._3
425+ let $t01391114415 = if ((ratioShareTokensInB > ratioShareTokensInA))
426426 then {
427427 let pmt = fraction(balanceB, ratioShareTokensInA, scale8, CEILING)
428428 $Tuple5(i.payments[0].amount, pmt, (i.payments[1].amount - pmt), pmtAssetIdB, ratioShareTokensInA)
431431 let pmt = fraction(balanceA, ratioShareTokensInB, scale8, CEILING)
432432 $Tuple5(pmt, i.payments[1].amount, (i.payments[0].amount - pmt), pmtAssetIdA, ratioShareTokensInB)
433433 }
434- let pmtAmountA = $t01387514379._1
435- let pmtAmountB = $t01387514379._2
436- let change = $t01387514379._3
437- let changeAssetId = $t01387514379._4
438- let shareTokenRatio = $t01387514379._5
434+ let pmtAmountA = $t01391114415._1
435+ let pmtAmountB = $t01391114415._2
436+ let change = $t01391114415._3
437+ let changeAssetId = $t01391114415._4
438+ let shareTokenRatio = $t01391114415._5
439439 let shareTokenToPayAmount = fraction(shareTokenRatio, shareAssetSupply, scale8)
440440 if ((size(i.payments) != 2))
441441 then throw("Two attached assets expected")
470470
471471 @Callable(i)
472472 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = valueOrElse(isActive(), {
473- let $t01611216187 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
474- let pmtAmount = $t01611216187._1
475- let pmtAssetId = $t01611216187._2
476- let $t01619216265 = getAssetInfo(pmtAssetId)
477- let pmtStrAssetId = $t01619216265._1
478- let pmtAssetName = $t01619216265._2
479- let pmtDecimals = $t01619216265._3
473+ let $t01614816223 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
474+ let pmtAmount = $t01614816223._1
475+ let pmtAssetId = $t01614816223._2
476+ let $t01622816301 = getAssetInfo(pmtAssetId)
477+ let pmtStrAssetId = $t01622816301._1
478+ let pmtAssetName = $t01622816301._2
479+ let pmtDecimals = $t01622816301._3
480480 let pmtMinThreshold = 5000000
481481 let thresholdValueForMinTolerance = 50000000
482482 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
496496 else false)
497497 then throwAssets()
498498 else {
499- let $t01724317885 = if ((pmtAssetId == assetIdA))
499+ let $t01727917921 = if ((pmtAssetId == assetIdA))
500500 then $Tuple6((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), (balanceA + pmtAmount), balanceB)
501501 else $Tuple6(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), balanceA, (balanceB + pmtAmount))
502- let virtualReplenishA = $t01724317885._1
503- let virtualReplenishB = $t01724317885._2
504- let balanceAfterSwapA = $t01724317885._3
505- let balanceAfterSwapB = $t01724317885._4
506- let newBalanceA = $t01724317885._5
507- let newBalanceB = $t01724317885._6
502+ let virtualReplenishA = $t01727917921._1
503+ let virtualReplenishB = $t01727917921._2
504+ let balanceAfterSwapA = $t01727917921._3
505+ let balanceAfterSwapB = $t01727917921._4
506+ let newBalanceA = $t01727917921._5
507+ let newBalanceB = $t01727917921._6
508508 let invariantNew = invariantCalc(balanceAfterSwapA, balanceAfterSwapB)
509509 let ratioVirtualBalanceToVirtualReplenish = (fraction(scale16, balanceAfterSwapA, balanceAfterSwapB) / fraction(scale8, virtualReplenishA, virtualReplenishB))
510510 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
528528 let shareTokenGovernanceReward = fraction(shareTokenToPayAmount, (feeGovernance / 2), feeScale6)
529529 let governanceRewardTokenA = fraction(shareTokenGovernanceReward, balanceA, shareAssetSupply)
530530 let governanceRewardTokenB = fraction(shareTokenGovernanceReward, balanceB, shareAssetSupply)
531- let $t01987220167 = if ((pmtStrAssetId == strAssetIdA))
531+ let $t01990820203 = if ((pmtStrAssetId == strAssetIdA))
532532 then $Tuple3((pmtAmount - governanceRewardTokenA), governanceRewardTokenB, strAssetIdB)
533533 else $Tuple3((pmtAmount - governanceRewardTokenB), governanceRewardTokenA, strAssetIdA)
534- let stakeAmount = $t01987220167._1
535- let unstakeAmount = $t01987220167._2
536- let unstakeAsset = $t01987220167._3
534+ let stakeAmount = $t01990820203._1
535+ let unstakeAmount = $t01990820203._2
536+ let unstakeAsset = $t01990820203._3
537537 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
538538 then invoke(this, "stakeUnstake", [true, stakeAmount, pmtStrAssetId], nil)
539539 else 0
555555
556556 @Callable(i)
557557 func withdraw () = valueOrElse(isActive(), {
558- let $t02145421529 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
559- let pmtAmount = $t02145421529._1
560- let pmtAssetId = $t02145421529._2
558+ let $t02149021565 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
559+ let pmtAmount = $t02149021565._1
560+ let pmtAssetId = $t02149021565._2
561561 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
562562 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
563563 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
588588
589589 @Callable(i)
590590 func exchange (estimatedAmountToReceive,minAmountToReceive) = valueOrElse(isActive(), {
591- let $t02308023155 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
592- let pmtAmount = $t02308023155._1
593- let pmtAssetId = $t02308023155._2
591+ let $t02311623191 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
592+ let pmtAmount = $t02311623191._1
593+ let pmtAssetId = $t02311623191._2
594594 if ((0 >= estimatedAmountToReceive))
595595 then throw(("Estimated amount must be positive. Actual: " + toString(estimatedAmountToReceive)))
596596 else if ((minAmountToReceive > estimatedAmountToReceive))
615615 else assetIdA
616616 let amount = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
617617 let feeDiscount = calculateFeeDiscount(i.originCaller)
618- let governanceReward = fraction(amount, fraction(feeGovernance, feeDiscount, 100, CEILING), feeScale6)
619- let amountMinusFee = fraction(amount, (feeScale6 - fraction(fee, feeDiscount, 100, CEILING)), feeScale6)
620- let $t02459824860 = if ((pmtAssetId == assetIdA))
618+ let governanceReward = fraction(amount, fraction(feeGovernance, feeDiscount, feeScale6, CEILING), feeScale6)
619+ let amountMinusFee = fraction(amount, (feeScale6 - fraction(fee, feeDiscount, feeScale6, CEILING)), feeScale6)
620+ let $t02464424906 = if ((pmtAssetId == assetIdA))
621621 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
622622 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
623- let newBalanceA = $t02459824860._1
624- let newBalanceB = $t02459824860._2
623+ let newBalanceA = $t02464424906._1
624+ let newBalanceB = $t02464424906._2
625625 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
626626 if (if ((dAppThresholdAmount > newBalanceA))
627627 then true
628628 else (dAppThresholdAmount > newBalanceB))
629629 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
630630 else {
631- let $t02515925232 = getAssetInfo(pmtAssetId)
632- let pmtStrAssetId = $t02515925232._1
633- let pmtAssetName = $t02515925232._2
634- let pmtDecimals = $t02515925232._3
635- let $t02524525322 = getAssetInfo(sendAssetId)
636- let sendStrAssetId = $t02524525322._1
637- let sendAssetName = $t02524525322._2
638- let sendDecimals = $t02524525322._3
631+ let $t02520525278 = getAssetInfo(pmtAssetId)
632+ let pmtStrAssetId = $t02520525278._1
633+ let pmtAssetName = $t02520525278._2
634+ let pmtDecimals = $t02520525278._3
635+ let $t02529125368 = getAssetInfo(sendAssetId)
636+ let sendStrAssetId = $t02529125368._1
637+ let sendAssetName = $t02529125368._2
638+ let sendDecimals = $t02529125368._3
639639 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
640640 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
641641 else 0
711711 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
712712 then throw("Only contract itself can invoke this function")
713713 else {
714- let $t02832628429 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
715- let call = $t02832628429._1
716- let addr = $t02832628429._2
717- let params = $t02832628429._3
718- let payments = $t02832628429._4
714+ let $t02837228475 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
715+ let call = $t02837228475._1
716+ let addr = $t02837228475._2
717+ let params = $t02837228475._3
718+ let payments = $t02837228475._4
719719 let inv = invoke(addr, call, params, payments)
720720 if ((inv == inv))
721721 then nil
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let version = "2.0.0"
55
66 let kVersion = "version"
77
88 let kActive = "active"
99
1010 let kAssetIdA = "A_asset_id"
1111
1212 let kAssetIdB = "B_asset_id"
1313
1414 let kBalanceA = "A_asset_balance"
1515
1616 let kBalanceB = "B_asset_balance"
1717
1818 let kShareAssetId = "share_asset_id"
1919
2020 let kShareAssetSupply = "share_asset_supply"
2121
2222 let kFee = "commission"
2323
2424 let kInvariant = "invariant"
2525
2626 let kCause = "shutdown_cause"
2727
2828 let kUSDNAddress = "staking_usdnnsbt_address"
2929
3030 let kEURNAddress = "staking_eurn_address"
3131
3232 let kDiscounts = "discounts"
3333
3434 let kDiscountValues = "discount_values"
3535
3636 let kUserSwopInGov = "_SWOP_amount"
3737
3838 let kAdminPubKey1 = "admin_pub_1"
3939
4040 let kAdminPubKey2 = "admin_pub_2"
4141
4242 let kAdminPubKey3 = "admin_pub_3"
4343
4444 let kAdminInvokePubKey = "admin_invoke_pub"
4545
4646 let kMoneyBoxAddress = "money_box_address"
4747
4848 let kGovAddress = "governance_address"
4949
5050 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
5151
5252 func getBase58FromOracle (key) = match getString(oracle, key) {
5353 case string: String =>
5454 fromBase58String(string)
5555 case nothing =>
5656 throw((key + "is empty"))
5757 }
5858
5959
6060 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
6161
6262 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
6363
6464 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
6565
6666 let adminPubKeyInvoke = getBase58FromOracle(kAdminInvokePubKey)
6767
6868 let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
6969
7070 let govAddress = Address(getBase58FromOracle(kGovAddress))
7171
7272 let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
7373
7474 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
7575
7676 let stakingAssets = [toBase58String(USDN)]
7777
7878 let active = getBooleanValue(this, kActive)
7979
8080 let strAssetIdA = getStringValue(this, kAssetIdA)
8181
8282 let strAssetIdB = getStringValue(this, kAssetIdB)
8383
8484 let assetIdA = if ((strAssetIdA == "WAVES"))
8585 then unit
8686 else fromBase58String(strAssetIdA)
8787
8888 let assetIdB = if ((strAssetIdB == "WAVES"))
8989 then unit
9090 else fromBase58String(strAssetIdB)
9191
9292 let assetNameA = match assetIdA {
9393 case id: ByteVector =>
9494 value(assetInfo(id)).name
9595 case waves: Unit =>
9696 "WAVES"
9797 case _ =>
9898 throw("Match error")
9999 }
100100
101101 let assetNameB = match assetIdB {
102102 case id: ByteVector =>
103103 value(assetInfo(id)).name
104104 case waves: Unit =>
105105 "WAVES"
106106 case _ =>
107107 throw("Match error")
108108 }
109109
110110 let balanceA = getIntegerValue(this, kBalanceA)
111111
112112 let balanceB = getIntegerValue(this, kBalanceB)
113113
114114 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
115115
116116 let shareAssetSupply = getIntegerValue(this, kShareAssetSupply)
117117
118118 let invariant = getIntegerValue(this, kInvariant)
119119
120120 let fee = getIntegerValue(this, kFee)
121121
122122 let feeGovernance = fraction(fee, 40, 100)
123123
124124 let feeScale6 = 1000000
125125
126126 let scale3 = 1000
127127
128128 let scale8 = 100000000
129129
130130 let scale16 = 10000000000000000
131131
132132 let slippageScale3 = 1000
133133
134134 let digits8 = 8
135135
136136 let dAppThreshold = 50
137137
138138 let dAppThresholdScale2 = 100
139139
140140 let exchangeRatioLimitMin = 90000000
141141
142142 let exchangeRatioLimitMax = 110000000
143143
144144 let alpha = 50
145145
146146 let alphaDigits = 2
147147
148148 let beta = 4600000000000000
149149
150150 func accountBalance (assetId) = match assetId {
151151 case id: ByteVector =>
152152 assetBalance(this, id)
153153 case waves: Unit =>
154154 wavesBalance(this).available
155155 case _ =>
156156 throw("Match error")
157157 }
158158
159159
160160 func stakedAmount (assetId) = {
161161 let stakedAmountCalculated = match assetId {
162162 case aId: ByteVector =>
163163 if ((aId == USDN))
164164 then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
165165 else 0
166166 case _: Unit =>
167167 0
168168 case _ =>
169169 throw("Match error")
170170 }
171171 match stakedAmountCalculated {
172172 case i: Int =>
173173 i
174174 case _ =>
175175 0
176176 }
177177 }
178178
179179
180180 let stakedAmountA = stakedAmount(assetIdA)
181181
182182 let stakedAmountB = stakedAmount(assetIdB)
183183
184184 let availableBalanceA = (balanceA - stakedAmountA)
185185
186186 let availableBalanceB = (balanceB - stakedAmountB)
187187
188188 let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
189189
190190 let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
191191
192192 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
193193 then (accountBalanceWithStakedB >= balanceB)
194194 else false
195195
196196 func skewness (x,y) = ((fraction(scale16, x, y) + fraction(scale16, y, x)) / 2)
197197
198198
199199 func invariantCalc (x,y) = {
200200 let sk = skewness(x, y)
201201 (fraction((x + y), scale16, pow(sk, digits8, alpha, alphaDigits, digits8, CEILING)) + (2 * fraction(toInt(pow(fraction(toBigInt(x), toBigInt(y), toBigInt(scale8)), 0, toBigInt(5), 1, (digits8 / 2), DOWN)), pow((sk - beta), digits8, alpha, alphaDigits, digits8, DOWN), scale8)))
202202 }
203203
204204
205205 func calculateSendAmount (amountToSendEstimated,minTokenReceiveAmount,tokenReceiveAmount,tokenId) = {
206206 let worstAllowedNewInvariantRatio = (scale16 - ((scale16 * 1) / 10000000))
207207 let deltaBetweenMaxAndMinSendValue = (amountToSendEstimated - minTokenReceiveAmount)
208208 let x = (balanceA + tokenReceiveAmount)
209209 let y = (balanceB + tokenReceiveAmount)
210210 func getStepAmount (acc,step) = if ((acc._1 == -1))
211211 then {
212212 let amountToSend = (amountToSendEstimated - (((step * deltaBetweenMaxAndMinSendValue) / 3) / scale3))
213213 let stepInvariant = if ((tokenId == assetIdA))
214214 then invariantCalc(x, (balanceB - amountToSend))
215215 else invariantCalc((balanceA - amountToSend), y)
216216 if ((stepInvariant > invariant))
217217 then $Tuple2(amountToSend, stepInvariant)
218218 else $Tuple2(-1, 0)
219219 }
220220 else acc
221221
222222 let amountToSendMin = getStepAmount($Tuple2(-1, 0), 3000)
223223 if ((0 > amountToSendMin._1))
224224 then throw("Price is worse than minReceived")
225225 else {
226226 let invEstimated = if ((tokenId == assetIdA))
227227 then invariantCalc(x, (balanceB - amountToSendEstimated))
228228 else if ((tokenId == assetIdB))
229229 then invariantCalc((balanceA - amountToSendEstimated), y)
230230 else throw("Wrong asset in payment")
231231 if ((invariant > invEstimated))
232232 then if ((worstAllowedNewInvariantRatio >= fraction(scale16, invariant, invEstimated)))
233233 then throw("The requested price is too not profitable for user")
234234 else {
235235 let a = {
236236 let $l = [25, 200, 500]
237237 let $s = size($l)
238238 let $acc0 = $Tuple2(-1, 0)
239239 func $f0_1 ($a,$i) = if (($i >= $s))
240240 then $a
241241 else getStepAmount($a, $l[$i])
242242
243243 func $f0_2 ($a,$i) = if (($i >= $s))
244244 then $a
245245 else throw("List size exceeds 3")
246246
247247 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
248248 }
249249 if ((0 > a._1))
250250 then amountToSendMin._1
251251 else a._1
252252 }
253253 else {
254254 let a = {
255255 let $l = [-500, -200, -25]
256256 let $s = size($l)
257257 let $acc0 = $Tuple2(-1, 0)
258258 func $f0_1 ($a,$i) = if (($i >= $s))
259259 then $a
260260 else getStepAmount($a, $l[$i])
261261
262262 func $f0_2 ($a,$i) = if (($i >= $s))
263263 then $a
264264 else throw("List size exceeds 3")
265265
266266 $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
267267 }
268268 let tupleSendBetter = if ((0 > a._1))
269269 then $Tuple2(amountToSendEstimated, invEstimated)
270270 else a
271271 if ((worstAllowedNewInvariantRatio >= fraction(scale16, invariant, tupleSendBetter._2)))
272272 then throw("The requested price is too not profitable for user")
273273 else tupleSendBetter._1
274274 }
275275 }
276276 }
277277
278278
279279 func getAssetInfo (assetId) = match assetId {
280280 case id: ByteVector =>
281281 let stringId = toBase58String(id)
282282 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
283283 $Tuple3(stringId, info.name, info.decimals)
284284 case waves: Unit =>
285285 $Tuple3("WAVES", "WAVES", 8)
286286 case _ =>
287287 throw("Match error")
288288 }
289289
290290
291291 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
292292
293293
294294 func throwIsActive () = throw("DApp is already active")
295295
296296
297297 func isActive () = if (active)
298298 then unit
299299 else throw("DApp is inactive at this moment")
300300
301301
302302 func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
303303 then unit
304304 else throw("Only admin can call this function")
305305
306306
307307 func throwAssets () = throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
308308
309309
310310 func throwOnePayment () = throw("One attached payment expected")
311311
312312
313313 func throwThreshold (threshold,amountA,amountB) = throw(((((((((("New balance in assets of the DApp is less than threshold " + toString(threshold)) + ": ") + toString(amountA)) + " ") + assetNameA) + ", ") + toString(amountB)) + " ") + assetNameB))
314314
315315
316316 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
317317
318318
319319 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
320320 then $Tuple2("lockNeutrino", stakingUSDNAddress)
321321 else $Tuple2("unlockNeutrino", stakingUSDNAddress)
322322
323323
324324 func calcStakingParams (stake,amount,assetId) = if (stake)
325325 then {
326326 let $t093469412 = calcStakingFuncAndAddres(stake, assetId)
327327 let call = $t093469412._1
328328 let stakingAddr = $t093469412._2
329329 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
330330 }
331331 else {
332332 let $t094989564 = calcStakingFuncAndAddres(stake, assetId)
333333 let call = $t094989564._1
334334 let stakingAddr = $t094989564._2
335335 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
336336 }
337337
338338
339339 func calculateFeeDiscount (userAddr) = {
340340 let swopAmount = valueOrElse(getInteger(govAddress, (toString(userAddr) + kUserSwopInGov)), 0)
341341 let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
342342 let discounts = split(getStringValue(oracle, kDiscounts), ",")
343343 if (if ((swopAmount >= parseIntValue(discountValues[0])))
344344 then (parseIntValue(discountValues[1]) > swopAmount)
345345 else false)
346- then (100 - parseIntValue(discounts[0]))
346+ then (feeScale6 - parseIntValue(discounts[0]))
347347 else if (if ((swopAmount >= parseIntValue(discountValues[1])))
348348 then (parseIntValue(discountValues[2]) > swopAmount)
349349 else false)
350- then (100 - parseIntValue(discounts[1]))
350+ then (feeScale6 - parseIntValue(discounts[1]))
351351 else if (if ((swopAmount >= parseIntValue(discountValues[2])))
352352 then (parseIntValue(discountValues[3]) > swopAmount)
353353 else false)
354- then (100 - parseIntValue(discounts[2]))
354+ then (feeScale6 - parseIntValue(discounts[2]))
355355 else if (if ((swopAmount >= parseIntValue(discountValues[3])))
356356 then (parseIntValue(discountValues[4]) > swopAmount)
357357 else false)
358- then (100 - parseIntValue(discounts[3]))
358+ then (feeScale6 - parseIntValue(discounts[3]))
359359 else if ((swopAmount >= parseIntValue(discountValues[4])))
360- then (100 - parseIntValue(discounts[4]))
361- else 100
360+ then (feeScale6 - parseIntValue(discounts[4]))
361+ else feeScale6
362362 }
363363
364364
365365 @Callable(i)
366366 func init () = {
367- let $t01070010777 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
368- let pmtAmountA = $t01070010777._1
369- let pmtAssetIdA = $t01070010777._2
370- let $t01078210859 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
371- let pmtAmountB = $t01078210859._1
372- let pmtAssetIdB = $t01078210859._2
373- let $t01086410941 = getAssetInfo(pmtAssetIdA)
374- let pmtStrAssetIdA = $t01086410941._1
375- let pmtAssetNameA = $t01086410941._2
376- let pmtDecimalsA = $t01086410941._3
377- let $t01094611023 = getAssetInfo(pmtAssetIdB)
378- let pmtStrAssetIdB = $t01094611023._1
379- let pmtAssetNameB = $t01094611023._2
380- let pmtDecimalsB = $t01094611023._3
367+ let $t01073610813 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
368+ let pmtAmountA = $t01073610813._1
369+ let pmtAssetIdA = $t01073610813._2
370+ let $t01081810895 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
371+ let pmtAmountB = $t01081810895._1
372+ let pmtAssetIdB = $t01081810895._2
373+ let $t01090010977 = getAssetInfo(pmtAssetIdA)
374+ let pmtStrAssetIdA = $t01090010977._1
375+ let pmtAssetNameA = $t01090010977._2
376+ let pmtDecimalsA = $t01090010977._3
377+ let $t01098211059 = getAssetInfo(pmtAssetIdB)
378+ let pmtStrAssetIdB = $t01098211059._1
379+ let pmtAssetNameB = $t01098211059._2
380+ let pmtDecimalsB = $t01098211059._3
381381 if (isDefined(getBoolean(this, kActive)))
382382 then throwIsActive()
383383 else if ((pmtAssetIdA == pmtAssetIdB))
384384 then throw("Assets must be different")
385385 else {
386386 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
387387 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
388388 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
389389 let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
390390 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
391391 let shareIssueId = calculateAssetId(shareIssue)
392392 let invariantCalculated = invariantCalc(pmtAmountA, pmtAmountB)
393393 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
394394 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
395395 else 0
396396 if ((stake1 == stake1))
397397 then {
398398 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
399399 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
400400 else 0
401401 if ((stake2 == stake2))
402402 then [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceA, pmtAmountA), IntegerEntry(kBalanceB, pmtAmountB), IntegerEntry(kInvariant, invariantCalculated), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_flat")), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
403403 else throw("Strict value is not equal to itself.")
404404 }
405405 else throw("Strict value is not equal to itself.")
406406 }
407407 }
408408
409409
410410
411411 @Callable(i)
412412 func replenishWithTwoTokens () = valueOrElse(isActive(), {
413413 let pmtAssetIdA = i.payments[0].assetId
414414 let pmtAssetIdB = i.payments[1].assetId
415415 let ratioShareTokensInA = fraction(scale8, i.payments[0].amount, balanceA)
416416 let ratioShareTokensInB = fraction(scale8, i.payments[1].amount, balanceB)
417- let $t01367113748 = getAssetInfo(pmtAssetIdA)
418- let pmtStrAssetIdA = $t01367113748._1
419- let pmtAssetNameA = $t01367113748._2
420- let pmtDecimalsA = $t01367113748._3
421- let $t01375313870 = getAssetInfo(pmtAssetIdB)
422- let pmtStrAssetIdB = $t01375313870._1
423- let pmtAssetNameB = $t01375313870._2
424- let pmtDecimalsB = $t01375313870._3
425- let $t01387514379 = if ((ratioShareTokensInB > ratioShareTokensInA))
417+ let $t01370713784 = getAssetInfo(pmtAssetIdA)
418+ let pmtStrAssetIdA = $t01370713784._1
419+ let pmtAssetNameA = $t01370713784._2
420+ let pmtDecimalsA = $t01370713784._3
421+ let $t01378913906 = getAssetInfo(pmtAssetIdB)
422+ let pmtStrAssetIdB = $t01378913906._1
423+ let pmtAssetNameB = $t01378913906._2
424+ let pmtDecimalsB = $t01378913906._3
425+ let $t01391114415 = if ((ratioShareTokensInB > ratioShareTokensInA))
426426 then {
427427 let pmt = fraction(balanceB, ratioShareTokensInA, scale8, CEILING)
428428 $Tuple5(i.payments[0].amount, pmt, (i.payments[1].amount - pmt), pmtAssetIdB, ratioShareTokensInA)
429429 }
430430 else {
431431 let pmt = fraction(balanceA, ratioShareTokensInB, scale8, CEILING)
432432 $Tuple5(pmt, i.payments[1].amount, (i.payments[0].amount - pmt), pmtAssetIdA, ratioShareTokensInB)
433433 }
434- let pmtAmountA = $t01387514379._1
435- let pmtAmountB = $t01387514379._2
436- let change = $t01387514379._3
437- let changeAssetId = $t01387514379._4
438- let shareTokenRatio = $t01387514379._5
434+ let pmtAmountA = $t01391114415._1
435+ let pmtAmountB = $t01391114415._2
436+ let change = $t01391114415._3
437+ let changeAssetId = $t01391114415._4
438+ let shareTokenRatio = $t01391114415._5
439439 let shareTokenToPayAmount = fraction(shareTokenRatio, shareAssetSupply, scale8)
440440 if ((size(i.payments) != 2))
441441 then throw("Two attached assets expected")
442442 else if (if ((pmtAssetIdA != assetIdA))
443443 then true
444444 else (pmtAssetIdB != assetIdB))
445445 then throwAssets()
446446 else if ((shareTokenToPayAmount == 0))
447447 then throw("Too small amount to replenish")
448448 else if ((0 > change))
449449 then throw("Change < 0")
450450 else if (!(hasEnoughBalance))
451451 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
452452 else {
453453 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
454454 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
455455 else 0
456456 if ((stake1 == stake1))
457457 then {
458458 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
459459 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
460460 else 0
461461 if ((stake2 == stake2))
462462 then [IntegerEntry(kBalanceA, (balanceA + pmtAmountA)), IntegerEntry(kBalanceB, (balanceB + pmtAmountB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), IntegerEntry(kInvariant, invariantCalc((balanceA + pmtAmountA), (balanceB + pmtAmountB))), Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), ScriptTransfer(i.caller, change, changeAssetId)]
463463 else throw("Strict value is not equal to itself.")
464464 }
465465 else throw("Strict value is not equal to itself.")
466466 }
467467 })
468468
469469
470470
471471 @Callable(i)
472472 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = valueOrElse(isActive(), {
473- let $t01611216187 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
474- let pmtAmount = $t01611216187._1
475- let pmtAssetId = $t01611216187._2
476- let $t01619216265 = getAssetInfo(pmtAssetId)
477- let pmtStrAssetId = $t01619216265._1
478- let pmtAssetName = $t01619216265._2
479- let pmtDecimals = $t01619216265._3
473+ let $t01614816223 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
474+ let pmtAmount = $t01614816223._1
475+ let pmtAssetId = $t01614816223._2
476+ let $t01622816301 = getAssetInfo(pmtAssetId)
477+ let pmtStrAssetId = $t01622816301._1
478+ let pmtAssetName = $t01622816301._2
479+ let pmtDecimals = $t01622816301._3
480480 let pmtMinThreshold = 5000000
481481 let thresholdValueForMinTolerance = 50000000
482482 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
483483 then 100000
484484 else 1
485485 let slippageValueMinForReplenish = (scale8 - ((scale8 * tolerance) / 10000000))
486486 let slippageValueMaxForReplenish = (scale8 + ((scale8 * tolerance) / 10000000))
487487 let slippageValueMinForSwap = (scale8 - ((scale8 * 1) / 10000000))
488488 if ((pmtMinThreshold > pmtAmount))
489489 then throw((((("Payment amount " + toString(pmtAmount)) + " does not exceed the minimum amount of ") + toString(pmtMinThreshold)) + " tokens"))
490490 else if ((size(i.payments) != 1))
491491 then throwOnePayment()
492492 else if (!(hasEnoughBalance))
493493 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
494494 else if (if ((pmtAssetId != assetIdA))
495495 then (pmtAssetId != assetIdB)
496496 else false)
497497 then throwAssets()
498498 else {
499- let $t01724317885 = if ((pmtAssetId == assetIdA))
499+ let $t01727917921 = if ((pmtAssetId == assetIdA))
500500 then $Tuple6((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), (balanceA + pmtAmount), balanceB)
501501 else $Tuple6(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), balanceA, (balanceB + pmtAmount))
502- let virtualReplenishA = $t01724317885._1
503- let virtualReplenishB = $t01724317885._2
504- let balanceAfterSwapA = $t01724317885._3
505- let balanceAfterSwapB = $t01724317885._4
506- let newBalanceA = $t01724317885._5
507- let newBalanceB = $t01724317885._6
502+ let virtualReplenishA = $t01727917921._1
503+ let virtualReplenishB = $t01727917921._2
504+ let balanceAfterSwapA = $t01727917921._3
505+ let balanceAfterSwapB = $t01727917921._4
506+ let newBalanceA = $t01727917921._5
507+ let newBalanceB = $t01727917921._6
508508 let invariantNew = invariantCalc(balanceAfterSwapA, balanceAfterSwapB)
509509 let ratioVirtualBalanceToVirtualReplenish = (fraction(scale16, balanceAfterSwapA, balanceAfterSwapB) / fraction(scale8, virtualReplenishA, virtualReplenishB))
510510 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
511511 if (if ((slippageValueMinForSwap >= fraction(scale8, invariant, invariantNew)))
512512 then true
513513 else (invariant > invariantNew))
514514 then throw("Incorrect virtualSwapTokenPay or virtualSwapTokenGet value")
515515 else if (if ((slippageValueMinForReplenish > ratioVirtualBalanceToVirtualReplenish))
516516 then true
517517 else (ratioVirtualBalanceToVirtualReplenish > slippageValueMaxForReplenish))
518518 then throw("Swap with virtualSwapTokenPay and virtualSwapTokenGet is possible, but ratio after virtual swap is incorrect")
519519 else if (if ((dAppThresholdAmount > newBalanceA))
520520 then true
521521 else (dAppThresholdAmount > newBalanceB))
522522 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
523523 else {
524524 let ratioShareTokensInA = fraction(virtualReplenishA, scale8, balanceAfterSwapA)
525525 let ratioShareTokensInB = fraction(virtualReplenishB, scale8, balanceAfterSwapB)
526526 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
527527 let shareTokenToPayAmountAfterFee = fraction(shareTokenToPayAmount, (feeScale6 - (fee / 2)), feeScale6)
528528 let shareTokenGovernanceReward = fraction(shareTokenToPayAmount, (feeGovernance / 2), feeScale6)
529529 let governanceRewardTokenA = fraction(shareTokenGovernanceReward, balanceA, shareAssetSupply)
530530 let governanceRewardTokenB = fraction(shareTokenGovernanceReward, balanceB, shareAssetSupply)
531- let $t01987220167 = if ((pmtStrAssetId == strAssetIdA))
531+ let $t01990820203 = if ((pmtStrAssetId == strAssetIdA))
532532 then $Tuple3((pmtAmount - governanceRewardTokenA), governanceRewardTokenB, strAssetIdB)
533533 else $Tuple3((pmtAmount - governanceRewardTokenB), governanceRewardTokenA, strAssetIdA)
534- let stakeAmount = $t01987220167._1
535- let unstakeAmount = $t01987220167._2
536- let unstakeAsset = $t01987220167._3
534+ let stakeAmount = $t01990820203._1
535+ let unstakeAmount = $t01990820203._2
536+ let unstakeAsset = $t01990820203._3
537537 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
538538 then invoke(this, "stakeUnstake", [true, stakeAmount, pmtStrAssetId], nil)
539539 else 0
540540 if ((stake1 == stake1))
541541 then {
542542 let stake2 = if (containsElement(stakingAssets, unstakeAsset))
543543 then invoke(this, "stakeUnstake", [false, unstakeAmount, unstakeAsset], nil)
544544 else 0
545545 if ((stake2 == stake2))
546546 then [Reissue(shareAssetId, shareTokenToPayAmountAfterFee, true), ScriptTransfer(i.caller, shareTokenToPayAmountAfterFee, shareAssetId), ScriptTransfer(moneyBoxAddress, governanceRewardTokenA, assetIdA), ScriptTransfer(moneyBoxAddress, governanceRewardTokenB, assetIdB), IntegerEntry(kBalanceA, (newBalanceA - governanceRewardTokenA)), IntegerEntry(kBalanceB, (newBalanceB - governanceRewardTokenB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmountAfterFee)), IntegerEntry(kInvariant, invariantCalc((newBalanceA - governanceRewardTokenA), (newBalanceB - governanceRewardTokenB)))]
547547 else throw("Strict value is not equal to itself.")
548548 }
549549 else throw("Strict value is not equal to itself.")
550550 }
551551 }
552552 })
553553
554554
555555
556556 @Callable(i)
557557 func withdraw () = valueOrElse(isActive(), {
558- let $t02145421529 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
559- let pmtAmount = $t02145421529._1
560- let pmtAssetId = $t02145421529._2
558+ let $t02149021565 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
559+ let pmtAmount = $t02149021565._1
560+ let pmtAssetId = $t02149021565._2
561561 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
562562 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
563563 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
564564 if ((size(i.payments) != 1))
565565 then throwOnePayment()
566566 else if ((pmtAssetId != shareAssetId))
567567 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
568568 else if (!(hasEnoughBalance))
569569 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
570570 else {
571571 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
572572 then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
573573 else 0
574574 if ((stake1 == stake1))
575575 then {
576576 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
577577 then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
578578 else 0
579579 if ((stake2 == stake2))
580580 then [IntegerEntry(kBalanceA, (balanceA - amountToPayA)), IntegerEntry(kBalanceB, (balanceB - amountToPayB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply - pmtAmount)), IntegerEntry(kInvariant, invariantCalculated), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
581581 else throw("Strict value is not equal to itself.")
582582 }
583583 else throw("Strict value is not equal to itself.")
584584 }
585585 })
586586
587587
588588
589589 @Callable(i)
590590 func exchange (estimatedAmountToReceive,minAmountToReceive) = valueOrElse(isActive(), {
591- let $t02308023155 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
592- let pmtAmount = $t02308023155._1
593- let pmtAssetId = $t02308023155._2
591+ let $t02311623191 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
592+ let pmtAmount = $t02311623191._1
593+ let pmtAssetId = $t02311623191._2
594594 if ((0 >= estimatedAmountToReceive))
595595 then throw(("Estimated amount must be positive. Actual: " + toString(estimatedAmountToReceive)))
596596 else if ((minAmountToReceive > estimatedAmountToReceive))
597597 then throw("Minimal amount can't be greater than estimated.")
598598 else if ((size(i.payments) != 1))
599599 then throwOnePayment()
600600 else if (!(hasEnoughBalance))
601601 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
602602 else if (if ((pmtAssetId != assetIdA))
603603 then (pmtAssetId != assetIdB)
604604 else false)
605605 then throwAssets()
606606 else if ((10000000 > pmtAmount))
607607 then throw("Only swap of 10.000000 or more tokens is allowed")
608608 else if (if ((exchangeRatioLimitMin > fraction(scale8, minAmountToReceive, pmtAmount)))
609609 then true
610610 else (fraction(scale8, estimatedAmountToReceive, pmtAmount) > exchangeRatioLimitMax))
611611 then throw("Incorrect args and pmt ratio")
612612 else {
613613 let sendAssetId = if ((pmtAssetId == assetIdA))
614614 then assetIdB
615615 else assetIdA
616616 let amount = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
617617 let feeDiscount = calculateFeeDiscount(i.originCaller)
618- let governanceReward = fraction(amount, fraction(feeGovernance, feeDiscount, 100, CEILING), feeScale6)
619- let amountMinusFee = fraction(amount, (feeScale6 - fraction(fee, feeDiscount, 100, CEILING)), feeScale6)
620- let $t02459824860 = if ((pmtAssetId == assetIdA))
618+ let governanceReward = fraction(amount, fraction(feeGovernance, feeDiscount, feeScale6, CEILING), feeScale6)
619+ let amountMinusFee = fraction(amount, (feeScale6 - fraction(fee, feeDiscount, feeScale6, CEILING)), feeScale6)
620+ let $t02464424906 = if ((pmtAssetId == assetIdA))
621621 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
622622 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
623- let newBalanceA = $t02459824860._1
624- let newBalanceB = $t02459824860._2
623+ let newBalanceA = $t02464424906._1
624+ let newBalanceB = $t02464424906._2
625625 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
626626 if (if ((dAppThresholdAmount > newBalanceA))
627627 then true
628628 else (dAppThresholdAmount > newBalanceB))
629629 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
630630 else {
631- let $t02515925232 = getAssetInfo(pmtAssetId)
632- let pmtStrAssetId = $t02515925232._1
633- let pmtAssetName = $t02515925232._2
634- let pmtDecimals = $t02515925232._3
635- let $t02524525322 = getAssetInfo(sendAssetId)
636- let sendStrAssetId = $t02524525322._1
637- let sendAssetName = $t02524525322._2
638- let sendDecimals = $t02524525322._3
631+ let $t02520525278 = getAssetInfo(pmtAssetId)
632+ let pmtStrAssetId = $t02520525278._1
633+ let pmtAssetName = $t02520525278._2
634+ let pmtDecimals = $t02520525278._3
635+ let $t02529125368 = getAssetInfo(sendAssetId)
636+ let sendStrAssetId = $t02529125368._1
637+ let sendAssetName = $t02529125368._2
638+ let sendDecimals = $t02529125368._3
639639 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
640640 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
641641 else 0
642642 if ((stake1 == stake1))
643643 then {
644644 let stake2 = if (containsElement(stakingAssets, sendStrAssetId))
645645 then invoke(this, "stakeUnstake", [false, (amountMinusFee + governanceReward), sendStrAssetId], nil)
646646 else 0
647647 if ((stake2 == stake2))
648648 then $Tuple2([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, invariantCalc(newBalanceA, newBalanceB)), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(moneyBoxAddress, governanceReward, sendAssetId)], $Tuple2(amountMinusFee, sendAssetId))
649649 else throw("Strict value is not equal to itself.")
650650 }
651651 else throw("Strict value is not equal to itself.")
652652 }
653653 }
654654 })
655655
656656
657657
658658 @Callable(i)
659659 func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
660660 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
661661 else suspend("Paused by admin"))
662662
663663
664664
665665 @Callable(i)
666666 func activate () = valueOrElse(isAdminCall(i), if (active)
667667 then throwIsActive()
668668 else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
669669
670670
671671
672672 @Callable(i)
673673 func takeIntoAccountExtraFunds () = valueOrElse(isActive(), {
674674 let amountEnrollA = (accountBalanceWithStakedA - balanceA)
675675 let amountEnrollB = (accountBalanceWithStakedB - balanceB)
676676 let invariantNew = invariantCalc((balanceA + amountEnrollA), (balanceB + amountEnrollB))
677677 if ((i.caller != moneyBoxAddress))
678678 then throw("Only the money box can call this function")
679679 else if (if ((0 > amountEnrollA))
680680 then true
681681 else (0 > amountEnrollB))
682682 then suspend("Enroll amount negative")
683683 else if (if ((amountEnrollA == 0))
684684 then (amountEnrollB == 0)
685685 else false)
686686 then throw("No money to take")
687687 else {
688688 let stake1 = if (if (containsElement(stakingAssets, strAssetIdA))
689689 then (amountEnrollA > 0)
690690 else false)
691691 then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
692692 else 0
693693 if ((stake1 == stake1))
694694 then {
695695 let stake2 = if (if (containsElement(stakingAssets, strAssetIdB))
696696 then (amountEnrollB > 0)
697697 else false)
698698 then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
699699 else 0
700700 if ((stake2 == stake2))
701701 then [IntegerEntry(kInvariant, invariantNew), IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB))]
702702 else throw("Strict value is not equal to itself.")
703703 }
704704 else throw("Strict value is not equal to itself.")
705705 }
706706 })
707707
708708
709709
710710 @Callable(i)
711711 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
712712 then throw("Only contract itself can invoke this function")
713713 else {
714- let $t02832628429 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
715- let call = $t02832628429._1
716- let addr = $t02832628429._2
717- let params = $t02832628429._3
718- let payments = $t02832628429._4
714+ let $t02837228475 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
715+ let call = $t02837228475._1
716+ let addr = $t02837228475._2
717+ let params = $t02837228475._3
718+ let payments = $t02837228475._4
719719 let inv = invoke(addr, call, params, payments)
720720 if ((inv == inv))
721721 then nil
722722 else throw("Strict value is not equal to itself.")
723723 }
724724
725725
726726
727727 @Callable(i)
728728 func toBigIntInvariant () = valueOrElse(isAdminCall(i), [IntegerEntry(kInvariant, invariantCalc(balanceA, balanceB))])
729729
730730
731731 @Verifier(tx)
732732 func verify () = {
733733 let multiSignedByAdmins = {
734734 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
735735 then 1
736736 else 0
737737 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
738738 then 1
739739 else 0
740740 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
741741 then 1
742742 else 0
743743 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
744744 }
745745 match tx {
746746 case inv: InvokeScriptTransaction =>
747747 let callTakeIntoAccount = if ((inv.dApp == this))
748748 then (inv.function == "takeIntoAccountExtraFunds")
749749 else false
750750 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
751751 then true
752752 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
753753 then true
754754 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
755755 then true
756756 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyInvoke)
757757 if (if (callTakeIntoAccount)
758758 then signedByAdmin
759759 else false)
760760 then true
761761 else multiSignedByAdmins
762762 case _ =>
763763 multiSignedByAdmins
764764 }
765765 }
766766

github/deemru/w8io/873ac7e 
142.57 ms