tx · FyHkarCnBzEjCo6XAg9Bj2dZs7pPz62Mwb9fqAii9fcP

3N8E9LU71MDkdP8FWtbP4TBXCNhoc15hWfs:  -0.14000000 Waves

2022.10.18 17:24 [2277953] smart account 3N8E9LU71MDkdP8FWtbP4TBXCNhoc15hWfs > SELF 0.00000000 Waves

{ "type": 13, "id": "FyHkarCnBzEjCo6XAg9Bj2dZs7pPz62Mwb9fqAii9fcP", "fee": 14000000, "feeAssetId": null, "timestamp": 1666103082627, "version": 2, "chainId": 84, "sender": "3N8E9LU71MDkdP8FWtbP4TBXCNhoc15hWfs", "senderPublicKey": "2EDucEDvqYfn6hdx4PbvykQFRoNgPMWX6SiVPjM8AyxM", "proofs": [ "3AaTXsoiw4UttR8vtfnC3SaqKsQuyh4GuCsMPhy8Qe7kSutb6VLoUxJbYbg2tyQPboJBqFzUtpycKL7mx2jte41Y", "5ygs8AMUDHYD6wYLwDY1TdzMq799DUvHtkauy6u9y12pvJZDs5DQyfoyaAThsFqueEYUWfhxzobM4hyrnaxacYm9" ], "script": "base64:BgIdCAISABIAEgMKAQESABIAEgASBgoEGBEBARIAEgBXAAdrQWN0aXZlAgZhY3RpdmUABmtDYXVzZQIOc2h1dGRvd25fY2F1c2UADWtMYXN0SW50ZXJlc3QCDWxhc3RfaW50ZXJlc3QAEWtVc2VyTGFzdEludGVyZXN0Ag5fbGFzdF9pbnRlcmVzdAAPa1VzZXJTV09QTG9ja2VkAgxfU1dPUF9hbW91bnQAEGtUb3RhbFNXT1BMb2NrZWQCEXRvdGFsX1NXT1BfYW1vdW50ABVrVXNlclN3b3BVbmxvY2tIZWlnaHQCE19TV09QX3VubG9ja19oZWlnaHQAEGtVc2VyR1N3b3BMb2NrZWQCDV9HU3dvcF9hbW91bnQAEWtUb3RhbEdTd29wTG9ja2VkAhJ0b3RhbF9HU3dvcF9hbW91bnQAEmtVc2VyVG90YWxWb3RlU1dPUAIWX3VzZXJfdG90YWxfdm90ZV9nU1dPUAAWa1VzZXJBdmFpbGFibGVGb3JDbGFpbQIZX3VzZXJfYXZhaWxhYmxlX2Zvcl9jbGFpbQAaa1Jld2FyZFBvb2xGcmFjdGlvbkN1cnJlbnQCHV9jdXJyZW50X3Bvb2xfZnJhY3Rpb25fcmV3YXJkABtrUmV3YXJkUG9vbEZyYWN0aW9uUHJldmlvdXMCHl9wcmV2aW91c19wb29sX2ZyYWN0aW9uX3Jld2FyZAATa0hlaWdodFBvb2xGcmFjdGlvbgIaX3Bvb2xfcmV3YXJkX3VwZGF0ZV9oZWlnaHQAE2tSZXdhcmRVcGRhdGVIZWlnaHQCFHJld2FyZF91cGRhdGVfaGVpZ2h0ACJrUmV3YXJkVXBkYXRlRmlyc3RQYWdpbmF0aW9uSGVpZ2h0AiVyZXdhcmRfdXBkYXRlX2hlaWdodF9maXJzdF9wYWdpbmF0aW9uABNrTm9Wb3RpbmdGb3JOZXdQb29sAghfdm90ZV9ubwAUa1llc1ZvdGluZ0Zvck5ld1Bvb2wCCV92b3RlX3llcwAZa1N0YXR1c09mVm90aW5nRm9yTmV3UG9vbAIHX3N0YXR1cwAda0hlaWdodE9mUG9vbFZvdGluZ0Zvck5ld1Bvb2wCDl9maW5pc2hfaGVpZ2h0AA9hY3RpdmVWb3RlRmlyc3QCFHZvdGluZ19hY3RpdmVfY2VsbF8xABBhY3RpdmVWb3RlU2Vjb25kAhR2b3RpbmdfYWN0aXZlX2NlbGxfMgAPYWN0aXZlVm90ZVRoaXJkAhR2b3RpbmdfYWN0aXZlX2NlbGxfMwALa1RlbXBDdXJTdW0CEnN1bV9yZXdhcmRfY3VycmVudAAXa0xhdW5jaHBhZEJvdWdodFRpY2tldHMCD19ib3VnaHRfdGlja2V0cwAYa0xhdW5jaHBhZFN3b3BQZXJUaWNrZXRzAhBfc3dvcF9wZXJfdGlja2V0ABJrTGF1bmNocGFkQWN0aXZlSWQCE2xhdW5jaHBhZF9hY3RpdmVfaWQAEmtMYXVuY2hwYWREdXJhdGlvbgIJX2R1cmF0aW9uABVrTGF1bmNocGFkU3RhcnRIZWlnaHQCDV9zdGFydF9oZWlnaHQADGtTdGFydEhlaWdodAIMc3RhcnRfaGVpZ2h0AAtrQmFzZVBlcmlvZAILYmFzZV9wZXJpb2QADWtQZXJpb2RMZW5ndGgCDXBlcmlvZF9sZW5ndGgAD2tVc2VyVG90YWxTdHJ1YwIRX3VzZXJfdG90YWxfc3RydWMAGmtMYXVjaHBhZEZyZWV6U3dvcER1cmF0aW9uAhVfZnJlZXplX3N3b3BfZHVyYXRpb24AB2tTV09QaWQCB1NXT1BfaWQAC2tBaXJkcm9wRmVlAgthaXJkcm9wX2ZlZQANa0FkbWluUHViS2V5MQILYWRtaW5fcHViXzEADWtBZG1pblB1YktleTICC2FkbWluX3B1Yl8yAA1rQWRtaW5QdWJLZXkzAgthZG1pbl9wdWJfMwAPa01vbmV5Qm94UHViS2V5AhFtb25leV9ib3hfcHViX2tleQAMa0Zhcm1pbmdBZGRyAg9mYXJtaW5nX2FkZHJlc3MAC2tWb3RpbmdBZGRyAg52b3RpbmdfYWRkcmVzcwASa1ZvdGluZ05ld1Bvb2xBZGRyAhd2b3RpbmdfbmV3X3Bvb2xfYWRkcmVzcwAOa0xhdW5jaHBhZEFkZHICEWxhdW5jaHBhZF9hZGRyZXNzABRrQWlyZHJvcE1vbmV5Qm94QWRkcgIVYWlyZHJvcF9mZWVfbW9uZXlfYm94AAZvcmFjbGUJAQdBZGRyZXNzAQEaAVRIE5cMwNMzzCUygLYp96dkaICr48x7S5kBE2dldEJhc2U1OEZyb21PcmFjbGUBA2tleQQHJG1hdGNoMAkAnQgCBQZvcmFjbGUFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEBnN0cmluZwUHJG1hdGNoMAkA2QQBBQZzdHJpbmcEB25vdGhpbmcFByRtYXRjaDAJAAIBCQCsAgIFA2tleQIIaXMgZW1wdHkADGFkbWluUHViS2V5MQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkxAAxhZG1pblB1YktleTIJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MgAMYWRtaW5QdWJLZXkzCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTMADm1vbmV5Qm94UHViS2V5CQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFD2tNb25leUJveFB1YktleQALZmFybWluZ0FkZHIJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQxrRmFybWluZ0FkZHIACnZvdGluZ0FkZHIJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQtrVm90aW5nQWRkcgARdm90aW5nTmV3UG9vbEFkZHIJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBRJrVm90aW5nTmV3UG9vbEFkZHIADWxhdW5jaHBhZEFkZHIJAQdBZGRyZXNzAQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ5rTGF1bmNocGFkQWRkcgATYWlyZHJvcE1vbmV5Qm94QWRkcgkBB0FkZHJlc3MBCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFFGtBaXJkcm9wTW9uZXlCb3hBZGRyABRsb2NrU3dvcEJsb2Nrc0Ftb3VudAkAaAIA9k4ABAAEU1dPUAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCBQtmYXJtaW5nQWRkcgUHa1NXT1BpZAAKc2NhbGVWYWx1ZQCAwtcvAA50b3RhbFZvdGVTaGFyZQCAyK+gJQAJZmVlU2FjbGU2AMCEPQAKYmFzZVBlcmlvZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFCnZvdGluZ0FkZHIFC2tCYXNlUGVyaW9kAiRFbXB0eSBrQmFzZVBlcmlvZCBhdCB2b3RpbmcgY29udHJhY3QAC3N0YXJ0SGVpZ2h0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUKdm90aW5nQWRkcgUMa1N0YXJ0SGVpZ2h0AiVFbXB0eSBrU3RhcnRIZWlnaHQgYXQgdm90aW5nIGNvbnRyYWN0AAxwZXJpb2RMZW5ndGgJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQp2b3RpbmdBZGRyBQ1rUGVyaW9kTGVuZ3RoAiZFbXB0eSBrUGVyaW9kTGVuZ3RoIGF0IHZvdGluZyBjb250cmFjdAAPZmlyc3RBY3RpdmVWb3RlCQELdmFsdWVPckVsc2UCCQCdCAIFEXZvdGluZ05ld1Bvb2xBZGRyBQ9hY3RpdmVWb3RlRmlyc3QCAAAQc2Vjb25kQWN0aXZlVm90ZQkBC3ZhbHVlT3JFbHNlAgkAnQgCBRF2b3RpbmdOZXdQb29sQWRkcgUQYWN0aXZlVm90ZVNlY29uZAIAAA90aGlyZEFjdGl2ZVZvdGUJAQt2YWx1ZU9yRWxzZQIJAJ0IAgURdm90aW5nTmV3UG9vbEFkZHIFD2FjdGl2ZVZvdGVUaGlyZAIAAAZhY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYACmFpcmRyb3BGZWUJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBm9yYWNsZQULa0FpcmRyb3BGZWUAEGN1cnJWb3RpbmdQZXJpb2QJAGQCBQpiYXNlUGVyaW9kCQBpAgkAZQIFBmhlaWdodAULc3RhcnRIZWlnaHQFDHBlcmlvZExlbmd0aAEHc3VzcGVuZAEFY2F1c2UJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUHCQDMCAIJAQtTdHJpbmdFbnRyeQIFBmtDYXVzZQUFY2F1c2UFA25pbAEIaXNBY3RpdmUAAwUGYWN0aXZlBQR1bml0CQACAQIfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAELaXNBZG1pbkNhbGwBAWkDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQxhZG1pblB1YktleTEJAMwIAgUMYWRtaW5QdWJLZXkyCQDMCAIFDGFkbWluUHViS2V5MwUDbmlsCAUBaQ9jYWxsZXJQdWJsaWNLZXkFBHVuaXQJAAIBAiFPbmx5IGFkbWluIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BE2dldExhc3RJbnRlcmVzdEluZm8ACQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDWtMYXN0SW50ZXJlc3QAAAESZ2V0VG90YWxMb2NrZWRJbmZvAAQPdG90YWxTd29wTG9ja2VkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFEGtUb3RhbFNXT1BMb2NrZWQAAAQQdG90YWxHU3dvcExvY2tlZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRFrVG90YWxHU3dvcExvY2tlZAUPdG90YWxTd29wTG9ja2VkCQCUCgIFD3RvdGFsU3dvcExvY2tlZAUQdG90YWxHU3dvcExvY2tlZAERZ2V0VXNlckxvY2tlZEluZm8BBHVzZXIEDnVzZXJTd29wTG9ja2VkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEdXNlcgUPa1VzZXJTV09QTG9ja2VkAAAED3VzZXJHU3dvcExvY2tlZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHVzZXIFEGtVc2VyR1N3b3BMb2NrZWQFDnVzZXJTd29wTG9ja2VkCQCUCgIFDnVzZXJTd29wTG9ja2VkBQ91c2VyR1N3b3BMb2NrZWQBE2dldFVzZXJJbnRlcmVzdEluZm8CBHVzZXIMbGFzdEludGVyZXN0BAskdDA0ODg3NDk1MAkBEWdldFVzZXJMb2NrZWRJbmZvAQUEdXNlcgQOdXNlclNXT1BBbW91bnQIBQskdDA0ODg3NDk1MAJfMQQPdXNlckdTd29wQW1vdW50CAULJHQwNDg4NzQ5NTACXzIEEHVzZXJMYXN0SW50ZXJlc3QJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQR1c2VyBRFrVXNlckxhc3RJbnRlcmVzdAUMbGFzdEludGVyZXN0CQCVCgMFEHVzZXJMYXN0SW50ZXJlc3QFDnVzZXJTV09QQW1vdW50BQ91c2VyR1N3b3BBbW91bnQBGGdldFVzZXJBdmFpbGFibGVGb3JDbGFpbQEEdXNlcgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHVzZXIFFmtVc2VyQXZhaWxhYmxlRm9yQ2xhaW0AAAEgZ2V0VXNlclRvdGFsVm90ZUFtb3VudEZvck9uZVBvb2wCBHBvb2wEdXNlcgQGdm90aW5nCQELdmFsdWVPckVsc2UCCQCaCAIFEXZvdGluZ05ld1Bvb2xBZGRyBQRwb29sAP///////////wEEDmhlaWdodE9mVm90aW5nCQELdmFsdWVPckVsc2UCCQCaCAIFEXZvdGluZ05ld1Bvb2xBZGRyCQCsAgIJAKQDAQUGdm90aW5nBR1rSGVpZ2h0T2ZQb29sVm90aW5nRm9yTmV3UG9vbAAABA5zdGF0dXNPZlZvdGluZwkBC3ZhbHVlT3JFbHNlAgkAmwgCBRF2b3RpbmdOZXdQb29sQWRkcgkArAICCQCkAwEFBnZvdGluZwUZa1N0YXR1c09mVm90aW5nRm9yTmV3UG9vbAYEDWN1cnJlbnRIZWlnaHQFBmhlaWdodAMJAGYCAAAFBnZvdGluZwAAAwkBASEBBQ5zdGF0dXNPZlZvdGluZwAAAwkAZgIFDmhlaWdodE9mVm90aW5nBQ1jdXJyZW50SGVpZ2h0CQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBRF2b3RpbmdOZXdQb29sQWRkcgkArAICCQCsAgIJAKwCAgkApQgBBQR1c2VyAgFfCQCkAwEFBnZvdGluZwUUa1llc1ZvdGluZ0Zvck5ld1Bvb2wAAAkBC3ZhbHVlT3JFbHNlAgkAmggCBRF2b3RpbmdOZXdQb29sQWRkcgkArAICCQCsAgIJAKwCAgkApQgBBQR1c2VyAgFfCQCkAwEFBnZvdGluZwUTa05vVm90aW5nRm9yTmV3UG9vbAAAAAABIGdldFVzZXJUb3RhbFZvdGVGb3JOZXdQb29sQW1vdW50AQR1c2VyBAxsaXN0T2ZWb3RpbmcJAMwIAgkBIGdldFVzZXJUb3RhbFZvdGVBbW91bnRGb3JPbmVQb29sAgUPZmlyc3RBY3RpdmVWb3RlBQR1c2VyCQDMCAIJASBnZXRVc2VyVG90YWxWb3RlQW1vdW50Rm9yT25lUG9vbAIFEHNlY29uZEFjdGl2ZVZvdGUFBHVzZXIJAMwIAgkBIGdldFVzZXJUb3RhbFZvdGVBbW91bnRGb3JPbmVQb29sAgUPdGhpcmRBY3RpdmVWb3RlBQR1c2VyBQNuaWwJAJYDAQUMbGlzdE9mVm90aW5nARhnZXRVc2VyQmxvY2tlZEluTGF1Y2hwYWQBBHVzZXIECmxhdWNocGFkSWQJAKQDAQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1sYXVuY2hwYWRBZGRyBRJrTGF1bmNocGFkQWN0aXZlSWQAAAMJAAACBQpsYXVjaHBhZElkAgEwAAAEDGxTdGFydEhlaWdodAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1sYXVuY2hwYWRBZGRyCQCsAgIFCmxhdWNocGFkSWQFFWtMYXVuY2hwYWRTdGFydEhlaWdodAAABAlsRHVyYXRpb24JAQt2YWx1ZU9yRWxzZQIJAJoIAgUNbGF1bmNocGFkQWRkcgkArAICBQpsYXVjaHBhZElkBRJrTGF1bmNocGFkRHVyYXRpb24AAAQTbEZyZWV6ZVN3b3BEdXJhdGlvbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1sYXVuY2hwYWRBZGRyCQCsAgIFCmxhdWNocGFkSWQFGmtMYXVjaHBhZEZyZWV6U3dvcER1cmF0aW9uAAAEDmJsb2NrRW5kSGVpZ2h0CQBkAgkAZAIFDGxTdGFydEhlaWdodAUJbER1cmF0aW9uBRNsRnJlZXplU3dvcER1cmF0aW9uAwkAZgIFBmhlaWdodAUOYmxvY2tFbmRIZWlnaHQAAAQNYm91Z2h0VGlja2V0cwkBC3ZhbHVlT3JFbHNlAgkAmggCBQ1sYXVuY2hwYWRBZGRyCQCsAgIJAKwCAgkArAICCQClCAEFBHVzZXICAV8FCmxhdWNocGFkSWQFF2tMYXVuY2hwYWRCb3VnaHRUaWNrZXRzAAAEDXN3b3BQZXJUaWNrZXQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUNbGF1bmNocGFkQWRkcgkArAICBQpsYXVjaHBhZElkBRhrTGF1bmNocGFkU3dvcFBlclRpY2tldHMAAAkAaAIFDWJvdWdodFRpY2tldHMFDXN3b3BQZXJUaWNrZXQBD2dldFVzZXJWb3RlSW5mbwEEdXNlcgQLJHQwNzMxNDc4NDcDCQEJaXNEZWZpbmVkAQkAnQgCBQp2b3RpbmdBZGRyCQCsAgIJAKUIAQUEdXNlcgUPa1VzZXJUb3RhbFN0cnVjBARkYXRhCQC1CQIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQp2b3RpbmdBZGRyCQCsAgIJAKUIAQUEdXNlcgUPa1VzZXJUb3RhbFN0cnVjAhVFbXB0eSBrVXNlclRvdGFsU3RydWMCAV8JAJUKAwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGRhdGEAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGRhdGEAAQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBGRhdGEAAgQOdVBvb2xUb3RhbFNXT1AJAQt2YWx1ZU9yRWxzZQIJAJoIAgUKdm90aW5nQWRkcgkArAICCQClCAEFBHVzZXIFEmtVc2VyVG90YWxWb3RlU1dPUAAACQCVCgMFDnVQb29sVG90YWxTV09QAAAFEGN1cnJWb3RpbmdQZXJpb2QEEXVzZXJUb3RhbFZvdGVTV09QCAULJHQwNzMxNDc4NDcCXzEEC3VzZXJVbnZvdGVkCAULJHQwNzMxNDc4NDcCXzIEEXVzZXJVbnZvdGVkUGVyaW9kCAULJHQwNzMxNDc4NDcCXzMEEXVzZXJVbnZvdGVkQWN0dWFsAwkAAAIFEXVzZXJVbnZvdGVkUGVyaW9kBRBjdXJyVm90aW5nUGVyaW9kBQt1c2VyVW52b3RlZAAACQCUCgIFEXVzZXJUb3RhbFZvdGVTV09QBRF1c2VyVW52b3RlZEFjdHVhbAETZ2V0UG9vbFVwZGF0ZUhlaWdodAEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFE2tIZWlnaHRQb29sRnJhY3Rpb24AAAEYaXNEZWZpbmVQb29sVXBkYXRlSGVpZ2h0AQRwb29sCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQCsAgIFBHBvb2wFE2tIZWlnaHRQb29sRnJhY3Rpb24BEGdldEN1clBvb2xXZWlnaHQBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBRprUmV3YXJkUG9vbEZyYWN0aW9uQ3VycmVudAAAARFnZXRQcmV2UG9vbFdlaWdodAEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFG2tSZXdhcmRQb29sRnJhY3Rpb25QcmV2aW91cwAAAQljbGFpbUNhbGMBBHVzZXIEDGxhc3RJbnRlcmVzdAkBE2dldExhc3RJbnRlcmVzdEluZm8ABAskdDA4NzIxODgxOAkBE2dldFVzZXJJbnRlcmVzdEluZm8CBQR1c2VyBQxsYXN0SW50ZXJlc3QEEHVzZXJMYXN0SW50ZXJlc3QIBQskdDA4NzIxODgxOAJfMQQOdXNlclNXT1BMb2NrZWQIBQskdDA4NzIxODgxOAJfMgQPdXNlckdTd29wQW1vdW50CAULJHQwODcyMTg4MTgCXzMEC2NsYWltQW1vdW50CQBrAwUPdXNlckdTd29wQW1vdW50CQBlAgUMbGFzdEludGVyZXN0BRB1c2VyTGFzdEludGVyZXN0BQpzY2FsZVZhbHVlBA91c2VyTmV3SW50ZXJlc3QFDGxhc3RJbnRlcmVzdAkAlAoCBQ91c2VyTmV3SW50ZXJlc3QFC2NsYWltQW1vdW50CQFpAQdhaXJEcm9wAAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQLJHQwOTA0ODkxMjMJAJQKAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQJcG10QW1vdW50CAULJHQwOTA0ODkxMjMCXzEECnBtdEFzc2V0SWQIBQskdDA5MDQ4OTEyMwJfMgMJAQIhPQIFCnBtdEFzc2V0SWQFBFNXT1AJAAIBAhRJbmNvcnJlY3QgcG10QXNzZXRJZAQQYWlyZHJvcEZlZUFtb3VudAkAbgQFCXBtdEFtb3VudAUKYWlyZHJvcEZlZQUJZmVlU2FjbGU2BQdDRUlMSU5HBAskdDA5Mjk2OTM1OAkBEmdldFRvdGFsTG9ja2VkSW5mbwAED3RvdGFsU1dPUExvY2tlZAgFCyR0MDkyOTY5MzU4Al8xBBB0b3RhbEdTd29wTG9ja2VkCAULJHQwOTI5NjkzNTgCXzIEDGxhc3RJbnRlcmVzdAkBE2dldExhc3RJbnRlcmVzdEluZm8ABAtpbnRlcmVzdE5ldwkAZAIFDGxhc3RJbnRlcmVzdAkAawMJAGUCBQlwbXRBbW91bnQFEGFpcmRyb3BGZWVBbW91bnQFCnNjYWxlVmFsdWUFEHRvdGFsR1N3b3BMb2NrZWQJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtMYXN0SW50ZXJlc3QFC2ludGVyZXN0TmV3CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFE2FpcmRyb3BNb25leUJveEFkZHIFEGFpcmRyb3BGZWVBbW91bnQFBFNXT1AFA25pbAFpAQhsb2NrU1dPUAAJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAECyR0MDk3MzY5ODExCQCUCgIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQECXBtdEFtb3VudAgFCyR0MDk3MzY5ODExAl8xBApwbXRBc3NldElkCAULJHQwOTczNjk4MTECXzIDCQECIT0CBQpwbXRBc3NldElkBQRTV09QCQACAQIUSW5jb3JyZWN0IHBtdEFzc2V0SWQEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAxsYXN0SW50ZXJlc3QJARNnZXRMYXN0SW50ZXJlc3RJbmZvAAQMJHQwOTk2MjEwMDI1CQERZ2V0VXNlckxvY2tlZEluZm8BBQR1c2VyBA51c2VyU1dPUExvY2tlZAgFDCR0MDk5NjIxMDAyNQJfMQQPdXNlckdTd29wTG9ja2VkCAUMJHQwOTk2MjEwMDI1Al8yBA0kdDAxMDAzMDEwMDkxCQEJY2xhaW1DYWxjAQUEdXNlcgQPdXNlck5ld0ludGVyZXN0CAUNJHQwMTAwMzAxMDA5MQJfMQQUY2xhaW1BbW91bnRBdmFpbGFibGUIBQ0kdDAxMDAzMDEwMDkxAl8yBBFhdmFpbGFibGVGb3JDbGFpbQkBGGdldFVzZXJBdmFpbGFibGVGb3JDbGFpbQEFBHVzZXIEFGF2YWlsYWJsZUZvckNsYWltTmV3CQBkAgURYXZhaWxhYmxlRm9yQ2xhaW0FFGNsYWltQW1vdW50QXZhaWxhYmxlBBF1c2VyU1dPUExvY2tlZE5ldwkAZAIFDnVzZXJTV09QTG9ja2VkBQlwbXRBbW91bnQEEnVzZXJHU3dvcExvY2tlZE5ldwkAZAIFD3VzZXJHU3dvcExvY2tlZAUJcG10QW1vdW50BA0kdDAxMDMzOTEwNDAxCQESZ2V0VG90YWxMb2NrZWRJbmZvAAQPdG90YWxTV09QTG9ja2VkCAUNJHQwMTAzMzkxMDQwMQJfMQQQdG90YWxHU3dvcExvY2tlZAgFDSR0MDEwMzM5MTA0MDECXzIEEnRvdGFsU1dPUExvY2tlZE5ldwkAZAIFD3RvdGFsU1dPUExvY2tlZAUJcG10QW1vdW50BBN0b3RhbEdTd29wTG9ja2VkTmV3CQBkAgUQdG90YWxHU3dvcExvY2tlZAUJcG10QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFFWtVc2VyU3dvcFVubG9ja0hlaWdodAkAZAIFBmhlaWdodAUUbG9ja1N3b3BCbG9ja3NBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgURa1VzZXJMYXN0SW50ZXJlc3QFD3VzZXJOZXdJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBQ9rVXNlclNXT1BMb2NrZWQFEXVzZXJTV09QTG9ja2VkTmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFEGtVc2VyR1N3b3BMb2NrZWQFD3VzZXJHU3dvcExvY2tlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBRZrVXNlckF2YWlsYWJsZUZvckNsYWltBRRhdmFpbGFibGVGb3JDbGFpbU5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgUQa1RvdGFsU1dPUExvY2tlZAUSdG90YWxTV09QTG9ja2VkTmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrVG90YWxHU3dvcExvY2tlZAUTdG90YWxHU3dvcExvY2tlZE5ldwUDbmlsAWkBDHdpdGhkcmF3U1dPUAEOd2l0aGRyYXdBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAx1bmxvY2tIZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQR1c2VyBRVrVXNlclN3b3BVbmxvY2tIZWlnaHQAAAMJAGcCAAAFDndpdGhkcmF3QW1vdW50CQACAQITd2l0aGRyYXdBbW91bnQgPD0gMAMJAGYCBQx1bmxvY2tIZWlnaHQFBmhlaWdodAkAAgEJAKwCAgIYWW91IGNhbid0IHdpdGhkcmF3IHRpbGwgCQCkAwEFDHVubG9ja0hlaWdodAQNJHQwMTEzNzYxMTQzOAkBEmdldFRvdGFsTG9ja2VkSW5mbwAED3RvdGFsU1dPUExvY2tlZAgFDSR0MDExMzc2MTE0MzgCXzEEEHRvdGFsR1N3b3BMb2NrZWQIBQ0kdDAxMTM3NjExNDM4Al8yBA0kdDAxMTQ0MzExNTA2CQERZ2V0VXNlckxvY2tlZEluZm8BBQR1c2VyBA51c2VyU1dPUExvY2tlZAgFDSR0MDExNDQzMTE1MDYCXzEED3VzZXJHU3dvcExvY2tlZAgFDSR0MDExNDQzMTE1MDYCXzIEDSR0MDExNTExMTE1NzIJAQljbGFpbUNhbGMBBQR1c2VyBA91c2VyTmV3SW50ZXJlc3QIBQ0kdDAxMTUxMTExNTcyAl8xBBRjbGFpbUFtb3VudEF2YWlsYWJsZQgFDSR0MDExNTExMTE1NzICXzIEDSR0MDExNTc3MTE2NDMJAQ9nZXRVc2VyVm90ZUluZm8BCAUBaQZjYWxsZXIEDnVzZXJWb3RlQW1vdW50CAUNJHQwMTE1NzcxMTY0MwJfMQQQdXNlclVudm90ZUFtb3VudAgFDSR0MDExNTc3MTE2NDMCXzIEGHVzZXJWb3RlQW1vdW50Rm9yTmV3UG9vbAkBIGdldFVzZXJUb3RhbFZvdGVGb3JOZXdQb29sQW1vdW50AQgFAWkGY2FsbGVyBBJibG9ja2VkSW5MYXVuY2hwYWQJARhnZXRVc2VyQmxvY2tlZEluTGF1Y2hwYWQBCAUBaQZjYWxsZXIDAwMJAGYCAAAFEHVzZXJVbnZvdGVBbW91bnQGCQBmAgAABQ51c2VyVm90ZUFtb3VudAYJAGYCAAAFGHVzZXJWb3RlQW1vdW50Rm9yTmV3UG9vbAkAAgECSnVzZXJVbnZvdGVBbW91bnQgPCAwIHx8IHVzZXJWb3RlQW1vdW50IDwgMCB8fCB1c2VyVm90ZUFtb3VudEZvck5ld1Bvb2wgPCAwBBJhdmFpbGFibGVUb1Vuc3Rha2UJAGUCBQ51c2VyU1dPUExvY2tlZAkAlgMBCQDMCAIFGHVzZXJWb3RlQW1vdW50Rm9yTmV3UG9vbAkAzAgCCQBkAgUOdXNlclZvdGVBbW91bnQFEHVzZXJVbnZvdGVBbW91bnQJAMwIAgUSYmxvY2tlZEluTGF1bmNocGFkBQNuaWwDCQBmAgUOd2l0aGRyYXdBbW91bnQFEmF2YWlsYWJsZVRvVW5zdGFrZQkAAgECI3dpdGhkcmF3QW1vdW50ID4gYXZhaWxhYmxlVG9VbnN0YWtlBBFhdmFpbGFibGVGb3JDbGFpbQkBGGdldFVzZXJBdmFpbGFibGVGb3JDbGFpbQEFBHVzZXIEFGF2YWlsYWJsZUZvckNsYWltTmV3CQBkAgURYXZhaWxhYmxlRm9yQ2xhaW0FFGNsYWltQW1vdW50QXZhaWxhYmxlBBJ0b3RhbFNXT1BMb2NrZWROZXcJAGUCBQ90b3RhbFNXT1BMb2NrZWQFDndpdGhkcmF3QW1vdW50BBF1c2VyU1dPUEFtb3VudE5ldwkAZQIFDnVzZXJTV09QTG9ja2VkBQ53aXRoZHJhd0Ftb3VudAQTdG90YWxHU3dvcExvY2tlZE5ldwkAZAIJAGUCBRB0b3RhbEdTd29wTG9ja2VkBQ91c2VyR1N3b3BMb2NrZWQFEXVzZXJTV09QQW1vdW50TmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFEWtVc2VyTGFzdEludGVyZXN0BQ91c2VyTmV3SW50ZXJlc3QJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgUPa1VzZXJTV09QTG9ja2VkBRF1c2VyU1dPUEFtb3VudE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBRBrVXNlckdTd29wTG9ja2VkBRF1c2VyU1dPUEFtb3VudE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBRZrVXNlckF2YWlsYWJsZUZvckNsYWltBRRhdmFpbGFibGVGb3JDbGFpbU5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgUQa1RvdGFsU1dPUExvY2tlZAUSdG90YWxTV09QTG9ja2VkTmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrVG90YWxHU3dvcExvY2tlZAUTdG90YWxHU3dvcExvY2tlZE5ldwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFDndpdGhkcmF3QW1vdW50BQRTV09QBQNuaWwBaQEUY2xhaW1BbmRXaXRoZHJhd1NXT1AACQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABAR1c2VyCQClCAEIBQFpBmNhbGxlcgQRYXZhaWxhYmxlRm9yQ2xhaW0JARhnZXRVc2VyQXZhaWxhYmxlRm9yQ2xhaW0BBQR1c2VyBA0kdDAxMzE2MjEzMjE0CQEJY2xhaW1DYWxjAQUEdXNlcgQPdXNlck5ld0ludGVyZXN0CAUNJHQwMTMxNjIxMzIxNAJfMQQLY2xhaW1BbW91bnQIBQ0kdDAxMzE2MjEzMjE0Al8yBA91c2VyQ2xhaW1BbW91bnQJAGQCBRFhdmFpbGFibGVGb3JDbGFpbQULY2xhaW1BbW91bnQDCQAAAgUPdXNlckNsYWltQW1vdW50AAAJAAIBAhlZb3UgaGF2ZSAwIGF2YWlsYWJsZSBTV09QCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFEWtVc2VyTGFzdEludGVyZXN0BQ91c2VyTmV3SW50ZXJlc3QJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQ91c2VyQ2xhaW1BbW91bnQFBFNXT1AFA25pbAFpARFjbGFpbUFuZFN0YWtlU1dPUAAJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBA0kdDAxMzU4NzEzNjQ5CQESZ2V0VG90YWxMb2NrZWRJbmZvAAQPdG90YWxTV09QTG9ja2VkCAUNJHQwMTM1ODcxMzY0OQJfMQQQdG90YWxHU3dvcExvY2tlZAgFDSR0MDEzNTg3MTM2NDkCXzIEDSR0MDEzNjU0MTM3MTcJARFnZXRVc2VyTG9ja2VkSW5mbwEFBHVzZXIEDnVzZXJTV09QTG9ja2VkCAUNJHQwMTM2NTQxMzcxNwJfMQQPdXNlckdTd29wTG9ja2VkCAUNJHQwMTM2NTQxMzcxNwJfMgQRYXZhaWxhYmxlRm9yQ2xhaW0JARhnZXRVc2VyQXZhaWxhYmxlRm9yQ2xhaW0BBQR1c2VyBA0kdDAxMzc4MTEzODMyCQEJY2xhaW1DYWxjAQUEdXNlcgQPdXNlck5ld0ludGVyZXN0CAUNJHQwMTM3ODExMzgzMgJfMQQLY2xhaW1BbW91bnQIBQ0kdDAxMzc4MTEzODMyAl8yBA91c2VyQ2xhaW1BbW91bnQJAGQCBRFhdmFpbGFibGVGb3JDbGFpbQULY2xhaW1BbW91bnQEEXVzZXJTV09QTG9ja2VkTmV3CQBkAgUOdXNlclNXT1BMb2NrZWQFD3VzZXJDbGFpbUFtb3VudAQSdXNlckdTd29wTG9ja2VkTmV3CQBkAgUPdXNlckdTd29wTG9ja2VkCQBoAgUPdXNlckNsYWltQW1vdW50AAIEEnRvdGFsU1dPUExvY2tlZE5ldwkAZAIFD3RvdGFsU1dPUExvY2tlZAUPdXNlckNsYWltQW1vdW50BBN0b3RhbEdTd29wTG9ja2VkTmV3CQBkAgUQdG90YWxHU3dvcExvY2tlZAkAaAIFD3VzZXJDbGFpbUFtb3VudAACAwkAAAIFD3VzZXJDbGFpbUFtb3VudAAACQACAQIZWW91IGhhdmUgMCBhdmFpbGFibGUgU1dPUAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQClCAEIBQFpBmNhbGxlcgUVa1VzZXJTd29wVW5sb2NrSGVpZ2h0CQBkAgUGaGVpZ2h0BRRsb2NrU3dvcEJsb2Nrc0Ftb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQClCAEIBQFpBmNhbGxlcgURa1VzZXJMYXN0SW50ZXJlc3QFD3VzZXJOZXdJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgUQa1RvdGFsU1dPUExvY2tlZAUSdG90YWxTV09QTG9ja2VkTmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrVG90YWxHU3dvcExvY2tlZAUTdG90YWxHU3dvcExvY2tlZE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQClCAEIBQFpBmNhbGxlcgUPa1VzZXJTV09QTG9ja2VkBRF1c2VyU1dPUExvY2tlZE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQClCAEIBQFpBmNhbGxlcgUQa1VzZXJHU3dvcExvY2tlZAUSdXNlckdTd29wTG9ja2VkTmV3BQNuaWwBaQETbG9ja1NXT1BGcm9tRmFybWluZwAJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEDSR0MDE0NzcyMTQ4NDcJAJQKAggJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQICQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAQJcG10QW1vdW50CAUNJHQwMTQ3NzIxNDg0NwJfMQQKcG10QXNzZXRJZAgFDSR0MDE0NzcyMTQ4NDcCXzIDCQECIT0CCAUBaQZjYWxsZXIFC2Zhcm1pbmdBZGRyCQACAQIjT25seSBmYXJtaW5nIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24DCQECIT0CBQpwbXRBc3NldElkBQRTV09QCQACAQIUSW5jb3JyZWN0IHBtdEFzc2V0SWQEBHVzZXIJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyBAxsYXN0SW50ZXJlc3QJARNnZXRMYXN0SW50ZXJlc3RJbmZvAAQNJHQwMTUwOTAxNTE1MwkBEWdldFVzZXJMb2NrZWRJbmZvAQUEdXNlcgQOdXNlclNXT1BMb2NrZWQIBQ0kdDAxNTA5MDE1MTUzAl8xBA91c2VyR1N3b3BMb2NrZWQIBQ0kdDAxNTA5MDE1MTUzAl8yBA0kdDAxNTE1ODE1MjE5CQEJY2xhaW1DYWxjAQUEdXNlcgQPdXNlck5ld0ludGVyZXN0CAUNJHQwMTUxNTgxNTIxOQJfMQQUY2xhaW1BbW91bnRBdmFpbGFibGUIBQ0kdDAxNTE1ODE1MjE5Al8yBBFhdmFpbGFibGVGb3JDbGFpbQkBGGdldFVzZXJBdmFpbGFibGVGb3JDbGFpbQEFBHVzZXIEFGF2YWlsYWJsZUZvckNsYWltTmV3CQBkAgURYXZhaWxhYmxlRm9yQ2xhaW0FFGNsYWltQW1vdW50QXZhaWxhYmxlBBF1c2VyU1dPUExvY2tlZE5ldwkAZAIFDnVzZXJTV09QTG9ja2VkBQlwbXRBbW91bnQEEnVzZXJHU3dvcExvY2tlZE5ldwkAZAIFD3VzZXJHU3dvcExvY2tlZAkAaAIFCXBtdEFtb3VudAACBA0kdDAxNTQ3MTE1NTMzCQESZ2V0VG90YWxMb2NrZWRJbmZvAAQPdG90YWxTV09QTG9ja2VkCAUNJHQwMTU0NzExNTUzMwJfMQQQdG90YWxHU3dvcExvY2tlZAgFDSR0MDE1NDcxMTU1MzMCXzIEEnRvdGFsU1dPUExvY2tlZE5ldwkAZAIFD3RvdGFsU1dPUExvY2tlZAUJcG10QW1vdW50BBN0b3RhbEdTd29wTG9ja2VkTmV3CQBkAgUQdG90YWxHU3dvcExvY2tlZAkAaAIFCXBtdEFtb3VudAACCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFFWtVc2VyU3dvcFVubG9ja0hlaWdodAkAZAIFBmhlaWdodAUUbG9ja1N3b3BCbG9ja3NBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEdXNlcgURa1VzZXJMYXN0SW50ZXJlc3QFD3VzZXJOZXdJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBQ9rVXNlclNXT1BMb2NrZWQFEXVzZXJTV09QTG9ja2VkTmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHVzZXIFEGtVc2VyR1N3b3BMb2NrZWQFD3VzZXJHU3dvcExvY2tlZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQR1c2VyBRZrVXNlckF2YWlsYWJsZUZvckNsYWltBRRhdmFpbGFibGVGb3JDbGFpbU5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgUQa1RvdGFsU1dPUExvY2tlZAUSdG90YWxTV09QTG9ja2VkTmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRFrVG90YWxHU3dvcExvY2tlZAUTdG90YWxHU3dvcExvY2tlZE5ldwUDbmlsAWkBDXVwZGF0ZVdlaWdodHMEDGN1cnJlbnRQb29scw5jdXJyZW50UmV3YXJkcxJyZXdhcmRVcGRhdGVIZWlnaHQKcGFnaW5hdGlvbgkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQLYW1vdW50UG9vbHMACgQXdG90YWxSZXdhcmRVcGRhdGVIZWlnaHQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUTa1Jld2FyZFVwZGF0ZUhlaWdodAAAAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQxhZG1pblB1YktleTEJAMwIAgUMYWRtaW5QdWJLZXkyCQDMCAIFDGFkbWluUHViS2V5MwkAzAgCBQ5tb25leUJveFB1YktleQUDbmlsCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAAIBAiFPbmx5IGFkbWluIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24DCQBmAgkAkAMBBQxjdXJyZW50UG9vbHMFC2Ftb3VudFBvb2xzCQACAQkArAICAhZNYXggYW1vdW50IG9mIHBvb2wgaXMgCQCkAwEFC2Ftb3VudFBvb2xzAwkAZwIFF3RvdGFsUmV3YXJkVXBkYXRlSGVpZ2h0BRJyZXdhcmRVcGRhdGVIZWlnaHQJAAIBAi1yZXdhcmRVcGRhdGVIZWlnaHQgPD0gdG90YWxSZXdhcmRVcGRhdGVIZWlnaHQDCQBnAgUGaGVpZ2h0BRJyZXdhcmRVcGRhdGVIZWlnaHQJAAIBAhxoZWlnaHQgPj0gcmV3YXJkVXBkYXRlSGVpZ2h0AwkAZwIAAAUScmV3YXJkVXBkYXRlSGVpZ2h0CQACAQIYMCA+PSByZXdhcmRVcGRhdGVIZWlnaHQgCgEDc3VtAgFhAWIJAGQCBQFhBQFiCgEZY2hhbmdlUHJldmlvdXNSZXdhcmRFbnRyeQILYWNjdW11bGF0ZWQEcG9vbAQWcG9vbFJld2FyZFVwZGF0ZUhlaWdodAkBE2dldFBvb2xVcGRhdGVIZWlnaHQBBQRwb29sAwMJAQEhAQkBGGlzRGVmaW5lUG9vbFVwZGF0ZUhlaWdodAEFBHBvb2wGAwkBAiE9AgUScmV3YXJkVXBkYXRlSGVpZ2h0BRZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0CQAAAgUWcG9vbFJld2FyZFVwZGF0ZUhlaWdodAUXdG90YWxSZXdhcmRVcGRhdGVIZWlnaHQHBApwb29sUmV3YXJkCQEQZ2V0Q3VyUG9vbFdlaWdodAEFBHBvb2wJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUba1Jld2FyZFBvb2xGcmFjdGlvblByZXZpb3VzBQpwb29sUmV3YXJkBQthY2N1bXVsYXRlZAQKcG9vbFJld2FyZAkBEWdldFByZXZQb29sV2VpZ2h0AQUEcG9vbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQRwb29sBRtrUmV3YXJkUG9vbEZyYWN0aW9uUHJldmlvdXMFCnBvb2xSZXdhcmQFC2FjY3VtdWxhdGVkCgEYY2hhbmdlQ3VycmVudFJld2FyZEVudHJ5AgthY2N1bXVsYXRlZARwb29sBAlwb29sSW5kZXgJAQV2YWx1ZQEJAM8IAgUMY3VycmVudFBvb2xzBQRwb29sBApwb29sUmV3YXJkCQCRAwIFDmN1cnJlbnRSZXdhcmRzBQlwb29sSW5kZXgDCQBmAgAABQpwb29sUmV3YXJkCQACAQIOUG9vbFJld2FyZCA8IDAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUaa1Jld2FyZFBvb2xGcmFjdGlvbkN1cnJlbnQFCnBvb2xSZXdhcmQFC2FjY3VtdWxhdGVkCgERY2hhbmdlSGVpZ2h0RW50cnkCC2FjY3VtdWxhdGVkBHBvb2wECnBvb2xIZWlnaHQFEnJld2FyZFVwZGF0ZUhlaWdodAQHdXBVSW50cgkA/AcEBQtmYXJtaW5nQWRkcgISdXBkYXRlUG9vbEludGVyZXN0CQDMCAIFBHBvb2wFA25pbAUDbmlsAwkAAAIFB3VwVUludHIFB3VwVUludHIJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUTa0hlaWdodFBvb2xGcmFjdGlvbgUKcG9vbEhlaWdodAULYWNjdW11bGF0ZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4KAQxnZXRTdW1SZXdhcmQCCmN1clRlbXBTdW0KcGFnaW5hdGlvbgMJAAACBQpwYWdpbmF0aW9uAAADCQBmAgUKY3VyVGVtcFN1bQUOdG90YWxWb3RlU2hhcmUJAAIBCQCsAgIJAKwCAgkArAICAkpzdW1SZXdhcmRQcmV2aW91cyA+IHRvdGFsVm90ZVNoYXJlIG9yIHN1bVJld2FyZEN1cnJlbnQgPiB0b3RhbFZvdGVTaGFyZSAtIAkApAMBBQpwYWdpbmF0aW9uAgEgCQCkAwEFCmN1clRlbXBTdW0JAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgULa1RlbXBDdXJTdW0FCmN1clRlbXBTdW0FA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgUia1Jld2FyZFVwZGF0ZUZpcnN0UGFnaW5hdGlvbkhlaWdodAUScmV3YXJkVXBkYXRlSGVpZ2h0BQNuaWwDCQAAAgUKcGFnaW5hdGlvbgABBBFjdXJUZW1wU3VtRnJvbUtleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQtrVGVtcEN1clN1bQAABCZyZXdhcmRVcGRhdGVIZWlnaHRGaXJzdFBhZ2luYXRpb25FbnRyeQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBSJrUmV3YXJkVXBkYXRlRmlyc3RQYWdpbmF0aW9uSGVpZ2h0AAADCQBmAgkAZAIFCmN1clRlbXBTdW0FEWN1clRlbXBTdW1Gcm9tS2V5BQ50b3RhbFZvdGVTaGFyZQkAAgEJAKwCAgkArAICCQCsAgICSnN1bVJld2FyZFByZXZpb3VzID4gdG90YWxWb3RlU2hhcmUgb3Igc3VtUmV3YXJkQ3VycmVudCA+IHRvdGFsVm90ZVNoYXJlIC0gCQCkAwEFCnBhZ2luYXRpb24CASAJAKQDAQkAZAIFCmN1clRlbXBTdW0FEWN1clRlbXBTdW1Gcm9tS2V5AwkBAiE9AgUmcmV3YXJkVXBkYXRlSGVpZ2h0Rmlyc3RQYWdpbmF0aW9uRW50cnkFEnJld2FyZFVwZGF0ZUhlaWdodAkAAgECRGN1cnJlbnQgcmV3YXJkVXBkYXRlSGVpZ2h0ICE9IHJld2FyZFVwZGF0ZUhlaWdodEZpcnN0UGFnaW5hdGlvbkVudHJ5CQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFC2tUZW1wQ3VyU3VtCQBkAgUKY3VyVGVtcFN1bQURY3VyVGVtcFN1bUZyb21LZXkFA25pbAUDbmlsAwkAAAIFCnBhZ2luYXRpb24AAgQGY3VyU3VtCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQtrVGVtcEN1clN1bQAABQpjdXJUZW1wU3VtBCZyZXdhcmRVcGRhdGVIZWlnaHRGaXJzdFBhZ2luYXRpb25FbnRyeQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBSJrUmV3YXJkVXBkYXRlRmlyc3RQYWdpbmF0aW9uSGVpZ2h0AAADCQECIT0CBQZjdXJTdW0FDnRvdGFsVm90ZVNoYXJlCQACAQJJc3VtUmV3YXJkUHJldmlvdXMgIT0gdG90YWxWb3RlU2hhcmUgb3Igc3VtUmV3YXJkQ3VycmVudCAhPSB0b3RhbFZvdGVTaGFyZQMJAQIhPQIFJnJld2FyZFVwZGF0ZUhlaWdodEZpcnN0UGFnaW5hdGlvbkVudHJ5BRJyZXdhcmRVcGRhdGVIZWlnaHQJAAIBAkRjdXJyZW50IHJld2FyZFVwZGF0ZUhlaWdodCAhPSByZXdhcmRVcGRhdGVIZWlnaHRGaXJzdFBhZ2luYXRpb25FbnRyeQkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQtrVGVtcEN1clN1bQUGY3VyU3VtBQNuaWwFA25pbAkAAgECFEluY29ycmVjdCBwYWdpbmF0aW9uBBZwcmV2aW91c1Jld2FyZEVudHJ5TmV3CgACJGwFDGN1cnJlbnRQb29scwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEZY2hhbmdlUHJldmlvdXNSZXdhcmRFbnRyeQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQVY3VycmVudFJld2FyZEVudHJ5TmV3CgACJGwFDGN1cnJlbnRQb29scwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMV8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEYY2hhbmdlQ3VycmVudFJld2FyZEVudHJ5AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYxXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMV8yAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgkBBSRmMV8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBBFoZWlnaHRFbnRyeU5ld0N1cgoAAiRsBQxjdXJyZW50UG9vbHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjJfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBEWNoYW5nZUhlaWdodEVudHJ5AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYyXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMl8yAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgkBBSRmMl8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBBRzdW1SZXdhcmRDdXJyZW50VGVtcAoAAiRsBQ5jdXJyZW50UmV3YXJkcwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAAAAoBBSRmM18xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEDc3VtAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYzXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmM18yAgkBBSRmM18xAgkBBSRmM18xAgkBBSRmM18xAgkBBSRmM18xAgkBBSRmM18xAgkBBSRmM18xAgkBBSRmM18xAgkBBSRmM18xAgkBBSRmM18xAgkBBSRmM18xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBA0kdDAyMDU1NDIwNjY1CQEMZ2V0U3VtUmV3YXJkAgUUc3VtUmV3YXJkQ3VycmVudFRlbXAFCnBhZ2luYXRpb24EEHN1bVJld2FyZEN1cnJlbnQIBQ0kdDAyMDU1NDIwNjY1Al8xBCZyZXdhcmRVcGRhdGVIZWlnaHRGaXJzdFBhZ2luYXRpb25FbnRyeQgFDSR0MDIwNTU0MjA2NjUCXzIEF3Jld2FyZFVwZGF0ZUhlaWdodEVudHJ5AwkAAAIFCnBhZ2luYXRpb24AAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUTa1Jld2FyZFVwZGF0ZUhlaWdodAUScmV3YXJkVXBkYXRlSGVpZ2h0BQNuaWwFA25pbAMJAGYCBQZoZWlnaHQFEnJld2FyZFVwZGF0ZUhlaWdodAkAAgECG3Jld2FyZFVwZGF0ZUhlaWdodCA8IGhlaWdodAkAzggCCQDOCAIJAM4IAgkAzggCCQDOCAIFFnByZXZpb3VzUmV3YXJkRW50cnlOZXcFFWN1cnJlbnRSZXdhcmRFbnRyeU5ldwURaGVpZ2h0RW50cnlOZXdDdXIFEHN1bVJld2FyZEN1cnJlbnQFF3Jld2FyZFVwZGF0ZUhlaWdodEVudHJ5BSZyZXdhcmRVcGRhdGVIZWlnaHRGaXJzdFBhZ2luYXRpb25FbnRyeQFpAQhzaHV0ZG93bgAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDCQEBIQEFBmFjdGl2ZQkAAgEJAKwCAgIiREFwcCBpcyBhbHJlYWR5IHN1c3BlbmRlZC4gQ2F1c2U6IAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQZrQ2F1c2UCGnRoZSBjYXVzZSB3YXNuJ3Qgc3BlY2lmaWVkCQEHc3VzcGVuZAECD1BhdXNlZCBieSBhZG1pbgFpAQhhY3RpdmF0ZQAJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkDBQZhY3RpdmUJAAIBAhZEQXBwIGlzIGFscmVhZHkgYWN0aXZlCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBgkAzAgCCQELRGVsZXRlRW50cnkBBQZrQ2F1c2UFA25pbAECdHgBBnZlcmlmeQAEEmFkbWluUHViS2V5MVNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFDGFkbWluUHViS2V5MQABAAAEEmFkbWluUHViS2V5MlNpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAEFDGFkbWluUHViS2V5MgABAAAEEmFkbWluUHViS2V5M1NpZ25lZAMJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAIFDGFkbWluUHViS2V5MwABAAAJAGcCCQBkAgkAZAIFEmFkbWluUHViS2V5MVNpZ25lZAUSYWRtaW5QdWJLZXkyU2lnbmVkBRJhZG1pblB1YktleTNTaWduZWQAAoPqhZI=", "height": 2277953, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HT1o8kaQLrJahFFqVZ83YoNTc8em6KgsBABweM8tkaAm Next: DUg3371WqvKdHqXYPo6PGFt8PPWKGKBNPRSqTTLwGgqb Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let kActive = "active"
1111
1212 let kUserSWOPLocked = "_SWOP_amount"
1313
14-let kUserGetBackHeight = "_getBackHeight"
15-
1614 let kTotalSWOPLocked = "total_SWOP_amount"
1715
18-let kUserTotalVoteSWOP = "_user_total_SWOP_vote"
16+let kUserSwopUnlockHeight = "_SWOP_unlock_height"
1917
20-let kUserVoteOptionAmount = "_SWOP_option_amount"
18+let kUserGSwopLocked = "_GSwop_amount"
2119
22-let kTotalVoteOptionAmount = "total_SWOP_option_amount"
20+let kTotalGSwopLocked = "total_GSwop_amount"
2321
24-let kUserSWOPClaimedAmount = "_SWOP_claimed_amount"
22+let kUserTotalVoteSWOP = "_user_total_vote_gSWOP"
2523
26-let kUserSWOPLastClaimedAmount = "_SWOP_last_claimed_amount"
27-
28-let kVoteName = "vote_name"
29-
30-let kOptionName = "_option_name"
31-
32-let kVotingStartHeight = "_startHeight"
33-
34-let kVoteDuration = "_vote_duration"
24+let kUserAvailableForClaim = "_user_available_for_claim"
3525
3626 let kRewardPoolFractionCurrent = "_current_pool_fraction_reward"
3727
3828 let kRewardPoolFractionPrevious = "_previous_pool_fraction_reward"
3929
4030 let kHeightPoolFraction = "_pool_reward_update_height"
41-
42-let kTotalRewardPerBlockCurrent = "total_reward_per_block_current"
43-
44-let kTotalRewardPerBlockPrevious = "total_reward_per_block_previous"
4531
4632 let kRewardUpdateHeight = "reward_update_height"
4733
5036 let kNoVotingForNewPool = "_vote_no"
5137
5238 let kYesVotingForNewPool = "_vote_yes"
53-
54-let kAmountOfVotingForNewPool = "max_amount_voting"
5539
5640 let kStatusOfVotingForNewPool = "_status"
5741
135119
136120 let airdropMoneyBoxAddr = Address(getBase58FromOracle(kAirdropMoneyBoxAddr))
137121
122+let lockSwopBlocksAmount = (10102 * 4)
123+
138124 let SWOP = fromBase58String(getStringValue(farmingAddr, kSWOPid))
139125
140126 let scaleValue = 100000000
155141
156142 let thirdActiveVote = valueOrElse(getString(votingNewPoolAddr, activeVoteThird), "")
157143
158-let isActive = valueOrElse(getBoolean(this, kActive), true)
144+let active = valueOrElse(getBoolean(this, kActive), true)
159145
160146 let airdropFee = getIntegerValue(oracle, kAirdropFee)
161147
164150 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
165151
166152
167-func throwNotEnoughSWOP () = throw("Not enough SWOP: userSWOPLocked - userTotalVoteAmount < voteSWOPAmount")
153+func isActive () = if (active)
154+ then unit
155+ else throw("DApp is inactive at this moment")
156+
157+
158+func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
159+ then unit
160+ else throw("Only admin can call this function")
168161
169162
170163 func getLastInterestInfo () = valueOrElse(getInteger(this, kLastInterest), 0)
171164
172165
173-func getUserSWOPLocked (user) = valueOrElse(getInteger(this, (toString(user) + kUserSWOPLocked)), 0)
166+func getTotalLockedInfo () = {
167+ let totalSwopLocked = valueOrElse(getInteger(this, kTotalSWOPLocked), 0)
168+ let totalGSwopLocked = valueOrElse(getInteger(this, kTotalGSwopLocked), totalSwopLocked)
169+ $Tuple2(totalSwopLocked, totalGSwopLocked)
170+ }
174171
175172
176-func getUserSWOPClaimedAmount (user) = valueOrElse(getInteger(this, (toString(user) + kUserSWOPClaimedAmount)), 0)
177-
178-
179-func getUserTotalVoteAmount (user) = valueOrElse(getInteger(votingAddr, (toString(user) + kUserTotalVoteSWOP)), 0)
173+func getUserLockedInfo (user) = {
174+ let userSwopLocked = valueOrElse(getInteger(this, (user + kUserSWOPLocked)), 0)
175+ let userGSwopLocked = valueOrElse(getInteger(this, (user + kUserGSwopLocked)), userSwopLocked)
176+ $Tuple2(userSwopLocked, userGSwopLocked)
177+ }
180178
181179
182180 func getUserInterestInfo (user,lastInterest) = {
183- let userSWOPAmount = getUserSWOPLocked(user)
184- let userLastInterest = getInteger(this, (toString(user) + kUserLastInterest))
185- let userLastInterestValue = match userLastInterest {
186- case userLastInterest: Int =>
187- userLastInterest
188- case _ =>
189- lastInterest
181+ let $t048874950 = getUserLockedInfo(user)
182+ let userSWOPAmount = $t048874950._1
183+ let userGSwopAmount = $t048874950._2
184+ let userLastInterest = valueOrElse(getInteger(this, (user + kUserLastInterest)), lastInterest)
185+ $Tuple3(userLastInterest, userSWOPAmount, userGSwopAmount)
190186 }
191- $Tuple2(userLastInterestValue, userSWOPAmount)
192- }
187+
188+
189+func getUserAvailableForClaim (user) = valueOrElse(getInteger(this, (user + kUserAvailableForClaim)), 0)
193190
194191
195192 func getUserTotalVoteAmountForOnePool (pool,user) = {
233230 }
234231
235232
236-func getTotalSWOPLocked () = valueOrElse(getInteger(this, kTotalSWOPLocked), 0)
237-
238-
239233 func getUserVoteInfo (user) = {
240- let $t076068139 = if (isDefined(getString(votingAddr, (toString(user) + kUserTotalStruc))))
234+ let $t073147847 = if (isDefined(getString(votingAddr, (toString(user) + kUserTotalStruc))))
241235 then {
242236 let data = split(valueOrErrorMessage(getString(votingAddr, (toString(user) + kUserTotalStruc)), "Empty kUserTotalStruc"), "_")
243237 $Tuple3(parseIntValue(data[0]), parseIntValue(data[1]), parseIntValue(data[2]))
246240 let uPoolTotalSWOP = valueOrElse(getInteger(votingAddr, (toString(user) + kUserTotalVoteSWOP)), 0)
247241 $Tuple3(uPoolTotalSWOP, 0, currVotingPeriod)
248242 }
249- let userTotalVoteSWOP = $t076068139._1
250- let userUnvoted = $t076068139._2
251- let userUnvotedPeriod = $t076068139._3
243+ let userTotalVoteSWOP = $t073147847._1
244+ let userUnvoted = $t073147847._2
245+ let userUnvotedPeriod = $t073147847._3
252246 let userUnvotedActual = if ((userUnvotedPeriod == currVotingPeriod))
253247 then userUnvoted
254248 else 0
255249 $Tuple2(userTotalVoteSWOP, userUnvotedActual)
256250 }
257-
258-
259-func getUserVoteOptionAmount (user) = valueOrElse(getInteger(this, (toString(user) + kUserVoteOptionAmount)), 0)
260-
261-
262-func getVotingStartHeight (voteName) = valueOrElse(getInteger(this, (voteName + kVotingStartHeight)), 0)
263251
264252
265253 func getPoolUpdateHeight (pool) = valueOrElse(getInteger(this, (pool + kHeightPoolFraction)), 0)
274262 func getPrevPoolWeight (pool) = valueOrElse(getInteger(this, (pool + kRewardPoolFractionPrevious)), 0)
275263
276264
277-func getVoteOptionAmount (user,voteName,option) = {
278- let userVoteOptionAmount = getInteger(this, (((voteName + option) + toString(user)) + kUserVoteOptionAmount))
279- let uvoa = match userVoteOptionAmount {
280- case uvoa: Int =>
281- uvoa
282- case uvoa: Unit =>
283- 0
284- case _ =>
285- throw("Match error")
286- }
287- valueOrErrorMessage(uvoa, (((("No data on the key: " + voteName) + option) + toString(user)) + kUserVoteOptionAmount))
288- }
289-
290-
291-func getVoteDuration (voteName) = valueOrErrorMessage(getInteger(this, (voteName + kVoteDuration)), (("No data on the key: " + voteName) + kVoteDuration))
292-
293-
294-func getTotalVoteOptionAmount (voteName,option) = {
295- let totalVoteOptionAmount = getInteger(this, ((voteName + option) + kTotalVoteOptionAmount))
296- let tvoa = match totalVoteOptionAmount {
297- case tvoa: Int =>
298- tvoa
299- case tvoa: Unit =>
300- 0
301- case _ =>
302- throw("Match error")
303- }
304- tvoa
305- }
306-
307-
308-func getUserGetBackAmount (voteName,option,user,getBackSWOPHeight) = {
309- let key = ((((((voteName + "_") + option) + "_") + toString(user)) + "_") + toString(getBackSWOPHeight))
310- valueOrErrorMessage(getInteger(this, key), ("No data on the key: " + key))
311- }
312-
313-
314-func claimCalc (caller) = {
265+func claimCalc (user) = {
315266 let lastInterest = getLastInterestInfo()
316- let $t01053010612 = getUserInterestInfo(caller, lastInterest)
317- let userLastInterest = $t01053010612._1
318- let userSWOPLocked = $t01053010612._2
319- let claimAmount = fraction(userSWOPLocked, (lastInterest - userLastInterest), scaleValue)
267+ let $t087218818 = getUserInterestInfo(user, lastInterest)
268+ let userLastInterest = $t087218818._1
269+ let userSWOPLocked = $t087218818._2
270+ let userGSwopAmount = $t087218818._3
271+ let claimAmount = fraction(userGSwopAmount, (lastInterest - userLastInterest), scaleValue)
320272 let userNewInterest = lastInterest
321273 $Tuple2(userNewInterest, claimAmount)
322274 }
323275
324276
325277 @Callable(i)
326-func airDrop () = if (!(isActive))
327- then throw("DApp is inactive at this moment")
328- else {
329- let $t01088010955 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
330- let pmtAmount = $t01088010955._1
331- let pmtAssetId = $t01088010955._2
332- if ((pmtAssetId != SWOP))
333- then throw("Incorrect pmtAssetId")
334- else {
335- let airdropFeeAmount = fraction(pmtAmount, airdropFee, feeSacle6, CEILING)
336- let totalSWOPLocked = getTotalSWOPLocked()
337- let lastInterest = getLastInterestInfo()
338- let interestNew = (lastInterest + fraction((pmtAmount - airdropFeeAmount), scaleValue, totalSWOPLocked))
278+func airDrop () = valueOrElse(isActive(), {
279+ let $t090489123 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
280+ let pmtAmount = $t090489123._1
281+ let pmtAssetId = $t090489123._2
282+ if ((pmtAssetId != SWOP))
283+ then throw("Incorrect pmtAssetId")
284+ else {
285+ let airdropFeeAmount = fraction(pmtAmount, airdropFee, feeSacle6, CEILING)
286+ let $t092969358 = getTotalLockedInfo()
287+ let totalSWOPLocked = $t092969358._1
288+ let totalGSwopLocked = $t092969358._2
289+ let lastInterest = getLastInterestInfo()
290+ let interestNew = (lastInterest + fraction((pmtAmount - airdropFeeAmount), scaleValue, totalGSwopLocked))
339291 [IntegerEntry(kLastInterest, interestNew), ScriptTransfer(airdropMoneyBoxAddr, airdropFeeAmount, SWOP)]
340- }
341- }
292+ }
293+ })
342294
343295
344296
345297 @Callable(i)
346-func lockSWOP () = if (!(isActive))
347- then throw("DApp is inactive at this moment")
348- else {
349- let $t01158811663 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
350- let pmtAmount = $t01158811663._1
351- let pmtAssetId = $t01158811663._2
352- if ((pmtAssetId != SWOP))
353- then throw("Incorrect pmtAssetId")
354- else {
355- let lastInterest = getLastInterestInfo()
356- let $t01177911863 = getUserInterestInfo(i.caller, lastInterest)
357- let userLastInterest = $t01177911863._1
358- let userSWOPLocked = $t01177911863._2
359- let claimAmount = fraction(userSWOPLocked, (lastInterest - userLastInterest), scaleValue)
360- let userSWOPLockedNew = ((userSWOPLocked + pmtAmount) + claimAmount)
361- let userNewInterest = lastInterest
362- let totalSWOPLocked = getTotalSWOPLocked()
363- let totalSWOPLockedNew = ((totalSWOPLocked + pmtAmount) + claimAmount)
364- let userClaimedAmount = getUserSWOPClaimedAmount(i.caller)
365- let userClaimedAmountNew = (userClaimedAmount + claimAmount)
366-[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)]
367- }
368- }
298+func lockSWOP () = valueOrElse(isActive(), {
299+ let $t097369811 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
300+ let pmtAmount = $t097369811._1
301+ let pmtAssetId = $t097369811._2
302+ if ((pmtAssetId != SWOP))
303+ then throw("Incorrect pmtAssetId")
304+ else {
305+ let user = toString(i.caller)
306+ let lastInterest = getLastInterestInfo()
307+ let $t0996210025 = getUserLockedInfo(user)
308+ let userSWOPLocked = $t0996210025._1
309+ let userGSwopLocked = $t0996210025._2
310+ let $t01003010091 = claimCalc(user)
311+ let userNewInterest = $t01003010091._1
312+ let claimAmountAvailable = $t01003010091._2
313+ let availableForClaim = getUserAvailableForClaim(user)
314+ let availableForClaimNew = (availableForClaim + claimAmountAvailable)
315+ let userSWOPLockedNew = (userSWOPLocked + pmtAmount)
316+ let userGSwopLockedNew = (userGSwopLocked + pmtAmount)
317+ let $t01033910401 = getTotalLockedInfo()
318+ let totalSWOPLocked = $t01033910401._1
319+ let totalGSwopLocked = $t01033910401._2
320+ let totalSWOPLockedNew = (totalSWOPLocked + pmtAmount)
321+ let totalGSwopLockedNew = (totalGSwopLocked + pmtAmount)
322+[IntegerEntry((user + kUserSwopUnlockHeight), (height + lockSwopBlocksAmount)), IntegerEntry((user + kUserLastInterest), userNewInterest), IntegerEntry((user + kUserSWOPLocked), userSWOPLockedNew), IntegerEntry((user + kUserGSwopLocked), userGSwopLocked), IntegerEntry((user + kUserAvailableForClaim), availableForClaimNew), IntegerEntry(kTotalSWOPLocked, totalSWOPLockedNew), IntegerEntry(kTotalGSwopLocked, totalGSwopLockedNew)]
323+ }
324+ })
369325
370326
371327
372328 @Callable(i)
373-func withdrawSWOP (withdrawAmount) = if (!(isActive))
374- then throw("DApp is inactive at this moment")
375- else if ((0 >= withdrawAmount))
329+func withdrawSWOP (withdrawAmount) = valueOrElse(isActive(), {
330+ let user = toString(i.caller)
331+ let unlockHeight = valueOrElse(getInteger(this, (user + kUserSwopUnlockHeight)), 0)
332+ if ((0 >= withdrawAmount))
376333 then throw("withdrawAmount <= 0")
377- else {
378- let totalSWOPLocked = getTotalSWOPLocked()
379- let userSWOPLocked = getUserSWOPLocked(i.caller)
380- let $t01300413059 = claimCalc(i.caller)
381- let userNewInterest = $t01300413059._1
382- let claimAmount = $t01300413059._2
383- let $t01306413129 = getUserVoteInfo(i.caller)
384- let userVoteAmount = $t01306413129._1
385- let userUnvoteAmount = $t01306413129._2
386- let userVoteAmountForNewPool = getUserTotalVoteForNewPoolAmount(i.caller)
387- let blockedInLaunchpad = getUserBlockedInLauchpad(i.caller)
388- if (if (if ((0 > userUnvoteAmount))
389- then true
390- else (0 > userVoteAmount))
391- then true
392- else (0 > userVoteAmountForNewPool))
393- then throw("userUnvoteAmount < 0 || userVoteAmount < 0 || userVoteAmountForNewPool < 0")
394- else {
395- let availableToUnstake = (userSWOPLocked - max([userVoteAmountForNewPool, (userVoteAmount + userUnvoteAmount), blockedInLaunchpad]))
396- if ((withdrawAmount > availableToUnstake))
397- then throw("withdrawAmount > availableToUnstake")
398- else {
399- let totalSWOPLockedNew = ((totalSWOPLocked + claimAmount) - withdrawAmount)
400- let userSWOPamountNew = ((userSWOPLocked + claimAmount) - withdrawAmount)
401- let userClaimedAmount = getUserSWOPClaimedAmount(i.caller)
402- let userClaimedAmountNew = (userClaimedAmount + claimAmount)
403-[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)]
404- }
405- }
406- }
334+ else if ((unlockHeight > height))
335+ then throw(("You can't withdraw till " + toString(unlockHeight)))
336+ else {
337+ let $t01137611438 = getTotalLockedInfo()
338+ let totalSWOPLocked = $t01137611438._1
339+ let totalGSwopLocked = $t01137611438._2
340+ let $t01144311506 = getUserLockedInfo(user)
341+ let userSWOPLocked = $t01144311506._1
342+ let userGSwopLocked = $t01144311506._2
343+ let $t01151111572 = claimCalc(user)
344+ let userNewInterest = $t01151111572._1
345+ let claimAmountAvailable = $t01151111572._2
346+ let $t01157711643 = getUserVoteInfo(i.caller)
347+ let userVoteAmount = $t01157711643._1
348+ let userUnvoteAmount = $t01157711643._2
349+ let userVoteAmountForNewPool = getUserTotalVoteForNewPoolAmount(i.caller)
350+ let blockedInLaunchpad = getUserBlockedInLauchpad(i.caller)
351+ if (if (if ((0 > userUnvoteAmount))
352+ then true
353+ else (0 > userVoteAmount))
354+ then true
355+ else (0 > userVoteAmountForNewPool))
356+ then throw("userUnvoteAmount < 0 || userVoteAmount < 0 || userVoteAmountForNewPool < 0")
357+ else {
358+ let availableToUnstake = (userSWOPLocked - max([userVoteAmountForNewPool, (userVoteAmount + userUnvoteAmount), blockedInLaunchpad]))
359+ if ((withdrawAmount > availableToUnstake))
360+ then throw("withdrawAmount > availableToUnstake")
361+ else {
362+ let availableForClaim = getUserAvailableForClaim(user)
363+ let availableForClaimNew = (availableForClaim + claimAmountAvailable)
364+ let totalSWOPLockedNew = (totalSWOPLocked - withdrawAmount)
365+ let userSWOPAmountNew = (userSWOPLocked - withdrawAmount)
366+ let totalGSwopLockedNew = ((totalGSwopLocked - userGSwopLocked) + userSWOPAmountNew)
367+[IntegerEntry((user + kUserLastInterest), userNewInterest), IntegerEntry((user + kUserSWOPLocked), userSWOPAmountNew), IntegerEntry((user + kUserGSwopLocked), userSWOPAmountNew), IntegerEntry((user + kUserAvailableForClaim), availableForClaimNew), IntegerEntry(kTotalSWOPLocked, totalSWOPLockedNew), IntegerEntry(kTotalGSwopLocked, totalGSwopLockedNew), ScriptTransfer(i.caller, withdrawAmount, SWOP)]
368+ }
369+ }
370+ }
371+ })
407372
408373
409374
410375 @Callable(i)
411-func claimAndWithdrawSWOP () = if (!(isActive))
412- then throw("DApp is inactive at this moment")
413- else {
414- let lastInterest = getLastInterestInfo()
415- let $t01457914634 = claimCalc(i.caller)
416- let userNewInterest = $t01457914634._1
417- let claimAmount = $t01457914634._2
418- let userClaimedAmount = getUserSWOPClaimedAmount(i.caller)
419- let userClaimedAmountNew = (userClaimedAmount + claimAmount)
420- if ((claimAmount == 0))
421- then throw("You have 0 available SWOP")
422- else [IntegerEntry((toString(i.caller) + kUserLastInterest), userNewInterest), IntegerEntry((toString(i.caller) + kUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((toString(i.caller) + kUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, claimAmount, SWOP)]
423- }
376+func claimAndWithdrawSWOP () = valueOrElse(isActive(), {
377+ let user = toString(i.caller)
378+ let availableForClaim = getUserAvailableForClaim(user)
379+ let $t01316213214 = claimCalc(user)
380+ let userNewInterest = $t01316213214._1
381+ let claimAmount = $t01316213214._2
382+ let userClaimAmount = (availableForClaim + claimAmount)
383+ if ((userClaimAmount == 0))
384+ then throw("You have 0 available SWOP")
385+ else [IntegerEntry((user + kUserLastInterest), userNewInterest), ScriptTransfer(i.caller, userClaimAmount, SWOP)]
386+ })
424387
425388
426389
427390 @Callable(i)
428-func claimAndStakeSWOP () = if (!(isActive))
429- then throw("DApp is inactive at this moment")
430- else {
431- let totalSWOPLocked = getTotalSWOPLocked()
432- let userSWOPLocked = getUserSWOPLocked(i.caller)
433- let lastInterest = getLastInterestInfo()
434- let $t01540715462 = claimCalc(i.caller)
435- let userNewInterest = $t01540715462._1
436- let claimAmount = $t01540715462._2
437- let userSWOPLockedNew = (userSWOPLocked + claimAmount)
438- let totalSWOPLockedNew = (totalSWOPLocked + claimAmount)
439- let userClaimedAmount = getUserSWOPClaimedAmount(i.caller)
440- let userClaimedAmountNew = (userClaimedAmount + claimAmount)
441- if ((claimAmount == 0))
442- then throw("You have 0 available SWOP")
443- 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)]
444- }
391+func claimAndStakeSWOP () = valueOrElse(isActive(), {
392+ let user = toString(i.caller)
393+ let $t01358713649 = getTotalLockedInfo()
394+ let totalSWOPLocked = $t01358713649._1
395+ let totalGSwopLocked = $t01358713649._2
396+ let $t01365413717 = getUserLockedInfo(user)
397+ let userSWOPLocked = $t01365413717._1
398+ let userGSwopLocked = $t01365413717._2
399+ let availableForClaim = getUserAvailableForClaim(user)
400+ let $t01378113832 = claimCalc(user)
401+ let userNewInterest = $t01378113832._1
402+ let claimAmount = $t01378113832._2
403+ let userClaimAmount = (availableForClaim + claimAmount)
404+ let userSWOPLockedNew = (userSWOPLocked + userClaimAmount)
405+ let userGSwopLockedNew = (userGSwopLocked + (userClaimAmount * 2))
406+ let totalSWOPLockedNew = (totalSWOPLocked + userClaimAmount)
407+ let totalGSwopLockedNew = (totalGSwopLocked + (userClaimAmount * 2))
408+ if ((userClaimAmount == 0))
409+ then throw("You have 0 available SWOP")
410+ else [IntegerEntry((toString(i.caller) + kUserSwopUnlockHeight), (height + lockSwopBlocksAmount)), IntegerEntry((toString(i.caller) + kUserLastInterest), userNewInterest), IntegerEntry(kTotalSWOPLocked, totalSWOPLockedNew), IntegerEntry(kTotalGSwopLocked, totalGSwopLockedNew), IntegerEntry((toString(i.caller) + kUserSWOPLocked), userSWOPLockedNew), IntegerEntry((toString(i.caller) + kUserGSwopLocked), userGSwopLockedNew)]
411+ })
445412
446413
447414
448415 @Callable(i)
449-func updateWeights (currentPools,currentRewards,rewardUpdateHeight,pagination) = if (!(isActive))
450- then throw("DApp is inactive at this moment")
451- else {
452- let amountPools = 10
453- let totalRewardUpdateHeight = valueOrElse(getInteger(this, kRewardUpdateHeight), 0)
454- if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, moneyBoxPubKey], i.callerPublicKey)))
455- then throw("Only admin can call this function")
456- else if ((size(currentPools) > amountPools))
457- then throw(("Max amount of pool is " + toString(amountPools)))
458- else if ((totalRewardUpdateHeight >= rewardUpdateHeight))
459- then throw("rewardUpdateHeight <= totalRewardUpdateHeight")
460- else if ((height >= rewardUpdateHeight))
461- then throw("height >= rewardUpdateHeight")
462- else if ((0 >= rewardUpdateHeight))
463- then throw("0 >= rewardUpdateHeight ")
464- else {
465- func sum (a,b) = (a + b)
466-
467- func changePreviousRewardEntry (accumulated,pool) = {
468- let poolRewardUpdateHeight = getPoolUpdateHeight(pool)
469- if (if (!(isDefinePoolUpdateHeight(pool)))
470- then true
471- else if ((rewardUpdateHeight != poolRewardUpdateHeight))
472- then (poolRewardUpdateHeight == totalRewardUpdateHeight)
473- else false)
474- then {
475- let poolReward = getCurPoolWeight(pool)
476-IntegerEntry((pool + kRewardPoolFractionPrevious), poolReward) :: accumulated
477- }
478- else {
479- let poolReward = getPrevPoolWeight(pool)
480-IntegerEntry((pool + kRewardPoolFractionPrevious), poolReward) :: accumulated
481- }
482- }
483-
484- func changeCurrentRewardEntry (accumulated,pool) = {
485- let poolIndex = value(indexOf(currentPools, pool))
486- let poolReward = currentRewards[poolIndex]
487- if ((0 > poolReward))
488- then throw("PoolReward < 0")
489- else IntegerEntry((pool + kRewardPoolFractionCurrent), poolReward) :: accumulated
490- }
491-
492- func changeHeightEntry (accumulated,pool) = {
493- let poolHeight = rewardUpdateHeight
494-IntegerEntry((pool + kHeightPoolFraction), poolHeight) :: accumulated
495- }
496-
497- func getSumReward (curTempSum,pagination) = if ((pagination == 0))
498- then if ((curTempSum > totalVoteShare))
499- then throw(((("sumRewardPrevious > totalVoteShare or sumRewardCurrent > totalVoteShare - " + toString(pagination)) + " ") + toString(curTempSum)))
500- else $Tuple2([IntegerEntry(kTempCurSum, curTempSum)], [IntegerEntry(kRewardUpdateFirstPaginationHeight, rewardUpdateHeight)])
501- else if ((pagination == 1))
502- then {
503- let curTempSumFromKey = valueOrElse(getInteger(this, kTempCurSum), 0)
504- let rewardUpdateHeightFirstPaginationEntry = valueOrElse(getInteger(this, kRewardUpdateFirstPaginationHeight), 0)
505- if (((curTempSum + curTempSumFromKey) > totalVoteShare))
506- then throw(((("sumRewardPrevious > totalVoteShare or sumRewardCurrent > totalVoteShare - " + toString(pagination)) + " ") + toString((curTempSum + curTempSumFromKey))))
507- else if ((rewardUpdateHeightFirstPaginationEntry != rewardUpdateHeight))
508- then throw("current rewardUpdateHeight != rewardUpdateHeightFirstPaginationEntry")
509- else $Tuple2([IntegerEntry(kTempCurSum, (curTempSum + curTempSumFromKey))], nil)
510- }
511- else if ((pagination == 2))
512- then {
513- let curSum = (valueOrElse(getInteger(this, kTempCurSum), 0) + curTempSum)
514- let rewardUpdateHeightFirstPaginationEntry = valueOrElse(getInteger(this, kRewardUpdateFirstPaginationHeight), 0)
515- if ((curSum != totalVoteShare))
516- then throw("sumRewardPrevious != totalVoteShare or sumRewardCurrent != totalVoteShare")
517- else if ((rewardUpdateHeightFirstPaginationEntry != rewardUpdateHeight))
518- then throw("current rewardUpdateHeight != rewardUpdateHeightFirstPaginationEntry")
519- else $Tuple2([IntegerEntry(kTempCurSum, curSum)], nil)
520- }
521- else throw("Incorrect pagination")
522-
523- let previousRewardEntryNew = {
524- let $l = currentPools
525- let $s = size($l)
526- let $acc0 = nil
527- func $f0_1 ($a,$i) = if (($i >= $s))
528- then $a
529- else changePreviousRewardEntry($a, $l[$i])
530-
531- func $f0_2 ($a,$i) = if (($i >= $s))
532- then $a
533- else throw("List size exceeds 10")
534-
535- $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)
536- }
537- let currentRewardEntryNew = {
538- let $l = currentPools
539- let $s = size($l)
540- let $acc0 = nil
541- func $f1_1 ($a,$i) = if (($i >= $s))
542- then $a
543- else changeCurrentRewardEntry($a, $l[$i])
544-
545- func $f1_2 ($a,$i) = if (($i >= $s))
546- then $a
547- else throw("List size exceeds 10")
548-
549- $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)
550- }
551- let heightEntryNewCur = {
552- let $l = currentPools
553- let $s = size($l)
554- let $acc0 = nil
555- func $f2_1 ($a,$i) = if (($i >= $s))
556- then $a
557- else changeHeightEntry($a, $l[$i])
558-
559- func $f2_2 ($a,$i) = if (($i >= $s))
560- then $a
561- else throw("List size exceeds 10")
562-
563- $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)
564- }
565- let sumRewardCurrentTemp = {
566- let $l = currentRewards
567- let $s = size($l)
568- let $acc0 = 0
569- func $f3_1 ($a,$i) = if (($i >= $s))
570- then $a
571- else sum($a, $l[$i])
572-
573- func $f3_2 ($a,$i) = if (($i >= $s))
574- then $a
575- else throw("List size exceeds 10")
576-
577- $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)
578- }
579- let $t02055720668 = getSumReward(sumRewardCurrentTemp, pagination)
580- let sumRewardCurrent = $t02055720668._1
581- let rewardUpdateHeightFirstPaginationEntry = $t02055720668._2
582- let rewardUpdateHeightEntry = if ((pagination == 2))
583- then [IntegerEntry(kRewardUpdateHeight, rewardUpdateHeight)]
584- else nil
585- if ((height > rewardUpdateHeight))
586- then throw("rewardUpdateHeight < height")
587- else (((((previousRewardEntryNew ++ currentRewardEntryNew) ++ heightEntryNewCur) ++ sumRewardCurrent) ++ rewardUpdateHeightEntry) ++ rewardUpdateHeightFirstPaginationEntry)
588- }
589- }
416+func lockSWOPFromFarming () = valueOrElse(isActive(), {
417+ let $t01477214847 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
418+ let pmtAmount = $t01477214847._1
419+ let pmtAssetId = $t01477214847._2
420+ if ((i.caller != farmingAddr))
421+ then throw("Only farming can call this function")
422+ else if ((pmtAssetId != SWOP))
423+ then throw("Incorrect pmtAssetId")
424+ else {
425+ let user = toString(i.originCaller)
426+ let lastInterest = getLastInterestInfo()
427+ let $t01509015153 = getUserLockedInfo(user)
428+ let userSWOPLocked = $t01509015153._1
429+ let userGSwopLocked = $t01509015153._2
430+ let $t01515815219 = claimCalc(user)
431+ let userNewInterest = $t01515815219._1
432+ let claimAmountAvailable = $t01515815219._2
433+ let availableForClaim = getUserAvailableForClaim(user)
434+ let availableForClaimNew = (availableForClaim + claimAmountAvailable)
435+ let userSWOPLockedNew = (userSWOPLocked + pmtAmount)
436+ let userGSwopLockedNew = (userGSwopLocked + (pmtAmount * 2))
437+ let $t01547115533 = getTotalLockedInfo()
438+ let totalSWOPLocked = $t01547115533._1
439+ let totalGSwopLocked = $t01547115533._2
440+ let totalSWOPLockedNew = (totalSWOPLocked + pmtAmount)
441+ let totalGSwopLockedNew = (totalGSwopLocked + (pmtAmount * 2))
442+[IntegerEntry((user + kUserSwopUnlockHeight), (height + lockSwopBlocksAmount)), IntegerEntry((user + kUserLastInterest), userNewInterest), IntegerEntry((user + kUserSWOPLocked), userSWOPLockedNew), IntegerEntry((user + kUserGSwopLocked), userGSwopLocked), IntegerEntry((user + kUserAvailableForClaim), availableForClaimNew), IntegerEntry(kTotalSWOPLocked, totalSWOPLockedNew), IntegerEntry(kTotalGSwopLocked, totalGSwopLockedNew)]
443+ }
444+ })
590445
591446
592447
593448 @Callable(i)
594-func shutdown () = if (!(isActive))
595- then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
596- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
449+func updateWeights (currentPools,currentRewards,rewardUpdateHeight,pagination) = valueOrElse(isActive(), {
450+ let amountPools = 10
451+ let totalRewardUpdateHeight = valueOrElse(getInteger(this, kRewardUpdateHeight), 0)
452+ if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, moneyBoxPubKey], i.callerPublicKey)))
597453 then throw("Only admin can call this function")
598- else suspend("Paused by admin")
454+ else if ((size(currentPools) > amountPools))
455+ then throw(("Max amount of pool is " + toString(amountPools)))
456+ else if ((totalRewardUpdateHeight >= rewardUpdateHeight))
457+ then throw("rewardUpdateHeight <= totalRewardUpdateHeight")
458+ else if ((height >= rewardUpdateHeight))
459+ then throw("height >= rewardUpdateHeight")
460+ else if ((0 >= rewardUpdateHeight))
461+ then throw("0 >= rewardUpdateHeight ")
462+ else {
463+ func sum (a,b) = (a + b)
464+
465+ func changePreviousRewardEntry (accumulated,pool) = {
466+ let poolRewardUpdateHeight = getPoolUpdateHeight(pool)
467+ if (if (!(isDefinePoolUpdateHeight(pool)))
468+ then true
469+ else if ((rewardUpdateHeight != poolRewardUpdateHeight))
470+ then (poolRewardUpdateHeight == totalRewardUpdateHeight)
471+ else false)
472+ then {
473+ let poolReward = getCurPoolWeight(pool)
474+IntegerEntry((pool + kRewardPoolFractionPrevious), poolReward) :: accumulated
475+ }
476+ else {
477+ let poolReward = getPrevPoolWeight(pool)
478+IntegerEntry((pool + kRewardPoolFractionPrevious), poolReward) :: accumulated
479+ }
480+ }
481+
482+ func changeCurrentRewardEntry (accumulated,pool) = {
483+ let poolIndex = value(indexOf(currentPools, pool))
484+ let poolReward = currentRewards[poolIndex]
485+ if ((0 > poolReward))
486+ then throw("PoolReward < 0")
487+ else IntegerEntry((pool + kRewardPoolFractionCurrent), poolReward) :: accumulated
488+ }
489+
490+ func changeHeightEntry (accumulated,pool) = {
491+ let poolHeight = rewardUpdateHeight
492+ let upUIntr = invoke(farmingAddr, "updatePoolInterest", [pool], nil)
493+ if ((upUIntr == upUIntr))
494+ then IntegerEntry((pool + kHeightPoolFraction), poolHeight) :: accumulated
495+ else throw("Strict value is not equal to itself.")
496+ }
497+
498+ func getSumReward (curTempSum,pagination) = if ((pagination == 0))
499+ then if ((curTempSum > totalVoteShare))
500+ then throw(((("sumRewardPrevious > totalVoteShare or sumRewardCurrent > totalVoteShare - " + toString(pagination)) + " ") + toString(curTempSum)))
501+ else $Tuple2([IntegerEntry(kTempCurSum, curTempSum)], [IntegerEntry(kRewardUpdateFirstPaginationHeight, rewardUpdateHeight)])
502+ else if ((pagination == 1))
503+ then {
504+ let curTempSumFromKey = valueOrElse(getInteger(this, kTempCurSum), 0)
505+ let rewardUpdateHeightFirstPaginationEntry = valueOrElse(getInteger(this, kRewardUpdateFirstPaginationHeight), 0)
506+ if (((curTempSum + curTempSumFromKey) > totalVoteShare))
507+ then throw(((("sumRewardPrevious > totalVoteShare or sumRewardCurrent > totalVoteShare - " + toString(pagination)) + " ") + toString((curTempSum + curTempSumFromKey))))
508+ else if ((rewardUpdateHeightFirstPaginationEntry != rewardUpdateHeight))
509+ then throw("current rewardUpdateHeight != rewardUpdateHeightFirstPaginationEntry")
510+ else $Tuple2([IntegerEntry(kTempCurSum, (curTempSum + curTempSumFromKey))], nil)
511+ }
512+ else if ((pagination == 2))
513+ then {
514+ let curSum = (valueOrElse(getInteger(this, kTempCurSum), 0) + curTempSum)
515+ let rewardUpdateHeightFirstPaginationEntry = valueOrElse(getInteger(this, kRewardUpdateFirstPaginationHeight), 0)
516+ if ((curSum != totalVoteShare))
517+ then throw("sumRewardPrevious != totalVoteShare or sumRewardCurrent != totalVoteShare")
518+ else if ((rewardUpdateHeightFirstPaginationEntry != rewardUpdateHeight))
519+ then throw("current rewardUpdateHeight != rewardUpdateHeightFirstPaginationEntry")
520+ else $Tuple2([IntegerEntry(kTempCurSum, curSum)], nil)
521+ }
522+ else throw("Incorrect pagination")
523+
524+ let previousRewardEntryNew = {
525+ let $l = currentPools
526+ let $s = size($l)
527+ let $acc0 = nil
528+ func $f0_1 ($a,$i) = if (($i >= $s))
529+ then $a
530+ else changePreviousRewardEntry($a, $l[$i])
531+
532+ func $f0_2 ($a,$i) = if (($i >= $s))
533+ then $a
534+ else throw("List size exceeds 10")
535+
536+ $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)
537+ }
538+ let currentRewardEntryNew = {
539+ let $l = currentPools
540+ let $s = size($l)
541+ let $acc0 = nil
542+ func $f1_1 ($a,$i) = if (($i >= $s))
543+ then $a
544+ else changeCurrentRewardEntry($a, $l[$i])
545+
546+ func $f1_2 ($a,$i) = if (($i >= $s))
547+ then $a
548+ else throw("List size exceeds 10")
549+
550+ $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)
551+ }
552+ let heightEntryNewCur = {
553+ let $l = currentPools
554+ let $s = size($l)
555+ let $acc0 = nil
556+ func $f2_1 ($a,$i) = if (($i >= $s))
557+ then $a
558+ else changeHeightEntry($a, $l[$i])
559+
560+ func $f2_2 ($a,$i) = if (($i >= $s))
561+ then $a
562+ else throw("List size exceeds 10")
563+
564+ $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)
565+ }
566+ let sumRewardCurrentTemp = {
567+ let $l = currentRewards
568+ let $s = size($l)
569+ let $acc0 = 0
570+ func $f3_1 ($a,$i) = if (($i >= $s))
571+ then $a
572+ else sum($a, $l[$i])
573+
574+ func $f3_2 ($a,$i) = if (($i >= $s))
575+ then $a
576+ else throw("List size exceeds 10")
577+
578+ $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)
579+ }
580+ let $t02055420665 = getSumReward(sumRewardCurrentTemp, pagination)
581+ let sumRewardCurrent = $t02055420665._1
582+ let rewardUpdateHeightFirstPaginationEntry = $t02055420665._2
583+ let rewardUpdateHeightEntry = if ((pagination == 2))
584+ then [IntegerEntry(kRewardUpdateHeight, rewardUpdateHeight)]
585+ else nil
586+ if ((height > rewardUpdateHeight))
587+ then throw("rewardUpdateHeight < height")
588+ else (((((previousRewardEntryNew ++ currentRewardEntryNew) ++ heightEntryNewCur) ++ sumRewardCurrent) ++ rewardUpdateHeightEntry) ++ rewardUpdateHeightFirstPaginationEntry)
589+ }
590+ })
599591
600592
601593
602594 @Callable(i)
603-func activate () = if (isActive)
595+func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
596+ then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
597+ else suspend("Paused by admin"))
598+
599+
600+
601+@Callable(i)
602+func activate () = valueOrElse(isAdminCall(i), if (active)
604603 then throw("DApp is already active")
605- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
606- then throw("Only admin can call this function")
607- else [BooleanEntry(kActive, true), DeleteEntry(kCause)]
604+ else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
608605
609606
610607 @Verifier(tx)
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let kActive = "active"
55
66 let kCause = "shutdown_cause"
77
88 let kLastInterest = "last_interest"
99
1010 let kUserLastInterest = "_last_interest"
1111
1212 let kUserSWOPLocked = "_SWOP_amount"
1313
14-let kUserGetBackHeight = "_getBackHeight"
15-
1614 let kTotalSWOPLocked = "total_SWOP_amount"
1715
18-let kUserTotalVoteSWOP = "_user_total_SWOP_vote"
16+let kUserSwopUnlockHeight = "_SWOP_unlock_height"
1917
20-let kUserVoteOptionAmount = "_SWOP_option_amount"
18+let kUserGSwopLocked = "_GSwop_amount"
2119
22-let kTotalVoteOptionAmount = "total_SWOP_option_amount"
20+let kTotalGSwopLocked = "total_GSwop_amount"
2321
24-let kUserSWOPClaimedAmount = "_SWOP_claimed_amount"
22+let kUserTotalVoteSWOP = "_user_total_vote_gSWOP"
2523
26-let kUserSWOPLastClaimedAmount = "_SWOP_last_claimed_amount"
27-
28-let kVoteName = "vote_name"
29-
30-let kOptionName = "_option_name"
31-
32-let kVotingStartHeight = "_startHeight"
33-
34-let kVoteDuration = "_vote_duration"
24+let kUserAvailableForClaim = "_user_available_for_claim"
3525
3626 let kRewardPoolFractionCurrent = "_current_pool_fraction_reward"
3727
3828 let kRewardPoolFractionPrevious = "_previous_pool_fraction_reward"
3929
4030 let kHeightPoolFraction = "_pool_reward_update_height"
41-
42-let kTotalRewardPerBlockCurrent = "total_reward_per_block_current"
43-
44-let kTotalRewardPerBlockPrevious = "total_reward_per_block_previous"
4531
4632 let kRewardUpdateHeight = "reward_update_height"
4733
4834 let kRewardUpdateFirstPaginationHeight = "reward_update_height_first_pagination"
4935
5036 let kNoVotingForNewPool = "_vote_no"
5137
5238 let kYesVotingForNewPool = "_vote_yes"
53-
54-let kAmountOfVotingForNewPool = "max_amount_voting"
5539
5640 let kStatusOfVotingForNewPool = "_status"
5741
5842 let kHeightOfPoolVotingForNewPool = "_finish_height"
5943
6044 let activeVoteFirst = "voting_active_cell_1"
6145
6246 let activeVoteSecond = "voting_active_cell_2"
6347
6448 let activeVoteThird = "voting_active_cell_3"
6549
6650 let kTempCurSum = "sum_reward_current"
6751
6852 let kLaunchpadBoughtTickets = "_bought_tickets"
6953
7054 let kLaunchpadSwopPerTickets = "_swop_per_ticket"
7155
7256 let kLaunchpadActiveId = "launchpad_active_id"
7357
7458 let kLaunchpadDuration = "_duration"
7559
7660 let kLaunchpadStartHeight = "_start_height"
7761
7862 let kStartHeight = "start_height"
7963
8064 let kBasePeriod = "base_period"
8165
8266 let kPeriodLength = "period_length"
8367
8468 let kUserTotalStruc = "_user_total_struc"
8569
8670 let kLauchpadFreezSwopDuration = "_freeze_swop_duration"
8771
8872 let kSWOPid = "SWOP_id"
8973
9074 let kAirdropFee = "airdrop_fee"
9175
9276 let kAdminPubKey1 = "admin_pub_1"
9377
9478 let kAdminPubKey2 = "admin_pub_2"
9579
9680 let kAdminPubKey3 = "admin_pub_3"
9781
9882 let kMoneyBoxPubKey = "money_box_pub_key"
9983
10084 let kFarmingAddr = "farming_address"
10185
10286 let kVotingAddr = "voting_address"
10387
10488 let kVotingNewPoolAddr = "voting_new_pool_address"
10589
10690 let kLaunchpadAddr = "launchpad_address"
10791
10892 let kAirdropMoneyBoxAddr = "airdrop_fee_money_box"
10993
11094 let oracle = Address(base58'3MvVBtsXroQpy1tsPw21TU2ET9A8WfmrNjz')
11195
11296 func getBase58FromOracle (key) = match getString(oracle, key) {
11397 case string: String =>
11498 fromBase58String(string)
11599 case nothing =>
116100 throw((key + "is empty"))
117101 }
118102
119103
120104 let adminPubKey1 = getBase58FromOracle(kAdminPubKey1)
121105
122106 let adminPubKey2 = getBase58FromOracle(kAdminPubKey2)
123107
124108 let adminPubKey3 = getBase58FromOracle(kAdminPubKey3)
125109
126110 let moneyBoxPubKey = getBase58FromOracle(kMoneyBoxPubKey)
127111
128112 let farmingAddr = Address(getBase58FromOracle(kFarmingAddr))
129113
130114 let votingAddr = Address(getBase58FromOracle(kVotingAddr))
131115
132116 let votingNewPoolAddr = Address(getBase58FromOracle(kVotingNewPoolAddr))
133117
134118 let launchpadAddr = Address(getBase58FromOracle(kLaunchpadAddr))
135119
136120 let airdropMoneyBoxAddr = Address(getBase58FromOracle(kAirdropMoneyBoxAddr))
137121
122+let lockSwopBlocksAmount = (10102 * 4)
123+
138124 let SWOP = fromBase58String(getStringValue(farmingAddr, kSWOPid))
139125
140126 let scaleValue = 100000000
141127
142128 let totalVoteShare = 10000000000
143129
144130 let feeSacle6 = 1000000
145131
146132 let basePeriod = valueOrErrorMessage(getInteger(votingAddr, kBasePeriod), "Empty kBasePeriod at voting contract")
147133
148134 let startHeight = valueOrErrorMessage(getInteger(votingAddr, kStartHeight), "Empty kStartHeight at voting contract")
149135
150136 let periodLength = valueOrErrorMessage(getInteger(votingAddr, kPeriodLength), "Empty kPeriodLength at voting contract")
151137
152138 let firstActiveVote = valueOrElse(getString(votingNewPoolAddr, activeVoteFirst), "")
153139
154140 let secondActiveVote = valueOrElse(getString(votingNewPoolAddr, activeVoteSecond), "")
155141
156142 let thirdActiveVote = valueOrElse(getString(votingNewPoolAddr, activeVoteThird), "")
157143
158-let isActive = valueOrElse(getBoolean(this, kActive), true)
144+let active = valueOrElse(getBoolean(this, kActive), true)
159145
160146 let airdropFee = getIntegerValue(oracle, kAirdropFee)
161147
162148 let currVotingPeriod = (basePeriod + ((height - startHeight) / periodLength))
163149
164150 func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)]
165151
166152
167-func throwNotEnoughSWOP () = throw("Not enough SWOP: userSWOPLocked - userTotalVoteAmount < voteSWOPAmount")
153+func isActive () = if (active)
154+ then unit
155+ else throw("DApp is inactive at this moment")
156+
157+
158+func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))
159+ then unit
160+ else throw("Only admin can call this function")
168161
169162
170163 func getLastInterestInfo () = valueOrElse(getInteger(this, kLastInterest), 0)
171164
172165
173-func getUserSWOPLocked (user) = valueOrElse(getInteger(this, (toString(user) + kUserSWOPLocked)), 0)
166+func getTotalLockedInfo () = {
167+ let totalSwopLocked = valueOrElse(getInteger(this, kTotalSWOPLocked), 0)
168+ let totalGSwopLocked = valueOrElse(getInteger(this, kTotalGSwopLocked), totalSwopLocked)
169+ $Tuple2(totalSwopLocked, totalGSwopLocked)
170+ }
174171
175172
176-func getUserSWOPClaimedAmount (user) = valueOrElse(getInteger(this, (toString(user) + kUserSWOPClaimedAmount)), 0)
177-
178-
179-func getUserTotalVoteAmount (user) = valueOrElse(getInteger(votingAddr, (toString(user) + kUserTotalVoteSWOP)), 0)
173+func getUserLockedInfo (user) = {
174+ let userSwopLocked = valueOrElse(getInteger(this, (user + kUserSWOPLocked)), 0)
175+ let userGSwopLocked = valueOrElse(getInteger(this, (user + kUserGSwopLocked)), userSwopLocked)
176+ $Tuple2(userSwopLocked, userGSwopLocked)
177+ }
180178
181179
182180 func getUserInterestInfo (user,lastInterest) = {
183- let userSWOPAmount = getUserSWOPLocked(user)
184- let userLastInterest = getInteger(this, (toString(user) + kUserLastInterest))
185- let userLastInterestValue = match userLastInterest {
186- case userLastInterest: Int =>
187- userLastInterest
188- case _ =>
189- lastInterest
181+ let $t048874950 = getUserLockedInfo(user)
182+ let userSWOPAmount = $t048874950._1
183+ let userGSwopAmount = $t048874950._2
184+ let userLastInterest = valueOrElse(getInteger(this, (user + kUserLastInterest)), lastInterest)
185+ $Tuple3(userLastInterest, userSWOPAmount, userGSwopAmount)
190186 }
191- $Tuple2(userLastInterestValue, userSWOPAmount)
192- }
187+
188+
189+func getUserAvailableForClaim (user) = valueOrElse(getInteger(this, (user + kUserAvailableForClaim)), 0)
193190
194191
195192 func getUserTotalVoteAmountForOnePool (pool,user) = {
196193 let voting = valueOrElse(getInteger(votingNewPoolAddr, pool), -1)
197194 let heightOfVoting = valueOrElse(getInteger(votingNewPoolAddr, (toString(voting) + kHeightOfPoolVotingForNewPool)), 0)
198195 let statusOfVoting = valueOrElse(getBoolean(votingNewPoolAddr, (toString(voting) + kStatusOfVotingForNewPool)), true)
199196 let currentHeight = height
200197 if ((0 > voting))
201198 then 0
202199 else if (!(statusOfVoting))
203200 then 0
204201 else if ((heightOfVoting > currentHeight))
205202 then (valueOrElse(getInteger(votingNewPoolAddr, (((toString(user) + "_") + toString(voting)) + kYesVotingForNewPool)), 0) + valueOrElse(getInteger(votingNewPoolAddr, (((toString(user) + "_") + toString(voting)) + kNoVotingForNewPool)), 0))
206203 else 0
207204 }
208205
209206
210207 func getUserTotalVoteForNewPoolAmount (user) = {
211208 let listOfVoting = [getUserTotalVoteAmountForOnePool(firstActiveVote, user), getUserTotalVoteAmountForOnePool(secondActiveVote, user), getUserTotalVoteAmountForOnePool(thirdActiveVote, user)]
212209 max(listOfVoting)
213210 }
214211
215212
216213 func getUserBlockedInLauchpad (user) = {
217214 let lauchpadId = toString(valueOrElse(getInteger(launchpadAddr, kLaunchpadActiveId), 0))
218215 if ((lauchpadId == "0"))
219216 then 0
220217 else {
221218 let lStartHeight = valueOrElse(getInteger(launchpadAddr, (lauchpadId + kLaunchpadStartHeight)), 0)
222219 let lDuration = valueOrElse(getInteger(launchpadAddr, (lauchpadId + kLaunchpadDuration)), 0)
223220 let lFreezeSwopDuration = valueOrElse(getInteger(launchpadAddr, (lauchpadId + kLauchpadFreezSwopDuration)), 0)
224221 let blockEndHeight = ((lStartHeight + lDuration) + lFreezeSwopDuration)
225222 if ((height > blockEndHeight))
226223 then 0
227224 else {
228225 let boughtTickets = valueOrElse(getInteger(launchpadAddr, (((toString(user) + "_") + lauchpadId) + kLaunchpadBoughtTickets)), 0)
229226 let swopPerTicket = valueOrElse(getInteger(launchpadAddr, (lauchpadId + kLaunchpadSwopPerTickets)), 0)
230227 (boughtTickets * swopPerTicket)
231228 }
232229 }
233230 }
234231
235232
236-func getTotalSWOPLocked () = valueOrElse(getInteger(this, kTotalSWOPLocked), 0)
237-
238-
239233 func getUserVoteInfo (user) = {
240- let $t076068139 = if (isDefined(getString(votingAddr, (toString(user) + kUserTotalStruc))))
234+ let $t073147847 = if (isDefined(getString(votingAddr, (toString(user) + kUserTotalStruc))))
241235 then {
242236 let data = split(valueOrErrorMessage(getString(votingAddr, (toString(user) + kUserTotalStruc)), "Empty kUserTotalStruc"), "_")
243237 $Tuple3(parseIntValue(data[0]), parseIntValue(data[1]), parseIntValue(data[2]))
244238 }
245239 else {
246240 let uPoolTotalSWOP = valueOrElse(getInteger(votingAddr, (toString(user) + kUserTotalVoteSWOP)), 0)
247241 $Tuple3(uPoolTotalSWOP, 0, currVotingPeriod)
248242 }
249- let userTotalVoteSWOP = $t076068139._1
250- let userUnvoted = $t076068139._2
251- let userUnvotedPeriod = $t076068139._3
243+ let userTotalVoteSWOP = $t073147847._1
244+ let userUnvoted = $t073147847._2
245+ let userUnvotedPeriod = $t073147847._3
252246 let userUnvotedActual = if ((userUnvotedPeriod == currVotingPeriod))
253247 then userUnvoted
254248 else 0
255249 $Tuple2(userTotalVoteSWOP, userUnvotedActual)
256250 }
257-
258-
259-func getUserVoteOptionAmount (user) = valueOrElse(getInteger(this, (toString(user) + kUserVoteOptionAmount)), 0)
260-
261-
262-func getVotingStartHeight (voteName) = valueOrElse(getInteger(this, (voteName + kVotingStartHeight)), 0)
263251
264252
265253 func getPoolUpdateHeight (pool) = valueOrElse(getInteger(this, (pool + kHeightPoolFraction)), 0)
266254
267255
268256 func isDefinePoolUpdateHeight (pool) = isDefined(getInteger(this, (pool + kHeightPoolFraction)))
269257
270258
271259 func getCurPoolWeight (pool) = valueOrElse(getInteger(this, (pool + kRewardPoolFractionCurrent)), 0)
272260
273261
274262 func getPrevPoolWeight (pool) = valueOrElse(getInteger(this, (pool + kRewardPoolFractionPrevious)), 0)
275263
276264
277-func getVoteOptionAmount (user,voteName,option) = {
278- let userVoteOptionAmount = getInteger(this, (((voteName + option) + toString(user)) + kUserVoteOptionAmount))
279- let uvoa = match userVoteOptionAmount {
280- case uvoa: Int =>
281- uvoa
282- case uvoa: Unit =>
283- 0
284- case _ =>
285- throw("Match error")
286- }
287- valueOrErrorMessage(uvoa, (((("No data on the key: " + voteName) + option) + toString(user)) + kUserVoteOptionAmount))
288- }
289-
290-
291-func getVoteDuration (voteName) = valueOrErrorMessage(getInteger(this, (voteName + kVoteDuration)), (("No data on the key: " + voteName) + kVoteDuration))
292-
293-
294-func getTotalVoteOptionAmount (voteName,option) = {
295- let totalVoteOptionAmount = getInteger(this, ((voteName + option) + kTotalVoteOptionAmount))
296- let tvoa = match totalVoteOptionAmount {
297- case tvoa: Int =>
298- tvoa
299- case tvoa: Unit =>
300- 0
301- case _ =>
302- throw("Match error")
303- }
304- tvoa
305- }
306-
307-
308-func getUserGetBackAmount (voteName,option,user,getBackSWOPHeight) = {
309- let key = ((((((voteName + "_") + option) + "_") + toString(user)) + "_") + toString(getBackSWOPHeight))
310- valueOrErrorMessage(getInteger(this, key), ("No data on the key: " + key))
311- }
312-
313-
314-func claimCalc (caller) = {
265+func claimCalc (user) = {
315266 let lastInterest = getLastInterestInfo()
316- let $t01053010612 = getUserInterestInfo(caller, lastInterest)
317- let userLastInterest = $t01053010612._1
318- let userSWOPLocked = $t01053010612._2
319- let claimAmount = fraction(userSWOPLocked, (lastInterest - userLastInterest), scaleValue)
267+ let $t087218818 = getUserInterestInfo(user, lastInterest)
268+ let userLastInterest = $t087218818._1
269+ let userSWOPLocked = $t087218818._2
270+ let userGSwopAmount = $t087218818._3
271+ let claimAmount = fraction(userGSwopAmount, (lastInterest - userLastInterest), scaleValue)
320272 let userNewInterest = lastInterest
321273 $Tuple2(userNewInterest, claimAmount)
322274 }
323275
324276
325277 @Callable(i)
326-func airDrop () = if (!(isActive))
327- then throw("DApp is inactive at this moment")
328- else {
329- let $t01088010955 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
330- let pmtAmount = $t01088010955._1
331- let pmtAssetId = $t01088010955._2
332- if ((pmtAssetId != SWOP))
333- then throw("Incorrect pmtAssetId")
334- else {
335- let airdropFeeAmount = fraction(pmtAmount, airdropFee, feeSacle6, CEILING)
336- let totalSWOPLocked = getTotalSWOPLocked()
337- let lastInterest = getLastInterestInfo()
338- let interestNew = (lastInterest + fraction((pmtAmount - airdropFeeAmount), scaleValue, totalSWOPLocked))
278+func airDrop () = valueOrElse(isActive(), {
279+ let $t090489123 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
280+ let pmtAmount = $t090489123._1
281+ let pmtAssetId = $t090489123._2
282+ if ((pmtAssetId != SWOP))
283+ then throw("Incorrect pmtAssetId")
284+ else {
285+ let airdropFeeAmount = fraction(pmtAmount, airdropFee, feeSacle6, CEILING)
286+ let $t092969358 = getTotalLockedInfo()
287+ let totalSWOPLocked = $t092969358._1
288+ let totalGSwopLocked = $t092969358._2
289+ let lastInterest = getLastInterestInfo()
290+ let interestNew = (lastInterest + fraction((pmtAmount - airdropFeeAmount), scaleValue, totalGSwopLocked))
339291 [IntegerEntry(kLastInterest, interestNew), ScriptTransfer(airdropMoneyBoxAddr, airdropFeeAmount, SWOP)]
340- }
341- }
292+ }
293+ })
342294
343295
344296
345297 @Callable(i)
346-func lockSWOP () = if (!(isActive))
347- then throw("DApp is inactive at this moment")
348- else {
349- let $t01158811663 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
350- let pmtAmount = $t01158811663._1
351- let pmtAssetId = $t01158811663._2
352- if ((pmtAssetId != SWOP))
353- then throw("Incorrect pmtAssetId")
354- else {
355- let lastInterest = getLastInterestInfo()
356- let $t01177911863 = getUserInterestInfo(i.caller, lastInterest)
357- let userLastInterest = $t01177911863._1
358- let userSWOPLocked = $t01177911863._2
359- let claimAmount = fraction(userSWOPLocked, (lastInterest - userLastInterest), scaleValue)
360- let userSWOPLockedNew = ((userSWOPLocked + pmtAmount) + claimAmount)
361- let userNewInterest = lastInterest
362- let totalSWOPLocked = getTotalSWOPLocked()
363- let totalSWOPLockedNew = ((totalSWOPLocked + pmtAmount) + claimAmount)
364- let userClaimedAmount = getUserSWOPClaimedAmount(i.caller)
365- let userClaimedAmountNew = (userClaimedAmount + claimAmount)
366-[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)]
367- }
368- }
298+func lockSWOP () = valueOrElse(isActive(), {
299+ let $t097369811 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
300+ let pmtAmount = $t097369811._1
301+ let pmtAssetId = $t097369811._2
302+ if ((pmtAssetId != SWOP))
303+ then throw("Incorrect pmtAssetId")
304+ else {
305+ let user = toString(i.caller)
306+ let lastInterest = getLastInterestInfo()
307+ let $t0996210025 = getUserLockedInfo(user)
308+ let userSWOPLocked = $t0996210025._1
309+ let userGSwopLocked = $t0996210025._2
310+ let $t01003010091 = claimCalc(user)
311+ let userNewInterest = $t01003010091._1
312+ let claimAmountAvailable = $t01003010091._2
313+ let availableForClaim = getUserAvailableForClaim(user)
314+ let availableForClaimNew = (availableForClaim + claimAmountAvailable)
315+ let userSWOPLockedNew = (userSWOPLocked + pmtAmount)
316+ let userGSwopLockedNew = (userGSwopLocked + pmtAmount)
317+ let $t01033910401 = getTotalLockedInfo()
318+ let totalSWOPLocked = $t01033910401._1
319+ let totalGSwopLocked = $t01033910401._2
320+ let totalSWOPLockedNew = (totalSWOPLocked + pmtAmount)
321+ let totalGSwopLockedNew = (totalGSwopLocked + pmtAmount)
322+[IntegerEntry((user + kUserSwopUnlockHeight), (height + lockSwopBlocksAmount)), IntegerEntry((user + kUserLastInterest), userNewInterest), IntegerEntry((user + kUserSWOPLocked), userSWOPLockedNew), IntegerEntry((user + kUserGSwopLocked), userGSwopLocked), IntegerEntry((user + kUserAvailableForClaim), availableForClaimNew), IntegerEntry(kTotalSWOPLocked, totalSWOPLockedNew), IntegerEntry(kTotalGSwopLocked, totalGSwopLockedNew)]
323+ }
324+ })
369325
370326
371327
372328 @Callable(i)
373-func withdrawSWOP (withdrawAmount) = if (!(isActive))
374- then throw("DApp is inactive at this moment")
375- else if ((0 >= withdrawAmount))
329+func withdrawSWOP (withdrawAmount) = valueOrElse(isActive(), {
330+ let user = toString(i.caller)
331+ let unlockHeight = valueOrElse(getInteger(this, (user + kUserSwopUnlockHeight)), 0)
332+ if ((0 >= withdrawAmount))
376333 then throw("withdrawAmount <= 0")
377- else {
378- let totalSWOPLocked = getTotalSWOPLocked()
379- let userSWOPLocked = getUserSWOPLocked(i.caller)
380- let $t01300413059 = claimCalc(i.caller)
381- let userNewInterest = $t01300413059._1
382- let claimAmount = $t01300413059._2
383- let $t01306413129 = getUserVoteInfo(i.caller)
384- let userVoteAmount = $t01306413129._1
385- let userUnvoteAmount = $t01306413129._2
386- let userVoteAmountForNewPool = getUserTotalVoteForNewPoolAmount(i.caller)
387- let blockedInLaunchpad = getUserBlockedInLauchpad(i.caller)
388- if (if (if ((0 > userUnvoteAmount))
389- then true
390- else (0 > userVoteAmount))
391- then true
392- else (0 > userVoteAmountForNewPool))
393- then throw("userUnvoteAmount < 0 || userVoteAmount < 0 || userVoteAmountForNewPool < 0")
394- else {
395- let availableToUnstake = (userSWOPLocked - max([userVoteAmountForNewPool, (userVoteAmount + userUnvoteAmount), blockedInLaunchpad]))
396- if ((withdrawAmount > availableToUnstake))
397- then throw("withdrawAmount > availableToUnstake")
398- else {
399- let totalSWOPLockedNew = ((totalSWOPLocked + claimAmount) - withdrawAmount)
400- let userSWOPamountNew = ((userSWOPLocked + claimAmount) - withdrawAmount)
401- let userClaimedAmount = getUserSWOPClaimedAmount(i.caller)
402- let userClaimedAmountNew = (userClaimedAmount + claimAmount)
403-[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)]
404- }
405- }
406- }
334+ else if ((unlockHeight > height))
335+ then throw(("You can't withdraw till " + toString(unlockHeight)))
336+ else {
337+ let $t01137611438 = getTotalLockedInfo()
338+ let totalSWOPLocked = $t01137611438._1
339+ let totalGSwopLocked = $t01137611438._2
340+ let $t01144311506 = getUserLockedInfo(user)
341+ let userSWOPLocked = $t01144311506._1
342+ let userGSwopLocked = $t01144311506._2
343+ let $t01151111572 = claimCalc(user)
344+ let userNewInterest = $t01151111572._1
345+ let claimAmountAvailable = $t01151111572._2
346+ let $t01157711643 = getUserVoteInfo(i.caller)
347+ let userVoteAmount = $t01157711643._1
348+ let userUnvoteAmount = $t01157711643._2
349+ let userVoteAmountForNewPool = getUserTotalVoteForNewPoolAmount(i.caller)
350+ let blockedInLaunchpad = getUserBlockedInLauchpad(i.caller)
351+ if (if (if ((0 > userUnvoteAmount))
352+ then true
353+ else (0 > userVoteAmount))
354+ then true
355+ else (0 > userVoteAmountForNewPool))
356+ then throw("userUnvoteAmount < 0 || userVoteAmount < 0 || userVoteAmountForNewPool < 0")
357+ else {
358+ let availableToUnstake = (userSWOPLocked - max([userVoteAmountForNewPool, (userVoteAmount + userUnvoteAmount), blockedInLaunchpad]))
359+ if ((withdrawAmount > availableToUnstake))
360+ then throw("withdrawAmount > availableToUnstake")
361+ else {
362+ let availableForClaim = getUserAvailableForClaim(user)
363+ let availableForClaimNew = (availableForClaim + claimAmountAvailable)
364+ let totalSWOPLockedNew = (totalSWOPLocked - withdrawAmount)
365+ let userSWOPAmountNew = (userSWOPLocked - withdrawAmount)
366+ let totalGSwopLockedNew = ((totalGSwopLocked - userGSwopLocked) + userSWOPAmountNew)
367+[IntegerEntry((user + kUserLastInterest), userNewInterest), IntegerEntry((user + kUserSWOPLocked), userSWOPAmountNew), IntegerEntry((user + kUserGSwopLocked), userSWOPAmountNew), IntegerEntry((user + kUserAvailableForClaim), availableForClaimNew), IntegerEntry(kTotalSWOPLocked, totalSWOPLockedNew), IntegerEntry(kTotalGSwopLocked, totalGSwopLockedNew), ScriptTransfer(i.caller, withdrawAmount, SWOP)]
368+ }
369+ }
370+ }
371+ })
407372
408373
409374
410375 @Callable(i)
411-func claimAndWithdrawSWOP () = if (!(isActive))
412- then throw("DApp is inactive at this moment")
413- else {
414- let lastInterest = getLastInterestInfo()
415- let $t01457914634 = claimCalc(i.caller)
416- let userNewInterest = $t01457914634._1
417- let claimAmount = $t01457914634._2
418- let userClaimedAmount = getUserSWOPClaimedAmount(i.caller)
419- let userClaimedAmountNew = (userClaimedAmount + claimAmount)
420- if ((claimAmount == 0))
421- then throw("You have 0 available SWOP")
422- else [IntegerEntry((toString(i.caller) + kUserLastInterest), userNewInterest), IntegerEntry((toString(i.caller) + kUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((toString(i.caller) + kUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, claimAmount, SWOP)]
423- }
376+func claimAndWithdrawSWOP () = valueOrElse(isActive(), {
377+ let user = toString(i.caller)
378+ let availableForClaim = getUserAvailableForClaim(user)
379+ let $t01316213214 = claimCalc(user)
380+ let userNewInterest = $t01316213214._1
381+ let claimAmount = $t01316213214._2
382+ let userClaimAmount = (availableForClaim + claimAmount)
383+ if ((userClaimAmount == 0))
384+ then throw("You have 0 available SWOP")
385+ else [IntegerEntry((user + kUserLastInterest), userNewInterest), ScriptTransfer(i.caller, userClaimAmount, SWOP)]
386+ })
424387
425388
426389
427390 @Callable(i)
428-func claimAndStakeSWOP () = if (!(isActive))
429- then throw("DApp is inactive at this moment")
430- else {
431- let totalSWOPLocked = getTotalSWOPLocked()
432- let userSWOPLocked = getUserSWOPLocked(i.caller)
433- let lastInterest = getLastInterestInfo()
434- let $t01540715462 = claimCalc(i.caller)
435- let userNewInterest = $t01540715462._1
436- let claimAmount = $t01540715462._2
437- let userSWOPLockedNew = (userSWOPLocked + claimAmount)
438- let totalSWOPLockedNew = (totalSWOPLocked + claimAmount)
439- let userClaimedAmount = getUserSWOPClaimedAmount(i.caller)
440- let userClaimedAmountNew = (userClaimedAmount + claimAmount)
441- if ((claimAmount == 0))
442- then throw("You have 0 available SWOP")
443- 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)]
444- }
391+func claimAndStakeSWOP () = valueOrElse(isActive(), {
392+ let user = toString(i.caller)
393+ let $t01358713649 = getTotalLockedInfo()
394+ let totalSWOPLocked = $t01358713649._1
395+ let totalGSwopLocked = $t01358713649._2
396+ let $t01365413717 = getUserLockedInfo(user)
397+ let userSWOPLocked = $t01365413717._1
398+ let userGSwopLocked = $t01365413717._2
399+ let availableForClaim = getUserAvailableForClaim(user)
400+ let $t01378113832 = claimCalc(user)
401+ let userNewInterest = $t01378113832._1
402+ let claimAmount = $t01378113832._2
403+ let userClaimAmount = (availableForClaim + claimAmount)
404+ let userSWOPLockedNew = (userSWOPLocked + userClaimAmount)
405+ let userGSwopLockedNew = (userGSwopLocked + (userClaimAmount * 2))
406+ let totalSWOPLockedNew = (totalSWOPLocked + userClaimAmount)
407+ let totalGSwopLockedNew = (totalGSwopLocked + (userClaimAmount * 2))
408+ if ((userClaimAmount == 0))
409+ then throw("You have 0 available SWOP")
410+ else [IntegerEntry((toString(i.caller) + kUserSwopUnlockHeight), (height + lockSwopBlocksAmount)), IntegerEntry((toString(i.caller) + kUserLastInterest), userNewInterest), IntegerEntry(kTotalSWOPLocked, totalSWOPLockedNew), IntegerEntry(kTotalGSwopLocked, totalGSwopLockedNew), IntegerEntry((toString(i.caller) + kUserSWOPLocked), userSWOPLockedNew), IntegerEntry((toString(i.caller) + kUserGSwopLocked), userGSwopLockedNew)]
411+ })
445412
446413
447414
448415 @Callable(i)
449-func updateWeights (currentPools,currentRewards,rewardUpdateHeight,pagination) = if (!(isActive))
450- then throw("DApp is inactive at this moment")
451- else {
452- let amountPools = 10
453- let totalRewardUpdateHeight = valueOrElse(getInteger(this, kRewardUpdateHeight), 0)
454- if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, moneyBoxPubKey], i.callerPublicKey)))
455- then throw("Only admin can call this function")
456- else if ((size(currentPools) > amountPools))
457- then throw(("Max amount of pool is " + toString(amountPools)))
458- else if ((totalRewardUpdateHeight >= rewardUpdateHeight))
459- then throw("rewardUpdateHeight <= totalRewardUpdateHeight")
460- else if ((height >= rewardUpdateHeight))
461- then throw("height >= rewardUpdateHeight")
462- else if ((0 >= rewardUpdateHeight))
463- then throw("0 >= rewardUpdateHeight ")
464- else {
465- func sum (a,b) = (a + b)
466-
467- func changePreviousRewardEntry (accumulated,pool) = {
468- let poolRewardUpdateHeight = getPoolUpdateHeight(pool)
469- if (if (!(isDefinePoolUpdateHeight(pool)))
470- then true
471- else if ((rewardUpdateHeight != poolRewardUpdateHeight))
472- then (poolRewardUpdateHeight == totalRewardUpdateHeight)
473- else false)
474- then {
475- let poolReward = getCurPoolWeight(pool)
476-IntegerEntry((pool + kRewardPoolFractionPrevious), poolReward) :: accumulated
477- }
478- else {
479- let poolReward = getPrevPoolWeight(pool)
480-IntegerEntry((pool + kRewardPoolFractionPrevious), poolReward) :: accumulated
481- }
482- }
483-
484- func changeCurrentRewardEntry (accumulated,pool) = {
485- let poolIndex = value(indexOf(currentPools, pool))
486- let poolReward = currentRewards[poolIndex]
487- if ((0 > poolReward))
488- then throw("PoolReward < 0")
489- else IntegerEntry((pool + kRewardPoolFractionCurrent), poolReward) :: accumulated
490- }
491-
492- func changeHeightEntry (accumulated,pool) = {
493- let poolHeight = rewardUpdateHeight
494-IntegerEntry((pool + kHeightPoolFraction), poolHeight) :: accumulated
495- }
496-
497- func getSumReward (curTempSum,pagination) = if ((pagination == 0))
498- then if ((curTempSum > totalVoteShare))
499- then throw(((("sumRewardPrevious > totalVoteShare or sumRewardCurrent > totalVoteShare - " + toString(pagination)) + " ") + toString(curTempSum)))
500- else $Tuple2([IntegerEntry(kTempCurSum, curTempSum)], [IntegerEntry(kRewardUpdateFirstPaginationHeight, rewardUpdateHeight)])
501- else if ((pagination == 1))
502- then {
503- let curTempSumFromKey = valueOrElse(getInteger(this, kTempCurSum), 0)
504- let rewardUpdateHeightFirstPaginationEntry = valueOrElse(getInteger(this, kRewardUpdateFirstPaginationHeight), 0)
505- if (((curTempSum + curTempSumFromKey) > totalVoteShare))
506- then throw(((("sumRewardPrevious > totalVoteShare or sumRewardCurrent > totalVoteShare - " + toString(pagination)) + " ") + toString((curTempSum + curTempSumFromKey))))
507- else if ((rewardUpdateHeightFirstPaginationEntry != rewardUpdateHeight))
508- then throw("current rewardUpdateHeight != rewardUpdateHeightFirstPaginationEntry")
509- else $Tuple2([IntegerEntry(kTempCurSum, (curTempSum + curTempSumFromKey))], nil)
510- }
511- else if ((pagination == 2))
512- then {
513- let curSum = (valueOrElse(getInteger(this, kTempCurSum), 0) + curTempSum)
514- let rewardUpdateHeightFirstPaginationEntry = valueOrElse(getInteger(this, kRewardUpdateFirstPaginationHeight), 0)
515- if ((curSum != totalVoteShare))
516- then throw("sumRewardPrevious != totalVoteShare or sumRewardCurrent != totalVoteShare")
517- else if ((rewardUpdateHeightFirstPaginationEntry != rewardUpdateHeight))
518- then throw("current rewardUpdateHeight != rewardUpdateHeightFirstPaginationEntry")
519- else $Tuple2([IntegerEntry(kTempCurSum, curSum)], nil)
520- }
521- else throw("Incorrect pagination")
522-
523- let previousRewardEntryNew = {
524- let $l = currentPools
525- let $s = size($l)
526- let $acc0 = nil
527- func $f0_1 ($a,$i) = if (($i >= $s))
528- then $a
529- else changePreviousRewardEntry($a, $l[$i])
530-
531- func $f0_2 ($a,$i) = if (($i >= $s))
532- then $a
533- else throw("List size exceeds 10")
534-
535- $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)
536- }
537- let currentRewardEntryNew = {
538- let $l = currentPools
539- let $s = size($l)
540- let $acc0 = nil
541- func $f1_1 ($a,$i) = if (($i >= $s))
542- then $a
543- else changeCurrentRewardEntry($a, $l[$i])
544-
545- func $f1_2 ($a,$i) = if (($i >= $s))
546- then $a
547- else throw("List size exceeds 10")
548-
549- $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)
550- }
551- let heightEntryNewCur = {
552- let $l = currentPools
553- let $s = size($l)
554- let $acc0 = nil
555- func $f2_1 ($a,$i) = if (($i >= $s))
556- then $a
557- else changeHeightEntry($a, $l[$i])
558-
559- func $f2_2 ($a,$i) = if (($i >= $s))
560- then $a
561- else throw("List size exceeds 10")
562-
563- $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)
564- }
565- let sumRewardCurrentTemp = {
566- let $l = currentRewards
567- let $s = size($l)
568- let $acc0 = 0
569- func $f3_1 ($a,$i) = if (($i >= $s))
570- then $a
571- else sum($a, $l[$i])
572-
573- func $f3_2 ($a,$i) = if (($i >= $s))
574- then $a
575- else throw("List size exceeds 10")
576-
577- $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)
578- }
579- let $t02055720668 = getSumReward(sumRewardCurrentTemp, pagination)
580- let sumRewardCurrent = $t02055720668._1
581- let rewardUpdateHeightFirstPaginationEntry = $t02055720668._2
582- let rewardUpdateHeightEntry = if ((pagination == 2))
583- then [IntegerEntry(kRewardUpdateHeight, rewardUpdateHeight)]
584- else nil
585- if ((height > rewardUpdateHeight))
586- then throw("rewardUpdateHeight < height")
587- else (((((previousRewardEntryNew ++ currentRewardEntryNew) ++ heightEntryNewCur) ++ sumRewardCurrent) ++ rewardUpdateHeightEntry) ++ rewardUpdateHeightFirstPaginationEntry)
588- }
589- }
416+func lockSWOPFromFarming () = valueOrElse(isActive(), {
417+ let $t01477214847 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
418+ let pmtAmount = $t01477214847._1
419+ let pmtAssetId = $t01477214847._2
420+ if ((i.caller != farmingAddr))
421+ then throw("Only farming can call this function")
422+ else if ((pmtAssetId != SWOP))
423+ then throw("Incorrect pmtAssetId")
424+ else {
425+ let user = toString(i.originCaller)
426+ let lastInterest = getLastInterestInfo()
427+ let $t01509015153 = getUserLockedInfo(user)
428+ let userSWOPLocked = $t01509015153._1
429+ let userGSwopLocked = $t01509015153._2
430+ let $t01515815219 = claimCalc(user)
431+ let userNewInterest = $t01515815219._1
432+ let claimAmountAvailable = $t01515815219._2
433+ let availableForClaim = getUserAvailableForClaim(user)
434+ let availableForClaimNew = (availableForClaim + claimAmountAvailable)
435+ let userSWOPLockedNew = (userSWOPLocked + pmtAmount)
436+ let userGSwopLockedNew = (userGSwopLocked + (pmtAmount * 2))
437+ let $t01547115533 = getTotalLockedInfo()
438+ let totalSWOPLocked = $t01547115533._1
439+ let totalGSwopLocked = $t01547115533._2
440+ let totalSWOPLockedNew = (totalSWOPLocked + pmtAmount)
441+ let totalGSwopLockedNew = (totalGSwopLocked + (pmtAmount * 2))
442+[IntegerEntry((user + kUserSwopUnlockHeight), (height + lockSwopBlocksAmount)), IntegerEntry((user + kUserLastInterest), userNewInterest), IntegerEntry((user + kUserSWOPLocked), userSWOPLockedNew), IntegerEntry((user + kUserGSwopLocked), userGSwopLocked), IntegerEntry((user + kUserAvailableForClaim), availableForClaimNew), IntegerEntry(kTotalSWOPLocked, totalSWOPLockedNew), IntegerEntry(kTotalGSwopLocked, totalGSwopLockedNew)]
443+ }
444+ })
590445
591446
592447
593448 @Callable(i)
594-func shutdown () = if (!(isActive))
595- then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
596- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
449+func updateWeights (currentPools,currentRewards,rewardUpdateHeight,pagination) = valueOrElse(isActive(), {
450+ let amountPools = 10
451+ let totalRewardUpdateHeight = valueOrElse(getInteger(this, kRewardUpdateHeight), 0)
452+ if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3, moneyBoxPubKey], i.callerPublicKey)))
597453 then throw("Only admin can call this function")
598- else suspend("Paused by admin")
454+ else if ((size(currentPools) > amountPools))
455+ then throw(("Max amount of pool is " + toString(amountPools)))
456+ else if ((totalRewardUpdateHeight >= rewardUpdateHeight))
457+ then throw("rewardUpdateHeight <= totalRewardUpdateHeight")
458+ else if ((height >= rewardUpdateHeight))
459+ then throw("height >= rewardUpdateHeight")
460+ else if ((0 >= rewardUpdateHeight))
461+ then throw("0 >= rewardUpdateHeight ")
462+ else {
463+ func sum (a,b) = (a + b)
464+
465+ func changePreviousRewardEntry (accumulated,pool) = {
466+ let poolRewardUpdateHeight = getPoolUpdateHeight(pool)
467+ if (if (!(isDefinePoolUpdateHeight(pool)))
468+ then true
469+ else if ((rewardUpdateHeight != poolRewardUpdateHeight))
470+ then (poolRewardUpdateHeight == totalRewardUpdateHeight)
471+ else false)
472+ then {
473+ let poolReward = getCurPoolWeight(pool)
474+IntegerEntry((pool + kRewardPoolFractionPrevious), poolReward) :: accumulated
475+ }
476+ else {
477+ let poolReward = getPrevPoolWeight(pool)
478+IntegerEntry((pool + kRewardPoolFractionPrevious), poolReward) :: accumulated
479+ }
480+ }
481+
482+ func changeCurrentRewardEntry (accumulated,pool) = {
483+ let poolIndex = value(indexOf(currentPools, pool))
484+ let poolReward = currentRewards[poolIndex]
485+ if ((0 > poolReward))
486+ then throw("PoolReward < 0")
487+ else IntegerEntry((pool + kRewardPoolFractionCurrent), poolReward) :: accumulated
488+ }
489+
490+ func changeHeightEntry (accumulated,pool) = {
491+ let poolHeight = rewardUpdateHeight
492+ let upUIntr = invoke(farmingAddr, "updatePoolInterest", [pool], nil)
493+ if ((upUIntr == upUIntr))
494+ then IntegerEntry((pool + kHeightPoolFraction), poolHeight) :: accumulated
495+ else throw("Strict value is not equal to itself.")
496+ }
497+
498+ func getSumReward (curTempSum,pagination) = if ((pagination == 0))
499+ then if ((curTempSum > totalVoteShare))
500+ then throw(((("sumRewardPrevious > totalVoteShare or sumRewardCurrent > totalVoteShare - " + toString(pagination)) + " ") + toString(curTempSum)))
501+ else $Tuple2([IntegerEntry(kTempCurSum, curTempSum)], [IntegerEntry(kRewardUpdateFirstPaginationHeight, rewardUpdateHeight)])
502+ else if ((pagination == 1))
503+ then {
504+ let curTempSumFromKey = valueOrElse(getInteger(this, kTempCurSum), 0)
505+ let rewardUpdateHeightFirstPaginationEntry = valueOrElse(getInteger(this, kRewardUpdateFirstPaginationHeight), 0)
506+ if (((curTempSum + curTempSumFromKey) > totalVoteShare))
507+ then throw(((("sumRewardPrevious > totalVoteShare or sumRewardCurrent > totalVoteShare - " + toString(pagination)) + " ") + toString((curTempSum + curTempSumFromKey))))
508+ else if ((rewardUpdateHeightFirstPaginationEntry != rewardUpdateHeight))
509+ then throw("current rewardUpdateHeight != rewardUpdateHeightFirstPaginationEntry")
510+ else $Tuple2([IntegerEntry(kTempCurSum, (curTempSum + curTempSumFromKey))], nil)
511+ }
512+ else if ((pagination == 2))
513+ then {
514+ let curSum = (valueOrElse(getInteger(this, kTempCurSum), 0) + curTempSum)
515+ let rewardUpdateHeightFirstPaginationEntry = valueOrElse(getInteger(this, kRewardUpdateFirstPaginationHeight), 0)
516+ if ((curSum != totalVoteShare))
517+ then throw("sumRewardPrevious != totalVoteShare or sumRewardCurrent != totalVoteShare")
518+ else if ((rewardUpdateHeightFirstPaginationEntry != rewardUpdateHeight))
519+ then throw("current rewardUpdateHeight != rewardUpdateHeightFirstPaginationEntry")
520+ else $Tuple2([IntegerEntry(kTempCurSum, curSum)], nil)
521+ }
522+ else throw("Incorrect pagination")
523+
524+ let previousRewardEntryNew = {
525+ let $l = currentPools
526+ let $s = size($l)
527+ let $acc0 = nil
528+ func $f0_1 ($a,$i) = if (($i >= $s))
529+ then $a
530+ else changePreviousRewardEntry($a, $l[$i])
531+
532+ func $f0_2 ($a,$i) = if (($i >= $s))
533+ then $a
534+ else throw("List size exceeds 10")
535+
536+ $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)
537+ }
538+ let currentRewardEntryNew = {
539+ let $l = currentPools
540+ let $s = size($l)
541+ let $acc0 = nil
542+ func $f1_1 ($a,$i) = if (($i >= $s))
543+ then $a
544+ else changeCurrentRewardEntry($a, $l[$i])
545+
546+ func $f1_2 ($a,$i) = if (($i >= $s))
547+ then $a
548+ else throw("List size exceeds 10")
549+
550+ $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)
551+ }
552+ let heightEntryNewCur = {
553+ let $l = currentPools
554+ let $s = size($l)
555+ let $acc0 = nil
556+ func $f2_1 ($a,$i) = if (($i >= $s))
557+ then $a
558+ else changeHeightEntry($a, $l[$i])
559+
560+ func $f2_2 ($a,$i) = if (($i >= $s))
561+ then $a
562+ else throw("List size exceeds 10")
563+
564+ $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)
565+ }
566+ let sumRewardCurrentTemp = {
567+ let $l = currentRewards
568+ let $s = size($l)
569+ let $acc0 = 0
570+ func $f3_1 ($a,$i) = if (($i >= $s))
571+ then $a
572+ else sum($a, $l[$i])
573+
574+ func $f3_2 ($a,$i) = if (($i >= $s))
575+ then $a
576+ else throw("List size exceeds 10")
577+
578+ $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)
579+ }
580+ let $t02055420665 = getSumReward(sumRewardCurrentTemp, pagination)
581+ let sumRewardCurrent = $t02055420665._1
582+ let rewardUpdateHeightFirstPaginationEntry = $t02055420665._2
583+ let rewardUpdateHeightEntry = if ((pagination == 2))
584+ then [IntegerEntry(kRewardUpdateHeight, rewardUpdateHeight)]
585+ else nil
586+ if ((height > rewardUpdateHeight))
587+ then throw("rewardUpdateHeight < height")
588+ else (((((previousRewardEntryNew ++ currentRewardEntryNew) ++ heightEntryNewCur) ++ sumRewardCurrent) ++ rewardUpdateHeightEntry) ++ rewardUpdateHeightFirstPaginationEntry)
589+ }
590+ })
599591
600592
601593
602594 @Callable(i)
603-func activate () = if (isActive)
595+func shutdown () = valueOrElse(isAdminCall(i), if (!(active))
596+ then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified")))
597+ else suspend("Paused by admin"))
598+
599+
600+
601+@Callable(i)
602+func activate () = valueOrElse(isAdminCall(i), if (active)
604603 then throw("DApp is already active")
605- else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
606- then throw("Only admin can call this function")
607- else [BooleanEntry(kActive, true), DeleteEntry(kCause)]
604+ else [BooleanEntry(kActive, true), DeleteEntry(kCause)])
608605
609606
610607 @Verifier(tx)
611608 func verify () = {
612609 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
613610 then 1
614611 else 0
615612 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
616613 then 1
617614 else 0
618615 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
619616 then 1
620617 else 0
621618 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
622619 }
623620

github/deemru/w8io/873ac7e 
142.81 ms