tx · AkMyGrc157icjwqnVY8fZCkLk8Acw8i2XUKvTHyEsupW

3N3yYPPFJ2sdk422jEbrwDDkFG7RtzqKqXs:  -0.01400000 Waves

2021.07.16 16:18 [1616214] smart account 3N3yYPPFJ2sdk422jEbrwDDkFG7RtzqKqXs > SELF 0.00000000 Waves

{ "type": 13, "id": "AkMyGrc157icjwqnVY8fZCkLk8Acw8i2XUKvTHyEsupW", "fee": 1400000, "feeAssetId": null, "timestamp": 1626441577266, "version": 2, "chainId": 84, "sender": "3N3yYPPFJ2sdk422jEbrwDDkFG7RtzqKqXs", "senderPublicKey": "Dq2W6UFKeXzdyx5fnP8EeYqkRJSVnMzagJV67v6qZjHY", "proofs": [ "53BsRip9fx18PM52cX6dhD4FcGkQpxnp2bjdozvXF64o7PnowKUjs8UDErhgjqLV8Mx9c2naf27XaYpjvU1zVVwq", "nDEQTna5bVX2a6zmSRUdt59NYXX3QVJCBentaedHKjuEB4GtHMBGb4Akde9Lnm7y67sNRw2muGJ2Pns2tVbALob" ], "script": "base64:AAIFAAAAAAAAACAIAhIAEgMKAQESBAoCAQESABIECgIBARIAEgASAwoBAQAAAEwAAAAAB3ZlcnNpb24CAAAABTIuMC4wAAAAAAhrVmVyc2lvbgIAAAAHdmVyc2lvbgAAAAAHa0FjdGl2ZQIAAAAGYWN0aXZlAAAAAAlrQXNzZXRJZEECAAAACkFfYXNzZXRfaWQAAAAACWtBc3NldElkQgIAAAAKQl9hc3NldF9pZAAAAAAJa0JhbGFuY2VBAgAAAA9BX2Fzc2V0X2JhbGFuY2UAAAAACWtCYWxhbmNlQgIAAAAPQl9hc3NldF9iYWxhbmNlAAAAAA1rU2hhcmVBc3NldElkAgAAAA5zaGFyZV9hc3NldF9pZAAAAAARa1NoYXJlQXNzZXRTdXBwbHkCAAAAEnNoYXJlX2Fzc2V0X3N1cHBseQAAAAAEa0ZlZQIAAAAKY29tbWlzc2lvbgAAAAASa0ZlZVNjYWxlRGVsaW1pdGVyAgAAABpjb21taXNzaW9uX3NjYWxlX2RlbGltaXRlcgAAAAAKa0ludmFyaWFudAIAAAAJaW52YXJpYW50AAAAAAZrQ2F1c2UCAAAADnNodXRkb3duX2NhdXNlAAAAAA9rZXlBZG1pblB1YktleTECAAAAC2FkbWluX3B1Yl8xAAAAAA9rZXlBZG1pblB1YktleTICAAAAC2FkbWluX3B1Yl8yAAAAAA9rZXlBZG1pblB1YktleTMCAAAAC2FkbWluX3B1Yl8zAAAAABRVU0ROVG9XYXZlc0V4Y2hhbmdlcgkBAAAAB0FkZHJlc3MAAAABAQAAABoBVLyvLOw52HwgF6zPLvnW0fXFIi/xmKAk8gAAAAAGb3JhY2xlCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFU6UWqHpAvOq7xug7mLpqSXxqYhOHzYrMIAQAAAAtnZXRBZG1pblB1YgAAAAEAAAALa2V5QWRtaW5QdWIEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAGb3JhY2xlBQAAAAtrZXlBZG1pblB1YgMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAZzdHJpbmcFAAAAByRtYXRjaDAJAAJZAAAAAQUAAAAGc3RyaW5nBAAAAAdub3RoaW5nBQAAAAckbWF0Y2gwCQAAAgAAAAECAAAAGUFkbWlu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AAACBQAAAAJzawUAAAAEYmV0YQUAAAAHZGlnaXRzOAUAAAAFYWxwaGEFAAAAC2FscGhhRGlnaXRzBQAAAAdkaWdpdHM4BQAAAARET1dOBQAAAAZzY2FsZTgBAAAAE2NhbGN1bGF0ZVNlbmRBbW91bnQAAAAEAAAAFWFtb3VudFRvU2VuZEVzdGltYXRlZAAAABVtaW5Ub2tlblJlY2VpdmVBbW91bnQAAAASdG9rZW5SZWNlaXZlQW1vdW50AAAAB3Rva2VuSWQEAAAADXNsaXBwYWdlVmFsdWUJAABlAAAAAgUAAAAGc2NhbGU4CQAAaQAAAAIJAABoAAAAAgUAAAAGc2NhbGU4AAAAAAAAAAABAAAAAAAAmJaABAAAAB5kZWx0YUJldHdlZW5NYXhBbmRNaW5TZW5kVmFsdWUJAABlAAAAAgUAAAAVYW1vdW50VG9TZW5kRXN0aW1hdGVkBQAAABVtaW5Ub2tlblJlY2VpdmVBbW91bnQEAAAAAXgJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAAEnRva2VuUmVjZWl2ZUFtb3VudAQAAAABeQkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAASdG9rZW5SZWNlaXZlQW1vdW50BAAAAAxpbnZhcmlhbnROZXcDCQAAAAAAAAIFAAAAB3Rva2VuSWQFAAAACGFzc2V0SWRBCQEAAAANaW52YXJpYW50Q2FsYwAAAAIFAAAAAXgJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAAFWFtb3VudFRvU2VuZEVzdGltYXRlZAMJAAAAAAAAAgUAAAAHdG9rZW5JZAUAAAAIYXNzZXRJZEIJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAAVYW1vdW50VG9TZW5kRXN0aW1hdGVkBQAAAAF5CQAAAgAAAAECAAAAFldyb25nIGFzc2V0IGluIHBheW1lbnQEAAAAF2ludmFyaWFudEVzdGltYXRlZFJhdGlvCQAAawAAAAMFAAAABnNjYWxlOAUAAAAJaW52YXJpYW50BQAAAAxpbnZhcmlhbnROZXcKAQAAAA1nZXRTdGVwQW1vdW50AAAAAgAAAANhY2MAAAAEc3RlcAMJAAAAAAAAAgUAAAADYWNjAP//////////BAAAAAxhbW91bnRUb1NlbmQJAABlAAAAAgUAAAAVYW1vdW50VG9TZW5kRXN0aW1hdGVkCQAAaQAAAAIJAABoAAAAAgUAAAAEc3RlcAUAAAAeZGVsdGFCZXR3ZWVuTWF4QW5kTWluU2VuZFZhbHVlAAAAAAAAAAAFBAAAAA1zdGVwSW52YXJpYW50AwkAAAAAAAACBQAAAAd0b2tlbklkBQAAAAhhc3NldElkQQkBAAAADWludmFyaWFudENhbGMAAAACBQAAAAF4CQAAZQAAAAIFAAAACGJhbGFuY2VCBQAAAAxhbW91bnRUb1NlbmQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAAMYW1vdW50VG9TZW5kBQAAAAF5AwkAAGYAAAACBQAAAA1zdGVwSW52YXJpYW50BQAAAAlpbnZhcmlhbnQFAAAADGFtb3VudFRvU2VuZAD//////////wUAAAADYWNjBAAAAApzdGVwQW1vdW50BAAAAA0kbGlzdDYwMjU2MDY4CQAETAAAAAIAAAAAAAAAAAEJAARMAAAAAgAAAAAAAAAAAgkABEwAAAACAAAAAAAAAAADCQAETAAAAAIAAAAAAAAAAAQJAARMAAAAAgAAAAAAAAAABQUAAAADbmlsBAAAAA0kc2l6ZTYwMjU2MDY4CQABkAAAAAEFAAAADSRsaXN0NjAyNTYwNjgEAAAADSRhY2MwNjAyNTYwNjgA//////////8DCQAAAAAAAAIFAAAADSRzaXplNjAyNTYwNjgAAAAAAAAAAAAFAAAADSRhY2MwNjAyNTYwNjgEAAAADSRhY2MxNjAyNTYwNjgJAQAAAA1nZXRTdGVwQW1vdW50AAAAAgUAAAANJGFjYzA2MDI1NjA2OAkAAZEAAAACBQAAAA0kbGlzdDYwMjU2MDY4AAAAAAAAAAAAAwkAAAAAAAACBQAAAA0kc2l6ZTYwMjU2MDY4AAAAAAAAAAABBQAAAA0kYWNjMTYwMjU2MDY4BAAAAA0kYWNjMjYwMjU2MDY4CQEAAAANZ2V0U3RlcEFtb3VudAAAAAIFAAAADSRhY2MxNjAyNTYwNjgJAAGRAAAAAgUAAAANJGxpc3Q2MDI1NjA2OAAAAAAAAAAAAQMJAAAAAAAAAgUAAAANJHNpemU2MDI1NjA2OAAAAAAAAAAAAgUAAAANJGFjYzI2MDI1NjA2OAQAAAANJGFjYzM2MDI1NjA2OAkBAAAADWdldFN0ZXBBbW91bnQAAAACBQAAAA0kYWNjMjYwMjU2MDY4CQABkQAAAAIFAAAADSRsaXN0NjAyNTYwNjgAAAAAAAAAAAIDCQAAAAAAAAIFAAAADSRzaXplNjAyNTYwNjgAAAAAAAAAAAMFAAAADSRhY2MzNjAyNTYwNjgEAAAADSRhY2M0NjAyNTYwNjgJAQAAAA1nZXRTdGVwQW1vdW50AAAAAgUAAAANJGFjYzM2MDI1NjA2OAkAAZEAAAACBQAAAA0kbGlzdDYwMjU2MDY4AAAAAAAAAAADAwkAAAAAAAACBQAAAA0kc2l6ZTYwMjU2MDY4AAAAAAAAAAAEBQAAAA0kYWNjNDYwMjU2MDY4BAAAAA0kYWNjNTYwMjU2MDY4CQEAAAANZ2V0U3RlcEFtb3VudAAAAAIFAAAADSRhY2M0NjAyNTYwNjgJAAGRAAAAAgUAAAANJGxpc3Q2MDI1NjA2OAAAAAAAAAAABAMJAAAAAAAAAgUAAAANJHNpemU2MDI1NjA2OAAAAAAAAAAABQUAAAANJGFjYzU2MDI1NjA2OAQAAAANJGFjYzY2MDI1NjA2OAkBAAAADWdldFN0ZXBBbW91bnQAAAACBQAAAA0kYWNjNTYwMjU2MDY4CQABkQAAAAIFAAAADSRsaXN0NjAyNTYwNjgAAAAAAAAAAAUJAAACAAAAAQIAAAASTGlzdCBzaXplIGV4Y2VlZCA1AwkAAGYAAAACAAAAAAAAAAAABQAAAApzdGVwQW1vdW50CQAAAgAAAAECAAAANHNvbWV0aGluZyB3ZW50IHdyb25nIHdoaWxlIHdvcmtpbmcgd2l0aCBhbW91bnRUb1NlbmQDAwkAAGYAAAACBQAAABdpbnZhcmlhbnRFc3RpbWF0ZWRSYXRpbwUAAAANc2xpcHBhZ2VWYWx1ZQkAAGYAAAACBQAAAAxpbnZhcmlhbnROZXcFAAAACWludmFyaWFudAcFAAAAFWFtb3VudFRvU2VuZEVzdGltYXRlZAUAAAAKc3RlcEFtb3VudAEAAAAMZ2V0QXNzZXRJbmZvAAAAAQAAAAdhc3NldElkBAAAAAckbWF0Y2gwBQAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gw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OAAAAAEFAAAACnNoYXJlSXNzdWUEAAAAE2ludmFyaWFudENhbGN1bGF0ZWQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgUAAAAKcG10QW1vdW50QQUAAAAKcG10QW1vdW50QgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAhrVmVyc2lvbgUAAAAHdmVyc2lvbgkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAHa0FjdGl2ZQYJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAJa0Fzc2V0SWRBBQAAAA5wbXRTdHJBc3NldElkQQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAlrQXNzZXRJZEIFAAAADnBtdFN0ckFzc2V0SWRCCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUEFAAAACnBtdEFtb3VudEEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQgUAAAAKcG10QW1vdW50QgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAKa0ludmFyaWFudAUAAAATaW52YXJpYW50Q2FsY3VsYXRlZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAEa0ZlZQUAAAADZmVlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABJrRmVlU2NhbGVEZWxpbWl0ZXIFAAAACWZlZVNjYWxlNgkABEwAAAACBQAAAApzaGFyZUlzc3VlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAADWtTaGFyZUFzc2V0SWQJAAJYAAAAAQUAAAAMc2hhcmVJc3N1ZUlkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrU2hhcmVBc3NldFN1cHBseQUAAAASc2hhcmVJbml0aWFsU3VwcGx5CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAASc2hhcmVJbml0aWFsU3VwcGx5BQAAAAxzaGFyZUlzc3VlSWQFAAAAA25pbAAAAAFpAQAAABZyZXBsZW5pc2hXaXRoVHdvVG9rZW5zAAAAAQAAABFzbGlwcGFnZVRvbGVyYW5jZQQAAAALcG10QXNzZXRJZEEICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAAC3BtdEFzc2V0SWRCCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQAAAAdhc3NldElkBAAAAApwbXRBbW91bnRBCQEAAAAQZGVkdWN0U3Rha2luZ0ZlZQAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAUAAAALcG10QXNzZXRJZEEEAAAACnBtdEFtb3VudEIJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEAAAAGYW1vdW50BQAAAAtwbXRBc3NldElkQgQAAAAKdG9rZW5SYXRpbwkAAGsAAAADCQAAawAAAAMFAAAABnNjYWxlOAUAAAAIYmFsYW5jZUEFAAAACnBtdEFtb3VudEEFAAAABnNjYWxlMwkAAGsAAAADBQAAAAZzY2FsZTgFAAAACGJhbGFuY2VCBQAAAApwbXRBbW91bnRCBAAAABNyYXRpb1NoYXJlVG9rZW5zSW5BCQAAawAAAAMFAAAABnNjYWxlOAUAAAAKcG10QW1vdW50QQUAAAAIYmFsYW5jZUEEAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkIJAABrAAAAAwUAAAAGc2NhbGU4BQAAAApwbXRBbW91bnRCBQAAAAhiYWxhbmNlQgQAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50CQAAawAAAAMJAAGXAAAAAQkABEwAAAACBQAAABNyYXRpb1NoYXJlVG9rZW5zSW5BCQAETAAAAAIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkIFAAAAA25pbAUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAGc2NhbGU4BAAAABNpbnZhcmlhbnRDYWxjdWxhdGVkCQEAAAANaW52YXJpYW50Q2FsYwAAAAIJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAACnBtdEFtb3VudEEJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAACnBtdEFtb3VudEIDCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQEAAAAPdGhyb3dJc0luYWN0aXZlAAAAAAMDCQAAZgAAAAIAAAAAAAAAAAAFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBgkAAGYAAAACBQAAABFzbGlwcGFnZVRvbGVyYW5jZQAAAAAAAAAACgkAAAIAAAABAgAAACBTbGlwcGFnZSB0b2xlcmFuY2UgbXVzdCBiZSA8PSAxJQMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAIJAAACAAAAAQIAAAAcVHdvIGF0dGFjaGVkIGFzc2V0cyBleHBlY3RlZAMDCQEAAAACIT0AAAACBQAAAAtwbXRBc3NldElkQQUAAAAIYXNzZXRJZEEGCQEAAAACIT0AAAACBQAAAAtwbXRBc3NldElkQgUAAAAIYXNzZXRJZEIJAQAAAAt0aHJvd0Fzc2V0cwAAAAADAwkAAGYAAAACCQAAaQAAAAIJAABoAAAAAgUAAAAGc2NhbGUzCQAAZQAAAAIFAAAADnNsaXBwYWdlU2NhbGUzBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAOc2xpcHBhZ2VTY2FsZTMFAAAACnRva2VuUmF0aW8GCQAAZgAAAAIFAAAACnRva2VuUmF0aW8JAABpAAAAAgkAAGgAAAACBQAAAAZzY2FsZTMJAABkAAAAAgUAAAAOc2xpcHBhZ2VTY2FsZTMFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBQAAAA5zbGlwcGFnZVNjYWxlMwkAAAIAAAABAgAAAD1JbmNvcnJlY3QgYXNzZXRzIGFtb3VudDogYW1vdW50cyBtdXN0IGhhdmUgdGhlIGNvbnRyYWN0IHJhdGlvAwkAAAAAAAACBQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQAAAAAAAAAAAAJAAACAAAAAQIAAAAdVG9vIHNtYWxsIGFtb3VudCB0byByZXBsZW5pc2gDCQEAAAABIQAAAAEFAAAAEGhhc0Vub3VnaEJhbGFuY2UJAAROAAAAAgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAACnBtdEFtb3VudEEFAAAAC3BtdEFzc2V0SWRBCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAKcG10QW1vdW50QgUAAAALcG10QXNzZXRJZEIFAAAAA25pbAkBAAAAEXN1c3BlbmRTdXNwaWNpb3VzAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VBCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAApwbXRBbW91bnRBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUIJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAACnBtdEFtb3VudEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEWtTaGFyZUFzc2V0U3VwcGx5CQAAZAAAAAIFAAAAEHNoYXJlQXNzZXRTdXBwbHkFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAKa0ludmFyaWFudAUAAAATaW52YXJpYW50Q2FsY3VsYXRlZAkABEwAAAACCQEAAAAHUmVpc3N1ZQAAAAMFAAAADHNoYXJlQXNzZXRJZAUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50BgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAUAAAAMc2hhcmVBc3NldElkBQAAAANuaWwAAAABaQEAAAAVcmVwbGVuaXNoV2l0aE9uZVRva2VuAAAAAgAAABN2aXJ0dWFsU3dhcFRva2VuUGF5AAAAE3ZpcnR1YWxTd2FwVG9rZW5HZXQEAAAADSR0MDEzNDEwMTM0ODUJAAUUAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAAlwbXRBbW91bnQIBQAAAA0kdDAxMzQxMDEzNDg1AAAAAl8xBAAAAApwbXRBc3NldElkCAUAAAANJHQwMTM0MTAxMzQ4NQAAAAJfMgQAAAAPcG10TWluVGhyZXNob2xkAAAAAAAATEtABAAAAB10aHJlc2hvbGRWYWx1ZUZvck1pblRvbGVyYW5jZQAAAAAAAvrwgAQAAAAJdG9sZXJhbmNlAwkAAGYAAAACBQAAAB10aHJlc2hvbGRWYWx1ZUZvck1pblRvbGVyYW5jZQUAAAAJcG10QW1vdW50AAAAAAAAAYagAAAAAAAAAAABBAAAABxzbGlwcGFnZVZhbHVlTWluRm9yUmVwbGVuaXNoCQAAZQAAAAIFAAAABnNjYWxlOAkAAGkAAAACCQAAaAAAAAIFAAAABnNjYWxlOAUAAAAJdG9sZXJhbmNlAAAAAAAAmJaABAAAABxzbGlwcGFnZVZhbHVlTWF4Rm9yUmVwbGVuaXNoCQAAZAAAAAIFAAAABnNjYWxlOAkAAGkAAAACCQAAaAAAAAIFAAAABnNjYWxlOAUAAAAJdG9sZXJhbmNlAAAAAAAAmJaABAAAABdzbGlwcGFnZVZhbHVlTWluRm9yU3dhcAkAAGUAAAACBQAAAAZzY2FsZTgJAABpAAAAAgkAAGgAAAACBQAAAAZzY2FsZTgAAAAAAAAAAAEAAAAAAACYloADCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQEAAAAPdGhyb3dJc0luYWN0aXZlAAAAAAMJAABmAAAAAgUAAAAPcG10TWluVGhyZXNob2xkBQAAAAlwbXRBbW91bnQJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAA9QYXltZW50IGFtb3VudCAJAAGkAAAAAQUAAAAJcG10QW1vdW50AgAAACcgZG9lcyBub3QgZXhjZWVkIHRoZSBtaW5pbXVtIGFtb3VudCBvZiAJAAGkAAAAAQUAAAAPcG10TWluVGhyZXNob2xkAgAAAAcgdG9rZW5zAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAIAAAABAgAAAB1PbmUgYXR0YWNoZWQgcGF5bWVudCBleHBlY3RlZAMJAQAAAAEhAAAAAQUAAAAQaGFzRW5vdWdoQmFsYW5jZQkABE4AAAACCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAJcG10QW1vdW50BQAAAApwbXRBc3NldElkBQAAAANuaWwJAQAAABFzdXNwZW5kU3VzcGljaW91cwAAAAADAwkBAAAAAiE9AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEJAQAAAAIhPQAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRCBwkBAAAAC3Rocm93QXNzZXRzAAAAAAQAAAANJHQwMTQ0OTcxNTI2MgMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEJAAUZAAAABwkAAGUAAAACBQAAAAlwbXRBbW91bnQFAAAAE3ZpcnR1YWxTd2FwVG9rZW5QYXkFAAAAE3ZpcnR1YWxTd2FwVG9rZW5HZXQJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAAE3ZpcnR1YWxTd2FwVG9rZW5QYXkJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAAE3ZpcnR1YWxTd2FwVG9rZW5HZXQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAAJcG10QW1vdW50BQAAAAhiYWxhbmNlQgkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAAJcG10QW1vdW50BQAAAAhiYWxhbmNlQgkABRkAAAAHBQAAABN2aXJ0dWFsU3dhcFRva2VuR2V0CQAAZQAAAAIFAAAACXBtdEFtb3VudAUAAAATdmlydHVhbFN3YXBUb2tlblBheQkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAATdmlydHVhbFN3YXBUb2tlbkdldAkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAATdmlydHVhbFN3YXBUb2tlblBheQkBAAAADWludmFyaWFudENhbGMAAAACBQAAAAhiYWxhbmNlQQkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAJcG10QW1vdW50BQAAAAhiYWxhbmNlQQkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAJcG10QW1vdW50BAAAABF2aXJ0dWFsUmVwbGVuaXNoQQgFAAAADSR0MDE0NDk3MTUyNjIAAAACXzEEAAAAEXZpcnR1YWxSZXBsZW5pc2hCCAUAAAANJHQwMTQ0OTcxNTI2MgAAAAJfMgQAAAARYmFsYW5jZUFmdGVyU3dhcEEIBQAAAA0kdDAxNDQ5NzE1MjYyAAAAAl8zBAAAABFiYWxhbmNlQWZ0ZXJTd2FwQggFAAAADSR0MDE0NDk3MTUyNjIAAAACXzQEAAAAE2ludmFyaWFudENhbGN1bGF0ZWQIBQAAAA0kdDAxNDQ5NzE1MjYyAAAAAl81BAAAAAtuZXdCYWxhbmNlQQgFAAAADSR0MDE0NDk3MTUyNjIAAAACXzYEAAAAC25ld0JhbGFuY2VCCAUAAAANJHQwMTQ0OTcxNTI2MgAAAAJfNwQAAAAPbmV3QmFsYW5jZUVudHJ5AwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUEJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUIFAAAAC25ld0JhbGFuY2VCBAAAAAxpbnZhcmlhbnROZXcJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgUAAAARYmFsYW5jZUFmdGVyU3dhcEEFAAAAEWJhbGFuY2VBZnRlclN3YXBCBAAAABdpbnZhcmlhbnRFc3RpbWF0ZWRSYXRpbwkAAGsAAAADBQAAAAZzY2FsZTgFAAAACWludmFyaWFudAUAAAAMaW52YXJpYW50TmV3BAAAACVyYXRpb1ZpcnR1YWxCYWxhbmNlVG9WaXJ0dWFsUmVwbGVuaXNoCQAAaQAAAAIJAABrAAAAAwkAAGgAAAACBQAAAAZzY2FsZTgFAAAABnNjYWxlOAUAAAARYmFsYW5jZUFmdGVyU3dhcEEFAAAAEWJhbGFuY2VBZnRlclN3YXBCCQAAawAAAAMFAAAABnNjYWxlOAUAAAARdmlydHVhbFJlcGxlbmlzaEEFAAAAEXZpcnR1YWxSZXBsZW5pc2hCBAAAABNkQXBwVGhyZXNob2xkQW1vdW50CQAAawAAAAMJAABkAAAAAgUAAAALbmV3QmFsYW5jZUEFAAAAC25ld0JhbGFuY2VCBQAAAA1kQXBwVGhyZXNob2xkCQAAaAAAAAIAAAAAAAAAAAIFAAAAE2RBcHBUaHJlc2hvbGRTY2FsZTIDAwkAAGcAAAACBQAAABdzbGlwcGFnZVZhbHVlTWluRm9yU3dhcAUAAAAXaW52YXJpYW50RXN0aW1hdGVkUmF0aW8GCQAAZgAAAAIFAAAACWludmFyaWFudAUAAAAMaW52YXJpYW50TmV3CQAAAgAAAAECAAAAOkluY29ycmVjdCB2aXJ0dWFsU3dhcFRva2VuUGF5IG9yIHZpcnR1YWxTd2FwVG9rZW5HZXQgdmFsdWUDAwkAAGYAAAACBQAAABxzbGlwcGFnZVZhbHVlTWluRm9yUmVwbGVuaXNoBQAAACVyYXRpb1ZpcnR1YWxCYWxhbmNlVG9WaXJ0dWFsUmVwbGVuaXNoBgkAAGYAAAACBQAAACVyYXRpb1ZpcnR1YWxCYWxhbmNlVG9WaXJ0dWFsUmVwbGVuaXNoBQAAABxzbGlwcGFnZVZhbHVlTWF4Rm9yUmVwbGVuaXNoCQAAAgAAAAECAAAAbFN3YXAgd2l0aCB2aXJ0dWFsU3dhcFRva2VuUGF5IGFuZCB2aXJ0dWFsU3dhcFRva2VuR2V0IGlzIHBvc3NpYmxlLCBidXQgcmF0aW8gYWZ0ZXIgdmlydHVhbCBzd2FwIGlzIGluY29ycmVjdAMDCQAAZgAAAAIFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAC25ld0JhbGFuY2VBBgkAAGYAAAACBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAAtuZXdCYWxhbmNlQgkBAAAADnRocm93VGhyZXNob2xkAAAAAwUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAALbmV3QmFsYW5jZUEFAAAAC25ld0JhbGFuY2VCBAAAABNyYXRpb1NoYXJlVG9rZW5zSW5BCQAAawAAAAMJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAgUAAAARdmlydHVhbFJlcGxlbmlzaEEFAAAACGFzc2V0SWRBBQAAAAZzY2FsZTgFAAAAEWJhbGFuY2VBZnRlclN3YXBBBAAAABNyYXRpb1NoYXJlVG9rZW5zSW5CCQAAawAAAAMJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAgUAAAARdmlydHVhbFJlcGxlbmlzaEIFAAAACGFzc2V0SWRCBQAAAAZzY2FsZTgFAAAAEWJhbGFuY2VBZnRlclN3YXBCBAAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQJAABrAAAAAwkAAZcAAAABCQAETAAAAAIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAARMAAAAAgUAAAATcmF0aW9TaGFyZVRva2Vuc0luQgUAAAADbmlsBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAZzY2FsZTgJAARMAAAAAgkBAAAAB1JlaXNzdWUAAAADBQAAAAxzaGFyZUFzc2V0SWQFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAYJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQFAAAADHNoYXJlQXNzZXRJZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAARa1NoYXJlQXNzZXRTdXBwbHkJAABkAAAAAgUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50CQAETAAAAAIFAAAAD25ld0JhbGFuY2VFbnRyeQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAKa0ludmFyaWFudAUAAAATaW52YXJpYW50Q2FsY3VsYXRlZAUAAAADbmlsAAAAAWkBAAAACHdpdGhkcmF3AAAAAAQAAAANJHQwMTc0MDcxNzU1MAkABRQAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAACXBtdEFtb3VudAgFAAAADSR0MDE3NDA3MTc1NTAAAAACXzEEAAAACnBtdEFzc2V0SWQIBQAAAA0kdDAxNzQwNzE3NTUwAAAAAl8yBAAAAAxhbW91bnRUb1BheUEJAQAAABBkZWR1Y3RTdGFraW5nRmVlAAAAAgkAAGsAAAADBQAAAAlwbXRBbW91bnQFAAAACGJhbGFuY2VBBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAhhc3NldElkQQQAAAAMYW1vdW50VG9QYXlCCQEAAAAQZGVkdWN0U3Rha2luZ0ZlZQAAAAIJAABrAAAAAwUAAAAJcG10QW1vdW50BQAAAAhiYWxhbmNlQgUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAIYXNzZXRJZEIEAAAAE2ludmFyaWFudENhbGN1bGF0ZWQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAAMYW1vdW50VG9QYXlBCQAAZQAAAAIFAAAACGJhbGFuY2VCBQAAAAxhbW91bnRUb1BheUIDCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQEAAAAPdGhyb3dJc0luYWN0aXZlAAAAAAMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEJAAACAAAAAQIAAAAdT25lIGF0dGFjaGVkIHBheW1lbnQgZXhwZWN0ZWQDCQEAAAACIT0AAAACBQAAAApwbXRBc3NldElkBQAAAAxzaGFyZUFzc2V0SWQJAAACAAAAAQkAASwAAAACAgAAACRJbmNvcnJlY3QgYXNzZXQgYXR0YWNoZWQuIEV4cGVjdGVkOiAJAAJYAAAAAQUAAAAMc2hhcmVBc3NldElkAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQAETgAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAlwbXRBbW91bnQFAAAACnBtdEFzc2V0SWQFAAAAA25pbAkBAAAAEXN1c3BlbmRTdXNwaWNpb3VzAAAAAAMDCQAAZgAAAAIFAAAADGFtb3VudFRvUGF5QQUAAAARYXZhaWxhYmxlQmFsYW5jZUEGCQAAZgAAAAIFAAAADGFtb3VudFRvUGF5QgUAAAARYXZhaWxhYmxlQmFsYW5jZUIJAQAAACJ0aHJvd0luc3VmZmljaWVudEF2YWlsYWJsZUJhbGFuY2VzAAAAAgUAAAAMYW1vdW50VG9QYXlBBQAAAAxhbW91bnRUb1BheUIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQQkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAAMYW1vdW50VG9QYXlBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUIJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAADGFtb3VudFRvUGF5QgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAARa1NoYXJlQXNzZXRTdXBwbHkJAABlAAAAAgUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAJcG10QW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAprSW52YXJpYW50BQAAABNpbnZhcmlhbnRDYWxjdWxhdGVkCQAETAAAAAIJAQAAAARCdXJuAAAAAgUAAAAMc2hhcmVBc3NldElkBQAAAAlwbXRBbW91bnQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAxhbW91bnRUb1BheUEFAAAACGFzc2V0SWRBCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAMYW1vdW50VG9QYXlCBQAAAAhhc3NldElkQgUAAAADbmlsAAAAAWkBAAAACGV4Y2hhbmdlAAAAAgAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUAAAASbWluQW1vdW50VG9SZWNlaXZlBAAAAA0kdDAxODkwODE4OTgzCQAFFAAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAAJcG10QW1vdW50CAUAAAANJHQwMTg5MDgxODk4MwAAAAJfMQQAAAAKcG10QXNzZXRJZAgFAAAADSR0MDE4OTA4MTg5ODMAAAACXzIDCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQEAAAAPdGhyb3dJc0luYWN0aXZlAAAAAAMJAABnAAAAAgAAAAAAAAAAAAUAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlCQAAAgAAAAEJAAEsAAAAAgIAAAArRXN0aW1hdGVkIGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlLiBBY3R1YWw6IAkAAaQAAAABBQAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUDCQAAZgAAAAIFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQUAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAO01pbmltYWwgYW1vdW50IGNhbid0IGJlIGdyZWF0ZXIgdGhhbiBlc3RpbWF0ZWQuIEVzdGltYXRlZDogCQABpAAAAAEFAAAAGGVzdGltYXRlZEFtb3VudFRvUmVjZWl2ZQIAAAALLiBNaW5pbWFsOiAJAAGkAAAAAQUAAAASbWluQW1vdW50VG9SZWNlaXZlAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAIAAAABAgAAAB1PbmUgYXR0YWNoZWQgcGF5bWVudCBleHBlY3RlZAMJAQAAAAEhAAAAAQUAAAAQaGFzRW5vdWdoQmFsYW5jZQkABE4AAAACCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAJcG10QW1vdW50BQAAAApwbXRBc3NldElkBQAAAANuaWwJAQAAABFzdXNwZW5kU3VzcGljaW91cwAAAAADAwkBAAAAAiE9AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEJAQAAAAIhPQAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRCBwkBAAAAC3Rocm93QXNzZXRzAAAAAAMJAABmAAAAAgAAAAAAAJiWgAUAAAAJcG10QW1vdW50CQAAAgAAAAECAAAAME9ubHkgc3dhcCBvZiAxMC4wMDAwMDAgb3IgbW9yZSB0b2tlbnMgaXMgYWxsb3dlZAMDCQAAZgAAAAIFAAAAFWV4Y2hhbmdlUmF0aW9MaW1pdE1pbgkAAGsAAAADBQAAAAZzY2FsZTgFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQUAAAAJcG10QW1vdW50BgkAAGYAAAACCQAAawAAAAMFAAAABnNjYWxlOAUAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlBQAAAAlwbXRBbW91bnQFAAAAFWV4Y2hhbmdlUmF0aW9MaW1pdE1heAkAAAIAAAABAgAAABxJbmNvcnJlY3QgYXJncyBhbmQgcG10IHJhdGlvBAAAAAtzZW5kQXNzZXRJZAMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEFAAAACGFzc2V0SWRCBQAAAAhhc3NldElkQQQAAAAGYW1vdW50CQEAAAATY2FsY3VsYXRlU2VuZEFtb3VudAAAAAQFAAAAGGVzdGltYXRlZEFtb3VudFRvUmVjZWl2ZQUAAAASbWluQW1vdW50VG9SZWNlaXZlBQAAAAlwbXRBbW91bnQFAAAACnBtdEFzc2V0SWQEAAAAEGdvdmVybmFuY2VSZXdhcmQJAABrAAAAAwUAAAAGYW1vdW50BQAAAA1mZWVHb3Zlcm5hbmNlBQAAAAlmZWVTY2FsZTYEAAAADmFtb3VudE1pbnVzRmVlCQAAawAAAAMFAAAABmFtb3VudAkAAGUAAAACBQAAAAlmZWVTY2FsZTYFAAAAA2ZlZQUAAAAJZmVlU2NhbGU2BAAAAA0kdDAyMDQwNTIwNjY3AwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQkABRQAAAACCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAAlwbXRBbW91bnQJAABlAAAAAgkAAGUAAAACBQAAAAhiYWxhbmNlQgUAAAAOYW1vdW50TWludXNGZWUFAAAAEGdvdmVybmFuY2VSZXdhcmQJAAUUAAAAAgkAAGUAAAACCQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAAA5hbW91bnRNaW51c0ZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAJcG10QW1vdW50BAAAAAtuZXdCYWxhbmNlQQgFAAAADSR0MDIwNDA1MjA2NjcAAAACXzEEAAAAC25ld0JhbGFuY2VCCAUAAAANJHQwMjA0MDUyMDY2NwAAAAJfMgQAAAATZEFwcFRocmVzaG9sZEFtb3VudAkAAGsAAAADCQAAZAAAAAIFAAAAC25ld0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQgUAAAANZEFwcFRocmVzaG9sZAkAAGgAAAACAAAAAAAAAAACBQAAABNkQXBwVGhyZXNob2xkU2NhbGUyAwMJAABmAAAAAgUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAALbmV3QmFsYW5jZUEGCQAAZgAAAAIFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAC25ld0JhbGFuY2VCCQEAAAAOdGhyb3dUaHJlc2hvbGQAAAADBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAAtuZXdCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUIDAwMJAAAAAAAAAgUAAAAIYXNzZXRJZEEFAAAABFVTRE4JAAAAAAAAAgUAAAALc2VuZEFzc2V0SWQFAAAACGFzc2V0SWRBBwkAAGcAAAACBQAAABBzdGFrZWRBbW91bnRVU0ROBQAAAAtuZXdCYWxhbmNlQQcJAQAAACF0aHJvd0luc3VmZmljaWVudEF2YWlsYWJsZUJhbGFuY2UAAAADBQAAAA5hbW91bnRNaW51c0ZlZQUAAAARYXZhaWxhYmxlQmFsYW5jZUEFAAAACmFzc2V0TmFtZUEDAwMJAAAAAAAAAgUAAAAIYXNzZXRJZEIFAAAABFVTRE4JAAAAAAAAAgUAAAALc2VuZEFzc2V0SWQFAAAACGFzc2V0SWRCBwkAAGcAAAACBQAAABBzdGFrZWRBbW91bnRVU0ROBQAAAAtuZXdCYWxhbmNlQgcJAQAAACF0aHJvd0luc3VmZmljaWVudEF2YWlsYWJsZUJhbGFuY2UAAAADBQAAAA5hbW91bnRNaW51c0ZlZQUAAAARYXZhaWxhYmxlQmFsYW5jZUIFAAAACmFzc2V0TmFtZUIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQgUAAAALbmV3QmFsYW5jZUIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACmtJbnZhcmlhbnQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgUAAAALbmV3QmFsYW5jZUEFAAAAC25ld0JhbGFuY2VCCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAOYW1vdW50TWludXNGZWUFAAAAC3NlbmRBc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAB2dvdkFkZHIFAAAAEGdvdmVybmFu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", "height": 1616214, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8rNTFYbTWznVVPbbJ85g6mGm2G8Fjc6PKKX7iiTr7d53 Next: none 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'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
30+let keyAdminPubKey1 = "admin_pub_1"
3131
32-let adm2 = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
32+let keyAdminPubKey2 = "admin_pub_2"
3333
34-let adm3 = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
34+let keyAdminPubKey3 = "admin_pub_3"
35+
36+let USDNToWavesExchanger = Address(base58'3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37')
37+
38+let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
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'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
3755
4058 let govAddr = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
4159
4260 let stakingAddress = Address(base58'3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg')
43-
44-let USDNToWavesExchanger = Address(base58'3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37')
4561
4662 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
4763
163179
164180 func invariantCalc (x,y) = {
165181 let sk = skewness(x, y)
166- (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)))
167183 }
168184
169185
191207 else acc
192208
193209 let stepAmount = {
194- let $list57265769 = [1, 2, 3, 4, 5]
195- let $size57265769 = size($list57265769)
196- let $acc057265769 = -1
197- if (($size57265769 == 0))
198- then $acc057265769
210+ let $list60256068 = [1, 2, 3, 4, 5]
211+ let $size60256068 = size($list60256068)
212+ let $acc060256068 = -1
213+ if (($size60256068 == 0))
214+ then $acc060256068
199215 else {
200- let $acc157265769 = getStepAmount($acc057265769, $list57265769[0])
201- if (($size57265769 == 1))
202- then $acc157265769
216+ let $acc160256068 = getStepAmount($acc060256068, $list60256068[0])
217+ if (($size60256068 == 1))
218+ then $acc160256068
203219 else {
204- let $acc257265769 = getStepAmount($acc157265769, $list57265769[1])
205- if (($size57265769 == 2))
206- then $acc257265769
220+ let $acc260256068 = getStepAmount($acc160256068, $list60256068[1])
221+ if (($size60256068 == 2))
222+ then $acc260256068
207223 else {
208- let $acc357265769 = getStepAmount($acc257265769, $list57265769[2])
209- if (($size57265769 == 3))
210- then $acc357265769
224+ let $acc360256068 = getStepAmount($acc260256068, $list60256068[2])
225+ if (($size60256068 == 3))
226+ then $acc360256068
211227 else {
212- let $acc457265769 = getStepAmount($acc357265769, $list57265769[3])
213- if (($size57265769 == 4))
214- then $acc457265769
228+ let $acc460256068 = getStepAmount($acc360256068, $list60256068[3])
229+ if (($size60256068 == 4))
230+ then $acc460256068
215231 else {
216- let $acc557265769 = getStepAmount($acc457265769, $list57265769[4])
217- if (($size57265769 == 5))
218- then $acc557265769
232+ let $acc560256068 = getStepAmount($acc460256068, $list60256068[4])
233+ if (($size60256068 == 5))
234+ then $acc560256068
219235 else {
220- let $acc657265769 = getStepAmount($acc557265769, $list57265769[5])
236+ let $acc660256068 = getStepAmount($acc560256068, $list60256068[5])
221237 throw("List size exceed 5")
222238 }
223239 }
282298 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"))
283299
284300
285-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))
286302
287303
288304 @Callable(i)
289305 func init () = {
290- let $t084478524 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
291- let pmtAmountA = $t084478524._1
292- let pmtAssetIdA = $t084478524._2
293- let $t085298606 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
294- let pmtAmountB = $t085298606._1
295- let pmtAssetIdB = $t085298606._2
296- let $t086118688 = getAssetInfo(pmtAssetIdA)
297- let pmtStrAssetIdA = $t086118688._1
298- let pmtAssetNameA = $t086118688._2
299- let pmtDecimalsA = $t086118688._3
300- let $t086938770 = getAssetInfo(pmtAssetIdB)
301- let pmtStrAssetIdB = $t086938770._1
302- let pmtAssetNameB = $t086938770._2
303- let pmtDecimalsB = $t086938770._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
304320 if (isDefined(getBoolean(this, kActive)))
305321 then throwIsActive()
306322 else if ((pmtAssetIdA == pmtAssetIdB))
309325 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
310326 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
311327 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
312- 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))
313329 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
314330 let shareIssueId = calculateAssetId(shareIssue)
315331 let invariantCalculated = invariantCalc(pmtAmountA, pmtAmountB)
357373
358374 @Callable(i)
359375 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = {
360- let $t01312513200 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
361- let pmtAmount = $t01312513200._1
362- let pmtAssetId = $t01312513200._2
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 $t01421214818 = 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 = $t01421214818._1
388- let virtualReplenishB = $t01421214818._2
389- let balanceAfterSwapA = $t01421214818._3
390- let balanceAfterSwapB = $t01421214818._4
391- let newBalanceA = $t01421214818._5
392- let newBalanceB = $t01421214818._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 $t01782017963 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
428- let pmtAmount = $t01782017963._1
429- let pmtAssetId = $t01782017963._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 $t01932119396 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
453- let pmtAmount = $t01932119396._1
454- let pmtAssetId = $t01932119396._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 $t02082221085 = 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 = $t02082221085._1
486- let newBalanceB = $t02082221085._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
580595 else if ((assetIdB == USDN))
581- then (invoke.payments[0].assetId == USDN)
596+ then (inv.payments[0].assetId == USDN)
582597 else false
583598 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adm1))
584599 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'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
30+let keyAdminPubKey1 = "admin_pub_1"
3131
32-let adm2 = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
32+let keyAdminPubKey2 = "admin_pub_2"
3333
34-let adm3 = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
34+let keyAdminPubKey3 = "admin_pub_3"
35+
36+let USDNToWavesExchanger = Address(base58'3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37')
37+
38+let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
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'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
3755
3856 let admStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
3957
4058 let govAddr = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
4159
4260 let stakingAddress = Address(base58'3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg')
43-
44-let USDNToWavesExchanger = Address(base58'3N77kfPbQyjXWpDALX3xjKw3iEGMWEctV37')
4561
4662 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
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)
89105
90106 let invariant = getIntegerValue(this, kInvariant)
91107
92108 let fee = 500
93109
94110 let feeGovernance = 200
95111
96112 let feeScale6 = 1000000
97113
98114 let scale3 = 1000
99115
100116 let scale8 = 100000000
101117
102118 let scale12 = 1000000000000
103119
104120 let slippageScale3 = 1000
105121
106122 let digits8 = 8
107123
108124 let dAppThreshold = 50
109125
110126 let dAppThresholdScale2 = 100
111127
112128 let exchangeRatioLimitMin = 90000000
113129
114130 let exchangeRatioLimitMax = 110000000
115131
116132 let alpha = 50
117133
118134 let alphaDigits = 2
119135
120136 let beta = 46000000
121137
122138 func accountBalance (assetId) = match assetId {
123139 case id: ByteVector =>
124140 assetBalance(this, id)
125141 case waves: Unit =>
126142 wavesBalance(this).available
127143 case _ =>
128144 throw("Match error")
129145 }
130146
131147
132148 let stakedAmountUSDN = match getInteger(stakingAddress, ((("rpd_balance_" + toBase58String(USDN)) + "_") + toString(this))) {
133149 case staked: Int =>
134150 staked
135151 case nothing: Unit =>
136152 0
137153 case _ =>
138154 throw("Match error")
139155 }
140156
141157 let availableBalanceA = (balanceA - (if ((assetIdA == USDN))
142158 then stakedAmountUSDN
143159 else 0))
144160
145161 let availableBalanceB = (balanceB - (if ((assetIdB == USDN))
146162 then stakedAmountUSDN
147163 else 0))
148164
149165 let accountBalanceWithStakedA = (accountBalance(assetIdA) + (if ((assetIdA == USDN))
150166 then stakedAmountUSDN
151167 else 0))
152168
153169 let accountBalanceWithStakedB = (accountBalance(assetIdB) + (if ((assetIdB == USDN))
154170 then stakedAmountUSDN
155171 else 0))
156172
157173 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
158174 then (accountBalanceWithStakedB >= balanceB)
159175 else false
160176
161177 func skewness (x,y) = (((fraction(scale12, x, y) + fraction(scale12, y, x)) / 2) / 10000)
162178
163179
164180 func invariantCalc (x,y) = {
165181 let sk = skewness(x, y)
166- (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)))
167183 }
168184
169185
170186 func calculateSendAmount (amountToSendEstimated,minTokenReceiveAmount,tokenReceiveAmount,tokenId) = {
171187 let slippageValue = (scale8 - ((scale8 * 1) / 10000000))
172188 let deltaBetweenMaxAndMinSendValue = (amountToSendEstimated - minTokenReceiveAmount)
173189 let x = (balanceA + tokenReceiveAmount)
174190 let y = (balanceB + tokenReceiveAmount)
175191 let invariantNew = if ((tokenId == assetIdA))
176192 then invariantCalc(x, (balanceB - amountToSendEstimated))
177193 else if ((tokenId == assetIdB))
178194 then invariantCalc((balanceA - amountToSendEstimated), y)
179195 else throw("Wrong asset in payment")
180196 let invariantEstimatedRatio = fraction(scale8, invariant, invariantNew)
181197 func getStepAmount (acc,step) = if ((acc == -1))
182198 then {
183199 let amountToSend = (amountToSendEstimated - ((step * deltaBetweenMaxAndMinSendValue) / 5))
184200 let stepInvariant = if ((tokenId == assetIdA))
185201 then invariantCalc(x, (balanceB - amountToSend))
186202 else invariantCalc((balanceA - amountToSend), y)
187203 if ((stepInvariant > invariant))
188204 then amountToSend
189205 else -1
190206 }
191207 else acc
192208
193209 let stepAmount = {
194- let $list57265769 = [1, 2, 3, 4, 5]
195- let $size57265769 = size($list57265769)
196- let $acc057265769 = -1
197- if (($size57265769 == 0))
198- then $acc057265769
210+ let $list60256068 = [1, 2, 3, 4, 5]
211+ let $size60256068 = size($list60256068)
212+ let $acc060256068 = -1
213+ if (($size60256068 == 0))
214+ then $acc060256068
199215 else {
200- let $acc157265769 = getStepAmount($acc057265769, $list57265769[0])
201- if (($size57265769 == 1))
202- then $acc157265769
216+ let $acc160256068 = getStepAmount($acc060256068, $list60256068[0])
217+ if (($size60256068 == 1))
218+ then $acc160256068
203219 else {
204- let $acc257265769 = getStepAmount($acc157265769, $list57265769[1])
205- if (($size57265769 == 2))
206- then $acc257265769
220+ let $acc260256068 = getStepAmount($acc160256068, $list60256068[1])
221+ if (($size60256068 == 2))
222+ then $acc260256068
207223 else {
208- let $acc357265769 = getStepAmount($acc257265769, $list57265769[2])
209- if (($size57265769 == 3))
210- then $acc357265769
224+ let $acc360256068 = getStepAmount($acc260256068, $list60256068[2])
225+ if (($size60256068 == 3))
226+ then $acc360256068
211227 else {
212- let $acc457265769 = getStepAmount($acc357265769, $list57265769[3])
213- if (($size57265769 == 4))
214- then $acc457265769
228+ let $acc460256068 = getStepAmount($acc360256068, $list60256068[3])
229+ if (($size60256068 == 4))
230+ then $acc460256068
215231 else {
216- let $acc557265769 = getStepAmount($acc457265769, $list57265769[4])
217- if (($size57265769 == 5))
218- then $acc557265769
232+ let $acc560256068 = getStepAmount($acc460256068, $list60256068[4])
233+ if (($size60256068 == 5))
234+ then $acc560256068
219235 else {
220- let $acc657265769 = getStepAmount($acc557265769, $list57265769[5])
236+ let $acc660256068 = getStepAmount($acc560256068, $list60256068[5])
221237 throw("List size exceed 5")
222238 }
223239 }
224240 }
225241 }
226242 }
227243 }
228244 }
229245 if ((0 > stepAmount))
230246 then throw("something went wrong while working with amountToSend")
231247 else if (if ((invariantEstimatedRatio > slippageValue))
232248 then (invariantNew > invariant)
233249 else false)
234250 then amountToSendEstimated
235251 else stepAmount
236252 }
237253
238254
239255 func getAssetInfo (assetId) = match assetId {
240256 case id: ByteVector =>
241257 let stringId = toBase58String(id)
242258 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
243259 $Tuple3(stringId, info.name, info.decimals)
244260 case waves: Unit =>
245261 $Tuple3("WAVES", "WAVES", 8)
246262 case _ =>
247263 throw("Match error")
248264 }
249265
250266
251267 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
252268
253269
254270 func deductStakingFee (amount,assetId) = if ((assetId == USDN))
255271 then {
256272 let result = (amount - stakingFeeInUSDN)
257273 if ((0 >= result))
258274 then throw((((("Insufficient amount " + toString(amount)) + " to deduct staking fee ") + toString(stakingFeeInUSDN)) + " USD-N"))
259275 else result
260276 }
261277 else amount
262278
263279
264280 func throwIsActive () = throw("DApp is already active")
265281
266282
267283 func throwIsInactive () = throw("DApp is inactive at this moment")
268284
269285
270286 func throwOnlyAdmin () = throw("Only admin can call this function")
271287
272288
273289 func throwAssets () = throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
274290
275291
276292 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))
277293
278294
279295 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"))
280296
281297
282298 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"))
283299
284300
285-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))
286302
287303
288304 @Callable(i)
289305 func init () = {
290- let $t084478524 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
291- let pmtAmountA = $t084478524._1
292- let pmtAssetIdA = $t084478524._2
293- let $t085298606 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
294- let pmtAmountB = $t085298606._1
295- let pmtAssetIdB = $t085298606._2
296- let $t086118688 = getAssetInfo(pmtAssetIdA)
297- let pmtStrAssetIdA = $t086118688._1
298- let pmtAssetNameA = $t086118688._2
299- let pmtDecimalsA = $t086118688._3
300- let $t086938770 = getAssetInfo(pmtAssetIdB)
301- let pmtStrAssetIdB = $t086938770._1
302- let pmtAssetNameB = $t086938770._2
303- let pmtDecimalsB = $t086938770._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
304320 if (isDefined(getBoolean(this, kActive)))
305321 then throwIsActive()
306322 else if ((pmtAssetIdA == pmtAssetIdB))
307323 then throw("Assets must be different")
308324 else {
309325 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
310326 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
311327 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
312- 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))
313329 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
314330 let shareIssueId = calculateAssetId(shareIssue)
315331 let invariantCalculated = invariantCalc(pmtAmountA, pmtAmountB)
316332 [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)]
317333 }
318334 }
319335
320336
321337
322338 @Callable(i)
323339 func replenishWithTwoTokens (slippageTolerance) = {
324340 let pmtAssetIdA = i.payments[0].assetId
325341 let pmtAssetIdB = i.payments[1].assetId
326342 let pmtAmountA = deductStakingFee(i.payments[0].amount, pmtAssetIdA)
327343 let pmtAmountB = deductStakingFee(i.payments[1].amount, pmtAssetIdB)
328344 let tokenRatio = fraction(fraction(scale8, balanceA, pmtAmountA), scale3, fraction(scale8, balanceB, pmtAmountB))
329345 let ratioShareTokensInA = fraction(scale8, pmtAmountA, balanceA)
330346 let ratioShareTokensInB = fraction(scale8, pmtAmountB, balanceB)
331347 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
332348 let invariantCalculated = invariantCalc((balanceA + pmtAmountA), (balanceB + pmtAmountB))
333349 if (!(isActive))
334350 then throwIsInactive()
335351 else if (if ((0 > slippageTolerance))
336352 then true
337353 else (slippageTolerance > 10))
338354 then throw("Slippage tolerance must be <= 1%")
339355 else if ((size(i.payments) != 2))
340356 then throw("Two attached assets expected")
341357 else if (if ((pmtAssetIdA != assetIdA))
342358 then true
343359 else (pmtAssetIdB != assetIdB))
344360 then throwAssets()
345361 else if (if ((((scale3 * (slippageScale3 - slippageTolerance)) / slippageScale3) > tokenRatio))
346362 then true
347363 else (tokenRatio > ((scale3 * (slippageScale3 + slippageTolerance)) / slippageScale3)))
348364 then throw("Incorrect assets amount: amounts must have the contract ratio")
349365 else if ((shareTokenToPayAmount == 0))
350366 then throw("Too small amount to replenish")
351367 else if (!(hasEnoughBalance))
352368 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
353369 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)]
354370 }
355371
356372
357373
358374 @Callable(i)
359375 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = {
360- let $t01312513200 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
361- let pmtAmount = $t01312513200._1
362- let pmtAssetId = $t01312513200._2
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 $t01421214818 = 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 = $t01421214818._1
388- let virtualReplenishB = $t01421214818._2
389- let balanceAfterSwapA = $t01421214818._3
390- let balanceAfterSwapB = $t01421214818._4
391- let newBalanceA = $t01421214818._5
392- let newBalanceB = $t01421214818._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 $t01782017963 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
428- let pmtAmount = $t01782017963._1
429- let pmtAssetId = $t01782017963._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 $t01932119396 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
453- let pmtAmount = $t01932119396._1
454- let pmtAssetId = $t01932119396._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 $t02082221085 = 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 = $t02082221085._1
486- let newBalanceB = $t02082221085._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
580595 else if ((assetIdB == USDN))
581- then (invoke.payments[0].assetId == USDN)
596+ then (inv.payments[0].assetId == USDN)
582597 else false
583598 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adm1))
584599 then true
585600 else sigVerify(tx.bodyBytes, tx.proofs[0], adm2))
586601 then true
587602 else sigVerify(tx.bodyBytes, tx.proofs[0], adm3))
588603 then true
589604 else sigVerify(tx.bodyBytes, tx.proofs[0], admStaking)
590605 if (if (if (callTakeIntoAccount)
591606 then true
592607 else callStaking)
593608 then true
594609 else exchangeToWaves)
595610 then signedByAdmin
596611 else false
597612 case _ =>
598613 let adm1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adm1))
599614 then 1
600615 else 0
601616 let adm2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adm2))
602617 then 1
603618 else 0
604619 let adm3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adm3))
605620 then 1
606621 else 0
607622 (((adm1Signed + adm2Signed) + adm3Signed) >= 2)
608623 }
609624

github/deemru/w8io/169f3d6 
107.71 ms