tx · 3ek4A8BrTQHGwjPB3irD93xFtfxX9fYVfXZhVofFZ75W

3N5QMy4So95bBVVZxLK9nFjbJEuJvEXk8nL:  -0.03800000 Waves

2022.07.06 10:08 [2127503] smart account 3N5QMy4So95bBVVZxLK9nFjbJEuJvEXk8nL > SELF 0.00000000 Waves

{ "type": 13, "id": "3ek4A8BrTQHGwjPB3irD93xFtfxX9fYVfXZhVofFZ75W", "fee": 3800000, "feeAssetId": null, "timestamp": 1657091310663, "version": 2, "chainId": 84, "sender": "3N5QMy4So95bBVVZxLK9nFjbJEuJvEXk8nL", "senderPublicKey": "5orYB9cmY7NreAQgteqTVEPXjQ8JjdvhD4eZ19VvmfzK", "proofs": [ "2HfCCmtsDerMs538npcEXsmdivu2CiydA28yuBThw9Ctmnkqht7SxBWMdaffNVVudcKipEd5m4Yjrn5zzkt2uhYS" ], "script": "base64:AAIFAAAAAAAAADAIAhIDCgEEEgASBAoCAQESABIFCgMBAQgSBAoCAQESABIAEgASAwoBARIFCgMEAQgAAABhAAAAAAd2ZXJzaW9uAgAAAAUyLjAuMAAAAAAIa1ZlcnNpb24CAAAAB3ZlcnNpb24AAAAAB2tBY3RpdmUCAAAABmFjdGl2ZQAAAAAJa0Fzc2V0SWRBAgAAAApBX2Fzc2V0X2lkAAAAAAlrQXNzZXRJZEICAAAACkJfYXNzZXRfaWQAAAAACWtCYWxhbmNlQQIAAAAPQV9hc3NldF9iYWxhbmNlAAAAAAlrQmFsYW5jZUICAAAAD0JfYXNzZXRfYmFsYW5jZQAAAAANa1NoYXJlQXNzZXRJZAIAAAAOc2hhcmVfYXNzZXRfaWQAAAAAEWtTaGFyZUFzc2V0U3VwcGx5AgAAABJzaGFyZV9hc3NldF9zdXBwbHkAAAAABGtGZWUCAAAACmNvbW1pc3Npb24AAAAACmtJbnZhcmlhbnQCAAAACWludmFyaWFudAAAAAAGa0NhdXNlAgAAAA5zaHV0ZG93bl9jYXVzZQAAAAAMa1VTRE5BZGRyZXNzAgAAABhzdGFraW5nX3VzZG5uc2J0X2FkZHJlc3MAAAAADGtFVVJOQWRkcmVzcwIAAAAUc3Rha2luZ19ldXJuX2FkZHJlc3MAAAAACmtEaXNjb3VudHMCAAAACWRpc2NvdW50cwAAAAAPa0Rpc2NvdW50VmFsdWVzAgAAAA9kaXNjb3VudF92YWx1ZXMAAAAADmtVc2VyU3dvcEluR292AgAAAAxfU1dPUF9hbW91bnQAAAAADWtGaXJzdEhhcnZlc3QCAAAADWZpcnN0X2hhcnZlc3QAAAAAE2tGaXJzdEhhcnZlc3RIZWlnaHQCAAAAFGZpcnN0X2hhcnZlc3RfaGVpZ2h0AAAAAAtrU2hhcmVMaW1pdAIAAAAcc2hhcmVfbGltaXRfb25fZmlyc3RfaGFydmVzdAAAAAALa0Jhc2VQZXJpb2QCAAAAC2Jhc2VfcGVyaW9kAAAAAA1rUGVyaW9kTGVuZ3RoAgAAAA1wZXJpb2RfbGVuZ3RoAAAAAAxrU3RhcnRIZWlnaHQCAAAADHN0YXJ0X2hlaWdodAAAAAANa0FkbWluUHViS2V5MQIAAAALYWRtaW5fcHViXzEAAAAADWtBZG1pblB1YktleTICAAAAC2FkbWluX3B1Yl8yAAAAAA1rQWRtaW5QdWJLZXkzAgAAAAthZG1pbl9wdWJfMwAAAAASa0FkbWluSW52b2tlUHViS2V5AgAAABBhZG1pbl9pbnZva2VfcHViAAAAABBrTW9uZXlCb3hBZGRyZXNzAgAAABFtb25leV9ib3hfYWRkcmVzcwAAAAALa0dvdkFkZHJlc3MCAAAAEmdvdmVybmFuY2VfYWRkcmVzcwAAAAAOa1ZvdGluZ0FkZHJlc3MCAAAADnZvdGluZ19hZGRyZXNzAAAAAAZvcmFjbGUJAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVTpRaoekC86rvG6DuYumpJfGpiE4fNiswgBAAAAE2dldEJhc2U1OEZyb21PcmFjbGUAAAABAAAAA2tleQQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAZvcmFjbGUFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAZzdHJpbmcFAAAAByRtYXRjaDAJAAJZAAAAAQUAAAAGc3RyaW5nBAAAAAdub3RoaW5nBQAAAAckbWF0Y2gwCQAAAgAAAAEJAAEsAAAAAgUAAAADa2V5AgAAAAhpcyBlbXB0eQAAAAAMYWRtaW5QdWJLZXkxCQEAAAATZ2V0QmFzZTU4RnJvbU9yYWNsZQAAAAEFAAAADWtBZG1pblB1YktleTEAAAAADGFkbWluUHViS2V5MgkBAAAAE2dldEJhc2U1OEZyb21PcmFjbGUAAAABBQAAAA1rQWRtaW5QdWJLZXkyAAAAAAxhZG1pblB1YktleTMJAQAAABNnZXRCYXNlNThGcm9tT3JhY2xlAAAAAQUAAAANa0FkbWluUHViS2V5MwAAAAARYWRtaW5QdWJLZXlJbnZva2UJAQAAABNnZXRCYXNlNThGcm9tT3JhY2xlAAAAAQUAAAASa0FkbWluSW52b2tlUHViS2V5AAAAAA9tb25leUJveEFkZHJlc3MJAQAAAAdBZGRyZXNzAAAAAQkBAAAAE2dldEJhc2U1OEZyb21PcmFjbGUAAAABBQAAABBrTW9uZXlCb3hBZGRyZXNzAAAAAApnb3ZBZGRyZXNzCQEAAAAHQWRkcmVzcwAAAAEJAQAAABNnZXRCYXNlNThGcm9tT3JhY2xlAAAAAQUAAAALa0dvdkFkZHJlc3MAAAAAEnN0YWtpbmdVU0ROQWRkcmVzcwkBAAAAB0FkZHJlc3MAAAABCQEAAAATZ2V0QmFzZTU4RnJvbU9yYWNsZQAAAAEFAAAADGtVU0ROQWRkcmVzcwAAAAANdm90aW5nQWRkcmVzcwkBAAAAB0FkZHJlc3MAAAABCQEAAAATZ2V0QmFzZTU4RnJvbU9yYWNsZQAAAAEFAAAADmtWb3RpbmdBZGRyZXNzAAAAAARVU0ROAQAAACC2JinDBPXOU5GkDkt1JC9kjFGx+t+vVCm9SNIdKrKq0QAAAAANc3Rha2luZ0Fzc2V0cwkABEwAAAACCQACWAAAAAEFAAAABFVTRE4FAAAAA25pbAAAAAAKYmFzZVBlcmlvZAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAADXZvdGluZ0FkZHJlc3MFAAAAC2tCYXNlUGVyaW9kAgAAABFFbXB0eSBrQmFzZVBlcmlvZAAAAAALc3RhcnRIZWlnaHQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA12b3RpbmdBZGRyZXNzBQAAAAxrU3RhcnRIZWlnaHQCAAAAEkVtcHR5IGtTdGFydEhlaWdodAAAAAAMcGVyaW9kTGVuZ3RoCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANdm90aW5nQWRkcmVzcwUAAAANa1BlcmlvZExlbmd0aAIAAAATRW1wdHkga1BlcmlvZExlbmd0aAAAAAAVZmlyc3RIYXJ2ZXN0RW5kUGVyaW9kCQAAZAAAAAIJAABkAAAAAgUAAAAKYmFzZVBlcmlvZAkAAGkAAAACCQAAZQAAAAIFAAAABmhlaWdodAUAAAALc3RhcnRIZWlnaHQFAAAADHBlcmlvZExlbmd0aAAAAAAAAAAAAwAAAAAGYWN0aXZlCQEAAAARQGV4dHJOYXRpdmUoMTA1MSkAAAACBQAAAAR0aGlzBQAAAAdrQWN0aXZlAAAAAAtzdHJBc3NldElkQQkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAEdGhpcwUAAAAJa0Fzc2V0SWRBAAAAAAtzdHJBc3NldElkQgkBAAAAEUBleHRyTmF0aXZl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AAAAAAUAAAAERE9XTgQAAAAKc2hhcmVJc3N1ZQkABEIAAAAFBQAAAAlzaGFyZU5hbWUFAAAAEHNoYXJlRGVzY3JpcHRpb24FAAAAEnNoYXJlSW5pdGlhbFN1cHBseQUAAAANc2hhcmVEZWNpbWFscwYEAAAADHNoYXJlSXNzdWVJZAkABDgAAAABBQAAAApzaGFyZUlzc3VlBAAAABNpbnZhcmlhbnRDYWxjdWxhdGVkCQEAAAANaW52YXJpYW50Q2FsYwAAAAIFAAAACnBtdEFtb3VudEEFAAAACnBtdEFtb3VudEIEAAAABnN0YWtlMQMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAA1zdGFraW5nQXNzZXRzBQAAAA5wbXRTdHJBc3NldElkQQkAA/wAAAAEBQAAAAR0aGlzAgAAAAxzdGFrZVVuc3Rha2UJAARMAAAAAgYJAARMAAAAAgUAAAAKcG10QW1vdW50QQkABEwAAAACBQAAAA5wbXRTdHJBc3NldElkQQUAAAADbmlsBQAAAANuaWwAAAAAAAAAAAADCQAAAAAAAAIFAAAABnN0YWtlMQUAAAAGc3Rha2UxBAAAAAZzdGFrZTIDCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAANc3Rha2luZ0Fzc2V0cwUAAAAOcG10U3RyQXNzZXRJZEIJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VVbnN0YWtlCQAETAAAAAIGCQAETAAAAAIFAAAACnBtdEFtb3VudEIJAARMAAAAAgUAAAAOcG10U3RyQXNzZXRJZEIFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAAAwkAAAAAAAACBQAAAAZzdGFrZTIFAAAABnN0YWtlMgQAAAAJYmFzZUVudHJ5CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAACGtWZXJzaW9uBQAAAAd2ZXJzaW9uCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAAdrQWN0aXZlBgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAlrQXNzZXRJZEEFAAAADnBtdFN0ckFzc2V0SWRBCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAACWtBc3NldElkQgUAAAAOcG10U3RyQXNzZXRJZEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQQUAAAAKcG10QW1vdW50QQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VCBQAAAApwbXRBbW91bnRCCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAprSW52YXJpYW50BQAAABNpbnZhcmlhbnRDYWxjdWxhdGVkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAARrRmVlCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAZvcmFjbGUCAAAADWJhc2VfZmVlX2ZsYXQJAARMAAAAAgUAAAAKc2hhcmVJc3N1ZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAA1rU2hhcmVBc3NldElkCQACWAAAAAEFAAAADHNoYXJlSXNzdWVJZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAARa1NoYXJlQXNzZXRTdXBwbHkFAAAAEnNoYXJlSW5pdGlhbFN1cHBseQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAEnNoYXJlSW5pdGlhbFN1cHBseQUAAAAMc2hhcmVJc3N1ZUlkBQAAAANuaWwDBQAAAAxmaXJzdEhhcnZlc3QJAAROAAAAAgUAAAAJYmFzZUVudHJ5CQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAA1rRmlyc3RIYXJ2ZXN0BQAAAAxmaXJzdEhhcnZlc3QJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAE2tGaXJzdEhhcnZlc3RIZWlnaHQJAABkAAAAAgUAAAALc3RhcnRIZWlnaHQJAABoAAAAAgUAAAAVZmlyc3RIYXJ2ZXN0RW5kUGVyaW9kBQAAAAxwZXJpb2RMZW5ndGgFAAAAA25pbAUAAAAJYmFzZUVudHJ5CQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAWcmVwbGVuaXNoV2l0aFR3b1Rva2VucwAAAAAJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAQAAAAhpc0FjdGl2ZQAAAAAEAAAAC3BtdEFzc2V0SWRBCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAAtwbXRBc3NldElkQggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEAAAAHYXNzZXRJZAQAAAATcmF0aW9TaGFyZVRva2Vuc0luQQkAAGsAAAADBQAAAAZzY2FsZTgICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAUAAAAIYmFsYW5jZUEEAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkIJAABrAAAAAwUAAAAGc2NhbGU4CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQAAAAZhbW91bnQFAAAACGJhbGFuY2VCBAAAAA0kdDAxNDc0NjE0ODIzCQEAAAAMZ2V0QXNzZXRJbmZvAAAAAQUAAAALcG10QXNzZXRJZEEEAAAADnBtdFN0ckFzc2V0SWRBCAUAAAANJHQwMTQ3NDYxNDgyMwAAAAJfMQQAAAANcG10QXNzZXROYW1lQQgFAAAADSR0MDE0NzQ2MTQ4MjMAAAACXzIEAAAADHBtdERlY2ltYWxzQQgFAAAADSR0MDE0NzQ2MTQ4MjMAAAACXzMEAAAADSR0MDE0ODI4MTQ5NDUJAQAAAAxnZXRBc3NldEluZm8AAAABBQAAAAtwbXRBc3NldElkQgQAAAAOcG10U3RyQXNzZXRJZEIIBQAAAA0kdDAxNDgyODE0OTQ1AAAAAl8xBAAAAA1wbXRBc3NldE5hbWVCCAUAAAANJHQwMTQ4MjgxNDk0NQAAAAJfMgQAAAAMcG10RGVjaW1hbHNCCAUAAAANJHQwMTQ4MjgxNDk0NQAAAAJfMwQAAAANJHQwMTQ5NTAxNTQ1NAMJAABmAAAAAgUAAAATcmF0aW9TaGFyZVRva2Vuc0luQgUAAAATcmF0aW9TaGFyZVRva2Vuc0luQQQAAAADcG10CQEAAAAIZnJhY3Rpb24AAAAEBQAAAAhi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bnRyeQAAAAIFAAAACWtCYWxhbmNlQQkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAAKcG10QW1vdW50QQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VCCQAAZAAAAAIFAAAACGJhbGFuY2VCBQAAAApwbXRBbW91bnRCCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrU2hhcmVBc3NldFN1cHBseQkAAGQAAAACBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACmtJbnZhcmlhbnQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAAKcG10QW1vdW50QQkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAKcG10QW1vdW50QgkABEwAAAACCQEAAAAHUmVpc3N1ZQAAAAMFAAAADHNoYXJlQXNzZXRJZAUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50BgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAUAAAAMc2hhcmVBc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAGY2hhbmdlBQAAAA1jaGFuZ2VBc3NldElkBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAABVyZXBsZW5pc2hXaXRoT25lVG9rZW4AAAACAAAAE3ZpcnR1YWxTd2FwVG9rZW5QYXkAAAATdmlydHVhbFN3YXBUb2tlbkdldAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAACGlzQWN0aXZlAAAAAAQAAAANJHQwMTcxODcxNzI2MgkABRQAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAACXBtdEFtb3VudAgFAAAADSR0MDE3MTg3MTcyNjIAAAACXzEEAAAACnBtdEFzc2V0SWQIBQAAAA0kdDAxNzE4NzE3MjYyAAAAAl8yBAAAAA0kdDAxNzI2NzE3MzQwCQEAAAAMZ2V0QXNzZXRJbmZvAAAAAQUAAAAKcG10QXNzZXRJZAQAAAANcG10U3RyQXNzZXRJZAgFAAAADSR0MDE3MjY3MTczNDAAAAACXzEEAAAADHBtdEFzc2V0TmFtZQgFAAAADSR0MDE3MjY3MTczNDAAAAACXzIEAAAAC3BtdERlY2ltYWxzCAUAAAANJHQwMTcyNjcxNzM0MAAAAAJfMwQAAAAPcG10TWluVGhyZXNob2xkAAAAAAAATEtABAAAAB10aHJlc2hvbGRWYWx1ZUZvck1pblRvbGVyYW5jZQAAAAAAAvrwgAQAAAAJdG9sZXJhbmNlAwkAAGYAAAACBQAAAB10aHJlc2hvbGRWYWx1ZUZvck1pblRvbGVyYW5jZQUAAAAJcG10QW1vdW50AAAAAAAAAYagAAAAAAAAAAABBAAAABxzbGlwcGFnZVZhbHVlTWluRm9yUmVwbGVuaXNoCQAAZQAAAAIFAAAABnNjYWxlOAkAAGkAAAACCQAAaAAAAAIFAAAABnNjYWxlOAUAAAAJdG9sZXJhbmNlAAAAAAAAmJaABAAAABxzbGlwcGFnZVZhbHVlTWF4Rm9yUmVwbGVuaXNoCQAAZAAAAAIFAAAABnNjYWxlOAkAAGkAAAACCQAAaAAAAAIFAAAABnNjYWxlOAUAAAAJdG9sZXJhbmNlAAAAAAAAmJaABAAAABdzbGlwcGFnZVZhbHVlTWluRm9yU3dhcAkAAGUAAAACBQAAAAZzY2FsZTgJAABpAAAAAgkAAGgAAAACBQAAAAZzY2FsZTgAAAAAAAAAAAEAAAAAAACYloADCQAAZgAAAAIFAAAAD3BtdE1pblRocmVzaG9sZAUAAAAJcG10QW1vdW50CQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAPUGF5bWVudCBhbW91bnQgCQABpAAAAAEFAAAACXBtdEFtb3VudAIAAAAnIGRvZXMgbm90IGV4Y2VlZCB0aGUgbWluaW11bSBhbW91bnQgb2YgCQABpAAAAAEFAAAAD3BtdE1pblRocmVzaG9sZAIAAAAHIHRva2VucwMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEJAQAAAA90aHJvd09uZVBheW1lbnQAAAAAAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQAETgAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAlwbXRBbW91bnQFAAAACnBtdEFzc2V0SWQFAAAAA25pbAkBAAAAEXN1c3BlbmRTdXNwaWNpb3VzAAAAAAMDCQEAAAACIT0AAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQkBAAAAAiE9AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEIHCQEAAAALdGhyb3dBc3NldHMAAAAABAAAAA0kdDAxODMxODE4OTYwAwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQkABRgAAAAGCQAAZQAAAAIFAAAACXBtdEFtb3VudAUAAAATdmlydHVhbFN3YXBUb2tlblBheQUAAAATdmlydHVhbFN3YXBUb2tlbkdldAkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAATdmlydHVhbFN3YXBUb2tlblBheQkAAGUAAAACBQAAAAhiYWxhbmNlQgUAAAATdmlydHVhbFN3YXBUb2tlbkdldAkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAAJcG10QW1vdW50BQAAAAhiYWxhbmNlQgkABRgAAAAGBQAAABN2aXJ0dWFsU3dhcFRva2VuR2V0CQAAZQAAAAIFAAAACXBtdEFtb3VudAUAAAATdmlydHVhbFN3YXBUb2tlblBheQkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAATdmlydHVhbFN3YXBUb2tlbkdldAkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAATdmlydHVhbFN3YXBUb2tlblBheQUAAAAIYmFsYW5jZUEJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAACXBtdEFtb3VudAQAAAARdmlydHVhbFJlcGxlbmlzaEEIBQAAAA0kdDAxODMxODE4OTYwAAAAAl8xBAAAABF2aXJ0dWFsUmVwbGVuaXNoQggFAAAADSR0MDE4MzE4MTg5NjAAAAACXzIEAAAAEWJhbGFuY2VBZnRlclN3YXBBCAUAAAANJHQwMTgzMTgxODk2MAAAAAJfMwQAAAARYmFsYW5jZUFmdGVyU3dhcEIIBQAAAA0kdDAxODMxODE4OTYwAAAAAl80BAAAAAtuZXdCYWxhbmNlQQgFAAAADSR0MDE4MzE4MTg5NjAAAAACXzUEAAAAC25ld0JhbGFuY2VCCAUAAAANJHQwMTgzMTgxODk2MAAAAAJfNgQAAAAMaW52YXJpYW50TmV3CQEAAAANaW52YXJpYW50Q2FsYwAAAAIFAAAAEWJhbGFuY2VBZnRlclN3YXBBBQAAABFiYWxhbmNlQWZ0ZXJTd2FwQgQAAAAlcmF0aW9WaXJ0dWFsQmFsYW5jZVRvVmlydHVhbFJlcGxlbmlzaAkAAGkAAAACCQAAawAAAAMFAAAAB3NjYWxlMTYFAAAAEWJhbGFuY2VBZnRlclN3YXBBBQAAABFiYWxhbmNlQWZ0ZXJTd2FwQgkAAGsAAAADBQAAAAZzY2FsZTgFAAAAEXZpcnR1YWxSZXBsZW5pc2hBBQAAABF2aXJ0dWFsUmVwbGVuaXNoQgQAAAATZEFwcFRocmVzaG9sZEFtb3VudAkAAGsAAAADCQAAZAAAAAIFAAAAC25ld0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQgUAAAANZEFwcFRocmVzaG9sZAkAAGgAAAACAAAAAAAAAAACBQAAABNkQXBwVGhyZXNob2xkU2NhbGUyAwMJAABnAAAAAgUAAAAXc2xpcHBhZ2VWYWx1ZU1pbkZvclN3YXAJAABrAAAAAwUAAAAGc2NhbGU4BQAAAAlpbnZhcmlhbnQFAAAADGludmFyaWFudE5ldwYJAABmAAAAAgUAAAAJaW52YXJpYW50BQAAAAxpbnZhcmlhbnROZXcJAAACAAAAAQIAAAA6SW5jb3JyZWN0IHZpcnR1YWxTd2FwVG9rZW5QYXkgb3IgdmlydHVhbFN3YXBUb2tlbkdldCB2YWx1ZQMDCQAAZgAAAAIFAAAAHHNsaXBwYWdlVmFsdWVNaW5Gb3JSZXBsZW5pc2gFAAAAJXJhdGlvVmlydHVhbEJhbGFuY2VUb1ZpcnR1YWxSZXBsZW5pc2gGCQAAZgAAAAIFAAAAJXJhdGlvVmlydHVhbEJhbGFuY2VUb1ZpcnR1YWxSZXBsZW5pc2gFAAAAHHNsaXBwYWdlVmFsdWVNYXhGb3JSZXBsZW5pc2gJAAACAAAAAQIAAABsU3dhcCB3aXRoIHZpcnR1YWxTd2FwVG9rZW5QYXkgYW5kIHZpcnR1YWxTd2FwVG9rZW5HZXQgaXMgcG9zc2libGUsIGJ1dCByYXRpbyBhZnRlciB2aXJ0dWFsIHN3YXAgaXMgaW5jb3JyZWN0AwMJAABmAAAAAgUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAALbmV3QmFsYW5jZUEGCQAAZgAAAAIFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAC25ld0JhbGFuY2VCCQEAAAAOdGhyb3dUaHJlc2hvbGQAAAADBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAAtuZXdCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUIEAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAABrAAAAAwUAAAARdmlydHVhbFJlcGxlbmlzaEEFAAAABnNjYWxlOAUAAAARYmFsYW5jZUFmdGVyU3dhcEEEAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkIJAABrAAAAAwUAAAARdmlydHVhbFJlcGxlbmlzaEIFAAAABnNjYWxlOAUAAAARYmFsYW5jZUFmdGVyU3dhcEIEAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAkAAGsAAAADCQABlwAAAAEJAARMAAAAAgUAAAATcmF0aW9TaGFyZVRva2Vuc0luQQkABEwAAAACBQAAABNyYXRpb1NoYXJlVG9rZW5zSW5CBQAAAANuaWwFAAAAEHNoYXJlQXNzZXRTdXBwbHkFAAAABnNjYWxlOAQAAAAdc2hhcmVUb2tlblRvUGF5QW1vdW50QWZ0ZXJGZWUJAABrAAAAAwUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50CQAAZQAAAAIFAAAACWZlZVNjYWxlNgkAAGkAAAACBQAAAANmZWUAAAAAAAAAAAIFAAAACWZlZVNjYWxlNgQAAAAac2hhcmVUb2tlbkdvdmVybmFuY2VSZXdhcmQJAABrAAAAAwUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50CQAAaQAAAAIFAAAADWZlZUdvdmVybmFuY2UAAAAAAAAAAAIFAAAACWZlZVNjYWxlNgQAAAAWZ292ZXJuYW5jZVJld2FyZFRva2VuQQkAAGsAAAADBQAAABpzaGFyZVRva2VuR292ZXJuYW5jZVJld2FyZAUAAAAIYmFsYW5jZUEFAAAAEHNoYXJlQXNzZXRTdXBwbHkEAAAAFmdvdmVybmFuY2VSZXdhcmRUb2tlbkIJAABrAAAAAwUAAAAac2hhcmVUb2tlbkdvdmVybmFuY2VSZXdhcmQFAAAACGJhbGFuY2VCBQAAABBzaGFyZUFzc2V0U3VwcGx5BAAAAA0kdDAyMDk0NzIxMjQyAwkAAAAAAAACBQAAAA1wbXRTdHJBc3NldElkBQAAAAtzdHJBc3NldElkQQkABRUAAAADCQAAZQAAAAIFAAAACXBtdEFtb3VudAUAAAAWZ292ZXJuYW5jZVJld2FyZFRva2VuQQUAAAAWZ292ZXJuYW5jZVJld2FyZFRva2VuQgUAAAALc3RyQXNzZXRJZEIJAAUVAAAAAwkAAGUAAAACBQAAAAlwbXRBbW91bnQFAAAAFmdvdmVybmFuY2VSZXdhcmRUb2tlbkIFAAAAFmdvdmVybmFuY2VSZXdhcmRUb2tlbkEFAAAAC3N0ckFzc2V0SWRBBAAAAAtzdGFrZUFtb3VudAgFAAAADSR0MDIwOTQ3MjEyNDIAAAACXzEEAAAADXVuc3Rha2VBbW91bnQIBQAAAA0kdDAyMDk0NzIxMjQyAAAAAl8yBAAAAAx1bnN0YWtlQXNzZXQIBQAAAA0kdDAyMDk0NzIxMjQyAAAAAl8zBAAAAAZzdGFrZTEDCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAANc3Rha2luZ0Fzc2V0cwUAAAANcG10U3RyQXNzZXRJZAkAA/wAAAAEBQAAAAR0aGlzAgAAAAxzdGFrZVVuc3Rha2UJAARMAAAAAgYJAARMAAAAAgUAAAALc3Rha2VBbW91bnQJAARMAAAAAgUAAAANcG10U3RyQXNzZXRJZAUAAAADbmlsBQAAAANuaWwAAAAAAAAAAAADCQAAAAAAAAIFAAAABnN0YWtlMQUAAAAGc3Rha2UxBAAAAAZzdGFrZTIDCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAANc3Rha2luZ0Fzc2V0cwUAAAAMdW5zdGFrZUFzc2V0CQAD/AAAAAQFAAAABHRoaXMCAAAADHN0YWtlVW5zdGFrZQkABEwAAAACBwkABEwAAAACBQAAAA11bnN0YWtlQW1vdW50CQAETAAAAAIFAAAADHVuc3Rha2VBc3NldAUAAAADbmlsBQAAAANuaWwAAAAAAAAAAAADCQAAAAAAAAIFAAAABnN0YWtlMgUAAAAGc3Rha2UyCQAETAAAAAIJAQAAAAdSZWlzc3VlAAAAAwUAAAAMc2hhcmVBc3NldElkBQAAAB1zaGFyZVRva2VuVG9QYXlBbW91bnRBZnRlckZlZQYJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAB1zaGFyZVRva2VuVG9QYXlBbW91bnRBZnRlckZlZQUAAAAMc2hhcmVBc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAD21vbmV5Qm94QWRkcmVzcwUAAAAWZ292ZXJuYW5jZVJld2FyZFRva2VuQQUAAAAIYXNzZXRJZEEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAPbW9uZXlCb3hBZGRyZXNzBQAAABZnb3Zlcm5hbmNlUmV3YXJkVG9rZW5CBQAAAAhhc3NldElkQgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VBCQAAZQAAAAIFAAAAC25ld0JhbGFuY2VBBQAAABZnb3Zlcm5hbmNlUmV3YXJkVG9rZW5BCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUIJAABlAAAAAgUAAAALbmV3QmFsYW5jZUIFAAAAFmdvdmVybmFuY2VSZXdhcmRUb2tlbkIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEWtTaGFyZUFzc2V0U3VwcGx5CQAAZAAAAAIFAAAAEHNoYXJlQXNzZXRTdXBwbHkFAAAAHXNoYXJlVG9rZW5Ub1BheUFtb3VudEFm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AAAAEWtTaGFyZUFzc2V0U3VwcGx5CQAAZQAAAAIFAAAAEHNoYXJlQXNzZXRTdXBwbHkFAAAACXBtdEFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAKa0ludmFyaWFudAUAAAATaW52YXJpYW50Q2FsY3VsYXRlZAkABEwAAAACCQEAAAAEQnVybgAAAAIFAAAADHNoYXJlQXNzZXRJZAUAAAAJcG10QW1vdW50CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAMYW1vdW50VG9QYXlBBQAAAAhhc3NldElkQQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADGFtb3VudFRvUGF5QgUAAAAIYXNzZXRJZEIFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAAFHdpdGhkcmF3V2l0aE9uZVRva2VuAAAAAwAAABx2aXJ0RXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlAAAAFXZpcnRNaW5BbW91bnRUb1JlY2l2ZQAAAA13aXRoZHJhd0Fzc2V0CQEAAAALdmFsdWVPckVsc2UAAAACCQEAAAAIaXNBY3RpdmUAAAAABAAAAA0kdDAyNDM0MzI0NDE4CQAFFAAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAAJcG10QW1vdW50CAUAAAANJHQwMjQzNDMyNDQxOAAAAAJfMQQAAAAKcG10QXNzZXRJZAgFAAAADSR0MDI0MzQzMjQ0MTgAAAACXzIDCQEAAAABIQAAAAEJAQAAAA9jb250YWluc0VsZW1lbnQAAAACCQAETAAAAAIFAAAAC3N0ckFzc2V0SWRBCQAETAAAAAIFAAAAC3N0ckFzc2V0SWRBBQAAAANuaWwFAAAADXdpdGhkcmF3QXNzZXQJAAACAAAAAQIAAAAZSW5jb3JyZWN0IHdpdGhkcmF3IGFzc2V0LgMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEJAQAAAA90aHJvd09uZVBheW1lbnQAAAAAAwkBAAAAAiE9AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAMc2hhcmVBc3NldElkCQAAAgAAAAEJAAEsAAAAAgIAAAAkSW5jb3JyZWN0IGFzc2V0IGF0dGFjaGVkLiBFeHBlY3RlZDogCQACWAAAAAEFAAAADHNoYXJlQXNzZXRJZAMJAQAAAAEhAAAAAQUAAAAQaGFzRW5vdWdoQmFsYW5jZQkABE4AAAACCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAJcG10QW1vdW50BQAAAApwbXRBc3NldElkBQAAAANuaWwJAQAAABFzdXNwZW5kU3VzcGljaW91cwAAAAAEAAAADGFtb3VudFRvUGF5QQkAAGsAAAADBQAAAAlwbXRBbW91bnQFAAAACGJhbGFuY2VBBQAAABBzaGFyZUFzc2V0U3VwcGx5BAAAAAxhbW91bnRUb1BheUIJAABrAAAAAwUAAAAJcG10QW1vdW50BQAAAAhiYWxhbmNlQgUAAAAQc2hhcmVBc3NldFN1cHBseQQAAAAKdmlydEFtb3VudAMJAAAAAAAAAgUAAAANd2l0aGRyYXdBc3NldAUAAAALc3RyQXNzZXRJZEEJAQAAABNjYWxjdWxhdGVTZW5kQW1vdW50AAAABAUAAAAcdmlydEVzdGltYXRlZEFtb3VudFRvUmVjZWl2ZQUAAAAVdmlydE1pbkFtb3VudFRvUmVjaXZlBQAAAAxhbW91bnRUb1BheUEFAAAACGFzc2V0SWRBCQEAAAATY2FsY3VsYXRlU2VuZEFtb3VudAAAAAQFAAAAHHZpcnRFc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUFAAAAFXZpcnRNaW5BbW91bnRUb1JlY2l2ZQUAAAAMYW1vdW50VG9QYXlCBQAAAAhhc3NldElkQgQAAAALZmVlRGlzY291bnQJAQAAABRjYWxjdWxhdGVGZWVEaXNjb3VudAAAAAEIBQAAAAFpAAAADG9yaWdpbkNhbGxlcgQAAAAQZ292ZXJuYW5jZVJld2FyZAkAAGsAAAADBQAAAAp2aXJ0QW1vdW50CQEAAAAIZnJhY3Rpb24AAAAEBQAAAA1mZWVHb3Zlcm5hbmNlBQAAAAtmZWVEaXNjb3VudAUAAAAJZmVlU2NhbGU2BQAAAAdDRUlMSU5HBQAAAAlmZWVTY2FsZTYEAAAAEnZpcnRBbW91bnRNaW51c0ZlZQkAAGsAAAADBQAAAAp2aXJ0QW1vdW50CQAAZQAAAAIFAAAACWZlZVNjYWxlNgkBAAAACGZyYWN0aW9uAAAABAUAAAADZmVlBQAAAAtmZWVEaXNjb3VudAUAAAAJZmVlU2NhbGU2BQAAAAdDRUlMSU5HBQAAAAlmZWVTY2FsZTYEAAAADSR0MDI1NzMzMjY2NTEDCQAAAAAAAAIFAAAADXdpdGhkcmF3QXNzZXQFAAAAC3N0ckFzc2V0SWRBBAAAAAZzdGFrZTEDCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAANc3Rha2luZ0Fzc2V0cwUAAAALc3RyQXNzZXRJZEEJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VVbnN0YWtlCQAETAAAAAIHCQAETAAAAAIJAABkAAAAAgkAAGQAAAACBQAAAAxhbW91bnRUb1BheUEFAAAAEnZpcnRBbW91bnRNaW51c0ZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAkABEwAAAACBQAAAAtzdHJBc3NldElkQQUAAAADbmlsBQAAAANuaWwAAAAAAAAAAAADCQAAAAAAAAIFAAAABnN0YWtlMQUAAAAGc3Rha2UxCQAFFQAAAAMJAABlAAAAAgkAAGUAAAACCQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAAAxhbW91bnRUb1BheUEFAAAAEnZpcnRBbW91bnRNaW51c0ZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAUAAAAIYmFsYW5jZUIJAABkAAAAAgUAAAASdmlydEFtb3VudE1pbnVzRmVlBQAAAAxhbW91bnRUb1BheUEJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAAAAAZzdGFrZTIDCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAANc3Rha2luZ0Fzc2V0cwUAAAALc3RyQXNzZXRJZEIJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VVbnN0YWtlCQAETAAAAAIHCQAETAAAAAIJAABkAAAAAgkAAGQAAAACBQAAAAxhbW91bnRUb1BheUIFAAAAEnZpcnRBbW91bnRNaW51c0ZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAkABEwAAAACBQAAAAtzdHJBc3NldElkQgUAAAADbmlsBQAAAANuaWwAAAAAAAAAAAADCQAAAAAAAAIFAAAABnN0YWtlMgUAAAAGc3Rha2UyCQAFFQAAAAMFAAAACGJhbGFuY2VBCQAAZQAAAAIJAABlAAAAAgkAAGUAAAACBQAAAAhiYWxhbmNlQgUAAAAMYW1vdW50VG9QYXlCBQAAABJ2aXJ0QW1vdW50TWludXNGZWUFAAAAEGdvdmVybmFuY2VSZXdhcmQJAABkAAAAAgUAAAASdmlydEFtb3VudE1pbnVzRmVlBQAAAAxhbW91bnRUb1BheUIJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAAAAAtuZXdCYWxhbmNlQQgFAAAADSR0MDI1NzMzMjY2NTEAAAACXzEEAAAAC25ld0JhbGFuY2VCCAUAAAANJHQwMjU3MzMyNjY1MQAAAAJfMgQAAAALYW1vdW50VG9QYXkIBQAAAA0kdDAyNTczMzI2NjUxAAAAAl8zBAAAABNpbnZhcmlhbnRDYWxjdWxhdGVkCQEAAAANaW52YXJpYW50Q2FsYwAAAAIFAAAAC25ld0JhbGFuY2VBCQAAZQAAAAIFAAAACGJhbGFuY2VCBQAAAAtuZXdCYWxhbmNlQgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VCBQAAAAtuZXdCYWxhbmNlQgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAARa1NoYXJlQXNzZXRTdXBwbHkJAABlAAAAAgUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAJcG10QW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAprSW52YXJpYW50BQAAABNpbnZhcmlhbnRDYWxjdWxhdGVkCQAETAAAAAIJAQAAAARCdXJuAAAAAgUAAAAMc2hhcmVBc3NldElkBQAAAAlwbXRBbW91bnQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAthbW91bnRUb1BheQkAAlkAAAABBQAAAA13aXRoZHJhd0Fzc2V0CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAD21vbmV5Qm94QWRkcmVzcwUAAAAQZ292ZXJuYW5jZVJld2FyZAkAAlkAAAABBQAAAA13aXRoZHJhd0Fzc2V0BQAAAANuaWwAAAABaQEAAAAIZXhjaGFuZ2UAAAACAAAAGGVzdGltYXRlZEFtb3VudFRvUmVjZWl2ZQAAABJtaW5BbW91bnRUb1JlY2VpdmUJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAQAAAAhpc0FjdGl2ZQAAAAAEAAAADSR0MDI3Mzc3Mjc0NTIJAAUUAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAAlwbXRBbW91bnQIBQAAAA0kdDAyNzM3NzI3NDUyAAAAAl8xBAAAAApwbXRBc3NldElkCAUAAAANJHQwMjczNzcyNzQ1MgAAAAJfMgMJAABnAAAAAgAAAAAAAAAAAAUAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlCQAAAgAAAAEJAAEsAAAAAgIAAAArRXN0aW1hdGVkIGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlLiBBY3R1YWw6IAkAAaQAAAABBQAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUDCQAAZgAAAAIFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQUAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlCQAAAgAAAAECAAAAL01pbmltYWwgYW1vdW50IGNhbid0IGJlIGdyZWF0ZXIgdGhhbiBlc3RpbWF0ZWQuAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkBAAAAD3Rocm93T25lUGF5bWVudAAAAAADCQEAAAABIQAAAAEFAAAAEGhhc0Vub3VnaEJhbGFuY2UJAAROAAAAAgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAACXBtdEFtb3VudAUAAAAKcG10QXNzZXRJZAUAAAADbmlsCQEAAAARc3VzcGVuZFN1c3BpY2lvdXMAAAAAAwMJAQAAAAIhPQAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRBCQEAAAACIT0AAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQgcJAQAAAAt0aHJvd0Fzc2V0cwAAAAADCQAAZgAAAAIAAAAAAACYloAFAAAACXBtdEFtb3VudAkAAAIAAAABAgAAADBPbmx5IHN3YXAgb2YgMTAuMDAwMDAwIG9yIG1vcmUgdG9rZW5zIGlzIGFsbG93ZWQDAwkAAGYAAAACBQAAABVleGNoYW5nZVJhdGlvTGltaXRNaW4JAABrAAAAAwUAAAAGc2NhbGU4BQAAABJtaW5BbW91bnRUb1JlY2VpdmUFAAAACXBtdEFtb3VudAYJAABmAAAAAgkAAGsAAAADBQAAAAZzY2FsZTgFAAAAGGVzdGltYXRlZEFtb3VudFRvUmVjZWl2ZQUAAAAJcG10QW1vdW50BQAAABVleGNoYW5nZVJhdGlvTGltaXRNYXgJAAACAAAAAQIAAAAcSW5jb3JyZWN0IGFyZ3MgYW5kIHBtdCByYXRpbwQAAAALc2VuZEFzc2V0SWQDCQAAAAAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRBBQAAAAhhc3NldElkQgUAAAAIYXNzZXRJZEEEAAAABmFtb3VudAkBAAAAE2NhbGN1bGF0ZVNlbmRBbW91bnQAAAAEBQAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQUAAAAJcG10QW1vdW50BQAAAApwbXRBc3NldElkBAAAAAtmZWVEaXNjb3VudAkBAAAAFGNhbGN1bGF0ZUZlZURpc2NvdW50AAAAAQgFAAAAAWkAAAAMb3JpZ2luQ2FsbGVyBAAAABBnb3Zlcm5hbmNlUmV3YXJkCQAAawAAAAMFAAAABmFtb3VudAkBAAAACGZyYWN0aW9uAAAABAUAAAANZmVlR292ZXJuYW5jZQUAAAALZmVlRGlzY291bnQFAAAACWZlZVNjYWxlNgUAAAAHQ0VJTElORwUAAAAJZmVlU2NhbGU2BAAAAA5hbW91bnRNaW51c0ZlZQkAAGsAAAADBQAAAAZhbW91bnQJAABlAAAAAgUAAAAJZmVlU2NhbGU2CQEAAAAIZnJhY3Rpb24AAAAEBQAAAANmZWUFAAAAC2ZlZURpc2NvdW50BQAAAAlmZWVTY2FsZTYFAAAAB0NFSUxJTkcFAAAACWZlZVNjYWxlNgQAAAANJHQwMjg5MDUyOTE2NwMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEJAAUUAAAAAgkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAAJcG10QW1vdW50CQAAZQAAAAIJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAADmFtb3VudE1pbnVzRmVlBQAAABBnb3Zlcm5hbmNlUmV3YXJkCQAFFAAAAAIJAABlAAAAAgkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAAOYW1vdW50TWludXNGZWUFAAAAEGdvdmVybmFuY2VSZXdhcmQJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAACXBtdEFtb3VudAQAAAALbmV3QmFsYW5jZUEIBQAAAA0kdDAyODkwNTI5MTY3AAAAAl8xBAAAAAtuZXdCYWxhbmNlQggFAAAADSR0MDI4OTA1MjkxNjcAAAACXzIEAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQJAABrAAAAAwkAAGQAAAACBQAAAAtuZXdCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUIFAAAADWRBcHBUaHJlc2hvbGQJAABoAAAAAgAAAAAAAAAAAgUAAAATZEFwcFRocmVzaG9sZFNjYWxlMgMDCQAAZgAAAAIFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAC25ld0JhbGFuY2VBBgkAAGYAAAACBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAAtuZXdCYWxhbmNlQgkBAAAADnRocm93VGhyZXNob2xkAAAAAwUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAALbmV3QmFsYW5jZUEFAAAAC25ld0JhbGFuY2VCBAAAAA0kdDAyOTQ2NjI5NTM5CQEAAAAMZ2V0QXNzZXRJbmZvAAAAAQUAAAAKcG10QXNzZXRJZAQAAAANcG10U3RyQXNzZXRJZAgFAAAADSR0MDI5NDY2Mjk1MzkAAAACXzEEAAAADHBtdEFzc2V0TmFtZQgFAAAADSR0MDI5NDY2Mjk1MzkAAAACXzIEAAAAC3BtdERlY2ltYWxzCAUAAAANJHQwMjk0NjYyOTUzOQAAAAJfMwQAAAANJHQwMjk1NTIyOTYyOQkBAAAADGdldEFzc2V0SW5mbwAAAAEFAAAAC3NlbmRBc3NldElkBAAAAA5zZW5kU3RyQXNzZXRJZAgFAAAADSR0MDI5NTUyMjk2MjkAAAACXzEEAAAADXNlbmRBc3NldE5hbWUIBQAAAA0kdDAyOTU1MjI5NjI5AAAAAl8yBAAAAAxzZW5kRGVjaW1hbHMIBQAAAA0kdDAyOTU1MjI5NjI5AAAAAl8zBAAAAAZzdGFrZTEDCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAANc3Rha2luZ0Fzc2V0cwUAAAANcG10U3RyQXNzZXRJZAkAA/wAAAAEBQAAAAR0aGlzAgAAAAxzdGFrZVVuc3Rha2UJAARMAAAAAgYJAARMAAAAAgUAAAAJcG10QW1vdW50CQAETAAAAAIFAAAADXBtdFN0ckFzc2V0SWQFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAAAwkAAAAAAAACBQAAAAZzdGFrZTEFAAAABnN0YWtlMQQAAAAGc3Rha2UyAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAADXN0YWtpbmdBc3NldHMFAAAADnNlbmRTdHJBc3NldElkCQAD/AAAAAQFAAAABHRoaXMCAAAADHN0YWtlVW5zdGFrZQkABEwAAAACBwkABEwAAAACCQAAZAAAAAIFAAAADmFtb3VudE1pbnVzRmVlBQAAABBnb3Zlcm5hbmNlUmV3YXJkCQAETAAAAAIFAAAADnNlbmRTdHJBc3NldElkBQAAAANuaWwFAAAAA25pbAAAAAAAAAAAAAMJAAAAAAAAAgUAAAAGc3Rha2UyBQAAAAZzdGFrZTIJAAUUAAAAAgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VCBQAAAAtuZXdCYWxhbmNlQgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAKa0ludmFyaWFudAkBAAAADWludmFyaWFudENhbGMAAAACBQAAAAtuZXdCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAA5hbW91bnRNaW51c0ZlZQUAAAALc2VuZEFzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAPbW9uZXlCb3hBZGRyZXNzBQAAABBnb3Zlcm5hbmNlUmV3YXJkBQAAAAtzZW5kQXNzZXRJZAUAAAADbmlsCQAFFAAAAAIFAAAADmFtb3VudE1pbnVzRmVlBQAAAAtzZW5kQXNzZXRJZAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAACHNodXRkb3duAAAAAAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAAC2lzQWRtaW5DYWxsAAAAAQUAAAABaQMJAQAAAAEhAAAAAQUAAAAGYWN0aXZlCQAAAgAAAAEJAAEsAAAAAgIAAAAiREFwcCBpcyBhbHJlYWR5IHN1c3BlbmRlZC4gQ2F1c2U6IAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAAZrQ2F1c2UCAAAAGnRoZSBjYXVzZSB3YXNuJ3Qgc3BlY2lmaWVkCQEAAAAHc3VzcGVuZAAAAAECAAAAD1BhdXNlZCBieSBhZG1pbgAAAAFpAQAAAAhhY3RpdmF0ZQAAAAAJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAQAAAAtpc0FkbWluQ2FsbAAAAAEFAAAAAWkDBQAAAAZhY3RpdmUJAQAAAA10aHJvd0lzQWN0aXZlAAAAAAkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAHa0FjdGl2ZQYJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQUAAAAGa0NhdXNlBQAAAANuaWwAAAABaQEAAAAZdGFrZUludG9BY2NvdW50RXh0cmFGdW5kcwAAAAAJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAQAAAAhpc0FjdGl2ZQAAAAAEAAAADWFtb3VudEVucm9sbEEJAABlAAAAAgUAAAAZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQQUAAAAIYmFsYW5jZUEEAAAADWFtb3VudEVucm9sbEIJAABlAAAAAgUAAAAZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQgUAAAAIYmFsYW5jZUIEAAAADGludmFyaWFudE5ldwkBAAAADWludmFyaWFudENhbGMAAAACCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAA1hbW91bnRFbnJvbGxBCQAAZAAAAAIFAAAACGJhbGFuY2VCBQAAAA1hbW91bnRFbnJvbGxCAwkBAAAAAiE9AAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAA9tb25leUJveEFkZHJlc3MJAAACAAAAAQIAAAApT25seSB0aGUgbW9uZXkgYm94IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24DAwkAAGYAAAACAAAAAAAAAAAABQAAAA1hbW91bnRFbnJvbGxBBgkAAGYAAAACAAAAAAAAAAAABQAAAA1hbW91bnRFbnJvbGxCCQEAAAAHc3VzcGVuZAAAAAECAAAAFkVucm9sbCBhbW91bnQgbmVnYXRpdmUDAwkAAAAAAAACBQAAAA1hbW91bnRFbnJvbGxBAAAAAAAAAAAACQAAAAAAAAIFAAAADWFtb3VudEVucm9sbEIAAAAAAAAAAAAHCQAAAgAAAAECAAAAEE5vIG1vbmV5IHRvIHRha2UEAAAABnN0YWtlMQMDCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAANc3Rha2luZ0Fzc2V0cwUAAAALc3RyQXNzZXRJZEEJAABmAAAAAgUAAAANYW1vdW50RW5yb2xsQQAAAAAAAAAAAAcJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VV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", "height": 2127503, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 5 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let version = "2.0.0"
5+
6+let kVersion = "version"
7+
8+let kActive = "active"
9+
10+let kAssetIdA = "A_asset_id"
11+
12+let kAssetIdB = "B_asset_id"
13+
14+let kBalanceA = "A_asset_balance"
15+
16+let kBalanceB = "B_asset_balance"
17+
18+let kShareAssetId = "share_asset_id"
19+
20+let kShareAssetSupply = "share_asset_supply"
21+
22+let kFee = "commission"
23+
24+let kInvariant = "invariant"
25+
26+let kCause = "shutdown_cause"
27+
28+let kUSDNAddress = "staking_usdnnsbt_address"
29+
30+let kEURNAddress = "staking_eurn_address"
31+
32+let kDiscounts = "discounts"
33+
34+let kDiscountValues = "discount_values"
35+
36+let kUserSwopInGov = "_SWOP_amount"
37+
38+let kFirstHarvest = "first_harvest"
39+
40+let kFirstHarvestHeight = "first_harvest_height"
41+
42+let kShareLimit = "share_limit_on_first_harvest"
43+
44+let kBasePeriod = "base_period"
45+
46+let kPeriodLength = "period_length"
47+
48+let kStartHeight = "start_height"
49+
50+let kAdminPubKey1 = "admin_pub_1"
51+
52+let kAdminPubKey2 = "admin_pub_2"
53+
54+let kAdminPubKey3 = "admin_pub_3"
55+
56+let kAdminInvokePubKey = "admin_invoke_pub"
57+
58+let kMoneyBoxAddress = "money_box_address"
59+
60+let kGovAddress = "governance_address"
61+
62+let kVotingAddress = "voting_address"
63+
64+let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
65+
66+func getBase58FromOracle (key) = match getString(oracle, key) {
67+ case string: String =>
68+ fromBase58String(string)
69+ case nothing =>
70+ throw((key + "is empty"))
71+}
72+
73+
74+let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
75+
76+let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
77+
78+let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
79+
80+let adminPubKeyInvoke = getBase58FromOracle(kAdminInvokePubKey)
81+
82+let moneyBoxAddress = Address(getBase58FromOracle(kMoneyBoxAddress))
83+
84+let govAddress = Address(getBase58FromOracle(kGovAddress))
85+
86+let stakingUSDNAddress = Address(getBase58FromOracle(kUSDNAddress))
87+
88+let votingAddress = Address(getBase58FromOracle(kVotingAddress))
89+
90+let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
91+
92+let stakingAssets = [toBase58String(USDN)]
93+
94+let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
95+
96+let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
97+
98+let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
99+
100+let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
101+
102+let active = getBooleanValue(this, kActive)
103+
104+let strAssetIdA = getStringValue(this, kAssetIdA)
105+
106+let strAssetIdB = getStringValue(this, kAssetIdB)
107+
108+let assetIdA = if ((strAssetIdA == "WAVES"))
109+ then unit
110+ else fromBase58String(strAssetIdA)
111+
112+let assetIdB = if ((strAssetIdB == "WAVES"))
113+ then unit
114+ else fromBase58String(strAssetIdB)
115+
116+let assetNameA = match assetIdA {
117+ case id: ByteVector =>
118+ value(assetInfo(id)).name
119+ case waves: Unit =>
120+ "WAVES"
121+ case _ =>
122+ throw("Match error")
123+}
124+
125+let assetNameB = match assetIdB {
126+ case id: ByteVector =>
127+ value(assetInfo(id)).name
128+ case waves: Unit =>
129+ "WAVES"
130+ case _ =>
131+ throw("Match error")
132+}
133+
134+let balanceA = getIntegerValue(this, kBalanceA)
135+
136+let balanceB = getIntegerValue(this, kBalanceB)
137+
138+let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
139+
140+let shareAssetSupply = getIntegerValue(this, kShareAssetSupply)
141+
142+let invariant = getIntegerValue(this, kInvariant)
143+
144+let fee = getIntegerValue(this, kFee)
145+
146+let feeGovernance = fraction(fee, 40, 100)
147+
148+let feeScale6 = 1000000
149+
150+let scale3 = 1000
151+
152+let scale8 = 100000000
153+
154+let scale16 = 10000000000000000
155+
156+let slippageScale3 = 1000
157+
158+let digits8 = 8
159+
160+let dAppThreshold = 50
161+
162+let dAppThresholdScale2 = 100
163+
164+let exchangeRatioLimitMin = 90000000
165+
166+let exchangeRatioLimitMax = 110000000
167+
168+let alpha = 50
169+
170+let alphaDigits = 2
171+
172+let beta = 4600000000000000
173+
174+func accountBalance (assetId) = match assetId {
175+ case id: ByteVector =>
176+ assetBalance(this, id)
177+ case waves: Unit =>
178+ wavesBalance(this).available
179+ case _ =>
180+ throw("Match error")
181+}
182+
183+
184+func stakedAmount (assetId) = {
185+ let stakedAmountCalculated = match assetId {
186+ case aId: ByteVector =>
187+ if ((aId == USDN))
188+ then getInteger(stakingUSDNAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
189+ else 0
190+ case _: Unit =>
191+ 0
192+ case _ =>
193+ throw("Match error")
194+ }
195+ match stakedAmountCalculated {
196+ case i: Int =>
197+ i
198+ case _ =>
199+ 0
200+ }
201+ }
202+
203+
204+let stakedAmountA = stakedAmount(assetIdA)
205+
206+let stakedAmountB = stakedAmount(assetIdB)
207+
208+let availableBalanceA = (balanceA - stakedAmountA)
209+
210+let availableBalanceB = (balanceB - stakedAmountB)
211+
212+let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
213+
214+let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
215+
216+let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
217+ then (accountBalanceWithStakedB >= balanceB)
218+ else false
219+
220+func skewness (x,y) = ((fraction(scale16, x, y) + fraction(scale16, y, x)) / 2)
221+
222+
223+func invariantCalc (x,y) = {
224+ let sk = skewness(x, y)
225+ (fraction((x + y), scale16, pow(sk, digits8, alpha, alphaDigits, digits8, CEILING)) + (2 * fraction(toInt(pow(fraction(toBigInt(x), toBigInt(y), toBigInt(scale8)), 0, toBigInt(5), 1, (digits8 / 2), DOWN)), pow((sk - beta), digits8, alpha, alphaDigits, digits8, DOWN), scale8)))
226+ }
227+
228+
229+func calculateSendAmount (amountToSendEstimated,minTokenReceiveAmount,tokenReceiveAmount,tokenId) = {
230+ let worstAllowedNewInvariantRatio = (scale16 - ((scale16 * 1) / 10000000))
231+ let deltaBetweenMaxAndMinSendValue = (amountToSendEstimated - minTokenReceiveAmount)
232+ let x = (balanceA + tokenReceiveAmount)
233+ let y = (balanceB + tokenReceiveAmount)
234+ func getStepAmount (acc,step) = if ((acc._1 == -1))
235+ then {
236+ let amountToSend = (amountToSendEstimated - (((step * deltaBetweenMaxAndMinSendValue) / 3) / scale3))
237+ let stepInvariant = if ((tokenId == assetIdA))
238+ then invariantCalc(x, (balanceB - amountToSend))
239+ else invariantCalc((balanceA - amountToSend), y)
240+ if ((stepInvariant > invariant))
241+ then $Tuple2(amountToSend, stepInvariant)
242+ else $Tuple2(-1, 0)
243+ }
244+ else acc
245+
246+ let amountToSendMin = getStepAmount($Tuple2(-1, 0), 3000)
247+ if ((0 > amountToSendMin._1))
248+ then throw("Price is worse than minReceived")
249+ else {
250+ let invEstimated = if ((tokenId == assetIdA))
251+ then invariantCalc(x, (balanceB - amountToSendEstimated))
252+ else if ((tokenId == assetIdB))
253+ then invariantCalc((balanceA - amountToSendEstimated), y)
254+ else throw("Wrong asset in payment")
255+ if ((invariant > invEstimated))
256+ then if ((worstAllowedNewInvariantRatio >= fraction(scale16, invariant, invEstimated)))
257+ then throw("The requested price is too not profitable for user")
258+ else {
259+ let a = {
260+ let $l = [25, 200, 500]
261+ let $s = size($l)
262+ let $acc0 = $Tuple2(-1, 0)
263+ func $f0_1 ($a,$i) = if (($i >= $s))
264+ then $a
265+ else getStepAmount($a, $l[$i])
266+
267+ func $f0_2 ($a,$i) = if (($i >= $s))
268+ then $a
269+ else throw("List size exceeds 3")
270+
271+ $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
272+ }
273+ if ((0 > a._1))
274+ then amountToSendMin._1
275+ else a._1
276+ }
277+ else {
278+ let a = {
279+ let $l = [-500, -200, -25]
280+ let $s = size($l)
281+ let $acc0 = $Tuple2(-1, 0)
282+ func $f0_1 ($a,$i) = if (($i >= $s))
283+ then $a
284+ else getStepAmount($a, $l[$i])
285+
286+ func $f0_2 ($a,$i) = if (($i >= $s))
287+ then $a
288+ else throw("List size exceeds 3")
289+
290+ $f0_2($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3)
291+ }
292+ let tupleSendBetter = if ((0 > a._1))
293+ then $Tuple2(amountToSendEstimated, invEstimated)
294+ else a
295+ if ((worstAllowedNewInvariantRatio >= fraction(scale16, invariant, tupleSendBetter._2)))
296+ then throw("The requested price is too not profitable for user")
297+ else tupleSendBetter._1
298+ }
299+ }
300+ }
301+
302+
303+func getAssetInfo (assetId) = match assetId {
304+ case id: ByteVector =>
305+ let stringId = toBase58String(id)
306+ let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
307+ $Tuple3(stringId, info.name, info.decimals)
308+ case waves: Unit =>
309+ $Tuple3("WAVES", "WAVES", 8)
310+ case _ =>
311+ throw("Match error")
312+}
313+
314+
315+func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
316+
317+
318+func throwIsActive () = throw("DApp is already active")
319+
320+
321+func isActive () = if (active)
322+ then unit
323+ else throw("DApp is inactive at this moment")
324+
325+
326+func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
327+ then unit
328+ else throw("Only admin can call this function")
329+
330+
331+func throwAssets () = throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
332+
333+
334+func throwOnePayment () = throw("One attached payment expected")
335+
336+
337+func throwThreshold (threshold,amountA,amountB) = throw(((((((((("New balance in assets of the DApp is less than threshold " + toString(threshold)) + ": ") + toString(amountA)) + " ") + assetNameA) + ", ") + toString(amountB)) + " ") + assetNameB))
338+
339+
340+func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
341+
342+
343+func calcStakingFuncAndAddres (stake,assetId) = if (stake)
344+ then $Tuple2("lockNeutrino", stakingUSDNAddress)
345+ else $Tuple2("unlockNeutrino", stakingUSDNAddress)
346+
347+
348+func calcStakingParams (stake,amount,assetId) = if (stake)
349+ then {
350+ let $t01006410130 = calcStakingFuncAndAddres(stake, assetId)
351+ let call = $t01006410130._1
352+ let stakingAddr = $t01006410130._2
353+ $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
354+ }
355+ else {
356+ let $t01021610282 = calcStakingFuncAndAddres(stake, assetId)
357+ let call = $t01021610282._1
358+ let stakingAddr = $t01021610282._2
359+ $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
360+ }
361+
362+
363+func calculateFeeDiscount (userAddr) = {
364+ let swopAmount = valueOrElse(getInteger(govAddress, (toString(userAddr) + kUserSwopInGov)), 0)
365+ let discountValues = split(getStringValue(oracle, kDiscountValues), ",")
366+ let discounts = split(getStringValue(oracle, kDiscounts), ",")
367+ if (if ((swopAmount >= parseIntValue(discountValues[0])))
368+ then (parseIntValue(discountValues[1]) > swopAmount)
369+ else false)
370+ then (feeScale6 - parseIntValue(discounts[0]))
371+ else if (if ((swopAmount >= parseIntValue(discountValues[1])))
372+ then (parseIntValue(discountValues[2]) > swopAmount)
373+ else false)
374+ then (feeScale6 - parseIntValue(discounts[1]))
375+ else if (if ((swopAmount >= parseIntValue(discountValues[2])))
376+ then (parseIntValue(discountValues[3]) > swopAmount)
377+ else false)
378+ then (feeScale6 - parseIntValue(discounts[2]))
379+ else if (if ((swopAmount >= parseIntValue(discountValues[3])))
380+ then (parseIntValue(discountValues[4]) > swopAmount)
381+ else false)
382+ then (feeScale6 - parseIntValue(discounts[3]))
383+ else if ((swopAmount >= parseIntValue(discountValues[4])))
384+ then (feeScale6 - parseIntValue(discounts[4]))
385+ else feeScale6
386+ }
387+
388+
389+@Callable(i)
390+func init (firstHarvest) = {
391+ let $t01147511552 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
392+ let pmtAmountA = $t01147511552._1
393+ let pmtAssetIdA = $t01147511552._2
394+ let $t01155711634 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
395+ let pmtAmountB = $t01155711634._1
396+ let pmtAssetIdB = $t01155711634._2
397+ let $t01163911716 = getAssetInfo(pmtAssetIdA)
398+ let pmtStrAssetIdA = $t01163911716._1
399+ let pmtAssetNameA = $t01163911716._2
400+ let pmtDecimalsA = $t01163911716._3
401+ let $t01172111798 = getAssetInfo(pmtAssetIdB)
402+ let pmtStrAssetIdB = $t01172111798._1
403+ let pmtAssetNameB = $t01172111798._2
404+ let pmtDecimalsB = $t01172111798._3
405+ if (isDefined(getBoolean(this, kActive)))
406+ then throwIsActive()
407+ else if ((pmtAssetIdA == pmtAssetIdB))
408+ then throw("Assets must be different")
409+ else {
410+ let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
411+ let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
412+ let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
413+ let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
414+ let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
415+ let shareIssueId = calculateAssetId(shareIssue)
416+ let invariantCalculated = invariantCalc(pmtAmountA, pmtAmountB)
417+ let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
418+ then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
419+ else 0
420+ if ((stake1 == stake1))
421+ then {
422+ let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
423+ then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
424+ else 0
425+ if ((stake2 == stake2))
426+ then {
427+ let baseEntry = [StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceA, pmtAmountA), IntegerEntry(kBalanceB, pmtAmountB), IntegerEntry(kInvariant, invariantCalculated), IntegerEntry(kFee, getIntegerValue(oracle, "base_fee_flat")), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
428+ if (firstHarvest)
429+ then (baseEntry ++ [BooleanEntry(kFirstHarvest, firstHarvest), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))])
430+ else baseEntry
431+ }
432+ else throw("Strict value is not equal to itself.")
433+ }
434+ else throw("Strict value is not equal to itself.")
435+ }
436+ }
437+
438+
439+
440+@Callable(i)
441+func replenishWithTwoTokens () = valueOrElse(isActive(), {
442+ let pmtAssetIdA = i.payments[0].assetId
443+ let pmtAssetIdB = i.payments[1].assetId
444+ let ratioShareTokensInA = fraction(scale8, i.payments[0].amount, balanceA)
445+ let ratioShareTokensInB = fraction(scale8, i.payments[1].amount, balanceB)
446+ let $t01474614823 = getAssetInfo(pmtAssetIdA)
447+ let pmtStrAssetIdA = $t01474614823._1
448+ let pmtAssetNameA = $t01474614823._2
449+ let pmtDecimalsA = $t01474614823._3
450+ let $t01482814945 = getAssetInfo(pmtAssetIdB)
451+ let pmtStrAssetIdB = $t01482814945._1
452+ let pmtAssetNameB = $t01482814945._2
453+ let pmtDecimalsB = $t01482814945._3
454+ let $t01495015454 = if ((ratioShareTokensInB > ratioShareTokensInA))
455+ then {
456+ let pmt = fraction(balanceB, ratioShareTokensInA, scale8, CEILING)
457+ $Tuple5(i.payments[0].amount, pmt, (i.payments[1].amount - pmt), pmtAssetIdB, ratioShareTokensInA)
458+ }
459+ else {
460+ let pmt = fraction(balanceA, ratioShareTokensInB, scale8, CEILING)
461+ $Tuple5(pmt, i.payments[1].amount, (i.payments[0].amount - pmt), pmtAssetIdA, ratioShareTokensInB)
462+ }
463+ let pmtAmountA = $t01495015454._1
464+ let pmtAmountB = $t01495015454._2
465+ let change = $t01495015454._3
466+ let changeAssetId = $t01495015454._4
467+ let shareTokenRatio = $t01495015454._5
468+ let shareTokenToPayAmount = fraction(shareTokenRatio, shareAssetSupply, scale8)
469+ if ((size(i.payments) != 2))
470+ then throw("Two attached assets expected")
471+ else if (if ((pmtAssetIdA != assetIdA))
472+ then true
473+ else (pmtAssetIdB != assetIdB))
474+ then throwAssets()
475+ else if ((shareTokenToPayAmount == 0))
476+ then throw("Too small amount to replenish")
477+ else if ((0 > change))
478+ then throw("Change < 0")
479+ else if (!(hasEnoughBalance))
480+ then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
481+ else {
482+ let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
483+ then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
484+ else 0
485+ if ((stake1 == stake1))
486+ then {
487+ let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
488+ then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
489+ else 0
490+ if ((stake2 == stake2))
491+ then [IntegerEntry(kBalanceA, (balanceA + pmtAmountA)), IntegerEntry(kBalanceB, (balanceB + pmtAmountB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), IntegerEntry(kInvariant, invariantCalc((balanceA + pmtAmountA), (balanceB + pmtAmountB))), Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), ScriptTransfer(i.caller, change, changeAssetId)]
492+ else throw("Strict value is not equal to itself.")
493+ }
494+ else throw("Strict value is not equal to itself.")
495+ }
496+ })
497+
498+
499+
500+@Callable(i)
501+func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = valueOrElse(isActive(), {
502+ let $t01718717262 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
503+ let pmtAmount = $t01718717262._1
504+ let pmtAssetId = $t01718717262._2
505+ let $t01726717340 = getAssetInfo(pmtAssetId)
506+ let pmtStrAssetId = $t01726717340._1
507+ let pmtAssetName = $t01726717340._2
508+ let pmtDecimals = $t01726717340._3
509+ let pmtMinThreshold = 5000000
510+ let thresholdValueForMinTolerance = 50000000
511+ let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
512+ then 100000
513+ else 1
514+ let slippageValueMinForReplenish = (scale8 - ((scale8 * tolerance) / 10000000))
515+ let slippageValueMaxForReplenish = (scale8 + ((scale8 * tolerance) / 10000000))
516+ let slippageValueMinForSwap = (scale8 - ((scale8 * 1) / 10000000))
517+ if ((pmtMinThreshold > pmtAmount))
518+ then throw((((("Payment amount " + toString(pmtAmount)) + " does not exceed the minimum amount of ") + toString(pmtMinThreshold)) + " tokens"))
519+ else if ((size(i.payments) != 1))
520+ then throwOnePayment()
521+ else if (!(hasEnoughBalance))
522+ then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
523+ else if (if ((pmtAssetId != assetIdA))
524+ then (pmtAssetId != assetIdB)
525+ else false)
526+ then throwAssets()
527+ else {
528+ let $t01831818960 = if ((pmtAssetId == assetIdA))
529+ then $Tuple6((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), (balanceA + pmtAmount), balanceB)
530+ else $Tuple6(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), balanceA, (balanceB + pmtAmount))
531+ let virtualReplenishA = $t01831818960._1
532+ let virtualReplenishB = $t01831818960._2
533+ let balanceAfterSwapA = $t01831818960._3
534+ let balanceAfterSwapB = $t01831818960._4
535+ let newBalanceA = $t01831818960._5
536+ let newBalanceB = $t01831818960._6
537+ let invariantNew = invariantCalc(balanceAfterSwapA, balanceAfterSwapB)
538+ let ratioVirtualBalanceToVirtualReplenish = (fraction(scale16, balanceAfterSwapA, balanceAfterSwapB) / fraction(scale8, virtualReplenishA, virtualReplenishB))
539+ let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
540+ if (if ((slippageValueMinForSwap >= fraction(scale8, invariant, invariantNew)))
541+ then true
542+ else (invariant > invariantNew))
543+ then throw("Incorrect virtualSwapTokenPay or virtualSwapTokenGet value")
544+ else if (if ((slippageValueMinForReplenish > ratioVirtualBalanceToVirtualReplenish))
545+ then true
546+ else (ratioVirtualBalanceToVirtualReplenish > slippageValueMaxForReplenish))
547+ then throw("Swap with virtualSwapTokenPay and virtualSwapTokenGet is possible, but ratio after virtual swap is incorrect")
548+ else if (if ((dAppThresholdAmount > newBalanceA))
549+ then true
550+ else (dAppThresholdAmount > newBalanceB))
551+ then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
552+ else {
553+ let ratioShareTokensInA = fraction(virtualReplenishA, scale8, balanceAfterSwapA)
554+ let ratioShareTokensInB = fraction(virtualReplenishB, scale8, balanceAfterSwapB)
555+ let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
556+ let shareTokenToPayAmountAfterFee = fraction(shareTokenToPayAmount, (feeScale6 - (fee / 2)), feeScale6)
557+ let shareTokenGovernanceReward = fraction(shareTokenToPayAmount, (feeGovernance / 2), feeScale6)
558+ let governanceRewardTokenA = fraction(shareTokenGovernanceReward, balanceA, shareAssetSupply)
559+ let governanceRewardTokenB = fraction(shareTokenGovernanceReward, balanceB, shareAssetSupply)
560+ let $t02094721242 = if ((pmtStrAssetId == strAssetIdA))
561+ then $Tuple3((pmtAmount - governanceRewardTokenA), governanceRewardTokenB, strAssetIdB)
562+ else $Tuple3((pmtAmount - governanceRewardTokenB), governanceRewardTokenA, strAssetIdA)
563+ let stakeAmount = $t02094721242._1
564+ let unstakeAmount = $t02094721242._2
565+ let unstakeAsset = $t02094721242._3
566+ let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
567+ then invoke(this, "stakeUnstake", [true, stakeAmount, pmtStrAssetId], nil)
568+ else 0
569+ if ((stake1 == stake1))
570+ then {
571+ let stake2 = if (containsElement(stakingAssets, unstakeAsset))
572+ then invoke(this, "stakeUnstake", [false, unstakeAmount, unstakeAsset], nil)
573+ else 0
574+ if ((stake2 == stake2))
575+ then [Reissue(shareAssetId, shareTokenToPayAmountAfterFee, true), ScriptTransfer(i.caller, shareTokenToPayAmountAfterFee, shareAssetId), ScriptTransfer(moneyBoxAddress, governanceRewardTokenA, assetIdA), ScriptTransfer(moneyBoxAddress, governanceRewardTokenB, assetIdB), IntegerEntry(kBalanceA, (newBalanceA - governanceRewardTokenA)), IntegerEntry(kBalanceB, (newBalanceB - governanceRewardTokenB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmountAfterFee)), IntegerEntry(kInvariant, invariantCalc((newBalanceA - governanceRewardTokenA), (newBalanceB - governanceRewardTokenB)))]
576+ else throw("Strict value is not equal to itself.")
577+ }
578+ else throw("Strict value is not equal to itself.")
579+ }
580+ }
581+ })
582+
583+
584+
585+@Callable(i)
586+func withdraw () = valueOrElse(isActive(), {
587+ let $t02253822613 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
588+ let pmtAmount = $t02253822613._1
589+ let pmtAssetId = $t02253822613._2
590+ let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
591+ let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
592+ let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
593+ if ((size(i.payments) != 1))
594+ then throwOnePayment()
595+ else if ((pmtAssetId != shareAssetId))
596+ then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
597+ else if (!(hasEnoughBalance))
598+ then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
599+ else {
600+ let stake1 = if (containsElement(stakingAssets, strAssetIdA))
601+ then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
602+ else 0
603+ if ((stake1 == stake1))
604+ then {
605+ let stake2 = if (containsElement(stakingAssets, strAssetIdB))
606+ then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
607+ else 0
608+ if ((stake2 == stake2))
609+ then [IntegerEntry(kBalanceA, (balanceA - amountToPayA)), IntegerEntry(kBalanceB, (balanceB - amountToPayB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply - pmtAmount)), IntegerEntry(kInvariant, invariantCalculated), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
610+ else throw("Strict value is not equal to itself.")
611+ }
612+ else throw("Strict value is not equal to itself.")
613+ }
614+ })
615+
616+
617+
618+@Callable(i)
619+func withdrawWithOneToken (virtEstimatedAmountToReceive,virtMinAmountToRecive,withdrawAsset) = valueOrElse(isActive(), {
620+ let $t02434324418 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
621+ let pmtAmount = $t02434324418._1
622+ let pmtAssetId = $t02434324418._2
623+ if (!(containsElement([strAssetIdA, strAssetIdA], withdrawAsset)))
624+ then throw("Incorrect withdraw asset.")
625+ else if ((size(i.payments) != 1))
626+ then throwOnePayment()
627+ else if ((pmtAssetId != shareAssetId))
628+ then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
629+ else if (!(hasEnoughBalance))
630+ then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
631+ else {
632+ let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
633+ let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
634+ let virtAmount = if ((withdrawAsset == strAssetIdA))
635+ then calculateSendAmount(virtEstimatedAmountToReceive, virtMinAmountToRecive, amountToPayA, assetIdA)
636+ else calculateSendAmount(virtEstimatedAmountToReceive, virtMinAmountToRecive, amountToPayB, assetIdB)
637+ let feeDiscount = calculateFeeDiscount(i.originCaller)
638+ let governanceReward = fraction(virtAmount, fraction(feeGovernance, feeDiscount, feeScale6, CEILING), feeScale6)
639+ let virtAmountMinusFee = fraction(virtAmount, (feeScale6 - fraction(fee, feeDiscount, feeScale6, CEILING)), feeScale6)
640+ let $t02573326651 = if ((withdrawAsset == strAssetIdA))
641+ then {
642+ let stake1 = if (containsElement(stakingAssets, strAssetIdA))
643+ then invoke(this, "stakeUnstake", [false, ((amountToPayA + virtAmountMinusFee) + governanceReward), strAssetIdA], nil)
644+ else 0
645+ if ((stake1 == stake1))
646+ then $Tuple3((((balanceA - amountToPayA) - virtAmountMinusFee) - governanceReward), balanceB, (virtAmountMinusFee + amountToPayA))
647+ else throw("Strict value is not equal to itself.")
648+ }
649+ else {
650+ let stake2 = if (containsElement(stakingAssets, strAssetIdB))
651+ then invoke(this, "stakeUnstake", [false, ((amountToPayB + virtAmountMinusFee) + governanceReward), strAssetIdB], nil)
652+ else 0
653+ if ((stake2 == stake2))
654+ then $Tuple3(balanceA, (((balanceB - amountToPayB) - virtAmountMinusFee) - governanceReward), (virtAmountMinusFee + amountToPayB))
655+ else throw("Strict value is not equal to itself.")
656+ }
657+ let newBalanceA = $t02573326651._1
658+ let newBalanceB = $t02573326651._2
659+ let amountToPay = $t02573326651._3
660+ let invariantCalculated = invariantCalc(newBalanceA, (balanceB - newBalanceB))
661+[IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kShareAssetSupply, (shareAssetSupply - pmtAmount)), IntegerEntry(kInvariant, invariantCalculated), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPay, fromBase58String(withdrawAsset)), ScriptTransfer(moneyBoxAddress, governanceReward, fromBase58String(withdrawAsset))]
662+ }
663+ })
664+
665+
666+
667+@Callable(i)
668+func exchange (estimatedAmountToReceive,minAmountToReceive) = valueOrElse(isActive(), {
669+ let $t02737727452 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
670+ let pmtAmount = $t02737727452._1
671+ let pmtAssetId = $t02737727452._2
672+ if ((0 >= estimatedAmountToReceive))
673+ then throw(("Estimated amount must be positive. Actual: " + toString(estimatedAmountToReceive)))
674+ else if ((minAmountToReceive > estimatedAmountToReceive))
675+ then throw("Minimal amount can't be greater than estimated.")
676+ else if ((size(i.payments) != 1))
677+ then throwOnePayment()
678+ else if (!(hasEnoughBalance))
679+ then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
680+ else if (if ((pmtAssetId != assetIdA))
681+ then (pmtAssetId != assetIdB)
682+ else false)
683+ then throwAssets()
684+ else if ((10000000 > pmtAmount))
685+ then throw("Only swap of 10.000000 or more tokens is allowed")
686+ else if (if ((exchangeRatioLimitMin > fraction(scale8, minAmountToReceive, pmtAmount)))
687+ then true
688+ else (fraction(scale8, estimatedAmountToReceive, pmtAmount) > exchangeRatioLimitMax))
689+ then throw("Incorrect args and pmt ratio")
690+ else {
691+ let sendAssetId = if ((pmtAssetId == assetIdA))
692+ then assetIdB
693+ else assetIdA
694+ let amount = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
695+ let feeDiscount = calculateFeeDiscount(i.originCaller)
696+ let governanceReward = fraction(amount, fraction(feeGovernance, feeDiscount, feeScale6, CEILING), feeScale6)
697+ let amountMinusFee = fraction(amount, (feeScale6 - fraction(fee, feeDiscount, feeScale6, CEILING)), feeScale6)
698+ let $t02890529167 = if ((pmtAssetId == assetIdA))
699+ then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
700+ else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
701+ let newBalanceA = $t02890529167._1
702+ let newBalanceB = $t02890529167._2
703+ let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
704+ if (if ((dAppThresholdAmount > newBalanceA))
705+ then true
706+ else (dAppThresholdAmount > newBalanceB))
707+ then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
708+ else {
709+ let $t02946629539 = getAssetInfo(pmtAssetId)
710+ let pmtStrAssetId = $t02946629539._1
711+ let pmtAssetName = $t02946629539._2
712+ let pmtDecimals = $t02946629539._3
713+ let $t02955229629 = getAssetInfo(sendAssetId)
714+ let sendStrAssetId = $t02955229629._1
715+ let sendAssetName = $t02955229629._2
716+ let sendDecimals = $t02955229629._3
717+ let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
718+ then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
719+ else 0
720+ if ((stake1 == stake1))
721+ then {
722+ let stake2 = if (containsElement(stakingAssets, sendStrAssetId))
723+ then invoke(this, "stakeUnstake", [false, (amountMinusFee + governanceReward), sendStrAssetId], nil)
724+ else 0
725+ if ((stake2 == stake2))
726+ then $Tuple2([IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, invariantCalc(newBalanceA, newBalanceB)), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(moneyBoxAddress, governanceReward, sendAssetId)], $Tuple2(amountMinusFee, sendAssetId))
727+ else throw("Strict value is not equal to itself.")
728+ }
729+ else throw("Strict value is not equal to itself.")
730+ }
731+ }
732+ })
733+
734+
735+
736+@Callable(i)
737+func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
738+ then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
739+ else suspend("Paused by admin"))
740+
741+
742+
743+@Callable(i)
744+func activate () = valueOrElse(isAdminCall(i), if (active)
745+ then throwIsActive()
746+ else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
747+
748+
749+
750+@Callable(i)
751+func takeIntoAccountExtraFunds () = valueOrElse(isActive(), {
752+ let amountEnrollA = (accountBalanceWithStakedA - balanceA)
753+ let amountEnrollB = (accountBalanceWithStakedB - balanceB)
754+ let invariantNew = invariantCalc((balanceA + amountEnrollA), (balanceB + amountEnrollB))
755+ if ((i.caller != moneyBoxAddress))
756+ then throw("Only the money box can call this function")
757+ else if (if ((0 > amountEnrollA))
758+ then true
759+ else (0 > amountEnrollB))
760+ then suspend("Enroll amount negative")
761+ else if (if ((amountEnrollA == 0))
762+ then (amountEnrollB == 0)
763+ else false)
764+ then throw("No money to take")
765+ else {
766+ let stake1 = if (if (containsElement(stakingAssets, strAssetIdA))
767+ then (amountEnrollA > 0)
768+ else false)
769+ then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
770+ else 0
771+ if ((stake1 == stake1))
772+ then {
773+ let stake2 = if (if (containsElement(stakingAssets, strAssetIdB))
774+ then (amountEnrollB > 0)
775+ else false)
776+ then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
777+ else 0
778+ if ((stake2 == stake2))
779+ then [IntegerEntry(kInvariant, invariantNew), IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB))]
780+ else throw("Strict value is not equal to itself.")
781+ }
782+ else throw("Strict value is not equal to itself.")
783+ }
784+ })
785+
786+
787+
788+@Callable(i)
789+func keepLimitForFirstHarvest (shareLimit) = valueOrElse(isActive(), valueOrElse(isAdminCall(i), [IntegerEntry(kShareLimit, shareLimit)]))
790+
791+
792+
793+@Callable(i)
794+func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
795+ then throw("Only contract itself can invoke this function")
796+ else {
797+ let $t03283532938 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
798+ let call = $t03283532938._1
799+ let addr = $t03283532938._2
800+ let params = $t03283532938._3
801+ let payments = $t03283532938._4
802+ let inv = invoke(addr, call, params, payments)
803+ if ((inv == inv))
804+ then nil
805+ else throw("Strict value is not equal to itself.")
806+ }
807+
808+
809+@Verifier(tx)
810+func verify () = {
811+ let multiSignedByAdmins = {
812+ let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
813+ then 1
814+ else 0
815+ let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
816+ then 1
817+ else 0
818+ let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
819+ then 1
820+ else 0
821+ (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
822+ }
823+ match tx {
824+ case inv: InvokeScriptTransaction =>
825+ let callTakeIntoAccount = if ((inv.dApp == this))
826+ then (inv.function == "takeIntoAccountExtraFunds")
827+ else false
828+ let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
829+ then true
830+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
831+ then true
832+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
833+ then true
834+ else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKeyInvoke)
835+ if (if (callTakeIntoAccount)
836+ then signedByAdmin
837+ else false)
838+ then true
839+ else multiSignedByAdmins
840+ case _ =>
841+ multiSignedByAdmins
842+ }
843+ }
844+

github/deemru/w8io/026f985 
54.81 ms