tx · DuKuktRV5zz3yNAsj21gu9B6xw7P2PpNcSdeBXU4tV3P

3PPH7x7iqobW5ziyiRCic19rQqKr6nPYaK1:  -0.01400000 Waves

2021.07.16 21:05 [2681275] smart account 3PPH7x7iqobW5ziyiRCic19rQqKr6nPYaK1 > SELF 0.00000000 Waves

{ "type": 13, "id": "DuKuktRV5zz3yNAsj21gu9B6xw7P2PpNcSdeBXU4tV3P", "fee": 1400000, "feeAssetId": null, "timestamp": 1626458689500, "version": 2, "chainId": 87, "sender": "3PPH7x7iqobW5ziyiRCic19rQqKr6nPYaK1", "senderPublicKey": "5aTg4oxM77iRmUGy3y8Zavn5fhVbgtUciAuSGfCJAYjn", "proofs": [ "", "2UeuUeub2pJv2azgT5kVkvQAaxztRWnhFmwSdM5mkC8HmngWBA9KBgr4YnwFYoH1BJ1SsJ4Rq4gCotE7jGvejXef", "3ys4kJUzMdRUkk1tMmr5nNFrUXrdCbMbFVoLuoN5ohhR42tTyc3htJAdE7yigrHfLvSiVmtASDDMBLyn495K44m9" ], "script": "base64:AAIFAAAAAAAAACAIAhIAEgMKAQESBAoCAQESABIECgIBARIAEgASAwoBAQAAAEwAAAAAB3ZlcnNpb24CAAAABTIuMC4wAAAAAAhrVmVyc2lvbgIAAAAHdmVyc2lvbgAAAAAHa0FjdGl2ZQIAAAAGYWN0aXZlAAAAAAlrQXNzZXRJZEECAAAACkFfYXNzZXRfaWQAAAAACWtBc3NldElkQgIAAAAKQl9hc3NldF9pZAAAAAAJa0JhbGFuY2VBAgAAAA9BX2Fzc2V0X2JhbGFuY2UAAAAACWtCYWxhbmNlQgIAAAAPQl9hc3NldF9iYWxhbmNlAAAAAA1rU2hhcmVBc3NldElkAgAAAA5zaGFyZV9hc3NldF9pZAAAAAARa1NoYXJlQXNzZXRTdXBwbHkCAAAAEnNoYXJlX2Fzc2V0X3N1cHBseQAAAAAEa0ZlZQIAAAAKY29tbWlzc2lvbgAAAAASa0ZlZVNjYWxlRGVsaW1pdGVyAgAAABpjb21taXNzaW9uX3NjYWxlX2RlbGltaXRlcgAAAAAKa0ludmFyaWFudAIAAAAJaW52YXJpYW50AAAAAAZrQ2F1c2UCAAAADnNodXRkb3duX2NhdXNlAAAAAA9rZXlBZG1pblB1YktleTECAAAAC2FkbWluX3B1Yl8xAAAAAA9rZXlBZG1pblB1YktleTICAAAAC2FkbWluX3B1Yl8yAAAAAA9rZXlBZG1pblB1YktleTMCAAAAC2FkbWluX3B1Yl8zAAAAABRVU0ROVG9XYXZlc0V4Y2hhbmdlcgkBAAAAB0FkZHJlc3MAAAABAQAAABoBV6ugnY67/HaJPzVO8b2xSyoDl1hFH8eK8wAAAAAGb3JhY2xlCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFXiv8IaJo1ukDNYXTyEjfepjfw+jjO6B44AQAAAAtnZXRBZG1pblB1YgAAAAEAAAALa2V5QWRtaW5QdWIEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAGb3JhY2xlBQAAAAtrZXlBZG1pblB1YgMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAZzdHJpbmcFAAAAByRtYXRjaDAJAAJZAAAAAQUAAAAGc3RyaW5nBAAAAAdub3RoaW5nBQAAAAckbWF0Y2gwCQAAAgAAAAECAAAAGUFkbWlu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AAACBQAAAAJzawUAAAAEYmV0YQUAAAAHZGlnaXRzOAUAAAAFYWxwaGEFAAAAC2FscGhhRGlnaXRzBQAAAAdkaWdpdHM4BQAAAARET1dOBQAAAAZzY2FsZTgBAAAAE2NhbGN1bGF0ZVNlbmRBbW91bnQAAAAEAAAAFWFtb3VudFRvU2VuZEVzdGltYXRlZAAAABVtaW5Ub2tlblJlY2VpdmVBbW91bnQAAAASdG9rZW5SZWNlaXZlQW1vdW50AAAAB3Rva2VuSWQEAAAADXNsaXBwYWdlVmFsdWUJAABlAAAAAgUAAAAGc2NhbGU4CQAAaQAAAAIJAABoAAAAAgUAAAAGc2NhbGU4AAAAAAAAAAABAAAAAAAAmJaABAAAAB5kZWx0YUJldHdlZW5NYXhBbmRNaW5TZW5kVmFsdWUJAABlAAAAAgUAAAAVYW1vdW50VG9TZW5kRXN0aW1hdGVkBQAAABVtaW5Ub2tlblJlY2VpdmVBbW91bnQEAAAAAXgJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAAEnRva2VuUmVjZWl2ZUFtb3VudAQAAAABeQkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAASdG9rZW5SZWNlaXZlQW1vdW50BAAAAAxpbnZhcmlhbnROZXcDCQAAAAAAAAIFAAAAB3Rva2VuSWQFAAAACGFzc2V0SWRBCQEAAAANaW52YXJpYW50Q2FsYwAAAAIFAAAAAXgJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAAFWFtb3VudFRvU2VuZEVzdGltYXRlZAMJAAAAAAAAAgUAAAAHdG9rZW5JZAUAAAAIYXNzZXRJZEIJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAAVYW1vdW50VG9TZW5kRXN0aW1hdGVkBQAAAAF5CQAAAgAAAAECAAAAFldyb25nIGFzc2V0IGluIHBheW1lbnQEAAAAF2ludmFyaWFudEVzdGltYXRlZFJhdGlvCQAAawAAAAMFAAAABnNjYWxlOAUAAAAJaW52YXJpYW50BQAAAAxpbnZhcmlhbnROZXcKAQAAAA1nZXRTdGVwQW1vdW50AAAAAgAAAANhY2MAAAAEc3RlcAMJAAAAAAAAAgUAAAADYWNjAP//////////BAAAAAxhbW91bnRUb1NlbmQJAABlAAAAAgUAAAAVYW1vdW50VG9TZW5kRXN0aW1hdGVkCQAAaQAAAAIJAABoAAAAAgUAAAAEc3RlcAUAAAAeZGVsdGFCZXR3ZWVuTWF4QW5kTWluU2VuZFZhbHVlAAAAAAAAAAAFBAAAAA1zdGVwSW52YXJpYW50AwkAAAAAAAACBQAAAAd0b2tlbklkBQAAAAhhc3NldElkQQkBAAAADWludmFyaWFudENhbGMAAAACBQAAAAF4CQAAZQAAAAIFAAAACGJhbGFuY2VCBQAAAAxhbW91bnRUb1NlbmQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAAMYW1vdW50VG9TZW5kBQAAAAF5AwkAAGYAAAACBQAAAA1zdGVwSW52YXJpYW50BQAAAAlpbnZhcmlhbnQFAAAADGFtb3VudFRvU2VuZAD//////////wUAAAADYWNjBAAAAApzdGVwQW1vdW50BAAAAA0kbGlzdDYwMjU2MDY4CQAETAAAAAIAAAAAAAAAAAEJAARMAAAAAgAAAAAAAAAAAgkABEwAAAACAAAAAAAAAAADCQAETAAAAAIAAAAAAAAAAAQJAARMAAAAAgAAAAAAAAAABQUAAAADbmlsBAAAAA0kc2l6ZTYwMjU2MDY4CQABkAAAAAEFAAAADSRsaXN0NjAyNTYwNjgEAAAADSRhY2MwNjAyNTYwNjgA//////////8DCQAAAAAAAAIFAAAADSRzaXplNjAyNTYwNjgAAAAAAAAAAAAFAAAADSRhY2MwNjAyNTYwNjgEAAAADSRhY2MxNjAyNTYwNjgJAQAAAA1nZXRTdGVwQW1vdW50AAAAAgUAAAANJGFjYzA2MDI1NjA2OAkAAZEAAAACBQAAAA0kbGlzdDYwMjU2MDY4AAAAAAAAAAAAAwkAAAAAAAACBQAAAA0kc2l6ZTYwMjU2MDY4AAAAAAAAAAABBQAAAA0kYWNjMTYwMjU2MDY4BAAAAA0kYWNjMjYwMjU2MDY4CQEAAAANZ2V0U3RlcEFtb3VudAAAAAIFAAAADSRhY2MxNjAyNTYwNjgJAAGRAAAAAgUAAAANJGxpc3Q2MDI1NjA2OAAAAAAAAAAAAQMJAAAAAAAAAgUAAAANJHNpemU2MDI1NjA2OAAAAAAAAAAAAgUAAAANJGFjYzI2MDI1NjA2OAQAAAANJGFjYzM2MDI1NjA2OAkBAAAADWdldFN0ZXBBbW91bnQAAAACBQAAAA0kYWNjMjYwMjU2MDY4CQABkQAAAAIFAAAADSRsaXN0NjAyNTYwNjgAAAAAAAAAAAIDCQAAAAAAAAIFAAAADSRzaXplNjAyNTYwNjgAAAAAAAAAAAMFAAAADSRhY2MzNjAyNTYwNjgEAAAADSRhY2M0NjAyNTYwNjgJAQAAAA1nZXRTdGVwQW1vdW50AAAAAgUAAAANJGFjYzM2MDI1NjA2OAkAAZEAAAACBQAAAA0kbGlzdDYwMjU2MDY4AAAAAAAAAAADAwkAAAAAAAACBQAAAA0kc2l6ZTYwMjU2MDY4AAAAAAAAAAAEBQAAAA0kYWNjNDYwMjU2MDY4BAAAAA0kYWNjNTYwMjU2MDY4CQEAAAANZ2V0U3RlcEFtb3VudAAAAAIFAAAADSRhY2M0NjAyNTYwNjgJAAGRAAAAAgUAAAANJGxpc3Q2MDI1NjA2OAAAAAAAAAAABAMJAAAAAAAAAgUAAAANJHNpemU2MDI1NjA2OAAAAAAAAAAABQUAAAANJGFjYzU2MDI1NjA2OAQAAAANJGFjYzY2MDI1NjA2OAkBAAAADWdldFN0ZXBBbW91bnQAAAACBQAAAA0kYWNjNTYwMjU2MDY4CQABkQAAAAIFAAAADSRsaXN0NjAyNTYwNjgAAAAAAAAAAAUJAAACAAAAAQIAAAASTGlzdCBzaXplIGV4Y2VlZCA1AwkAAGYAAAACAAAAAAAAAAAABQAAAApzdGVwQW1vdW50CQAAAgAAAAECAAAANHNvbWV0aGluZyB3ZW50IHdyb25nIHdoaWxlIHdvcmtpbmcgd2l0aCBhbW91bnRUb1NlbmQDAwkAAGYAAAACBQAAABdpbnZhcmlhbnRFc3RpbWF0ZWRSYXRpbwUAAAANc2xpcHBhZ2VWYWx1ZQkAAGYAAAACBQAAAAxpbnZhcmlhbnROZXcFAAAACWludmFyaWFudAcFAAAAFWFtb3VudFRvU2VuZEVzdGltYXRlZAUAAAAKc3RlcEFtb3VudAEAAAAMZ2V0QXNzZXRJbmZvAAAAAQAAAAdhc3NldElkBAAAAAckbWF0Y2gwBQAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gw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OAAAAAEFAAAACnNoYXJlSXNzdWUEAAAAE2ludmFyaWFudENhbGN1bGF0ZWQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgUAAAAKcG10QW1vdW50QQUAAAAKcG10QW1vdW50QgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAhrVmVyc2lvbgUAAAAHdmVyc2lvbgkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAHa0FjdGl2ZQYJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAJa0Fzc2V0SWRBBQAAAA5wbXRTdHJBc3NldElkQQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAlrQXNzZXRJZEIFAAAADnBtdFN0ckFzc2V0SWRCCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUEFAAAACnBtdEFtb3VudEEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQgUAAAAKcG10QW1vdW50QgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAKa0ludmFyaWFudAUAAAATaW52YXJpYW50Q2FsY3VsYXRlZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAEa0ZlZQUAAAADZmVlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABJrRmVlU2NhbGVEZWxpbWl0ZXIFAAAACWZlZVNjYWxlNgkABEwAAAACBQAAAApzaGFyZUlzc3VlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAADWtTaGFyZUFzc2V0SWQJAAJYAAAAAQUAAAAMc2hhcmVJc3N1ZUlkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrU2hhcmVBc3NldFN1cHBseQUAAAASc2hhcmVJbml0aWFsU3VwcGx5CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAASc2hhcmVJbml0aWFsU3VwcGx5BQAAAAxzaGFyZUlzc3VlSWQFAAAAA25pbAAAAAFpAQAAABZyZXBsZW5pc2hXaXRoVHdvVG9rZW5zAAAAAQAAABFzbGlwcGFnZVRvbGVyYW5jZQQAAAALcG10QXNzZXRJZEEICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAAC3BtdEFzc2V0SWRCCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQAAAAdhc3NldElkBAAAAApwbXRBbW91bnRBCQEAAAAQZGVkdWN0U3Rha2luZ0ZlZQAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAUAAAALcG10QXNzZXRJZEEEAAAACnBtdEFtb3VudEIJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEAAAAGYW1vdW50BQAAAAtwbXRBc3NldElkQgQAAAAKdG9rZW5SYXRpbwkAAGsAAAADCQAAawAAAAMFAAAABnNjYWxlOAUAAAAIYmFsYW5jZUEFAAAACnBtdEFtb3VudEEFAAAABnNjYWxlMwkAAGsAAAADBQAAAAZzY2FsZTgFAAAACGJhbGFuY2VCBQAAAApwbXRBbW91bnRCBAAAABNyYXRpb1NoYXJlVG9rZW5zSW5BCQAAawAAAAMFAAAABnNjYWxlOAUAAAAKcG10QW1vdW50QQUAAAAIYmFsYW5jZUEEAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkIJAABrAAAAAwUAAAAGc2NhbGU4BQAAAApwbXRBbW91bnRCBQAAAAhiYWxhbmNlQgQAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50CQAAawAAAAMJAAGXAAAAAQkABEwAAAACBQAAABNyYXRpb1NoYXJlVG9rZW5zSW5BCQAETAAAAAIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkIFAAAAA25pbAUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAGc2NhbGU4BAAAABNpbnZhcmlhbnRDYWxjdWxhdGVkCQEAAAANaW52YXJpYW50Q2FsYwAAAAIJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAACnBtdEFtb3VudEEJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAACnBtdEFtb3VudEIDCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQEAAAAPdGhyb3dJc0luYWN0aXZlAAAAAAMDCQAAZgAAAAIAAAAAAAAAAAAFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBgkAAGYAAAACBQAAABFzbGlwcGFnZVRvbGVyYW5jZQAAAAAAAAAACgkAAAIAAAABAgAAACBTbGlwcGFnZSB0b2xlcmFuY2UgbXVzdCBiZSA8PSAxJQMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAIJAAACAAAAAQIAAAAcVHdvIGF0dGFjaGVkIGFzc2V0cyBleHBlY3RlZAMDCQEAAAACIT0AAAACBQAAAAtwbXRBc3NldElkQQUAAAAIYXNzZXRJZEEGCQEAAAACIT0AAAACBQAAAAtwbXRBc3NldElkQgUAAAAIYXNzZXRJZEIJAQAAAAt0aHJvd0Fzc2V0cwAAAAADAwkAAGYAAAACCQAAaQAAAAIJAABoAAAAAgUAAAAGc2NhbGUzCQAAZQAAAAIFAAAADnNsaXBwYWdlU2NhbGUzBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAOc2xpcHBhZ2VTY2FsZTMFAAAACnRva2VuUmF0aW8GCQAAZgAAAAIFAAAACnRva2VuUmF0aW8JAABpAAAAAgkAAGgAAAACBQAAAAZzY2FsZTMJAABkAAAAAgUAAAAOc2xpcHBhZ2VTY2FsZTMFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBQAAAA5zbGlwcGFnZVNjYWxlMwkAAAIAAAABAgAAAD1JbmNvcnJlY3QgYXNzZXRzIGFtb3VudDogYW1vdW50cyBtdXN0IGhhdmUgdGhlIGNvbnRyYWN0IHJhdGlvAwkAAAAAAAACBQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQAAAAAAAAAAAAJAAACAAAAAQIAAAAdVG9vIHNtYWxsIGFtb3VudCB0byByZXBsZW5pc2gDCQEAAAABIQAAAAEFAAAAEGhhc0Vub3VnaEJhbGFuY2UJAAROAAAAAgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAACnBtdEFtb3VudEEFAAAAC3BtdEFzc2V0SWRBCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAKcG10QW1vdW50QgUAAAALcG10QXNzZXRJZEIFAAAAA25pbAkBAAAAEXN1c3BlbmRTdXNwaWNpb3VzAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VBCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAApwbXRBbW91bnRBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUIJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAACnBtdEFtb3VudEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEWtTaGFyZUFzc2V0U3VwcGx5CQAAZAAAAAIFAAAAEHNoYXJlQXNzZXRTdXBwbHkFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAKa0ludmFyaWFudAUAAAATaW52YXJpYW50Q2FsY3VsYXRlZAkABEwAAAACCQEAAAAHUmVpc3N1ZQAAAAMFAAAADHNoYXJlQXNzZXRJZAUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50BgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAUAAAAMc2hhcmVBc3NldElkBQAAAANuaWwAAAABaQEAAAAVcmVwbGVuaXNoV2l0aE9uZVRva2VuAAAAAgAAABN2aXJ0dWFsU3dhcFRva2VuUGF5AAAAE3ZpcnR1YWxTd2FwVG9rZW5HZXQEAAAADSR0MDEzNDEwMTM0ODUJAAUUAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAAlwbXRBbW91bnQIBQAAAA0kdDAxMzQxMDEzNDg1AAAAAl8xBAAAAApwbXRBc3NldElkCAUAAAANJHQwMTM0MTAxMzQ4NQAAAAJfMgQAAAAPcG10TWluVGhyZXNob2xkAAAAAAAATEtABAAAAB10aHJlc2hvbGRWYWx1ZUZvck1pblRvbGVyYW5jZQAAAAAAAvrwgAQAAAAJdG9sZXJhbmNlAwkAAGYAAAACBQAAAB10aHJlc2hvbGRWYWx1ZUZvck1pblRvbGVyYW5jZQUAAAAJcG10QW1vdW50AAAAAAAAAYagAAAAAAAAAAABBAAAABxzbGlwcGFnZVZhbHVlTWluRm9yUmVwbGVuaXNoCQAAZQAAAAIFAAAABnNjYWxlOAkAAGkAAAACCQAAaAAAAAIFAAAABnNjYWxlOAUAAAAJdG9sZXJhbmNlAAAAAAAAmJaABAAAABxzbGlwcGFnZVZhbHVlTWF4Rm9yUmVwbGVuaXNoCQAAZAAAAAIFAAAABnNjYWxlOAkAAGkAAAACCQAAaAAAAAIFAAAABnNjYWxlOAUAAAAJdG9sZXJhbmNlAAAAAAAAmJaABAAAABdzbGlwcGFnZVZhbHVlTWluRm9yU3dhcAkAAGUAAAACBQAAAAZzY2FsZTgJAABpAAAAAgkAAGgAAAACBQAAAAZzY2FsZTgAAAAAAAAAAAEAAAAAAACYloADCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQEAAAAPdGhyb3dJc0luYWN0aXZlAAAAAAMJAABmAAAAAgUAAAAPcG10TWluVGhyZXNob2xkBQAAAAlwbXRBbW91bnQJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAA9QYXltZW50IGFtb3VudCAJAAGkAAAAAQUAAAAJcG10QW1vdW50AgAAACcgZG9lcyBub3QgZXhjZWVkIHRoZSBtaW5pbXVtIGFtb3VudCBvZiAJAAGkAAAAAQUAAAAPcG10TWluVGhyZXNob2xkAgAAAAcgdG9rZW5zAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAIAAAABAgAAAB1PbmUgYXR0YWNoZWQgcGF5bWVudCBleHBlY3RlZAMJAQAAAAEhAAAAAQUAAAAQaGFzRW5vdWdoQmFsYW5jZQkABE4AAAACCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAJcG10QW1vdW50BQAAAApwbXRBc3NldElkBQAAAANuaWwJAQAAABFzdXNwZW5kU3VzcGljaW91cwAAAAADAwkBAAAAAiE9AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEJAQAAAAIhPQAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRCBwkBAAAAC3Rocm93QXNzZXRzAAAAAAQAAAANJHQwMTQ0OTcxNTI2MgMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEJAAUZAAAABwkAAGUAAAACBQAAAAlwbXRBbW91bnQFAAAAE3ZpcnR1YWxTd2FwVG9rZW5QYXkFAAAAE3ZpcnR1YWxTd2FwVG9rZW5HZXQJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAAE3ZpcnR1YWxTd2FwVG9rZW5QYXkJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAAE3ZpcnR1YWxTd2FwVG9rZW5HZXQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAAJcG10QW1vdW50BQAAAAhiYWxhbmNlQgkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAAJcG10QW1vdW50BQAAAAhiYWxhbmNlQgkABRkAAAAHBQAAABN2aXJ0dWFsU3dhcFRva2VuR2V0CQAAZQAAAAIFAAAACXBtdEFtb3VudAUAAAATdmlydHVhbFN3YXBUb2tlblBheQkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAATdmlydHVhbFN3YXBUb2tlbkdldAkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAATdmlydHVhbFN3YXBUb2tlblBheQkBAAAADWludmFyaWFudENhbGMAAAACBQAAAAhiYWxhbmNlQQkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAJcG10QW1vdW50BQAAAAhiYWxhbmNlQQkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAJcG10QW1vdW50BAAAABF2aXJ0dWFsUmVwbGVuaXNoQQgFAAAADSR0MDE0NDk3MTUyNjIAAAACXzEEAAAAEXZpcnR1YWxSZXBsZW5pc2hCCAUAAAANJHQwMTQ0OTcxNTI2MgAAAAJfMgQAAAARYmFsYW5jZUFmdGVyU3dhcEEIBQAAAA0kdDAxNDQ5NzE1MjYyAAAAAl8zBAAAABFiYWxhbmNlQWZ0ZXJTd2FwQggFAAAADSR0MDE0NDk3MTUyNjIAAAACXzQEAAAAE2ludmFyaWFudENhbGN1bGF0ZWQIBQAAAA0kdDAxNDQ5NzE1MjYyAAAAAl81BAAAAAtuZXdCYWxhbmNlQQgFAAAADSR0MDE0NDk3MTUyNjIAAAACXzYEAAAAC25ld0JhbGFuY2VCCAUAAAANJHQwMTQ0OTcxNTI2MgAAAAJfNwQAAAAPbmV3QmFsYW5jZUVudHJ5AwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUEJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUIFAAAAC25ld0JhbGFuY2VCBAAAAAxpbnZhcmlhbnROZXcJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgUAAAARYmFsYW5jZUFmdGVyU3dhcEEFAAAAEWJhbGFuY2VBZnRlclN3YXBCBAAAABdpbnZhcmlhbnRFc3RpbWF0ZWRSYXRpbwkAAGsAAAADBQAAAAZzY2FsZTgFAAAACWludmFyaWFudAUAAAAMaW52YXJpYW50TmV3BAAAACVyYXRpb1ZpcnR1YWxCYWxhbmNlVG9WaXJ0dWFsUmVwbGVuaXNoCQAAaQAAAAIJAABrAAAAAwkAAGgAAAACBQAAAAZzY2FsZTgFAAAABnNjYWxlOAUAAAARYmFsYW5jZUFmdGVyU3dhcEEFAAAAEWJhbGFuY2VBZnRlclN3YXBCCQAAawAAAAMFAAAABnNjYWxlOAUAAAARdmlydHVhbFJlcGxlbmlzaEEFAAAAEXZpcnR1YWxSZXBsZW5pc2hCBAAAABNkQXBwVGhyZXNob2xkQW1vdW50CQAAawAAAAMJAABkAAAAAgUAAAALbmV3QmFsYW5jZUEFAAAAC25ld0JhbGFuY2VCBQAAAA1kQXBwVGhyZXNob2xkCQAAaAAAAAIAAAAAAAAAAAIFAAAAE2RBcHBUaHJlc2hvbGRTY2FsZTIDAwkAAGcAAAACBQAAABdzbGlwcGFnZVZhbHVlTWluRm9yU3dhcAUAAAAXaW52YXJpYW50RXN0aW1hdGVkUmF0aW8GCQAAZgAAAAIFAAAACWludmFyaWFudAUAAAAMaW52YXJpYW50TmV3CQAAAgAAAAECAAAAOkluY29ycmVjdCB2aXJ0dWFsU3dhcFRva2VuUGF5IG9yIHZpcnR1YWxTd2FwVG9rZW5HZXQgdmFsdWUDAwkAAGYAAAACBQAAABxzbGlwcGFnZVZhbHVlTWluRm9yUmVwbGVuaXNoBQAAACVyYXRpb1ZpcnR1YWxCYWxhbmNlVG9WaXJ0dWFsUmVwbGVuaXNoBgkAAGYAAAACBQAAACVyYXRpb1ZpcnR1YWxCYWxhbmNlVG9WaXJ0dWFsUmVwbGVuaXNoBQAAABxzbGlwcGFnZVZhbHVlTWF4Rm9yUmVwbGVuaXNoCQAAAgAAAAECAAAAbFN3YXAgd2l0aCB2aXJ0dWFsU3dhcFRva2VuUGF5IGFuZCB2aXJ0dWFsU3dhcFRva2VuR2V0IGlzIHBvc3NpYmxlLCBidXQgcmF0aW8gYWZ0ZXIgdmlydHVhbCBzd2FwIGlzIGluY29ycmVjdAMDCQAAZgAAAAIFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAC25ld0JhbGFuY2VBBgkAAGYAAAACBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAAtuZXdCYWxhbmNlQgkBAAAADnRocm93VGhyZXNob2xkAAAAAwUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAALbmV3QmFsYW5jZUEFAAAAC25ld0JhbGFuY2VCBAAAABNyYXRpb1NoYXJlVG9rZW5zSW5BCQAAawAAAAMJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAgUAAAARdmlydHVhbFJlcGxlbmlzaEEFAAAACGFzc2V0SWRBBQAAAAZzY2FsZTgFAAAAEWJhbGFuY2VBZnRlclN3YXBBBAAAABNyYXRpb1NoYXJlVG9rZW5zSW5CCQAAawAAAAMJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAgUAAAARdmlydHVhbFJlcGxlbmlzaEIFAAAACGFzc2V0SWRCBQAAAAZzY2FsZTgFAAAAEWJhbGFuY2VBZnRlclN3YXBCBAAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQJAABrAAAAAwkAAZcAAAABCQAETAAAAAIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAARMAAAAAgUAAAATcmF0aW9TaGFyZVRva2Vuc0luQgUAAAADbmlsBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAZzY2FsZTgJAARMAAAAAgkBAAAAB1JlaXNzdWUAAAADBQAAAAxzaGFyZUFzc2V0SWQFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAYJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQFAAAADHNoYXJlQXNzZXRJZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAARa1NoYXJlQXNzZXRTdXBwbHkJAABkAAAAAgUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50CQAETAAAAAIFAAAAD25ld0JhbGFuY2VFbnRyeQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAKa0ludmFyaWFudAUAAAATaW52YXJpYW50Q2FsY3VsYXRlZAUAAAADbmlsAAAAAWkBAAAACHdpdGhkcmF3AAAAAAQAAAANJHQwMTc0MDcxNzU1MAkABRQAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAACXBtdEFtb3VudAgFAAAADSR0MDE3NDA3MTc1NTAAAAACXzEEAAAACnBtdEFzc2V0SWQIBQAAAA0kdDAxNzQwNzE3NTUwAAAAAl8yBAAAAAxhbW91bnRUb1BheUEJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAgkAAGsAAAADBQAAAAlwbXRBbW91bnQFAAAACGJhbGFuY2VBBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAhhc3NldElkQQQAAAAMYW1vdW50VG9QYXlCCQEAAAAQZGVkdWN0U3Rha2luZ0ZlZQAAAAIJAABrAAAAAwUAAAAJcG10QW1vdW50BQAAAAhiYWxhbmNlQgUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAIYXNzZXRJZEIEAAAAE2ludmFyaWFudENhbGN1bGF0ZWQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAAMYW1vdW50VG9QYXlBCQAAZQAAAAIFAAAACGJhbGFuY2VCBQAAAAxhbW91bnRUb1BheUIDCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQEAAAAPdGhyb3dJc0luYWN0aXZlAAAAAAMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEJAAACAAAAAQIAAAAdT25lIGF0dGFjaGVkIHBheW1lbnQgZXhwZWN0ZWQDCQEAAAACIT0AAAACBQAAAApwbXRBc3NldElkBQAAAAxzaGFyZUFzc2V0SWQJAAACAAAAAQkAASwAAAACAgAAACRJbmNvcnJlY3QgYXNzZXQgYXR0YWNoZWQuIEV4cGVjdGVkOiAJAAJYAAAAAQUAAAAMc2hhcmVBc3NldElkAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQAETgAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAlwbXRBbW91bnQFAAAACnBtdEFzc2V0SWQFAAAAA25pbAkBAAAAEXN1c3BlbmRTdXNwaWNpb3VzAAAAAAMDCQAAZgAAAAIFAAAADGFtb3VudFRvUGF5QQUAAAARYXZhaWxhYmxlQmFsYW5jZUEGCQAAZgAAAAIFAAAADGFtb3VudFRvUGF5QgUAAAARYXZhaWxhYmxlQmFsYW5jZUIJAQAAACJ0aHJvd0luc3VmZmljaWVudEF2YWlsYWJsZUJhbGFuY2VzAAAAAgUAAAAMYW1vdW50VG9QYXlBBQAAAAxhbW91bnRUb1BheUIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQQkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAAMYW1vdW50VG9QYXlBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUIJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAADGFtb3VudFRvUGF5QgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAARa1NoYXJlQXNzZXRTdXBwbHkJAABlAAAAAgUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAJcG10QW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAprSW52YXJpYW50BQAAABNpbnZhcmlhbnRDYWxjdWxhdGVkCQAETAAAAAIJAQAAAARCdXJuAAAAAgUAAAAMc2hhcmVBc3NldElkBQAAAAlwbXRBbW91bnQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAxhbW91bnRUb1BheUEFAAAACGFzc2V0SWRBCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAMYW1vdW50VG9QYXlCBQAAAAhhc3NldElkQgUAAAADbmlsAAAAAWkBAAAACGV4Y2hhbmdlAAAAAgAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUAAAASbWluQW1vdW50VG9SZWNlaXZlBAAAAA0kdDAxODkwODE4OTgzCQAFFAAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAAJcG10QW1vdW50CAUAAAANJHQwMTg5MDgxODk4MwAAAAJfMQQAAAAKcG10QXNzZXRJZAgFAAAADSR0MDE4OTA4MTg5ODMAAAACXzIDCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQEAAAAPdGhyb3dJc0luYWN0aXZlAAAAAAMJAABnAAAAAgAAAAAAAAAAAAUAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlCQAAAgAAAAEJAAEsAAAAAgIAAAArRXN0aW1hdGVkIGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlLiBBY3R1YWw6IAkAAaQAAAABBQAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUDCQAAZgAAAAIFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQUAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAO01pbmltYWwgYW1vdW50IGNhbid0IGJlIGdyZWF0ZXIgdGhhbiBlc3RpbWF0ZWQuIEVzdGltYXRlZDogCQABpAAAAAEFAAAAGGVzdGltYXRlZEFtb3VudFRvUmVjZWl2ZQIAAAALLiBNaW5pbWFsOiAJAAGkAAAAAQUAAAASbWluQW1vdW50VG9SZWNlaXZlAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAIAAAABAgAAAB1PbmUgYXR0YWNoZWQgcGF5bWVudCBleHBlY3RlZAMJAQAAAAEhAAAAAQUAAAAQaGFzRW5vdWdoQmFsYW5jZQkABE4AAAACCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAJcG10QW1vdW50BQAAAApwbXRBc3NldElkBQAAAANuaWwJAQAAABFzdXNwZW5kU3VzcGljaW91cwAAAAADAwkBAAAAAiE9AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEJAQAAAAIhPQAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRCBwkBAAAAC3Rocm93QXNzZXRzAAAAAAMJAABmAAAAAgAAAAAAAJiWgAUAAAAJcG10QW1vdW50CQAAAgAAAAECAAAAME9ubHkgc3dhcCBvZiAxMC4wMDAwMDAgb3IgbW9yZSB0b2tlbnMgaXMgYWxsb3dlZAMDCQAAZgAAAAIFAAAAFWV4Y2hhbmdlUmF0aW9MaW1pdE1pbgkAAGsAAAADBQAAAAZzY2FsZTgFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQUAAAAJcG10QW1vdW50BgkAAGYAAAACCQAAawAAAAMFAAAABnNjYWxlOAUAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlBQAAAAlwbXRBbW91bnQFAAAAFWV4Y2hhbmdlUmF0aW9MaW1pdE1heAkAAAIAAAABAgAAABxJbmNvcnJlY3QgYXJncyBhbmQgcG10IHJhdGlvBAAAAAtzZW5kQXNzZXRJZAMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEFAAAACGFzc2V0SWRCBQAAAAhhc3NldElkQQQAAAAGYW1vdW50CQEAAAATY2FsY3VsYXRlU2VuZEFtb3VudAAAAAQFAAAAGGVzdGltYXRlZEFtb3VudFRvUmVjZWl2ZQUAAAASbWluQW1vdW50VG9SZWNlaXZlBQAAAAlwbXRBbW91bnQFAAAACnBtdEFzc2V0SWQEAAAAEGdvdmVybmFuY2VSZXdhcmQJAABrAAAAAwUAAAAGYW1vdW50BQAAAA1mZWVHb3Zlcm5hbmNlBQAAAAlmZWVTY2FsZTYEAAAADmFtb3VudE1pbnVzRmVlCQAAawAAAAMFAAAABmFtb3VudAkAAGUAAAACBQAAAAlmZWVTY2FsZTYFAAAAA2ZlZQUAAAAJZmVlU2NhbGU2BAAAAA0kdDAyMDQwNTIwNjY3AwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQkABRQAAAACCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAAlwbXRBbW91bnQJAABlAAAAAgkAAGUAAAACBQAAAAhiYWxhbmNlQgUAAAAOYW1vdW50TWludXNGZWUFAAAAEGdvdmVybmFuY2VSZXdhcmQJAAUUAAAAAgkAAGUAAAACCQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAAA5hbW91bnRNaW51c0ZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAJcG10QW1vdW50BAAAAAtuZXdCYWxhbmNlQQgFAAAADSR0MDIwNDA1MjA2NjcAAAACXzEEAAAAC25ld0JhbGFuY2VCCAUAAAANJHQwMjA0MDUyMDY2NwAAAAJfMgQAAAATZEFwcFRocmVzaG9sZEFtb3VudAkAAGsAAAADCQAAZAAAAAIFAAAAC25ld0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQgUAAAANZEFwcFRocmVzaG9sZAkAAGgAAAACAAAAAAAAAAACBQAAABNkQXBwVGhyZXNob2xkU2NhbGUyAwMJAABmAAAAAgUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAALbmV3QmFsYW5jZUEGCQAAZgAAAAIFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAC25ld0JhbGFuY2VCCQEAAAAOdGhyb3dUaHJlc2hvbGQAAAADBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAAtuZXdCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUIDAwMJAAAAAAAAAgUAAAAIYXNzZXRJZEEFAAAABFVTRE4JAAAAAAAAAgUAAAALc2VuZEFzc2V0SWQFAAAACGFzc2V0SWRBBwkAAGcAAAACBQAAABBzdGFrZWRBbW91bnRVU0ROBQAAAAtuZXdCYWxhbmNlQQcJAQAAACF0aHJvd0luc3VmZmljaWVudEF2YWlsYWJsZUJhbGFuY2UAAAADBQAAAA5hbW91bnRNaW51c0ZlZQUAAAARYXZhaWxhYmxlQmFsYW5jZUEFAAAACmFzc2V0TmFtZUEDAwMJAAAAAAAAAgUAAAAIYXNzZXRJZEIFAAAABFVTRE4JAAAAAAAAAgUAAAALc2VuZEFzc2V0SWQFAAAACGFzc2V0SWRCBwkAAGcAAAACBQAAABBzdGFrZWRBbW91bnRVU0ROBQAAAAtuZXdCYWxhbmNlQgcJAQAAACF0aHJvd0luc3VmZmljaWVudEF2YWlsYWJsZUJhbGFuY2UAAAADBQAAAA5hbW91bnRNaW51c0ZlZQUAAAARYXZhaWxhYmxlQmFsYW5jZUIFAAAACmFzc2V0TmFtZUIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQgUAAAALbmV3QmFsYW5jZUIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACmtJbnZhcmlhbnQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgUAAAALbmV3QmFsYW5jZUEFAAAAC25ld0JhbGFuY2VCCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAOYW1vdW50TWludXNGZWUFAAAAC3NlbmRBc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAB2dvdkFkZHIFAAAAEGdvdmVybmFu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", "height": 2681275, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DZUWBTsdYZ6xi3f6nKnewajY3tFM1sHHxJgHaRJcSizj Next: 9aSC87Ub5LW2JueEeButiKuwbuDsotoggDtefnTXRfPs Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 4 #-}
1+{-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let version = "2.0.0"
2727
2828 let kCause = "shutdown_cause"
2929
30-let adm1 = base58'DXDY2itiEcYBtGkVLnkpHtDFyWQUkoLJz79uJ7ECbMrA'
30+let keyAdminPubKey1 = "admin_pub_1"
3131
32-let adm2 = base58'E6Wa1SGoktYcjHjsKrvjMiqJY3SWmGKcD8Q5L8kxSPS7'
32+let keyAdminPubKey2 = "admin_pub_2"
3333
34-let adm3 = base58'AZmWJtuy4GeVrMmJH4hfFBRApe1StvhJSk4jcbT6bArQ'
34+let keyAdminPubKey3 = "admin_pub_3"
35+
36+let USDNToWavesExchanger = Address(base58'3PHaNgomBkrvEL2QnuJarQVJa71wjw9qiqG')
37+
38+let oracle = Address(base58'3PEbqViERCoKnmcSULh6n2aiMvUdSQdCsom')
39+
40+func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
41+ case string: String =>
42+ fromBase58String(string)
43+ case nothing =>
44+ throw("Admin public key is empty")
45+}
46+
47+
48+let adm1 = getAdminPub(keyAdminPubKey1)
49+
50+let adm2 = getAdminPub(keyAdminPubKey2)
51+
52+let adm3 = getAdminPub(keyAdminPubKey3)
3553
3654 let admStartStop = base58'EtVkT6ed8GtbUiVVEqdmEqsp2J4qbb3rre2HFgxeVYdg'
3755
4058 let govAddr = Address(base58'3P6J84oH51DzY6xk2mT5TheXRbrCwBMxonp')
4159
4260 let stakingAddress = Address(base58'3PNikM6yp4NqcSU8guxQtmR5onr2D4e8yTJ')
43-
44-let USDNToWavesExchanger = Address(base58'3PHaNgomBkrvEL2QnuJarQVJa71wjw9qiqG')
4561
4662 let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
4763
86102 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
87103
88104 let shareAssetSupply = getIntegerValue(this, kShareAssetSupply)
105+
106+let invariant = getIntegerValue(this, kInvariant)
89107
90108 let fee = 500
91109
161179
162180 func invariantCalc (x,y) = {
163181 let sk = skewness(x, y)
164- (fraction((x + y), scale8, pow(sk, digits8, alpha, alphaDigits, digits8, UP)) + (2 * fraction(pow(fraction(x, y, scale8), 0, 5, 1, (digits8 / 2), DOWN), pow((sk - beta), digits8, alpha, alphaDigits, digits8, DOWN), scale8)))
182+ (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)))
165183 }
166184
167185
168186 func calculateSendAmount (amountToSendEstimated,minTokenReceiveAmount,tokenReceiveAmount,tokenId) = {
169187 let slippageValue = (scale8 - ((scale8 * 1) / 10000000))
170188 let deltaBetweenMaxAndMinSendValue = (amountToSendEstimated - minTokenReceiveAmount)
171- let invariant = invariantCalc(balanceA, balanceB)
172189 let x = (balanceA + tokenReceiveAmount)
173190 let y = (balanceB + tokenReceiveAmount)
174191 let invariantNew = if ((tokenId == assetIdA))
190207 else acc
191208
192209 let stepAmount = {
193- let $list57115754 = [1, 2, 3, 4, 5]
194- let $size57115754 = size($list57115754)
195- let $acc057115754 = -1
196- if (($size57115754 == 0))
197- then $acc057115754
210+ let $list60256068 = [1, 2, 3, 4, 5]
211+ let $size60256068 = size($list60256068)
212+ let $acc060256068 = -1
213+ if (($size60256068 == 0))
214+ then $acc060256068
198215 else {
199- let $acc157115754 = getStepAmount($acc057115754, $list57115754[0])
200- if (($size57115754 == 1))
201- then $acc157115754
216+ let $acc160256068 = getStepAmount($acc060256068, $list60256068[0])
217+ if (($size60256068 == 1))
218+ then $acc160256068
202219 else {
203- let $acc257115754 = getStepAmount($acc157115754, $list57115754[1])
204- if (($size57115754 == 2))
205- then $acc257115754
220+ let $acc260256068 = getStepAmount($acc160256068, $list60256068[1])
221+ if (($size60256068 == 2))
222+ then $acc260256068
206223 else {
207- let $acc357115754 = getStepAmount($acc257115754, $list57115754[2])
208- if (($size57115754 == 3))
209- then $acc357115754
224+ let $acc360256068 = getStepAmount($acc260256068, $list60256068[2])
225+ if (($size60256068 == 3))
226+ then $acc360256068
210227 else {
211- let $acc457115754 = getStepAmount($acc357115754, $list57115754[3])
212- if (($size57115754 == 4))
213- then $acc457115754
228+ let $acc460256068 = getStepAmount($acc360256068, $list60256068[3])
229+ if (($size60256068 == 4))
230+ then $acc460256068
214231 else {
215- let $acc557115754 = getStepAmount($acc457115754, $list57115754[4])
216- if (($size57115754 == 5))
217- then $acc557115754
232+ let $acc560256068 = getStepAmount($acc460256068, $list60256068[4])
233+ if (($size60256068 == 5))
234+ then $acc560256068
218235 else {
219- let $acc657115754 = getStepAmount($acc557115754, $list57115754[5])
236+ let $acc660256068 = getStepAmount($acc560256068, $list60256068[5])
220237 throw("List size exceed 5")
221238 }
222239 }
281298 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"))
282299
283300
284-func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(accountBalanceWithStakedA)) + " ") + assetNameA) + ", ") + toString(accountBalanceWithStakedB)) + " ") + assetNameB) + ". State: ") + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB))
301+func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
285302
286303
287304 @Callable(i)
288305 func init () = {
289- let $t084328509 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
290- let pmtAmountA = $t084328509._1
291- let pmtAssetIdA = $t084328509._2
292- let $t085148591 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
293- let pmtAmountB = $t085148591._1
294- let pmtAssetIdB = $t085148591._2
295- let $t085968673 = getAssetInfo(pmtAssetIdA)
296- let pmtStrAssetIdA = $t085968673._1
297- let pmtAssetNameA = $t085968673._2
298- let pmtDecimalsA = $t085968673._3
299- let $t086788755 = getAssetInfo(pmtAssetIdB)
300- let pmtStrAssetIdB = $t086788755._1
301- let pmtAssetNameB = $t086788755._2
302- let pmtDecimalsB = $t086788755._3
306+ let $t087448821 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
307+ let pmtAmountA = $t087448821._1
308+ let pmtAssetIdA = $t087448821._2
309+ let $t088268903 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
310+ let pmtAmountB = $t088268903._1
311+ let pmtAssetIdB = $t088268903._2
312+ let $t089088985 = getAssetInfo(pmtAssetIdA)
313+ let pmtStrAssetIdA = $t089088985._1
314+ let pmtAssetNameA = $t089088985._2
315+ let pmtDecimalsA = $t089088985._3
316+ let $t089909067 = getAssetInfo(pmtAssetIdB)
317+ let pmtStrAssetIdB = $t089909067._1
318+ let pmtAssetNameB = $t089909067._2
319+ let pmtDecimalsB = $t089909067._3
303320 if (isDefined(getBoolean(this, kActive)))
304321 then throwIsActive()
305322 else if ((pmtAssetIdA == pmtAssetIdB))
308325 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
309326 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
310327 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
311- let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, HALFDOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, HALFDOWN), pow(10, 0, shareDecimals, 0, 0, HALFDOWN))
328+ let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
312329 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
313330 let shareIssueId = calculateAssetId(shareIssue)
314331 let invariantCalculated = invariantCalc(pmtAmountA, pmtAmountB)
356373
357374 @Callable(i)
358375 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = {
359- let $t01311013185 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
360- let pmtAmount = $t01311013185._1
361- let pmtAssetId = $t01311013185._2
362- let invariant = invariantCalc(balanceA, balanceB)
376+ let $t01341013485 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
377+ let pmtAmount = $t01341013485._1
378+ let pmtAssetId = $t01341013485._2
363379 let pmtMinThreshold = 5000000
364380 let thresholdValueForMinTolerance = 50000000
365381 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
381397 else false)
382398 then throwAssets()
383399 else {
384- let $t01425114857 = if ((pmtAssetId == assetIdA))
385- then $Tuple6((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), (balanceA + pmtAmount), balanceB)
386- else $Tuple6(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), balanceA, (balanceB + pmtAmount))
387- let virtualReplenishA = $t01425114857._1
388- let virtualReplenishB = $t01425114857._2
389- let balanceAfterSwapA = $t01425114857._3
390- let balanceAfterSwapB = $t01425114857._4
391- let newBalanceA = $t01425114857._5
392- let newBalanceB = $t01425114857._6
400+ let $t01449715262 = if ((pmtAssetId == assetIdA))
401+ then $Tuple7((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), invariantCalc((balanceA + pmtAmount), balanceB), (balanceA + pmtAmount), balanceB)
402+ else $Tuple7(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), invariantCalc(balanceA, (balanceB + pmtAmount)), balanceA, (balanceB + pmtAmount))
403+ let virtualReplenishA = $t01449715262._1
404+ let virtualReplenishB = $t01449715262._2
405+ let balanceAfterSwapA = $t01449715262._3
406+ let balanceAfterSwapB = $t01449715262._4
407+ let invariantCalculated = $t01449715262._5
408+ let newBalanceA = $t01449715262._6
409+ let newBalanceB = $t01449715262._7
410+ let newBalanceEntry = if ((pmtAssetId == assetIdA))
411+ then IntegerEntry(kBalanceA, newBalanceA)
412+ else IntegerEntry(kBalanceB, newBalanceB)
393413 let invariantNew = invariantCalc(balanceAfterSwapA, balanceAfterSwapB)
394414 let invariantEstimatedRatio = fraction(scale8, invariant, invariantNew)
395415 let ratioVirtualBalanceToVirtualReplenish = (fraction((scale8 * scale8), balanceAfterSwapA, balanceAfterSwapB) / fraction(scale8, virtualReplenishA, virtualReplenishB))
410430 let ratioShareTokensInA = fraction(deductStakingFee(virtualReplenishA, assetIdA), scale8, balanceAfterSwapA)
411431 let ratioShareTokensInB = fraction(deductStakingFee(virtualReplenishB, assetIdB), scale8, balanceAfterSwapB)
412432 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
413- let shareTokenToPayAmountAfterFee = fraction(shareTokenToPayAmount, (feeScale6 - (fee / 2)), feeScale6)
414- let shareTokenGovernanceReward = fraction(shareTokenToPayAmount, (feeGovernance / 2), feeScale6)
415- let governanceRewardTokenA = fraction(shareTokenGovernanceReward, balanceA, shareAssetSupply)
416- let governanceRewardTokenB = fraction(shareTokenGovernanceReward, balanceB, shareAssetSupply)
417- let invariantCalculated = invariantCalc((newBalanceA - governanceRewardTokenA), (newBalanceB - governanceRewardTokenB))
418-[Reissue(shareAssetId, shareTokenToPayAmountAfterFee, true), ScriptTransfer(i.caller, shareTokenToPayAmountAfterFee, shareAssetId), ScriptTransfer(govAddr, governanceRewardTokenA, assetIdA), ScriptTransfer(govAddr, governanceRewardTokenB, assetIdB), IntegerEntry(kBalanceA, deductStakingFee((newBalanceA - governanceRewardTokenA), assetIdA)), IntegerEntry(kBalanceB, deductStakingFee((newBalanceB - governanceRewardTokenB), assetIdB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmountAfterFee)), IntegerEntry(kInvariant, invariantCalculated)]
433+[Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), newBalanceEntry, IntegerEntry(kInvariant, invariantCalculated)]
419434 }
420435 }
421436 }
424439
425440 @Callable(i)
426441 func withdraw () = {
427- let $t01785918002 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
428- let pmtAmount = $t01785918002._1
429- let pmtAssetId = $t01785918002._2
442+ let $t01740717550 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
443+ let pmtAmount = $t01740717550._1
444+ let pmtAssetId = $t01740717550._2
430445 let amountToPayA = deductStakingFee(fraction(pmtAmount, balanceA, shareAssetSupply), assetIdA)
431446 let amountToPayB = deductStakingFee(fraction(pmtAmount, balanceB, shareAssetSupply), assetIdB)
432447 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
449464
450465 @Callable(i)
451466 func exchange (estimatedAmountToReceive,minAmountToReceive) = {
452- let $t01936019435 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
453- let pmtAmount = $t01936019435._1
454- let pmtAssetId = $t01936019435._2
467+ let $t01890818983 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
468+ let pmtAmount = $t01890818983._1
469+ let pmtAssetId = $t01890818983._2
455470 if (!(isActive))
456471 then throwIsInactive()
457472 else if ((0 >= estimatedAmountToReceive))
479494 let amount = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
480495 let governanceReward = fraction(amount, feeGovernance, feeScale6)
481496 let amountMinusFee = fraction(amount, (feeScale6 - fee), feeScale6)
482- let $t02086121124 = if ((pmtAssetId == assetIdA))
497+ let $t02040520667 = if ((pmtAssetId == assetIdA))
483498 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
484499 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
485- let newBalanceA = $t02086121124._1
486- let newBalanceB = $t02086121124._2
500+ let newBalanceA = $t02040520667._1
501+ let newBalanceB = $t02040520667._2
487502 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
488503 if (if ((dAppThresholdAmount > newBalanceA))
489504 then true
556571
557572 @Verifier(tx)
558573 func verify () = match tx {
559- case invoke: InvokeScriptTransaction =>
560- let callTakeIntoAccount = if ((invoke.dApp == this))
561- then (invoke.function == "takeIntoAccountExtraFunds")
574+ case inv: InvokeScriptTransaction =>
575+ let callTakeIntoAccount = if ((inv.dApp == this))
576+ then (inv.function == "takeIntoAccountExtraFunds")
562577 else false
563- let callStaking = if ((invoke.dApp == stakingAddress))
564- then if (if (if ((invoke.function == "lockNeutrino"))
565- then (size(invoke.payments) == 1)
578+ let callStaking = if ((inv.dApp == stakingAddress))
579+ then if (if (if ((inv.function == "lockNeutrino"))
580+ then (size(inv.payments) == 1)
566581 else false)
567- then (invoke.payments[0].assetId == USDN)
582+ then (inv.payments[0].assetId == USDN)
568583 else false)
569584 then true
570- else if ((invoke.function == "unlockNeutrino"))
571- then (size(invoke.payments) == 0)
585+ else if ((inv.function == "unlockNeutrino"))
586+ then (size(inv.payments) == 0)
572587 else false
573588 else false
574- let exchangeToWaves = if (if (if ((invoke.dApp == USDNToWavesExchanger))
575- then (invoke.function == "exchange")
589+ let exchangeToWaves = if (if (if ((inv.dApp == USDNToWavesExchanger))
590+ then (inv.function == "exchange")
576591 else false)
577592 then (assetIdA == USDN)
578593 else false)
579594 then true
580- else if ((assetIdB == USDN))
581- then (invoke.payments[0].assetId == USDN)
595+ else if (if ((assetIdB == USDN))
596+ then (size(inv.payments) == 1)
597+ else false)
598+ then (inv.payments[0].assetId == USDN)
582599 else false
583600 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adm1))
584601 then true
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 4 #-}
1+{-# 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 adm1 = base58'DXDY2itiEcYBtGkVLnkpHtDFyWQUkoLJz79uJ7ECbMrA'
30+let keyAdminPubKey1 = "admin_pub_1"
3131
32-let adm2 = base58'E6Wa1SGoktYcjHjsKrvjMiqJY3SWmGKcD8Q5L8kxSPS7'
32+let keyAdminPubKey2 = "admin_pub_2"
3333
34-let adm3 = base58'AZmWJtuy4GeVrMmJH4hfFBRApe1StvhJSk4jcbT6bArQ'
34+let keyAdminPubKey3 = "admin_pub_3"
35+
36+let USDNToWavesExchanger = Address(base58'3PHaNgomBkrvEL2QnuJarQVJa71wjw9qiqG')
37+
38+let oracle = Address(base58'3PEbqViERCoKnmcSULh6n2aiMvUdSQdCsom')
39+
40+func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
41+ case string: String =>
42+ fromBase58String(string)
43+ case nothing =>
44+ throw("Admin public key is empty")
45+}
46+
47+
48+let adm1 = getAdminPub(keyAdminPubKey1)
49+
50+let adm2 = getAdminPub(keyAdminPubKey2)
51+
52+let adm3 = getAdminPub(keyAdminPubKey3)
3553
3654 let admStartStop = base58'EtVkT6ed8GtbUiVVEqdmEqsp2J4qbb3rre2HFgxeVYdg'
3755
3856 let admStaking = base58'Czn4yoAuUZCVCLJDRfskn8URfkwpknwBTZDbs1wFrY7h'
3957
4058 let govAddr = Address(base58'3P6J84oH51DzY6xk2mT5TheXRbrCwBMxonp')
4159
4260 let stakingAddress = Address(base58'3PNikM6yp4NqcSU8guxQtmR5onr2D4e8yTJ')
43-
44-let USDNToWavesExchanger = Address(base58'3PHaNgomBkrvEL2QnuJarQVJa71wjw9qiqG')
4561
4662 let USDN = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
4763
4864 let stakingFeeInUSDN = 270000
4965
5066 let isActive = getBooleanValue(this, kActive)
5167
5268 let strAssetIdA = getStringValue(this, kAssetIdA)
5369
5470 let strAssetIdB = getStringValue(this, kAssetIdB)
5571
5672 let assetIdA = if ((strAssetIdA == "WAVES"))
5773 then unit
5874 else fromBase58String(strAssetIdA)
5975
6076 let assetIdB = if ((strAssetIdB == "WAVES"))
6177 then unit
6278 else fromBase58String(strAssetIdB)
6379
6480 let assetNameA = match assetIdA {
6581 case id: ByteVector =>
6682 value(assetInfo(id)).name
6783 case waves: Unit =>
6884 "WAVES"
6985 case _ =>
7086 throw("Match error")
7187 }
7288
7389 let assetNameB = match assetIdB {
7490 case id: ByteVector =>
7591 value(assetInfo(id)).name
7692 case waves: Unit =>
7793 "WAVES"
7894 case _ =>
7995 throw("Match error")
8096 }
8197
8298 let balanceA = getIntegerValue(this, kBalanceA)
8399
84100 let balanceB = getIntegerValue(this, kBalanceB)
85101
86102 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
87103
88104 let shareAssetSupply = getIntegerValue(this, kShareAssetSupply)
105+
106+let invariant = getIntegerValue(this, kInvariant)
89107
90108 let fee = 500
91109
92110 let feeGovernance = 200
93111
94112 let feeScale6 = 1000000
95113
96114 let scale3 = 1000
97115
98116 let scale8 = 100000000
99117
100118 let scale12 = 1000000000000
101119
102120 let slippageScale3 = 1000
103121
104122 let digits8 = 8
105123
106124 let dAppThreshold = 50
107125
108126 let dAppThresholdScale2 = 100
109127
110128 let exchangeRatioLimitMin = 90000000
111129
112130 let exchangeRatioLimitMax = 110000000
113131
114132 let alpha = 50
115133
116134 let alphaDigits = 2
117135
118136 let beta = 46000000
119137
120138 func accountBalance (assetId) = match assetId {
121139 case id: ByteVector =>
122140 assetBalance(this, id)
123141 case waves: Unit =>
124142 wavesBalance(this).available
125143 case _ =>
126144 throw("Match error")
127145 }
128146
129147
130148 let stakedAmountUSDN = match getInteger(stakingAddress, ((("rpd_balance_" + toBase58String(USDN)) + "_") + toString(this))) {
131149 case staked: Int =>
132150 staked
133151 case nothing: Unit =>
134152 0
135153 case _ =>
136154 throw("Match error")
137155 }
138156
139157 let availableBalanceA = (balanceA - (if ((assetIdA == USDN))
140158 then stakedAmountUSDN
141159 else 0))
142160
143161 let availableBalanceB = (balanceB - (if ((assetIdB == USDN))
144162 then stakedAmountUSDN
145163 else 0))
146164
147165 let accountBalanceWithStakedA = (accountBalance(assetIdA) + (if ((assetIdA == USDN))
148166 then stakedAmountUSDN
149167 else 0))
150168
151169 let accountBalanceWithStakedB = (accountBalance(assetIdB) + (if ((assetIdB == USDN))
152170 then stakedAmountUSDN
153171 else 0))
154172
155173 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
156174 then (accountBalanceWithStakedB >= balanceB)
157175 else false
158176
159177 func skewness (x,y) = (((fraction(scale12, x, y) + fraction(scale12, y, x)) / 2) / 10000)
160178
161179
162180 func invariantCalc (x,y) = {
163181 let sk = skewness(x, y)
164- (fraction((x + y), scale8, pow(sk, digits8, alpha, alphaDigits, digits8, UP)) + (2 * fraction(pow(fraction(x, y, scale8), 0, 5, 1, (digits8 / 2), DOWN), pow((sk - beta), digits8, alpha, alphaDigits, digits8, DOWN), scale8)))
182+ (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)))
165183 }
166184
167185
168186 func calculateSendAmount (amountToSendEstimated,minTokenReceiveAmount,tokenReceiveAmount,tokenId) = {
169187 let slippageValue = (scale8 - ((scale8 * 1) / 10000000))
170188 let deltaBetweenMaxAndMinSendValue = (amountToSendEstimated - minTokenReceiveAmount)
171- let invariant = invariantCalc(balanceA, balanceB)
172189 let x = (balanceA + tokenReceiveAmount)
173190 let y = (balanceB + tokenReceiveAmount)
174191 let invariantNew = if ((tokenId == assetIdA))
175192 then invariantCalc(x, (balanceB - amountToSendEstimated))
176193 else if ((tokenId == assetIdB))
177194 then invariantCalc((balanceA - amountToSendEstimated), y)
178195 else throw("Wrong asset in payment")
179196 let invariantEstimatedRatio = fraction(scale8, invariant, invariantNew)
180197 func getStepAmount (acc,step) = if ((acc == -1))
181198 then {
182199 let amountToSend = (amountToSendEstimated - ((step * deltaBetweenMaxAndMinSendValue) / 5))
183200 let stepInvariant = if ((tokenId == assetIdA))
184201 then invariantCalc(x, (balanceB - amountToSend))
185202 else invariantCalc((balanceA - amountToSend), y)
186203 if ((stepInvariant > invariant))
187204 then amountToSend
188205 else -1
189206 }
190207 else acc
191208
192209 let stepAmount = {
193- let $list57115754 = [1, 2, 3, 4, 5]
194- let $size57115754 = size($list57115754)
195- let $acc057115754 = -1
196- if (($size57115754 == 0))
197- then $acc057115754
210+ let $list60256068 = [1, 2, 3, 4, 5]
211+ let $size60256068 = size($list60256068)
212+ let $acc060256068 = -1
213+ if (($size60256068 == 0))
214+ then $acc060256068
198215 else {
199- let $acc157115754 = getStepAmount($acc057115754, $list57115754[0])
200- if (($size57115754 == 1))
201- then $acc157115754
216+ let $acc160256068 = getStepAmount($acc060256068, $list60256068[0])
217+ if (($size60256068 == 1))
218+ then $acc160256068
202219 else {
203- let $acc257115754 = getStepAmount($acc157115754, $list57115754[1])
204- if (($size57115754 == 2))
205- then $acc257115754
220+ let $acc260256068 = getStepAmount($acc160256068, $list60256068[1])
221+ if (($size60256068 == 2))
222+ then $acc260256068
206223 else {
207- let $acc357115754 = getStepAmount($acc257115754, $list57115754[2])
208- if (($size57115754 == 3))
209- then $acc357115754
224+ let $acc360256068 = getStepAmount($acc260256068, $list60256068[2])
225+ if (($size60256068 == 3))
226+ then $acc360256068
210227 else {
211- let $acc457115754 = getStepAmount($acc357115754, $list57115754[3])
212- if (($size57115754 == 4))
213- then $acc457115754
228+ let $acc460256068 = getStepAmount($acc360256068, $list60256068[3])
229+ if (($size60256068 == 4))
230+ then $acc460256068
214231 else {
215- let $acc557115754 = getStepAmount($acc457115754, $list57115754[4])
216- if (($size57115754 == 5))
217- then $acc557115754
232+ let $acc560256068 = getStepAmount($acc460256068, $list60256068[4])
233+ if (($size60256068 == 5))
234+ then $acc560256068
218235 else {
219- let $acc657115754 = getStepAmount($acc557115754, $list57115754[5])
236+ let $acc660256068 = getStepAmount($acc560256068, $list60256068[5])
220237 throw("List size exceed 5")
221238 }
222239 }
223240 }
224241 }
225242 }
226243 }
227244 }
228245 if ((0 > stepAmount))
229246 then throw("something went wrong while working with amountToSend")
230247 else if (if ((invariantEstimatedRatio > slippageValue))
231248 then (invariantNew > invariant)
232249 else false)
233250 then amountToSendEstimated
234251 else stepAmount
235252 }
236253
237254
238255 func getAssetInfo (assetId) = match assetId {
239256 case id: ByteVector =>
240257 let stringId = toBase58String(id)
241258 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
242259 $Tuple3(stringId, info.name, info.decimals)
243260 case waves: Unit =>
244261 $Tuple3("WAVES", "WAVES", 8)
245262 case _ =>
246263 throw("Match error")
247264 }
248265
249266
250267 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
251268
252269
253270 func deductStakingFee (amount,assetId) = if ((assetId == USDN))
254271 then {
255272 let result = (amount - stakingFeeInUSDN)
256273 if ((0 >= result))
257274 then throw((((("Insufficient amount " + toString(amount)) + " to deduct staking fee ") + toString(stakingFeeInUSDN)) + " USD-N"))
258275 else result
259276 }
260277 else amount
261278
262279
263280 func throwIsActive () = throw("DApp is already active")
264281
265282
266283 func throwIsInactive () = throw("DApp is inactive at this moment")
267284
268285
269286 func throwOnlyAdmin () = throw("Only admin can call this function")
270287
271288
272289 func throwAssets () = throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
273290
274291
275292 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))
276293
277294
278295 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"))
279296
280297
281298 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"))
282299
283300
284-func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(accountBalanceWithStakedA)) + " ") + assetNameA) + ", ") + toString(accountBalanceWithStakedB)) + " ") + assetNameB) + ". State: ") + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB))
301+func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
285302
286303
287304 @Callable(i)
288305 func init () = {
289- let $t084328509 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
290- let pmtAmountA = $t084328509._1
291- let pmtAssetIdA = $t084328509._2
292- let $t085148591 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
293- let pmtAmountB = $t085148591._1
294- let pmtAssetIdB = $t085148591._2
295- let $t085968673 = getAssetInfo(pmtAssetIdA)
296- let pmtStrAssetIdA = $t085968673._1
297- let pmtAssetNameA = $t085968673._2
298- let pmtDecimalsA = $t085968673._3
299- let $t086788755 = getAssetInfo(pmtAssetIdB)
300- let pmtStrAssetIdB = $t086788755._1
301- let pmtAssetNameB = $t086788755._2
302- let pmtDecimalsB = $t086788755._3
306+ let $t087448821 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
307+ let pmtAmountA = $t087448821._1
308+ let pmtAssetIdA = $t087448821._2
309+ let $t088268903 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
310+ let pmtAmountB = $t088268903._1
311+ let pmtAssetIdB = $t088268903._2
312+ let $t089088985 = getAssetInfo(pmtAssetIdA)
313+ let pmtStrAssetIdA = $t089088985._1
314+ let pmtAssetNameA = $t089088985._2
315+ let pmtDecimalsA = $t089088985._3
316+ let $t089909067 = getAssetInfo(pmtAssetIdB)
317+ let pmtStrAssetIdB = $t089909067._1
318+ let pmtAssetNameB = $t089909067._2
319+ let pmtDecimalsB = $t089909067._3
303320 if (isDefined(getBoolean(this, kActive)))
304321 then throwIsActive()
305322 else if ((pmtAssetIdA == pmtAssetIdB))
306323 then throw("Assets must be different")
307324 else {
308325 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
309326 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
310327 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
311- let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, HALFDOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, HALFDOWN), pow(10, 0, shareDecimals, 0, 0, HALFDOWN))
328+ let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
312329 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
313330 let shareIssueId = calculateAssetId(shareIssue)
314331 let invariantCalculated = invariantCalc(pmtAmountA, pmtAmountB)
315332 [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)]
316333 }
317334 }
318335
319336
320337
321338 @Callable(i)
322339 func replenishWithTwoTokens (slippageTolerance) = {
323340 let pmtAssetIdA = i.payments[0].assetId
324341 let pmtAssetIdB = i.payments[1].assetId
325342 let pmtAmountA = deductStakingFee(i.payments[0].amount, pmtAssetIdA)
326343 let pmtAmountB = deductStakingFee(i.payments[1].amount, pmtAssetIdB)
327344 let tokenRatio = fraction(fraction(scale8, balanceA, pmtAmountA), scale3, fraction(scale8, balanceB, pmtAmountB))
328345 let ratioShareTokensInA = fraction(scale8, pmtAmountA, balanceA)
329346 let ratioShareTokensInB = fraction(scale8, pmtAmountB, balanceB)
330347 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
331348 let invariantCalculated = invariantCalc((balanceA + pmtAmountA), (balanceB + pmtAmountB))
332349 if (!(isActive))
333350 then throwIsInactive()
334351 else if (if ((0 > slippageTolerance))
335352 then true
336353 else (slippageTolerance > 10))
337354 then throw("Slippage tolerance must be <= 1%")
338355 else if ((size(i.payments) != 2))
339356 then throw("Two attached assets expected")
340357 else if (if ((pmtAssetIdA != assetIdA))
341358 then true
342359 else (pmtAssetIdB != assetIdB))
343360 then throwAssets()
344361 else if (if ((((scale3 * (slippageScale3 - slippageTolerance)) / slippageScale3) > tokenRatio))
345362 then true
346363 else (tokenRatio > ((scale3 * (slippageScale3 + slippageTolerance)) / slippageScale3)))
347364 then throw("Incorrect assets amount: amounts must have the contract ratio")
348365 else if ((shareTokenToPayAmount == 0))
349366 then throw("Too small amount to replenish")
350367 else if (!(hasEnoughBalance))
351368 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
352369 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)]
353370 }
354371
355372
356373
357374 @Callable(i)
358375 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = {
359- let $t01311013185 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
360- let pmtAmount = $t01311013185._1
361- let pmtAssetId = $t01311013185._2
362- let invariant = invariantCalc(balanceA, balanceB)
376+ let $t01341013485 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
377+ let pmtAmount = $t01341013485._1
378+ let pmtAssetId = $t01341013485._2
363379 let pmtMinThreshold = 5000000
364380 let thresholdValueForMinTolerance = 50000000
365381 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
366382 then 100000
367383 else 1
368384 let slippageValueMinForReplenish = (scale8 - ((scale8 * tolerance) / 10000000))
369385 let slippageValueMaxForReplenish = (scale8 + ((scale8 * tolerance) / 10000000))
370386 let slippageValueMinForSwap = (scale8 - ((scale8 * 1) / 10000000))
371387 if (!(isActive))
372388 then throwIsInactive()
373389 else if ((pmtMinThreshold > pmtAmount))
374390 then throw((((("Payment amount " + toString(pmtAmount)) + " does not exceed the minimum amount of ") + toString(pmtMinThreshold)) + " tokens"))
375391 else if ((size(i.payments) != 1))
376392 then throw("One attached payment expected")
377393 else if (!(hasEnoughBalance))
378394 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
379395 else if (if ((pmtAssetId != assetIdA))
380396 then (pmtAssetId != assetIdB)
381397 else false)
382398 then throwAssets()
383399 else {
384- let $t01425114857 = if ((pmtAssetId == assetIdA))
385- then $Tuple6((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), (balanceA + pmtAmount), balanceB)
386- else $Tuple6(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), balanceA, (balanceB + pmtAmount))
387- let virtualReplenishA = $t01425114857._1
388- let virtualReplenishB = $t01425114857._2
389- let balanceAfterSwapA = $t01425114857._3
390- let balanceAfterSwapB = $t01425114857._4
391- let newBalanceA = $t01425114857._5
392- let newBalanceB = $t01425114857._6
400+ let $t01449715262 = if ((pmtAssetId == assetIdA))
401+ then $Tuple7((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), invariantCalc((balanceA + pmtAmount), balanceB), (balanceA + pmtAmount), balanceB)
402+ else $Tuple7(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), invariantCalc(balanceA, (balanceB + pmtAmount)), balanceA, (balanceB + pmtAmount))
403+ let virtualReplenishA = $t01449715262._1
404+ let virtualReplenishB = $t01449715262._2
405+ let balanceAfterSwapA = $t01449715262._3
406+ let balanceAfterSwapB = $t01449715262._4
407+ let invariantCalculated = $t01449715262._5
408+ let newBalanceA = $t01449715262._6
409+ let newBalanceB = $t01449715262._7
410+ let newBalanceEntry = if ((pmtAssetId == assetIdA))
411+ then IntegerEntry(kBalanceA, newBalanceA)
412+ else IntegerEntry(kBalanceB, newBalanceB)
393413 let invariantNew = invariantCalc(balanceAfterSwapA, balanceAfterSwapB)
394414 let invariantEstimatedRatio = fraction(scale8, invariant, invariantNew)
395415 let ratioVirtualBalanceToVirtualReplenish = (fraction((scale8 * scale8), balanceAfterSwapA, balanceAfterSwapB) / fraction(scale8, virtualReplenishA, virtualReplenishB))
396416 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
397417 if (if ((slippageValueMinForSwap >= invariantEstimatedRatio))
398418 then true
399419 else (invariant > invariantNew))
400420 then throw("Incorrect virtualSwapTokenPay or virtualSwapTokenGet value")
401421 else if (if ((slippageValueMinForReplenish > ratioVirtualBalanceToVirtualReplenish))
402422 then true
403423 else (ratioVirtualBalanceToVirtualReplenish > slippageValueMaxForReplenish))
404424 then throw("Swap with virtualSwapTokenPay and virtualSwapTokenGet is possible, but ratio after virtual swap is incorrect")
405425 else if (if ((dAppThresholdAmount > newBalanceA))
406426 then true
407427 else (dAppThresholdAmount > newBalanceB))
408428 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
409429 else {
410430 let ratioShareTokensInA = fraction(deductStakingFee(virtualReplenishA, assetIdA), scale8, balanceAfterSwapA)
411431 let ratioShareTokensInB = fraction(deductStakingFee(virtualReplenishB, assetIdB), scale8, balanceAfterSwapB)
412432 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
413- let shareTokenToPayAmountAfterFee = fraction(shareTokenToPayAmount, (feeScale6 - (fee / 2)), feeScale6)
414- let shareTokenGovernanceReward = fraction(shareTokenToPayAmount, (feeGovernance / 2), feeScale6)
415- let governanceRewardTokenA = fraction(shareTokenGovernanceReward, balanceA, shareAssetSupply)
416- let governanceRewardTokenB = fraction(shareTokenGovernanceReward, balanceB, shareAssetSupply)
417- let invariantCalculated = invariantCalc((newBalanceA - governanceRewardTokenA), (newBalanceB - governanceRewardTokenB))
418-[Reissue(shareAssetId, shareTokenToPayAmountAfterFee, true), ScriptTransfer(i.caller, shareTokenToPayAmountAfterFee, shareAssetId), ScriptTransfer(govAddr, governanceRewardTokenA, assetIdA), ScriptTransfer(govAddr, governanceRewardTokenB, assetIdB), IntegerEntry(kBalanceA, deductStakingFee((newBalanceA - governanceRewardTokenA), assetIdA)), IntegerEntry(kBalanceB, deductStakingFee((newBalanceB - governanceRewardTokenB), assetIdB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmountAfterFee)), IntegerEntry(kInvariant, invariantCalculated)]
433+[Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), newBalanceEntry, IntegerEntry(kInvariant, invariantCalculated)]
419434 }
420435 }
421436 }
422437
423438
424439
425440 @Callable(i)
426441 func withdraw () = {
427- let $t01785918002 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
428- let pmtAmount = $t01785918002._1
429- let pmtAssetId = $t01785918002._2
442+ let $t01740717550 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
443+ let pmtAmount = $t01740717550._1
444+ let pmtAssetId = $t01740717550._2
430445 let amountToPayA = deductStakingFee(fraction(pmtAmount, balanceA, shareAssetSupply), assetIdA)
431446 let amountToPayB = deductStakingFee(fraction(pmtAmount, balanceB, shareAssetSupply), assetIdB)
432447 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
433448 if (!(isActive))
434449 then throwIsInactive()
435450 else if ((size(i.payments) != 1))
436451 then throw("One attached payment expected")
437452 else if ((pmtAssetId != shareAssetId))
438453 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
439454 else if (!(hasEnoughBalance))
440455 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
441456 else if (if ((amountToPayA > availableBalanceA))
442457 then true
443458 else (amountToPayB > availableBalanceB))
444459 then throwInsufficientAvailableBalances(amountToPayA, amountToPayB)
445460 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)]
446461 }
447462
448463
449464
450465 @Callable(i)
451466 func exchange (estimatedAmountToReceive,minAmountToReceive) = {
452- let $t01936019435 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
453- let pmtAmount = $t01936019435._1
454- let pmtAssetId = $t01936019435._2
467+ let $t01890818983 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
468+ let pmtAmount = $t01890818983._1
469+ let pmtAssetId = $t01890818983._2
455470 if (!(isActive))
456471 then throwIsInactive()
457472 else if ((0 >= estimatedAmountToReceive))
458473 then throw(("Estimated amount must be positive. Actual: " + toString(estimatedAmountToReceive)))
459474 else if ((minAmountToReceive > estimatedAmountToReceive))
460475 then throw(((("Minimal amount can't be greater than estimated. Estimated: " + toString(estimatedAmountToReceive)) + ". Minimal: ") + toString(minAmountToReceive)))
461476 else if ((size(i.payments) != 1))
462477 then throw("One attached payment expected")
463478 else if (!(hasEnoughBalance))
464479 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
465480 else if (if ((pmtAssetId != assetIdA))
466481 then (pmtAssetId != assetIdB)
467482 else false)
468483 then throwAssets()
469484 else if ((10000000 > pmtAmount))
470485 then throw("Only swap of 10.000000 or more tokens is allowed")
471486 else if (if ((exchangeRatioLimitMin > fraction(scale8, minAmountToReceive, pmtAmount)))
472487 then true
473488 else (fraction(scale8, estimatedAmountToReceive, pmtAmount) > exchangeRatioLimitMax))
474489 then throw("Incorrect args and pmt ratio")
475490 else {
476491 let sendAssetId = if ((pmtAssetId == assetIdA))
477492 then assetIdB
478493 else assetIdA
479494 let amount = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
480495 let governanceReward = fraction(amount, feeGovernance, feeScale6)
481496 let amountMinusFee = fraction(amount, (feeScale6 - fee), feeScale6)
482- let $t02086121124 = if ((pmtAssetId == assetIdA))
497+ let $t02040520667 = if ((pmtAssetId == assetIdA))
483498 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
484499 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
485- let newBalanceA = $t02086121124._1
486- let newBalanceB = $t02086121124._2
500+ let newBalanceA = $t02040520667._1
501+ let newBalanceB = $t02040520667._2
487502 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
488503 if (if ((dAppThresholdAmount > newBalanceA))
489504 then true
490505 else (dAppThresholdAmount > newBalanceB))
491506 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
492507 else if (if (if ((assetIdA == USDN))
493508 then (sendAssetId == assetIdA)
494509 else false)
495510 then (stakedAmountUSDN >= newBalanceA)
496511 else false)
497512 then throwInsufficientAvailableBalance(amountMinusFee, availableBalanceA, assetNameA)
498513 else if (if (if ((assetIdB == USDN))
499514 then (sendAssetId == assetIdB)
500515 else false)
501516 then (stakedAmountUSDN >= newBalanceB)
502517 else false)
503518 then throwInsufficientAvailableBalance(amountMinusFee, availableBalanceB, assetNameB)
504519 else [IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, invariantCalc(newBalanceA, newBalanceB)), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(govAddr, governanceReward, sendAssetId)]
505520 }
506521 }
507522
508523
509524
510525 @Callable(i)
511526 func shutdown () = if (!(isActive))
512527 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
513528 else if (!(containsElement([adm1, adm2, adm3, admStartStop], i.callerPublicKey)))
514529 then throwOnlyAdmin()
515530 else suspend("Paused by admin")
516531
517532
518533
519534 @Callable(i)
520535 func activate () = if (isActive)
521536 then throwIsActive()
522537 else if (!(containsElement([adm1, adm2, adm3, admStartStop], i.callerPublicKey)))
523538 then throwOnlyAdmin()
524539 else [BooleanEntry(kActive, true), DeleteEntry(kCause)]
525540
526541
527542
528543 @Callable(i)
529544 func takeIntoAccountExtraFunds (amountLeave) = {
530545 let uncountableA = (accountBalanceWithStakedA - balanceA)
531546 let uncountableB = (accountBalanceWithStakedB - balanceB)
532547 let amountEnrollA = (uncountableA - (if ((assetIdA == unit))
533548 then amountLeave
534549 else 0))
535550 let amountEnrollB = (uncountableB - (if ((assetIdB == unit))
536551 then amountLeave
537552 else 0))
538553 let invariantNew = invariantCalc((balanceA + amountEnrollA), (balanceB + amountEnrollB))
539554 if (!(isActive))
540555 then throwIsInactive()
541556 else if ((i.caller != this))
542557 then throwOnlyAdmin()
543558 else if ((0 > amountLeave))
544559 then throw(("Argument 'amountLeave' cannot be negative. Actual: " + toString(amountLeave)))
545560 else if (if ((0 > uncountableA))
546561 then true
547562 else (0 > uncountableB))
548563 then suspend("Enroll amount negative")
549564 else if (if ((0 > amountEnrollA))
550565 then true
551566 else (0 > amountEnrollB))
552567 then throw("Too large amountLeave")
553568 else [IntegerEntry(kInvariant, invariantNew), IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
554569 }
555570
556571
557572 @Verifier(tx)
558573 func verify () = match tx {
559- case invoke: InvokeScriptTransaction =>
560- let callTakeIntoAccount = if ((invoke.dApp == this))
561- then (invoke.function == "takeIntoAccountExtraFunds")
574+ case inv: InvokeScriptTransaction =>
575+ let callTakeIntoAccount = if ((inv.dApp == this))
576+ then (inv.function == "takeIntoAccountExtraFunds")
562577 else false
563- let callStaking = if ((invoke.dApp == stakingAddress))
564- then if (if (if ((invoke.function == "lockNeutrino"))
565- then (size(invoke.payments) == 1)
578+ let callStaking = if ((inv.dApp == stakingAddress))
579+ then if (if (if ((inv.function == "lockNeutrino"))
580+ then (size(inv.payments) == 1)
566581 else false)
567- then (invoke.payments[0].assetId == USDN)
582+ then (inv.payments[0].assetId == USDN)
568583 else false)
569584 then true
570- else if ((invoke.function == "unlockNeutrino"))
571- then (size(invoke.payments) == 0)
585+ else if ((inv.function == "unlockNeutrino"))
586+ then (size(inv.payments) == 0)
572587 else false
573588 else false
574- let exchangeToWaves = if (if (if ((invoke.dApp == USDNToWavesExchanger))
575- then (invoke.function == "exchange")
589+ let exchangeToWaves = if (if (if ((inv.dApp == USDNToWavesExchanger))
590+ then (inv.function == "exchange")
576591 else false)
577592 then (assetIdA == USDN)
578593 else false)
579594 then true
580- else if ((assetIdB == USDN))
581- then (invoke.payments[0].assetId == USDN)
595+ else if (if ((assetIdB == USDN))
596+ then (size(inv.payments) == 1)
597+ else false)
598+ then (inv.payments[0].assetId == USDN)
582599 else false
583600 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adm1))
584601 then true
585602 else sigVerify(tx.bodyBytes, tx.proofs[0], adm2))
586603 then true
587604 else sigVerify(tx.bodyBytes, tx.proofs[0], adm3))
588605 then true
589606 else sigVerify(tx.bodyBytes, tx.proofs[0], admStaking)
590607 if (if (if (callTakeIntoAccount)
591608 then true
592609 else callStaking)
593610 then true
594611 else exchangeToWaves)
595612 then signedByAdmin
596613 else false
597614 case _ =>
598615 let adm1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adm1))
599616 then 1
600617 else 0
601618 let adm2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adm2))
602619 then 1
603620 else 0
604621 let adm3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adm3))
605622 then 1
606623 else 0
607624 (((adm1Signed + adm2Signed) + adm3Signed) >= 2)
608625 }
609626

github/deemru/w8io/6500d08 
120.70 ms