tx · 7dbKx3dUstEPnVzJgqhXgsgSLce4byC4GzrePxfpdfvF

3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE:  -0.02200000 Waves

2022.08.11 16:11 [2179861] smart account 3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE > SELF 0.00000000 Waves

{ "type": 13, "id": "7dbKx3dUstEPnVzJgqhXgsgSLce4byC4GzrePxfpdfvF", "fee": 2200000, "feeAssetId": null, "timestamp": 1660223524236, "version": 1, "sender": "3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE", "senderPublicKey": "G349Uq3FTox7dRNLeAfAQeoACvwZ9iEnVSaHcEYn6j8J", "proofs": [ "vcFETpyMQen3WMaEdYnUiA6Dx5FCNDp4n2zQFxZbBi7nLEsaHhu7bNRZqej5kZdLwSe1gt193MXnVmXdrZHe971" ], "script": "base64:BgJJCAISBAoCCAESABIDCgEBEgASABIAEgMKAQgSAwoBCBIDCgEIEgUKAwEBARIFCgMBAQESABIDCgEIEgcKBQgICAgIEgMKAQgSAE4AA1NFUAICX18ABVNDQUxFAOgHAAVNVUxUOACAwtcvAAp6ZXJvQmlnSW50CQC2AgEAAAAUcHJvY2Vzc2luZ1N0YWdlVG90YWwAAAAVcHJvY2Vzc2luZ1N0YWdlU2hhcmVzAAEBDmdldE51bWJlckJ5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUDa2V5AAABD2dldE51bWJlck9yRmFpbAEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUDa2V5CQCsAgIJAKwCAgIPbWFuZGF0b3J5IHRoaXMuBQNrZXkCDyBpcyBub3QgZGVmaW5lZAEOZ2V0U3RyaW5nQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQNrZXkCAAEPZ2V0U3RyaW5nT3JGYWlsAQNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQNrZXkJAKwCAgkArAICAg9tYW5kYXRvcnkgdGhpcy4FA2tleQIPIGlzIG5vdCBkZWZpbmVkAQNhYnMBA3ZhbAMJAL8CAgUKemVyb0JpZ0ludAUDdmFsCQC+AgEFA3ZhbAUDdmFsAAtrZXlNYXhEZXB0aAIMJXNfX21heERlcHRoAA9tYXhEZXB0aERlZmF1bHQAHgAIbWF4RGVwdGgJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwULa2V5TWF4RGVwdGgFD21heERlcHRoRGVmYXVsdAERa2V5RmFjdG9yeUFkZHJlc3MAAhwlcyVzX19jb25maWdfX2ZhY3RvcnlBZGRyZXNzABFmYWN0b3J5QWRkcmVzc1N0cgkBD2dldFN0cmluZ09yRmFpbAEJARFrZXlGYWN0b3J5QWRkcmVzcwAAD2ZhY3RvcnlDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQURZmFjdG9yeUFkZHJlc3NTdHIBEmtleUVtaXNzaW9uQWRkcmVzcwACHSVzJXNfX2NvbmZpZ19fZW1pc3Npb25BZGRyZXNzARNrZXlOdW1Ub1VzZXJNYXBwaW5nAQNudW0JALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIHbWFwcGluZwkAzAgCAghudW0ydXNlcgkAzAgCCQCkAwEFA251bQUDbmlsBQNTRVAAFmtleVJlZmVycmFsUHJvZ3JhbU5hbWUJALkJAgkAzAgCAgQlcyVzCQDMCAICCHJlZmVycmFsCQDMCAICC3Byb2dyYW1OYW1lBQNuaWwFA1NFUAAacmVmZXJyYWxQcm9ncmFtTmFtZURlZmF1bHQCBnd4bG9jawATcmVmZXJyYWxQcm9ncmFtTmFtZQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBRZrZXlSZWZlcnJhbFByb2dyYW1OYW1lBRpyZWZlcnJhbFByb2dyYW1OYW1lRGVmYXVsdAAXa2V5UmVmZXJyYWxNaW5HV3hBbW91bnQJALkJAgkAzAgCAgQlcyVzCQDMCAICCHJlZmVycmFsCQDMCAICDG1pbkdXeEFtb3VudAUDbmlsBQNTRVAAG3JlZmVycmFsTWluR1d4QW1vdW50RGVmYXVsdAkAaAIA9AMFBU1VTFQ4ABRyZWZlcnJhbE1pbkdXeEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRdrZXlSZWZlcnJhbE1pbkdXeEFtb3VudAUbcmVmZXJyYWxNaW5HV3hBbW91bnREZWZhdWx0ABlrZXlSZWZlcnJlclJld2FyZFBlcm1pbGxlCQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAhZyZWZlcnJlclJld2FyZFBlcm1pbGxlBQNuaWwFA1NFUAAdcmVmZXJyZXJSZXdhcmRQZXJtaWxsZURlZmF1bHQAMgAWcmVmZXJyZXJSZXdhcmRQZXJtaWxsZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRlrZXlSZWZlcnJlclJld2FyZFBlcm1pbGxlBR1yZWZlcnJlclJld2FyZFBlcm1pbGxlRGVmYXVsdAAZa2V5UmVmZXJyYWxSZXdhcmRQZXJtaWxsZQkAuQkCCQDMCAICBCVzJXMJAMwIAgIIcmVmZXJyYWwJAMwIAgIWcmVmZXJyYWxSZXdhcmRQZXJtaWxsZQUDbmlsBQNTRVAAHXJlZmVycmFsUmV3YXJkUGVybWlsbGVEZWZhdWx0ADIAFnJlZmVycmFsUmV3YXJkUGVybWlsbGUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUZa2V5UmVmZXJyYWxSZXdhcmRQZXJtaWxsZQUdcmVmZXJyYWxSZXdhcmRQZXJtaWxsZURlZmF1bHQBC2tleVJlZmVycmVyAQ9yZWZlcnJhbEFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIIcmVmZXJyZXIJAMwIAgUTcmVmZXJyYWxQcm9ncmFtTmFtZQkAzAgCBQ9yZWZlcnJhbEFkZHJlc3MFA25pbAUDU0VQARRrZXlVbmNsYWltZWRSZWZlcnJhbAILcHJvZ3JhbU5hbWUOY2xhaW1lckFkZHJlc3MJALkJAgkAzAgCAgglcyVzJXMlcwkAzAgCAhF1bmNsYWltZWRSZWZlcnJhbAkAzAgCBQtwcm9ncmFtTmFtZQkAzAgCBQ5jbGFpbWVyQWRkcmVzcwUDbmlsBQNTRVAAEmVtaXNzaW9uQWRkcmVzc1N0cgkBD2dldFN0cmluZ09yRmFpbAEJARJrZXlFbWlzc2lvbkFkZHJlc3MAABBlbWlzc2lvbkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBBRJlbWlzc2lvbkFkZHJlc3NTdHIADUlkeENmZ0Fzc2V0SWQAAQAWSWR4Q2ZnUGFjZW1ha2VyQWRkcmVzcwACABZJZHhDZmdCb29zdGluZ0NvbnRyYWN0AAMADklkeENmZ01heERlcHRoAAQBCWtleUNvbmZpZwACCiVzX19jb25maWcBFXJlYWRDb25maWdBcnJheU9yRmFpbAAJALUJAgkBD2dldFN0cmluZ09yRmFpbAEJAQlrZXlDb25maWcABQNTRVABDGZvcm1hdENvbmZpZwQMd3hBc3NldElkU3RyGm1hdGNoZXJQYWNlbWFrZXJBZGRyZXNzU3RyGmJvb3N0aW5nQ29udHJhY3RBZGRyZXNzU3RyCG1heERlcHRoCQC5CQIJAMwIAgIIJXMlcyVzJWQJAMwIAgUMd3hBc3NldElkU3RyCQDMCAIFGm1hdGNoZXJQYWNlbWFrZXJBZGRyZXNzU3RyCQDMCAIFGmJvb3N0aW5nQ29udHJhY3RBZGRyZXNzU3RyCQDMCAIJAKQDAQUIbWF4RGVwdGgFA25pbAUDU0VQARZib29zdGluZ0NvbnRyYWN0T3JGYWlsAAQIY2ZnQXJyYXkJARVyZWFkQ29uZmlnQXJyYXlPckZhaWwACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQhjZmdBcnJheQUWSWR4Q2ZnQm9vc3RpbmdDb250cmFjdAIoYm9vc3RpbmcgY29udHJhY3QgYWRkcmVzcyBpcyBub3QgZGVmaW5lZAEfa2V5R3d4UmV3YXJkRW1pc3Npb25TdGFydEhlaWdodAACKCVzJXNfX2d3eFJld2FyZEVtaXNzaW9uUGFydF9fc3RhcnRIZWlnaHQBDWtleVVzZXJzQ291bnQAAg8lc19fbmV4dFVzZXJOdW0BFmtleVJhdGVQZXJCbG9ja0N1cnJlbnQAAhslcyVzX19yYXRlUGVyQmxvY2tfX2N1cnJlbnQBFGtleVBvb2xXZWlnaHRWaXJ0dWFsAAIgJXMlc19fcG9vbFdlaWdodF9fR1dYdmlydHVhbFBPT0wBFGtleU5leHRQcm9jZXNzZWRVc2VyAAIVJXNfX25leHRQcm9jZXNzZWRVc2VyAQ9rZXlMYXRlc3RQZXJpb2QAAhAlc19fbGF0ZXN0UGVyaW9kAQ1rZXlOZXh0UGVyaW9kAAIOJXNfX25leHRQZXJpb2QBEmtleVByb2Nlc3NpbmdTdGFnZQACEyVzX19wcm9jZXNzaW5nU3RhZ2UBFmtleU5leHRQcm9jZXNzZWRQZXJpb2QAAhclc19fbmV4dFByb2Nlc3NlZFBlcmlvZAEQa2V5VXNlclVuY2xhaW1lZAEJdXNlckluZGV4CQC5CQIJAMwIAgIEJXMlZAkAzAgCAg11c2VyVW5jbGFpbWVkCQDMCAIJAKQDAQUJdXNlckluZGV4BQNuaWwFA1NFUAEba2V5TmV4dFVubGFpbWVkUGVyaW9kT2ZVc2VyAQl1c2VySW5kZXgJALkJAgkAzAgCAhclcyVkX19uZXh0Q2xhaW1lZFBlcmlvZAkAzAgCCQCkAwEFCXVzZXJJbmRleAUDbmlsBQNTRVABHGtleUxhc3RQcm9jZXNzZWRQZXJpb2RPZlVzZXIBCXVzZXJJbmRleAkAuQkCCQDMCAICGSVzJWRfX2xhc3RQcm9jZXNzZWRQZXJpb2QJAMwIAgkApAMBBQl1c2VySW5kZXgFA25pbAUDU0VQARJrZXlIZWlnaHRGb3JQZXJpb2QBBnBlcmlvZAkAuQkCCQDMCAICGiVzJWRfX3N0YXJ0SGVpZ2h0Rm9yUGVyaW9kCQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEda2V5QXV4RW1pc3Npb25SZXdhcmRGb3JQZXJpb2QBBnBlcmlvZAkAuQkCCQDMCAICFyVzJWRfX2F1eEVtaXNzaW9uUmV3YXJkCQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEXa2V5VG90YWxBbW91bnRGb3JQZXJpb2QBBnBlcmlvZAkAuQkCCQDMCAICGiVzJWRfX3RvdGFsQW1vdW50Rm9yUGVyaW9kCQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAERa2V5TGFzdFBheW91dEluZm8AAhIlc19fbGFzdFBheW91dEluZm8BEFBlcmlvZFBheW91dEluZm8DBnBlcmlvZA1tYXRjaGVyUmV3YXJkDmVtaXNzaW9uUmV3YXJkCQC5CQIJAMwIAgIGJWQlZCVkCQDMCAIJAKQDAQUGcGVyaW9kCQDMCAIJAKQDAQUNbWF0Y2hlclJld2FyZAkAzAgCCQCkAwEFDmVtaXNzaW9uUmV3YXJkBQNuaWwFA1NFUAEUa2V5UGF5b3V0SGlzdG9yeUluZm8BBnBlcmlvZAkAuQkCCQDMCAICGCVzJXMlZF9fcGF5b3V0c19faGlzdG9yeQkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABF2tleVRvdGFsV2VpZ2h0Rm9yUGVyaW9kAQZwZXJpb2QJALkJAgkAzAgCAholcyVkX190b3RhbFdlaWdodEZvclBlcmlvZAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABFmtleVVzZXJLVmFsdWVGb3JQZXJpb2QCBnBlcmlvZAl1c2VySW5kZXgJALkJAgkAzAgCAhclcyVkJXMlZF9fcGFyYW1CeVBlcmlvZAkAzAgCCQCkAwEFCXVzZXJJbmRleAkAzAgCAgFrCQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEWa2V5VXNlckJWYWx1ZUZvclBlcmlvZAIGcGVyaW9kCXVzZXJJbmRleAkAuQkCCQDMCAICFyVzJWQlcyVkX19wYXJhbUJ5UGVyaW9kCQDMCAIJAKQDAQUJdXNlckluZGV4CQDMCAICAWIJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARZrZXlVc2VyV2VpZ2h0Rm9yUGVyaW9kAgZwZXJpb2QJdXNlckluZGV4CQC5CQIJAMwIAgIXJXMlZCVzJWRfX3BhcmFtQnlQZXJpb2QJAMwIAgkApAMBBQl1c2VySW5kZXgJAMwIAgIGd2VpZ2h0CQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEba2V5UmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzAAkAuQkCCQDMCAICBCVzJXMJAMwIAgIGY29uZmlnCQDMCAICGHJlZmVycmFsc0NvbnRyYWN0QWRkcmVzcwUDbmlsBQNTRVAAHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBD2dldFN0cmluZ09yRmFpbAEJARtrZXlSZWZlcnJhbHNDb250cmFjdEFkZHJlc3MAAQxIaXN0b3J5RW50cnkEBHR5cGUEdXNlcgZhbW91bnQBaQQKaGlzdG9yeUtFWQkAuQkCCQDMCAICESVzJXMlcyVzX19oaXN0b3J5CQDMCAIFBHR5cGUJAMwIAgUEdXNlcgkAzAgCCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQFA25pbAUDU0VQBAtoaXN0b3J5REFUQQkAuQkCCQDMCAICDCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sGaGVpZ2h0CQDMCAIJAKQDAQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkApAMBBQZhbW91bnQFA25pbAUDU0VQCQELU3RyaW5nRW50cnkCBQpoaXN0b3J5S0VZBQtoaXN0b3J5REFUQQETa2V5TWFuYWdlclB1YmxpY0tleQACFCVzX19tYW5hZ2VyUHVibGljS2V5ARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQACGyVzX19wZW5kaW5nTWFuYWdlclB1YmxpY0tleQEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAAEByRtYXRjaDAJAKIIAQkBE2tleU1hbmFnZXJQdWJsaWNLZXkAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkA2QQBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgEdcGVuZGluZ01hbmFnZXJQdWJsaWNLZXlPclVuaXQABAckbWF0Y2gwCQCiCAEJARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQDZBAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQttdXN0TWFuYWdlcgEBaQQCcGQJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUCcGsGBQJwZAMJAAECBQckbWF0Y2gwAgRVbml0AwkAAAIIBQFpBmNhbGxlcgUEdGhpcwYFAnBkCQACAQILTWF0Y2ggZXJyb3IBDmNhbGNVc2VyV2VpZ2h0BBdib29zdGluZ0NvbnRyYWN0QWRkcmVzcw9oZWlnaHRGb3JQZXJpb2QGcGVyaW9kCXVzZXJJbmRleAQFa0xhc3QJARxrZXlMYXN0UHJvY2Vzc2VkUGVyaW9kT2ZVc2VyAQUJdXNlckluZGV4BARrS2V5CQEWa2V5VXNlcktWYWx1ZUZvclBlcmlvZAIFBnBlcmlvZAUJdXNlckluZGV4BARrUmF3CQCaCAIFF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzBQRrS2V5BAtrVXNlcldlaWdodAkBFmtleVVzZXJXZWlnaHRGb3JQZXJpb2QCBQZwZXJpb2QFCXVzZXJJbmRleAMJAQlpc0RlZmluZWQBBQRrUmF3BAFrCQEFdmFsdWUBBQRrUmF3BAFiCQEFdmFsdWUBCQCaCAIFF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzCQEWa2V5VXNlckJWYWx1ZUZvclBlcmlvZAIFBnBlcmlvZAUJdXNlckluZGV4BAF3CQBkAgkAaAIFAWsFD2hlaWdodEZvclBlcmlvZAUBYgMJAGYCBQF3AAAJAJQKAgkAaQIFAXcFBVNDQUxFCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQVrTGFzdAUGcGVyaW9kCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQtrVXNlcldlaWdodAUBdwUDbmlsCQCUCgIAAAUDbmlsBAFwCQCaCAIFBHRoaXMFBWtMYXN0AwMJAQlpc0RlZmluZWQBBQFwCQBnAgUGcGVyaW9kCQEFdmFsdWUBBQFwBwQCcHYJAQV2YWx1ZQEFAXAEAWsJAQV2YWx1ZQEJAJoIAgUXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MJARZrZXlVc2VyS1ZhbHVlRm9yUGVyaW9kAgUCcHYFCXVzZXJJbmRleAQBYgkBBXZhbHVlAQkAmggCBRdib29zdGluZ0NvbnRyYWN0QWRkcmVzcwkBFmtleVVzZXJCVmFsdWVGb3JQZXJpb2QCBQJwdgUJdXNlckluZGV4BAF3CQBkAgkAaAIFAWsFD2hlaWdodEZvclBlcmlvZAUBYgMJAGYCBQF3AAAJAJQKAgkAaQIFAXcFBVNDQUxFCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQtrVXNlcldlaWdodAUBdwUDbmlsCQCUCgIAAAUDbmlsCQCUCgIAAAUDbmlsARZjYWxjVXNlcldlaWdodEZvckNsYWltBBdib29zdGluZ0NvbnRyYWN0QWRkcmVzcw9oZWlnaHRGb3JQZXJpb2QGcGVyaW9kCXVzZXJJbmRleAQLa1VzZXJXZWlnaHQJARZrZXlVc2VyV2VpZ2h0Rm9yUGVyaW9kAgUGcGVyaW9kBQl1c2VySW5kZXgEEHVzZXJXZWlnaHRPclVuaXQJAJ8IAQULa1VzZXJXZWlnaHQEByRtYXRjaDAFEHVzZXJXZWlnaHRPclVuaXQDCQABAgUHJG1hdGNoMAIEVW5pdAAAAwkAAQIFByRtYXRjaDACA0ludAQBdwUHJG1hdGNoMAkAaQIFAXcFBVNDQUxFCQACAQILTWF0Y2ggZXJyb3IBFWdldFVzZXJJbmRleEJ5QWRkcmVzcwIaYm9vc3RpbmdDb250cmFjdEFkZHJlc3NTdHILdXNlckFkZHJlc3MEA2tleQkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgdtYXBwaW5nCQDMCAICCHVzZXIybnVtCQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAkBDXBhcnNlSW50VmFsdWUBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgkBB0FkZHJlc3MBCQDZBAEFGmJvb3N0aW5nQ29udHJhY3RBZGRyZXNzU3RyBQNrZXkJAKwCAgkArAICCQCsAgICDVVzZXIgYWRkcmVzcyAFC3VzZXJBZGRyZXNzAi0gaXMgbm90IGZvdW5kIGluIGJvb3N0aW5nIGNvbnRyYWN0IGRhdGEsIGtleT0FA2tleQEKbmV4dFBlcmlvZAAJAQ5nZXROdW1iZXJCeUtleQEJAQ1rZXlOZXh0UGVyaW9kAAERY29tbW9uQ2xhaW1SZXdhcmQBC3VzZXJBZGRyZXNzBAhjZmdBcnJheQkBFXJlYWRDb25maWdBcnJheU9yRmFpbAAEB3VzZXJJZHgJARVnZXRVc2VySW5kZXhCeUFkZHJlc3MCCQCRAwIFCGNmZ0FycmF5BRZJZHhDZmdCb29zdGluZ0NvbnRyYWN0BQt1c2VyQWRkcmVzcwQTdXNlclVuY2xhaW1lZE9wdGlvbgkAnwgBCQEQa2V5VXNlclVuY2xhaW1lZAEFB3VzZXJJZHgEByRtYXRjaDAFE3VzZXJVbmNsYWltZWRPcHRpb24DCQABAgUHJG1hdGNoMAIEVW5pdAkAlAoCAAAFA25pbAMJAAECBQckbWF0Y2gwAgNJbnQEAXUFByRtYXRjaDAJAJQKAgUBdQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEGtleVVzZXJVbmNsYWltZWQBBQd1c2VySWR4AAAFA25pbAkAAgECC01hdGNoIGVycm9yEAFpARZ1cGRhdGVSZWZlcnJhbEFjdGl2aXR5Agt1c2VyQWRkcmVzcw5nV3hBbW91bnRTdGFydAQIcmVmZXJyZXIJAJ0IAgUecmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzT3JGYWlsCQELa2V5UmVmZXJyZXIBBQt1c2VyQWRkcmVzcwQRYWN0aXZlUmVmZXJyYWxJbnYDCQAAAgUIcmVmZXJyZXIFBHVuaXQFBHVuaXQJAPwHBAUecmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzT3JGYWlsAhZ1cGRhdGVSZWZlcnJhbEFjdGl2aXR5CQDMCAIFE3JlZmVycmFsUHJvZ3JhbU5hbWUJAMwIAgULdXNlckFkZHJlc3MJAMwIAgkAZwIFDmdXeEFtb3VudFN0YXJ0BRRyZWZlcnJhbE1pbkdXeEFtb3VudAUDbmlsBQNuaWwDCQAAAgURYWN0aXZlUmVmZXJyYWxJbnYFEWFjdGl2ZVJlZmVycmFsSW52CQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5maW5hbGl6ZUhlbHBlcgAED3Byb2Nlc3NpbmdTdGFnZQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQESa2V5UHJvY2Vzc2luZ1N0YWdlAAUUcHJvY2Vzc2luZ1N0YWdlVG90YWwEDWN1cnJlbnRQZXJpb2QJAQ5nZXROdW1iZXJCeUtleQEJARZrZXlOZXh0UHJvY2Vzc2VkUGVyaW9kAAQLY3VycmVudFVzZXIJAQ5nZXROdW1iZXJCeUtleQEJARRrZXlOZXh0UHJvY2Vzc2VkVXNlcgAEDGxhdGVzdFBlcmlvZAkBDmdldE51bWJlckJ5S2V5AQkBD2tleUxhdGVzdFBlcmlvZAAECnVzZXJzQ291bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgkBFmJvb3N0aW5nQ29udHJhY3RPckZhaWwACQENa2V5VXNlcnNDb3VudAAAAAQOdG90YWxXZWlnaHRLZXkJARdrZXlUb3RhbFdlaWdodEZvclBlcmlvZAEFDWN1cnJlbnRQZXJpb2QEC3RvdGFsV2VpZ2h0CQEOZ2V0TnVtYmVyQnlLZXkBCQEXa2V5VG90YWxXZWlnaHRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBA9oZWlnaHRGb3JQZXJpb2QJAQ5nZXROdW1iZXJCeUtleQEJARJrZXlIZWlnaHRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kAwkAZgIFDWN1cnJlbnRQZXJpb2QFDGxhdGVzdFBlcmlvZAkAlAoCBQNuaWwHAwkAAAIFD3Byb2Nlc3NpbmdTdGFnZQUUcHJvY2Vzc2luZ1N0YWdlVG90YWwEDSR0MDEyMDI1MTIxNDEJAQ5jYWxjVXNlcldlaWdodAQJARZib29zdGluZ0NvbnRyYWN0T3JGYWlsAAUPaGVpZ2h0Rm9yUGVyaW9kBQ1jdXJyZW50UGVyaW9kBQtjdXJyZW50VXNlcgQKdXNlcldlaWdodAgFDSR0MDEyMDI1MTIxNDECXzEEC3VzZXJBY3Rpb25zCAUNJHQwMTIwMjUxMjE0MQJfMgQOdG90YWxXZWlnaHROZXcJAGQCBQt0b3RhbFdlaWdodAUKdXNlcldlaWdodAQRcHJvY2Vzc2luZ0FjdGlvbnMDCQBmAgkAZQIFCnVzZXJzQ291bnQAAQULY3VycmVudFVzZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlOZXh0UHJvY2Vzc2VkVXNlcgAJAGQCBQtjdXJyZW50VXNlcgABBQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIJARJrZXlQcm9jZXNzaW5nU3RhZ2UABRVwcm9jZXNzaW5nU3RhZ2VTaGFyZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlOZXh0UHJvY2Vzc2VkVXNlcgAAAAUDbmlsCQCUCgIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ50b3RhbFdlaWdodEtleQUOdG90YWxXZWlnaHROZXcFA25pbAURcHJvY2Vzc2luZ0FjdGlvbnMFC3VzZXJBY3Rpb25zBgMJAAACBQ9wcm9jZXNzaW5nU3RhZ2UFFXByb2Nlc3NpbmdTdGFnZVNoYXJlcwQKdXNlcldlaWdodAkBFmNhbGNVc2VyV2VpZ2h0Rm9yQ2xhaW0ECQEWYm9vc3RpbmdDb250cmFjdE9yRmFpbAAFD2hlaWdodEZvclBlcmlvZAUNY3VycmVudFBlcmlvZAULY3VycmVudFVzZXIEGnVzZXJBbW91bnRNYXRjaGVyRm9yUGVyaW9kCQBrAwkBDmdldE51bWJlckJ5S2V5AQkBF2tleVRvdGFsQW1vdW50Rm9yUGVyaW9kAQUNY3VycmVudFBlcmlvZAUKdXNlcldlaWdodAULdG90YWxXZWlnaHQEG3VzZXJBbW91bnRFbWlzc2lvbkZvclBlcmlvZAkAawMJAQ5nZXROdW1iZXJCeUtleQEJAR1rZXlBdXhFbWlzc2lvblJld2FyZEZvclBlcmlvZAEFDWN1cnJlbnRQZXJpb2QFCnVzZXJXZWlnaHQFC3RvdGFsV2VpZ2h0BA91c2VyVG90YWxBbW91bnQJAGQCBRt1c2VyQW1vdW50RW1pc3Npb25Gb3JQZXJpb2QFGnVzZXJBbW91bnRNYXRjaGVyRm9yUGVyaW9kBBN1c2VyVW5jbGFpbWVkT3B0aW9uCQCfCAEJARBrZXlVc2VyVW5jbGFpbWVkAQULY3VycmVudFVzZXIEC3VzZXJBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA1MykCCQEWYm9vc3RpbmdDb250cmFjdE9yRmFpbAAJARNrZXlOdW1Ub1VzZXJNYXBwaW5nAQULY3VycmVudFVzZXIECHJlZmVycmVyCQCdCAIFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAkBC2tleVJlZmVycmVyAQULdXNlckFkZHJlc3MEEWFjdGl2ZVJlZmVycmFsSW52AwkAAAIFCHJlZmVycmVyBQR1bml0BQR1bml0CQD8BwQFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAIWdXBkYXRlUmVmZXJyYWxBY3Rpdml0eQkAzAgCBRNyZWZlcnJhbFByb2dyYW1OYW1lCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIJAGcCBQp1c2VyV2VpZ2h0BRRyZWZlcnJhbE1pbkdXeEFtb3VudAUDbmlsBQNuaWwDCQAAAgURYWN0aXZlUmVmZXJyYWxJbnYFEWFjdGl2ZVJlZmVycmFsSW52BAtyZWZlcnJhbEludgMDCQAAAgUIcmVmZXJyZXIFBHVuaXQGCQBmAgUUcmVmZXJyYWxNaW5HV3hBbW91bnQFCnVzZXJXZWlnaHQFBHVuaXQEDnJlZmVycmVyUmV3YXJkCQBrAwUPdXNlclRvdGFsQW1vdW50BRZyZWZlcnJlclJld2FyZFBlcm1pbGxlBQVTQ0FMRQQOcmVmZXJyYWxSZXdhcmQJAGsDBQ91c2VyVG90YWxBbW91bnQFFnJlZmVycmFsUmV3YXJkUGVybWlsbGUFBVNDQUxFCQD8BwQFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAIMaW5jVW5jbGFpbWVkCQDMCAIFE3JlZmVycmFsUHJvZ3JhbU5hbWUJAMwIAgULdXNlckFkZHJlc3MJAMwIAgUOcmVmZXJyZXJSZXdhcmQJAMwIAgUOcmVmZXJyYWxSZXdhcmQFA25pbAUDbmlsAwkAAAIFC3JlZmVycmFsSW52BQtyZWZlcnJhbEludgQQdW5jbGFpbWVkQWN0aW9ucwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEGtleVVzZXJVbmNsYWltZWQBBQtjdXJyZW50VXNlcgkAZAIJAQt2YWx1ZU9yRWxzZQIFE3VzZXJVbmNsYWltZWRPcHRpb24AAAUPdXNlclRvdGFsQW1vdW50BQNuaWwEEXByb2Nlc3NpbmdBY3Rpb25zAwkAZgIJAGUCBQp1c2Vyc0NvdW50AAEFC2N1cnJlbnRVc2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TmV4dFByb2Nlc3NlZFVzZXIACQBkAgULY3VycmVudFVzZXIAAQUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5TmV4dFByb2Nlc3NlZFBlcmlvZAAJAGQCBQ1jdXJyZW50UGVyaW9kAAEJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlOZXh0UHJvY2Vzc2VkVXNlcgAAAAkAzAgCCQELRGVsZXRlRW50cnkBCQESa2V5UHJvY2Vzc2luZ1N0YWdlAAUDbmlsCQCUCgIJAM4IAgUQdW5jbGFpbWVkQWN0aW9ucwURcHJvY2Vzc2luZ0FjdGlvbnMGCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIYaW52YWxpZCBwcm9jZXNzaW5nIHN0YWdlAWkBD2ZpbmFsaXplV3JhcHBlcgEHY291bnRlcgQGcmVzdWx0CgABQAkA/AcEBQR0aGlzAg5maW5hbGl6ZUhlbHBlcgUDbmlsBQNuaWwDCQABAgUBQAIHQm9vbGVhbgUBQAkAAgEJAKwCAgkAAwEJAPwHBAUEdGhpcwIOZmluYWxpemVIZWxwZXIFA25pbAUDbmlsAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuAwkAAAIFBnJlc3VsdAUGcmVzdWx0AwkBASEBBQZyZXN1bHQDCQAAAgUHY291bnRlcgUIbWF4RGVwdGgJAAIBAhJOb3RoaW5nIHRvIHByb2Nlc3MJAJQKAgUDbmlsBQR1bml0AwkAZgIFB2NvdW50ZXIAAAkAlAoCBQNuaWwJAPwHBAUEdGhpcwIPZmluYWxpemVXcmFwcGVyCQDMCAIJAGUCBQdjb3VudGVyAAEFA25pbAUDbmlsCQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAR1wcm9jZXNzUGVuZGluZ1BlcmlvZHNBbmRVc2VycwAJAJQKAgUDbmlsCQD8BwQFBHRoaXMCD2ZpbmFsaXplV3JhcHBlcgkAzAgCBQhtYXhEZXB0aAUDbmlsBQNuaWwBaQEHZGVwb3NpdAAECGNmZ0FycmF5CQEVcmVhZENvbmZpZ0FycmF5T3JGYWlsAAMJAQIhPQIIBQFpBmNhbGxlcgkBB0FkZHJlc3MBCQDZBAEJAJEDAgUIY2ZnQXJyYXkFFklkeENmZ1BhY2VtYWtlckFkZHJlc3MJAAIBAhRXcm9uZyBjYWxsZXIgYWRkcmVzcwQHYXNzZXRJZAkBBXZhbHVlAQgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAwkBAiE9AgUHYXNzZXRJZAkA2QQBCQCRAwIFCGNmZ0FycmF5BQ1JZHhDZmdBc3NldElkCQACAQITV3JvbmcgcGF5bWVudCBhc3NldAQGcGVyaW9kCQEKbmV4dFBlcmlvZAAEBmRlbHRhSAkAZQIFBmhlaWdodAkBD2dldE51bWJlck9yRmFpbAEJAR9rZXlHd3hSZXdhcmRFbWlzc2lvblN0YXJ0SGVpZ2h0AAQMZW1pc3Npb25SYXRlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUQZW1pc3Npb25Db250cmFjdAkBFmtleVJhdGVQZXJCbG9ja0N1cnJlbnQACQCsAgIJAKwCAgIcbWFuZGF0b3J5IGVtaXNzaW9uX2NvbnRyYWN0LgkBFmtleVJhdGVQZXJCbG9ja0N1cnJlbnQAAg8gaXMgbm90IGRlZmluZWQEBndlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFD2ZhY3RvcnlDb250cmFjdAkBFGtleVBvb2xXZWlnaHRWaXJ0dWFsAAkArAICCQCsAgICG21hbmRhdG9yeSBmYWN0b3J5X2NvbnRyYWN0LgkBFGtleVBvb2xXZWlnaHRWaXJ0dWFsAAIPIGlzIG5vdCBkZWZpbmVkBAlhdXhBbW91bnQJAGsDCQBoAgUGZGVsdGFIBQZ3ZWlnaHQFDGVtaXNzaW9uUmF0ZQUFTVVMVDgEAmVtCQD8BwQFEGVtaXNzaW9uQ29udHJhY3QCBGVtaXQJAMwIAgUJYXV4QW1vdW50BQNuaWwFA25pbAMJAAACBQJlbQUCZW0EC21hdGNoZXJQYXJ0CAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQKcGF5b3V0SW5mbwkBEFBlcmlvZFBheW91dEluZm8DBQZwZXJpb2QFC21hdGNoZXJQYXJ0BQlhdXhBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlMYXRlc3RQZXJpb2QABQZwZXJpb2QJAMwIAgkBDEludGVnZXJFbnRyeQIJARJrZXlIZWlnaHRGb3JQZXJpb2QBBQZwZXJpb2QFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBHWtleUF1eEVtaXNzaW9uUmV3YXJkRm9yUGVyaW9kAQUGcGVyaW9kBQlhdXhBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAR9rZXlHd3hSZXdhcmRFbWlzc2lvblN0YXJ0SGVpZ2h0AAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEXa2V5VG90YWxBbW91bnRGb3JQZXJpb2QBBQZwZXJpb2QFC21hdGNoZXJQYXJ0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQENa2V5TmV4dFBlcmlvZAAJAGQCBQZwZXJpb2QAAQkAzAgCCQELU3RyaW5nRW50cnkCCQERa2V5TGFzdFBheW91dEluZm8ABQpwYXlvdXRJbmZvCQDMCAIJAQtTdHJpbmdFbnRyeQIJARRrZXlQYXlvdXRIaXN0b3J5SW5mbwEFBnBlcmlvZAUKcGF5b3V0SW5mbwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2NsYWltUmV3YXJkAAQIY2ZnQXJyYXkJARVyZWFkQ29uZmlnQXJyYXlPckZhaWwABAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgQNJHQwMTc0ODMxNzUzMwkBEWNvbW1vbkNsYWltUmV3YXJkAQUHYWRkcmVzcwQGYW1vdW50CAUNJHQwMTc0ODMxNzUzMwJfMQQHYWN0aW9ucwgFDSR0MDE3NDgzMTc1MzMCXzIEC2NoZWNrQW1vdW50AwkAZgIFBmFtb3VudAAABgkAAgECEE5vdGhpbmcgdG8gY2xhaW0DCQAAAgULY2hlY2tBbW91bnQFC2NoZWNrQW1vdW50BBJhbW91bnRGcm9tRW1pc3Npb24AAAQPY2xhaW1lZFJlZmVycmFsCgABQAkA/AcEBR5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwCBWNsYWltCQDMCAIFE3JlZmVycmFsUHJvZ3JhbU5hbWUFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEJAPwHBAUecmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzT3JGYWlsAgVjbGFpbQkAzAgCBRNyZWZlcnJhbFByb2dyYW1OYW1lBQNuaWwFA25pbAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50BAt0b3RhbEFtb3VudAkAZAIFBmFtb3VudAUPY2xhaW1lZFJlZmVycmFsCQCUCgIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC3RvdGFsQW1vdW50CQDZBAEJAJEDAgUIY2ZnQXJyYXkFDUlkeENmZ0Fzc2V0SWQJAMwIAgkBDEhpc3RvcnlFbnRyeQQCBWNsYWltBQdhZGRyZXNzBQZhbW91bnQFAWkFA25pbAUHYWN0aW9ucwkAzAgCBQt0b3RhbEFtb3VudAkAzAgCBRJhbW91bnRGcm9tRW1pc3Npb24FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARNjbGFpbVJld2FyZFJFQURPTkxZAQdhZGRyZXNzBA0kdDAxODEwNjE4MTU2CQERY29tbW9uQ2xhaW1SZXdhcmQBBQdhZGRyZXNzBAZhbW91bnQIBQ0kdDAxODEwNjE4MTU2Al8xBAdhY3Rpb25zCAUNJHQwMTgxMDYxODE1NgJfMgQRcmVmZXJyYWxVbmNsYWltZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUecmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzT3JGYWlsCQEUa2V5VW5jbGFpbWVkUmVmZXJyYWwCBRNyZWZlcnJhbFByb2dyYW1OYW1lBQdhZGRyZXNzAAAEC3RvdGFsQW1vdW50CQBkAgUGYW1vdW50BRFyZWZlcnJhbFVuY2xhaW1lZAkAlAoCBQNuaWwFC3RvdGFsQW1vdW50AWkBHWxhdGVzdEZpbmFsaXplZFBlcmlvZFJFQURPTkxZAQdhZGRyZXNzCQCUCgIFA25pbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEPa2V5TGF0ZXN0UGVyaW9kAAD///////////8BAWkBIWxhdGVzdEZpbmFsaXplZFBlcmlvZEluZm9SRUFET05MWQEHYWRkcmVzcwkAlAoCBQNuaWwJAQ5nZXRTdHJpbmdCeUtleQEJARFrZXlMYXN0UGF5b3V0SW5mbwABaQEVY2FsY0d3eFBhcmFtc1JFQURPTkxZAw5nd3hBbW91bnRTdGFydA9sb2NrU3RhcnRIZWlnaHQSbG9ja0R1cmF0aW9uQmxvY2tzBA1sb2NrRW5kSGVpZ2h0CQBkAgUPbG9ja1N0YXJ0SGVpZ2h0BRJsb2NrRHVyYXRpb25CbG9ja3MEDHNjYWxlOFBhcmFtSwkBAS0BCQBrAwUOZ3d4QW1vdW50U3RhcnQFBVNDQUxFBRJsb2NrRHVyYXRpb25CbG9ja3MEDHNjYWxlOFBhcmFtQgkAaAIJAGsDBQ5nd3hBbW91bnRTdGFydAUFU0NBTEUFEmxvY2tEdXJhdGlvbkJsb2NrcwUNbG9ja0VuZEhlaWdodAkAlAoCBQNuaWwJAMwIAgUMc2NhbGU4UGFyYW1LCQDMCAIFDHNjYWxlOFBhcmFtQgkAzAgCCQEKbmV4dFBlcmlvZAAFA25pbAFpARpjYWxjR3d4QW1vdW50U3RhcnRSRUFET05MWQMMd3hMb2NrQW1vdW50DGxvY2tEdXJhdGlvbg9tYXhMb2NrRHVyYXRpb24EB2NvZWZmWDgJAGsDBQxsb2NrRHVyYXRpb24FBU1VTFQ4BQ9tYXhMb2NrRHVyYXRpb24EDmdXeEFtb3VudFN0YXJ0CQBrAwUMd3hMb2NrQW1vdW50BQdjb2VmZlg4BQVNVUxUOAkAlAoCBQNuaWwJAMwIAgUOZ1d4QW1vdW50U3RhcnQFA25pbAFpARVvbkVtaXNzaW9uRm9yR3d4U3RhcnQAAwkBAiE9AggFAWkGY2FsbGVyBQ9mYWN0b3J5Q29udHJhY3QJAAIBAhJwZXJtaXNzaW9ucyBkZW5pZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAR9rZXlHd3hSZXdhcmRFbWlzc2lvblN0YXJ0SGVpZ2h0AAUGaGVpZ2h0BQNuaWwBaQEjbGF0ZXN0UGVyaW9kRW1pc3Npb25SZXdhcmRzUkVBRE9OTFkBB2FkZHJlc3MEBnBlcmlvZAkBCm5leHRQZXJpb2QACQCUCgIFA25pbAkAzAgCCQEOZ2V0TnVtYmVyQnlLZXkBCQEda2V5QXV4RW1pc3Npb25SZXdhcmRGb3JQZXJpb2QBBQZwZXJpb2QFA25pbAFpAQVjYWxjRAULeDFCaWdJbnRTdHILeDJCaWdJbnRTdHIMYW1wQmlnSW50U3RyE2FQcmVjaXNpb25CaWdJbnRTdHIYdGFyZ2V0UHJlY2lzaW9uQmlnSW50U3RyBAZuQ29pbnMJALYCAQACBAphUHJlY2lzaW9uCQCnAwEFE2FQcmVjaXNpb25CaWdJbnRTdHIED3RhcmdldFByZWNpc2lvbgkApwMBBRh0YXJnZXRQcmVjaXNpb25CaWdJbnRTdHIEAngxCQCnAwEFC3gxQmlnSW50U3RyBAJ4MgkApwMBBQt4MkJpZ0ludFN0cgQDYW1wCQC5AgIJAKcDAQUMYW1wQmlnSW50U3RyBQphUHJlY2lzaW9uBAFzCQC3AgIFAngxBQJ4MgMJAAACBQFzBQp6ZXJvQmlnSW50CQCUCgIFA25pbAkApgMBBQp6ZXJvQmlnSW50BANhbm4JALkCAgUDYW1wBQZuQ29pbnMEA2FycgkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcFA25pbAoBBGNhbGMCA2FjYwNjdXIEDSR0MDIwNzc5MjA5NjgFA2FjYwQBZAgFDSR0MDIwNzc5MjA5NjgCXzEEBWRQcmV2CAUNJHQwMjA3NzkyMDk2OAJfMgQCZHAJALoCAgkAuQICCQC5AgIFAWQFAWQFAWQJALkCAgkAuQICCQC5AgIFAngxBQJ4MgUGbkNvaW5zBQZuQ29pbnMEBWROZXh0CQC6AgIJALkCAgkAtwICCQC6AgIJALkCAgUDYW5uBQFzBQphUHJlY2lzaW9uCQC5AgIFAmRwBQZuQ29pbnMFAWQJALcCAgkAugICCQC5AgIJALgCAgUDYW5uBQphUHJlY2lzaW9uBQFkBQphUHJlY2lzaW9uCQC5AgIJALcCAgUGbkNvaW5zCQC2AgEAAQUCZHAJAJQKAgUFZE5leHQFAWQEDSR0MDIxMTgxMjEyMzEKAAIkbAUDYXJyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQFzBQR1bml0CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRjYWxjAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA3CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcEBWROZXh0CAUNJHQwMjExODEyMTIzMQJfMQQFZFByZXYIBQ0kdDAyMTE4MTIxMjMxAl8yBAVkRGlmZgkBA2FicwEJALgCAgUFZE5leHQJAQV2YWx1ZQEFBWRQcmV2AwkAwAICBQ90YXJnZXRQcmVjaXNpb24FBWREaWZmCQCUCgIFA25pbAkApgMBBQVkTmV4dAkAAgEJAKwCAgIdRCBjYWxjdWxhdGlvbiBlcnJvciwgZERpZmYgPSAJAKYDAQUFZERpZmYBaQEKc2V0TWFuYWdlcgEXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkEC2NoZWNrQ2FsbGVyCQELbXVzdE1hbmFnZXIBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQVY2hlY2tNYW5hZ2VyUHVibGljS2V5CQDZBAEFF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AwkAAAIFFWNoZWNrTWFuYWdlclB1YmxpY0tleQUVY2hlY2tNYW5hZ2VyUHVibGljS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIJARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAFF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOY29uZmlybU1hbmFnZXIABAJwbQkBHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0AAQFaGFzUE0DCQEJaXNEZWZpbmVkAQUCcG0GCQACAQISTm8gcGVuZGluZyBtYW5hZ2VyAwkAAAIFBWhhc1BNBQVoYXNQTQQHY2hlY2tQTQMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAnBtBgkAAgECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQdjaGVja1BNBQdjaGVja1BNCQDMCAIJAQtTdHJpbmdFbnRyeQIJARNrZXlNYW5hZ2VyUHVibGljS2V5AAkA2AQBCQEFdmFsdWUBBQJwbQkAzAgCCQELRGVsZXRlRW50cnkBCQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABA90YXJnZXRQdWJsaWNLZXkEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAUCcGsDCQABAgUHJG1hdGNoMAIEVW5pdAgFAnR4D3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQ90YXJnZXRQdWJsaWNLZXlH0ouQ", "chainId": 84, "height": 2179861, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8WkzGvaixETERnvaADLmZ6YTPLw1VeqmuXCeqivPcDjZ Next: HCRYnCtMWEQaCBiGBprj85R8ceyvQB1UT3ktgQd7EoPH Diff:
OldNewDifferences
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
5-
6-let USERDEPTH = 26
75
86 let SCALE = 1000
97
327325 then $Tuple2(nil, false)
328326 else if ((processingStage == processingStageTotal))
329327 then {
330- let $t01204412160 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
331- let userWeight = $t01204412160._1
332- let userActions = $t01204412160._2
328+ let $t01202512141 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
329+ let userWeight = $t01202512141._1
330+ let userActions = $t01202512141._2
333331 let totalWeightNew = (totalWeight + userWeight)
334332 let processingActions = if (((usersCount - 1) > currentUser))
335333 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
435433 func claimReward () = {
436434 let cfgArray = readConfigArrayOrFail()
437435 let address = toString(i.caller)
438- let $t01750217552 = commonClaimReward(address)
439- let amount = $t01750217552._1
440- let actions = $t01750217552._2
436+ let $t01748317533 = commonClaimReward(address)
437+ let amount = $t01748317533._1
438+ let actions = $t01748317533._2
441439 let checkAmount = if ((amount > 0))
442440 then true
443441 else throw("Nothing to claim")
460458
461459 @Callable(i)
462460 func claimRewardREADONLY (address) = {
463- let $t01812518175 = commonClaimReward(address)
464- let amount = $t01812518175._1
465- let actions = $t01812518175._2
461+ let $t01810618156 = commonClaimReward(address)
462+ let amount = $t01810618156._1
463+ let actions = $t01810618156._2
466464 let referralUnclaimed = valueOrElse(getInteger(referralsContractAddressOrFail, keyUnclaimedReferral(referralProgramName, address)), 0)
467465 let totalAmount = (amount + referralUnclaimed)
468466 $Tuple2(nil, totalAmount)
529527 let ann = (amp * nCoins)
530528 let arr = [1, 2, 3, 4, 5, 6, 7]
531529 func calc (acc,cur) = {
532- let $t02079820987 = acc
533- let d = $t02079820987._1
534- let dPrev = $t02079820987._2
530+ let $t02077920968 = acc
531+ let d = $t02077920968._1
532+ let dPrev = $t02077920968._2
535533 let dp = (((d * d) * d) / (((x1 * x2) * nCoins) * nCoins))
536534 let dNext = (((((ann * s) / aPrecision) + (dp * nCoins)) * d) / ((((ann - aPrecision) * d) / aPrecision) + ((nCoins + toBigInt(1)) * dp)))
537535 $Tuple2(dNext, d)
538536 }
539537
540- let $t02120021250 = {
538+ let $t02118121231 = {
541539 let $l = arr
542540 let $s = size($l)
543541 let $acc0 = $Tuple2(s, unit)
551549
552550 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
553551 }
554- let dNext = $t02120021250._1
555- let dPrev = $t02120021250._2
552+ let dNext = $t02118121231._1
553+ let dPrev = $t02118121231._2
556554 let dDiff = abs((dNext - value(dPrev)))
557555 if ((targetPrecision >= dDiff))
558556 then $Tuple2(nil, toString(dNext))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
5-
6-let USERDEPTH = 26
75
86 let SCALE = 1000
97
108 let MULT8 = 100000000
119
1210 let zeroBigInt = toBigInt(0)
1311
1412 let processingStageTotal = 0
1513
1614 let processingStageShares = 1
1715
1816 func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
1917
2018
2119 func getNumberOrFail (key) = valueOrErrorMessage(getInteger(this, key), (("mandatory this." + key) + " is not defined"))
2220
2321
2422 func getStringByKey (key) = valueOrElse(getString(this, key), "")
2523
2624
2725 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (("mandatory this." + key) + " is not defined"))
2826
2927
3028 func abs (val) = if ((zeroBigInt > val))
3129 then -(val)
3230 else val
3331
3432
3533 let keyMaxDepth = "%s__maxDepth"
3634
3735 let maxDepthDefault = 30
3836
3937 let maxDepth = valueOrElse(getInteger(this, keyMaxDepth), maxDepthDefault)
4038
4139 func keyFactoryAddress () = "%s%s__config__factoryAddress"
4240
4341
4442 let factoryAddressStr = getStringOrFail(keyFactoryAddress())
4543
4644 let factoryContract = addressFromStringValue(factoryAddressStr)
4745
4846 func keyEmissionAddress () = "%s%s__config__emissionAddress"
4947
5048
5149 func keyNumToUserMapping (num) = makeString(["%s%s%s", "mapping", "num2user", toString(num)], SEP)
5250
5351
5452 let keyReferralProgramName = makeString(["%s%s", "referral", "programName"], SEP)
5553
5654 let referralProgramNameDefault = "wxlock"
5755
5856 let referralProgramName = valueOrElse(getString(this, keyReferralProgramName), referralProgramNameDefault)
5957
6058 let keyReferralMinGWxAmount = makeString(["%s%s", "referral", "minGWxAmount"], SEP)
6159
6260 let referralMinGWxAmountDefault = (500 * MULT8)
6361
6462 let referralMinGWxAmount = valueOrElse(getInteger(this, keyReferralMinGWxAmount), referralMinGWxAmountDefault)
6563
6664 let keyReferrerRewardPermille = makeString(["%s%s", "referral", "referrerRewardPermille"], SEP)
6765
6866 let referrerRewardPermilleDefault = 50
6967
7068 let referrerRewardPermille = valueOrElse(getInteger(this, keyReferrerRewardPermille), referrerRewardPermilleDefault)
7169
7270 let keyReferralRewardPermille = makeString(["%s%s", "referral", "referralRewardPermille"], SEP)
7371
7472 let referralRewardPermilleDefault = 50
7573
7674 let referralRewardPermille = valueOrElse(getInteger(this, keyReferralRewardPermille), referralRewardPermilleDefault)
7775
7876 func keyReferrer (referralAddress) = makeString(["%s%s%s", "referrer", referralProgramName, referralAddress], SEP)
7977
8078
8179 func keyUnclaimedReferral (programName,claimerAddress) = makeString(["%s%s%s%s", "unclaimedReferral", programName, claimerAddress], SEP)
8280
8381
8482 let emissionAddressStr = getStringOrFail(keyEmissionAddress())
8583
8684 let emissionContract = addressFromStringValue(emissionAddressStr)
8785
8886 let IdxCfgAssetId = 1
8987
9088 let IdxCfgPacemakerAddress = 2
9189
9290 let IdxCfgBoostingContract = 3
9391
9492 let IdxCfgMaxDepth = 4
9593
9694 func keyConfig () = "%s__config"
9795
9896
9997 func readConfigArrayOrFail () = split(getStringOrFail(keyConfig()), SEP)
10098
10199
102100 func formatConfig (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr,maxDepth) = makeString(["%s%s%s%d", wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr, toString(maxDepth)], SEP)
103101
104102
105103 func boostingContractOrFail () = {
106104 let cfgArray = readConfigArrayOrFail()
107105 valueOrErrorMessage(addressFromString(cfgArray[IdxCfgBoostingContract]), "boosting contract address is not defined")
108106 }
109107
110108
111109 func keyGwxRewardEmissionStartHeight () = "%s%s__gwxRewardEmissionPart__startHeight"
112110
113111
114112 func keyUsersCount () = "%s__nextUserNum"
115113
116114
117115 func keyRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
118116
119117
120118 func keyPoolWeightVirtual () = "%s%s__poolWeight__GWXvirtualPOOL"
121119
122120
123121 func keyNextProcessedUser () = "%s__nextProcessedUser"
124122
125123
126124 func keyLatestPeriod () = "%s__latestPeriod"
127125
128126
129127 func keyNextPeriod () = "%s__nextPeriod"
130128
131129
132130 func keyProcessingStage () = "%s__processingStage"
133131
134132
135133 func keyNextProcessedPeriod () = "%s__nextProcessedPeriod"
136134
137135
138136 func keyUserUnclaimed (userIndex) = makeString(["%s%d", "userUnclaimed", toString(userIndex)], SEP)
139137
140138
141139 func keyNextUnlaimedPeriodOfUser (userIndex) = makeString(["%s%d__nextClaimedPeriod", toString(userIndex)], SEP)
142140
143141
144142 func keyLastProcessedPeriodOfUser (userIndex) = makeString(["%s%d__lastProcessedPeriod", toString(userIndex)], SEP)
145143
146144
147145 func keyHeightForPeriod (period) = makeString(["%s%d__startHeightForPeriod", toString(period)], SEP)
148146
149147
150148 func keyAuxEmissionRewardForPeriod (period) = makeString(["%s%d__auxEmissionReward", toString(period)], SEP)
151149
152150
153151 func keyTotalAmountForPeriod (period) = makeString(["%s%d__totalAmountForPeriod", toString(period)], SEP)
154152
155153
156154 func keyLastPayoutInfo () = "%s__lastPayoutInfo"
157155
158156
159157 func PeriodPayoutInfo (period,matcherReward,emissionReward) = makeString(["%d%d%d", toString(period), toString(matcherReward), toString(emissionReward)], SEP)
160158
161159
162160 func keyPayoutHistoryInfo (period) = makeString(["%s%s%d__payouts__history", toString(period)], SEP)
163161
164162
165163 func keyTotalWeightForPeriod (period) = makeString(["%s%d__totalWeightForPeriod", toString(period)], SEP)
166164
167165
168166 func keyUserKValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "k", toString(period)], SEP)
169167
170168
171169 func keyUserBValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "b", toString(period)], SEP)
172170
173171
174172 func keyUserWeightForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "weight", toString(period)], SEP)
175173
176174
177175 func keyReferralsContractAddress () = makeString(["%s%s", "config", "referralsContractAddress"], SEP)
178176
179177
180178 let referralsContractAddressOrFail = addressFromStringValue(getStringOrFail(keyReferralsContractAddress()))
181179
182180 func HistoryEntry (type,user,amount,i) = {
183181 let historyKEY = makeString(["%s%s%s%s__history", type, user, toBase58String(i.transactionId)], SEP)
184182 let historyDATA = makeString(["%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount)], SEP)
185183 StringEntry(historyKEY, historyDATA)
186184 }
187185
188186
189187 func keyManagerPublicKey () = "%s__managerPublicKey"
190188
191189
192190 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
193191
194192
195193 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
196194 case s: String =>
197195 fromBase58String(s)
198196 case _: Unit =>
199197 unit
200198 case _ =>
201199 throw("Match error")
202200 }
203201
204202
205203 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
206204 case s: String =>
207205 fromBase58String(s)
208206 case _: Unit =>
209207 unit
210208 case _ =>
211209 throw("Match error")
212210 }
213211
214212
215213 func mustManager (i) = {
216214 let pd = throw("Permission denied")
217215 match managerPublicKeyOrUnit() {
218216 case pk: ByteVector =>
219217 if ((i.callerPublicKey == pk))
220218 then true
221219 else pd
222220 case _: Unit =>
223221 if ((i.caller == this))
224222 then true
225223 else pd
226224 case _ =>
227225 throw("Match error")
228226 }
229227 }
230228
231229
232230 func calcUserWeight (boostingContractAddress,heightForPeriod,period,userIndex) = {
233231 let kLast = keyLastProcessedPeriodOfUser(userIndex)
234232 let kKey = keyUserKValueForPeriod(period, userIndex)
235233 let kRaw = getInteger(boostingContractAddress, kKey)
236234 let kUserWeight = keyUserWeightForPeriod(period, userIndex)
237235 if (isDefined(kRaw))
238236 then {
239237 let k = value(kRaw)
240238 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(period, userIndex)))
241239 let w = ((k * heightForPeriod) + b)
242240 if ((w > 0))
243241 then $Tuple2((w / SCALE), [IntegerEntry(kLast, period), IntegerEntry(kUserWeight, w)])
244242 else $Tuple2(0, nil)
245243 }
246244 else {
247245 let p = getInteger(this, kLast)
248246 if (if (isDefined(p))
249247 then (period >= value(p))
250248 else false)
251249 then {
252250 let pv = value(p)
253251 let k = value(getInteger(boostingContractAddress, keyUserKValueForPeriod(pv, userIndex)))
254252 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(pv, userIndex)))
255253 let w = ((k * heightForPeriod) + b)
256254 if ((w > 0))
257255 then $Tuple2((w / SCALE), [IntegerEntry(kUserWeight, w)])
258256 else $Tuple2(0, nil)
259257 }
260258 else $Tuple2(0, nil)
261259 }
262260 }
263261
264262
265263 func calcUserWeightForClaim (boostingContractAddress,heightForPeriod,period,userIndex) = {
266264 let kUserWeight = keyUserWeightForPeriod(period, userIndex)
267265 let userWeightOrUnit = getInteger(kUserWeight)
268266 match userWeightOrUnit {
269267 case _: Unit =>
270268 0
271269 case w: Int =>
272270 (w / SCALE)
273271 case _ =>
274272 throw("Match error")
275273 }
276274 }
277275
278276
279277 func getUserIndexByAddress (boostingContractAddressStr,userAddress) = {
280278 let key = makeString(["%s%s%s", "mapping", "user2num", userAddress], SEP)
281279 parseIntValue(valueOrErrorMessage(getString(Address(fromBase58String(boostingContractAddressStr)), key), ((("User address " + userAddress) + " is not found in boosting contract data, key=") + key)))
282280 }
283281
284282
285283 func nextPeriod () = getNumberByKey(keyNextPeriod())
286284
287285
288286 func commonClaimReward (userAddress) = {
289287 let cfgArray = readConfigArrayOrFail()
290288 let userIdx = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddress)
291289 let userUnclaimedOption = getInteger(keyUserUnclaimed(userIdx))
292290 match userUnclaimedOption {
293291 case _: Unit =>
294292 $Tuple2(0, nil)
295293 case u: Int =>
296294 $Tuple2(u, [IntegerEntry(keyUserUnclaimed(userIdx), 0)])
297295 case _ =>
298296 throw("Match error")
299297 }
300298 }
301299
302300
303301 @Callable(i)
304302 func updateReferralActivity (userAddress,gWxAmountStart) = {
305303 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
306304 let activeReferralInv = if ((referrer == unit))
307305 then unit
308306 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (gWxAmountStart >= referralMinGWxAmount)], nil)
309307 if ((activeReferralInv == activeReferralInv))
310308 then $Tuple2(nil, unit)
311309 else throw("Strict value is not equal to itself.")
312310 }
313311
314312
315313
316314 @Callable(i)
317315 func finalizeHelper () = {
318316 let processingStage = valueOrElse(getInteger(keyProcessingStage()), processingStageTotal)
319317 let currentPeriod = getNumberByKey(keyNextProcessedPeriod())
320318 let currentUser = getNumberByKey(keyNextProcessedUser())
321319 let latestPeriod = getNumberByKey(keyLatestPeriod())
322320 let usersCount = valueOrElse(getInteger(boostingContractOrFail(), keyUsersCount()), 0)
323321 let totalWeightKey = keyTotalWeightForPeriod(currentPeriod)
324322 let totalWeight = getNumberByKey(keyTotalWeightForPeriod(currentPeriod))
325323 let heightForPeriod = getNumberByKey(keyHeightForPeriod(currentPeriod))
326324 if ((currentPeriod > latestPeriod))
327325 then $Tuple2(nil, false)
328326 else if ((processingStage == processingStageTotal))
329327 then {
330- let $t01204412160 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
331- let userWeight = $t01204412160._1
332- let userActions = $t01204412160._2
328+ let $t01202512141 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
329+ let userWeight = $t01202512141._1
330+ let userActions = $t01202512141._2
333331 let totalWeightNew = (totalWeight + userWeight)
334332 let processingActions = if (((usersCount - 1) > currentUser))
335333 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
336334 else [IntegerEntry(keyProcessingStage(), processingStageShares), IntegerEntry(keyNextProcessedUser(), 0)]
337335 $Tuple2((([IntegerEntry(totalWeightKey, totalWeightNew)] ++ processingActions) ++ userActions), true)
338336 }
339337 else if ((processingStage == processingStageShares))
340338 then {
341339 let userWeight = calcUserWeightForClaim(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
342340 let userAmountMatcherForPeriod = fraction(getNumberByKey(keyTotalAmountForPeriod(currentPeriod)), userWeight, totalWeight)
343341 let userAmountEmissionForPeriod = fraction(getNumberByKey(keyAuxEmissionRewardForPeriod(currentPeriod)), userWeight, totalWeight)
344342 let userTotalAmount = (userAmountEmissionForPeriod + userAmountMatcherForPeriod)
345343 let userUnclaimedOption = getInteger(keyUserUnclaimed(currentUser))
346344 let userAddress = getStringValue(boostingContractOrFail(), keyNumToUserMapping(currentUser))
347345 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
348346 let activeReferralInv = if ((referrer == unit))
349347 then unit
350348 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (userWeight >= referralMinGWxAmount)], nil)
351349 if ((activeReferralInv == activeReferralInv))
352350 then {
353351 let referralInv = if (if ((referrer == unit))
354352 then true
355353 else (referralMinGWxAmount > userWeight))
356354 then unit
357355 else {
358356 let referrerReward = fraction(userTotalAmount, referrerRewardPermille, SCALE)
359357 let referralReward = fraction(userTotalAmount, referralRewardPermille, SCALE)
360358 invoke(referralsContractAddressOrFail, "incUnclaimed", [referralProgramName, userAddress, referrerReward, referralReward], nil)
361359 }
362360 if ((referralInv == referralInv))
363361 then {
364362 let unclaimedActions = [IntegerEntry(keyUserUnclaimed(currentUser), (valueOrElse(userUnclaimedOption, 0) + userTotalAmount))]
365363 let processingActions = if (((usersCount - 1) > currentUser))
366364 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
367365 else [IntegerEntry(keyNextProcessedPeriod(), (currentPeriod + 1)), IntegerEntry(keyNextProcessedUser(), 0), DeleteEntry(keyProcessingStage())]
368366 $Tuple2((unclaimedActions ++ processingActions), true)
369367 }
370368 else throw("Strict value is not equal to itself.")
371369 }
372370 else throw("Strict value is not equal to itself.")
373371 }
374372 else throw("invalid processing stage")
375373 }
376374
377375
378376
379377 @Callable(i)
380378 func finalizeWrapper (counter) = {
381379 let result = {
382380 let @ = invoke(this, "finalizeHelper", nil, nil)
383381 if ($isInstanceOf(@, "Boolean"))
384382 then @
385383 else throw(($getType(invoke(this, "finalizeHelper", nil, nil)) + " couldn't be cast to Boolean"))
386384 }
387385 if ((result == result))
388386 then if (!(result))
389387 then if ((counter == maxDepth))
390388 then throw("Nothing to process")
391389 else $Tuple2(nil, unit)
392390 else if ((counter > 0))
393391 then $Tuple2(nil, invoke(this, "finalizeWrapper", [(counter - 1)], nil))
394392 else $Tuple2(nil, unit)
395393 else throw("Strict value is not equal to itself.")
396394 }
397395
398396
399397
400398 @Callable(i)
401399 func processPendingPeriodsAndUsers () = $Tuple2(nil, invoke(this, "finalizeWrapper", [maxDepth], nil))
402400
403401
404402
405403 @Callable(i)
406404 func deposit () = {
407405 let cfgArray = readConfigArrayOrFail()
408406 if ((i.caller != Address(fromBase58String(cfgArray[IdxCfgPacemakerAddress]))))
409407 then throw("Wrong caller address")
410408 else {
411409 let assetId = value(value(i.payments[0]).assetId)
412410 if ((assetId != fromBase58String(cfgArray[IdxCfgAssetId])))
413411 then throw("Wrong payment asset")
414412 else {
415413 let period = nextPeriod()
416414 let deltaH = (height - getNumberOrFail(keyGwxRewardEmissionStartHeight()))
417415 let emissionRate = valueOrErrorMessage(getInteger(emissionContract, keyRatePerBlockCurrent()), (("mandatory emission_contract." + keyRatePerBlockCurrent()) + " is not defined"))
418416 let weight = valueOrErrorMessage(getInteger(factoryContract, keyPoolWeightVirtual()), (("mandatory factory_contract." + keyPoolWeightVirtual()) + " is not defined"))
419417 let auxAmount = fraction((deltaH * weight), emissionRate, MULT8)
420418 let em = invoke(emissionContract, "emit", [auxAmount], nil)
421419 if ((em == em))
422420 then {
423421 let matcherPart = value(i.payments[0]).amount
424422 let payoutInfo = PeriodPayoutInfo(period, matcherPart, auxAmount)
425423 [IntegerEntry(keyLatestPeriod(), period), IntegerEntry(keyHeightForPeriod(period), height), IntegerEntry(keyAuxEmissionRewardForPeriod(period), auxAmount), IntegerEntry(keyGwxRewardEmissionStartHeight(), height), IntegerEntry(keyTotalAmountForPeriod(period), matcherPart), IntegerEntry(keyNextPeriod(), (period + 1)), StringEntry(keyLastPayoutInfo(), payoutInfo), StringEntry(keyPayoutHistoryInfo(period), payoutInfo)]
426424 }
427425 else throw("Strict value is not equal to itself.")
428426 }
429427 }
430428 }
431429
432430
433431
434432 @Callable(i)
435433 func claimReward () = {
436434 let cfgArray = readConfigArrayOrFail()
437435 let address = toString(i.caller)
438- let $t01750217552 = commonClaimReward(address)
439- let amount = $t01750217552._1
440- let actions = $t01750217552._2
436+ let $t01748317533 = commonClaimReward(address)
437+ let amount = $t01748317533._1
438+ let actions = $t01748317533._2
441439 let checkAmount = if ((amount > 0))
442440 then true
443441 else throw("Nothing to claim")
444442 if ((checkAmount == checkAmount))
445443 then {
446444 let amountFromEmission = 0
447445 let claimedReferral = {
448446 let @ = invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)
449447 if ($isInstanceOf(@, "Int"))
450448 then @
451449 else throw(($getType(invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)) + " couldn't be cast to Int"))
452450 }
453451 let totalAmount = (amount + claimedReferral)
454452 $Tuple2(([ScriptTransfer(i.caller, totalAmount, fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, amount, i)] ++ actions), [totalAmount, amountFromEmission])
455453 }
456454 else throw("Strict value is not equal to itself.")
457455 }
458456
459457
460458
461459 @Callable(i)
462460 func claimRewardREADONLY (address) = {
463- let $t01812518175 = commonClaimReward(address)
464- let amount = $t01812518175._1
465- let actions = $t01812518175._2
461+ let $t01810618156 = commonClaimReward(address)
462+ let amount = $t01810618156._1
463+ let actions = $t01810618156._2
466464 let referralUnclaimed = valueOrElse(getInteger(referralsContractAddressOrFail, keyUnclaimedReferral(referralProgramName, address)), 0)
467465 let totalAmount = (amount + referralUnclaimed)
468466 $Tuple2(nil, totalAmount)
469467 }
470468
471469
472470
473471 @Callable(i)
474472 func latestFinalizedPeriodREADONLY (address) = $Tuple2(nil, valueOrElse(getInteger(this, keyLatestPeriod()), -1))
475473
476474
477475
478476 @Callable(i)
479477 func latestFinalizedPeriodInfoREADONLY (address) = $Tuple2(nil, getStringByKey(keyLastPayoutInfo()))
480478
481479
482480
483481 @Callable(i)
484482 func calcGwxParamsREADONLY (gwxAmountStart,lockStartHeight,lockDurationBlocks) = {
485483 let lockEndHeight = (lockStartHeight + lockDurationBlocks)
486484 let scale8ParamK = -(fraction(gwxAmountStart, SCALE, lockDurationBlocks))
487485 let scale8ParamB = (fraction(gwxAmountStart, SCALE, lockDurationBlocks) * lockEndHeight)
488486 $Tuple2(nil, [scale8ParamK, scale8ParamB, nextPeriod()])
489487 }
490488
491489
492490
493491 @Callable(i)
494492 func calcGwxAmountStartREADONLY (wxLockAmount,lockDuration,maxLockDuration) = {
495493 let coeffX8 = fraction(lockDuration, MULT8, maxLockDuration)
496494 let gWxAmountStart = fraction(wxLockAmount, coeffX8, MULT8)
497495 $Tuple2(nil, [gWxAmountStart])
498496 }
499497
500498
501499
502500 @Callable(i)
503501 func onEmissionForGwxStart () = if ((i.caller != factoryContract))
504502 then throw("permissions denied")
505503 else [IntegerEntry(keyGwxRewardEmissionStartHeight(), height)]
506504
507505
508506
509507 @Callable(i)
510508 func latestPeriodEmissionRewardsREADONLY (address) = {
511509 let period = nextPeriod()
512510 $Tuple2(nil, [getNumberByKey(keyAuxEmissionRewardForPeriod(period))])
513511 }
514512
515513
516514
517515 @Callable(i)
518516 func calcD (x1BigIntStr,x2BigIntStr,ampBigIntStr,aPrecisionBigIntStr,targetPrecisionBigIntStr) = {
519517 let nCoins = toBigInt(2)
520518 let aPrecision = parseBigIntValue(aPrecisionBigIntStr)
521519 let targetPrecision = parseBigIntValue(targetPrecisionBigIntStr)
522520 let x1 = parseBigIntValue(x1BigIntStr)
523521 let x2 = parseBigIntValue(x2BigIntStr)
524522 let amp = (parseBigIntValue(ampBigIntStr) * aPrecision)
525523 let s = (x1 + x2)
526524 if ((s == zeroBigInt))
527525 then $Tuple2(nil, toString(zeroBigInt))
528526 else {
529527 let ann = (amp * nCoins)
530528 let arr = [1, 2, 3, 4, 5, 6, 7]
531529 func calc (acc,cur) = {
532- let $t02079820987 = acc
533- let d = $t02079820987._1
534- let dPrev = $t02079820987._2
530+ let $t02077920968 = acc
531+ let d = $t02077920968._1
532+ let dPrev = $t02077920968._2
535533 let dp = (((d * d) * d) / (((x1 * x2) * nCoins) * nCoins))
536534 let dNext = (((((ann * s) / aPrecision) + (dp * nCoins)) * d) / ((((ann - aPrecision) * d) / aPrecision) + ((nCoins + toBigInt(1)) * dp)))
537535 $Tuple2(dNext, d)
538536 }
539537
540- let $t02120021250 = {
538+ let $t02118121231 = {
541539 let $l = arr
542540 let $s = size($l)
543541 let $acc0 = $Tuple2(s, unit)
544542 func $f0_1 ($a,$i) = if (($i >= $s))
545543 then $a
546544 else calc($a, $l[$i])
547545
548546 func $f0_2 ($a,$i) = if (($i >= $s))
549547 then $a
550548 else throw("List size exceeds 7")
551549
552550 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7)
553551 }
554- let dNext = $t02120021250._1
555- let dPrev = $t02120021250._2
552+ let dNext = $t02118121231._1
553+ let dPrev = $t02118121231._2
556554 let dDiff = abs((dNext - value(dPrev)))
557555 if ((targetPrecision >= dDiff))
558556 then $Tuple2(nil, toString(dNext))
559557 else throw(("D calculation error, dDiff = " + toString(dDiff)))
560558 }
561559 }
562560
563561
564562
565563 @Callable(i)
566564 func setManager (pendingManagerPublicKey) = {
567565 let checkCaller = mustManager(i)
568566 if ((checkCaller == checkCaller))
569567 then {
570568 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
571569 if ((checkManagerPublicKey == checkManagerPublicKey))
572570 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
573571 else throw("Strict value is not equal to itself.")
574572 }
575573 else throw("Strict value is not equal to itself.")
576574 }
577575
578576
579577
580578 @Callable(i)
581579 func confirmManager () = {
582580 let pm = pendingManagerPublicKeyOrUnit()
583581 let hasPM = if (isDefined(pm))
584582 then true
585583 else throw("No pending manager")
586584 if ((hasPM == hasPM))
587585 then {
588586 let checkPM = if ((i.callerPublicKey == value(pm)))
589587 then true
590588 else throw("You are not pending manager")
591589 if ((checkPM == checkPM))
592590 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
593591 else throw("Strict value is not equal to itself.")
594592 }
595593 else throw("Strict value is not equal to itself.")
596594 }
597595
598596
599597 @Verifier(tx)
600598 func verify () = {
601599 let targetPublicKey = match managerPublicKeyOrUnit() {
602600 case pk: ByteVector =>
603601 pk
604602 case _: Unit =>
605603 tx.senderPublicKey
606604 case _ =>
607605 throw("Match error")
608606 }
609607 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
610608 }
611609

github/deemru/w8io/3ef1775 
160.63 ms