tx · 64m1WdtgXbvdC6BYvWgg4S7ZW54ix944cay7r2ZeAjyy

3N8rwRVNrxgqwFiVCNyX2Zyy6Lzgd1fDctN:  -0.01400000 Waves

2021.12.30 13:36 [1856849] smart account 3N8rwRVNrxgqwFiVCNyX2Zyy6Lzgd1fDctN > SELF 0.00000000 Waves

{ "type": 13, "id": "64m1WdtgXbvdC6BYvWgg4S7ZW54ix944cay7r2ZeAjyy", "fee": 1400000, "feeAssetId": null, "timestamp": 1640860623006, "version": 2, "chainId": 84, "sender": "3N8rwRVNrxgqwFiVCNyX2Zyy6Lzgd1fDctN", "senderPublicKey": "2SGdJb3x9Ak59xjRyHMHFxLvh6dC5m37urdsBJy3f6TU", "proofs": [ "4FWb4APp9yYYyHYBUkCiuoVgT8bBLUKENMc7LQou2yt8ZwXBusxXJPjKuvsK6s27nUBDe2USotqryke5NvRPKiSg", "sFN5qpu2g2nwPpJB4my7jnRyzvAPRaVYFt2iFizkf1SKq8su3ufetVD3CDKT6zEJbAz91nUgZ1sRqKJaxB2Zb3z" ], "script": "base64:AAIFAAAAAAAAACkIAhIAEgMKAQESBAoCAQESABIECgIBARIAEgASAwoBARIFCgMEAQgSAAAAAFIAAAAAB3ZlcnNpb24CAAAABTIuMC4wAAAAAAhrVmVyc2lvbgIAAAAHdmVyc2lvbgAAAAAHa0FjdGl2ZQIAAAAGYWN0aXZlAAAAAAlrQXNzZXRJZEECAAAACkFfYXNzZXRfaWQAAAAACWtBc3NldElkQgIAAAAKQl9hc3NldF9pZAAAAAAJa0JhbGFuY2VBAgAAAA9BX2Fzc2V0X2JhbGFuY2UAAAAACWtCYWxhbmNlQgIAAAAPQl9hc3NldF9iYWxhbmNlAAAAAA1rU2hhcmVBc3NldElkAgAAAA5zaGFyZV9hc3NldF9pZAAAAAARa1NoYXJlQXNzZXRTdXBwbHkCAAAAEnNoYXJlX2Fzc2V0X3N1cHBseQAAAAAEa0ZlZQIAAAAKY29tbWlzc2lvbgAAAAASa0ZlZVNjYWxlRGVsaW1pdGVyAgAAABpjb21taXNzaW9uX3NjYWxlX2RlbGltaXRlcgAAAAAKa0ludmFyaWFudAIAAAAJaW52YXJpYW50AAAAAAZrQ2F1c2UCAAAADnNodXRkb3duX2NhdXNlAAAAABJrZXlVU0ROTlNCVEFkZHJlc3MCAAAAGHN0YWtpbmdfdXNkbm5zYnRfYWRkcmVzcwAAAAAOa2V5RVVSTkFkZHJlc3MCAAAAFHN0YWtpbmdfZXVybl9hZGRyZXNzAAAAAA9rZXlBZG1pblB1YktleTECAAAAC2FkbWluX3B1Yl8xAAAAAA9rZXlBZG1pblB1YktleTICAAAAC2FkbWluX3B1Yl8yAAAAAA9rZXlBZG1pblB1YktleTMCAAAAC2FkbWluX3B1Yl8zAAAAABRVU0ROVG9XYXZlc0V4Y2hhbmdlcgkBAAAAB0FkZHJlc3MAAAABAQAAABoBVMqWqf/XBTJ3J/JFLr/QiofqrY4qyL+FtAAAAAAGb3JhY2xlCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFU6UWqHpAvOq7xug7mLpqSXxqYhOHzYrMIAQAAAAtnZXRBZG1pblB1YgAAAAEAAAALa2V5QWRtaW5QdWIEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAGb3JhY2xlBQAAAAtrZXlBZG1pblB1YgMJAAABAAAAAgUA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dGVkAAAAFW1pblRva2VuUmVjZWl2ZUFtb3VudAAAABJ0b2tlblJlY2VpdmVBbW91bnQAAAAHdG9rZW5JZAQAAAANc2xpcHBhZ2VWYWx1ZQkAAGUAAAACBQAAAAZzY2FsZTgJAABpAAAAAgkAAGgAAAACBQAAAAZzY2FsZTgAAAAAAAAAAAEAAAAAAACYloAEAAAAHmRlbHRhQmV0d2Vlbk1heEFuZE1pblNlbmRWYWx1ZQkAAGUAAAACBQAAABVhbW91bnRUb1NlbmRFc3RpbWF0ZWQFAAAAFW1pblRva2VuUmVjZWl2ZUFtb3VudAQAAAABeAkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAASdG9rZW5SZWNlaXZlQW1vdW50BAAAAAF5CQAAZAAAAAIFAAAACGJhbGFuY2VCBQAAABJ0b2tlblJlY2VpdmVBbW91bnQEAAAADGludmFyaWFudE5ldwMJAAAAAAAAAgUAAAAHdG9rZW5JZAUAAAAIYXNzZXRJZEEJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgUAAAABeAkAAGUAAAACBQAAAAhiYWxhbmNlQgUAAAAVYW1vdW50VG9TZW5kRXN0aW1hdGVkAwkAAAAAAAACBQAAAAd0b2tlbklkBQAAAAhhc3NldElkQgkBAAAADWludmFyaWFudENhbGMAAAACCQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAABVhbW91bnRUb1NlbmRFc3RpbWF0ZWQFAAAAAXkJAAACAAAAAQIAAAAWV3JvbmcgYXNzZXQgaW4gcGF5bWVudAQAAAAXaW52YXJpYW50RXN0aW1hdGVkUmF0aW8JAABrAAAAAwUAAAAGc2NhbGU4BQAAAAlpbnZhcmlhbnQFAAAADGludmFyaWFudE5ldwoBAAAADWdldFN0ZXBBbW91bnQAAAACAAAAA2FjYwAAAARzdGVwAwkAAAAAAAACBQAAAANhY2MA//////////8EAAAADGFtb3VudFRvU2VuZAkAAGUAAAACBQAAABVhbW91bnRUb1NlbmRFc3RpbWF0ZWQJAABpAAAAAgkAAGgAAAACBQAAAARzdGVwBQAAAB5kZWx0YUJldHdlZW5NYXhBbmRNaW5TZW5kVmFsdWUAAAAAAAAAAAUEAAAADXN0ZXBJbnZhcmlhbnQDCQAAAAAAAAIF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AAAHYXNzZXRJZAUAAAAEVVNETgkABRQAAAACAgAAAAxsb2NrTmV1dHJpbm8FAAAAFnN0YWtpbmdVU0ROTlNCVEFkZHJlc3MJAAUUAAAAAgIAAAAMc3RhcnRTdGFraW5nBQAAABJzdGFraW5nRVVSTkFkZHJlc3MDCQAAAAAAAAIFAAAAB2Fzc2V0SWQFAAAABFVTRE4JAAUUAAAAAgIAAAAOdW5sb2NrTmV1dHJpbm8FAAAAFnN0YWtpbmdVU0ROTlNCVEFkZHJlc3MJAAUUAAAAAgIAAAALc3RvcFN0YWtpbmcFAAAAEnN0YWtpbmdFVVJOQWRkcmVzcwEAAAARY2FsY1N0YWtpbmdQYXJhbXMAAAADAAAABXN0YWtlAAAABmFtb3VudAAAAAdhc3NldElkAwUAAAAFc3Rha2UEAAAACyR0MDg4MjY4ODkyCQEAAAAYY2FsY1N0YWtpbmdGdW5jQW5kQWRkcmVzAAAAAgUAAAAFc3Rha2UFAAAAB2Fzc2V0SWQEAAAABGNhbGwIBQAAAAskdDA4ODI2ODg5MgAAAAJfMQQAAAALc3Rha2luZ0FkZHIIBQAAAAskdDA4ODI2ODg5MgAAAAJfMgkABRYAAAAEBQAAAARjYWxsBQAAAAtzdGFraW5nQWRkcgUAAAADbmlsCQAETAAAAAIJAQAAAA9BdHRhY2hlZFBheW1lbnQAAAACBQAAAAdhc3NldElkBQAAAAZhbW91bnQFAAAAA25pbAQAAAALJHQwODk3ODkwNDQJAQAAABhjYWxjU3Rha2luZ0Z1bmNBbmRBZGRyZXMAAAACBQAAAAVzdGFrZQUAAAAHYXNzZXRJZAQAAAAEY2FsbAgFAAAACyR0MDg5Nzg5MDQ0AAAAAl8xBAAAAAtzdGFraW5nQWRkcggFAAAACyR0MDg5Nzg5MDQ0AAAAAl8yCQAFFgAAAAQFAAAABGNhbGwFAAAAC3N0YWtpbmdBZGRyCQAETAAAAAIFAAAABmFtb3VudAkABEwAAAACCQACWAAAAAEFAAAAB2Fzc2V0SWQFAAAAA25pbAUAAAADbmlsAAAACgAAAAFpAQAAAARpbml0AAAAAAQAAAALJHQwOTE0OTkyMjYJAAUUAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50CAkA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cnkAAAACBQAAAA1rU2hhcmVBc3NldElkCQACWAAAAAEFAAAADHNoYXJlSXNzdWVJZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAARa1NoYXJlQXNzZXRTdXBwbHkFAAAAEnNoYXJlSW5pdGlhbFN1cHBseQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAEnNoYXJlSW5pdGlhbFN1cHBseQUAAAAMc2hhcmVJc3N1ZUlkBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAABZyZXBsZW5pc2hXaXRoVHdvVG9rZW5zAAAAAQAAABFzbGlwcGFnZVRvbGVyYW5jZQQAAAALcG10QXNzZXRJZEEICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAAC3BtdEFzc2V0SWRCCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQAAAAdhc3NldElkBAAAAApwbXRBbW91bnRBCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQEAAAACnBtdEFtb3VudEIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAABAAAABmFtb3VudAQAAAANJHQwMTE5ODgxMjA2NQkBAAAADGdldEFzc2V0SW5mbwAAAAEFAAAAC3BtdEFzc2V0SWRBBAAAAA5wbXRTdHJBc3NldElkQQgFAAAADSR0MDExOTg4MTIwNjUAAAACXzEEAAAADXBtdEFzc2V0TmFtZUEIBQAAAA0kdDAxMTk4ODEyMDY1AAAAAl8yBAAAAAxwbXREZWNpbWFsc0EIBQAAAA0kdDAxMTk4ODEyMDY1AAAAAl8zBAAAAA0kdDAxMjA3MDEyMjY0CQEAAAAMZ2V0QXNzZXRJbmZvAAAAAQUAAAALcG10QXNzZXRJZEIEAAAADnBtdFN0ckFzc2V0SWRCCAUAAAANJHQwMTIwNzAxMjI2NAAAAAJfMQQAAAANcG10QXNzZXROYW1lQggFAAAADSR0MDEyMDcwMTIyNjQAAAACXzIEAAAADHBtdERlY2ltYWxzQggFAAAADSR0MDEyMDcwMTIyNjQAAAACXzMEAAAACnRva2VuUmF0aW8JAABrAAAAAwkAAGsAAAADBQAAAAZzY2FsZTgFAAAACGJhbGFuY2VBBQAAAApwbXRBbW91bnRBBQAAAAZzY2FsZTMJAABrAAAAAwUAAAAGc2NhbGU4BQAAAAhiYWxhbmNlQgUAAAAKcG10QW1vdW50QgQAAAATcmF0aW9TaGFyZVRva2Vuc0luQQkAAGsAAAADBQAAAAZzY2FsZTgFAAAACnBtdEFtb3VudEEFAAAACGJhbGFuY2VBBAAAABNyYXRpb1NoYXJlVG9rZW5zSW5CCQAAawAAAAMFAAAABnNjYWxlOAUAAAAKcG10QW1vdW50QgUAAAAIYmFsYW5jZUIEAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAkAAGsAAAADCQABlwAAAAEJAARMAAAAAgUAAAATcmF0aW9TaGFyZVRva2Vuc0luQQkABEwAAAACBQAAABNyYXRpb1NoYXJlVG9rZW5zSW5CBQAAAANuaWwFAAAAEHNoYXJlQXNzZXRTdXBwbHkFAAAABnNjYWxlOAQAAAATaW52YXJpYW50Q2FsY3VsYXRlZAkBAAAADWludmFyaWFudENhbGMAAAACCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAApwbXRBbW91bnRBCQAAZAAAAAIFAAAACGJhbGFuY2VCBQAAAApwbXRBbW91bnRCAwkBAAAAASEAAAABBQAAAAhpc0FjdGl2ZQkBAAAAD3Rocm93SXNJbmFjdGl2ZQAAAAADAwkAAGYAAAACAAAAAAAAAAAABQAAABFzbGlwcGFnZVRvbGVyYW5jZQYJAABmAAAAAgUAAAARc2xpcHBhZ2VUb2xlcmFuY2UAAAAAAAAAAAoJAAACAAAAAQIAAAAgU2xpcHBhZ2UgdG9sZXJhbmNlIG11c3QgYmUgPD0gMSUDCQEAAAACIT0AAAACCQABkAAAAAEIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAACCQAAAgAAAAECAAAAHFR3byBhdHRhY2hlZCBhc3NldHMgZXhwZWN0ZWQDAwkBAAAAAiE9AAAAAgUAAAALcG10QXNzZXRJZEEFAAAACGFzc2V0SWRBBgkBAAAAAiE9AAAAAgUAAAALcG10QXNzZXRJZEIFAAAACGFzc2V0SWRCCQEAAAALdGhyb3dBc3NldHMAAAAAAwMJAABmAAAAAgkAAGkAAAACCQAAaAAAAAIFAAAABnNjYWxlMwkAAGUAAAACBQAAAA5zbGlwcGFnZVNjYWxlMwUAAAARc2xpcHBhZ2VUb2xlcmFuY2UFAAAADnNsaXBwYWdlU2NhbGUzBQAAAAp0b2tlblJhdGlvBgkAAGYAAAACBQAAAAp0b2tlblJhdGlvCQAAaQAAAAIJAABoAAAAAgUAAAAGc2NhbGUzCQAAZAAAAAIFAAAADnNsaXBwYWdlU2NhbGUzBQAAABFzbGlwcGFnZVRvbGVyYW5jZQUAAAAOc2xpcHBhZ2VTY2FsZTMJAAACAAAAAQIAAAA9SW5jb3JyZWN0IGFzc2V0cyBhbW91bnQ6IGFtb3VudHMgbXVzdCBoYXZlIHRoZSBjb250cmFjdCByYXRpbwMJAAAAAAAAAgUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50AAAAAAAAAAAACQAAAgAAAAECAAAAHVRvbyBzbWFsbCBhbW91bnQgdG8gcmVwbGVuaXNoAwkBAAAAASEAAAABBQAAABBoYXNFbm91Z2hCYWxhbmNlCQAETgAAAAIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAApwbXRBbW91bnRBBQAAAAtwbXRBc3NldElkQQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAACnBtdEFtb3VudEIFAAAAC3BtdEFzc2V0SWRCBQAAAANuaWwJAQAAABFzdXNwZW5kU3VzcGljaW91cwAAAAAEAAAABnN0YWtlMQMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAA1zdGFraW5nQXNzZXRzBQAAAA5wbXRTdHJBc3NldElkQQkAA/wAAAAEBQAAAAR0aGlzAgAAAAxzdGFrZVVuc3Rha2UJAARMAAAAAgYJAARMAAAAAgUAAAAKcG10QW1vdW50QQkABEwAAAACBQAAAA5wbXRTdHJBc3NldElkQQUAAAADbmlsBQAAAANuaWwAAAAAAAAAAAADCQAAAAAAAAIFAAAABnN0YWtlMQUAAAAGc3Rha2UxBAAAAAZzdGFrZTIDCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAANc3Rha2luZ0Fzc2V0cwUAAAAOcG10U3RyQXNzZXRJZEIJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VVbnN0YWtlCQAETAAAAAIGCQAETAAAAAIFAAAACnBtdEFtb3VudEIJAARMAAAAAgUAAAAOcG10U3RyQXNzZXRJZEIFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAAAwkAAAAAAAACBQAAAAZzdGFrZTIFAAAABnN0YWtlMgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VBCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAApwbXRBbW91bnRBCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUIJAABkAAAAAgUAAAAIYmFsYW5jZUIFAAAACnBtdEFtb3VudEIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEWtTaGFyZUFzc2V0U3VwcGx5CQAAZAAAAAIFAAAAEHNoYXJlQXNzZXRTdXBwbHkFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAKa0ludmFyaWFudAUAAAATaW52YXJpYW50Q2FsY3VsYXRlZAkABEwAAAACCQEAAAAHUmVpc3N1ZQAAAAMFAAAADHNoYXJlQXNzZXRJZAUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50BgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAUAAAAMc2hhcmVBc3NldElkBQAAAANuaWwJAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgAAAAFpAQAAABVyZXBsZW5pc2hXaXRoT25lVG9rZW4AAAACAAAAE3ZpcnR1YWxTd2FwVG9rZW5QYXkAAAATdmlydHVhbFN3YXBUb2tlbkdldAQAAAANJHQwMTQ1NjMxNDYzOAkABRQAAAACCAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAZhbW91bnQICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAAB2Fzc2V0SWQEAAAACXBtdEFtb3VudAgFAAAADSR0MDE0NTYzMTQ2MzgAAAACXzEEAAAACnBtdEFzc2V0SWQIBQAAAA0kdDAxNDU2MzE0NjM4AAAAAl8yBAAAAA0kdDAxNDY0MzE0NzE2CQEAAAAMZ2V0QXNzZXRJbmZvAAAAAQUAAAAKcG10QXNzZXRJZAQAAAANcG10U3RyQXNzZXRJZAgFAAAADSR0MDE0NjQzMTQ3MTYAAAACXzEEAAAADHBtdEFzc2V0TmFtZQgFAAAADSR0MDE0NjQzMTQ3MTYAAAACXzIEAAAAC3BtdERlY2ltYWxzCAUAAAANJHQwMTQ2NDMxNDcxNgAAAAJfMwQAAAAPcG10TWluVGhyZXNob2xkAAAAAAAATEtABAAAAB10aHJlc2hvbGRWYWx1ZUZvck1pblRvbGVyYW5jZQAAAAAAAvrwgAQAAAAJdG9sZXJhbmNlAwkAAGYAAAACBQAAAB10aHJlc2hvbGRWYWx1ZUZvck1pblRvbGVyYW5jZQUAAAAJcG10QW1vdW50AAAAAAAAAYagAAAAAAAAAAABBAAAABxzbGlwcGFnZVZhbHVlTWluRm9yUmVwbGVuaXNoCQAAZQAAAAIFAAAABnNjYWxlOAkAAGkAAAACCQAAaAAAAAIFAAAABnNjYWxlOAUAAAAJdG9sZXJhbmNlAAAAAAAAmJaABAAAABxzbGlwcGFnZVZhbHVlTWF4Rm9yUmVwbGVuaXNoCQAAZAAAAAIFAAAABnNjYWxlOAkAAGkAAAACCQAAaAAAAAIFAAAABnNjYWxlOAUAAAAJdG9sZXJhbmNlAAAAAAAAmJaABAAAABdzbGlwcGFnZVZhbHVlTWluRm9yU3dhcAkAAGUAAAACBQAAAAZzY2FsZTgJAABpAAAAAgkAAGgAAAACBQAAAAZzY2FsZTgAAAAAAAAAAAEAAAAAAACYloADCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQEAAAAPdGhyb3dJc0luYWN0aXZlAAAAAAMJAABmAAAAAgUAAAAPcG10TWluVGhyZXNob2xkBQAAAAlwbXRBbW91bnQJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAA9QYXltZW50IGFtb3VudCAJAAGkAAAAAQUAAAAJcG10QW1vdW50AgAAACcgZG9lcyBub3QgZXhjZWVkIHRoZSBtaW5pbXVtIGFtb3VudCBvZiAJAAGkAAAAAQUAAAAPcG10TWluVGhyZXNob2xkAgAAAAcgdG9rZW5zAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAIAAAABAgAAAB1PbmUgYXR0YWNoZWQgcGF5bWVudCBleHBlY3RlZAMJAQAAAAEhAAAAAQUAAAAQaGFzRW5vdWdoQmFsYW5jZQkABE4AAAACCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAJcG10QW1vdW50BQAAAApwbXRBc3NldElkBQAAAANuaWwJAQAAABFzdXNwZW5kU3VzcGljaW91cwAAAAADAwkBAAAAAiE9AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEJAQAAAAIhPQAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRCBwkBAAAAC3Rocm93QXNzZXRzAAAAAAQAAAANJHQwMTU3MjgxNjQ5MwMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEJAAUZAAAABwkAAGUAAAACBQAAAAlwbXRBbW91bnQFAAAAE3ZpcnR1YWxTd2FwVG9rZW5QYXkFAAAAE3ZpcnR1YWxTd2FwVG9rZW5HZXQJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAAE3ZpcnR1YWxTd2FwVG9rZW5QYXkJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAAE3ZpcnR1YWxTd2FwVG9rZW5HZXQJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAAJcG10QW1vdW50BQAAAAhiYWxhbmNlQgkAAGQAAAACBQAAAAhiYWxhbmNlQQUAAAAJcG10QW1vdW50BQAAAAhiYWxhbmNlQgkABRkAAAAHBQAAABN2aXJ0dWFsU3dhcFRva2VuR2V0CQAAZQAAAAIFAAAACXBtdEFtb3VudAUAAAATdmlydHVhbFN3YXBUb2tlblBheQkAAGUAAAACBQAAAAhiYWxhbmNlQQUAAAATdmlydHVhbFN3YXBUb2tlbkdldAkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAATdmlydHVhbFN3YXBUb2tlblBheQkBAAAADWludmFyaWFudENhbGMAAAACBQAAAAhiYWxhbmNlQQkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAJcG10QW1vdW50BQAAAAhiYWxhbmNlQQkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAJcG10QW1vdW50BAAAABF2aXJ0dWFsUmVwbGVuaXNoQQgFAAAADSR0MDE1NzI4MTY0OTMAAAACXzEEAAAAEXZpcnR1YWxSZXBsZW5pc2hCCAUAAAANJHQwMTU3MjgxNjQ5MwAAAAJfMgQAAAARYmFsYW5jZUFmdGVyU3dhcEEIBQAAAA0kdDAxNTcyODE2NDkzAAAAAl8zBAAAABFiYWxhbmNlQWZ0ZXJTd2FwQggFAAAADSR0MDE1NzI4MTY0OTMAAAACXzQEAAAAE2ludmFyaWFudENhbGN1bGF0ZWQIBQAAAA0kdDAxNTcyODE2NDkzAAAAAl81BAAAAAtuZXdCYWxhbmNlQQgFAAAADSR0MDE1NzI4MTY0OTMAAAACXzYEAAAAC25ld0JhbGFuY2VCCAUAAAANJHQwMTU3MjgxNjQ5MwAAAAJfNwQAAAAPbmV3QmFsYW5jZUVudHJ5AwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACWtCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUEJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUIFAAAAC25ld0JhbGFuY2VCBAAAAAxpbnZhcmlhbnROZXcJAQAAAA1pbnZhcmlhbnRDYWxjAAAAAgUAAAARYmFsYW5jZUFmdGVyU3dhcEEFAAAAEWJhbGFuY2VBZnRlclN3YXBCBAAAABdpbnZhcmlhbnRFc3RpbWF0ZWRSYXRpbwkAAGsAAAADBQAAAAZzY2FsZTgFAAAACWludmFyaWFudAUAAAAMaW52YXJpYW50TmV3BAAAACVyYXRpb1ZpcnR1YWxCYWxhbmNlVG9WaXJ0dWFsUmVwbGVuaXNoCQAAaQAAAAIJAABrAAAAAwkAAGgAAAACBQAAAAZzY2FsZTgFAAAABnNjYWxlOAUAAAARYmFsYW5jZUFmdGVyU3dhcEEFAAAAEWJhbGFuY2VBZnRlclN3YXBCCQAAawAAAAMFAAAABnNjYWxlOAUAAAARdmlydHVhbFJlcGxlbmlzaEEFAAAAEXZpcnR1YWxSZXBsZW5pc2hCBAAAABNkQXBwVGhyZXNob2xkQW1vdW50CQAAawAAAAMJAABkAAAAAgUAAAALbmV3QmFsYW5jZUEFAAAAC25ld0JhbGFuY2VCBQAAAA1kQXBwVGhyZXNob2xkCQAAaAAAAAIAAAAAAAAAAAIFAAAAE2RBcHBUaHJlc2hvbGRTY2FsZTIDAwkAAGcAAAACBQAAABdzbGlwcGFnZVZhbHVlTWluRm9yU3dhcAUAAAAXaW52YXJpYW50RXN0aW1hdGVkUmF0aW8GCQAAZgAAAAIFAAAACWludmFyaWFudAUAAAAMaW52YXJpYW50TmV3CQAAAgAAAAECAAAAOkluY29ycmVjdCB2aXJ0dWFsU3dhcFRva2VuUGF5IG9yIHZpcnR1YWxTd2FwVG9rZW5HZXQgdmFsdWUDAwkAAGYAAAACBQAAABxzbGlwcGFnZVZhbHVlTWluRm9yUmVwbGVuaXNoBQAAACVyYXRpb1ZpcnR1YWxCYWxhbmNlVG9WaXJ0dWFsUmVwbGVuaXNoBgkAAGYAAAACBQAAACVyYXRpb1ZpcnR1YWxCYWxhbmNlVG9WaXJ0dWFsUmVwbGVuaXNoBQAAABxzbGlwcGFnZVZhbHVlTWF4Rm9yUmVwbGVuaXNoCQAAAgAAAAECAAAAbFN3YXAgd2l0aCB2aXJ0dWFsU3dhcFRva2VuUGF5IGFuZCB2aXJ0dWFsU3dhcFRva2VuR2V0IGlzIHBvc3NpYmxlLCBidXQgcmF0aW8gYWZ0ZXIgdmlydHVhbCBzd2FwIGlzIGluY29ycmVjdAMDCQAAZgAAAAIFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAC25ld0JhbGFuY2VBBgkAAGYAAAACBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAAtuZXdCYWxhbmNlQgkBAAAADnRocm93VGhyZXNob2xkAAAAAwUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAALbmV3QmFsYW5jZUEFAAAAC25ld0JhbGFuY2VCBAAAAAZzdGFrZTEDCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAANc3Rha2luZ0Fzc2V0cwUAAAANcG10U3RyQXNzZXRJZAkAA/wAAAAEBQAAAAR0aGlzAgAAAAxzdGFrZVVuc3Rha2UJAARMAAAAAgYJAARMAAAAAgUAAAAJcG10QW1vdW50CQAETAAAAAIFAAAADXBtdFN0ckFzc2V0SWQFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAAAwkAAAAAAAACBQAAAAZzdGFrZTEFAAAABnN0YWtlMQQAAAATcmF0aW9TaGFyZVRva2Vuc0luQQkAAGsAAAADBQAAABF2aXJ0dWFsUmVwbGVuaXNoQQUAAAAGc2NhbGU4BQAAABFiYWxhbmNlQWZ0ZXJTd2FwQQQAAAATcmF0aW9TaGFyZVRva2Vuc0luQgkAAGsAAAADBQAAABF2aXJ0dWFsUmVwbGVuaXNoQgUAAAAGc2NhbGU4BQAAABFiYWxhbmNlQWZ0ZXJTd2FwQgQAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50CQAAawAAAAMJAAGXAAAAAQkABEwAAAACBQAAABNyYXRpb1NoYXJlVG9rZW5zSW5BCQAETAAAAAIFAAAAE3JhdGlvU2hhcmVUb2tlbnNJbkIFAAAAA25pbAUAAAAQc2hhcmVBc3NldFN1cHBseQUAAAAGc2NhbGU4CQAETAAAAAIJAQAAAAdSZWlzc3VlAAAAAwUAAAAMc2hhcmVBc3NldElkBQAAABVzaGFyZVRva2VuVG9QYXlBbW91bnQGCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAVc2hhcmVUb2tlblRvUGF5QW1vdW50BQAAAAxzaGFyZUFzc2V0SWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEWtTaGFyZUFzc2V0U3VwcGx5CQAAZAAAAAIFAAAAEHNoYXJlQXNzZXRTdXBwbHkFAAAAFXNoYXJlVG9rZW5Ub1BheUFtb3VudAkABEwAAAACBQAAAA9uZXdCYWxhbmNlRW50cnkJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACmtJbnZhcmlhbnQFAAAAE2ludmFyaWFudENhbGN1bGF0ZWQFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAABaQEAAAAId2l0aGRyYXcAAAAABAAAAA0kdDAxODcxOTE4ODYyCQAFFAAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAAJcG10QW1vdW50CAUAAAANJHQwMTg3MTkxODg2MgAAAAJfMQQAAAAKcG10QXNzZXRJZAgFAAAADSR0MDE4NzE5MTg4NjIAAAACXzIEAAAADGFtb3VudFRvUGF5QQkAAGsAAAADBQAAAAlwbXRBbW91bnQFAAAACGJhbGFuY2VBBQAAABBzaGFyZUFzc2V0U3VwcGx5BAAAAAxhbW91bnRUb1BheUIJAABrAAAAAwUAAAAJcG10QW1vdW50BQAAAAhiYWxhbmNlQgUAAAAQc2hhcmVBc3NldFN1cHBseQQAAAATaW52YXJpYW50Q2FsY3VsYXRlZAkBAAAADWludmFyaWFudENhbGMAAAACCQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAAAxhbW91bnRUb1BheUEJAABlAAAAAgUAAAAIYmFsYW5jZUIFAAAADGFtb3VudFRvUGF5QgMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAQAAAA90aHJvd0lzSW5hY3RpdmUAAAAAAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAIAAAABAgAAAB1PbmUgYXR0YWNoZWQgcGF5bWVudCBleHBlY3RlZAMJAQAAAAIhPQAAAAIFAAAACnBtdEFzc2V0SWQFAAAADHNoYXJlQXNzZXRJZAkAAAIAAAABCQABLAAAAAICAAAAJEluY29ycmVjdCBhc3NldCBhdHRhY2hlZC4gRXhwZWN0ZWQ6IAkAAlgAAAABBQAAAAxzaGFyZUFzc2V0SWQDCQEAAAABIQAAAAEFAAAAEGhhc0Vub3VnaEJhbGFuY2UJAAROAAAAAgkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAACXBtdEFtb3VudAUAAAAKcG10QXNzZXRJZAUAAAADbmlsCQEAAAARc3VzcGVuZFN1c3BpY2lvdXMAAAAABAAAAAZzdGFrZTEDCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAANc3Rha2luZ0Fzc2V0cwUAAAALc3RyQXNzZXRJZEEJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VVbnN0YWtlCQAETAAAAAIHCQAETAAAAAIFAAAADGFtb3VudFRvUGF5QQkABEwAAAACBQAAAAtzdHJBc3NldElkQQUAAAADbmlsBQAAAANuaWwAAAAAAAAAAAADCQAAAAAAAAIFAAAABnN0YWtlMQUAAAAGc3Rha2UxBAAAAAZzdGFrZTIDCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAANc3Rha2luZ0Fzc2V0cwUAAAALc3RyQXNzZXRJZEIJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VVbnN0YWtlCQAETAAAAAIHCQAETAAAAAIFAAAADGFtb3VudFRvUGF5QgkABEwAAAACBQAAAAtzdHJBc3NldElkQgUAAAADbmlsBQAAAANuaWwAAAAAAAAAAAADCQAAAAAAAAIFAAAABnN0YWtlMgUAAAAGc3Rha2UyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAlrQmFsYW5jZUEJAABlAAAAAgUAAAAIYmFsYW5jZUEFAAAADGFtb3VudFRvUGF5QQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VCCQAAZQAAAAIFAAAACGJhbGFuY2VCBQAAAAxhbW91bnRUb1BheUIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEWtTaGFyZUFzc2V0U3VwcGx5CQAAZQAAAAIFAAAAEHNoYXJlQXNzZXRTdXBwbHkFAAAACXBtdEFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAKa0ludmFyaWFudAUAAAATaW52YXJpYW50Q2FsY3VsYXRlZAkABEwAAAACCQEAAAAEQnVybgAAAAIFAAAADHNoYXJlQXNzZXRJZAUAAAAJcG10QW1vdW50CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAMYW1vdW50VG9QYXlBBQAAAAhhc3NldElkQQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAADGFtb3VudFRvUGF5QgUAAAAIYXNzZXRJZEIFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAACGV4Y2hhbmdlAAAAAgAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUAAAASbWluQW1vdW50VG9SZWNlaXZlBAAAAA0kdDAyMDM3NjIwNDUxCQAFFAAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAAJcG10QW1vdW50CAUAAAANJHQwMjAzNzYyMDQ1MQAAAAJfMQQAAAAKcG10QXNzZXRJZAgFAAAADSR0MDIwMzc2MjA0NTEAAAACXzIDCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQEAAAAPdGhyb3dJc0luYWN0aXZlAAAAAAMJAABnAAAAAgAAAAAAAAAAAAUAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlCQAAAgAAAAEJAAEsAAAAAgIAAAArRXN0aW1hdGVkIGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlLiBBY3R1YWw6IAkAAaQAAAABBQAAABhlc3RpbWF0ZWRBbW91bnRUb1JlY2VpdmUDCQAAZgAAAAIFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQUAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAO01pbmltYWwgYW1vdW50IGNhbid0IGJlIGdyZWF0ZXIgdGhhbiBlc3RpbWF0ZWQuIEVzdGltYXRlZDogCQABpAAAAAEFAAAAGGVzdGltYXRlZEFtb3VudFRvUmVjZWl2ZQIAAAALLiBNaW5pbWFsOiAJAAGkAAAAAQUAAAASbWluQW1vdW50VG9SZWNlaXZlAwkBAAAAAiE9AAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAQkAAAIAAAABAgAAAB1PbmUgYXR0YWNoZWQgcGF5bWVudCBleHBlY3RlZAMJAQAAAAEhAAAAAQUAAAAQaGFzRW5vdWdoQmFsYW5jZQkABE4AAAACCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAJcG10QW1vdW50BQAAAApwbXRBc3NldElkBQAAAANuaWwJAQAAABFzdXNwZW5kU3VzcGljaW91cwAAAAADAwkBAAAAAiE9AAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEJAQAAAAIhPQAAAAIFAAAACnBtdEFzc2V0SWQFAAAACGFzc2V0SWRCBwkBAAAAC3Rocm93QXNzZXRzAAAAAAMJAABmAAAAAgAAAAAAAJiWgAUAAAAJcG10QW1vdW50CQAAAgAAAAECAAAAME9ubHkgc3dhcCBvZiAxMC4wMDAwMDAgb3IgbW9yZSB0b2tlbnMgaXMgYWxsb3dlZAMDCQAAZgAAAAIFAAAAFWV4Y2hhbmdlUmF0aW9MaW1pdE1pbgkAAGsAAAADBQAAAAZzY2FsZTgFAAAAEm1pbkFtb3VudFRvUmVjZWl2ZQUAAAAJcG10QW1vdW50BgkAAGYAAAACCQAAawAAAAMFAAAABnNjYWxlOAUAAAAYZXN0aW1hdGVkQW1vdW50VG9SZWNlaXZlBQAAAAlwbXRBbW91bnQFAAAAFWV4Y2hhbmdlUmF0aW9MaW1pdE1heAkAAAIAAAABAgAAABxJbmNvcnJlY3QgYXJncyBhbmQgcG10IHJhdGlvBAAAAAtzZW5kQXNzZXRJZAMJAAAAAAAAAgUAAAAKcG10QXNzZXRJZAUAAAAIYXNzZXRJZEEFAAAACGFzc2V0SWRCBQAAAAhhc3NldElkQQQAAAAGYW1vdW50CQEAAAATY2FsY3VsYXRlU2VuZEFtb3VudAAAAAQFAAAAGGVzdGltYXRlZEFtb3VudFRvUmVjZWl2ZQUAAAASbWluQW1vdW50VG9SZWNlaXZlBQAAAAlwbXRBbW91bnQFAAAACnBtdEFzc2V0SWQEAAAAEGdvdmVybmFuY2VSZXdhcmQJAABrAAAAAwUAAAAGYW1vdW50BQAAAA1mZWVHb3Zlcm5hbmNlBQAAAAlmZWVTY2FsZTYEAAAADmFtb3VudE1pbnVzRmVlCQAAawAAAAMFAAAABmFtb3VudAkAAGUAAAACBQAAAAlmZWVTY2FsZTYFAAAAA2ZlZQUAAAAJZmVlU2NhbGU2BAAAAA0kdDAyMTg3MzIyMTM1AwkAAAAAAAACBQAAAApwbXRBc3NldElkBQAAAAhhc3NldElkQQkABRQAAAACCQAAZAAAAAIFAAAACGJhbGFuY2VBBQAAAAlwbXRBbW91bnQJAABlAAAAAgkAAGUAAAACBQAAAAhiYWxhbmNlQgUAAAAOYW1vdW50TWludXNGZWUFAAAAEGdvdmVybmFuY2VSZXdhcmQJAAUUAAAAAgkAAGUAAAACCQAAZQAAAAIFAAAACGJhbGFuY2VBBQAAAA5hbW91bnRNaW51c0ZlZQUAAAAQZ292ZXJuYW5jZVJld2FyZAkAAGQAAAACBQAAAAhiYWxhbmNlQgUAAAAJcG10QW1vdW50BAAAAAtuZXdCYWxhbmNlQQgFAAAADSR0MDIxODczMjIxMzUAAAACXzEEAAAAC25ld0JhbGFuY2VCCAUAAAANJHQwMjE4NzMyMjEzNQAAAAJfMgQAAAATZEFwcFRocmVzaG9sZEFtb3VudAkAAGsAAAADCQAAZAAAAAIFAAAAC25ld0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQgUAAAANZEFwcFRocmVzaG9sZAkAAGgAAAACAAAAAAAAAAACBQAAABNkQXBwVGhyZXNob2xkU2NhbGUyAwMJAABmAAAAAgUAAAATZEFwcFRocmVzaG9sZEFtb3VudAUAAAALbmV3QmFsYW5jZUEGCQAAZgAAAAIFAAAAE2RBcHBUaHJlc2hvbGRBbW91bnQFAAAAC25ld0JhbGFuY2VCCQEAAAAOdGhyb3dUaHJlc2hvbGQAAAADBQAAABNkQXBwVGhyZXNob2xkQW1vdW50BQAAAAtuZXdCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUIEAAAADSR0MDIyNDMzMjI1MDYJAQAAAAxnZXRBc3NldEluZm8AAAABBQAAAApwbXRBc3NldElkBAAAAA1wbXRTdHJBc3NldElkCAUAAAANJHQwMjI0MzMyMjUwNgAAAAJfMQQAAAAMcG10QXNzZXROYW1lCAUAAAANJHQwMjI0MzMyMjUwNgAAAAJfMgQAAAALcG10RGVjaW1hbHMIBQAAAA0kdDAyMjQzMzIyNTA2AAAAAl8zBAAAAA0kdDAyMjUxOTIyNTk2CQEAAAAMZ2V0QXNzZXRJbmZvAAAAAQUAAAALc2VuZEFzc2V0SWQEAAAADnNlbmRTdHJBc3NldElkCAUAAAANJHQwMjI1MTkyMjU5NgAAAAJfMQQAAAANc2VuZEFzc2V0TmFtZQgFAAAADSR0MDIyNTE5MjI1OTYAAAACXzIEAAAADHNlbmREZWNpbWFscwgFAAAADSR0MDIyNTE5MjI1OTYAAAACXzMEAAAABnN0YWtlMQMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAA1zdGFraW5nQXNzZXRzBQAAAA1wbXRTdHJBc3NldElkCQAD/AAAAAQFAAAABHRoaXMCAAAADHN0YWtlVW5zdGFrZQkABEwAAAACBgkABEwAAAACBQAAAAlwbXRBbW91bnQJAARMAAAAAgUAAAANcG10U3RyQXNzZXRJZAUAAAADbmlsBQAAAANuaWwAAAAAAAAAAAADCQAAAAAAAAIFAAAABnN0YWtlMQUAAAAGc3Rha2UxBAAAAAZzdGFrZTIDCQEAAAAPY29udGFpbnNFbGVtZW50AAAAAgUAAAANc3Rha2luZ0Fzc2V0cwUAAAAOc2VuZFN0ckFzc2V0SWQJAAP8AAAABAUAAAAEdGhpcwIAAAAMc3Rha2VVbnN0YWtlCQAETAAAAAIHCQAETAAAAAIJAABkAAAAAgUAAAAOYW1vdW50TWludXNGZWUFAAAAEGdvdmVybmFuY2VSZXdhcmQJAARMAAAAAgUAAAAOc2VuZFN0ckFzc2V0SWQFAAAAA25pbAUAAAADbmlsAAAAAAAAAAAAAwkAAAAAAAACBQAAAAZzdGFrZTIFAAAABnN0YWtlMgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VBBQAAAAtuZXdCYWxhbmNlQQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAJa0JhbGFuY2VCBQAAAAtuZXdCYWxhbmNlQgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAKa0ludmFyaWFudAkBAAAADWludmFyaWFudENhbGMAAAACBQAAAAtuZXdCYWxhbmNlQQUAAAALbmV3QmFsYW5jZUIJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAA5hbW91bnRNaW51c0ZlZQUAAAALc2VuZEFzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAHZ292QWRkcgUAAAAQZ292ZXJuYW5jZVJld2FyZAUAAAALc2VuZEFzc2V0SWQFAAAAA25pbAkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAACHNodXRkb3duAAAAAAMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAAACAAAAAQkAASwAAAACAgAAACJEQXBwIGlzIGFscmVhZHkgc3VzcGVuZGVkLiBDYXVzZTogCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAABmtDYXVzZQIAAAAadGhlIGNhdXNlIHdhc24ndCBzcGVjaWZpZWQDCQEAAAABIQAAAAEJAQAAAA9jb250YWluc0VsZW1lbnQAAAACCQAETAAAAAIFAAAADGFkbWluUHViS2V5MQkABEwAAAACBQAAAAxhZG1pblB1YktleTIJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkzCQAETAAAAAIFAAAADGFkbVN0YXJ0U3RvcAUAAAADbmlsCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkJAQAAAA50aHJvd09ubHlBZG1pbgAAAAAJAQAAAAdzdXNwZW5kAAAAAQIAAAAPUGF1c2VkIGJ5IGFkbWluAAAAAWkBAAAACGFjdGl2YXRlAAAAAAMFAAAACGlzQWN0aXZlCQEAAAANdGhyb3dJc0FjdGl2ZQAAAAADCQEAAAABIQAAAAEJAQAAAA9jb250YWluc0VsZW1lbnQAAAACCQAETAAAAAIFAAAADGFkbWluUHViS2V5MQkABEwAAAACBQAAAAxhZG1pblB1YktleTIJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkzCQAETAAAAAIFAAAADGFkbVN0YXJ0U3RvcAUAAAADbmlsCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkJAQAAAA50aHJvd09ubHlBZG1pbgAAAAAJAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIFAAAAB2tBY3RpdmUGCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEFAAAABmtDYXVzZQUAAAADbmlsAAAAAWkBAAAAGXRha2VJbnRvQWNjb3VudEV4dHJhRnVuZHMAAAABAAAAC2Ftb3VudExlYXZlBAAAAAx1bmNvdW50YWJsZUEJAABlAAAAAgUAAAAZYWNjb3VudEJhbGFuY2VXaXRoU3Rha2VkQQUAAAAIYmFsYW5jZUEEAAAADHVuY291bnRhYmxlQgkAAGUAAAACBQAAABlhY2NvdW50QmFsYW5jZVdpdGhTdGFrZWRCBQAAAAhiYWxhbmNlQgQAAAANYW1vdW50RW5yb2xsQQkAAGUAAAACBQAAAAx1bmNvdW50YWJsZUEDCQAAAAAAAAIFAAAACGFzc2V0SWRBBQAAAAR1bml0BQAAAAthbW91bnRMZWF2ZQAAAAAAAAAAAAQAAAANYW1vdW50RW5yb2xsQgkAAGUAAAACBQAAAAx1bmNvdW50YWJsZUIDCQAAAAAAAAIFAAAACGFzc2V0SWRCBQAAAAR1bml0BQAAAAthbW91bnRMZWF2ZQAAAAAAAAAAAAQAAAAMaW52YXJpYW50TmV3CQEAAAANaW52YXJpYW50Q2FsYwAAAAIJAABkAAAAAgUAAAAIYmFsYW5jZUEFAAAADWFtb3VudEVucm9sbEEJAABkAAAAAgUAAAAIYmFs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", "height": 1856849, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FaRA8aykCEdvXnmPqE8V8YCGBS1bWsViXU9YMGAURbji Next: G1kREXanqubBDmg3Ro9XEmBqGkJz4zWeMqvdG1PwfSxw Diff:
OldNewDifferences
3737
3838 let keyAdminPubKey3 = "admin_pub_3"
3939
40+let USDNToWavesExchanger = Address(base58'3N8PGkzXhbtTvEwEQTtE2xiTJmsDEQ9XfoZ')
41+
4042 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
4143
4244 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
5860 let admStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
5961
6062 let govAddr = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
63+
64+let stakingAddress = Address(base58'3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg')
6165
6266 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
6367
176180 let stakedAmountA = stakedAmount(assetIdA)
177181
178182 let stakedAmountB = stakedAmount(assetIdB)
183+
184+let availableBalanceA = (balanceA - stakedAmountA)
185+
186+let availableBalanceB = (balanceB - stakedAmountB)
179187
180188 let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
181189
350358 let pmtAssetIdB = i.payments[1].assetId
351359 let pmtAmountA = i.payments[0].amount
352360 let pmtAmountB = i.payments[1].amount
353- let $t01199212069 = getAssetInfo(pmtAssetIdA)
354- let pmtStrAssetIdA = $t01199212069._1
355- let pmtAssetNameA = $t01199212069._2
356- let pmtDecimalsA = $t01199212069._3
357- let $t01207412268 = getAssetInfo(pmtAssetIdB)
358- let pmtStrAssetIdB = $t01207412268._1
359- let pmtAssetNameB = $t01207412268._2
360- let pmtDecimalsB = $t01207412268._3
361+ let $t01198812065 = getAssetInfo(pmtAssetIdA)
362+ let pmtStrAssetIdA = $t01198812065._1
363+ let pmtAssetNameA = $t01198812065._2
364+ let pmtDecimalsA = $t01198812065._3
365+ let $t01207012264 = getAssetInfo(pmtAssetIdB)
366+ let pmtStrAssetIdB = $t01207012264._1
367+ let pmtAssetNameB = $t01207012264._2
368+ let pmtDecimalsB = $t01207012264._3
361369 let tokenRatio = fraction(fraction(scale8, balanceA, pmtAmountA), scale3, fraction(scale8, balanceB, pmtAmountB))
362370 let ratioShareTokensInA = fraction(scale8, pmtAmountA, balanceA)
363371 let ratioShareTokensInB = fraction(scale8, pmtAmountB, balanceB)
404412
405413 @Callable(i)
406414 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = {
407- let $t01456714642 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
408- let pmtAmount = $t01456714642._1
409- let pmtAssetId = $t01456714642._2
410- let $t01464714720 = getAssetInfo(pmtAssetId)
411- let pmtStrAssetId = $t01464714720._1
412- let pmtAssetName = $t01464714720._2
413- let pmtDecimals = $t01464714720._3
415+ let $t01456314638 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
416+ let pmtAmount = $t01456314638._1
417+ let pmtAssetId = $t01456314638._2
418+ let $t01464314716 = getAssetInfo(pmtAssetId)
419+ let pmtStrAssetId = $t01464314716._1
420+ let pmtAssetName = $t01464314716._2
421+ let pmtDecimals = $t01464314716._3
414422 let pmtMinThreshold = 5000000
415423 let thresholdValueForMinTolerance = 50000000
416424 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
432440 else false)
433441 then throwAssets()
434442 else {
435- let $t01573216497 = if ((pmtAssetId == assetIdA))
443+ let $t01572816493 = if ((pmtAssetId == assetIdA))
436444 then $Tuple7((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), invariantCalc((balanceA + pmtAmount), balanceB), (balanceA + pmtAmount), balanceB)
437445 else $Tuple7(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), invariantCalc(balanceA, (balanceB + pmtAmount)), balanceA, (balanceB + pmtAmount))
438- let virtualReplenishA = $t01573216497._1
439- let virtualReplenishB = $t01573216497._2
440- let balanceAfterSwapA = $t01573216497._3
441- let balanceAfterSwapB = $t01573216497._4
442- let invariantCalculated = $t01573216497._5
443- let newBalanceA = $t01573216497._6
444- let newBalanceB = $t01573216497._7
446+ let virtualReplenishA = $t01572816493._1
447+ let virtualReplenishB = $t01572816493._2
448+ let balanceAfterSwapA = $t01572816493._3
449+ let balanceAfterSwapB = $t01572816493._4
450+ let invariantCalculated = $t01572816493._5
451+ let newBalanceA = $t01572816493._6
452+ let newBalanceB = $t01572816493._7
445453 let newBalanceEntry = if ((pmtAssetId == assetIdA))
446454 then IntegerEntry(kBalanceA, newBalanceA)
447455 else IntegerEntry(kBalanceB, newBalanceB)
481489
482490 @Callable(i)
483491 func withdraw () = {
484- let $t01872318866 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
485- let pmtAmount = $t01872318866._1
486- let pmtAssetId = $t01872318866._2
492+ let $t01871918862 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
493+ let pmtAmount = $t01871918862._1
494+ let pmtAssetId = $t01871918862._2
487495 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
488496 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
489497 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
516524
517525 @Callable(i)
518526 func exchange (estimatedAmountToReceive,minAmountToReceive) = {
519- let $t02038020455 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
520- let pmtAmount = $t02038020455._1
521- let pmtAssetId = $t02038020455._2
527+ let $t02037620451 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
528+ let pmtAmount = $t02037620451._1
529+ let pmtAssetId = $t02037620451._2
522530 if (!(isActive))
523531 then throwIsInactive()
524532 else if ((0 >= estimatedAmountToReceive))
546554 let amount = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
547555 let governanceReward = fraction(amount, feeGovernance, feeScale6)
548556 let amountMinusFee = fraction(amount, (feeScale6 - fee), feeScale6)
549- let $t02187722139 = if ((pmtAssetId == assetIdA))
557+ let $t02187322135 = if ((pmtAssetId == assetIdA))
550558 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
551559 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
552- let newBalanceA = $t02187722139._1
553- let newBalanceB = $t02187722139._2
560+ let newBalanceA = $t02187322135._1
561+ let newBalanceB = $t02187322135._2
554562 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
555563 if (if ((dAppThresholdAmount > newBalanceA))
556564 then true
557565 else (dAppThresholdAmount > newBalanceB))
558566 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
559567 else {
560- let $t02243722510 = getAssetInfo(pmtAssetId)
561- let pmtStrAssetId = $t02243722510._1
562- let pmtAssetName = $t02243722510._2
563- let pmtDecimals = $t02243722510._3
564- let $t02252322600 = getAssetInfo(sendAssetId)
565- let sendStrAssetId = $t02252322600._1
566- let sendAssetName = $t02252322600._2
567- let sendDecimals = $t02252322600._3
568+ let $t02243322506 = getAssetInfo(pmtAssetId)
569+ let pmtStrAssetId = $t02243322506._1
570+ let pmtAssetName = $t02243322506._2
571+ let pmtDecimals = $t02243322506._3
572+ let $t02251922596 = getAssetInfo(sendAssetId)
573+ let sendStrAssetId = $t02251922596._1
574+ let sendAssetName = $t02251922596._2
575+ let sendDecimals = $t02251922596._3
568576 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
569577 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
570578 else 0
571579 if ((stake1 == stake1))
572580 then {
573581 let stake2 = if (containsElement(stakingAssets, sendStrAssetId))
574- then invoke(this, "stakeUnstake", [false, (amount + governanceReward), sendStrAssetId], nil)
582+ then invoke(this, "stakeUnstake", [false, (amountMinusFee + governanceReward), sendStrAssetId], nil)
575583 else 0
576584 if ((stake2 == stake2))
577585 then [IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, invariantCalc(newBalanceA, newBalanceB)), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(govAddr, governanceReward, sendAssetId)]
654662 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
655663 then throw("Only contract itself can invoke this function")
656664 else {
657- let $t02592026023 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
658- let call = $t02592026023._1
659- let addr = $t02592026023._2
660- let params = $t02592026023._3
661- let payments = $t02592026023._4
665+ let $t02592426027 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
666+ let call = $t02592426027._1
667+ let addr = $t02592426027._2
668+ let params = $t02592426027._3
669+ let payments = $t02592426027._4
662670 let inv = invoke(addr, call, params, payments)
663671 if ((inv == inv))
664672 then nil
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let version = "2.0.0"
55
66 let kVersion = "version"
77
88 let kActive = "active"
99
1010 let kAssetIdA = "A_asset_id"
1111
1212 let kAssetIdB = "B_asset_id"
1313
1414 let kBalanceA = "A_asset_balance"
1515
1616 let kBalanceB = "B_asset_balance"
1717
1818 let kShareAssetId = "share_asset_id"
1919
2020 let kShareAssetSupply = "share_asset_supply"
2121
2222 let kFee = "commission"
2323
2424 let kFeeScaleDelimiter = "commission_scale_delimiter"
2525
2626 let kInvariant = "invariant"
2727
2828 let kCause = "shutdown_cause"
2929
3030 let keyUSDNNSBTAddress = "staking_usdnnsbt_address"
3131
3232 let keyEURNAddress = "staking_eurn_address"
3333
3434 let keyAdminPubKey1 = "admin_pub_1"
3535
3636 let keyAdminPubKey2 = "admin_pub_2"
3737
3838 let keyAdminPubKey3 = "admin_pub_3"
3939
40+let USDNToWavesExchanger = Address(base58'3N8PGkzXhbtTvEwEQTtE2xiTJmsDEQ9XfoZ')
41+
4042 let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
4143
4244 func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
4345 case string: String =>
4446 fromBase58String(string)
4547 case nothing =>
4648 throw("Admin public key is empty")
4749 }
4850
4951
5052 let adminPubKey1 = getAdminPub(keyAdminPubKey1)
5153
5254 let adminPubKey2 = getAdminPub(keyAdminPubKey2)
5355
5456 let adminPubKey3 = getAdminPub(keyAdminPubKey3)
5557
5658 let admStartStop = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
5759
5860 let admStaking = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
5961
6062 let govAddr = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
63+
64+let stakingAddress = Address(base58'3N6q7sCGSSLBUXDdjBdYGTJbZGZfhhh8cNg')
6165
6266 let USDN = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS'
6367
6468 let EURN = base58'ECBCkHS68DckpBrzLeoRgYbFg7sCVqR176mPqbXsj9pA'
6569
6670 let stakingAssets = [toBase58String(USDN), toBase58String(EURN)]
6771
6872 let stakingUSDNNSBTAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyUSDNNSBTAddress), "no usdn staking address")))
6973
7074 let stakingEURNAddress = Address(fromBase58String(valueOrErrorMessage(getString(oracle, keyEURNAddress), "no usdn staking address")))
7175
7276 let isActive = getBooleanValue(this, kActive)
7377
7478 let strAssetIdA = getStringValue(this, kAssetIdA)
7579
7680 let strAssetIdB = getStringValue(this, kAssetIdB)
7781
7882 let assetIdA = if ((strAssetIdA == "WAVES"))
7983 then unit
8084 else fromBase58String(strAssetIdA)
8185
8286 let assetIdB = if ((strAssetIdB == "WAVES"))
8387 then unit
8488 else fromBase58String(strAssetIdB)
8589
8690 let assetNameA = match assetIdA {
8791 case id: ByteVector =>
8892 value(assetInfo(id)).name
8993 case waves: Unit =>
9094 "WAVES"
9195 case _ =>
9296 throw("Match error")
9397 }
9498
9599 let assetNameB = match assetIdB {
96100 case id: ByteVector =>
97101 value(assetInfo(id)).name
98102 case waves: Unit =>
99103 "WAVES"
100104 case _ =>
101105 throw("Match error")
102106 }
103107
104108 let balanceA = getIntegerValue(this, kBalanceA)
105109
106110 let balanceB = getIntegerValue(this, kBalanceB)
107111
108112 let shareAssetId = fromBase58String(getStringValue(this, kShareAssetId))
109113
110114 let shareAssetSupply = getIntegerValue(this, kShareAssetSupply)
111115
112116 let invariant = getIntegerValue(this, kInvariant)
113117
114118 let fee = 500
115119
116120 let feeGovernance = 200
117121
118122 let feeScale6 = 1000000
119123
120124 let scale3 = 1000
121125
122126 let scale8 = 100000000
123127
124128 let scale12 = 1000000000000
125129
126130 let slippageScale3 = 1000
127131
128132 let digits8 = 8
129133
130134 let dAppThreshold = 50
131135
132136 let dAppThresholdScale2 = 100
133137
134138 let exchangeRatioLimitMin = 90000000
135139
136140 let exchangeRatioLimitMax = 110000000
137141
138142 let alpha = 50
139143
140144 let alphaDigits = 2
141145
142146 let beta = 46000000
143147
144148 func accountBalance (assetId) = match assetId {
145149 case id: ByteVector =>
146150 assetBalance(this, id)
147151 case waves: Unit =>
148152 wavesBalance(this).available
149153 case _ =>
150154 throw("Match error")
151155 }
152156
153157
154158 func stakedAmount (assetId) = {
155159 let stakedAmountCalculated = match assetId {
156160 case aId: ByteVector =>
157161 if ((aId == USDN))
158162 then getInteger(stakingUSDNNSBTAddress, ((("rpd_balance_" + toBase58String(aId)) + "_") + toString(this)))
159163 else if ((aId == EURN))
160164 then getInteger(stakingEURNAddress, ((("%s%s%s__stakingBalance__" + toBase58String(aId)) + "__") + toString(this)))
161165 else 0
162166 case _: Unit =>
163167 0
164168 case _ =>
165169 throw("Match error")
166170 }
167171 match stakedAmountCalculated {
168172 case i: Int =>
169173 i
170174 case _ =>
171175 0
172176 }
173177 }
174178
175179
176180 let stakedAmountA = stakedAmount(assetIdA)
177181
178182 let stakedAmountB = stakedAmount(assetIdB)
183+
184+let availableBalanceA = (balanceA - stakedAmountA)
185+
186+let availableBalanceB = (balanceB - stakedAmountB)
179187
180188 let accountBalanceWithStakedA = (accountBalance(assetIdA) + stakedAmountA)
181189
182190 let accountBalanceWithStakedB = (accountBalance(assetIdB) + stakedAmountB)
183191
184192 let hasEnoughBalance = if ((accountBalanceWithStakedA >= balanceA))
185193 then (accountBalanceWithStakedB >= balanceB)
186194 else false
187195
188196 func skewness (x,y) = (((fraction(scale12, x, y) + fraction(scale12, y, x)) / 2) / 10000)
189197
190198
191199 func invariantCalc (x,y) = {
192200 let sk = skewness(x, y)
193201 (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)))
194202 }
195203
196204
197205 func calculateSendAmount (amountToSendEstimated,minTokenReceiveAmount,tokenReceiveAmount,tokenId) = {
198206 let slippageValue = (scale8 - ((scale8 * 1) / 10000000))
199207 let deltaBetweenMaxAndMinSendValue = (amountToSendEstimated - minTokenReceiveAmount)
200208 let x = (balanceA + tokenReceiveAmount)
201209 let y = (balanceB + tokenReceiveAmount)
202210 let invariantNew = if ((tokenId == assetIdA))
203211 then invariantCalc(x, (balanceB - amountToSendEstimated))
204212 else if ((tokenId == assetIdB))
205213 then invariantCalc((balanceA - amountToSendEstimated), y)
206214 else throw("Wrong asset in payment")
207215 let invariantEstimatedRatio = fraction(scale8, invariant, invariantNew)
208216 func getStepAmount (acc,step) = if ((acc == -1))
209217 then {
210218 let amountToSend = (amountToSendEstimated - ((step * deltaBetweenMaxAndMinSendValue) / 5))
211219 let stepInvariant = if ((tokenId == assetIdA))
212220 then invariantCalc(x, (balanceB - amountToSend))
213221 else invariantCalc((balanceA - amountToSend), y)
214222 if ((stepInvariant > invariant))
215223 then amountToSend
216224 else -1
217225 }
218226 else acc
219227
220228 let stepAmount = {
221229 let $l = [1, 2, 3, 4, 5]
222230 let $s = size($l)
223231 let $acc0 = -1
224232 func $f0_1 ($a,$i) = if (($i >= $s))
225233 then $a
226234 else getStepAmount($a, $l[$i])
227235
228236 func $f0_2 ($a,$i) = if (($i >= $s))
229237 then $a
230238 else throw("List size exceeds 5")
231239
232240 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
233241 }
234242 if ((0 > stepAmount))
235243 then throw("something went wrong while working with amountToSend")
236244 else if (if ((invariantEstimatedRatio > slippageValue))
237245 then (invariantNew > invariant)
238246 else false)
239247 then amountToSendEstimated
240248 else stepAmount
241249 }
242250
243251
244252 func getAssetInfo (assetId) = match assetId {
245253 case id: ByteVector =>
246254 let stringId = toBase58String(id)
247255 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
248256 $Tuple3(stringId, info.name, info.decimals)
249257 case waves: Unit =>
250258 $Tuple3("WAVES", "WAVES", 8)
251259 case _ =>
252260 throw("Match error")
253261 }
254262
255263
256264 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
257265
258266
259267 func throwIsActive () = throw("DApp is already active")
260268
261269
262270 func throwIsInactive () = throw("DApp is inactive at this moment")
263271
264272
265273 func throwOnlyAdmin () = throw("Only admin can call this function")
266274
267275
268276 func throwAssets () = throw(((("Incorrect assets attached. Expected: " + strAssetIdA) + " and ") + strAssetIdB))
269277
270278
271279 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))
272280
273281
274282 func suspendSuspicious () = suspend(((((((((((((((("Suspicious state. Actual balances: " + toString(balanceA)) + " ") + assetNameA) + ", ") + toString(balanceB)) + " ") + assetNameB) + ". State: ") + toString(accountBalance(assetIdA))) + " ") + assetNameA) + ", ") + toString(accountBalance(assetIdB))) + " ") + assetNameB))
275283
276284
277285 func calcStakingFuncAndAddres (stake,assetId) = if (stake)
278286 then if ((assetId == USDN))
279287 then $Tuple2("lockNeutrino", stakingUSDNNSBTAddress)
280288 else $Tuple2("startStaking", stakingEURNAddress)
281289 else if ((assetId == USDN))
282290 then $Tuple2("unlockNeutrino", stakingUSDNNSBTAddress)
283291 else $Tuple2("stopStaking", stakingEURNAddress)
284292
285293
286294 func calcStakingParams (stake,amount,assetId) = if (stake)
287295 then {
288296 let $t088268892 = calcStakingFuncAndAddres(stake, assetId)
289297 let call = $t088268892._1
290298 let stakingAddr = $t088268892._2
291299 $Tuple4(call, stakingAddr, nil, [AttachedPayment(assetId, amount)])
292300 }
293301 else {
294302 let $t089789044 = calcStakingFuncAndAddres(stake, assetId)
295303 let call = $t089789044._1
296304 let stakingAddr = $t089789044._2
297305 $Tuple4(call, stakingAddr, [amount, toBase58String(assetId)], nil)
298306 }
299307
300308
301309 @Callable(i)
302310 func init () = {
303311 let $t091499226 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
304312 let pmtAmountA = $t091499226._1
305313 let pmtAssetIdA = $t091499226._2
306314 let $t092319308 = $Tuple2(i.payments[1].amount, i.payments[1].assetId)
307315 let pmtAmountB = $t092319308._1
308316 let pmtAssetIdB = $t092319308._2
309317 let $t093139390 = getAssetInfo(pmtAssetIdA)
310318 let pmtStrAssetIdA = $t093139390._1
311319 let pmtAssetNameA = $t093139390._2
312320 let pmtDecimalsA = $t093139390._3
313321 let $t093959472 = getAssetInfo(pmtAssetIdB)
314322 let pmtStrAssetIdB = $t093959472._1
315323 let pmtAssetNameB = $t093959472._2
316324 let pmtDecimalsB = $t093959472._3
317325 if (isDefined(getBoolean(this, kActive)))
318326 then throwIsActive()
319327 else if ((pmtAssetIdA == pmtAssetIdB))
320328 then throw("Assets must be different")
321329 else {
322330 let shareName = ((("s" + take(pmtAssetNameA, 7)) + "_") + take(pmtAssetNameB, 7))
323331 let shareDescription = ((((("ShareToken of SwopFi protocol for " + pmtAssetNameA) + " and ") + pmtAssetNameB) + " at address ") + toString(this))
324332 let shareDecimals = ((pmtDecimalsA + pmtDecimalsB) / 2)
325333 let shareInitialSupply = fraction(pow(pmtAmountA, pmtDecimalsA, 5, 1, pmtDecimalsA, DOWN), pow(pmtAmountB, pmtDecimalsB, 5, 1, pmtDecimalsB, DOWN), pow(10, 0, shareDecimals, 0, 0, DOWN))
326334 let shareIssue = Issue(shareName, shareDescription, shareInitialSupply, shareDecimals, true)
327335 let shareIssueId = calculateAssetId(shareIssue)
328336 let invariantCalculated = invariantCalc(pmtAmountA, pmtAmountB)
329337 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
330338 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
331339 else 0
332340 if ((stake1 == stake1))
333341 then {
334342 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
335343 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
336344 else 0
337345 if ((stake2 == stake2))
338346 then [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)]
339347 else throw("Strict value is not equal to itself.")
340348 }
341349 else throw("Strict value is not equal to itself.")
342350 }
343351 }
344352
345353
346354
347355 @Callable(i)
348356 func replenishWithTwoTokens (slippageTolerance) = {
349357 let pmtAssetIdA = i.payments[0].assetId
350358 let pmtAssetIdB = i.payments[1].assetId
351359 let pmtAmountA = i.payments[0].amount
352360 let pmtAmountB = i.payments[1].amount
353- let $t01199212069 = getAssetInfo(pmtAssetIdA)
354- let pmtStrAssetIdA = $t01199212069._1
355- let pmtAssetNameA = $t01199212069._2
356- let pmtDecimalsA = $t01199212069._3
357- let $t01207412268 = getAssetInfo(pmtAssetIdB)
358- let pmtStrAssetIdB = $t01207412268._1
359- let pmtAssetNameB = $t01207412268._2
360- let pmtDecimalsB = $t01207412268._3
361+ let $t01198812065 = getAssetInfo(pmtAssetIdA)
362+ let pmtStrAssetIdA = $t01198812065._1
363+ let pmtAssetNameA = $t01198812065._2
364+ let pmtDecimalsA = $t01198812065._3
365+ let $t01207012264 = getAssetInfo(pmtAssetIdB)
366+ let pmtStrAssetIdB = $t01207012264._1
367+ let pmtAssetNameB = $t01207012264._2
368+ let pmtDecimalsB = $t01207012264._3
361369 let tokenRatio = fraction(fraction(scale8, balanceA, pmtAmountA), scale3, fraction(scale8, balanceB, pmtAmountB))
362370 let ratioShareTokensInA = fraction(scale8, pmtAmountA, balanceA)
363371 let ratioShareTokensInB = fraction(scale8, pmtAmountB, balanceB)
364372 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
365373 let invariantCalculated = invariantCalc((balanceA + pmtAmountA), (balanceB + pmtAmountB))
366374 if (!(isActive))
367375 then throwIsInactive()
368376 else if (if ((0 > slippageTolerance))
369377 then true
370378 else (slippageTolerance > 10))
371379 then throw("Slippage tolerance must be <= 1%")
372380 else if ((size(i.payments) != 2))
373381 then throw("Two attached assets expected")
374382 else if (if ((pmtAssetIdA != assetIdA))
375383 then true
376384 else (pmtAssetIdB != assetIdB))
377385 then throwAssets()
378386 else if (if ((((scale3 * (slippageScale3 - slippageTolerance)) / slippageScale3) > tokenRatio))
379387 then true
380388 else (tokenRatio > ((scale3 * (slippageScale3 + slippageTolerance)) / slippageScale3)))
381389 then throw("Incorrect assets amount: amounts must have the contract ratio")
382390 else if ((shareTokenToPayAmount == 0))
383391 then throw("Too small amount to replenish")
384392 else if (!(hasEnoughBalance))
385393 then ([ScriptTransfer(i.caller, pmtAmountA, pmtAssetIdA), ScriptTransfer(i.caller, pmtAmountB, pmtAssetIdB)] ++ suspendSuspicious())
386394 else {
387395 let stake1 = if (containsElement(stakingAssets, pmtStrAssetIdA))
388396 then invoke(this, "stakeUnstake", [true, pmtAmountA, pmtStrAssetIdA], nil)
389397 else 0
390398 if ((stake1 == stake1))
391399 then {
392400 let stake2 = if (containsElement(stakingAssets, pmtStrAssetIdB))
393401 then invoke(this, "stakeUnstake", [true, pmtAmountB, pmtStrAssetIdB], nil)
394402 else 0
395403 if ((stake2 == stake2))
396404 then [IntegerEntry(kBalanceA, (balanceA + pmtAmountA)), IntegerEntry(kBalanceB, (balanceB + pmtAmountB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), IntegerEntry(kInvariant, invariantCalculated), Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId)]
397405 else throw("Strict value is not equal to itself.")
398406 }
399407 else throw("Strict value is not equal to itself.")
400408 }
401409 }
402410
403411
404412
405413 @Callable(i)
406414 func replenishWithOneToken (virtualSwapTokenPay,virtualSwapTokenGet) = {
407- let $t01456714642 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
408- let pmtAmount = $t01456714642._1
409- let pmtAssetId = $t01456714642._2
410- let $t01464714720 = getAssetInfo(pmtAssetId)
411- let pmtStrAssetId = $t01464714720._1
412- let pmtAssetName = $t01464714720._2
413- let pmtDecimals = $t01464714720._3
415+ let $t01456314638 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
416+ let pmtAmount = $t01456314638._1
417+ let pmtAssetId = $t01456314638._2
418+ let $t01464314716 = getAssetInfo(pmtAssetId)
419+ let pmtStrAssetId = $t01464314716._1
420+ let pmtAssetName = $t01464314716._2
421+ let pmtDecimals = $t01464314716._3
414422 let pmtMinThreshold = 5000000
415423 let thresholdValueForMinTolerance = 50000000
416424 let tolerance = if ((thresholdValueForMinTolerance > pmtAmount))
417425 then 100000
418426 else 1
419427 let slippageValueMinForReplenish = (scale8 - ((scale8 * tolerance) / 10000000))
420428 let slippageValueMaxForReplenish = (scale8 + ((scale8 * tolerance) / 10000000))
421429 let slippageValueMinForSwap = (scale8 - ((scale8 * 1) / 10000000))
422430 if (!(isActive))
423431 then throwIsInactive()
424432 else if ((pmtMinThreshold > pmtAmount))
425433 then throw((((("Payment amount " + toString(pmtAmount)) + " does not exceed the minimum amount of ") + toString(pmtMinThreshold)) + " tokens"))
426434 else if ((size(i.payments) != 1))
427435 then throw("One attached payment expected")
428436 else if (!(hasEnoughBalance))
429437 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
430438 else if (if ((pmtAssetId != assetIdA))
431439 then (pmtAssetId != assetIdB)
432440 else false)
433441 then throwAssets()
434442 else {
435- let $t01573216497 = if ((pmtAssetId == assetIdA))
443+ let $t01572816493 = if ((pmtAssetId == assetIdA))
436444 then $Tuple7((pmtAmount - virtualSwapTokenPay), virtualSwapTokenGet, (balanceA + virtualSwapTokenPay), (balanceB - virtualSwapTokenGet), invariantCalc((balanceA + pmtAmount), balanceB), (balanceA + pmtAmount), balanceB)
437445 else $Tuple7(virtualSwapTokenGet, (pmtAmount - virtualSwapTokenPay), (balanceA - virtualSwapTokenGet), (balanceB + virtualSwapTokenPay), invariantCalc(balanceA, (balanceB + pmtAmount)), balanceA, (balanceB + pmtAmount))
438- let virtualReplenishA = $t01573216497._1
439- let virtualReplenishB = $t01573216497._2
440- let balanceAfterSwapA = $t01573216497._3
441- let balanceAfterSwapB = $t01573216497._4
442- let invariantCalculated = $t01573216497._5
443- let newBalanceA = $t01573216497._6
444- let newBalanceB = $t01573216497._7
446+ let virtualReplenishA = $t01572816493._1
447+ let virtualReplenishB = $t01572816493._2
448+ let balanceAfterSwapA = $t01572816493._3
449+ let balanceAfterSwapB = $t01572816493._4
450+ let invariantCalculated = $t01572816493._5
451+ let newBalanceA = $t01572816493._6
452+ let newBalanceB = $t01572816493._7
445453 let newBalanceEntry = if ((pmtAssetId == assetIdA))
446454 then IntegerEntry(kBalanceA, newBalanceA)
447455 else IntegerEntry(kBalanceB, newBalanceB)
448456 let invariantNew = invariantCalc(balanceAfterSwapA, balanceAfterSwapB)
449457 let invariantEstimatedRatio = fraction(scale8, invariant, invariantNew)
450458 let ratioVirtualBalanceToVirtualReplenish = (fraction((scale8 * scale8), balanceAfterSwapA, balanceAfterSwapB) / fraction(scale8, virtualReplenishA, virtualReplenishB))
451459 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
452460 if (if ((slippageValueMinForSwap >= invariantEstimatedRatio))
453461 then true
454462 else (invariant > invariantNew))
455463 then throw("Incorrect virtualSwapTokenPay or virtualSwapTokenGet value")
456464 else if (if ((slippageValueMinForReplenish > ratioVirtualBalanceToVirtualReplenish))
457465 then true
458466 else (ratioVirtualBalanceToVirtualReplenish > slippageValueMaxForReplenish))
459467 then throw("Swap with virtualSwapTokenPay and virtualSwapTokenGet is possible, but ratio after virtual swap is incorrect")
460468 else if (if ((dAppThresholdAmount > newBalanceA))
461469 then true
462470 else (dAppThresholdAmount > newBalanceB))
463471 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
464472 else {
465473 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
466474 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
467475 else 0
468476 if ((stake1 == stake1))
469477 then {
470478 let ratioShareTokensInA = fraction(virtualReplenishA, scale8, balanceAfterSwapA)
471479 let ratioShareTokensInB = fraction(virtualReplenishB, scale8, balanceAfterSwapB)
472480 let shareTokenToPayAmount = fraction(min([ratioShareTokensInA, ratioShareTokensInB]), shareAssetSupply, scale8)
473481 [Reissue(shareAssetId, shareTokenToPayAmount, true), ScriptTransfer(i.caller, shareTokenToPayAmount, shareAssetId), IntegerEntry(kShareAssetSupply, (shareAssetSupply + shareTokenToPayAmount)), newBalanceEntry, IntegerEntry(kInvariant, invariantCalculated)]
474482 }
475483 else throw("Strict value is not equal to itself.")
476484 }
477485 }
478486 }
479487
480488
481489
482490 @Callable(i)
483491 func withdraw () = {
484- let $t01872318866 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
485- let pmtAmount = $t01872318866._1
486- let pmtAssetId = $t01872318866._2
492+ let $t01871918862 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
493+ let pmtAmount = $t01871918862._1
494+ let pmtAssetId = $t01871918862._2
487495 let amountToPayA = fraction(pmtAmount, balanceA, shareAssetSupply)
488496 let amountToPayB = fraction(pmtAmount, balanceB, shareAssetSupply)
489497 let invariantCalculated = invariantCalc((balanceA - amountToPayA), (balanceB - amountToPayB))
490498 if (!(isActive))
491499 then throwIsInactive()
492500 else if ((size(i.payments) != 1))
493501 then throw("One attached payment expected")
494502 else if ((pmtAssetId != shareAssetId))
495503 then throw(("Incorrect asset attached. Expected: " + toBase58String(shareAssetId)))
496504 else if (!(hasEnoughBalance))
497505 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
498506 else {
499507 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
500508 then invoke(this, "stakeUnstake", [false, amountToPayA, strAssetIdA], nil)
501509 else 0
502510 if ((stake1 == stake1))
503511 then {
504512 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
505513 then invoke(this, "stakeUnstake", [false, amountToPayB, strAssetIdB], nil)
506514 else 0
507515 if ((stake2 == stake2))
508516 then [IntegerEntry(kBalanceA, (balanceA - amountToPayA)), IntegerEntry(kBalanceB, (balanceB - amountToPayB)), IntegerEntry(kShareAssetSupply, (shareAssetSupply - pmtAmount)), IntegerEntry(kInvariant, invariantCalculated), Burn(shareAssetId, pmtAmount), ScriptTransfer(i.caller, amountToPayA, assetIdA), ScriptTransfer(i.caller, amountToPayB, assetIdB)]
509517 else throw("Strict value is not equal to itself.")
510518 }
511519 else throw("Strict value is not equal to itself.")
512520 }
513521 }
514522
515523
516524
517525 @Callable(i)
518526 func exchange (estimatedAmountToReceive,minAmountToReceive) = {
519- let $t02038020455 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
520- let pmtAmount = $t02038020455._1
521- let pmtAssetId = $t02038020455._2
527+ let $t02037620451 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
528+ let pmtAmount = $t02037620451._1
529+ let pmtAssetId = $t02037620451._2
522530 if (!(isActive))
523531 then throwIsInactive()
524532 else if ((0 >= estimatedAmountToReceive))
525533 then throw(("Estimated amount must be positive. Actual: " + toString(estimatedAmountToReceive)))
526534 else if ((minAmountToReceive > estimatedAmountToReceive))
527535 then throw(((("Minimal amount can't be greater than estimated. Estimated: " + toString(estimatedAmountToReceive)) + ". Minimal: ") + toString(minAmountToReceive)))
528536 else if ((size(i.payments) != 1))
529537 then throw("One attached payment expected")
530538 else if (!(hasEnoughBalance))
531539 then ([ScriptTransfer(i.caller, pmtAmount, pmtAssetId)] ++ suspendSuspicious())
532540 else if (if ((pmtAssetId != assetIdA))
533541 then (pmtAssetId != assetIdB)
534542 else false)
535543 then throwAssets()
536544 else if ((10000000 > pmtAmount))
537545 then throw("Only swap of 10.000000 or more tokens is allowed")
538546 else if (if ((exchangeRatioLimitMin > fraction(scale8, minAmountToReceive, pmtAmount)))
539547 then true
540548 else (fraction(scale8, estimatedAmountToReceive, pmtAmount) > exchangeRatioLimitMax))
541549 then throw("Incorrect args and pmt ratio")
542550 else {
543551 let sendAssetId = if ((pmtAssetId == assetIdA))
544552 then assetIdB
545553 else assetIdA
546554 let amount = calculateSendAmount(estimatedAmountToReceive, minAmountToReceive, pmtAmount, pmtAssetId)
547555 let governanceReward = fraction(amount, feeGovernance, feeScale6)
548556 let amountMinusFee = fraction(amount, (feeScale6 - fee), feeScale6)
549- let $t02187722139 = if ((pmtAssetId == assetIdA))
557+ let $t02187322135 = if ((pmtAssetId == assetIdA))
550558 then $Tuple2((balanceA + pmtAmount), ((balanceB - amountMinusFee) - governanceReward))
551559 else $Tuple2(((balanceA - amountMinusFee) - governanceReward), (balanceB + pmtAmount))
552- let newBalanceA = $t02187722139._1
553- let newBalanceB = $t02187722139._2
560+ let newBalanceA = $t02187322135._1
561+ let newBalanceB = $t02187322135._2
554562 let dAppThresholdAmount = fraction((newBalanceA + newBalanceB), dAppThreshold, (2 * dAppThresholdScale2))
555563 if (if ((dAppThresholdAmount > newBalanceA))
556564 then true
557565 else (dAppThresholdAmount > newBalanceB))
558566 then throwThreshold(dAppThresholdAmount, newBalanceA, newBalanceB)
559567 else {
560- let $t02243722510 = getAssetInfo(pmtAssetId)
561- let pmtStrAssetId = $t02243722510._1
562- let pmtAssetName = $t02243722510._2
563- let pmtDecimals = $t02243722510._3
564- let $t02252322600 = getAssetInfo(sendAssetId)
565- let sendStrAssetId = $t02252322600._1
566- let sendAssetName = $t02252322600._2
567- let sendDecimals = $t02252322600._3
568+ let $t02243322506 = getAssetInfo(pmtAssetId)
569+ let pmtStrAssetId = $t02243322506._1
570+ let pmtAssetName = $t02243322506._2
571+ let pmtDecimals = $t02243322506._3
572+ let $t02251922596 = getAssetInfo(sendAssetId)
573+ let sendStrAssetId = $t02251922596._1
574+ let sendAssetName = $t02251922596._2
575+ let sendDecimals = $t02251922596._3
568576 let stake1 = if (containsElement(stakingAssets, pmtStrAssetId))
569577 then invoke(this, "stakeUnstake", [true, pmtAmount, pmtStrAssetId], nil)
570578 else 0
571579 if ((stake1 == stake1))
572580 then {
573581 let stake2 = if (containsElement(stakingAssets, sendStrAssetId))
574- then invoke(this, "stakeUnstake", [false, (amount + governanceReward), sendStrAssetId], nil)
582+ then invoke(this, "stakeUnstake", [false, (amountMinusFee + governanceReward), sendStrAssetId], nil)
575583 else 0
576584 if ((stake2 == stake2))
577585 then [IntegerEntry(kBalanceA, newBalanceA), IntegerEntry(kBalanceB, newBalanceB), IntegerEntry(kInvariant, invariantCalc(newBalanceA, newBalanceB)), ScriptTransfer(i.caller, amountMinusFee, sendAssetId), ScriptTransfer(govAddr, governanceReward, sendAssetId)]
578586 else throw("Strict value is not equal to itself.")
579587 }
580588 else throw("Strict value is not equal to itself.")
581589 }
582590 }
583591 }
584592
585593
586594
587595 @Callable(i)
588596 func shutdown () = if (!(isActive))
589597 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
590598 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, admStartStop], i.callerPublicKey)))
591599 then throwOnlyAdmin()
592600 else suspend("Paused by admin")
593601
594602
595603
596604 @Callable(i)
597605 func activate () = if (isActive)
598606 then throwIsActive()
599607 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, admStartStop], i.callerPublicKey)))
600608 then throwOnlyAdmin()
601609 else [BooleanEntry(kActive, true), DeleteEntry(kCause)]
602610
603611
604612
605613 @Callable(i)
606614 func takeIntoAccountExtraFunds (amountLeave) = {
607615 let uncountableA = (accountBalanceWithStakedA - balanceA)
608616 let uncountableB = (accountBalanceWithStakedB - balanceB)
609617 let amountEnrollA = (uncountableA - (if ((assetIdA == unit))
610618 then amountLeave
611619 else 0))
612620 let amountEnrollB = (uncountableB - (if ((assetIdB == unit))
613621 then amountLeave
614622 else 0))
615623 let invariantNew = invariantCalc((balanceA + amountEnrollA), (balanceB + amountEnrollB))
616624 if (!(isActive))
617625 then throwIsInactive()
618626 else if ((i.caller != this))
619627 then throwOnlyAdmin()
620628 else if ((0 > amountLeave))
621629 then throw(("Argument 'amountLeave' cannot be negative. Actual: " + toString(amountLeave)))
622630 else if (if ((0 > uncountableA))
623631 then true
624632 else (0 > uncountableB))
625633 then suspend("Enroll amount negative")
626634 else if (if ((0 > amountEnrollA))
627635 then true
628636 else (0 > amountEnrollB))
629637 then throw("Too large amountLeave")
630638 else {
631639 let stake1 = if (if (containsElement(stakingAssets, strAssetIdA))
632640 then (amountEnrollA > 0)
633641 else false)
634642 then invoke(this, "stakeUnstake", [true, amountEnrollA, strAssetIdA], nil)
635643 else 0
636644 if ((stake1 == stake1))
637645 then {
638646 let stake2 = if (if (containsElement(stakingAssets, strAssetIdB))
639647 then (amountEnrollB > 0)
640648 else false)
641649 then invoke(this, "stakeUnstake", [true, amountEnrollB, strAssetIdB], nil)
642650 else 0
643651 if ((stake2 == stake2))
644652 then [IntegerEntry(kInvariant, invariantNew), IntegerEntry(kBalanceA, (balanceA + amountEnrollA)), IntegerEntry(kBalanceB, (balanceB + amountEnrollB)), IntegerEntry(("last_income_" + strAssetIdA), amountEnrollA), IntegerEntry(("last_income_" + strAssetIdB), amountEnrollB)]
645653 else throw("Strict value is not equal to itself.")
646654 }
647655 else throw("Strict value is not equal to itself.")
648656 }
649657 }
650658
651659
652660
653661 @Callable(i)
654662 func stakeUnstake (stake,amount,assetIdString) = if ((i.caller != this))
655663 then throw("Only contract itself can invoke this function")
656664 else {
657- let $t02592026023 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
658- let call = $t02592026023._1
659- let addr = $t02592026023._2
660- let params = $t02592026023._3
661- let payments = $t02592026023._4
665+ let $t02592426027 = calcStakingParams(stake, amount, fromBase58String(assetIdString))
666+ let call = $t02592426027._1
667+ let addr = $t02592426027._2
668+ let params = $t02592426027._3
669+ let payments = $t02592426027._4
662670 let inv = invoke(addr, call, params, payments)
663671 if ((inv == inv))
664672 then nil
665673 else throw("Strict value is not equal to itself.")
666674 }
667675
668676
669677
670678 @Callable(i)
671679 func stakeAll () = if (!(isActive))
672680 then throw("DApp is inactive at this moment")
673681 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, admStartStop], i.callerPublicKey)))
674682 then throw("Only admin can call this function")
675683 else {
676684 let stake1 = if (containsElement(stakingAssets, strAssetIdA))
677685 then {
678686 let amountA = (balanceA - stakedAmountA)
679687 if ((amountA > 0))
680688 then invoke(this, "stakeUnstake", [true, amountA, strAssetIdA], nil)
681689 else 0
682690 }
683691 else 0
684692 if ((stake1 == stake1))
685693 then {
686694 let stake2 = if (containsElement(stakingAssets, strAssetIdB))
687695 then {
688696 let amountB = (balanceB - stakedAmountB)
689697 if ((amountB > 0))
690698 then invoke(this, "stakeUnstake", [true, amountB, strAssetIdB], nil)
691699 else 0
692700 }
693701 else 0
694702 if ((stake2 == stake2))
695703 then nil
696704 else throw("Strict value is not equal to itself.")
697705 }
698706 else throw("Strict value is not equal to itself.")
699707 }
700708
701709
702710 @Verifier(tx)
703711 func verify () = {
704712 let multiSignedByAdmins = {
705713 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
706714 then 1
707715 else 0
708716 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
709717 then 1
710718 else 0
711719 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
712720 then 1
713721 else 0
714722 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
715723 }
716724 match tx {
717725 case inv: InvokeScriptTransaction =>
718726 let callTakeIntoAccount = if ((inv.dApp == this))
719727 then (inv.function == "takeIntoAccountExtraFunds")
720728 else false
721729 let signedByAdmin = if (if (if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
722730 then true
723731 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey2))
724732 then true
725733 else sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey3))
726734 then true
727735 else sigVerify(tx.bodyBytes, tx.proofs[0], admStaking)
728736 if (if (callTakeIntoAccount)
729737 then signedByAdmin
730738 else false)
731739 then true
732740 else multiSignedByAdmins
733741 case _ =>
734742 multiSignedByAdmins
735743 }
736744 }
737745

github/deemru/w8io/3ef1775 
182.63 ms