tx · 41WXnGFiJ7c7WMKXnLj314dNjgpCKN55kN9eRTeCcErN

3MsxHxruYWoddB4HRiPBYAWtMXMtCF1V9XT:  -0.02700000 Waves

2022.06.24 13:33 [2110372] smart account 3MsxHxruYWoddB4HRiPBYAWtMXMtCF1V9XT > SELF 0.00000000 Waves

{ "type": 13, "id": "41WXnGFiJ7c7WMKXnLj314dNjgpCKN55kN9eRTeCcErN", "fee": 2700000, "feeAssetId": null, "timestamp": 1656066813229, "version": 2, "chainId": 84, "sender": "3MsxHxruYWoddB4HRiPBYAWtMXMtCF1V9XT", "senderPublicKey": "3ijdmxaYrpDFsKVbQH2kvB7i6JzHj9bep9bGWiQPra2D", "proofs": [ "24NmE3pQMuKoKC3THxzQYNZKZu2JmC7jeoNJBjDWYWuKeVwrP7iPtug8YNpmE33KipqSuRBLRqj7mtcBrcxpQbog", "42eLu91qcuJpTBvsiZm4doWgyEuL8pLEXqXkzkbhvLJBio7sUK7Qh1avKV9mDPDK6fw16Rtvr7XZoPxGQktHHiWE" ], "script": "base64:BgIlCAISAwoBCBIDCgEIEgMKAQgSAwoBCBIECgIIARIDCgEIEgASAFsADGFkbWluUHViS2V5MQEg4qeMQDuGzRfmtEuH2+Whg6yuKqHsNy5eZQUT8rXs7wQADGFkbWluUHViS2V5MgEg6jisuQG1iDxyo54oPYHUGiJlERON346DjXz9V/GbEVkADGFkbWluUHViS2V5MwEgpzSWgrCjycddMmIBfztFJ08z6r82xAHPELd0cKonzG4AFGtleVNoYXJlVG9rZW5zTG9ja2VkAhpfdG90YWxfc2hhcmVfdG9rZW5zX2xvY2tlZAALa1NoYXJlTGltaXQCHHNoYXJlX2xpbWl0X29uX2ZpcnN0X2hhcnZlc3QACWtleUFjdGl2ZQIGYWN0aXZlAAhrZXlDYXVzZQIOc2h1dGRvd25fY2F1c2UAHGtleVJld2FyZFBvb2xGcmFjdGlvbkN1cnJlbnQCHV9jdXJyZW50X3Bvb2xfZnJhY3Rpb25fcmV3YXJkAB1rZXlSZXdhcmRQb29sRnJhY3Rpb25QcmV2aW91cwIeX3ByZXZpb3VzX3Bvb2xfZnJhY3Rpb25fcmV3YXJkABVrZXlIZWlnaHRQb29sRnJhY3Rpb24CGl9wb29sX3Jld2FyZF91cGRhdGVfaGVpZ2h0AB1rZXlUb3RhbFJld2FyZFBlckJsb2NrQ3VycmVudAIedG90YWxfcmV3YXJkX3Blcl9ibG9ja19jdXJyZW50AB5rZXlUb3RhbFJld2FyZFBlckJsb2NrUHJldmlvdXMCH3RvdGFsX3Jld2FyZF9wZXJfYmxvY2tfcHJldmlvdXMAFWtleVJld2FyZFVwZGF0ZUhlaWdodAIUcmV3YXJkX3VwZGF0ZV9oZWlnaHQAD2tleUxhc3RJbnRlcmVzdAIOX2xhc3RfaW50ZXJlc3QAFWtleUxhc3RJbnRlcmVzdEhlaWdodAIVX2xhc3RfaW50ZXJlc3RfaGVpZ2h0ABhrZXlVc2VyU2hhcmVUb2tlbnNMb2NrZWQCFF9zaGFyZV90b2tlbnNfbG9ja2VkABNrZXlVc2VyTGFzdEludGVyZXN0Ag5fbGFzdF9pbnRlcmVzdAAJa2V5U1dPUGlkAgdTV09QX2lkABhrZXlVc2VyU1dPUENsYWltZWRBbW91bnQCFF9TV09QX2NsYWltZWRfYW1vdW50ABxrZXlVc2VyU1dPUExhc3RDbGFpbWVkQW1vdW50AhlfU1dPUF9sYXN0X2NsYWltZWRfYW1vdW50ABBrZXlBdmFpbGFibGVTV09QAg9fYXZhaWxhYmxlX1NXT1AAFWtleUZhcm1pbmdTdGFydEhlaWdodAIUZmFybWluZ19zdGFydF9oZWlnaHQABmtleUFQWQIDYXB5ABZrUHJldmlvdXNUb3RhbFZvdGVTV09QAhhwcmV2aW91c190b3RhbF92b3RlX1NXT1AAE2tleVN3b3BZZWFyRW1pc3Npb24CEnN3b3BfeWVhcl9lbWlzc2lvbgAPa2V5QmFsYW5jZWNwbW1BAg9BX2Fzc2V0X2JhbGFuY2UAD2tleUJhbGFuY2VjcG1tQgIPQl9hc3NldF9iYWxhbmNlACFrSGFydmVzdFBvb2xBY3RpdmVWb3RlU3RydWNWb3RpbmcCHl9oYXJ2ZXN0X3Bvb2xfYWN0aXZlVm90ZV9zdHJ1YwAla0hhcnZlc3RVc2VyUG9vbEFjdGl2ZVZvdGVTdHJ1Y1ZvdGluZwIjX2hhcnZlc3RfdXNlcl9wb29sX2FjdGl2ZVZvdGVfc3RydWMAGWtleUxpbWl0U2hhcmVGaXJzdEhhcnZlc3QCHHNoYXJlX2xpbWl0X29uX2ZpcnN0X2hhcnZlc3QAC2tleUFzc2V0SWRBAgpBX2Fzc2V0X2lkAAtrZXlBc3NldElkQgIKQl9hc3NldF9pZAAVa2V5Rmlyc3RIYXJ2ZXN0SGVpZ2h0AhRmaXJzdF9oYXJ2ZXN0X2hlaWdodAATa2V5Zmlyc3RIYXJ2ZXN0Q3BtbQINZmlyc3RfaGFydmVzdAAOa2V5VGVtcFByZXZTdW0CE3N1bV9yZXdhcmRfcHJldmlvdXMADWtleVRlbXBDdXJTdW0CEnN1bV9yZXdhcmRfY3VycmVudAARZ292ZXJuYW5jZUFkZHJlc3MJAQdBZGRyZXNzAQEaAVSq+mnegfQTUoXKPy46iFGzGeqYHFnyDS0ABndhbGxldAkBB0FkZHJlc3MBARoBVN89S5eJWFneFeDkUQtW3T16X721f4UhiQANdm90aW5nQWRkcmVzcwkBB0FkZHJlc3MBARoBVBo2ft9Xop0naVz+v/cm1Of7ocNoPiDKfwAcYWRtaW5JbmNyZWFzZUludGVyZXN0QWRkcmVzcwkBB0FkZHJlc3MBARoBVN89S5eJWFneFeDkUQtW3T16X721f4UhiQAOb25lV2Vla0luQmxvY2sA+k4ADnRvdGFsVm90ZVNoYXJlAIDIr6AlAAtzY2FsZVZhbHVlMQAKAAtzY2FsZVZhbHVlMwDoBwALc2NhbGVWYWx1ZTUAoI0GAAtzY2FsZVZhbHVlNgDAhD0AC3NjYWxlVmFsdWU4AIDC1y8ADHNjYWxlVmFsdWUxMQCA0NvD9AIBC3N0ckFzc2V0SWRBAQRwb29sCQERQGV4dHJOYXRpdmUoMTA1MykCBQRwb29sBQtrZXlBc3NldElkQQELc3RyQXNzZXRJZEIBBHBvb2wJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHBvb2wFC2tleUFzc2V0SWRCAQhhc3NldElkQQEEcG9vbAMJAAACCQELc3RyQXNzZXRJZEEBBQRwb29sAgVXQVZFUwUEdW5pdAkA2QQBCQELc3RyQXNzZXRJZEEBBQRwb29sAQhhc3NldElkQgEEcG9vbAMJAAACCQELc3RyQXNzZXRJZEIBBQRwb29sAgVXQVZFUwUEdW5pdAkA2QQBCQELc3RyQXNzZXRJZEIBBQRwb29sAAtrQmFzZVBlcmlvZAILYmFzZV9wZXJpb2QADWtQZXJpb2RMZW5ndGgCDXBlcmlvZF9sZW5ndGgADGtTdGFydEhlaWdodAIMc3RhcnRfaGVpZ2h0ABNrRmlyc3RIYXJ2ZXN0SGVpZ2h0AhRmaXJzdF9oYXJ2ZXN0X2hlaWdodAAWa0R1cmF0aW9uRnVsbFZvdGVQb3dlcgIYZHVyYXRpb25fZnVsbF92b3RlX3Bvd2VyAA1rTWluVm90ZVBvd2VyAg5taW5fdm90ZV9wb3dlcgAKYmFzZVBlcmlvZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFDXZvdGluZ0FkZHJlc3MFC2tCYXNlUGVyaW9kAhFFbXB0eSBrQmFzZVBlcmlvZAALc3RhcnRIZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ12b3RpbmdBZGRyZXNzBQxrU3RhcnRIZWlnaHQCEkVtcHR5IGtTdGFydEhlaWdodAAMcGVyaW9kTGVuZ3RoCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNdm90aW5nQWRkcmVzcwUNa1BlcmlvZExlbmd0aAITRW1wdHkga1BlcmlvZExlbmd0aAAVZHVyYXRpb25GdWxsVm90ZVBvd2VyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNdm90aW5nQWRkcmVzcwUWa0R1cmF0aW9uRnVsbFZvdGVQb3dlcgIcRW1wdHkga0R1cmF0aW9uRnVsbFZvdGVQb3dlcgAMbWluVm90ZVBvd2VyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUNdm90aW5nQWRkcmVzcwUNa01pblZvdGVQb3dlcgITRW1wdHkga01pblZvdGVQb3dlcgAIaXNBY3RpdmUJARFAZXh0ck5hdGl2ZSgxMDUxKQIFBHRoaXMFCWtleUFjdGl2ZQAKY3VyclBlcmlvZAkAZAIFCmJhc2VQZXJpb2QJAGkCCQBlAgUGaGVpZ2h0BQtzdGFydEhlaWdodAUMcGVyaW9kTGVuZ3RoAQ1nZXRMaW1pdFRva2VuAQRwb29sCQELdmFsdWVPckVsc2UCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQRwb29sBRlrZXlMaW1pdFNoYXJlRmlyc3RIYXJ2ZXN0AAAAA0FQWQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwUGa2V5QVBZABBTd29wWWVhckVtaXNzaW9uCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzBRNrZXlTd29wWWVhckVtaXNzaW9uAQphc3NldE5hbWVBAQRwb29sBAckbWF0Y2gwCQEIYXNzZXRJZEEBBQRwb29sAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCAkBBXZhbHVlAQkA7AcBBQJpZARuYW1lAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwAgVXQVZFUwkAAgECC01hdGNoIGVycm9yAQphc3NldE5hbWVCAQRwb29sBAckbWF0Y2gwCQEIYXNzZXRJZEIBBQRwb29sAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmlkBQckbWF0Y2gwCAkBBXZhbHVlAQkA7AcBBQJpZARuYW1lAwkAAQIFByRtYXRjaDACBFVuaXQEBXdhdmVzBQckbWF0Y2gwAgVXQVZFUwkAAgECC01hdGNoIGVycm9yAARTV09QCQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFCWtleVNXT1BpZAEOaXNGaXJzdEhhcnZlc3QBBHBvb2wJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEcG9vbAUTa2V5Zmlyc3RIYXJ2ZXN0Q3BtbQcBFWdldEhlaWdodEZpcnN0SGFydmVzdAEEcG9vbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQRwb29sBRVrZXlGaXJzdEhhcnZlc3RIZWlnaHQAAAELZ2V0QmFsYW5jZUEBBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQRwb29sBQ9rZXlCYWxhbmNlY3BtbUEJAKwCAgIUTm8gZGF0YSBvbiB0aGUga2V5OiAFD2tleUJhbGFuY2VjcG1tQQELZ2V0QmFsYW5jZUIBBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQRwb29sBQ9rZXlCYWxhbmNlY3BtbUIJAKwCAgIUTm8gZGF0YSBvbiB0aGUga2V5OiAFD2tleUJhbGFuY2VjcG1tQgESZ2V0U2hhcmVMaW1pdFRva2VuAQRwb29sCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEcG9vbAULa1NoYXJlTGltaXQJAKwCAgIUTm8gZGF0YSBvbiB0aGUga2V5OiAFC2tTaGFyZUxpbWl0ARhnZXRUb3RhbFNoYXJlVG9rZW5Mb2NrZWQBBHBvb2wJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIFBHBvb2wFFGtleVNoYXJlVG9rZW5zTG9ja2VkCQCsAgIJAKwCAgIUTm8gZGF0YSBvbiB0aGUga2V5OiAFBHBvb2wFFGtleVNoYXJlVG9rZW5zTG9ja2VkAQ9nZXRTaGFyZUFzc2V0SWQBBHBvb2wJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBBXZhbHVlAQkApggBBQRwb29sAg5zaGFyZV9hc3NldF9pZAEOYWNjb3VudEJhbGFuY2UBB2Fzc2V0SWQEByRtYXRjaDAFB2Fzc2V0SWQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCaWQFByRtYXRjaDAJAPAHAgUEdGhpcwUCaWQDCQABAgUHJG1hdGNoMAIEVW5pdAQFd2F2ZXMFByRtYXRjaDAICQDvBwEFBHRoaXMJYXZhaWxhYmxlCQACAQILTWF0Y2ggZXJyb3IBDGdldEFzc2V0SW5mbwEHYXNzZXRJZAQHJG1hdGNoMAUHYXNzZXRJZAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJpZAUHJG1hdGNoMAQIc3RyaW5nSWQJANgEAQUCaWQEBGluZm8JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkA7AcBBQJpZAkArAICCQCsAgICBkFzc2V0IAUIc3RyaW5nSWQCDiBkb2Vzbid0IGV4aXN0CQCVCgMFCHN0cmluZ0lkCAUEaW5mbwRuYW1lCAUEaW5mbwhkZWNpbWFscwMJAAECBQckbWF0Y2gwAgRVbml0BAV3YXZlcwUHJG1hdGNoMAkAlQoDAgVXQVZFUwIFV0FWRVMACAkAAgECC01hdGNoIGVycm9yAQ5jYWxjU2NhbGVWYWx1ZQIIYXNzZXRJZDEIYXNzZXRJZDIEEGFzc2V0SWQxRGVjaW1hbHMICQEFdmFsdWUBCQDsBwEFCGFzc2V0SWQxCGRlY2ltYWxzBBBhc3NldElkMkRlY2ltYWxzCAkBBXZhbHVlAQkA7AcBBQhhc3NldElkMghkZWNpbWFscwQLc2NhbGVEaWdpdHMJAGQCCQBlAgUQYXNzZXRJZDJEZWNpbWFscwUQYXNzZXRJZDFEZWNpbWFscwAICQBsBgAKAAAFC3NjYWxlRGlnaXRzAAAAAAUERE9XTgERdXNlckF2YWlsYWJsZVNXT1ACBHBvb2wEdXNlcgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfCQClCAEFBHVzZXIFEGtleUF2YWlsYWJsZVNXT1AAAAEKcmV3YXJkSW5mbwEEcG9vbAQadG90YWxSZXdhcmRQZXJCbG9ja0N1cnJlbnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRFnb3Zlcm5hbmNlQWRkcmVzcwUda2V5VG90YWxSZXdhcmRQZXJCbG9ja0N1cnJlbnQJAKwCAgkArAICCQCsAgICFE5vIGRhdGEgb24gdGhlIGtleTogBR1rZXlUb3RhbFJld2FyZFBlckJsb2NrQ3VycmVudAIMIGF0IGFkZHJlc3MgCQClCAEFEWdvdmVybmFuY2VBZGRyZXNzBBt0b3RhbFJld2FyZFBlckJsb2NrUHJldmlvdXMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRFnb3Zlcm5hbmNlQWRkcmVzcwUea2V5VG90YWxSZXdhcmRQZXJCbG9ja1ByZXZpb3VzCQCsAgIJAKwCAgkArAICAhRObyBkYXRhIG9uIHRoZSBrZXk6IAUea2V5VG90YWxSZXdhcmRQZXJCbG9ja1ByZXZpb3VzAgwgYXQgYWRkcmVzcyAJAKUIAQURZ292ZXJuYW5jZUFkZHJlc3MEGXJld2FyZFBvb2xGcmFjdGlvbkN1cnJlbnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRFnb3Zlcm5hbmNlQWRkcmVzcwkArAICBQRwb29sBRxrZXlSZXdhcmRQb29sRnJhY3Rpb25DdXJyZW50CQCsAgIJAKwCAgkArAICCQCsAgICFE5vIGRhdGEgb24gdGhlIGtleTogBQRwb29sBRxrZXlSZXdhcmRQb29sRnJhY3Rpb25DdXJyZW50AgwgYXQgYWRkcmVzcyAJAKUIAQURZ292ZXJuYW5jZUFkZHJlc3MEEnJld2FyZFVwZGF0ZUhlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFEWdvdmVybmFuY2VBZGRyZXNzBRVrZXlSZXdhcmRVcGRhdGVIZWlnaHQJAKwCAgkArAICCQCsAgICFE5vIGRhdGEgb24gdGhlIGtleTogBRVrZXlSZXdhcmRVcGRhdGVIZWlnaHQCDCBhdCBhZGRyZXNzIAkApQgBBRFnb3Zlcm5hbmNlQWRkcmVzcwQWcG9vbFJld2FyZFVwZGF0ZUhlaWdodAkBC3ZhbHVlT3JFbHNlAgkAmggCBRFnb3Zlcm5hbmNlQWRkcmVzcwkArAICBQRwb29sBRVrZXlIZWlnaHRQb29sRnJhY3Rpb24AAAQacmV3YXJkUG9vbEZyYWN0aW9uUHJldmlvdXMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRFnb3Zlcm5hbmNlQWRkcmVzcwkArAICBQRwb29sBR1rZXlSZXdhcmRQb29sRnJhY3Rpb25QcmV2aW91cwkArAICCQCsAgIJAKwCAgkArAICAhRObyBkYXRhIG9uIHRoZSBrZXk6IAUEcG9vbAUda2V5UmV3YXJkUG9vbEZyYWN0aW9uUHJldmlvdXMCDCBhdCBhZGRyZXNzIAkApQgBBRFnb3Zlcm5hbmNlQWRkcmVzcwQRcmV3YXJkUG9vbEN1cnJlbnQJAGsDBRp0b3RhbFJld2FyZFBlckJsb2NrQ3VycmVudAUZcmV3YXJkUG9vbEZyYWN0aW9uQ3VycmVudAUOdG90YWxWb3RlU2hhcmUEEnJld2FyZFBvb2xQcmV2aW91cwkAawMFG3RvdGFsUmV3YXJkUGVyQmxvY2tQcmV2aW91cwUacmV3YXJkUG9vbEZyYWN0aW9uUHJldmlvdXMFDnRvdGFsVm90ZVNoYXJlAwMJAGYCBRFyZXdhcmRQb29sQ3VycmVudAUadG90YWxSZXdhcmRQZXJCbG9ja0N1cnJlbnQGCQBmAgUScmV3YXJkUG9vbFByZXZpb3VzBRt0b3RhbFJld2FyZFBlckJsb2NrUHJldmlvdXMJAAIBAmJyZXdhcmRQb29sQ3VycmVudCA+IHRvdGFsUmV3YXJkUGVyQmxvY2tDdXJyZW50IG9yIHJld2FyZFBvb2xQcmV2aW91cyA+IHRvdGFsUmV3YXJkUGVyQmxvY2tQcmV2aW91cwkAlgoEBRFyZXdhcmRQb29sQ3VycmVudAUScmV3YXJkVXBkYXRlSGVpZ2h0BRJyZXdhcmRQb29sUHJldmlvdXMFFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQBE2dldExhc3RJbnRlcmVzdEluZm8BBHBvb2wEDGxhc3RJbnRlcmVzdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUPa2V5TGFzdEludGVyZXN0CQCsAgIJAKwCAgIUTm8gZGF0YSBvbiB0aGUga2V5OiAFBHBvb2wFD2tleUxhc3RJbnRlcmVzdAQSbGFzdEludGVyZXN0SGVpZ2h0CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUEcG9vbAUVa2V5TGFzdEludGVyZXN0SGVpZ2h0BQZoZWlnaHQJAJQKAgUSbGFzdEludGVyZXN0SGVpZ2h0BQxsYXN0SW50ZXJlc3QBE2dldFVzZXJJbnRlcmVzdEluZm8CBHBvb2wLdXNlckFkZHJlc3MEEHVzZXJMYXN0SW50ZXJlc3QJAJoIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwkApQgBBQt1c2VyQWRkcmVzcwUTa2V5VXNlckxhc3RJbnRlcmVzdAQJdXNlclNoYXJlCQCaCAIFBHRoaXMJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8JAKUIAQULdXNlckFkZHJlc3MFGGtleVVzZXJTaGFyZVRva2Vuc0xvY2tlZAQMbGFzdEludGVyZXN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICBQRwb29sBQ9rZXlMYXN0SW50ZXJlc3QJAKwCAgkArAICAhRObyBkYXRhIG9uIHRoZSBrZXk6IAUEcG9vbAUPa2V5TGFzdEludGVyZXN0BBV1c2VyTGFzdEludGVyZXN0VmFsdWUEByRtYXRjaDAFEHVzZXJMYXN0SW50ZXJlc3QDCQABAgUHJG1hdGNoMAIDSW50BBB1c2VyTGFzdEludGVyZXN0BQckbWF0Y2gwBRB1c2VyTGFzdEludGVyZXN0BQxsYXN0SW50ZXJlc3QEFXVzZXJTaGFyZVRva2Vuc0Ftb3VudAQHJG1hdGNoMAUJdXNlclNoYXJlAwkAAQIFByRtYXRjaDACA0ludAQJdXNlclNoYXJlBQckbWF0Y2gwBQl1c2VyU2hhcmUAAAkAlAoCBRV1c2VyTGFzdEludGVyZXN0VmFsdWUFFXVzZXJTaGFyZVRva2Vuc0Ftb3VudAEMY2FsY0ludGVyZXN0ChJsYXN0SW50ZXJlc3RIZWlnaHQScmV3YXJkVXBkYXRlSGVpZ2h0FnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQMbGFzdEludGVyZXN0FWN1cnJlbnRSZXdhcmRQZXJCbG9jaxBzaGFyZVRva2VuTG9ja2VkFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sMc2hhcmVBc3NldElkCnNjYWxlVmFsdWUJcG10QW1vdW50AwkAAAIFEHNoYXJlVG9rZW5Mb2NrZWQAAAAAAwkBAiE9AgUWcG9vbFJld2FyZFVwZGF0ZUhlaWdodAAAAwMJAGYCBRJyZXdhcmRVcGRhdGVIZWlnaHQFBmhlaWdodAkAAAIFEnJld2FyZFVwZGF0ZUhlaWdodAUWcG9vbFJld2FyZFVwZGF0ZUhlaWdodAcEBnJld2FyZAkAaAIFFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sJAGUCBQZoZWlnaHQFEmxhc3RJbnRlcmVzdEhlaWdodAkAZAIFDGxhc3RJbnRlcmVzdAkAawMFBnJld2FyZAUKc2NhbGVWYWx1ZQUQc2hhcmVUb2tlbkxvY2tlZAMDCQBmAgUGaGVpZ2h0BRJyZXdhcmRVcGRhdGVIZWlnaHQJAQIhPQIFEnJld2FyZFVwZGF0ZUhlaWdodAUWcG9vbFJld2FyZFVwZGF0ZUhlaWdodAcEBnJld2FyZAkAaAIFFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sJAGUCBQZoZWlnaHQFEmxhc3RJbnRlcmVzdEhlaWdodAkAZAIFDGxhc3RJbnRlcmVzdAkAawMFBnJld2FyZAUKc2NhbGVWYWx1ZQUQc2hhcmVUb2tlbkxvY2tlZAMDAwkAZgIFBmhlaWdodAUScmV3YXJkVXBkYXRlSGVpZ2h0CQAAAgUScmV3YXJkVXBkYXRlSGVpZ2h0BRZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0BwkAZgIFEmxhc3RJbnRlcmVzdEhlaWdodAUScmV3YXJkVXBkYXRlSGVpZ2h0BwQGcmV3YXJkCQBoAgUVY3VycmVudFJld2FyZFBlckJsb2NrCQBlAgUGaGVpZ2h0BRJsYXN0SW50ZXJlc3RIZWlnaHQJAGQCBQxsYXN0SW50ZXJlc3QJAGsDBQZyZXdhcmQFCnNjYWxlVmFsdWUFEHNoYXJlVG9rZW5Mb2NrZWQEKnJld2FyZEFmdGVyTGFzdEludGVyZXN0QmVmb3JlUmVhd2FyZFVwZGF0ZQkAaAIFFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sJAGUCBRJyZXdhcmRVcGRhdGVIZWlnaHQFEmxhc3RJbnRlcmVzdEhlaWdodAQTaW50ZXJlc3RBZnRlclVwZGF0ZQkAZAIFDGxhc3RJbnRlcmVzdAkAawMFKnJld2FyZEFmdGVyTGFzdEludGVyZXN0QmVmb3JlUmVhd2FyZFVwZGF0ZQUKc2NhbGVWYWx1ZQUQc2hhcmVUb2tlbkxvY2tlZAQGcmV3YXJkCQBoAgUVY3VycmVudFJld2FyZFBlckJsb2NrCQBlAgUGaGVpZ2h0BRJyZXdhcmRVcGRhdGVIZWlnaHQJAGQCBRNpbnRlcmVzdEFmdGVyVXBkYXRlCQBrAwUGcmV3YXJkBQpzY2FsZVZhbHVlBRBzaGFyZVRva2VuTG9ja2VkAwkAZgIFEnJld2FyZFVwZGF0ZUhlaWdodAUGaGVpZ2h0BAZyZXdhcmQJAGgCBRZwcmV2aW91c1Jld2FyZFBlckJsb2NrCQBlAgUGaGVpZ2h0BRJsYXN0SW50ZXJlc3RIZWlnaHQJAGQCBQxsYXN0SW50ZXJlc3QJAGsDBQZyZXdhcmQFCnNjYWxlVmFsdWUFEHNoYXJlVG9rZW5Mb2NrZWQDCQBmAgUSbGFzdEludGVyZXN0SGVpZ2h0BRJyZXdhcmRVcGRhdGVIZWlnaHQEBnJld2FyZAkAaAIFFWN1cnJlbnRSZXdhcmRQZXJCbG9jawkAZQIFBmhlaWdodAUSbGFzdEludGVyZXN0SGVpZ2h0CQBkAgUMbGFzdEludGVyZXN0CQBrAwUGcmV3YXJkBQpzY2FsZVZhbHVlBRBzaGFyZVRva2VuTG9ja2VkBCpyZXdhcmRBZnRlckxhc3RJbnRlcmVzdEJlZm9yZVJlYXdhcmRVcGRhdGUJAGgCBRZwcmV2aW91c1Jld2FyZFBlckJsb2NrCQBlAgUScmV3YXJkVXBkYXRlSGVpZ2h0BRJsYXN0SW50ZXJlc3RIZWlnaHQEE2ludGVyZXN0QWZ0ZXJVcGRhdGUJAGQCBQxsYXN0SW50ZXJlc3QJAGsDBSpyZXdhcmRBZnRlckxhc3RJbnRlcmVzdEJlZm9yZVJlYXdhcmRVcGRhdGUFCnNjYWxlVmFsdWUFEHNoYXJlVG9rZW5Mb2NrZWQEBnJld2FyZAkAaAIFFWN1cnJlbnRSZXdhcmRQZXJCbG9jawkAZQIFBmhlaWdodAUScmV3YXJkVXBkYXRlSGVpZ2h0CQBkAgUTaW50ZXJlc3RBZnRlclVwZGF0ZQkAawMFBnJld2FyZAUKc2NhbGVWYWx1ZQUQc2hhcmVUb2tlbkxvY2tlZAEJY2xhaW1DYWxjAwRwb29sBmNhbGxlcglwbXRBbW91bnQEDHNoYXJlQXNzZXRJZAkBD2dldFNoYXJlQXNzZXRJZAEFBHBvb2wECnNjYWxlVmFsdWUJAQ5jYWxjU2NhbGVWYWx1ZQIFBFNXT1AFDHNoYXJlQXNzZXRJZAQQc2hhcmVUb2tlbkxvY2tlZAkBGGdldFRvdGFsU2hhcmVUb2tlbkxvY2tlZAEFBHBvb2wEDSR0MDEzMDkxMTMxNTYJARNnZXRMYXN0SW50ZXJlc3RJbmZvAQUEcG9vbAQSbGFzdEludGVyZXN0SGVpZ2h0CAUNJHQwMTMwOTExMzE1NgJfMQQMbGFzdEludGVyZXN0CAUNJHQwMTMwOTExMzE1NgJfMgQNJHQwMTMxNjExMzI3MwkBCnJld2FyZEluZm8BBQRwb29sBBVjdXJyZW50UmV3YXJkUGVyQmxvY2sIBQ0kdDAxMzE2MTEzMjczAl8xBBJyZXdhcmRVcGRhdGVIZWlnaHQIBQ0kdDAxMzE2MTEzMjczAl8yBBZwcmV2aW91c1Jld2FyZFBlckJsb2NrCAUNJHQwMTMxNjExMzI3MwJfMwQWcG9vbFJld2FyZFVwZGF0ZUhlaWdodAgFDSR0MDEzMTYxMTMyNzMCXzQEDSR0MDEzMjc4MTMzNTcJARNnZXRVc2VySW50ZXJlc3RJbmZvAgUEcG9vbAUGY2FsbGVyBBB1c2VyTGFzdEludGVyZXN0CAUNJHQwMTMyNzgxMzM1NwJfMQQVdXNlclNoYXJlVG9rZW5zQW1vdW50CAUNJHQwMTMyNzgxMzM1NwJfMgQPY3VycmVudEludGVyZXN0CQEMY2FsY0ludGVyZXN0CgUSbGFzdEludGVyZXN0SGVpZ2h0BRJyZXdhcmRVcGRhdGVIZWlnaHQFFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQFDGxhc3RJbnRlcmVzdAUVY3VycmVudFJld2FyZFBlckJsb2NrBRBzaGFyZVRva2VuTG9ja2VkBRZwcmV2aW91c1Jld2FyZFBlckJsb2NrBQxzaGFyZUFzc2V0SWQFCnNjYWxlVmFsdWUFCXBtdEFtb3VudAQLY2xhaW1BbW91bnQJAGsDBRV1c2VyU2hhcmVUb2tlbnNBbW91bnQJAGUCBQ9jdXJyZW50SW50ZXJlc3QFEHVzZXJMYXN0SW50ZXJlc3QFCnNjYWxlVmFsdWUED3VzZXJOZXdJbnRlcmVzdAUPY3VycmVudEludGVyZXN0CQCWCgQFD3VzZXJOZXdJbnRlcmVzdAUPY3VycmVudEludGVyZXN0BQtjbGFpbUFtb3VudAUVdXNlclNoYXJlVG9rZW5zQW1vdW50ARdjYWxjdWxhdGVQcm90b2NvbFJld2FyZAEEcG9vbAQNJHQwMTM4NzUxMzk0MAkBE2dldExhc3RJbnRlcmVzdEluZm8BBQRwb29sBBJsYXN0SW50ZXJlc3RIZWlnaHQIBQ0kdDAxMzg3NTEzOTQwAl8xBAxsYXN0SW50ZXJlc3QIBQ0kdDAxMzg3NTEzOTQwAl8yBA0kdDAxMzk0NTE0MDU2CQEKcmV3YXJkSW5mbwEFBHBvb2wEFWN1cnJlbnRSZXdhcmRQZXJCbG9jawgFDSR0MDEzOTQ1MTQwNTYCXzEEEnJld2FyZFVwZGF0ZUhlaWdodAgFDSR0MDEzOTQ1MTQwNTYCXzIEFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sIBQ0kdDAxMzk0NTE0MDU2Al8zBBZwb29sUmV3YXJkVXBkYXRlSGVpZ2h0CAUNJHQwMTM5NDUxNDA1NgJfNAQQc2hhcmVUb2tlbkxvY2tlZAkBGGdldFRvdGFsU2hhcmVUb2tlbkxvY2tlZAEFBHBvb2wDAwkAAAIFEHNoYXJlVG9rZW5Mb2NrZWQAAAkAAAIFFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQAAAcDCQBmAgUScmV3YXJkVXBkYXRlSGVpZ2h0BQZoZWlnaHQEBnJld2FyZAkAaAIFFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sJAGUCBQZoZWlnaHQFEmxhc3RJbnRlcmVzdEhlaWdodAUGcmV3YXJkAwkAZgIFEmxhc3RJbnRlcmVzdEhlaWdodAUScmV3YXJkVXBkYXRlSGVpZ2h0BAZyZXdhcmQJAGgCBRVjdXJyZW50UmV3YXJkUGVyQmxvY2sJAGUCBQZoZWlnaHQFEmxhc3RJbnRlcmVzdEhlaWdodAUGcmV3YXJkBCpyZXdhcmRBZnRlckxhc3RJbnRlcmVzdEJlZm9yZVJlYXdhcmRVcGRhdGUJAGgCBRZwcmV2aW91c1Jld2FyZFBlckJsb2NrCQBlAgUScmV3YXJkVXBkYXRlSGVpZ2h0BRJsYXN0SW50ZXJlc3RIZWlnaHQEBnJld2FyZAkAaAIFFWN1cnJlbnRSZXdhcmRQZXJCbG9jawkAZQIFBmhlaWdodAUScmV3YXJkVXBkYXRlSGVpZ2h0CQBkAgUGcmV3YXJkBSpyZXdhcmRBZnRlckxhc3RJbnRlcmVzdEJlZm9yZVJlYXdhcmRVcGRhdGUDAwkAAAIFEHNoYXJlVG9rZW5Mb2NrZWQAAAkBAiE9AgUWcG9vbFJld2FyZFVwZGF0ZUhlaWdodAAABwMDCQBmAgUScmV3YXJkVXBkYXRlSGVpZ2h0BQZoZWlnaHQJAAACBRJyZXdhcmRVcGRhdGVIZWlnaHQFFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQHBAZyZXdhcmQJAGgCBRZwcmV2aW91c1Jld2FyZFBlckJsb2NrCQBlAgUGaGVpZ2h0BRJsYXN0SW50ZXJlc3RIZWlnaHQFBnJld2FyZAMDCQBmAgUGaGVpZ2h0BRJyZXdhcmRVcGRhdGVIZWlnaHQJAQIhPQIFEnJld2FyZFVwZGF0ZUhlaWdodAUWcG9vbFJld2FyZFVwZGF0ZUhlaWdodAcEBnJld2FyZAkAaAIFFnByZXZpb3VzUmV3YXJkUGVyQmxvY2sJAGUCBQZoZWlnaHQFEmxhc3RJbnRlcmVzdEhlaWdodAUGcmV3YXJkAwMDCQBmAgUGaGVpZ2h0BRJyZXdhcmRVcGRhdGVIZWlnaHQJAAACBRJyZXdhcmRVcGRhdGVIZWlnaHQFFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQHCQBmAgUSbGFzdEludGVyZXN0SGVpZ2h0BRJyZXdhcmRVcGRhdGVIZWlnaHQHBAZyZXdhcmQJAGgCBRVjdXJyZW50UmV3YXJkUGVyQmxvY2sJAGUCBQZoZWlnaHQFEmxhc3RJbnRlcmVzdEhlaWdodAUGcmV3YXJkBCpyZXdhcmRBZnRlckxhc3RJbnRlcmVzdEJlZm9yZVJlYXdhcmRVcGRhdGUJAGgCBRZwcmV2aW91c1Jld2FyZFBlckJsb2NrCQBlAgUScmV3YXJkVXBkYXRlSGVpZ2h0BRJsYXN0SW50ZXJlc3RIZWlnaHQEBnJld2FyZAkAaAIFFWN1cnJlbnRSZXdhcmRQZXJCbG9jawkAZQIFBmhlaWdodAUScmV3YXJkVXBkYXRlSGVpZ2h0CQBkAgUGcmV3YXJkBSpyZXdhcmRBZnRlckxhc3RJbnRlcmVzdEJlZm9yZVJlYXdhcmRVcGRhdGUAAAEWY2hlY2tQbXRBc3NldElkQ29ycmVjdAIEcG9vbApwbXRBc3NldElkBBBwb29sU2hhcmVBc3NldElkCQDZBAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQV2YWx1ZQEJAKYIAQUEcG9vbAIOc2hhcmVfYXNzZXRfaWQDCQAAAgUKcG10QXNzZXRJZAUQcG9vbFNoYXJlQXNzZXRJZAYHARhnZXRVc2VyU1dPUENsYWltZWRBbW91bnQCBHBvb2wEdXNlcgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIJAKwCAgkArAICBQRwb29sAgFfCQClCAEFBHVzZXIFGGtleVVzZXJTV09QQ2xhaW1lZEFtb3VudAAAAQdzdXNwZW5kAQVjYXVzZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUJa2V5QWN0aXZlBwkAzAgCCQELU3RyaW5nRW50cnkCBQhrZXlDYXVzZQUFY2F1c2UFA25pbAgBaQEEaW5pdAEHZWFybHlMUAMJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMFCWtleVNXT1BpZAkAAgECGFNXT1AgYWxyZWFkeSBpbml0aWFsaXplZAQKaW5pdEFtb3VudACAgOmDsd4WBAlTV09QaXNzdWUJAMIIBQIEU1dPUAITU1dPUCBwcm90b2NvbCB0b2tlbgUKaW5pdEFtb3VudAAIBgQGU1dPUGlkCQC4CAEFCVNXT1Bpc3N1ZQkAzAgCCQEMQm9vbGVhbkVudHJ5AgUJa2V5QWN0aXZlBgkAzAgCCQDCCAUCBFNXT1ACE1NXT1AgcHJvdG9jb2wgdG9rZW4FCmluaXRBbW91bnQACAYJAMwIAgkBC1N0cmluZ0VudHJ5AgUJa2V5U1dPUGlkCQDYBAEFBlNXT1BpZAUDbmlsAWkBFGluaXRQb29sU2hhcmVGYXJtaW5nAQRwb29sAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIrT25seSB0aGUgREFwcCBpdHNlbGYgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgQNJHQwMTcwMzgxNzE0MQkBCnJld2FyZEluZm8BBQRwb29sBA1jdXJyZW50UmV3YXJkCAUNJHQwMTcwMzgxNzE0MQJfMQQScmV3YXJkVXBkYXRlSGVpZ2h0CAUNJHQwMTcwMzgxNzE0MQJfMgQWcHJldmlvdXNSZXdhcmRQZXJCbG9jawgFDSR0MDE3MDM4MTcxNDECXzMEFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQIBQ0kdDAxNzAzODE3MTQxAl80CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFGtleVNoYXJlVG9rZW5zTG9ja2VkAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUPa2V5TGFzdEludGVyZXN0AAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUEcG9vbAUVa2V5TGFzdEludGVyZXN0SGVpZ2h0BQZoZWlnaHQFA25pbAFpARJ1cGRhdGVQb29sSW50ZXJlc3QBBHBvb2wDCQECIT0CCAUBaQZjYWxsZXIFBndhbGxldAkAAgECLE9ubHkgdGhlIEFkbWluIGl0c2VsZiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uAwkBASEBBQhpc0FjdGl2ZQkAAgECH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQEDSR0MDE3NTUwMTc2NzAJAQljbGFpbUNhbGMDBQRwb29sBRxhZG1pbkluY3JlYXNlSW50ZXJlc3RBZGRyZXNzAAAED3VzZXJOZXdJbnRlcmVzdAgFDSR0MDE3NTUwMTc2NzACXzEED2N1cnJlbnRJbnRlcmVzdAgFDSR0MDE3NTUwMTc2NzACXzIEC2NsYWltQW1vdW50CAUNJHQwMTc1NTAxNzY3MAJfMwQVdXNlclNoYXJlVG9rZW5zQW1vdW50CAUNJHQwMTc1NTAxNzY3MAJfNAQNJHQwMTc2NzUxNzc3OAkBCnJld2FyZEluZm8BBQRwb29sBA1jdXJyZW50UmV3YXJkCAUNJHQwMTc2NzUxNzc3OAJfMQQScmV3YXJkVXBkYXRlSGVpZ2h0CAUNJHQwMTc2NzUxNzc3OAJfMgQWcHJldmlvdXNSZXdhcmRQZXJCbG9jawgFDSR0MDE3Njc1MTc3NzgCXzMEFnBvb2xSZXdhcmRVcGRhdGVIZWlnaHQIBQ0kdDAxNzY3NTE3Nzc4Al80CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFD2tleUxhc3RJbnRlcmVzdAUPdXNlck5ld0ludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFWtleUxhc3RJbnRlcmVzdEhlaWdodAUGaGVpZ2h0BQNuaWwBaQEPbG9ja1NoYXJlVG9rZW5zAQRwb29sBA0kdDAxNzk3MDE4MDQ1CQCUCgIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQECXBtdEFtb3VudAgFDSR0MDE3OTcwMTgwNDUCXzEECnBtdEFzc2V0SWQIBQ0kdDAxNzk3MDE4MDQ1Al8yBA0kdDAxODA1MDE4MTIzCQEMZ2V0QXNzZXRJbmZvAQUKcG10QXNzZXRJZAQNcG10U3RyQXNzZXRJZAgFDSR0MDE4MDUwMTgxMjMCXzEEDHBtdEFzc2V0TmFtZQgFDSR0MDE4MDUwMTgxMjMCXzIEC3BtdERlY2ltYWxzCAUNJHQwMTgwNTAxODEyMwJfMwQNJHQwMTgxMjgxODIzNgkBCWNsYWltQ2FsYwMFBHBvb2wIBQFpBmNhbGxlcgUJcG10QW1vdW50BA91c2VyTmV3SW50ZXJlc3QIBQ0kdDAxODEyODE4MjM2Al8xBA9jdXJyZW50SW50ZXJlc3QIBQ0kdDAxODEyODE4MjM2Al8yBAtjbGFpbUFtb3VudAgFDSR0MDE4MTI4MTgyMzYCXzMEFXVzZXJTaGFyZVRva2Vuc0Ftb3VudAgFDSR0MDE4MTI4MTgyMzYCXzQEEnVzZXJTaGFyZUFtb3VudE5ldwkAZAIFFXVzZXJTaGFyZVRva2Vuc0Ftb3VudAUJcG10QW1vdW50BBFhdmFpbGFibGVGdW5kc05ldwkAZAIJARF1c2VyQXZhaWxhYmxlU1dPUAIFBHBvb2wIBQFpBmNhbGxlcgULY2xhaW1BbW91bnQEEHRvdGFsU2hhcmVBbW91bnQJARhnZXRUb3RhbFNoYXJlVG9rZW5Mb2NrZWQBBQRwb29sBBN0b3RhbFNoYXJlQW1vdW50TmV3CQBkAgUQdG90YWxTaGFyZUFtb3VudAUJcG10QW1vdW50BBF1c2VyQ2xhaW1lZEFtb3VudAkBGGdldFVzZXJTV09QQ2xhaW1lZEFtb3VudAIFBHBvb2wIBQFpBmNhbGxlcgQUdXNlckNsYWltZWRBbW91bnROZXcJAGQCBRF1c2VyQ2xhaW1lZEFtb3VudAULY2xhaW1BbW91bnQECWJhc2VFbnRyeQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwkApQgBCAUBaQZjYWxsZXIFE2tleVVzZXJMYXN0SW50ZXJlc3QFD3VzZXJOZXdJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwkApQgBCAUBaQZjYWxsZXIFGGtleVVzZXJTaGFyZVRva2Vuc0xvY2tlZAUSdXNlclNoYXJlQW1vdW50TmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFGtleVNoYXJlVG9rZW5zTG9ja2VkBRN0b3RhbFNoYXJlQW1vdW50TmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFD2tleUxhc3RJbnRlcmVzdAUPY3VycmVudEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFWtleUxhc3RJbnRlcmVzdEhlaWdodAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfCQClCAEIBQFpBmNhbGxlcgUYa2V5VXNlclNXT1BDbGFpbWVkQW1vdW50BRR1c2VyQ2xhaW1lZEFtb3VudE5ldwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwkApQgBCAUBaQZjYWxsZXIFHGtleVVzZXJTV09QTGFzdENsYWltZWRBbW91bnQFC2NsYWltQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfCQClCAEIBQFpBmNhbGxlcgUQa2V5QXZhaWxhYmxlU1dPUAURYXZhaWxhYmxlRnVuZHNOZXcFA25pbAMJAGcCAAAFCXBtdEFtb3VudAkAAgECFFlvdSBjYW4ndCBsb2NrIHRva2VuAwkBASEBBQhpc0FjdGl2ZQkAAgECH0RBcHAgaXMgaW5hY3RpdmUgYXQgdGhpcyBtb21lbnQDCQEBIQEJARZjaGVja1BtdEFzc2V0SWRDb3JyZWN0AgUEcG9vbAUKcG10QXNzZXRJZAkAAgECFEluY29ycmVjdCBwbXRBc3NldElkAwMJAQ5pc0ZpcnN0SGFydmVzdAEJAQdBZGRyZXNzAQkA2QQBBQRwb29sCQBmAgkBFWdldEhlaWdodEZpcnN0SGFydmVzdAEJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQZoZWlnaHQHBA1oYXJ2ZXN0UGVyaW9kCQBlAgkAaQIJAGQCCQBlAgkBFWdldEhlaWdodEZpcnN0SGFydmVzdAEJAQdBZGRyZXNzAQkA2QQBBQRwb29sBQtzdGFydEhlaWdodAABBQxwZXJpb2RMZW5ndGgAAQQOYW1vdW50T2ZWb3RpbmcJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUNdm90aW5nQWRkcmVzcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8FBHBvb2wCEF91c2VyX3Bvb2xfc3RydWMCAV8EEGFtb3VudFBvb2xTdHJhY3QJALUJAgkBEUBleHRyTmF0aXZlKDEwNTMpAgUNdm90aW5nQWRkcmVzcwkArAICBQRwb29sAgtfcG9vbF9zdHJ1YwIBXwQeYW1vdW50QWN0aXZlVm90ZVVzZXJQb29sU3RyYWN0CQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUNdm90aW5nQWRkcmVzcwkArAICCQCsAgIJAKwCAgkApQgBCAUBaQZjYWxsZXICAV8FBHBvb2wFJWtIYXJ2ZXN0VXNlclBvb2xBY3RpdmVWb3RlU3RydWNWb3RpbmcCAAIBXwQaYW1vdW50UG9vbEFjdGl2ZVZvdGVTdHJhY3QJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ12b3RpbmdBZGRyZXNzCQCsAgIFBHBvb2wFIWtIYXJ2ZXN0UG9vbEFjdGl2ZVZvdGVTdHJ1Y1ZvdGluZwIAAgFfBBR1c2VyU2hhcmVUb2tlbkxvY2tlZAUVdXNlclNoYXJlVG9rZW5zQW1vdW50BBJ1c2VyUG9vbEFjdGl2ZVZvdGUDCQAAAgkApAMBBQpjdXJyUGVyaW9kCQCRAwIFDmFtb3VudE9mVm90aW5nAAIJAQt2YWx1ZU9yRWxzZQIJALYJAQkAkQMCBR5hbW91bnRBY3RpdmVWb3RlVXNlclBvb2xTdHJhY3QAAAAACQELdmFsdWVPckVsc2UCCQC2CQEJAJEDAgUOYW1vdW50T2ZWb3RpbmcAAQAABA5wb29sQWN0aXZlVm90ZQMJAAACCQCkAwEFCmN1cnJQZXJpb2QJAJEDAgUQYW1vdW50UG9vbFN0cmFjdAACCQELdmFsdWVPckVsc2UCCQC2CQEJAJEDAgUaYW1vdW50UG9vbEFjdGl2ZVZvdGVTdHJhY3QAAAAACQELdmFsdWVPckVsc2UCCQC2CQEJAJEDAgUQYW1vdW50UG9vbFN0cmFjdAABAAAEDnByb3RvY29sUmV3YXJkCQEXY2FsY3VsYXRlUHJvdG9jb2xSZXdhcmQBBQRwb29sAwkBAiE9AgUSdXNlclBvb2xBY3RpdmVWb3RlAAAED2xpbWl0U2hhcmVUb2tlbgkBEmdldFNoYXJlTGltaXRUb2tlbgEJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBHBvb2wECnNoYXJlVG9rZW4JAGUCCQBrAwUPbGltaXRTaGFyZVRva2VuBRJ1c2VyUG9vbEFjdGl2ZVZvdGUFDnBvb2xBY3RpdmVWb3RlBRR1c2VyU2hhcmVUb2tlbkxvY2tlZAMDCQBmAgkAkAMBBR5hbW91bnRBY3RpdmVWb3RlVXNlclBvb2xTdHJhY3QAAQkAZwIJAQt2YWx1ZU9yRWxzZQIJALYJAQkAkQMCBR5hbW91bnRBY3RpdmVWb3RlVXNlclBvb2xTdHJhY3QAAQAABQ1oYXJ2ZXN0UGVyaW9kBwkAAgECFVlvdSBjYW4ndCBzaGFyZSB0b2tlbgMJAGYCBQlwbXRBbW91bnQFD2xpbWl0U2hhcmVUb2tlbgkAAgEJAKwCAgIgWW91IGNhbid0IHNoYXJlIHRva2VuIG1vcmUgdGhhbiAJAKQDAQUPbGltaXRTaGFyZVRva2VuAwkAZgIFCnNoYXJlVG9rZW4AAAMJAGYCCQBrAwBjCQBkAgkBDmFjY291bnRCYWxhbmNlAQUKcG10QXNzZXRJZAUJcG10QW1vdW50AGQFE3RvdGFsU2hhcmVBbW91bnROZXcJAAIBAjJCYWxhbmNlIG9mIHNoYXJlLXRva2VuIGlzIGdyZWF0ZXIgdGhhbiB0b3RhbEFtb3VudAMJAAACBRB0b3RhbFNoYXJlQW1vdW50AAAJAM4IAgUJYmFzZUVudHJ5CQDMCAIJAQdSZWlzc3VlAwUEU1dPUAUOcHJvdG9jb2xSZXdhcmQGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFBndhbGxldAUOcHJvdG9jb2xSZXdhcmQFBFNXT1AFA25pbAMJAGcCBQpzaGFyZVRva2VuBQlwbXRBbW91bnQFCWJhc2VFbnRyeQkAAgEJAKwCAgIcWW91ciBtYXhpbXVtIHNoYXJlIHRva2VuIGlzIAkApAMBBQpzaGFyZVRva2VuCQACAQIVWW91IGNhbid0IHNoYXJlIHRva2VuCQACAQIgWW91ciBhbW91bnQgb2YgdG9rZW4gbGVzcyB0aGFuIDAFCWJhc2VFbnRyeQFpARN3aXRoZHJhd1NoYXJlVG9rZW5zAgRwb29sGXNoYXJlVG9rZW5zV2l0aGRyYXdBbW91bnQEDXNoYXJlVG9rZW5zSWQJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBBXZhbHVlAQkApggBBQRwb29sAg5zaGFyZV9hc3NldF9pZAQNJHQwMjI2ODUyMjc4NQkBCWNsYWltQ2FsYwMFBHBvb2wIBQFpBmNhbGxlcgABBA91c2VyTmV3SW50ZXJlc3QIBQ0kdDAyMjY4NTIyNzg1Al8xBA9jdXJyZW50SW50ZXJlc3QIBQ0kdDAyMjY4NTIyNzg1Al8yBAtjbGFpbUFtb3VudAgFDSR0MDIyNjg1MjI3ODUCXzMEFXVzZXJTaGFyZVRva2Vuc0Ftb3VudAgFDSR0MDIyNjg1MjI3ODUCXzQEEnVzZXJTaGFyZUFtb3VudE5ldwkAZQIFFXVzZXJTaGFyZVRva2Vuc0Ftb3VudAUZc2hhcmVUb2tlbnNXaXRoZHJhd0Ftb3VudAQRYXZhaWxhYmxlRnVuZHNOZXcJAGQCCQERdXNlckF2YWlsYWJsZVNXT1ACBQRwb29sCAUBaQZjYWxsZXIFC2NsYWltQW1vdW50BBB0b3RhbFNoYXJlQW1vdW50CQEYZ2V0VG90YWxTaGFyZVRva2VuTG9ja2VkAQUEcG9vbAQTdG90YWxTaGFyZUFtb3VudE5ldwkAZQIFEHRvdGFsU2hhcmVBbW91bnQFGXNoYXJlVG9rZW5zV2l0aGRyYXdBbW91bnQEEXVzZXJDbGFpbWVkQW1vdW50CQEYZ2V0VXNlclNXT1BDbGFpbWVkQW1vdW50AgUEcG9vbAgFAWkGY2FsbGVyBBR1c2VyQ2xhaW1lZEFtb3VudE5ldwkAZAIFEXVzZXJDbGFpbWVkQW1vdW50BQtjbGFpbUFtb3VudAMJAGYCBRlzaGFyZVRva2Vuc1dpdGhkcmF3QW1vdW50BRV1c2VyU2hhcmVUb2tlbnNBbW91bnQJAAIBAixXaXRoZHJhdyBhbW91bnQgbW9yZSB0aGVuIHVzZXIgbG9ja2VkIGFtb3VudAMJAQEhAQUIaXNBY3RpdmUJAAIBAh9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AwkAZgIFGXNoYXJlVG9rZW5zV2l0aGRyYXdBbW91bnQFFXVzZXJTaGFyZVRva2Vuc0Ftb3VudAkAAgECLFdpdGhkcmF3IGFtb3VudCBtb3JlIHRoZW4gdXNlciBsb2NrZWQgYW1vdW50AwkAZgIJAGsDAGMJAGUCCQEOYWNjb3VudEJhbGFuY2UBBQ1zaGFyZVRva2Vuc0lkBRlzaGFyZVRva2Vuc1dpdGhkcmF3QW1vdW50AGQFE3RvdGFsU2hhcmVBbW91bnROZXcJAAIBAjJCYWxhbmNlIG9mIHNoYXJlLXRva2VuIGlzIGdyZWF0ZXIgdGhhbiB0b3RhbEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwkApQgBCAUBaQZjYWxsZXIFE2tleVVzZXJMYXN0SW50ZXJlc3QFD3VzZXJOZXdJbnRlcmVzdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICCQCsAgIJAKwCAgUEcG9vbAIBXwkApQgBCAUBaQZjYWxsZXIFGGtleVVzZXJTaGFyZVRva2Vuc0xvY2tlZAUSdXNlclNoYXJlQW1vdW50TmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFD2tleUxhc3RJbnRlcmVzdAUPY3VycmVudEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFWtleUxhc3RJbnRlcmVzdEhlaWdodAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFGtleVNoYXJlVG9rZW5zTG9ja2VkBRN0b3RhbFNoYXJlQW1vdW50TmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfCQClCAEIBQFpBmNhbGxlcgUQa2V5QXZhaWxhYmxlU1dPUAURYXZhaWxhYmxlRnVuZHNOZXcJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8JAKUIAQgFAWkGY2FsbGVyBRhrZXlVc2VyU1dPUENsYWltZWRBbW91bnQFFHVzZXJDbGFpbWVkQW1vdW50TmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfCQClCAEIBQFpBmNhbGxlcgUca2V5VXNlclNXT1BMYXN0Q2xhaW1lZEFtb3VudAULY2xhaW1BbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBRlzaGFyZVRva2Vuc1dpdGhkcmF3QW1vdW50BQ1zaGFyZVRva2Vuc0lkBQNuaWwBaQEFY2xhaW0BBHBvb2wEDXNoYXJlVG9rZW5zSWQJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBBXZhbHVlAQkApggBBQRwb29sAg5zaGFyZV9hc3NldF9pZAQQc2hhcmVUb2tlbkxvY2tlZAkBGGdldFRvdGFsU2hhcmVUb2tlbkxvY2tlZAEFBHBvb2wEDSR0MDI0NzkyMjQ4NTcJARNnZXRMYXN0SW50ZXJlc3RJbmZvAQUEcG9vbAQSbGFzdEludGVyZXN0SGVpZ2h0CAUNJHQwMjQ3OTIyNDg1NwJfMQQMbGFzdEludGVyZXN0CAUNJHQwMjQ3OTIyNDg1NwJfMgQNJHQwMjQ4NjIyNDk3NAkBCnJld2FyZEluZm8BBQRwb29sBBVjdXJyZW50UmV3YXJkUGVyQmxvY2sIBQ0kdDAyNDg2MjI0OTc0Al8xBBJyZXdhcmRVcGRhdGVIZWlnaHQIBQ0kdDAyNDg2MjI0OTc0Al8yBBZwcmV2aW91c1Jld2FyZFBlckJsb2NrCAUNJHQwMjQ4NjIyNDk3NAJfMwQWcG9vbFJld2FyZFVwZGF0ZUhlaWdodAgFDSR0MDI0ODYyMjQ5NzQCXzQEDSR0MDI0OTc5MjUwNzkJAQljbGFpbUNhbGMDBQRwb29sCAUBaQZjYWxsZXIAAQQPdXNlck5ld0ludGVyZXN0CAUNJHQwMjQ5NzkyNTA3OQJfMQQPY3VycmVudEludGVyZXN0CAUNJHQwMjQ5NzkyNTA3OQJfMgQLY2xhaW1BbW91bnQIBQ0kdDAyNDk3OTI1MDc5Al8zBBV1c2VyU2hhcmVUb2tlbnNBbW91bnQIBQ0kdDAyNDk3OTI1MDc5Al80BA1hdmFpbGFibGVGdW5kCQBkAgkBEXVzZXJBdmFpbGFibGVTV09QAgUEcG9vbAgFAWkGY2FsbGVyBQtjbGFpbUFtb3VudAQRdXNlckNsYWltZWRBbW91bnQJARhnZXRVc2VyU1dPUENsYWltZWRBbW91bnQCBQRwb29sCAUBaQZjYWxsZXIEFHVzZXJDbGFpbWVkQW1vdW50TmV3CQBkAgURdXNlckNsYWltZWRBbW91bnQFC2NsYWltQW1vdW50AwkAAAIFDWF2YWlsYWJsZUZ1bmQAAAkAAgECGVlvdSBoYXZlIDAgYXZhaWxhYmxlIFNXT1ADCQEBIQEFCGlzQWN0aXZlCQACAQIfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAMJAAACBQ1hdmFpbGFibGVGdW5kAAAJAAIBAhlZb3UgaGF2ZSAwIGF2YWlsYWJsZSBTV09QAwkAZgIJAGsDAGMJAQ5hY2NvdW50QmFsYW5jZQEFDXNoYXJlVG9rZW5zSWQAZAUQc2hhcmVUb2tlbkxvY2tlZAkAAgECMkJhbGFuY2Ugb2Ygc2hhcmUtdG9rZW4gaXMgZ3JlYXRlciB0aGFuIHRvdGFsQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfCQClCAEIBQFpBmNhbGxlcgUTa2V5VXNlckxhc3RJbnRlcmVzdAUPdXNlck5ld0ludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFD2tleUxhc3RJbnRlcmVzdAUPY3VycmVudEludGVyZXN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBHBvb2wFFWtleUxhc3RJbnRlcmVzdEhlaWdodAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfCQClCAEIBQFpBmNhbGxlcgUQa2V5QXZhaWxhYmxlU1dPUAAACQDMCAIJAQdSZWlzc3VlAwUEU1dPUAUNYXZhaWxhYmxlRnVuZAYJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkArAICCQCsAgIFBHBvb2wCAV8JAKUIAQgFAWkGY2FsbGVyBRhrZXlVc2VyU1dPUENsYWltZWRBbW91bnQFFHVzZXJDbGFpbWVkQW1vdW50TmV3CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKwCAgkArAICBQRwb29sAgFfCQClCAEIBQFpBmNhbGxlcgUca2V5VXNlclNXT1BMYXN0Q2xhaW1lZEFtb3VudAULY2xhaW1BbW91bnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQ1hdmFpbGFibGVGdW5kBQRTV09QBQNuaWwBaQEIc2h1dGRvd24AAwkBASEBBQhpc0FjdGl2ZQkAAgEJAKwCAgIiREFwcCBpcyBhbHJlYWR5IHN1c3BlbmRlZC4gQ2F1c2U6IAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQhrZXlDYXVzZQIadGhlIGNhdXNlIHdhc24ndCBzcGVjaWZpZWQDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgkBB3N1c3BlbmQBAg9QYXVzZWQgYnkgYWRtaW4BaQEIYWN0aXZhdGUAAwUIaXNBY3RpdmUJAAIBAhZEQXBwIGlzIGFscmVhZHkgYWN0aXZlAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQxhZG1pblB1YktleTEJAMwIAgUMYWRtaW5QdWJLZXkyCQDMCAIFDGFkbWluUHViS2V5MwUDbmlsCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAAIBAiFPbmx5IGFkbWluIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24JAMwIAgkBDEJvb2xlYW5FbnRyeQIFCWtleUFjdGl2ZQYJAMwIAgkBC0RlbGV0ZUVudHJ5AQUIa2V5Q2F1c2UFA25pbAECdHgBBnZlcmlmeQAEByRtYXRjaDAFAnR4BBJhZG1pblB1YktleTFTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQxhZG1pblB1YktleTEAAQAABBJhZG1pblB1YktleTJTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwABBQxhZG1pblB1YktleTIAAQAABBJhZG1pblB1YktleTNTaWduZWQDCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwACBQxhZG1pblB1YktleTMAAQAACQBnAgkAZAIJAGQCBRJhZG1pblB1YktleTFTaWduZWQFEmFkbWluUHViS2V5MlNpZ25lZAUSYWRtaW5QdWJLZXkzU2lnbmVkAALMb46o", "height": 2110372, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: Fte7wojy8nEuiZ6HfL4AenCu4ErHt6wVBmV7X7Szsy9Z Next: 8aj6ctZSyB1UhFKRbgr288ak5HxUEdrMtUwMNo3W9Mkc Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 4 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let adminPubKey1 = base58'GFmKZ2naZFRoCvNbwKAQVGmLb1uBeWGDgFabdGBuZiuy'
215215 let assetId1Decimals = value(assetInfo(assetId1)).decimals
216216 let assetId2Decimals = value(assetInfo(assetId2)).decimals
217217 let scaleDigits = ((assetId2Decimals - assetId1Decimals) + 8)
218- pow(10, 0, scaleDigits, 0, 0, HALFDOWN)
218+ pow(10, 0, scaleDigits, 0, 0, DOWN)
219219 }
220220
221221
320320 let shareAssetId = getShareAssetId(pool)
321321 let scaleValue = calcScaleValue(SWOP, shareAssetId)
322322 let shareTokenLocked = getTotalShareTokenLocked(pool)
323- let $t01315313218 = getLastInterestInfo(pool)
324- let lastInterestHeight = $t01315313218._1
325- let lastInterest = $t01315313218._2
326- let $t01322313335 = rewardInfo(pool)
327- let currentRewardPerBlock = $t01322313335._1
328- let rewardUpdateHeight = $t01322313335._2
329- let previousRewardPerBlock = $t01322313335._3
330- let poolRewardUpdateHeight = $t01322313335._4
331- let $t01334013419 = getUserInterestInfo(pool, caller)
332- let userLastInterest = $t01334013419._1
333- let userShareTokensAmount = $t01334013419._2
323+ let $t01309113156 = getLastInterestInfo(pool)
324+ let lastInterestHeight = $t01309113156._1
325+ let lastInterest = $t01309113156._2
326+ let $t01316113273 = rewardInfo(pool)
327+ let currentRewardPerBlock = $t01316113273._1
328+ let rewardUpdateHeight = $t01316113273._2
329+ let previousRewardPerBlock = $t01316113273._3
330+ let poolRewardUpdateHeight = $t01316113273._4
331+ let $t01327813357 = getUserInterestInfo(pool, caller)
332+ let userLastInterest = $t01327813357._1
333+ let userShareTokensAmount = $t01327813357._2
334334 let currentInterest = calcInterest(lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, lastInterest, currentRewardPerBlock, shareTokenLocked, previousRewardPerBlock, shareAssetId, scaleValue, pmtAmount)
335335 let claimAmount = fraction(userShareTokensAmount, (currentInterest - userLastInterest), scaleValue)
336336 let userNewInterest = currentInterest
339339
340340
341341 func calculateProtocolReward (pool) = {
342- let $t01393714002 = getLastInterestInfo(pool)
343- let lastInterestHeight = $t01393714002._1
344- let lastInterest = $t01393714002._2
345- let $t01400714118 = rewardInfo(pool)
346- let currentRewardPerBlock = $t01400714118._1
347- let rewardUpdateHeight = $t01400714118._2
348- let previousRewardPerBlock = $t01400714118._3
349- let poolRewardUpdateHeight = $t01400714118._4
342+ let $t01387513940 = getLastInterestInfo(pool)
343+ let lastInterestHeight = $t01387513940._1
344+ let lastInterest = $t01387513940._2
345+ let $t01394514056 = rewardInfo(pool)
346+ let currentRewardPerBlock = $t01394514056._1
347+ let rewardUpdateHeight = $t01394514056._2
348+ let previousRewardPerBlock = $t01394514056._3
349+ let poolRewardUpdateHeight = $t01394514056._4
350350 let shareTokenLocked = getTotalShareTokenLocked(pool)
351351 if (if ((shareTokenLocked == 0))
352352 then (poolRewardUpdateHeight == 0)
431431 func initPoolShareFarming (pool) = if ((i.caller != this))
432432 then throw("Only the DApp itself can call this function")
433433 else {
434- let $t01710017203 = rewardInfo(pool)
435- let currentReward = $t01710017203._1
436- let rewardUpdateHeight = $t01710017203._2
437- let previousRewardPerBlock = $t01710017203._3
438- let poolRewardUpdateHeight = $t01710017203._4
434+ let $t01703817141 = rewardInfo(pool)
435+ let currentReward = $t01703817141._1
436+ let rewardUpdateHeight = $t01703817141._2
437+ let previousRewardPerBlock = $t01703817141._3
438+ let poolRewardUpdateHeight = $t01703817141._4
439439 [IntegerEntry((pool + keyShareTokensLocked), 0), IntegerEntry((pool + keyLastInterest), 0), IntegerEntry((pool + keyLastInterestHeight), height)]
440440 }
441441
447447 else if (!(isActive))
448448 then throw("DApp is inactive at this moment")
449449 else {
450- let $t01761217732 = claimCalc(pool, adminIncreaseInterestAddress, 0)
451- let userNewInterest = $t01761217732._1
452- let currentInterest = $t01761217732._2
453- let claimAmount = $t01761217732._3
454- let userShareTokensAmount = $t01761217732._4
455- let $t01773717840 = rewardInfo(pool)
456- let currentReward = $t01773717840._1
457- let rewardUpdateHeight = $t01773717840._2
458- let previousRewardPerBlock = $t01773717840._3
459- let poolRewardUpdateHeight = $t01773717840._4
450+ let $t01755017670 = claimCalc(pool, adminIncreaseInterestAddress, 0)
451+ let userNewInterest = $t01755017670._1
452+ let currentInterest = $t01755017670._2
453+ let claimAmount = $t01755017670._3
454+ let userShareTokensAmount = $t01755017670._4
455+ let $t01767517778 = rewardInfo(pool)
456+ let currentReward = $t01767517778._1
457+ let rewardUpdateHeight = $t01767517778._2
458+ let previousRewardPerBlock = $t01767517778._3
459+ let poolRewardUpdateHeight = $t01767517778._4
460460 [IntegerEntry((pool + keyLastInterest), userNewInterest), IntegerEntry((pool + keyLastInterestHeight), height)]
461461 }
462462
464464
465465 @Callable(i)
466466 func lockShareTokens (pool) = {
467- let $t01803218107 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
468- let pmtAmount = $t01803218107._1
469- let pmtAssetId = $t01803218107._2
470- let $t01811218185 = getAssetInfo(pmtAssetId)
471- let pmtStrAssetId = $t01811218185._1
472- let pmtAssetName = $t01811218185._2
473- let pmtDecimals = $t01811218185._3
474- let $t01819018298 = claimCalc(pool, i.caller, pmtAmount)
475- let userNewInterest = $t01819018298._1
476- let currentInterest = $t01819018298._2
477- let claimAmount = $t01819018298._3
478- let userShareTokensAmount = $t01819018298._4
467+ let $t01797018045 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
468+ let pmtAmount = $t01797018045._1
469+ let pmtAssetId = $t01797018045._2
470+ let $t01805018123 = getAssetInfo(pmtAssetId)
471+ let pmtStrAssetId = $t01805018123._1
472+ let pmtAssetName = $t01805018123._2
473+ let pmtDecimals = $t01805018123._3
474+ let $t01812818236 = claimCalc(pool, i.caller, pmtAmount)
475+ let userNewInterest = $t01812818236._1
476+ let currentInterest = $t01812818236._2
477+ let claimAmount = $t01812818236._3
478+ let userShareTokensAmount = $t01812818236._4
479479 let userShareAmountNew = (userShareTokensAmount + pmtAmount)
480480 let availableFundsNew = (userAvailableSWOP(pool, i.caller) + claimAmount)
481481 let totalShareAmount = getTotalShareTokenLocked(pool)
520520 then if ((fraction(99, (accountBalance(pmtAssetId) + pmtAmount), 100) > totalShareAmountNew))
521521 then throw("Balance of share-token is greater than totalAmount")
522522 else if ((totalShareAmount == 0))
523- then (baseEntry ++ [ScriptTransfer(wallet, protocolReward, SWOP)])
523+ then (baseEntry ++ [Reissue(SWOP, protocolReward, true), ScriptTransfer(wallet, protocolReward, SWOP)])
524524 else if ((shareToken >= pmtAmount))
525525 then baseEntry
526526 else throw(("Your maximum share token is " + toString(shareToken)))
536536 @Callable(i)
537537 func withdrawShareTokens (pool,shareTokensWithdrawAmount) = {
538538 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
539- let $t02274822848 = claimCalc(pool, i.caller, 1)
540- let userNewInterest = $t02274822848._1
541- let currentInterest = $t02274822848._2
542- let claimAmount = $t02274822848._3
543- let userShareTokensAmount = $t02274822848._4
539+ let $t02268522785 = claimCalc(pool, i.caller, 1)
540+ let userNewInterest = $t02268522785._1
541+ let currentInterest = $t02268522785._2
542+ let claimAmount = $t02268522785._3
543+ let userShareTokensAmount = $t02268522785._4
544544 let userShareAmountNew = (userShareTokensAmount - shareTokensWithdrawAmount)
545545 let availableFundsNew = (userAvailableSWOP(pool, i.caller) + claimAmount)
546546 let totalShareAmount = getTotalShareTokenLocked(pool)
564564 func claim (pool) = {
565565 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
566566 let shareTokenLocked = getTotalShareTokenLocked(pool)
567- let $t02485524920 = getLastInterestInfo(pool)
568- let lastInterestHeight = $t02485524920._1
569- let lastInterest = $t02485524920._2
570- let $t02492525037 = rewardInfo(pool)
571- let currentRewardPerBlock = $t02492525037._1
572- let rewardUpdateHeight = $t02492525037._2
573- let previousRewardPerBlock = $t02492525037._3
574- let poolRewardUpdateHeight = $t02492525037._4
575- let $t02504225142 = claimCalc(pool, i.caller, 1)
576- let userNewInterest = $t02504225142._1
577- let currentInterest = $t02504225142._2
578- let claimAmount = $t02504225142._3
579- let userShareTokensAmount = $t02504225142._4
567+ let $t02479224857 = getLastInterestInfo(pool)
568+ let lastInterestHeight = $t02479224857._1
569+ let lastInterest = $t02479224857._2
570+ let $t02486224974 = rewardInfo(pool)
571+ let currentRewardPerBlock = $t02486224974._1
572+ let rewardUpdateHeight = $t02486224974._2
573+ let previousRewardPerBlock = $t02486224974._3
574+ let poolRewardUpdateHeight = $t02486224974._4
575+ let $t02497925079 = claimCalc(pool, i.caller, 1)
576+ let userNewInterest = $t02497925079._1
577+ let currentInterest = $t02497925079._2
578+ let claimAmount = $t02497925079._3
579+ let userShareTokensAmount = $t02497925079._4
580580 let availableFund = (userAvailableSWOP(pool, i.caller) + claimAmount)
581581 let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
582582 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
588588 then throw("You have 0 available SWOP")
589589 else if ((fraction(99, accountBalance(shareTokensId), 100) > shareTokenLocked))
590590 then throw("Balance of share-token is greater than totalAmount")
591- else [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), 0), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, availableFund, SWOP)]
591+ else [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), 0), Reissue(SWOP, availableFund, true), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, availableFund, SWOP)]
592592 }
593593
594594
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 4 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let adminPubKey1 = base58'GFmKZ2naZFRoCvNbwKAQVGmLb1uBeWGDgFabdGBuZiuy'
55
66 let adminPubKey2 = base58'GmJXRyhRA79g8yUGgKBAVdnFfQFDMjQG98b1MmLDh5kk'
77
88 let adminPubKey3 = base58'CFhbV6h41hVjbGHudGtS3fYUv7QAKRxFQzKNtx4B5PqP'
99
1010 let keyShareTokensLocked = "_total_share_tokens_locked"
1111
1212 let kShareLimit = "share_limit_on_first_harvest"
1313
1414 let keyActive = "active"
1515
1616 let keyCause = "shutdown_cause"
1717
1818 let keyRewardPoolFractionCurrent = "_current_pool_fraction_reward"
1919
2020 let keyRewardPoolFractionPrevious = "_previous_pool_fraction_reward"
2121
2222 let keyHeightPoolFraction = "_pool_reward_update_height"
2323
2424 let keyTotalRewardPerBlockCurrent = "total_reward_per_block_current"
2525
2626 let keyTotalRewardPerBlockPrevious = "total_reward_per_block_previous"
2727
2828 let keyRewardUpdateHeight = "reward_update_height"
2929
3030 let keyLastInterest = "_last_interest"
3131
3232 let keyLastInterestHeight = "_last_interest_height"
3333
3434 let keyUserShareTokensLocked = "_share_tokens_locked"
3535
3636 let keyUserLastInterest = "_last_interest"
3737
3838 let keySWOPid = "SWOP_id"
3939
4040 let keyUserSWOPClaimedAmount = "_SWOP_claimed_amount"
4141
4242 let keyUserSWOPLastClaimedAmount = "_SWOP_last_claimed_amount"
4343
4444 let keyAvailableSWOP = "_available_SWOP"
4545
4646 let keyFarmingStartHeight = "farming_start_height"
4747
4848 let keyAPY = "apy"
4949
5050 let kPreviousTotalVoteSWOP = "previous_total_vote_SWOP"
5151
5252 let keySwopYearEmission = "swop_year_emission"
5353
5454 let keyBalancecpmmA = "A_asset_balance"
5555
5656 let keyBalancecpmmB = "B_asset_balance"
5757
5858 let kHarvestPoolActiveVoteStrucVoting = "_harvest_pool_activeVote_struc"
5959
6060 let kHarvestUserPoolActiveVoteStrucVoting = "_harvest_user_pool_activeVote_struc"
6161
6262 let keyLimitShareFirstHarvest = "share_limit_on_first_harvest"
6363
6464 let keyAssetIdA = "A_asset_id"
6565
6666 let keyAssetIdB = "B_asset_id"
6767
6868 let keyFirstHarvestHeight = "first_harvest_height"
6969
7070 let keyfirstHarvestCpmm = "first_harvest"
7171
7272 let keyTempPrevSum = "sum_reward_previous"
7373
7474 let keyTempCurSum = "sum_reward_current"
7575
7676 let governanceAddress = Address(base58'3N5W8da2iiijVieA6qLGo7KzCJj8B19smWU')
7777
7878 let wallet = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
7979
8080 let votingAddress = Address(base58'3MrJgdL1GniipErHy44YF9idzLaUL2iX5DQ')
8181
8282 let adminIncreaseInterestAddress = Address(base58'3NAGTtZz6WpupSN89NZD5rMZwwziZEg4Kx4')
8383
8484 let oneWeekInBlock = 10106
8585
8686 let totalVoteShare = 10000000000
8787
8888 let scaleValue1 = 10
8989
9090 let scaleValue3 = 1000
9191
9292 let scaleValue5 = 100000
9393
9494 let scaleValue6 = 1000000
9595
9696 let scaleValue8 = 100000000
9797
9898 let scaleValue11 = 100000000000
9999
100100 func strAssetIdA (pool) = getStringValue(pool, keyAssetIdA)
101101
102102
103103 func strAssetIdB (pool) = getStringValue(pool, keyAssetIdB)
104104
105105
106106 func assetIdA (pool) = if ((strAssetIdA(pool) == "WAVES"))
107107 then unit
108108 else fromBase58String(strAssetIdA(pool))
109109
110110
111111 func assetIdB (pool) = if ((strAssetIdB(pool) == "WAVES"))
112112 then unit
113113 else fromBase58String(strAssetIdB(pool))
114114
115115
116116 let kBasePeriod = "base_period"
117117
118118 let kPeriodLength = "period_length"
119119
120120 let kStartHeight = "start_height"
121121
122122 let kFirstHarvestHeight = "first_harvest_height"
123123
124124 let kDurationFullVotePower = "duration_full_vote_power"
125125
126126 let kMinVotePower = "min_vote_power"
127127
128128 let basePeriod = valueOrErrorMessage(getInteger(votingAddress, kBasePeriod), "Empty kBasePeriod")
129129
130130 let startHeight = valueOrErrorMessage(getInteger(votingAddress, kStartHeight), "Empty kStartHeight")
131131
132132 let periodLength = valueOrErrorMessage(getInteger(votingAddress, kPeriodLength), "Empty kPeriodLength")
133133
134134 let durationFullVotePower = valueOrErrorMessage(getInteger(votingAddress, kDurationFullVotePower), "Empty kDurationFullVotePower")
135135
136136 let minVotePower = valueOrErrorMessage(getInteger(votingAddress, kMinVotePower), "Empty kMinVotePower")
137137
138138 let isActive = getBooleanValue(this, keyActive)
139139
140140 let currPeriod = (basePeriod + ((height - startHeight) / periodLength))
141141
142142 func getLimitToken (pool) = valueOrElse(getIntegerValue(pool, keyLimitShareFirstHarvest), 0)
143143
144144
145145 let APY = getIntegerValue(this, keyAPY)
146146
147147 let SwopYearEmission = getIntegerValue(this, keySwopYearEmission)
148148
149149 func assetNameA (pool) = match assetIdA(pool) {
150150 case id: ByteVector =>
151151 value(assetInfo(id)).name
152152 case waves: Unit =>
153153 "WAVES"
154154 case _ =>
155155 throw("Match error")
156156 }
157157
158158
159159 func assetNameB (pool) = match assetIdB(pool) {
160160 case id: ByteVector =>
161161 value(assetInfo(id)).name
162162 case waves: Unit =>
163163 "WAVES"
164164 case _ =>
165165 throw("Match error")
166166 }
167167
168168
169169 let SWOP = fromBase58String(getStringValue(this, keySWOPid))
170170
171171 func isFirstHarvest (pool) = valueOrElse(getBoolean(pool, keyfirstHarvestCpmm), false)
172172
173173
174174 func getHeightFirstHarvest (pool) = valueOrElse(getInteger(pool, keyFirstHarvestHeight), 0)
175175
176176
177177 func getBalanceA (pool) = valueOrErrorMessage(getInteger(pool, keyBalancecpmmA), ("No data on the key: " + keyBalancecpmmA))
178178
179179
180180 func getBalanceB (pool) = valueOrErrorMessage(getInteger(pool, keyBalancecpmmB), ("No data on the key: " + keyBalancecpmmB))
181181
182182
183183 func getShareLimitToken (pool) = valueOrErrorMessage(getInteger(pool, kShareLimit), ("No data on the key: " + kShareLimit))
184184
185185
186186 func getTotalShareTokenLocked (pool) = valueOrErrorMessage(getInteger(this, (pool + keyShareTokensLocked)), (("No data on the key: " + pool) + keyShareTokensLocked))
187187
188188
189189 func getShareAssetId (pool) = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
190190
191191
192192 func accountBalance (assetId) = match assetId {
193193 case id: ByteVector =>
194194 assetBalance(this, id)
195195 case waves: Unit =>
196196 wavesBalance(this).available
197197 case _ =>
198198 throw("Match error")
199199 }
200200
201201
202202 func getAssetInfo (assetId) = match assetId {
203203 case id: ByteVector =>
204204 let stringId = toBase58String(id)
205205 let info = valueOrErrorMessage(assetInfo(id), (("Asset " + stringId) + " doesn't exist"))
206206 $Tuple3(stringId, info.name, info.decimals)
207207 case waves: Unit =>
208208 $Tuple3("WAVES", "WAVES", 8)
209209 case _ =>
210210 throw("Match error")
211211 }
212212
213213
214214 func calcScaleValue (assetId1,assetId2) = {
215215 let assetId1Decimals = value(assetInfo(assetId1)).decimals
216216 let assetId2Decimals = value(assetInfo(assetId2)).decimals
217217 let scaleDigits = ((assetId2Decimals - assetId1Decimals) + 8)
218- pow(10, 0, scaleDigits, 0, 0, HALFDOWN)
218+ pow(10, 0, scaleDigits, 0, 0, DOWN)
219219 }
220220
221221
222222 func userAvailableSWOP (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + toString(user)) + keyAvailableSWOP)), 0)
223223
224224
225225 func rewardInfo (pool) = {
226226 let totalRewardPerBlockCurrent = valueOrErrorMessage(getInteger(governanceAddress, keyTotalRewardPerBlockCurrent), ((("No data on the key: " + keyTotalRewardPerBlockCurrent) + " at address ") + toString(governanceAddress)))
227227 let totalRewardPerBlockPrevious = valueOrErrorMessage(getInteger(governanceAddress, keyTotalRewardPerBlockPrevious), ((("No data on the key: " + keyTotalRewardPerBlockPrevious) + " at address ") + toString(governanceAddress)))
228228 let rewardPoolFractionCurrent = valueOrErrorMessage(getInteger(governanceAddress, (pool + keyRewardPoolFractionCurrent)), (((("No data on the key: " + pool) + keyRewardPoolFractionCurrent) + " at address ") + toString(governanceAddress)))
229229 let rewardUpdateHeight = valueOrErrorMessage(getInteger(governanceAddress, keyRewardUpdateHeight), ((("No data on the key: " + keyRewardUpdateHeight) + " at address ") + toString(governanceAddress)))
230230 let poolRewardUpdateHeight = valueOrElse(getInteger(governanceAddress, (pool + keyHeightPoolFraction)), 0)
231231 let rewardPoolFractionPrevious = valueOrErrorMessage(getInteger(governanceAddress, (pool + keyRewardPoolFractionPrevious)), (((("No data on the key: " + pool) + keyRewardPoolFractionPrevious) + " at address ") + toString(governanceAddress)))
232232 let rewardPoolCurrent = fraction(totalRewardPerBlockCurrent, rewardPoolFractionCurrent, totalVoteShare)
233233 let rewardPoolPrevious = fraction(totalRewardPerBlockPrevious, rewardPoolFractionPrevious, totalVoteShare)
234234 if (if ((rewardPoolCurrent > totalRewardPerBlockCurrent))
235235 then true
236236 else (rewardPoolPrevious > totalRewardPerBlockPrevious))
237237 then throw("rewardPoolCurrent > totalRewardPerBlockCurrent or rewardPoolPrevious > totalRewardPerBlockPrevious")
238238 else $Tuple4(rewardPoolCurrent, rewardUpdateHeight, rewardPoolPrevious, poolRewardUpdateHeight)
239239 }
240240
241241
242242 func getLastInterestInfo (pool) = {
243243 let lastInterest = valueOrErrorMessage(getInteger(this, (pool + keyLastInterest)), (("No data on the key: " + pool) + keyLastInterest))
244244 let lastInterestHeight = valueOrElse(getInteger(this, (pool + keyLastInterestHeight)), height)
245245 $Tuple2(lastInterestHeight, lastInterest)
246246 }
247247
248248
249249 func getUserInterestInfo (pool,userAddress) = {
250250 let userLastInterest = getInteger(this, (((pool + "_") + toString(userAddress)) + keyUserLastInterest))
251251 let userShare = getInteger(this, (((pool + "_") + toString(userAddress)) + keyUserShareTokensLocked))
252252 let lastInterest = valueOrErrorMessage(getInteger(this, (pool + keyLastInterest)), (("No data on the key: " + pool) + keyLastInterest))
253253 let userLastInterestValue = match userLastInterest {
254254 case userLastInterest: Int =>
255255 userLastInterest
256256 case _ =>
257257 lastInterest
258258 }
259259 let userShareTokensAmount = match userShare {
260260 case userShare: Int =>
261261 userShare
262262 case _ =>
263263 0
264264 }
265265 $Tuple2(userLastInterestValue, userShareTokensAmount)
266266 }
267267
268268
269269 func calcInterest (lastInterestHeight,rewardUpdateHeight,poolRewardUpdateHeight,lastInterest,currentRewardPerBlock,shareTokenLocked,previousRewardPerBlock,shareAssetId,scaleValue,pmtAmount) = if ((shareTokenLocked == 0))
270270 then 0
271271 else if ((poolRewardUpdateHeight != 0))
272272 then if (if ((rewardUpdateHeight > height))
273273 then (rewardUpdateHeight == poolRewardUpdateHeight)
274274 else false)
275275 then {
276276 let reward = (previousRewardPerBlock * (height - lastInterestHeight))
277277 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
278278 }
279279 else if (if ((height > rewardUpdateHeight))
280280 then (rewardUpdateHeight != poolRewardUpdateHeight)
281281 else false)
282282 then {
283283 let reward = (previousRewardPerBlock * (height - lastInterestHeight))
284284 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
285285 }
286286 else if (if (if ((height > rewardUpdateHeight))
287287 then (rewardUpdateHeight == poolRewardUpdateHeight)
288288 else false)
289289 then (lastInterestHeight > rewardUpdateHeight)
290290 else false)
291291 then {
292292 let reward = (currentRewardPerBlock * (height - lastInterestHeight))
293293 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
294294 }
295295 else {
296296 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
297297 let interestAfterUpdate = (lastInterest + fraction(rewardAfterLastInterestBeforeReawardUpdate, scaleValue, shareTokenLocked))
298298 let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
299299 (interestAfterUpdate + fraction(reward, scaleValue, shareTokenLocked))
300300 }
301301 else if ((rewardUpdateHeight > height))
302302 then {
303303 let reward = (previousRewardPerBlock * (height - lastInterestHeight))
304304 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
305305 }
306306 else if ((lastInterestHeight > rewardUpdateHeight))
307307 then {
308308 let reward = (currentRewardPerBlock * (height - lastInterestHeight))
309309 (lastInterest + fraction(reward, scaleValue, shareTokenLocked))
310310 }
311311 else {
312312 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
313313 let interestAfterUpdate = (lastInterest + fraction(rewardAfterLastInterestBeforeReawardUpdate, scaleValue, shareTokenLocked))
314314 let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
315315 (interestAfterUpdate + fraction(reward, scaleValue, shareTokenLocked))
316316 }
317317
318318
319319 func claimCalc (pool,caller,pmtAmount) = {
320320 let shareAssetId = getShareAssetId(pool)
321321 let scaleValue = calcScaleValue(SWOP, shareAssetId)
322322 let shareTokenLocked = getTotalShareTokenLocked(pool)
323- let $t01315313218 = getLastInterestInfo(pool)
324- let lastInterestHeight = $t01315313218._1
325- let lastInterest = $t01315313218._2
326- let $t01322313335 = rewardInfo(pool)
327- let currentRewardPerBlock = $t01322313335._1
328- let rewardUpdateHeight = $t01322313335._2
329- let previousRewardPerBlock = $t01322313335._3
330- let poolRewardUpdateHeight = $t01322313335._4
331- let $t01334013419 = getUserInterestInfo(pool, caller)
332- let userLastInterest = $t01334013419._1
333- let userShareTokensAmount = $t01334013419._2
323+ let $t01309113156 = getLastInterestInfo(pool)
324+ let lastInterestHeight = $t01309113156._1
325+ let lastInterest = $t01309113156._2
326+ let $t01316113273 = rewardInfo(pool)
327+ let currentRewardPerBlock = $t01316113273._1
328+ let rewardUpdateHeight = $t01316113273._2
329+ let previousRewardPerBlock = $t01316113273._3
330+ let poolRewardUpdateHeight = $t01316113273._4
331+ let $t01327813357 = getUserInterestInfo(pool, caller)
332+ let userLastInterest = $t01327813357._1
333+ let userShareTokensAmount = $t01327813357._2
334334 let currentInterest = calcInterest(lastInterestHeight, rewardUpdateHeight, poolRewardUpdateHeight, lastInterest, currentRewardPerBlock, shareTokenLocked, previousRewardPerBlock, shareAssetId, scaleValue, pmtAmount)
335335 let claimAmount = fraction(userShareTokensAmount, (currentInterest - userLastInterest), scaleValue)
336336 let userNewInterest = currentInterest
337337 $Tuple4(userNewInterest, currentInterest, claimAmount, userShareTokensAmount)
338338 }
339339
340340
341341 func calculateProtocolReward (pool) = {
342- let $t01393714002 = getLastInterestInfo(pool)
343- let lastInterestHeight = $t01393714002._1
344- let lastInterest = $t01393714002._2
345- let $t01400714118 = rewardInfo(pool)
346- let currentRewardPerBlock = $t01400714118._1
347- let rewardUpdateHeight = $t01400714118._2
348- let previousRewardPerBlock = $t01400714118._3
349- let poolRewardUpdateHeight = $t01400714118._4
342+ let $t01387513940 = getLastInterestInfo(pool)
343+ let lastInterestHeight = $t01387513940._1
344+ let lastInterest = $t01387513940._2
345+ let $t01394514056 = rewardInfo(pool)
346+ let currentRewardPerBlock = $t01394514056._1
347+ let rewardUpdateHeight = $t01394514056._2
348+ let previousRewardPerBlock = $t01394514056._3
349+ let poolRewardUpdateHeight = $t01394514056._4
350350 let shareTokenLocked = getTotalShareTokenLocked(pool)
351351 if (if ((shareTokenLocked == 0))
352352 then (poolRewardUpdateHeight == 0)
353353 else false)
354354 then if ((rewardUpdateHeight > height))
355355 then {
356356 let reward = (previousRewardPerBlock * (height - lastInterestHeight))
357357 reward
358358 }
359359 else if ((lastInterestHeight > rewardUpdateHeight))
360360 then {
361361 let reward = (currentRewardPerBlock * (height - lastInterestHeight))
362362 reward
363363 }
364364 else {
365365 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
366366 let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
367367 (reward + rewardAfterLastInterestBeforeReawardUpdate)
368368 }
369369 else if (if ((shareTokenLocked == 0))
370370 then (poolRewardUpdateHeight != 0)
371371 else false)
372372 then if (if ((rewardUpdateHeight > height))
373373 then (rewardUpdateHeight == poolRewardUpdateHeight)
374374 else false)
375375 then {
376376 let reward = (previousRewardPerBlock * (height - lastInterestHeight))
377377 reward
378378 }
379379 else if (if ((height > rewardUpdateHeight))
380380 then (rewardUpdateHeight != poolRewardUpdateHeight)
381381 else false)
382382 then {
383383 let reward = (previousRewardPerBlock * (height - lastInterestHeight))
384384 reward
385385 }
386386 else if (if (if ((height > rewardUpdateHeight))
387387 then (rewardUpdateHeight == poolRewardUpdateHeight)
388388 else false)
389389 then (lastInterestHeight > rewardUpdateHeight)
390390 else false)
391391 then {
392392 let reward = (currentRewardPerBlock * (height - lastInterestHeight))
393393 reward
394394 }
395395 else {
396396 let rewardAfterLastInterestBeforeReawardUpdate = (previousRewardPerBlock * (rewardUpdateHeight - lastInterestHeight))
397397 let reward = (currentRewardPerBlock * (height - rewardUpdateHeight))
398398 (reward + rewardAfterLastInterestBeforeReawardUpdate)
399399 }
400400 else 0
401401 }
402402
403403
404404 func checkPmtAssetIdCorrect (pool,pmtAssetId) = {
405405 let poolShareAssetId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
406406 if ((pmtAssetId == poolShareAssetId))
407407 then true
408408 else false
409409 }
410410
411411
412412 func getUserSWOPClaimedAmount (pool,user) = valueOrElse(getInteger(this, (((pool + "_") + toString(user)) + keyUserSWOPClaimedAmount)), 0)
413413
414414
415415 func suspend (cause) = [BooleanEntry(keyActive, false), StringEntry(keyCause, cause)]
416416
417417
418418 @Callable(i)
419419 func init (earlyLP) = if (isDefined(getString(this, keySWOPid)))
420420 then throw("SWOP already initialized")
421421 else {
422422 let initAmount = 100000000000000
423423 let SWOPissue = Issue("SWOP", "SWOP protocol token", initAmount, 8, true)
424424 let SWOPid = calculateAssetId(SWOPissue)
425425 [BooleanEntry(keyActive, true), Issue("SWOP", "SWOP protocol token", initAmount, 8, true), StringEntry(keySWOPid, toBase58String(SWOPid))]
426426 }
427427
428428
429429
430430 @Callable(i)
431431 func initPoolShareFarming (pool) = if ((i.caller != this))
432432 then throw("Only the DApp itself can call this function")
433433 else {
434- let $t01710017203 = rewardInfo(pool)
435- let currentReward = $t01710017203._1
436- let rewardUpdateHeight = $t01710017203._2
437- let previousRewardPerBlock = $t01710017203._3
438- let poolRewardUpdateHeight = $t01710017203._4
434+ let $t01703817141 = rewardInfo(pool)
435+ let currentReward = $t01703817141._1
436+ let rewardUpdateHeight = $t01703817141._2
437+ let previousRewardPerBlock = $t01703817141._3
438+ let poolRewardUpdateHeight = $t01703817141._4
439439 [IntegerEntry((pool + keyShareTokensLocked), 0), IntegerEntry((pool + keyLastInterest), 0), IntegerEntry((pool + keyLastInterestHeight), height)]
440440 }
441441
442442
443443
444444 @Callable(i)
445445 func updatePoolInterest (pool) = if ((i.caller != wallet))
446446 then throw("Only the Admin itself can call this function")
447447 else if (!(isActive))
448448 then throw("DApp is inactive at this moment")
449449 else {
450- let $t01761217732 = claimCalc(pool, adminIncreaseInterestAddress, 0)
451- let userNewInterest = $t01761217732._1
452- let currentInterest = $t01761217732._2
453- let claimAmount = $t01761217732._3
454- let userShareTokensAmount = $t01761217732._4
455- let $t01773717840 = rewardInfo(pool)
456- let currentReward = $t01773717840._1
457- let rewardUpdateHeight = $t01773717840._2
458- let previousRewardPerBlock = $t01773717840._3
459- let poolRewardUpdateHeight = $t01773717840._4
450+ let $t01755017670 = claimCalc(pool, adminIncreaseInterestAddress, 0)
451+ let userNewInterest = $t01755017670._1
452+ let currentInterest = $t01755017670._2
453+ let claimAmount = $t01755017670._3
454+ let userShareTokensAmount = $t01755017670._4
455+ let $t01767517778 = rewardInfo(pool)
456+ let currentReward = $t01767517778._1
457+ let rewardUpdateHeight = $t01767517778._2
458+ let previousRewardPerBlock = $t01767517778._3
459+ let poolRewardUpdateHeight = $t01767517778._4
460460 [IntegerEntry((pool + keyLastInterest), userNewInterest), IntegerEntry((pool + keyLastInterestHeight), height)]
461461 }
462462
463463
464464
465465 @Callable(i)
466466 func lockShareTokens (pool) = {
467- let $t01803218107 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
468- let pmtAmount = $t01803218107._1
469- let pmtAssetId = $t01803218107._2
470- let $t01811218185 = getAssetInfo(pmtAssetId)
471- let pmtStrAssetId = $t01811218185._1
472- let pmtAssetName = $t01811218185._2
473- let pmtDecimals = $t01811218185._3
474- let $t01819018298 = claimCalc(pool, i.caller, pmtAmount)
475- let userNewInterest = $t01819018298._1
476- let currentInterest = $t01819018298._2
477- let claimAmount = $t01819018298._3
478- let userShareTokensAmount = $t01819018298._4
467+ let $t01797018045 = $Tuple2(i.payments[0].amount, i.payments[0].assetId)
468+ let pmtAmount = $t01797018045._1
469+ let pmtAssetId = $t01797018045._2
470+ let $t01805018123 = getAssetInfo(pmtAssetId)
471+ let pmtStrAssetId = $t01805018123._1
472+ let pmtAssetName = $t01805018123._2
473+ let pmtDecimals = $t01805018123._3
474+ let $t01812818236 = claimCalc(pool, i.caller, pmtAmount)
475+ let userNewInterest = $t01812818236._1
476+ let currentInterest = $t01812818236._2
477+ let claimAmount = $t01812818236._3
478+ let userShareTokensAmount = $t01812818236._4
479479 let userShareAmountNew = (userShareTokensAmount + pmtAmount)
480480 let availableFundsNew = (userAvailableSWOP(pool, i.caller) + claimAmount)
481481 let totalShareAmount = getTotalShareTokenLocked(pool)
482482 let totalShareAmountNew = (totalShareAmount + pmtAmount)
483483 let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
484484 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
485485 let baseEntry = [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserShareTokensLocked), userShareAmountNew), IntegerEntry((pool + keyShareTokensLocked), totalShareAmountNew), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), availableFundsNew)]
486486 if ((0 >= pmtAmount))
487487 then throw("You can't lock token")
488488 else if (!(isActive))
489489 then throw("DApp is inactive at this moment")
490490 else if (!(checkPmtAssetIdCorrect(pool, pmtAssetId)))
491491 then throw("Incorrect pmtAssetId")
492492 else if (if (isFirstHarvest(Address(fromBase58String(pool))))
493493 then (getHeightFirstHarvest(Address(fromBase58String(pool))) > height)
494494 else false)
495495 then {
496496 let harvestPeriod = ((((getHeightFirstHarvest(Address(fromBase58String(pool))) - startHeight) + 1) / periodLength) - 1)
497497 let amountOfVoting = split(getStringValue(votingAddress, (((toString(i.caller) + "_") + pool) + "_user_pool_struc")), "_")
498498 let amountPoolStract = split(getStringValue(votingAddress, (pool + "_pool_struc")), "_")
499499 let amountActiveVoteUserPoolStract = split(valueOrElse(getString(votingAddress, (((toString(i.caller) + "_") + pool) + kHarvestUserPoolActiveVoteStrucVoting)), ""), "_")
500500 let amountPoolActiveVoteStract = split(valueOrElse(getString(votingAddress, (pool + kHarvestPoolActiveVoteStrucVoting)), ""), "_")
501501 let userShareTokenLocked = userShareTokensAmount
502502 let userPoolActiveVote = if ((toString(currPeriod) == amountOfVoting[2]))
503503 then valueOrElse(parseInt(amountActiveVoteUserPoolStract[0]), 0)
504504 else valueOrElse(parseInt(amountOfVoting[1]), 0)
505505 let poolActiveVote = if ((toString(currPeriod) == amountPoolStract[2]))
506506 then valueOrElse(parseInt(amountPoolActiveVoteStract[0]), 0)
507507 else valueOrElse(parseInt(amountPoolStract[1]), 0)
508508 let protocolReward = calculateProtocolReward(pool)
509509 if ((userPoolActiveVote != 0))
510510 then {
511511 let limitShareToken = getShareLimitToken(addressFromStringValue(pool))
512512 let shareToken = (fraction(limitShareToken, userPoolActiveVote, poolActiveVote) - userShareTokenLocked)
513513 if (if ((size(amountActiveVoteUserPoolStract) > 1))
514514 then (valueOrElse(parseInt(amountActiveVoteUserPoolStract[1]), 0) >= harvestPeriod)
515515 else false)
516516 then throw("You can't share token")
517517 else if ((pmtAmount > limitShareToken))
518518 then throw(("You can't share token more than " + toString(limitShareToken)))
519519 else if ((shareToken > 0))
520520 then if ((fraction(99, (accountBalance(pmtAssetId) + pmtAmount), 100) > totalShareAmountNew))
521521 then throw("Balance of share-token is greater than totalAmount")
522522 else if ((totalShareAmount == 0))
523- then (baseEntry ++ [ScriptTransfer(wallet, protocolReward, SWOP)])
523+ then (baseEntry ++ [Reissue(SWOP, protocolReward, true), ScriptTransfer(wallet, protocolReward, SWOP)])
524524 else if ((shareToken >= pmtAmount))
525525 then baseEntry
526526 else throw(("Your maximum share token is " + toString(shareToken)))
527527 else throw("You can't share token")
528528 }
529529 else throw("Your amount of token less than 0")
530530 }
531531 else baseEntry
532532 }
533533
534534
535535
536536 @Callable(i)
537537 func withdrawShareTokens (pool,shareTokensWithdrawAmount) = {
538538 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
539- let $t02274822848 = claimCalc(pool, i.caller, 1)
540- let userNewInterest = $t02274822848._1
541- let currentInterest = $t02274822848._2
542- let claimAmount = $t02274822848._3
543- let userShareTokensAmount = $t02274822848._4
539+ let $t02268522785 = claimCalc(pool, i.caller, 1)
540+ let userNewInterest = $t02268522785._1
541+ let currentInterest = $t02268522785._2
542+ let claimAmount = $t02268522785._3
543+ let userShareTokensAmount = $t02268522785._4
544544 let userShareAmountNew = (userShareTokensAmount - shareTokensWithdrawAmount)
545545 let availableFundsNew = (userAvailableSWOP(pool, i.caller) + claimAmount)
546546 let totalShareAmount = getTotalShareTokenLocked(pool)
547547 let totalShareAmountNew = (totalShareAmount - shareTokensWithdrawAmount)
548548 let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
549549 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
550550 if ((shareTokensWithdrawAmount > userShareTokensAmount))
551551 then throw("Withdraw amount more then user locked amount")
552552 else if (!(isActive))
553553 then throw("DApp is inactive at this moment")
554554 else if ((shareTokensWithdrawAmount > userShareTokensAmount))
555555 then throw("Withdraw amount more then user locked amount")
556556 else if ((fraction(99, (accountBalance(shareTokensId) - shareTokensWithdrawAmount), 100) > totalShareAmountNew))
557557 then throw("Balance of share-token is greater than totalAmount")
558558 else [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserShareTokensLocked), userShareAmountNew), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((pool + keyShareTokensLocked), totalShareAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), availableFundsNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, shareTokensWithdrawAmount, shareTokensId)]
559559 }
560560
561561
562562
563563 @Callable(i)
564564 func claim (pool) = {
565565 let shareTokensId = fromBase58String(getStringValue(value(addressFromString(pool)), "share_asset_id"))
566566 let shareTokenLocked = getTotalShareTokenLocked(pool)
567- let $t02485524920 = getLastInterestInfo(pool)
568- let lastInterestHeight = $t02485524920._1
569- let lastInterest = $t02485524920._2
570- let $t02492525037 = rewardInfo(pool)
571- let currentRewardPerBlock = $t02492525037._1
572- let rewardUpdateHeight = $t02492525037._2
573- let previousRewardPerBlock = $t02492525037._3
574- let poolRewardUpdateHeight = $t02492525037._4
575- let $t02504225142 = claimCalc(pool, i.caller, 1)
576- let userNewInterest = $t02504225142._1
577- let currentInterest = $t02504225142._2
578- let claimAmount = $t02504225142._3
579- let userShareTokensAmount = $t02504225142._4
567+ let $t02479224857 = getLastInterestInfo(pool)
568+ let lastInterestHeight = $t02479224857._1
569+ let lastInterest = $t02479224857._2
570+ let $t02486224974 = rewardInfo(pool)
571+ let currentRewardPerBlock = $t02486224974._1
572+ let rewardUpdateHeight = $t02486224974._2
573+ let previousRewardPerBlock = $t02486224974._3
574+ let poolRewardUpdateHeight = $t02486224974._4
575+ let $t02497925079 = claimCalc(pool, i.caller, 1)
576+ let userNewInterest = $t02497925079._1
577+ let currentInterest = $t02497925079._2
578+ let claimAmount = $t02497925079._3
579+ let userShareTokensAmount = $t02497925079._4
580580 let availableFund = (userAvailableSWOP(pool, i.caller) + claimAmount)
581581 let userClaimedAmount = getUserSWOPClaimedAmount(pool, i.caller)
582582 let userClaimedAmountNew = (userClaimedAmount + claimAmount)
583583 if ((availableFund == 0))
584584 then throw("You have 0 available SWOP")
585585 else if (!(isActive))
586586 then throw("DApp is inactive at this moment")
587587 else if ((availableFund == 0))
588588 then throw("You have 0 available SWOP")
589589 else if ((fraction(99, accountBalance(shareTokensId), 100) > shareTokenLocked))
590590 then throw("Balance of share-token is greater than totalAmount")
591- else [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), 0), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, availableFund, SWOP)]
591+ else [IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserLastInterest), userNewInterest), IntegerEntry((pool + keyLastInterest), currentInterest), IntegerEntry((pool + keyLastInterestHeight), height), IntegerEntry((((pool + "_") + toString(i.caller)) + keyAvailableSWOP), 0), Reissue(SWOP, availableFund, true), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPClaimedAmount), userClaimedAmountNew), IntegerEntry((((pool + "_") + toString(i.caller)) + keyUserSWOPLastClaimedAmount), claimAmount), ScriptTransfer(i.caller, availableFund, SWOP)]
592592 }
593593
594594
595595
596596 @Callable(i)
597597 func shutdown () = if (!(isActive))
598598 then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, keyCause), "the cause wasn't specified")))
599599 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
600600 then throw("Only admin can call this function")
601601 else suspend("Paused by admin")
602602
603603
604604
605605 @Callable(i)
606606 func activate () = if (isActive)
607607 then throw("DApp is already active")
608608 else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)))
609609 then throw("Only admin can call this function")
610610 else [BooleanEntry(keyActive, true), DeleteEntry(keyCause)]
611611
612612
613613 @Verifier(tx)
614614 func verify () = match tx {
615615 case _ =>
616616 let adminPubKey1Signed = if (sigVerify(tx.bodyBytes, tx.proofs[0], adminPubKey1))
617617 then 1
618618 else 0
619619 let adminPubKey2Signed = if (sigVerify(tx.bodyBytes, tx.proofs[1], adminPubKey2))
620620 then 1
621621 else 0
622622 let adminPubKey3Signed = if (sigVerify(tx.bodyBytes, tx.proofs[2], adminPubKey3))
623623 then 1
624624 else 0
625625 (((adminPubKey1Signed + adminPubKey2Signed) + adminPubKey3Signed) >= 2)
626626 }
627627

github/deemru/w8io/c3f4982 
119.08 ms