tx · HrX9jd4WXY1LyPWsfqpRnh69JduaogDsoYDzDF1Ewnrj

3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE:  -0.02200000 Waves

2022.08.10 12:41 [2178174] smart account 3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE > SELF 0.00000000 Waves

{ "type": 13, "id": "HrX9jd4WXY1LyPWsfqpRnh69JduaogDsoYDzDF1Ewnrj", "fee": 2200000, "feeAssetId": null, "timestamp": 1660124498834, "version": 2, "chainId": 84, "sender": "3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE", "senderPublicKey": "G349Uq3FTox7dRNLeAfAQeoACvwZ9iEnVSaHcEYn6j8J", "proofs": [ "4E7uQNB7n9KMzuEMsfa8Gke2Xge1Xz5porUyGr83Qgxc8nXVqdEvAiWsvRxXWccdDmCeeBtaAghoKAvMSyjtmG89" ], "script": "base64:BgJuCAISBAoCCAESABIDCgEBEgASABIDCgEBEgASABIICgYCAQEBAQESABIDCgEIEgMKAQgSAwoBCBIFCgMBAQESBQoDAQEBEgYKBAgICAESAwoBCBIDCgEIEgASAwoBCBIHCgUICAgICBIDCgEIEgBXAANTRVACAl9fAAlVU0VSREVQVEgAGgAFU0NBTEUA6AcABU1VTFQ4AIDC1y8ACnplcm9CaWdJbnQJALYCAQAAABRwcm9jZXNzaW5nU3RhZ2VUb3RhbAAAABVwcm9jZXNzaW5nU3RhZ2VTaGFyZXMAAQEOZ2V0TnVtYmVyQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkAAAEPZ2V0TnVtYmVyT3JGYWlsAQNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzBQNrZXkJAKwCAgkArAICAg9tYW5kYXRvcnkgdGhpcy4FA2tleQIPIGlzIG5vdCBkZWZpbmVkAQ5nZXRTdHJpbmdCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQIAAQ9nZXRTdHJpbmdPckZhaWwBA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFA2tleQkArAICCQCsAgICD21hbmRhdG9yeSB0aGlzLgUDa2V5Ag8gaXMgbm90IGRlZmluZWQBA2FicwEDdmFsAwkAvwICBQp6ZXJvQmlnSW50BQN2YWwJAL4CAQUDdmFsBQN2YWwAC2tleU1heERlcHRoAgwlc19fbWF4RGVwdGgAD21heERlcHRoRGVmYXVsdAAeAAhtYXhEZXB0aAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQtrZXlNYXhEZXB0aAUPbWF4RGVwdGhEZWZhdWx0ABRrZXlNYXhEZXB0aE1pZ3JhdGlvbgIVJXNfX21heERlcHRoTWlncmF0aW9uABhtYXhEZXB0aE1pZ3JhdGlvbkRlZmF1bHQAAwARbWF4RGVwdGhNaWdyYXRpb24JAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUUa2V5TWF4RGVwdGhNaWdyYXRpb24FGG1heERlcHRoTWlncmF0aW9uRGVmYXVsdAALa2V5TWlncmF0ZWQCCG1pZ3JhdGVkAAhtaWdyYXRlZAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQtrZXlNaWdyYXRlZAcAHWtleU5leHRQcm9jZXNzZWRVc2VyTWlncmF0aW9uAhpuZXh0UHJvY2Vzc2VkVXNlck1pZ3JhdGlvbgERa2V5RmFjdG9yeUFkZHJlc3MAAhwlcyVzX19jb25maWdfX2ZhY3RvcnlBZGRyZXNzABFmYWN0b3J5QWRkcmVzc1N0cgkBD2dldFN0cmluZ09yRmFpbAEJARFrZXlGYWN0b3J5QWRkcmVzcwAAD2ZhY3RvcnlDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQURZmFjdG9yeUFkZHJlc3NTdHIBEmtleUVtaXNzaW9uQWRkcmVzcwACHSVzJXNfX2NvbmZpZ19fZW1pc3Npb25BZGRyZXNzARNrZXlOdW1Ub1VzZXJNYXBwaW5nAQNudW0JALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIHbWFwcGluZwkAzAgCAghudW0ydXNlcgkAzAgCCQCkAwEFA251bQUDbmlsBQNTRVAAFmtleVJlZmVycmFsUHJvZ3JhbU5hbWUJALkJAgkAzAgCAgQlcyVzCQDMCAICCHJlZmVycmFsCQDMCAICC3Byb2dyYW1OYW1lBQNuaWwFA1NFUAAacmVmZXJyYWxQcm9ncmFtTmFtZURlZmF1bHQCBnd4bG9jawATcmVmZXJyYWxQcm9ncmFtTmFtZQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBRZrZXlSZWZlcnJhbFByb2dyYW1OYW1lBRpyZWZlcnJhbFByb2dyYW1OYW1lRGVmYXVsdAAXa2V5UmVmZXJyYWxNaW5HV3hBbW91bnQJALkJAgkAzAgCAgQlcyVzCQDMCAICCHJlZmVycmFsCQDMCAICDG1pbkdXeEFtb3VudAUDbmlsBQNTRVAAG3JlZmVycmFsTWluR1d4QW1vdW50RGVmYXVsdAkAaAIA9AMFBU1VTFQ4ABRyZWZlcnJhbE1pbkdXeEFtb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRdrZXlSZWZlcnJhbE1pbkdXeEFtb3VudAUbcmVmZXJyYWxNaW5HV3hBbW91bnREZWZhdWx0ABlrZXlSZWZlcnJlclJld2FyZFBlcm1pbGxlCQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAhZyZWZlcnJlclJld2FyZFBlcm1pbGxlBQNuaWwFA1NFUAAdcmVmZXJyZXJSZXdhcmRQZXJtaWxsZURlZmF1bHQAMgAWcmVmZXJyZXJSZXdhcmRQZXJtaWxsZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRlrZXlSZWZlcnJlclJld2FyZFBlcm1pbGxlBR1yZWZlcnJlclJld2FyZFBlcm1pbGxlRGVmYXVsdAAZa2V5UmVmZXJyYWxSZXdhcmRQZXJtaWxsZQkAuQkCCQDMCAICBCVzJXMJAMwIAgIIcmVmZXJyYWwJAMwIAgIWcmVmZXJyYWxSZXdhcmRQZXJtaWxsZQUDbmlsBQNTRVAAHXJlZmVycmFsUmV3YXJkUGVybWlsbGVEZWZhdWx0ADIAFnJlZmVycmFsUmV3YXJkUGVybWlsbGUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUZa2V5UmVmZXJyYWxSZXdhcmRQZXJtaWxsZQUdcmVmZXJyYWxSZXdhcmRQZXJtaWxsZURlZmF1bHQBC2tleVJlZmVycmVyAQ9yZWZlcnJhbEFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIIcmVmZXJyZXIJAMwIAgUTcmVmZXJyYWxQcm9ncmFtTmFtZQkAzAgCBQ9yZWZlcnJhbEFkZHJlc3MFA25pbAUDU0VQARRrZXlVbmNsYWltZWRSZWZlcnJhbAILcHJvZ3JhbU5hbWUOY2xhaW1lckFkZHJlc3MJALkJAgkAzAgCAgglcyVzJXMlcwkAzAgCAhF1bmNsYWltZWRSZWZlcnJhbAkAzAgCBQtwcm9ncmFtTmFtZQkAzAgCBQ5jbGFpbWVyQWRkcmVzcwUDbmlsBQNTRVAAEmVtaXNzaW9uQWRkcmVzc1N0cgkBD2dldFN0cmluZ09yRmFpbAEJARJrZXlFbWlzc2lvbkFkZHJlc3MAABBlbWlzc2lvbkNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBBRJlbWlzc2lvbkFkZHJlc3NTdHIADUlkeENmZ0Fzc2V0SWQAAQAWSWR4Q2ZnUGFjZW1ha2VyQWRkcmVzcwACABZJZHhDZmdCb29zdGluZ0NvbnRyYWN0AAMADklkeENmZ01heERlcHRoAAQBCWtleUNvbmZpZwACCiVzX19jb25maWcBFXJlYWRDb25maWdBcnJheU9yRmFpbAAJALUJAgkBD2dldFN0cmluZ09yRmFpbAEJAQlrZXlDb25maWcABQNTRVABDGZvcm1hdENvbmZpZwQMd3hBc3NldElkU3RyGm1hdGNoZXJQYWNlbWFrZXJBZGRyZXNzU3RyGmJvb3N0aW5nQ29udHJhY3RBZGRyZXNzU3RyCG1heERlcHRoCQC5CQIJAMwIAgIIJXMlcyVzJWQJAMwIAgUMd3hBc3NldElkU3RyCQDMCAIFGm1hdGNoZXJQYWNlbWFrZXJBZGRyZXNzU3RyCQDMCAIFGmJvb3N0aW5nQ29udHJhY3RBZGRyZXNzU3RyCQDMCAIJAKQDAQUIbWF4RGVwdGgFA25pbAUDU0VQARZib29zdGluZ0NvbnRyYWN0T3JGYWlsAAQIY2ZnQXJyYXkJARVyZWFkQ29uZmlnQXJyYXlPckZhaWwACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQhjZmdBcnJheQUWSWR4Q2ZnQm9vc3RpbmdDb250cmFjdAIoYm9vc3RpbmcgY29udHJhY3QgYWRkcmVzcyBpcyBub3QgZGVmaW5lZAEfa2V5R3d4UmV3YXJkRW1pc3Npb25TdGFydEhlaWdodAACKCVzJXNfX2d3eFJld2FyZEVtaXNzaW9uUGFydF9fc3RhcnRIZWlnaHQBDWtleVVzZXJzQ291bnQAAg8lc19fbmV4dFVzZXJOdW0BFmtleVJhdGVQZXJCbG9ja0N1cnJlbnQAAhslcyVzX19yYXRlUGVyQmxvY2tfX2N1cnJlbnQBFGtleVBvb2xXZWlnaHRWaXJ0dWFsAAIgJXMlc19fcG9vbFdlaWdodF9fR1dYdmlydHVhbFBPT0wBFGtleU5leHRQcm9jZXNzZWRVc2VyAAIVJXNfX25leHRQcm9jZXNzZWRVc2VyAQ9rZXlMYXRlc3RQZXJpb2QAAhAlc19fbGF0ZXN0UGVyaW9kAQ1rZXlOZXh0UGVyaW9kAAIOJXNfX25leHRQZXJpb2QBEmtleVByb2Nlc3NpbmdTdGFnZQACEyVzX19wcm9jZXNzaW5nU3RhZ2UBFmtleU5leHRQcm9jZXNzZWRQZXJpb2QAAhclc19fbmV4dFByb2Nlc3NlZFBlcmlvZAEQa2V5VXNlclVuY2xhaW1lZAEJdXNlckluZGV4CQC5CQIJAMwIAgIEJXMlZAkAzAgCAg11c2VyVW5jbGFpbWVkCQDMCAIJAKQDAQUJdXNlckluZGV4BQNuaWwFA1NFUAEba2V5TmV4dFVubGFpbWVkUGVyaW9kT2ZVc2VyAQl1c2VySW5kZXgJALkJAgkAzAgCAhclcyVkX19uZXh0Q2xhaW1lZFBlcmlvZAkAzAgCCQCkAwEFCXVzZXJJbmRleAUDbmlsBQNTRVABHGtleUxhc3RQcm9jZXNzZWRQZXJpb2RPZlVzZXIBCXVzZXJJbmRleAkAuQkCCQDMCAICGSVzJWRfX2xhc3RQcm9jZXNzZWRQZXJpb2QJAMwIAgkApAMBBQl1c2VySW5kZXgFA25pbAUDU0VQARJrZXlIZWlnaHRGb3JQZXJpb2QBBnBlcmlvZAkAuQkCCQDMCAICGiVzJWRfX3N0YXJ0SGVpZ2h0Rm9yUGVyaW9kCQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEda2V5QXV4RW1pc3Npb25SZXdhcmRGb3JQZXJpb2QBBnBlcmlvZAkAuQkCCQDMCAICFyVzJWRfX2F1eEVtaXNzaW9uUmV3YXJkCQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEXa2V5VG90YWxBbW91bnRGb3JQZXJpb2QBBnBlcmlvZAkAuQkCCQDMCAICGiVzJWRfX3RvdGFsQW1vdW50Rm9yUGVyaW9kCQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAERa2V5TGFzdFBheW91dEluZm8AAhIlc19fbGFzdFBheW91dEluZm8BEFBlcmlvZFBheW91dEluZm8DBnBlcmlvZA1tYXRjaGVyUmV3YXJkDmVtaXNzaW9uUmV3YXJkCQC5CQIJAMwIAgIGJWQlZCVkCQDMCAIJAKQDAQUGcGVyaW9kCQDMCAIJAKQDAQUNbWF0Y2hlclJld2FyZAkAzAgCCQCkAwEFDmVtaXNzaW9uUmV3YXJkBQNuaWwFA1NFUAEUa2V5UGF5b3V0SGlzdG9yeUluZm8BBnBlcmlvZAkAuQkCCQDMCAICGCVzJXMlZF9fcGF5b3V0c19faGlzdG9yeQkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABF2tleVRvdGFsV2VpZ2h0Rm9yUGVyaW9kAQZwZXJpb2QJALkJAgkAzAgCAholcyVkX190b3RhbFdlaWdodEZvclBlcmlvZAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABFmtleVVzZXJLVmFsdWVGb3JQZXJpb2QCBnBlcmlvZAl1c2VySW5kZXgJALkJAgkAzAgCAhclcyVkJXMlZF9fcGFyYW1CeVBlcmlvZAkAzAgCCQCkAwEFCXVzZXJJbmRleAkAzAgCAgFrCQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEWa2V5VXNlckJWYWx1ZUZvclBlcmlvZAIGcGVyaW9kCXVzZXJJbmRleAkAuQkCCQDMCAICFyVzJWQlcyVkX19wYXJhbUJ5UGVyaW9kCQDMCAIJAKQDAQUJdXNlckluZGV4CQDMCAICAWIJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARZrZXlVc2VyV2VpZ2h0Rm9yUGVyaW9kAgZwZXJpb2QJdXNlckluZGV4CQC5CQIJAMwIAgIXJXMlZCVzJWRfX3BhcmFtQnlQZXJpb2QJAMwIAgkApAMBBQl1c2VySW5kZXgJAMwIAgIGd2VpZ2h0CQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEba2V5UmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzAAkAuQkCCQDMCAICBCVzJXMJAMwIAgIGY29uZmlnCQDMCAICGHJlZmVycmFsc0NvbnRyYWN0QWRkcmVzcwUDbmlsBQNTRVAAHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBD2dldFN0cmluZ09yRmFpbAEJARtrZXlSZWZlcnJhbHNDb250cmFjdEFkZHJlc3MAAQxIaXN0b3J5RW50cnkEBHR5cGUEdXNlcgZhbW91bnQBaQQKaGlzdG9yeUtFWQkAuQkCCQDMCAICESVzJXMlcyVzX19oaXN0b3J5CQDMCAIFBHR5cGUJAMwIAgUEdXNlcgkAzAgCCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQFA25pbAUDU0VQBAtoaXN0b3J5REFUQQkAuQkCCQDMCAICDCVkJWQlZCVkJWQlZAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sGaGVpZ2h0CQDMCAIJAKQDAQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkApAMBBQZhbW91bnQFA25pbAUDU0VQCQELU3RyaW5nRW50cnkCBQpoaXN0b3J5S0VZBQtoaXN0b3J5REFUQQETa2V5TWFuYWdlclB1YmxpY0tleQACFCVzX19tYW5hZ2VyUHVibGljS2V5ARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQACGyVzX19wZW5kaW5nTWFuYWdlclB1YmxpY0tleQEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAAEByRtYXRjaDAJAKIIAQkBE2tleU1hbmFnZXJQdWJsaWNLZXkAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkA2QQBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgEdcGVuZGluZ01hbmFnZXJQdWJsaWNLZXlPclVuaXQABAckbWF0Y2gwCQCiCAEJARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQDZBAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQttdXN0TWFuYWdlcgEBaQQCcGQJAAIBAhFQZXJtaXNzaW9uIGRlbmllZAQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUCcGsGBQJwZAMJAAECBQckbWF0Y2gwAgRVbml0AwkAAAIIBQFpBmNhbGxlcgUEdGhpcwYFAnBkCQACAQILTWF0Y2ggZXJyb3IBDmNhbGNVc2VyV2VpZ2h0BBdib29zdGluZ0NvbnRyYWN0QWRkcmVzcw9oZWlnaHRGb3JQZXJpb2QGcGVyaW9kCXVzZXJJbmRleAQFa0xhc3QJARxrZXlMYXN0UHJvY2Vzc2VkUGVyaW9kT2ZVc2VyAQUJdXNlckluZGV4BARrS2V5CQEWa2V5VXNlcktWYWx1ZUZvclBlcmlvZAIFBnBlcmlvZAUJdXNlckluZGV4BARrUmF3CQCaCAIFF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzBQRrS2V5BAtrVXNlcldlaWdodAkBFmtleVVzZXJXZWlnaHRGb3JQZXJpb2QCBQZwZXJpb2QFCXVzZXJJbmRleAMJAQlpc0RlZmluZWQBBQRrUmF3BAFrCQEFdmFsdWUBBQRrUmF3BAFiCQEFdmFsdWUBCQCaCAIFF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzCQEWa2V5VXNlckJWYWx1ZUZvclBlcmlvZAIFBnBlcmlvZAUJdXNlckluZGV4BAF3CQBkAgkAaAIFAWsFD2hlaWdodEZvclBlcmlvZAUBYgMJAGYCBQF3AAAJAJQKAgkAaQIFAXcFBVNDQUxFCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQVrTGFzdAUGcGVyaW9kCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQtrVXNlcldlaWdodAUBdwUDbmlsCQCUCgIAAAUDbmlsBAFwCQCaCAIFBHRoaXMFBWtMYXN0AwMJAQlpc0RlZmluZWQBBQFwCQBnAgUGcGVyaW9kCQEFdmFsdWUBBQFwBwQCcHYJAQV2YWx1ZQEFAXAEAWsJAQV2YWx1ZQEJAJoIAgUXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MJARZrZXlVc2VyS1ZhbHVlRm9yUGVyaW9kAgUCcHYFCXVzZXJJbmRleAQBYgkBBXZhbHVlAQkAmggCBRdib29zdGluZ0NvbnRyYWN0QWRkcmVzcwkBFmtleVVzZXJCVmFsdWVGb3JQZXJpb2QCBQJwdgUJdXNlckluZGV4BAF3CQBkAgkAaAIFAWsFD2hlaWdodEZvclBlcmlvZAUBYgMJAGYCBQF3AAAJAJQKAgkAaQIFAXcFBVNDQUxFCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQtrVXNlcldlaWdodAUBdwUDbmlsCQCUCgIAAAUDbmlsCQCUCgIAAAUDbmlsARZjYWxjVXNlcldlaWdodEZvckNsYWltBBdib29zdGluZ0NvbnRyYWN0QWRkcmVzcw9oZWlnaHRGb3JQZXJpb2QGcGVyaW9kCXVzZXJJbmRleAQLa1VzZXJXZWlnaHQJARZrZXlVc2VyV2VpZ2h0Rm9yUGVyaW9kAgUGcGVyaW9kBQl1c2VySW5kZXgEEHVzZXJXZWlnaHRPclVuaXQJAJ8IAQULa1VzZXJXZWlnaHQEByRtYXRjaDAFEHVzZXJXZWlnaHRPclVuaXQDCQABAgUHJG1hdGNoMAIEVW5pdAAAAwkAAQIFByRtYXRjaDACA0ludAQBdwUHJG1hdGNoMAkAaQIFAXcFBVNDQUxFCQACAQILTWF0Y2ggZXJyb3IBFWdldFVzZXJJbmRleEJ5QWRkcmVzcwIaYm9vc3RpbmdDb250cmFjdEFkZHJlc3NTdHILdXNlckFkZHJlc3MEA2tleQkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgdtYXBwaW5nCQDMCAICCHVzZXIybnVtCQDMCAIFC3VzZXJBZGRyZXNzBQNuaWwFA1NFUAkBDXBhcnNlSW50VmFsdWUBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgkBB0FkZHJlc3MBCQDZBAEFGmJvb3N0aW5nQ29udHJhY3RBZGRyZXNzU3RyBQNrZXkJAKwCAgkArAICCQCsAgICDVVzZXIgYWRkcmVzcyAFC3VzZXJBZGRyZXNzAi0gaXMgbm90IGZvdW5kIGluIGJvb3N0aW5nIGNvbnRyYWN0IGRhdGEsIGtleT0FA2tleQEKbmV4dFBlcmlvZAAJAQ5nZXROdW1iZXJCeUtleQEJAQ1rZXlOZXh0UGVyaW9kAAELaW52b2tlQ2xhaW0GEGJvb3N0aW5nQ29udHJhY3QGcGVyaW9kBHVzZXIFZGVwdGgQdG90YWxGcm9tTWF0Y2hlchF0b3RhbEZyb21FbWlzc2lvbgQGcmVzdWx0CQD8BwQFBHRoaXMCDmNsYWltTmV4dEJhdGNoCQDMCAIFEGJvb3N0aW5nQ29udHJhY3QJAMwIAgUGcGVyaW9kCQDMCAIFBHVzZXIJAMwIAgUFZGVwdGgJAMwIAgUQdG90YWxGcm9tTWF0Y2hlcgkAzAgCBRF0b3RhbEZyb21FbWlzc2lvbgUDbmlsBQNuaWwDCQAAAgUGcmVzdWx0BQZyZXN1bHQEByRtYXRjaDAFBnJlc3VsdAMJAAECBQckbWF0Y2gwAg8oSW50LCBJbnQsIEludCkEAXIFByRtYXRjaDAFAXIJAAIBAhdJbmNvcnJlY3QgaW52b2tlIHJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgENY2xhaW1JbnRlcm5hbAYQYm9vc3RpbmdDb250cmFjdA1jdXJyZW50UGVyaW9kC2N1cnJlbnRVc2VyBWRlcHRoFnVzZXJBY2N1bXVsYXRlZE1hdGNoZXIXdXNlckFjY3VtdWxhdGVkRW1pc3Npb24EF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzCQEHQWRkcmVzcwEFEGJvb3N0aW5nQ29udHJhY3QEDGxhdGVzdFBlcmlvZAkBDmdldE51bWJlckJ5S2V5AQkBFmtleU5leHRQcm9jZXNzZWRQZXJpb2QABAt0b3RhbFdlaWdodAkBDmdldE51bWJlckJ5S2V5AQkBF2tleVRvdGFsV2VpZ2h0Rm9yUGVyaW9kAQUNY3VycmVudFBlcmlvZAQPaGVpZ2h0Rm9yUGVyaW9kCQEOZ2V0TnVtYmVyQnlLZXkBCQESa2V5SGVpZ2h0Rm9yUGVyaW9kAQUNY3VycmVudFBlcmlvZAQKdXNlcldlaWdodAkBFmNhbGNVc2VyV2VpZ2h0Rm9yQ2xhaW0EBRdib29zdGluZ0NvbnRyYWN0QWRkcmVzcwUPaGVpZ2h0Rm9yUGVyaW9kBQ1jdXJyZW50UGVyaW9kBQtjdXJyZW50VXNlcgQadXNlckFtb3VudE1hdGNoZXJGb3JQZXJpb2QJAGsDCQEOZ2V0TnVtYmVyQnlLZXkBCQEXa2V5VG90YWxBbW91bnRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBQp1c2VyV2VpZ2h0BQt0b3RhbFdlaWdodAQbdXNlckFtb3VudEVtaXNzaW9uRm9yUGVyaW9kCQBrAwkBDmdldE51bWJlckJ5S2V5AQkBHWtleUF1eEVtaXNzaW9uUmV3YXJkRm9yUGVyaW9kAQUNY3VycmVudFBlcmlvZAUKdXNlcldlaWdodAULdG90YWxXZWlnaHQDAwkAZwIAAAUFZGVwdGgGCQBnAgkAZAIFDWN1cnJlbnRQZXJpb2QAAQUMbGF0ZXN0UGVyaW9kCQCVCgMJAGQCBQ1jdXJyZW50UGVyaW9kAAEJAGQCBRZ1c2VyQWNjdW11bGF0ZWRNYXRjaGVyBRp1c2VyQW1vdW50TWF0Y2hlckZvclBlcmlvZAkAZAIFF3VzZXJBY2N1bXVsYXRlZEVtaXNzaW9uBRt1c2VyQW1vdW50RW1pc3Npb25Gb3JQZXJpb2QJAQtpbnZva2VDbGFpbQYFEGJvb3N0aW5nQ29udHJhY3QJAGQCBQ1jdXJyZW50UGVyaW9kAAEFC2N1cnJlbnRVc2VyCQBlAgUFZGVwdGgAAQkAZAIFFnVzZXJBY2N1bXVsYXRlZE1hdGNoZXIFGnVzZXJBbW91bnRNYXRjaGVyRm9yUGVyaW9kCQBkAgUXdXNlckFjY3VtdWxhdGVkRW1pc3Npb24FG3VzZXJBbW91bnRFbWlzc2lvbkZvclBlcmlvZAERY29tbW9uQ2xhaW1SZXdhcmQBC3VzZXJBZGRyZXNzBAhjZmdBcnJheQkBFXJlYWRDb25maWdBcnJheU9yRmFpbAAEB3VzZXJJZHgJARVnZXRVc2VySW5kZXhCeUFkZHJlc3MCCQCRAwIFCGNmZ0FycmF5BRZJZHhDZmdCb29zdGluZ0NvbnRyYWN0BQt1c2VyQWRkcmVzcwQTdXNlclVuY2xhaW1lZE9wdGlvbgkAnwgBCQEQa2V5VXNlclVuY2xhaW1lZAEFB3VzZXJJZHgEByRtYXRjaDAFE3VzZXJVbmNsYWltZWRPcHRpb24DCQABAgUHJG1hdGNoMAIEVW5pdAMFCG1pZ3JhdGVkCQCUCgIAAAUDbmlsBA1jdXJyZW50UGVyaW9kCQEOZ2V0TnVtYmVyQnlLZXkBCQEba2V5TmV4dFVubGFpbWVkUGVyaW9kT2ZVc2VyAQUHdXNlcklkeAQTbmV4dFByb2Nlc3NlZFBlcmlvZAkBDmdldE51bWJlckJ5S2V5AQkBFmtleU5leHRQcm9jZXNzZWRQZXJpb2QAAwkAZwIFDWN1cnJlbnRQZXJpb2QFE25leHRQcm9jZXNzZWRQZXJpb2QJAJQKAgAABQNuaWwEEGJvb3N0aW5nQ29udHJhY3QJANkEAQkAkQMCBQhjZmdBcnJheQUWSWR4Q2ZnQm9vc3RpbmdDb250cmFjdAQNJHQwMTMwNjMxMzE4OQkBDWNsYWltSW50ZXJuYWwGBRBib29zdGluZ0NvbnRyYWN0BQ1jdXJyZW50UGVyaW9kBQd1c2VySWR4BQlVU0VSREVQVEgAAAAABAZwZXJpb2QIBQ0kdDAxMzA2MzEzMTg5Al8xBBFhbW91bnRGcm9tTWF0Y2hlcggFDSR0MDEzMDYzMTMxODkCXzIEEmFtb3VudEZyb21FbWlzc2lvbggFDSR0MDEzMDYzMTMxODkCXzMEBmFtb3VudAkAZAIFEWFtb3VudEZyb21NYXRjaGVyBRJhbW91bnRGcm9tRW1pc3Npb24EB2FjdGlvbnMJAMwIAgkBDEludGVnZXJFbnRyeQIJARtrZXlOZXh0VW5sYWltZWRQZXJpb2RPZlVzZXIBBQd1c2VySWR4BQZwZXJpb2QFA25pbAkAlAoCBQZhbW91bnQFB2FjdGlvbnMDCQABAgUHJG1hdGNoMAIDSW50BAF1BQckbWF0Y2gwCQCUCgIFAXUJAMwIAgkBDEludGVnZXJFbnRyeQIJARBrZXlVc2VyVW5jbGFpbWVkAQUHdXNlcklkeAAABQNuaWwJAAIBAgtNYXRjaCBlcnJvchcBaQEWdXBkYXRlUmVmZXJyYWxBY3Rpdml0eQILdXNlckFkZHJlc3MOZ1d4QW1vdW50U3RhcnQECHJlZmVycmVyCQCdCAIFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAkBC2tleVJlZmVycmVyAQULdXNlckFkZHJlc3MEEWFjdGl2ZVJlZmVycmFsSW52AwkAAAIFCHJlZmVycmVyBQR1bml0BQR1bml0CQD8BwQFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAIWdXBkYXRlUmVmZXJyYWxBY3Rpdml0eQkAzAgCBRNyZWZlcnJhbFByb2dyYW1OYW1lCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIJAGcCBQ5nV3hBbW91bnRTdGFydAUUcmVmZXJyYWxNaW5HV3hBbW91bnQFA25pbAUDbmlsAwkAAAIFEWFjdGl2ZVJlZmVycmFsSW52BRFhY3RpdmVSZWZlcnJhbEludgkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOZmluYWxpemVIZWxwZXIABA9wcm9jZXNzaW5nU3RhZ2UJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEmtleVByb2Nlc3NpbmdTdGFnZQAFFHByb2Nlc3NpbmdTdGFnZVRvdGFsBA1jdXJyZW50UGVyaW9kCQEOZ2V0TnVtYmVyQnlLZXkBCQEWa2V5TmV4dFByb2Nlc3NlZFBlcmlvZAAEC2N1cnJlbnRVc2VyCQEOZ2V0TnVtYmVyQnlLZXkBCQEUa2V5TmV4dFByb2Nlc3NlZFVzZXIABAxsYXRlc3RQZXJpb2QJAQ5nZXROdW1iZXJCeUtleQEJAQ9rZXlMYXRlc3RQZXJpb2QABAp1c2Vyc0NvdW50CQELdmFsdWVPckVsc2UCCQCaCAIJARZib29zdGluZ0NvbnRyYWN0T3JGYWlsAAkBDWtleVVzZXJzQ291bnQAAAAEDnRvdGFsV2VpZ2h0S2V5CQEXa2V5VG90YWxXZWlnaHRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBAt0b3RhbFdlaWdodAkBDmdldE51bWJlckJ5S2V5AQkBF2tleVRvdGFsV2VpZ2h0Rm9yUGVyaW9kAQUNY3VycmVudFBlcmlvZAQPaGVpZ2h0Rm9yUGVyaW9kCQEOZ2V0TnVtYmVyQnlLZXkBCQESa2V5SGVpZ2h0Rm9yUGVyaW9kAQUNY3VycmVudFBlcmlvZAMJAGYCBQ1jdXJyZW50UGVyaW9kBQxsYXRlc3RQZXJpb2QJAJQKAgUDbmlsBwMJAAACBQ9wcm9jZXNzaW5nU3RhZ2UFFHByb2Nlc3NpbmdTdGFnZVRvdGFsBA0kdDAxNDc3MTE0ODg3CQEOY2FsY1VzZXJXZWlnaHQECQEWYm9vc3RpbmdDb250cmFjdE9yRmFpbAAFD2hlaWdodEZvclBlcmlvZAUNY3VycmVudFBlcmlvZAULY3VycmVudFVzZXIECnVzZXJXZWlnaHQIBQ0kdDAxNDc3MTE0ODg3Al8xBAt1c2VyQWN0aW9ucwgFDSR0MDE0NzcxMTQ4ODcCXzIEDnRvdGFsV2VpZ2h0TmV3CQBkAgULdG90YWxXZWlnaHQFCnVzZXJXZWlnaHQEEXByb2Nlc3NpbmdBY3Rpb25zAwkAZgIJAGUCBQp1c2Vyc0NvdW50AAEFC2N1cnJlbnRVc2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TmV4dFByb2Nlc3NlZFVzZXIACQBkAgULY3VycmVudFVzZXIAAQUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESa2V5UHJvY2Vzc2luZ1N0YWdlAAUVcHJvY2Vzc2luZ1N0YWdlU2hhcmVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TmV4dFByb2Nlc3NlZFVzZXIAAAAFA25pbAkAlAoCCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUOdG90YWxXZWlnaHRLZXkFDnRvdGFsV2VpZ2h0TmV3BQNuaWwFEXByb2Nlc3NpbmdBY3Rpb25zBQt1c2VyQWN0aW9ucwYDCQAAAgUPcHJvY2Vzc2luZ1N0YWdlBRVwcm9jZXNzaW5nU3RhZ2VTaGFyZXMECnVzZXJXZWlnaHQJARZjYWxjVXNlcldlaWdodEZvckNsYWltBAkBFmJvb3N0aW5nQ29udHJhY3RPckZhaWwABQ9oZWlnaHRGb3JQZXJpb2QFDWN1cnJlbnRQZXJpb2QFC2N1cnJlbnRVc2VyBBp1c2VyQW1vdW50TWF0Y2hlckZvclBlcmlvZAkAawMJAQ5nZXROdW1iZXJCeUtleQEJARdrZXlUb3RhbEFtb3VudEZvclBlcmlvZAEFDWN1cnJlbnRQZXJpb2QFCnVzZXJXZWlnaHQFC3RvdGFsV2VpZ2h0BBt1c2VyQW1vdW50RW1pc3Npb25Gb3JQZXJpb2QJAGsDCQEOZ2V0TnVtYmVyQnlLZXkBCQEda2V5QXV4RW1pc3Npb25SZXdhcmRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBQp1c2VyV2VpZ2h0BQt0b3RhbFdlaWdodAQPdXNlclRvdGFsQW1vdW50CQBkAgUbdXNlckFtb3VudEVtaXNzaW9uRm9yUGVyaW9kBRp1c2VyQW1vdW50TWF0Y2hlckZvclBlcmlvZAQTdXNlclVuY2xhaW1lZE9wdGlvbgkAnwgBCQEQa2V5VXNlclVuY2xhaW1lZAEFC2N1cnJlbnRVc2VyBAt1c2VyQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNTMpAgkBFmJvb3N0aW5nQ29udHJhY3RPckZhaWwACQETa2V5TnVtVG9Vc2VyTWFwcGluZwEFC2N1cnJlbnRVc2VyBAhyZWZlcnJlcgkAnQgCBR5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwJAQtrZXlSZWZlcnJlcgEFC3VzZXJBZGRyZXNzBBFhY3RpdmVSZWZlcnJhbEludgMJAAACBQhyZWZlcnJlcgUEdW5pdAUEdW5pdAkA/AcEBR5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwCFnVwZGF0ZVJlZmVycmFsQWN0aXZpdHkJAMwIAgUTcmVmZXJyYWxQcm9ncmFtTmFtZQkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCCQBnAgUKdXNlcldlaWdodAUUcmVmZXJyYWxNaW5HV3hBbW91bnQFA25pbAUDbmlsAwkAAAIFEWFjdGl2ZVJlZmVycmFsSW52BRFhY3RpdmVSZWZlcnJhbEludgQLcmVmZXJyYWxJbnYDAwkAAAIFCHJlZmVycmVyBQR1bml0BgkAZgIFFHJlZmVycmFsTWluR1d4QW1vdW50BQp1c2VyV2VpZ2h0BQR1bml0BA5yZWZlcnJlclJld2FyZAkAawMFD3VzZXJUb3RhbEFtb3VudAUWcmVmZXJyZXJSZXdhcmRQZXJtaWxsZQUFU0NBTEUEDnJlZmVycmFsUmV3YXJkCQBrAwUPdXNlclRvdGFsQW1vdW50BRZyZWZlcnJhbFJld2FyZFBlcm1pbGxlBQVTQ0FMRQkA/AcEBR5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwCDGluY1VuY2xhaW1lZAkAzAgCBRNyZWZlcnJhbFByb2dyYW1OYW1lCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIFDnJlZmVycmVyUmV3YXJkCQDMCAIFDnJlZmVycmFsUmV3YXJkBQNuaWwFA25pbAMJAAACBQtyZWZlcnJhbEludgULcmVmZXJyYWxJbnYEEHVuY2xhaW1lZEFjdGlvbnMDAwUIbWlncmF0ZWQGCQECIT0CBRN1c2VyVW5jbGFpbWVkT3B0aW9uBQR1bml0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEQa2V5VXNlclVuY2xhaW1lZAEFC2N1cnJlbnRVc2VyCQBkAgkBC3ZhbHVlT3JFbHNlAgUTdXNlclVuY2xhaW1lZE9wdGlvbgAABQ91c2VyVG90YWxBbW91bnQFA25pbAUDbmlsBBFwcm9jZXNzaW5nQWN0aW9ucwMJAGYCCQBlAgUKdXNlcnNDb3VudAABBQtjdXJyZW50VXNlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleU5leHRQcm9jZXNzZWRVc2VyAAkAZAIFC2N1cnJlbnRVc2VyAAEFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleU5leHRQcm9jZXNzZWRQZXJpb2QACQBkAgUNY3VycmVudFBlcmlvZAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TmV4dFByb2Nlc3NlZFVzZXIAAAAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEmtleVByb2Nlc3NpbmdTdGFnZQAFA25pbAkAlAoCCQDOCAIFEHVuY2xhaW1lZEFjdGlvbnMFEXByb2Nlc3NpbmdBY3Rpb25zBgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECGGludmFsaWQgcHJvY2Vzc2luZyBzdGFnZQFpAQ9maW5hbGl6ZVdyYXBwZXIBB2NvdW50ZXIEBnJlc3VsdAoAAUAJAPwHBAUEdGhpcwIOZmluYWxpemVIZWxwZXIFA25pbAUDbmlsAwkAAQIFAUACB0Jvb2xlYW4FAUAJAAIBCQCsAgIJAAMBCQD8BwQFBHRoaXMCDmZpbmFsaXplSGVscGVyBQNuaWwFA25pbAIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgMJAAACBQZyZXN1bHQFBnJlc3VsdAMJAQEhAQUGcmVzdWx0AwkAAAIFB2NvdW50ZXIFCG1heERlcHRoCQACAQISTm90aGluZyB0byBwcm9jZXNzCQCUCgIFA25pbAUEdW5pdAMJAGYCBQdjb3VudGVyAAAJAJQKAgUDbmlsCQD8BwQFBHRoaXMCD2ZpbmFsaXplV3JhcHBlcgkAzAgCCQBlAgUHY291bnRlcgABBQNuaWwFA25pbAkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEdcHJvY2Vzc1BlbmRpbmdQZXJpb2RzQW5kVXNlcnMACQCUCgIFA25pbAkA/AcEBQR0aGlzAg9maW5hbGl6ZVdyYXBwZXIJAMwIAgUIbWF4RGVwdGgFA25pbAUDbmlsAWkBDW1pZ3JhdGVIZWxwZXIABAtjdXJyZW50VXNlcgkBDmdldE51bWJlckJ5S2V5AQUda2V5TmV4dFByb2Nlc3NlZFVzZXJNaWdyYXRpb24ECnVzZXJzQ291bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgkBFmJvb3N0aW5nQ29udHJhY3RPckZhaWwACQENa2V5VXNlcnNDb3VudAAAAAMFCG1pZ3JhdGVkCQCUCgIFA25pbAcEC3VzZXJBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA1MykCCQEWYm9vc3RpbmdDb250cmFjdE9yRmFpbAAJARNrZXlOdW1Ub1VzZXJNYXBwaW5nAQULY3VycmVudFVzZXIEDSR0MDE4MzE2MTgzNzcJARFjb21tb25DbGFpbVJld2FyZAEFC3VzZXJBZGRyZXNzBA11c2VyVW5jbGFpbWVkCAUNJHQwMTgzMTYxODM3NwJfMQQHYWN0aW9ucwgFDSR0MDE4MzE2MTgzNzcCXzIEEXByb2Nlc3NpbmdBY3Rpb25zAwkAZgIJAGUCBQp1c2Vyc0NvdW50AAEFC2N1cnJlbnRVc2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBR1rZXlOZXh0UHJvY2Vzc2VkVXNlck1pZ3JhdGlvbgkAZAIFC2N1cnJlbnRVc2VyAAEFA25pbAkAzAgCCQELRGVsZXRlRW50cnkBBR1rZXlOZXh0UHJvY2Vzc2VkVXNlck1pZ3JhdGlvbgkAzAgCCQEMQm9vbGVhbkVudHJ5AgULa2V5TWlncmF0ZWQGBQNuaWwJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEQa2V5VXNlclVuY2xhaW1lZAEFC2N1cnJlbnRVc2VyBQ11c2VyVW5jbGFpbWVkBQNuaWwFEXByb2Nlc3NpbmdBY3Rpb25zBgFpAQ5taWdyYXRlV3JhcHBlcgEHY291bnRlcgQGcmVzdWx0CgABQAkA/AcEBQR0aGlzAg1taWdyYXRlSGVscGVyBQNuaWwFA25pbAMJAAECBQFAAgdCb29sZWFuBQFACQACAQkArAICCQADAQkA/AcEBQR0aGlzAg1taWdyYXRlSGVscGVyBQNuaWwFA25pbAIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgMJAAACBQZyZXN1bHQFBnJlc3VsdAMJAQEhAQUGcmVzdWx0AwkAAAIFB2NvdW50ZXIFEW1heERlcHRoTWlncmF0aW9uCQACAQIRTWlncmF0aW9uIGlzIG92ZXIJAJQKAgUDbmlsBQR1bml0AwkAZgIFB2NvdW50ZXIAAAkAlAoCBQNuaWwJAPwHBAUEdGhpcwIObWlncmF0ZVdyYXBwZXIJAMwIAgkAZQIFB2NvdW50ZXIAAQUDbmlsBQNuaWwJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBB21pZ3JhdGUACQCUCgIFA25pbAkA/AcEBQR0aGlzAg5taWdyYXRlV3JhcHBlcgkAzAgCBRFtYXhEZXB0aE1pZ3JhdGlvbgUDbmlsBQNuaWwBaQEHZGVwb3NpdAAECGNmZ0FycmF5CQEVcmVhZENvbmZpZ0FycmF5T3JGYWlsAAMJAQIhPQIIBQFpBmNhbGxlcgkBB0FkZHJlc3MBCQDZBAEJAJEDAgUIY2ZnQXJyYXkFFklkeENmZ1BhY2VtYWtlckFkZHJlc3MJAAIBAhRXcm9uZyBjYWxsZXIgYWRkcmVzcwQHYXNzZXRJZAkBBXZhbHVlAQgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAwkBAiE9AgUHYXNzZXRJZAkA2QQBCQCRAwIFCGNmZ0FycmF5BQ1JZHhDZmdBc3NldElkCQACAQITV3JvbmcgcGF5bWVudCBhc3NldAQGcGVyaW9kCQEKbmV4dFBlcmlvZAAEBmRlbHRhSAkAZQIFBmhlaWdodAkBD2dldE51bWJlck9yRmFpbAEJAR9rZXlHd3hSZXdhcmRFbWlzc2lvblN0YXJ0SGVpZ2h0AAQMZW1pc3Npb25SYXRlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUQZW1pc3Npb25Db250cmFjdAkBFmtleVJhdGVQZXJCbG9ja0N1cnJlbnQACQCsAgIJAKwCAgIcbWFuZGF0b3J5IGVtaXNzaW9uX2NvbnRyYWN0LgkBFmtleVJhdGVQZXJCbG9ja0N1cnJlbnQAAg8gaXMgbm90IGRlZmluZWQEBndlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFD2ZhY3RvcnlDb250cmFjdAkBFGtleVBvb2xXZWlnaHRWaXJ0dWFsAAkArAICCQCsAgICG21hbmRhdG9yeSBmYWN0b3J5X2NvbnRyYWN0LgkBFGtleVBvb2xXZWlnaHRWaXJ0dWFsAAIPIGlzIG5vdCBkZWZpbmVkBAlhdXhBbW91bnQJAGsDCQBoAgUGZGVsdGFIBQZ3ZWlnaHQFDGVtaXNzaW9uUmF0ZQUFTVVMVDgEAmVtCQD8BwQFEGVtaXNzaW9uQ29udHJhY3QCBGVtaXQJAMwIAgUJYXV4QW1vdW50BQNuaWwFA25pbAMJAAACBQJlbQUCZW0EC21hdGNoZXJQYXJ0CAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQKcGF5b3V0SW5mbwkBEFBlcmlvZFBheW91dEluZm8DBQZwZXJpb2QFC21hdGNoZXJQYXJ0BQlhdXhBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlMYXRlc3RQZXJpb2QABQZwZXJpb2QJAMwIAgkBDEludGVnZXJFbnRyeQIJARJrZXlIZWlnaHRGb3JQZXJpb2QBBQZwZXJpb2QFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBHWtleUF1eEVtaXNzaW9uUmV3YXJkRm9yUGVyaW9kAQUGcGVyaW9kBQlhdXhBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAR9rZXlHd3hSZXdhcmRFbWlzc2lvblN0YXJ0SGVpZ2h0AAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEXa2V5VG90YWxBbW91bnRGb3JQZXJpb2QBBQZwZXJpb2QFC21hdGNoZXJQYXJ0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQENa2V5TmV4dFBlcmlvZAAJAGQCBQZwZXJpb2QAAQkAzAgCCQELU3RyaW5nRW50cnkCCQERa2V5TGFzdFBheW91dEluZm8ABQpwYXlvdXRJbmZvCQDMCAIJAQtTdHJpbmdFbnRyeQIJARRrZXlQYXlvdXRIaXN0b3J5SW5mbwEFBnBlcmlvZAUKcGF5b3V0SW5mbwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmNsYWltTmV4dEJhdGNoBhBib29zdGluZ0NvbnRyYWN0DWN1cnJlbnRQZXJpb2QLY3VycmVudFVzZXIFZGVwdGgQdG90YWxGcm9tTWF0Y2hlchF0b3RhbEZyb21FbWlzc2lvbgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECJFNob3VsZCBiZSBjYWxsZWQgYnkgdGhpcyBzY3JpcHQgb25seQQPcGVyaW9kQW5kVG90YWxzCQENY2xhaW1JbnRlcm5hbAYFEGJvb3N0aW5nQ29udHJhY3QFDWN1cnJlbnRQZXJpb2QFC2N1cnJlbnRVc2VyBQVkZXB0aAUQdG90YWxGcm9tTWF0Y2hlcgURdG90YWxGcm9tRW1pc3Npb24JAJQKAgUDbmlsBQ9wZXJpb2RBbmRUb3RhbHMBaQELY2xhaW1SZXdhcmQABAhjZmdBcnJheQkBFXJlYWRDb25maWdBcnJheU9yRmFpbAAEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBA0kdDAyMjAzNTIyMDg1CQERY29tbW9uQ2xhaW1SZXdhcmQBBQdhZGRyZXNzBAZhbW91bnQIBQ0kdDAyMjAzNTIyMDg1Al8xBAdhY3Rpb25zCAUNJHQwMjIwMzUyMjA4NQJfMgQLY2hlY2tBbW91bnQDCQBmAgUGYW1vdW50AAAGCQACAQIQTm90aGluZyB0byBjbGFpbQMJAAACBQtjaGVja0Ftb3VudAULY2hlY2tBbW91bnQEEmFtb3VudEZyb21FbWlzc2lvbgAABA9jbGFpbWVkUmVmZXJyYWwKAAFACQD8BwQFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAIFY2xhaW0JAMwIAgUTcmVmZXJyYWxQcm9ncmFtTmFtZQUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQkA/AcEBR5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwCBWNsYWltCQDMCAIFE3JlZmVycmFsUHJvZ3JhbU5hbWUFA25pbAUDbmlsAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQEC3RvdGFsQW1vdW50CQBkAgUGYW1vdW50BQ9jbGFpbWVkUmVmZXJyYWwJAJQKAgkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgULdG90YWxBbW91bnQJANkEAQkAkQMCBQhjZmdBcnJheQUNSWR4Q2ZnQXNzZXRJZAkAzAgCCQEMSGlzdG9yeUVudHJ5BAIFY2xhaW0FB2FkZHJlc3MFBmFtb3VudAUBaQUDbmlsBQdhY3Rpb25zCQDMCAIFC3RvdGFsQW1vdW50CQDMCAIFEmFtb3VudEZyb21FbWlzc2lvbgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE2NsYWltUmV3YXJkUkVBRE9OTFkBB2FkZHJlc3MEDSR0MDIyNjU4MjI3MDgJARFjb21tb25DbGFpbVJld2FyZAEFB2FkZHJlc3MEBmFtb3VudAgFDSR0MDIyNjU4MjI3MDgCXzEEB2FjdGlvbnMIBQ0kdDAyMjY1ODIyNzA4Al8yBBFyZWZlcnJhbFVuY2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAmggCBR5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwJARRrZXlVbmNsYWltZWRSZWZlcnJhbAIFE3JlZmVycmFsUHJvZ3JhbU5hbWUFB2FkZHJlc3MAAAQLdG90YWxBbW91bnQJAGQCBQZhbW91bnQFEXJlZmVycmFsVW5jbGFpbWVkCQCUCgIFA25pbAULdG90YWxBbW91bnQBaQEdbGF0ZXN0RmluYWxpemVkUGVyaW9kUkVBRE9OTFkBB2FkZHJlc3MJAJQKAgUDbmlsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ9rZXlMYXRlc3RQZXJpb2QAAP///////////wEBaQEhbGF0ZXN0RmluYWxpemVkUGVyaW9kSW5mb1JFQURPTkxZAQdhZGRyZXNzCQCUCgIFA25pbAkBDmdldFN0cmluZ0J5S2V5AQkBEWtleUxhc3RQYXlvdXRJbmZvAAFpARVjYWxjR3d4UGFyYW1zUkVBRE9OTFkDDmd3eEFtb3VudFN0YXJ0D2xvY2tTdGFydEhlaWdodBJsb2NrRHVyYXRpb25CbG9ja3MEDWxvY2tFbmRIZWlnaHQJAGQCBQ9sb2NrU3RhcnRIZWlnaHQFEmxvY2tEdXJhdGlvbkJsb2NrcwQMc2NhbGU4UGFyYW1LCQEBLQEJAGsDBQ5nd3hBbW91bnRTdGFydAUFU0NBTEUFEmxvY2tEdXJhdGlvbkJsb2NrcwQMc2NhbGU4UGFyYW1CCQBoAgkAawMFDmd3eEFtb3VudFN0YXJ0BQVTQ0FMRQUSbG9ja0R1cmF0aW9uQmxvY2tzBQ1sb2NrRW5kSGVpZ2h0CQCUCgIFA25pbAkAzAgCBQxzY2FsZThQYXJhbUsJAMwIAgUMc2NhbGU4UGFyYW1CCQDMCAIJAQpuZXh0UGVyaW9kAAUDbmlsAWkBGmNhbGNHd3hBbW91bnRTdGFydFJFQURPTkxZAwx3eExvY2tBbW91bnQMbG9ja0R1cmF0aW9uD21heExvY2tEdXJhdGlvbgQHY29lZmZYOAkAawMFDGxvY2tEdXJhdGlvbgUFTVVMVDgFD21heExvY2tEdXJhdGlvbgQOZ1d4QW1vdW50U3RhcnQJAGsDBQx3eExvY2tBbW91bnQFB2NvZWZmWDgFBU1VTFQ4CQCUCgIFA25pbAkAzAgCBQ5nV3hBbW91bnRTdGFydAUDbmlsAWkBC2NvbnN0cnVjdG9yBAx3eEFzc2V0SWRTdHIabWF0Y2hlclBhY2VtYWtlckFkZHJlc3NTdHIaYm9vc3RpbmdDb250cmFjdEFkZHJlc3NTdHIIbWF4RGVwdGgDCQECIT0CBQR0aGlzCAUBaQZjYWxsZXIJAAIBAg5ub3QgYXV0aG9yaXplZAkAzAgCCQELU3RyaW5nRW50cnkCCQEJa2V5Q29uZmlnAAkBDGZvcm1hdENvbmZpZwQFDHd4QXNzZXRJZFN0cgUabWF0Y2hlclBhY2VtYWtlckFkZHJlc3NTdHIFGmJvb3N0aW5nQ29udHJhY3RBZGRyZXNzU3RyBQhtYXhEZXB0aAUDbmlsAWkBDWNvbnN0cnVjdG9yVjIBDmZhY3RvcnlBZGRyZXNzAwkBAiE9AgUEdGhpcwgFAWkGY2FsbGVyCQACAQIObm90IGF1dGhvcml6ZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWtleUZhY3RvcnlBZGRyZXNzAAUOZmFjdG9yeUFkZHJlc3MFA25pbAFpAQ1jb25zdHJ1Y3RvclYzAQ9lbWlzc2lvbkFkZHJlc3MDCQECIT0CBQR0aGlzCAUBaQZjYWxsZXIJAAIBAg5ub3QgYXV0aG9yaXplZAQQaW5pdExhdGVzdFBlcmlvZAMJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAQ9rZXlMYXRlc3RQZXJpb2QABQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlMYXRlc3RQZXJpb2QAAP///////////wEFA25pbAkAzQgCBRBpbml0TGF0ZXN0UGVyaW9kCQELU3RyaW5nRW50cnkCCQESa2V5RW1pc3Npb25BZGRyZXNzAAUPZW1pc3Npb25BZGRyZXNzAWkBFW9uRW1pc3Npb25Gb3JHd3hTdGFydAADCQECIT0CCAUBaQZjYWxsZXIFD2ZhY3RvcnlDb250cmFjdAkAAgECEnBlcm1pc3Npb25zIGRlbmllZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBH2tleUd3eFJld2FyZEVtaXNzaW9uU3RhcnRIZWlnaHQABQZoZWlnaHQFA25pbAFpASNsYXRlc3RQZXJpb2RFbWlzc2lvblJld2FyZHNSRUFET05MWQEHYWRkcmVzcwQGcGVyaW9kCQEKbmV4dFBlcmlvZAAJAJQKAgUDbmlsCQDMCAIJAQ5nZXROdW1iZXJCeUtleQEJAR1rZXlBdXhFbWlzc2lvblJld2FyZEZvclBlcmlvZAEFBnBlcmlvZAUDbmlsAWkBBWNhbGNEBQt4MUJpZ0ludFN0cgt4MkJpZ0ludFN0cgxhbXBCaWdJbnRTdHITYVByZWNpc2lvbkJpZ0ludFN0chh0YXJnZXRQcmVjaXNpb25CaWdJbnRTdHIEBm5Db2lucwkAtgIBAAIECmFQcmVjaXNpb24JAKcDAQUTYVByZWNpc2lvbkJpZ0ludFN0cgQPdGFyZ2V0UHJlY2lzaW9uCQCnAwEFGHRhcmdldFByZWNpc2lvbkJpZ0ludFN0cgQCeDEJAKcDAQULeDFCaWdJbnRTdHIEAngyCQCnAwEFC3gyQmlnSW50U3RyBANhbXAJALkCAgkApwMBBQxhbXBCaWdJbnRTdHIFCmFQcmVjaXNpb24EAXMJALcCAgUCeDEFAngyAwkAAAIFAXMFCnplcm9CaWdJbnQJAJQKAgUDbmlsCQCmAwEFCnplcm9CaWdJbnQEA2FubgkAuQICBQNhbXAFBm5Db2lucwQDYXJyCQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwUDbmlsCgEEY2FsYwIDYWNjA2N1cgQNJHQwMjYyNjcyNjQ1NgUDYWNjBAFkCAUNJHQwMjYyNjcyNjQ1NgJfMQQFZFByZXYIBQ0kdDAyNjI2NzI2NDU2Al8yBAJkcAkAugICCQC5AgIJALkCAgUBZAUBZAUBZAkAuQICCQC5AgIJALkCAgUCeDEFAngyBQZuQ29pbnMFBm5Db2lucwQFZE5leHQJALoCAgkAuQICCQC3AgIJALoCAgkAuQICBQNhbm4FAXMFCmFQcmVjaXNpb24JALkCAgUCZHAFBm5Db2lucwUBZAkAtwICCQC6AgIJALkCAgkAuAICBQNhbm4FCmFQcmVjaXNpb24FAWQFCmFQcmVjaXNpb24JALkCAgkAtwICBQZuQ29pbnMJALYCAQABBQJkcAkAlAoCBQVkTmV4dAUBZAQNJHQwMjY2NjkyNjcxOQoAAiRsBQNhcnIKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFAXMFBHVuaXQKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGNhbGMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDcJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwQFZE5leHQIBQ0kdDAyNjY2OTI2NzE5Al8xBAVkUHJldggFDSR0MDI2NjY5MjY3MTkCXzIEBWREaWZmCQEDYWJzAQkAuAICBQVkTmV4dAkBBXZhbHVlAQUFZFByZXYDCQDAAgIFD3RhcmdldFByZWNpc2lvbgUFZERpZmYJAJQKAgUDbmlsCQCmAwEFBWROZXh0CQACAQkArAICAh1EIGNhbGN1bGF0aW9uIGVycm9yLCBkRGlmZiA9IAkApgMBBQVkRGlmZgFpAQpzZXRNYW5hZ2VyARdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQQLY2hlY2tDYWxsZXIJAQttdXN0TWFuYWdlcgEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyBBVjaGVja01hbmFnZXJQdWJsaWNLZXkJANkEAQUXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkDCQAAAgUVY2hlY2tNYW5hZ2VyUHVibGljS2V5BRVjaGVja01hbmFnZXJQdWJsaWNLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAUXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5jb25maXJtTWFuYWdlcgAEAnBtCQEdcGVuZGluZ01hbmFnZXJQdWJsaWNLZXlPclVuaXQABAVoYXNQTQMJAQlpc0RlZmluZWQBBQJwbQYJAAIBAhJObyBwZW5kaW5nIG1hbmFnZXIDCQAAAgUFaGFzUE0FBWhhc1BNBAdjaGVja1BNAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQkBBXZhbHVlAQUCcG0GCQACAQIbWW91IGFyZSBub3QgcGVuZGluZyBtYW5hZ2VyAwkAAAIFB2NoZWNrUE0FB2NoZWNrUE0JAMwIAgkBC1N0cmluZ0VudHJ5AgkBE2tleU1hbmFnZXJQdWJsaWNLZXkACQDYBAEJAQV2YWx1ZQEFAnBtCQDMCAIJAQtEZWxldGVFbnRyeQEJARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAED3RhcmdldFB1YmxpY0tleQQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwBQJwawMJAAECBQckbWF0Y2gwAgRVbml0CAUCdHgPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFD3RhcmdldFB1YmxpY0tledTAdhM=", "height": 2178174, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CRYTDdRbivdC4hk6YLCh5FocfLRJjrKbSqVasZwm73sB Next: 8pucsi8J2FqpyARCJcRdmV9N36JjNBZcJBLpx3UMeMJZ Diff:
OldNewDifferences
3737 let maxDepthDefault = 30
3838
3939 let maxDepth = valueOrElse(getInteger(this, keyMaxDepth), maxDepthDefault)
40+
41+let keyMaxDepthMigration = "%s__maxDepthMigration"
42+
43+let maxDepthMigrationDefault = 3
44+
45+let maxDepthMigration = valueOrElse(getInteger(this, keyMaxDepthMigration), maxDepthMigrationDefault)
46+
47+let keyMigrated = "migrated"
48+
49+let migrated = valueOrElse(getBoolean(this, keyMigrated), false)
50+
51+let keyNextProcessedUserMigration = "nextProcessedUserMigration"
4052
4153 func keyFactoryAddress () = "%s%s__config__factoryAddress"
4254
135147 func keyNextProcessedPeriod () = "%s__nextProcessedPeriod"
136148
137149
150+func keyUserUnclaimed (userIndex) = makeString(["%s%d", "userUnclaimed", toString(userIndex)], SEP)
151+
152+
138153 func keyNextUnlaimedPeriodOfUser (userIndex) = makeString(["%s%d__nextClaimedPeriod", toString(userIndex)], SEP)
139154
140155
176191
177192 let referralsContractAddressOrFail = addressFromStringValue(getStringOrFail(keyReferralsContractAddress()))
178193
179-func HistoryEntry (type,user,amountFromMatcher,amountFromEmission,currentPeriod,latestPeriod,i) = {
194+func HistoryEntry (type,user,amount,i) = {
180195 let historyKEY = makeString(["%s%s%s%s__history", type, user, toBase58String(i.transactionId)], SEP)
181- let historyDATA = makeString(["%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amountFromMatcher), toString(amountFromEmission), toString(currentPeriod), toString(latestPeriod)], SEP)
196+ let historyDATA = makeString(["%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount)], SEP)
182197 StringEntry(historyKEY, historyDATA)
183198 }
184199
311326 }
312327
313328
314-func commonClaimReward (userAddress,startPeriod) = {
329+func commonClaimReward (userAddress) = {
315330 let cfgArray = readConfigArrayOrFail()
316331 let userIdx = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddress)
317- let currentPeriod = if ((startPeriod != unit))
318- then value(startPeriod)
319- else getNumberByKey(keyNextUnlaimedPeriodOfUser(userIdx))
320- let nextProcessedPeriod = getNumberByKey(keyNextProcessedPeriod())
321- if ((currentPeriod >= nextProcessedPeriod))
322- then throw("Nothing to claim")
323- else {
324- let boostingContract = fromBase58String(cfgArray[IdxCfgBoostingContract])
325- let $t01272912855 = claimInternal(boostingContract, currentPeriod, userIdx, USERDEPTH, 0, 0)
326- let period = $t01272912855._1
327- let amountFromMatcher = $t01272912855._2
328- let amountFromEmission = $t01272912855._3
329- $Tuple6(period, amountFromMatcher, amountFromEmission, userIdx, cfgArray, nextProcessedPeriod)
330- }
332+ let userUnclaimedOption = getInteger(keyUserUnclaimed(userIdx))
333+ match userUnclaimedOption {
334+ case _: Unit =>
335+ if (migrated)
336+ then $Tuple2(0, nil)
337+ else {
338+ let currentPeriod = getNumberByKey(keyNextUnlaimedPeriodOfUser(userIdx))
339+ let nextProcessedPeriod = getNumberByKey(keyNextProcessedPeriod())
340+ if ((currentPeriod >= nextProcessedPeriod))
341+ then $Tuple2(0, nil)
342+ else {
343+ let boostingContract = fromBase58String(cfgArray[IdxCfgBoostingContract])
344+ let $t01306313189 = claimInternal(boostingContract, currentPeriod, userIdx, USERDEPTH, 0, 0)
345+ let period = $t01306313189._1
346+ let amountFromMatcher = $t01306313189._2
347+ let amountFromEmission = $t01306313189._3
348+ let amount = (amountFromMatcher + amountFromEmission)
349+ let actions = [IntegerEntry(keyNextUnlaimedPeriodOfUser(userIdx), period)]
350+ $Tuple2(amount, actions)
351+ }
352+ }
353+ case u: Int =>
354+ $Tuple2(u, [IntegerEntry(keyUserUnclaimed(userIdx), 0)])
355+ case _ =>
356+ throw("Match error")
357+ }
331358 }
332359
333360
358385 then $Tuple2(nil, false)
359386 else if ((processingStage == processingStageTotal))
360387 then {
361- let $t01425514371 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
362- let userWeight = $t01425514371._1
363- let userActions = $t01425514371._2
388+ let $t01477114887 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
389+ let userWeight = $t01477114887._1
390+ let userActions = $t01477114887._2
364391 let totalWeightNew = (totalWeight + userWeight)
365392 let processingActions = if (((usersCount - 1) > currentUser))
366393 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
373400 let userAmountMatcherForPeriod = fraction(getNumberByKey(keyTotalAmountForPeriod(currentPeriod)), userWeight, totalWeight)
374401 let userAmountEmissionForPeriod = fraction(getNumberByKey(keyAuxEmissionRewardForPeriod(currentPeriod)), userWeight, totalWeight)
375402 let userTotalAmount = (userAmountEmissionForPeriod + userAmountMatcherForPeriod)
403+ let userUnclaimedOption = getInteger(keyUserUnclaimed(currentUser))
376404 let userAddress = getStringValue(boostingContractOrFail(), keyNumToUserMapping(currentUser))
377405 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
378406 let activeReferralInv = if ((referrer == unit))
391419 }
392420 if ((referralInv == referralInv))
393421 then {
422+ let unclaimedActions = if (if (migrated)
423+ then true
424+ else (userUnclaimedOption != unit))
425+ then [IntegerEntry(keyUserUnclaimed(currentUser), (valueOrElse(userUnclaimedOption, 0) + userTotalAmount))]
426+ else nil
394427 let processingActions = if (((usersCount - 1) > currentUser))
395428 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
396429 else [IntegerEntry(keyNextProcessedPeriod(), (currentPeriod + 1)), IntegerEntry(keyNextProcessedUser(), 0), DeleteEntry(keyProcessingStage())]
397- $Tuple2(processingActions, true)
430+ $Tuple2((unclaimedActions ++ processingActions), true)
398431 }
399432 else throw("Strict value is not equal to itself.")
400433 }
428461
429462 @Callable(i)
430463 func processPendingPeriodsAndUsers () = $Tuple2(nil, invoke(this, "finalizeWrapper", [maxDepth], nil))
464+
465+
466+
467+@Callable(i)
468+func migrateHelper () = {
469+ let currentUser = getNumberByKey(keyNextProcessedUserMigration)
470+ let usersCount = valueOrElse(getInteger(boostingContractOrFail(), keyUsersCount()), 0)
471+ if (migrated)
472+ then $Tuple2(nil, false)
473+ else {
474+ let userAddress = getStringValue(boostingContractOrFail(), keyNumToUserMapping(currentUser))
475+ let $t01831618377 = commonClaimReward(userAddress)
476+ let userUnclaimed = $t01831618377._1
477+ let actions = $t01831618377._2
478+ let processingActions = if (((usersCount - 1) > currentUser))
479+ then [IntegerEntry(keyNextProcessedUserMigration, (currentUser + 1))]
480+ else [DeleteEntry(keyNextProcessedUserMigration), BooleanEntry(keyMigrated, true)]
481+ $Tuple2(([IntegerEntry(keyUserUnclaimed(currentUser), userUnclaimed)] ++ processingActions), true)
482+ }
483+ }
484+
485+
486+
487+@Callable(i)
488+func migrateWrapper (counter) = {
489+ let result = {
490+ let @ = invoke(this, "migrateHelper", nil, nil)
491+ if ($isInstanceOf(@, "Boolean"))
492+ then @
493+ else throw(($getType(invoke(this, "migrateHelper", nil, nil)) + " couldn't be cast to Boolean"))
494+ }
495+ if ((result == result))
496+ then if (!(result))
497+ then if ((counter == maxDepthMigration))
498+ then throw("Migration is over")
499+ else $Tuple2(nil, unit)
500+ else if ((counter > 0))
501+ then $Tuple2(nil, invoke(this, "migrateWrapper", [(counter - 1)], nil))
502+ else $Tuple2(nil, unit)
503+ else throw("Strict value is not equal to itself.")
504+ }
505+
506+
507+
508+@Callable(i)
509+func migrate () = $Tuple2(nil, invoke(this, "migrateWrapper", [maxDepthMigration], nil))
431510
432511
433512
472551
473552 @Callable(i)
474553 func claimReward () = {
554+ let cfgArray = readConfigArrayOrFail()
475555 let address = toString(i.caller)
476- let $t01990520031 = commonClaimReward(address, unit)
477- let period = $t01990520031._1
478- let amountFromMatcher = $t01990520031._2
479- let amountFromEmission = $t01990520031._3
480- let userIdx = $t01990520031._4
481- let cfgArray = $t01990520031._5
482- let nextProcessedPeriod = $t01990520031._6
483- let claimedReferral = {
484- let @ = invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)
485- if ($isInstanceOf(@, "Int"))
486- then @
487- else throw(($getType(invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)) + " couldn't be cast to Int"))
488- }
489- $Tuple2([IntegerEntry(keyNextUnlaimedPeriodOfUser(userIdx), period), ScriptTransfer(i.caller, (amountFromMatcher + amountFromEmission), fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, (amountFromMatcher + claimedReferral), amountFromEmission, period, nextProcessedPeriod, i)], [(amountFromMatcher + claimedReferral), amountFromEmission])
556+ let $t02203522085 = commonClaimReward(address)
557+ let amount = $t02203522085._1
558+ let actions = $t02203522085._2
559+ let checkAmount = if ((amount > 0))
560+ then true
561+ else throw("Nothing to claim")
562+ if ((checkAmount == checkAmount))
563+ then {
564+ let amountFromEmission = 0
565+ let claimedReferral = {
566+ let @ = invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)
567+ if ($isInstanceOf(@, "Int"))
568+ then @
569+ else throw(($getType(invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)) + " couldn't be cast to Int"))
570+ }
571+ let totalAmount = (amount + claimedReferral)
572+ $Tuple2(([ScriptTransfer(i.caller, totalAmount, fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, amount, i)] ++ actions), [totalAmount, amountFromEmission])
573+ }
574+ else throw("Strict value is not equal to itself.")
490575 }
491576
492577
493578
494579 @Callable(i)
495580 func claimRewardREADONLY (address) = {
496- let claimResults = commonClaimReward(address, unit)
581+ let $t02265822708 = commonClaimReward(address)
582+ let amount = $t02265822708._1
583+ let actions = $t02265822708._2
497584 let referralUnclaimed = valueOrElse(getInteger(referralsContractAddressOrFail, keyUnclaimedReferral(referralProgramName, address)), 0)
498- let amount = ((claimResults._2 + claimResults._3) + referralUnclaimed)
499- $Tuple2(nil, amount)
500- }
501-
502-
503-
504-@Callable(i)
505-func claimRewardPaginatedREADONLY (address,startPeriod) = {
506- let $t02108921206 = commonClaimReward(address, if ((0 > startPeriod))
507- then unit
508- else startPeriod)
509- let period = $t02108921206._1
510- let fromMatcher = $t02108921206._2
511- let fromEmission = $t02108921206._3
512- let amount = (fromMatcher + fromEmission)
513- $Tuple2(nil, $Tuple2(amount, period))
514- }
515-
516-
517-
518-@Callable(i)
519-func claimRewardDetailedREADONLY (address) = {
520- let $t02145721532 = commonClaimReward(address, unit)
521- let ignored = $t02145721532._1
522- let fromMatcher = $t02145721532._2
523- let fromEmission = $t02145721532._3
524- $Tuple2(nil, makeString(["%d%d%d", toString((fromMatcher + fromEmission)), toString(fromMatcher), toString(fromEmission)], SEP))
525- }
526-
527-
528-
529-@Callable(i)
530-func claimRewardDetailedPaginatedREADONLY (address,startPeriod) = {
531- let $t02182821945 = commonClaimReward(address, if ((0 > startPeriod))
532- then unit
533- else startPeriod)
534- let period = $t02182821945._1
535- let fromMatcher = $t02182821945._2
536- let fromEmission = $t02182821945._3
537- $Tuple2(nil, $Tuple2(makeString(["%d%d%d", toString((fromMatcher + fromEmission)), toString(fromMatcher), toString(fromEmission)], SEP), period))
585+ let totalAmount = (amount + referralUnclaimed)
586+ $Tuple2(nil, totalAmount)
538587 }
539588
540589
624673 let ann = (amp * nCoins)
625674 let arr = [1, 2, 3, 4, 5, 6, 7]
626675 func calc (acc,cur) = {
627- let $t02543425623 = acc
628- let d = $t02543425623._1
629- let dPrev = $t02543425623._2
676+ let $t02626726456 = acc
677+ let d = $t02626726456._1
678+ let dPrev = $t02626726456._2
630679 let dp = (((d * d) * d) / (((x1 * x2) * nCoins) * nCoins))
631680 let dNext = (((((ann * s) / aPrecision) + (dp * nCoins)) * d) / ((((ann - aPrecision) * d) / aPrecision) + ((nCoins + toBigInt(1)) * dp)))
632681 $Tuple2(dNext, d)
633682 }
634683
635- let $t02583625886 = {
684+ let $t02666926719 = {
636685 let $l = arr
637686 let $s = size($l)
638687 let $acc0 = $Tuple2(s, unit)
646695
647696 $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)
648697 }
649- let dNext = $t02583625886._1
650- let dPrev = $t02583625886._2
698+ let dNext = $t02666926719._1
699+ let dPrev = $t02666926719._2
651700 let dDiff = abs((dNext - value(dPrev)))
652701 if ((targetPrecision >= dDiff))
653702 then $Tuple2(nil, toString(dNext))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let USERDEPTH = 26
77
88 let SCALE = 1000
99
1010 let MULT8 = 100000000
1111
1212 let zeroBigInt = toBigInt(0)
1313
1414 let processingStageTotal = 0
1515
1616 let processingStageShares = 1
1717
1818 func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
1919
2020
2121 func getNumberOrFail (key) = valueOrErrorMessage(getInteger(this, key), (("mandatory this." + key) + " is not defined"))
2222
2323
2424 func getStringByKey (key) = valueOrElse(getString(this, key), "")
2525
2626
2727 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (("mandatory this." + key) + " is not defined"))
2828
2929
3030 func abs (val) = if ((zeroBigInt > val))
3131 then -(val)
3232 else val
3333
3434
3535 let keyMaxDepth = "%s__maxDepth"
3636
3737 let maxDepthDefault = 30
3838
3939 let maxDepth = valueOrElse(getInteger(this, keyMaxDepth), maxDepthDefault)
40+
41+let keyMaxDepthMigration = "%s__maxDepthMigration"
42+
43+let maxDepthMigrationDefault = 3
44+
45+let maxDepthMigration = valueOrElse(getInteger(this, keyMaxDepthMigration), maxDepthMigrationDefault)
46+
47+let keyMigrated = "migrated"
48+
49+let migrated = valueOrElse(getBoolean(this, keyMigrated), false)
50+
51+let keyNextProcessedUserMigration = "nextProcessedUserMigration"
4052
4153 func keyFactoryAddress () = "%s%s__config__factoryAddress"
4254
4355
4456 let factoryAddressStr = getStringOrFail(keyFactoryAddress())
4557
4658 let factoryContract = addressFromStringValue(factoryAddressStr)
4759
4860 func keyEmissionAddress () = "%s%s__config__emissionAddress"
4961
5062
5163 func keyNumToUserMapping (num) = makeString(["%s%s%s", "mapping", "num2user", toString(num)], SEP)
5264
5365
5466 let keyReferralProgramName = makeString(["%s%s", "referral", "programName"], SEP)
5567
5668 let referralProgramNameDefault = "wxlock"
5769
5870 let referralProgramName = valueOrElse(getString(this, keyReferralProgramName), referralProgramNameDefault)
5971
6072 let keyReferralMinGWxAmount = makeString(["%s%s", "referral", "minGWxAmount"], SEP)
6173
6274 let referralMinGWxAmountDefault = (500 * MULT8)
6375
6476 let referralMinGWxAmount = valueOrElse(getInteger(this, keyReferralMinGWxAmount), referralMinGWxAmountDefault)
6577
6678 let keyReferrerRewardPermille = makeString(["%s%s", "referral", "referrerRewardPermille"], SEP)
6779
6880 let referrerRewardPermilleDefault = 50
6981
7082 let referrerRewardPermille = valueOrElse(getInteger(this, keyReferrerRewardPermille), referrerRewardPermilleDefault)
7183
7284 let keyReferralRewardPermille = makeString(["%s%s", "referral", "referralRewardPermille"], SEP)
7385
7486 let referralRewardPermilleDefault = 50
7587
7688 let referralRewardPermille = valueOrElse(getInteger(this, keyReferralRewardPermille), referralRewardPermilleDefault)
7789
7890 func keyReferrer (referralAddress) = makeString(["%s%s%s", "referrer", referralProgramName, referralAddress], SEP)
7991
8092
8193 func keyUnclaimedReferral (programName,claimerAddress) = makeString(["%s%s%s%s", "unclaimedReferral", programName, claimerAddress], SEP)
8294
8395
8496 let emissionAddressStr = getStringOrFail(keyEmissionAddress())
8597
8698 let emissionContract = addressFromStringValue(emissionAddressStr)
8799
88100 let IdxCfgAssetId = 1
89101
90102 let IdxCfgPacemakerAddress = 2
91103
92104 let IdxCfgBoostingContract = 3
93105
94106 let IdxCfgMaxDepth = 4
95107
96108 func keyConfig () = "%s__config"
97109
98110
99111 func readConfigArrayOrFail () = split(getStringOrFail(keyConfig()), SEP)
100112
101113
102114 func formatConfig (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr,maxDepth) = makeString(["%s%s%s%d", wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr, toString(maxDepth)], SEP)
103115
104116
105117 func boostingContractOrFail () = {
106118 let cfgArray = readConfigArrayOrFail()
107119 valueOrErrorMessage(addressFromString(cfgArray[IdxCfgBoostingContract]), "boosting contract address is not defined")
108120 }
109121
110122
111123 func keyGwxRewardEmissionStartHeight () = "%s%s__gwxRewardEmissionPart__startHeight"
112124
113125
114126 func keyUsersCount () = "%s__nextUserNum"
115127
116128
117129 func keyRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
118130
119131
120132 func keyPoolWeightVirtual () = "%s%s__poolWeight__GWXvirtualPOOL"
121133
122134
123135 func keyNextProcessedUser () = "%s__nextProcessedUser"
124136
125137
126138 func keyLatestPeriod () = "%s__latestPeriod"
127139
128140
129141 func keyNextPeriod () = "%s__nextPeriod"
130142
131143
132144 func keyProcessingStage () = "%s__processingStage"
133145
134146
135147 func keyNextProcessedPeriod () = "%s__nextProcessedPeriod"
136148
137149
150+func keyUserUnclaimed (userIndex) = makeString(["%s%d", "userUnclaimed", toString(userIndex)], SEP)
151+
152+
138153 func keyNextUnlaimedPeriodOfUser (userIndex) = makeString(["%s%d__nextClaimedPeriod", toString(userIndex)], SEP)
139154
140155
141156 func keyLastProcessedPeriodOfUser (userIndex) = makeString(["%s%d__lastProcessedPeriod", toString(userIndex)], SEP)
142157
143158
144159 func keyHeightForPeriod (period) = makeString(["%s%d__startHeightForPeriod", toString(period)], SEP)
145160
146161
147162 func keyAuxEmissionRewardForPeriod (period) = makeString(["%s%d__auxEmissionReward", toString(period)], SEP)
148163
149164
150165 func keyTotalAmountForPeriod (period) = makeString(["%s%d__totalAmountForPeriod", toString(period)], SEP)
151166
152167
153168 func keyLastPayoutInfo () = "%s__lastPayoutInfo"
154169
155170
156171 func PeriodPayoutInfo (period,matcherReward,emissionReward) = makeString(["%d%d%d", toString(period), toString(matcherReward), toString(emissionReward)], SEP)
157172
158173
159174 func keyPayoutHistoryInfo (period) = makeString(["%s%s%d__payouts__history", toString(period)], SEP)
160175
161176
162177 func keyTotalWeightForPeriod (period) = makeString(["%s%d__totalWeightForPeriod", toString(period)], SEP)
163178
164179
165180 func keyUserKValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "k", toString(period)], SEP)
166181
167182
168183 func keyUserBValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "b", toString(period)], SEP)
169184
170185
171186 func keyUserWeightForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "weight", toString(period)], SEP)
172187
173188
174189 func keyReferralsContractAddress () = makeString(["%s%s", "config", "referralsContractAddress"], SEP)
175190
176191
177192 let referralsContractAddressOrFail = addressFromStringValue(getStringOrFail(keyReferralsContractAddress()))
178193
179-func HistoryEntry (type,user,amountFromMatcher,amountFromEmission,currentPeriod,latestPeriod,i) = {
194+func HistoryEntry (type,user,amount,i) = {
180195 let historyKEY = makeString(["%s%s%s%s__history", type, user, toBase58String(i.transactionId)], SEP)
181- let historyDATA = makeString(["%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amountFromMatcher), toString(amountFromEmission), toString(currentPeriod), toString(latestPeriod)], SEP)
196+ let historyDATA = makeString(["%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount)], SEP)
182197 StringEntry(historyKEY, historyDATA)
183198 }
184199
185200
186201 func keyManagerPublicKey () = "%s__managerPublicKey"
187202
188203
189204 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
190205
191206
192207 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
193208 case s: String =>
194209 fromBase58String(s)
195210 case _: Unit =>
196211 unit
197212 case _ =>
198213 throw("Match error")
199214 }
200215
201216
202217 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
203218 case s: String =>
204219 fromBase58String(s)
205220 case _: Unit =>
206221 unit
207222 case _ =>
208223 throw("Match error")
209224 }
210225
211226
212227 func mustManager (i) = {
213228 let pd = throw("Permission denied")
214229 match managerPublicKeyOrUnit() {
215230 case pk: ByteVector =>
216231 if ((i.callerPublicKey == pk))
217232 then true
218233 else pd
219234 case _: Unit =>
220235 if ((i.caller == this))
221236 then true
222237 else pd
223238 case _ =>
224239 throw("Match error")
225240 }
226241 }
227242
228243
229244 func calcUserWeight (boostingContractAddress,heightForPeriod,period,userIndex) = {
230245 let kLast = keyLastProcessedPeriodOfUser(userIndex)
231246 let kKey = keyUserKValueForPeriod(period, userIndex)
232247 let kRaw = getInteger(boostingContractAddress, kKey)
233248 let kUserWeight = keyUserWeightForPeriod(period, userIndex)
234249 if (isDefined(kRaw))
235250 then {
236251 let k = value(kRaw)
237252 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(period, userIndex)))
238253 let w = ((k * heightForPeriod) + b)
239254 if ((w > 0))
240255 then $Tuple2((w / SCALE), [IntegerEntry(kLast, period), IntegerEntry(kUserWeight, w)])
241256 else $Tuple2(0, nil)
242257 }
243258 else {
244259 let p = getInteger(this, kLast)
245260 if (if (isDefined(p))
246261 then (period >= value(p))
247262 else false)
248263 then {
249264 let pv = value(p)
250265 let k = value(getInteger(boostingContractAddress, keyUserKValueForPeriod(pv, userIndex)))
251266 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(pv, userIndex)))
252267 let w = ((k * heightForPeriod) + b)
253268 if ((w > 0))
254269 then $Tuple2((w / SCALE), [IntegerEntry(kUserWeight, w)])
255270 else $Tuple2(0, nil)
256271 }
257272 else $Tuple2(0, nil)
258273 }
259274 }
260275
261276
262277 func calcUserWeightForClaim (boostingContractAddress,heightForPeriod,period,userIndex) = {
263278 let kUserWeight = keyUserWeightForPeriod(period, userIndex)
264279 let userWeightOrUnit = getInteger(kUserWeight)
265280 match userWeightOrUnit {
266281 case _: Unit =>
267282 0
268283 case w: Int =>
269284 (w / SCALE)
270285 case _ =>
271286 throw("Match error")
272287 }
273288 }
274289
275290
276291 func getUserIndexByAddress (boostingContractAddressStr,userAddress) = {
277292 let key = makeString(["%s%s%s", "mapping", "user2num", userAddress], SEP)
278293 parseIntValue(valueOrErrorMessage(getString(Address(fromBase58String(boostingContractAddressStr)), key), ((("User address " + userAddress) + " is not found in boosting contract data, key=") + key)))
279294 }
280295
281296
282297 func nextPeriod () = getNumberByKey(keyNextPeriod())
283298
284299
285300 func invokeClaim (boostingContract,period,user,depth,totalFromMatcher,totalFromEmission) = {
286301 let result = invoke(this, "claimNextBatch", [boostingContract, period, user, depth, totalFromMatcher, totalFromEmission], nil)
287302 if ((result == result))
288303 then match result {
289304 case r: (Int, Int, Int) =>
290305 r
291306 case _ =>
292307 throw("Incorrect invoke result")
293308 }
294309 else throw("Strict value is not equal to itself.")
295310 }
296311
297312
298313 func claimInternal (boostingContract,currentPeriod,currentUser,depth,userAccumulatedMatcher,userAccumulatedEmission) = {
299314 let boostingContractAddress = Address(boostingContract)
300315 let latestPeriod = getNumberByKey(keyNextProcessedPeriod())
301316 let totalWeight = getNumberByKey(keyTotalWeightForPeriod(currentPeriod))
302317 let heightForPeriod = getNumberByKey(keyHeightForPeriod(currentPeriod))
303318 let userWeight = calcUserWeightForClaim(boostingContractAddress, heightForPeriod, currentPeriod, currentUser)
304319 let userAmountMatcherForPeriod = fraction(getNumberByKey(keyTotalAmountForPeriod(currentPeriod)), userWeight, totalWeight)
305320 let userAmountEmissionForPeriod = fraction(getNumberByKey(keyAuxEmissionRewardForPeriod(currentPeriod)), userWeight, totalWeight)
306321 if (if ((0 >= depth))
307322 then true
308323 else ((currentPeriod + 1) >= latestPeriod))
309324 then $Tuple3((currentPeriod + 1), (userAccumulatedMatcher + userAmountMatcherForPeriod), (userAccumulatedEmission + userAmountEmissionForPeriod))
310325 else invokeClaim(boostingContract, (currentPeriod + 1), currentUser, (depth - 1), (userAccumulatedMatcher + userAmountMatcherForPeriod), (userAccumulatedEmission + userAmountEmissionForPeriod))
311326 }
312327
313328
314-func commonClaimReward (userAddress,startPeriod) = {
329+func commonClaimReward (userAddress) = {
315330 let cfgArray = readConfigArrayOrFail()
316331 let userIdx = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddress)
317- let currentPeriod = if ((startPeriod != unit))
318- then value(startPeriod)
319- else getNumberByKey(keyNextUnlaimedPeriodOfUser(userIdx))
320- let nextProcessedPeriod = getNumberByKey(keyNextProcessedPeriod())
321- if ((currentPeriod >= nextProcessedPeriod))
322- then throw("Nothing to claim")
323- else {
324- let boostingContract = fromBase58String(cfgArray[IdxCfgBoostingContract])
325- let $t01272912855 = claimInternal(boostingContract, currentPeriod, userIdx, USERDEPTH, 0, 0)
326- let period = $t01272912855._1
327- let amountFromMatcher = $t01272912855._2
328- let amountFromEmission = $t01272912855._3
329- $Tuple6(period, amountFromMatcher, amountFromEmission, userIdx, cfgArray, nextProcessedPeriod)
330- }
332+ let userUnclaimedOption = getInteger(keyUserUnclaimed(userIdx))
333+ match userUnclaimedOption {
334+ case _: Unit =>
335+ if (migrated)
336+ then $Tuple2(0, nil)
337+ else {
338+ let currentPeriod = getNumberByKey(keyNextUnlaimedPeriodOfUser(userIdx))
339+ let nextProcessedPeriod = getNumberByKey(keyNextProcessedPeriod())
340+ if ((currentPeriod >= nextProcessedPeriod))
341+ then $Tuple2(0, nil)
342+ else {
343+ let boostingContract = fromBase58String(cfgArray[IdxCfgBoostingContract])
344+ let $t01306313189 = claimInternal(boostingContract, currentPeriod, userIdx, USERDEPTH, 0, 0)
345+ let period = $t01306313189._1
346+ let amountFromMatcher = $t01306313189._2
347+ let amountFromEmission = $t01306313189._3
348+ let amount = (amountFromMatcher + amountFromEmission)
349+ let actions = [IntegerEntry(keyNextUnlaimedPeriodOfUser(userIdx), period)]
350+ $Tuple2(amount, actions)
351+ }
352+ }
353+ case u: Int =>
354+ $Tuple2(u, [IntegerEntry(keyUserUnclaimed(userIdx), 0)])
355+ case _ =>
356+ throw("Match error")
357+ }
331358 }
332359
333360
334361 @Callable(i)
335362 func updateReferralActivity (userAddress,gWxAmountStart) = {
336363 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
337364 let activeReferralInv = if ((referrer == unit))
338365 then unit
339366 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (gWxAmountStart >= referralMinGWxAmount)], nil)
340367 if ((activeReferralInv == activeReferralInv))
341368 then $Tuple2(nil, unit)
342369 else throw("Strict value is not equal to itself.")
343370 }
344371
345372
346373
347374 @Callable(i)
348375 func finalizeHelper () = {
349376 let processingStage = valueOrElse(getInteger(keyProcessingStage()), processingStageTotal)
350377 let currentPeriod = getNumberByKey(keyNextProcessedPeriod())
351378 let currentUser = getNumberByKey(keyNextProcessedUser())
352379 let latestPeriod = getNumberByKey(keyLatestPeriod())
353380 let usersCount = valueOrElse(getInteger(boostingContractOrFail(), keyUsersCount()), 0)
354381 let totalWeightKey = keyTotalWeightForPeriod(currentPeriod)
355382 let totalWeight = getNumberByKey(keyTotalWeightForPeriod(currentPeriod))
356383 let heightForPeriod = getNumberByKey(keyHeightForPeriod(currentPeriod))
357384 if ((currentPeriod > latestPeriod))
358385 then $Tuple2(nil, false)
359386 else if ((processingStage == processingStageTotal))
360387 then {
361- let $t01425514371 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
362- let userWeight = $t01425514371._1
363- let userActions = $t01425514371._2
388+ let $t01477114887 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
389+ let userWeight = $t01477114887._1
390+ let userActions = $t01477114887._2
364391 let totalWeightNew = (totalWeight + userWeight)
365392 let processingActions = if (((usersCount - 1) > currentUser))
366393 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
367394 else [IntegerEntry(keyProcessingStage(), processingStageShares), IntegerEntry(keyNextProcessedUser(), 0)]
368395 $Tuple2((([IntegerEntry(totalWeightKey, totalWeightNew)] ++ processingActions) ++ userActions), true)
369396 }
370397 else if ((processingStage == processingStageShares))
371398 then {
372399 let userWeight = calcUserWeightForClaim(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
373400 let userAmountMatcherForPeriod = fraction(getNumberByKey(keyTotalAmountForPeriod(currentPeriod)), userWeight, totalWeight)
374401 let userAmountEmissionForPeriod = fraction(getNumberByKey(keyAuxEmissionRewardForPeriod(currentPeriod)), userWeight, totalWeight)
375402 let userTotalAmount = (userAmountEmissionForPeriod + userAmountMatcherForPeriod)
403+ let userUnclaimedOption = getInteger(keyUserUnclaimed(currentUser))
376404 let userAddress = getStringValue(boostingContractOrFail(), keyNumToUserMapping(currentUser))
377405 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
378406 let activeReferralInv = if ((referrer == unit))
379407 then unit
380408 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (userWeight >= referralMinGWxAmount)], nil)
381409 if ((activeReferralInv == activeReferralInv))
382410 then {
383411 let referralInv = if (if ((referrer == unit))
384412 then true
385413 else (referralMinGWxAmount > userWeight))
386414 then unit
387415 else {
388416 let referrerReward = fraction(userTotalAmount, referrerRewardPermille, SCALE)
389417 let referralReward = fraction(userTotalAmount, referralRewardPermille, SCALE)
390418 invoke(referralsContractAddressOrFail, "incUnclaimed", [referralProgramName, userAddress, referrerReward, referralReward], nil)
391419 }
392420 if ((referralInv == referralInv))
393421 then {
422+ let unclaimedActions = if (if (migrated)
423+ then true
424+ else (userUnclaimedOption != unit))
425+ then [IntegerEntry(keyUserUnclaimed(currentUser), (valueOrElse(userUnclaimedOption, 0) + userTotalAmount))]
426+ else nil
394427 let processingActions = if (((usersCount - 1) > currentUser))
395428 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
396429 else [IntegerEntry(keyNextProcessedPeriod(), (currentPeriod + 1)), IntegerEntry(keyNextProcessedUser(), 0), DeleteEntry(keyProcessingStage())]
397- $Tuple2(processingActions, true)
430+ $Tuple2((unclaimedActions ++ processingActions), true)
398431 }
399432 else throw("Strict value is not equal to itself.")
400433 }
401434 else throw("Strict value is not equal to itself.")
402435 }
403436 else throw("invalid processing stage")
404437 }
405438
406439
407440
408441 @Callable(i)
409442 func finalizeWrapper (counter) = {
410443 let result = {
411444 let @ = invoke(this, "finalizeHelper", nil, nil)
412445 if ($isInstanceOf(@, "Boolean"))
413446 then @
414447 else throw(($getType(invoke(this, "finalizeHelper", nil, nil)) + " couldn't be cast to Boolean"))
415448 }
416449 if ((result == result))
417450 then if (!(result))
418451 then if ((counter == maxDepth))
419452 then throw("Nothing to process")
420453 else $Tuple2(nil, unit)
421454 else if ((counter > 0))
422455 then $Tuple2(nil, invoke(this, "finalizeWrapper", [(counter - 1)], nil))
423456 else $Tuple2(nil, unit)
424457 else throw("Strict value is not equal to itself.")
425458 }
426459
427460
428461
429462 @Callable(i)
430463 func processPendingPeriodsAndUsers () = $Tuple2(nil, invoke(this, "finalizeWrapper", [maxDepth], nil))
464+
465+
466+
467+@Callable(i)
468+func migrateHelper () = {
469+ let currentUser = getNumberByKey(keyNextProcessedUserMigration)
470+ let usersCount = valueOrElse(getInteger(boostingContractOrFail(), keyUsersCount()), 0)
471+ if (migrated)
472+ then $Tuple2(nil, false)
473+ else {
474+ let userAddress = getStringValue(boostingContractOrFail(), keyNumToUserMapping(currentUser))
475+ let $t01831618377 = commonClaimReward(userAddress)
476+ let userUnclaimed = $t01831618377._1
477+ let actions = $t01831618377._2
478+ let processingActions = if (((usersCount - 1) > currentUser))
479+ then [IntegerEntry(keyNextProcessedUserMigration, (currentUser + 1))]
480+ else [DeleteEntry(keyNextProcessedUserMigration), BooleanEntry(keyMigrated, true)]
481+ $Tuple2(([IntegerEntry(keyUserUnclaimed(currentUser), userUnclaimed)] ++ processingActions), true)
482+ }
483+ }
484+
485+
486+
487+@Callable(i)
488+func migrateWrapper (counter) = {
489+ let result = {
490+ let @ = invoke(this, "migrateHelper", nil, nil)
491+ if ($isInstanceOf(@, "Boolean"))
492+ then @
493+ else throw(($getType(invoke(this, "migrateHelper", nil, nil)) + " couldn't be cast to Boolean"))
494+ }
495+ if ((result == result))
496+ then if (!(result))
497+ then if ((counter == maxDepthMigration))
498+ then throw("Migration is over")
499+ else $Tuple2(nil, unit)
500+ else if ((counter > 0))
501+ then $Tuple2(nil, invoke(this, "migrateWrapper", [(counter - 1)], nil))
502+ else $Tuple2(nil, unit)
503+ else throw("Strict value is not equal to itself.")
504+ }
505+
506+
507+
508+@Callable(i)
509+func migrate () = $Tuple2(nil, invoke(this, "migrateWrapper", [maxDepthMigration], nil))
431510
432511
433512
434513 @Callable(i)
435514 func deposit () = {
436515 let cfgArray = readConfigArrayOrFail()
437516 if ((i.caller != Address(fromBase58String(cfgArray[IdxCfgPacemakerAddress]))))
438517 then throw("Wrong caller address")
439518 else {
440519 let assetId = value(value(i.payments[0]).assetId)
441520 if ((assetId != fromBase58String(cfgArray[IdxCfgAssetId])))
442521 then throw("Wrong payment asset")
443522 else {
444523 let period = nextPeriod()
445524 let deltaH = (height - getNumberOrFail(keyGwxRewardEmissionStartHeight()))
446525 let emissionRate = valueOrErrorMessage(getInteger(emissionContract, keyRatePerBlockCurrent()), (("mandatory emission_contract." + keyRatePerBlockCurrent()) + " is not defined"))
447526 let weight = valueOrErrorMessage(getInteger(factoryContract, keyPoolWeightVirtual()), (("mandatory factory_contract." + keyPoolWeightVirtual()) + " is not defined"))
448527 let auxAmount = fraction((deltaH * weight), emissionRate, MULT8)
449528 let em = invoke(emissionContract, "emit", [auxAmount], nil)
450529 if ((em == em))
451530 then {
452531 let matcherPart = value(i.payments[0]).amount
453532 let payoutInfo = PeriodPayoutInfo(period, matcherPart, auxAmount)
454533 [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)]
455534 }
456535 else throw("Strict value is not equal to itself.")
457536 }
458537 }
459538 }
460539
461540
462541
463542 @Callable(i)
464543 func claimNextBatch (boostingContract,currentPeriod,currentUser,depth,totalFromMatcher,totalFromEmission) = if ((i.caller != this))
465544 then throw("Should be called by this script only")
466545 else {
467546 let periodAndTotals = claimInternal(boostingContract, currentPeriod, currentUser, depth, totalFromMatcher, totalFromEmission)
468547 $Tuple2(nil, periodAndTotals)
469548 }
470549
471550
472551
473552 @Callable(i)
474553 func claimReward () = {
554+ let cfgArray = readConfigArrayOrFail()
475555 let address = toString(i.caller)
476- let $t01990520031 = commonClaimReward(address, unit)
477- let period = $t01990520031._1
478- let amountFromMatcher = $t01990520031._2
479- let amountFromEmission = $t01990520031._3
480- let userIdx = $t01990520031._4
481- let cfgArray = $t01990520031._5
482- let nextProcessedPeriod = $t01990520031._6
483- let claimedReferral = {
484- let @ = invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)
485- if ($isInstanceOf(@, "Int"))
486- then @
487- else throw(($getType(invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)) + " couldn't be cast to Int"))
488- }
489- $Tuple2([IntegerEntry(keyNextUnlaimedPeriodOfUser(userIdx), period), ScriptTransfer(i.caller, (amountFromMatcher + amountFromEmission), fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, (amountFromMatcher + claimedReferral), amountFromEmission, period, nextProcessedPeriod, i)], [(amountFromMatcher + claimedReferral), amountFromEmission])
556+ let $t02203522085 = commonClaimReward(address)
557+ let amount = $t02203522085._1
558+ let actions = $t02203522085._2
559+ let checkAmount = if ((amount > 0))
560+ then true
561+ else throw("Nothing to claim")
562+ if ((checkAmount == checkAmount))
563+ then {
564+ let amountFromEmission = 0
565+ let claimedReferral = {
566+ let @ = invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)
567+ if ($isInstanceOf(@, "Int"))
568+ then @
569+ else throw(($getType(invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)) + " couldn't be cast to Int"))
570+ }
571+ let totalAmount = (amount + claimedReferral)
572+ $Tuple2(([ScriptTransfer(i.caller, totalAmount, fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, amount, i)] ++ actions), [totalAmount, amountFromEmission])
573+ }
574+ else throw("Strict value is not equal to itself.")
490575 }
491576
492577
493578
494579 @Callable(i)
495580 func claimRewardREADONLY (address) = {
496- let claimResults = commonClaimReward(address, unit)
581+ let $t02265822708 = commonClaimReward(address)
582+ let amount = $t02265822708._1
583+ let actions = $t02265822708._2
497584 let referralUnclaimed = valueOrElse(getInteger(referralsContractAddressOrFail, keyUnclaimedReferral(referralProgramName, address)), 0)
498- let amount = ((claimResults._2 + claimResults._3) + referralUnclaimed)
499- $Tuple2(nil, amount)
500- }
501-
502-
503-
504-@Callable(i)
505-func claimRewardPaginatedREADONLY (address,startPeriod) = {
506- let $t02108921206 = commonClaimReward(address, if ((0 > startPeriod))
507- then unit
508- else startPeriod)
509- let period = $t02108921206._1
510- let fromMatcher = $t02108921206._2
511- let fromEmission = $t02108921206._3
512- let amount = (fromMatcher + fromEmission)
513- $Tuple2(nil, $Tuple2(amount, period))
514- }
515-
516-
517-
518-@Callable(i)
519-func claimRewardDetailedREADONLY (address) = {
520- let $t02145721532 = commonClaimReward(address, unit)
521- let ignored = $t02145721532._1
522- let fromMatcher = $t02145721532._2
523- let fromEmission = $t02145721532._3
524- $Tuple2(nil, makeString(["%d%d%d", toString((fromMatcher + fromEmission)), toString(fromMatcher), toString(fromEmission)], SEP))
525- }
526-
527-
528-
529-@Callable(i)
530-func claimRewardDetailedPaginatedREADONLY (address,startPeriod) = {
531- let $t02182821945 = commonClaimReward(address, if ((0 > startPeriod))
532- then unit
533- else startPeriod)
534- let period = $t02182821945._1
535- let fromMatcher = $t02182821945._2
536- let fromEmission = $t02182821945._3
537- $Tuple2(nil, $Tuple2(makeString(["%d%d%d", toString((fromMatcher + fromEmission)), toString(fromMatcher), toString(fromEmission)], SEP), period))
585+ let totalAmount = (amount + referralUnclaimed)
586+ $Tuple2(nil, totalAmount)
538587 }
539588
540589
541590
542591 @Callable(i)
543592 func latestFinalizedPeriodREADONLY (address) = $Tuple2(nil, valueOrElse(getInteger(this, keyLatestPeriod()), -1))
544593
545594
546595
547596 @Callable(i)
548597 func latestFinalizedPeriodInfoREADONLY (address) = $Tuple2(nil, getStringByKey(keyLastPayoutInfo()))
549598
550599
551600
552601 @Callable(i)
553602 func calcGwxParamsREADONLY (gwxAmountStart,lockStartHeight,lockDurationBlocks) = {
554603 let lockEndHeight = (lockStartHeight + lockDurationBlocks)
555604 let scale8ParamK = -(fraction(gwxAmountStart, SCALE, lockDurationBlocks))
556605 let scale8ParamB = (fraction(gwxAmountStart, SCALE, lockDurationBlocks) * lockEndHeight)
557606 $Tuple2(nil, [scale8ParamK, scale8ParamB, nextPeriod()])
558607 }
559608
560609
561610
562611 @Callable(i)
563612 func calcGwxAmountStartREADONLY (wxLockAmount,lockDuration,maxLockDuration) = {
564613 let coeffX8 = fraction(lockDuration, MULT8, maxLockDuration)
565614 let gWxAmountStart = fraction(wxLockAmount, coeffX8, MULT8)
566615 $Tuple2(nil, [gWxAmountStart])
567616 }
568617
569618
570619
571620 @Callable(i)
572621 func constructor (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr,maxDepth) = if ((this != i.caller))
573622 then throw("not authorized")
574623 else [StringEntry(keyConfig(), formatConfig(wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr, maxDepth))]
575624
576625
577626
578627 @Callable(i)
579628 func constructorV2 (factoryAddress) = if ((this != i.caller))
580629 then throw("not authorized")
581630 else [StringEntry(keyFactoryAddress(), factoryAddress)]
582631
583632
584633
585634 @Callable(i)
586635 func constructorV3 (emissionAddress) = if ((this != i.caller))
587636 then throw("not authorized")
588637 else {
589638 let initLatestPeriod = if (isDefined(getInteger(this, keyLatestPeriod())))
590639 then nil
591640 else [IntegerEntry(keyLatestPeriod(), -1)]
592641 (initLatestPeriod :+ StringEntry(keyEmissionAddress(), emissionAddress))
593642 }
594643
595644
596645
597646 @Callable(i)
598647 func onEmissionForGwxStart () = if ((i.caller != factoryContract))
599648 then throw("permissions denied")
600649 else [IntegerEntry(keyGwxRewardEmissionStartHeight(), height)]
601650
602651
603652
604653 @Callable(i)
605654 func latestPeriodEmissionRewardsREADONLY (address) = {
606655 let period = nextPeriod()
607656 $Tuple2(nil, [getNumberByKey(keyAuxEmissionRewardForPeriod(period))])
608657 }
609658
610659
611660
612661 @Callable(i)
613662 func calcD (x1BigIntStr,x2BigIntStr,ampBigIntStr,aPrecisionBigIntStr,targetPrecisionBigIntStr) = {
614663 let nCoins = toBigInt(2)
615664 let aPrecision = parseBigIntValue(aPrecisionBigIntStr)
616665 let targetPrecision = parseBigIntValue(targetPrecisionBigIntStr)
617666 let x1 = parseBigIntValue(x1BigIntStr)
618667 let x2 = parseBigIntValue(x2BigIntStr)
619668 let amp = (parseBigIntValue(ampBigIntStr) * aPrecision)
620669 let s = (x1 + x2)
621670 if ((s == zeroBigInt))
622671 then $Tuple2(nil, toString(zeroBigInt))
623672 else {
624673 let ann = (amp * nCoins)
625674 let arr = [1, 2, 3, 4, 5, 6, 7]
626675 func calc (acc,cur) = {
627- let $t02543425623 = acc
628- let d = $t02543425623._1
629- let dPrev = $t02543425623._2
676+ let $t02626726456 = acc
677+ let d = $t02626726456._1
678+ let dPrev = $t02626726456._2
630679 let dp = (((d * d) * d) / (((x1 * x2) * nCoins) * nCoins))
631680 let dNext = (((((ann * s) / aPrecision) + (dp * nCoins)) * d) / ((((ann - aPrecision) * d) / aPrecision) + ((nCoins + toBigInt(1)) * dp)))
632681 $Tuple2(dNext, d)
633682 }
634683
635- let $t02583625886 = {
684+ let $t02666926719 = {
636685 let $l = arr
637686 let $s = size($l)
638687 let $acc0 = $Tuple2(s, unit)
639688 func $f0_1 ($a,$i) = if (($i >= $s))
640689 then $a
641690 else calc($a, $l[$i])
642691
643692 func $f0_2 ($a,$i) = if (($i >= $s))
644693 then $a
645694 else throw("List size exceeds 7")
646695
647696 $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)
648697 }
649- let dNext = $t02583625886._1
650- let dPrev = $t02583625886._2
698+ let dNext = $t02666926719._1
699+ let dPrev = $t02666926719._2
651700 let dDiff = abs((dNext - value(dPrev)))
652701 if ((targetPrecision >= dDiff))
653702 then $Tuple2(nil, toString(dNext))
654703 else throw(("D calculation error, dDiff = " + toString(dDiff)))
655704 }
656705 }
657706
658707
659708
660709 @Callable(i)
661710 func setManager (pendingManagerPublicKey) = {
662711 let checkCaller = mustManager(i)
663712 if ((checkCaller == checkCaller))
664713 then {
665714 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
666715 if ((checkManagerPublicKey == checkManagerPublicKey))
667716 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
668717 else throw("Strict value is not equal to itself.")
669718 }
670719 else throw("Strict value is not equal to itself.")
671720 }
672721
673722
674723
675724 @Callable(i)
676725 func confirmManager () = {
677726 let pm = pendingManagerPublicKeyOrUnit()
678727 let hasPM = if (isDefined(pm))
679728 then true
680729 else throw("No pending manager")
681730 if ((hasPM == hasPM))
682731 then {
683732 let checkPM = if ((i.callerPublicKey == value(pm)))
684733 then true
685734 else throw("You are not pending manager")
686735 if ((checkPM == checkPM))
687736 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
688737 else throw("Strict value is not equal to itself.")
689738 }
690739 else throw("Strict value is not equal to itself.")
691740 }
692741
693742
694743 @Verifier(tx)
695744 func verify () = {
696745 let targetPublicKey = match managerPublicKeyOrUnit() {
697746 case pk: ByteVector =>
698747 pk
699748 case _: Unit =>
700749 tx.senderPublicKey
701750 case _ =>
702751 throw("Match error")
703752 }
704753 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
705754 }
706755

github/deemru/w8io/c3f4982 
91.21 ms