tx · 2xBsvTkrX2SoZnQ3nskHcmxaS7PQTMQKeGUmyLHHtfCf

3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE:  -0.02700000 Waves

2022.09.26 11:03 [2245844] smart account 3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE > SELF 0.00000000 Waves

{ "type": 13, "id": "2xBsvTkrX2SoZnQ3nskHcmxaS7PQTMQKeGUmyLHHtfCf", "fee": 2700000, "feeAssetId": null, "timestamp": 1664179441252, "version": 1, "sender": "3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE", "senderPublicKey": "G349Uq3FTox7dRNLeAfAQeoACvwZ9iEnVSaHcEYn6j8J", "proofs": [ "MzYXBEuNz7nCThmRy8gswD6GoGWJefRNiJZRcj6Fsa4Gm9eVUfK1Xh1McFbtHEvVit8dj39mDPsq4pXxLTYAtC5" ], "script": "base64:BgJmCAISBAoCCAESABIDCgEBEgASABIAEgMKAQgSAwoBCBIDCgEIEgUKAwEBARIFCgMBAQESABIDCgEIEgcKBQgICAgIEgMKAQgSCgoICAgICAgICAgSCgoICAgICAgICAgSAwoBCBIATwADU0VQAgJfXwAFU0NBTEUA6AcABU1VTFQ4AIDC1y8ACnplcm9CaWdJbnQJALYCAQAAABRwcm9jZXNzaW5nU3RhZ2VUb3RhbAAAABVwcm9jZXNzaW5nU3RhZ2VTaGFyZXMAAQEOZ2V0TnVtYmVyQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkAAAEPZ2V0TnVtYmVyT3JGYWlsAQNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBQNrZXkJAKwCAgkArAICAg9tYW5kYXRvcnkgdGhpcy4FA2tleQIPIGlzIG5vdCBkZWZpbmVkAQ5nZXRTdHJpbmdCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQIAAQ9nZXRTdHJpbmdPckZhaWwBA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFA2tleQkArAICCQCsAgICD21hbmRhdG9yeSB0aGlzLgUDa2V5Ag8gaXMgbm90IGRlZmluZWQBA2FicwEDdmFsAwkAZgIAAAUDdmFsCQEBLQEFA3ZhbAUDdmFsAQlhYnNCaWdJbnQBA3ZhbAMJAL8CAgUKemVyb0JpZ0ludAUDdmFsCQC+AgEFA3ZhbAUDdmFsAAtrZXlNYXhEZXB0aAIMJXNfX21heERlcHRoAA9tYXhEZXB0aERlZmF1bHQAHgAIbWF4RGVwdGgJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwULa2V5TWF4RGVwdGgFD21heERlcHRoRGVmYXVsdAERa2V5RmFjdG9yeUFkZHJlc3MAAhwlcyVzX19jb25maWdfX2ZhY3RvcnlBZGRyZXNzABFmYWN0b3J5QWRkcmVzc1N0cgkBD2dldFN0cmluZ09yRmFpbAEJARFrZXlGYWN0b3J5QWRkcmVzcwAAD2ZhY3RvcnlDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQURZmFjdG9yeUFkZHJlc3NTdHIBEmtleUVtaXNzaW9uQWRkcmVzcwACHSVzJXNfX2NvbmZpZ19fZW1pc3Npb25BZGRyZXNzARNrZXlOdW1Ub1VzZXJNYXBwaW5nAQNudW0JALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIHbWFwcGluZwkAzAgCAghudW0ydXNlcgkAzAgCCQCkAwEFA251bQUDbmlsBQNTRVAAFmtleVJlZmVycmFsUHJvZ3JhbU5hbWUJALkJAgkAzAgCAgQlcyVzCQDMCAICCHJlZmVycmFsCQDMCAICC3Byb2dyYW1OYW1lBQNuaWwFA1NFUAAacmVmZXJyYWxQcm9ncmFtTmFtZURlZmF1bHQCBnd4bG9jawATcmVmZXJyYWxQcm9ncmFtTmFtZQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBRZrZXlSZWZlcnJhbFByb2dyYW1OYW1lBRpyZWZlcnJhbFByb2dyYW1OYW1lRGVmYXVsdAAXa2V5UmVmZXJyYWxNaW5HV3hBbW91bnQJALkJAgkAzAgCAgQlcyVzCQDMCAICCHJlZmVycmFsCQDMCAICDG1pbkdXeEFtb3VudAUDbmlsBQNTRVAAG3JlZmVycmFsTWluR1d4QW1vdW50RGVmYXVsdAkAaAIA9AMFBU1VTFQ4ABRyZWZlcnJhbE1pbkdXeEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRdrZXlSZWZlcnJhbE1pbkdXeEFtb3VudAUbcmVmZXJyYWxNaW5HV3hBbW91bnREZWZhdWx0ABlrZXlSZWZlcnJlclJld2FyZFBlcm1pbGxlCQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAhZyZWZlcnJlclJld2FyZFBlcm1pbGxlBQNuaWwFA1NFUAAdcmVmZXJyZXJSZXdhcmRQZXJtaWxsZURlZmF1bHQAMgAWcmVmZXJyZXJSZXdhcmRQZXJtaWxsZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRlrZXlSZWZlcnJlclJld2FyZFBlcm1pbGxlBR1yZWZlcnJlclJld2FyZFBlcm1pbGxlRGVmYXVsdAAZa2V5UmVmZXJyYWxSZXdhcmRQZXJtaWxsZQkAuQkCCQDMCAICBCVzJXMJAMwIAgIIcmVmZXJyYWwJAMwIAgIWcmVmZXJyYWxSZXdhcmRQZXJtaWxsZQUDbmlsBQNTRVAAHXJlZmVycmFsUmV3YXJkUGVybWlsbGVEZWZhdWx0ADIAFnJlZmVycmFsUmV3YXJkUGVybWlsbGUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUZa2V5UmVmZXJyYWxSZXdhcmRQZXJtaWxsZQUdcmVmZXJyYWxSZXdhcmRQZXJtaWxsZURlZmF1bHQBC2tleVJlZmVycmVyAQ9yZWZlcnJhbEFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIIcmVmZXJyZXIJAMwIAgUTcmVmZXJyYWxQcm9ncmFtTmFtZQkAzAgCBQ9yZWZlcnJhbEFkZHJlc3MFA25pbAUDU0VQARRrZXlVbmNsYWltZWRSZWZlcnJhbAILcHJvZ3JhbU5hbWUOY2xhaW1lckFkZHJlc3MJALkJAgkAzAgCAgglcyVzJXMlcwkAzAgCAhF1bmNsYWltZWRSZWZlcnJhbAkAzAgCBQtwcm9ncmFtTmFtZQkAzAgCBQ5jbGFpbWVyQWRkcmVzcwUDbmlsBQNTRVAAEmVtaXNzaW9uQWRkcmVzc1N0cgkBD2dldFN0cmluZ09yRmFpbAEJARJrZXlFbWlzc2lvbkFkZHJlc3MAABBlbWlzc2lvbkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBBRJlbWlzc2lvbkFkZHJlc3NTdHIADUlkeENmZ0Fzc2V0SWQAAQAWSWR4Q2ZnUGFjZW1ha2VyQWRkcmVzcwACABZJZHhDZmdCb29zdGluZ0NvbnRyYWN0AAMADklkeENmZ01heERlcHRoAAQBCWtleUNvbmZpZwACCiVzX19jb25maWcBFXJlYWRDb25maWdBcnJheU9yRmFpbAAJALUJAgkBD2dldFN0cmluZ09yRmFpbAEJAQlrZXlDb25maWcABQNTRVABDGZvcm1hdENvbmZpZwQMd3hBc3NldElkU3RyGm1hdGNoZXJQYWNlbWFrZXJBZGRyZXNzU3RyGmJvb3N0aW5nQ29udHJhY3RBZGRyZXNzU3RyCG1heERlcHRoCQC5CQIJAMwIAgIIJXMlcyVzJWQJAMwIAgUMd3hBc3NldElkU3RyCQDMCAIFGm1hdGNoZXJQYWNlbWFrZXJBZGRyZXNzU3RyCQDMCAIFGmJvb3N0aW5nQ29udHJhY3RBZGRyZXNzU3RyCQDMCAIJAKQDAQUIbWF4RGVwdGgFA25pbAUDU0VQARZib29zdGluZ0NvbnRyYWN0T3JGYWlsAAQIY2ZnQXJyYXkJARVyZWFkQ29uZmlnQXJyYXlPckZhaWwACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQhjZmdBcnJheQUWSWR4Q2ZnQm9vc3RpbmdDb250cmFjdAIoYm9vc3RpbmcgY29udHJhY3QgYWRkcmVzcyBpcyBub3QgZGVmaW5lZAEfa2V5R3d4UmV3YXJkRW1pc3Npb25TdGFydEhlaWdodAACKCVzJXNfX2d3eFJld2FyZEVtaXNzaW9uUGFydF9fc3RhcnRIZWlnaHQBDWtleVVzZXJzQ291bnQAAg8lc19fbmV4dFVzZXJOdW0BFmtleVJhdGVQZXJCbG9ja0N1cnJlbnQAAhslcyVzX19yYXRlUGVyQmxvY2tfX2N1cnJlbnQBFGtleVBvb2xXZWlnaHRWaXJ0dWFsAAIgJXMlc19fcG9vbFdlaWdodF9fR1dYdmlydHVhbFBPT0wBFGtleU5leHRQcm9jZXNzZWRVc2VyAAIVJXNfX25leHRQcm9jZXNzZWRVc2VyAQ9rZXlMYXRlc3RQZXJpb2QAAhAlc19fbGF0ZXN0UGVyaW9kAQ1rZXlOZXh0UGVyaW9kAAIOJXNfX25leHRQZXJpb2QBEmtleVByb2Nlc3NpbmdTdGFnZQACEyVzX19wcm9jZXNzaW5nU3RhZ2UBFmtleU5leHRQcm9jZXNzZWRQZXJpb2QAAhclc19fbmV4dFByb2Nlc3NlZFBlcmlvZAEQa2V5VXNlclVuY2xhaW1lZAEJdXNlckluZGV4CQC5CQIJAMwIAgIEJXMlZAkAzAgCAg11c2VyVW5jbGFpbWVkCQDMCAIJAKQDAQUJdXNlckluZGV4BQNuaWwFA1NFUAEba2V5TmV4dFVubGFpbWVkUGVyaW9kT2ZVc2VyAQl1c2VySW5kZXgJALkJAgkAzAgCAhclcyVkX19uZXh0Q2xhaW1lZFBlcmlvZAkAzAgCCQCkAwEFCXVzZXJJbmRleAUDbmlsBQNTRVABHGtleUxhc3RQcm9jZXNzZWRQZXJpb2RPZlVzZXIBCXVzZXJJbmRleAkAuQkCCQDMCAICGSVzJWRfX2xhc3RQcm9jZXNzZWRQZXJpb2QJAMwIAgkApAMBBQl1c2VySW5kZXgFA25pbAUDU0VQARJrZXlIZWlnaHRGb3JQZXJpb2QBBnBlcmlvZAkAuQkCCQDMCAICGiVzJWRfX3N0YXJ0SGVpZ2h0Rm9yUGVyaW9kCQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEda2V5QXV4RW1pc3Npb25SZXdhcmRGb3JQZXJpb2QBBnBlcmlvZAkAuQkCCQDMCAICFyVzJWRfX2F1eEVtaXNzaW9uUmV3YXJkCQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEXa2V5VG90YWxBbW91bnRGb3JQZXJpb2QBBnBlcmlvZAkAuQkCCQDMCAICGiVzJWRfX3RvdGFsQW1vdW50Rm9yUGVyaW9kCQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAERa2V5TGFzdFBheW91dEluZm8AAhIlc19fbGFzdFBheW91dEluZm8BEFBlcmlvZFBheW91dEluZm8DBnBlcmlvZA1tYXRjaGVyUmV3YXJkDmVtaXNzaW9uUmV3YXJkCQC5CQIJAMwIAgIGJWQlZCVkCQDMCAIJAKQDAQUGcGVyaW9kCQDMCAIJAKQDAQUNbWF0Y2hlclJld2FyZAkAzAgCCQCkAwEFDmVtaXNzaW9uUmV3YXJkBQNuaWwFA1NFUAEUa2V5UGF5b3V0SGlzdG9yeUluZm8BBnBlcmlvZAkAuQkCCQDMCAICGCVzJXMlZF9fcGF5b3V0c19faGlzdG9yeQkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABF2tleVRvdGFsV2VpZ2h0Rm9yUGVyaW9kAQZwZXJpb2QJALkJAgkAzAgCAholcyVkX190b3RhbFdlaWdodEZvclBlcmlvZAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABFmtleVVzZXJLVmFsdWVGb3JQZXJpb2QCBnBlcmlvZAl1c2VySW5kZXgJALkJAgkAzAgCAhclcyVkJXMlZF9fcGFyYW1CeVBlcmlvZAkAzAgCCQCkAwEFCXVzZXJJbmRleAkAzAgCAgFrCQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEWa2V5VXNlckJWYWx1ZUZvclBlcmlvZAIGcGVyaW9kCXVzZXJJbmRleAkAuQkCCQDMCAICFyVzJWQlcyVkX19wYXJhbUJ5UGVyaW9kCQDMCAIJAKQDAQUJdXNlckluZGV4CQDMCAICAWIJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARZrZXlVc2VyV2VpZ2h0Rm9yUGVyaW9kAgZwZXJpb2QJdXNlckluZGV4CQC5CQIJAMwIAgIXJXMlZCVzJWRfX3BhcmFtQnlQZXJpb2QJAMwIAgkApAMBBQl1c2VySW5kZXgJAMwIAgIGd2VpZ2h0CQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEba2V5UmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzAAkAuQkCCQDMCAICBCVzJXMJAMwIAgIGY29uZmlnCQDMCAICGHJlZmVycmFsc0NvbnRyYWN0QWRkcmVzcwUDbmlsBQNTRVAAHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBD2dldFN0cmluZ09yRmFpbAEJARtrZXlSZWZlcnJhbHNDb250cmFjdEFkZHJlc3MAAQxIaXN0b3J5RW50cnkEBHR5cGUEdXNlcgZhbW91bnQBaQQKaGlzdG9yeUtFWQkAuQkCCQDMCAICESVzJXMlcyVzX19oaXN0b3J5CQDMCAIFBHR5cGUJAMwIAgUEdXNlcgkAzAgCCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQFA25pbAUDU0VQBAtoaXN0b3J5REFUQQkAuQkCCQDMCAICDCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sGaGVpZ2h0CQDMCAIJAKQDAQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkApAMBBQZhbW91bnQFA25pbAUDU0VQCQELU3RyaW5nRW50cnkCBQpoaXN0b3J5S0VZBQtoaXN0b3J5REFUQQETa2V5TWFuYWdlclB1YmxpY0tleQACFCVzX19tYW5hZ2VyUHVibGljS2V5ARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQACGyVzX19wZW5kaW5nTWFuYWdlclB1YmxpY0tleQEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAAEByRtYXRjaDAJAKIIAQkBE2tleU1hbmFnZXJQdWJsaWNLZXkAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkA2QQBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgEdcGVuZGluZ01hbmFnZXJQdWJsaWNLZXlPclVuaXQABAckbWF0Y2gwCQCiCAEJARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQDZBAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQttdXN0TWFuYWdlcgEBaQQCcGQJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUCcGsGBQJwZAMJAAECBQckbWF0Y2gwAgRVbml0AwkAAAIIBQFpBmNhbGxlcgUEdGhpcwYFAnBkCQACAQILTWF0Y2ggZXJyb3IBDmNhbGNVc2VyV2VpZ2h0BBdib29zdGluZ0NvbnRyYWN0QWRkcmVzcw9oZWlnaHRGb3JQZXJpb2QGcGVyaW9kCXVzZXJJbmRleAQFa0xhc3QJARxrZXlMYXN0UHJvY2Vzc2VkUGVyaW9kT2ZVc2VyAQUJdXNlckluZGV4BARrS2V5CQEWa2V5VXNlcktWYWx1ZUZvclBlcmlvZAIFBnBlcmlvZAUJdXNlckluZGV4BARrUmF3CQCaCAIFF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzBQRrS2V5BAtrVXNlcldlaWdodAkBFmtleVVzZXJXZWlnaHRGb3JQZXJpb2QCBQZwZXJpb2QFCXVzZXJJbmRleAMJAQlpc0RlZmluZWQBBQRrUmF3BAFrCQEFdmFsdWUBBQRrUmF3BAFiCQEFdmFsdWUBCQCaCAIFF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzCQEWa2V5VXNlckJWYWx1ZUZvclBlcmlvZAIFBnBlcmlvZAUJdXNlckluZGV4BAF3CQBkAgkAaAIFAWsFD2hlaWdodEZvclBlcmlvZAUBYgMJAGYCBQF3AAAJAJQKAgkAaQIFAXcFBVNDQUxFCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQVrTGFzdAUGcGVyaW9kCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQtrVXNlcldlaWdodAUBdwUDbmlsCQCUCgIAAAUDbmlsBAFwCQCaCAIFBHRoaXMFBWtMYXN0AwMJAQlpc0RlZmluZWQBBQFwCQBnAgUGcGVyaW9kCQEFdmFsdWUBBQFwBwQCcHYJAQV2YWx1ZQEFAXAEAWsJAQV2YWx1ZQEJAJoIAgUXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MJARZrZXlVc2VyS1ZhbHVlRm9yUGVyaW9kAgUCcHYFCXVzZXJJbmRleAQBYgkBBXZhbHVlAQkAmggCBRdib29zdGluZ0NvbnRyYWN0QWRkcmVzcwkBFmtleVVzZXJCVmFsdWVGb3JQZXJpb2QCBQJwdgUJdXNlckluZGV4BAF3CQBkAgkAaAIFAWsFD2hlaWdodEZvclBlcmlvZAUBYgMJAGYCBQF3AAAJAJQKAgkAaQIFAXcFBVNDQUxFCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQtrVXNlcldlaWdodAUBdwUDbmlsCQCUCgIAAAUDbmlsCQCUCgIAAAUDbmlsARZjYWxjVXNlcldlaWdodEZvckNsYWltBBdib29zdGluZ0NvbnRyYWN0QWRkcmVzcw9oZWlnaHRGb3JQZXJpb2QGcGVyaW9kCXVzZXJJbmRleAQLa1VzZXJXZWlnaHQJARZrZXlVc2VyV2VpZ2h0Rm9yUGVyaW9kAgUGcGVyaW9kBQl1c2VySW5kZXgEEHVzZXJXZWlnaHRPclVuaXQJAJ8IAQULa1VzZXJXZWlnaHQEByRtYXRjaDAFEHVzZXJXZWlnaHRPclVuaXQDCQABAgUHJG1hdGNoMAIEVW5pdAAAAwkAAQIFByRtYXRjaDACA0ludAQBdwUHJG1hdGNoMAkAaQIFAXcFBVNDQUxFCQACAQILTWF0Y2ggZXJyb3IBFWdldFVzZXJJbmRleEJ5QWRkcmVzcwIaYm9vc3RpbmdDb250cmFjdEFkZHJlc3NTdHILdXNlckFkZHJlc3MEA2tleQkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgdtYXBwaW5nCQDMCAICCHVzZXIybnVtCQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAkBDXBhcnNlSW50VmFsdWUBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgkBB0FkZHJlc3MBCQDZBAEFGmJvb3N0aW5nQ29udHJhY3RBZGRyZXNzU3RyBQNrZXkJAKwCAgkArAICCQCsAgICDVVzZXIgYWRkcmVzcyAFC3VzZXJBZGRyZXNzAi0gaXMgbm90IGZvdW5kIGluIGJvb3N0aW5nIGNvbnRyYWN0IGRhdGEsIGtleT0FA2tleQEKbmV4dFBlcmlvZAAJAQ5nZXROdW1iZXJCeUtleQEJAQ1rZXlOZXh0UGVyaW9kAAERY29tbW9uQ2xhaW1SZXdhcmQBC3VzZXJBZGRyZXNzBAhjZmdBcnJheQkBFXJlYWRDb25maWdBcnJheU9yRmFpbAAEB3VzZXJJZHgJARVnZXRVc2VySW5kZXhCeUFkZHJlc3MCCQCRAwIFCGNmZ0FycmF5BRZJZHhDZmdCb29zdGluZ0NvbnRyYWN0BQt1c2VyQWRkcmVzcwQTdXNlclVuY2xhaW1lZE9wdGlvbgkAnwgBCQEQa2V5VXNlclVuY2xhaW1lZAEFB3VzZXJJZHgEByRtYXRjaDAFE3VzZXJVbmNsYWltZWRPcHRpb24DCQABAgUHJG1hdGNoMAIEVW5pdAkAlAoCAAAFA25pbAMJAAECBQckbWF0Y2gwAgNJbnQEAXUFByRtYXRjaDAJAJQKAgUBdQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEGtleVVzZXJVbmNsYWltZWQBBQd1c2VySWR4AAAFA25pbAkAAgECC01hdGNoIGVycm9yEwFpARZ1cGRhdGVSZWZlcnJhbEFjdGl2aXR5Agt1c2VyQWRkcmVzcw5nV3hBbW91bnRTdGFydAQIcmVmZXJyZXIJAJ0IAgUecmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzT3JGYWlsCQELa2V5UmVmZXJyZXIBBQt1c2VyQWRkcmVzcwQRYWN0aXZlUmVmZXJyYWxJbnYDCQAAAgUIcmVmZXJyZXIFBHVuaXQFBHVuaXQJAPwHBAUecmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzT3JGYWlsAhZ1cGRhdGVSZWZlcnJhbEFjdGl2aXR5CQDMCAIFE3JlZmVycmFsUHJvZ3JhbU5hbWUJAMwIAgULdXNlckFkZHJlc3MJAMwIAgkAZwIFDmdXeEFtb3VudFN0YXJ0BRRyZWZlcnJhbE1pbkdXeEFtb3VudAUDbmlsBQNuaWwDCQAAAgURYWN0aXZlUmVmZXJyYWxJbnYFEWFjdGl2ZVJlZmVycmFsSW52CQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5maW5hbGl6ZUhlbHBlcgAED3Byb2Nlc3NpbmdTdGFnZQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQESa2V5UHJvY2Vzc2luZ1N0YWdlAAUUcHJvY2Vzc2luZ1N0YWdlVG90YWwEDWN1cnJlbnRQZXJpb2QJAQ5nZXROdW1iZXJCeUtleQEJARZrZXlOZXh0UHJvY2Vzc2VkUGVyaW9kAAQLY3VycmVudFVzZXIJAQ5nZXROdW1iZXJCeUtleQEJARRrZXlOZXh0UHJvY2Vzc2VkVXNlcgAEDGxhdGVzdFBlcmlvZAkBDmdldE51bWJlckJ5S2V5AQkBD2tleUxhdGVzdFBlcmlvZAAECnVzZXJzQ291bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgkBFmJvb3N0aW5nQ29udHJhY3RPckZhaWwACQENa2V5VXNlcnNDb3VudAAAAAQOdG90YWxXZWlnaHRLZXkJARdrZXlUb3RhbFdlaWdodEZvclBlcmlvZAEFDWN1cnJlbnRQZXJpb2QEC3RvdGFsV2VpZ2h0CQEOZ2V0TnVtYmVyQnlLZXkBCQEXa2V5VG90YWxXZWlnaHRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBA9oZWlnaHRGb3JQZXJpb2QJAQ5nZXROdW1iZXJCeUtleQEJARJrZXlIZWlnaHRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kAwkAZgIFDWN1cnJlbnRQZXJpb2QFDGxhdGVzdFBlcmlvZAkAlAoCBQNuaWwHAwkAAAIFD3Byb2Nlc3NpbmdTdGFnZQUUcHJvY2Vzc2luZ1N0YWdlVG90YWwEDSR0MDEyMDg0MTIyMDAJAQ5jYWxjVXNlcldlaWdodAQJARZib29zdGluZ0NvbnRyYWN0T3JGYWlsAAUPaGVpZ2h0Rm9yUGVyaW9kBQ1jdXJyZW50UGVyaW9kBQtjdXJyZW50VXNlcgQKdXNlcldlaWdodAgFDSR0MDEyMDg0MTIyMDACXzEEC3VzZXJBY3Rpb25zCAUNJHQwMTIwODQxMjIwMAJfMgQOdG90YWxXZWlnaHROZXcJAGQCBQt0b3RhbFdlaWdodAUKdXNlcldlaWdodAQRcHJvY2Vzc2luZ0FjdGlvbnMDCQBmAgkAZQIFCnVzZXJzQ291bnQAAQULY3VycmVudFVzZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlOZXh0UHJvY2Vzc2VkVXNlcgAJAGQCBQtjdXJyZW50VXNlcgABBQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIJARJrZXlQcm9jZXNzaW5nU3RhZ2UABRVwcm9jZXNzaW5nU3RhZ2VTaGFyZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlOZXh0UHJvY2Vzc2VkVXNlcgAAAAUDbmlsCQCUCgIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQ50b3RhbFdlaWdodEtleQUOdG90YWxXZWlnaHROZXcFA25pbAURcHJvY2Vzc2luZ0FjdGlvbnMFC3VzZXJBY3Rpb25zBgMJAAACBQ9wcm9jZXNzaW5nU3RhZ2UFFXByb2Nlc3NpbmdTdGFnZVNoYXJlcwQKdXNlcldlaWdodAkBFmNhbGNVc2VyV2VpZ2h0Rm9yQ2xhaW0ECQEWYm9vc3RpbmdDb250cmFjdE9yRmFpbAAFD2hlaWdodEZvclBlcmlvZAUNY3VycmVudFBlcmlvZAULY3VycmVudFVzZXIEGnVzZXJBbW91bnRNYXRjaGVyRm9yUGVyaW9kCQBrAwkBDmdldE51bWJlckJ5S2V5AQkBF2tleVRvdGFsQW1vdW50Rm9yUGVyaW9kAQUNY3VycmVudFBlcmlvZAUKdXNlcldlaWdodAULdG90YWxXZWlnaHQEG3VzZXJBbW91bnRFbWlzc2lvbkZvclBlcmlvZAkAawMJAQ5nZXROdW1iZXJCeUtleQEJAR1rZXlBdXhFbWlzc2lvblJld2FyZEZvclBlcmlvZAEFDWN1cnJlbnRQZXJpb2QFCnVzZXJXZWlnaHQFC3RvdGFsV2VpZ2h0BA91c2VyVG90YWxBbW91bnQJAGQCBRt1c2VyQW1vdW50RW1pc3Npb25Gb3JQZXJpb2QFGnVzZXJBbW91bnRNYXRjaGVyRm9yUGVyaW9kBBN1c2VyVW5jbGFpbWVkT3B0aW9uCQCfCAEJARBrZXlVc2VyVW5jbGFpbWVkAQULY3VycmVudFVzZXIEC3VzZXJBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA1MykCCQEWYm9vc3RpbmdDb250cmFjdE9yRmFpbAAJARNrZXlOdW1Ub1VzZXJNYXBwaW5nAQULY3VycmVudFVzZXIECHJlZmVycmVyCQCdCAIFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAkBC2tleVJlZmVycmVyAQULdXNlckFkZHJlc3MEEWFjdGl2ZVJlZmVycmFsSW52AwkAAAIFCHJlZmVycmVyBQR1bml0BQR1bml0CQD8BwQFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAIWdXBkYXRlUmVmZXJyYWxBY3Rpdml0eQkAzAgCBRNyZWZlcnJhbFByb2dyYW1OYW1lCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIJAGcCBQp1c2VyV2VpZ2h0BRRyZWZlcnJhbE1pbkdXeEFtb3VudAUDbmlsBQNuaWwDCQAAAgURYWN0aXZlUmVmZXJyYWxJbnYFEWFjdGl2ZVJlZmVycmFsSW52BAtyZWZlcnJhbEludgMDCQAAAgUIcmVmZXJyZXIFBHVuaXQGCQBmAgUUcmVmZXJyYWxNaW5HV3hBbW91bnQFCnVzZXJXZWlnaHQFBHVuaXQEDnJlZmVycmVyUmV3YXJkCQBrAwUPdXNlclRvdGFsQW1vdW50BRZyZWZlcnJlclJld2FyZFBlcm1pbGxlBQVTQ0FMRQQOcmVmZXJyYWxSZXdhcmQJAGsDBQ91c2VyVG90YWxBbW91bnQFFnJlZmVycmFsUmV3YXJkUGVybWlsbGUFBVNDQUxFCQD8BwQFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAIMaW5jVW5jbGFpbWVkCQDMCAIFE3JlZmVycmFsUHJvZ3JhbU5hbWUJAMwIAgULdXNlckFkZHJlc3MJAMwIAgUOcmVmZXJyZXJSZXdhcmQJAMwIAgUOcmVmZXJyYWxSZXdhcmQFA25pbAUDbmlsAwkAAAIFC3JlZmVycmFsSW52BQtyZWZlcnJhbEludgQQdW5jbGFpbWVkQWN0aW9ucwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEGtleVVzZXJVbmNsYWltZWQBBQtjdXJyZW50VXNlcgkAZAIJAQt2YWx1ZU9yRWxzZQIFE3VzZXJVbmNsYWltZWRPcHRpb24AAAUPdXNlclRvdGFsQW1vdW50BQNuaWwEEXByb2Nlc3NpbmdBY3Rpb25zAwkAZgIJAGUCBQp1c2Vyc0NvdW50AAEFC2N1cnJlbnRVc2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TmV4dFByb2Nlc3NlZFVzZXIACQBkAgULY3VycmVudFVzZXIAAQUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5TmV4dFByb2Nlc3NlZFBlcmlvZAAJAGQCBQ1jdXJyZW50UGVyaW9kAAEJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlOZXh0UHJvY2Vzc2VkVXNlcgAAAAkAzAgCCQELRGVsZXRlRW50cnkBCQESa2V5UHJvY2Vzc2luZ1N0YWdlAAUDbmlsCQCUCgIJAM4IAgUQdW5jbGFpbWVkQWN0aW9ucwURcHJvY2Vzc2luZ0FjdGlvbnMGCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIYaW52YWxpZCBwcm9jZXNzaW5nIHN0YWdlAWkBD2ZpbmFsaXplV3JhcHBlcgEHY291bnRlcgQGcmVzdWx0CgABQAkA/AcEBQR0aGlzAg5maW5hbGl6ZUhlbHBlcgUDbmlsBQNuaWwDCQABAgUBQAIHQm9vbGVhbgUBQAkAAgEJAKwCAgkAAwEJAPwHBAUEdGhpcwIOZmluYWxpemVIZWxwZXIFA25pbAUDbmlsAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuAwkAAAIFBnJlc3VsdAUGcmVzdWx0AwkBASEBBQZyZXN1bHQDCQAAAgUHY291bnRlcgUIbWF4RGVwdGgJAAIBAhJOb3RoaW5nIHRvIHByb2Nlc3MJAJQKAgUDbmlsBQR1bml0AwkAZgIFB2NvdW50ZXIAAAkAlAoCBQNuaWwJAPwHBAUEdGhpcwIPZmluYWxpemVXcmFwcGVyCQDMCAIJAGUCBQdjb3VudGVyAAEFA25pbAUDbmlsCQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAR1wcm9jZXNzUGVuZGluZ1BlcmlvZHNBbmRVc2VycwAJAJQKAgUDbmlsCQD8BwQFBHRoaXMCD2ZpbmFsaXplV3JhcHBlcgkAzAgCBQhtYXhEZXB0aAUDbmlsBQNuaWwBaQEHZGVwb3NpdAAECGNmZ0FycmF5CQEVcmVhZENvbmZpZ0FycmF5T3JGYWlsAAMJAQIhPQIIBQFpBmNhbGxlcgkBB0FkZHJlc3MBCQDZBAEJAJEDAgUIY2ZnQXJyYXkFFklkeENmZ1BhY2VtYWtlckFkZHJlc3MJAAIBAhRXcm9uZyBjYWxsZXIgYWRkcmVzcwQHYXNzZXRJZAkBBXZhbHVlAQgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAwkBAiE9AgUHYXNzZXRJZAkA2QQBCQCRAwIFCGNmZ0FycmF5BQ1JZHhDZmdBc3NldElkCQACAQITV3JvbmcgcGF5bWVudCBhc3NldAQGcGVyaW9kCQEKbmV4dFBlcmlvZAAEBmRlbHRhSAkAZQIFBmhlaWdodAkBD2dldE51bWJlck9yRmFpbAEJAR9rZXlHd3hSZXdhcmRFbWlzc2lvblN0YXJ0SGVpZ2h0AAQMZW1pc3Npb25SYXRlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUQZW1pc3Npb25Db250cmFjdAkBFmtleVJhdGVQZXJCbG9ja0N1cnJlbnQACQCsAgIJAKwCAgIcbWFuZGF0b3J5IGVtaXNzaW9uX2NvbnRyYWN0LgkBFmtleVJhdGVQZXJCbG9ja0N1cnJlbnQAAg8gaXMgbm90IGRlZmluZWQEBndlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFD2ZhY3RvcnlDb250cmFjdAkBFGtleVBvb2xXZWlnaHRWaXJ0dWFsAAkArAICCQCsAgICG21hbmRhdG9yeSBmYWN0b3J5X2NvbnRyYWN0LgkBFGtleVBvb2xXZWlnaHRWaXJ0dWFsAAIPIGlzIG5vdCBkZWZpbmVkBAlhdXhBbW91bnQJAGsDCQBoAgUGZGVsdGFIBQZ3ZWlnaHQFDGVtaXNzaW9uUmF0ZQUFTVVMVDgEAmVtCQD8BwQFEGVtaXNzaW9uQ29udHJhY3QCBGVtaXQJAMwIAgUJYXV4QW1vdW50BQNuaWwFA25pbAMJAAACBQJlbQUCZW0EC21hdGNoZXJQYXJ0CAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQKcGF5b3V0SW5mbwkBEFBlcmlvZFBheW91dEluZm8DBQZwZXJpb2QFC21hdGNoZXJQYXJ0BQlhdXhBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlMYXRlc3RQZXJpb2QABQZwZXJpb2QJAMwIAgkBDEludGVnZXJFbnRyeQIJARJrZXlIZWlnaHRGb3JQZXJpb2QBBQZwZXJpb2QFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBHWtleUF1eEVtaXNzaW9uUmV3YXJkRm9yUGVyaW9kAQUGcGVyaW9kBQlhdXhBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAR9rZXlHd3hSZXdhcmRFbWlzc2lvblN0YXJ0SGVpZ2h0AAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEXa2V5VG90YWxBbW91bnRGb3JQZXJpb2QBBQZwZXJpb2QFC21hdGNoZXJQYXJ0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQENa2V5TmV4dFBlcmlvZAAJAGQCBQZwZXJpb2QAAQkAzAgCCQELU3RyaW5nRW50cnkCCQERa2V5TGFzdFBheW91dEluZm8ABQpwYXlvdXRJbmZvCQDMCAIJAQtTdHJpbmdFbnRyeQIJARRrZXlQYXlvdXRIaXN0b3J5SW5mbwEFBnBlcmlvZAUKcGF5b3V0SW5mbwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2NsYWltUmV3YXJkAAQIY2ZnQXJyYXkJARVyZWFkQ29uZmlnQXJyYXlPckZhaWwABAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgQNJHQwMTc1NDIxNzU5MgkBEWNvbW1vbkNsYWltUmV3YXJkAQUHYWRkcmVzcwQGYW1vdW50CAUNJHQwMTc1NDIxNzU5MgJfMQQHYWN0aW9ucwgFDSR0MDE3NTQyMTc1OTICXzIEC2NoZWNrQW1vdW50AwkAZgIFBmFtb3VudAAABgkAAgECEE5vdGhpbmcgdG8gY2xhaW0DCQAAAgULY2hlY2tBbW91bnQFC2NoZWNrQW1vdW50BBJhbW91bnRGcm9tRW1pc3Npb24AAAQPY2xhaW1lZFJlZmVycmFsCgABQAkA/AcEBR5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwCBWNsYWltCQDMCAIFE3JlZmVycmFsUHJvZ3JhbU5hbWUFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEJAPwHBAUecmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzT3JGYWlsAgVjbGFpbQkAzAgCBRNyZWZlcnJhbFByb2dyYW1OYW1lBQNuaWwFA25pbAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50BAt0b3RhbEFtb3VudAkAZAIFBmFtb3VudAUPY2xhaW1lZFJlZmVycmFsCQCUCgIJAM4IAgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC3RvdGFsQW1vdW50CQDZBAEJAJEDAgUIY2ZnQXJyYXkFDUlkeENmZ0Fzc2V0SWQJAMwIAgkBDEhpc3RvcnlFbnRyeQQCBWNsYWltBQdhZGRyZXNzBQZhbW91bnQFAWkFA25pbAUHYWN0aW9ucwkAzAgCBQt0b3RhbEFtb3VudAkAzAgCBRJhbW91bnRGcm9tRW1pc3Npb24FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARNjbGFpbVJld2FyZFJFQURPTkxZAQdhZGRyZXNzBA0kdDAxODE2NTE4MjE1CQERY29tbW9uQ2xhaW1SZXdhcmQBBQdhZGRyZXNzBAZhbW91bnQIBQ0kdDAxODE2NTE4MjE1Al8xBAdhY3Rpb25zCAUNJHQwMTgxNjUxODIxNQJfMgQRcmVmZXJyYWxVbmNsYWltZWQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUecmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzT3JGYWlsCQEUa2V5VW5jbGFpbWVkUmVmZXJyYWwCBRNyZWZlcnJhbFByb2dyYW1OYW1lBQdhZGRyZXNzAAAEC3RvdGFsQW1vdW50CQBkAgUGYW1vdW50BRFyZWZlcnJhbFVuY2xhaW1lZAkAlAoCBQNuaWwFC3RvdGFsQW1vdW50AWkBHWxhdGVzdEZpbmFsaXplZFBlcmlvZFJFQURPTkxZAQdhZGRyZXNzCQCUCgIFA25pbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEPa2V5TGF0ZXN0UGVyaW9kAAD///////////8BAWkBIWxhdGVzdEZpbmFsaXplZFBlcmlvZEluZm9SRUFET05MWQEHYWRkcmVzcwkAlAoCBQNuaWwJAQ5nZXRTdHJpbmdCeUtleQEJARFrZXlMYXN0UGF5b3V0SW5mbwABaQEVY2FsY0d3eFBhcmFtc1JFQURPTkxZAw5nd3hBbW91bnRTdGFydA9sb2NrU3RhcnRIZWlnaHQSbG9ja0R1cmF0aW9uQmxvY2tzBA1sb2NrRW5kSGVpZ2h0CQBkAgUPbG9ja1N0YXJ0SGVpZ2h0BRJsb2NrRHVyYXRpb25CbG9ja3MEDHNjYWxlOFBhcmFtSwkBAS0BCQBrAwUOZ3d4QW1vdW50U3RhcnQFBVNDQUxFBRJsb2NrRHVyYXRpb25CbG9ja3MEDHNjYWxlOFBhcmFtQgkAaAIJAGsDBQ5nd3hBbW91bnRTdGFydAUFU0NBTEUFEmxvY2tEdXJhdGlvbkJsb2NrcwUNbG9ja0VuZEhlaWdodAkAlAoCBQNuaWwJAMwIAgUMc2NhbGU4UGFyYW1LCQDMCAIFDHNjYWxlOFBhcmFtQgkAzAgCCQEKbmV4dFBlcmlvZAAFA25pbAFpARpjYWxjR3d4QW1vdW50U3RhcnRSRUFET05MWQMMd3hMb2NrQW1vdW50DGxvY2tEdXJhdGlvbg9tYXhMb2NrRHVyYXRpb24EB2NvZWZmWDgJAGsDBQxsb2NrRHVyYXRpb24FBU1VTFQ4BQ9tYXhMb2NrRHVyYXRpb24EDmdXeEFtb3VudFN0YXJ0CQBrAwUMd3hMb2NrQW1vdW50BQdjb2VmZlg4BQVNVUxUOAkAlAoCBQNuaWwJAMwIAgUOZ1d4QW1vdW50U3RhcnQFA25pbAFpARVvbkVtaXNzaW9uRm9yR3d4U3RhcnQAAwkBAiE9AggFAWkGY2FsbGVyBQ9mYWN0b3J5Q29udHJhY3QJAAIBAhJwZXJtaXNzaW9ucyBkZW5pZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAR9rZXlHd3hSZXdhcmRFbWlzc2lvblN0YXJ0SGVpZ2h0AAUGaGVpZ2h0BQNuaWwBaQEjbGF0ZXN0UGVyaW9kRW1pc3Npb25SZXdhcmRzUkVBRE9OTFkBB2FkZHJlc3MEBnBlcmlvZAkBCm5leHRQZXJpb2QACQCUCgIFA25pbAkAzAgCCQEOZ2V0TnVtYmVyQnlLZXkBCQEda2V5QXV4RW1pc3Npb25SZXdhcmRGb3JQZXJpb2QBBQZwZXJpb2QFA25pbAFpAQVjYWxjRAULeDFCaWdJbnRTdHILeDJCaWdJbnRTdHIMYW1wQmlnSW50U3RyE2FQcmVjaXNpb25CaWdJbnRTdHIYdGFyZ2V0UHJlY2lzaW9uQmlnSW50U3RyBAZuQ29pbnMJALYCAQACBAphUHJlY2lzaW9uCQCnAwEFE2FQcmVjaXNpb25CaWdJbnRTdHIED3RhcmdldFByZWNpc2lvbgkApwMBBRh0YXJnZXRQcmVjaXNpb25CaWdJbnRTdHIEAngxCQCnAwEFC3gxQmlnSW50U3RyBAJ4MgkApwMBBQt4MkJpZ0ludFN0cgQDYW1wCQC5AgIJAKcDAQUMYW1wQmlnSW50U3RyBQphUHJlY2lzaW9uBAFzCQC3AgIFAngxBQJ4MgMJAAACBQFzBQp6ZXJvQmlnSW50CQCUCgIFA25pbAkApgMBBQp6ZXJvQmlnSW50BANhbm4JALkCAgUDYW1wBQZuQ29pbnMEA2FycgkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcFA25pbAoBBGNhbGMCA2FjYwNjdXIEDSR0MDIwODM4MjEwMjcFA2FjYwQBZAgFDSR0MDIwODM4MjEwMjcCXzEEBWRQcmV2CAUNJHQwMjA4MzgyMTAyNwJfMgQCZHAJALoCAgkAuQICCQC5AgIFAWQFAWQFAWQJALkCAgkAuQICCQC5AgIFAngxBQJ4MgUGbkNvaW5zBQZuQ29pbnMEBWROZXh0CQC6AgIJALkCAgkAtwICCQC6AgIJALkCAgUDYW5uBQFzBQphUHJlY2lzaW9uCQC5AgIFAmRwBQZuQ29pbnMFAWQJALcCAgkAugICCQC5AgIJALgCAgUDYW5uBQphUHJlY2lzaW9uBQFkBQphUHJlY2lzaW9uCQC5AgIJALcCAgUGbkNvaW5zCQC2AgEAAQUCZHAJAJQKAgUFZE5leHQFAWQEDSR0MDIxMjQwMjEyOTAKAAIkbAUDYXJyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQFzBQR1bml0CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRjYWxjAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA3CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcEBWROZXh0CAUNJHQwMjEyNDAyMTI5MAJfMQQFZFByZXYIBQ0kdDAyMTI0MDIxMjkwAl8yBAVkRGlmZgkBCWFic0JpZ0ludAEJALgCAgUFZE5leHQJAQV2YWx1ZQEFBWRQcmV2AwkAwAICBQ90YXJnZXRQcmVjaXNpb24FBWREaWZmCQCUCgIFA25pbAkApgMBBQVkTmV4dAkAAgEJAKwCAgIdRCBjYWxjdWxhdGlvbiBlcnJvciwgZERpZmYgPSAJAKYDAQUFZERpZmYBaQEGbG9nZ2VyAQNzdHIJAJQKAgUDbmlsBQR1bml0AWkBDGNhbGNQdXRYT25seQgaYW1vdW50QXNzZXRBbW91bnRCaWdJbnRTdHIbYW1vdW50QXNzZXRCYWxhbmNlQmlnSW50U3RyGnByaWNlQXNzZXRCYWxhbmNlQmlnSW50U3RyCmRCaWdJbnRTdHIVYW1wbGlmaWNhdG9yQmlnSW50U3RyHmFtcGxpZmljYXRvclByZWNpc2lvbkJpZ0ludFN0chl0YXJnZXRYUHJlY2lzaW9uQmlnSW50U3RyGXRhcmdldERQcmVjaXNpb25CaWdJbnRTdHIEBm5Db2lucwkAtgIBAAIECmFQcmVjaXNpb24JAKcDAQUeYW1wbGlmaWNhdG9yUHJlY2lzaW9uQmlnSW50U3RyBA90YXJnZXRQcmVjaXNpb24JAKcDAQUZdGFyZ2V0WFByZWNpc2lvbkJpZ0ludFN0cgQBWAkApwMBBRthbW91bnRBc3NldEJhbGFuY2VCaWdJbnRTdHIEAVkJAKcDAQUacHJpY2VBc3NldEJhbGFuY2VCaWdJbnRTdHIEAWQDCQAAAgUKZEJpZ0ludFN0cgIACQCnAwEKAAFACQD8BwQFBHRoaXMCBWNhbGNECQDMCAIFG2Ftb3VudEFzc2V0QmFsYW5jZUJpZ0ludFN0cgkAzAgCBRpwcmljZUFzc2V0QmFsYW5jZUJpZ0ludFN0cgkAzAgCBRVhbXBsaWZpY2F0b3JCaWdJbnRTdHIJAMwIAgUeYW1wbGlmaWNhdG9yUHJlY2lzaW9uQmlnSW50U3RyCQDMCAIFGXRhcmdldERQcmVjaXNpb25CaWdJbnRTdHIFA25pbAUDbmlsAwkAAQIFAUACBlN0cmluZwUBQAkAAgEJAKwCAgkAAwEJAPwHBAUEdGhpcwIFY2FsY0QJAMwIAgUbYW1vdW50QXNzZXRCYWxhbmNlQmlnSW50U3RyCQDMCAIFGnByaWNlQXNzZXRCYWxhbmNlQmlnSW50U3RyCQDMCAIFFWFtcGxpZmljYXRvckJpZ0ludFN0cgkAzAgCBR5hbXBsaWZpY2F0b3JQcmVjaXNpb25CaWdJbnRTdHIJAMwIAgUZdGFyZ2V0RFByZWNpc2lvbkJpZ0ludFN0cgUDbmlsBQNuaWwCGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwkApwMBBQpkQmlnSW50U3RyBANhbXAJALkCAgkApwMBBRVhbXBsaWZpY2F0b3JCaWdJbnRTdHIFCmFQcmVjaXNpb24EAVMJAKcDAQUaYW1vdW50QXNzZXRBbW91bnRCaWdJbnRTdHIEA2FubgkAuQICBQNhbXAFBm5Db2lucwQDYXJyCQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJCQDMCAIACgkAzAgCAAsJAMwIAgAMCQDMCAIADQkAzAgCAA4JAMwIAgAPCQDMCAIAEAkAzAgCABEJAMwIAgASCQDMCAIAEwkAzAgCABQFA25pbAoBBGNhbGMCA2FjYwNjdXIEDSR0MDIyOTcxMjMwMDAFA2FjYwQBeAgFDSR0MDIyOTcxMjMwMDACXzEEBXhQcmV2CAUNJHQwMjI5NzEyMzAwMAJfMgQHcmVzdWx0cwgFDSR0MDIyOTcxMjMwMDACXzMEBG5ld1gJALgCAgkAtwICBQFYBQFTBQF4BARuZXdZCQC4AgIFAVkJALoCAgkAuQICBQF4BQFZBQFYBAJkcAkAugICCQC5AgIJALkCAgUBZAUBZAUBZAkAuQICCQC5AgIJALkCAgUEbmV3WAUEbmV3WQUGbkNvaW5zBQZuQ29pbnMEBXhOZXh0CQC3AgIFAXgJALoCAgkAuAICCQC3AgIJALcCAgkAugICCQC5AgIJAL4CAQUBZAUDYW5uBQphUHJlY2lzaW9uBQFkCQC6AgIJALkCAgUDYW5uCQC3AgIFBG5ld1gFBG5ld1kFCmFQcmVjaXNpb24FAmRwCQC3AgIJALcCAgkAugICCQC5AgIJAL4CAQUDYW5uCQC4AgIJALYCAQD///////////8BCQC6AgIFAVkFAVgFCmFQcmVjaXNpb24JALoCAgUCZHAFBG5ld1gJALoCAgkAuQICBQFZBQJkcAkAuQICBQFYBQRuZXdZCQCVCgMFBXhOZXh0BQF4CQDNCAIFB3Jlc3VsdHMFAXgEDSR0MDIzMzE3MjMzOTAKAAIkbAUDYXJyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQp6ZXJvQmlnSW50BQR1bml0BQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGNhbGMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAQFeE5leHQIBQ0kdDAyMzMxNzIzMzkwAl8xBAV4UHJldggFDSR0MDIzMzE3MjMzOTACXzIEB3Jlc3VsdHMIBQ0kdDAyMzMxNzIzMzkwAl8zBAZsb2dJbnYJAPwHBAUEdGhpcwIGbG9nZ2VyCQDMCAIJALkJAgUHcmVzdWx0cwIBIAUDbmlsBQNuaWwDCQAAAgUGbG9nSW52BQZsb2dJbnYEBXhEaWZmCQEJYWJzQmlnSW50AQkAuAICBQV4TmV4dAkBBXZhbHVlAQUFeFByZXYDCQDAAgIFD3RhcmdldFByZWNpc2lvbgUFeERpZmYJAJQKAgUDbmlsCQCVCgMJAKADAQUFeE5leHQJAKADAQkAvAIDBQV4TmV4dAUBWQUBWAUHcmVzdWx0cwkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAh1YIGNhbGN1bGF0aW9uIGVycm9yLCB4RGlmZiA9IAkApgMBBQV4RGlmZgIKLCB4TmV4dCA9IAkApgMBBQV4TmV4dAIKLCB4UHJldiA9IAkApgMBCQEFdmFsdWUBBQV4UHJldgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQxjYWxjU3dhcFhUb1kIGmFtb3VudEFzc2V0QW1vdW50QmlnSW50U3RyG2Ftb3VudEFzc2V0QmFsYW5jZUJpZ0ludFN0chpwcmljZUFzc2V0QmFsYW5jZUJpZ0ludFN0cgpkQmlnSW50U3RyFWFtcGxpZmljYXRvckJpZ0ludFN0ch5hbXBsaWZpY2F0b3JQcmVjaXNpb25CaWdJbnRTdHIZdGFyZ2V0WFByZWNpc2lvbkJpZ0ludFN0chl0YXJnZXREUHJlY2lzaW9uQmlnSW50U3RyBAZuQ29pbnMJALYCAQACBAphUHJlY2lzaW9uCQCnAwEFHmFtcGxpZmljYXRvclByZWNpc2lvbkJpZ0ludFN0cgQPdGFyZ2V0UHJlY2lzaW9uCQCnAwEFGXRhcmdldFhQcmVjaXNpb25CaWdJbnRTdHIEAVgJAKcDAQUbYW1vdW50QXNzZXRCYWxhbmNlQmlnSW50U3RyBAFZCQCnAwEFGnByaWNlQXNzZXRCYWxhbmNlQmlnSW50U3RyBAF4CQCnAwEFGmFtb3VudEFzc2V0QW1vdW50QmlnSW50U3RyBAFkAwkAAAIFCmRCaWdJbnRTdHICAAkApwMBCgABQAkA/AcEBQR0aGlzAgVjYWxjRAkAzAgCBRthbW91bnRBc3NldEJhbGFuY2VCaWdJbnRTdHIJAMwIAgUacHJpY2VBc3NldEJhbGFuY2VCaWdJbnRTdHIJAMwIAgUVYW1wbGlmaWNhdG9yQmlnSW50U3RyCQDMCAIFHmFtcGxpZmljYXRvclByZWNpc2lvbkJpZ0ludFN0cgkAzAgCBRl0YXJnZXREUHJlY2lzaW9uQmlnSW50U3RyBQNuaWwFA25pbAMJAAECBQFAAgZTdHJpbmcFAUAJAAIBCQCsAgIJAAMBCQD8BwQFBHRoaXMCBWNhbGNECQDMCAIFG2Ftb3VudEFzc2V0QmFsYW5jZUJpZ0ludFN0cgkAzAgCBRpwcmljZUFzc2V0QmFsYW5jZUJpZ0ludFN0cgkAzAgCBRVhbXBsaWZpY2F0b3JCaWdJbnRTdHIJAMwIAgUeYW1wbGlmaWNhdG9yUHJlY2lzaW9uQmlnSW50U3RyCQDMCAIFGXRhcmdldERQcmVjaXNpb25CaWdJbnRTdHIFA25pbAUDbmlsAhsgY291bGRuJ3QgYmUgY2FzdCB0byBTdHJpbmcJAKcDAQUKZEJpZ0ludFN0cgQDYW1wCQC5AgIJAKcDAQUVYW1wbGlmaWNhdG9yQmlnSW50U3RyBQphUHJlY2lzaW9uBAFTCQCnAwEFGmFtb3VudEFzc2V0QW1vdW50QmlnSW50U3RyBANhbm4JALkCAgUDYW1wBQZuQ29pbnMEA2FycgkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHCQDMCAIACAkAzAgCAAkFA25pbAoBBGNhbGMCA2FjYwNjdXIEDSR0MDI1MTQzMjUxNjMFA2FjYwQBeQgFDSR0MDI1MTQzMjUxNjMCXzEEBXlQcmV2CAUNJHQwMjUxNDMyNTE2MwJfMgQEbmV3WAkAtwICBQFYBQF4BARuZXdZCQC4AgIFAVkFAXkEAmRwCQC6AgIJALkCAgkAuQICBQFkBQFkBQFkCQC5AgIJALkCAgkAuQICBQRuZXdYBQRuZXdZBQZuQ29pbnMFBm5Db2lucwQFeU5leHQJALcCAgUBeQkAugICCQC4AgIJALcCAgkAtwICCQC6AgIJALkCAgkAvgIBBQFkBQNhbm4FCmFQcmVjaXNpb24FAWQJALoCAgkAuQICBQNhbm4JALcCAgUEbmV3WAUEbmV3WQUKYVByZWNpc2lvbgUCZHAJALcCAgkAugICBQNhbm4FCmFQcmVjaXNpb24JALoCAgUCZHAFBG5ld1kJAJQKAgUFeU5leHQFAXkEDSR0MDI1NDA1MjU0NjUKAAIkbAUDYXJyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQp6ZXJvQmlnSW50BQR1bml0CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRjYWxjAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBAV5TmV4dAgFDSR0MDI1NDA1MjU0NjUCXzEEBXlQcmV2CAUNJHQwMjU0MDUyNTQ2NQJfMgQFeERpZmYJAQlhYnNCaWdJbnQBCQC4AgIFBXlOZXh0CQEFdmFsdWUBBQV5UHJldgMJAMACAgUPdGFyZ2V0UHJlY2lzaW9uBQV4RGlmZgkAlAoCBQNuaWwJAKADAQUFeU5leHQJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIdWSBjYWxjdWxhdGlvbiBlcnJvciwgeURpZmYgPSAJAKYDAQUFeERpZmYCCiwgeU5leHQgPSAJAKYDAQUFeU5leHQCCiwgeVByZXYgPSAJAKYDAQkBBXZhbHVlAQUFeVByZXYBaQEKc2V0TWFuYWdlcgEXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkEC2NoZWNrQ2FsbGVyCQELbXVzdE1hbmFnZXIBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQVY2hlY2tNYW5hZ2VyUHVibGljS2V5CQDZBAEFF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AwkAAAIFFWNoZWNrTWFuYWdlclB1YmxpY0tleQUVY2hlY2tNYW5hZ2VyUHVibGljS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIJARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAFF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOY29uZmlybU1hbmFnZXIABAJwbQkBHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0AAQFaGFzUE0DCQEJaXNEZWZpbmVkAQUCcG0GCQACAQISTm8gcGVuZGluZyBtYW5hZ2VyAwkAAAIFBWhhc1BNBQVoYXNQTQQHY2hlY2tQTQMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAnBtBgkAAgECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQdjaGVja1BNBQdjaGVja1BNCQDMCAIJAQtTdHJpbmdFbnRyeQIJARNrZXlNYW5hZ2VyUHVibGljS2V5AAkA2AQBCQEFdmFsdWUBBQJwbQkAzAgCCQELRGVsZXRlRW50cnkBCQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABA90YXJnZXRQdWJsaWNLZXkEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAUCcGsDCQABAgUHJG1hdGNoMAIEVW5pdAgFAnR4D3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQ90YXJnZXRQdWJsaWNLZXm3RwVg", "chainId": 84, "height": 2245844, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FoXCMSUMZxLaprs6BFQZdtTcZXMxVEV28QRTzEmnpH8e Next: 6EfDCswSHou1pvMcas8BupuAcz7ef3FqMuuiFJ5ZhmK4 Diff:
OldNewDifferences
566566
567567
568568 @Callable(i)
569+func logger (str) = $Tuple2(nil, unit)
570+
571+
572+
573+@Callable(i)
569574 func calcPutXOnly (amountAssetAmountBigIntStr,amountAssetBalanceBigIntStr,priceAssetBalanceBigIntStr,dBigIntStr,amplificatorBigIntStr,amplificatorPrecisionBigIntStr,targetXPrecisionBigIntStr,targetDPrecisionBigIntStr) = {
570575 let nCoins = toBigInt(2)
571576 let aPrecision = parseBigIntValue(amplificatorPrecisionBigIntStr)
585590 let ann = (amp * nCoins)
586591 let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
587592 func calc (acc,cur) = {
588- let $t02289822918 = acc
589- let x = $t02289822918._1
590- let xPrev = $t02289822918._2
593+ let $t02297123000 = acc
594+ let x = $t02297123000._1
595+ let xPrev = $t02297123000._2
596+ let results = $t02297123000._3
591597 let newX = ((X + S) - x)
592598 let newY = (Y - ((x * Y) / X))
593599 let dp = (((d * d) * d) / (((newX * newY) * nCoins) * nCoins))
594600 let xNext = (x + ((((((-(d) * ann) / aPrecision) + d) + ((ann * (newX + newY)) / aPrecision)) - dp) / ((((-(ann) * (toBigInt(-1) - (Y / X))) / aPrecision) + (dp / newX)) + ((Y * dp) / (X * newY)))))
595- $Tuple2(xNext, x)
601+ $Tuple3(xNext, x, (results :+ x))
596602 }
597603
598- let $t02322123281 = {
604+ let $t02331723390 = {
599605 let $l = arr
600606 let $s = size($l)
601- let $acc0 = $Tuple2(zeroBigInt, unit)
607+ let $acc0 = $Tuple3(zeroBigInt, unit, nil)
602608 func $f0_1 ($a,$i) = if (($i >= $s))
603609 then $a
604610 else calc($a, $l[$i])
609615
610616 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
611617 }
612- let xNext = $t02322123281._1
613- let xPrev = $t02322123281._2
614- let xDiff = absBigInt((xNext - value(xPrev)))
615- if ((targetPrecision >= xDiff))
616- then $Tuple2(nil, $Tuple2(toInt(xNext), toInt(fraction(xNext, Y, X))))
617- else throw(((((("X calculation error, xDiff = " + toString(xDiff)) + ", xNext = ") + toString(xNext)) + ", xPrev = ") + toString(value(xPrev))))
618+ let xNext = $t02331723390._1
619+ let xPrev = $t02331723390._2
620+ let results = $t02331723390._3
621+ let logInv = invoke(this, "logger", [makeString(results, " ")], nil)
622+ if ((logInv == logInv))
623+ then {
624+ let xDiff = absBigInt((xNext - value(xPrev)))
625+ if ((targetPrecision >= xDiff))
626+ then $Tuple2(nil, $Tuple3(toInt(xNext), toInt(fraction(xNext, Y, X)), results))
627+ else throw(((((("X calculation error, xDiff = " + toString(xDiff)) + ", xNext = ") + toString(xNext)) + ", xPrev = ") + toString(value(xPrev))))
628+ }
629+ else throw("Strict value is not equal to itself.")
618630 }
619631
620632
640652 let ann = (amp * nCoins)
641653 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
642654 func calc (acc,cur) = {
643- let $t02495424974 = acc
644- let y = $t02495424974._1
645- let yPrev = $t02495424974._2
655+ let $t02514325163 = acc
656+ let y = $t02514325163._1
657+ let yPrev = $t02514325163._2
646658 let newX = (X + x)
647659 let newY = (Y - y)
648660 let dp = (((d * d) * d) / (((newX * newY) * nCoins) * nCoins))
650662 $Tuple2(yNext, y)
651663 }
652664
653- let $t02521625276 = {
665+ let $t02540525465 = {
654666 let $l = arr
655667 let $s = size($l)
656668 let $acc0 = $Tuple2(zeroBigInt, unit)
664676
665677 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
666678 }
667- let yNext = $t02521625276._1
668- let yPrev = $t02521625276._2
679+ let yNext = $t02540525465._1
680+ let yPrev = $t02540525465._2
669681 let xDiff = absBigInt((yNext - value(yPrev)))
670682 if ((targetPrecision >= xDiff))
671683 then $Tuple2(nil, toInt(yNext))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let SCALE = 1000
77
88 let MULT8 = 100000000
99
1010 let zeroBigInt = toBigInt(0)
1111
1212 let processingStageTotal = 0
1313
1414 let processingStageShares = 1
1515
1616 func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
1717
1818
1919 func getNumberOrFail (key) = valueOrErrorMessage(getInteger(this, key), (("mandatory this." + key) + " is not defined"))
2020
2121
2222 func getStringByKey (key) = valueOrElse(getString(this, key), "")
2323
2424
2525 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (("mandatory this." + key) + " is not defined"))
2626
2727
2828 func abs (val) = if ((0 > val))
2929 then -(val)
3030 else val
3131
3232
3333 func absBigInt (val) = if ((zeroBigInt > val))
3434 then -(val)
3535 else val
3636
3737
3838 let keyMaxDepth = "%s__maxDepth"
3939
4040 let maxDepthDefault = 30
4141
4242 let maxDepth = valueOrElse(getInteger(this, keyMaxDepth), maxDepthDefault)
4343
4444 func keyFactoryAddress () = "%s%s__config__factoryAddress"
4545
4646
4747 let factoryAddressStr = getStringOrFail(keyFactoryAddress())
4848
4949 let factoryContract = addressFromStringValue(factoryAddressStr)
5050
5151 func keyEmissionAddress () = "%s%s__config__emissionAddress"
5252
5353
5454 func keyNumToUserMapping (num) = makeString(["%s%s%s", "mapping", "num2user", toString(num)], SEP)
5555
5656
5757 let keyReferralProgramName = makeString(["%s%s", "referral", "programName"], SEP)
5858
5959 let referralProgramNameDefault = "wxlock"
6060
6161 let referralProgramName = valueOrElse(getString(this, keyReferralProgramName), referralProgramNameDefault)
6262
6363 let keyReferralMinGWxAmount = makeString(["%s%s", "referral", "minGWxAmount"], SEP)
6464
6565 let referralMinGWxAmountDefault = (500 * MULT8)
6666
6767 let referralMinGWxAmount = valueOrElse(getInteger(this, keyReferralMinGWxAmount), referralMinGWxAmountDefault)
6868
6969 let keyReferrerRewardPermille = makeString(["%s%s", "referral", "referrerRewardPermille"], SEP)
7070
7171 let referrerRewardPermilleDefault = 50
7272
7373 let referrerRewardPermille = valueOrElse(getInteger(this, keyReferrerRewardPermille), referrerRewardPermilleDefault)
7474
7575 let keyReferralRewardPermille = makeString(["%s%s", "referral", "referralRewardPermille"], SEP)
7676
7777 let referralRewardPermilleDefault = 50
7878
7979 let referralRewardPermille = valueOrElse(getInteger(this, keyReferralRewardPermille), referralRewardPermilleDefault)
8080
8181 func keyReferrer (referralAddress) = makeString(["%s%s%s", "referrer", referralProgramName, referralAddress], SEP)
8282
8383
8484 func keyUnclaimedReferral (programName,claimerAddress) = makeString(["%s%s%s%s", "unclaimedReferral", programName, claimerAddress], SEP)
8585
8686
8787 let emissionAddressStr = getStringOrFail(keyEmissionAddress())
8888
8989 let emissionContract = addressFromStringValue(emissionAddressStr)
9090
9191 let IdxCfgAssetId = 1
9292
9393 let IdxCfgPacemakerAddress = 2
9494
9595 let IdxCfgBoostingContract = 3
9696
9797 let IdxCfgMaxDepth = 4
9898
9999 func keyConfig () = "%s__config"
100100
101101
102102 func readConfigArrayOrFail () = split(getStringOrFail(keyConfig()), SEP)
103103
104104
105105 func formatConfig (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr,maxDepth) = makeString(["%s%s%s%d", wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr, toString(maxDepth)], SEP)
106106
107107
108108 func boostingContractOrFail () = {
109109 let cfgArray = readConfigArrayOrFail()
110110 valueOrErrorMessage(addressFromString(cfgArray[IdxCfgBoostingContract]), "boosting contract address is not defined")
111111 }
112112
113113
114114 func keyGwxRewardEmissionStartHeight () = "%s%s__gwxRewardEmissionPart__startHeight"
115115
116116
117117 func keyUsersCount () = "%s__nextUserNum"
118118
119119
120120 func keyRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
121121
122122
123123 func keyPoolWeightVirtual () = "%s%s__poolWeight__GWXvirtualPOOL"
124124
125125
126126 func keyNextProcessedUser () = "%s__nextProcessedUser"
127127
128128
129129 func keyLatestPeriod () = "%s__latestPeriod"
130130
131131
132132 func keyNextPeriod () = "%s__nextPeriod"
133133
134134
135135 func keyProcessingStage () = "%s__processingStage"
136136
137137
138138 func keyNextProcessedPeriod () = "%s__nextProcessedPeriod"
139139
140140
141141 func keyUserUnclaimed (userIndex) = makeString(["%s%d", "userUnclaimed", toString(userIndex)], SEP)
142142
143143
144144 func keyNextUnlaimedPeriodOfUser (userIndex) = makeString(["%s%d__nextClaimedPeriod", toString(userIndex)], SEP)
145145
146146
147147 func keyLastProcessedPeriodOfUser (userIndex) = makeString(["%s%d__lastProcessedPeriod", toString(userIndex)], SEP)
148148
149149
150150 func keyHeightForPeriod (period) = makeString(["%s%d__startHeightForPeriod", toString(period)], SEP)
151151
152152
153153 func keyAuxEmissionRewardForPeriod (period) = makeString(["%s%d__auxEmissionReward", toString(period)], SEP)
154154
155155
156156 func keyTotalAmountForPeriod (period) = makeString(["%s%d__totalAmountForPeriod", toString(period)], SEP)
157157
158158
159159 func keyLastPayoutInfo () = "%s__lastPayoutInfo"
160160
161161
162162 func PeriodPayoutInfo (period,matcherReward,emissionReward) = makeString(["%d%d%d", toString(period), toString(matcherReward), toString(emissionReward)], SEP)
163163
164164
165165 func keyPayoutHistoryInfo (period) = makeString(["%s%s%d__payouts__history", toString(period)], SEP)
166166
167167
168168 func keyTotalWeightForPeriod (period) = makeString(["%s%d__totalWeightForPeriod", toString(period)], SEP)
169169
170170
171171 func keyUserKValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "k", toString(period)], SEP)
172172
173173
174174 func keyUserBValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "b", toString(period)], SEP)
175175
176176
177177 func keyUserWeightForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "weight", toString(period)], SEP)
178178
179179
180180 func keyReferralsContractAddress () = makeString(["%s%s", "config", "referralsContractAddress"], SEP)
181181
182182
183183 let referralsContractAddressOrFail = addressFromStringValue(getStringOrFail(keyReferralsContractAddress()))
184184
185185 func HistoryEntry (type,user,amount,i) = {
186186 let historyKEY = makeString(["%s%s%s%s__history", type, user, toBase58String(i.transactionId)], SEP)
187187 let historyDATA = makeString(["%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount)], SEP)
188188 StringEntry(historyKEY, historyDATA)
189189 }
190190
191191
192192 func keyManagerPublicKey () = "%s__managerPublicKey"
193193
194194
195195 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
196196
197197
198198 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
199199 case s: String =>
200200 fromBase58String(s)
201201 case _: Unit =>
202202 unit
203203 case _ =>
204204 throw("Match error")
205205 }
206206
207207
208208 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
209209 case s: String =>
210210 fromBase58String(s)
211211 case _: Unit =>
212212 unit
213213 case _ =>
214214 throw("Match error")
215215 }
216216
217217
218218 func mustManager (i) = {
219219 let pd = throw("Permission denied")
220220 match managerPublicKeyOrUnit() {
221221 case pk: ByteVector =>
222222 if ((i.callerPublicKey == pk))
223223 then true
224224 else pd
225225 case _: Unit =>
226226 if ((i.caller == this))
227227 then true
228228 else pd
229229 case _ =>
230230 throw("Match error")
231231 }
232232 }
233233
234234
235235 func calcUserWeight (boostingContractAddress,heightForPeriod,period,userIndex) = {
236236 let kLast = keyLastProcessedPeriodOfUser(userIndex)
237237 let kKey = keyUserKValueForPeriod(period, userIndex)
238238 let kRaw = getInteger(boostingContractAddress, kKey)
239239 let kUserWeight = keyUserWeightForPeriod(period, userIndex)
240240 if (isDefined(kRaw))
241241 then {
242242 let k = value(kRaw)
243243 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(period, userIndex)))
244244 let w = ((k * heightForPeriod) + b)
245245 if ((w > 0))
246246 then $Tuple2((w / SCALE), [IntegerEntry(kLast, period), IntegerEntry(kUserWeight, w)])
247247 else $Tuple2(0, nil)
248248 }
249249 else {
250250 let p = getInteger(this, kLast)
251251 if (if (isDefined(p))
252252 then (period >= value(p))
253253 else false)
254254 then {
255255 let pv = value(p)
256256 let k = value(getInteger(boostingContractAddress, keyUserKValueForPeriod(pv, userIndex)))
257257 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(pv, userIndex)))
258258 let w = ((k * heightForPeriod) + b)
259259 if ((w > 0))
260260 then $Tuple2((w / SCALE), [IntegerEntry(kUserWeight, w)])
261261 else $Tuple2(0, nil)
262262 }
263263 else $Tuple2(0, nil)
264264 }
265265 }
266266
267267
268268 func calcUserWeightForClaim (boostingContractAddress,heightForPeriod,period,userIndex) = {
269269 let kUserWeight = keyUserWeightForPeriod(period, userIndex)
270270 let userWeightOrUnit = getInteger(kUserWeight)
271271 match userWeightOrUnit {
272272 case _: Unit =>
273273 0
274274 case w: Int =>
275275 (w / SCALE)
276276 case _ =>
277277 throw("Match error")
278278 }
279279 }
280280
281281
282282 func getUserIndexByAddress (boostingContractAddressStr,userAddress) = {
283283 let key = makeString(["%s%s%s", "mapping", "user2num", userAddress], SEP)
284284 parseIntValue(valueOrErrorMessage(getString(Address(fromBase58String(boostingContractAddressStr)), key), ((("User address " + userAddress) + " is not found in boosting contract data, key=") + key)))
285285 }
286286
287287
288288 func nextPeriod () = getNumberByKey(keyNextPeriod())
289289
290290
291291 func commonClaimReward (userAddress) = {
292292 let cfgArray = readConfigArrayOrFail()
293293 let userIdx = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddress)
294294 let userUnclaimedOption = getInteger(keyUserUnclaimed(userIdx))
295295 match userUnclaimedOption {
296296 case _: Unit =>
297297 $Tuple2(0, nil)
298298 case u: Int =>
299299 $Tuple2(u, [IntegerEntry(keyUserUnclaimed(userIdx), 0)])
300300 case _ =>
301301 throw("Match error")
302302 }
303303 }
304304
305305
306306 @Callable(i)
307307 func updateReferralActivity (userAddress,gWxAmountStart) = {
308308 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
309309 let activeReferralInv = if ((referrer == unit))
310310 then unit
311311 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (gWxAmountStart >= referralMinGWxAmount)], nil)
312312 if ((activeReferralInv == activeReferralInv))
313313 then $Tuple2(nil, unit)
314314 else throw("Strict value is not equal to itself.")
315315 }
316316
317317
318318
319319 @Callable(i)
320320 func finalizeHelper () = {
321321 let processingStage = valueOrElse(getInteger(keyProcessingStage()), processingStageTotal)
322322 let currentPeriod = getNumberByKey(keyNextProcessedPeriod())
323323 let currentUser = getNumberByKey(keyNextProcessedUser())
324324 let latestPeriod = getNumberByKey(keyLatestPeriod())
325325 let usersCount = valueOrElse(getInteger(boostingContractOrFail(), keyUsersCount()), 0)
326326 let totalWeightKey = keyTotalWeightForPeriod(currentPeriod)
327327 let totalWeight = getNumberByKey(keyTotalWeightForPeriod(currentPeriod))
328328 let heightForPeriod = getNumberByKey(keyHeightForPeriod(currentPeriod))
329329 if ((currentPeriod > latestPeriod))
330330 then $Tuple2(nil, false)
331331 else if ((processingStage == processingStageTotal))
332332 then {
333333 let $t01208412200 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
334334 let userWeight = $t01208412200._1
335335 let userActions = $t01208412200._2
336336 let totalWeightNew = (totalWeight + userWeight)
337337 let processingActions = if (((usersCount - 1) > currentUser))
338338 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
339339 else [IntegerEntry(keyProcessingStage(), processingStageShares), IntegerEntry(keyNextProcessedUser(), 0)]
340340 $Tuple2((([IntegerEntry(totalWeightKey, totalWeightNew)] ++ processingActions) ++ userActions), true)
341341 }
342342 else if ((processingStage == processingStageShares))
343343 then {
344344 let userWeight = calcUserWeightForClaim(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
345345 let userAmountMatcherForPeriod = fraction(getNumberByKey(keyTotalAmountForPeriod(currentPeriod)), userWeight, totalWeight)
346346 let userAmountEmissionForPeriod = fraction(getNumberByKey(keyAuxEmissionRewardForPeriod(currentPeriod)), userWeight, totalWeight)
347347 let userTotalAmount = (userAmountEmissionForPeriod + userAmountMatcherForPeriod)
348348 let userUnclaimedOption = getInteger(keyUserUnclaimed(currentUser))
349349 let userAddress = getStringValue(boostingContractOrFail(), keyNumToUserMapping(currentUser))
350350 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
351351 let activeReferralInv = if ((referrer == unit))
352352 then unit
353353 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (userWeight >= referralMinGWxAmount)], nil)
354354 if ((activeReferralInv == activeReferralInv))
355355 then {
356356 let referralInv = if (if ((referrer == unit))
357357 then true
358358 else (referralMinGWxAmount > userWeight))
359359 then unit
360360 else {
361361 let referrerReward = fraction(userTotalAmount, referrerRewardPermille, SCALE)
362362 let referralReward = fraction(userTotalAmount, referralRewardPermille, SCALE)
363363 invoke(referralsContractAddressOrFail, "incUnclaimed", [referralProgramName, userAddress, referrerReward, referralReward], nil)
364364 }
365365 if ((referralInv == referralInv))
366366 then {
367367 let unclaimedActions = [IntegerEntry(keyUserUnclaimed(currentUser), (valueOrElse(userUnclaimedOption, 0) + userTotalAmount))]
368368 let processingActions = if (((usersCount - 1) > currentUser))
369369 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
370370 else [IntegerEntry(keyNextProcessedPeriod(), (currentPeriod + 1)), IntegerEntry(keyNextProcessedUser(), 0), DeleteEntry(keyProcessingStage())]
371371 $Tuple2((unclaimedActions ++ processingActions), true)
372372 }
373373 else throw("Strict value is not equal to itself.")
374374 }
375375 else throw("Strict value is not equal to itself.")
376376 }
377377 else throw("invalid processing stage")
378378 }
379379
380380
381381
382382 @Callable(i)
383383 func finalizeWrapper (counter) = {
384384 let result = {
385385 let @ = invoke(this, "finalizeHelper", nil, nil)
386386 if ($isInstanceOf(@, "Boolean"))
387387 then @
388388 else throw(($getType(invoke(this, "finalizeHelper", nil, nil)) + " couldn't be cast to Boolean"))
389389 }
390390 if ((result == result))
391391 then if (!(result))
392392 then if ((counter == maxDepth))
393393 then throw("Nothing to process")
394394 else $Tuple2(nil, unit)
395395 else if ((counter > 0))
396396 then $Tuple2(nil, invoke(this, "finalizeWrapper", [(counter - 1)], nil))
397397 else $Tuple2(nil, unit)
398398 else throw("Strict value is not equal to itself.")
399399 }
400400
401401
402402
403403 @Callable(i)
404404 func processPendingPeriodsAndUsers () = $Tuple2(nil, invoke(this, "finalizeWrapper", [maxDepth], nil))
405405
406406
407407
408408 @Callable(i)
409409 func deposit () = {
410410 let cfgArray = readConfigArrayOrFail()
411411 if ((i.caller != Address(fromBase58String(cfgArray[IdxCfgPacemakerAddress]))))
412412 then throw("Wrong caller address")
413413 else {
414414 let assetId = value(value(i.payments[0]).assetId)
415415 if ((assetId != fromBase58String(cfgArray[IdxCfgAssetId])))
416416 then throw("Wrong payment asset")
417417 else {
418418 let period = nextPeriod()
419419 let deltaH = (height - getNumberOrFail(keyGwxRewardEmissionStartHeight()))
420420 let emissionRate = valueOrErrorMessage(getInteger(emissionContract, keyRatePerBlockCurrent()), (("mandatory emission_contract." + keyRatePerBlockCurrent()) + " is not defined"))
421421 let weight = valueOrErrorMessage(getInteger(factoryContract, keyPoolWeightVirtual()), (("mandatory factory_contract." + keyPoolWeightVirtual()) + " is not defined"))
422422 let auxAmount = fraction((deltaH * weight), emissionRate, MULT8)
423423 let em = invoke(emissionContract, "emit", [auxAmount], nil)
424424 if ((em == em))
425425 then {
426426 let matcherPart = value(i.payments[0]).amount
427427 let payoutInfo = PeriodPayoutInfo(period, matcherPart, auxAmount)
428428 [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)]
429429 }
430430 else throw("Strict value is not equal to itself.")
431431 }
432432 }
433433 }
434434
435435
436436
437437 @Callable(i)
438438 func claimReward () = {
439439 let cfgArray = readConfigArrayOrFail()
440440 let address = toString(i.caller)
441441 let $t01754217592 = commonClaimReward(address)
442442 let amount = $t01754217592._1
443443 let actions = $t01754217592._2
444444 let checkAmount = if ((amount > 0))
445445 then true
446446 else throw("Nothing to claim")
447447 if ((checkAmount == checkAmount))
448448 then {
449449 let amountFromEmission = 0
450450 let claimedReferral = {
451451 let @ = invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)
452452 if ($isInstanceOf(@, "Int"))
453453 then @
454454 else throw(($getType(invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)) + " couldn't be cast to Int"))
455455 }
456456 let totalAmount = (amount + claimedReferral)
457457 $Tuple2(([ScriptTransfer(i.caller, totalAmount, fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, amount, i)] ++ actions), [totalAmount, amountFromEmission])
458458 }
459459 else throw("Strict value is not equal to itself.")
460460 }
461461
462462
463463
464464 @Callable(i)
465465 func claimRewardREADONLY (address) = {
466466 let $t01816518215 = commonClaimReward(address)
467467 let amount = $t01816518215._1
468468 let actions = $t01816518215._2
469469 let referralUnclaimed = valueOrElse(getInteger(referralsContractAddressOrFail, keyUnclaimedReferral(referralProgramName, address)), 0)
470470 let totalAmount = (amount + referralUnclaimed)
471471 $Tuple2(nil, totalAmount)
472472 }
473473
474474
475475
476476 @Callable(i)
477477 func latestFinalizedPeriodREADONLY (address) = $Tuple2(nil, valueOrElse(getInteger(this, keyLatestPeriod()), -1))
478478
479479
480480
481481 @Callable(i)
482482 func latestFinalizedPeriodInfoREADONLY (address) = $Tuple2(nil, getStringByKey(keyLastPayoutInfo()))
483483
484484
485485
486486 @Callable(i)
487487 func calcGwxParamsREADONLY (gwxAmountStart,lockStartHeight,lockDurationBlocks) = {
488488 let lockEndHeight = (lockStartHeight + lockDurationBlocks)
489489 let scale8ParamK = -(fraction(gwxAmountStart, SCALE, lockDurationBlocks))
490490 let scale8ParamB = (fraction(gwxAmountStart, SCALE, lockDurationBlocks) * lockEndHeight)
491491 $Tuple2(nil, [scale8ParamK, scale8ParamB, nextPeriod()])
492492 }
493493
494494
495495
496496 @Callable(i)
497497 func calcGwxAmountStartREADONLY (wxLockAmount,lockDuration,maxLockDuration) = {
498498 let coeffX8 = fraction(lockDuration, MULT8, maxLockDuration)
499499 let gWxAmountStart = fraction(wxLockAmount, coeffX8, MULT8)
500500 $Tuple2(nil, [gWxAmountStart])
501501 }
502502
503503
504504
505505 @Callable(i)
506506 func onEmissionForGwxStart () = if ((i.caller != factoryContract))
507507 then throw("permissions denied")
508508 else [IntegerEntry(keyGwxRewardEmissionStartHeight(), height)]
509509
510510
511511
512512 @Callable(i)
513513 func latestPeriodEmissionRewardsREADONLY (address) = {
514514 let period = nextPeriod()
515515 $Tuple2(nil, [getNumberByKey(keyAuxEmissionRewardForPeriod(period))])
516516 }
517517
518518
519519
520520 @Callable(i)
521521 func calcD (x1BigIntStr,x2BigIntStr,ampBigIntStr,aPrecisionBigIntStr,targetPrecisionBigIntStr) = {
522522 let nCoins = toBigInt(2)
523523 let aPrecision = parseBigIntValue(aPrecisionBigIntStr)
524524 let targetPrecision = parseBigIntValue(targetPrecisionBigIntStr)
525525 let x1 = parseBigIntValue(x1BigIntStr)
526526 let x2 = parseBigIntValue(x2BigIntStr)
527527 let amp = (parseBigIntValue(ampBigIntStr) * aPrecision)
528528 let s = (x1 + x2)
529529 if ((s == zeroBigInt))
530530 then $Tuple2(nil, toString(zeroBigInt))
531531 else {
532532 let ann = (amp * nCoins)
533533 let arr = [1, 2, 3, 4, 5, 6, 7]
534534 func calc (acc,cur) = {
535535 let $t02083821027 = acc
536536 let d = $t02083821027._1
537537 let dPrev = $t02083821027._2
538538 let dp = (((d * d) * d) / (((x1 * x2) * nCoins) * nCoins))
539539 let dNext = (((((ann * s) / aPrecision) + (dp * nCoins)) * d) / ((((ann - aPrecision) * d) / aPrecision) + ((nCoins + toBigInt(1)) * dp)))
540540 $Tuple2(dNext, d)
541541 }
542542
543543 let $t02124021290 = {
544544 let $l = arr
545545 let $s = size($l)
546546 let $acc0 = $Tuple2(s, unit)
547547 func $f0_1 ($a,$i) = if (($i >= $s))
548548 then $a
549549 else calc($a, $l[$i])
550550
551551 func $f0_2 ($a,$i) = if (($i >= $s))
552552 then $a
553553 else throw("List size exceeds 7")
554554
555555 $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)
556556 }
557557 let dNext = $t02124021290._1
558558 let dPrev = $t02124021290._2
559559 let dDiff = absBigInt((dNext - value(dPrev)))
560560 if ((targetPrecision >= dDiff))
561561 then $Tuple2(nil, toString(dNext))
562562 else throw(("D calculation error, dDiff = " + toString(dDiff)))
563563 }
564564 }
565565
566566
567567
568568 @Callable(i)
569+func logger (str) = $Tuple2(nil, unit)
570+
571+
572+
573+@Callable(i)
569574 func calcPutXOnly (amountAssetAmountBigIntStr,amountAssetBalanceBigIntStr,priceAssetBalanceBigIntStr,dBigIntStr,amplificatorBigIntStr,amplificatorPrecisionBigIntStr,targetXPrecisionBigIntStr,targetDPrecisionBigIntStr) = {
570575 let nCoins = toBigInt(2)
571576 let aPrecision = parseBigIntValue(amplificatorPrecisionBigIntStr)
572577 let targetPrecision = parseBigIntValue(targetXPrecisionBigIntStr)
573578 let X = parseBigIntValue(amountAssetBalanceBigIntStr)
574579 let Y = parseBigIntValue(priceAssetBalanceBigIntStr)
575580 let d = if ((dBigIntStr == ""))
576581 then parseBigIntValue({
577582 let @ = invoke(this, "calcD", [amountAssetBalanceBigIntStr, priceAssetBalanceBigIntStr, amplificatorBigIntStr, amplificatorPrecisionBigIntStr, targetDPrecisionBigIntStr], nil)
578583 if ($isInstanceOf(@, "String"))
579584 then @
580585 else throw(($getType(invoke(this, "calcD", [amountAssetBalanceBigIntStr, priceAssetBalanceBigIntStr, amplificatorBigIntStr, amplificatorPrecisionBigIntStr, targetDPrecisionBigIntStr], nil)) + " couldn't be cast to String"))
581586 })
582587 else parseBigIntValue(dBigIntStr)
583588 let amp = (parseBigIntValue(amplificatorBigIntStr) * aPrecision)
584589 let S = parseBigIntValue(amountAssetAmountBigIntStr)
585590 let ann = (amp * nCoins)
586591 let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
587592 func calc (acc,cur) = {
588- let $t02289822918 = acc
589- let x = $t02289822918._1
590- let xPrev = $t02289822918._2
593+ let $t02297123000 = acc
594+ let x = $t02297123000._1
595+ let xPrev = $t02297123000._2
596+ let results = $t02297123000._3
591597 let newX = ((X + S) - x)
592598 let newY = (Y - ((x * Y) / X))
593599 let dp = (((d * d) * d) / (((newX * newY) * nCoins) * nCoins))
594600 let xNext = (x + ((((((-(d) * ann) / aPrecision) + d) + ((ann * (newX + newY)) / aPrecision)) - dp) / ((((-(ann) * (toBigInt(-1) - (Y / X))) / aPrecision) + (dp / newX)) + ((Y * dp) / (X * newY)))))
595- $Tuple2(xNext, x)
601+ $Tuple3(xNext, x, (results :+ x))
596602 }
597603
598- let $t02322123281 = {
604+ let $t02331723390 = {
599605 let $l = arr
600606 let $s = size($l)
601- let $acc0 = $Tuple2(zeroBigInt, unit)
607+ let $acc0 = $Tuple3(zeroBigInt, unit, nil)
602608 func $f0_1 ($a,$i) = if (($i >= $s))
603609 then $a
604610 else calc($a, $l[$i])
605611
606612 func $f0_2 ($a,$i) = if (($i >= $s))
607613 then $a
608614 else throw("List size exceeds 20")
609615
610616 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
611617 }
612- let xNext = $t02322123281._1
613- let xPrev = $t02322123281._2
614- let xDiff = absBigInt((xNext - value(xPrev)))
615- if ((targetPrecision >= xDiff))
616- then $Tuple2(nil, $Tuple2(toInt(xNext), toInt(fraction(xNext, Y, X))))
617- else throw(((((("X calculation error, xDiff = " + toString(xDiff)) + ", xNext = ") + toString(xNext)) + ", xPrev = ") + toString(value(xPrev))))
618+ let xNext = $t02331723390._1
619+ let xPrev = $t02331723390._2
620+ let results = $t02331723390._3
621+ let logInv = invoke(this, "logger", [makeString(results, " ")], nil)
622+ if ((logInv == logInv))
623+ then {
624+ let xDiff = absBigInt((xNext - value(xPrev)))
625+ if ((targetPrecision >= xDiff))
626+ then $Tuple2(nil, $Tuple3(toInt(xNext), toInt(fraction(xNext, Y, X)), results))
627+ else throw(((((("X calculation error, xDiff = " + toString(xDiff)) + ", xNext = ") + toString(xNext)) + ", xPrev = ") + toString(value(xPrev))))
628+ }
629+ else throw("Strict value is not equal to itself.")
618630 }
619631
620632
621633
622634 @Callable(i)
623635 func calcSwapXToY (amountAssetAmountBigIntStr,amountAssetBalanceBigIntStr,priceAssetBalanceBigIntStr,dBigIntStr,amplificatorBigIntStr,amplificatorPrecisionBigIntStr,targetXPrecisionBigIntStr,targetDPrecisionBigIntStr) = {
624636 let nCoins = toBigInt(2)
625637 let aPrecision = parseBigIntValue(amplificatorPrecisionBigIntStr)
626638 let targetPrecision = parseBigIntValue(targetXPrecisionBigIntStr)
627639 let X = parseBigIntValue(amountAssetBalanceBigIntStr)
628640 let Y = parseBigIntValue(priceAssetBalanceBigIntStr)
629641 let x = parseBigIntValue(amountAssetAmountBigIntStr)
630642 let d = if ((dBigIntStr == ""))
631643 then parseBigIntValue({
632644 let @ = invoke(this, "calcD", [amountAssetBalanceBigIntStr, priceAssetBalanceBigIntStr, amplificatorBigIntStr, amplificatorPrecisionBigIntStr, targetDPrecisionBigIntStr], nil)
633645 if ($isInstanceOf(@, "String"))
634646 then @
635647 else throw(($getType(invoke(this, "calcD", [amountAssetBalanceBigIntStr, priceAssetBalanceBigIntStr, amplificatorBigIntStr, amplificatorPrecisionBigIntStr, targetDPrecisionBigIntStr], nil)) + " couldn't be cast to String"))
636648 })
637649 else parseBigIntValue(dBigIntStr)
638650 let amp = (parseBigIntValue(amplificatorBigIntStr) * aPrecision)
639651 let S = parseBigIntValue(amountAssetAmountBigIntStr)
640652 let ann = (amp * nCoins)
641653 let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
642654 func calc (acc,cur) = {
643- let $t02495424974 = acc
644- let y = $t02495424974._1
645- let yPrev = $t02495424974._2
655+ let $t02514325163 = acc
656+ let y = $t02514325163._1
657+ let yPrev = $t02514325163._2
646658 let newX = (X + x)
647659 let newY = (Y - y)
648660 let dp = (((d * d) * d) / (((newX * newY) * nCoins) * nCoins))
649661 let yNext = (y + ((((((-(d) * ann) / aPrecision) + d) + ((ann * (newX + newY)) / aPrecision)) - dp) / ((ann / aPrecision) + (dp / newY))))
650662 $Tuple2(yNext, y)
651663 }
652664
653- let $t02521625276 = {
665+ let $t02540525465 = {
654666 let $l = arr
655667 let $s = size($l)
656668 let $acc0 = $Tuple2(zeroBigInt, unit)
657669 func $f0_1 ($a,$i) = if (($i >= $s))
658670 then $a
659671 else calc($a, $l[$i])
660672
661673 func $f0_2 ($a,$i) = if (($i >= $s))
662674 then $a
663675 else throw("List size exceeds 10")
664676
665677 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
666678 }
667- let yNext = $t02521625276._1
668- let yPrev = $t02521625276._2
679+ let yNext = $t02540525465._1
680+ let yPrev = $t02540525465._2
669681 let xDiff = absBigInt((yNext - value(yPrev)))
670682 if ((targetPrecision >= xDiff))
671683 then $Tuple2(nil, toInt(yNext))
672684 else throw(((((("Y calculation error, yDiff = " + toString(xDiff)) + ", yNext = ") + toString(yNext)) + ", yPrev = ") + toString(value(yPrev))))
673685 }
674686
675687
676688
677689 @Callable(i)
678690 func setManager (pendingManagerPublicKey) = {
679691 let checkCaller = mustManager(i)
680692 if ((checkCaller == checkCaller))
681693 then {
682694 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
683695 if ((checkManagerPublicKey == checkManagerPublicKey))
684696 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
685697 else throw("Strict value is not equal to itself.")
686698 }
687699 else throw("Strict value is not equal to itself.")
688700 }
689701
690702
691703
692704 @Callable(i)
693705 func confirmManager () = {
694706 let pm = pendingManagerPublicKeyOrUnit()
695707 let hasPM = if (isDefined(pm))
696708 then true
697709 else throw("No pending manager")
698710 if ((hasPM == hasPM))
699711 then {
700712 let checkPM = if ((i.callerPublicKey == value(pm)))
701713 then true
702714 else throw("You are not pending manager")
703715 if ((checkPM == checkPM))
704716 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
705717 else throw("Strict value is not equal to itself.")
706718 }
707719 else throw("Strict value is not equal to itself.")
708720 }
709721
710722
711723 @Verifier(tx)
712724 func verify () = {
713725 let targetPublicKey = match managerPublicKeyOrUnit() {
714726 case pk: ByteVector =>
715727 pk
716728 case _: Unit =>
717729 tx.senderPublicKey
718730 case _ =>
719731 throw("Match error")
720732 }
721733 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
722734 }
723735

github/deemru/w8io/873ac7e 
88.49 ms