tx · 7CrwtXr56T1mJB5LoV3W8iQHT93vFBsNH7VYBQurYLqt

3N5Xd7QVQZWntaJwha9Kg42is626GUPjtUW:  -0.01400000 Waves

2021.08.16 16:34 [1660972] smart account 3N5Xd7QVQZWntaJwha9Kg42is626GUPjtUW > SELF 0.00000000 Waves

{ "type": 13, "id": "7CrwtXr56T1mJB5LoV3W8iQHT93vFBsNH7VYBQurYLqt", "fee": 1400000, "feeAssetId": null, "timestamp": 1629120829376, "version": 2, "chainId": 84, "sender": "3N5Xd7QVQZWntaJwha9Kg42is626GUPjtUW", "senderPublicKey": "DfbjpZJBbZwnUKysUkxCbWTE1ZWuoUb6Y6BZdu5iAE8j", "proofs": [ "GXA1uxUV79k25hAegBQgQnSMojqywnhoAY4Ndygg5vm1MXtRTDAJATdyuSsotnrdUzaV59VPwBnYLy44CbrrQAG", "f5jW1XGyRfh1nAKhZrParpjGeXgfFFBTEDzderqDCj1pyrywqDyVok6NoNkTnhpRpMLMBatwa8XAwCajKFs7x9j" ], "script": "base64:AAIFAAAAAAAAACoIAhIDCgEIEgMKAQESAwoBARIECgIBARIAEgQKAgEBEgASABIAEgMKAQEAAABdAAAAAAd2ZXJzaW9uAgAAAAUyLjAuMAAAAAAIa1ZlcnNpb24CAAAAB3ZlcnNpb24AAAAAB2tBY3RpdmUCAAAABmFjdGl2ZQAAAAAJa0Fzc2V0SWRBAgAAAApBX2Fzc2V0X2lkAAAAAAlrQXNzZXRJZEICAAAACkJfYXNzZXRfaWQAAAAACWtCYWxhbmNlQQIAAAAPQV9hc3NldF9iYWxhbmNlAAAAAAlrQmFsYW5jZUICAAAAD0JfYXNzZXRfYmFsYW5jZQAAAAANa1NoYXJlQXNzZXRJZAIAAAAOc2hhcmVfYXNzZXRfaWQAAAAAEWtTaGFyZUFzc2V0U3VwcGx5AgAAABJzaGFyZV9hc3NldF9zdXBwbHkAAAAABGtGZWUCAAAACmNvbW1pc3Npb24AAAAAEmtGZWVTY2FsZURlbGltaXRlcgIAAAAaY29tbWlzc2lvbl9zY2FsZV9kZWxpbWl0ZXIAAAAACmtJbnZhcmlhbnQCAAAACWludmFyaWFudAAAAAAGa0NhdXNlAgAAAA5zaHV0ZG93bl9jYXVzZQAAAAANa0ZpcnN0SGFydmVzdAIAAAANZmlyc3RfaGFydmVzdAAAAAATa0ZpcnN0SGFydmVzdEhlaWdodAIAAAAUZmlyc3RfaGFydmVzdF9oZWlnaHQAAAAAC2tTaGFyZUxpbWl0AgAAABxzaGFyZV9saW1pdF9vbl9maXJzdF9oYXJ2ZXN0AAAAAAtrQmFzZVBlcmlvZAIAAAALYmFzZV9wZXJpb2QAAAAADWtQZXJpb2RMZW5ndGgCAAAADXBlcmlvZF9sZW5ndGgAAAAADGtTdGFydEhlaWdodAIAAAAMc3RhcnRfaGVpZ2h0AAAAABRrT3JhY2xlQXNzZXRQcmlvcml0eQIAAAAPYXNzZXRfcHJpb3JpdHlfAAAAABFrT3JhY2xlU2NyaXB0SGFzaAIAAAAQc2NyaXB0X2hhc2hfZmxhdAAAAAAPa0luaXRQb29sSGVpZ2h0AgAAABFpbml0X3Bvb2xfaGVpZ2h0XwAAAAAPa2V5QWRtaW5QdWJLZXkxAgAAAAthZG1pbl9wdWJfMQAAAAAPa2V5QWRtaW5QdWJLZXkyAgAAAAth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AA10aHJvd0lzQWN0aXZlAAAAAAMJAAAAAAAAAgUAAAALcG10QXNzZXRJZDEFAAAAC3BtdEFzc2V0SWQyCQAAAgAAAAECAAAAGEFzc2V0cyBtdXN0IGJlIGRpZmZlcmVudAQAAAAOcG10U3RyQXNzZXRJZDEEAAAAByRtYXRjaDAFAAAAC3BtdEFzc2V0SWQxAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAJpZAUAAAAHJG1hdGNoMAkAAlgAAAABBQAAAAJpZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAQAAAAFd2F2ZXMFAAAAByRtYXRjaDACAAAABVdBVkVTCQAAAgAAAAECAAAAC01hdGNoIGVycm9yBAAAAA5wbXRTdHJBc3NldElkMgQAAAAHJG1hdGNoMAUAAAALcG10QXNzZXRJZDIDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAACkJ5dGVWZWN0b3IEAAAAAmlkBQAAAAckbWF0Y2gwCQACWAAAAAEFAAAAAmlkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAARVbml0BAAAAAV3YXZlcwUAAAAHJG1hdGNoMAIAAAAFV0FWRVMJAAACAAAAAQIAAAALTWF0Y2ggZXJyb3IEAAAADmFzc2V0MVByaW9yaXR5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABm9yYWNsZQkAASwAAAACBQAAABRrT3JhY2xlQXNzZXRQcmlvcml0eQUAAAAOcG10U3RyQXNzZXRJZDEAAAAAAAAPQj8EAAAADmFzc2V0MlByaW9yaXR5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABm9yYWNsZQkAASwAAAACBQAAABRrT3JhY2xlQXNzZXRQcmlvcml0eQUAAAAOcG10U3RyQXNzZXRJZDIAAAAAAAAPQj8EAAAADSR0MDExNTA5MTE3MzYDCQAAZgAAAAIFAAAADmFzc2V0MlByaW9yaXR5BQAAAA5hc3NldDFQcmlvcml0eQkABRYAAAAEBQAAAApwbXRBbW91bnQyBQAAAAtwbXRBc3NldElkMgUAAAAKcG10QW1vdW50MQUAAAALcG10QXNzZXRJZDEJAAUWAAAABAUAAAAKcG10QW1vdW50MQUAAAALcG10QXNzZXRJZDEFAAAACnBtdEFtb3VudDIFAAAAC3BtdEFzc2V0SWQyBAAAAApwbXRBbW91bnRBCAUAAAANJHQwMTE1MDkxMTczNgAAAAJfMQQAAAALcG10QXNzZXRJZEEIBQAAAA0kdDAxMTUwOTExNzM2AAAAAl8yBAAAAApwbXRBbW91bnRCCAUAAAANJHQwMTE1MDkxMTczNgAAAAJfMwQAAAALcG10QXNzZXRJZEIIBQAAAA0kdDAxMTUwOTExNzM2AAAAAl80BAAAAA0kdDAxMTc0NTExODIyCQEAAAAMZ2V0QXNzZXRJbmZvAAAAAQUAAAALcG10QXNzZXRJZEEEAAAADnBtdFN0ckFzc2V0SWRBCAUAAAANJHQwMTE3NDUxMTgyMgAAAAJfMQQAAAANcG10QXNzZXROYW1lQQgFAAAADSR0MDExNzQ1MTE4MjIAAAACXzIEAAAADHBtdERlY2ltYWxzQQgFAAAADSR0MDExNzQ1MTE4MjIAAAACXzMEAAAADSR0MDExODMxMTE5MDgJAQAAAAxnZXRBc3NldEluZm8AAAABBQAAAAtwbXRBc3NldElkQgQAAAAOcG10U3RyQXNzZXRJZEIIBQAAAA0kdDAxMTgzMTExOTA4AAAAAl8xBAAAAA1wbXRBc3NldE5hbWVCCAUAAAANJHQwMTE4MzExMTkwOAAAAAJfMgQAAAAMcG10RGVjaW1hbHNCCAUAAAANJHQwMTE4MzExMTkwOAAAAAJfMwQAAAAJc2hhcmVOYW1lCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAFzCQABLwAAAAIFAAAADXBtdEFzc2V0TmFtZUEAAAAAAAAAAAcCAAAAAV8JAAEvAAAAAgUAAAANcG10QXNzZXROYW1lQgAAAAAAAAAABwQAAAAQc2hhcmVEZXNjcmlwdGlvbgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAIlNoYXJlVG9rZW4gb2YgU3dvcEZpIHByb3RvY29sIGZvciAFAAAADXBtdEFzc2V0TmFtZUECAAAABSBhbmQgBQAAAA1wbXRBc3NldE5hbWVCAgAAAAwgYXQgYWRkcmVzcyAJAAQlAAAAAQUAAAAEdGhpcwQAAAANc2hhcmVEZWNpbWFscwkAAGkAAAACCQAAZAAAAAIFAAAADHBtdERlY2ltYWxzQQUAAAAMcG10RGVjaW1hbHNCAAAAAAAAAAACBAAAABJzaGFyZUluaXRpYWxTdXBwbHkJAABrAAAAAwkAAGwAAAAGBQAAAApwbXRBbW91bnRBBQAAAAxwbXREZWNpbWFsc0EAAAAAAAAAAAUAAAAAAAAAAAEFAAAADHBtdERlY2ltYWxzQQUAAAAERE9XTgkAAGwAAAAGBQAAAApwbXRBbW91bnRCBQAAAAxwbXREZWNpbWFsc0IAAAAAAAAAAAUAAAAAAAAAAAEFAAAADHBtdERlY2ltYWxzQgUAAAAERE9XTgkAAGwAAAAGAAAAAAAAAAAKAAAAAAAAAAAABQAAAA1zaGFyZURlY2ltYWxzAAAAAAAAAAAAAAAAAAAAAAAABQAAAARET1dOBAAAAApzaGFyZUlzc3VlCQAEQgAAAAUFAAAACXNoYXJlTmFtZQUAAAAQc2hhcmVEZXNjcmlwdGlvbgUAAAASc2hhcmVJbml0aWFsU3VwcGx5BQAAAA1zaGFyZURlY2ltYWxzBgQAAAAMc2hhcmVJc3N1ZUlkCQAEOAAAAAEFAAAACnNoYXJlSXNzdWUEAAAAE2ludmFyaWFudENhbGN1bGF0ZWQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgUAAAAKcG10QW1vdW50QQUAAAAKcG10QW1vdW50QgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAhrVmVyc2lvbgUAAAAHdmVyc2lvbgkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAHa0FjdGl2ZQYJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAJa0Fzc2V0SWRBBQAAAA5wbXRTdHJBc3NldElkQQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAlrQXNzZXRJZEIFAAAADnBtdFN0ckFzc2V0SWRCCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUEFAAAACnBtdEFtb3VudEEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQgUAAAAKcG10QW1vdW50QgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAKa0ludmFyaWFudAUAAAATaW52YXJpYW50Q2FsY3VsYXRlZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAEa0ZlZQUAAAADZmVlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABJrRmVlU2NhbGVEZWxpbWl0ZXIFAAAACWZlZVNjYWxlNgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAPa0luaXRQb29sSGVpZ2h0BQAAAAZoZWlnaHQJAARMAAAAAgUAAAAKc2hhcmVJc3N1ZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAA1rU2hhcmVBc3NldElkCQACWAAAAAEFAAAADHNoYXJlSXNzdWVJZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAARa1NoYXJlQXNzZXRTdXBwbHkFAAAAEnNoYXJlSW5pdGlhbFN1cHBseQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAt1c2VyQWRkcmVzcwUAAAASc2hhcmVJbml0aWFsU3VwcGx5BQAAAAxzaGFyZUlzc3VlSWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAANd2FsbGV0QWRkcmVzcwUAAAAZY29taXNzaW9uRm9ySW5pdGFsaXphdGlvbgUAAAAEU1dPUAUAAAADbmlsAAAAAWkBAAAAGGtlZXBMaW1pdEZvckZpcnN0SGFydmVzdAAAAAEAAAAKc2hhcmVMaW1pdAMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAAACAAAAAQIAAAAfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAMJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkxCQAETAAAAAIFAAAADGFkbWluUHViS2V5MgkABEwAAAACBQAAAAxhZG1pblB1YktleTMJAARMAAAAAgUAAAAKYWRtU3Rha2luZwUAAAADbmlsCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkJAAACAAAAAQIAAAAhT25seSBhZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrU2hhcmVMaW1pdAUAAAAKc2hhcmVMaW1pdAUAAAADbmlsAAAAAWkBAAAAFnJlcGxlbmlzaFdpdGhUd29Ub2tlbnMAAAABAAAAEXNsaXBwYWdlVG9sZXJhbmNlBAAAAAtwbXRBc3NldElkQQgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAALcG10QXNzZXRJZEIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABAAAAB2Fzc2V0SWQEAAAACnBtdEFtb3VudEEJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50BQAAAAtwbXRBc3NldElkQQQAAAAKcG10QW1vdW50QgkBAAAAEGRlZHVjdFN0YWtpbmdGZWUAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQAAAAZhbW91bnQFAAAAC3BtdEFzc2V0SWRCBAAAAAp0b2tlblJhdGlvCQAAawAAAAMJAABrAAAAAwUAAAAGc2NhbGU4BQAAAAhiYWxhbmNlQQUAAAAKcG10QW1vdW50QQUAAAAGc2NhbGUzCQAAawAAAAMFAAAABnNjYWxlOAUAAAAIYmFsYW5jZUIFAAAACnBtdEFtb3VudEIEAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAABrAAAAAwUAAAAGc2NhbGU4BQAAAApwbXRBbW91bnRBBQAAAAhiYWxhbmNlQQQAAAATcmF0aW9TaGFyZVRva2Vuc0luQgkAAGsAAAADBQAAAAZzY2FsZTgFAAAACnBtdEFtb3VudEIFAAAACGJhbGFuY2VCBAAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQJAABrAAAAAwkAAZcAAAABCQAETAAAAAIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAARMAAAAAgUAAAATcmF0aW9TaGFyZVRva2Vuc0luQgUAAAADbmlsBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAZzY2FsZTgEAAAAE2ludmFyaWFudENhbGN1bGF0ZWQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAAKcG10QW1vdW50QQkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAKcG10QW1vdW50QgMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAQAAAA90aHJvd0lzSW5hY3RpdmUAAAAAAwMJAABmAAAAAgAAAAAAAAAAAAUAAAARc2xpcHBhZ2VUb2xlcmFuY2UGCQAAZgAAAAIFAAAAEXNsaXBwYWdlVG9sZXJhbmNlAAAAAAAAAAAKCQAAAgAAAAECAAAAIFNsaXBwYWdlIHRvbGVyYW5jZSBtdXN0IGJlIDw9IDElAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAgkAAAIAAAABAgAAABxUd28gYXR0YWNoZWQgYXNzZXRzIGV4cGVjdGVkAwMJAQAAAAIhPQAAAAIFAAAAC3BtdEFzc2V0SWRBBQAAAAhhc3NldElkQQYJAQAAAAIhPQAAAAIFAAAAC3BtdEFzc2V0SWRCBQAAAAhhc3NldElkQgkBAAAAC3Rocm93QXNzZXRzAAAAAAMDCQAAZgAAAAIJAABpAAAAAgkAAGgAAAACBQAAAAZzY2FsZTMJAABlAAAAAgUAAAAOc2xpcHBhZ2VTY2FsZTMFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBQAAAA5zbGlwcGFnZVNjYWxlMwUAAAAKdG9rZW5SYXRpbwYJAABmAAAAAgUAAAAKdG9rZW5SYXRpbwkAAGkAAAACCQAAaAAAAAIFAAAABnNjYWxlMwkAAGQAAAACBQAAAA5zbGlwcGFnZVNjYWxlMwUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAADnNsaXBwYWdlU2NhbGUzCQAAAgAAAAECAAAAPUluY29ycmVjdCBhc3NldHMgYW1vdW50OiBhbW91bnRzIG11c3QgaGF2ZSB0aGUgY29udHJhY3QgcmF0aW8DCQAAAAAAAAIFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAAAAAAAAAAAAAkAAAIAAAABAgAAAB1Ub28gc21hbGwgYW1vdW50IHRvIHJlcGxlbmlzaAMJAQAAAAEhAAAAAQUAAAAQaGFzRW5vdWdoQmFsYW5jZQkABE4AAAACCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAKcG10QW1vdW50QQUAAAALcG10QXNzZXRJZEEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAApwbXRBbW91bnRCBQAAAAtwbXRBc3NldElkQgUAAAADbmlsCQEAAAARc3VzcGVuZFN1c3BpY2lvdXMAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUEJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAACnBtdEFtb3VudEEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQgkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAKcG10QW1vdW50QgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAARa1NoYXJlQXNzZXRTdXBwbHkJAABkAAAAAgUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAprSW52YXJpYW50BQAAABNpbnZhcmlhbnRDYWxjdWxhdGVkCQAETAAAAAIJAQAAAAdSZWlzc3VlAAAAAwUAAAAMc2hhcmVBc3NldElkBQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQGCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50BQAAAAxzaGFyZUFzc2V0SWQFAAAAA25pbAAAAAFpAQAAABVyZXBsZW5pc2hXaXRoT25lVG9rZW4AAAACAAAAE3ZpcnR1YWxTd2FwVG9rZW5QYXkAAAATdmlydHVhbFN3YXBUb2tlbkdldAQAAAANJHQwMTY1ODYxNjY2MQkABRQAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAACXBtdEFtb3VudAgFAAAADSR0MDE2NTg2MTY2NjEAAAACXzEEAAAACnBtdEFzc2V0SWQIBQAAAA0kdDAxNjU4NjE2NjYxAAAAAl8yBAAAAA9wbXRNaW5UaHJlc2hvbGQAAAAAAABMS0AEAAAAHXRocmVzaG9sZFZhbHVlRm9yTWluVG9sZXJhbmNlAAAAAAAC+vCABAAAAAl0b2xlcmFuY2UDCQAAZgAAAAIFAAAAHXRocmVzaG9sZFZhbHVlRm9yTWluVG9sZXJhbmNlBQAAAAlwbXRBbW91bnQAAAAAAAABhqAAAAAAAAAAAAEEAAAAHHNsaXBwYWdlVmFsdWVNaW5Gb3JSZXBsZW5pc2gJAABlAAAAAgUAAAAGc2NhbGU4CQAAaQAAAAIJAABoAAAAAgUAAAAGc2NhbGU4BQAAAAl0b2xlcmFuY2UAAAAAAACYloAEAAAAHHNsaXBwYWdlVmFsdWVNYXhGb3JSZXBsZW5pc2gJAABkAAAAAgUAAAAGc2NhbGU4CQAAaQAAAAIJAABoAAAAAgUAAAAGc2NhbGU4BQAAAAl0b2xlcmFuY2UAAAAAAACYloAEAAAAF3NsaXBwYWdlVmFsdWVNaW5Gb3JTd2FwCQAAZQAAAAIFAAAABnNjYWxlOAkAAGkAAAACCQAAaAAAAAIFAAAABnNjYWxlOAAAAAAAAAAAAQAAAAAAAJiWgAMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAQAAAA90aHJvd0lzSW5hY3RpdmUAAAAAAwkAAGYAAAACBQAAAA9wbXRNaW5UaHJlc2hvbGQFAAAACXBtdEFtb3VudAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAD1BheW1lbnQgYW1vdW50IAkAAaQAAAABBQAAAAlwbXRBbW91bnQCAAAAJyBkb2VzIG5vdCBleGNlZWQgdGhlIG1pbmltdW0gYW1vdW50IG9mIAkAAaQAAAABBQAAAA9wbXRNaW5UaHJlc2hvbGQCAAAAByB0b2tlbnMDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQAAAgAAAAECAAAAHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQAETgAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAlwbXRBbW91bnQFAAAACnBtdEFzc2V0SWQFAAAAA25pbAkBAAAAEXN1c3BlbmRTdXNwaWNpb3VzAAAAAAMDCQEAAAACIT0AAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQkBAAAAAiE9AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEIHCQEAAAALdGhyb3dBc3NldHMAAAAABAAAAA0kdDAxNzY3MzE4NDM4AwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQkABRkAAAAHCQAAZQAAAAIFAAAACXBtdEFtb3VudAUAAAATdmlydHVhbFN3YXBUb2tlblBheQUAAAATdmlydHVhbFN3YXBUb2tlbkdldAkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAATdmlydHVhbFN3YXBUb2tlblBheQkAAGUAAAACBQAAAAhiYWxhbmNlQgUAAAATdmlydHVhbFN3YXBUb2tlbkdldAkBAAAADWludmFyaWFudENhbGMAAAACCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAAlwbXRBbW91bnQFAAAACGJhbGFuY2VCCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAAlwbXRBbW91bnQFAAAACGJhbGFuY2VCCQAFGQAAAAcFAAAAE3ZpcnR1YWxTd2FwVG9rZW5HZXQJAABlAAAAAgUAAAAJcG10QW1vdW50BQAAABN2aXJ0dWFsU3dhcFRva2VuUGF5CQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAABN2aXJ0dWFsU3dhcFRva2VuR2V0CQAAZAAAAAIFAAAACGJhbGFuY2VCBQAAABN2aXJ0dWFsU3dhcFRva2VuUGF5CQEAAAANaW52YXJpYW50Q2FsYwAAAAIFAAAACGJhbGFuY2VBCQAAZAAAAAIFAAAACGJhbGFuY2VCBQAAAAlwbXRBbW91bnQFAAAACGJhbGFuY2VBCQAAZAAAAAIFAAAACGJhbGFuY2VCBQAAAAlwbXRBbW91bnQEAAAAEXZpcnR1YWxSZXBsZW5pc2hBCAUAAAANJHQwMTc2NzMxODQzOAAAAAJfMQQAAAARdmlydHVhbFJlcGxlbmlzaEIIBQAAAA0kdDAxNzY3MzE4NDM4AAAAAl8yBAAAABFiYWxhbmNlQWZ0ZXJTd2FwQQgFAAAADSR0MDE3NjczMTg0MzgAAAACXzMEAAAAEWJhbGFuY2VBZnRlclN3YXBCCAUAAAANJHQwMTc2NzMxODQzOAAAAAJfNAQAAAATaW52YXJpYW50Q2FsY3VsYXRlZAgFAAAADSR0MDE3NjczMTg0MzgAAAACXzUEAAAAC25ld0JhbGFuY2VBCAUAAAANJHQwMTc2NzMxODQzOAAAAAJfNgQAAAALbmV3QmFsYW5jZUIIBQAAAA0kdDAxNzY3MzE4NDM4AAAAAl83BAAAAA9uZXdCYWxhbmNlRW50cnkDCQAAAAAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRBCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQQkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQgUAAAALbmV3QmFsYW5jZUIEAAAADGludmFyaWFudE5ldwkBAAAADWludmFyaWFudENhbGMAAAACBQAAABFiYWxhbmNlQWZ0ZXJTd2FwQQUAAAARYmFsYW5jZUFmdGVyU3dhcEIEAAAAF2ludmFyaWFudEVzdGltYXRlZFJhdGlvCQAAawAAAAMFAAAABnNjYWxlOAUAAAAJaW52YXJpYW50BQAAAAxpbnZhcmlhbnROZXcEAAAAJXJhdGlvVmlydHVhbEJhbGFuY2VUb1ZpcnR1YWxSZXBsZW5pc2gJAABpAAAAAgkAAGsAAAADCQAAaAAAAAIFAAAABnNjYWxlOAUAAAAGc2NhbGU4BQAAABFiYWxhbmNlQWZ0ZXJTd2FwQQUAAAARYmFsYW5jZUFmdGVyU3dhcEIJAABrAAAAAwUAAAAGc2NhbGU4BQAAABF2aXJ0dWFsUmVwbGVuaXNoQQUAAAARdmlydHVhbFJlcGxlbmlzaEIEAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQJAABrAAAAAwkAAGQAAAACBQAAAAtuZXdCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUIFAAAADWRBcHBUaHJlc2hvbGQJAABoAAAAAgAAAAAAAAAAAgUAAAATZEFwcFRocmVzaG9sZFNjYWxlMgMDCQAAZwAAAAIFAAAAF3NsaXBwYWdlVmFsdWVNaW5Gb3JTd2FwBQAAABdpbnZhcmlhbnRFc3RpbWF0ZWRSYXRpbwYJAABmAAAAAgUAAAAJaW52YXJpYW50BQAAAAxpbnZhcmlhbnROZXcJAAACAAAAAQIAAAA6SW5jb3JyZWN0IHZpcnR1YWxTd2FwVG9rZW5QYXkgb3IgdmlydHVhbFN3YXBUb2tlbkdldCB2YWx1ZQMDCQAAZgAAAAIFAAAAHHNsaXBwYWdlVmFsdWVNaW5Gb3JSZXBsZW5pc2gFAAAAJXJhdGlvVmlydHVhbEJhbGFuY2VUb1ZpcnR1YWxSZXBsZW5pc2gGCQAAZgAAAAIFAAAAJXJhdGlvVmlydHVhbEJhbGFuY2VUb1ZpcnR1YWxSZXBsZW5pc2gFAAAAHHNsaXBwYWdlVmFsdWVNYXhGb3JSZXBsZW5pc2gJAAACAAAAAQIAAABsU3dhcCB3aXRoIHZpcnR1YWxTd2FwVG9rZW5QYXkgYW5kIHZpcnR1YWxTd2FwVG9rZW5HZXQgaXMgcG9zc2libGUsIGJ1dCByYXRpbyBhZnRlciB2aXJ0dWFsIHN3YXAgaXMgaW5jb3JyZWN0AwMJAABmAAAAAgUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAALbmV3QmFsYW5jZUEGCQAAZgAAAAIFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAC25ld0JhbGFuY2VCCQEAAAAOdGhyb3dUaHJlc2hvbGQAAAADBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAAtuZXdCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUIEAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAABrAAAAAwkBAAAAEGRlZHVjdFN0YWtpbmdGZWUAAAACBQAAABF2aXJ0dWFsUmVwbGVuaXNoQQUAAAAIYXNzZXRJZEEFAAAABnNjYWxlOAUAAAARYmFsYW5jZUFmdGVyU3dhcEEEAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkIJAABrAAAAAwkBAAAAEGRlZHVjdFN0YWtpbmdGZWUAAAACBQAAABF2aXJ0dWFsUmVwbGVuaXNoQgUAAAAIYXNzZXRJZEIFAAAABnNjYWxlOAUAAAARYmFsYW5jZUFmdGVyU3dhcEIEAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAkAAGsAAAADCQABlwAAAAEJAARMAAAAAgUAAAATcmF0aW9TaGFyZVRva2Vuc0luQQkABEwAAAACBQAAABNyYXRpb1NoYXJlVG9rZW5zSW5CBQAAAANuaWwFAAAAEHNoYXJlQXNzZXRTdXBwbHkFAAAABnNjYWxlOAkABEwAAAACCQEAAAAHUmVpc3N1ZQAAAAMFAAAADHNoYXJlQXNzZXRJZAUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50BgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAUAAAAMc2hhcmVBc3NldElkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrU2hhcmVBc3NldFN1cHBseQkAAGQAAAACBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQJAARMAAAAAgUAAAAPbmV3QmFsYW5jZUVudHJ5CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAprSW52YXJpYW50BQAAABNpbnZhcmlhbnRDYWxjdWxhdGVkBQAAAANuaWwAAAABaQEAAAAId2l0aGRyYXcAAAAABAAAAA0kdDAyMDU4MzIwNzI2CQAFFAAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAAJcG10QW1vdW50CAUAAAANJHQwMjA1ODMyMDcyNgAAAAJfMQQAAAAKcG10QXNzZXRJZAgFAAAADSR0MDIwNTgzMjA3MjYAAAACXzIEAAAADGFtb3VudFRvUGF5QQkBAAAAEGRlZHVjdFN0YWtpbmdGZWUAAAACCQAAawAAAAMFAAAACXBtdEFtb3VudAUAAAAIYmFsYW5jZUEFAAAAEHNoYXJlQXNzZXRTdXBwbHkFAAAACGFzc2V0SWRBBAAAAAxhbW91bnRUb1BheUIJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAgkAAGsAAAADBQAAAAlwbXRBbW91bnQFAAAACGJhbGFuY2VCBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAhhc3NldElkQgQAAAATaW52YXJpYW50Q2FsY3VsYXRlZAkBAAAADWludmFyaWFudENhbGMAAAACCQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAAAxhbW91bnRUb1BheUEJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAADGFtb3VudFRvUGF5QgMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAQAAAA90aHJvd0lzSW5hY3RpdmUAAAAAAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAIAAAABAgAAAB1PbmUgYXR0YWNoZWQgcGF5bWVudCBleHBlY3RlZAMJAQAAAAIhPQAAAAIFAAAACnBtdEFzc2V0SWQFAAAADHNoYXJlQXNzZXRJZAkAAAIAAAABCQABLAAAAAICAAAAJEluY29ycmVjdCBhc3NldCBhdHRhY2hlZC4gRXhwZWN0ZWQ6IAkAAlgAAAABBQAAAAxzaGFyZUFzc2V0SWQDCQEAAAABIQAAAAEFAAAAEGhhc0Vub3VnaEJhbGFuY2UJAAROAAAAAgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAACXBtdEFtb3VudAUAAAAKcG10QXNzZXRJZAUAAAADbmlsCQEAAAARc3VzcGVuZFN1c3BpY2lvdXMAAAAAAwMJAABmAAAAAgUAAAAMYW1vdW50VG9QYXlBBQAAABFhdmFpbGFibGVCYWxhbmNlQQYJAABmAAAAAgUAAAAMYW1vdW50VG9QYXlCBQAAABFhdmFpbGFibGVCYWxhbmNlQgkBAAAAInRocm93SW5zdWZmaWNpZW50QXZhaWxhYmxlQmFsYW5jZXMAAAACBQAAAAxhbW91bnRUb1BheUEFAAAADGFtb3VudFRvUGF5QgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VBCQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAAAxhbW91bnRUb1BheUEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQgkAAGUAAAACBQAAAAhiYWxhbmNlQgUAAAAMYW1vdW50VG9QYXlCCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrU2hhcmVBc3NldFN1cHBseQkAAGUAAAACBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAlwbXRBbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACmtJbnZhcmlhbnQFAAAAE2ludmFyaWFudENhbGN1bGF0ZWQJAARMAAAAAgkBAAAABEJ1cm4AAAACBQAAAAxzaGFyZUFzc2V0SWQFAAAACXBtdEFtb3VudAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADGFtb3VudFRvUGF5QQUAAAAIYXNzZXRJZEEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAxhbW91bnRUb1BheUIFAAAACGFzc2V0SWRCBQAAAANuaWwAAAABaQEAAAAIZXhjaGFuZ2UAAAACAAAAGGVzdGltYXRlZEFtb3VudFRvUmVjZWl2ZQAAABJtaW5BbW91bnRUb1JlY2VpdmUEAAAADSR0MDIyMDg0MjIxNTkJAAUUAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAAlwbXRBbW91bnQIBQAAAA0kdDAyMjA4NDIyMTU5AAAAAl8xBAAAAApwbXRBc3NldElkCAUAAAANJHQwMjIwODQyMjE1OQAAAAJfMgMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAQAAAA90aHJvd0lzSW5hY3RpdmUAAAAAAwkAAGcAAAACAAAAAAAAAAAABQAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUJAAACAAAAAQkAASwAAAACAgAAACtFc3RpbWF0ZWQgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUuIEFjdHVhbDogCQABpAAAAAEFAAAAGGVzdGltYXRlZEFtb3VudFRvUmVjZWl2ZQMJAABmAAAAAgUAAAASbWluQW1vdW50VG9SZWNlaXZlBQAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAA7TWluaW1hbCBhbW91bnQgY2FuJ3QgYmUgZ3JlYXRlciB0aGFuIGVzdGltYXRlZC4gRXN0aW1hdGVkOiAJAAGkAAAAAQUAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlAgAAAAsuIE1pbmltYWw6IAkAAaQAAAABBQAAABJtaW5BbW91bnRUb1JlY2VpdmUDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQAAAgAAAAECAAAAHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQAETgAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAlwbXRBbW91bnQFAAAACnBtdEFzc2V0SWQFAAAAA25pbAkBAAAAEXN1c3BlbmRTdXNwaWNpb3VzAAAAAAMDCQEAAAACIT0AAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQkBAAAAAiE9AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEIHCQEAAAALdGhyb3dBc3NldHMAAAAAAwkAAGYAAAACAAAAAAAAmJaABQAAAAlwbXRBbW91bnQJAAACAAAAAQIAAAAwT25seSBzd2FwIG9mIDEwLjAwMDAwMCBvciBtb3JlIHRva2VucyBpcyBhbGxvd2VkAwMJAABmAAAAAgUAAAAVZXhjaGFuZ2VSYXRpb0xpbWl0TWluCQAAawAAAAMFAAAABnNjYWxlOAUAAAASbWluQW1vdW50VG9SZWNlaXZlBQAAAAlwbXRBbW91bnQGCQAAZgAAAAIJAABrAAAAAwUAAAAGc2NhbGU4BQAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUFAAAACXBtdEFtb3VudAUAAAAVZXhjaGFuZ2VSYXRpb0xpbWl0TWF4CQAAAgAAAAECAAAAHEluY29ycmVjdCBhcmdzIGFuZCBwbXQgcmF0aW8EAAAAC3NlbmRBc3NldElkAwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQUAAAAIYXNzZXRJZEIFAAAACGFzc2V0SWRBBAAAAAZhbW91bnQJAQAAABNjYWxjdWxhdGVTZW5kQW1vdW50AAAABAUAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlBQAAABJtaW5BbW91bnRUb1JlY2VpdmUFAAAACXBtdEFtb3VudAUAAAAKcG10QXNzZXRJZAQAAAAQZ292ZXJuYW5jZVJld2FyZAkAAGsAAAADBQAAAAZhbW91bnQFAAAADWZlZUdvdmVybmFuY2UFAAAACWZlZVNjYWxlNgQAAAAOYW1vdW50TWludXNGZWUJAABrAAAAAwUAAAAGYW1vdW50CQAAZQAAAAIFAAAACWZlZVNjYWxlNgUAAAADZmVlBQAAAAlmZWVTY2FsZTYEAAAADSR0MDIzNTgxMjM4NDMDCQAAAAAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRBCQAFFAAAAAIJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAACXBtdEFtb3VudAkAAGUAAAACCQAAZQAAAAIFAAAACGJhbGFuY2VCBQAAAA5hbW91bnRNaW51c0ZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAkABRQAAAACCQAAZQAAAAIJAABlAAAAAgUAAAAIYmFsYW5jZUEFAAAADmFtb3VudE1pbnVzRmVlBQAAABBnb3Zlcm5hbmNlUmV3YXJkCQAAZAAAAAIFAAAACGJhbGFuY2VCBQAAAAlwbXRBbW91bnQEAAAAC25ld0JhbGFuY2VBCAUAAAANJHQwMjM1ODEyMzg0MwAAAAJfMQQAAAALbmV3QmFsYW5jZUIIBQAAAA0kdDAyMzU4MTIzODQzAAAAAl8yBAAAABNkQXBwVGhyZXNob2xkQW1vdW50CQAAawAAAAMJAABkAAAAAgUAAAALbmV3QmFsYW5jZUEFAAAAC25ld0JhbGFuY2VCBQAAAA1kQXBwVGhyZXNob2xkCQAAaAAAAAIAAAAAAAAAAAIFAAAAE2RBcHBUaHJlc2hvbGRTY2FsZTIDAwkAAGYAAAACBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAAtuZXdCYWxhbmNlQQYJAABmAAAAAgUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAALbmV3QmFsYW5jZUIJAQAAAA50aHJvd1RocmVzaG9sZAAAAAMFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAC25ld0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQgMDAwkAAAAAAAACBQAAAAhhc3NldElkQQUAAAAEVVNETgkAAAAAAAACBQAAAAtzZW5kQXNzZXRJZAUAAAAIYXNzZXRJZEEHCQAAZwAAAAIFAAAAEHN0YWtlZEFtb3VudFVTRE4FAAAAC25ld0JhbGFuY2VBBwkBAAAAIXRocm93SW5zdWZmaWNpZW50QXZhaWxhYmxlQmFsYW5jZQAAAAMFAAAADmFtb3VudE1pbnVzRmVlBQAAABFhdmFpbGFibGVCYWxhbmNlQQUAAAAKYXNzZXROYW1lQQMDAwkAAAAAAAACBQAAAAhhc3NldElkQgUAAAAEVVNETgkAAAAAAAACBQAAAAtzZW5kQXNzZXRJZAUAAAAIYXNzZXRJZEIHCQAAZwAAAAIFAAAAEHN0YWtlZEFtb3VudFVTRE4FAAAAC25ld0JhbGFuY2VCBwkBAAAAIXRocm93SW5zdWZmaWNpZW50QXZhaWxhYmxlQmFsYW5jZQAAAAMFAAAADmFtb3VudE1pbnVzRmVlBQAAABFhdmFpbGFibGVCYWxhbmNlQgUAAAAKYXNzZXROYW1lQgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VCBQAAAAtuZXdCYWxhbmNlQgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAKa0ludmFyaWFudAkBAAAADWludmFyaWFudENhbGMAAAACBQAAAAtuZXdCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAA5hbW91bnRNaW51c0ZlZQUAAAALc2VuZEFzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAANd2FsbGV0QWRkcmVzcwUAAAAQZ292ZXJuYW5jZVJld2FyZAUAAAALc2VuZEFzc2V0SWQFAAAAA25pbAAAAAFpAQAAAAhzaHV0ZG93bgAAAAADCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQAAAgAAAAEJAAEsAAAAAgIAAAAiREFwcCBpcyBhbHJlYWR5IHN1c3BlbmRlZC4gQ2F1c2U6IAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAAZrQ2F1c2UCAAAAGnRoZSBjYXVzZSB3YXNuJ3Qgc3BlY2lmaWVkAwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACBQAAAAxhZG1pblB1YktleTEJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkyCQAETAAAAAIFAAAADGFkbWluUHViS2V5MwkABEwAAAACBQAAAAxhZG1TdGFydFN0b3AFAAAAA25pbAgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQEAAAAOdGhyb3dPbmx5QWRtaW4AAAAACQEAAAAHc3VzcGVuZAAAAAECAAAAD1BhdXNlZCBieSBhZG1pbgAAAAFpAQAAAAhhY3RpdmF0ZQAAAAADBQAAAAhpc0FjdGl2ZQkBAAAADXRocm93SXNBY3RpdmUAAAAAAwkBAAAAASEAAAABCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACBQAAAAxhZG1pblB1YktleTEJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkyCQAETAAAAAIFAAAADGFkbWluUHViS2V5MwkABEwAAAACBQAAAAxhZG1TdGFydFN0b3AFAAAAA25pbAgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQEAAAAOdGhyb3dPbmx5QWRtaW4AAAAACQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAAdrQWN0aXZlBgkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABBQAAAAZrQ2F1c2UFAAAAA25pbAAAAAFpAQAAABJlbmFibGVGaXJzdEhhcnZlc3QAAAAACQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAA1rRmlyc3RIYXJ2ZXN0BgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAATa0ZpcnN0SGFydmVzdEhlaWdodAkAAGQAAAACBQAAAAtzdGFydEhlaWdodAkAAGgAAAACBQAAABVmaXJzdEhhcnZlc3RFbmRQZXJpb2QFAAAADHBlcmlvZExlbmd0aAUAAAADbmlsAAAAAWkBAAAAGXRha2VJbnRvQWNjb3VudEV4dHJhRnVuZHMAAAABAAAAC2Ftb3VudExlYXZlBAAAAAx1bmNvdW50YWJsZUEJAABlAAAAAgUAAAAZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQQUAAAAIYmFsYW5jZUEEAAAADHVuY291bnRhYmxlQgkAAGUAAAACBQAAABlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRCBQAAAAhiYWxhbmNlQgQAAAANYW1vdW50RW5yb2xsQQkAAGUAAAACBQAAAAx1bmNvdW50YWJsZUEDCQAAAAAAAAIFAAAACGFzc2V0SWRBBQAAAAR1bml0BQAAAAthbW91bnRMZWF2ZQAAAAAAAAAAAAQAAAANYW1vdW50RW5yb2xsQgkAAGUAAAACBQAAAAx1bmNvdW50YWJsZUIDCQAAAAAAAAIFAAAACGFzc2V0SWRCBQAAAAR1bml0BQAAAAthbW91bnRMZWF2ZQAAAAAAAAAAAAQAAAAMaW52YXJpYW50TmV3CQEAAAANaW52YXJpYW50Q2FsYwAAAAIJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAADWFtb3VudEVucm9sbEEJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAADWFtb3VudEVucm9sbEIDCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQEAAAAPdGhyb3dJc0luYWN0aXZlAAAAAAMJAQAAAAIhPQAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAEdGhpcwkBAAAADnRocm93T25seUFkbWluAAAAAAMJAABmAAAAAgAAAAAAAAAAAAUAAAALYW1vdW50TGVhdmUJAAACAAAAAQkAASwAAAACAgAAADNBcmd1bWVudCAnYW1vdW50TGVhdmUnIGNhbm5vdCBiZSBuZWdhdGl2ZS4gQWN0dWFsOiAJAAGkAAAAAQUAAAALYW1vdW50TGVhdmUDAwkAAGYAAAACAAAAAAAAAAAABQAAAAx1bmNvdW50YWJsZUEGCQAAZgAAAAIAAAAAAAAAAAAFAAAADHVuY291bnRhYmxlQgkBAAAAB3N1c3BlbmQAAAABAgAAABZFbnJvbGwgYW1vdW50IG5lZ2F0aXZlAwMJAABmAAAAAgAAAAAAAAAAAAUAAAANYW1vdW50RW5yb2xsQQYJAABmAAAAAgAAAAAAAAAAAAUAAAANYW1vdW50RW5yb2xsQgkAAAIAAAABAgAAABVUb28gbGFyZ2UgYW1vdW50TGVhdmUJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACmtJbnZhcmlhbnQFAAAADGludmFyaWFudE5ldwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VBCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAA1hbW91bnRFbnJvbGxBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUIJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAADWFtb3VudEVucm9sbEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgIAAAAMbGFzdF9pbmNvbWVfBQAAAAtzdHJBc3NldElkQQUAAAANYW1vdW50RW5yb2xsQQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACAgAAAAxsYXN0X2luY29tZV8FAAAAC3N0ckFzc2V0SWRCBQAAAA1hbW91bnRFbnJvbGxCBQAAAANuaWwAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAABAAAABNtdWx0aVNpZ25lZEJ5QWRtaW5zBAAAABJhZG1pblB1YktleTFTaWduZWQDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAUAAAAMYWRtaW5QdWJLZXkxAAAAAAAAAAABAAAAAAAAAAAABAAAABJhZG1pblB1YktleTJTaWduZWQDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAQUAAAAMYWRtaW5QdWJLZXkyAAAAAAAAAAABAAAAAAAAAAAABAAAABJhZG1pblB1YktleTNTaWduZWQDCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAgUAAAAMYWRtaW5QdWJLZXkzAAAAAAAAAAABAAAAAAAAAAAACQAAZwAAAAIJAABkAAAAAgkAAGQAAAACBQAAABJhZG1pblB1YktleTFTaWduZWQFAAAAEmFkbWluUHViS2V5MlNpZ25lZAUAAAASYWRtaW5QdWJLZXkzU2lnbmVkAAAAAAAAAAACBAAAAAckbWF0Y2gwBQAAAAJ0eAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EAAAAA2ludgUAAAAHJG1hdGNoMAQAAAATY2FsbFRha2VJbnRvQWNjb3VudAMJAAAAAAAAAggFAAAAA2ludgAAAARkQXBwBQAAAAR0aGlzCQAAAAAAAAIIBQAAAANpbnYAAAAIZnVuY3Rpb24CAAAAGXRha2VJbnRvQWNjb3VudEV4dHJhRnVuZHMHBAAAABZjYWxsRW5hYmxlRmlyc3RIYXJ2ZXN0AwkAAAAAAAACCAUAAAADaW52AAAABGRBcHAFAAAABHRoaXMJAAAAAAAAAggFAAAAA2ludgAAAAhmdW5jdGlvbgIAAAASZW5hYmxlRmlyc3RIYXJ2ZXN0BwQAAAALY2FsbFN0YWtpbmcDCQAAAAAAAAIIBQAAAANpbnYAAAAEZEFwcAUAAAAOc3Rha2luZ0FkZHJlc3MDAwMJAAAAAAAAAggFAAAAA2ludgAAAAhmdW5jdGlvbgIAAAAMbG9ja05ldXRyaW5vCQAAAAAAAAIJAAGQAAAAAQgFAAAAA2ludgAAAAhwYXltZW50cwAAAAAAAAAAAQcJAAAAAAAAAggJAAGRAAAAAggFAAAAA2ludgAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBQAAAARVU0ROBwYDCQAAAAAAAAIIBQAAAANpbnYAAAAIZnVuY3Rpb24CAAAADnVubG9ja05ldXRyaW5vCQAAAAAAAAIJAAGQAAAAAQgFAAAAA2ludgAAAAhwYXltZW50cwAAAAAAAAAAAAcHBAAAAA9leGNoYW5nZVRvV2F2ZXMDAwMJAAAAAAAAAggFAAAAA2ludgAAAARkQXBwBQAAABRVU0ROVG9XYXZlc0V4Y2hhbmdlcgkAAAAAAAACCAUAAAADaW52AAAACGZ1bmN0aW9uAgAAAAhleGNoYW5nZQcJAAAAAAAAAgUAAAAIYXNzZXRJZEEFAAAABFVTRE4HBgMDCQAAAAAAAAIFAAAACGFzc2V0SWRCBQAAAARVU0ROCQAAAAAAAAIJAAGQAAAAAQgFAAAAA2ludgAAAAhwYXltZW50cwAAAAAAAAAAAQcJAAAAAAAAAggJAAGRAAAAAggFAAAAA2ludgAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBQAAAARVU0ROBwQAAAANc2lnbmVkQnlBZG1pbgMDAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAFAAAADGFkbWluUHViS2V5MQYJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAABQAAAAxhZG1pblB1YktleTIGCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAUAAAAMYWRtaW5QdWJLZXkzBgkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAFAAAACmFkbVN0YWtpbmcDAwMDAwUAAAATY2FsbFRha2VJbnRvQWNjb3VudAYFAAAAFmNhbGxFbmFibGVGaXJzdEhhcnZlc3QGBQAAAAtjYWxsU3Rha2luZwYFAAAAD2V4Y2hhbmdlVG9XYXZlcwUAAAANc2lnbmVkQnlBZG1pbgcGBQAAABNtdWx0aVNpZ25lZEJ5QWRtaW5zBQAAABNtdWx0aVNpZ25lZEJ5QWRtaW5zWUVJ+A==", "height": 1660972, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Bg54gPrPTWmBqYjLao53UUUWaydtExR3AVy2bMYksQqq Next: AmArDG9swu3jX17byexjokcecfEk9dEMh83S2jkmhKJr Diff:
OldNewDifferences
2727
2828 let kCause = "shutdown_cause"
2929
30-let keyFirstHarvest = "first_harvest"
30+let kFirstHarvest = "first_harvest"
3131
32-let keyFirstHarvestHeight = "first_harvest_height"
32+let kFirstHarvestHeight = "first_harvest_height"
3333
3434 let kShareLimit = "share_limit_on_first_harvest"
3535
3939
4040 let kStartHeight = "start_height"
4141
42-let kFirstHarvestHeight = "first_harvest_height"
42+let kOracleAssetPriority = "asset_priority_"
4343
44-let keyOracleAssetPriority = "asset_priority_"
44+let kOracleScriptHash = "script_hash_flat"
4545
46-let keyOracleScriptHash = "script_hash_cpmm"
47-
48-let keyInitPoolHeight = "init_pool_height_"
46+let kInitPoolHeight = "init_pool_height_"
4947
5048 let keyAdminPubKey1 = "admin_pub_1"
5149
8583
8684 let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
8785
88-let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
89-
90-let govAddr = Address(base58'3N5W8da2iiijVieA6qLGo7KzCJj8B19smWU')
86+let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 1)
9187
9288 let stakingAddress = Address(base58'3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg')
9389
9490 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
91+
92+let SWOP = base58'2HAJrwa8q4SxBx9cHYaBTQdBjdk5wwqdof7ccpAx2uhZ'
9593
9694 let stakingFeeInUSDN = 270000
9795
188186 throw("Match error")
189187 }
190188
189+func isAllowedAsset (assetId) = match assetId {
190+ case id: ByteVector =>
191+ if ((id == USDN))
192+ then true
193+ else false
194+ case waves: Unit =>
195+ false
196+ case _ =>
197+ throw("Match error")
198+}
199+
200+
191201 let availableBalanceA = (balanceA - (if ((assetIdA == USDN))
192202 then stakedAmountUSDN
193203 else 0))
241251 else acc
242252
243253 let stepAmount = {
244- let $list70517094 = [1, 2, 3, 4, 5]
245- let $size70517094 = size($list70517094)
246- let $acc070517094 = -1
247- if (($size70517094 == 0))
248- then $acc070517094
254+ let $list71887231 = [1, 2, 3, 4, 5]
255+ let $size71887231 = size($list71887231)
256+ let $acc071887231 = -1
257+ if (($size71887231 == 0))
258+ then $acc071887231
249259 else {
250- let $acc170517094 = getStepAmount($acc070517094, $list70517094[0])
251- if (($size70517094 == 1))
252- then $acc170517094
260+ let $acc171887231 = getStepAmount($acc071887231, $list71887231[0])
261+ if (($size71887231 == 1))
262+ then $acc171887231
253263 else {
254- let $acc270517094 = getStepAmount($acc170517094, $list70517094[1])
255- if (($size70517094 == 2))
256- then $acc270517094
264+ let $acc271887231 = getStepAmount($acc171887231, $list71887231[1])
265+ if (($size71887231 == 2))
266+ then $acc271887231
257267 else {
258- let $acc370517094 = getStepAmount($acc270517094, $list70517094[2])
259- if (($size70517094 == 3))
260- then $acc370517094
268+ let $acc371887231 = getStepAmount($acc271887231, $list71887231[2])
269+ if (($size71887231 == 3))
270+ then $acc371887231
261271 else {
262- let $acc470517094 = getStepAmount($acc370517094, $list70517094[3])
263- if (($size70517094 == 4))
264- then $acc470517094
272+ let $acc471887231 = getStepAmount($acc371887231, $list71887231[3])
273+ if (($size71887231 == 4))
274+ then $acc471887231
265275 else {
266- let $acc570517094 = getStepAmount($acc470517094, $list70517094[4])
267- if (($size70517094 == 5))
268- then $acc570517094
276+ let $acc571887231 = getStepAmount($acc471887231, $list71887231[4])
277+ if (($size71887231 == 5))
278+ then $acc571887231
269279 else {
270- let $acc670517094 = getStepAmount($acc570517094, $list70517094[5])
280+ let $acc671887231 = getStepAmount($acc571887231, $list71887231[5])
271281 throw("List size exceed 5")
272282 }
273283 }
336346
337347
338348 @Callable(i)
339-func init () = {
340- let $t097709847 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
341- let pmtAmountA = $t097709847._1
342- let pmtAssetIdA = $t097709847._2
343- let $t098529929 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
344- let pmtAmountB = $t098529929._1
345- let pmtAssetIdB = $t098529929._2
346- let $t0993410011 = getAssetInfo(pmtAssetIdA)
347- let pmtStrAssetIdA = $t0993410011._1
348- let pmtAssetNameA = $t0993410011._2
349- let pmtDecimalsA = $t0993410011._3
350- let $t01001610093 = getAssetInfo(pmtAssetIdB)
351- let pmtStrAssetIdB = $t01001610093._1
352- let pmtAssetNameB = $t01001610093._2
353- let pmtDecimalsB = $t01001610093._3
354- if (isDefined(getBoolean(this, kActive)))
355- then throwIsActive()
356- else if ((pmtAssetIdA == pmtAssetIdB))
357- then throw("Assets must be different")
358- else {
359- let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
360- let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
361- let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
362- let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
363- let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
364- let shareIssueId = calculateAssetId(shareIssue)
365- let invariantCalculated = invariantCalc(pmtAmountA, pmtAmountB)
366-[StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceA, pmtAmountA), IntegerEntry(kBalanceB, pmtAmountB), IntegerEntry(kInvariant, invariantCalculated), IntegerEntry(kFee, fee), IntegerEntry(kFeeScaleDelimiter, feeScale6), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
367- }
349+func init (userAdressStr) = {
350+ let $t0992810005 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
351+ let pmtAmount1 = $t0992810005._1
352+ let pmtAssetId1 = $t0992810005._2
353+ let $t01001010087 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
354+ let pmtAmount2 = $t01001010087._1
355+ let pmtAssetId2 = $t01001010087._2
356+ let $t01009210175 = $Tuple2(i.payments[2].amount, i.payments[2].assetId)
357+ let pmtAmountSWOP = $t01009210175._1
358+ let pmtAssetIdSWOP = $t01009210175._2
359+ let check = isDataStorageUntouched(this)
360+ let userScriptHash = scriptHash(this)
361+ let userAddress = addressFromStringValue(userAdressStr)
362+ if ((i.caller == this))
363+ then throw("You can't call yourself")
364+ else if (if ((pmtAssetIdSWOP != SWOP))
365+ then true
366+ else (pmtAmountSWOP != comissionForInitalization))
367+ then throw("You need to attach 10 SWOP tokens")
368+ else if (if (!(isAllowedAsset(pmtAssetId1)))
369+ then !(isAllowedAsset(pmtAssetId2))
370+ else false)
371+ then throw("One of assets must be USDN, WAVES or SWOP")
372+ else if (if ((userScriptHash == value(getBinary(oracle, kOracleScriptHash))))
373+ then true
374+ else !(check))
375+ then throw("Unexpected script was found.")
376+ else if (isDefined(getBoolean(this, kActive)))
377+ then throwIsActive()
378+ else if ((pmtAssetId1 == pmtAssetId2))
379+ then throw("Assets must be different")
380+ else {
381+ let pmtStrAssetId1 = match pmtAssetId1 {
382+ case id: ByteVector =>
383+ toBase58String(id)
384+ case waves: Unit =>
385+ "WAVES"
386+ case _ =>
387+ throw("Match error")
388+ }
389+ let pmtStrAssetId2 = match pmtAssetId2 {
390+ case id: ByteVector =>
391+ toBase58String(id)
392+ case waves: Unit =>
393+ "WAVES"
394+ case _ =>
395+ throw("Match error")
396+ }
397+ let asset1Priority = valueOrElse(getInteger(oracle, (kOracleAssetPriority + pmtStrAssetId1)), 999999)
398+ let asset2Priority = valueOrElse(getInteger(oracle, (kOracleAssetPriority + pmtStrAssetId2)), 999999)
399+ let $t01150911736 = if ((asset2Priority > asset1Priority))
400+ then $Tuple4(pmtAmount2, pmtAssetId2, pmtAmount1, pmtAssetId1)
401+ else $Tuple4(pmtAmount1, pmtAssetId1, pmtAmount2, pmtAssetId2)
402+ let pmtAmountA = $t01150911736._1
403+ let pmtAssetIdA = $t01150911736._2
404+ let pmtAmountB = $t01150911736._3
405+ let pmtAssetIdB = $t01150911736._4
406+ let $t01174511822 = getAssetInfo(pmtAssetIdA)
407+ let pmtStrAssetIdA = $t01174511822._1
408+ let pmtAssetNameA = $t01174511822._2
409+ let pmtDecimalsA = $t01174511822._3
410+ let $t01183111908 = getAssetInfo(pmtAssetIdB)
411+ let pmtStrAssetIdB = $t01183111908._1
412+ let pmtAssetNameB = $t01183111908._2
413+ let pmtDecimalsB = $t01183111908._3
414+ let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
415+ let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
416+ let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
417+ let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
418+ let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
419+ let shareIssueId = calculateAssetId(shareIssue)
420+ let invariantCalculated = invariantCalc(pmtAmountA, pmtAmountB)
421+[StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceA, pmtAmountA), IntegerEntry(kBalanceB, pmtAmountB), IntegerEntry(kInvariant, invariantCalculated), IntegerEntry(kFee, fee), IntegerEntry(kFeeScaleDelimiter, feeScale6), IntegerEntry(kInitPoolHeight, height), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply), ScriptTransfer(userAddress, shareInitialSupply, shareIssueId), ScriptTransfer(walletAddress, comissionForInitalization, SWOP)]
422+ }
368423 }
369424
370425
416471
417472 @Callable(i)
418473 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = {
419- let $t01481214887 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
420- let pmtAmount = $t01481214887._1
421- let pmtAssetId = $t01481214887._2
474+ let $t01658616661 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
475+ let pmtAmount = $t01658616661._1
476+ let pmtAssetId = $t01658616661._2
422477 let pmtMinThreshold = 5000000
423478 let thresholdValueForMinTolerance = 50000000
424479 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
440495 else false)
441496 then throwAssets()
442497 else {
443- let $t01589916664 = if ((pmtAssetId == assetIdA))
498+ let $t01767318438 = if ((pmtAssetId == assetIdA))
444499 then $Tuple7((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), invariantCalc((balanceA + pmtAmount), balanceB), (balanceA + pmtAmount), balanceB)
445500 else $Tuple7(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), invariantCalc(balanceA, (balanceB + pmtAmount)), balanceA, (balanceB + pmtAmount))
446- let virtualReplenishA = $t01589916664._1
447- let virtualReplenishB = $t01589916664._2
448- let balanceAfterSwapA = $t01589916664._3
449- let balanceAfterSwapB = $t01589916664._4
450- let invariantCalculated = $t01589916664._5
451- let newBalanceA = $t01589916664._6
452- let newBalanceB = $t01589916664._7
501+ let virtualReplenishA = $t01767318438._1
502+ let virtualReplenishB = $t01767318438._2
503+ let balanceAfterSwapA = $t01767318438._3
504+ let balanceAfterSwapB = $t01767318438._4
505+ let invariantCalculated = $t01767318438._5
506+ let newBalanceA = $t01767318438._6
507+ let newBalanceB = $t01767318438._7
453508 let newBalanceEntry = if ((pmtAssetId == assetIdA))
454509 then IntegerEntry(kBalanceA, newBalanceA)
455510 else IntegerEntry(kBalanceB, newBalanceB)
482537
483538 @Callable(i)
484539 func withdraw () = {
485- let $t01880918952 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
486- let pmtAmount = $t01880918952._1
487- let pmtAssetId = $t01880918952._2
540+ let $t02058320726 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
541+ let pmtAmount = $t02058320726._1
542+ let pmtAssetId = $t02058320726._2
488543 let amountToPayA = deductStakingFee(fraction(pmtAmount, balanceA, shareAssetSupply), assetIdA)
489544 let amountToPayB = deductStakingFee(fraction(pmtAmount, balanceB, shareAssetSupply), assetIdB)
490545 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
507562
508563 @Callable(i)
509564 func exchange (estimatedAmountToReceive,minAmountToReceive) = {
510- let $t02031020385 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
511- let pmtAmount = $t02031020385._1
512- let pmtAssetId = $t02031020385._2
565+ let $t02208422159 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
566+ let pmtAmount = $t02208422159._1
567+ let pmtAssetId = $t02208422159._2
513568 if (!(isActive))
514569 then throwIsInactive()
515570 else if ((0 >= estimatedAmountToReceive))
537592 let amount = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
538593 let governanceReward = fraction(amount, feeGovernance, feeScale6)
539594 let amountMinusFee = fraction(amount, (feeScale6 - fee), feeScale6)
540- let $t02180722069 = if ((pmtAssetId == assetIdA))
595+ let $t02358123843 = if ((pmtAssetId == assetIdA))
541596 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
542597 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
543- let newBalanceA = $t02180722069._1
544- let newBalanceB = $t02180722069._2
598+ let newBalanceA = $t02358123843._1
599+ let newBalanceB = $t02358123843._2
545600 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
546601 if (if ((dAppThresholdAmount > newBalanceA))
547602 then true
559614 then (stakedAmountUSDN >= newBalanceB)
560615 else false)
561616 then throwInsufficientAvailableBalance(amountMinusFee, availableBalanceB, assetNameB)
562- else [IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, invariantCalc(newBalanceA, newBalanceB)), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(govAddr, governanceReward, sendAssetId)]
617+ else [IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, invariantCalc(newBalanceA, newBalanceB)), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(walletAddress, governanceReward, sendAssetId)]
563618 }
564619 }
565620
584639
585640
586641 @Callable(i)
587-func enableFirstHarvest () = [BooleanEntry(keyFirstHarvest, true), IntegerEntry(keyFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))]
642+func enableFirstHarvest () = [BooleanEntry(kFirstHarvest, true), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))]
588643
589644
590645
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let version = "2.0.0"
55
66 let kVersion = "version"
77
88 let kActive = "active"
99
1010 let kAssetIdA = "A_asset_id"
1111
1212 let kAssetIdB = "B_asset_id"
1313
1414 let kBalanceA = "A_asset_balance"
1515
1616 let kBalanceB = "B_asset_balance"
1717
1818 let kShareAssetId = "share_asset_id"
1919
2020 let kShareAssetSupply = "share_asset_supply"
2121
2222 let kFee = "commission"
2323
2424 let kFeeScaleDelimiter = "commission_scale_delimiter"
2525
2626 let kInvariant = "invariant"
2727
2828 let kCause = "shutdown_cause"
2929
30-let keyFirstHarvest = "first_harvest"
30+let kFirstHarvest = "first_harvest"
3131
32-let keyFirstHarvestHeight = "first_harvest_height"
32+let kFirstHarvestHeight = "first_harvest_height"
3333
3434 let kShareLimit = "share_limit_on_first_harvest"
3535
3636 let kBasePeriod = "base_period"
3737
3838 let kPeriodLength = "period_length"
3939
4040 let kStartHeight = "start_height"
4141
42-let kFirstHarvestHeight = "first_harvest_height"
42+let kOracleAssetPriority = "asset_priority_"
4343
44-let keyOracleAssetPriority = "asset_priority_"
44+let kOracleScriptHash = "script_hash_flat"
4545
46-let keyOracleScriptHash = "script_hash_cpmm"
47-
48-let keyInitPoolHeight = "init_pool_height_"
46+let kInitPoolHeight = "init_pool_height_"
4947
5048 let keyAdminPubKey1 = "admin_pub_1"
5149
5250 let keyAdminPubKey2 = "admin_pub_2"
5351
5452 let keyAdminPubKey3 = "admin_pub_3"
5553
5654 let USDNToWavesExchanger = Address(base58'3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37')
5755
5856 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
5957
6058 let walletAddress = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
6159
6260 let votingAddress = Address(base58'3MrJgdL1GniipErHy44YF9idzLaUL2iX5DQ')
6361
6462 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
6563 case string: String =>
6664 fromBase58String(string)
6765 case nothing =>
6866 throw("Admin public key is empty")
6967 }
7068
7169
7270 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
7371
7472 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
7573
7674 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
7775
7876 let admStartStop = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
7977
8078 let admStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
8179
8280 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
8381
8482 let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
8583
8684 let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
8785
88-let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 3)
89-
90-let govAddr = Address(base58'3N5W8da2iiijVieA6qLGo7KzCJj8B19smWU')
86+let firstHarvestEndPeriod = ((basePeriod + ((height - startHeight) / periodLength)) + 1)
9187
9288 let stakingAddress = Address(base58'3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg')
9389
9490 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
91+
92+let SWOP = base58'2HAJrwa8q4SxBx9cHYaBTQdBjdk5wwqdof7ccpAx2uhZ'
9593
9694 let stakingFeeInUSDN = 270000
9795
9896 let isActive = getBooleanValue(this, kActive)
9997
10098 let strAssetIdA = getStringValue(this, kAssetIdA)
10199
102100 let strAssetIdB = getStringValue(this, kAssetIdB)
103101
104102 let assetIdA = if ((strAssetIdA == "WAVES"))
105103 then unit
106104 else fromBase58String(strAssetIdA)
107105
108106 let assetIdB = if ((strAssetIdB == "WAVES"))
109107 then unit
110108 else fromBase58String(strAssetIdB)
111109
112110 let assetNameA = match assetIdA {
113111 case id: ByteVector =>
114112 value(assetInfo(id)).name
115113 case waves: Unit =>
116114 "WAVES"
117115 case _ =>
118116 throw("Match error")
119117 }
120118
121119 let assetNameB = match assetIdB {
122120 case id: ByteVector =>
123121 value(assetInfo(id)).name
124122 case waves: Unit =>
125123 "WAVES"
126124 case _ =>
127125 throw("Match error")
128126 }
129127
130128 let balanceA = getIntegerValue(this, kBalanceA)
131129
132130 let balanceB = getIntegerValue(this, kBalanceB)
133131
134132 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
135133
136134 let shareAssetSupply = getIntegerValue(this, kShareAssetSupply)
137135
138136 let invariant = getIntegerValue(this, kInvariant)
139137
140138 let fee = 500
141139
142140 let feeGovernance = 200
143141
144142 let feeScale6 = 1000000
145143
146144 let comissionForInitalization = 1000000000
147145
148146 let scale3 = 1000
149147
150148 let scale8 = 100000000
151149
152150 let scale12 = 1000000000000
153151
154152 let slippageScale3 = 1000
155153
156154 let digits8 = 8
157155
158156 let dAppThreshold = 50
159157
160158 let dAppThresholdScale2 = 100
161159
162160 let exchangeRatioLimitMin = 90000000
163161
164162 let exchangeRatioLimitMax = 110000000
165163
166164 let alpha = 50
167165
168166 let alphaDigits = 2
169167
170168 let beta = 46000000
171169
172170 func accountBalance (assetId) = match assetId {
173171 case id: ByteVector =>
174172 assetBalance(this, id)
175173 case waves: Unit =>
176174 wavesBalance(this).available
177175 case _ =>
178176 throw("Match error")
179177 }
180178
181179
182180 let stakedAmountUSDN = match getInteger(stakingAddress, ((("rpd_balance_" + toBase58String(USDN)) + "_") + toString(this))) {
183181 case staked: Int =>
184182 staked
185183 case nothing: Unit =>
186184 0
187185 case _ =>
188186 throw("Match error")
189187 }
190188
189+func isAllowedAsset (assetId) = match assetId {
190+ case id: ByteVector =>
191+ if ((id == USDN))
192+ then true
193+ else false
194+ case waves: Unit =>
195+ false
196+ case _ =>
197+ throw("Match error")
198+}
199+
200+
191201 let availableBalanceA = (balanceA - (if ((assetIdA == USDN))
192202 then stakedAmountUSDN
193203 else 0))
194204
195205 let availableBalanceB = (balanceB - (if ((assetIdB == USDN))
196206 then stakedAmountUSDN
197207 else 0))
198208
199209 let accountBalanceWithStakedA = (accountBalance(assetIdA) + (if ((assetIdA == USDN))
200210 then stakedAmountUSDN
201211 else 0))
202212
203213 let accountBalanceWithStakedB = (accountBalance(assetIdB) + (if ((assetIdB == USDN))
204214 then stakedAmountUSDN
205215 else 0))
206216
207217 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
208218 then (accountBalanceWithStakedB >= balanceB)
209219 else false
210220
211221 func skewness (x,y) = (((fraction(scale12, x, y) + fraction(scale12, y, x)) / 2) / 10000)
212222
213223
214224 func invariantCalc (x,y) = {
215225 let sk = skewness(x, y)
216226 (fraction((x + y), scale8, pow(sk, digits8, alpha, alphaDigits, digits8, CEILING)) + (2 * fraction(pow(fraction(x, y, scale8), 0, 5, 1, (digits8 / 2), DOWN), pow((sk - beta), digits8, alpha, alphaDigits, digits8, DOWN), scale8)))
217227 }
218228
219229
220230 func calculateSendAmount (amountToSendEstimated,minTokenReceiveAmount,tokenReceiveAmount,tokenId) = {
221231 let slippageValue = (scale8 - ((scale8 * 1) / 10000000))
222232 let deltaBetweenMaxAndMinSendValue = (amountToSendEstimated - minTokenReceiveAmount)
223233 let x = (balanceA + tokenReceiveAmount)
224234 let y = (balanceB + tokenReceiveAmount)
225235 let invariantNew = if ((tokenId == assetIdA))
226236 then invariantCalc(x, (balanceB - amountToSendEstimated))
227237 else if ((tokenId == assetIdB))
228238 then invariantCalc((balanceA - amountToSendEstimated), y)
229239 else throw("Wrong asset in payment")
230240 let invariantEstimatedRatio = fraction(scale8, invariant, invariantNew)
231241 func getStepAmount (acc,step) = if ((acc == -1))
232242 then {
233243 let amountToSend = (amountToSendEstimated - ((step * deltaBetweenMaxAndMinSendValue) / 5))
234244 let stepInvariant = if ((tokenId == assetIdA))
235245 then invariantCalc(x, (balanceB - amountToSend))
236246 else invariantCalc((balanceA - amountToSend), y)
237247 if ((stepInvariant > invariant))
238248 then amountToSend
239249 else -1
240250 }
241251 else acc
242252
243253 let stepAmount = {
244- let $list70517094 = [1, 2, 3, 4, 5]
245- let $size70517094 = size($list70517094)
246- let $acc070517094 = -1
247- if (($size70517094 == 0))
248- then $acc070517094
254+ let $list71887231 = [1, 2, 3, 4, 5]
255+ let $size71887231 = size($list71887231)
256+ let $acc071887231 = -1
257+ if (($size71887231 == 0))
258+ then $acc071887231
249259 else {
250- let $acc170517094 = getStepAmount($acc070517094, $list70517094[0])
251- if (($size70517094 == 1))
252- then $acc170517094
260+ let $acc171887231 = getStepAmount($acc071887231, $list71887231[0])
261+ if (($size71887231 == 1))
262+ then $acc171887231
253263 else {
254- let $acc270517094 = getStepAmount($acc170517094, $list70517094[1])
255- if (($size70517094 == 2))
256- then $acc270517094
264+ let $acc271887231 = getStepAmount($acc171887231, $list71887231[1])
265+ if (($size71887231 == 2))
266+ then $acc271887231
257267 else {
258- let $acc370517094 = getStepAmount($acc270517094, $list70517094[2])
259- if (($size70517094 == 3))
260- then $acc370517094
268+ let $acc371887231 = getStepAmount($acc271887231, $list71887231[2])
269+ if (($size71887231 == 3))
270+ then $acc371887231
261271 else {
262- let $acc470517094 = getStepAmount($acc370517094, $list70517094[3])
263- if (($size70517094 == 4))
264- then $acc470517094
272+ let $acc471887231 = getStepAmount($acc371887231, $list71887231[3])
273+ if (($size71887231 == 4))
274+ then $acc471887231
265275 else {
266- let $acc570517094 = getStepAmount($acc470517094, $list70517094[4])
267- if (($size70517094 == 5))
268- then $acc570517094
276+ let $acc571887231 = getStepAmount($acc471887231, $list71887231[4])
277+ if (($size71887231 == 5))
278+ then $acc571887231
269279 else {
270- let $acc670517094 = getStepAmount($acc570517094, $list70517094[5])
280+ let $acc671887231 = getStepAmount($acc571887231, $list71887231[5])
271281 throw("List size exceed 5")
272282 }
273283 }
274284 }
275285 }
276286 }
277287 }
278288 }
279289 if ((0 > stepAmount))
280290 then throw("something went wrong while working with amountToSend")
281291 else if (if ((invariantEstimatedRatio > slippageValue))
282292 then (invariantNew > invariant)
283293 else false)
284294 then amountToSendEstimated
285295 else stepAmount
286296 }
287297
288298
289299 func getAssetInfo (assetId) = match assetId {
290300 case id: ByteVector =>
291301 let stringId = toBase58String(id)
292302 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
293303 $Tuple3(stringId, info.name, info.decimals)
294304 case waves: Unit =>
295305 $Tuple3("WAVES", "WAVES", 8)
296306 case _ =>
297307 throw("Match error")
298308 }
299309
300310
301311 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
302312
303313
304314 func deductStakingFee (amount,assetId) = if ((assetId == USDN))
305315 then {
306316 let result = (amount - stakingFeeInUSDN)
307317 if ((0 >= result))
308318 then throw((((("Insufficient amount " + toString(amount)) + " to deduct staking fee ") + toString(stakingFeeInUSDN)) + " USD-N"))
309319 else result
310320 }
311321 else amount
312322
313323
314324 func throwIsActive () = throw("DApp is already active")
315325
316326
317327 func throwIsInactive () = throw("DApp is inactive at this moment")
318328
319329
320330 func throwOnlyAdmin () = throw("Only admin can call this function")
321331
322332
323333 func throwAssets () = throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
324334
325335
326336 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))
327337
328338
329339 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"))
330340
331341
332342 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"))
333343
334344
335345 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
336346
337347
338348 @Callable(i)
339-func init () = {
340- let $t097709847 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
341- let pmtAmountA = $t097709847._1
342- let pmtAssetIdA = $t097709847._2
343- let $t098529929 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
344- let pmtAmountB = $t098529929._1
345- let pmtAssetIdB = $t098529929._2
346- let $t0993410011 = getAssetInfo(pmtAssetIdA)
347- let pmtStrAssetIdA = $t0993410011._1
348- let pmtAssetNameA = $t0993410011._2
349- let pmtDecimalsA = $t0993410011._3
350- let $t01001610093 = getAssetInfo(pmtAssetIdB)
351- let pmtStrAssetIdB = $t01001610093._1
352- let pmtAssetNameB = $t01001610093._2
353- let pmtDecimalsB = $t01001610093._3
354- if (isDefined(getBoolean(this, kActive)))
355- then throwIsActive()
356- else if ((pmtAssetIdA == pmtAssetIdB))
357- then throw("Assets must be different")
358- else {
359- let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
360- let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
361- let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
362- let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
363- let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
364- let shareIssueId = calculateAssetId(shareIssue)
365- let invariantCalculated = invariantCalc(pmtAmountA, pmtAmountB)
366-[StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceA, pmtAmountA), IntegerEntry(kBalanceB, pmtAmountB), IntegerEntry(kInvariant, invariantCalculated), IntegerEntry(kFee, fee), IntegerEntry(kFeeScaleDelimiter, feeScale6), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
367- }
349+func init (userAdressStr) = {
350+ let $t0992810005 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
351+ let pmtAmount1 = $t0992810005._1
352+ let pmtAssetId1 = $t0992810005._2
353+ let $t01001010087 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
354+ let pmtAmount2 = $t01001010087._1
355+ let pmtAssetId2 = $t01001010087._2
356+ let $t01009210175 = $Tuple2(i.payments[2].amount, i.payments[2].assetId)
357+ let pmtAmountSWOP = $t01009210175._1
358+ let pmtAssetIdSWOP = $t01009210175._2
359+ let check = isDataStorageUntouched(this)
360+ let userScriptHash = scriptHash(this)
361+ let userAddress = addressFromStringValue(userAdressStr)
362+ if ((i.caller == this))
363+ then throw("You can't call yourself")
364+ else if (if ((pmtAssetIdSWOP != SWOP))
365+ then true
366+ else (pmtAmountSWOP != comissionForInitalization))
367+ then throw("You need to attach 10 SWOP tokens")
368+ else if (if (!(isAllowedAsset(pmtAssetId1)))
369+ then !(isAllowedAsset(pmtAssetId2))
370+ else false)
371+ then throw("One of assets must be USDN, WAVES or SWOP")
372+ else if (if ((userScriptHash == value(getBinary(oracle, kOracleScriptHash))))
373+ then true
374+ else !(check))
375+ then throw("Unexpected script was found.")
376+ else if (isDefined(getBoolean(this, kActive)))
377+ then throwIsActive()
378+ else if ((pmtAssetId1 == pmtAssetId2))
379+ then throw("Assets must be different")
380+ else {
381+ let pmtStrAssetId1 = match pmtAssetId1 {
382+ case id: ByteVector =>
383+ toBase58String(id)
384+ case waves: Unit =>
385+ "WAVES"
386+ case _ =>
387+ throw("Match error")
388+ }
389+ let pmtStrAssetId2 = match pmtAssetId2 {
390+ case id: ByteVector =>
391+ toBase58String(id)
392+ case waves: Unit =>
393+ "WAVES"
394+ case _ =>
395+ throw("Match error")
396+ }
397+ let asset1Priority = valueOrElse(getInteger(oracle, (kOracleAssetPriority + pmtStrAssetId1)), 999999)
398+ let asset2Priority = valueOrElse(getInteger(oracle, (kOracleAssetPriority + pmtStrAssetId2)), 999999)
399+ let $t01150911736 = if ((asset2Priority > asset1Priority))
400+ then $Tuple4(pmtAmount2, pmtAssetId2, pmtAmount1, pmtAssetId1)
401+ else $Tuple4(pmtAmount1, pmtAssetId1, pmtAmount2, pmtAssetId2)
402+ let pmtAmountA = $t01150911736._1
403+ let pmtAssetIdA = $t01150911736._2
404+ let pmtAmountB = $t01150911736._3
405+ let pmtAssetIdB = $t01150911736._4
406+ let $t01174511822 = getAssetInfo(pmtAssetIdA)
407+ let pmtStrAssetIdA = $t01174511822._1
408+ let pmtAssetNameA = $t01174511822._2
409+ let pmtDecimalsA = $t01174511822._3
410+ let $t01183111908 = getAssetInfo(pmtAssetIdB)
411+ let pmtStrAssetIdB = $t01183111908._1
412+ let pmtAssetNameB = $t01183111908._2
413+ let pmtDecimalsB = $t01183111908._3
414+ let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
415+ let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
416+ let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
417+ let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
418+ let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
419+ let shareIssueId = calculateAssetId(shareIssue)
420+ let invariantCalculated = invariantCalc(pmtAmountA, pmtAmountB)
421+[StringEntry(kVersion, version), BooleanEntry(kActive, true), StringEntry(kAssetIdA, pmtStrAssetIdA), StringEntry(kAssetIdB, pmtStrAssetIdB), IntegerEntry(kBalanceA, pmtAmountA), IntegerEntry(kBalanceB, pmtAmountB), IntegerEntry(kInvariant, invariantCalculated), IntegerEntry(kFee, fee), IntegerEntry(kFeeScaleDelimiter, feeScale6), IntegerEntry(kInitPoolHeight, height), shareIssue, StringEntry(kShareAssetId, toBase58String(shareIssueId)), IntegerEntry(kShareAssetSupply, shareInitialSupply), ScriptTransfer(userAddress, shareInitialSupply, shareIssueId), ScriptTransfer(walletAddress, comissionForInitalization, SWOP)]
422+ }
368423 }
369424
370425
371426
372427 @Callable(i)
373428 func keepLimitForFirstHarvest (shareLimit) = if (!(isActive))
374429 then throw("DApp is inactive at this moment")
375430 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, admStaking], i.callerPublicKey)))
376431 then throw("Only admin can call this function")
377432 else [IntegerEntry(kShareLimit, shareLimit)]
378433
379434
380435
381436 @Callable(i)
382437 func replenishWithTwoTokens (slippageTolerance) = {
383438 let pmtAssetIdA = i.payments[0].assetId
384439 let pmtAssetIdB = i.payments[1].assetId
385440 let pmtAmountA = deductStakingFee(i.payments[0].amount, pmtAssetIdA)
386441 let pmtAmountB = deductStakingFee(i.payments[1].amount, pmtAssetIdB)
387442 let tokenRatio = fraction(fraction(scale8, balanceA, pmtAmountA), scale3, fraction(scale8, balanceB, pmtAmountB))
388443 let ratioShareTokensInA = fraction(scale8, pmtAmountA, balanceA)
389444 let ratioShareTokensInB = fraction(scale8, pmtAmountB, balanceB)
390445 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
391446 let invariantCalculated = invariantCalc((balanceA + pmtAmountA), (balanceB + pmtAmountB))
392447 if (!(isActive))
393448 then throwIsInactive()
394449 else if (if ((0 > slippageTolerance))
395450 then true
396451 else (slippageTolerance > 10))
397452 then throw("Slippage tolerance must be <= 1%")
398453 else if ((size(i.payments) != 2))
399454 then throw("Two attached assets expected")
400455 else if (if ((pmtAssetIdA != assetIdA))
401456 then true
402457 else (pmtAssetIdB != assetIdB))
403458 then throwAssets()
404459 else if (if ((((scale3 * (slippageScale3 - slippageTolerance)) / slippageScale3) > tokenRatio))
405460 then true
406461 else (tokenRatio > ((scale3 * (slippageScale3 + slippageTolerance)) / slippageScale3)))
407462 then throw("Incorrect assets amount: amounts must have the contract ratio")
408463 else if ((shareTokenToPayAmount == 0))
409464 then throw("Too small amount to replenish")
410465 else if (!(hasEnoughBalance))
411466 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
412467 else [IntegerEntry(kBalanceA, (balanceA + pmtAmountA)), IntegerEntry(kBalanceB, (balanceB + pmtAmountB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), IntegerEntry(kInvariant, invariantCalculated), Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
413468 }
414469
415470
416471
417472 @Callable(i)
418473 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = {
419- let $t01481214887 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
420- let pmtAmount = $t01481214887._1
421- let pmtAssetId = $t01481214887._2
474+ let $t01658616661 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
475+ let pmtAmount = $t01658616661._1
476+ let pmtAssetId = $t01658616661._2
422477 let pmtMinThreshold = 5000000
423478 let thresholdValueForMinTolerance = 50000000
424479 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
425480 then 100000
426481 else 1
427482 let slippageValueMinForReplenish = (scale8 - ((scale8 * tolerance) / 10000000))
428483 let slippageValueMaxForReplenish = (scale8 + ((scale8 * tolerance) / 10000000))
429484 let slippageValueMinForSwap = (scale8 - ((scale8 * 1) / 10000000))
430485 if (!(isActive))
431486 then throwIsInactive()
432487 else if ((pmtMinThreshold > pmtAmount))
433488 then throw((((("Payment amount " + toString(pmtAmount)) + " does not exceed the minimum amount of ") + toString(pmtMinThreshold)) + " tokens"))
434489 else if ((size(i.payments) != 1))
435490 then throw("One attached payment expected")
436491 else if (!(hasEnoughBalance))
437492 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
438493 else if (if ((pmtAssetId != assetIdA))
439494 then (pmtAssetId != assetIdB)
440495 else false)
441496 then throwAssets()
442497 else {
443- let $t01589916664 = if ((pmtAssetId == assetIdA))
498+ let $t01767318438 = if ((pmtAssetId == assetIdA))
444499 then $Tuple7((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), invariantCalc((balanceA + pmtAmount), balanceB), (balanceA + pmtAmount), balanceB)
445500 else $Tuple7(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), invariantCalc(balanceA, (balanceB + pmtAmount)), balanceA, (balanceB + pmtAmount))
446- let virtualReplenishA = $t01589916664._1
447- let virtualReplenishB = $t01589916664._2
448- let balanceAfterSwapA = $t01589916664._3
449- let balanceAfterSwapB = $t01589916664._4
450- let invariantCalculated = $t01589916664._5
451- let newBalanceA = $t01589916664._6
452- let newBalanceB = $t01589916664._7
501+ let virtualReplenishA = $t01767318438._1
502+ let virtualReplenishB = $t01767318438._2
503+ let balanceAfterSwapA = $t01767318438._3
504+ let balanceAfterSwapB = $t01767318438._4
505+ let invariantCalculated = $t01767318438._5
506+ let newBalanceA = $t01767318438._6
507+ let newBalanceB = $t01767318438._7
453508 let newBalanceEntry = if ((pmtAssetId == assetIdA))
454509 then IntegerEntry(kBalanceA, newBalanceA)
455510 else IntegerEntry(kBalanceB, newBalanceB)
456511 let invariantNew = invariantCalc(balanceAfterSwapA, balanceAfterSwapB)
457512 let invariantEstimatedRatio = fraction(scale8, invariant, invariantNew)
458513 let ratioVirtualBalanceToVirtualReplenish = (fraction((scale8 * scale8), balanceAfterSwapA, balanceAfterSwapB) / fraction(scale8, virtualReplenishA, virtualReplenishB))
459514 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
460515 if (if ((slippageValueMinForSwap >= invariantEstimatedRatio))
461516 then true
462517 else (invariant > invariantNew))
463518 then throw("Incorrect virtualSwapTokenPay or virtualSwapTokenGet value")
464519 else if (if ((slippageValueMinForReplenish > ratioVirtualBalanceToVirtualReplenish))
465520 then true
466521 else (ratioVirtualBalanceToVirtualReplenish > slippageValueMaxForReplenish))
467522 then throw("Swap with virtualSwapTokenPay and virtualSwapTokenGet is possible, but ratio after virtual swap is incorrect")
468523 else if (if ((dAppThresholdAmount > newBalanceA))
469524 then true
470525 else (dAppThresholdAmount > newBalanceB))
471526 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
472527 else {
473528 let ratioShareTokensInA = fraction(deductStakingFee(virtualReplenishA, assetIdA), scale8, balanceAfterSwapA)
474529 let ratioShareTokensInB = fraction(deductStakingFee(virtualReplenishB, assetIdB), scale8, balanceAfterSwapB)
475530 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
476531 [Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), newBalanceEntry, IntegerEntry(kInvariant, invariantCalculated)]
477532 }
478533 }
479534 }
480535
481536
482537
483538 @Callable(i)
484539 func withdraw () = {
485- let $t01880918952 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
486- let pmtAmount = $t01880918952._1
487- let pmtAssetId = $t01880918952._2
540+ let $t02058320726 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
541+ let pmtAmount = $t02058320726._1
542+ let pmtAssetId = $t02058320726._2
488543 let amountToPayA = deductStakingFee(fraction(pmtAmount, balanceA, shareAssetSupply), assetIdA)
489544 let amountToPayB = deductStakingFee(fraction(pmtAmount, balanceB, shareAssetSupply), assetIdB)
490545 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
491546 if (!(isActive))
492547 then throwIsInactive()
493548 else if ((size(i.payments) != 1))
494549 then throw("One attached payment expected")
495550 else if ((pmtAssetId != shareAssetId))
496551 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
497552 else if (!(hasEnoughBalance))
498553 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
499554 else if (if ((amountToPayA > availableBalanceA))
500555 then true
501556 else (amountToPayB > availableBalanceB))
502557 then throwInsufficientAvailableBalances(amountToPayA, amountToPayB)
503558 else [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)]
504559 }
505560
506561
507562
508563 @Callable(i)
509564 func exchange (estimatedAmountToReceive,minAmountToReceive) = {
510- let $t02031020385 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
511- let pmtAmount = $t02031020385._1
512- let pmtAssetId = $t02031020385._2
565+ let $t02208422159 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
566+ let pmtAmount = $t02208422159._1
567+ let pmtAssetId = $t02208422159._2
513568 if (!(isActive))
514569 then throwIsInactive()
515570 else if ((0 >= estimatedAmountToReceive))
516571 then throw(("Estimated amount must be positive. Actual: " + toString(estimatedAmountToReceive)))
517572 else if ((minAmountToReceive > estimatedAmountToReceive))
518573 then throw(((("Minimal amount can't be greater than estimated. Estimated: " + toString(estimatedAmountToReceive)) + ". Minimal: ") + toString(minAmountToReceive)))
519574 else if ((size(i.payments) != 1))
520575 then throw("One attached payment expected")
521576 else if (!(hasEnoughBalance))
522577 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
523578 else if (if ((pmtAssetId != assetIdA))
524579 then (pmtAssetId != assetIdB)
525580 else false)
526581 then throwAssets()
527582 else if ((10000000 > pmtAmount))
528583 then throw("Only swap of 10.000000 or more tokens is allowed")
529584 else if (if ((exchangeRatioLimitMin > fraction(scale8, minAmountToReceive, pmtAmount)))
530585 then true
531586 else (fraction(scale8, estimatedAmountToReceive, pmtAmount) > exchangeRatioLimitMax))
532587 then throw("Incorrect args and pmt ratio")
533588 else {
534589 let sendAssetId = if ((pmtAssetId == assetIdA))
535590 then assetIdB
536591 else assetIdA
537592 let amount = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
538593 let governanceReward = fraction(amount, feeGovernance, feeScale6)
539594 let amountMinusFee = fraction(amount, (feeScale6 - fee), feeScale6)
540- let $t02180722069 = if ((pmtAssetId == assetIdA))
595+ let $t02358123843 = if ((pmtAssetId == assetIdA))
541596 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
542597 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
543- let newBalanceA = $t02180722069._1
544- let newBalanceB = $t02180722069._2
598+ let newBalanceA = $t02358123843._1
599+ let newBalanceB = $t02358123843._2
545600 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
546601 if (if ((dAppThresholdAmount > newBalanceA))
547602 then true
548603 else (dAppThresholdAmount > newBalanceB))
549604 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
550605 else if (if (if ((assetIdA == USDN))
551606 then (sendAssetId == assetIdA)
552607 else false)
553608 then (stakedAmountUSDN >= newBalanceA)
554609 else false)
555610 then throwInsufficientAvailableBalance(amountMinusFee, availableBalanceA, assetNameA)
556611 else if (if (if ((assetIdB == USDN))
557612 then (sendAssetId == assetIdB)
558613 else false)
559614 then (stakedAmountUSDN >= newBalanceB)
560615 else false)
561616 then throwInsufficientAvailableBalance(amountMinusFee, availableBalanceB, assetNameB)
562- else [IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, invariantCalc(newBalanceA, newBalanceB)), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(govAddr, governanceReward, sendAssetId)]
617+ else [IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, invariantCalc(newBalanceA, newBalanceB)), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(walletAddress, governanceReward, sendAssetId)]
563618 }
564619 }
565620
566621
567622
568623 @Callable(i)
569624 func shutdown () = if (!(isActive))
570625 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
571626 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, admStartStop], i.callerPublicKey)))
572627 then throwOnlyAdmin()
573628 else suspend("Paused by admin")
574629
575630
576631
577632 @Callable(i)
578633 func activate () = if (isActive)
579634 then throwIsActive()
580635 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, admStartStop], i.callerPublicKey)))
581636 then throwOnlyAdmin()
582637 else [BooleanEntry(kActive, true), DeleteEntry(kCause)]
583638
584639
585640
586641 @Callable(i)
587-func enableFirstHarvest () = [BooleanEntry(keyFirstHarvest, true), IntegerEntry(keyFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))]
642+func enableFirstHarvest () = [BooleanEntry(kFirstHarvest, true), IntegerEntry(kFirstHarvestHeight, (startHeight + (firstHarvestEndPeriod * periodLength)))]
588643
589644
590645
591646 @Callable(i)
592647 func takeIntoAccountExtraFunds (amountLeave) = {
593648 let uncountableA = (accountBalanceWithStakedA - balanceA)
594649 let uncountableB = (accountBalanceWithStakedB - balanceB)
595650 let amountEnrollA = (uncountableA - (if ((assetIdA == unit))
596651 then amountLeave
597652 else 0))
598653 let amountEnrollB = (uncountableB - (if ((assetIdB == unit))
599654 then amountLeave
600655 else 0))
601656 let invariantNew = invariantCalc((balanceA + amountEnrollA), (balanceB + amountEnrollB))
602657 if (!(isActive))
603658 then throwIsInactive()
604659 else if ((i.caller != this))
605660 then throwOnlyAdmin()
606661 else if ((0 > amountLeave))
607662 then throw(("Argument 'amountLeave' cannot be negative. Actual: " + toString(amountLeave)))
608663 else if (if ((0 > uncountableA))
609664 then true
610665 else (0 > uncountableB))
611666 then suspend("Enroll amount negative")
612667 else if (if ((0 > amountEnrollA))
613668 then true
614669 else (0 > amountEnrollB))
615670 then throw("Too large amountLeave")
616671 else [IntegerEntry(kInvariant, invariantNew), IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
617672 }
618673
619674
620675 @Verifier(tx)
621676 func verify () = {
622677 let multiSignedByAdmins = {
623678 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
624679 then 1
625680 else 0
626681 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
627682 then 1
628683 else 0
629684 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
630685 then 1
631686 else 0
632687 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
633688 }
634689 match tx {
635690 case inv: InvokeScriptTransaction =>
636691 let callTakeIntoAccount = if ((inv.dApp == this))
637692 then (inv.function == "takeIntoAccountExtraFunds")
638693 else false
639694 let callEnableFirstHarvest = if ((inv.dApp == this))
640695 then (inv.function == "enableFirstHarvest")
641696 else false
642697 let callStaking = if ((inv.dApp == stakingAddress))
643698 then if (if (if ((inv.function == "lockNeutrino"))
644699 then (size(inv.payments) == 1)
645700 else false)
646701 then (inv.payments[0].assetId == USDN)
647702 else false)
648703 then true
649704 else if ((inv.function == "unlockNeutrino"))
650705 then (size(inv.payments) == 0)
651706 else false
652707 else false
653708 let exchangeToWaves = if (if (if ((inv.dApp == USDNToWavesExchanger))
654709 then (inv.function == "exchange")
655710 else false)
656711 then (assetIdA == USDN)
657712 else false)
658713 then true
659714 else if (if ((assetIdB == USDN))
660715 then (size(inv.payments) == 1)
661716 else false)
662717 then (inv.payments[0].assetId == USDN)
663718 else false
664719 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
665720 then true
666721 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
667722 then true
668723 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
669724 then true
670725 else sigVerify(tx.bodyBytes, tx.proofs[0], admStaking)
671726 if (if (if (if (if (callTakeIntoAccount)
672727 then true
673728 else callEnableFirstHarvest)
674729 then true
675730 else callStaking)
676731 then true
677732 else exchangeToWaves)
678733 then signedByAdmin
679734 else false)
680735 then true
681736 else multiSignedByAdmins
682737 case _ =>
683738 multiSignedByAdmins
684739 }
685740 }
686741

github/deemru/w8io/169f3d6 
102.35 ms