tx · 8qapBEDzbTWJPvQ1cEwWJS2XPgE56qn3dLHANVPhHCn3

3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37:  -0.01400000 Waves

2021.09.16 16:03 [1705642] smart account 3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37 > SELF 0.00000000 Waves

{ "type": 13, "id": "8qapBEDzbTWJPvQ1cEwWJS2XPgE56qn3dLHANVPhHCn3", "fee": 1400000, "feeAssetId": null, "timestamp": 1631797474852, "version": 2, "chainId": 84, "sender": "3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37", "senderPublicKey": "4bwUHdA4vTBJ1k43dYKiPYTDqm3QqiZXNGXoQstGAD1k", "proofs": [ "5CM9MvrBciK2oDkcfDraXzcg8aAjDA5wz8Nkyq1BPHPf3fm63Z9ix3mk7xX1bw7cF3PxJv9kzrhyZahX4AJmDTSp", "3FgVVa4kZCpXtCRD4iwhPZjqJ2gPPLruGBuFEzgUoXwhhrjKeh59vrgscnBCwjeMdyX429T6AM833bKemzL9q9tx" ], "script": "base64:AAIFAAAAAAAAEBwIAhIDCgEIEgMKAQESAwoBARIAEgMKAQESABIAEgMKAQESABoNCgJhMRIHdmVyc2lvbhoQCgJhMhIKa2V5VmVyc2lvbhoPCgJhMxIJa2V5QWN0aXZlGhEKAmE0EgtrZXlBc3NldElkQRoRCgJhNRILa2V5QXNzZXRJZEIaEQoCYTYSC2tleUJhbGFuY2VBGhEKAmE3EgtrZXlCYWxhbmNlQhoVCgJhOBIPa2V5QmFsYW5jZUluaXRBGhUKAmE5Eg9rZXlCYWxhbmNlSW5pdEIaFQoCYjESD2tleVNoYXJlQXNzZXRJZBoZCgJiMhITa2V5U2hhcmVBc3NldFN1cHBseRoTCgJiMxINa2V5Q29tbWlzc2lvbhohCgJiNBIba2V5Q29tbWlzc2lvblNjYWxlRGVsaW1pdGVyGg4KAmI1EghrZXlDYXVzZRoVCgJiNhIPa2V5Rmlyc3RIYXJ2ZXN0GhsKAmI3EhVrZXlGaXJzdEhhcnZlc3RIZWlnaHQaEwoCYjgSDWtleVNoYXJlTGltaXQaEwoCYjkSDWtleUJhc2VQZXJpb2QaFQoCYzESD2tleVBlcmlvZExlbmd0aBoUCgJjMhIOa2V5U3RhcnRIZWlnaHQaHAoCYzMSFmtleU9yYWNsZUFzc2V0UHJpb3JpdHkaGQoCYzQSE2tleU9yYWNsZVNjcmlwdEhhc2gaFwoCYzUSEWtleUluaXRQb29sSGVpZ2h0GhUKAmM2Eg9rZXlBZG1pblB1YktleTEaFQoCYzcSD2tleUFkbWluUHViS2V5MhoVCgJjOBIPa2V5QWRtaW5QdWJLZXkzGgwKAmM5EgZvcmFjbGUaEQoCZDESC2dldEFkbWluUHViGhEKAmQyEgtrZXlBZG1pblB1YhoNCgJkMxIHJG1hdGNoMBoMCgJkNBIGc3RyaW5nGg0KAmQ1Egdub3RoaW5nGhIKAmQ2EgxhZG1pblB1YktleTEaEgoCZDcSDGFkbWluUHViS2V5MhoSCgJkOBIMYWRtaW5QdWJLZXkzGhoKAmQ5EhRhZG1pblB1YktleVN0YXJ0U3RvcBoYCgJlMRISYWRtaW5QdWJLZXlTdGFraW5nGhMKAmUyEg13YWxsZXRBZGRyZXNzGhMKAmUzEg12b3RpbmdBZGRyZXNzGgoKAmU0EgRVU0ROGgoKAmU1EgROU0JUGgoKAmU2EgRTV09QGgoKAmU3EgRFVVJOGhwKAmU4EhZzdGFraW5nVVNETk5TQlRBZGRyZXNzGhgKAmU5EhJzdGFraW5nRVVSTkFkZHJlc3MaGgoCZjESFFVTRE5Ub1dhdmVzRXhjaGFuZ2VyGhkKAmYyEhNVU0ROVG9OU0JURXhjaGFuZ2VyGhYKAmYzEhBzdGFraW5nRmVlSW5VU0ROGhYKAmY0EhBzdGFraW5nRmVlSW5FVVJOGhAKAmY1EgpiYXNlUGVyaW9kGhEKAmY2EgtzdGFydEhlaWdodBoSCgJmNxIMcGVyaW9kTGVuZ3RoGhsKAmY4EhVmaXJzdEhhcnZlc3RFbmRQZXJpb2QaDgoCZjkSCGlzQWN0aXZlGhEKAmcxEgtzdHJBc3NldElkQRoRCgJnMhILc3RyQXNzZXRJZEIaDgoCZzMSCGFzc2V0SWRBGg4KAmc0Eghhc3NldElkQhoQCgJnNRIKYXNzZXROYW1lQRoICgJnNhICaWQaCwoCZzcSBXdhdmVzGhAKAmc4Egphc3NldE5hbWVCGg4KAmc5EghiYWxhbmNlQRoOCgJoMRIIYmFsYW5jZUIaEgoCaDISDHNoYXJlQXNzZXRJZBoWCgJoMxIQc2hhcmVBc3NldFN1cHBseRoQCgJoNBIKY29tbWlzc2lvbhoaCgJoNRIUY29tbWlzc2lvbkdvdmVybmFuY2UaHgoCaDYSGGNvbW1pc3Npb25TY2FsZURlbGltaXRlchoRCgJoNxILc2NhbGVWYWx1ZTMaEQoCaDgSC3NjYWxlVmFsdWU4GiAKAmg5EhpzbGlwcGFnZVRvbGVyYW5jZURlbGltaXRlchoXCgJpMRIRc2NhbGVWYWx1ZThEaWdpdHMaHwoCaTISGWNvbWlzc2lvbkZvckluaXRhbGl6YXRpb24aFAoCaTMSDmFjY291bnRCYWxhbmNlGg0KAmk0Egdhc3NldElkGhIKAmk1EgxzdGFrZWRBbW91bnQaHAoCaTYSFnN0YWtlZEFtb3VudENhbGN1bGF0ZWQaCQoCaTcSA2FJZBoHCgJpOBIBaRoUCgJpORIOaXNBbGxvd2VkQXNzZXQaEwoCajESDXN0YWtlZEFtb3VudEEaEwoCajISDXN0YWtlZEFtb3VudEIaEAoCajMSCmFzc2V0SW5pdEEaEAoCajQSCmFzc2V0SW5pdEIaFwoCajUSEWF2YWlsYWJsZUJhbGFuY2VBGhcKAmo2EhFhdmFpbGFibGVCYWxhbmNlQhofCgJqNxIZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQRofCgJqOBIZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQhoWCgJqORIQaGFzRW5vdWdoQmFsYW5jZRoSCgJrMRIMZ2V0QXNzZXRJbmZvGg4KAmsyEghzdHJpbmdJZBoKCgJrMxIEaW5mbxocCgJrNBIWZ2V0QXNzZXRJbmZvRnJvbVN0cmluZxoOCgJrNRIIYXNzZXRTdHIaDQoCazYSB3N1c3BlbmQaCwoCazcSBWNhdXNlGhYKAms4EhBkZWR1Y3RTdGFraW5nRmVlGgwKAms5EgZhbW91bnQaEwoCbDESDXNlY29uZEFzc2V0SWQaDwoCbDISCXN0YWtpbkZlZRoMCgJsMxIGcmVzdWx0GhMKAmw0Eg1nZXRTdGFraW5nRmVlGicKAmw1EiF0aHJvd0luc3VmZmljaWVudEF2YWlsYWJsZUJhbGFuY2UaDwoCbDYSCWF2YWlsYWJsZRoPCgJsNxIJYXNzZXROYW1lGigKAmw4EiJ0aHJvd0luc3VmZmljaWVudEF2YWlsYWJsZUJhbGFuY2VzGg0KAmw5EgdhbW91bnRBGg0KAm0xEgdhbW91bnRCGhcKAm0yEhFzdXNwZW5kU3VzcGljaW91cxoUCgJtMxIOdXNlckFkZHJlc3NTdHIaEQoCbTQSCyR0MDgzNjA4NDM3GhAKAm01EgpwbXRBbW91bnQxGhEKAm02EgtwbXRBc3NldElkMRoRCgJtNxILJHQwODQ0Mjg1MTkaEAoCbTgSCnBtdEFtb3VudDIaEQoCbTkSC3BtdEFzc2V0SWQyGhEKAm4xEgskdDA4NTI0ODYwNxoTCgJuMhINcG10QW1vdW50U1dPUBoUCgJuMxIOcG10QXNzZXRJZFNXT1AaCwoCbjQSBWNoZWNrGhQKAm41Eg51c2VyU2NyaXB0SGFzaBoRCgJuNhILdXNlckFkZHJlc3MaFAoCbjcSDnBtdFN0ckFzc2V0SWQxGhQKAm44Eg5wbXRTdHJBc3NldElkMhoUCgJuORIOYXNzZXQxUHJpb3JpdHkaFAoCbzESDmFzc2V0MlByaW9yaXR5GhIKAm8yEgwkdDA5OTYzMTAxOTAaEAoCbzMSCnBtdEFtb3VudEEaEQoCbzQSC3BtdEFzc2V0SWRBGhAKAm81EgpwbXRBbW91bnRCGhEKAm82EgtwbXRBc3NldElkQhoTCgJvNxINJHQwMTAxOTkxMDI3NhoUCgJvOBIOcG10U3RyQXNzZXRJZEEaEwoCbzkSDXBtdEFzc2V0TmFtZUEaEgoCcDESDHBtdERlY2ltYWxzQRoTCgJwMhINJHQwMTAyODUxMDM2MhoUCgJwMxIOcG10U3RyQXNzZXRJZEIaEwoCcDQSDXBtdEFzc2V0TmFtZUIaEgoCcDUSDHBtdERlY2ltYWxzQhoPCgJwNhIJYWRkUGFyYW1zGg0KAnA3EgdhZGRQb29sGg8KAnA4EglzaGFyZU5hbWUaFgoCcDkSEHNoYXJlRGVzY3JpcHRpb24aEwoCcTESDXNoYXJlRGVjaW1hbHMaCgoCcTISBGFyZzEaCgoCcTMSBGFyZzIaCgoCcTQSBGFyZzMaGAoCcTUSEnNoYXJlSW5pdGlhbFN1cHBseRoQCgJxNhIKc2hhcmVJc3N1ZRoSCgJxNxIMc2hhcmVJc3N1ZUlkGg8KAnE4EgliYXNlRW50cnkaEAoCcTkSCnNoYXJlTGltaXQaFwoCcjESEXNsaXBwYWdlVG9sZXJhbmNlGhMKAnIyEg0kdDAxMzI4MjEzMzU5GhMKAnIzEg0kdDAxMzM2ODEzNDQ1GhAKAnI0Egp0b2tlblJhdGlvGhkKAnI1EhNyYXRpb1NoYXJlVG9rZW5zSW5BGhkKAnI2EhNyYXRpb1NoYXJlVG9rZW5zSW5CGhsKAnI3EhVzaGFyZVRva2VuVG9QYXlBbW91bnQaEwoCcjgSDSR0MDE3ODQ0MTc5OTQaDwoCcjkSCXBtdEFtb3VudBoQCgJzMRIKcG10QXNzZXRJZBoSCgJzMhIMYW1vdW50VG9QYXlBGhIKAnMzEgxhbW91bnRUb1BheUIaGAoCczQSEm1pbkFtb3VudFRvUmVjZWl2ZRoTCgJzNRINJHQwMTkyMjAxOTI5NRoTCgJzNhINY2FsY3VsYXRlRmVlcxoPCgJzNxIJdG9rZW5Gcm9tGg0KAnM4Egd0b2tlblRvGhYKAnM5EhBhbW91bnRXaXRob3V0RmVlGhMKAnQxEg1hbW91bnRXaXRoRmVlGhYKAnQyEhBnb3Zlcm5hbmNlUmV3YXJkGhEKAnQzEgthc3NldElkU2VuZBoTCgJ0NBINJHQwMjA1NjkyMDY2MBoRCgJ0NRILbmV3QmFsYW5jZUEaEQoCdDYSC25ld0JhbGFuY2VCGhMKAnQ3Eg0kdDAyMTQ3OTIxNTcwGhEKAnQ4EgthbW91bnRMZWF2ZRojCgJ0ORIddW5jb3VudGFibGVBbW91bnRFbnJvbGxBc3NldEEaIwoCdTESHXVuY291bnRhYmxlQW1vdW50RW5yb2xsQXNzZXRCGhMKAnUyEg1hbW91bnRFbnJvbGxBGhMKAnUzEg1hbW91bnRFbnJvbGxCGggKAnU0EgJ0eBoMCgJ1NRIGdmVyaWZ5GhkKAnU2EhNtdWx0aVNpZ25lZEJ5QWRtaW5zGhgKAnU3EhJhZG1pblB1YktleTFTaWduZWQaGAoCdTgSEmFkbWluUHViS2V5MlNpZ25lZBoYCgJ1ORISYWRtaW5QdWJLZXkzU2lnbmVkGgkKAnYxEgNpbnYaGQoCdjISE2NhbGxUYWtlSW50b0FjY291bnQaHAoCdjMSFmNhbGxFbmFibGVGaXJzdEhhcnZlc3QaEQoCdjQSC2NhbGxTdGFraW5nGhUKAnY1Eg9leGNoYW5nZVRvV2F2ZXMaFQoCdjYSD2V4Y2hhbmdlVG9OU0JUcxoTCgJ2NxINc2lnbmVkQnlBZG1pbgAAAFgAAAAAAmExAgAAAAUxLjAuMAAAAAACYTICAAAAB3ZlcnNpb24AAAAAAmEzAgAAAAZhY3RpdmUAAAAAAmE0AgAAAApBX2Fzc2V0X2lkAAAAAAJhNQIAAAAKQl9hc3NldF9pZAAAAAACYTYCAAAAD0FfYXNzZXRfYmFsYW5jZQAAAAACYTcCAAAAD0JfYXNzZXRfYmFsYW5jZQAAAAACYTgCAAAADEFfYXNzZXRfaW5pdAAAAAACYTkCAAAADEJfYXNzZXRfaW5pdAAAAAACYjECAAAADnNoYXJlX2Fzc2V0X2lkAAAAAAJiMgIAAAASc2hhcmVfYXNzZXRfc3VwcGx5AAAAAAJiMwIAAAAKY29tbWlzc2lvbgAAAAACYjQCAAAAGmNvbW1pc3Npb25fc2NhbGVfZGVsaW1pdGVyAAAAAAJiNQIAAAAOc2h1dGRvd25fY2F1c2UAAAAAAmI2AgAAAA1maXJzdF9o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", "height": 1705642, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: AcrRzHEcEPYSC45RLLJBonvpz8H2qVT6RDcTgZrDLzPb Next: 8JPZfJW9oMChr8rHqvf9neeS4JRbXM2aNxNaTK9yN4T7 Diff:
OldNewDifferences
4545
4646 let keyOracleScriptHash = "script_hash_cpmm"
4747
48-let keyInitPoolHeight = "init_pool_height_"
48+let keyInitPoolHeight = "init_pool_height"
4949
5050 let keyAdminPubKey1 = "admin_pub_1"
5151
293293
294294 @Callable(i)
295295 func init (userAddressStr) = {
296- let $t083618438 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
297- let pmtAmount1 = $t083618438._1
298- let pmtAssetId1 = $t083618438._2
299- let $t084438520 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
300- let pmtAmount2 = $t084438520._1
301- let pmtAssetId2 = $t084438520._2
302- let $t085258608 = $Tuple2(i.payments[2].amount, i.payments[2].assetId)
303- let pmtAmountSWOP = $t085258608._1
304- let pmtAssetIdSWOP = $t085258608._2
296+ let $t083608437 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
297+ let pmtAmount1 = $t083608437._1
298+ let pmtAssetId1 = $t083608437._2
299+ let $t084428519 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
300+ let pmtAmount2 = $t084428519._1
301+ let pmtAssetId2 = $t084428519._2
302+ let $t085248607 = $Tuple2(i.payments[2].amount, i.payments[2].assetId)
303+ let pmtAmountSWOP = $t085248607._1
304+ let pmtAssetIdSWOP = $t085248607._2
305305 let check = isDataStorageUntouched(this)
306306 let userScriptHash = scriptHash(this)
307307 let userAddress = addressFromStringValue(userAddressStr)
342342 }
343343 let asset1Priority = valueOrElse(getInteger(oracle, (keyOracleAssetPriority + pmtStrAssetId1)), 999999)
344344 let asset2Priority = valueOrElse(getInteger(oracle, (keyOracleAssetPriority + pmtStrAssetId2)), 999999)
345- let $t0996410191 = if ((asset2Priority > asset1Priority))
345+ let $t0996310190 = if ((asset2Priority > asset1Priority))
346346 then $Tuple4(pmtAmount2, pmtAssetId2, pmtAmount1, pmtAssetId1)
347347 else $Tuple4(pmtAmount1, pmtAssetId1, pmtAmount2, pmtAssetId2)
348- let pmtAmountA = $t0996410191._1
349- let pmtAssetIdA = $t0996410191._2
350- let pmtAmountB = $t0996410191._3
351- let pmtAssetIdB = $t0996410191._4
352- let $t01020010277 = getAssetInfo(pmtAssetIdA)
353- let pmtStrAssetIdA = $t01020010277._1
354- let pmtAssetNameA = $t01020010277._2
355- let pmtDecimalsA = $t01020010277._3
356- let $t01028610363 = getAssetInfo(pmtAssetIdB)
357- let pmtStrAssetIdB = $t01028610363._1
358- let pmtAssetNameB = $t01028610363._2
359- let pmtDecimalsB = $t01028610363._3
360- let addPool = invoke(oracle, "addPool", [this, ((pmtAssetNameA + "_") + pmtAssetNameB)], nil)
348+ let pmtAmountA = $t0996310190._1
349+ let pmtAssetIdA = $t0996310190._2
350+ let pmtAmountB = $t0996310190._3
351+ let pmtAssetIdB = $t0996310190._4
352+ let $t01019910276 = getAssetInfo(pmtAssetIdA)
353+ let pmtStrAssetIdA = $t01019910276._1
354+ let pmtAssetNameA = $t01019910276._2
355+ let pmtDecimalsA = $t01019910276._3
356+ let $t01028510362 = getAssetInfo(pmtAssetIdB)
357+ let pmtStrAssetIdB = $t01028510362._1
358+ let pmtAssetNameB = $t01028510362._2
359+ let pmtDecimalsB = $t01028510362._3
360+ let addParams = [toString(this), ((pmtAssetNameA + "_") + pmtAssetNameB), pmtStrAssetIdA, pmtStrAssetIdB]
361+ let addPool = invoke(oracle, "addPool", addParams, nil)
361362 if ((addPool == addPool))
362363 then if (!(isDefined(getString(oracle, ("pool_" + toString(this))))))
363364 then throw("Pool is not added")
399400 then (balanceB == 0)
400401 else false)
401402 then {
402- let $t01314813225 = getAssetInfo(pmtAssetIdA)
403- let pmtStrAssetIdA = $t01314813225._1
404- let pmtAssetNameA = $t01314813225._2
405- let pmtDecimalsA = $t01314813225._3
406- let $t01323413311 = getAssetInfo(pmtAssetIdB)
407- let pmtStrAssetIdB = $t01323413311._1
408- let pmtAssetNameB = $t01323413311._2
409- let pmtDecimalsB = $t01323413311._3
403+ let $t01328213359 = getAssetInfo(pmtAssetIdA)
404+ let pmtStrAssetIdA = $t01328213359._1
405+ let pmtAssetNameA = $t01328213359._2
406+ let pmtDecimalsA = $t01328213359._3
407+ let $t01336813445 = getAssetInfo(pmtAssetIdB)
408+ let pmtStrAssetIdB = $t01336813445._1
409+ let pmtAssetNameB = $t01336813445._2
410+ let pmtDecimalsB = $t01336813445._3
410411 let tokenRatio = fraction(fraction(assetInitA, scaleValue8, pmtAmountA), scaleValue3, fraction(assetInitB, scaleValue8, pmtAmountB))
411412 if ((pmtAssetIdA == pmtAssetIdB))
412413 then throw("Assets must be different")
469470
470471 @Callable(i)
471472 func withdraw () = {
472- let $t01771017860 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
473- let pmtAmount = $t01771017860._1
474- let pmtAssetId = $t01771017860._2
473+ let $t01784417994 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
474+ let pmtAmount = $t01784417994._1
475+ let pmtAssetId = $t01784417994._2
475476 let amountToPayA = deductStakingFee(fraction(pmtAmount, balanceA, shareAssetSupply), assetIdA, assetIdB)
476477 let amountToPayB = deductStakingFee(fraction(pmtAmount, balanceB, shareAssetSupply), assetIdB, assetIdA)
477478 if (!(isActive))
493494
494495 @Callable(i)
495496 func exchange (minAmountToReceive) = {
496- let $t01908619161 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
497- let pmtAmount = $t01908619161._1
498- let pmtAssetId = $t01908619161._2
497+ let $t01922019295 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
498+ let pmtAmount = $t01922019295._1
499+ let pmtAssetId = $t01922019295._2
499500 func calculateFees (tokenFrom,tokenTo) = {
500501 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
501502 let amountWithFee = fraction(amountWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
520521 else if ((pmtAssetId == assetIdA))
521522 then {
522523 let assetIdSend = assetIdB
523- let $t02043520526 = calculateFees(balanceA, balanceB)
524- let amountWithoutFee = $t02043520526._1
525- let amountWithFee = $t02043520526._2
526- let governanceReward = $t02043520526._3
524+ let $t02056920660 = calculateFees(balanceA, balanceB)
525+ let amountWithoutFee = $t02056920660._1
526+ let amountWithFee = $t02056920660._2
527+ let governanceReward = $t02056920660._3
527528 let newBalanceA = (balanceA + pmtAmount)
528529 let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
529530 if (if ((stakedAmountA >= newBalanceA))
535536 else if ((pmtAssetId == assetIdB))
536537 then {
537538 let assetIdSend = assetIdA
538- let $t02134521436 = calculateFees(balanceB, balanceA)
539- let amountWithoutFee = $t02134521436._1
540- let amountWithFee = $t02134521436._2
541- let governanceReward = $t02134521436._3
539+ let $t02147921570 = calculateFees(balanceB, balanceA)
540+ let amountWithoutFee = $t02147921570._1
541+ let amountWithFee = $t02147921570._2
542+ let governanceReward = $t02147921570._3
542543 let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
543544 let newBalanceB = (balanceB + pmtAmount)
544545 if (if ((stakedAmountA >= newBalanceA))
626627 then (inv.function == "enableFirstHarvest")
627628 else false
628629 let callStaking = if (if ((inv.dApp == stakingUSDNNSBTAddress))
629- then if (if (if (containsElement(["lockNeutrino", "lockNsbt"], inv.function))
630+ then if (if (if ((inv.function == "lockNeutrino"))
630631 then (size(inv.payments) == 1)
631632 else false)
632633 then if ((inv.payments[0].assetId == USDN))
634635 else (inv.payments[0].assetId == NSBT)
635636 else false)
636637 then true
637- else if (containsElement(["unlockNeutrino", "unlockNsbt"], inv.function))
638+ else if ((inv.function == "unlockNeutrino"))
638639 then (size(inv.payments) == 0)
639640 else false
640641 else false)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let version = "1.0.0"
55
66 let keyVersion = "version"
77
88 let keyActive = "active"
99
1010 let keyAssetIdA = "A_asset_id"
1111
1212 let keyAssetIdB = "B_asset_id"
1313
1414 let keyBalanceA = "A_asset_balance"
1515
1616 let keyBalanceB = "B_asset_balance"
1717
1818 let keyBalanceInitA = "A_asset_init"
1919
2020 let keyBalanceInitB = "B_asset_init"
2121
2222 let keyShareAssetId = "share_asset_id"
2323
2424 let keyShareAssetSupply = "share_asset_supply"
2525
2626 let keyCommission = "commission"
2727
2828 let keyCommissionScaleDelimiter = "commission_scale_delimiter"
2929
3030 let keyCause = "shutdown_cause"
3131
3232 let keyFirstHarvest = "first_harvest"
3333
3434 let keyFirstHarvestHeight = "first_harvest_height"
3535
3636 let keyShareLimit = "share_limit_on_first_harvest"
3737
3838 let keyBasePeriod = "base_period"
3939
4040 let keyPeriodLength = "period_length"
4141
4242 let keyStartHeight = "start_height"
4343
4444 let keyOracleAssetPriority = "asset_priority_"
4545
4646 let keyOracleScriptHash = "script_hash_cpmm"
4747
48-let keyInitPoolHeight = "init_pool_height_"
48+let keyInitPoolHeight = "init_pool_height"
4949
5050 let keyAdminPubKey1 = "admin_pub_1"
5151
5252 let keyAdminPubKey2 = "admin_pub_2"
5353
5454 let keyAdminPubKey3 = "admin_pub_3"
5555
5656 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
5757
5858 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
5959 case string: String =>
6060 fromBase58String(string)
6161 case nothing =>
6262 throw("Admin public key is empty")
6363 }
6464
6565
6666 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
6767
6868 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
6969
7070 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
7171
7272 let adminPubKeyStartStop = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
7373
7474 let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
7575
7676 let walletAddress = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
7777
7878 let votingAddress = Address(base58'3MrJgdL1GniipErHy44YF9idzLaUL2iX5DQ')
7979
8080 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
8181
8282 let NSBT = base58'36mg8NZTaFRDygiVwb8uBnLR51hetJruUCZcxhaVcHj9'
8383
8484 let SWOP = base58'2HAJrwa8q4SxBx9cHYaBTQdBjdk5wwqdof7ccpAx2uhZ'
8585
8686 let EURN = base58'ECBCkHS68DckpBrzLeoRgYbFg7sCVqR176mPqbXsj9pA'
8787
8888 let stakingUSDNNSBTAddress = Address(base58'3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg')
8989
9090 let stakingEURNAddress = Address(base58'3MyVqAbmKWh339gF6hy8faWw1jGeTV2wnGE')
9191
9292 let USDNToWavesExchanger = Address(base58'3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37')
9393
9494 let USDNToNSBTExchanger = Address(base58'3Mye9wVR7d2mc6Y5ZJTu11svzgUQ7o8H9dA')
9595
9696 let stakingFeeInUSDN = 270000
9797
9898 let stakingFeeInEURN = 234000
9999
100100 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, keyBasePeriod), "Empty keyBasePeriod")
101101
102102 let startHeight = valueOrErrorMessage(getInteger(votingAddress, keyStartHeight), "Empty keyStartHeight")
103103
104104 let periodLength = valueOrErrorMessage(getInteger(votingAddress, keyPeriodLength), "Empty keyPeriodLength")
105105
106106 let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 1)
107107
108108 let isActive = getBooleanValue(this, keyActive)
109109
110110 let strAssetIdA = getStringValue(this, keyAssetIdA)
111111
112112 let strAssetIdB = getStringValue(this, keyAssetIdB)
113113
114114 let assetIdA = if ((strAssetIdA == "WAVES"))
115115 then unit
116116 else fromBase58String(strAssetIdA)
117117
118118 let assetIdB = if ((strAssetIdB == "WAVES"))
119119 then unit
120120 else fromBase58String(strAssetIdB)
121121
122122 let assetNameA = match assetIdA {
123123 case id: ByteVector =>
124124 value(assetInfo(id)).name
125125 case waves: Unit =>
126126 "WAVES"
127127 case _ =>
128128 throw("Match error")
129129 }
130130
131131 let assetNameB = match assetIdB {
132132 case id: ByteVector =>
133133 value(assetInfo(id)).name
134134 case waves: Unit =>
135135 "WAVES"
136136 case _ =>
137137 throw("Match error")
138138 }
139139
140140 let balanceA = getIntegerValue(this, keyBalanceA)
141141
142142 let balanceB = getIntegerValue(this, keyBalanceB)
143143
144144 let shareAssetId = fromBase58String(getStringValue(this, keyShareAssetId))
145145
146146 let shareAssetSupply = getIntegerValue(this, keyShareAssetSupply)
147147
148148 let commission = 3000
149149
150150 let commissionGovernance = 1200
151151
152152 let commissionScaleDelimiter = 1000000
153153
154154 let scaleValue3 = 1000
155155
156156 let scaleValue8 = 100000000
157157
158158 let slippageToleranceDelimiter = 1000
159159
160160 let scaleValue8Digits = 8
161161
162162 let comissionForInitalization = 1000000000
163163
164164 func accountBalance (assetId) = match assetId {
165165 case id: ByteVector =>
166166 assetBalance(this, id)
167167 case waves: Unit =>
168168 wavesBalance(this).available
169169 case _ =>
170170 throw("Match error")
171171 }
172172
173173
174174 func stakedAmount (assetId) = {
175175 let stakedAmountCalculated = match assetId {
176176 case aId: ByteVector =>
177177 if (if ((aId == USDN))
178178 then true
179179 else (aId == NSBT))
180180 then getInteger(stakingUSDNNSBTAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
181181 else if ((aId == EURN))
182182 then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(this)))
183183 else 0
184184 case _: Unit =>
185185 0
186186 case _ =>
187187 throw("Match error")
188188 }
189189 match stakedAmountCalculated {
190190 case i: Int =>
191191 i
192192 case _ =>
193193 0
194194 }
195195 }
196196
197197
198198 func isAllowedAsset (assetId) = match assetId {
199199 case id: ByteVector =>
200200 if (if ((id == USDN))
201201 then true
202202 else (id == SWOP))
203203 then true
204204 else false
205205 case waves: Unit =>
206206 true
207207 case _ =>
208208 throw("Match error")
209209 }
210210
211211
212212 let stakedAmountA = stakedAmount(assetIdA)
213213
214214 let stakedAmountB = stakedAmount(assetIdB)
215215
216216 let assetInitA = getIntegerValue(this, keyBalanceInitA)
217217
218218 let assetInitB = getIntegerValue(this, keyBalanceInitB)
219219
220220 let availableBalanceA = (balanceA - stakedAmountA)
221221
222222 let availableBalanceB = (balanceB - stakedAmountB)
223223
224224 let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
225225
226226 let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
227227
228228 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
229229 then (accountBalanceWithStakedB >= balanceB)
230230 else false
231231
232232 func getAssetInfo (assetId) = match assetId {
233233 case id: ByteVector =>
234234 let stringId = toBase58String(id)
235235 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
236236 $Tuple3(stringId, info.name, info.decimals)
237237 case waves: Unit =>
238238 $Tuple3("WAVES", "WAVES", 8)
239239 case _ =>
240240 throw("Match error")
241241 }
242242
243243
244244 func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
245245 then $Tuple3("WAVES", "WAVES", 8)
246246 else {
247247 let stringId = assetStr
248248 let id = fromBase58String(assetStr)
249249 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
250250 $Tuple3(stringId, info.name, info.decimals)
251251 }
252252
253253
254254 func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
255255
256256
257257 func deductStakingFee (amount,assetId,secondAssetId) = if (if ((assetId == USDN))
258258 then true
259259 else (assetId == EURN))
260260 then {
261261 let stakinFee = if ((assetId == USDN))
262262 then (stakingFeeInUSDN * (if ((secondAssetId == NSBT))
263263 then 2
264264 else 1))
265265 else if ((assetId == EURN))
266266 then stakingFeeInEURN
267267 else 0
268268 let result = (amount - stakinFee)
269269 if ((0 >= result))
270270 then throw((((("Insufficient amount " + toString(amount)) + " to deduct staking fee ") + toString(stakinFee)) + "USDN/EURN"))
271271 else result
272272 }
273273 else amount
274274
275275
276276 func getStakingFee (assetId,secondAssetId) = if ((assetId == USDN))
277277 then (stakingFeeInUSDN * (if ((secondAssetId == NSBT))
278278 then 2
279279 else 1))
280280 else if ((assetId == EURN))
281281 then stakingFeeInEURN
282282 else 0
283283
284284
285285 func throwInsufficientAvailableBalance (amount,available,assetName) = throw((((((((("Insufficient DApp balance to pay " + toString(amount)) + " ") + assetName) + " due to staking. Available: ") + toString(available)) + " ") + assetName) + ". Please contact support in Telegram: https://t.me/swopfisupport"))
286286
287287
288288 func throwInsufficientAvailableBalances (amountA,amountB) = throw((((((((((((((((("Insufficient DApp balance to pay " + toString(amountA)) + " ") + assetNameA) + " and ") + toString(amountB)) + " ") + assetNameB) + " due to staking. Available: ") + toString(availableBalanceA)) + " ") + assetNameA) + " and ") + toString(availableBalanceB)) + " ") + assetNameB) + ". Please contact support in Telegram: https://t.me/swopfisupport"))
289289
290290
291291 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(accountBalanceWithStakedA)) + " ") + assetNameA) + ", ") + toString(accountBalanceWithStakedB)) + " ") + assetNameB) + ". State: ") + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB))
292292
293293
294294 @Callable(i)
295295 func init (userAddressStr) = {
296- let $t083618438 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
297- let pmtAmount1 = $t083618438._1
298- let pmtAssetId1 = $t083618438._2
299- let $t084438520 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
300- let pmtAmount2 = $t084438520._1
301- let pmtAssetId2 = $t084438520._2
302- let $t085258608 = $Tuple2(i.payments[2].amount, i.payments[2].assetId)
303- let pmtAmountSWOP = $t085258608._1
304- let pmtAssetIdSWOP = $t085258608._2
296+ let $t083608437 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
297+ let pmtAmount1 = $t083608437._1
298+ let pmtAssetId1 = $t083608437._2
299+ let $t084428519 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
300+ let pmtAmount2 = $t084428519._1
301+ let pmtAssetId2 = $t084428519._2
302+ let $t085248607 = $Tuple2(i.payments[2].amount, i.payments[2].assetId)
303+ let pmtAmountSWOP = $t085248607._1
304+ let pmtAssetIdSWOP = $t085248607._2
305305 let check = isDataStorageUntouched(this)
306306 let userScriptHash = scriptHash(this)
307307 let userAddress = addressFromStringValue(userAddressStr)
308308 if ((i.caller == this))
309309 then throw("You can't call yourself")
310310 else if (if ((pmtAssetIdSWOP != SWOP))
311311 then true
312312 else (pmtAmountSWOP != comissionForInitalization))
313313 then throw("You need to attach 10 SWOP tokens")
314314 else if (if (!(isAllowedAsset(pmtAssetId1)))
315315 then !(isAllowedAsset(pmtAssetId2))
316316 else false)
317317 then throw("One of assets must be USDN, WAVES or SWOP")
318318 else if (if ((userScriptHash != value(getBinary(oracle, keyOracleScriptHash))))
319319 then true
320320 else !(check))
321321 then throw("Unexpected script was found.")
322322 else if (isDefined(getBoolean(this, keyActive)))
323323 then throw("DApp is already active")
324324 else if ((pmtAssetId1 == pmtAssetId2))
325325 then throw("Assets must be different")
326326 else {
327327 let pmtStrAssetId1 = match pmtAssetId1 {
328328 case id: ByteVector =>
329329 toBase58String(id)
330330 case waves: Unit =>
331331 "WAVES"
332332 case _ =>
333333 throw("Match error")
334334 }
335335 let pmtStrAssetId2 = match pmtAssetId2 {
336336 case id: ByteVector =>
337337 toBase58String(id)
338338 case waves: Unit =>
339339 "WAVES"
340340 case _ =>
341341 throw("Match error")
342342 }
343343 let asset1Priority = valueOrElse(getInteger(oracle, (keyOracleAssetPriority + pmtStrAssetId1)), 999999)
344344 let asset2Priority = valueOrElse(getInteger(oracle, (keyOracleAssetPriority + pmtStrAssetId2)), 999999)
345- let $t0996410191 = if ((asset2Priority > asset1Priority))
345+ let $t0996310190 = if ((asset2Priority > asset1Priority))
346346 then $Tuple4(pmtAmount2, pmtAssetId2, pmtAmount1, pmtAssetId1)
347347 else $Tuple4(pmtAmount1, pmtAssetId1, pmtAmount2, pmtAssetId2)
348- let pmtAmountA = $t0996410191._1
349- let pmtAssetIdA = $t0996410191._2
350- let pmtAmountB = $t0996410191._3
351- let pmtAssetIdB = $t0996410191._4
352- let $t01020010277 = getAssetInfo(pmtAssetIdA)
353- let pmtStrAssetIdA = $t01020010277._1
354- let pmtAssetNameA = $t01020010277._2
355- let pmtDecimalsA = $t01020010277._3
356- let $t01028610363 = getAssetInfo(pmtAssetIdB)
357- let pmtStrAssetIdB = $t01028610363._1
358- let pmtAssetNameB = $t01028610363._2
359- let pmtDecimalsB = $t01028610363._3
360- let addPool = invoke(oracle, "addPool", [this, ((pmtAssetNameA + "_") + pmtAssetNameB)], nil)
348+ let pmtAmountA = $t0996310190._1
349+ let pmtAssetIdA = $t0996310190._2
350+ let pmtAmountB = $t0996310190._3
351+ let pmtAssetIdB = $t0996310190._4
352+ let $t01019910276 = getAssetInfo(pmtAssetIdA)
353+ let pmtStrAssetIdA = $t01019910276._1
354+ let pmtAssetNameA = $t01019910276._2
355+ let pmtDecimalsA = $t01019910276._3
356+ let $t01028510362 = getAssetInfo(pmtAssetIdB)
357+ let pmtStrAssetIdB = $t01028510362._1
358+ let pmtAssetNameB = $t01028510362._2
359+ let pmtDecimalsB = $t01028510362._3
360+ let addParams = [toString(this), ((pmtAssetNameA + "_") + pmtAssetNameB), pmtStrAssetIdA, pmtStrAssetIdB]
361+ let addPool = invoke(oracle, "addPool", addParams, nil)
361362 if ((addPool == addPool))
362363 then if (!(isDefined(getString(oracle, ("pool_" + toString(this))))))
363364 then throw("Pool is not added")
364365 else {
365366 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
366367 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
367368 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
368369 let arg1 = pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN)
369370 let arg2 = pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN)
370371 let arg3 = pow(10, 0, shareDecimals, 0, 0, DOWN)
371372 let shareInitialSupply = fraction(arg1, arg2, arg3)
372373 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
373374 let shareIssueId = calculateAssetId(shareIssue)
374375 let baseEntry = [StringEntry(keyVersion, version), BooleanEntry(keyActive, true), StringEntry(keyAssetIdA, pmtStrAssetIdA), StringEntry(keyAssetIdB, pmtStrAssetIdB), IntegerEntry(keyBalanceA, pmtAmountA), IntegerEntry(keyBalanceB, pmtAmountB), IntegerEntry(keyCommission, commission), IntegerEntry(keyCommissionScaleDelimiter, commissionScaleDelimiter), shareIssue, StringEntry(keyShareAssetId, toBase58String(shareIssueId)), IntegerEntry(keyShareAssetSupply, shareInitialSupply), IntegerEntry(keyInitPoolHeight, height), ScriptTransfer(userAddress, shareInitialSupply, shareIssueId), ScriptTransfer(walletAddress, comissionForInitalization, SWOP)]
375376 baseEntry
376377 }
377378 else throw("Strict value is not equal to itself.")
378379 }
379380 }
380381
381382
382383
383384 @Callable(i)
384385 func keepLimitForFirstHarvest (shareLimit) = if (!(isActive))
385386 then throw("DApp is inactive at this moment")
386387 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
387388 then throw("Only admin can call this function")
388389 else [IntegerEntry(keyShareLimit, shareLimit)]
389390
390391
391392
392393 @Callable(i)
393394 func replenishWithTwoTokens (slippageTolerance) = {
394395 let pmtAssetIdA = i.payments[0].assetId
395396 let pmtAssetIdB = i.payments[1].assetId
396397 let pmtAmountA = deductStakingFee(i.payments[0].amount, pmtAssetIdA, pmtAssetIdB)
397398 let pmtAmountB = deductStakingFee(i.payments[1].amount, pmtAssetIdB, pmtAssetIdA)
398399 if (if ((balanceA == 0))
399400 then (balanceB == 0)
400401 else false)
401402 then {
402- let $t01314813225 = getAssetInfo(pmtAssetIdA)
403- let pmtStrAssetIdA = $t01314813225._1
404- let pmtAssetNameA = $t01314813225._2
405- let pmtDecimalsA = $t01314813225._3
406- let $t01323413311 = getAssetInfo(pmtAssetIdB)
407- let pmtStrAssetIdB = $t01323413311._1
408- let pmtAssetNameB = $t01323413311._2
409- let pmtDecimalsB = $t01323413311._3
403+ let $t01328213359 = getAssetInfo(pmtAssetIdA)
404+ let pmtStrAssetIdA = $t01328213359._1
405+ let pmtAssetNameA = $t01328213359._2
406+ let pmtDecimalsA = $t01328213359._3
407+ let $t01336813445 = getAssetInfo(pmtAssetIdB)
408+ let pmtStrAssetIdB = $t01336813445._1
409+ let pmtAssetNameB = $t01336813445._2
410+ let pmtDecimalsB = $t01336813445._3
410411 let tokenRatio = fraction(fraction(assetInitA, scaleValue8, pmtAmountA), scaleValue3, fraction(assetInitB, scaleValue8, pmtAmountB))
411412 if ((pmtAssetIdA == pmtAssetIdB))
412413 then throw("Assets must be different")
413414 else {
414415 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
415416 let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
416417 if (!(isActive))
417418 then throw("DApp is inactive at this moment")
418419 else if (if ((0 > slippageTolerance))
419420 then true
420421 else (slippageTolerance > slippageToleranceDelimiter))
421422 then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
422423 else if ((size(i.payments) != 2))
423424 then throw("Two attached assets expected")
424425 else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
425426 then true
426427 else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
427428 then throw("Incorrect assets amount: amounts must have the contract ratio")
428429 else if (if ((pmtAssetIdA != assetIdA))
429430 then true
430431 else (pmtAssetIdB != assetIdB))
431432 then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
432433 else if ((shareInitialSupply == 0))
433434 then throw("Too small amount to replenish")
434435 else if (!(hasEnoughBalance))
435436 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
436437 else [Reissue(shareAssetId, shareInitialSupply, true), IntegerEntry(keyBalanceA, pmtAmountA), IntegerEntry(keyBalanceB, pmtAmountB), IntegerEntry(keyShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareAssetId)]
437438 }
438439 }
439440 else {
440441 let tokenRatio = fraction(fraction(balanceA, scaleValue8, pmtAmountA), scaleValue3, fraction(balanceB, scaleValue8, pmtAmountB))
441442 let ratioShareTokensInA = fraction(pmtAmountA, scaleValue8, balanceA)
442443 let ratioShareTokensInB = fraction(pmtAmountB, scaleValue8, balanceB)
443444 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scaleValue8)
444445 if (!(isActive))
445446 then throw("DApp is inactive at this moment")
446447 else if (if ((0 > slippageTolerance))
447448 then true
448449 else (slippageTolerance > slippageToleranceDelimiter))
449450 then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
450451 else if ((size(i.payments) != 2))
451452 then throw("Two attached assets expected")
452453 else if (if ((pmtAssetIdA != assetIdA))
453454 then true
454455 else (pmtAssetIdB != assetIdB))
455456 then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
456457 else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
457458 then true
458459 else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
459460 then throw("Incorrect assets amount: amounts must have the contract ratio")
460461 else if ((shareTokenToPayAmount == 0))
461462 then throw("Too small amount to replenish")
462463 else if (!(hasEnoughBalance))
463464 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
464465 else [IntegerEntry(keyBalanceA, (balanceA + pmtAmountA)), IntegerEntry(keyBalanceB, (balanceB + pmtAmountB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
465466 }
466467 }
467468
468469
469470
470471 @Callable(i)
471472 func withdraw () = {
472- let $t01771017860 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
473- let pmtAmount = $t01771017860._1
474- let pmtAssetId = $t01771017860._2
473+ let $t01784417994 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
474+ let pmtAmount = $t01784417994._1
475+ let pmtAssetId = $t01784417994._2
475476 let amountToPayA = deductStakingFee(fraction(pmtAmount, balanceA, shareAssetSupply), assetIdA, assetIdB)
476477 let amountToPayB = deductStakingFee(fraction(pmtAmount, balanceB, shareAssetSupply), assetIdB, assetIdA)
477478 if (!(isActive))
478479 then throw("DApp is inactive at this moment")
479480 else if ((size(i.payments) != 1))
480481 then throw("One attached payment expected")
481482 else if ((pmtAssetId != shareAssetId))
482483 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
483484 else if (!(hasEnoughBalance))
484485 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
485486 else if (if ((amountToPayA > availableBalanceA))
486487 then true
487488 else (amountToPayB > availableBalanceB))
488489 then throwInsufficientAvailableBalances(amountToPayA, amountToPayB)
489490 else [IntegerEntry(keyBalanceA, (balanceA - amountToPayA)), IntegerEntry(keyBalanceB, (balanceB - amountToPayB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply - pmtAmount)), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
490491 }
491492
492493
493494
494495 @Callable(i)
495496 func exchange (minAmountToReceive) = {
496- let $t01908619161 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
497- let pmtAmount = $t01908619161._1
498- let pmtAssetId = $t01908619161._2
497+ let $t01922019295 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
498+ let pmtAmount = $t01922019295._1
499+ let pmtAssetId = $t01922019295._2
499500 func calculateFees (tokenFrom,tokenTo) = {
500501 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
501502 let amountWithFee = fraction(amountWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
502503 let governanceReward = fraction(amountWithoutFee, commissionGovernance, commissionScaleDelimiter)
503504 if ((minAmountToReceive > amountWithFee))
504505 then throw(((("Calculated amount to receive " + toString(amountWithFee)) + " is less than specified minimum ") + toString(minAmountToReceive)))
505506 else $Tuple3(amountWithoutFee, amountWithFee, governanceReward)
506507 }
507508
508509 if (!(isActive))
509510 then throw("DApp is inactive at this moment")
510511 else if (if ((balanceA == 0))
511512 then true
512513 else (balanceB == 0))
513514 then throw("Can't exchange with zero balance")
514515 else if ((0 >= minAmountToReceive))
515516 then throw(("Minimal amount to receive must be positive. Actual: " + toString(minAmountToReceive)))
516517 else if ((size(i.payments) != 1))
517518 then throw("One attached payment expected")
518519 else if (!(hasEnoughBalance))
519520 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
520521 else if ((pmtAssetId == assetIdA))
521522 then {
522523 let assetIdSend = assetIdB
523- let $t02043520526 = calculateFees(balanceA, balanceB)
524- let amountWithoutFee = $t02043520526._1
525- let amountWithFee = $t02043520526._2
526- let governanceReward = $t02043520526._3
524+ let $t02056920660 = calculateFees(balanceA, balanceB)
525+ let amountWithoutFee = $t02056920660._1
526+ let amountWithFee = $t02056920660._2
527+ let governanceReward = $t02056920660._3
527528 let newBalanceA = (balanceA + pmtAmount)
528529 let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
529530 if (if ((stakedAmountA >= newBalanceA))
530531 then true
531532 else (stakedAmountB >= newBalanceB))
532533 then throwInsufficientAvailableBalance(amountWithFee, availableBalanceB, assetNameB)
533534 else [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
534535 }
535536 else if ((pmtAssetId == assetIdB))
536537 then {
537538 let assetIdSend = assetIdA
538- let $t02134521436 = calculateFees(balanceB, balanceA)
539- let amountWithoutFee = $t02134521436._1
540- let amountWithFee = $t02134521436._2
541- let governanceReward = $t02134521436._3
539+ let $t02147921570 = calculateFees(balanceB, balanceA)
540+ let amountWithoutFee = $t02147921570._1
541+ let amountWithFee = $t02147921570._2
542+ let governanceReward = $t02147921570._3
542543 let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
543544 let newBalanceB = (balanceB + pmtAmount)
544545 if (if ((stakedAmountA >= newBalanceA))
545546 then true
546547 else (stakedAmountB >= newBalanceB))
547548 then throwInsufficientAvailableBalance(amountWithFee, availableBalanceA, assetNameA)
548549 else [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
549550 }
550551 else throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
551552 }
552553
553554
554555
555556 @Callable(i)
556557 func shutdown () = if (!(isActive))
557558 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
558559 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
559560 then throw("Only admin can call this function")
560561 else suspend("Paused by admin")
561562
562563
563564
564565 @Callable(i)
565566 func activate () = if (isActive)
566567 then throw("DApp is already active")
567568 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
568569 then throw("Only admin can call this function")
569570 else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
570571
571572
572573
573574 @Callable(i)
574575 func takeIntoAccountExtraFunds (amountLeave) = {
575576 let uncountableAmountEnrollAssetA = (accountBalanceWithStakedA - balanceA)
576577 let uncountableAmountEnrollAssetB = (accountBalanceWithStakedB - balanceB)
577578 let amountEnrollA = (uncountableAmountEnrollAssetA - (if ((assetIdA == unit))
578579 then amountLeave
579580 else 0))
580581 let amountEnrollB = (uncountableAmountEnrollAssetB - (if ((assetIdB == unit))
581582 then amountLeave
582583 else 0))
583584 if (!(isActive))
584585 then throw("DApp is inactive at this moment")
585586 else if ((i.caller != this))
586587 then throw("Only the DApp itself can call this function")
587588 else if ((0 > amountLeave))
588589 then throw(("Argument 'amountLeave' cannot be negative. Actual: " + toString(amountLeave)))
589590 else if (if ((0 > uncountableAmountEnrollAssetA))
590591 then true
591592 else (0 > uncountableAmountEnrollAssetB))
592593 then suspend("Enroll amount negative")
593594 else if (if ((0 > amountEnrollA))
594595 then true
595596 else (0 > amountEnrollB))
596597 then throw("Too large amountLeave")
597598 else [IntegerEntry(keyBalanceA, (balanceA + amountEnrollA)), IntegerEntry(keyBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
598599 }
599600
600601
601602
602603 @Callable(i)
603604 func enableFirstHarvest () = [BooleanEntry(keyFirstHarvest, true), IntegerEntry(keyFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))]
604605
605606
606607 @Verifier(tx)
607608 func verify () = {
608609 let multiSignedByAdmins = {
609610 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
610611 then 1
611612 else 0
612613 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
613614 then 1
614615 else 0
615616 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
616617 then 1
617618 else 0
618619 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
619620 }
620621 match tx {
621622 case inv: InvokeScriptTransaction =>
622623 let callTakeIntoAccount = if ((inv.dApp == this))
623624 then (inv.function == "takeIntoAccountExtraFunds")
624625 else false
625626 let callEnableFirstHarvest = if ((inv.dApp == this))
626627 then (inv.function == "enableFirstHarvest")
627628 else false
628629 let callStaking = if (if ((inv.dApp == stakingUSDNNSBTAddress))
629- then if (if (if (containsElement(["lockNeutrino", "lockNsbt"], inv.function))
630+ then if (if (if ((inv.function == "lockNeutrino"))
630631 then (size(inv.payments) == 1)
631632 else false)
632633 then if ((inv.payments[0].assetId == USDN))
633634 then true
634635 else (inv.payments[0].assetId == NSBT)
635636 else false)
636637 then true
637- else if (containsElement(["unlockNeutrino", "unlockNsbt"], inv.function))
638+ else if ((inv.function == "unlockNeutrino"))
638639 then (size(inv.payments) == 0)
639640 else false
640641 else false)
641642 then true
642643 else if ((inv.dApp == stakingEURNAddress))
643644 then if (if (if ((inv.function == "startStaking"))
644645 then (size(inv.payments) == 1)
645646 else false)
646647 then (inv.payments[0].assetId == EURN)
647648 else false)
648649 then true
649650 else if ((inv.function == "stopStaking"))
650651 then (size(inv.payments) == 0)
651652 else false
652653 else false
653654 let exchangeToWaves = if (if (if ((inv.dApp == USDNToWavesExchanger))
654655 then (inv.function == "exchange")
655656 else false)
656657 then (assetIdA == USDN)
657658 else false)
658659 then true
659660 else if (if ((assetIdB == USDN))
660661 then (size(inv.payments) == 1)
661662 else false)
662663 then (inv.payments[0].assetId == USDN)
663664 else false
664665 let exchangeToNSBTs = if (if (if ((inv.dApp == USDNToNSBTExchanger))
665666 then (inv.function == "exchange")
666667 else false)
667668 then (assetIdA == NSBT)
668669 else false)
669670 then true
670671 else if (if ((assetIdB == NSBT))
671672 then (size(inv.payments) == 1)
672673 else false)
673674 then (inv.payments[0].assetId == USDN)
674675 else false
675676 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
676677 then true
677678 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
678679 then true
679680 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
680681 then true
681682 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
682683 if (if (if (if (if (if (callTakeIntoAccount)
683684 then true
684685 else callEnableFirstHarvest)
685686 then true
686687 else callStaking)
687688 then true
688689 else exchangeToWaves)
689690 then true
690691 else exchangeToNSBTs)
691692 then signedByAdmin
692693 else false)
693694 then true
694695 else multiSignedByAdmins
695696 case _ =>
696697 multiSignedByAdmins
697698 }
698699 }
699700

github/deemru/w8io/873ac7e 
98.12 ms