tx · 48jxFccffbmSKW9d4D41YaqtCzjYwxq5e3RAe9ZBVk52

3N5W8da2iiijVieA6qLGo7KzCJj8B19smWU:  -0.14000000 Waves

2022.06.01 14:55 [2077249] smart account 3N5W8da2iiijVieA6qLGo7KzCJj8B19smWU > SELF 0.00000000 Waves

{ "type": 13, "id": "48jxFccffbmSKW9d4D41YaqtCzjYwxq5e3RAe9ZBVk52", "fee": 14000000, "feeAssetId": null, "timestamp": 1654084565614, "version": 2, "chainId": 84, "sender": "3N5W8da2iiijVieA6qLGo7KzCJj8B19smWU", "senderPublicKey": "AWADFmQjf2WbDSqb24S9YZpix3VEdiBdeiJ2J2sSfQ49", "proofs": [ "Vae8SnHMXp9gSRHBYY9s2dLUyVbZQgSrVXstgPuhKh2Q6dN7Y6dtD1Cj7VBhE5WLpzW1p5K5Db4yMoAxgxdsSUx", "4X7fhjpzL4DUS9KrM1Uqvte2X6s5gLuQ2yCahQ824Vs56dy9BRBnue8jqssvsXDAkR8GJZ5mnBEoYwh6D58g9qrY" ], "script": "base64:AAIFAAAAAAAAABsIAhIAEgASAwoBARIAEgASBgoEGBEBARIAEgAAAABjAAAAAAdrQWN0aXZlAgAAAAZhY3RpdmUAAAAABmtDYXVzZQIAAAAOc2h1dGRvd25fY2F1c2UAAAAADWtMYXN0SW50ZXJlc3QCAAAADWxhc3RfaW50ZXJlc3QAAAAAEWtVc2VyTGFzdEludGVyZXN0AgAAAA5fbGFzdF9pbnRlcmVzdAAAAAAPa1VzZXJTV09QTG9ja2VkAgAAAAxfU1dPUF9hbW91bnQAAAAAEmtVc2VyR2V0QmFja0hlaWdodAIAAAAOX2dldEJhY2tIZWlnaHQAAAAAEGtUb3RhbFNXT1BMb2NrZWQCAAAAEXRvdGFsX1NXT1BfYW1vdW50AAAAABJrVXNlclRvdGFsVm90ZVNXT1ACAAAAFV91c2VyX3RvdGFsX1NXT1Bfdm90ZQAAAAAVa1VzZXJWb3RlT3B0aW9uQW1vdW50AgAAABNfU1dPUF9vcHRpb25fYW1vdW50AAAAABZrVG90YWxWb3RlT3B0aW9uQW1vdW50AgAAABh0b3RhbF9TV09QX29wdGlvbl9hbW91bnQAAAAAFmtVc2VyU1dPUENsYWltZWRBbW91bnQCAAAAFF9TV09QX2NsYWltZWRfYW1vdW50AAAAABprVXNlclNXT1BMYXN0Q2xhaW1lZEFtb3VudAIAAAAZX1NXT1BfbGFzdF9jbGFpbWVkX2Ftb3VudAAAAAAJa1ZvdGVOYW1lAgAAAAl2b3RlX25hbWUAAAAAC2tPcHRpb25OYW1lAgAAAAxfb3B0aW9uX25hbWUAAAAAEmtWb3RpbmdTdGFydEhlaWdodAIAAAAMX3N0YXJ0SGVpZ2h0AAAAAA1rVm90ZUR1cmF0aW9uAgAAAA5fdm90ZV9kdXJhdGlvbgAAAAAaa1Jld2FyZFBvb2xGcmFjdGlvbkN1cnJlbnQCAAAAHV9jdXJyZW50X3Bvb2xfZnJhY3Rpb25fcmV3YXJkAAAAABtrUmV3YXJkUG9vbEZyYWN0aW9uUHJldmlvdXMCAAAAHl9wcmV2aW91c19wb29sX2ZyYWN0aW9uX3Jld2FyZAAAAAATa0hlaWdodFBvb2xGcmFjdGlvbgIAAAAaX3Bvb2xfcmV3YXJkX3VwZGF0ZV9oZWlnaHQAAAAAG2tUb3RhbFJld2FyZFBlckJsb2NrQ3VycmVudAIAAAAedG90YWxfcmV3YXJkX3Blcl9ibG9ja19jdXJyZW50AAAAABxrVG90YWxSZXdhcmRQZXJCbG9ja1ByZXZpb3VzAgAAAB90b3RhbF9yZXdhcmRfcGVyX2Jsb2NrX3ByZXZpb3VzAAAAABNrUmV3YXJkVXBkYXRlSGVpZ2h0AgAAABRyZXdhcmRfdXBkYXRlX2hlaWdodAAAAAAia1Jld2FyZFVwZGF0ZUZpcnN0UGFnaW5hdGlvbkhlaWdodAIAAAAlcmV3YXJkX3VwZGF0ZV9oZWlnaHRfZmlyc3RfcGFnaW5hdGlvbgAAAAATa05vVm90aW5nRm9yTmV3UG9vbAIAAAAIX3ZvdGVfbm8AAAAAFGtZZXNWb3RpbmdGb3JOZXdQb29sAgAAAAlfdm90ZV95ZXMAAAAAGWtBbW91bnRPZlZvdGluZ0Zvck5ld1Bvb2wCAAAAEW1heF9hbW91bnRfdm90aW5nAAAAABlrU3RhdHVzT2ZWb3RpbmdGb3JOZXdQb29sAgAAAAdfc3RhdHVzAAAAAB1rSGVpZ2h0T2ZQb29sVm90aW5nRm9yTmV3UG9vbAIAAAAOX2ZpbmlzaF9oZWlnaHQAAAAAD2FjdGl2ZVZvdGVGaXJzdAIAAAAUdm90aW5nX2FjdGl2ZV9jZWxsXzEAAAAAEGFjdGl2ZVZvdGVTZWNvbmQCAAAAFHZvdGluZ19hY3RpdmVfY2VsbF8yAAAAAA9hY3RpdmVWb3RlVGhpcmQCAAAAFHZvdGluZ19hY3RpdmVfY2VsbF8zAAAAAAtrVGVtcEN1clN1bQIAAAASc3VtX3Jld2FyZF9jdXJyZW50AAAAABdrTGF1bmNocGFkQm91Z2h0VGlja2V0cwIAAAAPX2JvdWdodF90aWNrZXRzAAAAABhrTGF1bmNocGFkU3dvcFBlclRpY2tldHMCAAAAEF9zd29wX3Blcl90aWNrZXQAAAAAEmtMYXVuY2hwYWRBY3RpdmVJZAIAAAATbGF1bmNocGFkX2FjdGl2ZV9pZAAAAAASa0xhdW5jaHBhZER1cmF0aW9uAgAAAAlfZHVyYXRpb24AAAAAFWtMYXVuY2hwYWRTdGFydEhlaWdodAIAAAANX3N0YXJ0X2hlaWdodAAAAAAMa1N0YXJ0SGVpZ2h0AgAAAAxzdGFydF9oZWlnaHQAAAAAC2tCYXNlUGVyaW9kAgAAAAtiYXNlX3BlcmlvZAAAAAANa1BlcmlvZExlbmd0aAIAAAANcGVyaW9kX2xlbmd0aAAAAAAPa1VzZXJUb3RhbFN0cnVjAgAAABFfdXNlcl90b3RhbF9zdHJ1YwAAAAAaa0xhdWNocGFkRnJlZXpTd29wRHVyYXRpb24CAAAAFV9mcmVlemVfc3dvcF9kdXJhdGlvbgAAAAAHa1NXT1BpZAIAAAAHU1dPUF9pZAAAAAALa0FpcmRyb3BGZWUCAAAAC2FpcmRyb3BfZmVlAAAAAA1rQWRtaW5QdWJLZXkxAgAAAAthZG1pbl9wdWJfMQAAAAANa0FkbWluUHViS2V5MgIAAAALYWRtaW5fcHViXzIAAAAADWtBZG1pblB1YktleTMCAAAAC2FkbWluX3B1Yl8zAAAAAA9rTW9uZXlCb3hQdWJLZXkCAAAAEW1vbmV5X2JveF9wdWJfa2V5AAAAAAxrRmFybWluZ0FkZHICAAAAD2Zhcm1pbmdfYWRkcmVzcwAAAAALa1ZvdGluZ0FkZHICAAAADnZvdGluZ19hZGRyZXNzAAAAABJrVm90aW5nTmV3UG9vbEFkZHICAAAAF3ZvdGluZ19uZXdfcG9vbF9hZGRyZXNzAAAAAA5rTGF1bmNocGFkQWRkcgIAAAARbGF1bmNocGFkX2FkZHJlc3MAAAAAFGtBaXJkcm9wTW9uZXlCb3hBZGRyAgAAABVhaXJkcm9wX2ZlZV9tb25leV9ib3gAAAAABm9yYWNsZQkBAAAAB0FkZHJlc3MAAAABAQAAABoBVOlFqh6QLzqu8boO5i6akl8amITh82KzCAEAAAATZ2V0QmFzZTU4RnJvbU9yYWNsZQAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABm9yYWNsZQUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAABnN0cmluZwUAAAAHJG1hdGNoMAkAAlkAAAABBQAAAAZzdHJpbmcEAAAAB25vdGhpbmcFAAAAByRtYXRjaDAJAAACAAAAAQkAASwAAAACBQAAAANrZXkCAAAACGlzIGVtcHR5AAAAAAxhZG1pblB1YktleTEJAQAAABNnZXRCYXNlNThGcm9tT3JhY2xlAAAAAQUAAAANa0FkbWluUHViS2V5MQAAAAAMYWRtaW5QdWJLZXkyCQEAAAATZ2V0QmFzZTU4RnJvbU9yYWNsZQAAAAEFAAAADWtBZG1pblB1YktleTIAAAAADGFkbWluUHViS2V5MwkBAAAAE2dldEJhc2U1OEZyb21PcmFjbGUAAAABBQAAAA1rQWRtaW5QdWJLZXkzAAAAAA5tb25leUJveFB1YktleQkBAAAAE2dldEJhc2U1OEZyb21PcmFjbGUAAAABBQAAAA9rTW9uZXlCb3hQdWJLZXkAAAAAC2Zhcm1pbmdBZGRyCQEAAAAHQWRkcmVzcwAAAAEJAQAAABNnZXRCYXNlNThGcm9tT3JhY2xlAAAAAQUAAAAMa0Zhcm1pbmdBZGRyAAAAAAp2b3RpbmdBZGRyCQEAAAAHQWRkcmVzcwAAAAEJAQAAABNnZXRCYXNlNThGcm9tT3JhY2xlAAAAAQUAAAALa1ZvdGluZ0FkZHIAAAAAEXZvdGluZ05ld1Bvb2xBZGRyCQEAAAAHQWRkcmVzcwAAAAEJAQAAABNnZXRCYXNlNThGcm9tT3JhY2xlAAAAAQUAAAASa1ZvdGluZ05ld1Bvb2xBZGRyAAAAAA1sYXVuY2hwYWRBZGRyCQEAAAAHQWRkcmVzcwAAAAEJAQAAABNnZXRCYXNlNThGcm9tT3JhY2xlAAAAAQUAAAAOa0xhdW5jaHBhZEFkZHIAAAAAE2FpcmRyb3BNb25leUJveEFkZHIJAQAAAAdBZGRyZXNzAAAAAQkBAAAAE2dldEJhc2U1OEZyb21PcmFjbGUAAAABBQAAABRrQWlyZHJvcE1vbmV5Qm94QWRkcgAAAAAEU1dPUAkAAlkAAAABCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAAtmYXJtaW5nQWRkcgUAAAAHa1NXT1BpZAAAAAAKc2NhbGVWYWx1ZQAAAAAABfXhAAAAAAAOdG90YWxWb3RlU2hhcmUAAAAAAlQL5AAAAAAACmJhc2VQZXJpb2QJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAp2b3RpbmdBZGRyBQAAAAtrQmFzZVBlcmlvZAIAAAAkRW1wdHkga0Jhc2VQZXJpb2QgYXQgdm90aW5nIGNvbnRyYWN0AAAAAAtzdGFydEhlaWdodAkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAACnZvdGluZ0FkZHIFAAAADGtTdGFydEhlaWdodAIAAAAlRW1wdHkga1N0YXJ0SGVpZ2h0IGF0IHZvdGluZyBjb250cmFjdAAAAAAMcGVyaW9kTGVuZ3RoCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAKdm90aW5nQWRkcgUAAAANa1BlcmlvZExlbmd0aAIAAAAmRW1wdHkga1BlcmlvZExlbmd0aCBhdCB2b3RpbmcgY29udHJhY3QAAAAAD2ZpcnN0QWN0aXZlVm90ZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAABF2b3RpbmdOZXdQb29sQWRkcgUAAAAPYWN0aXZlVm90ZUZpcnN0AgAAAAAAAAAAEHNlY29uZEFjdGl2ZVZvdGUJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAARdm90aW5nTmV3UG9vbEFkZHIFAAAAEGFjdGl2ZVZvdGVTZWNvbmQCAAAAAAAAAAAPdGhpcmRBY3RpdmVWb3RlCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAAEXZvdGluZ05ld1Bvb2xBZGRyBQAAAA9hY3RpdmVWb3RlVGhpcmQCAAAAAAAAAAAIaXNBY3RpdmUJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQbAAAAAgUAAAAEdGhpcwUAAAAHa0FjdGl2ZQYAAAAACmFpcmRyb3BGZWUJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABm9yYWNsZQUAAAALa0FpcmRyb3BGZWUAAAAAEGN1cnJWb3RpbmdQZXJpb2QJAABkAAAAAgUAAAAKYmFzZVBlcmlvZAkAAGkAAAACCQAAZQAAAAIFAAAABmhlaWdodAUAAAALc3RhcnRIZWlnaHQFAAAADHBlcmlvZExlbmd0aAEAAAAHc3VzcGVuZAAAAAEAAAAFY2F1c2UJAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIFAAAAB2tBY3RpdmUHCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAABmtDYXVzZQUAAAAFY2F1c2UFAAAAA25pbAEAAAASdGhyb3dOb3RFbm91Z2hTV09QAAAAAAkAAAIAAAABAgAAAEZOb3QgZW5vdWdoIFNXT1A6IHVzZXJTV09QTG9ja2VkIC0gdXNlclRvdGFsVm90ZUFtb3VudCA8IHZvdGVTV09QQW1vdW50AQAAABNnZXRMYXN0SW50ZXJlc3RJbmZvAAAAAAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAA1rTGFzdEludGVyZXN0AAAAAAAAAAAAAQAAABFnZXRVc2VyU1dPUExvY2tlZAAAAAEAAAAEdXNlcgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIJAAQlAAAAAQUAAAAEdXNlcgUAAAAPa1VzZXJTV09QTG9ja2VkAAAAAAAAAAAAAQAAABhnZXRVc2VyU1dPUENsYWltZWRBbW91bnQAAAABAAAABHVzZXIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkAASwAAAACCQAEJQAAAAEFAAAABHVzZXIFAAAAFmtVc2VyU1dPUENsYWltZWRBbW91bnQAAAAAAAAAAAABAAAAFmdldFVzZXJUb3RhbFZvdGVBbW91bnQAAAABAAAABHVzZXIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAKdm90aW5nQWRkcgkAASwAAAACCQAEJQAAAAEFAAAABHVzZXIFAAAAEmtVc2VyVG90YWxWb3RlU1dPUAAAAAAAAAAAAAEAAAATZ2V0VXNlckludGVyZXN0SW5mbwAAAAIAAAAEdXNlcgAAAAxsYXN0SW50ZXJlc3QEAAAADnVzZXJTV09QQW1vdW50CQEAAAARZ2V0VXNlclNXT1BMb2NrZWQAAAABBQAAAAR1c2VyBAAAABB1c2VyTGFzdEludGVyZXN0CQAEGgAAAAIFAAAABHRoaXMJAAEsAAAAAgkABCUAAAABBQAAAAR1c2VyBQAAABFrVXNlckxhc3RJbnRlcmVzdAQAAAAVdXNlckxhc3RJbnRlcmVzdFZhbHVlBAAAAAckbWF0Y2gwBQAAABB1c2VyTGFzdEludGVyZXN0AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAEHVzZXJMYXN0SW50ZXJlc3QFAAAAByRtYXRjaDAFAAAAEHVzZXJMYXN0SW50ZXJlc3QFAAAADGxhc3RJbnRlcmVzdAkABRQAAAACBQAAABV1c2VyTGFzdEludGVyZXN0VmFsdWUFAAAADnVzZXJTV09QQW1vdW50AQAAACBnZXRVc2VyVG90YWxWb3RlQW1vdW50Rm9yT25lUG9vbAAAAAIAAAAEcG9vbAAAAAR1c2VyBAAAAAZ2b3RpbmcJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAARdm90aW5nTmV3UG9vbEFkZHIFAAAABHBvb2wA//////////8EAAAADmhlaWdodE9mVm90aW5nCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAAEXZvdGluZ05ld1Bvb2xBZGRyCQABLAAAAAIJAAGkAAAAAQUAAAAGdm90aW5nBQAAAB1rSGVpZ2h0T2ZQb29sVm90aW5nRm9yTmV3UG9vbAAAAAAAAAAAAAQAAAAOc3RhdHVzT2ZWb3RpbmcJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQbAAAAAgUAAAARdm90aW5nTmV3UG9vbEFkZHIJAAEsAAAAAgkAAaQAAAABBQAAAAZ2b3RpbmcFAAAAGWtTdGF0dXNPZlZvdGluZ0Zvck5ld1Bvb2wGBAAAAA1jdXJyZW50SGVpZ2h0BQAAAAZoZWlnaHQDCQAAZgAAAAIAAAAAAAAAAAAFAAAABnZvdGluZwAAAAAAAAAAAAMJAQAAAAEhAAAAAQUAAAAOc3RhdHVzT2ZWb3RpbmcAAAAAAAAAAAADCQAAZgAAAAIFAAAADmhlaWdodE9mVm90aW5nBQAAAA1jdXJyZW50SGVpZ2h0CQAAZAAAAAIJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAARdm90aW5nTmV3UG9vbEFkZHIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAQlAAAAAQUAAAAEdXNlcgIAAAABXwkAAaQAAAABBQAAAAZ2b3RpbmcFAAAAFGtZZXNWb3RpbmdGb3JOZXdQb29sAAAAAAAAAAAACQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAAEXZvdGluZ05ld1Bvb2xBZGRyCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQAEJQAAAAEFAAAABHVzZXICAAAAAV8JAAGkAAAAAQUAAAAGdm90aW5nBQAAABNrTm9Wb3RpbmdGb3JOZXdQb29sAAAAAAAAAAAAAAAAAAAAAAAAAQAAACBnZXRVc2VyVG90YWxWb3RlRm9yTmV3UG9vbEFtb3VudAAAAAEAAAAEdXNlcgQAAAAMbGlzdE9mVm90aW5nCQAETAAAAAIJAQAAACBnZXRVc2VyVG90YWxWb3RlQW1vdW50Rm9yT25lUG9vbAAAAAIFAAAAD2ZpcnN0QWN0aXZlVm90ZQUAAAAEdXNlcgkABEwAAAACCQEAAAAgZ2V0VXNlclRvdGFsVm90ZUFtb3VudEZvck9uZVBvb2wAAAACBQAAABBzZWNvbmRBY3RpdmVWb3RlBQAAAAR1c2VyCQAETAAAAAIJAQAAACBnZXRVc2VyVG90YWxWb3RlQW1vdW50Rm9yT25lUG9vbAAAAAIFAAAAD3RoaXJkQWN0aXZlVm90ZQUAAAAEdXNlcgUAAAADbmlsCQABlgAAAAEFAAAADGxpc3RPZlZvdGluZwEAAAAYZ2V0VXNlckJsb2NrZWRJbkxhdWNocGFkAAAAAQAAAAR1c2VyBAAAAApsYXVjaHBhZElkCQABpAAAAAEJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAANbGF1bmNocGFkQWRkcgUAAAASa0xhdW5jaHBhZEFjdGl2ZUlkAAAAAAAAAAAAAwkAAAAAAAACBQAAAApsYXVjaHBhZElkAgAAAAEwAAAAAAAAAAAABAAAAAxsU3RhcnRIZWlnaHQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAANbGF1bmNocGFkQWRkcgkAASwAAAACBQAAAApsYXVjaHBhZElkBQAAABVrTGF1bmNocGFkU3RhcnRIZWlnaHQAAAAAAAAAAAAEAAAACWxEdXJhdGlvbgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAA1sYXVuY2hwYWRBZGRyCQABLAAAAAIFAAAACmxhdWNocGFkSWQFAAAAEmtMYXVuY2hwYWREdXJhdGlvbgAAAAAAAAAAAAQAAAATbEZyZWV6ZVN3b3BEdXJhdGlvbgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAA1sYXVuY2hwYWRBZGRyCQABLAAAAAIFAAAACmxhdWNocGFkSWQFAAAAGmtMYXVjaHBhZEZyZWV6U3dvcER1cmF0aW9uAAAAAAAAAAAABAAAAA5ibG9ja0VuZEhlaWdodAkAAGQAAAACCQAAZAAAAAIFAAAADGxTdGFydEhlaWdodAUAAAAJbER1cmF0aW9uBQAAABNsRnJlZXplU3dvcER1cmF0aW9uAwkAAGYAAAACBQAAAAZoZWlnaHQFAAAADmJsb2NrRW5kSGVpZ2h0AAAAAAAAAAAABAAAAA1ib3VnaHRUaWNrZXRzCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAADWxhdW5jaHBhZEFkZHIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAQlAAAAAQUAAAAEdXNlcgIAAAABXwUAAAAKbGF1Y2hwYWRJZAUAAAAXa0xhdW5jaHBhZEJvdWdodFRpY2tldHMAAAAAAAAAAAAEAAAADXN3b3BQZXJUaWNrZXQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAANbGF1bmNocGFkQWRkcgkAASwAAAACBQAAAApsYXVjaHBhZElkBQAAABhrTGF1bmNocGFkU3dvcFBlclRpY2tldHMAAAAAAAAAAAAJAABoAAAAAgUAAAANYm91Z2h0VGlja2V0cwUAAAANc3dvcFBlclRpY2tldAEAAAASZ2V0VG90YWxTV09QTG9ja2VkAAAAAAkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAABBrVG90YWxTV09QTG9ja2VkAAAAAAAAAAAAAQAAAA9nZXRVc2VyVm90ZUluZm8AAAABAAAABHVzZXIEAAAACyR0MDc1ODI4MTE1AwkBAAAACWlzRGVmaW5lZAAAAAEJAAQdAAAAAgUAAAAKdm90aW5nQWRkcgkAASwAAAACCQAEJQAAAAEFAAAABHVzZXIFAAAAD2tVc2VyVG90YWxTdHJ1YwQAAAAEZGF0YQkABLUAAAACCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAKdm90aW5nQWRkcgkAASwAAAACCQAEJQAAAAEFAAAABHVzZXIFAAAAD2tVc2VyVG90YWxTdHJ1YwIAAAAVRW1wdHkga1VzZXJUb3RhbFN0cnVjAgAAAAFfCQAFFQAAAAMJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAARkYXRhAAAAAAAAAAAACQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAEZGF0YQAAAAAAAAAAAQkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAABGRhdGEAAAAAAAAAAAIEAAAADnVQb29sVG90YWxTV09QCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAACnZvdGluZ0FkZHIJAAEsAAAAAgkABCUAAAABBQAAAAR1c2VyBQAAABJrVXNlclRvdGFsVm90ZVNXT1AAAAAAAAAAAAAJAAUVAAAAAwUAAAAOdVBvb2xUb3RhbFNXT1AAAAAAAAAAAAAFAAAAEGN1cnJWb3RpbmdQZXJpb2QEAAAAEXVzZXJUb3RhbFZvdGVTV09QCAUAAAALJHQwNzU4MjgxMTUAAAACXzEEAAAAC3VzZXJVbnZvdGVkCAUAAAALJHQwNzU4MjgxMTUAAAACXzIEAAAAEXVzZXJVbnZvdGVkUGVyaW9kCAUAAAALJHQwNzU4MjgxMTUAAAACXzMEAAAAEXVzZXJVbnZvdGVkQWN0dWFsAwkAAAAAAAACBQAAABF1c2VyVW52b3RlZFBlcmlvZAUAAAAQY3VyclZvdGluZ1BlcmlvZAUAAAALdXNlclVudm90ZWQAAAAAAAAAAAAJAAUUAAAAAgUAAAARdXNlclRvdGFsVm90ZVNXT1AFAAAAEXVzZXJVbnZvdGVkQWN0dWFsAQAAABdnZXRVc2VyVm90ZU9wdGlvbkFtb3VudAAAAAEAAAAEdXNlcgkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzCQABLAAAAAIJAAQlAAAAAQUAAAAEdXNlcgUAAAAVa1VzZXJWb3RlT3B0aW9uQW1vdW50AAAAAAAAAAAAAQAAABRnZXRWb3RpbmdTdGFydEhlaWdodAAAAAEAAAAIdm90ZU5hbWUJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwkAASwAAAACBQAAAAh2b3RlTmFtZQUAAAASa1ZvdGluZ1N0YXJ0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ABRJbmNvcnJlY3QgcG10QXNzZXRJZAQAAAAQYWlyZHJvcEZlZUFtb3VudAkBAAAACGZyYWN0aW9uAAAABAUAAAAJcG10QW1vdW50BQAAAAphaXJkcm9wRmVlAAAAAAAAAABkBQAAAAdDRUlMSU5HBAAAAA90b3RhbFNXT1BMb2NrZWQJAQAAABJnZXRUb3RhbFNXT1BMb2NrZWQAAAAABAAAAAxsYXN0SW50ZXJlc3QJAQAAABNnZXRMYXN0SW50ZXJlc3RJbmZvAAAAAAQAAAALaW50ZXJlc3ROZXcJAABkAAAAAgUAAAAMbGFzdEludGVyZXN0CQAAawAAAAMJAABlAAAAAgUAAAAJcG10QW1vdW50BQAAABBhaXJkcm9wRmVlQW1vdW50BQAAAApzY2FsZVZhbHVlBQAAAA90b3RhbFNXT1BMb2NrZWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAADWtMYXN0SW50ZXJlc3QFAAAAC2ludGVyZXN0TmV3CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAE2FpcmRyb3BNb25leUJveEFkZHIFAAAAEGFpcmRyb3BGZWVBbW91bnQFAAAABFNXT1AFAAAAA25pbAAAAAFpAQAAAAhsb2NrU1dPUAAAAAADCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQAAAgAAAAECAAAAH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQEAAAADSR0MDExNTU4MTE2MzMJAAUUAAAAAggJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAAAAAGYW1vdW50CAkAAZEAAAACCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAAAAAdhc3NldElkBAAAAAlwbXRBbW91bnQIBQAAAA0kdDAxMTU1ODExNjMzAAAAAl8xBAAAAApwbXRBc3NldElkCAUAAAANJHQwMTE1NTgxMTYzMwAAAAJfMgMJAQAAAAIhPQAAAAIFAAAACnBtdEFzc2V0SWQFAAAABFNXT1AJAAACAAAAAQIAAAAUSW5jb3JyZWN0IHBtdEFzc2V0SWQEAAAADGxhc3RJbnRlcmVzdAkBAAAAE2dldExhc3RJbnRlcmVzdEluZm8AAAAABAAAAA0kdDAxMTc0OTExODMzCQEAAAATZ2V0VXNlckludGVyZXN0SW5mbwAAAAIIBQAAAAFpAAAABmNhbGxlcgUAAAAMbGFzdEludGVyZXN0BAAAABB1c2VyTGFzdEludGVyZXN0CAUAAAANJHQwMTE3NDkxMTgzMwAAAAJfMQQAAAAOdXNlclNXT1BMb2NrZWQIBQAAAA0kdDAxMTc0OTExODMzAAAAAl8yBAAAAAtjbGFpbUFtb3VudAkAAGsAAAADBQAAAA51c2VyU1dPUExvY2tlZAkAAGUAAAACBQAAAAxsYXN0SW50ZXJlc3QFAAAAEHVzZXJMYXN0SW50ZXJlc3QFAAAACnNjYWxlVmFsdWUEAAAAEXVzZXJTV09QTG9ja2VkTmV3CQAAZAAAAAIJAABkAAAAAgUAAAAOdXNlclNXT1BMb2NrZWQFAAAACXBtdEFtb3VudAUAAAALY2xhaW1BbW91bnQEAAAAD3VzZXJOZXdJbnRlcmVzdAUAAAAMbGFzdEludGVyZXN0BAAAAA90b3RhbFNXT1BMb2NrZWQJAQAAABJnZXRUb3RhbFNXT1BMb2NrZWQAAAAABAAAABJ0b3RhbFNXT1BMb2NrZWROZXcJAABkAAAAAgkAAGQAAAACBQAAAA90b3RhbFNXT1BMb2NrZWQFAAAACXBtdEFtb3VudAUAAAALY2xhaW1BbW91bnQEAAAAEXVzZXJDbGFpbWVkQW1vdW50CQEAAAAYZ2V0VXNlclNXT1BDbGFpbWVkQW1vdW50AAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAABR1c2VyQ2xhaW1lZEFtb3VudE5ldwkAAGQAAAACBQAAABF1c2VyQ2xhaW1lZEFtb3VudAUAAAALY2xhaW1BbW91bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAAEWtVc2VyTGFzdEludGVyZXN0BQAAAA91c2VyTmV3SW50ZXJlc3QJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAAD2tVc2VyU1dPUExvY2tlZAUAAAARdXNlclNXT1BMb2NrZWROZXcJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAEGtUb3RhbFNXT1BMb2NrZWQFAAAAEnRvdGFsU1dPUExvY2tlZE5ldwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgUAAAAWa1VzZXJTV09QQ2xhaW1lZEFtb3VudAUAAAAUdXNlckNsYWltZWRBbW91bnROZXcJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAAGmtVc2VyU1dPUExhc3RDbGFpbWVkQW1vdW50BQAAAAtjbGFpbUFtb3VudAUAAAADbmlsAAAAAWkBAAAADHdpdGhkcmF3U1dPUAAAAAEAAAAOd2l0aGRyYXdBbW91bnQDCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQAAAgAAAAECAAAAH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQDCQAAZwAAAAIAAAAAAAAAAAAFAAAADndpdGhkcmF3QW1vdW50CQAAAgAAAAECAAAAE3dpdGhkcmF3QW1vdW50IDw9IDAEAAAAD3RvdGFsU1dPUExvY2tlZAkBAAAAEmdldFRvdGFsU1dPUExvY2tlZAAAAAAEAAAADnVzZXJTV09QTG9ja2VkCQEAAAARZ2V0VXNlclNXT1BMb2NrZWQAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAADSR0MDEyOTc0MTMwMjkJAQAAAAljbGFpbUNhbGMAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAD3VzZXJOZXdJbnRlcmVzdAgFAAAADSR0MDEyOTc0MTMwMjkAAAACXzEEAAAAC2NsYWltQW1vdW50CAUAAAANJHQwMTI5NzQxMzAyOQAAAAJfMgQAAAANJHQwMTMwMzQxMzA5OQkBAAAAD2dldFVzZXJWb3RlSW5mbwAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAAOdXNlclZvdGVBbW91bnQIBQAAAA0kdDAxMzAzNDEzMDk5AAAAAl8xBAAAABB1c2VyVW52b3RlQW1vdW50CAUAAAANJHQwMTMwMzQxMzA5OQAAAAJfMgQAAAAYdXNlclZvdGVBbW91bnRGb3JOZXdQb29sCQEAAAAgZ2V0VXNlclRvdGFsVm90ZUZvck5ld1Bvb2xBbW91bnQAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAEmJsb2NrZWRJbkxhdW5jaHBhZAkBAAAAGGdldFVzZXJCbG9ja2VkSW5MYXVjaHBhZAAAAAEIBQAAAAFpAAAABmNhbGxlcgMDAwkAAGYAAAACAAAAAAAAAAAABQAAABB1c2VyVW52b3RlQW1vdW50BgkAAGYAAAACAAAAAAAAAAAABQAAAA51c2VyVm90ZUFtb3VudAYJAABmAAAAAgAAAAAAAAAAAAUAAAAYdXNlclZvdGVBbW91bnRGb3JOZXdQb29sCQAAAgAAAAECAAAASnVzZXJVbnZvdGVBbW91bnQgPCAwIHx8IHVzZXJWb3RlQW1vdW50IDwgMCB8fCB1c2VyVm90ZUFtb3VudEZvck5ld1Bvb2wgPCAwBAAAABJhdmFpbGFibGVUb1Vuc3Rha2UJAABlAAAAAgUAAAAOdXNlclNXT1BMb2NrZWQJAAGWAAAAAQkABEwAAAACBQAAABh1c2VyVm90ZUFtb3VudEZvck5ld1Bvb2wJAARMAAAAAgkAAGQAAAACBQAAAA51c2VyVm90ZUFtb3VudAUAAAAQdXNlclVudm90ZUFtb3VudAkABEwAAAACBQAAABJibG9ja2VkSW5MYXVuY2hwYWQFAAAAA25pbAMJAABmAAAAAgUAAAAOd2l0aGRyYXdBbW91bnQFAAAAEmF2YWlsYWJsZVRvVW5zdGFrZQkAAAIAAAABAgAAACN3aXRoZHJhd0Ftb3VudCA+IGF2YWlsYWJsZVRvVW5zdGFrZQQAAAASdG90YWxTV09QTG9ja2VkTmV3CQAAZQAAAAIJAABkAAAAAgUAAAAPdG90YWxTV09QTG9ja2VkBQAAAAtjbGFpbUFtb3VudAUAAAAOd2l0aGRyYXdBbW91bnQEAAAAEXVzZXJTV09QYW1vdW50TmV3CQAAZQAAAAIJAABkAAAAAgUAAAAOdXNlclNXT1BMb2NrZWQFAAAAC2NsYWltQW1vdW50BQAAAA53aXRoZHJhd0Ftb3VudAQAAAARdXNlckNsYWltZWRBbW91bnQJAQAAABhnZXRVc2VyU1dPUENsYWltZWRBbW91bnQAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAFHVzZXJDbGFpbWVkQW1vdW50TmV3CQAAZAAAAAIFAAAAEXVzZXJDbGFpbWVkQW1vdW50BQAAAAtjbGFpbUFtb3VudAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgUAAAARa1VzZXJMYXN0SW50ZXJlc3QFAAAAD3VzZXJOZXdJbnRlcmVzdAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgUAAAAPa1VzZXJTV09QTG9ja2VkBQAAABF1c2VyU1dPUGFtb3VudE5ldwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAQa1RvdGFsU1dPUExvY2tlZAUAAAASdG90YWxTV09QTG9ja2VkTmV3CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgUAAAAOd2l0aGRyYXdBbW91bnQFAAAABFNXT1AJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAAFmtVc2VyU1dPUENsYWltZWRBbW91bnQFAAAAFHVzZXJDbGFpbWVkQW1vdW50TmV3CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBQAAABprVXNlclNXT1BMYXN0Q2xhaW1lZEFtb3VudAUAAAALY2xhaW1BbW91bnQFAAAAA25pbAAAAAFpAQAAABRjbGFpbUFuZFdpdGhkcmF3U1dPUAAAAAADCQEAAAABIQAAAAEFAAAACGlzQWN0aXZlCQAAAgAAAAECAAAAH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQEAAAADGxhc3RJbnRlcmVzdAkBAAAAE2dldExhc3RJbnRlcmVzdEluZm8AAAAABAAAAA0kdDAxNDU0OTE0NjA0CQEAAAAJY2xhaW1DYWxjAAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAAA91c2VyTmV3SW50ZXJlc3QIBQAAAA0kdDAxNDU0OTE0NjA0AAAAAl8xBAAAAAtjbGFpbUFtb3VudAgFAAAADSR0MDE0NTQ5MTQ2MDQAAAACXzIEAAAAEXVzZXJDbGFpbWVkQW1vdW50CQEAAAAYZ2V0VXNlclNXT1BDbGFpbWVkQW1vdW50AAAAAQgFAAAAAWkAAAAGY2FsbGVyBAAAABR1c2VyQ2xhaW1lZEFtb3VudE5ldwkAAGQAAAACBQAAABF1c2VyQ2xhaW1lZEFtb3VudAUAAAALY2xhaW1BbW91bnQDCQAAAAAAAAIFAAAAC2NsYWltQW1vdW50AAAAAAAAAAAACQAAAgAAAAECAAAAGVlvdSBoYXZlIDAgYXZhaWxhYmxlIFNXT1AJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAAEWtVc2VyTGFzdEludGVyZXN0BQAAAA91c2VyTmV3SW50ZXJlc3QJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgkABCUAAAABCAUAAAABaQAAAAZjYWxsZXIFAAAAFmtVc2VyU1dPUENsYWltZWRBbW91bnQFAAAAFHVzZXJDbGFpbWVkQW1vdW50TmV3CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBQAAABprVXNlclNXT1BMYXN0Q2xhaW1lZEFtb3VudAUAAAALY2xhaW1BbW91bnQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAtjbGFpbUFtb3VudAUAAAAEU1dPUAUAAAADbmlsAAAAAWkBAAAAEWNsYWltQW5kU3Rha2VTV09QAAAAAAMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAAACAAAAAQIAAAAfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAQAAAAPdG90YWxTV09QTG9ja2VkCQEAAAASZ2V0VG90YWxTV09QTG9ja2VkAAAAAAQAAAAOdXNlclNXT1BMb2NrZWQJAQAAABFnZXRVc2VyU1dPUExvY2tlZAAAAAEIBQAAAAFpAAAABmNhbGxlcgQAAAAMbGFzdEludGVyZXN0CQEAAAATZ2V0TGFzdEludGVyZXN0SW5mbwAAAAAEAAAADSR0MDE1Mzc3MTU0MzIJAQAAAAljbGFpbUNhbGMAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAD3VzZXJOZXdJbnRlcmVzdAgFAAAADSR0MDE1Mzc3MTU0MzIAAAACXzEEAAAAC2NsYWltQW1vdW50CAUAAAANJHQwMTUzNzcxNTQzMgAAAAJfMgQAAAARdXNlclNXT1BMb2NrZWROZXcJAABkAAAAAgUAAAAOdXNlclNXT1BMb2NrZWQFAAAAC2NsYWltQW1vdW50BAAAABJ0b3RhbFNXT1BMb2NrZWROZXcJAABkAAAAAgUAAAAPdG90YWxTV09QTG9ja2VkBQAAAAtjbGFpbUFtb3VudAQAAAARdXNlckNsYWltZWRBbW91bnQJAQAAABhnZXRVc2VyU1dPUENsYWltZWRBbW91bnQAAAABCAUAAAABaQAAAAZjYWxsZXIEAAAAFHVzZXJDbGFpbWVkQW1vdW50TmV3CQAAZAAAAAIFAAAAEXVzZXJDbGFpbWVkQW1vdW50BQAAAAtjbGFpbUFtb3VudAMJAAAAAAAAAgUAAAALY2xhaW1BbW91bnQAAAAAAAAAAAAJAAACAAAAAQIAAAAZWW91IGhhdmUgMCBhdmFpbGFibGUgU1dPUAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgUAAAARa1VzZXJMYXN0SW50ZXJlc3QFAAAAD3VzZXJOZXdJbnRlcmVzdAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAQa1RvdGFsU1dPUExvY2tlZAUAAAASdG90YWxTV09QTG9ja2VkTmV3CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBQAAAA9rVXNlclNXT1BMb2NrZWQFAAAAEXVzZXJTV09QTG9ja2VkTmV3CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIJAAQlAAAAAQgFAAAAAWkAAAAGY2FsbGVyBQAAABZrVXNlclNXT1BDbGFpbWVkQW1vdW50BQAAABR1c2VyQ2xhaW1lZEFtb3VudE5ldwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkAASwAAAACCQAEJQAAAAEIBQAAAAFpAAAABmNhbGxlcgUAAAAaa1VzZXJTV09QTGFzdENsYWltZWRBbW91bnQFAAAAC2NsYWltQW1vdW50BQAAAANuaWwAAAABaQEAAAANdXBkYXRlV2VpZ2h0cwAAAAQAAAAMY3VycmVudFBvb2xzAAAADmN1cnJlbnRSZXdhcmRzAAAAEnJld2FyZFVwZGF0ZUhlaWdodAAAAApwYWdpbmF0aW9uAwkBAAAAASEAAAABBQAAAAhpc0FjdGl2ZQkAAAIAAAABAgAAAB9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50BAAAAAthbW91bnRQb29scwAAAAAAAAAACgQAAAAXdG90YWxSZXdhcmRVcGRhdGVIZWlnaHQJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAATa1Jld2FyZFVwZGF0ZUhlaWdodAAAAAAAAAAAAAMJAQAAAAEhAAAAAQkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkxCQAETAAAAAIFAAAADGFkbWluUHViS2V5MgkABEwAAAACBQAAAAxhZG1pblB1YktleTMJAARMAAAAAgUAAAAObW9uZXlCb3hQdWJLZXkFAAAAA25pbAgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQAAAgAAAAECAAAAIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgMJAABmAAAAAgkAAZAAAAABBQAAAAxjdXJyZW50UG9vbHMFAAAAC2Ftb3VudFBvb2xzCQAAAgAAAAEJAAEsAAAAAgIAAAAWTWF4IGFtb3VudCBvZiBwb29sIGlzIAkAAaQAAAABBQAAAAthbW91bnRQb29scwMJAABnAAAAAgUAAAAXdG90YWxSZXdhcmRVcGRhdGVIZWlnaHQFAAAAEnJld2FyZFVwZGF0ZUhlaWdodAkAAAIAAAABAgAAAC1yZXdhcmRVcGRhdGVIZWlnaHQgPD0gdG90YWxSZXdhcmRVcGRhdGVIZWlnaHQDCQAAZwAAAAIFAAAABmhlaWdodAUAAAAScmV3YXJkVXBkYXRlSGVpZ2h0CQAAAgAAAAECAAAAHGhlaWdodCA+PSByZXdhcmRVcGRhdGVIZWlnaHQDCQAAZwAAAAIAAAAAAAAAAAAFAAAAEnJld2FyZFVwZGF0ZUhlaWdodAkAAAIAAAABAgAAABgwID49IHJld2FyZFVwZGF0ZUhlaWdodCAKAQAAAANzdW0AAAACAAAAAWEAAAABYgkAAGQAAAACBQAAAAFhBQAAAAFiCgEAAAAZY2hhbmdlUHJldmlvdXNSZXdhcmRFbnRyeQAAAAIAAAALYWNjdW11bGF0ZWQAAAAEcG9vbAQAAAAWcG9vbFJld2FyZFVwZGF0ZUhlaWdodAkBAAAAE2dldFBvb2xVcGRhdGVIZWlnaHQAAAABBQAAAARwb29sAwMJAQAAAAEhAAAAAQkBAAAAGGlzRGVmaW5lUG9vbFVwZGF0ZUhlaWdodAAAAAEFAAAABHBvb2wGAwkBAAAAAiE9AAAAAgUAAAAScmV3YXJkVXBkYXRlSGVpZ2h0BQAAABZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0CQAAAAAAAAIFAAAAFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQFAAAAF3RvdGFsUmV3YXJkVXBkYXRlSGVpZ2h0BwQAAAAKcG9vbFJld2FyZAkBAAAAEGdldEN1clBvb2xXZWlnaHQAAAABBQAAAARwb29sCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAABHBvb2wFAAAAG2tSZXdhcmRQb29sRnJhY3Rpb25QcmV2aW91cwUAAAAKcG9vbFJld2FyZAUAAAALYWNjdW11bGF0ZWQEAAAACnBvb2xSZXdhcmQJAQAAABFnZXRQcmV2UG9vbFdlaWdodAAAAAEFAAAABHBvb2wJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgUAAAAEcG9vbAUAAAAba1Jld2FyZFBvb2xGcmFjdGlvblByZXZpb3VzBQAAAApwb29sUmV3YXJkBQAAAAthY2N1bXVsYXRlZAoBAAAAGGNoYW5nZUN1cnJlbnRSZXdhcmRFbnRyeQAAAAIAAAALYWNjdW11bGF0ZWQAAAAEcG9vbAQAAAAJcG9vbEluZGV4CQEAAAAFdmFsdWUAAAABCQAETwAAAAIFAAAADGN1cnJlbnRQb29scwUAAAAEcG9vbAQAAAAKcG9vbFJld2FyZAkAAZEAAAACBQAAAA5jdXJyZW50UmV3YXJkcwUAAAAJcG9vbEluZGV4AwkAAGYAAAACAAAAAAAAAAAABQAAAApwb29sUmV3YXJkCQAAAgAAAAECAAAADlBvb2xSZXdhcmQgPCAwCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAIFAAAABHBvb2wFAAAAGmtSZXdhcmRQb29sRnJhY3Rpb25DdXJyZW50BQAAAApwb29sUmV3YXJkBQAAAAthY2N1bXVsYXRlZAoBAAAAEWNoYW5nZUhlaWdodEVudHJ5AAAAAgAAAAthY2N1bXVsYXRlZAAAAARwb29sBAAAAApwb29sSGVpZ2h0BQAAABJyZXdhcmRVcGRhdGVIZWlnaHQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAAEsAAAAAgUAAAAEcG9vbAUAAAATa0hlaWdodFBvb2xGcmFjdGlvbgUAAAAKcG9vbEhlaWdodAUAAAALYWNjdW11bGF0ZWQKAQAAAAxnZXRTdW1SZXdhcmQAAAACAAAACmN1clRlbXBTdW0AAAAKcGFnaW5hdGlvbgMJAAAAAAAAAgUAAAAKcGFnaW5hdGlvbgAAAAAAAAAAAAMJAABmAAAAAgUAAAAKY3VyVGVtcFN1bQUAAAAOdG90YWxWb3RlU2hhcmUJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAABKc3VtUmV3YXJkUHJldmlvdXMgPiB0b3RhbFZvdGVTaGFyZSBvciBzdW1SZXdhcmRDdXJyZW50ID4gdG90YWxWb3RlU2hhcmUgLSAJAAGkAAAAAQUAAAAKcGFnaW5hdGlvbgIAAAABIAkAAaQAAAABBQAAAApjdXJUZW1wU3VtCQAFFAAAAAIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAC2tUZW1wQ3VyU3VtBQAAAApjdXJUZW1wU3VtBQAAAANuaWwJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAImtSZXdhcmRVcGRhdGVGaXJzdFBhZ2luYXRpb25IZWlnaHQFAAAAEnJld2FyZFVwZGF0ZUhlaWdodAUAAAADbmlsAwkAAAAAAAACBQAAAApwYWdpbmF0aW9uAAAAAAAAAAABBAAAABFjdXJUZW1wU3VtRnJvbUtleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAAtrVGVtcEN1clN1bQAAAAAAAAAAAAQAAAAmcmV3YXJkVXBkYXRlSGVpZ2h0Rmlyc3RQYWdpbmF0aW9uRW50cnkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAAia1Jld2FyZFVwZGF0ZUZpcnN0UGFnaW5hdGlvbkhlaWdodAAAAAAAAAAAAAMJAABmAAAAAgkAAGQAAAACBQAAAApjdXJUZW1wU3VtBQAAABFjdXJUZW1wU3VtRnJvbUtleQUAAAAOdG90YWxWb3RlU2hhcmUJAAACAAAAAQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAABKc3VtUmV3YXJkUHJldmlvdXMgPiB0b3RhbFZvdGVTaGFyZSBvciBzdW1SZXdhcmRDdXJyZW50ID4gdG90YWxWb3RlU2hhcmUgLSAJAAGkAAAAAQUAAAAKcGFnaW5hdGlvbgIAAAABIAkAAaQAAAABCQAAZAAAAAIFAAAACmN1clRlbXBTdW0FAAAAEWN1clRlbXBTdW1Gcm9tS2V5AwkBAAAAAiE9AAAAAgUAAAAmcmV3YXJkVXBkYXRlSGVpZ2h0Rmlyc3RQYWdpbmF0aW9uRW50cnkFAAAAEnJld2FyZFVwZGF0ZUhlaWdodAkAAAIAAAABAgAAAERjdXJyZW50IHJld2FyZFVwZGF0ZUhlaWdodCAhPSByZXdhcmRVcGRhdGVIZWlnaHRGaXJzdFBhZ2luYXRpb25FbnRyeQkABRQAAAACCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAAAtrVGVtcEN1clN1bQkAAGQAAAACBQAAAApjdXJUZW1wU3VtBQAAABFjdXJUZW1wU3VtRnJvbUtleQUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAACnBhZ2luYXRpb24AAAAAAAAAAAIEAAAABmN1clN1bQkAAGQAAAACCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMF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AAAFJGYzXzEAAAACCQEAAAAFJGYzXzEAAAACCQEAAAAFJGYzXzEAAAACBQAAAAUkYWNjMAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAgAAAAAAAAAAAwAAAAAAAAAABAAAAAAAAAAABQAAAAAAAAAABgAAAAAAAAAABwAAAAAAAAAACAAAAAAAAAAACQAAAAAAAAAACgQAAAANJHQwMjA1MjcyMDYzOAkBAAAADGdldFN1bVJld2FyZAAAAAIFAAAAFHN1bVJld2FyZEN1cnJlbnRUZW1wBQAAAApwYWdpbmF0aW9uBAAAABBzdW1SZXdhcmRDdXJyZW50CAUAAAANJHQwMjA1MjcyMDYzOAAAAAJfMQQAAAAmcmV3YXJkVXBkYXRlSGVpZ2h0Rmlyc3RQYWdpbmF0aW9uRW50cnkIBQAAAA0kdDAyMDUyNzIwNjM4AAAAAl8yBAAAABdyZXdhcmRVcGRhdGVIZWlnaHRFbnRyeQMJAAAAAAAAAgUAAAAKcGFnaW5hdGlvbgAAAAAAAAAAAgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAATa1Jld2FyZFVwZGF0ZUhlaWdodAUAAAAScmV3YXJkVXBkYXRlSGVpZ2h0BQAAAANuaWwFAAAAA25pbAMJAABmAAAAAgUAAAAGaGVpZ2h0BQAAABJyZXdhcmRVcGRhdGVIZWlnaHQJAAACAAAAAQIAAAAbcmV3YXJkVXBkYXRlSGVpZ2h0IDwgaGVpZ2h0CQAETgAAAAIJAAROAAAAAgkABE4AAAACCQAETgAAAAIJAAROAAAAAgUAAAAWcHJldmlvdXNSZXdhcmRFbnRyeU5ldwUAAAAVY3VycmVudFJld2FyZEVudHJ5TmV3BQAAABFoZWlnaHRFbnRyeU5ld0N1cgUAAAAQc3VtUmV3YXJkQ3VycmVudAUAAAAXcmV3YXJkVXBkYXRlSGVpZ2h0RW50cnkFAAAAJnJld2FyZFVwZGF0ZUhlaWdodEZpcnN0UGFnaW5hdGlvbkVudHJ5AAAAAWkBAAAACHNodXRkb3duAAAAAAMJAQAAAAEhAAAAAQUAAAAIaXNBY3RpdmUJAAACAAAAAQkAASwAAAACAgAAACJEQXBwIGlzIGFscmVhZHkgc3VzcGVuZGVkLiBDYXVzZTogCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAABmtDYXVzZQIAAAAadGhlIGNhdXNlIHdhc24ndCBzcGVjaWZpZWQDCQEAAAABIQAAAAEJAQAAAA9jb250YWluc0VsZW1lbnQAAAACCQAETAAAAAIFAAAADGFkbWluUHViS2V5MQkABEwAAAACBQAAAAxhZG1pblB1YktleTIJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkzBQAAAANuaWwIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQkAAAIAAAABAgAAACFPbmx5IGFkbWluIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24JAQAAAAdzdXNwZW5kAAAAAQIAAAAPUGF1c2VkIGJ5IGFkbWluAAAAAWkBAAAACGFjdGl2YXRlAAAAAAMFAAAACGlzQWN0aXZlCQAAAgAAAAECAAAAFkRBcHAgaXMgYWxyZWFkeSBhY3RpdmUDCQEAAAABIQAAAAEJAQAAAA9jb250YWluc0VsZW1lbnQAAAACCQAETAAAAAIFAAAADGFkbWluUHViS2V5MQkABEwAAAACBQAAAAxhZG1pblB1YktleTIJAARMAAAAAgUAAAAMYWRtaW5QdWJLZXkzBQAAAANuaWwIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQkAAAIAAAABAgAAACFPbmx5IGFkbWluIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24JAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIFAAAAB2tBY3RpdmUGCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEFAAAABmtDYXVzZQUAAAADbmlsAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAQAAAASYWRtaW5QdWJLZXkxU2lnbmVkAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAFAAAADGFkbWluUHViS2V5MQAAAAAAAAAAAQAAAAAAAAAAAAQAAAASYWRtaW5QdWJLZXkyU2lnbmVkAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAEFAAAADGFkbWluUHViS2V5MgAAAAAAAAAAAQAAAAAAAAAAAAQAAAASYWRtaW5QdWJLZXkzU2lnbmVkAwkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAIFAAAADGFkbWluUHViS2V5MwAAAAAAAAAAAQAAAAAAAAAAAAkAAGcAAAACCQAAZAAAAAIJAABkAAAAAgUAAAASYWRtaW5QdWJLZXkxU2lnbmVkBQAAABJhZG1pblB1YktleTJTaWduZWQFAAAAEmFkbWluUHViS2V5M1NpZ25lZAAAAAAAAAAAAja/C7E=", "height": 2077249, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BK85gobj8wBzT2CrcHBtSAJKQpZxLc7Bs5EsRzcN3RaP Next: AE4HGsdfNDt436j1aDSNi5CQ14odP5CnEQD2gxNFJi6 Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 4 #-}
1+{-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let adminPubKey1 = base58'GFmKZ2naZFRoCvNbwKAQVGmLb1uBeWGDgFabdGBuZiuy'
4+let kActive = "active"
55
6-let adminPubKey2 = base58'GmJXRyhRA79g8yUGgKBAVdnFfQFDMjQG98b1MmLDh5kk'
6+let kCause = "shutdown_cause"
77
8-let adminPubKey3 = base58'CFhbV6h41hVjbGHudGtS3fYUv7QAKRxFQzKNtx4B5PqP'
8+let kLastInterest = "last_interest"
99
10-let adminPubKeyStartStop = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
10+let kUserLastInterest = "_last_interest"
1111
12-let adminPubKeyWallet = base58'5CqqMkmtXXt35KRH9LdWA3ap6TffPvTT5SHQzYrVFbBw'
12+let kUserSWOPLocked = "_SWOP_amount"
1313
14-let keyActive = "active"
14+let kUserGetBackHeight = "_getBackHeight"
1515
16-let keyCause = "shutdown_cause"
17-
18-let keyLastInterest = "last_interest"
19-
20-let keyUserLastInterest = "_last_interest"
21-
22-let keyUserSWOPLocked = "_SWOP_amount"
23-
24-let keyUserGetBackHeight = "_getBackHeight"
25-
26-let keyTotalSWOPLocked = "total_SWOP_amount"
16+let kTotalSWOPLocked = "total_SWOP_amount"
2717
2818 let kUserTotalVoteSWOP = "_user_total_SWOP_vote"
2919
30-let keyUserVoteOptionAmount = "_SWOP_option_amount"
20+let kUserVoteOptionAmount = "_SWOP_option_amount"
3121
32-let keyTotalVoteOptionAmount = "total_SWOP_option_amount"
22+let kTotalVoteOptionAmount = "total_SWOP_option_amount"
3323
34-let keyUserSWOPClaimedAmount = "_SWOP_claimed_amount"
24+let kUserSWOPClaimedAmount = "_SWOP_claimed_amount"
3525
36-let keyUserSWOPLastClaimedAmount = "_SWOP_last_claimed_amount"
26+let kUserSWOPLastClaimedAmount = "_SWOP_last_claimed_amount"
3727
38-let keyVoteName = "vote_name"
28+let kVoteName = "vote_name"
3929
40-let keyOptionName = "_option_name"
30+let kOptionName = "_option_name"
4131
42-let keyVotingStartHeight = "_startHeight"
32+let kVotingStartHeight = "_startHeight"
4333
44-let keyVoteDuration = "_vote_duration"
34+let kVoteDuration = "_vote_duration"
4535
46-let keyRewardPoolFractionCurrent = "_current_pool_fraction_reward"
36+let kRewardPoolFractionCurrent = "_current_pool_fraction_reward"
4737
48-let keyRewardPoolFractionPrevious = "_previous_pool_fraction_reward"
38+let kRewardPoolFractionPrevious = "_previous_pool_fraction_reward"
4939
50-let keyHeightPoolFraction = "_pool_reward_update_height"
40+let kHeightPoolFraction = "_pool_reward_update_height"
5141
52-let keyTotalRewardPerBlockCurrent = "total_reward_per_block_current"
42+let kTotalRewardPerBlockCurrent = "total_reward_per_block_current"
5343
54-let keyTotalRewardPerBlockPrevious = "total_reward_per_block_previous"
44+let kTotalRewardPerBlockPrevious = "total_reward_per_block_previous"
5545
56-let keyRewardUpdateHeight = "reward_update_height"
46+let kRewardUpdateHeight = "reward_update_height"
5747
58-let keyRewardUpdateFirstPaginationHeight = "reward_update_height_first_pagination"
48+let kRewardUpdateFirstPaginationHeight = "reward_update_height_first_pagination"
5949
60-let keyNoVotingForNewPool = "_vote_no"
50+let kNoVotingForNewPool = "_vote_no"
6151
62-let keyYesVotingForNewPool = "_vote_yes"
52+let kYesVotingForNewPool = "_vote_yes"
6353
64-let keyAmountOfVotingForNewPool = "max_amount_voting"
54+let kAmountOfVotingForNewPool = "max_amount_voting"
6555
66-let keyStatusOfVotingForNewPool = "_status"
56+let kStatusOfVotingForNewPool = "_status"
6757
68-let keyHeightOfPoolVotingForNewPool = "_finish_height"
58+let kHeightOfPoolVotingForNewPool = "_finish_height"
6959
7060 let activeVoteFirst = "voting_active_cell_1"
7161
7363
7464 let activeVoteThird = "voting_active_cell_3"
7565
76-let keyTempCurSum = "sum_reward_current"
66+let kTempCurSum = "sum_reward_current"
7767
78-let keyLaunchpadBoughtTickets = "_bought_tickets"
68+let kLaunchpadBoughtTickets = "_bought_tickets"
7969
80-let keyLaunchpadSwopPerTickets = "_swop_per_ticket"
70+let kLaunchpadSwopPerTickets = "_swop_per_ticket"
8171
82-let keyLaunchpadActiveId = "launchpad_active_id"
72+let kLaunchpadActiveId = "launchpad_active_id"
8373
84-let keyLaunchpadDuration = "_duration"
74+let kLaunchpadDuration = "_duration"
8575
86-let keyLaunchpadStartHeight = "_start_height"
87-
88-let keyLauchpadFreezSwopDuration = "_freeze_swop_duration"
89-
90-let isActive = valueOrElse(getBoolean(this, keyActive), true)
91-
92-let farmingSWOPAddress = Address(base58'3MsxHxruYWoddB4HRiPBYAWtMXMtCF1V9XT')
93-
94-let votingLiteContract = Address(base58'3MrJgdL1GniipErHy44YF9idzLaUL2iX5DQ')
95-
96-let votingForNewPool = Address(base58'3Mzgi6deFV8CyF2nqbWSBkqba5JaD42EXyb')
97-
98-let launchpad = Address(base58'3MzDGFvPnXVbA4wCacqcVnfVJPwG952KVAg')
99-
100-let keySWOPid = "SWOP_id"
101-
102-let SWOP = fromBase58String(getStringValue(farmingSWOPAddress, keySWOPid))
103-
104-let scaleValue = 100000000
105-
106-let totalVoteShare = 10000000000
76+let kLaunchpadStartHeight = "_start_height"
10777
10878 let kStartHeight = "start_height"
10979
11383
11484 let kUserTotalStruc = "_user_total_struc"
11585
116-let basePeriod = valueOrErrorMessage(getInteger(votingLiteContract, kBasePeriod), "Empty kBasePeriod at voting contract")
86+let kLauchpadFreezSwopDuration = "_freeze_swop_duration"
11787
118-let startHeight = valueOrErrorMessage(getInteger(votingLiteContract, kStartHeight), "Empty kStartHeight at voting contract")
88+let kSWOPid = "SWOP_id"
11989
120-let periodLength = valueOrErrorMessage(getInteger(votingLiteContract, kPeriodLength), "Empty kPeriodLength at voting contract")
90+let kAirdropFee = "airdrop_fee"
12191
122-let firstActiveVote = valueOrElse(getString(votingForNewPool, activeVoteFirst), "")
92+let kAdminPubKey1 = "admin_pub_1"
12393
124-let secondActiveVote = valueOrElse(getString(votingForNewPool, activeVoteSecond), "")
94+let kAdminPubKey2 = "admin_pub_2"
12595
126-let thirdActiveVote = valueOrElse(getString(votingForNewPool, activeVoteThird), "")
96+let kAdminPubKey3 = "admin_pub_3"
97+
98+let kMoneyBoxPubKey = "money_box_pub_key"
99+
100+let kFarmingAddr = "farming_address"
101+
102+let kVotingAddr = "voting_address"
103+
104+let kVotingNewPoolAddr = "voting_new_pool_address"
105+
106+let kLaunchpadAddr = "launchpad_address"
107+
108+let kAirdropMoneyBoxAddr = "airdrop_fee_money_box"
109+
110+let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
111+
112+func getBase58FromOracle (key) = match getString(oracle, key) {
113+ case string: String =>
114+ fromBase58String(string)
115+ case nothing =>
116+ throw((key + "is empty"))
117+}
118+
119+
120+let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
121+
122+let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
123+
124+let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
125+
126+let moneyBoxPubKey = getBase58FromOracle(kMoneyBoxPubKey)
127+
128+let farmingAddr = Address(getBase58FromOracle(kFarmingAddr))
129+
130+let votingAddr = Address(getBase58FromOracle(kVotingAddr))
131+
132+let votingNewPoolAddr = Address(getBase58FromOracle(kVotingNewPoolAddr))
133+
134+let launchpadAddr = Address(getBase58FromOracle(kLaunchpadAddr))
135+
136+let airdropMoneyBoxAddr = Address(getBase58FromOracle(kAirdropMoneyBoxAddr))
137+
138+let SWOP = fromBase58String(getStringValue(farmingAddr, kSWOPid))
139+
140+let scaleValue = 100000000
141+
142+let totalVoteShare = 10000000000
143+
144+let basePeriod = valueOrErrorMessage(getInteger(votingAddr, kBasePeriod), "Empty kBasePeriod at voting contract")
145+
146+let startHeight = valueOrErrorMessage(getInteger(votingAddr, kStartHeight), "Empty kStartHeight at voting contract")
147+
148+let periodLength = valueOrErrorMessage(getInteger(votingAddr, kPeriodLength), "Empty kPeriodLength at voting contract")
149+
150+let firstActiveVote = valueOrElse(getString(votingNewPoolAddr, activeVoteFirst), "")
151+
152+let secondActiveVote = valueOrElse(getString(votingNewPoolAddr, activeVoteSecond), "")
153+
154+let thirdActiveVote = valueOrElse(getString(votingNewPoolAddr, activeVoteThird), "")
155+
156+let isActive = valueOrElse(getBoolean(this, kActive), true)
157+
158+let airdropFee = getIntegerValue(oracle, kAirdropFee)
127159
128160 let currVotingPeriod = (basePeriod + ((height - startHeight) / periodLength))
129161
130-func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
162+func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
131163
132164
133165 func throwNotEnoughSWOP () = throw("Not enough SWOP: userSWOPLocked - userTotalVoteAmount < voteSWOPAmount")
134166
135167
136-func getLastInterestInfo () = {
137- let lastInterest = valueOrElse(getInteger(this, keyLastInterest), 0)
138- lastInterest
139- }
168+func getLastInterestInfo () = valueOrElse(getInteger(this, kLastInterest), 0)
140169
141170
142-func getUserSWOPLocked (user) = valueOrElse(getInteger(this, (toString(user) + keyUserSWOPLocked)), 0)
171+func getUserSWOPLocked (user) = valueOrElse(getInteger(this, (toString(user) + kUserSWOPLocked)), 0)
143172
144173
145-func getUserSWOPClaimedAmount (user) = valueOrElse(getInteger(this, (toString(user) + keyUserSWOPClaimedAmount)), 0)
174+func getUserSWOPClaimedAmount (user) = valueOrElse(getInteger(this, (toString(user) + kUserSWOPClaimedAmount)), 0)
146175
147176
148-func getUserTotalVoteAmount (user) = valueOrElse(getInteger(votingLiteContract, (toString(user) + kUserTotalVoteSWOP)), 0)
177+func getUserTotalVoteAmount (user) = valueOrElse(getInteger(votingAddr, (toString(user) + kUserTotalVoteSWOP)), 0)
149178
150179
151180 func getUserInterestInfo (user,lastInterest) = {
152181 let userSWOPAmount = getUserSWOPLocked(user)
153- let userLastInterest = getInteger(this, (toString(user) + keyUserLastInterest))
182+ let userLastInterest = getInteger(this, (toString(user) + kUserLastInterest))
154183 let userLastInterestValue = match userLastInterest {
155184 case userLastInterest: Int =>
156185 userLastInterest
162191
163192
164193 func getUserTotalVoteAmountForOnePool (pool,user) = {
165- let voting = valueOrElse(getInteger(votingForNewPool, pool), -1)
166- let heightOfVoting = valueOrElse(getInteger(votingForNewPool, (toString(voting) + keyHeightOfPoolVotingForNewPool)), 0)
167- let statusOfVoting = valueOrElse(getBoolean(votingForNewPool, (toString(voting) + keyStatusOfVotingForNewPool)), true)
194+ let voting = valueOrElse(getInteger(votingNewPoolAddr, pool), -1)
195+ let heightOfVoting = valueOrElse(getInteger(votingNewPoolAddr, (toString(voting) + kHeightOfPoolVotingForNewPool)), 0)
196+ let statusOfVoting = valueOrElse(getBoolean(votingNewPoolAddr, (toString(voting) + kStatusOfVotingForNewPool)), true)
168197 let currentHeight = height
169198 if ((0 > voting))
170199 then 0
171200 else if (!(statusOfVoting))
172201 then 0
173202 else if ((heightOfVoting > currentHeight))
174- then (valueOrElse(getInteger(votingForNewPool, (((toString(user) + "_") + toString(voting)) + keyYesVotingForNewPool)), 0) + valueOrElse(getInteger(votingForNewPool, (((toString(user) + "_") + toString(voting)) + keyNoVotingForNewPool)), 0))
203+ then (valueOrElse(getInteger(votingNewPoolAddr, (((toString(user) + "_") + toString(voting)) + kYesVotingForNewPool)), 0) + valueOrElse(getInteger(votingNewPoolAddr, (((toString(user) + "_") + toString(voting)) + kNoVotingForNewPool)), 0))
175204 else 0
176205 }
177206
183212
184213
185214 func getUserBlockedInLauchpad (user) = {
186- let lauchpadId = toString(valueOrElse(getInteger(launchpad, keyLaunchpadActiveId), 0))
215+ let lauchpadId = toString(valueOrElse(getInteger(launchpadAddr, kLaunchpadActiveId), 0))
187216 if ((lauchpadId == "0"))
188217 then 0
189218 else {
190- let lStartHeight = valueOrElse(getInteger(launchpad, (lauchpadId + keyLaunchpadStartHeight)), 0)
191- let lDuration = valueOrElse(getInteger(launchpad, (lauchpadId + keyLaunchpadDuration)), 0)
192- let lFreezeSwopDuration = valueOrElse(getInteger(launchpad, (lauchpadId + keyLauchpadFreezSwopDuration)), 0)
219+ let lStartHeight = valueOrElse(getInteger(launchpadAddr, (lauchpadId + kLaunchpadStartHeight)), 0)
220+ let lDuration = valueOrElse(getInteger(launchpadAddr, (lauchpadId + kLaunchpadDuration)), 0)
221+ let lFreezeSwopDuration = valueOrElse(getInteger(launchpadAddr, (lauchpadId + kLauchpadFreezSwopDuration)), 0)
193222 let blockEndHeight = ((lStartHeight + lDuration) + lFreezeSwopDuration)
194223 if ((height > blockEndHeight))
195224 then 0
196225 else {
197- let boughtTickets = valueOrElse(getInteger(launchpad, (((toString(user) + "_") + lauchpadId) + keyLaunchpadBoughtTickets)), 0)
198- let swopPerTicket = valueOrElse(getInteger(launchpad, (lauchpadId + keyLaunchpadSwopPerTickets)), 0)
226+ let boughtTickets = valueOrElse(getInteger(launchpadAddr, (((toString(user) + "_") + lauchpadId) + kLaunchpadBoughtTickets)), 0)
227+ let swopPerTicket = valueOrElse(getInteger(launchpadAddr, (lauchpadId + kLaunchpadSwopPerTickets)), 0)
199228 (boughtTickets * swopPerTicket)
200229 }
201230 }
202231 }
203232
204233
205-func getTotalSWOPLocked () = valueOrElse(getInteger(this, keyTotalSWOPLocked), 0)
234+func getTotalSWOPLocked () = valueOrElse(getInteger(this, kTotalSWOPLocked), 0)
206235
207236
208237 func getUserVoteInfo (user) = {
209- let $t073687919 = if (isDefined(getString(votingLiteContract, (toString(user) + kUserTotalStruc))))
238+ let $t075828115 = if (isDefined(getString(votingAddr, (toString(user) + kUserTotalStruc))))
210239 then {
211- let data = split(valueOrErrorMessage(getString(votingLiteContract, (toString(user) + kUserTotalStruc)), "Empty kUserTotalStruc"), "_")
240+ let data = split(valueOrErrorMessage(getString(votingAddr, (toString(user) + kUserTotalStruc)), "Empty kUserTotalStruc"), "_")
212241 $Tuple3(parseIntValue(data[0]), parseIntValue(data[1]), parseIntValue(data[2]))
213242 }
214243 else {
215- let uPoolTotalSWOP = valueOrElse(getInteger(votingLiteContract, (toString(user) + kUserTotalVoteSWOP)), 0)
244+ let uPoolTotalSWOP = valueOrElse(getInteger(votingAddr, (toString(user) + kUserTotalVoteSWOP)), 0)
216245 $Tuple3(uPoolTotalSWOP, 0, currVotingPeriod)
217246 }
218- let userTotalVoteSWOP = $t073687919._1
219- let userUnvoted = $t073687919._2
220- let userUnvotedPeriod = $t073687919._3
247+ let userTotalVoteSWOP = $t075828115._1
248+ let userUnvoted = $t075828115._2
249+ let userUnvotedPeriod = $t075828115._3
221250 let userUnvotedActual = if ((userUnvotedPeriod == currVotingPeriod))
222251 then userUnvoted
223252 else 0
225254 }
226255
227256
228-func getUserVoteOptionAmount (user) = valueOrElse(getInteger(this, (toString(user) + keyUserVoteOptionAmount)), 0)
257+func getUserVoteOptionAmount (user) = valueOrElse(getInteger(this, (toString(user) + kUserVoteOptionAmount)), 0)
229258
230259
231-func getVotingStartHeight (voteName) = valueOrElse(getInteger(this, (voteName + keyVotingStartHeight)), 0)
260+func getVotingStartHeight (voteName) = valueOrElse(getInteger(this, (voteName + kVotingStartHeight)), 0)
232261
233262
234-func getPoolUpdateHeight (pool) = valueOrElse(getInteger(this, (pool + keyHeightPoolFraction)), 0)
263+func getPoolUpdateHeight (pool) = valueOrElse(getInteger(this, (pool + kHeightPoolFraction)), 0)
235264
236265
237-func isDefinePoolUpdateHeight (pool) = isDefined(getInteger(this, (pool + keyHeightPoolFraction)))
266+func isDefinePoolUpdateHeight (pool) = isDefined(getInteger(this, (pool + kHeightPoolFraction)))
238267
239268
240-func getCurPoolWeight (pool) = valueOrElse(getInteger(this, (pool + keyRewardPoolFractionCurrent)), 0)
269+func getCurPoolWeight (pool) = valueOrElse(getInteger(this, (pool + kRewardPoolFractionCurrent)), 0)
241270
242271
243-func getPrevPoolWeight (pool) = valueOrElse(getInteger(this, (pool + keyRewardPoolFractionPrevious)), 0)
272+func getPrevPoolWeight (pool) = valueOrElse(getInteger(this, (pool + kRewardPoolFractionPrevious)), 0)
244273
245274
246275 func getVoteOptionAmount (user,voteName,option) = {
247- let userVoteOptionAmount = getInteger(this, (((voteName + option) + toString(user)) + keyUserVoteOptionAmount))
276+ let userVoteOptionAmount = getInteger(this, (((voteName + option) + toString(user)) + kUserVoteOptionAmount))
248277 let uvoa = match userVoteOptionAmount {
249278 case uvoa: Int =>
250279 uvoa
253282 case _ =>
254283 throw("Match error")
255284 }
256- valueOrErrorMessage(uvoa, (((("No data on the key: " + voteName) + option) + toString(user)) + keyUserVoteOptionAmount))
285+ valueOrErrorMessage(uvoa, (((("No data on the key: " + voteName) + option) + toString(user)) + kUserVoteOptionAmount))
257286 }
258287
259288
260-func getVoteDuration (voteName) = valueOrErrorMessage(getInteger(this, (voteName + keyVoteDuration)), (("No data on the key: " + voteName) + keyVoteDuration))
289+func getVoteDuration (voteName) = valueOrErrorMessage(getInteger(this, (voteName + kVoteDuration)), (("No data on the key: " + voteName) + kVoteDuration))
261290
262291
263292 func getTotalVoteOptionAmount (voteName,option) = {
264- let totalVoteOptionAmount = getInteger(this, ((voteName + option) + keyTotalVoteOptionAmount))
293+ let totalVoteOptionAmount = getInteger(this, ((voteName + option) + kTotalVoteOptionAmount))
265294 let tvoa = match totalVoteOptionAmount {
266295 case tvoa: Int =>
267296 tvoa
282311
283312 func claimCalc (caller) = {
284313 let lastInterest = getLastInterestInfo()
285- let $t01032310403 = getUserInterestInfo(caller, lastInterest)
286- let userLastInterest = $t01032310403._1
287- let userSWOPLocked = $t01032310403._2
314+ let $t01050610588 = getUserInterestInfo(caller, lastInterest)
315+ let userLastInterest = $t01050610588._1
316+ let userSWOPLocked = $t01050610588._2
288317 let claimAmount = fraction(userSWOPLocked, (lastInterest - userLastInterest), scaleValue)
289318 let userNewInterest = lastInterest
290319 $Tuple2(userNewInterest, claimAmount)
295324 func airDrop () = if (!(isActive))
296325 then throw("DApp is inactive at this moment")
297326 else {
298- let $t01066810743 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
299- let pmtAmount = $t01066810743._1
300- let pmtAssetId = $t01066810743._2
327+ let $t01085610931 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
328+ let pmtAmount = $t01085610931._1
329+ let pmtAssetId = $t01085610931._2
301330 if ((pmtAssetId != SWOP))
302331 then throw("Incorrect pmtAssetId")
303332 else {
333+ let airdropFeeAmount = fraction(pmtAmount, airdropFee, 100, CEILING)
304334 let totalSWOPLocked = getTotalSWOPLocked()
305335 let lastInterest = getLastInterestInfo()
306- let interestNew = (lastInterest + fraction(pmtAmount, scaleValue, totalSWOPLocked))
307-[IntegerEntry(keyLastInterest, interestNew)]
336+ let interestNew = (lastInterest + fraction((pmtAmount - airdropFeeAmount), scaleValue, totalSWOPLocked))
337+[IntegerEntry(kLastInterest, interestNew), ScriptTransfer(airdropMoneyBoxAddr, airdropFeeAmount, SWOP)]
308338 }
309339 }
310340
314344 func lockSWOP () = if (!(isActive))
315345 then throw("DApp is inactive at this moment")
316346 else {
317- let $t01118111256 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
318- let pmtAmount = $t01118111256._1
319- let pmtAssetId = $t01118111256._2
347+ let $t01155811633 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
348+ let pmtAmount = $t01155811633._1
349+ let pmtAssetId = $t01155811633._2
320350 if ((pmtAssetId != SWOP))
321351 then throw("Incorrect pmtAssetId")
322352 else {
323353 let lastInterest = getLastInterestInfo()
324- let $t01137211454 = getUserInterestInfo(i.caller, lastInterest)
325- let userLastInterest = $t01137211454._1
326- let userSWOPLocked = $t01137211454._2
354+ let $t01174911833 = getUserInterestInfo(i.caller, lastInterest)
355+ let userLastInterest = $t01174911833._1
356+ let userSWOPLocked = $t01174911833._2
327357 let claimAmount = fraction(userSWOPLocked, (lastInterest - userLastInterest), scaleValue)
328358 let userSWOPLockedNew = ((userSWOPLocked + pmtAmount) + claimAmount)
329359 let userNewInterest = lastInterest
331361 let totalSWOPLockedNew = ((totalSWOPLocked + pmtAmount) + claimAmount)
332362 let userClaimedAmount = getUserSWOPClaimedAmount(i.caller)
333363 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
334-[IntegerEntry((toString(i.caller) + keyUserLastInterest), userNewInterest), IntegerEntry((toString(i.caller) + keyUserSWOPLocked), userSWOPLockedNew), IntegerEntry(keyTotalSWOPLocked, totalSWOPLockedNew), IntegerEntry((toString(i.caller) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((toString(i.caller) + keyUserSWOPLastClaimedAmount), claimAmount)]
364+[IntegerEntry((toString(i.caller) + kUserLastInterest), userNewInterest), IntegerEntry((toString(i.caller) + kUserSWOPLocked), userSWOPLockedNew), IntegerEntry(kTotalSWOPLocked, totalSWOPLockedNew), IntegerEntry((toString(i.caller) + kUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((toString(i.caller) + kUserSWOPLastClaimedAmount), claimAmount)]
335365 }
336366 }
337367
345375 else {
346376 let totalSWOPLocked = getTotalSWOPLocked()
347377 let userSWOPLocked = getUserSWOPLocked(i.caller)
348- let $t01260412659 = claimCalc(i.caller)
349- let userNewInterest = $t01260412659._1
350- let claimAmount = $t01260412659._2
351- let $t01266412729 = getUserVoteInfo(i.caller)
352- let userVoteAmount = $t01266412729._1
353- let userUnvoteAmount = $t01266412729._2
378+ let $t01297413029 = claimCalc(i.caller)
379+ let userNewInterest = $t01297413029._1
380+ let claimAmount = $t01297413029._2
381+ let $t01303413099 = getUserVoteInfo(i.caller)
382+ let userVoteAmount = $t01303413099._1
383+ let userUnvoteAmount = $t01303413099._2
354384 let userVoteAmountForNewPool = getUserTotalVoteForNewPoolAmount(i.caller)
355385 let blockedInLaunchpad = getUserBlockedInLauchpad(i.caller)
356386 if (if (if ((0 > userUnvoteAmount))
368398 let userSWOPamountNew = ((userSWOPLocked + claimAmount) - withdrawAmount)
369399 let userClaimedAmount = getUserSWOPClaimedAmount(i.caller)
370400 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
371-[IntegerEntry((toString(i.caller) + keyUserLastInterest), userNewInterest), IntegerEntry((toString(i.caller) + keyUserSWOPLocked), userSWOPamountNew), IntegerEntry(keyTotalSWOPLocked, totalSWOPLockedNew), ScriptTransfer(i.caller, withdrawAmount, SWOP), IntegerEntry((toString(i.caller) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((toString(i.caller) + keyUserSWOPLastClaimedAmount), claimAmount)]
401+[IntegerEntry((toString(i.caller) + kUserLastInterest), userNewInterest), IntegerEntry((toString(i.caller) + kUserSWOPLocked), userSWOPamountNew), IntegerEntry(kTotalSWOPLocked, totalSWOPLockedNew), ScriptTransfer(i.caller, withdrawAmount, SWOP), IntegerEntry((toString(i.caller) + kUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((toString(i.caller) + kUserSWOPLastClaimedAmount), claimAmount)]
372402 }
373403 }
374404 }
380410 then throw("DApp is inactive at this moment")
381411 else {
382412 let lastInterest = getLastInterestInfo()
383- let $t01418814243 = claimCalc(i.caller)
384- let userNewInterest = $t01418814243._1
385- let claimAmount = $t01418814243._2
413+ let $t01454914604 = claimCalc(i.caller)
414+ let userNewInterest = $t01454914604._1
415+ let claimAmount = $t01454914604._2
386416 let userClaimedAmount = getUserSWOPClaimedAmount(i.caller)
387417 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
388418 if ((claimAmount == 0))
389419 then throw("You have 0 available SWOP")
390- else [IntegerEntry((toString(i.caller) + keyUserLastInterest), userNewInterest), IntegerEntry((toString(i.caller) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((toString(i.caller) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, claimAmount, SWOP)]
420+ else [IntegerEntry((toString(i.caller) + kUserLastInterest), userNewInterest), IntegerEntry((toString(i.caller) + kUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((toString(i.caller) + kUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, claimAmount, SWOP)]
391421 }
392422
393423
399429 let totalSWOPLocked = getTotalSWOPLocked()
400430 let userSWOPLocked = getUserSWOPLocked(i.caller)
401431 let lastInterest = getLastInterestInfo()
402- let $t01502215077 = claimCalc(i.caller)
403- let userNewInterest = $t01502215077._1
404- let claimAmount = $t01502215077._2
432+ let $t01537715432 = claimCalc(i.caller)
433+ let userNewInterest = $t01537715432._1
434+ let claimAmount = $t01537715432._2
405435 let userSWOPLockedNew = (userSWOPLocked + claimAmount)
406436 let totalSWOPLockedNew = (totalSWOPLocked + claimAmount)
407437 let userClaimedAmount = getUserSWOPClaimedAmount(i.caller)
408438 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
409439 if ((claimAmount == 0))
410440 then throw("You have 0 available SWOP")
411- else [IntegerEntry((toString(i.caller) + keyUserLastInterest), userNewInterest), IntegerEntry(keyTotalSWOPLocked, totalSWOPLockedNew), IntegerEntry((toString(i.caller) + keyUserSWOPLocked), userSWOPLockedNew), IntegerEntry((toString(i.caller) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((toString(i.caller) + keyUserSWOPLastClaimedAmount), claimAmount)]
441+ else [IntegerEntry((toString(i.caller) + kUserLastInterest), userNewInterest), IntegerEntry(kTotalSWOPLocked, totalSWOPLockedNew), IntegerEntry((toString(i.caller) + kUserSWOPLocked), userSWOPLockedNew), IntegerEntry((toString(i.caller) + kUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((toString(i.caller) + kUserSWOPLastClaimedAmount), claimAmount)]
412442 }
413443
414444
418448 then throw("DApp is inactive at this moment")
419449 else {
420450 let amountPools = 10
421- let totalRewardUpdateHeight = valueOrElse(getInteger(this, keyRewardUpdateHeight), 0)
422- if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop, adminPubKeyWallet], i.callerPublicKey)))
451+ let totalRewardUpdateHeight = valueOrElse(getInteger(this, kRewardUpdateHeight), 0)
452+ if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, moneyBoxPubKey], i.callerPublicKey)))
423453 then throw("Only admin can call this function")
424454 else if ((size(currentPools) > amountPools))
425455 then throw(("Max amount of pool is " + toString(amountPools)))
441471 else false)
442472 then {
443473 let poolReward = getCurPoolWeight(pool)
444-IntegerEntry((pool + keyRewardPoolFractionPrevious), poolReward) :: accumulated
474+IntegerEntry((pool + kRewardPoolFractionPrevious), poolReward) :: accumulated
445475 }
446476 else {
447477 let poolReward = getPrevPoolWeight(pool)
448-IntegerEntry((pool + keyRewardPoolFractionPrevious), poolReward) :: accumulated
478+IntegerEntry((pool + kRewardPoolFractionPrevious), poolReward) :: accumulated
449479 }
450480 }
451481
454484 let poolReward = currentRewards[poolIndex]
455485 if ((0 > poolReward))
456486 then throw("PoolReward < 0")
457- else IntegerEntry((pool + keyRewardPoolFractionCurrent), poolReward) :: accumulated
487+ else IntegerEntry((pool + kRewardPoolFractionCurrent), poolReward) :: accumulated
458488 }
459489
460490 func changeHeightEntry (accumulated,pool) = {
461491 let poolHeight = rewardUpdateHeight
462-IntegerEntry((pool + keyHeightPoolFraction), poolHeight) :: accumulated
492+IntegerEntry((pool + kHeightPoolFraction), poolHeight) :: accumulated
463493 }
464494
465495 func getSumReward (curTempSum,pagination) = if ((pagination == 0))
466496 then if ((curTempSum > totalVoteShare))
467497 then throw(((("sumRewardPrevious > totalVoteShare or sumRewardCurrent > totalVoteShare - " + toString(pagination)) + " ") + toString(curTempSum)))
468- else $Tuple2([IntegerEntry(keyTempCurSum, curTempSum)], [IntegerEntry(keyRewardUpdateFirstPaginationHeight, rewardUpdateHeight)])
498+ else $Tuple2([IntegerEntry(kTempCurSum, curTempSum)], [IntegerEntry(kRewardUpdateFirstPaginationHeight, rewardUpdateHeight)])
469499 else if ((pagination == 1))
470500 then {
471- let curTempSumFromKey = valueOrElse(getInteger(this, keyTempCurSum), 0)
472- let rewardUpdateHeightFirstPaginationEntry = valueOrElse(getInteger(this, keyRewardUpdateFirstPaginationHeight), 0)
501+ let curTempSumFromKey = valueOrElse(getInteger(this, kTempCurSum), 0)
502+ let rewardUpdateHeightFirstPaginationEntry = valueOrElse(getInteger(this, kRewardUpdateFirstPaginationHeight), 0)
473503 if (((curTempSum + curTempSumFromKey) > totalVoteShare))
474504 then throw(((("sumRewardPrevious > totalVoteShare or sumRewardCurrent > totalVoteShare - " + toString(pagination)) + " ") + toString((curTempSum + curTempSumFromKey))))
475505 else if ((rewardUpdateHeightFirstPaginationEntry != rewardUpdateHeight))
476506 then throw("current rewardUpdateHeight != rewardUpdateHeightFirstPaginationEntry")
477- else $Tuple2([IntegerEntry(keyTempCurSum, (curTempSum + curTempSumFromKey))], nil)
507+ else $Tuple2([IntegerEntry(kTempCurSum, (curTempSum + curTempSumFromKey))], nil)
478508 }
479509 else if ((pagination == 2))
480510 then {
481- let curSum = (valueOrElse(getInteger(this, keyTempCurSum), 0) + curTempSum)
482- let rewardUpdateHeightFirstPaginationEntry = valueOrElse(getInteger(this, keyRewardUpdateFirstPaginationHeight), 0)
511+ let curSum = (valueOrElse(getInteger(this, kTempCurSum), 0) + curTempSum)
512+ let rewardUpdateHeightFirstPaginationEntry = valueOrElse(getInteger(this, kRewardUpdateFirstPaginationHeight), 0)
483513 if ((curSum != totalVoteShare))
484514 then throw("sumRewardPrevious != totalVoteShare or sumRewardCurrent != totalVoteShare")
485515 else if ((rewardUpdateHeightFirstPaginationEntry != rewardUpdateHeight))
486516 then throw("current rewardUpdateHeight != rewardUpdateHeightFirstPaginationEntry")
487- else $Tuple2([IntegerEntry(keyTempCurSum, curSum)], nil)
517+ else $Tuple2([IntegerEntry(kTempCurSum, curSum)], nil)
488518 }
489519 else throw("Incorrect pagination")
490520
544574
545575 $f3_2($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
546576 }
547- let $t02022120332 = getSumReward(sumRewardCurrentTemp, pagination)
548- let sumRewardCurrent = $t02022120332._1
549- let rewardUpdateHeightFirstPaginationEntry = $t02022120332._2
577+ let $t02052720638 = getSumReward(sumRewardCurrentTemp, pagination)
578+ let sumRewardCurrent = $t02052720638._1
579+ let rewardUpdateHeightFirstPaginationEntry = $t02052720638._2
550580 let rewardUpdateHeightEntry = if ((pagination == 2))
551- then [IntegerEntry(keyRewardUpdateHeight, rewardUpdateHeight)]
581+ then [IntegerEntry(kRewardUpdateHeight, rewardUpdateHeight)]
552582 else nil
553583 if ((height > rewardUpdateHeight))
554584 then throw("rewardUpdateHeight < height")
560590
561591 @Callable(i)
562592 func shutdown () = if (!(isActive))
563- then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
564- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
593+ then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
594+ else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
565595 then throw("Only admin can call this function")
566596 else suspend("Paused by admin")
567597
570600 @Callable(i)
571601 func activate () = if (isActive)
572602 then throw("DApp is already active")
573- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
603+ else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
574604 then throw("Only admin can call this function")
575- else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
605+ else [BooleanEntry(kActive, true), DeleteEntry(kCause)]
576606
577607
578608 @Verifier(tx)
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 4 #-}
1+{-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let adminPubKey1 = base58'GFmKZ2naZFRoCvNbwKAQVGmLb1uBeWGDgFabdGBuZiuy'
4+let kActive = "active"
55
6-let adminPubKey2 = base58'GmJXRyhRA79g8yUGgKBAVdnFfQFDMjQG98b1MmLDh5kk'
6+let kCause = "shutdown_cause"
77
8-let adminPubKey3 = base58'CFhbV6h41hVjbGHudGtS3fYUv7QAKRxFQzKNtx4B5PqP'
8+let kLastInterest = "last_interest"
99
10-let adminPubKeyStartStop = base58'Kn7NpzaG12dLZgcHf2ipUftU6hbJygmrhFqQYE4B7ZK'
10+let kUserLastInterest = "_last_interest"
1111
12-let adminPubKeyWallet = base58'5CqqMkmtXXt35KRH9LdWA3ap6TffPvTT5SHQzYrVFbBw'
12+let kUserSWOPLocked = "_SWOP_amount"
1313
14-let keyActive = "active"
14+let kUserGetBackHeight = "_getBackHeight"
1515
16-let keyCause = "shutdown_cause"
17-
18-let keyLastInterest = "last_interest"
19-
20-let keyUserLastInterest = "_last_interest"
21-
22-let keyUserSWOPLocked = "_SWOP_amount"
23-
24-let keyUserGetBackHeight = "_getBackHeight"
25-
26-let keyTotalSWOPLocked = "total_SWOP_amount"
16+let kTotalSWOPLocked = "total_SWOP_amount"
2717
2818 let kUserTotalVoteSWOP = "_user_total_SWOP_vote"
2919
30-let keyUserVoteOptionAmount = "_SWOP_option_amount"
20+let kUserVoteOptionAmount = "_SWOP_option_amount"
3121
32-let keyTotalVoteOptionAmount = "total_SWOP_option_amount"
22+let kTotalVoteOptionAmount = "total_SWOP_option_amount"
3323
34-let keyUserSWOPClaimedAmount = "_SWOP_claimed_amount"
24+let kUserSWOPClaimedAmount = "_SWOP_claimed_amount"
3525
36-let keyUserSWOPLastClaimedAmount = "_SWOP_last_claimed_amount"
26+let kUserSWOPLastClaimedAmount = "_SWOP_last_claimed_amount"
3727
38-let keyVoteName = "vote_name"
28+let kVoteName = "vote_name"
3929
40-let keyOptionName = "_option_name"
30+let kOptionName = "_option_name"
4131
42-let keyVotingStartHeight = "_startHeight"
32+let kVotingStartHeight = "_startHeight"
4333
44-let keyVoteDuration = "_vote_duration"
34+let kVoteDuration = "_vote_duration"
4535
46-let keyRewardPoolFractionCurrent = "_current_pool_fraction_reward"
36+let kRewardPoolFractionCurrent = "_current_pool_fraction_reward"
4737
48-let keyRewardPoolFractionPrevious = "_previous_pool_fraction_reward"
38+let kRewardPoolFractionPrevious = "_previous_pool_fraction_reward"
4939
50-let keyHeightPoolFraction = "_pool_reward_update_height"
40+let kHeightPoolFraction = "_pool_reward_update_height"
5141
52-let keyTotalRewardPerBlockCurrent = "total_reward_per_block_current"
42+let kTotalRewardPerBlockCurrent = "total_reward_per_block_current"
5343
54-let keyTotalRewardPerBlockPrevious = "total_reward_per_block_previous"
44+let kTotalRewardPerBlockPrevious = "total_reward_per_block_previous"
5545
56-let keyRewardUpdateHeight = "reward_update_height"
46+let kRewardUpdateHeight = "reward_update_height"
5747
58-let keyRewardUpdateFirstPaginationHeight = "reward_update_height_first_pagination"
48+let kRewardUpdateFirstPaginationHeight = "reward_update_height_first_pagination"
5949
60-let keyNoVotingForNewPool = "_vote_no"
50+let kNoVotingForNewPool = "_vote_no"
6151
62-let keyYesVotingForNewPool = "_vote_yes"
52+let kYesVotingForNewPool = "_vote_yes"
6353
64-let keyAmountOfVotingForNewPool = "max_amount_voting"
54+let kAmountOfVotingForNewPool = "max_amount_voting"
6555
66-let keyStatusOfVotingForNewPool = "_status"
56+let kStatusOfVotingForNewPool = "_status"
6757
68-let keyHeightOfPoolVotingForNewPool = "_finish_height"
58+let kHeightOfPoolVotingForNewPool = "_finish_height"
6959
7060 let activeVoteFirst = "voting_active_cell_1"
7161
7262 let activeVoteSecond = "voting_active_cell_2"
7363
7464 let activeVoteThird = "voting_active_cell_3"
7565
76-let keyTempCurSum = "sum_reward_current"
66+let kTempCurSum = "sum_reward_current"
7767
78-let keyLaunchpadBoughtTickets = "_bought_tickets"
68+let kLaunchpadBoughtTickets = "_bought_tickets"
7969
80-let keyLaunchpadSwopPerTickets = "_swop_per_ticket"
70+let kLaunchpadSwopPerTickets = "_swop_per_ticket"
8171
82-let keyLaunchpadActiveId = "launchpad_active_id"
72+let kLaunchpadActiveId = "launchpad_active_id"
8373
84-let keyLaunchpadDuration = "_duration"
74+let kLaunchpadDuration = "_duration"
8575
86-let keyLaunchpadStartHeight = "_start_height"
87-
88-let keyLauchpadFreezSwopDuration = "_freeze_swop_duration"
89-
90-let isActive = valueOrElse(getBoolean(this, keyActive), true)
91-
92-let farmingSWOPAddress = Address(base58'3MsxHxruYWoddB4HRiPBYAWtMXMtCF1V9XT')
93-
94-let votingLiteContract = Address(base58'3MrJgdL1GniipErHy44YF9idzLaUL2iX5DQ')
95-
96-let votingForNewPool = Address(base58'3Mzgi6deFV8CyF2nqbWSBkqba5JaD42EXyb')
97-
98-let launchpad = Address(base58'3MzDGFvPnXVbA4wCacqcVnfVJPwG952KVAg')
99-
100-let keySWOPid = "SWOP_id"
101-
102-let SWOP = fromBase58String(getStringValue(farmingSWOPAddress, keySWOPid))
103-
104-let scaleValue = 100000000
105-
106-let totalVoteShare = 10000000000
76+let kLaunchpadStartHeight = "_start_height"
10777
10878 let kStartHeight = "start_height"
10979
11080 let kBasePeriod = "base_period"
11181
11282 let kPeriodLength = "period_length"
11383
11484 let kUserTotalStruc = "_user_total_struc"
11585
116-let basePeriod = valueOrErrorMessage(getInteger(votingLiteContract, kBasePeriod), "Empty kBasePeriod at voting contract")
86+let kLauchpadFreezSwopDuration = "_freeze_swop_duration"
11787
118-let startHeight = valueOrErrorMessage(getInteger(votingLiteContract, kStartHeight), "Empty kStartHeight at voting contract")
88+let kSWOPid = "SWOP_id"
11989
120-let periodLength = valueOrErrorMessage(getInteger(votingLiteContract, kPeriodLength), "Empty kPeriodLength at voting contract")
90+let kAirdropFee = "airdrop_fee"
12191
122-let firstActiveVote = valueOrElse(getString(votingForNewPool, activeVoteFirst), "")
92+let kAdminPubKey1 = "admin_pub_1"
12393
124-let secondActiveVote = valueOrElse(getString(votingForNewPool, activeVoteSecond), "")
94+let kAdminPubKey2 = "admin_pub_2"
12595
126-let thirdActiveVote = valueOrElse(getString(votingForNewPool, activeVoteThird), "")
96+let kAdminPubKey3 = "admin_pub_3"
97+
98+let kMoneyBoxPubKey = "money_box_pub_key"
99+
100+let kFarmingAddr = "farming_address"
101+
102+let kVotingAddr = "voting_address"
103+
104+let kVotingNewPoolAddr = "voting_new_pool_address"
105+
106+let kLaunchpadAddr = "launchpad_address"
107+
108+let kAirdropMoneyBoxAddr = "airdrop_fee_money_box"
109+
110+let oracle = Address(base58'3NBBWfzZtZtszaXbitTKnrB2xXwv26Bn7H9')
111+
112+func getBase58FromOracle (key) = match getString(oracle, key) {
113+ case string: String =>
114+ fromBase58String(string)
115+ case nothing =>
116+ throw((key + "is empty"))
117+}
118+
119+
120+let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
121+
122+let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
123+
124+let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
125+
126+let moneyBoxPubKey = getBase58FromOracle(kMoneyBoxPubKey)
127+
128+let farmingAddr = Address(getBase58FromOracle(kFarmingAddr))
129+
130+let votingAddr = Address(getBase58FromOracle(kVotingAddr))
131+
132+let votingNewPoolAddr = Address(getBase58FromOracle(kVotingNewPoolAddr))
133+
134+let launchpadAddr = Address(getBase58FromOracle(kLaunchpadAddr))
135+
136+let airdropMoneyBoxAddr = Address(getBase58FromOracle(kAirdropMoneyBoxAddr))
137+
138+let SWOP = fromBase58String(getStringValue(farmingAddr, kSWOPid))
139+
140+let scaleValue = 100000000
141+
142+let totalVoteShare = 10000000000
143+
144+let basePeriod = valueOrErrorMessage(getInteger(votingAddr, kBasePeriod), "Empty kBasePeriod at voting contract")
145+
146+let startHeight = valueOrErrorMessage(getInteger(votingAddr, kStartHeight), "Empty kStartHeight at voting contract")
147+
148+let periodLength = valueOrErrorMessage(getInteger(votingAddr, kPeriodLength), "Empty kPeriodLength at voting contract")
149+
150+let firstActiveVote = valueOrElse(getString(votingNewPoolAddr, activeVoteFirst), "")
151+
152+let secondActiveVote = valueOrElse(getString(votingNewPoolAddr, activeVoteSecond), "")
153+
154+let thirdActiveVote = valueOrElse(getString(votingNewPoolAddr, activeVoteThird), "")
155+
156+let isActive = valueOrElse(getBoolean(this, kActive), true)
157+
158+let airdropFee = getIntegerValue(oracle, kAirdropFee)
127159
128160 let currVotingPeriod = (basePeriod + ((height - startHeight) / periodLength))
129161
130-func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
162+func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
131163
132164
133165 func throwNotEnoughSWOP () = throw("Not enough SWOP: userSWOPLocked - userTotalVoteAmount < voteSWOPAmount")
134166
135167
136-func getLastInterestInfo () = {
137- let lastInterest = valueOrElse(getInteger(this, keyLastInterest), 0)
138- lastInterest
139- }
168+func getLastInterestInfo () = valueOrElse(getInteger(this, kLastInterest), 0)
140169
141170
142-func getUserSWOPLocked (user) = valueOrElse(getInteger(this, (toString(user) + keyUserSWOPLocked)), 0)
171+func getUserSWOPLocked (user) = valueOrElse(getInteger(this, (toString(user) + kUserSWOPLocked)), 0)
143172
144173
145-func getUserSWOPClaimedAmount (user) = valueOrElse(getInteger(this, (toString(user) + keyUserSWOPClaimedAmount)), 0)
174+func getUserSWOPClaimedAmount (user) = valueOrElse(getInteger(this, (toString(user) + kUserSWOPClaimedAmount)), 0)
146175
147176
148-func getUserTotalVoteAmount (user) = valueOrElse(getInteger(votingLiteContract, (toString(user) + kUserTotalVoteSWOP)), 0)
177+func getUserTotalVoteAmount (user) = valueOrElse(getInteger(votingAddr, (toString(user) + kUserTotalVoteSWOP)), 0)
149178
150179
151180 func getUserInterestInfo (user,lastInterest) = {
152181 let userSWOPAmount = getUserSWOPLocked(user)
153- let userLastInterest = getInteger(this, (toString(user) + keyUserLastInterest))
182+ let userLastInterest = getInteger(this, (toString(user) + kUserLastInterest))
154183 let userLastInterestValue = match userLastInterest {
155184 case userLastInterest: Int =>
156185 userLastInterest
157186 case _ =>
158187 lastInterest
159188 }
160189 $Tuple2(userLastInterestValue, userSWOPAmount)
161190 }
162191
163192
164193 func getUserTotalVoteAmountForOnePool (pool,user) = {
165- let voting = valueOrElse(getInteger(votingForNewPool, pool), -1)
166- let heightOfVoting = valueOrElse(getInteger(votingForNewPool, (toString(voting) + keyHeightOfPoolVotingForNewPool)), 0)
167- let statusOfVoting = valueOrElse(getBoolean(votingForNewPool, (toString(voting) + keyStatusOfVotingForNewPool)), true)
194+ let voting = valueOrElse(getInteger(votingNewPoolAddr, pool), -1)
195+ let heightOfVoting = valueOrElse(getInteger(votingNewPoolAddr, (toString(voting) + kHeightOfPoolVotingForNewPool)), 0)
196+ let statusOfVoting = valueOrElse(getBoolean(votingNewPoolAddr, (toString(voting) + kStatusOfVotingForNewPool)), true)
168197 let currentHeight = height
169198 if ((0 > voting))
170199 then 0
171200 else if (!(statusOfVoting))
172201 then 0
173202 else if ((heightOfVoting > currentHeight))
174- then (valueOrElse(getInteger(votingForNewPool, (((toString(user) + "_") + toString(voting)) + keyYesVotingForNewPool)), 0) + valueOrElse(getInteger(votingForNewPool, (((toString(user) + "_") + toString(voting)) + keyNoVotingForNewPool)), 0))
203+ then (valueOrElse(getInteger(votingNewPoolAddr, (((toString(user) + "_") + toString(voting)) + kYesVotingForNewPool)), 0) + valueOrElse(getInteger(votingNewPoolAddr, (((toString(user) + "_") + toString(voting)) + kNoVotingForNewPool)), 0))
175204 else 0
176205 }
177206
178207
179208 func getUserTotalVoteForNewPoolAmount (user) = {
180209 let listOfVoting = [getUserTotalVoteAmountForOnePool(firstActiveVote, user), getUserTotalVoteAmountForOnePool(secondActiveVote, user), getUserTotalVoteAmountForOnePool(thirdActiveVote, user)]
181210 max(listOfVoting)
182211 }
183212
184213
185214 func getUserBlockedInLauchpad (user) = {
186- let lauchpadId = toString(valueOrElse(getInteger(launchpad, keyLaunchpadActiveId), 0))
215+ let lauchpadId = toString(valueOrElse(getInteger(launchpadAddr, kLaunchpadActiveId), 0))
187216 if ((lauchpadId == "0"))
188217 then 0
189218 else {
190- let lStartHeight = valueOrElse(getInteger(launchpad, (lauchpadId + keyLaunchpadStartHeight)), 0)
191- let lDuration = valueOrElse(getInteger(launchpad, (lauchpadId + keyLaunchpadDuration)), 0)
192- let lFreezeSwopDuration = valueOrElse(getInteger(launchpad, (lauchpadId + keyLauchpadFreezSwopDuration)), 0)
219+ let lStartHeight = valueOrElse(getInteger(launchpadAddr, (lauchpadId + kLaunchpadStartHeight)), 0)
220+ let lDuration = valueOrElse(getInteger(launchpadAddr, (lauchpadId + kLaunchpadDuration)), 0)
221+ let lFreezeSwopDuration = valueOrElse(getInteger(launchpadAddr, (lauchpadId + kLauchpadFreezSwopDuration)), 0)
193222 let blockEndHeight = ((lStartHeight + lDuration) + lFreezeSwopDuration)
194223 if ((height > blockEndHeight))
195224 then 0
196225 else {
197- let boughtTickets = valueOrElse(getInteger(launchpad, (((toString(user) + "_") + lauchpadId) + keyLaunchpadBoughtTickets)), 0)
198- let swopPerTicket = valueOrElse(getInteger(launchpad, (lauchpadId + keyLaunchpadSwopPerTickets)), 0)
226+ let boughtTickets = valueOrElse(getInteger(launchpadAddr, (((toString(user) + "_") + lauchpadId) + kLaunchpadBoughtTickets)), 0)
227+ let swopPerTicket = valueOrElse(getInteger(launchpadAddr, (lauchpadId + kLaunchpadSwopPerTickets)), 0)
199228 (boughtTickets * swopPerTicket)
200229 }
201230 }
202231 }
203232
204233
205-func getTotalSWOPLocked () = valueOrElse(getInteger(this, keyTotalSWOPLocked), 0)
234+func getTotalSWOPLocked () = valueOrElse(getInteger(this, kTotalSWOPLocked), 0)
206235
207236
208237 func getUserVoteInfo (user) = {
209- let $t073687919 = if (isDefined(getString(votingLiteContract, (toString(user) + kUserTotalStruc))))
238+ let $t075828115 = if (isDefined(getString(votingAddr, (toString(user) + kUserTotalStruc))))
210239 then {
211- let data = split(valueOrErrorMessage(getString(votingLiteContract, (toString(user) + kUserTotalStruc)), "Empty kUserTotalStruc"), "_")
240+ let data = split(valueOrErrorMessage(getString(votingAddr, (toString(user) + kUserTotalStruc)), "Empty kUserTotalStruc"), "_")
212241 $Tuple3(parseIntValue(data[0]), parseIntValue(data[1]), parseIntValue(data[2]))
213242 }
214243 else {
215- let uPoolTotalSWOP = valueOrElse(getInteger(votingLiteContract, (toString(user) + kUserTotalVoteSWOP)), 0)
244+ let uPoolTotalSWOP = valueOrElse(getInteger(votingAddr, (toString(user) + kUserTotalVoteSWOP)), 0)
216245 $Tuple3(uPoolTotalSWOP, 0, currVotingPeriod)
217246 }
218- let userTotalVoteSWOP = $t073687919._1
219- let userUnvoted = $t073687919._2
220- let userUnvotedPeriod = $t073687919._3
247+ let userTotalVoteSWOP = $t075828115._1
248+ let userUnvoted = $t075828115._2
249+ let userUnvotedPeriod = $t075828115._3
221250 let userUnvotedActual = if ((userUnvotedPeriod == currVotingPeriod))
222251 then userUnvoted
223252 else 0
224253 $Tuple2(userTotalVoteSWOP, userUnvotedActual)
225254 }
226255
227256
228-func getUserVoteOptionAmount (user) = valueOrElse(getInteger(this, (toString(user) + keyUserVoteOptionAmount)), 0)
257+func getUserVoteOptionAmount (user) = valueOrElse(getInteger(this, (toString(user) + kUserVoteOptionAmount)), 0)
229258
230259
231-func getVotingStartHeight (voteName) = valueOrElse(getInteger(this, (voteName + keyVotingStartHeight)), 0)
260+func getVotingStartHeight (voteName) = valueOrElse(getInteger(this, (voteName + kVotingStartHeight)), 0)
232261
233262
234-func getPoolUpdateHeight (pool) = valueOrElse(getInteger(this, (pool + keyHeightPoolFraction)), 0)
263+func getPoolUpdateHeight (pool) = valueOrElse(getInteger(this, (pool + kHeightPoolFraction)), 0)
235264
236265
237-func isDefinePoolUpdateHeight (pool) = isDefined(getInteger(this, (pool + keyHeightPoolFraction)))
266+func isDefinePoolUpdateHeight (pool) = isDefined(getInteger(this, (pool + kHeightPoolFraction)))
238267
239268
240-func getCurPoolWeight (pool) = valueOrElse(getInteger(this, (pool + keyRewardPoolFractionCurrent)), 0)
269+func getCurPoolWeight (pool) = valueOrElse(getInteger(this, (pool + kRewardPoolFractionCurrent)), 0)
241270
242271
243-func getPrevPoolWeight (pool) = valueOrElse(getInteger(this, (pool + keyRewardPoolFractionPrevious)), 0)
272+func getPrevPoolWeight (pool) = valueOrElse(getInteger(this, (pool + kRewardPoolFractionPrevious)), 0)
244273
245274
246275 func getVoteOptionAmount (user,voteName,option) = {
247- let userVoteOptionAmount = getInteger(this, (((voteName + option) + toString(user)) + keyUserVoteOptionAmount))
276+ let userVoteOptionAmount = getInteger(this, (((voteName + option) + toString(user)) + kUserVoteOptionAmount))
248277 let uvoa = match userVoteOptionAmount {
249278 case uvoa: Int =>
250279 uvoa
251280 case uvoa: Unit =>
252281 0
253282 case _ =>
254283 throw("Match error")
255284 }
256- valueOrErrorMessage(uvoa, (((("No data on the key: " + voteName) + option) + toString(user)) + keyUserVoteOptionAmount))
285+ valueOrErrorMessage(uvoa, (((("No data on the key: " + voteName) + option) + toString(user)) + kUserVoteOptionAmount))
257286 }
258287
259288
260-func getVoteDuration (voteName) = valueOrErrorMessage(getInteger(this, (voteName + keyVoteDuration)), (("No data on the key: " + voteName) + keyVoteDuration))
289+func getVoteDuration (voteName) = valueOrErrorMessage(getInteger(this, (voteName + kVoteDuration)), (("No data on the key: " + voteName) + kVoteDuration))
261290
262291
263292 func getTotalVoteOptionAmount (voteName,option) = {
264- let totalVoteOptionAmount = getInteger(this, ((voteName + option) + keyTotalVoteOptionAmount))
293+ let totalVoteOptionAmount = getInteger(this, ((voteName + option) + kTotalVoteOptionAmount))
265294 let tvoa = match totalVoteOptionAmount {
266295 case tvoa: Int =>
267296 tvoa
268297 case tvoa: Unit =>
269298 0
270299 case _ =>
271300 throw("Match error")
272301 }
273302 tvoa
274303 }
275304
276305
277306 func getUserGetBackAmount (voteName,option,user,getBackSWOPHeight) = {
278307 let key = ((((((voteName + "_") + option) + "_") + toString(user)) + "_") + toString(getBackSWOPHeight))
279308 valueOrErrorMessage(getInteger(this, key), ("No data on the key: " + key))
280309 }
281310
282311
283312 func claimCalc (caller) = {
284313 let lastInterest = getLastInterestInfo()
285- let $t01032310403 = getUserInterestInfo(caller, lastInterest)
286- let userLastInterest = $t01032310403._1
287- let userSWOPLocked = $t01032310403._2
314+ let $t01050610588 = getUserInterestInfo(caller, lastInterest)
315+ let userLastInterest = $t01050610588._1
316+ let userSWOPLocked = $t01050610588._2
288317 let claimAmount = fraction(userSWOPLocked, (lastInterest - userLastInterest), scaleValue)
289318 let userNewInterest = lastInterest
290319 $Tuple2(userNewInterest, claimAmount)
291320 }
292321
293322
294323 @Callable(i)
295324 func airDrop () = if (!(isActive))
296325 then throw("DApp is inactive at this moment")
297326 else {
298- let $t01066810743 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
299- let pmtAmount = $t01066810743._1
300- let pmtAssetId = $t01066810743._2
327+ let $t01085610931 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
328+ let pmtAmount = $t01085610931._1
329+ let pmtAssetId = $t01085610931._2
301330 if ((pmtAssetId != SWOP))
302331 then throw("Incorrect pmtAssetId")
303332 else {
333+ let airdropFeeAmount = fraction(pmtAmount, airdropFee, 100, CEILING)
304334 let totalSWOPLocked = getTotalSWOPLocked()
305335 let lastInterest = getLastInterestInfo()
306- let interestNew = (lastInterest + fraction(pmtAmount, scaleValue, totalSWOPLocked))
307-[IntegerEntry(keyLastInterest, interestNew)]
336+ let interestNew = (lastInterest + fraction((pmtAmount - airdropFeeAmount), scaleValue, totalSWOPLocked))
337+[IntegerEntry(kLastInterest, interestNew), ScriptTransfer(airdropMoneyBoxAddr, airdropFeeAmount, SWOP)]
308338 }
309339 }
310340
311341
312342
313343 @Callable(i)
314344 func lockSWOP () = if (!(isActive))
315345 then throw("DApp is inactive at this moment")
316346 else {
317- let $t01118111256 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
318- let pmtAmount = $t01118111256._1
319- let pmtAssetId = $t01118111256._2
347+ let $t01155811633 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
348+ let pmtAmount = $t01155811633._1
349+ let pmtAssetId = $t01155811633._2
320350 if ((pmtAssetId != SWOP))
321351 then throw("Incorrect pmtAssetId")
322352 else {
323353 let lastInterest = getLastInterestInfo()
324- let $t01137211454 = getUserInterestInfo(i.caller, lastInterest)
325- let userLastInterest = $t01137211454._1
326- let userSWOPLocked = $t01137211454._2
354+ let $t01174911833 = getUserInterestInfo(i.caller, lastInterest)
355+ let userLastInterest = $t01174911833._1
356+ let userSWOPLocked = $t01174911833._2
327357 let claimAmount = fraction(userSWOPLocked, (lastInterest - userLastInterest), scaleValue)
328358 let userSWOPLockedNew = ((userSWOPLocked + pmtAmount) + claimAmount)
329359 let userNewInterest = lastInterest
330360 let totalSWOPLocked = getTotalSWOPLocked()
331361 let totalSWOPLockedNew = ((totalSWOPLocked + pmtAmount) + claimAmount)
332362 let userClaimedAmount = getUserSWOPClaimedAmount(i.caller)
333363 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
334-[IntegerEntry((toString(i.caller) + keyUserLastInterest), userNewInterest), IntegerEntry((toString(i.caller) + keyUserSWOPLocked), userSWOPLockedNew), IntegerEntry(keyTotalSWOPLocked, totalSWOPLockedNew), IntegerEntry((toString(i.caller) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((toString(i.caller) + keyUserSWOPLastClaimedAmount), claimAmount)]
364+[IntegerEntry((toString(i.caller) + kUserLastInterest), userNewInterest), IntegerEntry((toString(i.caller) + kUserSWOPLocked), userSWOPLockedNew), IntegerEntry(kTotalSWOPLocked, totalSWOPLockedNew), IntegerEntry((toString(i.caller) + kUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((toString(i.caller) + kUserSWOPLastClaimedAmount), claimAmount)]
335365 }
336366 }
337367
338368
339369
340370 @Callable(i)
341371 func withdrawSWOP (withdrawAmount) = if (!(isActive))
342372 then throw("DApp is inactive at this moment")
343373 else if ((0 >= withdrawAmount))
344374 then throw("withdrawAmount <= 0")
345375 else {
346376 let totalSWOPLocked = getTotalSWOPLocked()
347377 let userSWOPLocked = getUserSWOPLocked(i.caller)
348- let $t01260412659 = claimCalc(i.caller)
349- let userNewInterest = $t01260412659._1
350- let claimAmount = $t01260412659._2
351- let $t01266412729 = getUserVoteInfo(i.caller)
352- let userVoteAmount = $t01266412729._1
353- let userUnvoteAmount = $t01266412729._2
378+ let $t01297413029 = claimCalc(i.caller)
379+ let userNewInterest = $t01297413029._1
380+ let claimAmount = $t01297413029._2
381+ let $t01303413099 = getUserVoteInfo(i.caller)
382+ let userVoteAmount = $t01303413099._1
383+ let userUnvoteAmount = $t01303413099._2
354384 let userVoteAmountForNewPool = getUserTotalVoteForNewPoolAmount(i.caller)
355385 let blockedInLaunchpad = getUserBlockedInLauchpad(i.caller)
356386 if (if (if ((0 > userUnvoteAmount))
357387 then true
358388 else (0 > userVoteAmount))
359389 then true
360390 else (0 > userVoteAmountForNewPool))
361391 then throw("userUnvoteAmount < 0 || userVoteAmount < 0 || userVoteAmountForNewPool < 0")
362392 else {
363393 let availableToUnstake = (userSWOPLocked - max([userVoteAmountForNewPool, (userVoteAmount + userUnvoteAmount), blockedInLaunchpad]))
364394 if ((withdrawAmount > availableToUnstake))
365395 then throw("withdrawAmount > availableToUnstake")
366396 else {
367397 let totalSWOPLockedNew = ((totalSWOPLocked + claimAmount) - withdrawAmount)
368398 let userSWOPamountNew = ((userSWOPLocked + claimAmount) - withdrawAmount)
369399 let userClaimedAmount = getUserSWOPClaimedAmount(i.caller)
370400 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
371-[IntegerEntry((toString(i.caller) + keyUserLastInterest), userNewInterest), IntegerEntry((toString(i.caller) + keyUserSWOPLocked), userSWOPamountNew), IntegerEntry(keyTotalSWOPLocked, totalSWOPLockedNew), ScriptTransfer(i.caller, withdrawAmount, SWOP), IntegerEntry((toString(i.caller) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((toString(i.caller) + keyUserSWOPLastClaimedAmount), claimAmount)]
401+[IntegerEntry((toString(i.caller) + kUserLastInterest), userNewInterest), IntegerEntry((toString(i.caller) + kUserSWOPLocked), userSWOPamountNew), IntegerEntry(kTotalSWOPLocked, totalSWOPLockedNew), ScriptTransfer(i.caller, withdrawAmount, SWOP), IntegerEntry((toString(i.caller) + kUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((toString(i.caller) + kUserSWOPLastClaimedAmount), claimAmount)]
372402 }
373403 }
374404 }
375405
376406
377407
378408 @Callable(i)
379409 func claimAndWithdrawSWOP () = if (!(isActive))
380410 then throw("DApp is inactive at this moment")
381411 else {
382412 let lastInterest = getLastInterestInfo()
383- let $t01418814243 = claimCalc(i.caller)
384- let userNewInterest = $t01418814243._1
385- let claimAmount = $t01418814243._2
413+ let $t01454914604 = claimCalc(i.caller)
414+ let userNewInterest = $t01454914604._1
415+ let claimAmount = $t01454914604._2
386416 let userClaimedAmount = getUserSWOPClaimedAmount(i.caller)
387417 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
388418 if ((claimAmount == 0))
389419 then throw("You have 0 available SWOP")
390- else [IntegerEntry((toString(i.caller) + keyUserLastInterest), userNewInterest), IntegerEntry((toString(i.caller) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((toString(i.caller) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, claimAmount, SWOP)]
420+ else [IntegerEntry((toString(i.caller) + kUserLastInterest), userNewInterest), IntegerEntry((toString(i.caller) + kUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((toString(i.caller) + kUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, claimAmount, SWOP)]
391421 }
392422
393423
394424
395425 @Callable(i)
396426 func claimAndStakeSWOP () = if (!(isActive))
397427 then throw("DApp is inactive at this moment")
398428 else {
399429 let totalSWOPLocked = getTotalSWOPLocked()
400430 let userSWOPLocked = getUserSWOPLocked(i.caller)
401431 let lastInterest = getLastInterestInfo()
402- let $t01502215077 = claimCalc(i.caller)
403- let userNewInterest = $t01502215077._1
404- let claimAmount = $t01502215077._2
432+ let $t01537715432 = claimCalc(i.caller)
433+ let userNewInterest = $t01537715432._1
434+ let claimAmount = $t01537715432._2
405435 let userSWOPLockedNew = (userSWOPLocked + claimAmount)
406436 let totalSWOPLockedNew = (totalSWOPLocked + claimAmount)
407437 let userClaimedAmount = getUserSWOPClaimedAmount(i.caller)
408438 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
409439 if ((claimAmount == 0))
410440 then throw("You have 0 available SWOP")
411- else [IntegerEntry((toString(i.caller) + keyUserLastInterest), userNewInterest), IntegerEntry(keyTotalSWOPLocked, totalSWOPLockedNew), IntegerEntry((toString(i.caller) + keyUserSWOPLocked), userSWOPLockedNew), IntegerEntry((toString(i.caller) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((toString(i.caller) + keyUserSWOPLastClaimedAmount), claimAmount)]
441+ else [IntegerEntry((toString(i.caller) + kUserLastInterest), userNewInterest), IntegerEntry(kTotalSWOPLocked, totalSWOPLockedNew), IntegerEntry((toString(i.caller) + kUserSWOPLocked), userSWOPLockedNew), IntegerEntry((toString(i.caller) + kUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((toString(i.caller) + kUserSWOPLastClaimedAmount), claimAmount)]
412442 }
413443
414444
415445
416446 @Callable(i)
417447 func updateWeights (currentPools,currentRewards,rewardUpdateHeight,pagination) = if (!(isActive))
418448 then throw("DApp is inactive at this moment")
419449 else {
420450 let amountPools = 10
421- let totalRewardUpdateHeight = valueOrElse(getInteger(this, keyRewardUpdateHeight), 0)
422- if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop, adminPubKeyWallet], i.callerPublicKey)))
451+ let totalRewardUpdateHeight = valueOrElse(getInteger(this, kRewardUpdateHeight), 0)
452+ if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, moneyBoxPubKey], i.callerPublicKey)))
423453 then throw("Only admin can call this function")
424454 else if ((size(currentPools) > amountPools))
425455 then throw(("Max amount of pool is " + toString(amountPools)))
426456 else if ((totalRewardUpdateHeight >= rewardUpdateHeight))
427457 then throw("rewardUpdateHeight <= totalRewardUpdateHeight")
428458 else if ((height >= rewardUpdateHeight))
429459 then throw("height >= rewardUpdateHeight")
430460 else if ((0 >= rewardUpdateHeight))
431461 then throw("0 >= rewardUpdateHeight ")
432462 else {
433463 func sum (a,b) = (a + b)
434464
435465 func changePreviousRewardEntry (accumulated,pool) = {
436466 let poolRewardUpdateHeight = getPoolUpdateHeight(pool)
437467 if (if (!(isDefinePoolUpdateHeight(pool)))
438468 then true
439469 else if ((rewardUpdateHeight != poolRewardUpdateHeight))
440470 then (poolRewardUpdateHeight == totalRewardUpdateHeight)
441471 else false)
442472 then {
443473 let poolReward = getCurPoolWeight(pool)
444-IntegerEntry((pool + keyRewardPoolFractionPrevious), poolReward) :: accumulated
474+IntegerEntry((pool + kRewardPoolFractionPrevious), poolReward) :: accumulated
445475 }
446476 else {
447477 let poolReward = getPrevPoolWeight(pool)
448-IntegerEntry((pool + keyRewardPoolFractionPrevious), poolReward) :: accumulated
478+IntegerEntry((pool + kRewardPoolFractionPrevious), poolReward) :: accumulated
449479 }
450480 }
451481
452482 func changeCurrentRewardEntry (accumulated,pool) = {
453483 let poolIndex = value(indexOf(currentPools, pool))
454484 let poolReward = currentRewards[poolIndex]
455485 if ((0 > poolReward))
456486 then throw("PoolReward < 0")
457- else IntegerEntry((pool + keyRewardPoolFractionCurrent), poolReward) :: accumulated
487+ else IntegerEntry((pool + kRewardPoolFractionCurrent), poolReward) :: accumulated
458488 }
459489
460490 func changeHeightEntry (accumulated,pool) = {
461491 let poolHeight = rewardUpdateHeight
462-IntegerEntry((pool + keyHeightPoolFraction), poolHeight) :: accumulated
492+IntegerEntry((pool + kHeightPoolFraction), poolHeight) :: accumulated
463493 }
464494
465495 func getSumReward (curTempSum,pagination) = if ((pagination == 0))
466496 then if ((curTempSum > totalVoteShare))
467497 then throw(((("sumRewardPrevious > totalVoteShare or sumRewardCurrent > totalVoteShare - " + toString(pagination)) + " ") + toString(curTempSum)))
468- else $Tuple2([IntegerEntry(keyTempCurSum, curTempSum)], [IntegerEntry(keyRewardUpdateFirstPaginationHeight, rewardUpdateHeight)])
498+ else $Tuple2([IntegerEntry(kTempCurSum, curTempSum)], [IntegerEntry(kRewardUpdateFirstPaginationHeight, rewardUpdateHeight)])
469499 else if ((pagination == 1))
470500 then {
471- let curTempSumFromKey = valueOrElse(getInteger(this, keyTempCurSum), 0)
472- let rewardUpdateHeightFirstPaginationEntry = valueOrElse(getInteger(this, keyRewardUpdateFirstPaginationHeight), 0)
501+ let curTempSumFromKey = valueOrElse(getInteger(this, kTempCurSum), 0)
502+ let rewardUpdateHeightFirstPaginationEntry = valueOrElse(getInteger(this, kRewardUpdateFirstPaginationHeight), 0)
473503 if (((curTempSum + curTempSumFromKey) > totalVoteShare))
474504 then throw(((("sumRewardPrevious > totalVoteShare or sumRewardCurrent > totalVoteShare - " + toString(pagination)) + " ") + toString((curTempSum + curTempSumFromKey))))
475505 else if ((rewardUpdateHeightFirstPaginationEntry != rewardUpdateHeight))
476506 then throw("current rewardUpdateHeight != rewardUpdateHeightFirstPaginationEntry")
477- else $Tuple2([IntegerEntry(keyTempCurSum, (curTempSum + curTempSumFromKey))], nil)
507+ else $Tuple2([IntegerEntry(kTempCurSum, (curTempSum + curTempSumFromKey))], nil)
478508 }
479509 else if ((pagination == 2))
480510 then {
481- let curSum = (valueOrElse(getInteger(this, keyTempCurSum), 0) + curTempSum)
482- let rewardUpdateHeightFirstPaginationEntry = valueOrElse(getInteger(this, keyRewardUpdateFirstPaginationHeight), 0)
511+ let curSum = (valueOrElse(getInteger(this, kTempCurSum), 0) + curTempSum)
512+ let rewardUpdateHeightFirstPaginationEntry = valueOrElse(getInteger(this, kRewardUpdateFirstPaginationHeight), 0)
483513 if ((curSum != totalVoteShare))
484514 then throw("sumRewardPrevious != totalVoteShare or sumRewardCurrent != totalVoteShare")
485515 else if ((rewardUpdateHeightFirstPaginationEntry != rewardUpdateHeight))
486516 then throw("current rewardUpdateHeight != rewardUpdateHeightFirstPaginationEntry")
487- else $Tuple2([IntegerEntry(keyTempCurSum, curSum)], nil)
517+ else $Tuple2([IntegerEntry(kTempCurSum, curSum)], nil)
488518 }
489519 else throw("Incorrect pagination")
490520
491521 let previousRewardEntryNew = {
492522 let $l = currentPools
493523 let $s = size($l)
494524 let $acc0 = nil
495525 func $f0_1 ($a,$i) = if (($i >= $s))
496526 then $a
497527 else changePreviousRewardEntry($a, $l[$i])
498528
499529 func $f0_2 ($a,$i) = if (($i >= $s))
500530 then $a
501531 else throw("List size exceeds 10")
502532
503533 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
504534 }
505535 let currentRewardEntryNew = {
506536 let $l = currentPools
507537 let $s = size($l)
508538 let $acc0 = nil
509539 func $f1_1 ($a,$i) = if (($i >= $s))
510540 then $a
511541 else changeCurrentRewardEntry($a, $l[$i])
512542
513543 func $f1_2 ($a,$i) = if (($i >= $s))
514544 then $a
515545 else throw("List size exceeds 10")
516546
517547 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
518548 }
519549 let heightEntryNewCur = {
520550 let $l = currentPools
521551 let $s = size($l)
522552 let $acc0 = nil
523553 func $f2_1 ($a,$i) = if (($i >= $s))
524554 then $a
525555 else changeHeightEntry($a, $l[$i])
526556
527557 func $f2_2 ($a,$i) = if (($i >= $s))
528558 then $a
529559 else throw("List size exceeds 10")
530560
531561 $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
532562 }
533563 let sumRewardCurrentTemp = {
534564 let $l = currentRewards
535565 let $s = size($l)
536566 let $acc0 = 0
537567 func $f3_1 ($a,$i) = if (($i >= $s))
538568 then $a
539569 else sum($a, $l[$i])
540570
541571 func $f3_2 ($a,$i) = if (($i >= $s))
542572 then $a
543573 else throw("List size exceeds 10")
544574
545575 $f3_2($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($f3_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
546576 }
547- let $t02022120332 = getSumReward(sumRewardCurrentTemp, pagination)
548- let sumRewardCurrent = $t02022120332._1
549- let rewardUpdateHeightFirstPaginationEntry = $t02022120332._2
577+ let $t02052720638 = getSumReward(sumRewardCurrentTemp, pagination)
578+ let sumRewardCurrent = $t02052720638._1
579+ let rewardUpdateHeightFirstPaginationEntry = $t02052720638._2
550580 let rewardUpdateHeightEntry = if ((pagination == 2))
551- then [IntegerEntry(keyRewardUpdateHeight, rewardUpdateHeight)]
581+ then [IntegerEntry(kRewardUpdateHeight, rewardUpdateHeight)]
552582 else nil
553583 if ((height > rewardUpdateHeight))
554584 then throw("rewardUpdateHeight < height")
555585 else (((((previousRewardEntryNew ++ currentRewardEntryNew) ++ heightEntryNewCur) ++ sumRewardCurrent) ++ rewardUpdateHeightEntry) ++ rewardUpdateHeightFirstPaginationEntry)
556586 }
557587 }
558588
559589
560590
561591 @Callable(i)
562592 func shutdown () = if (!(isActive))
563- then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
564- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
593+ then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
594+ else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
565595 then throw("Only admin can call this function")
566596 else suspend("Paused by admin")
567597
568598
569599
570600 @Callable(i)
571601 func activate () = if (isActive)
572602 then throw("DApp is already active")
573- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, adminPubKeyStartStop], i.callerPublicKey)))
603+ else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
574604 then throw("Only admin can call this function")
575- else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
605+ else [BooleanEntry(kActive, true), DeleteEntry(kCause)]
576606
577607
578608 @Verifier(tx)
579609 func verify () = {
580610 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
581611 then 1
582612 else 0
583613 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
584614 then 1
585615 else 0
586616 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
587617 then 1
588618 else 0
589619 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
590620 }
591621

github/deemru/w8io/169f3d6 
169.71 ms