tx · HK9oPSkJJCCb6b449XLJXYEzRApKc1zTqnFUeRFkGhCb

3MsxHxruYWoddB4HRiPBYAWtMXMtCF1V9XT:  -0.01400000 Waves

2021.06.13 16:13 [1568613] smart account 3MsxHxruYWoddB4HRiPBYAWtMXMtCF1V9XT > SELF 0.00000000 Waves

{ "type": 13, "id": "HK9oPSkJJCCb6b449XLJXYEzRApKc1zTqnFUeRFkGhCb", "fee": 1400000, "feeAssetId": null, "timestamp": 1623590044069, "version": 2, "chainId": 84, "sender": "3MsxHxruYWoddB4HRiPBYAWtMXMtCF1V9XT", "senderPublicKey": "3ijdmxaYrpDFsKVbQH2kvB7i6JzHj9bep9bGWiQPra2D", "proofs": [ "2jg3mnG2rrcezs5hcrDQryVvhr6Wqu3d833q7DVykRKacLKF3FYW1GUrWSXotp7wdeyUwjSZSni7wS6BPV6wBf88" ], "script": "base64:AAIEAAAAAAAAACUIAhIDCgEIEgMKAQgSAwoBCBIDCgEIEgQKAggBEgMKAQgSABIAAAAAWwAAAAAMYWRtaW5QdWJLZXkxAQAAACAEz3XlZNDBD05nuR8TZMQaDeqEJEIxfTOQXUBYCp2TSgAAAAAMYWRtaW5QdWJLZXkyAQAAACAEz3XlZNDBD05nuR8TZMQaDeqEJEIxfTOQXUBYCp2TSgAAAAAMYWRtaW5QdWJLZXkzAQAAACAEz3XlZNDBD05nuR8TZMQaDeqEJEIxfTOQXUBYCp2TSgAAAAAUa2V5U2hhcmVUb2tlbnNMb2NrZWQCAAAAGl90b3RhbF9zaGFyZV90b2tlbnNfbG9ja2VkAAAAAAtrU2hhcmVMaW1pdAIAAAAcc2hhcmVfbGltaXRfb25fZmlyc3RfaGFydmVzdAAAAAAJa2V5QWN0aXZlAgAAAAZhY3RpdmUAAAAACGtleUNhdXNlAgAAAA5zaHV0ZG93bl9jYXVzZQAAAAAca2V5UmV3YXJkUG9vbEZyYWN0aW9uQ3VycmVudAIAAAAdX2N1cnJlbnRfcG9vbF9mcmFjdGlvbl9yZXdhcmQAAAAAHWtleVJld2FyZFBvb2xGcmFjdGlvblByZXZpb3VzAgAAAB5fcHJldmlvdXNfcG9vbF9mcmFjdGlvbl9yZXdhcmQAAAAAFWtleUhlaWdodFBvb2xGcmFjdGlvbgIAAAAaX3Bvb2xfcmV3YXJkX3VwZGF0ZV9oZWlnaHQAAAAAHWtleVRvdGFsUmV3YXJkUGVyQmxvY2tDdXJyZW50AgAAAB50b3RhbF9yZXdhcmRfcGVyX2Jsb2NrX2N1cnJlbnQAAAAAHmtleVRvdGFsUmV3YXJkUGVyQmxvY2tQcmV2aW91cwIAAAAfdG90YWxfcmV3YXJkX3Blcl9ibG9ja19wcmV2aW91cwAAAAAVa2V5UmV3YXJkVXBkYXRlSGVpZ2h0AgAAABRyZXdhcmRfdXBkYXRlX2hlaWdodAAAAAAPa2V5TGFzdEludGVyZXN0AgAAAA5fbGFzdF9pbnRlcmVzdAAAAAAVa2V5TGFzdEludGVyZXN0SGVpZ2h0AgAAABVfbGFzdF9pbnRlcmVzdF9oZWlnaHQAAAAAGGtleVVzZXJTaGFyZVRva2Vuc0xvY2tlZAIAAAAUX3NoYXJlX3Rva2Vuc19sb2NrZWQAAAAAE2tleVVzZXJMYXN0SW50ZXJlc3QCAAAADl9sYXN0X2ludGVyZXN0AAAAAAlrZXlTV09QaWQCAAAAB1NXT1BfaWQAAAAAGGtleVVzZXJTV09QQ2xhaW1lZEFtb3VudAIAAAAUX1NXT1BfY2xhaW1lZF9hbW91bnQAAAAAHGtleVVzZXJTV09QTGFzdENsYWltZWRBbW91bnQCAAAAGV9TV09QX2xhc3RfY2xhaW1lZF9hbW91bnQAAAAAEGtleUF2YWlsYWJsZVNXT1ACAAAAD19hdmFpbGFibGVfU1dPUAAAAAAVa2V5RmFybWluZ1N0YXJ0SGVpZ2h0AgAAABRmYXJtaW5nX3N0YXJ0X2hlaWdodAAAAAAGa2V5QVBZAgAAAANhcHkAAAAAFmtQcmV2aW91c1RvdGFsVm90ZVNXT1ACAAAAGHByZXZpb3VzX3RvdGFsX3ZvdGVfU1dPUAAAAAATa2V5U3dvcFllYXJFbWlzc2lvbgIAAAASc3dvcF95ZWFyX2VtaXNzaW9uAAAAAA9rZXlCYWxhbmNlY3BtbUECAAAAD0FfYXNzZXRfYmFsYW5jZQAAAAAPa2V5QmFsYW5jZWNwbW1CAgAAAA9CX2Fzc2V0X2JhbGFuY2UAAAAAIWtIYXJ2ZXN0UG9vbEFjdGl2ZVZvdGVTdHJ1Y1ZvdGluZwIAAAAeX2hhcnZlc3RfcG9vbF9hY3RpdmVWb3RlX3N0cnVjAAAAACVrSGFydmVzdFVzZXJQb29sQWN0aXZlVm90ZVN0cnVjVm90aW5nAgAAACNfaGFydmVzdF91c2VyX3Bvb2xfYWN0aXZlVm90ZV9zdHJ1YwAAAAAZa2V5TGltaXRTaGFyZUZpcnN0SGFydmVzdAIAAAAcc2hhcmVfbGltaXRfb25fZmlyc3RfaGFydmVzdAAAAAALa2V5QXNzZXRJZEECAAAACkFfYXNzZXRfaWQAAAAAC2tleUFzc2V0SWRCAgAAAApCX2Fzc2V0X2lkAAAAABVrZXlGaXJzdEhhcnZlc3RIZWlnaHQCAAAAFGZpcnN0X2hhcnZlc3RfaGVpZ2h0AAAAABNrZXlmaXJzdEhhcnZlc3RDcG1tAgAAAA1maXJzdF9oYXJ2ZXN0AAAAAA5rZXlUZW1wUHJldlN1bQIAAAATc3VtX3Jld2FyZF9wcmV2aW91cwAAAAANa2V5VGVtcEN1clN1bQIAAAASc3VtX3Jld2FyZF9jdXJyZW50AAAAABFnb3Zlcm5hbmNlQWRkcmVzcwkBAAAAB0FkZHJlc3MAAAABAQAAABoBVKr6ad6B9BNShco/LjqIUbMZ6pgcWfINLQAAAAAGd2FsbGV0CQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFU3z1Ll4lYWd4V4ORRC1bdPXpfvbV/hSGJAAAAAA12b3RpbmdBZGRyZXNzCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFUGjZ+31einSdpXP6/9ybU5/uhw2g+IMp/AAAAABxhZG1pbkluY3JlYXNlSW50ZXJlc3RBZGRyZXNzCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFU3z1Ll4lYWd4V4ORRC1bdPXpfvbV/hSGJAAAAAA5vbmVXZWVrSW5CbG9jawAAAAAAAAAnegAAAAAOdG90YWxWb3RlU2hhcmUAAAAAAlQL5AAAAAAAC3NjYWxlVmFsdWUxAAAAAAAAAAAKAAAAAAtzY2FsZVZhbHVlMwAAAAAAAAAD6AAAAAALc2NhbGVWYWx1ZTUAAAAAAAABhqAAAAAAC3NjYWxlVmFsdWU2AAAAAAAAD0JAAAAAAAtzY2FsZVZhbHVlOAAAAAAABfXhAAAAAAAMc2NhbGVWYWx1ZTExAAAAABdIdugAAQAAAAtzdHJBc3NldElkQQAAAAEAAAAEcG9vbAkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAEcG9vbAUAAAALa2V5QXNzZXRJZEEBAAAAC3N0ckFzc2V0SWRCAAAAAQAAAARwb29sCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAARwb29sBQAAAAtrZXlBc3NldElkQgEAAAAIYXNzZXRJZEEAAAABAAAABHBvb2wDCQAAAAAAAAIJAQAAAAtzdHJBc3NldElkQQAAAAEFAAAABHBvb2wCAAAABVdBVkVTBQAAAAR1bml0CQACWQAAAAEJAQAAAAtzdHJBc3NldElkQQAAAAEFAAAABHBvb2wBAAAACGFzc2V0SWRCAAAAAQAAAARwb29sAwkAAAAAAAACCQEAAAALc3RyQXNzZXRJZEIAAAABBQAAAARwb29sAgAAAAVXQVZFUwUAAAAEdW5pdAkAAlkAAAABCQEAAAALc3RyQXNzZXRJZEIAAAABBQAAAARwb29sAAAAAAtrQmFzZVBlcmlvZAIAAAALYmFzZV9wZXJpb2QAAAAADWtQZXJpb2RMZW5ndGgCAAAADXBlcmlvZF9sZW5ndGgAAAAADGtTdGFydEhlaWdodAIAAAAMc3RhcnRfaGVpZ2h0AAAAABNrRmlyc3RIYXJ2ZXN0SGVpZ2h0AgAAABRmaXJzdF9oYXJ2ZXN0X2hlaWdodAAAAAAWa0R1cmF0aW9uRnVsbFZvdGVQb3dlcgIAAAAYZHVyYXRpb25fZnVsbF92b3RlX3Bvd2VyAAAAAA1rTWluVm90ZVBvd2VyAgAAAA5taW5fdm90ZV9wb3dlcgAAAAAKYmFzZVBlcmlvZAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAADXZvdGluZ0FkZHJlc3MFAAAAC2tCYXNlUGVyaW9kAgAAABFFbXB0eSBrQmFzZVBlcmlvZAAAAAALc3RhcnRIZWlnaHQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA12b3RpbmdBZGRyZXNzBQAAAAxrU3RhcnRIZWlnaHQCAAAAEkVtcHR5IGtTdGFydEhlaWdodAAAAAAMcGVyaW9kTGVuZ3RoCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANdm90aW5nQWRkcmVzcwUAAAANa1BlcmlvZExlbmd0aAIAAAATRW1wdHkga1BlcmlvZExlbmd0aAAAAAAVZHVyYXRpb25GdWxsVm90ZVBvd2VyCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANdm90aW5nQWRkcmVzcwUAAAAWa0R1cmF0aW9uRnVsbFZvdGVQb3dlcgIAAAAcRW1wdHkga0R1cmF0aW9uRnVsbFZvdGVQb3dlcgAAAAAMbWluVm90ZVBvd2VyCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANdm90aW5nQWRkcmVzcwUAAAANa01pblZvdGVQb3dlcgIAAAATRW1wdHkga01pblZvdGVQb3dlcgAAAAAIaXNBY3RpdmUJAQAAABFAZXh0ck5hdGl2ZSgxMDUxKQAAAAIFAAAABHRoaXMFAAAACWtleUFjdGl2ZQAAAAAKY3VyclBlcmlvZAkAAGQAAAACBQAAAApiYXNlUGVyaW9kCQAAaQAAAAIJAABlAAAAAgUAAAAGaGVpZ2h0BQAAAAtzdGFydEhlaWdodAUAAAAMcGVyaW9kTGVuZ3RoAQAAAA1nZXRMaW1pdFRva2VuAAAAAQAAAARwb29sCQEAAAALdmFsdWVPckVsc2UAAAACCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAARwb29sBQAAABlrZXlMaW1pdFNoYXJlRmlyc3RIYXJ2ZXN0AAAAAAAAAAAAAAAAAANBUFkJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMFAAAABmtleUFQWQAAAAAQU3dvcFllYXJFbWlzc2lvbgkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwUAAAATa2V5U3dvcFllYXJFbWlzc2lvbgEAAAAKYXNzZXROYW1lQQAAAAEAAAAEcG9vbAQAAAAHJG1hdGNoMAkBAAAACGFzc2V0SWRBAAAAAQUAAAAEcG9vbAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAACaWQFAAAAByRtYXRjaDAICQEAAAAFdmFsdWUAAAABCQAD7AAAAAEFAAAAAmlkAAAABG5hbWUDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQEAAAABXdhdmVzBQAAAAckbWF0Y2gwAgAAAAVXQVZFUwkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgEAAAAKYXNzZXROYW1lQgAAAAEAAAAEcG9vbAQAAAAHJG1hdGNoMAkBAAAACGFzc2V0SWRCAAAAAQUAAAAEcG9vbAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAACaWQFAAAAByRtYXRjaDAICQEAAAAFdmFsdWUAAAABCQAD7AAAAAEFAAAAAmlkAAAABG5hbWUDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQEAAAABXdhdmVzBQAAAAckbWF0Y2gwAgAAAAVXQVZFUwkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgAAAAAEU1dPUAkAAlkAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAAR0aGlzBQAAAAlrZXlTV09QaWQBAAAADmlzRmlyc3RIYXJ2ZXN0AAAAAQAAAARwb29sCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGwAAAAIFAAAABHBvb2wFAAAAE2tleWZpcnN0SGFydmVzdENwbW0HAQAAABVnZXRIZWlnaHRGaXJzdEhhcnZlc3QAAAABAAAABHBvb2wJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEcG9vbAUAAAAVa2V5Rmlyc3RIYXJ2ZXN0SGVpZ2h0AAAAAAAAAAAAAQAAAAtnZXRCYWxhbmNlQQAAAAEAAAAEcG9vbAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHBvb2wFAAAAD2tleUJhbGFuY2VjcG1tQQkAASwAAAACAgAAABRObyBkYXRhIG9uIHRoZSBrZXk6IAUAAAAPa2V5QmFsYW5jZWNwbW1BAQAAAAtnZXRCYWxhbmNlQgAAAAEAAAAEcG9vbAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHBvb2wFAAAAD2tleUJhbGFuY2VjcG1tQgkAASwAAAACAgAAABRObyBkYXRhIG9uIHRoZSBrZXk6IAUAAAAPa2V5QmFsYW5jZWNwbW1CAQAAABJnZXRTaGFyZUxpbWl0VG9rZW4AAAABAAAABHBvb2wJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAARwb29sBQAAAAtrU2hhcmVMaW1pdAkAASwAAAACAgAAABRObyBkYXRhIG9uIHRoZSBrZXk6IAUAAAALa1NoYXJlTGltaXQBAAAAGGdldFRvdGFsU2hhcmVUb2tlbkxvY2tlZAAAAAEAAAAEcG9vbAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAEcG9vbAUAAAAUa2V5U2hhcmVUb2tlbnNMb2NrZWQJAAEsAAAAAgkAASwAAAACAgAAABRObyBkYXRhIG9uIHRoZSBrZXk6IAUAAAAEcG9vbAUAAAAUa2V5U2hhcmVUb2tlbnNMb2NrZWQBAAAAD2dldFNoYXJlQXNzZXRJZAAAAAEAAAAEcG9vbAkAAlkAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACCQEAAAAFdmFsdWUAAAABCQAEJgAAAAEFAAAABHBvb2wCAAAADnNoYXJlX2Fzc2V0X2lkAQAAAA5hY2NvdW50QmFsYW5jZQAAAAEAAAAHYXNzZXRJZAQAAAAHJG1hdGNoMAUAAAAHYXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAACaWQFAAAAByRtYXRjaDAJAAPwAAAAAgUAAAAEdGhpcwUAAAACaWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQEAAAABXdhdmVzBQAAAAckbWF0Y2gwCAkAA+8AAAABBQAAAAR0aGlzAAAACWF2YWlsYWJsZQkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgEAAAAMZ2V0QXNzZXRJbmZvAAAAAQAAAAdhc3NldElkBAAAAAckbWF0Y2gwBQAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAJpZAUAAAAHJG1hdGNoMAQAAAAIc3RyaW5nSWQJAAJYAAAAAQUAAAACaWQEAAAABGluZm8JAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkAA+wAAAABBQAAAAJpZAkAASwAAAACCQABLAAAAAICAAAABkFzc2V0IAUAAAAIc3RyaW5nSWQCAAAADiBkb2Vzbid0IGV4aXN0CQAFFQAAAAMFAAAACHN0cmluZ0lkCAUAAAAEaW5mbwAAAARuYW1lCAUAAAAEaW5mbwAAAAhkZWNpbWFscwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAQAAAAFd2F2ZXMFAAAAByRtYXRjaDAJAAUVAAAAAwIAAAAFV0FWRVMCAAAABVdBVkVTAAAAAAAAAAAICQAAAgAAAAECAAAAC01hdGNoIGVycm9yAQAAAA5jYWxjU2NhbGVWYWx1ZQAAAAIAAAAIYXNzZXRJZDEAAAAIYXNzZXRJZDIEAAAAEGFzc2V0SWQxRGVjaW1hbHMICQEAAAAFdmFsdWUAAAABCQAD7AAAAAEFAAAACGFzc2V0SWQxAAAACGRlY2ltYWxzBAAAABBhc3NldElkMkRlY2ltYWxzCAkBAAAABXZhbHVlAAAAAQkAA+wAAAABBQAAAAhhc3NldElkMgAAAAhkZWNpbWFscwQAAAALc2NhbGVEaWdpdHMJAABkAAAAAgkAAGUAAAACBQAAABBhc3NldElkMkRlY2ltYWxzBQAAABBhc3NldElkMURlY2ltYWxzAAAAAAAAAAAICQAAbAAAAAYAAAAAAAAAAAoAAAAAAAAAAAAFAAAAC3NjYWxlRGlnaXRzAAAAAAAAAAAAAAAAAAAAAAAABQAAAAhIQUxGRE9XTgEAAAARdXNlckF2YWlsYWJsZVNXT1AAAAACAAAABHBvb2wAAAAEdXNlcgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAARwb29sAgAAAAFfCQAEJQAAAAEFAAAABHVzZXIFAAAAEGtleUF2YWlsYWJsZVNXT1AAAAAAAAAAAAABAAAACnJld2FyZEluZm8AAAABAAAABHBvb2wEAAAAGnRvdGFsUmV3YXJkUGVyQmxvY2tDdXJyZW50CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAARZ292ZXJuYW5jZUFkZHJlc3MFAAAAHWtleVRvdGFsUmV3YXJkUGVyQmxvY2tDdXJyZW50CQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABRObyBkYXRhIG9uIHRoZSBrZXk6IAUAAAAda2V5VG90YWxSZXdhcmRQZXJCbG9ja0N1cnJlbnQCAAAADCBhdCBhZGRyZXNzIAkABCUAAAABBQAAABFnb3Zlcm5hbmNlQWRkcmVzcwQAAAAbdG90YWxSZXdhcmRQZXJCbG9ja1ByZXZpb3VzCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAARZ292ZXJuYW5jZUFkZHJlc3MFAAAAHmtleVRvdGFsUmV3YXJkUGVyQmxvY2tQcmV2aW91cwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAUTm8gZGF0YSBvbiB0aGUga2V5OiAFAAAAHmtleVRvdGFsUmV3YXJkUGVyQmxvY2tQcmV2aW91cwIAAAAMIGF0IGFkZHJlc3MgCQAEJQAAAAEFAAAAEWdvdmVybmFuY2VBZGRyZXNzBAAAABlyZXdhcmRQb29sRnJhY3Rpb25DdXJyZW50CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAARZ292ZXJuYW5jZUFkZHJlc3MJAAEsAAAAAgUAAAAEcG9vbAUAAAAca2V5UmV3YXJkUG9vbEZyYWN0aW9uQ3VycmVudAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABRObyBkYXRhIG9uIHRoZSBrZXk6IAUAAAAEcG9vbAUAAAAca2V5UmV3YXJkUG9vbEZyYWN0aW9uQ3VycmVudAIAAAAMIGF0IGFkZHJlc3MgCQAEJQAAAAEFAAAAEWdvdmVybmFuY2VBZGRyZXNzBAAAABJyZXdhcmRVcGRhdGVIZWlnaHQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAABFnb3Zlcm5hbmNlQWRkcmVzcwUAAAAVa2V5UmV3YXJkVXBkYXRlSGVpZ2h0CQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABRObyBkYXRhIG9uIHRoZSBrZXk6IAUAAAAVa2V5UmV3YXJkVXBkYXRlSGVpZ2h0AgAAAAwgYXQgYWRkcmVzcyAJAAQlAAAAAQUAAAARZ292ZXJuYW5jZUFkZHJlc3MEAAAAFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAARZ292ZXJuYW5jZUFkZHJlc3MJAAEsAAAAAgUAAAAEcG9vbAUAAAAVa2V5SGVpZ2h0UG9vbEZyYWN0aW9uAAAAAAAAAAAABAAAABpyZXdhcmRQb29sRnJhY3Rpb25QcmV2aW91cwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAAEWdvdmVybmFuY2VBZGRyZXNzCQABLAAAAAIFAAAABHBvb2wFAAAAHWtleVJld2FyZFBvb2xGcmFjdGlvblByZXZpb3VzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAFE5vIGRhdGEgb24gdGhlIGtleTogBQAAAARwb29sBQAAAB1rZXlSZXdhcmRQb29sRnJhY3Rpb25QcmV2aW91cwIAAAAMIGF0IGFkZHJlc3MgCQAEJQAAAAEFAAAAEWdvdmVybmFuY2VBZGRyZXNzBAAAABFyZXdhcmRQb29sQ3VycmVudAkAAGsAAAADBQAAABp0b3RhbFJld2FyZFBlckJsb2NrQ3VycmVudAUAAAAZcmV3YXJkUG9vbEZyYWN0aW9uQ3VycmVudAUAAAAOdG90YWxWb3RlU2hhcmUEAAAAEnJld2FyZFBvb2xQcmV2aW91cwkAAGsAAAADBQAAABt0b3RhbFJld2FyZFBlckJsb2NrUHJldmlvdXMFAAAAGnJld2FyZFBvb2xGcmFjdGlvblByZXZpb3VzBQAAAA50b3RhbFZvdGVTaGFyZQMDCQAAZgAAAAIFAAAAEXJld2FyZFBvb2xDdXJyZW50BQAAABp0b3RhbFJld2FyZFBlckJsb2NrQ3VycmVudAYJAABmAAAAAgUAAAAScmV3YXJkUG9vbFByZXZpb3VzBQAAABt0b3RhbFJld2FyZFBlckJsb2NrUHJldmlvdXMJAAACAAAAAQIAAABicmV3YXJkUG9vbEN1cnJlbnQgPiB0b3RhbFJld2FyZFBlckJsb2NrQ3VycmVudCBvciByZXdhcmRQb29sUHJldmlvdXMgPiB0b3RhbFJld2FyZFBlckJsb2NrUHJldmlvdXMJAAUWAAAABAUAAAARcmV3YXJkUG9vbEN1cnJlbnQFAAAAEnJld2FyZFVwZGF0ZUhlaWdodAUAAAAScmV3YXJkUG9vbFByZXZpb3VzBQAAABZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0AQAAABNnZXRMYXN0SW50ZXJlc3RJbmZvAAAAAQAAAARwb29sBAAAAAxsYXN0SW50ZXJlc3QJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIFAAAABHBvb2wFAAAAD2tleUxhc3RJbnRlcmVzdAkAASwAAAACCQABLAAAAAICAAAAFE5vIGRhdGEgb24gdGhlIGtleTogBQAAAARwb29sBQAAAA9rZXlMYXN0SW50ZXJlc3QEAAAAEmxhc3RJbnRlcmVzdEhlaWdodAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIFAAAABHBvb2wFAAAAFWtleUxhc3RJbnRlcmVzdEhlaWdodAUAAAAGaGVpZ2h0CQAFFAAAAAIFAAAAEmxhc3RJbnRlcmVzdEhlaWdodAUAAAAMbGFzdEludGVyZXN0AQAAABNnZXRVc2VySW50ZXJlc3RJbmZvAAAAAgAAAARwb29sAAAAC3VzZXJBZGRyZXNzBAAAABB1c2VyTGFzdEludGVyZXN0CQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAABHBvb2wCAAAAAV8JAAQlAAAAAQUAAAALdXNlckFkZHJlc3MFAAAAE2tleVVzZXJMYXN0SW50ZXJlc3QEAAAACXVzZXJTaGFyZQkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAARwb29sAgAAAAFfCQAEJQAAAAEFAAAAC3VzZXJBZGRyZXNzBQAAABhrZXlVc2VyU2hhcmVUb2tlbnNMb2NrZWQEAAAADGxhc3RJbnRlcmVzdAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAEcG9vbAUAAAAPa2V5TGFzdEludGVyZXN0CQABLAAAAAIJAAEsAAAAAgIAAAAUTm8gZGF0YSBvbiB0aGUga2V5OiAFAAAABHBvb2wFAAAAD2tleUxhc3RJbnRlcmVzdAQAAAAVdXNlckxhc3RJbnRlcmVzdFZhbHVlBAAAAAckbWF0Y2gwBQAAABB1c2VyTGFzdEludGVyZXN0AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAEHVzZXJMYXN0SW50ZXJlc3QFAAAAByRtYXRjaDAFAAAAEHVzZXJMYXN0SW50ZXJlc3QFAAAADGxhc3RJbnRlcmVzdAQAAAAVdXNlclNoYXJlVG9rZW5zQW1vdW50BAAAAAckbWF0Y2gwBQAAAAl1c2VyU2hhcmUDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAAJdXNlclNoYXJlBQAAAAckbWF0Y2gwBQAAAAl1c2VyU2hhcmUAAAAAAAAAAAAJAAUUAAAAAgUAAAAVdXNlckxhc3RJbnRlcmVzdFZhbHVlBQAAABV1c2VyU2hhcmVUb2tlbnNBbW91bnQBAAAADGNhbGNJbnRlcmVzdAAAAAoAAAASbGFzdEludGVyZXN0SGVpZ2h0AAAAEnJld2FyZFVwZGF0ZUhlaWdodAAAABZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0AAAADGxhc3RJbnRlcmVzdAAAABVjdXJyZW50UmV3YXJkUGVyQmxvY2sAAAAQc2hhcmVUb2tlbkxvY2tlZAAAABZwcmV2aW91c1Jld2FyZFBlckJsb2NrAAAADHNoYXJlQXNzZXRJZAAAAApzY2FsZVZhbHVlAAAACXBtdEFtb3VudAMJAAAAAAAAAgUAAAAQc2hhcmVUb2tlbkxvY2tlZAAAAAAAAAAAAAAAAAAAAAAAAAMJAQAAAAIhPQAAAAIFAAAAFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQAAAAAAAAAAAADAwkAAGYAAAACBQAAABJyZXdhcmRVcGRhdGVIZWlnaHQFAAAABmhlaWdodAkAAAAAAAACBQAAABJyZXdhcmRVcGRhdGVIZWlnaHQFAAAAFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQHBAAAAAZyZXdhcmQJAABoAAAAAgUAAAAWcHJldmlvdXNSZXdhcmRQZXJCbG9jawkAAGUAAAACBQAAAAZoZWlnaHQFAAAAEmxhc3RJbnRlcmVzdEhlaWdodAkAAGQAAAACBQAAAAxsYXN0SW50ZXJlc3QJAABrAAAAAwUAAAAGcmV3YXJkBQAAAApzY2FsZVZhbHVlBQAAABBzaGFyZVRva2VuTG9ja2VkAwMJAABmAAAAAgUAAAAGaGVpZ2h0BQAAABJyZXdhcmRVcGRhdGVIZWlnaHQJAQAAAAIhPQAAAAIFAAAAEnJld2FyZFVwZGF0ZUhlaWdodAUAAAAWcG9vbFJld2FyZFVwZGF0ZUhlaWdodAcEAAAABnJld2FyZAkAAGgAAAACBQAAABZwcmV2aW91c1Jld2FyZFBlckJsb2NrCQAAZQAAAAIFAAAABmhlaWdodAUAAAASbGFzdEludGVyZXN0SGVpZ2h0CQAAZAAAAAIFAAAADGxhc3RJbnRlcmVzdAkAAGsAAAADBQAAAAZyZXdhcmQFAAAACnNjYWxlVmFsdWUFAAAAEHNoYXJlVG9rZW5Mb2NrZWQDAwMJAABmAAAAAgUAAAAGaGVpZ2h0BQAAABJyZXdhcmRVcGRhdGVIZWlnaHQJAAAAAAAAAgUAAAAScmV3YXJkVXBkYXRlSGVpZ2h0BQAAABZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0BwkAAGYAAAACBQAAABJsYXN0SW50ZXJlc3RIZWlnaHQFAAAAEnJld2FyZFVwZGF0ZUhlaWdodAcEAAAABnJld2FyZAkAAGgAAAACBQAAABVjdXJyZW50UmV3YXJkUGVyQmxvY2sJAABlAAAAAgUAAAAGaGVpZ2h0BQAAABJsYXN0SW50ZXJlc3RIZWlnaHQJAABkAAAAAgUAAAAMbGFzdEludGVyZXN0CQAAawAAAAMFAAAABnJld2FyZAUAAAAKc2NhbGVWYWx1ZQUAAAAQc2hhcmVUb2tlbkxvY2tlZAQAAAAqcmV3YXJkQWZ0ZXJMYXN0SW50ZXJlc3RCZWZvcmVSZWF3YXJkVXBkYXRlCQAAaAAAAAIFAAAAFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sJAABlAAAAAgUAAAAScmV3YXJkVXBkYXRlSGVpZ2h0BQAAABJsYXN0SW50ZXJlc3RIZWlnaHQEAAAAE2ludGVyZXN0QWZ0ZXJVcGRhdGUJAABkAAAAAgUAAAAMbGFzdEludGVyZXN0CQAAawAAAAMFAAAAKnJld2FyZEFmdGVyTGFzdEludGVyZXN0QmVmb3JlUmVhd2FyZFVwZGF0ZQUAAAAKc2NhbGVWYWx1ZQUAAAAQc2hhcmVUb2tlbkxvY2tlZAQAAAAGcmV3YXJkCQAAaAAAAAIFAAAAFWN1cnJlbnRSZXdhcmRQZXJCbG9jawkAAGUAAAACBQAAAAZoZWlnaHQFAAAAEnJld2FyZFVwZGF0ZUhlaWdodAkAAGQAAAACBQAAABNpbnRlcmVzdEFmdGVyVXBkYXRlCQAAawAAAAMFAAAABnJld2FyZAUAAAAKc2NhbGVWYWx1ZQUAAAAQc2hhcmVUb2tlbkxvY2tlZAMJAABmAAAAAgUAAAAScmV3YXJkVXBkYXRlSGVpZ2h0BQAAAAZoZWlnaHQEAAAABnJld2FyZAkAAGgAAAACBQAAABZwcmV2aW91c1Jld2FyZFBlckJsb2NrCQAAZQAAAAIFAAAABmhlaWdodAUAAAASbGFzdEludGVyZXN0SGVpZ2h0CQAAZAAAAAIFAAAADGxhc3RJbnRlcmVzdAkAAGsAAAADBQAAAAZyZXdhcmQFAAAACnNjYWxlVmFsdWUFAAAAEHNoYXJlVG9rZW5Mb2NrZWQDCQAAZgAAAAIFAAAAEmxhc3RJbnRlcmVzdEhlaWdodAUAAAAScmV3YXJkVXBkYXRlSGVpZ2h0BAAAAAZyZXdhcmQJAABoAAAAAgUAAAAVY3VycmVudFJld2FyZFBlckJsb2NrCQAAZQAAAAIFAAAABmhlaWdodAUAAAASbGFzdEludGVyZXN0SGVpZ2h0CQAAZAAAAAIFAAAADGxhc3RJbnRlcmVzdAkAAGsAAAADBQAAAAZyZXdhcmQFAAAACnNjYWxlVmFsdWUFAAAAEHNoYXJlVG9rZW5Mb2NrZWQEAAAAKnJld2FyZEFmdGVyTGFzdEludGVyZXN0QmVmb3JlUmVhd2FyZFVwZGF0ZQkAAGgAAAACBQAAABZwcmV2aW91c1Jld2FyZFBlckJsb2NrCQAAZQAAAAIFAAAAEnJld2FyZFVwZGF0ZUhlaWdodAUAAAASbGFzdEludGVyZXN0SGVpZ2h0BAAAABNpbnRlcmVzdEFmdGVyVXBkYXRlCQAAZAAAAAIFAAAADGxhc3RJbnRlcmVzdAkAAGsAAAADBQAAACpyZXdhcmRBZnRlckxhc3RJbnRlcmVzdEJlZm9yZVJlYXdhcmRVcGRhdGUFAAAACnNjYWxlVmFsdWUFAAAAEHNoYXJlVG9rZW5Mb2NrZWQEAAAABnJld2FyZAkAAGgAAAACBQAAABVjdXJyZW50UmV3YXJkUGVyQmxvY2sJAABlAAAAAgUAAAAGaGVpZ2h0BQAAABJyZXdhcmRVcGRhdGVIZWlnaHQJAABkAAAAAgUAAAATaW50ZXJlc3RBZnRlclVwZGF0ZQkAAGsAAAADBQAAAAZyZXdhcmQFAAAACnNjYWxlVmFsdWUFAAAAEHNoYXJlVG9rZW5Mb2NrZWQBAAAACWNsYWltQ2FsYwAAAAMAAAAEcG9vbAAAAAZjYWxsZXIAAAAJcG10QW1vdW50BAAAAAxzaGFyZUFzc2V0SWQJAQAAAA9nZXRTaGFyZUFzc2V0SWQAAAABBQAAAARwb29sBAAAAApzY2FsZVZhbHVlCQEAAAAOY2FsY1NjYWxlVmFsdWUAAAACBQAAAARTV09QBQAAAAxzaGFyZUFzc2V0SWQEAAAAEHNoYXJlVG9rZW5Mb2NrZWQJAQAAABhnZXRUb3RhbFNoYXJlVG9rZW5Mb2NrZWQAAAABBQAAAARwb29sBAAAAA0kdDAxMzE0NjEzMjExCQEAAAATZ2V0TGFzdEludGVyZXN0SW5mbwAAAAEFAAAABHBvb2wEAAAAEmxhc3RJbnRlcmVzdEhlaWdodAgFAAAADSR0MDEzMTQ2MTMyMTEAAAACXzEEAAAADGxhc3RJbnRlcmVzdAgFAAAADSR0MDEzMTQ2MTMyMTEAAAACXzIEAAAADSR0MDEzMjE2MTMzMjgJAQAAAApyZXdhcmRJbmZvAAAAAQUAAAAEcG9vbAQAAAAVY3VycmVudFJld2FyZFBlckJsb2NrCAUAAAANJHQwMTMyMTYxMzMyOAAAAAJfMQQAAAAScmV3YXJkVXBkYXRlSGVpZ2h0CAUAAAANJHQwMTMyMTYxMzMyOAAAAAJfMgQAAAAWcHJldmlvdXNSZXdhcmRQZXJCbG9jawgFAAAADSR0MDEzMjE2MTMzMjgAAAACXzMEAAAAFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQIBQAAAA0kdDAxMzIxNjEzMzI4AAAAAl80BAAAAA0kdDAxMzMzMzEzNDEyCQEAAAATZ2V0VXNlckludGVyZXN0SW5mbwAAAAIFAAAABHBvb2wFAAAABmNhbGxlcgQAAAAQdXNlckxhc3RJbnRlcmVzdAgFAAAADSR0MDEzMzMzMTM0MTIAAAACXzEEAAAAFXVzZXJTaGFyZVRva2Vuc0Ftb3VudAgFAAAADSR0MDEzMzMzMTM0MTIAAAACXzIEAAAAD2N1cnJlbnRJbnRlcmVzdAkBAAAADGNhbGNJbnRlcmVzdAAAAAoFAAAAEmxhc3RJbnRlcmVzdEhlaWdodAUAAAAScmV3YXJkVXBkYXRlSGVpZ2h0BQAAABZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0BQAAAAxsYXN0SW50ZXJlc3QFAAAAFWN1cnJlbnRSZXdhcmRQZXJCbG9jawUAAAAQc2hhcmVUb2tlbkxvY2tlZAUAAAAWcHJldmlvdXNSZXdhcmRQZXJCbG9jawUAAAAMc2hhcmVBc3NldElkBQAAAApzY2FsZVZhbHVlBQAAAAlwbXRBbW91bnQEAAAAC2NsYWltQW1vdW50CQAAawAAAAMFAAAAFXVzZXJTaGFyZVRva2Vuc0Ftb3VudAkAAGUAAAACBQAAAA9jdXJyZW50SW50ZXJlc3QFAAAAEHVzZXJMYXN0SW50ZXJlc3QFAAAACnNjYWxlVmFsdWUEAAAAD3VzZXJOZXdJbnRlcmVzdAUAAAAPY3VycmVudEludGVyZXN0CQAFFgAAAAQFAAAAD3VzZXJOZXdJbnRlcmVzdAUAAAAPY3VycmVudEludGVyZXN0BQAAAAtjbGFpbUFtb3VudAUAAAAVdXNlclNoYXJlVG9rZW5zQW1vdW50AQAAABdjYWxjdWxhdGVQcm90b2NvbFJld2FyZAAAAAEAAAAEcG9vbAQAAAANJHQwMTM5MzAxMzk5NQkBAAAAE2dldExhc3RJbnRlcmVzdEluZm8AAAABBQAAAARwb29sBAAAABJsYXN0SW50ZXJlc3RIZWlnaHQIBQAAAA0kdDAxMzkzMDEzOTk1AAAAAl8xBAAAAAxsYXN0SW50ZXJlc3QIBQAAAA0kdDAxMzkzMDEzOTk1AAAAAl8yBAAAAA0kdDAxNDAwMDE0MTExCQEAAAAKcmV3YXJkSW5mbwAAAAEFAAAABHBvb2wEAAAAFWN1cnJlbnRSZXdhcmRQZXJCbG9jawgFAAAADSR0MDE0MDAwMTQxMTEAAAACXzEEAAAAEnJld2FyZFVwZGF0ZUhlaWdodAgFAAAADSR0MDE0MDAwMTQxMTEAAAACXzIEAAAAFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sIBQAAAA0kdDAxNDAwMDE0MTExAAAAAl8zBAAAABZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0CAUAAAANJHQwMTQwMDAxNDExMQAAAAJfNAQAAAAQc2hhcmVUb2tlbkxvY2tlZAkBAAAAGGdldFRvdGFsU2hhcmVUb2tlbkxvY2tlZAAAAAEFAAAABHBvb2wDAwkAAAAAAAACBQAAABBzaGFyZVRva2VuTG9ja2VkAAAAAAAAAAAACQAAAAAAAAIFAAAAFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQAAAAAAAAAAAAHAwkAAGYAAAACBQAAABJyZXdhcmRVcGRhdGVIZWlnaHQFAAAABmhlaWdodAQAAAAGcmV3YXJkCQAAaAAAAAIFAAAAFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sJAABlAAAAAgUAAAAGaGVpZ2h0BQAAABJsYXN0SW50ZXJlc3RIZWlnaHQFAAAABnJld2FyZAMJAABmAAAAAgUAAAASbGFzdEludGVyZXN0SGVpZ2h0BQAAABJyZXdhcmRVcGRhdGVIZWlnaHQEAAAABnJld2FyZAkAAGgAAAACBQAAABVjdXJyZW50UmV3YXJkUGVyQmxvY2sJAABlAAAAAgUAAAAGaGVpZ2h0BQAAABJsYXN0SW50ZXJlc3RIZWlnaHQFAAAABnJld2FyZAQAAAAqcmV3YXJkQWZ0ZXJMYXN0SW50ZXJlc3RCZWZvcmVSZWF3YXJkVXBkYXRlCQAAaAAAAAIFAAAAFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sJAABlAAAAAgUAAAAScmV3YXJkVXBkYXRlSGVpZ2h0BQAAABJsYXN0SW50ZXJlc3RIZWlnaHQEAAAABnJld2FyZAkAAGgAAAACBQAAABVjdXJyZW50UmV3YXJkUGVyQmxvY2sJAABlAAAAAgUAAAAGaGVpZ2h0BQAAABJyZXdhcmRVcGRhdGVIZWlnaHQJAABkAAAAAgUAAAAGcmV3YXJkBQAAACpyZXdhcmRBZnRlckxhc3RJbnRlcmVzdEJlZm9yZVJlYXdhcmRVcGRhdGUDAwkAAAAAAAACBQAAABBzaGFyZVRva2VuTG9ja2VkAAAAAAAAAAAACQEAAAACIT0AAAACBQAAABZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0AAAAAAAAAAAABwMDCQAAZgAAAAIFAAAAEnJld2FyZFVwZGF0ZUhlaWdodAUAAAAGaGVpZ2h0CQAAAAAAAAIFAAAAEnJld2FyZFVwZGF0ZUhlaWdodAUAAAAWcG9vbFJld2FyZFVwZGF0ZUhlaWdodAcEAAAABnJld2FyZAkAAGgAAAACBQAAABZwcmV2aW91c1Jld2FyZFBlckJsb2NrCQAAZQAAAAIFAAAABmhlaWdodAUAAAASbGFzdEludGVyZXN0SGVpZ2h0BQAAAAZyZXdhcmQDAwkAAGYAAAACBQAAAAZoZWlnaHQFAAAAEnJld2FyZFVwZGF0ZUhlaWdodAkBAAAAAiE9AAAAAgUAAAAScmV3YXJkVXBkYXRlSGVpZ2h0BQAAABZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0BwQAAAAGcmV3YXJkCQAAaAAAAAIFAAAAFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sJAABlAAAAAgUAAAAGaGVpZ2h0BQAAABJsYXN0SW50ZXJlc3RIZWlnaHQFAAAABnJld2FyZAMDAwkAAGYAAAACBQAAAAZoZWlnaHQFAAAAEnJld2FyZFVwZGF0ZUhlaWdodAkAAAAAAAACBQAAABJyZXdhcmRVcGRhdGVIZWlnaHQFAAAAFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQHCQAAZgAAAAIFAAAAEmxhc3RJbnRlcmVzdEhlaWdodAUAAAAScmV3YXJkVXBkYXRlSGVpZ2h0BwQAAAAGcmV3YXJkCQAAaAAAAAIFAAAAFWN1cnJlbnRSZXdhcmRQZXJCbG9jawkAAGUAAAACBQAAAAZoZWlnaHQFAAAAEmxhc3RJbnRlcmVzdEhlaWdodAUAAAAGcmV3YXJkBAAAACpyZXdhcmRBZnRlckxhc3RJbnRlcmVzdEJlZm9yZVJlYXdhcmRVcGRhdGUJAABoAAAAAgUAAAAWcHJldmlvdXNSZXdhcmRQZXJCbG9jawkAAGUAAAACBQAAABJyZXdhcmRVcGRhdGVIZWlnaHQFAAAAEmxhc3RJbnRlcmVzdEhlaWdodAQAAAAGcmV3YXJkCQAAaAAAAAIFAAAAFWN1cnJlbnRSZXdhcmRQZXJCbG9jawkAAGUAAAACBQAAAAZoZWlnaHQFAAAAEnJld2FyZFVwZGF0ZUhlaWdodAkAAGQAAAACBQAAAAZyZXdhcmQFAAAAKnJld2FyZEFmdGVyTGFzdEludGVyZXN0QmVmb3JlUmVhd2FyZFVwZGF0ZQAAAAAAAAAAAAEAAAAWY2hlY2tQbXRBc3NldElkQ29ycmVjdAAAAAIAAAAEcG9vbAAAAApwbXRBc3NldElkBAAAABBwb29sU2hhcmVBc3NldElkCQACWQAAAAEJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIJAQAAAAV2YWx1ZQAAAAEJAAQmAAAAAQUAAAAEcG9vbAIAAAAOc2hhcmVfYXNzZXRfaWQDCQAAAAAAAAIFAAAACnBtdEFzc2V0SWQFAAAAEHBvb2xTaGFyZUFzc2V0SWQGBwEAAAAYZ2V0VXNlclNXT1BDbGFpbWVkQW1vdW50AAAAAgAAAARwb29sAAAABHVzZXIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAEcG9vbAIAAAABXwkABCUAAAABBQAAAAR1c2VyBQAAABhrZXlVc2VyU1dPUENsYWltZWRBbW91bnQAAAAAAAAAAAABAAAAB3N1c3BlbmQAAAABAAAABWNhdXNlCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAAlrZXlBY3RpdmUHCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAACGtleUNhdXNlBQAAAAVjYXVzZQUAAAADbmlsAAAACAAAAAFpAQAAAARpbml0AAAAAQAAAAdlYXJseUxQAwkBAAAACWlzRGVmaW5lZAAAAAEJAAQdAAAAAgUAAAAEdGhpcwUAAAAJa2V5U1dPUGlkCQAAAgAAAAECAAAAGFNXT1AgYWxyZWFkeSBpbml0aWFsaXplZAQAAAAKaW5pdEFtb3VudAAAAFrzEHpAAAQAAAAJU1dPUGlzc3VlCQAEQgAAAAUCAAAABFNXT1ACAAAAE1NXT1AgcHJvdG9jb2wgdG9rZW4FAAAACmluaXRBbW91bnQAAAAAAAAAAAgGBAAAAAZTV09QaWQJAAQ4AAAAAQUAAAAJU1dPUGlzc3VlCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAAlrZXlBY3RpdmUGCQAETAAAAAIJAARCAAAABQIAAAAEU1dPUAIAAAATU1dPUCBwcm90b2NvbCB0b2tlbgUAAAAKaW5pdEFtb3VudAAAAAAAAAAACAYJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAJa2V5U1dPUGlkCQACWAAAAAEFAAAABlNXT1BpZAUAAAADbmlsAAAAAWkBAAAAFGluaXRQb29sU2hhcmVGYXJtaW5nAAAAAQAAAARwb29sAwkBAAAAAiE9AAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAAK09ubHkgdGhlIERBcHAgaXRzZWxmIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24EAAAADSR0MDE3MDk3MTcyMDAJAQAAAApyZXdhcmRJbmZvAAAAAQUAAAAEcG9vbAQAAAANY3VycmVudFJld2FyZAgFAAAADSR0MDE3MDk3MTcyMDAAAAACXzEEAAAAEnJld2FyZFVwZGF0ZUhlaWdodAgFAAAADSR0MDE3MDk3MTcyMDAAAAACXzIEAAAAFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sIBQAAAA0kdDAxNzA5NzE3MjAwAAAAAl8zBAAAABZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0CAUAAAANJHQwMTcwOTcxNzIwMAAAAAJfNAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAAARwb29sBQAAABRrZXlTaGFyZVRva2Vuc0xvY2tlZAAAAAAAAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAAARwb29sBQAAAA9rZXlMYXN0SW50ZXJlc3QAAAAAAAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgUAAAAEcG9vbAUAAAAVa2V5TGFzdEludGVyZXN0SGVpZ2h0BQAAAAZoZWlnaHQFAAAAA25pbAAAAAFpAQAAABJ1cGRhdGVQb29sSW50ZXJlc3QAAAABAAAABHBvb2wDCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABndhbGxldAkAAAIAAAABAgAAACxPbmx5IHRoZSBBZG1pbiBpdHNlbGYgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgQAAAANJHQwMTc1MzMxNzY1MwkBAAAACWNsYWltQ2FsYwAAAAMFAAAABHBvb2wFAAAAHGFkbWluSW5jcmVhc2VJbnRlcmVzdEFkZHJlc3MAAAAAAAAAAAAEAAAAD3VzZXJOZXdJbnRlcmVzdAgFAAAADSR0MDE3NTMzMTc2NTMAAAACXzEEAAAAD2N1cnJlbnRJbnRlcmVzdAgFAAAADSR0MDE3NTMzMTc2NTMAAAACXzIEAAAAC2NsYWltQW1vdW50CAUAAAANJHQwMTc1MzMxNzY1MwAAAAJfMwQAAAAVdXNlclNoYXJlVG9rZW5zQW1vdW50CAUAAAANJHQwMTc1MzMxNzY1MwAAAAJfNAQAAAANJHQwMTc2NTgxNzc2MQkBAAAACnJld2FyZEluZm8AAAABBQAAAARwb29sBAAAAA1jdXJyZW50UmV3YXJkCAUAAAANJHQwMTc2NTgxNzc2MQAAAAJfMQQAAAAScmV3YXJkVXBkYXRlSGVpZ2h0CAUAAAANJHQwMTc2NTgxNzc2MQAAAAJfMgQAAAAWcHJldmlvdXNSZXdhcmRQZXJCbG9jawgFAAAADSR0MDE3NjU4MTc3NjEAAAACXzMEAAAAFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQIBQAAAA0kdDAxNzY1ODE3NzYxAAAAAl80CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAABHBvb2wFAAAAD2tleUxhc3RJbnRlcmVzdAUAAAAPdXNlck5ld0ludGVyZXN0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAABHBvb2wFAAAAFWtleUxhc3RJbnRlcmVzdEhlaWdodAUAAAAGaGVpZ2h0BQAAAANuaWwAAAABaQEAAAAPbG9ja1NoYXJlVG9rZW5zAAAAAQAAAARwb29sBAAAAA0kdDAxNzk1MzE4MDI4CQAFFAAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAAJcG10QW1vdW50CAUAAAANJHQwMTc5NTMxODAyOAAAAAJfMQQAAAAKcG10QXNzZXRJZAgFAAAADSR0MDE3OTUzMTgwMjgAAAACXzIEAAAADSR0MDE4MDMzMTgxMDYJAQAAAAxnZXRBc3NldEluZm8AAAABBQAAAApwbXRBc3NldElkBAAAAA1wbXRTdHJBc3NldElkCAUAAAANJHQwMTgwMzMxODEwNgAAAAJfMQQAAAAMcG10QXNzZXROYW1lCAUAAAANJHQwMTgwMzMxODEwNgAAAAJfMgQAAAALcG10RGVjaW1hbHMIBQAAAA0kdDAxODAzMzE4MTA2AAAAAl8zBAAAAA0kdDAxODExMTE4MjE5CQEAAAAJY2xhaW1DYWxjAAAAAwUAAAAEcG9vbAgFAAAAAWkAAAAGY2FsbGVyBQAAAAlwbXRBbW91bnQEAAAAD3VzZXJOZXdJbnRlcmVzdAgFAAAADSR0MDE4MTExMTgyMTkAAAACXzEEAAAAD2N1cnJlbnRJbnRlcmVzdAgFAAAADSR0MDE4MTExMTgyMTkAAAACXzIEAAAAC2NsYWltQW1vdW50CAUAAAANJHQwMTgxMTExODIxOQAAAAJfMwQAAAAVdXNlclNoYXJlVG9rZW5zQW1vdW50CAUAAAANJHQwMTgxMTExODIxOQAAAAJfNAQAAAASdXNlclNoYXJlQW1vdW50TmV3CQAAZAAAAAIFAAAAFXVzZXJTaGFyZVRva2Vuc0Ftb3VudAUAAAAJcG10QW1vdW50BAAAABFhdmFpbGFibGVGdW5kc05ldwkAAGQAAAACCQEAAAARdXNlckF2YWlsYWJsZVNXT1AAAAACBQAAAARwb29sCAUAAAABaQAAAAZjYWxsZXIFAAAAC2NsYWltQW1vdW50BAAAABB0b3RhbFNoYXJlQW1vdW50CQEAAAAYZ2V0VG90YWxTaGFyZVRva2VuTG9ja2VkAAAAAQUAAAAEcG9vbAQAAAATdG90YWxTaGFyZUFtb3VudE5ldwkAAGQAAAACBQAAABB0b3RhbFNoYXJlQW1vdW50BQAAAAlwbXRBbW91bnQEAAAAEXVzZXJDbGFpbWVkQW1vdW50CQEAAAAYZ2V0VXNlclNXT1BDbGFpbWVkQW1vdW50AAAAAgUAAAAEcG9vbAgFAAAAAWkAAAAGY2FsbGVyBAAAABR1c2VyQ2xhaW1lZEFtb3VudE5ldwkAAGQAAAACBQAAABF1c2VyQ2xhaW1lZEFtb3VudAUAAAALY2xhaW1BbW91bnQEAAAACWJhc2VFbnRyeQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAEcG9vbAIAAAABXwkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAAE2tleVVzZXJMYXN0SW50ZXJlc3QFAAAAD3VzZXJOZXdJbnRlcmVzdAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAEcG9vbAIAAAABXwkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAAGGtleVVzZXJTaGFyZVRva2Vuc0xvY2tlZAUAAAASdXNlclNoYXJlQW1vdW50TmV3CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAABHBvb2wFAAAAFGtleVNoYXJlVG9rZW5zTG9ja2VkBQAAABN0b3RhbFNoYXJlQW1vdW50TmV3CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAABHBvb2wFAAAAD2tleUxhc3RJbnRlcmVzdAUAAAAPY3VycmVudEludGVyZXN0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAABHBvb2wFAAAAFWtleUxhc3RJbnRlcmVzdEhlaWdodAUAAAAGaGVpZ2h0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAARwb29sAgAAAAFfCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgUAAAAYa2V5VXNlclNXT1BDbGFpbWVkQW1vdW50BQAAABR1c2VyQ2xhaW1lZEFtb3VudE5ldwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAEcG9vbAIAAAABXwkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAAHGtleVVzZXJTV09QTGFzdENsYWltZWRBbW91bnQFAAAAC2NsYWltQW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAARwb29sAgAAAAFfCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgUAAAAQa2V5QXZhaWxhYmxlU1dPUAUAAAARYXZhaWxhYmxlRnVuZHNOZXcFAAAAA25pbAMJAABnAAAAAgAAAAAAAAAAAAUAAAAJcG10QW1vdW50CQAAAgAAAAECAAAAFFlvdSBjYW4ndCBsb2NrIHRva2VuAwkBAAAAASEAAAABBQAAAAhpc0FjdGl2ZQkAAAIAAAABAgAAAB9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkBAAAAASEAAAABCQEAAAAWY2hlY2tQbXRBc3NldElkQ29ycmVjdAAAAAIFAAAABHBvb2wFAAAACnBtdEFzc2V0SWQJAAACAAAAAQIAAAAUSW5jb3JyZWN0IHBtdEFzc2V0SWQDAwkBAAAADmlzRmlyc3RIYXJ2ZXN0AAAAAQkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEFAAAABHBvb2wJAABmAAAAAgkBAAAAFWdldEhlaWdodEZpcnN0SGFydmVzdAAAAAEJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABBQAAAARwb29sBQAAAAZoZWlnaHQHBAAAAA1oYXJ2ZXN0UGVyaW9kCQAAZQAAAAIJAABpAAAAAgkAAGQAAAACCQAAZQAAAAIJAQAAABVnZXRIZWlnaHRGaXJzdEhhcnZlc3QAAAABCQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQUAAAAEcG9vbAUAAAALc3RhcnRIZWlnaHQAAAAAAAAAAAEFAAAADHBlcmlvZExlbmd0aAAAAAAAAAAAAQQAAAAOYW1vdW50T2ZWb3RpbmcJAAS1AAAAAgkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAANdm90aW5nQWRkcmVzcwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXICAAAAAV8FAAAABHBvb2wCAAAAEF91c2VyX3Bvb2xfc3RydWMCAAAAAV8EAAAAEGFtb3VudFBvb2xTdHJhY3QJAAS1AAAAAgkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAANdm90aW5nQWRkcmVzcwkAASwAAAACBQAAAARwb29sAgAAAAtfcG9vbF9zdHJ1YwIAAAABXwQAAAAeYW1vdW50QWN0aXZlVm90ZVVzZXJQb29sU3RyYWN0CQAEtQAAAAIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAANdm90aW5nQWRkcmVzcwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXICAAAAAV8FAAAABHBvb2wFAAAAJWtIYXJ2ZXN0VXNlclBvb2xBY3RpdmVWb3RlU3RydWNWb3RpbmcCAAAAAAIAAAABXwQAAAAaYW1vdW50UG9vbEFjdGl2ZVZvdGVTdHJhY3QJAAS1AAAAAgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAA12b3RpbmdBZGRyZXNzCQABLAAAAAIFAAAABHBvb2wFAAAAIWtIYXJ2ZXN0UG9vbEFjdGl2ZVZvdGVTdHJ1Y1ZvdGluZwIAAAAAAgAAAAFfBAAAABR1c2VyU2hhcmVUb2tlbkxvY2tlZAUAAAAVdXNlclNoYXJlVG9rZW5zQW1vdW50BAAAABJ1c2VyUG9vbEFjdGl2ZVZvdGUDCQAAAAAAAAIJAAGkAAAAAQUAAAAKY3VyclBlcmlvZAkAAZEAAAACBQAAAA5hbW91bnRPZlZvdGluZwAAAAAAAAAAAgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABLYAAAABCQABkQAAAAIFAAAAHmFtb3VudEFjdGl2ZVZvdGVVc2VyUG9vbFN0cmFjdAAAAAAAAAAAAAAAAAAAAAAAAAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABLYAAAABCQABkQAAAAIFAAAADmFtb3VudE9mVm90aW5nAAAAAAAAAAABAAAAAAAAAAAABAAAAA5wb29sQWN0aXZlVm90ZQMJAAAAAAAAAgkAAaQAAAABBQAAAApjdXJyUGVyaW9kCQABkQAAAAIFAAAAEGFtb3VudFBvb2xTdHJhY3QAAAAAAAAAAAIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAS2AAAAAQkAAZEAAAACBQAAABphbW91bnRQb29sQWN0aXZlVm90ZVN0cmFjdAAAAAAAAAAAAAAAAAAAAAAAAAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABLYAAAABCQABkQAAAAIFAAAAEGFtb3VudFBvb2xTdHJhY3QAAAAAAAAAAAEAAAAAAAAAAAAEAAAADnByb3RvY29sUmV3YXJkCQEAAAAXY2FsY3VsYXRlUHJvdG9jb2xSZXdhcmQAAAABBQAAAARwb29sAwkBAAAAAiE9AAAAAgUAAAASdXNlclBvb2xBY3RpdmVWb3RlAAAAAAAAAAAABAAAAA9saW1pdFNoYXJlVG9rZW4JAQAAABJnZXRTaGFyZUxpbWl0VG9rZW4AAAABCQEAAAARQGV4dHJOYXRpdmUoMTA2MikAAAABBQAAAARwb29sBAAAAApzaGFyZVRva2VuCQAAZQAAAAIJAABrAAAAAwUAAAAPbGltaXRTaGFyZVRva2VuBQAAABJ1c2VyUG9vbEFjdGl2ZVZvdGUFAAAADnBvb2xBY3RpdmVWb3RlBQAAABR1c2VyU2hhcmVUb2tlbkxvY2tlZAMDCQAAZgAAAAIJAAGQAAAAAQUAAAAeYW1vdW50QWN0aXZlVm90ZVVzZXJQb29sU3RyYWN0AAAAAAAAAAABCQAAZwAAAAIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAS2AAAAAQkAAZEAAAACBQAAAB5hbW91bnRBY3RpdmVWb3RlVXNlclBvb2xTdHJhY3QAAAAAAAAAAAEAAAAAAAAAAAAFAAAADWhhcnZlc3RQZXJpb2QHCQAAAgAAAAECAAAAFVlvdSBjYW4ndCBzaGFyZSB0b2tlbgMJAABmAAAAAgUAAAAJcG10QW1vdW50BQAAAA9saW1pdFNoYXJlVG9rZW4JAAACAAAAAQkAASwAAAACAgAAACBZb3UgY2FuJ3Qgc2hhcmUgdG9rZW4gbW9yZSB0aGFuIAkAAaQAAAABBQAAAA9saW1pdFNoYXJlVG9rZW4DCQAAZgAAAAIFAAAACnNoYXJlVG9rZW4AAAAAAAAAAAADCQAAZgAAAAIJAABrAAAAAwAAAAAAAAAAYwkBAAAADmFjY291bnRCYWxhbmNlAAAAAQUAAAAKcG10QXNzZXRJZAAAAAAAAAAAZAUAAAATdG90YWxTaGFyZUFtb3VudE5ldwkAAAIAAAABAgAAADJCYWxhbmNlIG9mIHNoYXJlLXRva2VuIGlzIGdyZWF0ZXIgdGhhbiB0b3RhbEFtb3VudAMJAAAAAAAAAgUAAAAQdG90YWxTaGFyZUFtb3VudAAAAAAAAAAAAAkABE4AAAACBQAAAAliYXNlRW50cnkJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAGd2FsbGV0BQAAAA5wcm90b2NvbFJld2FyZAUAAAAEU1dPUAUAAAADbmlsAwkAAGcAAAACBQAAAApzaGFyZVRva2VuBQAAAAlwbXRBbW91bnQFAAAACWJhc2VFbnRyeQkAAAIAAAABCQABLAAAAAICAAAAHFlvdXIgbWF4aW11bSBzaGFyZSB0b2tlbiBpcyAJAAGkAAAAAQUAAAAKc2hhcmVUb2tlbgkAAAIAAAABAgAAABVZb3UgY2FuJ3Qgc2hhcmUgdG9rZW4JAAACAAAAAQIAAAAgWW91ciBhbW91bnQgb2YgdG9rZW4gbGVzcyB0aGFuIDAFAAAACWJhc2VFbnRyeQAAAAFpAQAAABN3aXRoZHJhd1NoYXJlVG9rZW5zAAAAAgAAAARwb29sAAAAGXNoYXJlVG9rZW5zV2l0aGRyYXdBbW91bnQEAAAADXNoYXJlVG9rZW5zSWQJAAJZAAAAAQkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgkBAAAABXZhbHVlAAAAAQkABCYAAAABBQAAAARwb29sAgAAAA5zaGFyZV9hc3NldF9pZAQAAAANJHQwMjI2NTMyMjc1MwkBAAAACWNsYWltQ2FsYwAAAAMFAAAABHBvb2wIBQAAAAFpAAAABmNhbGxlcgAAAAAAAAAAAQQAAAAPdXNlck5ld0ludGVyZXN0CAUAAAANJHQwMjI2NTMyMjc1MwAAAAJfMQQAAAAPY3VycmVudEludGVyZXN0CAUAAAANJHQwMjI2NTMyMjc1MwAAAAJfMgQAAAALY2xhaW1BbW91bnQIBQAAAA0kdDAyMjY1MzIyNzUzAAAAAl8zBAAAABV1c2VyU2hhcmVUb2tlbnNBbW91bnQIBQAAAA0kdDAyMjY1MzIyNzUzAAAAAl80BAAAABJ1c2VyU2hhcmVBbW91bnROZXcJAABlAAAAAgUAAAAVdXNlclNoYXJlVG9rZW5zQW1vdW50BQAAABlzaGFyZVRva2Vuc1dpdGhkcmF3QW1vdW50BAAAABFhdmFpbGFibGVGdW5kc05ldwkAAGQAAAACCQEAAAARdXNlckF2YWlsYWJsZVNXT1AAAAACBQAAAARwb29sCAUAAAABaQAAAAZjYWxsZXIFAAAAC2NsYWltQW1vdW50BAAAABB0b3RhbFNoYXJlQW1vdW50CQEAAAAYZ2V0VG90YWxTaGFyZVRva2VuTG9ja2VkAAAAAQUAAAAEcG9vbAQAAAATdG90YWxTaGFyZUFtb3VudE5ldwkAAGUAAAACBQAAABB0b3RhbFNoYXJlQW1vdW50BQAAABlzaGFyZVRva2Vuc1dpdGhkcmF3QW1vdW50BAAAABF1c2VyQ2xhaW1lZEFtb3VudAkBAAAAGGdldFVzZXJTV09QQ2xhaW1lZEFtb3VudAAAAAIFAAAABHBvb2wIBQAAAAFpAAAABmNhbGxlcgQAAAAUdXNlckNsYWltZWRBbW91bnROZXcJAABkAAAAAgUAAAARdXNlckNsYWltZWRBbW91bnQFAAAAC2NsYWltQW1vdW50AwkAAGYAAAACBQAAABlzaGFyZVRva2Vuc1dpdGhkcmF3QW1vdW50BQAAABV1c2VyU2hhcmVUb2tlbnNBbW91bnQJAAACAAAAAQIAAAAsV2l0aGRyYXcgYW1vdW50IG1vcmUgdGhlbiB1c2VyIGxvY2tlZCBhbW91bnQDCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQAAAgAAAAECAAAAH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQDCQAAZgAAAAIFAAAAGXNoYXJlVG9rZW5zV2l0aGRyYXdBbW91bnQFAAAAFXVzZXJTaGFyZVRva2Vuc0Ftb3VudAkAAAIAAAABAgAAACxXaXRoZHJhdyBhbW91bnQgbW9yZSB0aGVuIHVzZXIgbG9ja2VkIGFtb3VudAMJAABmAAAAAgkAAGsAAAADAAAAAAAAAABjCQEAAAAOYWNjb3VudEJhbGFuY2UAAAABBQAAAA1zaGFyZVRva2Vuc0lkAAAAAAAAAABkBQAAABN0b3RhbFNoYXJlQW1vdW50TmV3CQAAAgAAAAECAAAAMkJhbGFuY2Ugb2Ygc2hhcmUtdG9rZW4gaXMgZ3JlYXRlciB0aGFuIHRvdGFsQW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAARwb29sAgAAAAFfCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgUAAAATa2V5VXNlckxhc3RJbnRlcmVzdAUAAAAPdXNlck5ld0ludGVyZXN0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAARwb29sAgAAAAFfCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgUAAAAYa2V5VXNlclNoYXJlVG9rZW5zTG9ja2VkBQAAABJ1c2VyU2hhcmVBbW91bnROZXcJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgUAAAAEcG9vbAUAAAAPa2V5TGFzdEludGVyZXN0BQAAAA9jdXJyZW50SW50ZXJlc3QJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgUAAAAEcG9vbAUAAAAVa2V5TGFzdEludGVyZXN0SGVpZ2h0BQAAAAZoZWlnaHQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgUAAAAEcG9vbAUAAAAUa2V5U2hhcmVUb2tlbnNMb2NrZWQFAAAAE3RvdGFsU2hhcmVBbW91bnROZXcJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAABHBvb2wCAAAAAV8JAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBQAAABBrZXlBdmFpbGFibGVTV09QBQAAABFhdmFpbGFibGVGdW5kc05ldwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAEcG9vbAIAAAABXwkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAAGGtleVVzZXJTV09QQ2xhaW1lZEFtb3VudAUAAAAUdXNlckNsYWltZWRBbW91bnROZXcJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAABHBvb2wCAAAAAV8JAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBQAAABxrZXlVc2VyU1dPUExhc3RDbGFpbWVkQW1vdW50BQAAAAtjbGFpbUFtb3VudAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAGXNoYXJlVG9rZW5zV2l0aGRyYXdBbW91bnQFAAAADXNoYXJlVG9rZW5zSWQFAAAAA25pbAAAAAFpAQAAAAVjbGFpbQAAAAEAAAAEcG9vbAQAAAANc2hhcmVUb2tlbnNJZAkAAlkAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACCQEAAAAFdmFsdWUAAAABCQAEJgAAAAEFAAAABHBvb2wCAAAADnNoYXJlX2Fzc2V0X2lkBAAAABBzaGFyZVRva2VuTG9ja2VkCQEAAAAYZ2V0VG90YWxTaGFyZVRva2VuTG9ja2VkAAAAAQUAAAAEcG9vbAQAAAANJHQwMjQ3MzMyNDc5OAkBAAAAE2dldExhc3RJbnRlcmVzdEluZm8AAAABBQAAAARwb29sBAAAABJsYXN0SW50ZXJlc3RIZWlnaHQIBQAAAA0kdDAyNDczMzI0Nzk4AAAAAl8xBAAAAAxsYXN0SW50ZXJlc3QIBQAAAA0kdDAyNDczMzI0Nzk4AAAAAl8yBAAAAA0kdDAyNDgwMzI0OTE1CQEAAAAKcmV3YXJkSW5mbwAAAAEFAAAABHBvb2wEAAAAFWN1cnJlbnRSZXdhcmRQZXJCbG9jawgFAAAADSR0MDI0ODAzMjQ5MTUAAAACXzEEAAAAEnJld2FyZFVwZGF0ZUhlaWdodAgFAAAADSR0MDI0ODAzMjQ5MTUAAAACXzIEAAAAFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sIBQAAAA0kdDAyNDgwMzI0OTE1AAAAAl8zBAAAABZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0CAUAAAANJHQwMjQ4MDMyNDkxNQAAAAJfNAQAAAANJHQwMjQ5MjAyNTAyMAkBAAAACWNsYWltQ2FsYwAAAAMFAAAABHBvb2wIBQAAAAFpAAAABmNhbGxlcgAAAAAAAAAAAQQAAAAPdXNlck5ld0ludGVyZXN0CAUAAAANJHQwMjQ5MjAyNTAyMAAAAAJfMQQAAAAPY3VycmVudEludGVyZXN0CAUAAAANJHQwMjQ5MjAyNTAyMAAAAAJfMgQAAAALY2xhaW1BbW91bnQIBQAAAA0kdDAyNDkyMDI1MDIwAAAAAl8zBAAAABV1c2VyU2hhcmVUb2tlbnNBbW91bnQIBQAAAA0kdDAyNDkyMDI1MDIwAAAAAl80BAAAAA1hdmFpbGFibGVGdW5kCQAAZAAAAAIJAQAAABF1c2VyQXZhaWxhYmxlU1dPUAAAAAIFAAAABHBvb2wIBQAAAAFpAAAABmNhbGxlcgUAAAALY2xhaW1BbW91bnQEAAAAEXVzZXJDbGFpbWVkQW1vdW50CQEAAAAYZ2V0VXNlclNXT1BDbGFpbWVkQW1vdW50AAAAAgUAAAAEcG9vbAgFAAAAAWkAAAAGY2FsbGVyBAAAABR1c2VyQ2xhaW1lZEFtb3VudE5ldwkAAGQAAAACBQAAABF1c2VyQ2xhaW1lZEFtb3VudAUAAAALY2xhaW1BbW91bnQDCQAAAAAA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", "height": 1568613, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HYxaD9QorkyhpNrfACPmDf86EezwWYy8ivaDwhTsBtGX Next: 7SGZdLk7sTYaTqZwbSjW2zFpNDkhNg96RGj3QfTXZrhg Diff:
OldNewDifferences
189189 func getShareAssetId (pool) = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
190190
191191
192+func accountBalance (assetId) = match assetId {
193+ case id: ByteVector =>
194+ assetBalance(this, id)
195+ case waves: Unit =>
196+ wavesBalance(this).available
197+ case _ =>
198+ throw("Match error")
199+}
200+
201+
192202 func getAssetInfo (assetId) = match assetId {
193203 case id: ByteVector =>
194204 let stringId = toBase58String(id)
310320 let shareAssetId = getShareAssetId(pool)
311321 let scaleValue = calcScaleValue(SWOP, shareAssetId)
312322 let shareTokenLocked = getTotalShareTokenLocked(pool)
313- let $t01297613041 = getLastInterestInfo(pool)
314- let lastInterestHeight = $t01297613041._1
315- let lastInterest = $t01297613041._2
316- let $t01304613158 = rewardInfo(pool)
317- let currentRewardPerBlock = $t01304613158._1
318- let rewardUpdateHeight = $t01304613158._2
319- let previousRewardPerBlock = $t01304613158._3
320- let poolRewardUpdateHeight = $t01304613158._4
321- let $t01316313242 = getUserInterestInfo(pool, caller)
322- let userLastInterest = $t01316313242._1
323- let userShareTokensAmount = $t01316313242._2
323+ let $t01314613211 = getLastInterestInfo(pool)
324+ let lastInterestHeight = $t01314613211._1
325+ let lastInterest = $t01314613211._2
326+ let $t01321613328 = rewardInfo(pool)
327+ let currentRewardPerBlock = $t01321613328._1
328+ let rewardUpdateHeight = $t01321613328._2
329+ let previousRewardPerBlock = $t01321613328._3
330+ let poolRewardUpdateHeight = $t01321613328._4
331+ let $t01333313412 = getUserInterestInfo(pool, caller)
332+ let userLastInterest = $t01333313412._1
333+ let userShareTokensAmount = $t01333313412._2
324334 let currentInterest = calcInterest(lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, lastInterest, currentRewardPerBlock, shareTokenLocked, previousRewardPerBlock, shareAssetId, scaleValue, pmtAmount)
325335 let claimAmount = fraction(userShareTokensAmount, (currentInterest - userLastInterest), scaleValue)
326336 let userNewInterest = currentInterest
329339
330340
331341 func calculateProtocolReward (pool) = {
332- let $t01376013825 = getLastInterestInfo(pool)
333- let lastInterestHeight = $t01376013825._1
334- let lastInterest = $t01376013825._2
335- let $t01383013941 = rewardInfo(pool)
336- let currentRewardPerBlock = $t01383013941._1
337- let rewardUpdateHeight = $t01383013941._2
338- let previousRewardPerBlock = $t01383013941._3
339- let poolRewardUpdateHeight = $t01383013941._4
342+ let $t01393013995 = getLastInterestInfo(pool)
343+ let lastInterestHeight = $t01393013995._1
344+ let lastInterest = $t01393013995._2
345+ let $t01400014111 = rewardInfo(pool)
346+ let currentRewardPerBlock = $t01400014111._1
347+ let rewardUpdateHeight = $t01400014111._2
348+ let previousRewardPerBlock = $t01400014111._3
349+ let poolRewardUpdateHeight = $t01400014111._4
340350 let shareTokenLocked = getTotalShareTokenLocked(pool)
341351 if (if ((shareTokenLocked == 0))
342352 then (poolRewardUpdateHeight == 0)
421431 func initPoolShareFarming (pool) = if ((i.caller != this))
422432 then throw("Only the DApp itself can call this function")
423433 else {
424- let $t01692717030 = rewardInfo(pool)
425- let currentReward = $t01692717030._1
426- let rewardUpdateHeight = $t01692717030._2
427- let previousRewardPerBlock = $t01692717030._3
428- let poolRewardUpdateHeight = $t01692717030._4
434+ let $t01709717200 = rewardInfo(pool)
435+ let currentReward = $t01709717200._1
436+ let rewardUpdateHeight = $t01709717200._2
437+ let previousRewardPerBlock = $t01709717200._3
438+ let poolRewardUpdateHeight = $t01709717200._4
429439 [IntegerEntry((pool + keyShareTokensLocked), 0), IntegerEntry((pool + keyLastInterest), 0), IntegerEntry((pool + keyLastInterestHeight), height)]
430440 }
431441
435445 func updatePoolInterest (pool) = if ((i.caller != wallet))
436446 then throw("Only the Admin itself can call this function")
437447 else {
438- let $t01736317483 = claimCalc(pool, adminIncreaseInterestAddress, 0)
439- let userNewInterest = $t01736317483._1
440- let currentInterest = $t01736317483._2
441- let claimAmount = $t01736317483._3
442- let userShareTokensAmount = $t01736317483._4
443- let $t01748817591 = rewardInfo(pool)
444- let currentReward = $t01748817591._1
445- let rewardUpdateHeight = $t01748817591._2
446- let previousRewardPerBlock = $t01748817591._3
447- let poolRewardUpdateHeight = $t01748817591._4
448+ let $t01753317653 = claimCalc(pool, adminIncreaseInterestAddress, 0)
449+ let userNewInterest = $t01753317653._1
450+ let currentInterest = $t01753317653._2
451+ let claimAmount = $t01753317653._3
452+ let userShareTokensAmount = $t01753317653._4
453+ let $t01765817761 = rewardInfo(pool)
454+ let currentReward = $t01765817761._1
455+ let rewardUpdateHeight = $t01765817761._2
456+ let previousRewardPerBlock = $t01765817761._3
457+ let poolRewardUpdateHeight = $t01765817761._4
448458 [IntegerEntry((pool + keyLastInterest), userNewInterest), IntegerEntry((pool + keyLastInterestHeight), height)]
449459 }
450460
452462
453463 @Callable(i)
454464 func lockShareTokens (pool) = {
455- let $t01778317858 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
456- let pmtAmount = $t01778317858._1
457- let pmtAssetId = $t01778317858._2
458- let $t01786317936 = getAssetInfo(pmtAssetId)
459- let pmtStrAssetId = $t01786317936._1
460- let pmtAssetName = $t01786317936._2
461- let pmtDecimals = $t01786317936._3
462- let $t01794118049 = claimCalc(pool, i.caller, pmtAmount)
463- let userNewInterest = $t01794118049._1
464- let currentInterest = $t01794118049._2
465- let claimAmount = $t01794118049._3
466- let userShareTokensAmount = $t01794118049._4
465+ let $t01795318028 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
466+ let pmtAmount = $t01795318028._1
467+ let pmtAssetId = $t01795318028._2
468+ let $t01803318106 = getAssetInfo(pmtAssetId)
469+ let pmtStrAssetId = $t01803318106._1
470+ let pmtAssetName = $t01803318106._2
471+ let pmtDecimals = $t01803318106._3
472+ let $t01811118219 = claimCalc(pool, i.caller, pmtAmount)
473+ let userNewInterest = $t01811118219._1
474+ let currentInterest = $t01811118219._2
475+ let claimAmount = $t01811118219._3
476+ let userShareTokensAmount = $t01811118219._4
467477 let userShareAmountNew = (userShareTokensAmount + pmtAmount)
468478 let availableFundsNew = (userAvailableSWOP(pool, i.caller) + claimAmount)
469479 let totalShareAmount = getTotalShareTokenLocked(pool)
505515 else if ((pmtAmount > limitShareToken))
506516 then throw(("You can't share token more than " + toString(limitShareToken)))
507517 else if ((shareToken > 0))
508- then if ((totalShareAmount == 0))
509- then (baseEntry ++ [ScriptTransfer(wallet, protocolReward, SWOP)])
510- else if ((shareToken >= pmtAmount))
511- then baseEntry
512- else throw(("Your maximum share token is " + toString(shareToken)))
518+ then if ((fraction(99, accountBalance(pmtAssetId), 100) > totalShareAmountNew))
519+ then throw("Balance of share-token is greater than totalAmount")
520+ else if ((totalShareAmount == 0))
521+ then (baseEntry ++ [ScriptTransfer(wallet, protocolReward, SWOP)])
522+ else if ((shareToken >= pmtAmount))
523+ then baseEntry
524+ else throw(("Your maximum share token is " + toString(shareToken)))
513525 else throw("You can't share token")
514526 }
515527 else throw("Your amount of token less than 0")
522534 @Callable(i)
523535 func withdrawShareTokens (pool,shareTokensWithdrawAmount) = {
524536 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
525- let $t02232122421 = claimCalc(pool, i.caller, 1)
526- let userNewInterest = $t02232122421._1
527- let currentInterest = $t02232122421._2
528- let claimAmount = $t02232122421._3
529- let userShareTokensAmount = $t02232122421._4
537+ let $t02265322753 = claimCalc(pool, i.caller, 1)
538+ let userNewInterest = $t02265322753._1
539+ let currentInterest = $t02265322753._2
540+ let claimAmount = $t02265322753._3
541+ let userShareTokensAmount = $t02265322753._4
530542 let userShareAmountNew = (userShareTokensAmount - shareTokensWithdrawAmount)
531543 let availableFundsNew = (userAvailableSWOP(pool, i.caller) + claimAmount)
532544 let totalShareAmount = getTotalShareTokenLocked(pool)
537549 then throw("Withdraw amount more then user locked amount")
538550 else if (!(isActive))
539551 then throw("DApp is inactive at this moment")
540- else [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserShareTokensLocked), userShareAmountNew), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((pool + keyShareTokensLocked), totalShareAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), availableFundsNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, shareTokensWithdrawAmount, shareTokensId)]
552+ else if ((shareTokensWithdrawAmount > userShareTokensAmount))
553+ then throw("Withdraw amount more then user locked amount")
554+ else if ((fraction(99, accountBalance(shareTokensId), 100) > totalShareAmountNew))
555+ then throw("Balance of share-token is greater than totalAmount")
556+ else [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserShareTokensLocked), userShareAmountNew), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((pool + keyShareTokensLocked), totalShareAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), availableFundsNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, shareTokensWithdrawAmount, shareTokensId)]
541557 }
542558
543559
544560
545561 @Callable(i)
546562 func claim (pool) = {
563+ let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
547564 let shareTokenLocked = getTotalShareTokenLocked(pool)
548- let $t02401324078 = getLastInterestInfo(pool)
549- let lastInterestHeight = $t02401324078._1
550- let lastInterest = $t02401324078._2
551- let $t02408324195 = rewardInfo(pool)
552- let currentRewardPerBlock = $t02408324195._1
553- let rewardUpdateHeight = $t02408324195._2
554- let previousRewardPerBlock = $t02408324195._3
555- let poolRewardUpdateHeight = $t02408324195._4
556- let $t02420024300 = claimCalc(pool, i.caller, 1)
557- let userNewInterest = $t02420024300._1
558- let currentInterest = $t02420024300._2
559- let claimAmount = $t02420024300._3
560- let userShareTokensAmount = $t02420024300._4
565+ let $t02473324798 = getLastInterestInfo(pool)
566+ let lastInterestHeight = $t02473324798._1
567+ let lastInterest = $t02473324798._2
568+ let $t02480324915 = rewardInfo(pool)
569+ let currentRewardPerBlock = $t02480324915._1
570+ let rewardUpdateHeight = $t02480324915._2
571+ let previousRewardPerBlock = $t02480324915._3
572+ let poolRewardUpdateHeight = $t02480324915._4
573+ let $t02492025020 = claimCalc(pool, i.caller, 1)
574+ let userNewInterest = $t02492025020._1
575+ let currentInterest = $t02492025020._2
576+ let claimAmount = $t02492025020._3
577+ let userShareTokensAmount = $t02492025020._4
561578 let availableFund = (userAvailableSWOP(pool, i.caller) + claimAmount)
562579 let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
563580 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
565582 then throw("You have 0 available SWOP")
566583 else if (!(isActive))
567584 then throw("DApp is inactive at this moment")
568- else [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), 0), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, availableFund, SWOP)]
585+ else if ((availableFund == 0))
586+ then throw("You have 0 available SWOP")
587+ else if ((fraction(99, accountBalance(shareTokensId), 100) > shareTokenLocked))
588+ then throw("Balance of share-token is greater than totalAmount")
589+ else [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), 0), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, availableFund, SWOP)]
569590 }
570591
571592
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let adminPubKey1 = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
55
66 let adminPubKey2 = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
77
88 let adminPubKey3 = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
99
1010 let keyShareTokensLocked = "_total_share_tokens_locked"
1111
1212 let kShareLimit = "share_limit_on_first_harvest"
1313
1414 let keyActive = "active"
1515
1616 let keyCause = "shutdown_cause"
1717
1818 let keyRewardPoolFractionCurrent = "_current_pool_fraction_reward"
1919
2020 let keyRewardPoolFractionPrevious = "_previous_pool_fraction_reward"
2121
2222 let keyHeightPoolFraction = "_pool_reward_update_height"
2323
2424 let keyTotalRewardPerBlockCurrent = "total_reward_per_block_current"
2525
2626 let keyTotalRewardPerBlockPrevious = "total_reward_per_block_previous"
2727
2828 let keyRewardUpdateHeight = "reward_update_height"
2929
3030 let keyLastInterest = "_last_interest"
3131
3232 let keyLastInterestHeight = "_last_interest_height"
3333
3434 let keyUserShareTokensLocked = "_share_tokens_locked"
3535
3636 let keyUserLastInterest = "_last_interest"
3737
3838 let keySWOPid = "SWOP_id"
3939
4040 let keyUserSWOPClaimedAmount = "_SWOP_claimed_amount"
4141
4242 let keyUserSWOPLastClaimedAmount = "_SWOP_last_claimed_amount"
4343
4444 let keyAvailableSWOP = "_available_SWOP"
4545
4646 let keyFarmingStartHeight = "farming_start_height"
4747
4848 let keyAPY = "apy"
4949
5050 let kPreviousTotalVoteSWOP = "previous_total_vote_SWOP"
5151
5252 let keySwopYearEmission = "swop_year_emission"
5353
5454 let keyBalancecpmmA = "A_asset_balance"
5555
5656 let keyBalancecpmmB = "B_asset_balance"
5757
5858 let kHarvestPoolActiveVoteStrucVoting = "_harvest_pool_activeVote_struc"
5959
6060 let kHarvestUserPoolActiveVoteStrucVoting = "_harvest_user_pool_activeVote_struc"
6161
6262 let keyLimitShareFirstHarvest = "share_limit_on_first_harvest"
6363
6464 let keyAssetIdA = "A_asset_id"
6565
6666 let keyAssetIdB = "B_asset_id"
6767
6868 let keyFirstHarvestHeight = "first_harvest_height"
6969
7070 let keyfirstHarvestCpmm = "first_harvest"
7171
7272 let keyTempPrevSum = "sum_reward_previous"
7373
7474 let keyTempCurSum = "sum_reward_current"
7575
7676 let governanceAddress = Address(base58'3N5W8da2iiijVieA6qLGo7KzCJj8B19smWU')
7777
7878 let wallet = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
7979
8080 let votingAddress = Address(base58'3MrJgdL1GniipErHy44YF9idzLaUL2iX5DQ')
8181
8282 let adminIncreaseInterestAddress = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
8383
8484 let oneWeekInBlock = 10106
8585
8686 let totalVoteShare = 10000000000
8787
8888 let scaleValue1 = 10
8989
9090 let scaleValue3 = 1000
9191
9292 let scaleValue5 = 100000
9393
9494 let scaleValue6 = 1000000
9595
9696 let scaleValue8 = 100000000
9797
9898 let scaleValue11 = 100000000000
9999
100100 func strAssetIdA (pool) = getStringValue(pool, keyAssetIdA)
101101
102102
103103 func strAssetIdB (pool) = getStringValue(pool, keyAssetIdB)
104104
105105
106106 func assetIdA (pool) = if ((strAssetIdA(pool) == "WAVES"))
107107 then unit
108108 else fromBase58String(strAssetIdA(pool))
109109
110110
111111 func assetIdB (pool) = if ((strAssetIdB(pool) == "WAVES"))
112112 then unit
113113 else fromBase58String(strAssetIdB(pool))
114114
115115
116116 let kBasePeriod = "base_period"
117117
118118 let kPeriodLength = "period_length"
119119
120120 let kStartHeight = "start_height"
121121
122122 let kFirstHarvestHeight = "first_harvest_height"
123123
124124 let kDurationFullVotePower = "duration_full_vote_power"
125125
126126 let kMinVotePower = "min_vote_power"
127127
128128 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
129129
130130 let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
131131
132132 let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
133133
134134 let durationFullVotePower = valueOrErrorMessage(getInteger(votingAddress, kDurationFullVotePower), "Empty kDurationFullVotePower")
135135
136136 let minVotePower = valueOrErrorMessage(getInteger(votingAddress, kMinVotePower), "Empty kMinVotePower")
137137
138138 let isActive = getBooleanValue(this, keyActive)
139139
140140 let currPeriod = (basePeriod + ((height - startHeight) / periodLength))
141141
142142 func getLimitToken (pool) = valueOrElse(getIntegerValue(pool, keyLimitShareFirstHarvest), 0)
143143
144144
145145 let APY = getIntegerValue(this, keyAPY)
146146
147147 let SwopYearEmission = getIntegerValue(this, keySwopYearEmission)
148148
149149 func assetNameA (pool) = match assetIdA(pool) {
150150 case id: ByteVector =>
151151 value(assetInfo(id)).name
152152 case waves: Unit =>
153153 "WAVES"
154154 case _ =>
155155 throw("Match error")
156156 }
157157
158158
159159 func assetNameB (pool) = match assetIdB(pool) {
160160 case id: ByteVector =>
161161 value(assetInfo(id)).name
162162 case waves: Unit =>
163163 "WAVES"
164164 case _ =>
165165 throw("Match error")
166166 }
167167
168168
169169 let SWOP = fromBase58String(getStringValue(this, keySWOPid))
170170
171171 func isFirstHarvest (pool) = valueOrElse(getBoolean(pool, keyfirstHarvestCpmm), false)
172172
173173
174174 func getHeightFirstHarvest (pool) = valueOrElse(getInteger(pool, keyFirstHarvestHeight), 0)
175175
176176
177177 func getBalanceA (pool) = valueOrErrorMessage(getInteger(pool, keyBalancecpmmA), ("No data on the key: " + keyBalancecpmmA))
178178
179179
180180 func getBalanceB (pool) = valueOrErrorMessage(getInteger(pool, keyBalancecpmmB), ("No data on the key: " + keyBalancecpmmB))
181181
182182
183183 func getShareLimitToken (pool) = valueOrErrorMessage(getInteger(pool, kShareLimit), ("No data on the key: " + kShareLimit))
184184
185185
186186 func getTotalShareTokenLocked (pool) = valueOrErrorMessage(getInteger(this, (pool + keyShareTokensLocked)), (("No data on the key: " + pool) + keyShareTokensLocked))
187187
188188
189189 func getShareAssetId (pool) = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
190190
191191
192+func accountBalance (assetId) = match assetId {
193+ case id: ByteVector =>
194+ assetBalance(this, id)
195+ case waves: Unit =>
196+ wavesBalance(this).available
197+ case _ =>
198+ throw("Match error")
199+}
200+
201+
192202 func getAssetInfo (assetId) = match assetId {
193203 case id: ByteVector =>
194204 let stringId = toBase58String(id)
195205 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
196206 $Tuple3(stringId, info.name, info.decimals)
197207 case waves: Unit =>
198208 $Tuple3("WAVES", "WAVES", 8)
199209 case _ =>
200210 throw("Match error")
201211 }
202212
203213
204214 func calcScaleValue (assetId1,assetId2) = {
205215 let assetId1Decimals = value(assetInfo(assetId1)).decimals
206216 let assetId2Decimals = value(assetInfo(assetId2)).decimals
207217 let scaleDigits = ((assetId2Decimals - assetId1Decimals) + 8)
208218 pow(10, 0, scaleDigits, 0, 0, HALFDOWN)
209219 }
210220
211221
212222 func userAvailableSWOP (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + toString(user)) + keyAvailableSWOP)), 0)
213223
214224
215225 func rewardInfo (pool) = {
216226 let totalRewardPerBlockCurrent = valueOrErrorMessage(getInteger(governanceAddress, keyTotalRewardPerBlockCurrent), ((("No data on the key: " + keyTotalRewardPerBlockCurrent) + " at address ") + toString(governanceAddress)))
217227 let totalRewardPerBlockPrevious = valueOrErrorMessage(getInteger(governanceAddress, keyTotalRewardPerBlockPrevious), ((("No data on the key: " + keyTotalRewardPerBlockPrevious) + " at address ") + toString(governanceAddress)))
218228 let rewardPoolFractionCurrent = valueOrErrorMessage(getInteger(governanceAddress, (pool + keyRewardPoolFractionCurrent)), (((("No data on the key: " + pool) + keyRewardPoolFractionCurrent) + " at address ") + toString(governanceAddress)))
219229 let rewardUpdateHeight = valueOrErrorMessage(getInteger(governanceAddress, keyRewardUpdateHeight), ((("No data on the key: " + keyRewardUpdateHeight) + " at address ") + toString(governanceAddress)))
220230 let poolRewardUpdateHeight = valueOrElse(getInteger(governanceAddress, (pool + keyHeightPoolFraction)), 0)
221231 let rewardPoolFractionPrevious = valueOrErrorMessage(getInteger(governanceAddress, (pool + keyRewardPoolFractionPrevious)), (((("No data on the key: " + pool) + keyRewardPoolFractionPrevious) + " at address ") + toString(governanceAddress)))
222232 let rewardPoolCurrent = fraction(totalRewardPerBlockCurrent, rewardPoolFractionCurrent, totalVoteShare)
223233 let rewardPoolPrevious = fraction(totalRewardPerBlockPrevious, rewardPoolFractionPrevious, totalVoteShare)
224234 if (if ((rewardPoolCurrent > totalRewardPerBlockCurrent))
225235 then true
226236 else (rewardPoolPrevious > totalRewardPerBlockPrevious))
227237 then throw("rewardPoolCurrent > totalRewardPerBlockCurrent or rewardPoolPrevious > totalRewardPerBlockPrevious")
228238 else $Tuple4(rewardPoolCurrent, rewardUpdateHeight, rewardPoolPrevious, poolRewardUpdateHeight)
229239 }
230240
231241
232242 func getLastInterestInfo (pool) = {
233243 let lastInterest = valueOrErrorMessage(getInteger(this, (pool + keyLastInterest)), (("No data on the key: " + pool) + keyLastInterest))
234244 let lastInterestHeight = valueOrElse(getInteger(this, (pool + keyLastInterestHeight)), height)
235245 $Tuple2(lastInterestHeight, lastInterest)
236246 }
237247
238248
239249 func getUserInterestInfo (pool,userAddress) = {
240250 let userLastInterest = getInteger(this, (((pool + "_") + toString(userAddress)) + keyUserLastInterest))
241251 let userShare = getInteger(this, (((pool + "_") + toString(userAddress)) + keyUserShareTokensLocked))
242252 let lastInterest = valueOrErrorMessage(getInteger(this, (pool + keyLastInterest)), (("No data on the key: " + pool) + keyLastInterest))
243253 let userLastInterestValue = match userLastInterest {
244254 case userLastInterest: Int =>
245255 userLastInterest
246256 case _ =>
247257 lastInterest
248258 }
249259 let userShareTokensAmount = match userShare {
250260 case userShare: Int =>
251261 userShare
252262 case _ =>
253263 0
254264 }
255265 $Tuple2(userLastInterestValue, userShareTokensAmount)
256266 }
257267
258268
259269 func calcInterest (lastInterestHeight,rewardUpdateHeight,poolRewardUpdateHeight,lastInterest,currentRewardPerBlock,shareTokenLocked,previousRewardPerBlock,shareAssetId,scaleValue,pmtAmount) = if ((shareTokenLocked == 0))
260270 then 0
261271 else if ((poolRewardUpdateHeight != 0))
262272 then if (if ((rewardUpdateHeight > height))
263273 then (rewardUpdateHeight == poolRewardUpdateHeight)
264274 else false)
265275 then {
266276 let reward = (previousRewardPerBlock * (height - lastInterestHeight))
267277 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
268278 }
269279 else if (if ((height > rewardUpdateHeight))
270280 then (rewardUpdateHeight != poolRewardUpdateHeight)
271281 else false)
272282 then {
273283 let reward = (previousRewardPerBlock * (height - lastInterestHeight))
274284 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
275285 }
276286 else if (if (if ((height > rewardUpdateHeight))
277287 then (rewardUpdateHeight == poolRewardUpdateHeight)
278288 else false)
279289 then (lastInterestHeight > rewardUpdateHeight)
280290 else false)
281291 then {
282292 let reward = (currentRewardPerBlock * (height - lastInterestHeight))
283293 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
284294 }
285295 else {
286296 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
287297 let interestAfterUpdate = (lastInterest + fraction(rewardAfterLastInterestBeforeReawardUpdate, scaleValue, shareTokenLocked))
288298 let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
289299 (interestAfterUpdate + fraction(reward, scaleValue, shareTokenLocked))
290300 }
291301 else if ((rewardUpdateHeight > height))
292302 then {
293303 let reward = (previousRewardPerBlock * (height - lastInterestHeight))
294304 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
295305 }
296306 else if ((lastInterestHeight > rewardUpdateHeight))
297307 then {
298308 let reward = (currentRewardPerBlock * (height - lastInterestHeight))
299309 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
300310 }
301311 else {
302312 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
303313 let interestAfterUpdate = (lastInterest + fraction(rewardAfterLastInterestBeforeReawardUpdate, scaleValue, shareTokenLocked))
304314 let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
305315 (interestAfterUpdate + fraction(reward, scaleValue, shareTokenLocked))
306316 }
307317
308318
309319 func claimCalc (pool,caller,pmtAmount) = {
310320 let shareAssetId = getShareAssetId(pool)
311321 let scaleValue = calcScaleValue(SWOP, shareAssetId)
312322 let shareTokenLocked = getTotalShareTokenLocked(pool)
313- let $t01297613041 = getLastInterestInfo(pool)
314- let lastInterestHeight = $t01297613041._1
315- let lastInterest = $t01297613041._2
316- let $t01304613158 = rewardInfo(pool)
317- let currentRewardPerBlock = $t01304613158._1
318- let rewardUpdateHeight = $t01304613158._2
319- let previousRewardPerBlock = $t01304613158._3
320- let poolRewardUpdateHeight = $t01304613158._4
321- let $t01316313242 = getUserInterestInfo(pool, caller)
322- let userLastInterest = $t01316313242._1
323- let userShareTokensAmount = $t01316313242._2
323+ let $t01314613211 = getLastInterestInfo(pool)
324+ let lastInterestHeight = $t01314613211._1
325+ let lastInterest = $t01314613211._2
326+ let $t01321613328 = rewardInfo(pool)
327+ let currentRewardPerBlock = $t01321613328._1
328+ let rewardUpdateHeight = $t01321613328._2
329+ let previousRewardPerBlock = $t01321613328._3
330+ let poolRewardUpdateHeight = $t01321613328._4
331+ let $t01333313412 = getUserInterestInfo(pool, caller)
332+ let userLastInterest = $t01333313412._1
333+ let userShareTokensAmount = $t01333313412._2
324334 let currentInterest = calcInterest(lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, lastInterest, currentRewardPerBlock, shareTokenLocked, previousRewardPerBlock, shareAssetId, scaleValue, pmtAmount)
325335 let claimAmount = fraction(userShareTokensAmount, (currentInterest - userLastInterest), scaleValue)
326336 let userNewInterest = currentInterest
327337 $Tuple4(userNewInterest, currentInterest, claimAmount, userShareTokensAmount)
328338 }
329339
330340
331341 func calculateProtocolReward (pool) = {
332- let $t01376013825 = getLastInterestInfo(pool)
333- let lastInterestHeight = $t01376013825._1
334- let lastInterest = $t01376013825._2
335- let $t01383013941 = rewardInfo(pool)
336- let currentRewardPerBlock = $t01383013941._1
337- let rewardUpdateHeight = $t01383013941._2
338- let previousRewardPerBlock = $t01383013941._3
339- let poolRewardUpdateHeight = $t01383013941._4
342+ let $t01393013995 = getLastInterestInfo(pool)
343+ let lastInterestHeight = $t01393013995._1
344+ let lastInterest = $t01393013995._2
345+ let $t01400014111 = rewardInfo(pool)
346+ let currentRewardPerBlock = $t01400014111._1
347+ let rewardUpdateHeight = $t01400014111._2
348+ let previousRewardPerBlock = $t01400014111._3
349+ let poolRewardUpdateHeight = $t01400014111._4
340350 let shareTokenLocked = getTotalShareTokenLocked(pool)
341351 if (if ((shareTokenLocked == 0))
342352 then (poolRewardUpdateHeight == 0)
343353 else false)
344354 then if ((rewardUpdateHeight > height))
345355 then {
346356 let reward = (previousRewardPerBlock * (height - lastInterestHeight))
347357 reward
348358 }
349359 else if ((lastInterestHeight > rewardUpdateHeight))
350360 then {
351361 let reward = (currentRewardPerBlock * (height - lastInterestHeight))
352362 reward
353363 }
354364 else {
355365 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
356366 let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
357367 (reward + rewardAfterLastInterestBeforeReawardUpdate)
358368 }
359369 else if (if ((shareTokenLocked == 0))
360370 then (poolRewardUpdateHeight != 0)
361371 else false)
362372 then if (if ((rewardUpdateHeight > height))
363373 then (rewardUpdateHeight == poolRewardUpdateHeight)
364374 else false)
365375 then {
366376 let reward = (previousRewardPerBlock * (height - lastInterestHeight))
367377 reward
368378 }
369379 else if (if ((height > rewardUpdateHeight))
370380 then (rewardUpdateHeight != poolRewardUpdateHeight)
371381 else false)
372382 then {
373383 let reward = (previousRewardPerBlock * (height - lastInterestHeight))
374384 reward
375385 }
376386 else if (if (if ((height > rewardUpdateHeight))
377387 then (rewardUpdateHeight == poolRewardUpdateHeight)
378388 else false)
379389 then (lastInterestHeight > rewardUpdateHeight)
380390 else false)
381391 then {
382392 let reward = (currentRewardPerBlock * (height - lastInterestHeight))
383393 reward
384394 }
385395 else {
386396 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
387397 let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
388398 (reward + rewardAfterLastInterestBeforeReawardUpdate)
389399 }
390400 else 0
391401 }
392402
393403
394404 func checkPmtAssetIdCorrect (pool,pmtAssetId) = {
395405 let poolShareAssetId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
396406 if ((pmtAssetId == poolShareAssetId))
397407 then true
398408 else false
399409 }
400410
401411
402412 func getUserSWOPClaimedAmount (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + toString(user)) + keyUserSWOPClaimedAmount)), 0)
403413
404414
405415 func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
406416
407417
408418 @Callable(i)
409419 func init (earlyLP) = if (isDefined(getString(this, keySWOPid)))
410420 then throw("SWOP already initialized")
411421 else {
412422 let initAmount = 100000000000000
413423 let SWOPissue = Issue("SWOP", "SWOP protocol token", initAmount, 8, true)
414424 let SWOPid = calculateAssetId(SWOPissue)
415425 [BooleanEntry(keyActive, true), Issue("SWOP", "SWOP protocol token", initAmount, 8, true), StringEntry(keySWOPid, toBase58String(SWOPid))]
416426 }
417427
418428
419429
420430 @Callable(i)
421431 func initPoolShareFarming (pool) = if ((i.caller != this))
422432 then throw("Only the DApp itself can call this function")
423433 else {
424- let $t01692717030 = rewardInfo(pool)
425- let currentReward = $t01692717030._1
426- let rewardUpdateHeight = $t01692717030._2
427- let previousRewardPerBlock = $t01692717030._3
428- let poolRewardUpdateHeight = $t01692717030._4
434+ let $t01709717200 = rewardInfo(pool)
435+ let currentReward = $t01709717200._1
436+ let rewardUpdateHeight = $t01709717200._2
437+ let previousRewardPerBlock = $t01709717200._3
438+ let poolRewardUpdateHeight = $t01709717200._4
429439 [IntegerEntry((pool + keyShareTokensLocked), 0), IntegerEntry((pool + keyLastInterest), 0), IntegerEntry((pool + keyLastInterestHeight), height)]
430440 }
431441
432442
433443
434444 @Callable(i)
435445 func updatePoolInterest (pool) = if ((i.caller != wallet))
436446 then throw("Only the Admin itself can call this function")
437447 else {
438- let $t01736317483 = claimCalc(pool, adminIncreaseInterestAddress, 0)
439- let userNewInterest = $t01736317483._1
440- let currentInterest = $t01736317483._2
441- let claimAmount = $t01736317483._3
442- let userShareTokensAmount = $t01736317483._4
443- let $t01748817591 = rewardInfo(pool)
444- let currentReward = $t01748817591._1
445- let rewardUpdateHeight = $t01748817591._2
446- let previousRewardPerBlock = $t01748817591._3
447- let poolRewardUpdateHeight = $t01748817591._4
448+ let $t01753317653 = claimCalc(pool, adminIncreaseInterestAddress, 0)
449+ let userNewInterest = $t01753317653._1
450+ let currentInterest = $t01753317653._2
451+ let claimAmount = $t01753317653._3
452+ let userShareTokensAmount = $t01753317653._4
453+ let $t01765817761 = rewardInfo(pool)
454+ let currentReward = $t01765817761._1
455+ let rewardUpdateHeight = $t01765817761._2
456+ let previousRewardPerBlock = $t01765817761._3
457+ let poolRewardUpdateHeight = $t01765817761._4
448458 [IntegerEntry((pool + keyLastInterest), userNewInterest), IntegerEntry((pool + keyLastInterestHeight), height)]
449459 }
450460
451461
452462
453463 @Callable(i)
454464 func lockShareTokens (pool) = {
455- let $t01778317858 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
456- let pmtAmount = $t01778317858._1
457- let pmtAssetId = $t01778317858._2
458- let $t01786317936 = getAssetInfo(pmtAssetId)
459- let pmtStrAssetId = $t01786317936._1
460- let pmtAssetName = $t01786317936._2
461- let pmtDecimals = $t01786317936._3
462- let $t01794118049 = claimCalc(pool, i.caller, pmtAmount)
463- let userNewInterest = $t01794118049._1
464- let currentInterest = $t01794118049._2
465- let claimAmount = $t01794118049._3
466- let userShareTokensAmount = $t01794118049._4
465+ let $t01795318028 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
466+ let pmtAmount = $t01795318028._1
467+ let pmtAssetId = $t01795318028._2
468+ let $t01803318106 = getAssetInfo(pmtAssetId)
469+ let pmtStrAssetId = $t01803318106._1
470+ let pmtAssetName = $t01803318106._2
471+ let pmtDecimals = $t01803318106._3
472+ let $t01811118219 = claimCalc(pool, i.caller, pmtAmount)
473+ let userNewInterest = $t01811118219._1
474+ let currentInterest = $t01811118219._2
475+ let claimAmount = $t01811118219._3
476+ let userShareTokensAmount = $t01811118219._4
467477 let userShareAmountNew = (userShareTokensAmount + pmtAmount)
468478 let availableFundsNew = (userAvailableSWOP(pool, i.caller) + claimAmount)
469479 let totalShareAmount = getTotalShareTokenLocked(pool)
470480 let totalShareAmountNew = (totalShareAmount + pmtAmount)
471481 let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
472482 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
473483 let baseEntry = [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserShareTokensLocked), userShareAmountNew), IntegerEntry((pool + keyShareTokensLocked), totalShareAmountNew), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), availableFundsNew)]
474484 if ((0 >= pmtAmount))
475485 then throw("You can't lock token")
476486 else if (!(isActive))
477487 then throw("DApp is inactive at this moment")
478488 else if (!(checkPmtAssetIdCorrect(pool, pmtAssetId)))
479489 then throw("Incorrect pmtAssetId")
480490 else if (if (isFirstHarvest(Address(fromBase58String(pool))))
481491 then (getHeightFirstHarvest(Address(fromBase58String(pool))) > height)
482492 else false)
483493 then {
484494 let harvestPeriod = ((((getHeightFirstHarvest(Address(fromBase58String(pool))) - startHeight) + 1) / periodLength) - 1)
485495 let amountOfVoting = split(getStringValue(votingAddress, (((toString(i.caller) + "_") + pool) + "_user_pool_struc")), "_")
486496 let amountPoolStract = split(getStringValue(votingAddress, (pool + "_pool_struc")), "_")
487497 let amountActiveVoteUserPoolStract = split(valueOrElse(getString(votingAddress, (((toString(i.caller) + "_") + pool) + kHarvestUserPoolActiveVoteStrucVoting)), ""), "_")
488498 let amountPoolActiveVoteStract = split(valueOrElse(getString(votingAddress, (pool + kHarvestPoolActiveVoteStrucVoting)), ""), "_")
489499 let userShareTokenLocked = userShareTokensAmount
490500 let userPoolActiveVote = if ((toString(currPeriod) == amountOfVoting[2]))
491501 then valueOrElse(parseInt(amountActiveVoteUserPoolStract[0]), 0)
492502 else valueOrElse(parseInt(amountOfVoting[1]), 0)
493503 let poolActiveVote = if ((toString(currPeriod) == amountPoolStract[2]))
494504 then valueOrElse(parseInt(amountPoolActiveVoteStract[0]), 0)
495505 else valueOrElse(parseInt(amountPoolStract[1]), 0)
496506 let protocolReward = calculateProtocolReward(pool)
497507 if ((userPoolActiveVote != 0))
498508 then {
499509 let limitShareToken = getShareLimitToken(addressFromStringValue(pool))
500510 let shareToken = (fraction(limitShareToken, userPoolActiveVote, poolActiveVote) - userShareTokenLocked)
501511 if (if ((size(amountActiveVoteUserPoolStract) > 1))
502512 then (valueOrElse(parseInt(amountActiveVoteUserPoolStract[1]), 0) >= harvestPeriod)
503513 else false)
504514 then throw("You can't share token")
505515 else if ((pmtAmount > limitShareToken))
506516 then throw(("You can't share token more than " + toString(limitShareToken)))
507517 else if ((shareToken > 0))
508- then if ((totalShareAmount == 0))
509- then (baseEntry ++ [ScriptTransfer(wallet, protocolReward, SWOP)])
510- else if ((shareToken >= pmtAmount))
511- then baseEntry
512- else throw(("Your maximum share token is " + toString(shareToken)))
518+ then if ((fraction(99, accountBalance(pmtAssetId), 100) > totalShareAmountNew))
519+ then throw("Balance of share-token is greater than totalAmount")
520+ else if ((totalShareAmount == 0))
521+ then (baseEntry ++ [ScriptTransfer(wallet, protocolReward, SWOP)])
522+ else if ((shareToken >= pmtAmount))
523+ then baseEntry
524+ else throw(("Your maximum share token is " + toString(shareToken)))
513525 else throw("You can't share token")
514526 }
515527 else throw("Your amount of token less than 0")
516528 }
517529 else baseEntry
518530 }
519531
520532
521533
522534 @Callable(i)
523535 func withdrawShareTokens (pool,shareTokensWithdrawAmount) = {
524536 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
525- let $t02232122421 = claimCalc(pool, i.caller, 1)
526- let userNewInterest = $t02232122421._1
527- let currentInterest = $t02232122421._2
528- let claimAmount = $t02232122421._3
529- let userShareTokensAmount = $t02232122421._4
537+ let $t02265322753 = claimCalc(pool, i.caller, 1)
538+ let userNewInterest = $t02265322753._1
539+ let currentInterest = $t02265322753._2
540+ let claimAmount = $t02265322753._3
541+ let userShareTokensAmount = $t02265322753._4
530542 let userShareAmountNew = (userShareTokensAmount - shareTokensWithdrawAmount)
531543 let availableFundsNew = (userAvailableSWOP(pool, i.caller) + claimAmount)
532544 let totalShareAmount = getTotalShareTokenLocked(pool)
533545 let totalShareAmountNew = (totalShareAmount - shareTokensWithdrawAmount)
534546 let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
535547 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
536548 if ((shareTokensWithdrawAmount > userShareTokensAmount))
537549 then throw("Withdraw amount more then user locked amount")
538550 else if (!(isActive))
539551 then throw("DApp is inactive at this moment")
540- else [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserShareTokensLocked), userShareAmountNew), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((pool + keyShareTokensLocked), totalShareAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), availableFundsNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, shareTokensWithdrawAmount, shareTokensId)]
552+ else if ((shareTokensWithdrawAmount > userShareTokensAmount))
553+ then throw("Withdraw amount more then user locked amount")
554+ else if ((fraction(99, accountBalance(shareTokensId), 100) > totalShareAmountNew))
555+ then throw("Balance of share-token is greater than totalAmount")
556+ else [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserShareTokensLocked), userShareAmountNew), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((pool + keyShareTokensLocked), totalShareAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), availableFundsNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, shareTokensWithdrawAmount, shareTokensId)]
541557 }
542558
543559
544560
545561 @Callable(i)
546562 func claim (pool) = {
563+ let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
547564 let shareTokenLocked = getTotalShareTokenLocked(pool)
548- let $t02401324078 = getLastInterestInfo(pool)
549- let lastInterestHeight = $t02401324078._1
550- let lastInterest = $t02401324078._2
551- let $t02408324195 = rewardInfo(pool)
552- let currentRewardPerBlock = $t02408324195._1
553- let rewardUpdateHeight = $t02408324195._2
554- let previousRewardPerBlock = $t02408324195._3
555- let poolRewardUpdateHeight = $t02408324195._4
556- let $t02420024300 = claimCalc(pool, i.caller, 1)
557- let userNewInterest = $t02420024300._1
558- let currentInterest = $t02420024300._2
559- let claimAmount = $t02420024300._3
560- let userShareTokensAmount = $t02420024300._4
565+ let $t02473324798 = getLastInterestInfo(pool)
566+ let lastInterestHeight = $t02473324798._1
567+ let lastInterest = $t02473324798._2
568+ let $t02480324915 = rewardInfo(pool)
569+ let currentRewardPerBlock = $t02480324915._1
570+ let rewardUpdateHeight = $t02480324915._2
571+ let previousRewardPerBlock = $t02480324915._3
572+ let poolRewardUpdateHeight = $t02480324915._4
573+ let $t02492025020 = claimCalc(pool, i.caller, 1)
574+ let userNewInterest = $t02492025020._1
575+ let currentInterest = $t02492025020._2
576+ let claimAmount = $t02492025020._3
577+ let userShareTokensAmount = $t02492025020._4
561578 let availableFund = (userAvailableSWOP(pool, i.caller) + claimAmount)
562579 let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
563580 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
564581 if ((availableFund == 0))
565582 then throw("You have 0 available SWOP")
566583 else if (!(isActive))
567584 then throw("DApp is inactive at this moment")
568- else [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), 0), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, availableFund, SWOP)]
585+ else if ((availableFund == 0))
586+ then throw("You have 0 available SWOP")
587+ else if ((fraction(99, accountBalance(shareTokensId), 100) > shareTokenLocked))
588+ then throw("Balance of share-token is greater than totalAmount")
589+ else [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), 0), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, availableFund, SWOP)]
569590 }
570591
571592
572593
573594 @Callable(i)
574595 func shutdown () = if (!(isActive))
575596 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
576597 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
577598 then throw("Only admin can call this function")
578599 else suspend("Paused by admin")
579600
580601
581602
582603 @Callable(i)
583604 func activate () = if (isActive)
584605 then throw("DApp is already active")
585606 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
586607 then throw("Only admin can call this function")
587608 else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
588609
589610
590611 @Verifier(tx)
591612 func verify () = match tx {
592613 case _ =>
593614 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
594615 }
595616

github/deemru/w8io/169f3d6 
92.62 ms