tx · EP4sVG81wmGjP6gprVZ2nmnyzZCC1NNbTTtNGNe3JmrE

3Mq63YubY7UKJEobhDuXfsnXaPDJZT1fDhx:  -0.01400000 Waves

2021.12.29 19:15 [1855734] smart account 3Mq63YubY7UKJEobhDuXfsnXaPDJZT1fDhx > SELF 0.00000000 Waves

{ "type": 13, "id": "EP4sVG81wmGjP6gprVZ2nmnyzZCC1NNbTTtNGNe3JmrE", "fee": 1400000, "feeAssetId": null, "timestamp": 1640794555561, "version": 2, "chainId": 84, "sender": "3Mq63YubY7UKJEobhDuXfsnXaPDJZT1fDhx", "senderPublicKey": "HXfVyeXgXUtHD3uSP6yjsk6JQcTwmU9qQTvhXzFpPw2T", "proofs": [ "2UeJQp8EeecgmA2VSv9MvUbWMa5HwNvUBvj6iNsw7sV62vffQ1Sus24C3jNmG7NNRFSyhrGeQCKR1L4DRZraGmQT", "5L9QXHsTJQzD76ngxG6YdPnEakKfN9ppqha1vVZS2WN49DzLfgj4RMXVG9DCyCGTDwqhvXjBjmTqwBtVpngdcPh8" ], "script": "base64:AAIFAAAAAAAADsAIAhIDCgEEEgcKBQEBCAgEEgMKAQESAwoBARIAEgMKAQESABIAEgMKAQESBQoDBAEIEgAaFAoBQRIPa2V5QWRtaW5QdWJLZXkyGhQKAUISD2tleUFkbWluUHViS2V5MxoLCgFDEgZvcmFjbGUaEAoBRBILZ2V0QWRtaW5QdWIaEAoBRRILa2V5QWRtaW5QdWIaDAoBRhIHJG1hdGNoMBoLCgFHEgZzdHJpbmcaDAoBSBIHbm90aGluZxoRCgFJEgxhZG1pblB1YktleTEaEQoBShIMYWRtaW5QdWJLZXkyGhEKAUsSDGFkbWluUHViS2V5MxoZCgFMEhRhZG1pblB1YktleVN0YXJ0U3RvcBoXCgFNEhJhZG1pblB1YktleVN0YWtpbmcaEgoBThINd2FsbGV0QWRkcmVzcxoSCgFPEg12b3RpbmdBZGRyZXNzGgkKAVASBFVTRE4aCQoBURIETlNCVBoJCgFSEgRFVVJOGhIKAVMSDXN0YWtpbmdBc3NldHMaGwoBVBIWc3Rha2luZ1VTRE5OU0JUQWRkcmVzcxoXCgFVEhJzdGFraW5nRVVSTkFkZHJlc3MaGQoBVhIUVVNETlRvV2F2ZXNFeGNoYW5nZXIaGAoBVxITVVNETlRvTlNCVEV4Y2hhbmdlchoPCgFYEgpiYXNlUGVyaW9kGhAKAVkSC3N0YXJ0SGVpZ2h0GhEKAVoSDHBlcmlvZExlbmd0aBoMCgFhEgd2ZXJzaW9uGhMKAmFBEg1zdGFrZWRBbW91bnRCGhAKAmFCEgphc3NldEluaXRBGhAKAmFDEgphc3NldEluaXRCGh8KAmFEEhlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRBGh8KAmFFEhlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRCGhYKAmFGEhBoYXNFbm91Z2hCYWxhbmNlGhIKAmFHEgxnZXRBc3NldEluZm8aDgoCYUgSCHN0cmluZ0lkGgoKAmFJEgRpbmZvGhwKAmFKEhZnZXRBc3NldEluZm9Gcm9tU3RyaW5nGg4KAmFLEghhc3NldFN0choNCgJhTBIHc3VzcGVuZBoLCgJhTRIFY2F1c2UaHgoCYU4SGGNhbGNTdGFraW5nRnVuY0FuZEFkZHJlcxoLCgJhTxIFc3Rha2UaFwoCYVASEWNhbGNTdGFraW5nUGFyYW1zGgwKAmFREgZhbW91bnQaEQoCYVISCyR0MDY5MzA2OTk2GgoKAmFTEgRjYWxsGhEKAmFUEgtzdGFraW5nQWRkchoRCgJhVRILJHQwNzA4MjcxNDgaFwoCYVYSEXN1c3BlbmRTdXNwaWNpb3VzGhIKAmFXEgxmaXJzdEhhcnZlc3QaEQoCYVgSCyR0MDc1Nzk3NjU2GhAKAmFZEgpwbXRBbW91bnRBGhEKAmFaEgtwbXRBc3NldElkQRobCgJhYRIVZmlyc3RIYXJ2ZXN0RW5kUGVyaW9kGg4KAmFiEghpc0FjdGl2ZRoRCgJhYxILc3RyQXNzZXRJZEEaEQoCYWQSC3N0ckFzc2V0SWRCGg4KAmFlEghhc3NldElkQRoOCgJhZhIIYXNzZXRJZEIaEAoCYWcSCmFzc2V0TmFtZUEaCAoCYWgSAmlkGgsKAmFpEgV3YXZlcxoQCgJhahIKYXNzZXROYW1lQhoOCgJhaxIIYmFsYW5jZUEaDgoCYWwSCGJhbGFuY2VCGhIKAmFtEgxzaGFyZUFzc2V0SWQaFgoCYW4SEHNoYXJlQXNzZXRTdXBwbHkaEAoCYW8SCmNvbW1pc3Npb24aHgoCYXASGGNvbW1pc3Npb25TY2FsZURlbGltaXRlchoRCgJhcRILc2NhbGVWYWx1ZTMaEQoCYXISC3NjYWxlVmFsdWU4GiAKAmFzEhpzbGlwcGFnZVRvbGVyYW5jZURlbGltaXRlchoUCgJhdBIOYWNjb3VudEJhbGFuY2UaDQoCYXUSB2Fzc2V0SWQaEgoCYXYSDHN0YWtlZEFtb3VudBocCgJhdxIWc3Rha2VkQW1vdW50Q2FsY3VsYXRlZBoJCgJheBIDYUlkGgcKAmF5EgFpGhMKAmF6Eg1zdGFrZWRBbW91bnRBGg8KAWISCmtleVZlcnNpb24aEwoCYkESDSR0MDEwNTgzMTA2NzAaEAoCYkISCnNoYXJlTGltaXQaFwoCYkMSEXNsaXBwYWdlVG9sZXJhbmNlGhMKAmJEEg0kdDAxMzE2NzEzMjQ0GhMKAmJFEg0kdDAxMzI0OTEzMzI2GhAKAmJGEgp0b2tlblJhdGlvGhkKAmJHEhNyYXRpb1NoYXJlVG9rZW5zSW5BGhkKAmJIEhNyYXRpb1NoYXJlVG9rZW5zSW5CGhsKAmJJEhVzaGFyZVRva2VuVG9QYXlBbW91bnQaEwoCYkoSDSR0MDE4NDk1MTg1NzAaDwoCYksSCXBtdEFtb3VudBoQCgJiTBIKcG10QXNzZXRJZBoSCgJiTRIMYW1vdW50VG9QYXlBGhIKAmJOEgxhbW91bnRUb1BheUIaGAoCYk8SEm1pbkFtb3VudFRvUmVjZWl2ZRoTCgJiUBINJHQwMTk5MjgyMDAwMxoTCgJiURINY2FsY3VsYXRlRmVlcxoPCgJiUhIJdG9rZW5Gcm9tGg0KAmJTEgd0b2tlblRvGhYKAmJUEhBhbW91bnRXaXRob3V0RmVlGhMKAmJVEg1hbW91bnRXaXRoRmVlGhYKAmJWEhBnb3Zlcm5hbmNlUmV3YXJkGhEKAmJXEgthc3NldElkU2VuZBoTCgJiWBINJHQwMjEyNzcyMTM2OBoRCgJiWRILbmV3QmFsYW5jZUEaEQoCYloSC25ld0JhbGFuY2VCGhEKAmJhEgskdDA3NjYxNzczOBoQCgJiYhIKcG10QW1vdW50QhoRCgJiYxILcG10QXNzZXRJZEIaEQoCYmQSCyR0MDc3NDM3ODIwGhQKAmJlEg5wbXRTdHJBc3NldElkQRoTCgJiZhINcG10QXNzZXROYW1lQRoSCgJiZxIMcG10RGVjaW1hbHNBGhEKAmJoEgskdDA3ODI1NzkwMhoUCgJiaRIOcG10U3RyQXNzZXRJZEIaEwoCYmoSDXBtdEFzc2V0TmFtZUIaEgoCYmsSDHBtdERlY2ltYWxzQhoPCgJibBIJc2hhcmVOYW1lGhYKAmJtEhBzaGFyZURlc2NyaXB0aW9uGhMKAmJuEg1zaGFyZURlY2ltYWxzGgoKAmJvEgRhcmcxGgoKAmJwEgRhcmcyGgoKAmJxEgRhcmczGhgKAmJyEhJzaGFyZUluaXRpYWxTdXBwbHkaEAoCYnMSCnNoYXJlSXNzdWUaEgoCYnQSDHNoYXJlSXNzdWVJZBoMCgJidRIGc3Rha2UxGgwKAmJ2EgZzdGFrZTIaDwoCYncSCWJhc2VFbnRyeRoPCgJieBIJYW10QXNzZXRBGg8KAmJ5EglhbXRBc3NldEIaEwoCYnoSDSR0MDEwNDkxMTA1NzgaDgoBYxIJa2V5QWN0aXZlGhgKAmNBEhJhZG1pblB1YktleTJTaWduZWQaGAoCY0ISEmFkbWluUHViS2V5M1NpZ25lZBoZCgJjQxITY2FsbFRha2VJbnRvQWNjb3VudBoVCgJjRBIPZXhjaGFuZ2VUb1dhdmVzGhUKAmNFEg9leGNoYW5nZVRvTlNCVHMaEwoCY0YSDXNpZ25lZEJ5QWRtaW4aEwoCY2ESDSR0MDIyMzIzMjI0MTQaEQoCY2ISC2Ftb3VudExlYXZlGiMKAmNjEh11bmNvdW50YWJsZUFtb3VudEVucm9sbEFzc2V0QRojCgJjZBIddW5jb3VudGFibGVBbW91bnRFbnJvbGxBc3NldEIaEwoCY2USDWFtb3VudEVucm9sbEEaEwoCY2YSDWFtb3VudEVucm9sbEIaEwoCY2cSDWFzc2V0SWRTdHJpbmcaCgoCY2gSBHBvb2waDwoCY2kSCWxlYXNpbmdJZBoTCgJjahINbGVhc2luZ0Ftb3VudBoUCgJjaxIObmV3TGVhc2VBbW91bnQaDgoCY2wSCG5ld0xlYXNlGhAKAmNtEgpuZXdMZWFzZUlkGg4KAmNuEghiYXNlRXRyeRoJCgJjbxIDbElkGhMKAmNwEg0kdDAyNjY1MjI2NzU1GgoKAmNxEgRhZGRyGgwKAmNyEgZwYXJhbXMaDgoCY3MSCHBheW1lbnRzGgkKAmN0EgNpbnYaDQoCY3USB2Ftb3VudEEaDQoCY3YSB2Ftb3VudEIaCAoCY3cSAnR4GgwKAmN4EgZ2ZXJpZnkaGQoCY3kSE211bHRpU2lnbmVkQnlBZG1pbnMaGAoCY3oSEmFkbWluUHViS2V5MVNpZ25lZBoQCgFkEgtrZXlBc3NldElkQRoQCgFlEgtrZXlBc3NldElkQhoQCgFmEgtrZXlCYWxhbmNlQRoQCgFnEgtrZXlCYWxhbmNlQhoUCgFoEg9rZXlCYWxhbmNlSW5pdEEaFAoBaRIPa2V5QmFsYW5jZUluaXRCGhQKAWoSD2tleVNoYXJlQXNzZXRJZBoYCgFrEhNrZXlTaGFyZUFzc2V0U3VwcGx5GhIKAWwSDWtleUNvbW1pc3Npb24aIAoBbRIba2V5Q29tbWlzc2lvblNjYWxlRGVsaW1pdGVyGg0KAW4SCGtleUNhdXNlGhQKAW8SD2tleUZpcnN0SGFydmVzdBoaCgFwEhVrZXlGaXJzdEhhcnZlc3RIZWlnaHQaEAoBcRILa1NoYXJlTGltaXQaEAoBchILa0Jhc2VQZXJpb2QaEgoBcxINa1BlcmlvZExlbmd0aBoRCgF0EgxrU3RhcnRIZWlnaHQaFwoBdRISa2V5VVNETk5TQlRBZGRyZXNzGhMKAXYSDmtleUVVUk5BZGRyZXNzGhMKAXcSDmtleUxlYXNpbmdQb29sGhUKAXgSEGtleUxlYXNpbmdBbW91bnQaEQoBeRIMa2V5TGVhc2luZ0lkGhQKAXoSD2tleUFkbWluUHViS2V5MQAAAFAAAAAAAWECAAAABTEuMC4wAAAAAAFiAgAAAAd2ZXJzaW9uAAAAAAFjAgAAAAZhY3RpdmUAAAAAAWQCAAAACkFfYXNzZXRfaWQAAAAAAWUCAAAACkJfYXNzZXRfaWQAAAAAAWYCAAAAD0FfYXNzZXRfYmFsYW5jZQAAAAABZwIAAAAPQl9hc3NldF9iYWxhbmNlAAAAAAFoAgAAAAxBX2Fzc2V0X2luaXQAAAAAAWkCAAAADEJfYXNzZXRfaW5pdAAAAAABagIAAAAOc2hhcmVfYXNzZXRfaWQAAAAAAWsCAAAAEnNoYXJlX2Fzc2V0X3N1cHBseQAAAAABbAIAAAAKY29tbWlzc2lvbgAAAAABbQIAAAAaY29tbWlzc2lvbl9zY2FsZV9kZWxpbWl0ZXIAAAAAAW4CAAAADnNodXRkb3duX2NhdXNlAAAAAAFvAgAAAA1maXJzdF9oYXJ2ZXN0AAAAAAFwAgAAABRmaXJzdF9oYXJ2ZXN0X2hlaWdodAAAAAABcQIAAAAcc2hhcmVfbGltaXRfb25fZmlyc3RfaGFydmVzdAAAAAABcgIAAAALYmFzZV9wZXJpb2QAAAAAAXMCAAAADXBlcmlvZF9sZW5ndGgAAAAAAXQCAAAADHN0YXJ0X2hlaWdodAAAAAABdQIAAAAYc3Rha2luZ191c2RubnNidF9hZGRyZXNzAAAAAAF2AgAAABRzdGFraW5nX2V1cm5fYWRkcmVzcwAAAAABdwIAAAAPbGVhc2luZ19hZGRyZXNzAAAAAAF4AgAAAA5sZWFzaW5nX2Ftb3VudAAAAAABeQIAAAAKbGVhc2luZ19pZAAAAAABegIAAAALYWRtaW5fcHViXzEAAAAAAUECAAAAC2FkbWluX3B1Yl8yAAAAAAFCAgAAAAthZG1pbl9wdWJfMwAAAAABQwkBAAAAB0Fk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", "height": 1855734, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 269JkUQbjcwiHcSmcSz2fWZsuNFA9VVsioiztQz6ryo5 Next: 8rYiFi2o9kjEz3Z3JKP8AvKttrKcfT4sRexurNmsGQfs Diff:
OldNewDifferences
197197
198198 let assetInitB = getIntegerValue(this, keyBalanceInitB)
199199
200-let availableBalanceA = (balanceA - stakedAmountA)
201-
202-let availableBalanceB = (balanceB - stakedAmountB)
203-
204200 let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
205201
206202 let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
262258 }
263259
264260
265-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"))
266-
267-
268-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"))
269-
270-
271261 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(accountBalanceWithStakedA)) + " ") + assetNameA) + ", ") + toString(accountBalanceWithStakedB)) + " ") + assetNameB) + ". State: ") + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB))
272262
273263
274264 @Callable(i)
275265 func init (firstHarvest) = {
276- let $t083358412 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
277- let pmtAmountA = $t083358412._1
278- let pmtAssetIdA = $t083358412._2
279- let $t084178494 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
280- let pmtAmountB = $t084178494._1
281- let pmtAssetIdB = $t084178494._2
282- let $t084998576 = getAssetInfo(pmtAssetIdA)
283- let pmtStrAssetIdA = $t084998576._1
284- let pmtAssetNameA = $t084998576._2
285- let pmtDecimalsA = $t084998576._3
286- let $t085818658 = getAssetInfo(pmtAssetIdB)
287- let pmtStrAssetIdB = $t085818658._1
288- let pmtAssetNameB = $t085818658._2
289- let pmtDecimalsB = $t085818658._3
266+ let $t075797656 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
267+ let pmtAmountA = $t075797656._1
268+ let pmtAssetIdA = $t075797656._2
269+ let $t076617738 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
270+ let pmtAmountB = $t076617738._1
271+ let pmtAssetIdB = $t076617738._2
272+ let $t077437820 = getAssetInfo(pmtAssetIdA)
273+ let pmtStrAssetIdA = $t077437820._1
274+ let pmtAssetNameA = $t077437820._2
275+ let pmtDecimalsA = $t077437820._3
276+ let $t078257902 = getAssetInfo(pmtAssetIdB)
277+ let pmtStrAssetIdB = $t078257902._1
278+ let pmtAssetNameB = $t078257902._2
279+ let pmtDecimalsB = $t078257902._3
290280 if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
291281 then throw("Only admin can call this function")
292282 else if (isDefined(getBoolean(this, keyActive)))
328318
329319 @Callable(i)
330320 func initWithInitRatio (amtAssetA,amtAssetB,strAssetIdA,strAssetIdB,firstHarvest) = {
331- let $t01124711334 = getAssetInfoFromString(strAssetIdA)
332- let pmtStrAssetIdA = $t01124711334._1
333- let pmtAssetNameA = $t01124711334._2
334- let pmtDecimalsA = $t01124711334._3
335- let $t01133911426 = getAssetInfoFromString(strAssetIdB)
336- let pmtStrAssetIdB = $t01133911426._1
337- let pmtAssetNameB = $t01133911426._2
338- let pmtDecimalsB = $t01133911426._3
321+ let $t01049110578 = getAssetInfoFromString(strAssetIdA)
322+ let pmtStrAssetIdA = $t01049110578._1
323+ let pmtAssetNameA = $t01049110578._2
324+ let pmtDecimalsA = $t01049110578._3
325+ let $t01058310670 = getAssetInfoFromString(strAssetIdB)
326+ let pmtStrAssetIdB = $t01058310670._1
327+ let pmtAssetNameB = $t01058310670._2
328+ let pmtDecimalsB = $t01058310670._3
339329 if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
340330 then throw("Only admin can call this function")
341331 else if (isDefined(getBoolean(this, keyActive)))
373363 let pmtAssetIdB = i.payments[1].assetId
374364 let pmtAmountA = i.payments[0].amount
375365 let pmtAmountB = i.payments[1].amount
376- let $t01392314000 = getAssetInfo(pmtAssetIdA)
377- let pmtStrAssetIdA = $t01392314000._1
378- let pmtAssetNameA = $t01392314000._2
379- let pmtDecimalsA = $t01392314000._3
380- let $t01400514082 = getAssetInfo(pmtAssetIdB)
381- let pmtStrAssetIdB = $t01400514082._1
382- let pmtAssetNameB = $t01400514082._2
383- let pmtDecimalsB = $t01400514082._3
366+ let $t01316713244 = getAssetInfo(pmtAssetIdA)
367+ let pmtStrAssetIdA = $t01316713244._1
368+ let pmtAssetNameA = $t01316713244._2
369+ let pmtDecimalsA = $t01316713244._3
370+ let $t01324913326 = getAssetInfo(pmtAssetIdB)
371+ let pmtStrAssetIdB = $t01324913326._1
372+ let pmtAssetNameB = $t01324913326._2
373+ let pmtDecimalsB = $t01324913326._3
384374 if (if ((balanceA == 0))
385375 then (balanceB == 0)
386376 else false)
475465
476466 @Callable(i)
477467 func withdraw () = {
478- let $t01925119326 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
479- let pmtAmount = $t01925119326._1
480- let pmtAssetId = $t01925119326._2
468+ let $t01849518570 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
469+ let pmtAmount = $t01849518570._1
470+ let pmtAssetId = $t01849518570._2
481471 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
482472 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
483473 if (!(isActive))
488478 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
489479 else if (!(hasEnoughBalance))
490480 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
491- else if (if ((amountToPayA > availableBalanceA))
492- then true
493- else (amountToPayB > availableBalanceB))
494- then throwInsufficientAvailableBalances(amountToPayA, amountToPayB)
495- else {
496- let stake1 = if (containsElement(stakingAssets, strAssetIdA))
497- then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
498- else 0
499- if ((stake1 == stake1))
500- then {
501- let stake2 = if (containsElement(stakingAssets, strAssetIdB))
502- then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
503- else 0
504- if ((stake2 == stake2))
505- then [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)]
506- else throw("Strict value is not equal to itself.")
507- }
508- else throw("Strict value is not equal to itself.")
509- }
481+ else {
482+ let stake1 = if (containsElement(stakingAssets, strAssetIdA))
483+ then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
484+ else 0
485+ if ((stake1 == stake1))
486+ then {
487+ let stake2 = if (containsElement(stakingAssets, strAssetIdB))
488+ then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
489+ else 0
490+ if ((stake2 == stake2))
491+ then [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)]
492+ else throw("Strict value is not equal to itself.")
493+ }
494+ else throw("Strict value is not equal to itself.")
495+ }
510496 }
511497
512498
513499
514500 @Callable(i)
515501 func exchange (minAmountToReceive) = {
516- let $t02084120916 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
517- let pmtAmount = $t02084120916._1
518- let pmtAssetId = $t02084120916._2
502+ let $t01992820003 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
503+ let pmtAmount = $t01992820003._1
504+ let pmtAssetId = $t01992820003._2
519505 func calculateFees (tokenFrom,tokenTo) = {
520506 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
521507 let amountWithFee = fraction(amountWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
540526 else if ((pmtAssetId == assetIdA))
541527 then {
542528 let assetIdSend = assetIdB
543- let $t02219022281 = calculateFees(balanceA, balanceB)
544- let amountWithoutFee = $t02219022281._1
545- let amountWithFee = $t02219022281._2
546- let governanceReward = $t02219022281._3
529+ let $t02127721368 = calculateFees(balanceA, balanceB)
530+ let amountWithoutFee = $t02127721368._1
531+ let amountWithFee = $t02127721368._2
532+ let governanceReward = $t02127721368._3
547533 let newBalanceA = (balanceA + pmtAmount)
548534 let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
549535 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
563549 else if ((pmtAssetId == assetIdB))
564550 then {
565551 let assetIdSend = assetIdA
566- let $t02323623327 = calculateFees(balanceB, balanceA)
567- let amountWithoutFee = $t02323623327._1
568- let amountWithFee = $t02323623327._2
569- let governanceReward = $t02323623327._3
552+ let $t02232322414 = calculateFees(balanceB, balanceA)
553+ let amountWithoutFee = $t02232322414._1
554+ let amountWithFee = $t02232322414._2
555+ let governanceReward = $t02232322414._3
570556 let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
571557 let newBalanceB = (balanceB + pmtAmount)
572- if (if ((stakedAmountA >= newBalanceA))
573- then true
574- else (stakedAmountB >= newBalanceB))
575- then throwInsufficientAvailableBalance(amountWithFee, availableBalanceA, assetNameA)
576- else {
577- let stake1 = if (containsElement(stakingAssets, strAssetIdA))
578- then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdA], nil)
558+ let stake1 = if (containsElement(stakingAssets, strAssetIdA))
559+ then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdA], nil)
560+ else 0
561+ if ((stake1 == stake1))
562+ then {
563+ let stake2 = if (containsElement(stakingAssets, strAssetIdB))
564+ then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdB], nil)
579565 else 0
580- if ((stake1 == stake1))
581- then {
582- let stake2 = if (containsElement(stakingAssets, strAssetIdB))
583- then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdB], nil)
584- else 0
585- if ((stake2 == stake2))
586- then [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
587- else throw("Strict value is not equal to itself.")
588- }
566+ if ((stake2 == stake2))
567+ then [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
589568 else throw("Strict value is not equal to itself.")
590569 }
570+ else throw("Strict value is not equal to itself.")
591571 }
592572 else throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
593573 }
681661 }
682662 }
683663 else {
684- let $t02793128034 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
685- let call = $t02793128034._1
686- let addr = $t02793128034._2
687- let params = $t02793128034._3
688- let payments = $t02793128034._4
664+ let $t02665226755 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
665+ let call = $t02665226755._1
666+ let addr = $t02665226755._2
667+ let params = $t02665226755._3
668+ let payments = $t02665226755._4
689669 let inv = invoke(addr, call, params, payments)
690670 if ((inv == inv))
691671 then nil
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 kShareLimit = "share_limit_on_first_harvest"
3737
3838 let kBasePeriod = "base_period"
3939
4040 let kPeriodLength = "period_length"
4141
4242 let kStartHeight = "start_height"
4343
4444 let keyUSDNNSBTAddress = "staking_usdnnsbt_address"
4545
4646 let keyEURNAddress = "staking_eurn_address"
4747
4848 let keyLeasingPool = "leasing_address"
4949
5050 let keyLeasingAmount = "leasing_amount"
5151
5252 let keyLeasingId = "leasing_id"
5353
5454 let keyAdminPubKey1 = "admin_pub_1"
5555
5656 let keyAdminPubKey2 = "admin_pub_2"
5757
5858 let keyAdminPubKey3 = "admin_pub_3"
5959
6060 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
6161
6262 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
6363 case string: String =>
6464 fromBase58String(string)
6565 case nothing =>
6666 throw("Admin public key is empty")
6767 }
6868
6969
7070 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
7171
7272 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
7373
7474 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
7575
7676 let adminPubKeyStartStop = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
7777
7878 let adminPubKeyStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
7979
8080 let walletAddress = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
8181
8282 let votingAddress = Address(base58'3MrJgdL1GniipErHy44YF9idzLaUL2iX5DQ')
8383
8484 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
8585
8686 let NSBT = base58'36mg8NZTaFRDygiVwb8uBnLR51hetJruUCZcxhaVcHj9'
8787
8888 let EURN = base58'ECBCkHS68DckpBrzLeoRgYbFg7sCVqR176mPqbXsj9pA'
8989
9090 let stakingAssets = ["WAVES", toBase58String(USDN), toBase58String(NSBT), toBase58String(EURN)]
9191
9292 let stakingUSDNNSBTAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyUSDNNSBTAddress), "no usdn staking address")))
9393
9494 let stakingEURNAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyEURNAddress), "no usdn staking address")))
9595
9696 let USDNToWavesExchanger = Address(base58'3N8PGkzXhbtTvEwEQTtE2xiTJmsDEQ9XfoZ')
9797
9898 let USDNToNSBTExchanger = Address(base58'3MqW1t2cxdYy2emEMk3YtZkRwQPhHaTfWRe')
9999
100100 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
101101
102102 let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
103103
104104 let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
105105
106106 let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
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 commissionScaleDelimiter = 1000000
151151
152152 let scaleValue3 = 1000
153153
154154 let scaleValue8 = 100000000
155155
156156 let slippageToleranceDelimiter = 1000
157157
158158 func accountBalance (assetId) = match assetId {
159159 case id: ByteVector =>
160160 assetBalance(this, id)
161161 case waves: Unit =>
162162 wavesBalance(this).available
163163 case _ =>
164164 throw("Match error")
165165 }
166166
167167
168168 func stakedAmount (assetId) = {
169169 let stakedAmountCalculated = match assetId {
170170 case aId: ByteVector =>
171171 if (if ((aId == USDN))
172172 then true
173173 else (aId == NSBT))
174174 then getInteger(stakingUSDNNSBTAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
175175 else if ((aId == EURN))
176176 then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(this)))
177177 else 0
178178 case _: Unit =>
179179 valueOrElse(getInteger(this, keyLeasingAmount), 0)
180180 case _ =>
181181 throw("Match error")
182182 }
183183 match stakedAmountCalculated {
184184 case i: Int =>
185185 i
186186 case _ =>
187187 0
188188 }
189189 }
190190
191191
192192 let stakedAmountA = stakedAmount(assetIdA)
193193
194194 let stakedAmountB = stakedAmount(assetIdB)
195195
196196 let assetInitA = getIntegerValue(this, keyBalanceInitA)
197197
198198 let assetInitB = getIntegerValue(this, keyBalanceInitB)
199199
200-let availableBalanceA = (balanceA - stakedAmountA)
201-
202-let availableBalanceB = (balanceB - stakedAmountB)
203-
204200 let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
205201
206202 let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
207203
208204 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
209205 then (accountBalanceWithStakedB >= balanceB)
210206 else false
211207
212208 func getAssetInfo (assetId) = match assetId {
213209 case id: ByteVector =>
214210 let stringId = toBase58String(id)
215211 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
216212 $Tuple3(stringId, info.name, info.decimals)
217213 case waves: Unit =>
218214 $Tuple3("WAVES", "WAVES", 8)
219215 case _ =>
220216 throw("Match error")
221217 }
222218
223219
224220 func getAssetInfoFromString (assetStr) = if ((assetStr == "WAVES"))
225221 then $Tuple3("WAVES", "WAVES", 8)
226222 else {
227223 let stringId = assetStr
228224 let id = fromBase58String(assetStr)
229225 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
230226 $Tuple3(stringId, info.name, info.decimals)
231227 }
232228
233229
234230 func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
235231
236232
237233 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
238234 then if ((assetId == USDN))
239235 then $Tuple2("lockNeutrino", stakingUSDNNSBTAddress)
240236 else if ((assetId == NSBT))
241237 then $Tuple2("lockNsbt", stakingUSDNNSBTAddress)
242238 else $Tuple2("startStaking", stakingEURNAddress)
243239 else if ((assetId == USDN))
244240 then $Tuple2("unlockNeutrino", stakingUSDNNSBTAddress)
245241 else if ((assetId == NSBT))
246242 then $Tuple2("unlockNsbt", stakingUSDNNSBTAddress)
247243 else $Tuple2("stopStaking", stakingEURNAddress)
248244
249245
250246 func calcStakingParams (stake,amount,assetId) = if (stake)
251247 then {
252248 let $t069306996 = calcStakingFuncAndAddres(stake, assetId)
253249 let call = $t069306996._1
254250 let stakingAddr = $t069306996._2
255251 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
256252 }
257253 else {
258254 let $t070827148 = calcStakingFuncAndAddres(stake, assetId)
259255 let call = $t070827148._1
260256 let stakingAddr = $t070827148._2
261257 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
262258 }
263259
264260
265-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"))
266-
267-
268-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"))
269-
270-
271261 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(accountBalanceWithStakedA)) + " ") + assetNameA) + ", ") + toString(accountBalanceWithStakedB)) + " ") + assetNameB) + ". State: ") + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB))
272262
273263
274264 @Callable(i)
275265 func init (firstHarvest) = {
276- let $t083358412 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
277- let pmtAmountA = $t083358412._1
278- let pmtAssetIdA = $t083358412._2
279- let $t084178494 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
280- let pmtAmountB = $t084178494._1
281- let pmtAssetIdB = $t084178494._2
282- let $t084998576 = getAssetInfo(pmtAssetIdA)
283- let pmtStrAssetIdA = $t084998576._1
284- let pmtAssetNameA = $t084998576._2
285- let pmtDecimalsA = $t084998576._3
286- let $t085818658 = getAssetInfo(pmtAssetIdB)
287- let pmtStrAssetIdB = $t085818658._1
288- let pmtAssetNameB = $t085818658._2
289- let pmtDecimalsB = $t085818658._3
266+ let $t075797656 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
267+ let pmtAmountA = $t075797656._1
268+ let pmtAssetIdA = $t075797656._2
269+ let $t076617738 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
270+ let pmtAmountB = $t076617738._1
271+ let pmtAssetIdB = $t076617738._2
272+ let $t077437820 = getAssetInfo(pmtAssetIdA)
273+ let pmtStrAssetIdA = $t077437820._1
274+ let pmtAssetNameA = $t077437820._2
275+ let pmtDecimalsA = $t077437820._3
276+ let $t078257902 = getAssetInfo(pmtAssetIdB)
277+ let pmtStrAssetIdB = $t078257902._1
278+ let pmtAssetNameB = $t078257902._2
279+ let pmtDecimalsB = $t078257902._3
290280 if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
291281 then throw("Only admin can call this function")
292282 else if (isDefined(getBoolean(this, keyActive)))
293283 then throw("DApp is already active")
294284 else if ((pmtAssetIdA == pmtAssetIdB))
295285 then throw("Assets must be different")
296286 else {
297287 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
298288 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
299289 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
300290 let arg1 = pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN)
301291 let arg2 = pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN)
302292 let arg3 = pow(10, 0, shareDecimals, 0, 0, DOWN)
303293 let shareInitialSupply = fraction(arg1, arg2, arg3)
304294 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
305295 let shareIssueId = calculateAssetId(shareIssue)
306296 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
307297 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
308298 else 0
309299 if ((stake1 == stake1))
310300 then {
311301 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
312302 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
313303 else 0
314304 if ((stake2 == stake2))
315305 then {
316306 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), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
317307 if (firstHarvest)
318308 then (baseEntry ++ [BooleanEntry(keyFirstHarvest, firstHarvest), IntegerEntry(keyFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
319309 else baseEntry
320310 }
321311 else throw("Strict value is not equal to itself.")
322312 }
323313 else throw("Strict value is not equal to itself.")
324314 }
325315 }
326316
327317
328318
329319 @Callable(i)
330320 func initWithInitRatio (amtAssetA,amtAssetB,strAssetIdA,strAssetIdB,firstHarvest) = {
331- let $t01124711334 = getAssetInfoFromString(strAssetIdA)
332- let pmtStrAssetIdA = $t01124711334._1
333- let pmtAssetNameA = $t01124711334._2
334- let pmtDecimalsA = $t01124711334._3
335- let $t01133911426 = getAssetInfoFromString(strAssetIdB)
336- let pmtStrAssetIdB = $t01133911426._1
337- let pmtAssetNameB = $t01133911426._2
338- let pmtDecimalsB = $t01133911426._3
321+ let $t01049110578 = getAssetInfoFromString(strAssetIdA)
322+ let pmtStrAssetIdA = $t01049110578._1
323+ let pmtAssetNameA = $t01049110578._2
324+ let pmtDecimalsA = $t01049110578._3
325+ let $t01058310670 = getAssetInfoFromString(strAssetIdB)
326+ let pmtStrAssetIdB = $t01058310670._1
327+ let pmtAssetNameB = $t01058310670._2
328+ let pmtDecimalsB = $t01058310670._3
339329 if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
340330 then throw("Only admin can call this function")
341331 else if (isDefined(getBoolean(this, keyActive)))
342332 then throw("DApp is already active")
343333 else if ((strAssetIdA == strAssetIdB))
344334 then throw("Assets must be different")
345335 else {
346336 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
347337 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
348338 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
349339 let shareInitialSupply = 0
350340 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
351341 let shareIssueId = calculateAssetId(shareIssue)
352342 let baseEntry = [StringEntry(keyVersion, version), BooleanEntry(keyActive, true), StringEntry(keyAssetIdA, pmtStrAssetIdA), StringEntry(keyAssetIdB, pmtStrAssetIdB), IntegerEntry(keyBalanceInitA, amtAssetA), IntegerEntry(keyBalanceInitB, amtAssetB), IntegerEntry(keyBalanceA, 0), IntegerEntry(keyBalanceB, 0), IntegerEntry(keyCommission, commission), IntegerEntry(keyCommissionScaleDelimiter, commissionScaleDelimiter), shareIssue, StringEntry(keyShareAssetId, toBase58String(shareIssueId)), IntegerEntry(keyShareAssetSupply, shareInitialSupply)]
353343 if (firstHarvest)
354344 then (baseEntry ++ [BooleanEntry(keyFirstHarvest, firstHarvest), IntegerEntry(keyFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
355345 else baseEntry
356346 }
357347 }
358348
359349
360350
361351 @Callable(i)
362352 func keepLimitForFirstHarvest (shareLimit) = if (!(isActive))
363353 then throw("DApp is inactive at this moment")
364354 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStaking], i.callerPublicKey)))
365355 then throw("Only admin can call this function")
366356 else [IntegerEntry(kShareLimit, shareLimit)]
367357
368358
369359
370360 @Callable(i)
371361 func replenishWithTwoTokens (slippageTolerance) = {
372362 let pmtAssetIdA = i.payments[0].assetId
373363 let pmtAssetIdB = i.payments[1].assetId
374364 let pmtAmountA = i.payments[0].amount
375365 let pmtAmountB = i.payments[1].amount
376- let $t01392314000 = getAssetInfo(pmtAssetIdA)
377- let pmtStrAssetIdA = $t01392314000._1
378- let pmtAssetNameA = $t01392314000._2
379- let pmtDecimalsA = $t01392314000._3
380- let $t01400514082 = getAssetInfo(pmtAssetIdB)
381- let pmtStrAssetIdB = $t01400514082._1
382- let pmtAssetNameB = $t01400514082._2
383- let pmtDecimalsB = $t01400514082._3
366+ let $t01316713244 = getAssetInfo(pmtAssetIdA)
367+ let pmtStrAssetIdA = $t01316713244._1
368+ let pmtAssetNameA = $t01316713244._2
369+ let pmtDecimalsA = $t01316713244._3
370+ let $t01324913326 = getAssetInfo(pmtAssetIdB)
371+ let pmtStrAssetIdB = $t01324913326._1
372+ let pmtAssetNameB = $t01324913326._2
373+ let pmtDecimalsB = $t01324913326._3
384374 if (if ((balanceA == 0))
385375 then (balanceB == 0)
386376 else false)
387377 then {
388378 let tokenRatio = fraction(fraction(assetInitA, scaleValue8, pmtAmountA), scaleValue3, fraction(assetInitB, scaleValue8, pmtAmountB))
389379 if ((pmtAssetIdA == pmtAssetIdB))
390380 then throw("Assets must be different")
391381 else {
392382 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
393383 let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
394384 if (!(isActive))
395385 then throw("DApp is inactive at this moment")
396386 else if (if ((0 > slippageTolerance))
397387 then true
398388 else (slippageTolerance > slippageToleranceDelimiter))
399389 then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
400390 else if ((size(i.payments) != 2))
401391 then throw("Two attached assets expected")
402392 else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
403393 then true
404394 else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
405395 then throw("Incorrect assets amount: amounts must have the contract ratio")
406396 else if (if ((pmtAssetIdA != assetIdA))
407397 then true
408398 else (pmtAssetIdB != assetIdB))
409399 then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
410400 else if ((shareInitialSupply == 0))
411401 then throw("Too small amount to replenish")
412402 else if (!(hasEnoughBalance))
413403 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
414404 else {
415405 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
416406 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
417407 else 0
418408 if ((stake1 == stake1))
419409 then {
420410 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
421411 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
422412 else 0
423413 if ((stake2 == stake2))
424414 then [Reissue(shareAssetId, shareInitialSupply, true), IntegerEntry(keyBalanceA, pmtAmountA), IntegerEntry(keyBalanceB, pmtAmountB), IntegerEntry(keyShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareAssetId)]
425415 else throw("Strict value is not equal to itself.")
426416 }
427417 else throw("Strict value is not equal to itself.")
428418 }
429419 }
430420 }
431421 else {
432422 let tokenRatio = fraction(fraction(balanceA, scaleValue8, pmtAmountA), scaleValue3, fraction(balanceB, scaleValue8, pmtAmountB))
433423 let ratioShareTokensInA = fraction(pmtAmountA, scaleValue8, balanceA)
434424 let ratioShareTokensInB = fraction(pmtAmountB, scaleValue8, balanceB)
435425 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scaleValue8)
436426 if (!(isActive))
437427 then throw("DApp is inactive at this moment")
438428 else if (if ((0 > slippageTolerance))
439429 then true
440430 else (slippageTolerance > slippageToleranceDelimiter))
441431 then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
442432 else if ((size(i.payments) != 2))
443433 then throw("Two attached assets expected")
444434 else if (if ((pmtAssetIdA != assetIdA))
445435 then true
446436 else (pmtAssetIdB != assetIdB))
447437 then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
448438 else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
449439 then true
450440 else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
451441 then throw("Incorrect assets amount: amounts must have the contract ratio")
452442 else if ((shareTokenToPayAmount == 0))
453443 then throw("Too small amount to replenish")
454444 else if (!(hasEnoughBalance))
455445 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
456446 else {
457447 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
458448 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
459449 else 0
460450 if ((stake1 == stake1))
461451 then {
462452 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
463453 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
464454 else 0
465455 if ((stake2 == stake2))
466456 then [IntegerEntry(keyBalanceA, (balanceA + pmtAmountA)), IntegerEntry(keyBalanceB, (balanceB + pmtAmountB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
467457 else throw("Strict value is not equal to itself.")
468458 }
469459 else throw("Strict value is not equal to itself.")
470460 }
471461 }
472462 }
473463
474464
475465
476466 @Callable(i)
477467 func withdraw () = {
478- let $t01925119326 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
479- let pmtAmount = $t01925119326._1
480- let pmtAssetId = $t01925119326._2
468+ let $t01849518570 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
469+ let pmtAmount = $t01849518570._1
470+ let pmtAssetId = $t01849518570._2
481471 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
482472 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
483473 if (!(isActive))
484474 then throw("DApp is inactive at this moment")
485475 else if ((size(i.payments) != 1))
486476 then throw("One attached payment expected")
487477 else if ((pmtAssetId != shareAssetId))
488478 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
489479 else if (!(hasEnoughBalance))
490480 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
491- else if (if ((amountToPayA > availableBalanceA))
492- then true
493- else (amountToPayB > availableBalanceB))
494- then throwInsufficientAvailableBalances(amountToPayA, amountToPayB)
495- else {
496- let stake1 = if (containsElement(stakingAssets, strAssetIdA))
497- then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
498- else 0
499- if ((stake1 == stake1))
500- then {
501- let stake2 = if (containsElement(stakingAssets, strAssetIdB))
502- then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
503- else 0
504- if ((stake2 == stake2))
505- then [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)]
506- else throw("Strict value is not equal to itself.")
507- }
508- else throw("Strict value is not equal to itself.")
509- }
481+ else {
482+ let stake1 = if (containsElement(stakingAssets, strAssetIdA))
483+ then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
484+ else 0
485+ if ((stake1 == stake1))
486+ then {
487+ let stake2 = if (containsElement(stakingAssets, strAssetIdB))
488+ then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
489+ else 0
490+ if ((stake2 == stake2))
491+ then [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)]
492+ else throw("Strict value is not equal to itself.")
493+ }
494+ else throw("Strict value is not equal to itself.")
495+ }
510496 }
511497
512498
513499
514500 @Callable(i)
515501 func exchange (minAmountToReceive) = {
516- let $t02084120916 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
517- let pmtAmount = $t02084120916._1
518- let pmtAssetId = $t02084120916._2
502+ let $t01992820003 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
503+ let pmtAmount = $t01992820003._1
504+ let pmtAssetId = $t01992820003._2
519505 func calculateFees (tokenFrom,tokenTo) = {
520506 let amountWithoutFee = fraction(tokenTo, pmtAmount, (pmtAmount + tokenFrom))
521507 let amountWithFee = fraction(amountWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
522508 let governanceReward = fraction(amountWithoutFee, commissionGovernance, commissionScaleDelimiter)
523509 if ((minAmountToReceive > amountWithFee))
524510 then throw(((("Calculated amount to receive " + toString(amountWithFee)) + " is less than specified minimum ") + toString(minAmountToReceive)))
525511 else $Tuple3(amountWithoutFee, amountWithFee, governanceReward)
526512 }
527513
528514 if (!(isActive))
529515 then throw("DApp is inactive at this moment")
530516 else if (if ((balanceA == 0))
531517 then true
532518 else (balanceB == 0))
533519 then throw("Can't exchange with zero balance")
534520 else if ((0 >= minAmountToReceive))
535521 then throw(("Minimal amount to receive must be positive. Actual: " + toString(minAmountToReceive)))
536522 else if ((size(i.payments) != 1))
537523 then throw("One attached payment expected")
538524 else if (!(hasEnoughBalance))
539525 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
540526 else if ((pmtAssetId == assetIdA))
541527 then {
542528 let assetIdSend = assetIdB
543- let $t02219022281 = calculateFees(balanceA, balanceB)
544- let amountWithoutFee = $t02219022281._1
545- let amountWithFee = $t02219022281._2
546- let governanceReward = $t02219022281._3
529+ let $t02127721368 = calculateFees(balanceA, balanceB)
530+ let amountWithoutFee = $t02127721368._1
531+ let amountWithFee = $t02127721368._2
532+ let governanceReward = $t02127721368._3
547533 let newBalanceA = (balanceA + pmtAmount)
548534 let newBalanceB = ((balanceB - amountWithFee) - governanceReward)
549535 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
550536 then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdA], nil)
551537 else 0
552538 if ((stake1 == stake1))
553539 then {
554540 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
555541 then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdB], nil)
556542 else 0
557543 if ((stake2 == stake2))
558544 then [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
559545 else throw("Strict value is not equal to itself.")
560546 }
561547 else throw("Strict value is not equal to itself.")
562548 }
563549 else if ((pmtAssetId == assetIdB))
564550 then {
565551 let assetIdSend = assetIdA
566- let $t02323623327 = calculateFees(balanceB, balanceA)
567- let amountWithoutFee = $t02323623327._1
568- let amountWithFee = $t02323623327._2
569- let governanceReward = $t02323623327._3
552+ let $t02232322414 = calculateFees(balanceB, balanceA)
553+ let amountWithoutFee = $t02232322414._1
554+ let amountWithFee = $t02232322414._2
555+ let governanceReward = $t02232322414._3
570556 let newBalanceA = ((balanceA - amountWithFee) - governanceReward)
571557 let newBalanceB = (balanceB + pmtAmount)
572- if (if ((stakedAmountA >= newBalanceA))
573- then true
574- else (stakedAmountB >= newBalanceB))
575- then throwInsufficientAvailableBalance(amountWithFee, availableBalanceA, assetNameA)
576- else {
577- let stake1 = if (containsElement(stakingAssets, strAssetIdA))
578- then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdA], nil)
558+ let stake1 = if (containsElement(stakingAssets, strAssetIdA))
559+ then invoke(this, "stakeUnstake", [false, (amountWithFee + governanceReward), strAssetIdA], nil)
560+ else 0
561+ if ((stake1 == stake1))
562+ then {
563+ let stake2 = if (containsElement(stakingAssets, strAssetIdB))
564+ then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdB], nil)
579565 else 0
580- if ((stake1 == stake1))
581- then {
582- let stake2 = if (containsElement(stakingAssets, strAssetIdB))
583- then invoke(this, "stakeUnstake", [true, pmtAmount, strAssetIdB], nil)
584- else 0
585- if ((stake2 == stake2))
586- then [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
587- else throw("Strict value is not equal to itself.")
588- }
566+ if ((stake2 == stake2))
567+ then [IntegerEntry(keyBalanceA, newBalanceA), IntegerEntry(keyBalanceB, newBalanceB), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(walletAddress, governanceReward, assetIdSend)]
589568 else throw("Strict value is not equal to itself.")
590569 }
570+ else throw("Strict value is not equal to itself.")
591571 }
592572 else throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
593573 }
594574
595575
596576
597577 @Callable(i)
598578 func shutdown () = if (!(isActive))
599579 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
600580 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
601581 then throw("Only admin can call this function")
602582 else suspend("Paused by admin")
603583
604584
605585
606586 @Callable(i)
607587 func activate () = if (isActive)
608588 then throw("DApp is already active")
609589 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
610590 then throw("Only admin can call this function")
611591 else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
612592
613593
614594
615595 @Callable(i)
616596 func takeIntoAccountExtraFunds (amountLeave) = {
617597 let uncountableAmountEnrollAssetA = (accountBalanceWithStakedA - balanceA)
618598 let uncountableAmountEnrollAssetB = (accountBalanceWithStakedB - balanceB)
619599 let amountEnrollA = (uncountableAmountEnrollAssetA - (if ((assetIdA == unit))
620600 then amountLeave
621601 else 0))
622602 let amountEnrollB = (uncountableAmountEnrollAssetB - (if ((assetIdB == unit))
623603 then amountLeave
624604 else 0))
625605 if (!(isActive))
626606 then throw("DApp is inactive at this moment")
627607 else if ((i.caller != this))
628608 then throw("Only the DApp itself can call this function")
629609 else if ((0 > amountLeave))
630610 then throw(("Argument 'amountLeave' cannot be negative. Actual: " + toString(amountLeave)))
631611 else if (if ((0 > uncountableAmountEnrollAssetA))
632612 then true
633613 else (0 > uncountableAmountEnrollAssetB))
634614 then suspend("Enroll amount negative")
635615 else if (if ((0 > amountEnrollA))
636616 then true
637617 else (0 > amountEnrollB))
638618 then throw("Too large amountLeave")
639619 else {
640620 let stake1 = if (if (containsElement(stakingAssets, strAssetIdA))
641621 then (amountEnrollA > 0)
642622 else false)
643623 then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
644624 else 0
645625 if ((stake1 == stake1))
646626 then {
647627 let stake2 = if (if (containsElement(stakingAssets, strAssetIdB))
648628 then (amountEnrollB > 0)
649629 else false)
650630 then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
651631 else 0
652632 if ((stake2 == stake2))
653633 then [IntegerEntry(keyBalanceA, (balanceA + amountEnrollA)), IntegerEntry(keyBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
654634 else throw("Strict value is not equal to itself.")
655635 }
656636 else throw("Strict value is not equal to itself.")
657637 }
658638 }
659639
660640
661641
662642 @Callable(i)
663643 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
664644 then throw("Only contract itself can invoke this function")
665645 else if ((assetIdString == "WAVES"))
666646 then {
667647 let pool = addressFromStringValue(valueOrErrorMessage(getString(oracle, keyLeasingPool), "No leasing pool in oracle"))
668648 let leasingId = getBinary(this, keyLeasingId)
669649 let leasingAmount = valueOrElse(getInteger(this, keyLeasingAmount), 0)
670650 let newLeaseAmount = if (stake)
671651 then (leasingAmount + amount)
672652 else (leasingAmount - amount)
673653 let newLease = Lease(pool, newLeaseAmount)
674654 let newLeaseId = calculateLeaseId(newLease)
675655 let baseEtry = [newLease, BinaryEntry(keyLeasingId, newLeaseId), IntegerEntry(keyLeasingAmount, newLeaseAmount)]
676656 match leasingId {
677657 case lId: ByteVector =>
678658 ([LeaseCancel(lId)] ++ baseEtry)
679659 case _ =>
680660 baseEtry
681661 }
682662 }
683663 else {
684- let $t02793128034 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
685- let call = $t02793128034._1
686- let addr = $t02793128034._2
687- let params = $t02793128034._3
688- let payments = $t02793128034._4
664+ let $t02665226755 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
665+ let call = $t02665226755._1
666+ let addr = $t02665226755._2
667+ let params = $t02665226755._3
668+ let payments = $t02665226755._4
689669 let inv = invoke(addr, call, params, payments)
690670 if ((inv == inv))
691671 then nil
692672 else throw("Strict value is not equal to itself.")
693673 }
694674
695675
696676
697677 @Callable(i)
698678 func stakeAll () = if (!(isActive))
699679 then throw("DApp is inactive at this moment")
700680 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
701681 then throw("Only admin can call this function")
702682 else {
703683 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
704684 then {
705685 let amountA = (balanceA - stakedAmountA)
706686 if ((amountA > 0))
707687 then invoke(this, "stakeUnstake", [true, amountA, strAssetIdA], nil)
708688 else 0
709689 }
710690 else 0
711691 if ((stake1 == stake1))
712692 then {
713693 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
714694 then {
715695 let amountB = (balanceB - stakedAmountB)
716696 if ((amountB > 0))
717697 then invoke(this, "stakeUnstake", [true, amountB, strAssetIdB], nil)
718698 else 0
719699 }
720700 else 0
721701 if ((stake2 == stake2))
722702 then nil
723703 else throw("Strict value is not equal to itself.")
724704 }
725705 else throw("Strict value is not equal to itself.")
726706 }
727707
728708
729709 @Verifier(tx)
730710 func verify () = {
731711 let multiSignedByAdmins = {
732712 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
733713 then 1
734714 else 0
735715 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
736716 then 1
737717 else 0
738718 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
739719 then 1
740720 else 0
741721 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
742722 }
743723 match tx {
744724 case inv: InvokeScriptTransaction =>
745725 let callTakeIntoAccount = if ((inv.dApp == this))
746726 then (inv.function == "takeIntoAccountExtraFunds")
747727 else false
748728 let exchangeToWaves = if (if (if ((inv.dApp == USDNToWavesExchanger))
749729 then (inv.function == "exchange")
750730 else false)
751731 then (assetIdA == USDN)
752732 else false)
753733 then true
754734 else if (if ((assetIdB == USDN))
755735 then (size(inv.payments) == 1)
756736 else false)
757737 then (inv.payments[0].assetId == USDN)
758738 else false
759739 let exchangeToNSBTs = if (if (if ((inv.dApp == USDNToNSBTExchanger))
760740 then (inv.function == "exchange")
761741 else false)
762742 then (assetIdA == NSBT)
763743 else false)
764744 then true
765745 else if (if ((assetIdB == NSBT))
766746 then (size(inv.payments) == 1)
767747 else false)
768748 then (inv.payments[0].assetId == USDN)
769749 else false
770750 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
771751 then true
772752 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
773753 then true
774754 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
775755 then true
776756 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyStaking)
777757 if (if (if (if (callTakeIntoAccount)
778758 then true
779759 else exchangeToWaves)
780760 then true
781761 else exchangeToNSBTs)
782762 then signedByAdmin
783763 else false)
784764 then true
785765 else multiSignedByAdmins
786766 case _ =>
787767 multiSignedByAdmins
788768 }
789769 }
790770

github/deemru/w8io/026f985 
112.90 ms