tx · 8j8Bvnp8bJY4Z93CjgxecJXuRHajXGLe6vG6KNn13CK

3PPH7x7iqobW5ziyiRCic19rQqKr6nPYaK1:  -0.01400000 Waves

2020.11.13 11:11 [2327094] smart account 3PPH7x7iqobW5ziyiRCic19rQqKr6nPYaK1 > SELF 0.00000000 Waves

{ "type": 13, "id": "8j8Bvnp8bJY4Z93CjgxecJXuRHajXGLe6vG6KNn13CK", "fee": 1400000, "feeAssetId": null, "timestamp": 1605253900740, "version": 1, "sender": "3PPH7x7iqobW5ziyiRCic19rQqKr6nPYaK1", "senderPublicKey": "5aTg4oxM77iRmUGy3y8Zavn5fhVbgtUciAuSGfCJAYjn", "proofs": [ "3rgyRRRghvJYZ8u9LHW3ef2UyDNBYgDD3jo96gnRfdSVtetRabJ7ZUGzjctSgKrp5xBEP5SUFbjbqpvuWRgdfMCj", "HZrcW4QYmmE65iqAS9H9bbuKfbpt7vXCoxn9Hdgnj82JAY8X4EsG6YtJmHkd5grvmPCjrM1pCKuuVgLb95tfGNC" ], "script": "base64:AAIEAAAAAAAAABsIAhIAEgMKAQESBAoCAQESABIECgIBARIAEgAAAAA4AAAAAAd2ZXJzaW9uAgAAAAUyLjAuMAAAAAAKa2V5VmVyc2lvbgIAAAAHdmVyc2lvbgAAAAAJa2V5QWN0aXZlAgAAAAZhY3RpdmUAAAAAC2tleUFzc2V0SWRBAgAAAApBX2Fzc2V0X2lkAAAAAAtrZXlBc3NldElkQgIAAAAKQl9hc3NldF9pZAAAAAALa2V5QmFsYW5jZUECAAAAD0FfYXNzZXRfYmFsYW5jZQAAAAALa2V5QmFsYW5jZUICAAAAD0JfYXNzZXRfYmFsYW5jZQAAAAAPa2V5U2hhcmVBc3NldElkAgAAAA5zaGFyZV9hc3NldF9pZAAAAAATa2V5U2hhcmVBc3NldFN1cHBseQIAAAASc2hhcmVfYXNzZXRfc3VwcGx5AAAAAA1rZXlDb21taXNzaW9uAgAAAApjb21taXNzaW9uAAAAABtrZXlDb21taXNzaW9uU2NhbGVEZWxpbWl0ZXICAAAAGmNvbW1pc3Npb25fc2NhbGVfZGVsaW1pdGVyAAAAABdrZXlDb21taXNzaW9uR292ZXJuYW5jZQIAAAAVY29tbWlzc2lvbl9nb3Zlcm5hbmNlAAAAAAxrZXlJbnZhcmlhbnQCAAAACWludmFyaWFudAAAAAAIa2V5Q2F1c2UCAAAADnNodXRkb3duX2NhdXNlAAAAAAxhZG1pblB1YktleTEBAAAAILoJ1zuJWaTRXaD/8bsz0KrhOWkPy+K9kdY77k9eqOATAAAAAAxhZG1pblB1YktleTIBAAAAIMKRRJmz0rC0DSKlkVi9iLyhN7sIy//djOaU71sWDn5AAAAAAAxhZG1pblB1YktleTMBAAAAII4eFy54sQc79EhOejMoYHYod/yZ5ZIwoyDCz6ir6Q5VAAAAABVhZG1pblB1YktleTRzdGFydFN0b3ABAAAAIM5ZDtzqs16jrhv9V17n63kRNSl0RjKbPBVfPAUbKGF7AAAAABFnb3Zlcm5hbmNlQWRkcmVzcwkBAAAAB0FkZHJlc3MAAAABAQAAABoBVy/kXyChDk0K0DSxrx6s2TL7zcR9Ux8M8QAAAAAIaXNBY3RpdmUJAQAAABFAZXh0ck5hdGl2ZSgxMDUxKQAAAAIFAAAABHRoaXMFAAAACWtl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QQAAAAxhbW91bnRUb2tlbkIAAAASdG9rZW5SZWNlaXZlQW1vdW50BAAAAA1zbGlwcGFnZVZhbHVlCQAAZQAAAAIFAAAAC3NjYWxlVmFsdWU4CQAAaQAAAAIJAABoAAAAAgUAAAALc2NhbGVWYWx1ZTgAAAAAAAAAAAEAAAAAAACYloAEAAAAHmRlbHRhQmV0d2Vlbk1heEFuZE1pblNlbmRWYWx1ZQkAAGUAAAACBQAAABVhbW91bnRUb1NlbmRFc3RpbWF0ZWQFAAAAFW1pblRva2VuUmVjZWl2ZUFtb3VudAQAAAARYW1vdW50VG9TZW5kU3RlcDEJAABlAAAAAgUAAAAVYW1vdW50VG9TZW5kRXN0aW1hdGVkCQAAaQAAAAIJAABoAAAAAgAAAAAAAAAAAQUAAAAeZGVsdGFCZXR3ZWVuTWF4QW5kTWluU2VuZFZhbHVlAAAAAAAAAAAFBAAAABFhbW91bnRUb1NlbmRTdGVwMgkAAGUAAAACBQAAABVhbW91bnRUb1NlbmRFc3RpbWF0ZWQJAABpAAAAAgkAAGgAAAACAAAAAAAAAAACBQAAAB5kZWx0YUJldHdlZW5NYXhBbmRNaW5TZW5kVmFsdWUAAAAAAAAAAAUEAAAAEWFtb3VudFRvU2VuZFN0ZXAzCQAAZQAAAAIFAAAAFWFtb3VudFRvU2VuZEVzdGltYXRlZAkAAGkAAAACCQAAaAAAAAIAAAAAAAAAAAMFAAAAHmRlbHRhQmV0d2Vlbk1heEFuZE1pblNlbmRWYWx1ZQAAAAAAAAAABQQAAAARYW1vdW50VG9TZW5kU3RlcDQJAABlAAAAAgUAAAAVYW1vdW50VG9TZW5kRXN0aW1hdGVkCQAAaQAAAAIJAABoAAAAAgAAAAAAAAAABAUAAAAeZGVsdGFCZXR3ZWVuTWF4QW5kTWluU2VuZFZhbHVlAAAAAAAAAAAFBAAAABFhbW91bnRUb1NlbmRTdGVwNQkAAGUAAAACBQAAABVhbW91bnRUb1NlbmRFc3RpbWF0ZWQJAABpAAAAAgkAAGgAAAACAAAAAAAAAAAFBQAAAB5kZWx0YUJldHdlZW5NYXhBbmRNaW5TZW5kVmFsdWUAAAAAAAAAAAUEAAAAAXkJAABkAAAAAgUAAAAMYW1vdW50VG9rZW5CBQAAABJ0b2tlblJlY2VpdmVBbW91bnQEAAAAF2ludmFyaWFudEVzdGltYXRlZFJhdGlvCQAAawAAAAMFAAAACWludmFyaWFudAUAAAALc2NhbGVWYWx1ZTgJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgkAAGUAAAACBQAAAAxhbW91bnRUb2tlbkEFAAAAFWFtb3VudFRvU2VuZEVzdGltYXRlZAUAAAABeQMJAABmAAAAAgAAAAAAAAAAAAkAAGUAAAACCQEAAAANaW52YXJpYW50Q2FsYwAAAAIJAABlAAAAAgUAAAAMYW1vdW50VG9rZW5BBQAAABFhbW91bnRUb1NlbmRTdGVwNQUAAAABeQUAAAAJaW52YXJpYW50CQAAAgAAAAECAAAAJG1pblRva2VuUmVjZWl2ZUFtb3VudCB0b28gbGFyZ2UuZXJyMQMDCQAAZgAAAAIFAAAAF2ludmFyaWFudEVzdGltYXRlZFJhdGlvBQAAAA1zbGlwcGFnZVZhbHVlCQAAZgAAAAIFAAAAC3NjYWxlVmFsdWU4BQAAABdpbnZhcmlhbnRFc3RpbWF0ZWRSYXRpbwcFAAAAFWFtb3VudFRvU2VuZEVzdGltYXRlZAMJAABmAAAAAgkAAGUAAAACCQEAAAANaW52YXJpYW50Q2FsYwAAAAIJAABlAAAAAgUAAAAMYW1vdW50VG9rZW5BBQAAABFhbW91bnRUb1NlbmRTdGVwMQUAAAABeQUAAAAJaW52YXJpYW50AAAAAAAAAAAACQAAaQAAAAIJAABoAAAAAgUAAAARYW1vdW50VG9TZW5kU3RlcDEJAABlAAAAAgUAAAAYY29tbWlzc2lvblNjYWxlRGVsaW1pdGVyBQAAAApjb21taXNzaW9uBQAAABhjb21taXNzaW9uU2NhbGVEZWxpbWl0ZXIDCQAAZgAAAAIJAABlAAAAAgkBAAAADWludmFyaWFudENhbGMAAAACCQAAZQAAAAIFAAAADGFtb3VudFRva2VuQQUAAAARYW1vdW50VG9TZW5kU3RlcDIFAAAAAXkFAAAACWludmFyaWFudAAAAAAAAAAAAAkAAGkAAAACCQAAaAAAAAIFAAAAEWFtb3VudFRvU2VuZFN0ZXAyCQAAZQAAAAIFAAAAGGNvbW1pc3Npb25TY2FsZURlbGltaXRlcgUAAAAKY29tbWlzc2lvbgUAAAAYY29tbWlzc2lvblNjYWxlRGVsaW1pdGVyAwkAAGYAAAACCQAAZQAAAAIJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgkAAGUAAAACBQAAAAxhbW91bnRUb2tlbkEFAAAAEWFtb3VudFRvU2VuZFN0ZXAzBQAAAAF5BQAAAAlpbnZhcmlhbnQAAAAAAAAAAAAJAABpAAAAAgkAAGgAAAACBQAAABFhbW91bnRUb1NlbmRTdGVwMwkAAGUAAAACBQAAABhjb21taXNzaW9uU2NhbGVEZWxpbWl0ZXIFAAAACmNvbW1pc3Npb24FAAAAGGNvbW1pc3Npb25TY2FsZURlbGltaXRlcgMJAABmAAAAAgkAAGUAAAACCQEAAAANaW52YXJpYW50Q2FsYwAAAAIJAABlAAAAAgUAAAAMYW1vdW50VG9rZW5BBQAAABFhbW91bnRUb1NlbmRTdGVwNAUAAAABeQUAAAAJaW52YXJpYW50AAAAAAAAAAAACQAAaQAAAAIJAABoAAAAAgUAAAARYW1vdW50VG9TZW5kU3RlcDQJAABlAAAAAgUAAAAYY29tbWlzc2lvblNjYWxlRGVsaW1pdGVyBQAAAApjb21taXNzaW9uBQAAABhjb21taXNzaW9uU2NhbGVEZWxpbWl0ZXIDCQAAZgAAAAIJAABlAAAAAgkBAAAADWludmFyaWFudENhbGMAAAACCQAAZQAAAAIFAAAADGFtb3VudFRva2VuQQUAAAARYW1vdW50VG9TZW5kU3RlcDUFAAAAAXkFAAAACWludmFyaWFudAAAAAAAAAAAAAkAAGkAAAACCQAAaAAAAAIFAAAAEWFtb3VudFRvU2VuZFN0ZXA1CQAAZQAAAAIFAAAAGGNvbW1pc3Npb25TY2FsZURlbGltaXRlcgUAAAAKY29tbWlzc2lvbgUAAAAYY29tbWlzc2lvblNjYWxlRGVsaW1pdGVyCQAAAgAAAAECAAAAPnNvbWV0aGluZyB3ZW50IHdyb25nIHdoaWxlIHdvcmtpbmcgd2l0aCBhbW91bnRUb1NlbmRTdGVwLiBlcnIyAQAAABpjYWxjdWxhdGVIb3dNYW55U2VuZFRva2VuQgAAAAUAAAAVYW1vdW50VG9TZW5kRXN0aW1hdGVkAAAAFW1pblRva2VuUmVjZWl2ZUFtb3VudAAAAAxhbW91bnRUb2tlbkEAAAAMYW1vdW50VG9rZW5CAAAAEnRva2VuUmVjZWl2ZUFtb3VudAQAAAANc2xpcHBhZ2VWYWx1ZQkAAGUAAAACBQAAAAtzY2FsZVZhbHVlOAkAAGkAAAACCQAAaAAAAAIFAAAAC3NjYWxlVmFsdWU4AAAAAAAAAAABAAAAAAAAmJaABAAAAB5kZWx0YUJldHdlZW5NYXhBbmRNaW5TZW5kVmFsdWUJAABlAAAAAgUAAAAVYW1vdW50VG9TZW5kRXN0aW1hdGVkBQAAABVtaW5Ub2tlblJlY2VpdmVBbW91bnQEAAAAEWFtb3VudFRvU2VuZFN0ZXAxCQAAZQAAAAIFAAAAFWFtb3VudFRvU2VuZEVzdGltYXRlZAkAAGkAAAACCQAAaAAAAAIAAAAAAAAAAAEFAAAAHmRlbHRhQmV0d2Vlbk1heEFuZE1pblNlbmRWYWx1ZQAAAAAAAAAABQQAAAARYW1vdW50VG9TZW5kU3RlcDIJAABlAAAAAgUAAAAVYW1vdW50VG9TZW5kRXN0aW1hdGVkCQAAaQAAAAIJAABoAAAAAgAAAAAAAAAAAgUAAAAeZGVsdGFCZXR3ZWVuTWF4QW5kTWluU2VuZFZhbHVlAAAAAAAAAAAFBAAAABFhbW91bnRUb1NlbmRTdGVwMwkAAGUAAAACBQAAABVhbW91bnRUb1NlbmRFc3RpbWF0ZWQJAABpAAAAAgkAAGgAAAACAAAAAAAAAAADBQAAAB5kZWx0YUJldHdlZW5NYXhBbmRNaW5TZW5kVmFsdWUAAAAAAAAAAAUEAAAAEWFtb3VudFRvU2VuZFN0ZXA0CQAAZQAAAAIFAAAAFWFtb3VudFRvU2VuZEVzdGltYXRlZAkAAGkAAAACCQAAaAAAAAIAAAAAAAAAAAQFAAAAHmRlbHRhQmV0d2Vlbk1heEFuZE1pblNlbmRWYWx1ZQAAAAAAAAAABQQAAAARYW1vdW50VG9TZW5kU3RlcDUJAABlAAAAAgUAAAAVYW1vdW50VG9TZW5kRXN0aW1hdGVkCQAAaQAAAAIJAABoAAAAAgAAAAAAAAAABQUAAAAeZGVsdGFCZXR3ZWVuTWF4QW5kTWluU2VuZFZhbHVlAAAAAAAAAAAFBAAAAAF4CQAAZAAAAAIFAAAADGFtb3VudFRva2VuQQUAAAASdG9rZW5SZWNlaXZlQW1vdW50BAAAABdpbnZhcmlhbnRFc3RpbWF0ZWRSYXRpbwkAAGsAAAADBQAAAAlpbnZhcmlhbnQFAAAAC3NjYWxlVmFsdWU4CQEAAAANaW52YXJpYW50Q2FsYwAAAAIFAAAAAXgJAABlAAAAAgUAAAAMYW1vdW50VG9rZW5CBQAAABVhbW91bnRUb1NlbmRFc3RpbWF0ZWQDCQAAZgAAAAIAAAAAAAAAAAAJAABlAAAAAgkBAAAADWludmFyaWFudENhbGMAAAACBQAAAAF4CQAAZQAAAAIFAAAADGFtb3VudFRva2VuQgUAAAARYW1vdW50VG9TZW5kU3RlcDUFAAAACWludmFyaWFudAkAAAIAAAABAgAAACRtaW5Ub2tlblJlY2VpdmVBbW91bnQgdG9vIGxhcmdlLmVycjEDAwkAAGYAAAACBQAAABdpbnZhcmlhbnRFc3RpbWF0ZWRSYXRpbwUAAAANc2xpcHBhZ2VWYWx1ZQkAAGYAAAACBQAAAAtzY2FsZVZhbHVlOAUAAAAXaW52YXJpYW50RXN0aW1hdGVkUmF0aW8HBQAAABVhbW91bnRUb1NlbmRFc3RpbWF0ZWQDCQAAZgAAAAIJAABlAAAAAgkBAAAADWludmFyaWFudENhbGMAAAACBQAAAAF4CQAAZQAAAAIFAAAADGFtb3VudFRva2VuQgUAAAARYW1vdW50VG9TZW5kU3RlcDEFAAAACWludmFyaWFudAAAAAAAAAAAAAkAAGkAAAACCQAAaAAAAAIFAAAAEWFtb3VudFRvU2VuZFN0ZXAxCQAAZQAAAAIFAAAAGGNvbW1pc3Npb25TY2FsZURlbGltaXRlcgUAAAAKY29tbWlzc2lvbgUAAAAYY29tbWlzc2lvblNjYWxlRGVsaW1pdGVyAwkAAGYAAAACCQAAZQAAAAIJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgUAAAABeAkAAGUAAAACBQAAAAxhbW91bnRUb2tlbkIFAAAAEWFtb3VudFRvU2VuZFN0ZXAyBQAAAAlpbnZhcmlhbnQAAAAAAAAAAAAJAABpAAAAAgkAAGgAAAACBQAAABFhbW91bnRUb1NlbmRTdGVwMgkAAGUAAAACBQAAABhjb21taXNzaW9uU2NhbGVEZWxpbWl0ZXIFAAAACmNvbW1pc3Npb24FAAAAGGNvbW1pc3Npb25TY2FsZURlbGltaXRlcgMJAABmAAAAAgkAAGUAAAACCQEAAAANaW52YXJpYW50Q2FsYwAAAAIFAAAAAXgJAABlAAAAAgUAAAAMYW1vdW50VG9rZW5CBQAAABFhbW91bnRUb1NlbmRTdGVwMwUAAAAJaW52YXJpYW50AAAAAAAAAAAACQAAaQAAAAIJAABoAAAAAgUAAAARYW1vdW50VG9TZW5kU3RlcDMJAABlAAAAAgUAAAAYY29tbWlzc2lvblNjYWxlRGVsaW1pdGVyBQAAAApjb21taXNzaW9uBQAAABhjb21taXNzaW9uU2NhbGVEZWxpbWl0ZXIDCQAAZgAAAAIJAABlAAAAAgkBAAAADWludmFyaWFudENhbGMAAAACBQAAAAF4CQAAZQAAAAIFAAAADGFtb3VudFRva2VuQgUAAAARYW1vdW50VG9TZW5kU3RlcDQFAAAACWludmFyaWFudAAAAAAAAAAAAAkAAGkAAAACCQAAaAAAAAIFAAAAEWFtb3VudFRvU2VuZFN0ZXA0CQAAZQAAAAIFAAAAGGNvbW1pc3Npb25TY2FsZURlbGltaXRlcgUAAAAKY29tbWlzc2lvbgUAAAAYY29tbWlzc2lvblNjYWxlRGVsaW1pdGVyAwkAAGYAAAACCQAAZQAAAAIJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgUAAAABeAkAAGUAAAACBQAAAAxhbW91bnRUb2tlbkIFAAAAEWFtb3VudFRvU2VuZFN0ZXA1BQAAAAlpbnZhcmlhbnQAAAAAAAAAAAAJAABpAAAAAgkAAGgAAAACBQAAABFhbW91bnRUb1NlbmRTdGVwNQkAAGUAAAACBQAAABhjb21taXNzaW9uU2NhbGVEZWxpbWl0ZXIFAAAACmNvbW1pc3Npb24FAAAAGGNvbW1pc3Npb25TY2FsZURlbGltaXRlcgkAAAIAAAABAgAAAD5zb21ldGhpbmcgd2VudCB3cm9uZyB3aGlsZSB3b3JraW5nIHdpdGggYW1vdW50VG9TZW5kU3RlcC4gZXJyMgEAAAAMZ2V0QXNzZXRJbmZvAAAAAQAAAAdhc3NldElkBAAAAAckbWF0Y2gwBQAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAJp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bAAAAAYFAAAACnBtdEFtb3VudEEFAAAADHBtdERlY2ltYWxzQQAAAAAAAAAABQAAAAAAAAAAAQUAAAAMcG10RGVjaW1hbHNBBQAAAAhIQUxGRE9XTgkAAGwAAAAGBQAAAApwbXRBbW91bnRCBQAAAAxwbXREZWNpbWFsc0IAAAAAAAAAAAUAAAAAAAAAAAEFAAAADHBtdERlY2ltYWxzQgUAAAAISEFMRkRPV04JAABsAAAABgAAAAAAAAAACgAAAAAAAAAAAAUAAAANc2hhcmVEZWNpbWFscwAAAAAAAAAAAAAAAAAAAAAAAAUAAAAISEFMRkRPV04EAAAACnNoYXJlSXNzdWUJAARCAAAABQUAAAAJc2hhcmVOYW1lBQAAABBzaGFyZURlc2NyaXB0aW9uBQAAABJzaGFyZUluaXRpYWxTdXBwbHkFAAAADXNoYXJlRGVjaW1hbHMGBAAAAAxzaGFyZUlzc3VlSWQJAAQ4AAAAAQUAAAAKc2hhcmVJc3N1ZQQAAAATaW52YXJpYW50Q2FsY3VsYXRlZAkBAAAADWludmFyaWFudENhbGMAAAACBQAAAApwbXRBbW91bnRBBQAAAApwbXRBbW91bnRCCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAACmtleVZlcnNpb24FAAAAB3ZlcnNpb24JAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIFAAAACWtleUFjdGl2ZQYJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAALa2V5QXNzZXRJZEEFAAAADnBtdFN0ckFzc2V0SWRBCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAC2tleUFzc2V0SWRCBQAAAA5wbXRTdHJBc3NldElkQgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUEFAAAACnBtdEFtb3VudEEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VCBQAAAApwbXRBbW91bnRCCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAxrZXlJbnZhcmlhbnQFAAAAE2ludmFyaWFudENhbGN1bGF0ZWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADWtleUNvbW1pc3Npb24FAAAACmNvbW1pc3Npb24JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAG2tleUNvbW1pc3Npb25TY2FsZURlbGltaXRlcgUAAAAYY29tbWlzc2lvblNjYWxlRGVsaW1pdGVyCQAETAAAAAIFAAAACnNoYXJlSXNzdWUJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAPa2V5U2hhcmVBc3NldElkCQACWAAAAAEFAAAADHNoYXJlSXNzdWVJZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAATa2V5U2hhcmVBc3NldFN1cHBseQUAAAASc2hhcmVJbml0aWFsU3VwcGx5CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAASc2hhcmVJbml0aWFsU3VwcGx5BQAAAAxzaGFyZUlzc3VlSWQFAAAAA25pbAAAAAFpAQAAABZyZXBsZW5pc2hXaXRoVHdvVG9rZW5zAAAAAQAAABFzbGlwcGFnZVRvbGVyYW5jZQQAAAANJHQwMTExMzcxMTIxNAkABRQAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAACnBtdEFtb3VudEEIBQAAAA0kdDAxMTEzNzExMjE0AAAAAl8xBAAAAAtwbXRBc3NldElkQQgFAAAADSR0MDExMTM3MTEyMTQAAAACXzIEAAAADSR0MDExMjE5MTE0MTMJAAUUAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEAAAAGYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQAAAAdhc3NldElkBAAAAApwbXRBbW91bnRCCAUAAAANJHQwMTEyMTkxMTQxMwAAAAJfMQQAAAALcG10QXNzZXRJZEIIBQAAAA0kdDAxMTIxOTExNDEzAAAAAl8yBAAAAAp0b2tlblJhdGlvCQAAawAAAAMJAABrAAAAAwUAAAAIYmFsYW5jZUEFAAAAC3NjYWxlVmFsdWU4BQAAAApwbXRBbW91bnRBBQAAAAtzY2FsZVZhbHVlMwkAAGsAAAADBQAAAAhiYWxhbmNlQgUAAAALc2NhbGVWYWx1ZTgFAAAACnBtdEFtb3VudEIEAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAABrAAAAAwUAAAAKcG10QW1vdW50QQUAAAALc2NhbGVWYWx1ZTgFAAAACGJhbGFuY2VBBAAAABNyYXRpb1NoYXJlVG9rZW5zSW5CCQAAawAAAAMFAAAACnBtdEFtb3VudEIFAAAAC3NjYWxlVmFsdWU4BQAAAAhiYWxhbmNlQgQAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50CQAAawAAAAMJAAGXAAAAAQkABEwAAAACBQAAABNyYXRpb1NoYXJlVG9rZW5zSW5BCQAETAAAAAIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkIFAAAAA25pbAUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAALc2NhbGVWYWx1ZTgEAAAAE2ludmFyaWFudENhbGN1bGF0ZWQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAAKcG10QW1vdW50QQkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAKcG10QW1vdW50QgMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAAACAAAAAQIAAAAfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAMDCQAAZgAAAAIAAAAAAAAAAAAFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBgkAAGYAAAACBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAApU2xpcHBhZ2UgdG9sZXJhbmNlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAJAAGkAAAAAQUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXICAAAAFiBpbmNsdXNpdmVseS4gQWN0dWFsOiAJAAGkAAAAAQUAAAARc2xpcHBhZ2VUb2xlcmFuY2UDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAACCQAAAgAAAAECAAAAHFR3byBhdHRhY2hlZCBhc3NldHMgZXhwZWN0ZWQDAwkBAAAAAiE9AAAAAgUAAAALcG10QXNzZXRJZEEFAAAACGFzc2V0SWRBBgkBAAAAAiE9AAAAAgUAAAALcG10QXNzZXRJZEIFAAAACGFzc2V0SWRCCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAJUluY29ycmVjdCBhc3NldHMgYXR0YWNoZWQuIEV4cGVjdGVkOiAFAAAAC3N0ckFzc2V0SWRBAgAAAAUgYW5kIAUAAAALc3RyQXNzZXRJZEIDAwkAAGYAAAACCQAAaQAAAAIJAABoAAAAAgUAAAALc2NhbGVWYWx1ZTMJAABlAAAAAgUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIFAAAAEXNsaXBwYWdlVG9sZXJhbmNlBQAAABpzbGlwcGFnZVRvbGVyYW5jZURlbGltaXRlcgUAAAAKdG9rZW5SYXRpbwYJAABmAAAAAgUAAAAKdG9rZW5SYXRpbwkAAGkAAAACCQAAaAAAAAIFAAAAC3NjYWxlVmFsdWUzCQAAZAAAAAIFAAAAGnNsaXBwYWdlVG9sZXJhbmNlRGVsaW1pdGVyBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAac2xpcHBhZ2VUb2xlcmFuY2VEZWxpbWl0ZXIJAAACAAAAAQIAAAA9SW5jb3JyZWN0IGFzc2V0cyBhbW91bnQ6IGFtb3VudHMgbXVzdCBoYXZlIHRoZSBjb250cmFjdCByYXRpbwMJAAAAAAAAAgUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50AAAAAAAAAAAACQAAAgAAAAECAAAAHVRvbyBzbWFsbCBhbW91bnQgdG8gcmVwbGVuaXNoAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQEAAAAHc3VzcGVuZAAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAI1N1c3BpY2lvdXMgc3RhdGUuIEFjdHVhbCBiYWxhbmNlczogCQABpAAAAAEFAAAACGJhbGFuY2VBAgAAAAEgBQAAAAphc3NldE5hbWVBAgAAAAIsIAkAAaQAAAABBQAAAAhiYWxhbmNlQgIAAAABIAUAAAAKYXNzZXROYW1lQgIAAAAJLiBTdGF0ZTogCQABpAAAAAEJAQAAAA5hY2NvdW50QmFsYW5jZQAAAAEFAAAACGFzc2V0SWRBAgAAAAEgBQAAAAphc3NldE5hbWVBAgAAAAIsIAkAAaQAAAABCQEAAAAOYWNjb3VudEJhbGFuY2UAAAABBQAAAAhhc3NldElkQgIAAAABIAUAAAAKYXNzZXROYW1lQgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUEJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAACnBtdEFtb3VudEEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tleUJhbGFuY2VCCQAAZAAAAAIFAAAACGJhbGFuY2VCBQAAAApwbXRBbW91bnRCCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABNrZXlTaGFyZUFzc2V0U3VwcGx5CQAAZAAAAAIFAAAAEHNoYXJlQXNzZXRTdXBwbHkFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAMa2V5SW52YXJpYW50BQAAABNpbnZhcmlhbnRDYWxjdWxhdGVkCQAETAAAAAIJAQAAAAdSZWlzc3VlAAAAAwUAAAAMc2hhcmVBc3NldElkBQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQGCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50BQAAAAxzaGFyZUFzc2V0SWQFAAAAA25pbAAAAAFpAQAAABVyZXBsZW5pc2hXaXRoT25lVG9rZW4AAAACAAAAE3ZpcnR1YWxTd2FwVG9rZW5QYXkAAAATdmlydHVhbFN3YXBUb2tlbkdldAQAAAANJHQwMTM3NjIxMzgzNwkA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aW1hdGVkUmF0aW8JAABrAAAAAwUAAAAJaW52YXJpYW50BQAAAAtzY2FsZVZhbHVlOAkBAAAADWludmFyaWFudENhbGMAAAACBQAAABhiYWxhbmNlQWZ0ZXJWaXJ0dWFsU3dhcEEFAAAAGGJhbGFuY2VBZnRlclZpcnR1YWxTd2FwQgMDCQAAZgAAAAIFAAAAF2ludmFyaWFudEVzdGltYXRlZFJhdGlvBQAAABdzbGlwcGFnZVZhbHVlTWluRm9yU3dhcAkAAGYAAAACBQAAAAtzY2FsZVZhbHVlOAUAAAAXaW52YXJpYW50RXN0aW1hdGVkUmF0aW8HBAAAACVyYXRpb1ZpcnR1YWxCYWxhbmNlVG9WaXJ0dWFsUmVwbGVuaXNoCQAAaQAAAAIJAABrAAAAAwUAAAAYYmFsYW5jZUFmdGVyVmlydHVhbFN3YXBBCQAAaAAAAAIFAAAAC3NjYWxlVmFsdWU4BQAAAAtzY2FsZVZhbHVlOAUAAAAYYmFsYW5jZUFmdGVyVmlydHVhbFN3YXBCCQAAawAAAAMFAAAAHGFtb3VudFZpcnR1YWxSZXBsZW5pc2hUb2tlbkEFAAAAC3NjYWxlVmFsdWU4BQAAABxhbW91bnRWaXJ0dWFsUmVwbGVuaXNoVG9rZW5CAwMJAABmAAAAAgUAAAAcc2xpcHBhZ2VWYWx1ZU1pbkZvclJlcGxlbmlzaAUAAAAlcmF0aW9WaXJ0dWFsQmFsYW5jZVRvVmlydHVhbFJlcGxlbmlzaAYJAABmAAAAAgUAAAAlcmF0aW9WaXJ0dWFsQmFsYW5jZVRvVmlydHVhbFJlcGxlbmlzaAUAAAAcc2xpcHBhZ2VWYWx1ZU1heEZvclJlcGxlbmlzaAkAAAIAAAABAgAAAGZzd29wIHdpdGggdmlydHVhbFN3YXBUb2tlblBheSBhbmQgdmlydHVhbFN3YXBUb2tlbkdldCBwb3NzaWJsZSwgYnV0IHJhdGlvIGFmdGVyIHZpcnR1YWwgc3dhcCBpbmNvcnJlY3QEAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAABrAAAAAwUAAAAcYW1vdW50VmlydHVhbFJlcGxlbmlzaFRva2VuQQUAAAALc2NhbGVWYWx1ZTgFAAAAGGJhbGFuY2VBZnRlclZpcnR1YWxTd2FwQQQAAAATcmF0aW9TaGFyZVRva2Vuc0luQgkAAGsAAAADBQAAABxhbW91bnRWaXJ0dWFsUmVwbGVuaXNoVG9rZW5CBQAAAAtzY2FsZVZhbHVlOAUAAAAYYmFsYW5jZUFmdGVyVmlydHVhbFN3YXBCBAAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQJAABrAAAAAwkAAZcAAAABCQAETAAAAAIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAARMAAAAAgUAAAATcmF0aW9TaGFyZVRva2Vuc0luQgUAAAADbmlsBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAtzY2FsZVZhbHVlOAQAAAATaW52YXJpYW50Q2FsY3VsYXRlZAkBAAAADWludmFyaWFudENhbGMAAAACCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAAlwbXRBbW91bnQFAAAACGJhbGFuY2VCBAAAAA9uZXdBbW91bnRUb2tlbkEJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAACXBtdEFtb3VudAQAAAAPbmV3QW1vdW50VG9rZW5CBQAAAAhiYWxhbmNlQgQAAAATZEFwcFRocmVzaG9sZEFtb3VudAkAAGsAAAADCQAAZAAAAAIFAAAAD25ld0Ftb3VudFRva2VuQQUAAAAPbmV3QW1vdW50VG9rZW5CBQAAAA1kQXBwVGhyZXNob2xkCQAAaAAAAAIAAAAAAAAAAAIFAAAAFmRBcHBUaHJlc2hvbGREZWxpbWl0ZXIDAwkAAGYAAAACBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAA9uZXdBbW91bnRUb2tlbkEGCQAAZgAAAAIFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAD25ld0Ftb3VudFRva2VuQgkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAADlOZXcgYmFsYW5jZSBpbiBhc3NldHMgb2YgdGhlIERBcHAgaXMgbGVzcyB0aGFuIHRocmVzaG9sZCAJAAGkAAAAAQUAAAATZEFwcFRocmVzaG9sZEFtb3VudAIAAAACLiAFAAAACmFzc2V0TmFtZUECAAAAAjogCQABpAAAAAEFAAAAD25ld0Ftb3VudFRva2VuQQIAAAACLCAFAAAACmFzc2V0TmFtZUICAAAAAjogCQABpAAAAAEFAAAAD25ld0Ftb3VudFRva2VuQgkABEwAAAACCQEAAAAHUmVpc3N1ZQAAAAMFAAAADHNoYXJlQXNzZXRJZAUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50BgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAUAAAAMc2hhcmVBc3NldElkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABNrZXlTaGFyZUFzc2V0U3VwcGx5CQAAZAAAAAIFAAAAEHNoYXJlQXNzZXRTdXBwbHkFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUEFAAAAD25ld0Ftb3VudFRva2VuQQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAMa2V5SW52YXJpYW50BQAAABNpbnZhcmlhbnRDYWxjdWxhdGVkBQAAAANuaWwJAAACAAAAAQIAAAA6aW5jb3JyZWN0IHZpcnR1YWxTd2FwVG9rZW5QYXkgb3IgdmlydHVhbFN3YXBUb2tlbkdldCB2YWx1ZQMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEIEAAAAHGFtb3VudFZpcnR1YWxSZXBsZW5pc2hUb2tlbkIJAABlAAAAAgUAAAAJcG10QW1vdW50BQAAABN2aXJ0dWFsU3dhcFRva2VuUGF5BAAAABxhbW91bnRWaXJ0dWFsUmVwbGVuaXNoVG9rZW5BBQAAABN2aXJ0dWFsU3dhcFRva2VuR2V0BAAAABhiYWxhbmNlQWZ0ZXJWaXJ0dWFsU3dhcEEJAABlAAAAAgUAAAAIYmFsYW5jZUEFAAAAE3ZpcnR1YWxTd2FwVG9rZW5HZXQEAAAAGGJhbGFuY2VBZnRlclZpcnR1YWxTd2FwQgkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAATdmlydHVhbFN3YXBUb2tlblBheQQAAAAXaW52YXJpYW50RXN0aW1hdGVkUmF0aW8JAABrAAAAAwUAAAAJaW52YXJpYW50BQAAAAtzY2FsZVZhbHVlOAkBAAAADWludmFyaWFudENhbGMAAAACBQAAABhiYWxhbmNlQWZ0ZXJWaXJ0dWFsU3dhcEEFAAAAGGJhbGFuY2VBZnRlclZpcnR1YWxTd2FwQgMDCQAAZgAAAAIFAAAAF2ludmFyaWFudEVzdGltYXRlZFJhdGlvBQAAABdzbGlwcGFnZVZhbHVlTWluRm9yU3dhcAkAAGYAAAACBQAAAAtzY2FsZVZhbHVlOAUAAAAXaW52YXJpYW50RXN0aW1hdGVkUmF0aW8HBAAAACVyYXRpb1ZpcnR1YWxCYWxhbmNlVG9WaXJ0dWFsUmVwbGVuaXNoCQAAaQAAAAIJAABrAAAAAwUAAAAYYmFsYW5jZUFmdGVyVmlydHVhbFN3YXBBCQAAaAAAAAIFAAAAC3NjYWxlVmFsdWU4BQAAAAtzY2FsZVZhbHVlOAUAAAAYYmFsYW5jZUFmdGVyVmlydHVhbFN3YXBCCQAAawAAAAMFAAAAHGFtb3VudFZpcnR1YWxSZXBsZW5pc2hUb2tlbkEFAAAAC3NjYWxlVmFsdWU4BQAAABxhbW91bnRWaXJ0dWFsUmVwbGVuaXNoVG9rZW5CAwMJAABmAAAAAgUAAAAcc2xpcHBhZ2VWYWx1ZU1pbkZvclJlcGxlbmlzaAUAAAAlcmF0aW9WaXJ0dWFsQmFsYW5jZVRvVmlydHVhbFJlcGxlbmlzaAYJAABmAAAAAgUAAAAlcmF0aW9WaXJ0dWFsQmFsYW5jZVRvVmlydHVhbFJlcGxlbmlzaAUAAAAcc2xpcHBhZ2VWYWx1ZU1heEZvclJlcGxlbmlzaAkAAAIAAAABAgAAAGZzd29wIHdpdGggdmlydHVhbFN3YXBUb2tlblBheSBhbmQgdmlydHVhbFN3YXBUb2tlbkdldCBwb3NzaWJsZSwgYnV0IHJhdGlvIGFmdGVyIHZpcnR1YWwgc3dhcCBpbmNvcnJlY3QEAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAABrAAAAAwUAAAAcYW1vdW50VmlydHVhbFJlcGxlbmlzaFRva2VuQQUAAAALc2NhbGVWYWx1ZTgFAAAAGGJhbGFuY2VBZnRlclZpcnR1YWxTd2FwQQQAAAATcmF0aW9TaGFyZVRva2Vuc0luQgkAAGsAAAADBQAAABxhbW91bnRWaXJ0dWFsUmVwbGVuaXNoVG9rZW5CBQAAAAtzY2FsZVZhbHVlOAUAAAAYYmFsYW5jZUFmdGVyVmlydHVhbFN3YXBCBAAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQJAABrAAAAAwkAAZcAAAABCQAETAAAAAIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkEJAARMAAAAAgUAAAATcmF0aW9TaGFyZVRva2Vuc0luQgUAAAADbmlsBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAtzY2FsZVZhbHVlOAQAAAATaW52YXJpYW50Q2FsY3VsYXRlZAkBAAAADWludmFyaWFudENhbGMAAAACBQAAAAhiYWxhbmNlQQkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAJcG10QW1vdW50BAAAAA9uZXdBbW91bnRUb2tlbkEFAAAACGJhbGFuY2VBBAAAAA9uZXdBbW91bnRUb2tlbkIJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAACXBtdEFtb3VudAQAAAATZEFwcFRocmVzaG9sZEFtb3VudAkAAGsAAAADCQAAZAAAAAIFAAAAD25ld0Ftb3VudFRva2VuQQUAAAAPbmV3QW1vdW50VG9rZW5CBQAAAA1kQXBwVGhyZXNob2xkCQAAaAAAAAIAAAAAAAAAAAIFAAAAFmRBcHBUaHJlc2hvbGREZWxpbWl0ZXIDAwkAAGYAAAACBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAA9uZXdBbW91bnRUb2tlbkEGCQAAZgAAAAIFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAD25ld0Ftb3VudFRva2VuQgkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAADlOZXcgYmFsYW5jZSBpbiBhc3NldHMgb2YgdGhlIERBcHAgaXMgbGVzcyB0aGFuIHRocmVzaG9sZCAJAAGkAAAAAQUAAAATZEFwcFRocmVzaG9sZEFtb3VudAIAAAACLiAFAAAACmFzc2V0TmFtZUECAAAAAjogCQABpAAAAAEFAAAAD25ld0Ftb3VudFRva2VuQQIAAAACLCAFAAAACmFzc2V0TmFtZUICAAAAAjogCQABpAAAAAEFAAAAD25ld0Ftb3VudFRva2VuQgkABEwAAAACCQEAAAAHUmVpc3N1ZQAAAAMFAAAADHNoYXJlQXNzZXRJZAUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50BgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAUAAAAMc2hhcmVBc3NldElkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABNrZXlTaGFyZUFzc2V0U3VwcGx5CQAAZAAAAAIFAAAAEHNoYXJlQXNzZXRTdXBwbHkFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUIFAAAAD25ld0Ftb3VudFRva2VuQgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAMa2V5SW52YXJpYW50BQAAABNpbnZhcmlhbnRDYWxjdWxhdGVkBQAAAANuaWwJAAACAAAAAQIAAAA6aW5jb3JyZWN0IHZpcnR1YWxTd2FwVG9rZW5QYXkgb3IgdmlydHVhbFN3YXBUb2tlbkdldCB2YWx1ZQkAAAIAAAABAgAAABtpbmNvcnJlY3QgYXNzZXRzIGluIHBheW1lbnQAAAABaQEAAAAId2l0aGRyYXcAAAAABAAAAA0kdDAyMDU5MjIwNjY3CQAFFAAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAAJcG10QW1vdW50CAUAAAANJHQwMjA1OTIyMDY2NwAAAAJfMQQAAAAKcG10QXNzZXRJZAgFAAAADSR0MDIwNTkyMjA2NjcAAAACXzIEAAAADGFtb3VudFRvUGF5QQkAAGsAAAADBQAAAAlwbXRBbW91bnQFAAAACGJhbGFuY2VBBQAAABBzaGFyZUFzc2V0U3VwcGx5BAAAAAxhbW91bnRUb1BheUIJAABrAAAAAwUAAAAJcG10QW1vdW50BQAAAAhiYWxhbmNlQgUAAAAQc2hhcmVBc3NldFN1cHBseQQAAAATaW52YXJpYW50Q2FsY3VsYXRlZAkBAAAADWludmFyaWFudENhbGMAAAACCQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAAAxhbW91bnRUb1BheUEJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAADGFtb3VudFRvUGF5QgMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAAACAAAAAQIAAAAfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAMJAQAAAAIhPQAAAAIJAAGQAAAAAQgFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAEJAAACAAAAAQIAAAAdT25lIGF0dGFjaGVkIHBheW1lbnQgZXhwZWN0ZWQDCQEAAAACIT0AAAACBQAAAApwbXRBc3NldElkBQAAAAxzaGFyZUFzc2V0SWQJAAACAAAAAQkAASwAAAACAgAAACRJbmNvcnJlY3QgYXNzZXQgYXR0YWNoZWQuIEV4cGVjdGVkOiAJAAJYAAAAAQUAAAAMc2hhcmVBc3NldElkAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQEAAAAHc3VzcGVuZAAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAI1N1c3BpY2lvdXMgc3RhdGUuIEFjdHVhbCBiYWxhbmNlczogCQABpAAAAAEFAAAACGJhbGFuY2VBAgAAAAEgBQAAAAphc3NldE5hbWVBAgAAAAIsIAkAAaQAAAABBQAAAAhiYWxhbmNlQgIAAAABIAUAAAAKYXNzZXROYW1lQgIAAAAJLiBTdGF0ZTogCQABpAAAAAEJAQAAAA5hY2NvdW50QmFsYW5jZQAAAAEFAAAACGFzc2V0SWRBAgAAAAEgBQAAAAphc3NldE5hbWVBAgAAAAIsIAkAAaQAAAABCQEAAAAOYWNjb3VudEJhbGFuY2UAAAABBQAAAAhhc3NldElkQgIAAAABIAUAAAAKYXNzZXROYW1lQgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUEJAABlAAAAAgUAAAAIYmFsYW5jZUEFAAAADGFtb3VudFRvUGF5QQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAALa2V5QmFsYW5jZUIJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAADGFtb3VudFRvUGF5QgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAATa2V5U2hhcmVBc3NldFN1cHBseQkAAGUAAAACBQAAABBzaGFyZUFzc2V0U3VwcGx5BQAAAAlwbXRBbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADGtleUludmFyaWFudAUAAAATaW52YXJpYW50Q2FsY3VsYXRlZAkABEwAAAACCQEAAAAEQnVybgAAAAIFAAAADHNoYXJlQXNzZXRJZAUAAAAJcG10QW1vdW50CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAMYW1vdW50VG9QYXlBBQAAAAhhc3NldElkQQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADGFtb3VudFRvUGF5QgUAAAAIYXNzZXRJZEIFAAAAA25pbAAAAAFpAQAAAAhleGNoYW5nZQAAAAIAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQQAAAANJHQwMjIwMzIyMjEwNwkABRQAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAACXBtdEFtb3VudAgFAAAADSR0MDIyMDMyMjIxMDcAAAACXzEEAAAACnBtdEFzc2V0SWQIBQAAAA0kdDAyMjAzMjIyMTA3AAAAAl8yAwkBAAAAASEAAAABBQAAAAhpc0FjdGl2ZQkAAAIAAAABAgAAAB9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkAAGcAAAACAAAAAAAAAAAABQAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUJAAACAAAAAQkAASwAAAACAgAAACtFc3RpbWF0ZWQgYW1vdW50IG11c3QgYmUgcG9zaXRpdmUuIEFjdHVhbDogCQABpAAAAAEFAAAAGGVzdGltYXRlZEFtb3VudFRvUmVjZWl2ZQMJAABmAAAAAgUAAAASbWluQW1vdW50VG9SZWNlaXZlBQAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAA7TWluaW1hbCBhbW91bnQgY2FuJ3QgYmUgZ3JlYXRlciB0aGFuIGVzdGltYXRlZC4gRXN0aW1hdGVkOiAJAAGkAAAAAQUAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlAgAAAAsuIE1pbmltYWw6IAkAAaQAAAABBQAAABJtaW5BbW91bnRUb1JlY2VpdmUDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABCQAAAgAAAAECAAAAHU9uZSBhdHRhY2hlZCBwYXltZW50IGV4cGVjdGVkAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQEAAAAHc3VzcGVuZAAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAI1N1c3BpY2lvdXMgc3RhdGUuIEFjdHVhbCBiYWxhbmNlczogCQABpAAAAAEFAAAACGJhbGFuY2VBAgAAAAEgBQAAAAphc3NldE5hbWVBAgAAAAIsIAkAAaQAAAABBQAAAAhiYWxhbmNlQgIAAAABIAUAAAAKYXNzZXROYW1lQgIAAAAJLiBTdGF0ZTogCQABpAAAAAEJAQAAAA5hY2NvdW50QmFsYW5jZQAAAAEFAAAACGFzc2V0SWRBAgAAAAEgBQAAAAphc3NldE5hbWVBAgAAAAIsIAkAAaQAAAABCQEAAAAOYWNjb3VudEJhbGFuY2UAAAABBQAAAAhhc3NldElkQgIAAAABIAUAAAAKYXNzZXROYW1lQgMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEEAAAAC2Fzc2V0SWRTZW5kBQAAAAhhc3NldElkQgQAAAAQYW1vdW50V2l0aG91dEZlZQkBAAAAGmNhbGN1bGF0ZUhvd01hbnlTZW5kVG9rZW5CAAAABQUAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlBQAAABJtaW5BbW91bnRUb1JlY2VpdmUFAAAACGJhbGFuY2VBBQAAAAhiYWxhbmNlQgUAAAAJcG10QW1vdW50BAAAAA1hbW91bnRXaXRoRmVlCQAAawAAAAMFAAAAEGFtb3VudFdpdGhvdXRGZWUJAABlAAAAAgUAAAAYY29tbWlzc2lvblNjYWxlRGVsaW1pdGVyBQAAAApjb21taXNzaW9uBQAAABhjb21taXNzaW9uU2NhbGVEZWxpbWl0ZXIEAAAAEGdvdmVybmFuY2VSZXdhcmQJAABrAAAAAwUAAAAQYW1vdW50V2l0aG91dEZlZQUAAAAUY29tbWlzc2lvbkdvdmVybmFuY2UFAAAAGGNvbW1pc3Npb25TY2FsZURlbGltaXRlcgQAAAAPbmV3QW1vdW50VG9rZW5BCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAAlwbXRBbW91bnQEAAAAD25ld0Ftb3VudFRva2VuQgkAAGUAAAACCQAAZQAAAAIFAAAACGJhbGFuY2VCBQAAAA1hbW91bnRXaXRoRmVlBQAAABBnb3Zlcm5hbmNlUmV3YXJkBAAAABNkQXBwVGhyZXNob2xkQW1vdW50CQAAawAAAAMJAABkAAAAAgUAAAAPbmV3QW1vdW50VG9rZW5BBQAAAA9uZXdBbW91bnRUb2tlbkIFAAAADWRBcHBUaHJlc2hvbGQJAABoAAAAAgAAAAAAAAAAAgUAAAAWZEFwcFRocmVzaG9sZERlbGltaXRlcgMDCQAAZgAAAAIFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAD25ld0Ftb3VudFRva2VuQQYJAABmAAAAAgUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAAPbmV3QW1vdW50VG9rZW5CCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAOU5ldyBiYWxhbmNlIGluIGFzc2V0cyBvZiB0aGUgREFwcCBpcyBsZXNzIHRoYW4gdGhyZXNob2xkIAkAAaQAAAABBQAAABNkQXBwVGhyZXNob2xkQW1vdW50AgAAAAIuIAUAAAAKYXNzZXROYW1lQQIAAAACOiAJAAGkAAAAAQUAAAAPbmV3QW1vdW50VG9rZW5BAgAAAAIsIAUAAAAKYXNzZXROYW1lQgIAAAACOiAJAAGkAAAAAQUAAAAPbmV3QW1vdW50VG9rZW5CCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQQUAAAAPbmV3QW1vdW50VG9rZW5BCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQgUAAAAPbmV3QW1vdW50VG9rZW5CCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAxrZXlJbnZhcmlhbnQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAAJcG10QW1vdW50CQAAZQAAAAIJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAADWFtb3VudFdpdGhGZWUFAAAAEGdvdmVybmFuY2VSZXdhcmQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAA1hbW91bnRXaXRoRmVlBQAAAAthc3NldElkU2VuZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAABFnb3Zlcm5hbmNlQWRkcmVzcwUAAAAQZ292ZXJuYW5jZVJld2FyZAUAAAALYXNzZXRJZFNlbmQFAAAAA25pbAMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEIEAAAAC2Fzc2V0SWRTZW5kBQAAAAhhc3NldElkQQQAAAAQYW1vdW50V2l0aG91dEZlZQkBAAAAGmNhbGN1bGF0ZUhvd01hbnlTZW5kVG9rZW5BAAAABQUAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlBQAAABJtaW5BbW91bnRUb1JlY2VpdmUFAAAACGJhbGFuY2VBBQAAAAhiYWxhbmNlQgUAAAAJcG10QW1vdW50BAAAAA1hbW91bnRXaXRoRmVlCQAAawAAAAMFAAAAEGFtb3VudFdpdGhvdXRGZWUJAABlAAAAAgUAAAAYY29tbWlzc2lvblNjYWxlRGVsaW1pdGVyBQAAAApjb21taXNzaW9uBQAAABhjb21taXNzaW9uU2NhbGVEZWxpbWl0ZXIEAAAAEGdvdmVybmFuY2VSZXdhcmQJAABrAAAAAwUAAAAQYW1vdW50V2l0aG91dEZlZQUAAAAUY29tbWlzc2lvbkdvdmVybmFuY2UFAAAAGGNvbW1pc3Npb25TY2FsZURlbGltaXRlcgQAAAAPbmV3QW1vdW50VG9rZW5BCQAAZQAAAAIJAABlAAAAAgUAAAAIYmFsYW5jZUEFAAAADWFtb3VudFdpdGhGZWUFAAAAEGdvdmVybmFuY2VSZXdhcmQEAAAAD25ld0Ftb3VudFRva2VuQgkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAJcG10QW1vdW50BAAAABNkQXBwVGhyZXNob2xkQW1vdW50CQAAawAAAAMJAABkAAAAAgUAAAAPbmV3QW1vdW50VG9rZW5BBQAAAA9uZXdBbW91bnRUb2tlbkIFAAAADWRBcHBUaHJlc2hvbGQJAABoAAAAAgAAAAAAAAAAAgUAAAAWZEFwcFRocmVzaG9sZERlbGltaXRlcgMDCQAAZgAAAAIFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAD25ld0Ftb3VudFRva2VuQQYJAABmAAAAAgUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAAPbmV3QW1vdW50VG9rZW5CCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAOU5ldyBiYWxhbmNlIGluIGFzc2V0cyBvZiB0aGUgREFwcCBpcyBsZXNzIHRoYW4gdGhyZXNob2xkIAkAAaQAAAABBQAAABNkQXBwVGhyZXNob2xkQW1vdW50AgAAAAIuIAUAAAAKYXNzZXROYW1lQQIAAAACOiAJAAGkAAAAAQUAAAAPbmV3QW1vdW50VG9rZW5BAgAAAAIsIAUAAAAKYXNzZXROYW1lQgIAAAACOiAJAAGkAAAAAQUAAAAPbmV3QW1vdW50VG9rZW5CCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQQUAAAAPbmV3QW1vdW50VG9rZW5BCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrZXlCYWxhbmNlQgUAAAAPbmV3QW1vdW50VG9rZW5CCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAxrZXlJbnZhcmlhbnQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgkAAGUAAAACCQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAAA1hbW91bnRXaXRoRmVlBQAAABBnb3Zlcm5hbmNlUmV3YXJkCQAAZAAAAAIFAAAACGJhbGFuY2VCBQAAAAlwbXRBbW91bnQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAA1hbW91bnRXaXRoRmVlBQAAAAthc3NldElkU2VuZAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAABFnb3Zlcm5hbmNlQWRkcmVzcwUAAAAQZ292ZXJuYW5jZVJld2FyZAUAAAALYXNzZXRJZFNlbmQFAAAAA25pbAkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAACRJbmNvcnJlY3QgYXNzZXQgYXR0YWNoZWQuIEV4cGVjdGVkOiAFAAAAC3N0ckFzc2V0SWRBAgAAAAQgb3IgBQAAAAtzdHJBc3NldElkQgAAAAFpAQAAAAhzaHV0ZG93bgAAAAADCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgkABEwAAAACBQAAAAxhZG1pblB1YktleTEJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkyCQAETAAAAAIFAAAADGFkbWluUHViS2V5MwkABEwAAAACBQAAABVhZG1pblB1YktleTRzdGFydFN0b3AFAAAAA25pbAgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQEAAAAHc3VzcGVuZAAAAAECAAAAD1BhdXNlZCBieSBhZG1pbgkAAAIAAAABAgAAACFPbmx5IGFkbWluIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24AAAABaQEAAAAIYWN0aXZhdGUAAAAAAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkxCQAETAAAAAIFAAAADGFkbWluUHViS2V5MgkABEwAAAACBQAAAAxhZG1pblB1YktleTMJAARMAAAAAgUAAAAVYWRtaW5QdWJLZXk0c3RhcnRTdG9wBQAAAANuaWwIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAAJa2V5QWN0aXZlBgkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABBQAAAAhrZXlDYXVzZQUAAAADbmlsCQAAAgAAAAECAAAAIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAEAAAAEmFkbWluUHViS2V5MVNpZ25lZAMJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAABQAAAAxhZG1pblB1YktleTEAAAAAAAAAAAEAAAAAAAAAAAAEAAAAEmFkbWluUHViS2V5MlNpZ25lZAMJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAABBQAAAAxhZG1pblB1YktleTIAAAAAAAAAAAEAAAAAAAAAAAAEAAAAEmFkbWluUHViS2V5M1NpZ25lZAMJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAACBQAAAAxhZG1pblB1YktleTMAAAAAAAAAAAEAAAAAAAAAAAAJAABnAAAAAgkAAGQAAAACCQAAZAAAAAIFAAAAEmFkbWluUHViS2V5MVNpZ25lZAUAAAASYWRtaW5QdWJLZXkyU2lnbmVkBQAAABJhZG1pblB1YktleTNTaWduZWQAAAAAAAAAAAJdHYjb", "chainId": 87, "height": 2327094, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4X13VRdECkXCzt99MBMHX1k6LgDjp9UMgNXyhs6JVxjg Next: FA6XKs86d6SD2kuYgN3yUKZGdoZqtd6Pj38JK6nQDJ9K Diff:
OldNewDifferences
3434 let adminPubKey2 = base58'E6Wa1SGoktYcjHjsKrvjMiqJY3SWmGKcD8Q5L8kxSPS7'
3535
3636 let adminPubKey3 = base58'AZmWJtuy4GeVrMmJH4hfFBRApe1StvhJSk4jcbT6bArQ'
37+
38+let adminPubKey4startStop = base58'EtVkT6ed8GtbUiVVEqdmEqsp2J4qbb3rre2HFgxeVYdg'
3739
3840 let governanceAddress = Address(base58'3P6J84oH51DzY6xk2mT5TheXRbrCwBMxonp')
3941
9799
98100 let scaleValue12Digits = 12
99101
100-let dAppThreshold = 80
102+let dAppThreshold = 50
101103
102104 let dAppThresholdDelimiter = 100
103105
213215
214216 @Callable(i)
215217 func init () = {
216- let $t086278704 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
217- let pmtAmountA = $t086278704._1
218- let pmtAssetIdA = $t086278704._2
219- let $t087098786 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
220- let pmtAmountB = $t087098786._1
221- let pmtAssetIdB = $t087098786._2
222- let $t087918868 = getAssetInfo(pmtAssetIdA)
223- let pmtStrAssetIdA = $t087918868._1
224- let pmtAssetNameA = $t087918868._2
225- let pmtDecimalsA = $t087918868._3
226- let $t088738950 = getAssetInfo(pmtAssetIdB)
227- let pmtStrAssetIdB = $t088738950._1
228- let pmtAssetNameB = $t088738950._2
229- let pmtDecimalsB = $t088738950._3
218+ let $t087088785 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
219+ let pmtAmountA = $t087088785._1
220+ let pmtAssetIdA = $t087088785._2
221+ let $t087908867 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
222+ let pmtAmountB = $t087908867._1
223+ let pmtAssetIdB = $t087908867._2
224+ let $t088728949 = getAssetInfo(pmtAssetIdA)
225+ let pmtStrAssetIdA = $t088728949._1
226+ let pmtAssetNameA = $t088728949._2
227+ let pmtDecimalsA = $t088728949._3
228+ let $t089549031 = getAssetInfo(pmtAssetIdB)
229+ let pmtStrAssetIdB = $t089549031._1
230+ let pmtAssetNameB = $t089549031._2
231+ let pmtDecimalsB = $t089549031._3
230232 if (isDefined(getBoolean(this, keyActive)))
231233 then throw("DApp is already active")
232234 else if ((pmtAssetIdA == pmtAssetIdB))
247249
248250 @Callable(i)
249251 func replenishWithTwoTokens (slippageTolerance) = {
250- let $t01105611133 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
251- let pmtAmountA = $t01105611133._1
252- let pmtAssetIdA = $t01105611133._2
253- let $t01113811332 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
254- let pmtAmountB = $t01113811332._1
255- let pmtAssetIdB = $t01113811332._2
256- let tokenRatio = (fraction(balanceA, (scaleValue8 * scaleValue3), pmtAmountA) / fraction(balanceB, scaleValue8, pmtAmountB))
252+ let $t01113711214 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
253+ let pmtAmountA = $t01113711214._1
254+ let pmtAssetIdA = $t01113711214._2
255+ let $t01121911413 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
256+ let pmtAmountB = $t01121911413._1
257+ let pmtAssetIdB = $t01121911413._2
258+ let tokenRatio = fraction(fraction(balanceA, scaleValue8, pmtAmountA), scaleValue3, fraction(balanceB, scaleValue8, pmtAmountB))
257259 let ratioShareTokensInA = fraction(pmtAmountA, scaleValue8, balanceA)
258260 let ratioShareTokensInB = fraction(pmtAmountB, scaleValue8, balanceB)
259261 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scaleValue8)
285287
286288 @Callable(i)
287289 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = {
288- let $t01369413769 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
289- let pmtAmount = $t01369413769._1
290- let pmtAssetId = $t01369413769._2
291- let slippageValueMin = (scaleValue8 - ((scaleValue8 * 1) / 10000000))
292- let slippageValueMax = (scaleValue8 + ((scaleValue8 * 1) / 10000000))
293- if (!(isActive))
294- then throw("DApp is inactive at this moment")
295- else if ((size(i.payments) != 1))
296- then throw("One attached payment expected")
297- else if (!(hasEnoughBalance))
298- then suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
299- else if ((pmtAssetId == assetIdA))
300- then {
301- let amountVirtualReplenishTokenA = (pmtAmount - virtualSwapTokenPay)
302- let amountVirtualReplenishTokenB = virtualSwapTokenGet
303- let balanceAfterVirtualSwapA = (balanceA + virtualSwapTokenPay)
304- let balanceAfterVirtualSwapB = (balanceB - virtualSwapTokenGet)
305- let invariantEstimatedRatio = fraction(invariant, scaleValue8, invariantCalc(balanceAfterVirtualSwapA, balanceAfterVirtualSwapB))
306- if (if ((invariantEstimatedRatio > slippageValueMin))
307- then (scaleValue8 >= invariantEstimatedRatio)
308- else false)
309- then {
310- let ratioVirtualBalanceToVirtualReplenish = (fraction(balanceAfterVirtualSwapA, (scaleValue8 * scaleValue8), balanceAfterVirtualSwapB) / fraction(amountVirtualReplenishTokenA, scaleValue8, amountVirtualReplenishTokenB))
311- if (if ((slippageValueMin > ratioVirtualBalanceToVirtualReplenish))
312- then true
313- else (ratioVirtualBalanceToVirtualReplenish > slippageValueMax))
314- then throw("swop with virtualSwapTokenPay and virtualSwapTokenGet possible, but ratio after virtual swap incorrect")
315- else {
316- let ratioShareTokensInA = fraction(amountVirtualReplenishTokenA, scaleValue8, balanceAfterVirtualSwapA)
317- let ratioShareTokensInB = fraction(amountVirtualReplenishTokenB, scaleValue8, balanceAfterVirtualSwapB)
318- let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scaleValue8)
319- let invariantCalculated = invariantCalc((balanceA + pmtAmount), balanceB)
320-[Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), IntegerEntry(keyShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), IntegerEntry(keyBalanceA, (balanceA + pmtAmount)), IntegerEntry(keyInvariant, invariantCalculated)]
321- }
322- }
323- else throw("incorrect virtualSwapTokenPay or virtualSwapTokenGet value")
324- }
325- else if ((pmtAssetId == assetIdB))
290+ let $t01376213837 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
291+ let pmtAmount = $t01376213837._1
292+ let pmtAssetId = $t01376213837._2
293+ let thresholdValueForMinTolerance = 50000000
294+ let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
295+ then 100000
296+ else 1
297+ let slippageValueMinForReplenish = (scaleValue8 - ((scaleValue8 * tolerance) / 10000000))
298+ let slippageValueMaxForReplenish = (scaleValue8 + ((scaleValue8 * tolerance) / 10000000))
299+ let slippageValueMinForSwap = (scaleValue8 - ((scaleValue8 * 1) / 10000000))
300+ let slippageValueMaxForSwap = (scaleValue8 + ((scaleValue8 * 1) / 10000000))
301+ if ((1000 > pmtAmount))
302+ then throw("The exchange amount does not exceed the minimum amount of 0.001")
303+ else if (!(isActive))
304+ then throw("DApp is inactive at this moment")
305+ else if ((size(i.payments) != 1))
306+ then throw("One attached payment expected")
307+ else if (!(hasEnoughBalance))
308+ then suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
309+ else if ((pmtAssetId == assetIdA))
326310 then {
327- let amountVirtualReplenishTokenB = (pmtAmount - virtualSwapTokenPay)
328- let amountVirtualReplenishTokenA = virtualSwapTokenGet
329- let balanceAfterVirtualSwapA = (balanceA - virtualSwapTokenGet)
330- let balanceAfterVirtualSwapB = (balanceB + virtualSwapTokenPay)
311+ let amountVirtualReplenishTokenA = (pmtAmount - virtualSwapTokenPay)
312+ let amountVirtualReplenishTokenB = virtualSwapTokenGet
313+ let balanceAfterVirtualSwapA = (balanceA + virtualSwapTokenPay)
314+ let balanceAfterVirtualSwapB = (balanceB - virtualSwapTokenGet)
331315 let invariantEstimatedRatio = fraction(invariant, scaleValue8, invariantCalc(balanceAfterVirtualSwapA, balanceAfterVirtualSwapB))
332- if (if ((invariantEstimatedRatio > slippageValueMin))
333- then (scaleValue8 >= invariantEstimatedRatio)
316+ if (if ((invariantEstimatedRatio > slippageValueMinForSwap))
317+ then (scaleValue8 > invariantEstimatedRatio)
334318 else false)
335319 then {
336320 let ratioVirtualBalanceToVirtualReplenish = (fraction(balanceAfterVirtualSwapA, (scaleValue8 * scaleValue8), balanceAfterVirtualSwapB) / fraction(amountVirtualReplenishTokenA, scaleValue8, amountVirtualReplenishTokenB))
337- if (if ((slippageValueMin > ratioVirtualBalanceToVirtualReplenish))
321+ if (if ((slippageValueMinForReplenish > ratioVirtualBalanceToVirtualReplenish))
338322 then true
339- else (ratioVirtualBalanceToVirtualReplenish > slippageValueMax))
323+ else (ratioVirtualBalanceToVirtualReplenish > slippageValueMaxForReplenish))
340324 then throw("swop with virtualSwapTokenPay and virtualSwapTokenGet possible, but ratio after virtual swap incorrect")
341325 else {
342326 let ratioShareTokensInA = fraction(amountVirtualReplenishTokenA, scaleValue8, balanceAfterVirtualSwapA)
343327 let ratioShareTokensInB = fraction(amountVirtualReplenishTokenB, scaleValue8, balanceAfterVirtualSwapB)
344328 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scaleValue8)
345- let invariantCalculated = invariantCalc(balanceA, (balanceB + pmtAmount))
346-[Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), IntegerEntry(keyShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), IntegerEntry(keyBalanceB, (balanceB + pmtAmount)), IntegerEntry(keyInvariant, invariantCalculated)]
329+ let invariantCalculated = invariantCalc((balanceA + pmtAmount), balanceB)
330+ let newAmountTokenA = (balanceA + pmtAmount)
331+ let newAmountTokenB = balanceB
332+ let dAppThresholdAmount = fraction((newAmountTokenA + newAmountTokenB), dAppThreshold, (2 * dAppThresholdDelimiter))
333+ if (if ((dAppThresholdAmount > newAmountTokenA))
334+ then true
335+ else (dAppThresholdAmount > newAmountTokenB))
336+ then throw(((((((((("New balance in assets of the DApp is less than threshold " + toString(dAppThresholdAmount)) + ". ") + assetNameA) + ": ") + toString(newAmountTokenA)) + ", ") + assetNameB) + ": ") + toString(newAmountTokenB)))
337+ else [Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), IntegerEntry(keyShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), IntegerEntry(keyBalanceA, newAmountTokenA), IntegerEntry(keyInvariant, invariantCalculated)]
347338 }
348339 }
349340 else throw("incorrect virtualSwapTokenPay or virtualSwapTokenGet value")
350341 }
351- else throw("incorrect assets in payment")
342+ else if ((pmtAssetId == assetIdB))
343+ then {
344+ let amountVirtualReplenishTokenB = (pmtAmount - virtualSwapTokenPay)
345+ let amountVirtualReplenishTokenA = virtualSwapTokenGet
346+ let balanceAfterVirtualSwapA = (balanceA - virtualSwapTokenGet)
347+ let balanceAfterVirtualSwapB = (balanceB + virtualSwapTokenPay)
348+ let invariantEstimatedRatio = fraction(invariant, scaleValue8, invariantCalc(balanceAfterVirtualSwapA, balanceAfterVirtualSwapB))
349+ if (if ((invariantEstimatedRatio > slippageValueMinForSwap))
350+ then (scaleValue8 > invariantEstimatedRatio)
351+ else false)
352+ then {
353+ let ratioVirtualBalanceToVirtualReplenish = (fraction(balanceAfterVirtualSwapA, (scaleValue8 * scaleValue8), balanceAfterVirtualSwapB) / fraction(amountVirtualReplenishTokenA, scaleValue8, amountVirtualReplenishTokenB))
354+ if (if ((slippageValueMinForReplenish > ratioVirtualBalanceToVirtualReplenish))
355+ then true
356+ else (ratioVirtualBalanceToVirtualReplenish > slippageValueMaxForReplenish))
357+ then throw("swop with virtualSwapTokenPay and virtualSwapTokenGet possible, but ratio after virtual swap incorrect")
358+ else {
359+ let ratioShareTokensInA = fraction(amountVirtualReplenishTokenA, scaleValue8, balanceAfterVirtualSwapA)
360+ let ratioShareTokensInB = fraction(amountVirtualReplenishTokenB, scaleValue8, balanceAfterVirtualSwapB)
361+ let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scaleValue8)
362+ let invariantCalculated = invariantCalc(balanceA, (balanceB + pmtAmount))
363+ let newAmountTokenA = balanceA
364+ let newAmountTokenB = (balanceB + pmtAmount)
365+ let dAppThresholdAmount = fraction((newAmountTokenA + newAmountTokenB), dAppThreshold, (2 * dAppThresholdDelimiter))
366+ if (if ((dAppThresholdAmount > newAmountTokenA))
367+ then true
368+ else (dAppThresholdAmount > newAmountTokenB))
369+ then throw(((((((((("New balance in assets of the DApp is less than threshold " + toString(dAppThresholdAmount)) + ". ") + assetNameA) + ": ") + toString(newAmountTokenA)) + ", ") + assetNameB) + ": ") + toString(newAmountTokenB)))
370+ else [Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), IntegerEntry(keyShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), IntegerEntry(keyBalanceB, newAmountTokenB), IntegerEntry(keyInvariant, invariantCalculated)]
371+ }
372+ }
373+ else throw("incorrect virtualSwapTokenPay or virtualSwapTokenGet value")
374+ }
375+ else throw("incorrect assets in payment")
352376 }
353377
354378
355379
356380 @Callable(i)
357381 func withdraw () = {
358- let $t01876218837 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
359- let pmtAmount = $t01876218837._1
360- let pmtAssetId = $t01876218837._2
382+ let $t02059220667 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
383+ let pmtAmount = $t02059220667._1
384+ let pmtAssetId = $t02059220667._2
361385 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
362386 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
363387 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
376400
377401 @Callable(i)
378402 func exchange (estimatedAmountToReceive,minAmountToReceive) = {
379- let $t02020220277 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
380- let pmtAmount = $t02020220277._1
381- let pmtAssetId = $t02020220277._2
403+ let $t02203222107 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
404+ let pmtAmount = $t02203222107._1
405+ let pmtAssetId = $t02203222107._2
382406 if (!(isActive))
383407 then throw("DApp is inactive at this moment")
384408 else if ((0 >= estimatedAmountToReceive))
397421 let governanceReward = fraction(amountWithoutFee, commissionGovernance, commissionScaleDelimiter)
398422 let newAmountTokenA = (balanceA + pmtAmount)
399423 let newAmountTokenB = ((balanceB - amountWithFee) - governanceReward)
400- let dAppThresholdAmount = fraction((balanceA + balanceB), dAppThreshold, (2 * dAppThresholdDelimiter))
424+ let dAppThresholdAmount = fraction((newAmountTokenA + newAmountTokenB), dAppThreshold, (2 * dAppThresholdDelimiter))
401425 if (if ((dAppThresholdAmount > newAmountTokenA))
402426 then true
403427 else (dAppThresholdAmount > newAmountTokenB))
412436 let governanceReward = fraction(amountWithoutFee, commissionGovernance, commissionScaleDelimiter)
413437 let newAmountTokenA = ((balanceA - amountWithFee) - governanceReward)
414438 let newAmountTokenB = (balanceB + pmtAmount)
415- let dAppThresholdAmount = fraction((balanceA + balanceB), dAppThreshold, (2 * dAppThresholdDelimiter))
439+ let dAppThresholdAmount = fraction((newAmountTokenA + newAmountTokenB), dAppThreshold, (2 * dAppThresholdDelimiter))
416440 if (if ((dAppThresholdAmount > newAmountTokenA))
417441 then true
418442 else (dAppThresholdAmount > newAmountTokenB))
425449
426450
427451 @Callable(i)
428-func shutdown () = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
452+func shutdown () = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKey4startStop], i.callerPublicKey))
429453 then suspend("Paused by admin")
430454 else throw("Only admin can call this function")
431455
432456
433457
434458 @Callable(i)
435-func activate () = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
459+func activate () = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKey4startStop], i.callerPublicKey))
436460 then [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
437461 else throw("Only admin can call this function")
438462
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let version = "2.0.0"
55
66 let keyVersion = "version"
77
88 let keyActive = "active"
99
1010 let keyAssetIdA = "A_asset_id"
1111
1212 let keyAssetIdB = "B_asset_id"
1313
1414 let keyBalanceA = "A_asset_balance"
1515
1616 let keyBalanceB = "B_asset_balance"
1717
1818 let keyShareAssetId = "share_asset_id"
1919
2020 let keyShareAssetSupply = "share_asset_supply"
2121
2222 let keyCommission = "commission"
2323
2424 let keyCommissionScaleDelimiter = "commission_scale_delimiter"
2525
2626 let keyCommissionGovernance = "commission_governance"
2727
2828 let keyInvariant = "invariant"
2929
3030 let keyCause = "shutdown_cause"
3131
3232 let adminPubKey1 = base58'DXDY2itiEcYBtGkVLnkpHtDFyWQUkoLJz79uJ7ECbMrA'
3333
3434 let adminPubKey2 = base58'E6Wa1SGoktYcjHjsKrvjMiqJY3SWmGKcD8Q5L8kxSPS7'
3535
3636 let adminPubKey3 = base58'AZmWJtuy4GeVrMmJH4hfFBRApe1StvhJSk4jcbT6bArQ'
37+
38+let adminPubKey4startStop = base58'EtVkT6ed8GtbUiVVEqdmEqsp2J4qbb3rre2HFgxeVYdg'
3739
3840 let governanceAddress = Address(base58'3P6J84oH51DzY6xk2mT5TheXRbrCwBMxonp')
3941
4042 let isActive = getBooleanValue(this, keyActive)
4143
4244 let strAssetIdA = getStringValue(this, keyAssetIdA)
4345
4446 let strAssetIdB = getStringValue(this, keyAssetIdB)
4547
4648 let assetIdA = if ((strAssetIdA == "WAVES"))
4749 then unit
4850 else fromBase58String(strAssetIdA)
4951
5052 let assetIdB = if ((strAssetIdB == "WAVES"))
5153 then unit
5254 else fromBase58String(strAssetIdB)
5355
5456 let assetNameA = match assetIdA {
5557 case id: ByteVector =>
5658 value(assetInfo(id)).name
5759 case waves: Unit =>
5860 "WAVES"
5961 case _ =>
6062 throw("Match error")
6163 }
6264
6365 let assetNameB = match assetIdB {
6466 case id: ByteVector =>
6567 value(assetInfo(id)).name
6668 case waves: Unit =>
6769 "WAVES"
6870 case _ =>
6971 throw("Match error")
7072 }
7173
7274 let balanceA = getIntegerValue(this, keyBalanceA)
7375
7476 let balanceB = getIntegerValue(this, keyBalanceB)
7577
7678 let shareAssetId = fromBase58String(getStringValue(this, keyShareAssetId))
7779
7880 let shareAssetSupply = getIntegerValue(this, keyShareAssetSupply)
7981
8082 let invariant = getIntegerValue(this, keyInvariant)
8183
8284 let commission = 500
8385
8486 let commissionGovernance = 200
8587
8688 let commissionScaleDelimiter = 1000000
8789
8890 let scaleValue3 = 1000
8991
9092 let scaleValue8 = 100000000
9193
9294 let scaleValue12 = 1000000000000
9395
9496 let slippageToleranceDelimiter = 1000
9597
9698 let scaleValue8Digits = 8
9799
98100 let scaleValue12Digits = 12
99101
100-let dAppThreshold = 80
102+let dAppThreshold = 50
101103
102104 let dAppThresholdDelimiter = 100
103105
104106 let ratioThresholdMax = 100000000
105107
106108 let ratioThresholdMin = 99999000
107109
108110 let alpha = 50
109111
110112 let alphaDigits = 2
111113
112114 let beta = 46000000
113115
114116 let betaDigits = 8
115117
116118 func accountBalance (assetId) = match assetId {
117119 case id: ByteVector =>
118120 assetBalance(this, id)
119121 case waves: Unit =>
120122 wavesBalance(this).available
121123 case _ =>
122124 throw("Match error")
123125 }
124126
125127
126128 let hasEnoughBalance = if ((accountBalance(assetIdA) >= balanceA))
127129 then (accountBalance(assetIdB) >= balanceB)
128130 else false
129131
130132 func skewness (x,y) = (((fraction(scaleValue12, x, y) + fraction(scaleValue12, y, x)) / 2) / 10000)
131133
132134
133135 func invariantCalc (x,y) = {
134136 let sk = skewness(x, y)
135137 (fraction((x + y), scaleValue8, pow(sk, scaleValue8Digits, alpha, alphaDigits, scaleValue8Digits, UP)) + (2 * fraction(pow(fraction(x, y, scaleValue8), 0, 5, 1, (scaleValue8Digits / 2), DOWN), pow((sk - beta), scaleValue8Digits, alpha, alphaDigits, scaleValue8Digits, DOWN), scaleValue8)))
136138 }
137139
138140
139141 func calculateHowManySendTokenA (amountToSendEstimated,minTokenReceiveAmount,amountTokenA,amountTokenB,tokenReceiveAmount) = {
140142 let slippageValue = (scaleValue8 - ((scaleValue8 * 1) / 10000000))
141143 let deltaBetweenMaxAndMinSendValue = (amountToSendEstimated - minTokenReceiveAmount)
142144 let amountToSendStep1 = (amountToSendEstimated - ((1 * deltaBetweenMaxAndMinSendValue) / 5))
143145 let amountToSendStep2 = (amountToSendEstimated - ((2 * deltaBetweenMaxAndMinSendValue) / 5))
144146 let amountToSendStep3 = (amountToSendEstimated - ((3 * deltaBetweenMaxAndMinSendValue) / 5))
145147 let amountToSendStep4 = (amountToSendEstimated - ((4 * deltaBetweenMaxAndMinSendValue) / 5))
146148 let amountToSendStep5 = (amountToSendEstimated - ((5 * deltaBetweenMaxAndMinSendValue) / 5))
147149 let y = (amountTokenB + tokenReceiveAmount)
148150 let invariantEstimatedRatio = fraction(invariant, scaleValue8, invariantCalc((amountTokenA - amountToSendEstimated), y))
149151 if ((0 > (invariantCalc((amountTokenA - amountToSendStep5), y) - invariant)))
150152 then throw("minTokenReceiveAmount too large.err1")
151153 else if (if ((invariantEstimatedRatio > slippageValue))
152154 then (scaleValue8 > invariantEstimatedRatio)
153155 else false)
154156 then amountToSendEstimated
155157 else if (((invariantCalc((amountTokenA - amountToSendStep1), y) - invariant) > 0))
156158 then ((amountToSendStep1 * (commissionScaleDelimiter - commission)) / commissionScaleDelimiter)
157159 else if (((invariantCalc((amountTokenA - amountToSendStep2), y) - invariant) > 0))
158160 then ((amountToSendStep2 * (commissionScaleDelimiter - commission)) / commissionScaleDelimiter)
159161 else if (((invariantCalc((amountTokenA - amountToSendStep3), y) - invariant) > 0))
160162 then ((amountToSendStep3 * (commissionScaleDelimiter - commission)) / commissionScaleDelimiter)
161163 else if (((invariantCalc((amountTokenA - amountToSendStep4), y) - invariant) > 0))
162164 then ((amountToSendStep4 * (commissionScaleDelimiter - commission)) / commissionScaleDelimiter)
163165 else if (((invariantCalc((amountTokenA - amountToSendStep5), y) - invariant) > 0))
164166 then ((amountToSendStep5 * (commissionScaleDelimiter - commission)) / commissionScaleDelimiter)
165167 else throw("something went wrong while working with amountToSendStep. err2")
166168 }
167169
168170
169171 func calculateHowManySendTokenB (amountToSendEstimated,minTokenReceiveAmount,amountTokenA,amountTokenB,tokenReceiveAmount) = {
170172 let slippageValue = (scaleValue8 - ((scaleValue8 * 1) / 10000000))
171173 let deltaBetweenMaxAndMinSendValue = (amountToSendEstimated - minTokenReceiveAmount)
172174 let amountToSendStep1 = (amountToSendEstimated - ((1 * deltaBetweenMaxAndMinSendValue) / 5))
173175 let amountToSendStep2 = (amountToSendEstimated - ((2 * deltaBetweenMaxAndMinSendValue) / 5))
174176 let amountToSendStep3 = (amountToSendEstimated - ((3 * deltaBetweenMaxAndMinSendValue) / 5))
175177 let amountToSendStep4 = (amountToSendEstimated - ((4 * deltaBetweenMaxAndMinSendValue) / 5))
176178 let amountToSendStep5 = (amountToSendEstimated - ((5 * deltaBetweenMaxAndMinSendValue) / 5))
177179 let x = (amountTokenA + tokenReceiveAmount)
178180 let invariantEstimatedRatio = fraction(invariant, scaleValue8, invariantCalc(x, (amountTokenB - amountToSendEstimated)))
179181 if ((0 > (invariantCalc(x, (amountTokenB - amountToSendStep5)) - invariant)))
180182 then throw("minTokenReceiveAmount too large.err1")
181183 else if (if ((invariantEstimatedRatio > slippageValue))
182184 then (scaleValue8 > invariantEstimatedRatio)
183185 else false)
184186 then amountToSendEstimated
185187 else if (((invariantCalc(x, (amountTokenB - amountToSendStep1)) - invariant) > 0))
186188 then ((amountToSendStep1 * (commissionScaleDelimiter - commission)) / commissionScaleDelimiter)
187189 else if (((invariantCalc(x, (amountTokenB - amountToSendStep2)) - invariant) > 0))
188190 then ((amountToSendStep2 * (commissionScaleDelimiter - commission)) / commissionScaleDelimiter)
189191 else if (((invariantCalc(x, (amountTokenB - amountToSendStep3)) - invariant) > 0))
190192 then ((amountToSendStep3 * (commissionScaleDelimiter - commission)) / commissionScaleDelimiter)
191193 else if (((invariantCalc(x, (amountTokenB - amountToSendStep4)) - invariant) > 0))
192194 then ((amountToSendStep4 * (commissionScaleDelimiter - commission)) / commissionScaleDelimiter)
193195 else if (((invariantCalc(x, (amountTokenB - amountToSendStep5)) - invariant) > 0))
194196 then ((amountToSendStep5 * (commissionScaleDelimiter - commission)) / commissionScaleDelimiter)
195197 else throw("something went wrong while working with amountToSendStep. err2")
196198 }
197199
198200
199201 func getAssetInfo (assetId) = match assetId {
200202 case id: ByteVector =>
201203 let stringId = toBase58String(id)
202204 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
203205 $Tuple3(stringId, info.name, info.decimals)
204206 case waves: Unit =>
205207 $Tuple3("WAVES", "WAVES", 8)
206208 case _ =>
207209 throw("Match error")
208210 }
209211
210212
211213 func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
212214
213215
214216 @Callable(i)
215217 func init () = {
216- let $t086278704 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
217- let pmtAmountA = $t086278704._1
218- let pmtAssetIdA = $t086278704._2
219- let $t087098786 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
220- let pmtAmountB = $t087098786._1
221- let pmtAssetIdB = $t087098786._2
222- let $t087918868 = getAssetInfo(pmtAssetIdA)
223- let pmtStrAssetIdA = $t087918868._1
224- let pmtAssetNameA = $t087918868._2
225- let pmtDecimalsA = $t087918868._3
226- let $t088738950 = getAssetInfo(pmtAssetIdB)
227- let pmtStrAssetIdB = $t088738950._1
228- let pmtAssetNameB = $t088738950._2
229- let pmtDecimalsB = $t088738950._3
218+ let $t087088785 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
219+ let pmtAmountA = $t087088785._1
220+ let pmtAssetIdA = $t087088785._2
221+ let $t087908867 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
222+ let pmtAmountB = $t087908867._1
223+ let pmtAssetIdB = $t087908867._2
224+ let $t088728949 = getAssetInfo(pmtAssetIdA)
225+ let pmtStrAssetIdA = $t088728949._1
226+ let pmtAssetNameA = $t088728949._2
227+ let pmtDecimalsA = $t088728949._3
228+ let $t089549031 = getAssetInfo(pmtAssetIdB)
229+ let pmtStrAssetIdB = $t089549031._1
230+ let pmtAssetNameB = $t089549031._2
231+ let pmtDecimalsB = $t089549031._3
230232 if (isDefined(getBoolean(this, keyActive)))
231233 then throw("DApp is already active")
232234 else if ((pmtAssetIdA == pmtAssetIdB))
233235 then throw("Assets must be different")
234236 else {
235237 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
236238 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
237239 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
238240 let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, HALFDOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, HALFDOWN), pow(10, 0, shareDecimals, 0, 0, HALFDOWN))
239241 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
240242 let shareIssueId = calculateAssetId(shareIssue)
241243 let invariantCalculated = invariantCalc(pmtAmountA, pmtAmountB)
242244 [StringEntry(keyVersion, version), BooleanEntry(keyActive, true), StringEntry(keyAssetIdA, pmtStrAssetIdA), StringEntry(keyAssetIdB, pmtStrAssetIdB), IntegerEntry(keyBalanceA, pmtAmountA), IntegerEntry(keyBalanceB, pmtAmountB), IntegerEntry(keyInvariant, invariantCalculated), IntegerEntry(keyCommission, commission), IntegerEntry(keyCommissionScaleDelimiter, commissionScaleDelimiter), shareIssue, StringEntry(keyShareAssetId, toBase58String(shareIssueId)), IntegerEntry(keyShareAssetSupply, shareInitialSupply), ScriptTransfer(i.caller, shareInitialSupply, shareIssueId)]
243245 }
244246 }
245247
246248
247249
248250 @Callable(i)
249251 func replenishWithTwoTokens (slippageTolerance) = {
250- let $t01105611133 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
251- let pmtAmountA = $t01105611133._1
252- let pmtAssetIdA = $t01105611133._2
253- let $t01113811332 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
254- let pmtAmountB = $t01113811332._1
255- let pmtAssetIdB = $t01113811332._2
256- let tokenRatio = (fraction(balanceA, (scaleValue8 * scaleValue3), pmtAmountA) / fraction(balanceB, scaleValue8, pmtAmountB))
252+ let $t01113711214 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
253+ let pmtAmountA = $t01113711214._1
254+ let pmtAssetIdA = $t01113711214._2
255+ let $t01121911413 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
256+ let pmtAmountB = $t01121911413._1
257+ let pmtAssetIdB = $t01121911413._2
258+ let tokenRatio = fraction(fraction(balanceA, scaleValue8, pmtAmountA), scaleValue3, fraction(balanceB, scaleValue8, pmtAmountB))
257259 let ratioShareTokensInA = fraction(pmtAmountA, scaleValue8, balanceA)
258260 let ratioShareTokensInB = fraction(pmtAmountB, scaleValue8, balanceB)
259261 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scaleValue8)
260262 let invariantCalculated = invariantCalc((balanceA + pmtAmountA), (balanceB + pmtAmountB))
261263 if (!(isActive))
262264 then throw("DApp is inactive at this moment")
263265 else if (if ((0 > slippageTolerance))
264266 then true
265267 else (slippageTolerance > slippageToleranceDelimiter))
266268 then throw(((("Slippage tolerance must be between 0 and " + toString(slippageToleranceDelimiter)) + " inclusively. Actual: ") + toString(slippageTolerance)))
267269 else if ((size(i.payments) != 2))
268270 then throw("Two attached assets expected")
269271 else if (if ((pmtAssetIdA != assetIdA))
270272 then true
271273 else (pmtAssetIdB != assetIdB))
272274 then throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
273275 else if (if ((((scaleValue3 * (slippageToleranceDelimiter - slippageTolerance)) / slippageToleranceDelimiter) > tokenRatio))
274276 then true
275277 else (tokenRatio > ((scaleValue3 * (slippageToleranceDelimiter + slippageTolerance)) / slippageToleranceDelimiter)))
276278 then throw("Incorrect assets amount: amounts must have the contract ratio")
277279 else if ((shareTokenToPayAmount == 0))
278280 then throw("Too small amount to replenish")
279281 else if (!(hasEnoughBalance))
280282 then suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
281283 else [IntegerEntry(keyBalanceA, (balanceA + pmtAmountA)), IntegerEntry(keyBalanceB, (balanceB + pmtAmountB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), IntegerEntry(keyInvariant, invariantCalculated), Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
282284 }
283285
284286
285287
286288 @Callable(i)
287289 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = {
288- let $t01369413769 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
289- let pmtAmount = $t01369413769._1
290- let pmtAssetId = $t01369413769._2
291- let slippageValueMin = (scaleValue8 - ((scaleValue8 * 1) / 10000000))
292- let slippageValueMax = (scaleValue8 + ((scaleValue8 * 1) / 10000000))
293- if (!(isActive))
294- then throw("DApp is inactive at this moment")
295- else if ((size(i.payments) != 1))
296- then throw("One attached payment expected")
297- else if (!(hasEnoughBalance))
298- then suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
299- else if ((pmtAssetId == assetIdA))
300- then {
301- let amountVirtualReplenishTokenA = (pmtAmount - virtualSwapTokenPay)
302- let amountVirtualReplenishTokenB = virtualSwapTokenGet
303- let balanceAfterVirtualSwapA = (balanceA + virtualSwapTokenPay)
304- let balanceAfterVirtualSwapB = (balanceB - virtualSwapTokenGet)
305- let invariantEstimatedRatio = fraction(invariant, scaleValue8, invariantCalc(balanceAfterVirtualSwapA, balanceAfterVirtualSwapB))
306- if (if ((invariantEstimatedRatio > slippageValueMin))
307- then (scaleValue8 >= invariantEstimatedRatio)
308- else false)
309- then {
310- let ratioVirtualBalanceToVirtualReplenish = (fraction(balanceAfterVirtualSwapA, (scaleValue8 * scaleValue8), balanceAfterVirtualSwapB) / fraction(amountVirtualReplenishTokenA, scaleValue8, amountVirtualReplenishTokenB))
311- if (if ((slippageValueMin > ratioVirtualBalanceToVirtualReplenish))
312- then true
313- else (ratioVirtualBalanceToVirtualReplenish > slippageValueMax))
314- then throw("swop with virtualSwapTokenPay and virtualSwapTokenGet possible, but ratio after virtual swap incorrect")
315- else {
316- let ratioShareTokensInA = fraction(amountVirtualReplenishTokenA, scaleValue8, balanceAfterVirtualSwapA)
317- let ratioShareTokensInB = fraction(amountVirtualReplenishTokenB, scaleValue8, balanceAfterVirtualSwapB)
318- let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scaleValue8)
319- let invariantCalculated = invariantCalc((balanceA + pmtAmount), balanceB)
320-[Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), IntegerEntry(keyShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), IntegerEntry(keyBalanceA, (balanceA + pmtAmount)), IntegerEntry(keyInvariant, invariantCalculated)]
321- }
322- }
323- else throw("incorrect virtualSwapTokenPay or virtualSwapTokenGet value")
324- }
325- else if ((pmtAssetId == assetIdB))
290+ let $t01376213837 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
291+ let pmtAmount = $t01376213837._1
292+ let pmtAssetId = $t01376213837._2
293+ let thresholdValueForMinTolerance = 50000000
294+ let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
295+ then 100000
296+ else 1
297+ let slippageValueMinForReplenish = (scaleValue8 - ((scaleValue8 * tolerance) / 10000000))
298+ let slippageValueMaxForReplenish = (scaleValue8 + ((scaleValue8 * tolerance) / 10000000))
299+ let slippageValueMinForSwap = (scaleValue8 - ((scaleValue8 * 1) / 10000000))
300+ let slippageValueMaxForSwap = (scaleValue8 + ((scaleValue8 * 1) / 10000000))
301+ if ((1000 > pmtAmount))
302+ then throw("The exchange amount does not exceed the minimum amount of 0.001")
303+ else if (!(isActive))
304+ then throw("DApp is inactive at this moment")
305+ else if ((size(i.payments) != 1))
306+ then throw("One attached payment expected")
307+ else if (!(hasEnoughBalance))
308+ then suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
309+ else if ((pmtAssetId == assetIdA))
326310 then {
327- let amountVirtualReplenishTokenB = (pmtAmount - virtualSwapTokenPay)
328- let amountVirtualReplenishTokenA = virtualSwapTokenGet
329- let balanceAfterVirtualSwapA = (balanceA - virtualSwapTokenGet)
330- let balanceAfterVirtualSwapB = (balanceB + virtualSwapTokenPay)
311+ let amountVirtualReplenishTokenA = (pmtAmount - virtualSwapTokenPay)
312+ let amountVirtualReplenishTokenB = virtualSwapTokenGet
313+ let balanceAfterVirtualSwapA = (balanceA + virtualSwapTokenPay)
314+ let balanceAfterVirtualSwapB = (balanceB - virtualSwapTokenGet)
331315 let invariantEstimatedRatio = fraction(invariant, scaleValue8, invariantCalc(balanceAfterVirtualSwapA, balanceAfterVirtualSwapB))
332- if (if ((invariantEstimatedRatio > slippageValueMin))
333- then (scaleValue8 >= invariantEstimatedRatio)
316+ if (if ((invariantEstimatedRatio > slippageValueMinForSwap))
317+ then (scaleValue8 > invariantEstimatedRatio)
334318 else false)
335319 then {
336320 let ratioVirtualBalanceToVirtualReplenish = (fraction(balanceAfterVirtualSwapA, (scaleValue8 * scaleValue8), balanceAfterVirtualSwapB) / fraction(amountVirtualReplenishTokenA, scaleValue8, amountVirtualReplenishTokenB))
337- if (if ((slippageValueMin > ratioVirtualBalanceToVirtualReplenish))
321+ if (if ((slippageValueMinForReplenish > ratioVirtualBalanceToVirtualReplenish))
338322 then true
339- else (ratioVirtualBalanceToVirtualReplenish > slippageValueMax))
323+ else (ratioVirtualBalanceToVirtualReplenish > slippageValueMaxForReplenish))
340324 then throw("swop with virtualSwapTokenPay and virtualSwapTokenGet possible, but ratio after virtual swap incorrect")
341325 else {
342326 let ratioShareTokensInA = fraction(amountVirtualReplenishTokenA, scaleValue8, balanceAfterVirtualSwapA)
343327 let ratioShareTokensInB = fraction(amountVirtualReplenishTokenB, scaleValue8, balanceAfterVirtualSwapB)
344328 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scaleValue8)
345- let invariantCalculated = invariantCalc(balanceA, (balanceB + pmtAmount))
346-[Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), IntegerEntry(keyShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), IntegerEntry(keyBalanceB, (balanceB + pmtAmount)), IntegerEntry(keyInvariant, invariantCalculated)]
329+ let invariantCalculated = invariantCalc((balanceA + pmtAmount), balanceB)
330+ let newAmountTokenA = (balanceA + pmtAmount)
331+ let newAmountTokenB = balanceB
332+ let dAppThresholdAmount = fraction((newAmountTokenA + newAmountTokenB), dAppThreshold, (2 * dAppThresholdDelimiter))
333+ if (if ((dAppThresholdAmount > newAmountTokenA))
334+ then true
335+ else (dAppThresholdAmount > newAmountTokenB))
336+ then throw(((((((((("New balance in assets of the DApp is less than threshold " + toString(dAppThresholdAmount)) + ". ") + assetNameA) + ": ") + toString(newAmountTokenA)) + ", ") + assetNameB) + ": ") + toString(newAmountTokenB)))
337+ else [Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), IntegerEntry(keyShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), IntegerEntry(keyBalanceA, newAmountTokenA), IntegerEntry(keyInvariant, invariantCalculated)]
347338 }
348339 }
349340 else throw("incorrect virtualSwapTokenPay or virtualSwapTokenGet value")
350341 }
351- else throw("incorrect assets in payment")
342+ else if ((pmtAssetId == assetIdB))
343+ then {
344+ let amountVirtualReplenishTokenB = (pmtAmount - virtualSwapTokenPay)
345+ let amountVirtualReplenishTokenA = virtualSwapTokenGet
346+ let balanceAfterVirtualSwapA = (balanceA - virtualSwapTokenGet)
347+ let balanceAfterVirtualSwapB = (balanceB + virtualSwapTokenPay)
348+ let invariantEstimatedRatio = fraction(invariant, scaleValue8, invariantCalc(balanceAfterVirtualSwapA, balanceAfterVirtualSwapB))
349+ if (if ((invariantEstimatedRatio > slippageValueMinForSwap))
350+ then (scaleValue8 > invariantEstimatedRatio)
351+ else false)
352+ then {
353+ let ratioVirtualBalanceToVirtualReplenish = (fraction(balanceAfterVirtualSwapA, (scaleValue8 * scaleValue8), balanceAfterVirtualSwapB) / fraction(amountVirtualReplenishTokenA, scaleValue8, amountVirtualReplenishTokenB))
354+ if (if ((slippageValueMinForReplenish > ratioVirtualBalanceToVirtualReplenish))
355+ then true
356+ else (ratioVirtualBalanceToVirtualReplenish > slippageValueMaxForReplenish))
357+ then throw("swop with virtualSwapTokenPay and virtualSwapTokenGet possible, but ratio after virtual swap incorrect")
358+ else {
359+ let ratioShareTokensInA = fraction(amountVirtualReplenishTokenA, scaleValue8, balanceAfterVirtualSwapA)
360+ let ratioShareTokensInB = fraction(amountVirtualReplenishTokenB, scaleValue8, balanceAfterVirtualSwapB)
361+ let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scaleValue8)
362+ let invariantCalculated = invariantCalc(balanceA, (balanceB + pmtAmount))
363+ let newAmountTokenA = balanceA
364+ let newAmountTokenB = (balanceB + pmtAmount)
365+ let dAppThresholdAmount = fraction((newAmountTokenA + newAmountTokenB), dAppThreshold, (2 * dAppThresholdDelimiter))
366+ if (if ((dAppThresholdAmount > newAmountTokenA))
367+ then true
368+ else (dAppThresholdAmount > newAmountTokenB))
369+ then throw(((((((((("New balance in assets of the DApp is less than threshold " + toString(dAppThresholdAmount)) + ". ") + assetNameA) + ": ") + toString(newAmountTokenA)) + ", ") + assetNameB) + ": ") + toString(newAmountTokenB)))
370+ else [Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), IntegerEntry(keyShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), IntegerEntry(keyBalanceB, newAmountTokenB), IntegerEntry(keyInvariant, invariantCalculated)]
371+ }
372+ }
373+ else throw("incorrect virtualSwapTokenPay or virtualSwapTokenGet value")
374+ }
375+ else throw("incorrect assets in payment")
352376 }
353377
354378
355379
356380 @Callable(i)
357381 func withdraw () = {
358- let $t01876218837 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
359- let pmtAmount = $t01876218837._1
360- let pmtAssetId = $t01876218837._2
382+ let $t02059220667 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
383+ let pmtAmount = $t02059220667._1
384+ let pmtAssetId = $t02059220667._2
361385 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
362386 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
363387 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
364388 if (!(isActive))
365389 then throw("DApp is inactive at this moment")
366390 else if ((size(i.payments) != 1))
367391 then throw("One attached payment expected")
368392 else if ((pmtAssetId != shareAssetId))
369393 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
370394 else if (!(hasEnoughBalance))
371395 then suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
372396 else [IntegerEntry(keyBalanceA, (balanceA - amountToPayA)), IntegerEntry(keyBalanceB, (balanceB - amountToPayB)), IntegerEntry(keyShareAssetSupply, (shareAssetSupply - pmtAmount)), IntegerEntry(keyInvariant, invariantCalculated), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
373397 }
374398
375399
376400
377401 @Callable(i)
378402 func exchange (estimatedAmountToReceive,minAmountToReceive) = {
379- let $t02020220277 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
380- let pmtAmount = $t02020220277._1
381- let pmtAssetId = $t02020220277._2
403+ let $t02203222107 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
404+ let pmtAmount = $t02203222107._1
405+ let pmtAssetId = $t02203222107._2
382406 if (!(isActive))
383407 then throw("DApp is inactive at this moment")
384408 else if ((0 >= estimatedAmountToReceive))
385409 then throw(("Estimated amount must be positive. Actual: " + toString(estimatedAmountToReceive)))
386410 else if ((minAmountToReceive > estimatedAmountToReceive))
387411 then throw(((("Minimal amount can't be greater than estimated. Estimated: " + toString(estimatedAmountToReceive)) + ". Minimal: ") + toString(minAmountToReceive)))
388412 else if ((size(i.payments) != 1))
389413 then throw("One attached payment expected")
390414 else if (!(hasEnoughBalance))
391415 then suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
392416 else if ((pmtAssetId == assetIdA))
393417 then {
394418 let assetIdSend = assetIdB
395419 let amountWithoutFee = calculateHowManySendTokenB(estimatedAmountToReceive, minAmountToReceive, balanceA, balanceB, pmtAmount)
396420 let amountWithFee = fraction(amountWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
397421 let governanceReward = fraction(amountWithoutFee, commissionGovernance, commissionScaleDelimiter)
398422 let newAmountTokenA = (balanceA + pmtAmount)
399423 let newAmountTokenB = ((balanceB - amountWithFee) - governanceReward)
400- let dAppThresholdAmount = fraction((balanceA + balanceB), dAppThreshold, (2 * dAppThresholdDelimiter))
424+ let dAppThresholdAmount = fraction((newAmountTokenA + newAmountTokenB), dAppThreshold, (2 * dAppThresholdDelimiter))
401425 if (if ((dAppThresholdAmount > newAmountTokenA))
402426 then true
403427 else (dAppThresholdAmount > newAmountTokenB))
404428 then throw(((((((((("New balance in assets of the DApp is less than threshold " + toString(dAppThresholdAmount)) + ". ") + assetNameA) + ": ") + toString(newAmountTokenA)) + ", ") + assetNameB) + ": ") + toString(newAmountTokenB)))
405429 else [IntegerEntry(keyBalanceA, newAmountTokenA), IntegerEntry(keyBalanceB, newAmountTokenB), IntegerEntry(keyInvariant, invariantCalc((balanceA + pmtAmount), ((balanceB - amountWithFee) - governanceReward))), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(governanceAddress, governanceReward, assetIdSend)]
406430 }
407431 else if ((pmtAssetId == assetIdB))
408432 then {
409433 let assetIdSend = assetIdA
410434 let amountWithoutFee = calculateHowManySendTokenA(estimatedAmountToReceive, minAmountToReceive, balanceA, balanceB, pmtAmount)
411435 let amountWithFee = fraction(amountWithoutFee, (commissionScaleDelimiter - commission), commissionScaleDelimiter)
412436 let governanceReward = fraction(amountWithoutFee, commissionGovernance, commissionScaleDelimiter)
413437 let newAmountTokenA = ((balanceA - amountWithFee) - governanceReward)
414438 let newAmountTokenB = (balanceB + pmtAmount)
415- let dAppThresholdAmount = fraction((balanceA + balanceB), dAppThreshold, (2 * dAppThresholdDelimiter))
439+ let dAppThresholdAmount = fraction((newAmountTokenA + newAmountTokenB), dAppThreshold, (2 * dAppThresholdDelimiter))
416440 if (if ((dAppThresholdAmount > newAmountTokenA))
417441 then true
418442 else (dAppThresholdAmount > newAmountTokenB))
419443 then throw(((((((((("New balance in assets of the DApp is less than threshold " + toString(dAppThresholdAmount)) + ". ") + assetNameA) + ": ") + toString(newAmountTokenA)) + ", ") + assetNameB) + ": ") + toString(newAmountTokenB)))
420444 else [IntegerEntry(keyBalanceA, newAmountTokenA), IntegerEntry(keyBalanceB, newAmountTokenB), IntegerEntry(keyInvariant, invariantCalc(((balanceA - amountWithFee) - governanceReward), (balanceB + pmtAmount))), ScriptTransfer(i.caller, amountWithFee, assetIdSend), ScriptTransfer(governanceAddress, governanceReward, assetIdSend)]
421445 }
422446 else throw(((("Incorrect asset attached. Expected: " + strAssetIdA) + " or ") + strAssetIdB))
423447 }
424448
425449
426450
427451 @Callable(i)
428-func shutdown () = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
452+func shutdown () = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKey4startStop], i.callerPublicKey))
429453 then suspend("Paused by admin")
430454 else throw("Only admin can call this function")
431455
432456
433457
434458 @Callable(i)
435-func activate () = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
459+func activate () = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKey4startStop], i.callerPublicKey))
436460 then [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
437461 else throw("Only admin can call this function")
438462
439463
440464 @Verifier(tx)
441465 func verify () = {
442466 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
443467 then 1
444468 else 0
445469 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
446470 then 1
447471 else 0
448472 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
449473 then 1
450474 else 0
451475 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
452476 }
453477

github/deemru/w8io/3ef1775 
82.49 ms