tx · 7FAyLuFsYmztX2YHkcqosbH9PoKQ4XrjpPk23E4Kid6e

3MsxHxruYWoddB4HRiPBYAWtMXMtCF1V9XT:  -0.01400000 Waves

2021.09.10 01:21 [1696107] smart account 3MsxHxruYWoddB4HRiPBYAWtMXMtCF1V9XT > SELF 0.00000000 Waves

{ "type": 13, "id": "7FAyLuFsYmztX2YHkcqosbH9PoKQ4XrjpPk23E4Kid6e", "fee": 1400000, "feeAssetId": null, "timestamp": 1631226051004, "version": 2, "chainId": 84, "sender": "3MsxHxruYWoddB4HRiPBYAWtMXMtCF1V9XT", "senderPublicKey": "3ijdmxaYrpDFsKVbQH2kvB7i6JzHj9bep9bGWiQPra2D", "proofs": [ "3hMbfsUuGYo7QuxL2FsQSkh2dYafBEMg23sjzvb8iw9MqbKdY2U67hEqzB3yfivHwRE85cW53s5M3SozzXg16ki9", "3SjjdEgVXr1nfdNj5ywjDyaKQPTxN2WQKFaiPC6Qq61JU7nEUdPF1mrFA2h86MV1CWvnfwn5B5YEeaQFYaHwnPN4" ], "script": "base64:AAIEAAAAAAAAACUIAhIDCgEIEgMKAQgSAwoBCBIDCgEIEgQKAggBEgMKAQgSABIAAAAAWwAAAAAMYWRtaW5QdWJLZXkxAQAAACDip4xAO4bNF+a0S4fb5aGDrK4qoew3Ll5lBRPytezvBAAAAAAMYWRtaW5QdWJLZXkyAQAAACDqOKy5AbWIPHKjnig9gdQaImURE43fjoONfP1X8ZsRWQAAAAAMYWRtaW5QdWJLZXkzAQAAACCnNJaCsKPJx10yYgF/O0UnTzPqvzbEAc8Qt3RwqifMbgAAAAAUa2V5U2hhcmVUb2tlbnNMb2NrZWQCAAAAGl90b3RhbF9zaGFyZV90b2tlbnNfbG9ja2VkAAAAAAtrU2hhcmVMaW1pdAIAAAAcc2hhcmVfbGltaXRfb25fZmlyc3RfaGFydmVzdAAAAAAJa2V5QWN0aXZlAgAAAAZhY3RpdmUAAAAACGtleUNhdXNlAgAAAA5zaHV0ZG93bl9jYXVzZQAAAAAca2V5UmV3YXJkUG9vbEZyYWN0aW9uQ3VycmVudAIAAAAdX2N1cnJlbnRfcG9vbF9mcmFjdGlvbl9yZXdhcmQAAAAAHWtleVJld2FyZFBvb2xGcmFjdGlvblByZXZpb3VzAgAAAB5fcHJldmlvdXNfcG9vbF9mcmFjdGlvbl9yZXdhcmQAAAAAFWtleUhlaWdodFBvb2xGcmFjdGlvbgIAAAAaX3Bvb2xfcmV3YXJkX3VwZGF0ZV9oZWlnaHQAAAAAHWtleVRvdGFsUmV3YXJkUGVyQmxvY2tDdXJyZW50AgAAAB50b3RhbF9yZXdhcmRfcGVyX2Jsb2NrX2N1cnJlbnQAAAAAHmtleVRvdGFsUmV3YXJkUGVyQmxvY2tQcmV2aW91cwIAAAAfdG90YWxfcmV3YXJkX3Blcl9ibG9ja19wcmV2aW91cwAAAAAVa2V5UmV3YXJkVXBkYXRlSGVpZ2h0AgAAABRyZXdhcmRfdXBkYXRlX2hlaWdodAAAAAAPa2V5TGFzdEludGVyZXN0AgAAAA5fbGFzdF9pbnRlcmVzdAAAAAAVa2V5TGFzdEludGVyZXN0SGVpZ2h0AgAAABVfbGFzdF9pbnRlcmVzdF9oZWlnaHQAAAAAGGtleVVzZXJTaGFyZVRva2Vuc0xvY2tlZAIAAAAUX3NoYXJlX3Rva2Vuc19sb2NrZWQAAAAAE2tleVVzZXJMYXN0SW50ZXJlc3QCAAAADl9sYXN0X2ludGVyZXN0AAAAAAlrZXlTV09QaWQCAAAAB1NXT1BfaWQAAAAAGGtleVVzZXJTV09QQ2xhaW1lZEFtb3VudAIAAAAUX1NXT1BfY2xhaW1lZF9hbW91bnQAAAAAHGtleVVzZXJTV09QTGFzdENsYWltZWRBbW91bnQCAAAAGV9TV09QX2xhc3RfY2xhaW1lZF9hbW91bnQAAAAAEGtleUF2YWlsYWJsZVNXT1ACAAAAD19hdmFpbGFibGVfU1dPUAAAAAAVa2V5RmFybWluZ1N0YXJ0SGVpZ2h0AgAAABRmYXJtaW5nX3N0YXJ0X2hlaWdodAAAAAAGa2V5QVBZAgAAAANhcHkAAAAAFmtQcmV2aW91c1RvdGFsVm90ZVNXT1ACAAAAGHByZXZpb3VzX3RvdGFsX3ZvdGVfU1dPUAAAAAATa2V5U3dvcFllYXJFbWlzc2lvbgIAAAASc3dvcF95ZWFyX2VtaXNzaW9uAAAAAA9rZXlCYWxhbmNlY3BtbUECAAAAD0FfYXNzZXRfYmFsYW5jZQAAAAAPa2V5QmFsYW5jZWNwbW1CAgAAAA9CX2Fzc2V0X2JhbGFuY2UAAAAAIWtIYXJ2ZXN0UG9vbEFjdGl2ZVZvdGVTdHJ1Y1ZvdGluZwIAAAAeX2hhcnZlc3RfcG9vbF9hY3RpdmVWb3RlX3N0cnVjAAAAACVrSGFydmVzdFVzZXJQb29sQWN0aXZlVm90ZVN0cnVjVm90aW5nAgAAACNfaGFydmVzdF91c2VyX3Bvb2xfYWN0aXZlVm90ZV9zdHJ1YwAAAAAZa2V5TGltaXRTaGFyZUZpcnN0SGFydmVzdAIAAAAcc2hhcmVfbGltaXRfb25fZmlyc3RfaGFydmVzdAAAAAALa2V5QXNzZXRJZEECAAAACkFfYXNzZXRfaWQAAAAAC2tleUFzc2V0SWRCAgAAAApCX2Fzc2V0X2lkAAAAABVrZXlGaXJzdEhhcnZlc3RIZWlnaHQCAAAAFGZpcnN0X2hhcnZlc3RfaGVpZ2h0AAAAABNrZXlmaXJzdEhhcnZlc3RDcG1tAgAAAA1maXJzdF9oYXJ2ZXN0AAAAAA5rZXlUZW1wUHJldlN1bQIAAAATc3VtX3Jld2FyZF9wcmV2aW91cwAAAAANa2V5VGVtcEN1clN1bQIAAAASc3VtX3Jld2FyZF9jdXJyZW50AAAAABFnb3Zlcm5hbmNlQWRkcmVzcwkBAAAAB0FkZHJlc3MAAAABAQAAABoBVKr6ad6B9BNShco/LjqIUbMZ6pgcWfINLQAAAAAGd2FsbGV0CQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFU3z1Ll4lYWd4V4ORRC1bdPXpfvbV/hSGJAAAAAA12b3RpbmdBZGRyZXNzCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFUGjZ+31einSdpXP6/9ybU5/uhw2g+IMp/AAAAABxhZG1pbkluY3JlYXNlSW50ZXJlc3RBZGRyZXNzCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFU3z1Ll4lYWd4V4ORRC1bdPXpfvbV/hSGJAAAAAA5vbmVXZWVrSW5CbG9jawAAAAAAAAAnegAAAAAOdG90YWxWb3RlU2hhcmUAAAAAAlQL5AAAAAAAC3NjYWxlVmFsdWUxAAAAAAAAAAAKAAAAAAtzY2FsZVZhbHVlMwAAAAAAAAAD6AAAAAALc2NhbGVWYWx1ZTUAAAAAAAABhqAAAAAAC3NjYWxlVmFsdWU2AAAAAAAAD0JAAAAAAAtzY2FsZVZhbHVlOAAAAAAABfXhAAAAAAAMc2NhbGVWYWx1ZTExAAAAABdIdugAAQAAAAtzdHJBc3NldElkQQAAAAEAAAAEcG9vbAkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAEcG9vbAUAAAALa2V5QXNzZXRJZEEBAAAAC3N0ckFzc2V0SWRCAAAAAQAAAARwb29sCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAARwb29sBQAAAAtrZXlBc3NldElkQgEAAAAIYXNzZXRJZEEAAAABAAAABHBvb2wDCQAAAAAAAAIJAQAAAAtzdHJBc3NldElkQQAAAAEFAAAABHBvb2wCAAAABVdBVkVTBQAAAAR1bml0CQACWQAAAAEJAQAAAAtzdHJBc3NldElkQQAAAAEFAAAABHBvb2wBAAAACGFzc2V0SWRCAAAAAQAAAARwb29sAwkAAAAAAAACCQEAAAALc3RyQXNzZXRJZEIAAAABBQAAAARwb29sAgAAAAVXQVZFUwUAAAAEdW5pdAkAAlkAAAABCQEAAAALc3RyQXNzZXRJZEIAAAABBQAAAARwb29sAAAAAAtrQmFzZVBlcmlvZAIAAAALYmFzZV9wZXJpb2QAAAAADWtQZXJpb2RMZW5ndGgCAAAADXBlcmlvZF9sZW5ndGgAAAAADGtTdGFydEhlaWdodAIAAAAMc3RhcnRfaGVpZ2h0AAAAABNrRmlyc3RIYXJ2ZXN0SGVpZ2h0AgAAABRmaXJzdF9oYXJ2ZXN0X2hlaWdodAAAAAAWa0R1cmF0aW9uRnVsbFZvdGVQb3dlcgIAAAAYZHVyYXRpb25fZnVsbF92b3RlX3Bvd2VyAAAAAA1rTWluVm90ZVBvd2VyAgAAAA5taW5fdm90ZV9wb3dlcgAAAAAKYmFzZVBlcmlvZAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAADXZvdGluZ0FkZHJlc3MFAAAAC2tCYXNlUGVyaW9kAgAAABFFbXB0eSBrQmFzZVBlcmlvZAAAAAALc3RhcnRIZWlnaHQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAA12b3RpbmdBZGRyZXNzBQAAAAxrU3RhcnRIZWlnaHQCAAAAEkVtcHR5IGtTdGFydEhlaWdodAAAAAAMcGVyaW9kTGVuZ3RoCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANdm90aW5nQWRkcmVzcwUAAAANa1BlcmlvZExlbmd0aAIAAAATRW1wdHkga1BlcmlvZExlbmd0aAAAAAAVZHVyYXRpb25GdWxsVm90ZVBvd2VyCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANdm90aW5nQWRkcmVzcwUAAAAWa0R1cmF0aW9uRnVsbFZvdGVQb3dlcgIAAAAcRW1wdHkga0R1cmF0aW9uRnVsbFZvdGVQb3dlcgAAAAAMbWluVm90ZVBvd2VyCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAANdm90aW5nQWRkcmVzcwUAAAANa01pblZvdGVQb3dlcgIAAAATRW1wdHkga01pblZvdGVQb3dlcgAAAAAIaXNBY3RpdmUJAQAAABFAZXh0ck5hdGl2ZSgxMDUxKQAAAAIFAAAABHRoaXMFAAAACWtleUFjdGl2ZQAAAAAKY3VyclBlcmlvZAkAAGQAAAACBQAAAApiYXNlUGVyaW9kCQAAaQAAAAIJAABlAAAAAgUAAAAGaGVpZ2h0BQAAAAtzdGFydEhlaWdodAUAAAAMcGVyaW9kTGVuZ3RoAQAAAA1nZXRMaW1pdFRva2VuAAAAAQAAAARwb29sCQEAAAALdmFsdWVPckVsc2UAAAACCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAARwb29sBQAAABlrZXlMaW1pdFNoYXJlRmlyc3RIYXJ2ZXN0AAAAAAAAAAAAAAAAAANBUFkJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMFAAAABmtleUFQWQAAAAAQU3dvcFllYXJFbWlzc2lvbgkBAAAAEUBleHRyTmF0aXZlKDEwNTApAAAAAgUAAAAEdGhpcwUAAAATa2V5U3dvcFllYXJFbWlzc2lvbgEAAAAKYXNzZXROYW1lQQAAAAEAAAAEcG9vbAQAAAAHJG1hdGNoMAkBAAAACGFzc2V0SWRBAAAAAQUAAAAEcG9vbAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAACaWQFAAAAByRtYXRjaDAICQEAAAAFdmFsdWUAAAABCQAD7AAAAAEFAAAAAmlkAAAABG5hbWUDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQEAAAABXdhdmVzBQAAAAckbWF0Y2gwAgAAAAVXQVZFUwkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgEAAAAKYXNzZXROYW1lQgAAAAEAAAAEcG9vbAQAAAAHJG1hdGNoMAkBAAAACGFzc2V0SWRCAAAAAQUAAAAEcG9vbAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAACaWQFAAAAByRtYXRjaDAICQEAAAAFdmFsdWUAAAABCQAD7AAAAAEFAAAAAmlkAAAABG5hbWUDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQEAAAABXdhdmVzBQAAAAckbWF0Y2gwAgAAAAVXQVZFUwkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgAAAAAEU1dPUAkAAlkAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAAR0aGlzBQAAAAlrZXlTV09QaWQBAAAADmlzRmlyc3RIYXJ2ZXN0AAAAAQAAAARwb29sCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGwAAAAIFAAAABHBvb2wFAAAAE2tleWZpcnN0SGFydmVzdENwbW0HAQAAABVnZXRIZWlnaHRGaXJzdEhhcnZlc3QAAAABAAAABHBvb2wJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEcG9vbAUAAAAVa2V5Rmlyc3RIYXJ2ZXN0SGVpZ2h0AAAAAAAAAAAAAQAAAAtnZXRCYWxhbmNlQQAAAAEAAAAEcG9vbAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHBvb2wFAAAAD2tleUJhbGFuY2VjcG1tQQkAASwAAAACAgAAABRObyBkYXRhIG9uIHRoZSBrZXk6IAUAAAAPa2V5QmFsYW5jZWNwbW1BAQAAAAtnZXRCYWxhbmNlQgAAAAEAAAAEcG9vbAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHBvb2wFAAAAD2tleUJhbGFuY2VjcG1tQgkAASwAAAACAgAAABRObyBkYXRhIG9uIHRoZSBrZXk6IAUAAAAPa2V5QmFsYW5jZWNwbW1CAQAAABJnZXRTaGFyZUxpbWl0VG9rZW4AAAABAAAABHBvb2wJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAARwb29sBQAAAAtrU2hhcmVMaW1pdAkAASwAAAACAgAAABRObyBkYXRhIG9uIHRoZSBrZXk6IAUAAAALa1NoYXJlTGltaXQBAAAAGGdldFRvdGFsU2hhcmVUb2tlbkxvY2tlZAAAAAEAAAAEcG9vbAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAEcG9vbAUAAAAUa2V5U2hhcmVUb2tlbnNMb2NrZWQJAAEsAAAAAgkAASwAAAACAgAAABRObyBkYXRhIG9uIHRoZSBrZXk6IAUAAAAEcG9vbAUAAAAUa2V5U2hhcmVUb2tlbnNMb2NrZWQBAAAAD2dldFNoYXJlQXNzZXRJZAAAAAEAAAAEcG9vbAkAAlkAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACCQEAAAAFdmFsdWUAAAABCQAEJgAAAAEFAAAABHBvb2wCAAAADnNoYXJlX2Fzc2V0X2lkAQAAAA5hY2NvdW50QmFsYW5jZQAAAAEAAAAHYXNzZXRJZAQAAAAHJG1hdGNoMAUAAAAHYXNzZXRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAKQnl0ZVZlY3RvcgQAAAACaWQFAAAAByRtYXRjaDAJAAPwAAAAAgUAAAAEdGhpcwUAAAACaWQDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQEAAAABXdhdmVzBQAAAAckbWF0Y2gwCAkAA+8AAAABBQAAAAR0aGlzAAAACWF2YWlsYWJsZQkAAAIAAAABAgAAAAtNYXRjaCBlcnJvcgEAAAAMZ2V0QXNzZXRJbmZvAAAAAQAAAAdhc3NldElkBAAAAAckbWF0Y2gwBQAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAApCeXRlVmVjdG9yBAAAAAJpZAUAAAAHJG1hdGNoMAQAAAAIc3RyaW5nSWQJAAJYAAAAAQUAAAACaWQEAAAABGluZm8JAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkAA+wAAAABBQAAAAJpZAkAASwAAAACCQABLAAAAAICAAAABkFzc2V0IAUAAAAIc3RyaW5nSWQCAAAADiBkb2Vzbid0IGV4aXN0CQAFFQAAAAMFAAAACHN0cmluZ0lkCAUAAAAEaW5mbwAAAARuYW1lCAUAAAAEaW5mbwAAAAhkZWNpbWFscwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAEVW5pdAQAAAAFd2F2ZXMFAAAAByRtYXRjaDAJAAUVAAAAAwIAAAAFV0FWRVMCAAAABVdBVkVTAAAAAAAAAAAICQAAAgAAAAECAAAAC01hdGNoIGVycm9yAQAAAA5jYWxjU2NhbGVWYWx1ZQAAAAIAAAAIYXNzZXRJZDEAAAAIYXNzZXRJZDIEAAAAEGFzc2V0SWQxRGVjaW1hbHMICQEAAAAFdmFsdWUAAAABCQAD7AAAAAEFAAAACGFzc2V0SWQxAAAACGRlY2ltYWxzBAAAABBhc3NldElkMkRlY2ltYWxzCAkBAAAABXZhbHVlAAAAAQkAA+wAAAABBQAAAAhhc3NldElkMgAAAAhkZWNpbWFscwQAAAALc2NhbGVEaWdpdHMJAABkAAAAAgkAAGUAAAACBQAAABBhc3NldElkMkRlY2ltYWxzBQAAABBhc3NldElkMURlY2ltYWxzAAAAAAAAAAAICQAAbAAAAAYAAAAAAAAAAAoAAAAAAAAAAAAFAAAAC3NjYWxlRGlnaXRzAAAAAAAAAAAAAAAAAAAAAAAABQAAAAhIQUxGRE9XTgEAAAARdXNlckF2YWlsYWJsZVNXT1AAAAACAAAABHBvb2wAAAAEdXNlcgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAARwb29sAgAAAAFfCQAEJQAAAAEFAAAABHVzZXIFAAAAEGtleUF2YWlsYWJsZVNXT1AAAAAAAAAAAAABAAAACnJld2FyZEluZm8AAAABAAAABHBvb2wEAAAAGnRvdGFsUmV3YXJkUGVyQmxvY2tDdXJyZW50CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAARZ292ZXJuYW5jZUFkZHJlc3MFAAAAHWtleVRvdGFsUmV3YXJkUGVyQmxvY2tDdXJyZW50CQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABRObyBkYXRhIG9uIHRoZSBrZXk6IAUAAAAda2V5VG90YWxSZXdhcmRQZXJCbG9ja0N1cnJlbnQCAAAADCBhdCBhZGRyZXNzIAkABCUAAAABBQAAABFnb3Zlcm5hbmNlQWRkcmVzcwQAAAAbdG90YWxSZXdhcmRQZXJCbG9ja1ByZXZpb3VzCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAARZ292ZXJuYW5jZUFkZHJlc3MFAAAAHmtleVRvdGFsUmV3YXJkUGVyQmxvY2tQcmV2aW91cwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAUTm8gZGF0YSBvbiB0aGUga2V5OiAFAAAAHmtleVRvdGFsUmV3YXJkUGVyQmxvY2tQcmV2aW91cwIAAAAMIGF0IGFkZHJlc3MgCQAEJQAAAAEFAAAAEWdvdmVybmFuY2VBZGRyZXNzBAAAABlyZXdhcmRQb29sRnJhY3Rpb25DdXJyZW50CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAARZ292ZXJuYW5jZUFkZHJlc3MJAAEsAAAAAgUAAAAEcG9vbAUAAAAca2V5UmV3YXJkUG9vbEZyYWN0aW9uQ3VycmVudAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABRObyBkYXRhIG9uIHRoZSBrZXk6IAUAAAAEcG9vbAUAAAAca2V5UmV3YXJkUG9vbEZyYWN0aW9uQ3VycmVudAIAAAAMIGF0IGFkZHJlc3MgCQAEJQAAAAEFAAAAEWdvdmVybmFuY2VBZGRyZXNzBAAAABJyZXdhcmRVcGRhdGVIZWlnaHQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAABFnb3Zlcm5hbmNlQWRkcmVzcwUAAAAVa2V5UmV3YXJkVXBkYXRlSGVpZ2h0CQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABRObyBkYXRhIG9uIHRoZSBrZXk6IAUAAAAVa2V5UmV3YXJkVXBkYXRlSGVpZ2h0AgAAAAwgYXQgYWRkcmVzcyAJAAQlAAAAAQUAAAARZ292ZXJuYW5jZUFkZHJlc3MEAAAAFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAARZ292ZXJuYW5jZUFkZHJlc3MJAAEsAAAAAgUAAAAEcG9vbAUAAAAVa2V5SGVpZ2h0UG9vbEZyYWN0aW9uAAAAAAAAAAAABAAAABpyZXdhcmRQb29sRnJhY3Rpb25QcmV2aW91cwkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAAEWdvdmVybmFuY2VBZGRyZXNzCQABLAAAAAIFAAAABHBvb2wFAAAAHWtleVJld2FyZFBvb2xGcmFjdGlvblByZXZpb3VzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAFE5vIGRhdGEgb24gdGhlIGtleTogBQAAAARwb29sBQAAAB1rZXlSZXdhcmRQb29sRnJhY3Rpb25QcmV2aW91cwIAAAAMIGF0IGFkZHJlc3MgCQAEJQAAAAEFAAAAEWdvdmVybmFuY2VBZGRyZXNzBAAAABFyZXdhcmRQb29sQ3VycmVudAkAAGsAAAADBQAAABp0b3RhbFJld2FyZFBlckJsb2NrQ3VycmVudAUAAAAZcmV3YXJkUG9vbEZyYWN0aW9uQ3VycmVudAUAAAAOdG90YWxWb3RlU2hhcmUEAAAAEnJld2FyZFBvb2xQcmV2aW91cwkAAGsAAAADBQAAABt0b3RhbFJld2FyZFBlckJsb2NrUHJldmlvdXMFAAAAGnJld2FyZFBvb2xGcmFjdGlvblByZXZpb3VzBQAAAA50b3RhbFZvdGVTaGFyZQMDCQAAZgAAAAIFAAAAEXJld2FyZFBvb2xDdXJyZW50BQAAABp0b3RhbFJld2FyZFBlckJsb2NrQ3VycmVudAYJAABmAAAAAgUAAAAScmV3YXJkUG9vbFByZXZpb3VzBQAAABt0b3RhbFJld2FyZFBlckJsb2NrUHJldmlvdXMJAAACAAAAAQIAAABicmV3YXJkUG9vbEN1cnJlbnQgPiB0b3RhbFJld2FyZFBlckJsb2NrQ3VycmVudCBvciByZXdhcmRQb29sUHJldmlvdXMgPiB0b3RhbFJld2FyZFBlckJsb2NrUHJldmlvdXMJAAUWAAAABAUAAAARcmV3YXJkUG9vbEN1cnJlbnQFAAAAEnJld2FyZFVwZGF0ZUhlaWdodAUAAAAScmV3YXJkUG9vbFByZXZpb3VzBQAAABZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0AQAAABNnZXRMYXN0SW50ZXJlc3RJbmZvAAAAAQAAAARwb29sBAAAAAxsYXN0SW50ZXJlc3QJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIFAAAABHBvb2wFAAAAD2tleUxhc3RJbnRlcmVzdAkAASwAAAACCQABLAAAAAICAAAAFE5vIGRhdGEgb24gdGhlIGtleTogBQAAAARwb29sBQAAAA9rZXlMYXN0SW50ZXJlc3QEAAAAEmxhc3RJbnRlcmVzdEhlaWdodAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIFAAAABHBvb2wFAAAAFWtleUxhc3RJbnRlcmVzdEhlaWdodAUAAAAGaGVpZ2h0CQAFFAAAAAIFAAAAEmxhc3RJbnRlcmVzdEhlaWdodAUAAAAMbGFzdEludGVyZXN0AQAAABNnZXRVc2VySW50ZXJlc3RJbmZvAAAAAgAAAARwb29sAAAAC3VzZXJBZGRyZXNzBAAAABB1c2VyTGFzdEludGVyZXN0CQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAABHBvb2wCAAAAAV8JAAQlAAAAAQUAAAALdXNlckFkZHJlc3MFAAAAE2tleVVzZXJMYXN0SW50ZXJlc3QEAAAACXVzZXJTaGFyZQkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAARwb29sAgAAAAFfCQAEJQAAAAEFAAAAC3VzZXJBZGRyZXNzBQAAABhrZXlVc2VyU2hhcmVUb2tlbnNMb2NrZWQEAAAADGxhc3RJbnRlcmVzdAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgUAAAAEcG9vbAUAAAAPa2V5TGFzdEludGVyZXN0CQABLAAAAAIJAAEsAAAAAgIAAAAUTm8gZGF0YSBvbiB0aGUga2V5OiAFAAAABHBvb2wFAAAAD2tleUxhc3RJbnRlcmVzdAQAAAAVdXNlckxhc3RJbnRlcmVzdFZhbHVlBAAAAAckbWF0Y2gwBQAAABB1c2VyTGFzdEludGVyZXN0AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAEHVzZXJMYXN0SW50ZXJlc3QFAAAAByRtYXRjaDAFAAAAEHVzZXJMYXN0SW50ZXJlc3QFAAAADGxhc3RJbnRlcmVzdAQAAAAVdXNlclNoYXJlVG9rZW5zQW1vdW50BAAAAAckbWF0Y2gwBQAAAAl1c2VyU2hhcmUDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAAJdXNlclNoYXJlBQAAAAckbWF0Y2gwBQAAAAl1c2VyU2hhcmUAAAAAAAAAAAAJAAUUAAAAAgUAAAAVdXNlckxhc3RJbnRlcmVzdFZhbHVlBQAAABV1c2VyU2hhcmVUb2tlbnNBbW91bnQBAAAADGNhbGNJbnRlcmVzdAAAAAoAAAASbGFzdEludGVyZXN0SGVpZ2h0AAAAEnJld2FyZFVwZGF0ZUhlaWdodAAAABZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0AAAADGxhc3RJbnRlcmVzdAAAABVjdXJyZW50UmV3YXJkUGVyQmxvY2sAAAAQc2hhcmVUb2tlbkxvY2tlZAAAABZwcmV2aW91c1Jld2FyZFBlckJsb2NrAAAADHNoYXJlQXNzZXRJZAAAAApzY2FsZVZhbHVlAAAACXBtdEFtb3VudAMJAAAAAAAAAgUAAAAQc2hhcmVUb2tlbkxvY2tlZAAAAAAAAAAAAAAAAAAAAAAAAAMJAQAAAAIhPQAAAAIFAAAAFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQAAAAAAAAAAAADAwkAAGYAAAACBQAAABJyZXdhcmRVcGRhdGVIZWlnaHQFAAAABmhlaWdodAkAAAAAAAACBQAAABJyZXdhcmRVcGRhdGVIZWlnaHQFAAAAFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQHBAAAAAZyZXdhcmQJAABoAAAAAgUAAAAWcHJldmlvdXNSZXdhcmRQZXJCbG9jawkAAGUAAAACBQAAAAZoZWlnaHQFAAAAEmxhc3RJbnRlcmVzdEhlaWdodAkAAGQAAAACBQAAAAxsYXN0SW50ZXJlc3QJAABrAAAAAwUAAAAGcmV3YXJkBQAAAApzY2FsZVZhbHVlBQAAABBzaGFyZVRva2VuTG9ja2VkAwMJAABmAAAAAgUAAAAGaGVpZ2h0BQAAABJyZXdhcmRVcGRhdGVIZWlnaHQJAQAAAAIhPQAAAAIFAAAAEnJld2FyZFVwZGF0ZUhlaWdodAUAAAAWcG9vbFJld2FyZFVwZGF0ZUhlaWdodAcEAAAABnJld2FyZAkAAGgAAAACBQAAABZwcmV2aW91c1Jld2FyZFBlckJsb2NrCQAAZQAAAAIFAAAABmhlaWdodAUAAAASbGFzdEludGVyZXN0SGVpZ2h0CQAAZAAAAAIFAAAADGxhc3RJbnRlcmVzdAkAAGsAAAADBQAAAAZyZXdhcmQFAAAACnNjYWxlVmFsdWUFAAAAEHNoYXJlVG9rZW5Mb2NrZWQDAwMJAABmAAAAAgUAAAAGaGVpZ2h0BQAAABJyZXdhcmRVcGRhdGVIZWlnaHQJAAAAAAAAAgUAAAAScmV3YXJkVXBkYXRlSGVpZ2h0BQAAABZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0BwkAAGYAAAACBQAAABJsYXN0SW50ZXJlc3RIZWlnaHQFAAAAEnJld2FyZFVwZGF0ZUhlaWdodAcEAAAABnJld2FyZAkAAGgAAAACBQAAABVjdXJyZW50UmV3YXJkUGVyQmxvY2sJAABlAAAAAgUAAAAGaGVpZ2h0BQAAABJsYXN0SW50ZXJlc3RIZWlnaHQJAABkAAAAAgUAAAAMbGFzdEludGVyZXN0CQAAawAAAAMFAAAABnJld2FyZAUAAAAKc2NhbGVWYWx1ZQUAAAAQc2hhcmVUb2tlbkxvY2tlZAQAAAAqcmV3YXJkQWZ0ZXJMYXN0SW50ZXJlc3RCZWZvcmVSZWF3YXJkVXBkYXRlCQAAaAAAAAIFAAAAFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sJAABlAAAAAgUAAAAScmV3YXJkVXBkYXRlSGVpZ2h0BQAAABJsYXN0SW50ZXJlc3RIZWlnaHQEAAAAE2ludGVyZXN0QWZ0ZXJVcGRhdGUJAABkAAAAAgUAAAAMbGFzdEludGVyZXN0CQAAawAAAAMFAAAAKnJld2FyZEFmdGVyTGFzdEludGVyZXN0QmVmb3JlUmVhd2FyZFVwZGF0ZQUAAAAKc2NhbGVWYWx1ZQUAAAAQc2hhcmVUb2tlbkxvY2tlZAQAAAAGcmV3YXJkCQAAaAAAAAIFAAAAFWN1cnJlbnRSZXdhcmRQZXJCbG9jawkAAGUAAAACBQAAAAZoZWlnaHQFAAAAEnJld2FyZFVwZGF0ZUhlaWdodAkAAGQAAAACBQAAABNpbnRlcmVzdEFmdGVyVXBkYXRlCQAAawAAAAMFAAAABnJld2FyZAUAAAAKc2NhbGVWYWx1ZQUAAAAQc2hhcmVUb2tlbkxvY2tlZAMJAABmAAAAAgUAAAAScmV3YXJkVXBkYXRlSGVpZ2h0BQAAAAZoZWlnaHQEAAAABnJld2FyZAkAAGgAAAACBQAAABZwcmV2aW91c1Jld2FyZFBlckJsb2NrCQAAZQAAAAIFAAAABmhlaWdodAUAAAASbGFzdEludGVyZXN0SGVpZ2h0CQAAZAAAAAIFAAAADGxhc3RJbnRlcmVzdAkAAGsAAAADBQAAAAZyZXdhcmQFAAAACnNjYWxlVmFsdWUFAAAAEHNoYXJlVG9rZW5Mb2NrZWQDCQAAZgAAAAIFAAAAEmxhc3RJbnRlcmVzdEhlaWdodAUAAAAScmV3YXJkVXBkYXRlSGVpZ2h0BAAAAAZyZXdhcmQJAABoAAAAAgUAAAAVY3VycmVudFJld2FyZFBlckJsb2NrCQAAZQAAAAIFAAAABmhlaWdodAUAAAASbGFzdEludGVyZXN0SGVpZ2h0CQAAZAAAAAIFAAAADGxhc3RJbnRlcmVzdAkAAGsAAAADBQAAAAZyZXdhcmQFAAAACnNjYWxlVmFsdWUFAAAAEHNoYXJlVG9rZW5Mb2NrZWQEAAAAKnJld2FyZEFmdGVyTGFzdEludGVyZXN0QmVmb3JlUmVhd2FyZFVwZGF0ZQkAAGgAAAACBQAAABZwcmV2aW91c1Jld2FyZFBlckJsb2NrCQAAZQAAAAIFAAAAEnJld2FyZFVwZGF0ZUhlaWdodAUAAAASbGFzdEludGVyZXN0SGVpZ2h0BAAAABNpbnRlcmVzdEFmdGVyVXBkYXRlCQAAZAAAAAIFAAAADGxhc3RJbnRlcmVzdAkAAGsAAAADBQAAACpyZXdhcmRBZnRlckxhc3RJbnRlcmVzdEJlZm9yZVJlYXdhcmRVcGRhdGUFAAAACnNjYWxlVmFsdWUFAAAAEHNoYXJlVG9rZW5Mb2NrZWQEAAAABnJld2FyZAkAAGgAAAACBQAAABVjdXJyZW50UmV3YXJkUGVyQmxvY2sJAABlAAAAAgUAAAAGaGVpZ2h0BQAAABJyZXdhcmRVcGRhdGVIZWlnaHQJAABkAAAAAgUAAAATaW50ZXJlc3RBZnRlclVwZGF0ZQkAAGsAAAADBQAAAAZyZXdhcmQFAAAACnNjYWxlVmFsdWUFAAAAEHNoYXJlVG9rZW5Mb2NrZWQBAAAACWNsYWltQ2FsYwAAAAMAAAAEcG9vbAAAAAZjYWxsZXIAAAAJcG10QW1vdW50BAAAAAxzaGFyZUFzc2V0SWQJAQAAAA9nZXRTaGFyZUFzc2V0SWQAAAABBQAAAARwb29sBAAAAApzY2FsZVZhbHVlCQEAAAAOY2FsY1NjYWxlVmFsdWUAAAACBQAAAARTV09QBQAAAAxzaGFyZUFzc2V0SWQEAAAAEHNoYXJlVG9rZW5Mb2NrZWQJAQAAABhnZXRUb3RhbFNoYXJlVG9rZW5Mb2NrZWQAAAABBQAAAARwb29sBAAAAA0kdDAxMzE1MzEzMjE4CQEAAAATZ2V0TGFzdEludGVyZXN0SW5mbwAAAAEFAAAABHBvb2wEAAAAEmxhc3RJbnRlcmVzdEhlaWdodAgFAAAADSR0MDEzMTUzMTMyMTgAAAACXzEEAAAADGxhc3RJbnRlcmVzdAgFAAAADSR0MDEzMTUzMTMyMTgAAAACXzIEAAAADSR0MDEzMjIzMTMzMzUJAQAAAApyZXdhcmRJbmZvAAAAAQUAAAAEcG9vbAQAAAAVY3VycmVudFJld2FyZFBlckJsb2NrCAUAAAANJHQwMTMyMjMxMzMzNQAAAAJfMQQAAAAScmV3YXJkVXBkYXRlSGVpZ2h0CAUAAAANJHQwMTMyMjMxMzMzNQAAAAJfMgQAAAAWcHJldmlvdXNSZXdhcmRQZXJCbG9jawgFAAAADSR0MDEzMjIzMTMzMzUAAAACXzMEAAAAFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQIBQAAAA0kdDAxMzIyMzEzMzM1AAAAAl80BAAAAA0kdDAxMzM0MDEzNDE5CQEAAAATZ2V0VXNlckludGVyZXN0SW5mbwAAAAIFAAAABHBvb2wFAAAABmNhbGxlcgQAAAAQdXNlckxhc3RJbnRlcmVzdAgFAAAADSR0MDEzMzQwMTM0MTkAAAACXzEEAAAAFXVzZXJTaGFyZVRva2Vuc0Ftb3VudAgFAAAADSR0MDEzMzQwMTM0MTkAAAACXzIEAAAAD2N1cnJlbnRJbnRlcmVzdAkBAAAADGNhbGNJbnRlcmVzdAAAAAoFAAAAEmxhc3RJbnRlcmVzdEhlaWdodAUAAAAScmV3YXJkVXBkYXRlSGVpZ2h0BQAAABZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0BQAAAAxsYXN0SW50ZXJlc3QFAAAAFWN1cnJlbnRSZXdhcmRQZXJCbG9jawUAAAAQc2hhcmVUb2tlbkxvY2tlZAUAAAAWcHJldmlvdXNSZXdhcmRQZXJCbG9jawUAAAAMc2hhcmVBc3NldElkBQAAAApzY2FsZVZhbHVlBQAAAAlwbXRBbW91bnQEAAAAC2NsYWltQW1vdW50CQAAawAAAAMFAAAAFXVzZXJTaGFyZVRva2Vuc0Ftb3VudAkAAGUAAAACBQAAAA9jdXJyZW50SW50ZXJlc3QFAAAAEHVzZXJMYXN0SW50ZXJlc3QFAAAACnNjYWxlVmFsdWUEAAAAD3VzZXJOZXdJbnRlcmVzdAUAAAAPY3VycmVudEludGVyZXN0CQAFFgAAAAQFAAAAD3VzZXJOZXdJbnRlcmVzdAUAAAAPY3VycmVudEludGVyZXN0BQAAAAtjbGFpbUFtb3VudAUAAAAVdXNlclNoYXJlVG9rZW5zQW1vdW50AQAAABdjYWxjdWxhdGVQcm90b2NvbFJld2FyZAAAAAEAAAAEcG9vbAQAAAANJHQwMTM5MzcxNDAwMgkBAAAAE2dldExhc3RJbnRlcmVzdEluZm8AAAABBQAAAARwb29sBAAAABJsYXN0SW50ZXJlc3RIZWlnaHQIBQAAAA0kdDAxMzkzNzE0MDAyAAAAAl8xBAAAAAxsYXN0SW50ZXJlc3QIBQAAAA0kdDAxMzkzNzE0MDAyAAAAAl8yBAAAAA0kdDAxNDAwNzE0MTE4CQEAAAAKcmV3YXJkSW5mbwAAAAEFAAAABHBvb2wEAAAAFWN1cnJlbnRSZXdhcmRQZXJCbG9jawgFAAAADSR0MDE0MDA3MTQxMTgAAAACXzEEAAAAEnJld2FyZFVwZGF0ZUhlaWdodAgFAAAADSR0MDE0MDA3MTQxMTgAAAACXzIEAAAAFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sIBQAAAA0kdDAxNDAwNzE0MTE4AAAAAl8zBAAAABZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0CAUAAAANJHQwMTQwMDcxNDExOAAAAAJfNAQAAAAQc2hhcmVUb2tlbkxvY2tlZAkBAAAAGGdldFRvdGFsU2hhcmVUb2tlbkxvY2tlZAAAAAEFAAAABHBvb2wDAwkAAAAAAAACBQAAABBzaGFyZVRva2VuTG9ja2VkAAAAAAAAAAAACQAAAAAAAAIFAAAAFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQAAAAAAAAAAAAHAwkAAGYAAAACBQAAABJyZXdhcmRVcGRhdGVIZWlnaHQFAAAABmhlaWdodAQAAAAGcmV3YXJkCQAAaAAAAAIFAAAAFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sJAABlAAAAAgUAAAAGaGVpZ2h0BQAAABJsYXN0SW50ZXJlc3RIZWlnaHQFAAAABnJld2FyZAMJAABmAAAAAgUAAAASbGFzdEludGVyZXN0SGVpZ2h0BQAAABJyZXdhcmRVcGRhdGVIZWlnaHQEAAAABnJld2FyZAkAAGgAAAACBQAAABVjdXJyZW50UmV3YXJkUGVyQmxvY2sJAABlAAAAAgUAAAAGaGVpZ2h0BQAAABJsYXN0SW50ZXJlc3RIZWlnaHQFAAAABnJld2FyZAQAAAAqcmV3YXJkQWZ0ZXJMYXN0SW50ZXJlc3RCZWZvcmVSZWF3YXJkVXBkYXRlCQAAaAAAAAIFAAAAFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sJAABlAAAAAgUAAAAScmV3YXJkVXBkYXRlSGVpZ2h0BQAAABJsYXN0SW50ZXJlc3RIZWlnaHQEAAAABnJld2FyZAkAAGgAAAACBQAAABVjdXJyZW50UmV3YXJkUGVyQmxvY2sJAABlAAAAAgUAAAAGaGVpZ2h0BQAAABJyZXdhcmRVcGRhdGVIZWlnaHQJAABkAAAAAgUAAAAGcmV3YXJkBQAAACpyZXdhcmRBZnRlckxhc3RJbnRlcmVzdEJlZm9yZVJlYXdhcmRVcGRhdGUDAwkAAAAAAAACBQAAABBzaGFyZVRva2VuTG9ja2VkAAAAAAAAAAAACQEAAAACIT0AAAACBQAAABZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0AAAAAAAAAAAABwMDCQAAZgAAAAIFAAAAEnJld2FyZFVwZGF0ZUhlaWdodAUAAAAGaGVpZ2h0CQAAAAAAAAIFAAAAEnJld2FyZFVwZGF0ZUhlaWdodAUAAAAWcG9vbFJld2FyZFVwZGF0ZUhlaWdodAcEAAAABnJld2FyZAkAAGgAAAACBQAAABZwcmV2aW91c1Jld2FyZFBlckJsb2NrCQAAZQAAAAIFAAAABmhlaWdodAUAAAASbGFzdEludGVyZXN0SGVpZ2h0BQAAAAZyZXdhcmQDAwkAAGYAAAACBQAAAAZoZWlnaHQFAAAAEnJld2FyZFVwZGF0ZUhlaWdodAkBAAAAAiE9AAAAAgUAAAAScmV3YXJkVXBkYXRlSGVpZ2h0BQAAABZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0BwQAAAAGcmV3YXJkCQAAaAAAAAIFAAAAFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sJAABlAAAAAgUAAAAGaGVpZ2h0BQAAABJsYXN0SW50ZXJlc3RIZWlnaHQFAAAABnJld2FyZAMDAwkAAGYAAAACBQAAAAZoZWlnaHQFAAAAEnJld2FyZFVwZGF0ZUhlaWdodAkAAAAAAAACBQAAABJyZXdhcmRVcGRhdGVIZWlnaHQFAAAAFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQHCQAAZgAAAAIFAAAAEmxhc3RJbnRlcmVzdEhlaWdodAUAAAAScmV3YXJkVXBkYXRlSGVpZ2h0BwQAAAAGcmV3YXJkCQAAaAAAAAIFAAAAFWN1cnJlbnRSZXdhcmRQZXJCbG9jawkAAGUAAAACBQAAAAZoZWlnaHQFAAAAEmxhc3RJbnRlcmVzdEhlaWdodAUAAAAGcmV3YXJkBAAAACpyZXdhcmRBZnRlckxhc3RJbnRlcmVzdEJlZm9yZVJlYXdhcmRVcGRhdGUJAABoAAAAAgUAAAAWcHJldmlvdXNSZXdhcmRQZXJCbG9jawkAAGUAAAACBQAAABJyZXdhcmRVcGRhdGVIZWlnaHQFAAAAEmxhc3RJbnRlcmVzdEhlaWdodAQAAAAGcmV3YXJkCQAAaAAAAAIFAAAAFWN1cnJlbnRSZXdhcmRQZXJCbG9jawkAAGUAAAACBQAAAAZoZWlnaHQFAAAAEnJld2FyZFVwZGF0ZUhlaWdodAkAAGQAAAACBQAAAAZyZXdhcmQFAAAAKnJld2FyZEFmdGVyTGFzdEludGVyZXN0QmVmb3JlUmVhd2FyZFVwZGF0ZQAAAAAAAAAAAAEAAAAWY2hlY2tQbXRBc3NldElkQ29ycmVjdAAAAAIAAAAEcG9vbAAAAApwbXRBc3NldElkBAAAABBwb29sU2hhcmVBc3NldElkCQACWQAAAAEJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIJAQAAAAV2YWx1ZQAAAAEJAAQmAAAAAQUAAAAEcG9vbAIAAAAOc2hhcmVfYXNzZXRfaWQDCQAAAAAAAAIFAAAACnBtdEFzc2V0SWQFAAAAEHBvb2xTaGFyZUFzc2V0SWQGBwEAAAAYZ2V0VXNlclNXT1BDbGFpbWVkQW1vdW50AAAAAgAAAARwb29sAAAABHVzZXIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAEcG9vbAIAAAABXwkABCUAAAABBQAAAAR1c2VyBQAAABhrZXlVc2VyU1dPUENsYWltZWRBbW91bnQAAAAAAAAAAAABAAAAB3N1c3BlbmQAAAABAAAABWNhdXNlCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAAlrZXlBY3RpdmUHCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAACGtleUNhdXNlBQAAAAVjYXVzZQUAAAADbmlsAAAACAAAAAFpAQAAAARpbml0AAAAAQAAAAdlYXJseUxQAwkBAAAACWlzRGVmaW5lZAAAAAEJAAQdAAAAAgUAAAAEdGhpcwUAAAAJa2V5U1dPUGlkCQAAAgAAAAECAAAAGFNXT1AgYWxyZWFkeSBpbml0aWFsaXplZAQAAAAKaW5pdEFtb3VudAAAAFrzEHpAAAQAAAAJU1dPUGlzc3VlCQAEQgAAAAUCAAAABFNXT1ACAAAAE1NXT1AgcHJvdG9jb2wgdG9rZW4FAAAACmluaXRBbW91bnQAAAAAAAAAAAgGBAAAAAZTV09QaWQJAAQ4AAAAAQUAAAAJU1dPUGlzc3VlCQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACBQAAAAlrZXlBY3RpdmUGCQAETAAAAAIJAARCAAAABQIAAAAEU1dPUAIAAAATU1dPUCBwcm90b2NvbCB0b2tlbgUAAAAKaW5pdEFtb3VudAAAAAAAAAAACAYJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAJa2V5U1dPUGlkCQACWAAAAAEFAAAABlNXT1BpZAUAAAADbmlsAAAAAWkBAAAAFGluaXRQb29sU2hhcmVGYXJtaW5nAAAAAQAAAARwb29sAwkBAAAAAiE9AAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAAK09ubHkgdGhlIERBcHAgaXRzZWxmIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24EAAAADSR0MDE3MTAwMTcyMDMJAQAAAApyZXdhcmRJbmZvAAAAAQUAAAAEcG9vbAQAAAANY3VycmVudFJld2FyZAgFAAAADSR0MDE3MTAwMTcyMDMAAAACXzEEAAAAEnJld2FyZFVwZGF0ZUhlaWdodAgFAAAADSR0MDE3MTAwMTcyMDMAAAACXzIEAAAAFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sIBQAAAA0kdDAxNzEwMDE3MjAzAAAAAl8zBAAAABZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0CAUAAAANJHQwMTcxMDAxNzIwMwAAAAJfNAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAAARwb29sBQAAABRrZXlTaGFyZVRva2Vuc0xvY2tlZAAAAAAAAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACBQAAAARwb29sBQAAAA9rZXlMYXN0SW50ZXJlc3QAAAAAAAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgUAAAAEcG9vbAUAAAAVa2V5TGFzdEludGVyZXN0SGVpZ2h0BQAAAAZoZWlnaHQFAAAAA25pbAAAAAFpAQAAABJ1cGRhdGVQb29sSW50ZXJlc3QAAAABAAAABHBvb2wDCQEAAAACIT0AAAACCAUAAAABaQAAAAZjYWxsZXIFAAAABndhbGxldAkAAAIAAAABAgAAACxPbmx5IHRoZSBBZG1pbiBpdHNlbGYgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAAACAAAAAQIAAAAfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAQAAAANJHQwMTc2MTIxNzczMgkBAAAACWNsYWltQ2FsYwAAAAMFAAAABHBvb2wFAAAAHGFkbWluSW5jcmVhc2VJbnRlcmVzdEFkZHJlc3MAAAAAAAAAAAAEAAAAD3VzZXJOZXdJbnRlcmVzdAgFAAAADSR0MDE3NjEyMTc3MzIAAAACXzEEAAAAD2N1cnJlbnRJbnRlcmVzdAgFAAAADSR0MDE3NjEyMTc3MzIAAAACXzIEAAAAC2NsYWltQW1vdW50CAUAAAANJHQwMTc2MTIxNzczMgAAAAJfMwQAAAAVdXNlclNoYXJlVG9rZW5zQW1vdW50CAUAAAANJHQwMTc2MTIxNzczMgAAAAJfNAQAAAANJHQwMTc3MzcxNzg0MAkBAAAACnJld2FyZEluZm8AAAABBQAAAARwb29sBAAAAA1jdXJyZW50UmV3YXJkCAUAAAANJHQwMTc3MzcxNzg0MAAAAAJfMQQAAAAScmV3YXJkVXBkYXRlSGVpZ2h0CAUAAAANJHQwMTc3MzcxNzg0MAAAAAJfMgQAAAAWcHJldmlvdXNSZXdhcmRQZXJCbG9jawgFAAAADSR0MDE3NzM3MTc4NDAAAAACXzMEAAAAFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQIBQAAAA0kdDAxNzczNzE3ODQwAAAAAl80CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAABHBvb2wFAAAAD2tleUxhc3RJbnRlcmVzdAUAAAAPdXNlck5ld0ludGVyZXN0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAABHBvb2wFAAAAFWtleUxhc3RJbnRlcmVzdEhlaWdodAUAAAAGaGVpZ2h0BQAAAANuaWwAAAABaQEAAAAPbG9ja1NoYXJlVG9rZW5zAAAAAQAAAARwb29sBAAAAA0kdDAxODAzMjE4MTA3CQAFFAAAAAIICQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAAAABmFtb3VudAgJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAHYXNzZXRJZAQAAAAJcG10QW1vdW50CAUAAAANJHQwMTgwMzIxODEwNwAAAAJfMQQAAAAKcG10QXNzZXRJZAgFAAAADSR0MDE4MDMyMTgxMDcAAAACXzIEAAAADSR0MDE4MTEyMTgxODUJAQAAAAxnZXRBc3NldEluZm8AAAABBQAAAApwbXRBc3NldElkBAAAAA1wbXRTdHJBc3NldElkCAUAAAANJHQwMTgxMTIxODE4NQAAAAJfMQQAAAAMcG10QXNzZXROYW1lCAUAAAANJHQwMTgxMTIxODE4NQAAAAJfMgQAAAALcG10RGVjaW1hbHMIBQAAAA0kdDAxODExMjE4MTg1AAAAAl8zBAAAAA0kdDAxODE5MDE4Mjk4CQEAAAAJY2xhaW1DYWxjAAAAAwUAAAAEcG9vbAgFAAAAAWkAAAAGY2FsbGVyBQAAAAlwbXRBbW91bnQEAAAAD3VzZXJOZXdJbnRlcmVzdAgFAAAADSR0MDE4MTkwMTgyOTgAAAACXzEEAAAAD2N1cnJlbnRJbnRlcmVzdAgFAAAADSR0MDE4MTkwMTgyOTgAAAACXzIEAAAAC2NsYWltQW1vdW50CAUAAAANJHQwMTgxOTAxODI5OAAAAAJfMwQAAAAVdXNlclNoYXJlVG9rZW5zQW1vdW50CAUAAAANJHQwMTgxOTAxODI5OAAAAAJfNAQAAAASdXNlclNoYXJlQW1vdW50TmV3CQAAZAAAAAIFAAAAFXVzZXJTaGFyZVRva2Vuc0Ftb3VudAUAAAAJcG10QW1vdW50BAAAABFhdmFpbGFibGVGdW5kc05ldwkAAGQAAAACCQEAAAARdXNlckF2YWlsYWJsZVNXT1AAAAACBQAAAARwb29sCAUAAAABaQAAAAZjYWxsZXIFAAAAC2NsYWltQW1vdW50BAAAABB0b3RhbFNoYXJlQW1vdW50CQEAAAAYZ2V0VG90YWxTaGFyZVRva2VuTG9ja2VkAAAAAQUAAAAEcG9vbAQAAAATdG90YWxTaGFyZUFtb3VudE5ldwkAAGQAAAACBQAAABB0b3RhbFNoYXJlQW1vdW50BQAAAAlwbXRBbW91bnQEAAAAEXVzZXJDbGFpbWVkQW1vdW50CQEAAAAYZ2V0VXNlclNXT1BDbGFpbWVkQW1vdW50AAAAAgUAAAAEcG9vbAgFAAAAAWkAAAAGY2FsbGVyBAAAABR1c2VyQ2xhaW1lZEFtb3VudE5ldwkAAGQAAAACBQAAABF1c2VyQ2xhaW1lZEFtb3VudAUAAAALY2xhaW1BbW91bnQEAAAACWJhc2VFbnRyeQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAEcG9vbAIAAAABXwkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAAE2tleVVzZXJMYXN0SW50ZXJlc3QFAAAAD3VzZXJOZXdJbnRlcmVzdAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAEcG9vbAIAAAABXwkABCUAAAABCAUAAAABaQAAAAZj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RW50cnkJAAACAAAAAQkAASwAAAACAgAAABxZb3VyIG1heGltdW0gc2hhcmUgdG9rZW4gaXMgCQABpAAAAAEFAAAACnNoYXJlVG9rZW4JAAACAAAAAQIAAAAVWW91IGNhbid0IHNoYXJlIHRva2VuCQAAAgAAAAECAAAAIFlvdXIgYW1vdW50IG9mIHRva2VuIGxlc3MgdGhhbiAwBQAAAAliYXNlRW50cnkAAAABaQEAAAATd2l0aGRyYXdTaGFyZVRva2VucwAAAAIAAAAEcG9vbAAAABlzaGFyZVRva2Vuc1dpdGhkcmF3QW1vdW50BAAAAA1zaGFyZVRva2Vuc0lkCQACWQAAAAEJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIJAQAAAAV2YWx1ZQAAAAEJAAQmAAAAAQUAAAAEcG9vbAIAAAAOc2hhcmVfYXNzZXRfaWQEAAAADSR0MDIyNzQ3MjI4NDcJAQAAAAljbGFpbUNhbGMAAAADBQAAAARwb29sCAUAAAABaQAAAAZjYWxsZXIAAAAAAAAAAAEEAAAAD3VzZXJOZXdJbnRlcmVzdAgFAAAADSR0MDIyNzQ3MjI4NDcAAAACXzEEAAAAD2N1cnJlbnRJbnRlcmVzdAgFAAAADSR0MDIyNzQ3MjI4NDcAAAACXzIEAAAAC2NsYWltQW1vdW50CAUAAAANJHQwMjI3NDcyMjg0NwAAAAJfMwQAAAAVdXNlclNoYXJlVG9rZW5zQW1vdW50CAUAAAANJHQwMjI3NDcyMjg0NwAAAAJfNAQAAAASdXNlclNoYXJlQW1vdW50TmV3CQAAZQAAAAIFAAAAFXVzZXJTaGFyZVRva2Vuc0Ftb3VudAUAAAAZc2hhcmVUb2tlbnNXaXRoZHJhd0Ftb3VudAQAAAARYXZhaWxhYmxlRnVuZHNOZXcJAABkAAAAAgkBAAAAEXVzZXJBdmFpbGFibGVTV09QAAAAAgUAAAAEcG9vbAgFAAAAAWkAAAAGY2FsbGVyBQAAAAtjbGFpbUFtb3VudAQAAAAQdG90YWxTaGFyZUFtb3VudAkBAAAAGGdldFRvdGFsU2hhcmVUb2tlbkxvY2tlZAAAAAEFAAAABHBvb2wEAAAAE3RvdGFsU2hhcmVBbW91bnROZXcJAABlAAAAAgUAAAAQdG90YWxTaGFyZUFtb3VudAUAAAAZc2hhcmVUb2tlbnNXaXRoZHJhd0Ftb3VudAQAAAARdXNlckNsYWltZWRBbW91bnQJAQAAABhnZXRVc2VyU1dPUENsYWltZWRBbW91bnQAAAACBQAAAARwb29sCAUAAAABaQAAAAZjYWxsZXIEAAAAFHVzZXJDbGFpbWVkQW1vdW50TmV3CQAAZAAAAAIFAAAAEXVzZXJDbGFpbWVkQW1vdW50BQAAAAtjbGFpbUFtb3VudAMJAABmAAAAAgUAAAAZc2hhcmVUb2tlbnNXaXRoZHJhd0Ftb3VudAUAAAAVdXNlclNoYXJlVG9rZW5zQW1vdW50CQAAAgAAAAECAAAALFdpdGhkcmF3IGFtb3VudCBtb3JlIHRoZW4gdXNlciBsb2NrZWQgYW1vdW50AwkBAAAAASEAAAABBQAAAAhpc0FjdGl2ZQkAAAIAAAABAgAAAB9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkAAGYAAAACBQAAABlzaGFyZVRva2Vuc1dpdGhkcmF3QW1vdW50BQAAABV1c2VyU2hhcmVUb2tlbnNBbW91bnQJAAACAAAAAQIAAAAsV2l0aGRyYXcgYW1vdW50IG1vcmUgdGhlbiB1c2VyIGxvY2tlZCBhbW91bnQDCQAAZgAAAAIJAABrAAAAAwAAAAAAAAAAYwkAAGUAAAACCQEAAAAOYWNjb3VudEJhbGFuY2UAAAABBQAAAA1zaGFyZVRva2Vuc0lkBQAAABlzaGFyZVRva2Vuc1dpdGhkcmF3QW1vdW50AAAAAAAAAABkBQAAABN0b3RhbFNoYXJlQW1vdW50TmV3CQAAAgAAAAECAAAAMkJhbGFuY2Ugb2Ygc2hhcmUtdG9rZW4gaXMgZ3JlYXRlciB0aGFuIHRvdGFsQW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAARwb29sAgAAAAFfCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgUAAAATa2V5VXNlckxhc3RJbnRlcmVzdAUAAAAPdXNlck5ld0ludGVyZXN0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAARwb29sAgAAAAFfCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgUAAAAYa2V5VXNlclNoYXJlVG9rZW5zTG9ja2VkBQAAABJ1c2VyU2hhcmVBbW91bnROZXcJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgUAAAAEcG9vbAUAAAAPa2V5TGFzdEludGVyZXN0BQAAAA9jdXJyZW50SW50ZXJlc3QJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgUAAAAEcG9vbAUAAAAVa2V5TGFzdEludGVyZXN0SGVpZ2h0BQAAAAZoZWlnaHQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgUAAAAEcG9vbAUAAAAUa2V5U2hhcmVUb2tlbnNMb2NrZWQFAAAAE3RvdGFsU2hhcmVBbW91bnROZXcJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAABHBvb2wCAAAAAV8JAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBQAAABBrZXlBdmFpbGFibGVTV09QBQAAABFhdmFpbGFibGVGdW5kc05ldwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAEcG9vbAIAAAABXwkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAAGGtleVVzZXJTV09QQ2xhaW1lZEFtb3VudAUAAAAUdXNlckNsYWltZWRBbW91bnROZXcJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAABHBvb2wCAAAAAV8JAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBQAAABxrZXlVc2VyU1dPUExhc3RDbGFpbWVkQW1vdW50BQAAAAtjbGFpbUFtb3VudAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIFAAAAGXNoYXJlVG9rZW5zV2l0aGRyYXdBbW91bnQFAAAADXNoYXJlVG9rZW5zSWQFAAAAA25pbAAAAAFpAQAAAAVjbGFpbQAAAAEAAAAEcG9vbAQAAAANc2hhcmVUb2tlbnNJZAkAAlkAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACCQEAAAAFdmFsdWUAAAABCQAEJgAAAAEFAAAABHBvb2wCAAAADnNoYXJlX2Fzc2V0X2lkBAAAABBzaGFyZVRva2VuTG9ja2VkCQEAAAAYZ2V0VG90YWxTaGFyZVRva2VuTG9ja2VkAAAAAQUAAAAEcG9vbAQAAAANJHQwMjQ4NTQyNDkxOQkBAAAAE2dldExhc3RJbnRlcmVzdEluZm8AAAABBQAAAARwb29sBAAAABJsYXN0SW50ZXJlc3RIZWlnaHQIBQAAAA0kdDAyNDg1NDI0OTE5AAAAAl8xBAAAAAxsYXN0SW50ZXJlc3QIBQAAAA0kdDAyNDg1NDI0OTE5AAAAAl8yBAAAAA0kdDAyNDkyNDI1MDM2CQEAAAAKcmV3YXJkSW5mbwAAAAEFAAAABHBvb2wEAAAAFWN1cnJlbnRSZXdhcmRQZXJCbG9jawgFAAAADSR0MDI0OTI0MjUwMzYAAAACXzEEAAAAEnJld2FyZFVwZGF0ZUhlaWdodAgFAAAADSR0MDI0OTI0MjUwMzYAAAACXzIEAAAAFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sIBQAAAA0kdDAyNDkyNDI1MDM2AAAAAl8zBAAAABZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0CAUAAAANJHQwMjQ5MjQyNTAzNgAAAAJfNAQAAAANJHQwMjUwNDEyNTE0MQkBAAAACWNsYWltQ2FsYwAAAAMFAAAABHBvb2wIBQAAAAFpAAAABmNhbGxlcgAAAAAAAAAAAQQAAAAPdXNlck5ld0ludGVyZXN0CAUAAAANJHQwMjUwNDEyNTE0MQAAAAJfMQQAAAAPY3VycmVudEludGVyZXN0CAUAAAANJHQwMjUwNDEyNTE0MQAAAAJfMgQAAAALY2xhaW1BbW91bnQIBQAAAA0kdDAyNTA0MTI1MTQxAAAAAl8zBAAAABV1c2VyU2hhcmVUb2tlbnNBbW91bnQIBQAAAA0kdDAyNTA0MTI1MTQxAAAAAl80BAAAAA1hdmFpbGFibGVGdW5kCQAAZAAAAAIJAQAAABF1c2VyQXZhaWxhYmxlU1dPUAAAAAIFAAAABHBvb2wIBQAAAAFpAAAA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", "height": 1696107, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7oevs9tJzSVF8f3yh7xbMQVwWcWtHhDeRmXg54hghRC5 Next: C2GvkZtKw4oijeRBvDoRAZHxPho3PTG3mswyTnwVDTC1 Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let adminPubKey1 = base58'GFmKZ2naZFRoCvNbwKAQVGmLb1uBeWGDgFabdGBuZiuy'
5+
6+let adminPubKey2 = base58'GmJXRyhRA79g8yUGgKBAVdnFfQFDMjQG98b1MmLDh5kk'
7+
8+let adminPubKey3 = base58'CFhbV6h41hVjbGHudGtS3fYUv7QAKRxFQzKNtx4B5PqP'
9+
410 let keyShareTokensLocked = "_total_share_tokens_locked"
511
612 let kShareLimit = "share_limit_on_first_harvest"
9096 let scaleValue8 = 100000000
9197
9298 let scaleValue11 = 100000000000
93-
94-let keyAdminPubKey1 = "admin_pub_1"
95-
96-let keyAdminPubKey2 = "admin_pub_2"
97-
98-let keyAdminPubKey3 = "admin_pub_3"
99-
100-let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
101-
102-func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
103- case string: String =>
104- fromBase58String(string)
105- case nothing =>
106- throw("Admin public key is empty")
107-}
108-
109-
110-let adminPubKey1 = getAdminPub(keyAdminPubKey1)
111-
112-let adminPubKey2 = getAdminPub(keyAdminPubKey2)
113-
114-let adminPubKey3 = getAdminPub(keyAdminPubKey3)
11599
116100 func strAssetIdA (pool) = getStringValue(pool, keyAssetIdA)
117101
231215 let assetId1Decimals = value(assetInfo(assetId1)).decimals
232216 let assetId2Decimals = value(assetInfo(assetId2)).decimals
233217 let scaleDigits = ((assetId2Decimals - assetId1Decimals) + 8)
234- pow(10, 0, scaleDigits, 0, 0, FLOOR)
218+ pow(10, 0, scaleDigits, 0, 0, HALFDOWN)
235219 }
236220
237221
238-func userAvailableSWOP (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + user) + keyAvailableSWOP)), 0)
222+func userAvailableSWOP (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + toString(user)) + keyAvailableSWOP)), 0)
239223
240224
241225 func rewardInfo (pool) = {
262246 }
263247
264248
265-func getUserInterestInfo (pool,userAddrStr) = {
266- let userLastInterest = getInteger(this, (((pool + "_") + userAddrStr) + keyUserLastInterest))
267- let userShare = getInteger(this, (((pool + "_") + userAddrStr) + keyUserShareTokensLocked))
249+func getUserInterestInfo (pool,userAddress) = {
250+ let userLastInterest = getInteger(this, (((pool + "_") + toString(userAddress)) + keyUserLastInterest))
251+ let userShare = getInteger(this, (((pool + "_") + toString(userAddress)) + keyUserShareTokensLocked))
268252 let lastInterest = valueOrErrorMessage(getInteger(this, (pool + keyLastInterest)), (("No data on the key: " + pool) + keyLastInterest))
269253 let userLastInterestValue = match userLastInterest {
270254 case userLastInterest: Int =>
282266 }
283267
284268
285-func calcInterest (lastInterestHeight,rewardUpdateHeight,poolRewardUpdateHeight,lastInterest,currentRewardPerBlock,shareTokenLocked,previousRewardPerBlock,scaleValue,h) = if ((shareTokenLocked == 0))
269+func calcInterest (lastInterestHeight,rewardUpdateHeight,poolRewardUpdateHeight,lastInterest,currentRewardPerBlock,shareTokenLocked,previousRewardPerBlock,shareAssetId,scaleValue,pmtAmount) = if ((shareTokenLocked == 0))
286270 then 0
287271 else if ((poolRewardUpdateHeight != 0))
288- then if (if ((rewardUpdateHeight > h))
272+ then if (if ((rewardUpdateHeight > height))
289273 then (rewardUpdateHeight == poolRewardUpdateHeight)
290274 else false)
291275 then {
292- let reward = (previousRewardPerBlock * (h - lastInterestHeight))
276+ let reward = (previousRewardPerBlock * (height - lastInterestHeight))
293277 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
294278 }
295- else if (if ((h > rewardUpdateHeight))
279+ else if (if ((height > rewardUpdateHeight))
296280 then (rewardUpdateHeight != poolRewardUpdateHeight)
297281 else false)
298282 then {
299- let reward = (previousRewardPerBlock * (h - lastInterestHeight))
283+ let reward = (previousRewardPerBlock * (height - lastInterestHeight))
300284 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
301285 }
302- else if (if (if ((h > rewardUpdateHeight))
286+ else if (if (if ((height > rewardUpdateHeight))
303287 then (rewardUpdateHeight == poolRewardUpdateHeight)
304288 else false)
305289 then (lastInterestHeight > rewardUpdateHeight)
306290 else false)
307291 then {
308- let reward = (currentRewardPerBlock * (h - lastInterestHeight))
292+ let reward = (currentRewardPerBlock * (height - lastInterestHeight))
309293 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
310294 }
311295 else {
312296 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
313297 let interestAfterUpdate = (lastInterest + fraction(rewardAfterLastInterestBeforeReawardUpdate, scaleValue, shareTokenLocked))
314- let reward = (currentRewardPerBlock * (h - rewardUpdateHeight))
298+ let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
315299 (interestAfterUpdate + fraction(reward, scaleValue, shareTokenLocked))
316300 }
317- else if ((rewardUpdateHeight > h))
301+ else if ((rewardUpdateHeight > height))
318302 then {
319- let reward = (previousRewardPerBlock * (h - lastInterestHeight))
303+ let reward = (previousRewardPerBlock * (height - lastInterestHeight))
320304 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
321305 }
322306 else if ((lastInterestHeight > rewardUpdateHeight))
323307 then {
324- let reward = (currentRewardPerBlock * (h - lastInterestHeight))
308+ let reward = (currentRewardPerBlock * (height - lastInterestHeight))
325309 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
326310 }
327311 else {
328312 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
329313 let interestAfterUpdate = (lastInterest + fraction(rewardAfterLastInterestBeforeReawardUpdate, scaleValue, shareTokenLocked))
330- let reward = (currentRewardPerBlock * (h - rewardUpdateHeight))
314+ let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
331315 (interestAfterUpdate + fraction(reward, scaleValue, shareTokenLocked))
332316 }
333317
334318
335-func claimCalc (pool,userAddrStr,h) = {
319+func claimCalc (pool,caller,pmtAmount) = {
336320 let shareAssetId = getShareAssetId(pool)
337321 let scaleValue = calcScaleValue(SWOP, shareAssetId)
338322 let shareTokenLocked = getTotalShareTokenLocked(pool)
339- let $t01334413409 = getLastInterestInfo(pool)
340- let lastInterestHeight = $t01334413409._1
341- let lastInterest = $t01334413409._2
342- let $t01341413526 = rewardInfo(pool)
343- let currentRewardPerBlock = $t01341413526._1
344- let rewardUpdateHeight = $t01341413526._2
345- let previousRewardPerBlock = $t01341413526._3
346- let poolRewardUpdateHeight = $t01341413526._4
347- let $t01353113615 = getUserInterestInfo(pool, userAddrStr)
348- let userLastInterest = $t01353113615._1
349- let userShareTokensAmount = $t01353113615._2
350- let currentInterest = calcInterest(lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, lastInterest, currentRewardPerBlock, shareTokenLocked, previousRewardPerBlock, scaleValue, h)
351- let claimAmount = fraction(userShareTokensAmount, (currentInterest - userLastInterest), scaleValue)
352- let userNewInterest = currentInterest
353- $Tuple4(userNewInterest, currentInterest, claimAmount, userShareTokensAmount)
354- }
355-
356-
357-func claimCalcForMigration (pool,userAddrStr,h) = {
358- let shareAssetId = getShareAssetId(pool)
359- let scaleValue = calcScaleValue(SWOP, shareAssetId)
360- let shareTokenLocked = getTotalShareTokenLocked(pool)
361- let $t01433814403 = getLastInterestInfo(pool)
362- let lastInterestHeight = $t01433814403._1
363- let lastInterest = $t01433814403._2
364- let $t01440814520 = rewardInfo(pool)
365- let currentRewardPerBlock = $t01440814520._1
366- let rewardUpdateHeight = $t01440814520._2
367- let previousRewardPerBlock = $t01440814520._3
368- let poolRewardUpdateHeight = $t01440814520._4
369- let $t01452514609 = getUserInterestInfo(pool, userAddrStr)
370- let userLastInterest = $t01452514609._1
371- let userShareTokensAmount = $t01452514609._2
372- let currentInterest = calcInterest(lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, lastInterest, currentRewardPerBlock, shareTokenLocked, previousRewardPerBlock, scaleValue, h)
323+ let $t01315313218 = getLastInterestInfo(pool)
324+ let lastInterestHeight = $t01315313218._1
325+ let lastInterest = $t01315313218._2
326+ let $t01322313335 = rewardInfo(pool)
327+ let currentRewardPerBlock = $t01322313335._1
328+ let rewardUpdateHeight = $t01322313335._2
329+ let previousRewardPerBlock = $t01322313335._3
330+ let poolRewardUpdateHeight = $t01322313335._4
331+ let $t01334013419 = getUserInterestInfo(pool, caller)
332+ let userLastInterest = $t01334013419._1
333+ let userShareTokensAmount = $t01334013419._2
334+ let currentInterest = calcInterest(lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, lastInterest, currentRewardPerBlock, shareTokenLocked, previousRewardPerBlock, shareAssetId, scaleValue, pmtAmount)
373335 let claimAmount = fraction(userShareTokensAmount, (currentInterest - userLastInterest), scaleValue)
374336 let userNewInterest = currentInterest
375337 $Tuple4(userNewInterest, currentInterest, claimAmount, userShareTokensAmount)
377339
378340
379341 func calculateProtocolReward (pool) = {
380- let $t01511315178 = getLastInterestInfo(pool)
381- let lastInterestHeight = $t01511315178._1
382- let lastInterest = $t01511315178._2
383- let $t01518315294 = rewardInfo(pool)
384- let currentRewardPerBlock = $t01518315294._1
385- let rewardUpdateHeight = $t01518315294._2
386- let previousRewardPerBlock = $t01518315294._3
387- let poolRewardUpdateHeight = $t01518315294._4
342+ let $t01393714002 = getLastInterestInfo(pool)
343+ let lastInterestHeight = $t01393714002._1
344+ let lastInterest = $t01393714002._2
345+ let $t01400714118 = rewardInfo(pool)
346+ let currentRewardPerBlock = $t01400714118._1
347+ let rewardUpdateHeight = $t01400714118._2
348+ let previousRewardPerBlock = $t01400714118._3
349+ let poolRewardUpdateHeight = $t01400714118._4
388350 let shareTokenLocked = getTotalShareTokenLocked(pool)
389351 if (if ((shareTokenLocked == 0))
390352 then (poolRewardUpdateHeight == 0)
447409 }
448410
449411
450-func getUserSWOPClaimedAmount (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + user) + keyUserSWOPClaimedAmount)), 0)
412+func getUserSWOPClaimedAmount (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + toString(user)) + keyUserSWOPClaimedAmount)), 0)
451413
452414
453415 func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
469431 func initPoolShareFarming (pool) = if ((i.caller != this))
470432 then throw("Only the DApp itself can call this function")
471433 else {
472- let $t01826418367 = rewardInfo(pool)
473- let currentReward = $t01826418367._1
474- let rewardUpdateHeight = $t01826418367._2
475- let previousRewardPerBlock = $t01826418367._3
476- let poolRewardUpdateHeight = $t01826418367._4
434+ let $t01710017203 = rewardInfo(pool)
435+ let currentReward = $t01710017203._1
436+ let rewardUpdateHeight = $t01710017203._2
437+ let previousRewardPerBlock = $t01710017203._3
438+ let poolRewardUpdateHeight = $t01710017203._4
477439 [IntegerEntry((pool + keyShareTokensLocked), 0), IntegerEntry((pool + keyLastInterest), 0), IntegerEntry((pool + keyLastInterestHeight), height)]
478440 }
479441
485447 else if (!(isActive))
486448 then throw("DApp is inactive at this moment")
487449 else {
488- let $t01877618912 = claimCalc(pool, toString(adminIncreaseInterestAddress), height)
489- let userNewInterest = $t01877618912._1
490- let currentInterest = $t01877618912._2
491- let claimAmount = $t01877618912._3
492- let userShareTokensAmount = $t01877618912._4
493- let $t01891719020 = rewardInfo(pool)
494- let currentReward = $t01891719020._1
495- let rewardUpdateHeight = $t01891719020._2
496- let previousRewardPerBlock = $t01891719020._3
497- let poolRewardUpdateHeight = $t01891719020._4
450+ let $t01761217732 = claimCalc(pool, adminIncreaseInterestAddress, 0)
451+ let userNewInterest = $t01761217732._1
452+ let currentInterest = $t01761217732._2
453+ let claimAmount = $t01761217732._3
454+ let userShareTokensAmount = $t01761217732._4
455+ let $t01773717840 = rewardInfo(pool)
456+ let currentReward = $t01773717840._1
457+ let rewardUpdateHeight = $t01773717840._2
458+ let previousRewardPerBlock = $t01773717840._3
459+ let poolRewardUpdateHeight = $t01773717840._4
498460 [IntegerEntry((pool + keyLastInterest), userNewInterest), IntegerEntry((pool + keyLastInterestHeight), height)]
499461 }
500462
502464
503465 @Callable(i)
504466 func lockShareTokens (pool) = {
505- let userAddrStr = toString(i.caller)
506- let $t01925419329 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
507- let pmtAmount = $t01925419329._1
508- let pmtAssetId = $t01925419329._2
509- let $t01933419407 = getAssetInfo(pmtAssetId)
510- let pmtStrAssetId = $t01933419407._1
511- let pmtAssetName = $t01933419407._2
512- let pmtDecimals = $t01933419407._3
513- let $t01941219528 = claimCalc(pool, toString(i.caller), height)
514- let userNewInterest = $t01941219528._1
515- let currentInterest = $t01941219528._2
516- let claimAmount = $t01941219528._3
517- let userShareTokensAmount = $t01941219528._4
467+ let $t01803218107 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
468+ let pmtAmount = $t01803218107._1
469+ let pmtAssetId = $t01803218107._2
470+ let $t01811218185 = getAssetInfo(pmtAssetId)
471+ let pmtStrAssetId = $t01811218185._1
472+ let pmtAssetName = $t01811218185._2
473+ let pmtDecimals = $t01811218185._3
474+ let $t01819018298 = claimCalc(pool, i.caller, pmtAmount)
475+ let userNewInterest = $t01819018298._1
476+ let currentInterest = $t01819018298._2
477+ let claimAmount = $t01819018298._3
478+ let userShareTokensAmount = $t01819018298._4
518479 let userShareAmountNew = (userShareTokensAmount + pmtAmount)
519- let availableFundsNew = (userAvailableSWOP(pool, toString(i.caller)) + claimAmount)
480+ let availableFundsNew = (userAvailableSWOP(pool, i.caller) + claimAmount)
520481 let totalShareAmount = getTotalShareTokenLocked(pool)
521482 let totalShareAmountNew = (totalShareAmount + pmtAmount)
522- let userClaimedAmount = getUserSWOPClaimedAmount(pool, toString(i.caller))
483+ let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
523484 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
524- let baseEntry = [IntegerEntry((((pool + "_") + userAddrStr) + keyUserLastInterest), userNewInterest), IntegerEntry((((pool + "_") + userAddrStr) + keyUserShareTokensLocked), userShareAmountNew), IntegerEntry((pool + keyShareTokensLocked), totalShareAmountNew), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + userAddrStr) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + userAddrStr) + keyUserSWOPLastClaimedAmount), claimAmount), IntegerEntry((((pool + "_") + userAddrStr) + keyAvailableSWOP), availableFundsNew)]
485+ 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)]
525486 if ((0 >= pmtAmount))
526487 then throw("You can't lock token")
527488 else if (!(isActive))
533494 else false)
534495 then {
535496 let harvestPeriod = ((((getHeightFirstHarvest(Address(fromBase58String(pool))) - startHeight) + 1) / periodLength) - 1)
536- let amountOfVoting = split(getStringValue(votingAddress, (((userAddrStr + "_") + pool) + "_user_pool_struc")), "_")
497+ let amountOfVoting = split(getStringValue(votingAddress, (((toString(i.caller) + "_") + pool) + "_user_pool_struc")), "_")
537498 let amountPoolStract = split(getStringValue(votingAddress, (pool + "_pool_struc")), "_")
538- let amountActiveVoteUserPoolStract = split(valueOrElse(getString(votingAddress, (((userAddrStr + "_") + pool) + kHarvestUserPoolActiveVoteStrucVoting)), ""), "_")
499+ let amountActiveVoteUserPoolStract = split(valueOrElse(getString(votingAddress, (((toString(i.caller) + "_") + pool) + kHarvestUserPoolActiveVoteStrucVoting)), ""), "_")
539500 let amountPoolActiveVoteStract = split(valueOrElse(getString(votingAddress, (pool + kHarvestPoolActiveVoteStrucVoting)), ""), "_")
540501 let userShareTokenLocked = userShareTokensAmount
541502 let userPoolActiveVote = if ((toString(currPeriod) == amountOfVoting[2]))
559520 then if ((fraction(99, (accountBalance(pmtAssetId) + pmtAmount), 100) > totalShareAmountNew))
560521 then throw("Balance of share-token is greater than totalAmount")
561522 else if ((totalShareAmount == 0))
562- then (baseEntry ++ [ScriptTransfer(wallet, protocolReward, SWOP)])
523+ then (baseEntry ++ [Reissue(SWOP, protocolReward, true), ScriptTransfer(wallet, protocolReward, SWOP)])
563524 else if ((shareToken >= pmtAmount))
564525 then baseEntry
565526 else throw(("Your maximum share token is " + toString(shareToken)))
575536 @Callable(i)
576537 func withdrawShareTokens (pool,shareTokensWithdrawAmount) = {
577538 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
578- let $t02394424060 = claimCalc(pool, toString(i.caller), height)
579- let userNewInterest = $t02394424060._1
580- let currentInterest = $t02394424060._2
581- let claimAmount = $t02394424060._3
582- let userShareTokensAmount = $t02394424060._4
539+ let $t02274722847 = claimCalc(pool, i.caller, 1)
540+ let userNewInterest = $t02274722847._1
541+ let currentInterest = $t02274722847._2
542+ let claimAmount = $t02274722847._3
543+ let userShareTokensAmount = $t02274722847._4
583544 let userShareAmountNew = (userShareTokensAmount - shareTokensWithdrawAmount)
584- let availableFundsNew = (userAvailableSWOP(pool, toString(i.caller)) + claimAmount)
545+ let availableFundsNew = (userAvailableSWOP(pool, i.caller) + claimAmount)
585546 let totalShareAmount = getTotalShareTokenLocked(pool)
586547 let totalShareAmountNew = (totalShareAmount - shareTokensWithdrawAmount)
587- let userClaimedAmount = getUserSWOPClaimedAmount(pool, toString(i.caller))
548+ let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
588549 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
589550 if ((shareTokensWithdrawAmount > userShareTokensAmount))
590551 then throw("Withdraw amount more then user locked amount")
600561
601562
602563 @Callable(i)
603-func egg0 (pool,users) = {
604- func updateUser (accum,u) = {
605- let r = invoke(this, "egg1", [pool, u], nil)
606- if ((r == r))
607- then (accum :+ BooleanEntry((u + "_migration"), true))
608- else throw("Strict value is not equal to itself.")
609- }
610-
611- let $list2611926150 = users
612- let $size2611926150 = size($list2611926150)
613- let $acc02611926150 = nil
614- if (($size2611926150 == 0))
615- then $acc02611926150
616- else {
617- let $acc12611926150 = updateUser($acc02611926150, $list2611926150[0])
618- if (($size2611926150 == 1))
619- then $acc12611926150
620- else {
621- let $acc22611926150 = updateUser($acc12611926150, $list2611926150[1])
622- if (($size2611926150 == 2))
623- then $acc22611926150
624- else {
625- let $acc32611926150 = updateUser($acc22611926150, $list2611926150[2])
626- if (($size2611926150 == 3))
627- then $acc32611926150
628- else {
629- let $acc42611926150 = updateUser($acc32611926150, $list2611926150[3])
630- if (($size2611926150 == 4))
631- then $acc42611926150
632- else {
633- let $acc52611926150 = updateUser($acc42611926150, $list2611926150[4])
634- if (($size2611926150 == 5))
635- then $acc52611926150
636- else {
637- let $acc62611926150 = updateUser($acc52611926150, $list2611926150[5])
638- if (($size2611926150 == 6))
639- then $acc62611926150
640- else {
641- let $acc72611926150 = updateUser($acc62611926150, $list2611926150[6])
642- if (($size2611926150 == 7))
643- then $acc72611926150
644- else {
645- let $acc82611926150 = updateUser($acc72611926150, $list2611926150[7])
646- if (($size2611926150 == 8))
647- then $acc82611926150
648- else {
649- let $acc92611926150 = updateUser($acc82611926150, $list2611926150[8])
650- if (($size2611926150 == 9))
651- then $acc92611926150
652- else {
653- let $acc102611926150 = updateUser($acc92611926150, $list2611926150[9])
654- if (($size2611926150 == 10))
655- then $acc102611926150
656- else {
657- let $acc112611926150 = updateUser($acc102611926150, $list2611926150[10])
658- if (($size2611926150 == 11))
659- then $acc112611926150
660- else {
661- let $acc122611926150 = updateUser($acc112611926150, $list2611926150[11])
662- if (($size2611926150 == 12))
663- then $acc122611926150
664- else {
665- let $acc132611926150 = updateUser($acc122611926150, $list2611926150[12])
666- throw("List size exceed 12")
667- }
668- }
669- }
670- }
671- }
672- }
673- }
674- }
675- }
676- }
677- }
678- }
679- }
680- }
681-
682-
683-
684-@Callable(i)
685-func egg1 (pool,u) = {
686- let migrationHeight = 1694115
687- let shareTokenMultiplyer = 1000
688- let $t02632326435 = claimCalc(pool, u, migrationHeight)
689- let userNewInterest = $t02632326435._1
690- let currentInterest = $t02632326435._2
691- let claimAmount = $t02632326435._3
692- let userShareTokensAmount = $t02632326435._4
693- let availableFundsNew = (userAvailableSWOP(pool, u) + claimAmount)
694- let userClaimedAmount = getUserSWOPClaimedAmount(pool, u)
695- let userClaimedAmountNew = (userClaimedAmount + claimAmount)
696- let userShareTokensAmountNew = (userShareTokensAmount * shareTokenMultiplyer)
697-[IntegerEntry((((pool + "_") + u) + keyUserLastInterest), 0), IntegerEntry((((pool + "_") + u) + keyUserShareTokensLocked), userShareTokensAmountNew), IntegerEntry((((pool + "_") + u) + keyAvailableSWOP), availableFundsNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount)]
698- }
699-
700-
701-
702-@Callable(i)
703564 func claim (pool) = {
704565 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
705566 let shareTokenLocked = getTotalShareTokenLocked(pool)
706- let $t02742027485 = getLastInterestInfo(pool)
707- let lastInterestHeight = $t02742027485._1
708- let lastInterest = $t02742027485._2
709- let $t02749027602 = rewardInfo(pool)
710- let currentRewardPerBlock = $t02749027602._1
711- let rewardUpdateHeight = $t02749027602._2
712- let previousRewardPerBlock = $t02749027602._3
713- let poolRewardUpdateHeight = $t02749027602._4
714- let $t02760727723 = claimCalc(pool, toString(i.caller), height)
715- let userNewInterest = $t02760727723._1
716- let currentInterest = $t02760727723._2
717- let claimAmount = $t02760727723._3
718- let userShareTokensAmount = $t02760727723._4
719- let availableFund = (userAvailableSWOP(pool, toString(i.caller)) + claimAmount)
720- let userClaimedAmount = getUserSWOPClaimedAmount(pool, toString(i.caller))
567+ let $t02485424919 = getLastInterestInfo(pool)
568+ let lastInterestHeight = $t02485424919._1
569+ let lastInterest = $t02485424919._2
570+ let $t02492425036 = rewardInfo(pool)
571+ let currentRewardPerBlock = $t02492425036._1
572+ let rewardUpdateHeight = $t02492425036._2
573+ let previousRewardPerBlock = $t02492425036._3
574+ let poolRewardUpdateHeight = $t02492425036._4
575+ let $t02504125141 = claimCalc(pool, i.caller, 1)
576+ let userNewInterest = $t02504125141._1
577+ let currentInterest = $t02504125141._2
578+ let claimAmount = $t02504125141._3
579+ let userShareTokensAmount = $t02504125141._4
580+ let availableFund = (userAvailableSWOP(pool, i.caller) + claimAmount)
581+ let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
721582 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
722583 if ((availableFund == 0))
723584 then throw("You have 0 available SWOP")
727588 then throw("You have 0 available SWOP")
728589 else if ((fraction(99, accountBalance(shareTokensId), 100) > shareTokenLocked))
729590 then throw("Balance of share-token is greater than totalAmount")
730- else if ((availableFund > 10000000000))
731- then throw(("you are trying to get more SWOP than you can:" + toString(shareTokenLocked)))
732- 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)]
591+ else [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), 0), Reissue(SWOP, availableFund, true), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, availableFund, SWOP)]
733592 }
734593
735594
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4+let adminPubKey1 = base58'GFmKZ2naZFRoCvNbwKAQVGmLb1uBeWGDgFabdGBuZiuy'
5+
6+let adminPubKey2 = base58'GmJXRyhRA79g8yUGgKBAVdnFfQFDMjQG98b1MmLDh5kk'
7+
8+let adminPubKey3 = base58'CFhbV6h41hVjbGHudGtS3fYUv7QAKRxFQzKNtx4B5PqP'
9+
410 let keyShareTokensLocked = "_total_share_tokens_locked"
511
612 let kShareLimit = "share_limit_on_first_harvest"
713
814 let keyActive = "active"
915
1016 let keyCause = "shutdown_cause"
1117
1218 let keyRewardPoolFractionCurrent = "_current_pool_fraction_reward"
1319
1420 let keyRewardPoolFractionPrevious = "_previous_pool_fraction_reward"
1521
1622 let keyHeightPoolFraction = "_pool_reward_update_height"
1723
1824 let keyTotalRewardPerBlockCurrent = "total_reward_per_block_current"
1925
2026 let keyTotalRewardPerBlockPrevious = "total_reward_per_block_previous"
2127
2228 let keyRewardUpdateHeight = "reward_update_height"
2329
2430 let keyLastInterest = "_last_interest"
2531
2632 let keyLastInterestHeight = "_last_interest_height"
2733
2834 let keyUserShareTokensLocked = "_share_tokens_locked"
2935
3036 let keyUserLastInterest = "_last_interest"
3137
3238 let keySWOPid = "SWOP_id"
3339
3440 let keyUserSWOPClaimedAmount = "_SWOP_claimed_amount"
3541
3642 let keyUserSWOPLastClaimedAmount = "_SWOP_last_claimed_amount"
3743
3844 let keyAvailableSWOP = "_available_SWOP"
3945
4046 let keyFarmingStartHeight = "farming_start_height"
4147
4248 let keyAPY = "apy"
4349
4450 let kPreviousTotalVoteSWOP = "previous_total_vote_SWOP"
4551
4652 let keySwopYearEmission = "swop_year_emission"
4753
4854 let keyBalancecpmmA = "A_asset_balance"
4955
5056 let keyBalancecpmmB = "B_asset_balance"
5157
5258 let kHarvestPoolActiveVoteStrucVoting = "_harvest_pool_activeVote_struc"
5359
5460 let kHarvestUserPoolActiveVoteStrucVoting = "_harvest_user_pool_activeVote_struc"
5561
5662 let keyLimitShareFirstHarvest = "share_limit_on_first_harvest"
5763
5864 let keyAssetIdA = "A_asset_id"
5965
6066 let keyAssetIdB = "B_asset_id"
6167
6268 let keyFirstHarvestHeight = "first_harvest_height"
6369
6470 let keyfirstHarvestCpmm = "first_harvest"
6571
6672 let keyTempPrevSum = "sum_reward_previous"
6773
6874 let keyTempCurSum = "sum_reward_current"
6975
7076 let governanceAddress = Address(base58'3N5W8da2iiijVieA6qLGo7KzCJj8B19smWU')
7177
7278 let wallet = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
7379
7480 let votingAddress = Address(base58'3MrJgdL1GniipErHy44YF9idzLaUL2iX5DQ')
7581
7682 let adminIncreaseInterestAddress = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
7783
7884 let oneWeekInBlock = 10106
7985
8086 let totalVoteShare = 10000000000
8187
8288 let scaleValue1 = 10
8389
8490 let scaleValue3 = 1000
8591
8692 let scaleValue5 = 100000
8793
8894 let scaleValue6 = 1000000
8995
9096 let scaleValue8 = 100000000
9197
9298 let scaleValue11 = 100000000000
93-
94-let keyAdminPubKey1 = "admin_pub_1"
95-
96-let keyAdminPubKey2 = "admin_pub_2"
97-
98-let keyAdminPubKey3 = "admin_pub_3"
99-
100-let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
101-
102-func getAdminPub (keyAdminPub) = match getString(oracle, keyAdminPub) {
103- case string: String =>
104- fromBase58String(string)
105- case nothing =>
106- throw("Admin public key is empty")
107-}
108-
109-
110-let adminPubKey1 = getAdminPub(keyAdminPubKey1)
111-
112-let adminPubKey2 = getAdminPub(keyAdminPubKey2)
113-
114-let adminPubKey3 = getAdminPub(keyAdminPubKey3)
11599
116100 func strAssetIdA (pool) = getStringValue(pool, keyAssetIdA)
117101
118102
119103 func strAssetIdB (pool) = getStringValue(pool, keyAssetIdB)
120104
121105
122106 func assetIdA (pool) = if ((strAssetIdA(pool) == "WAVES"))
123107 then unit
124108 else fromBase58String(strAssetIdA(pool))
125109
126110
127111 func assetIdB (pool) = if ((strAssetIdB(pool) == "WAVES"))
128112 then unit
129113 else fromBase58String(strAssetIdB(pool))
130114
131115
132116 let kBasePeriod = "base_period"
133117
134118 let kPeriodLength = "period_length"
135119
136120 let kStartHeight = "start_height"
137121
138122 let kFirstHarvestHeight = "first_harvest_height"
139123
140124 let kDurationFullVotePower = "duration_full_vote_power"
141125
142126 let kMinVotePower = "min_vote_power"
143127
144128 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
145129
146130 let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
147131
148132 let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
149133
150134 let durationFullVotePower = valueOrErrorMessage(getInteger(votingAddress, kDurationFullVotePower), "Empty kDurationFullVotePower")
151135
152136 let minVotePower = valueOrErrorMessage(getInteger(votingAddress, kMinVotePower), "Empty kMinVotePower")
153137
154138 let isActive = getBooleanValue(this, keyActive)
155139
156140 let currPeriod = (basePeriod + ((height - startHeight) / periodLength))
157141
158142 func getLimitToken (pool) = valueOrElse(getIntegerValue(pool, keyLimitShareFirstHarvest), 0)
159143
160144
161145 let APY = getIntegerValue(this, keyAPY)
162146
163147 let SwopYearEmission = getIntegerValue(this, keySwopYearEmission)
164148
165149 func assetNameA (pool) = match assetIdA(pool) {
166150 case id: ByteVector =>
167151 value(assetInfo(id)).name
168152 case waves: Unit =>
169153 "WAVES"
170154 case _ =>
171155 throw("Match error")
172156 }
173157
174158
175159 func assetNameB (pool) = match assetIdB(pool) {
176160 case id: ByteVector =>
177161 value(assetInfo(id)).name
178162 case waves: Unit =>
179163 "WAVES"
180164 case _ =>
181165 throw("Match error")
182166 }
183167
184168
185169 let SWOP = fromBase58String(getStringValue(this, keySWOPid))
186170
187171 func isFirstHarvest (pool) = valueOrElse(getBoolean(pool, keyfirstHarvestCpmm), false)
188172
189173
190174 func getHeightFirstHarvest (pool) = valueOrElse(getInteger(pool, keyFirstHarvestHeight), 0)
191175
192176
193177 func getBalanceA (pool) = valueOrErrorMessage(getInteger(pool, keyBalancecpmmA), ("No data on the key: " + keyBalancecpmmA))
194178
195179
196180 func getBalanceB (pool) = valueOrErrorMessage(getInteger(pool, keyBalancecpmmB), ("No data on the key: " + keyBalancecpmmB))
197181
198182
199183 func getShareLimitToken (pool) = valueOrErrorMessage(getInteger(pool, kShareLimit), ("No data on the key: " + kShareLimit))
200184
201185
202186 func getTotalShareTokenLocked (pool) = valueOrErrorMessage(getInteger(this, (pool + keyShareTokensLocked)), (("No data on the key: " + pool) + keyShareTokensLocked))
203187
204188
205189 func getShareAssetId (pool) = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
206190
207191
208192 func accountBalance (assetId) = match assetId {
209193 case id: ByteVector =>
210194 assetBalance(this, id)
211195 case waves: Unit =>
212196 wavesBalance(this).available
213197 case _ =>
214198 throw("Match error")
215199 }
216200
217201
218202 func getAssetInfo (assetId) = match assetId {
219203 case id: ByteVector =>
220204 let stringId = toBase58String(id)
221205 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
222206 $Tuple3(stringId, info.name, info.decimals)
223207 case waves: Unit =>
224208 $Tuple3("WAVES", "WAVES", 8)
225209 case _ =>
226210 throw("Match error")
227211 }
228212
229213
230214 func calcScaleValue (assetId1,assetId2) = {
231215 let assetId1Decimals = value(assetInfo(assetId1)).decimals
232216 let assetId2Decimals = value(assetInfo(assetId2)).decimals
233217 let scaleDigits = ((assetId2Decimals - assetId1Decimals) + 8)
234- pow(10, 0, scaleDigits, 0, 0, FLOOR)
218+ pow(10, 0, scaleDigits, 0, 0, HALFDOWN)
235219 }
236220
237221
238-func userAvailableSWOP (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + user) + keyAvailableSWOP)), 0)
222+func userAvailableSWOP (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + toString(user)) + keyAvailableSWOP)), 0)
239223
240224
241225 func rewardInfo (pool) = {
242226 let totalRewardPerBlockCurrent = valueOrErrorMessage(getInteger(governanceAddress, keyTotalRewardPerBlockCurrent), ((("No data on the key: " + keyTotalRewardPerBlockCurrent) + " at address ") + toString(governanceAddress)))
243227 let totalRewardPerBlockPrevious = valueOrErrorMessage(getInteger(governanceAddress, keyTotalRewardPerBlockPrevious), ((("No data on the key: " + keyTotalRewardPerBlockPrevious) + " at address ") + toString(governanceAddress)))
244228 let rewardPoolFractionCurrent = valueOrErrorMessage(getInteger(governanceAddress, (pool + keyRewardPoolFractionCurrent)), (((("No data on the key: " + pool) + keyRewardPoolFractionCurrent) + " at address ") + toString(governanceAddress)))
245229 let rewardUpdateHeight = valueOrErrorMessage(getInteger(governanceAddress, keyRewardUpdateHeight), ((("No data on the key: " + keyRewardUpdateHeight) + " at address ") + toString(governanceAddress)))
246230 let poolRewardUpdateHeight = valueOrElse(getInteger(governanceAddress, (pool + keyHeightPoolFraction)), 0)
247231 let rewardPoolFractionPrevious = valueOrErrorMessage(getInteger(governanceAddress, (pool + keyRewardPoolFractionPrevious)), (((("No data on the key: " + pool) + keyRewardPoolFractionPrevious) + " at address ") + toString(governanceAddress)))
248232 let rewardPoolCurrent = fraction(totalRewardPerBlockCurrent, rewardPoolFractionCurrent, totalVoteShare)
249233 let rewardPoolPrevious = fraction(totalRewardPerBlockPrevious, rewardPoolFractionPrevious, totalVoteShare)
250234 if (if ((rewardPoolCurrent > totalRewardPerBlockCurrent))
251235 then true
252236 else (rewardPoolPrevious > totalRewardPerBlockPrevious))
253237 then throw("rewardPoolCurrent > totalRewardPerBlockCurrent or rewardPoolPrevious > totalRewardPerBlockPrevious")
254238 else $Tuple4(rewardPoolCurrent, rewardUpdateHeight, rewardPoolPrevious, poolRewardUpdateHeight)
255239 }
256240
257241
258242 func getLastInterestInfo (pool) = {
259243 let lastInterest = valueOrErrorMessage(getInteger(this, (pool + keyLastInterest)), (("No data on the key: " + pool) + keyLastInterest))
260244 let lastInterestHeight = valueOrElse(getInteger(this, (pool + keyLastInterestHeight)), height)
261245 $Tuple2(lastInterestHeight, lastInterest)
262246 }
263247
264248
265-func getUserInterestInfo (pool,userAddrStr) = {
266- let userLastInterest = getInteger(this, (((pool + "_") + userAddrStr) + keyUserLastInterest))
267- let userShare = getInteger(this, (((pool + "_") + userAddrStr) + keyUserShareTokensLocked))
249+func getUserInterestInfo (pool,userAddress) = {
250+ let userLastInterest = getInteger(this, (((pool + "_") + toString(userAddress)) + keyUserLastInterest))
251+ let userShare = getInteger(this, (((pool + "_") + toString(userAddress)) + keyUserShareTokensLocked))
268252 let lastInterest = valueOrErrorMessage(getInteger(this, (pool + keyLastInterest)), (("No data on the key: " + pool) + keyLastInterest))
269253 let userLastInterestValue = match userLastInterest {
270254 case userLastInterest: Int =>
271255 userLastInterest
272256 case _ =>
273257 lastInterest
274258 }
275259 let userShareTokensAmount = match userShare {
276260 case userShare: Int =>
277261 userShare
278262 case _ =>
279263 0
280264 }
281265 $Tuple2(userLastInterestValue, userShareTokensAmount)
282266 }
283267
284268
285-func calcInterest (lastInterestHeight,rewardUpdateHeight,poolRewardUpdateHeight,lastInterest,currentRewardPerBlock,shareTokenLocked,previousRewardPerBlock,scaleValue,h) = if ((shareTokenLocked == 0))
269+func calcInterest (lastInterestHeight,rewardUpdateHeight,poolRewardUpdateHeight,lastInterest,currentRewardPerBlock,shareTokenLocked,previousRewardPerBlock,shareAssetId,scaleValue,pmtAmount) = if ((shareTokenLocked == 0))
286270 then 0
287271 else if ((poolRewardUpdateHeight != 0))
288- then if (if ((rewardUpdateHeight > h))
272+ then if (if ((rewardUpdateHeight > height))
289273 then (rewardUpdateHeight == poolRewardUpdateHeight)
290274 else false)
291275 then {
292- let reward = (previousRewardPerBlock * (h - lastInterestHeight))
276+ let reward = (previousRewardPerBlock * (height - lastInterestHeight))
293277 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
294278 }
295- else if (if ((h > rewardUpdateHeight))
279+ else if (if ((height > rewardUpdateHeight))
296280 then (rewardUpdateHeight != poolRewardUpdateHeight)
297281 else false)
298282 then {
299- let reward = (previousRewardPerBlock * (h - lastInterestHeight))
283+ let reward = (previousRewardPerBlock * (height - lastInterestHeight))
300284 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
301285 }
302- else if (if (if ((h > rewardUpdateHeight))
286+ else if (if (if ((height > rewardUpdateHeight))
303287 then (rewardUpdateHeight == poolRewardUpdateHeight)
304288 else false)
305289 then (lastInterestHeight > rewardUpdateHeight)
306290 else false)
307291 then {
308- let reward = (currentRewardPerBlock * (h - lastInterestHeight))
292+ let reward = (currentRewardPerBlock * (height - lastInterestHeight))
309293 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
310294 }
311295 else {
312296 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
313297 let interestAfterUpdate = (lastInterest + fraction(rewardAfterLastInterestBeforeReawardUpdate, scaleValue, shareTokenLocked))
314- let reward = (currentRewardPerBlock * (h - rewardUpdateHeight))
298+ let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
315299 (interestAfterUpdate + fraction(reward, scaleValue, shareTokenLocked))
316300 }
317- else if ((rewardUpdateHeight > h))
301+ else if ((rewardUpdateHeight > height))
318302 then {
319- let reward = (previousRewardPerBlock * (h - lastInterestHeight))
303+ let reward = (previousRewardPerBlock * (height - lastInterestHeight))
320304 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
321305 }
322306 else if ((lastInterestHeight > rewardUpdateHeight))
323307 then {
324- let reward = (currentRewardPerBlock * (h - lastInterestHeight))
308+ let reward = (currentRewardPerBlock * (height - lastInterestHeight))
325309 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
326310 }
327311 else {
328312 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
329313 let interestAfterUpdate = (lastInterest + fraction(rewardAfterLastInterestBeforeReawardUpdate, scaleValue, shareTokenLocked))
330- let reward = (currentRewardPerBlock * (h - rewardUpdateHeight))
314+ let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
331315 (interestAfterUpdate + fraction(reward, scaleValue, shareTokenLocked))
332316 }
333317
334318
335-func claimCalc (pool,userAddrStr,h) = {
319+func claimCalc (pool,caller,pmtAmount) = {
336320 let shareAssetId = getShareAssetId(pool)
337321 let scaleValue = calcScaleValue(SWOP, shareAssetId)
338322 let shareTokenLocked = getTotalShareTokenLocked(pool)
339- let $t01334413409 = getLastInterestInfo(pool)
340- let lastInterestHeight = $t01334413409._1
341- let lastInterest = $t01334413409._2
342- let $t01341413526 = rewardInfo(pool)
343- let currentRewardPerBlock = $t01341413526._1
344- let rewardUpdateHeight = $t01341413526._2
345- let previousRewardPerBlock = $t01341413526._3
346- let poolRewardUpdateHeight = $t01341413526._4
347- let $t01353113615 = getUserInterestInfo(pool, userAddrStr)
348- let userLastInterest = $t01353113615._1
349- let userShareTokensAmount = $t01353113615._2
350- let currentInterest = calcInterest(lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, lastInterest, currentRewardPerBlock, shareTokenLocked, previousRewardPerBlock, scaleValue, h)
351- let claimAmount = fraction(userShareTokensAmount, (currentInterest - userLastInterest), scaleValue)
352- let userNewInterest = currentInterest
353- $Tuple4(userNewInterest, currentInterest, claimAmount, userShareTokensAmount)
354- }
355-
356-
357-func claimCalcForMigration (pool,userAddrStr,h) = {
358- let shareAssetId = getShareAssetId(pool)
359- let scaleValue = calcScaleValue(SWOP, shareAssetId)
360- let shareTokenLocked = getTotalShareTokenLocked(pool)
361- let $t01433814403 = getLastInterestInfo(pool)
362- let lastInterestHeight = $t01433814403._1
363- let lastInterest = $t01433814403._2
364- let $t01440814520 = rewardInfo(pool)
365- let currentRewardPerBlock = $t01440814520._1
366- let rewardUpdateHeight = $t01440814520._2
367- let previousRewardPerBlock = $t01440814520._3
368- let poolRewardUpdateHeight = $t01440814520._4
369- let $t01452514609 = getUserInterestInfo(pool, userAddrStr)
370- let userLastInterest = $t01452514609._1
371- let userShareTokensAmount = $t01452514609._2
372- let currentInterest = calcInterest(lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, lastInterest, currentRewardPerBlock, shareTokenLocked, previousRewardPerBlock, scaleValue, h)
323+ let $t01315313218 = getLastInterestInfo(pool)
324+ let lastInterestHeight = $t01315313218._1
325+ let lastInterest = $t01315313218._2
326+ let $t01322313335 = rewardInfo(pool)
327+ let currentRewardPerBlock = $t01322313335._1
328+ let rewardUpdateHeight = $t01322313335._2
329+ let previousRewardPerBlock = $t01322313335._3
330+ let poolRewardUpdateHeight = $t01322313335._4
331+ let $t01334013419 = getUserInterestInfo(pool, caller)
332+ let userLastInterest = $t01334013419._1
333+ let userShareTokensAmount = $t01334013419._2
334+ let currentInterest = calcInterest(lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, lastInterest, currentRewardPerBlock, shareTokenLocked, previousRewardPerBlock, shareAssetId, scaleValue, pmtAmount)
373335 let claimAmount = fraction(userShareTokensAmount, (currentInterest - userLastInterest), scaleValue)
374336 let userNewInterest = currentInterest
375337 $Tuple4(userNewInterest, currentInterest, claimAmount, userShareTokensAmount)
376338 }
377339
378340
379341 func calculateProtocolReward (pool) = {
380- let $t01511315178 = getLastInterestInfo(pool)
381- let lastInterestHeight = $t01511315178._1
382- let lastInterest = $t01511315178._2
383- let $t01518315294 = rewardInfo(pool)
384- let currentRewardPerBlock = $t01518315294._1
385- let rewardUpdateHeight = $t01518315294._2
386- let previousRewardPerBlock = $t01518315294._3
387- let poolRewardUpdateHeight = $t01518315294._4
342+ let $t01393714002 = getLastInterestInfo(pool)
343+ let lastInterestHeight = $t01393714002._1
344+ let lastInterest = $t01393714002._2
345+ let $t01400714118 = rewardInfo(pool)
346+ let currentRewardPerBlock = $t01400714118._1
347+ let rewardUpdateHeight = $t01400714118._2
348+ let previousRewardPerBlock = $t01400714118._3
349+ let poolRewardUpdateHeight = $t01400714118._4
388350 let shareTokenLocked = getTotalShareTokenLocked(pool)
389351 if (if ((shareTokenLocked == 0))
390352 then (poolRewardUpdateHeight == 0)
391353 else false)
392354 then if ((rewardUpdateHeight > height))
393355 then {
394356 let reward = (previousRewardPerBlock * (height - lastInterestHeight))
395357 reward
396358 }
397359 else if ((lastInterestHeight > rewardUpdateHeight))
398360 then {
399361 let reward = (currentRewardPerBlock * (height - lastInterestHeight))
400362 reward
401363 }
402364 else {
403365 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
404366 let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
405367 (reward + rewardAfterLastInterestBeforeReawardUpdate)
406368 }
407369 else if (if ((shareTokenLocked == 0))
408370 then (poolRewardUpdateHeight != 0)
409371 else false)
410372 then if (if ((rewardUpdateHeight > height))
411373 then (rewardUpdateHeight == poolRewardUpdateHeight)
412374 else false)
413375 then {
414376 let reward = (previousRewardPerBlock * (height - lastInterestHeight))
415377 reward
416378 }
417379 else if (if ((height > rewardUpdateHeight))
418380 then (rewardUpdateHeight != poolRewardUpdateHeight)
419381 else false)
420382 then {
421383 let reward = (previousRewardPerBlock * (height - lastInterestHeight))
422384 reward
423385 }
424386 else if (if (if ((height > rewardUpdateHeight))
425387 then (rewardUpdateHeight == poolRewardUpdateHeight)
426388 else false)
427389 then (lastInterestHeight > rewardUpdateHeight)
428390 else false)
429391 then {
430392 let reward = (currentRewardPerBlock * (height - lastInterestHeight))
431393 reward
432394 }
433395 else {
434396 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
435397 let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
436398 (reward + rewardAfterLastInterestBeforeReawardUpdate)
437399 }
438400 else 0
439401 }
440402
441403
442404 func checkPmtAssetIdCorrect (pool,pmtAssetId) = {
443405 let poolShareAssetId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
444406 if ((pmtAssetId == poolShareAssetId))
445407 then true
446408 else false
447409 }
448410
449411
450-func getUserSWOPClaimedAmount (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + user) + keyUserSWOPClaimedAmount)), 0)
412+func getUserSWOPClaimedAmount (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + toString(user)) + keyUserSWOPClaimedAmount)), 0)
451413
452414
453415 func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
454416
455417
456418 @Callable(i)
457419 func init (earlyLP) = if (isDefined(getString(this, keySWOPid)))
458420 then throw("SWOP already initialized")
459421 else {
460422 let initAmount = 100000000000000
461423 let SWOPissue = Issue("SWOP", "SWOP protocol token", initAmount, 8, true)
462424 let SWOPid = calculateAssetId(SWOPissue)
463425 [BooleanEntry(keyActive, true), Issue("SWOP", "SWOP protocol token", initAmount, 8, true), StringEntry(keySWOPid, toBase58String(SWOPid))]
464426 }
465427
466428
467429
468430 @Callable(i)
469431 func initPoolShareFarming (pool) = if ((i.caller != this))
470432 then throw("Only the DApp itself can call this function")
471433 else {
472- let $t01826418367 = rewardInfo(pool)
473- let currentReward = $t01826418367._1
474- let rewardUpdateHeight = $t01826418367._2
475- let previousRewardPerBlock = $t01826418367._3
476- let poolRewardUpdateHeight = $t01826418367._4
434+ let $t01710017203 = rewardInfo(pool)
435+ let currentReward = $t01710017203._1
436+ let rewardUpdateHeight = $t01710017203._2
437+ let previousRewardPerBlock = $t01710017203._3
438+ let poolRewardUpdateHeight = $t01710017203._4
477439 [IntegerEntry((pool + keyShareTokensLocked), 0), IntegerEntry((pool + keyLastInterest), 0), IntegerEntry((pool + keyLastInterestHeight), height)]
478440 }
479441
480442
481443
482444 @Callable(i)
483445 func updatePoolInterest (pool) = if ((i.caller != wallet))
484446 then throw("Only the Admin itself can call this function")
485447 else if (!(isActive))
486448 then throw("DApp is inactive at this moment")
487449 else {
488- let $t01877618912 = claimCalc(pool, toString(adminIncreaseInterestAddress), height)
489- let userNewInterest = $t01877618912._1
490- let currentInterest = $t01877618912._2
491- let claimAmount = $t01877618912._3
492- let userShareTokensAmount = $t01877618912._4
493- let $t01891719020 = rewardInfo(pool)
494- let currentReward = $t01891719020._1
495- let rewardUpdateHeight = $t01891719020._2
496- let previousRewardPerBlock = $t01891719020._3
497- let poolRewardUpdateHeight = $t01891719020._4
450+ let $t01761217732 = claimCalc(pool, adminIncreaseInterestAddress, 0)
451+ let userNewInterest = $t01761217732._1
452+ let currentInterest = $t01761217732._2
453+ let claimAmount = $t01761217732._3
454+ let userShareTokensAmount = $t01761217732._4
455+ let $t01773717840 = rewardInfo(pool)
456+ let currentReward = $t01773717840._1
457+ let rewardUpdateHeight = $t01773717840._2
458+ let previousRewardPerBlock = $t01773717840._3
459+ let poolRewardUpdateHeight = $t01773717840._4
498460 [IntegerEntry((pool + keyLastInterest), userNewInterest), IntegerEntry((pool + keyLastInterestHeight), height)]
499461 }
500462
501463
502464
503465 @Callable(i)
504466 func lockShareTokens (pool) = {
505- let userAddrStr = toString(i.caller)
506- let $t01925419329 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
507- let pmtAmount = $t01925419329._1
508- let pmtAssetId = $t01925419329._2
509- let $t01933419407 = getAssetInfo(pmtAssetId)
510- let pmtStrAssetId = $t01933419407._1
511- let pmtAssetName = $t01933419407._2
512- let pmtDecimals = $t01933419407._3
513- let $t01941219528 = claimCalc(pool, toString(i.caller), height)
514- let userNewInterest = $t01941219528._1
515- let currentInterest = $t01941219528._2
516- let claimAmount = $t01941219528._3
517- let userShareTokensAmount = $t01941219528._4
467+ let $t01803218107 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
468+ let pmtAmount = $t01803218107._1
469+ let pmtAssetId = $t01803218107._2
470+ let $t01811218185 = getAssetInfo(pmtAssetId)
471+ let pmtStrAssetId = $t01811218185._1
472+ let pmtAssetName = $t01811218185._2
473+ let pmtDecimals = $t01811218185._3
474+ let $t01819018298 = claimCalc(pool, i.caller, pmtAmount)
475+ let userNewInterest = $t01819018298._1
476+ let currentInterest = $t01819018298._2
477+ let claimAmount = $t01819018298._3
478+ let userShareTokensAmount = $t01819018298._4
518479 let userShareAmountNew = (userShareTokensAmount + pmtAmount)
519- let availableFundsNew = (userAvailableSWOP(pool, toString(i.caller)) + claimAmount)
480+ let availableFundsNew = (userAvailableSWOP(pool, i.caller) + claimAmount)
520481 let totalShareAmount = getTotalShareTokenLocked(pool)
521482 let totalShareAmountNew = (totalShareAmount + pmtAmount)
522- let userClaimedAmount = getUserSWOPClaimedAmount(pool, toString(i.caller))
483+ let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
523484 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
524- let baseEntry = [IntegerEntry((((pool + "_") + userAddrStr) + keyUserLastInterest), userNewInterest), IntegerEntry((((pool + "_") + userAddrStr) + keyUserShareTokensLocked), userShareAmountNew), IntegerEntry((pool + keyShareTokensLocked), totalShareAmountNew), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + userAddrStr) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + userAddrStr) + keyUserSWOPLastClaimedAmount), claimAmount), IntegerEntry((((pool + "_") + userAddrStr) + keyAvailableSWOP), availableFundsNew)]
485+ 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)]
525486 if ((0 >= pmtAmount))
526487 then throw("You can't lock token")
527488 else if (!(isActive))
528489 then throw("DApp is inactive at this moment")
529490 else if (!(checkPmtAssetIdCorrect(pool, pmtAssetId)))
530491 then throw("Incorrect pmtAssetId")
531492 else if (if (isFirstHarvest(Address(fromBase58String(pool))))
532493 then (getHeightFirstHarvest(Address(fromBase58String(pool))) > height)
533494 else false)
534495 then {
535496 let harvestPeriod = ((((getHeightFirstHarvest(Address(fromBase58String(pool))) - startHeight) + 1) / periodLength) - 1)
536- let amountOfVoting = split(getStringValue(votingAddress, (((userAddrStr + "_") + pool) + "_user_pool_struc")), "_")
497+ let amountOfVoting = split(getStringValue(votingAddress, (((toString(i.caller) + "_") + pool) + "_user_pool_struc")), "_")
537498 let amountPoolStract = split(getStringValue(votingAddress, (pool + "_pool_struc")), "_")
538- let amountActiveVoteUserPoolStract = split(valueOrElse(getString(votingAddress, (((userAddrStr + "_") + pool) + kHarvestUserPoolActiveVoteStrucVoting)), ""), "_")
499+ let amountActiveVoteUserPoolStract = split(valueOrElse(getString(votingAddress, (((toString(i.caller) + "_") + pool) + kHarvestUserPoolActiveVoteStrucVoting)), ""), "_")
539500 let amountPoolActiveVoteStract = split(valueOrElse(getString(votingAddress, (pool + kHarvestPoolActiveVoteStrucVoting)), ""), "_")
540501 let userShareTokenLocked = userShareTokensAmount
541502 let userPoolActiveVote = if ((toString(currPeriod) == amountOfVoting[2]))
542503 then valueOrElse(parseInt(amountActiveVoteUserPoolStract[0]), 0)
543504 else valueOrElse(parseInt(amountOfVoting[1]), 0)
544505 let poolActiveVote = if ((toString(currPeriod) == amountPoolStract[2]))
545506 then valueOrElse(parseInt(amountPoolActiveVoteStract[0]), 0)
546507 else valueOrElse(parseInt(amountPoolStract[1]), 0)
547508 let protocolReward = calculateProtocolReward(pool)
548509 if ((userPoolActiveVote != 0))
549510 then {
550511 let limitShareToken = getShareLimitToken(addressFromStringValue(pool))
551512 let shareToken = (fraction(limitShareToken, userPoolActiveVote, poolActiveVote) - userShareTokenLocked)
552513 if (if ((size(amountActiveVoteUserPoolStract) > 1))
553514 then (valueOrElse(parseInt(amountActiveVoteUserPoolStract[1]), 0) >= harvestPeriod)
554515 else false)
555516 then throw("You can't share token")
556517 else if ((pmtAmount > limitShareToken))
557518 then throw(("You can't share token more than " + toString(limitShareToken)))
558519 else if ((shareToken > 0))
559520 then if ((fraction(99, (accountBalance(pmtAssetId) + pmtAmount), 100) > totalShareAmountNew))
560521 then throw("Balance of share-token is greater than totalAmount")
561522 else if ((totalShareAmount == 0))
562- then (baseEntry ++ [ScriptTransfer(wallet, protocolReward, SWOP)])
523+ then (baseEntry ++ [Reissue(SWOP, protocolReward, true), ScriptTransfer(wallet, protocolReward, SWOP)])
563524 else if ((shareToken >= pmtAmount))
564525 then baseEntry
565526 else throw(("Your maximum share token is " + toString(shareToken)))
566527 else throw("You can't share token")
567528 }
568529 else throw("Your amount of token less than 0")
569530 }
570531 else baseEntry
571532 }
572533
573534
574535
575536 @Callable(i)
576537 func withdrawShareTokens (pool,shareTokensWithdrawAmount) = {
577538 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
578- let $t02394424060 = claimCalc(pool, toString(i.caller), height)
579- let userNewInterest = $t02394424060._1
580- let currentInterest = $t02394424060._2
581- let claimAmount = $t02394424060._3
582- let userShareTokensAmount = $t02394424060._4
539+ let $t02274722847 = claimCalc(pool, i.caller, 1)
540+ let userNewInterest = $t02274722847._1
541+ let currentInterest = $t02274722847._2
542+ let claimAmount = $t02274722847._3
543+ let userShareTokensAmount = $t02274722847._4
583544 let userShareAmountNew = (userShareTokensAmount - shareTokensWithdrawAmount)
584- let availableFundsNew = (userAvailableSWOP(pool, toString(i.caller)) + claimAmount)
545+ let availableFundsNew = (userAvailableSWOP(pool, i.caller) + claimAmount)
585546 let totalShareAmount = getTotalShareTokenLocked(pool)
586547 let totalShareAmountNew = (totalShareAmount - shareTokensWithdrawAmount)
587- let userClaimedAmount = getUserSWOPClaimedAmount(pool, toString(i.caller))
548+ let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
588549 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
589550 if ((shareTokensWithdrawAmount > userShareTokensAmount))
590551 then throw("Withdraw amount more then user locked amount")
591552 else if (!(isActive))
592553 then throw("DApp is inactive at this moment")
593554 else if ((shareTokensWithdrawAmount > userShareTokensAmount))
594555 then throw("Withdraw amount more then user locked amount")
595556 else if ((fraction(99, (accountBalance(shareTokensId) - shareTokensWithdrawAmount), 100) > totalShareAmountNew))
596557 then throw("Balance of share-token is greater than totalAmount")
597558 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)]
598559 }
599560
600561
601562
602563 @Callable(i)
603-func egg0 (pool,users) = {
604- func updateUser (accum,u) = {
605- let r = invoke(this, "egg1", [pool, u], nil)
606- if ((r == r))
607- then (accum :+ BooleanEntry((u + "_migration"), true))
608- else throw("Strict value is not equal to itself.")
609- }
610-
611- let $list2611926150 = users
612- let $size2611926150 = size($list2611926150)
613- let $acc02611926150 = nil
614- if (($size2611926150 == 0))
615- then $acc02611926150
616- else {
617- let $acc12611926150 = updateUser($acc02611926150, $list2611926150[0])
618- if (($size2611926150 == 1))
619- then $acc12611926150
620- else {
621- let $acc22611926150 = updateUser($acc12611926150, $list2611926150[1])
622- if (($size2611926150 == 2))
623- then $acc22611926150
624- else {
625- let $acc32611926150 = updateUser($acc22611926150, $list2611926150[2])
626- if (($size2611926150 == 3))
627- then $acc32611926150
628- else {
629- let $acc42611926150 = updateUser($acc32611926150, $list2611926150[3])
630- if (($size2611926150 == 4))
631- then $acc42611926150
632- else {
633- let $acc52611926150 = updateUser($acc42611926150, $list2611926150[4])
634- if (($size2611926150 == 5))
635- then $acc52611926150
636- else {
637- let $acc62611926150 = updateUser($acc52611926150, $list2611926150[5])
638- if (($size2611926150 == 6))
639- then $acc62611926150
640- else {
641- let $acc72611926150 = updateUser($acc62611926150, $list2611926150[6])
642- if (($size2611926150 == 7))
643- then $acc72611926150
644- else {
645- let $acc82611926150 = updateUser($acc72611926150, $list2611926150[7])
646- if (($size2611926150 == 8))
647- then $acc82611926150
648- else {
649- let $acc92611926150 = updateUser($acc82611926150, $list2611926150[8])
650- if (($size2611926150 == 9))
651- then $acc92611926150
652- else {
653- let $acc102611926150 = updateUser($acc92611926150, $list2611926150[9])
654- if (($size2611926150 == 10))
655- then $acc102611926150
656- else {
657- let $acc112611926150 = updateUser($acc102611926150, $list2611926150[10])
658- if (($size2611926150 == 11))
659- then $acc112611926150
660- else {
661- let $acc122611926150 = updateUser($acc112611926150, $list2611926150[11])
662- if (($size2611926150 == 12))
663- then $acc122611926150
664- else {
665- let $acc132611926150 = updateUser($acc122611926150, $list2611926150[12])
666- throw("List size exceed 12")
667- }
668- }
669- }
670- }
671- }
672- }
673- }
674- }
675- }
676- }
677- }
678- }
679- }
680- }
681-
682-
683-
684-@Callable(i)
685-func egg1 (pool,u) = {
686- let migrationHeight = 1694115
687- let shareTokenMultiplyer = 1000
688- let $t02632326435 = claimCalc(pool, u, migrationHeight)
689- let userNewInterest = $t02632326435._1
690- let currentInterest = $t02632326435._2
691- let claimAmount = $t02632326435._3
692- let userShareTokensAmount = $t02632326435._4
693- let availableFundsNew = (userAvailableSWOP(pool, u) + claimAmount)
694- let userClaimedAmount = getUserSWOPClaimedAmount(pool, u)
695- let userClaimedAmountNew = (userClaimedAmount + claimAmount)
696- let userShareTokensAmountNew = (userShareTokensAmount * shareTokenMultiplyer)
697-[IntegerEntry((((pool + "_") + u) + keyUserLastInterest), 0), IntegerEntry((((pool + "_") + u) + keyUserShareTokensLocked), userShareTokensAmountNew), IntegerEntry((((pool + "_") + u) + keyAvailableSWOP), availableFundsNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount)]
698- }
699-
700-
701-
702-@Callable(i)
703564 func claim (pool) = {
704565 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
705566 let shareTokenLocked = getTotalShareTokenLocked(pool)
706- let $t02742027485 = getLastInterestInfo(pool)
707- let lastInterestHeight = $t02742027485._1
708- let lastInterest = $t02742027485._2
709- let $t02749027602 = rewardInfo(pool)
710- let currentRewardPerBlock = $t02749027602._1
711- let rewardUpdateHeight = $t02749027602._2
712- let previousRewardPerBlock = $t02749027602._3
713- let poolRewardUpdateHeight = $t02749027602._4
714- let $t02760727723 = claimCalc(pool, toString(i.caller), height)
715- let userNewInterest = $t02760727723._1
716- let currentInterest = $t02760727723._2
717- let claimAmount = $t02760727723._3
718- let userShareTokensAmount = $t02760727723._4
719- let availableFund = (userAvailableSWOP(pool, toString(i.caller)) + claimAmount)
720- let userClaimedAmount = getUserSWOPClaimedAmount(pool, toString(i.caller))
567+ let $t02485424919 = getLastInterestInfo(pool)
568+ let lastInterestHeight = $t02485424919._1
569+ let lastInterest = $t02485424919._2
570+ let $t02492425036 = rewardInfo(pool)
571+ let currentRewardPerBlock = $t02492425036._1
572+ let rewardUpdateHeight = $t02492425036._2
573+ let previousRewardPerBlock = $t02492425036._3
574+ let poolRewardUpdateHeight = $t02492425036._4
575+ let $t02504125141 = claimCalc(pool, i.caller, 1)
576+ let userNewInterest = $t02504125141._1
577+ let currentInterest = $t02504125141._2
578+ let claimAmount = $t02504125141._3
579+ let userShareTokensAmount = $t02504125141._4
580+ let availableFund = (userAvailableSWOP(pool, i.caller) + claimAmount)
581+ let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
721582 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
722583 if ((availableFund == 0))
723584 then throw("You have 0 available SWOP")
724585 else if (!(isActive))
725586 then throw("DApp is inactive at this moment")
726587 else if ((availableFund == 0))
727588 then throw("You have 0 available SWOP")
728589 else if ((fraction(99, accountBalance(shareTokensId), 100) > shareTokenLocked))
729590 then throw("Balance of share-token is greater than totalAmount")
730- else if ((availableFund > 10000000000))
731- then throw(("you are trying to get more SWOP than you can:" + toString(shareTokenLocked)))
732- 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)]
591+ else [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), 0), Reissue(SWOP, availableFund, true), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, availableFund, SWOP)]
733592 }
734593
735594
736595
737596 @Callable(i)
738597 func shutdown () = if (!(isActive))
739598 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
740599 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
741600 then throw("Only admin can call this function")
742601 else suspend("Paused by admin")
743602
744603
745604
746605 @Callable(i)
747606 func activate () = if (isActive)
748607 then throw("DApp is already active")
749608 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
750609 then throw("Only admin can call this function")
751610 else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
752611
753612
754613 @Verifier(tx)
755614 func verify () = match tx {
756615 case _ =>
757616 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
758617 then 1
759618 else 0
760619 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
761620 then 1
762621 else 0
763622 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
764623 then 1
765624 else 0
766625 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
767626 }
768627

github/deemru/w8io/873ac7e 
99.88 ms