tx · 27uMXZkX4LtCXmH2JfRfiYjYMDW3Ue1SAeuSqA12hKYU

3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE:  -0.02200000 Waves

2022.10.07 15:09 [2261894] smart account 3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE > SELF 0.00000000 Waves

{ "type": 13, "id": "27uMXZkX4LtCXmH2JfRfiYjYMDW3Ue1SAeuSqA12hKYU", "fee": 2200000, "feeAssetId": null, "timestamp": 1665144590561, "version": 1, "sender": "3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE", "senderPublicKey": "G349Uq3FTox7dRNLeAfAQeoACvwZ9iEnVSaHcEYn6j8J", "proofs": [ "E61EHaeWf9CsM196SvPRwkVvEXVDsiZXKg82MnDEsgqgr5RLke1qLfXu7RjAmoZMZTRNjTqdp93kTo3iZMeTug1" ], "script": "base64:BgJJCAISBAoCCAESABIDCgEBEgASABIAEgMKAQgSAwoBCBIDCgEIEgUKAwEBARIFCgMBAQESABIDCgEIEgcKBQgICAgIEgMKAQgSAE8AA1NFUAICX18ABVNDQUxFAOgHAAVNVUxUOACAwtcvAAp6ZXJvQmlnSW50CQC2AgEAAAAUcHJvY2Vzc2luZ1N0YWdlVG90YWwAAAAVcHJvY2Vzc2luZ1N0YWdlU2hhcmVzAAEBDmdldE51bWJlckJ5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUDa2V5AAABD2dldE51bWJlck9yRmFpbAEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUDa2V5CQCsAgIJAKwCAgIPbWFuZGF0b3J5IHRoaXMuBQNrZXkCDyBpcyBub3QgZGVmaW5lZAEOZ2V0U3RyaW5nQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQNrZXkCAAEPZ2V0U3RyaW5nT3JGYWlsAQNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQNrZXkJAKwCAgkArAICAg9tYW5kYXRvcnkgdGhpcy4FA2tleQIPIGlzIG5vdCBkZWZpbmVkAQNhYnMBA3ZhbAMJAGYCAAAFA3ZhbAkBAS0BBQN2YWwFA3ZhbAEJYWJzQmlnSW50AQN2YWwDCQC/AgIFCnplcm9CaWdJbnQFA3ZhbAkAvgIBBQN2YWwFA3ZhbAALa2V5TWF4RGVwdGgCDCVzX19tYXhEZXB0aAAPbWF4RGVwdGhEZWZhdWx0AB4ACG1heERlcHRoCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFC2tleU1heERlcHRoBQ9tYXhEZXB0aERlZmF1bHQBEWtleUZhY3RvcnlBZGRyZXNzAAIcJXMlc19fY29uZmlnX19mYWN0b3J5QWRkcmVzcwARZmFjdG9yeUFkZHJlc3NTdHIJAQ9nZXRTdHJpbmdPckZhaWwBCQERa2V5RmFjdG9yeUFkZHJlc3MAAA9mYWN0b3J5Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEWZhY3RvcnlBZGRyZXNzU3RyARJrZXlFbWlzc2lvbkFkZHJlc3MAAh0lcyVzX19jb25maWdfX2VtaXNzaW9uQWRkcmVzcwETa2V5TnVtVG9Vc2VyTWFwcGluZwEDbnVtCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICB21hcHBpbmcJAMwIAgIIbnVtMnVzZXIJAMwIAgkApAMBBQNudW0FA25pbAUDU0VQABZrZXlSZWZlcnJhbFByb2dyYW1OYW1lCQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAgtwcm9ncmFtTmFtZQUDbmlsBQNTRVAAGnJlZmVycmFsUHJvZ3JhbU5hbWVEZWZhdWx0AgZ3eGxvY2sAE3JlZmVycmFsUHJvZ3JhbU5hbWUJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUWa2V5UmVmZXJyYWxQcm9ncmFtTmFtZQUacmVmZXJyYWxQcm9ncmFtTmFtZURlZmF1bHQAF2tleVJlZmVycmFsTWluR1d4QW1vdW50CQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAgxtaW5HV3hBbW91bnQFA25pbAUDU0VQABtyZWZlcnJhbE1pbkdXeEFtb3VudERlZmF1bHQJAGgCAPQDBQVNVUxUOAAUcmVmZXJyYWxNaW5HV3hBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUXa2V5UmVmZXJyYWxNaW5HV3hBbW91bnQFG3JlZmVycmFsTWluR1d4QW1vdW50RGVmYXVsdAAZa2V5UmVmZXJyZXJSZXdhcmRQZXJtaWxsZQkAuQkCCQDMCAICBCVzJXMJAMwIAgIIcmVmZXJyYWwJAMwIAgIWcmVmZXJyZXJSZXdhcmRQZXJtaWxsZQUDbmlsBQNTRVAAHXJlZmVycmVyUmV3YXJkUGVybWlsbGVEZWZhdWx0ADIAFnJlZmVycmVyUmV3YXJkUGVybWlsbGUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUZa2V5UmVmZXJyZXJSZXdhcmRQZXJtaWxsZQUdcmVmZXJyZXJSZXdhcmRQZXJtaWxsZURlZmF1bHQAGWtleVJlZmVycmFsUmV3YXJkUGVybWlsbGUJALkJAgkAzAgCAgQlcyVzCQDMCAICCHJlZmVycmFsCQDMCAICFnJlZmVycmFsUmV3YXJkUGVybWlsbGUFA25pbAUDU0VQAB1yZWZlcnJhbFJld2FyZFBlcm1pbGxlRGVmYXVsdAAyABZyZWZlcnJhbFJld2FyZFBlcm1pbGxlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFGWtleVJlZmVycmFsUmV3YXJkUGVybWlsbGUFHXJlZmVycmFsUmV3YXJkUGVybWlsbGVEZWZhdWx0AQtrZXlSZWZlcnJlcgEPcmVmZXJyYWxBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCHJlZmVycmVyCQDMCAIFE3JlZmVycmFsUHJvZ3JhbU5hbWUJAMwIAgUPcmVmZXJyYWxBZGRyZXNzBQNuaWwFA1NFUAEUa2V5VW5jbGFpbWVkUmVmZXJyYWwCC3Byb2dyYW1OYW1lDmNsYWltZXJBZGRyZXNzCQC5CQIJAMwIAgIIJXMlcyVzJXMJAMwIAgIRdW5jbGFpbWVkUmVmZXJyYWwJAMwIAgULcHJvZ3JhbU5hbWUJAMwIAgUOY2xhaW1lckFkZHJlc3MFA25pbAUDU0VQABJlbWlzc2lvbkFkZHJlc3NTdHIJAQ9nZXRTdHJpbmdPckZhaWwBCQESa2V5RW1pc3Npb25BZGRyZXNzAAAQZW1pc3Npb25Db250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQUSZW1pc3Npb25BZGRyZXNzU3RyAA1JZHhDZmdBc3NldElkAAEAFklkeENmZ1BhY2VtYWtlckFkZHJlc3MAAgAWSWR4Q2ZnQm9vc3RpbmdDb250cmFjdAADAA5JZHhDZmdNYXhEZXB0aAAEAQlrZXlDb25maWcAAgolc19fY29uZmlnARVyZWFkQ29uZmlnQXJyYXlPckZhaWwACQC1CQIJAQ9nZXRTdHJpbmdPckZhaWwBCQEJa2V5Q29uZmlnAAUDU0VQAQxmb3JtYXRDb25maWcEDHd4QXNzZXRJZFN0chptYXRjaGVyUGFjZW1ha2VyQWRkcmVzc1N0chpib29zdGluZ0NvbnRyYWN0QWRkcmVzc1N0cghtYXhEZXB0aAkAuQkCCQDMCAICCCVzJXMlcyVkCQDMCAIFDHd4QXNzZXRJZFN0cgkAzAgCBRptYXRjaGVyUGFjZW1ha2VyQWRkcmVzc1N0cgkAzAgCBRpib29zdGluZ0NvbnRyYWN0QWRkcmVzc1N0cgkAzAgCCQCkAwEFCG1heERlcHRoBQNuaWwFA1NFUAEWYm9vc3RpbmdDb250cmFjdE9yRmFpbAAECGNmZ0FycmF5CQEVcmVhZENvbmZpZ0FycmF5T3JGYWlsAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUIY2ZnQXJyYXkFFklkeENmZ0Jvb3N0aW5nQ29udHJhY3QCKGJvb3N0aW5nIGNvbnRyYWN0IGFkZHJlc3MgaXMgbm90IGRlZmluZWQBH2tleUd3eFJld2FyZEVtaXNzaW9uU3RhcnRIZWlnaHQAAiglcyVzX19nd3hSZXdhcmRFbWlzc2lvblBhcnRfX3N0YXJ0SGVpZ2h0AQ1rZXlVc2Vyc0NvdW50AAIPJXNfX25leHRVc2VyTnVtARZrZXlSYXRlUGVyQmxvY2tDdXJyZW50AAIbJXMlc19fcmF0ZVBlckJsb2NrX19jdXJyZW50ARRrZXlQb29sV2VpZ2h0VmlydHVhbAACICVzJXNfX3Bvb2xXZWlnaHRfX0dXWHZpcnR1YWxQT09MARRrZXlOZXh0UHJvY2Vzc2VkVXNlcgACFSVzX19uZXh0UHJvY2Vzc2VkVXNlcgEPa2V5TGF0ZXN0UGVyaW9kAAIQJXNfX2xhdGVzdFBlcmlvZAENa2V5TmV4dFBlcmlvZAACDiVzX19uZXh0UGVyaW9kARJrZXlQcm9jZXNzaW5nU3RhZ2UAAhMlc19fcHJvY2Vzc2luZ1N0YWdlARZrZXlOZXh0UHJvY2Vzc2VkUGVyaW9kAAIXJXNfX25leHRQcm9jZXNzZWRQZXJpb2QBEGtleVVzZXJVbmNsYWltZWQBCXVzZXJJbmRleAkAuQkCCQDMCAICBCVzJWQJAMwIAgINdXNlclVuY2xhaW1lZAkAzAgCCQCkAwEFCXVzZXJJbmRleAUDbmlsBQNTRVABG2tleU5leHRVbmxhaW1lZFBlcmlvZE9mVXNlcgEJdXNlckluZGV4CQC5CQIJAMwIAgIXJXMlZF9fbmV4dENsYWltZWRQZXJpb2QJAMwIAgkApAMBBQl1c2VySW5kZXgFA25pbAUDU0VQARxrZXlMYXN0UHJvY2Vzc2VkUGVyaW9kT2ZVc2VyAQl1c2VySW5kZXgJALkJAgkAzAgCAhklcyVkX19sYXN0UHJvY2Vzc2VkUGVyaW9kCQDMCAIJAKQDAQUJdXNlckluZGV4BQNuaWwFA1NFUAESa2V5SGVpZ2h0Rm9yUGVyaW9kAQZwZXJpb2QJALkJAgkAzAgCAholcyVkX19zdGFydEhlaWdodEZvclBlcmlvZAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABHWtleUF1eEVtaXNzaW9uUmV3YXJkRm9yUGVyaW9kAQZwZXJpb2QJALkJAgkAzAgCAhclcyVkX19hdXhFbWlzc2lvblJld2FyZAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABF2tleVRvdGFsQW1vdW50Rm9yUGVyaW9kAQZwZXJpb2QJALkJAgkAzAgCAholcyVkX190b3RhbEFtb3VudEZvclBlcmlvZAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABEWtleUxhc3RQYXlvdXRJbmZvAAISJXNfX2xhc3RQYXlvdXRJbmZvARBQZXJpb2RQYXlvdXRJbmZvAwZwZXJpb2QNbWF0Y2hlclJld2FyZA5lbWlzc2lvblJld2FyZAkAuQkCCQDMCAICBiVkJWQlZAkAzAgCCQCkAwEFBnBlcmlvZAkAzAgCCQCkAwEFDW1hdGNoZXJSZXdhcmQJAMwIAgkApAMBBQ5lbWlzc2lvblJld2FyZAUDbmlsBQNTRVABFGtleVBheW91dEhpc3RvcnlJbmZvAQZwZXJpb2QJALkJAgkAzAgCAhglcyVzJWRfX3BheW91dHNfX2hpc3RvcnkJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARdrZXlUb3RhbFdlaWdodEZvclBlcmlvZAEGcGVyaW9kCQC5CQIJAMwIAgIaJXMlZF9fdG90YWxXZWlnaHRGb3JQZXJpb2QJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARZrZXlVc2VyS1ZhbHVlRm9yUGVyaW9kAgZwZXJpb2QJdXNlckluZGV4CQC5CQIJAMwIAgIXJXMlZCVzJWRfX3BhcmFtQnlQZXJpb2QJAMwIAgkApAMBBQl1c2VySW5kZXgJAMwIAgIBawkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABFmtleVVzZXJCVmFsdWVGb3JQZXJpb2QCBnBlcmlvZAl1c2VySW5kZXgJALkJAgkAzAgCAhclcyVkJXMlZF9fcGFyYW1CeVBlcmlvZAkAzAgCCQCkAwEFCXVzZXJJbmRleAkAzAgCAgFiCQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEWa2V5VXNlcldlaWdodEZvclBlcmlvZAIGcGVyaW9kCXVzZXJJbmRleAkAuQkCCQDMCAICFyVzJWQlcyVkX19wYXJhbUJ5UGVyaW9kCQDMCAIJAKQDAQUJdXNlckluZGV4CQDMCAICBndlaWdodAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABG2tleVJlZmVycmFsc0NvbnRyYWN0QWRkcmVzcwAJALkJAgkAzAgCAgQlcyVzCQDMCAICBmNvbmZpZwkAzAgCAhhyZWZlcnJhbHNDb250cmFjdEFkZHJlc3MFA25pbAUDU0VQAB5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQ9nZXRTdHJpbmdPckZhaWwBCQEba2V5UmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzAAEMSGlzdG9yeUVudHJ5BAR0eXBlBHVzZXIGYW1vdW50AWkECmhpc3RvcnlLRVkJALkJAgkAzAgCAhElcyVzJXMlc19faGlzdG9yeQkAzAgCBQR0eXBlCQDMCAIFBHVzZXIJAMwIAgkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBQNuaWwFA1NFUAQLaGlzdG9yeURBVEEJALkJAgkAzAgCAgwlZCVkJWQlZCVkJWQJAMwIAgkApAMBCAUJbGFzdEJsb2NrBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAKQDAQUGYW1vdW50BQNuaWwFA1NFUAkBC1N0cmluZ0VudHJ5AgUKaGlzdG9yeUtFWQULaGlzdG9yeURBVEEBE2tleU1hbmFnZXJQdWJsaWNLZXkAAhQlc19fbWFuYWdlclB1YmxpY0tleQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkAAhslc19fcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQABAckbWF0Y2gwCQCiCAEJARNrZXlNYW5hZ2VyUHVibGljS2V5AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJANkEAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0AAQHJG1hdGNoMAkAoggBCQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkA2QQBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgELbXVzdE1hbmFnZXIBAWkEAnBkCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFAnBrBgUCcGQDCQABAgUHJG1hdGNoMAIEVW5pdAMJAAACCAUBaQZjYWxsZXIFBHRoaXMGBQJwZAkAAgECC01hdGNoIGVycm9yAQ5jYWxjVXNlcldlaWdodAQXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MPaGVpZ2h0Rm9yUGVyaW9kBnBlcmlvZAl1c2VySW5kZXgEBWtMYXN0CQEca2V5TGFzdFByb2Nlc3NlZFBlcmlvZE9mVXNlcgEFCXVzZXJJbmRleAQEa0tleQkBFmtleVVzZXJLVmFsdWVGb3JQZXJpb2QCBQZwZXJpb2QFCXVzZXJJbmRleAQEa1JhdwkAmggCBRdib29zdGluZ0NvbnRyYWN0QWRkcmVzcwUEa0tleQQLa1VzZXJXZWlnaHQJARZrZXlVc2VyV2VpZ2h0Rm9yUGVyaW9kAgUGcGVyaW9kBQl1c2VySW5kZXgDCQEJaXNEZWZpbmVkAQUEa1JhdwQBawkBBXZhbHVlAQUEa1JhdwQBYgkBBXZhbHVlAQkAmggCBRdib29zdGluZ0NvbnRyYWN0QWRkcmVzcwkBFmtleVVzZXJCVmFsdWVGb3JQZXJpb2QCBQZwZXJpb2QFCXVzZXJJbmRleAQBdwkAZAIJAGgCBQFrBQ9oZWlnaHRGb3JQZXJpb2QFAWIDCQBmAgUBdwAACQCUCgIJAGkCBQF3BQVTQ0FMRQkAzAgCCQEMSW50ZWdlckVudHJ5AgUFa0xhc3QFBnBlcmlvZAkAzAgCCQEMSW50ZWdlckVudHJ5AgULa1VzZXJXZWlnaHQFAXcFA25pbAkAlAoCAAAFA25pbAQBcAkAmggCBQR0aGlzBQVrTGFzdAMDCQEJaXNEZWZpbmVkAQUBcAkAZwIFBnBlcmlvZAkBBXZhbHVlAQUBcAcEAnB2CQEFdmFsdWUBBQFwBAFrCQEFdmFsdWUBCQCaCAIFF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzCQEWa2V5VXNlcktWYWx1ZUZvclBlcmlvZAIFAnB2BQl1c2VySW5kZXgEAWIJAQV2YWx1ZQEJAJoIAgUXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MJARZrZXlVc2VyQlZhbHVlRm9yUGVyaW9kAgUCcHYFCXVzZXJJbmRleAQBdwkAZAIJAGgCBQFrBQ9oZWlnaHRGb3JQZXJpb2QFAWIDCQBmAgUBdwAACQCUCgIJAGkCBQF3BQVTQ0FMRQkAzAgCCQEMSW50ZWdlckVudHJ5AgULa1VzZXJXZWlnaHQFAXcFA25pbAkAlAoCAAAFA25pbAkAlAoCAAAFA25pbAEWY2FsY1VzZXJXZWlnaHRGb3JDbGFpbQQXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MPaGVpZ2h0Rm9yUGVyaW9kBnBlcmlvZAl1c2VySW5kZXgEC2tVc2VyV2VpZ2h0CQEWa2V5VXNlcldlaWdodEZvclBlcmlvZAIFBnBlcmlvZAUJdXNlckluZGV4BBB1c2VyV2VpZ2h0T3JVbml0CQCfCAEFC2tVc2VyV2VpZ2h0BAckbWF0Y2gwBRB1c2VyV2VpZ2h0T3JVbml0AwkAAQIFByRtYXRjaDACBFVuaXQAAAMJAAECBQckbWF0Y2gwAgNJbnQEAXcFByRtYXRjaDAJAGkCBQF3BQVTQ0FMRQkAAgECC01hdGNoIGVycm9yARVnZXRVc2VySW5kZXhCeUFkZHJlc3MCGmJvb3N0aW5nQ29udHJhY3RBZGRyZXNzU3RyC3VzZXJBZGRyZXNzBANrZXkJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIHbWFwcGluZwkAzAgCAgh1c2VyMm51bQkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVAJAQ1wYXJzZUludFZhbHVlAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIJAQdBZGRyZXNzAQkA2QQBBRpib29zdGluZ0NvbnRyYWN0QWRkcmVzc1N0cgUDa2V5CQCsAgIJAKwCAgkArAICAg1Vc2VyIGFkZHJlc3MgBQt1c2VyQWRkcmVzcwItIGlzIG5vdCBmb3VuZCBpbiBib29zdGluZyBjb250cmFjdCBkYXRhLCBrZXk9BQNrZXkBCm5leHRQZXJpb2QACQEOZ2V0TnVtYmVyQnlLZXkBCQENa2V5TmV4dFBlcmlvZAABEWNvbW1vbkNsYWltUmV3YXJkAQt1c2VyQWRkcmVzcwQIY2ZnQXJyYXkJARVyZWFkQ29uZmlnQXJyYXlPckZhaWwABAd1c2VySWR4CQEVZ2V0VXNlckluZGV4QnlBZGRyZXNzAgkAkQMCBQhjZmdBcnJheQUWSWR4Q2ZnQm9vc3RpbmdDb250cmFjdAULdXNlckFkZHJlc3MEE3VzZXJVbmNsYWltZWRPcHRpb24JAJ8IAQkBEGtleVVzZXJVbmNsYWltZWQBBQd1c2VySWR4BAckbWF0Y2gwBRN1c2VyVW5jbGFpbWVkT3B0aW9uAwkAAQIFByRtYXRjaDACBFVuaXQJAJQKAgAABQNuaWwDCQABAgUHJG1hdGNoMAIDSW50BAF1BQckbWF0Y2gwCQCUCgIFAXUJAMwIAgkBDEludGVnZXJFbnRyeQIJARBrZXlVc2VyVW5jbGFpbWVkAQUHdXNlcklkeAAABQNuaWwJAAIBAgtNYXRjaCBlcnJvchABaQEWdXBkYXRlUmVmZXJyYWxBY3Rpdml0eQILdXNlckFkZHJlc3MOZ1d4QW1vdW50U3RhcnQECHJlZmVycmVyCQCdCAIFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAkBC2tleVJlZmVycmVyAQULdXNlckFkZHJlc3MEEWFjdGl2ZVJlZmVycmFsSW52AwkAAAIFCHJlZmVycmVyBQR1bml0BQR1bml0CQD8BwQFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAIWdXBkYXRlUmVmZXJyYWxBY3Rpdml0eQkAzAgCBRNyZWZlcnJhbFByb2dyYW1OYW1lCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIJAGcCBQ5nV3hBbW91bnRTdGFydAUUcmVmZXJyYWxNaW5HV3hBbW91bnQFA25pbAUDbmlsAwkAAAIFEWFjdGl2ZVJlZmVycmFsSW52BRFhY3RpdmVSZWZlcnJhbEludgkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOZmluYWxpemVIZWxwZXIABA9wcm9jZXNzaW5nU3RhZ2UJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEmtleVByb2Nlc3NpbmdTdGFnZQAFFHByb2Nlc3NpbmdTdGFnZVRvdGFsBA1jdXJyZW50UGVyaW9kCQEOZ2V0TnVtYmVyQnlLZXkBCQEWa2V5TmV4dFByb2Nlc3NlZFBlcmlvZAAEC2N1cnJlbnRVc2VyCQEOZ2V0TnVtYmVyQnlLZXkBCQEUa2V5TmV4dFByb2Nlc3NlZFVzZXIABAxsYXRlc3RQZXJpb2QJAQ5nZXROdW1iZXJCeUtleQEJAQ9rZXlMYXRlc3RQZXJpb2QABAp1c2Vyc0NvdW50CQELdmFsdWVPckVsc2UCCQCaCAIJARZib29zdGluZ0NvbnRyYWN0T3JGYWlsAAkBDWtleVVzZXJzQ291bnQAAAAEDnRvdGFsV2VpZ2h0S2V5CQEXa2V5VG90YWxXZWlnaHRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBAt0b3RhbFdlaWdodAkBDmdldE51bWJlckJ5S2V5AQkBF2tleVRvdGFsV2VpZ2h0Rm9yUGVyaW9kAQUNY3VycmVudFBlcmlvZAQPaGVpZ2h0Rm9yUGVyaW9kCQEOZ2V0TnVtYmVyQnlLZXkBCQESa2V5SGVpZ2h0Rm9yUGVyaW9kAQUNY3VycmVudFBlcmlvZAMJAGYCBQ1jdXJyZW50UGVyaW9kBQxsYXRlc3RQZXJpb2QJAJQKAgUDbmlsBwMJAAACBQ9wcm9jZXNzaW5nU3RhZ2UFFHByb2Nlc3NpbmdTdGFnZVRvdGFsBA0kdDAxMjA4NDEyMjAwCQEOY2FsY1VzZXJXZWlnaHQECQEWYm9vc3RpbmdDb250cmFjdE9yRmFpbAAFD2hlaWdodEZvclBlcmlvZAUNY3VycmVudFBlcmlvZAULY3VycmVudFVzZXIECnVzZXJXZWlnaHQIBQ0kdDAxMjA4NDEyMjAwAl8xBAt1c2VyQWN0aW9ucwgFDSR0MDEyMDg0MTIyMDACXzIEDnRvdGFsV2VpZ2h0TmV3CQBkAgULdG90YWxXZWlnaHQFCnVzZXJXZWlnaHQEEXByb2Nlc3NpbmdBY3Rpb25zAwkAZgIJAGUCBQp1c2Vyc0NvdW50AAEFC2N1cnJlbnRVc2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TmV4dFByb2Nlc3NlZFVzZXIACQBkAgULY3VycmVudFVzZXIAAQUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESa2V5UHJvY2Vzc2luZ1N0YWdlAAUVcHJvY2Vzc2luZ1N0YWdlU2hhcmVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TmV4dFByb2Nlc3NlZFVzZXIAAAAFA25pbAkAlAoCCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUOdG90YWxXZWlnaHRLZXkFDnRvdGFsV2VpZ2h0TmV3BQNuaWwFEXByb2Nlc3NpbmdBY3Rpb25zBQt1c2VyQWN0aW9ucwYDCQAAAgUPcHJvY2Vzc2luZ1N0YWdlBRVwcm9jZXNzaW5nU3RhZ2VTaGFyZXMECnVzZXJXZWlnaHQJARZjYWxjVXNlcldlaWdodEZvckNsYWltBAkBFmJvb3N0aW5nQ29udHJhY3RPckZhaWwABQ9oZWlnaHRGb3JQZXJpb2QFDWN1cnJlbnRQZXJpb2QFC2N1cnJlbnRVc2VyBBp1c2VyQW1vdW50TWF0Y2hlckZvclBlcmlvZAkAawMJAQ5nZXROdW1iZXJCeUtleQEJARdrZXlUb3RhbEFtb3VudEZvclBlcmlvZAEFDWN1cnJlbnRQZXJpb2QFCnVzZXJXZWlnaHQFC3RvdGFsV2VpZ2h0BBt1c2VyQW1vdW50RW1pc3Npb25Gb3JQZXJpb2QJAGsDCQEOZ2V0TnVtYmVyQnlLZXkBCQEda2V5QXV4RW1pc3Npb25SZXdhcmRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBQp1c2VyV2VpZ2h0BQt0b3RhbFdlaWdodAQPdXNlclRvdGFsQW1vdW50CQBkAgUbdXNlckFtb3VudEVtaXNzaW9uRm9yUGVyaW9kBRp1c2VyQW1vdW50TWF0Y2hlckZvclBlcmlvZAQTdXNlclVuY2xhaW1lZE9wdGlvbgkAnwgBCQEQa2V5VXNlclVuY2xhaW1lZAEFC2N1cnJlbnRVc2VyBAt1c2VyQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNTMpAgkBFmJvb3N0aW5nQ29udHJhY3RPckZhaWwACQETa2V5TnVtVG9Vc2VyTWFwcGluZwEFC2N1cnJlbnRVc2VyBAhyZWZlcnJlcgkAnQgCBR5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwJAQtrZXlSZWZlcnJlcgEFC3VzZXJBZGRyZXNzBBFhY3RpdmVSZWZlcnJhbEludgMJAAACBQhyZWZlcnJlcgUEdW5pdAUEdW5pdAkA/AcEBR5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwCFnVwZGF0ZVJlZmVycmFsQWN0aXZpdHkJAMwIAgUTcmVmZXJyYWxQcm9ncmFtTmFtZQkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCCQBnAgUKdXNlcldlaWdodAUUcmVmZXJyYWxNaW5HV3hBbW91bnQFA25pbAUDbmlsAwkAAAIFEWFjdGl2ZVJlZmVycmFsSW52BRFhY3RpdmVSZWZlcnJhbEludgQLcmVmZXJyYWxJbnYDAwkAAAIFCHJlZmVycmVyBQR1bml0BgkAZgIFFHJlZmVycmFsTWluR1d4QW1vdW50BQp1c2VyV2VpZ2h0BQR1bml0BA5yZWZlcnJlclJld2FyZAkAawMFD3VzZXJUb3RhbEFtb3VudAUWcmVmZXJyZXJSZXdhcmRQZXJtaWxsZQUFU0NBTEUEDnJlZmVycmFsUmV3YXJkCQBrAwUPdXNlclRvdGFsQW1vdW50BRZyZWZlcnJhbFJld2FyZFBlcm1pbGxlBQVTQ0FMRQkA/AcEBR5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwCDGluY1VuY2xhaW1lZAkAzAgCBRNyZWZlcnJhbFByb2dyYW1OYW1lCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIFDnJlZmVycmVyUmV3YXJkCQDMCAIFDnJlZmVycmFsUmV3YXJkBQNuaWwFA25pbAMJAAACBQtyZWZlcnJhbEludgULcmVmZXJyYWxJbnYEEHVuY2xhaW1lZEFjdGlvbnMJAMwIAgkBDEludGVnZXJFbnRyeQIJARBrZXlVc2VyVW5jbGFpbWVkAQULY3VycmVudFVzZXIJAGQCCQELdmFsdWVPckVsc2UCBRN1c2VyVW5jbGFpbWVkT3B0aW9uAAAFD3VzZXJUb3RhbEFtb3VudAUDbmlsBBFwcm9jZXNzaW5nQWN0aW9ucwMJAGYCCQBlAgUKdXNlcnNDb3VudAABBQtjdXJyZW50VXNlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleU5leHRQcm9jZXNzZWRVc2VyAAkAZAIFC2N1cnJlbnRVc2VyAAEFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleU5leHRQcm9jZXNzZWRQZXJpb2QACQBkAgUNY3VycmVudFBlcmlvZAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TmV4dFByb2Nlc3NlZFVzZXIAAAAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEmtleVByb2Nlc3NpbmdTdGFnZQAFA25pbAkAlAoCCQDOCAIFEHVuY2xhaW1lZEFjdGlvbnMFEXByb2Nlc3NpbmdBY3Rpb25zBgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECGGludmFsaWQgcHJvY2Vzc2luZyBzdGFnZQFpAQ9maW5hbGl6ZVdyYXBwZXIBB2NvdW50ZXIEBnJlc3VsdAoAAUAJAPwHBAUEdGhpcwIOZmluYWxpemVIZWxwZXIFA25pbAUDbmlsAwkAAQIFAUACB0Jvb2xlYW4FAUAJAAIBCQCsAgIJAAMBBQFAAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuAwkAAAIFBnJlc3VsdAUGcmVzdWx0AwkBASEBBQZyZXN1bHQDCQAAAgUHY291bnRlcgUIbWF4RGVwdGgJAAIBAhJOb3RoaW5nIHRvIHByb2Nlc3MJAJQKAgUDbmlsBQR1bml0AwkAZgIFB2NvdW50ZXIAAAkAlAoCBQNuaWwJAPwHBAUEdGhpcwIPZmluYWxpemVXcmFwcGVyCQDMCAIJAGUCBQdjb3VudGVyAAEFA25pbAUDbmlsCQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAR1wcm9jZXNzUGVuZGluZ1BlcmlvZHNBbmRVc2VycwAJAJQKAgUDbmlsCQD8BwQFBHRoaXMCD2ZpbmFsaXplV3JhcHBlcgkAzAgCBQhtYXhEZXB0aAUDbmlsBQNuaWwBaQEHZGVwb3NpdAAECGNmZ0FycmF5CQEVcmVhZENvbmZpZ0FycmF5T3JGYWlsAAMJAQIhPQIIBQFpBmNhbGxlcgkBB0FkZHJlc3MBCQDZBAEJAJEDAgUIY2ZnQXJyYXkFFklkeENmZ1BhY2VtYWtlckFkZHJlc3MJAAIBAhRXcm9uZyBjYWxsZXIgYWRkcmVzcwQHYXNzZXRJZAkBBXZhbHVlAQgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAwkBAiE9AgUHYXNzZXRJZAkA2QQBCQCRAwIFCGNmZ0FycmF5BQ1JZHhDZmdBc3NldElkCQACAQITV3JvbmcgcGF5bWVudCBhc3NldAQGcGVyaW9kCQEKbmV4dFBlcmlvZAAEBmRlbHRhSAkAZQIFBmhlaWdodAkBD2dldE51bWJlck9yRmFpbAEJAR9rZXlHd3hSZXdhcmRFbWlzc2lvblN0YXJ0SGVpZ2h0AAQMZW1pc3Npb25SYXRlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUQZW1pc3Npb25Db250cmFjdAkBFmtleVJhdGVQZXJCbG9ja0N1cnJlbnQACQCsAgIJAKwCAgIcbWFuZGF0b3J5IGVtaXNzaW9uX2NvbnRyYWN0LgkBFmtleVJhdGVQZXJCbG9ja0N1cnJlbnQAAg8gaXMgbm90IGRlZmluZWQEBndlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFD2ZhY3RvcnlDb250cmFjdAkBFGtleVBvb2xXZWlnaHRWaXJ0dWFsAAkArAICCQCsAgICG21hbmRhdG9yeSBmYWN0b3J5X2NvbnRyYWN0LgkBFGtleVBvb2xXZWlnaHRWaXJ0dWFsAAIPIGlzIG5vdCBkZWZpbmVkBAlhdXhBbW91bnQJAGsDCQBoAgUGZGVsdGFIBQZ3ZWlnaHQFDGVtaXNzaW9uUmF0ZQUFTVVMVDgEAmVtCQD8BwQFEGVtaXNzaW9uQ29udHJhY3QCBGVtaXQJAMwIAgUJYXV4QW1vdW50BQNuaWwFA25pbAMJAAACBQJlbQUCZW0EC21hdGNoZXJQYXJ0CAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQKcGF5b3V0SW5mbwkBEFBlcmlvZFBheW91dEluZm8DBQZwZXJpb2QFC21hdGNoZXJQYXJ0BQlhdXhBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlMYXRlc3RQZXJpb2QABQZwZXJpb2QJAMwIAgkBDEludGVnZXJFbnRyeQIJARJrZXlIZWlnaHRGb3JQZXJpb2QBBQZwZXJpb2QFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBHWtleUF1eEVtaXNzaW9uUmV3YXJkRm9yUGVyaW9kAQUGcGVyaW9kBQlhdXhBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAR9rZXlHd3hSZXdhcmRFbWlzc2lvblN0YXJ0SGVpZ2h0AAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEXa2V5VG90YWxBbW91bnRGb3JQZXJpb2QBBQZwZXJpb2QFC21hdGNoZXJQYXJ0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQENa2V5TmV4dFBlcmlvZAAJAGQCBQZwZXJpb2QAAQkAzAgCCQELU3RyaW5nRW50cnkCCQERa2V5TGFzdFBheW91dEluZm8ABQpwYXlvdXRJbmZvCQDMCAIJAQtTdHJpbmdFbnRyeQIJARRrZXlQYXlvdXRIaXN0b3J5SW5mbwEFBnBlcmlvZAUKcGF5b3V0SW5mbwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2NsYWltUmV3YXJkAAQIY2ZnQXJyYXkJARVyZWFkQ29uZmlnQXJyYXlPckZhaWwABAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgQNJHQwMTc1NDIxNzU5MgkBEWNvbW1vbkNsYWltUmV3YXJkAQUHYWRkcmVzcwQGYW1vdW50CAUNJHQwMTc1NDIxNzU5MgJfMQQHYWN0aW9ucwgFDSR0MDE3NTQyMTc1OTICXzIEC2NoZWNrQW1vdW50AwkAZgIFBmFtb3VudAAABgkAAgECEE5vdGhpbmcgdG8gY2xhaW0DCQAAAgULY2hlY2tBbW91bnQFC2NoZWNrQW1vdW50BBJhbW91bnRGcm9tRW1pc3Npb24AAAQPY2xhaW1lZFJlZmVycmFsCgABQAkA/AcEBR5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwCBWNsYWltCQDMCAIFE3JlZmVycmFsUHJvZ3JhbU5hbWUFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQLdG90YWxBbW91bnQJAGQCBQZhbW91bnQFD2NsYWltZWRSZWZlcnJhbAkAlAoCCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQt0b3RhbEFtb3VudAkA2QQBCQCRAwIFCGNmZ0FycmF5BQ1JZHhDZmdBc3NldElkCQDMCAIJAQxIaXN0b3J5RW50cnkEAgVjbGFpbQUHYWRkcmVzcwUGYW1vdW50BQFpBQNuaWwFB2FjdGlvbnMJAMwIAgULdG90YWxBbW91bnQJAMwIAgUSYW1vdW50RnJvbUVtaXNzaW9uBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQETY2xhaW1SZXdhcmRSRUFET05MWQEHYWRkcmVzcwQNJHQwMTgxNjUxODIxNQkBEWNvbW1vbkNsYWltUmV3YXJkAQUHYWRkcmVzcwQGYW1vdW50CAUNJHQwMTgxNjUxODIxNQJfMQQHYWN0aW9ucwgFDSR0MDE4MTY1MTgyMTUCXzIEEXJlZmVycmFsVW5jbGFpbWVkCQELdmFsdWVPckVsc2UCCQCaCAIFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAkBFGtleVVuY2xhaW1lZFJlZmVycmFsAgUTcmVmZXJyYWxQcm9ncmFtTmFtZQUHYWRkcmVzcwAABAt0b3RhbEFtb3VudAkAZAIFBmFtb3VudAURcmVmZXJyYWxVbmNsYWltZWQJAJQKAgUDbmlsBQt0b3RhbEFtb3VudAFpAR1sYXRlc3RGaW5hbGl6ZWRQZXJpb2RSRUFET05MWQEHYWRkcmVzcwkAlAoCBQNuaWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBD2tleUxhdGVzdFBlcmlvZAAA////////////AQFpASFsYXRlc3RGaW5hbGl6ZWRQZXJpb2RJbmZvUkVBRE9OTFkBB2FkZHJlc3MJAJQKAgUDbmlsCQEOZ2V0U3RyaW5nQnlLZXkBCQERa2V5TGFzdFBheW91dEluZm8AAWkBFWNhbGNHd3hQYXJhbXNSRUFET05MWQMOZ3d4QW1vdW50U3RhcnQPbG9ja1N0YXJ0SGVpZ2h0EmxvY2tEdXJhdGlvbkJsb2NrcwQNbG9ja0VuZEhlaWdodAkAZAIFD2xvY2tTdGFydEhlaWdodAUSbG9ja0R1cmF0aW9uQmxvY2tzBAxzY2FsZThQYXJhbUsJAQEtAQkAawMFDmd3eEFtb3VudFN0YXJ0BQVTQ0FMRQUSbG9ja0R1cmF0aW9uQmxvY2tzBAxzY2FsZThQYXJhbUIJAGgCCQBrAwUOZ3d4QW1vdW50U3RhcnQFBVNDQUxFBRJsb2NrRHVyYXRpb25CbG9ja3MFDWxvY2tFbmRIZWlnaHQJAJQKAgUDbmlsCQDMCAIFDHNjYWxlOFBhcmFtSwkAzAgCBQxzY2FsZThQYXJhbUIJAMwIAgkBCm5leHRQZXJpb2QABQNuaWwBaQEaY2FsY0d3eEFtb3VudFN0YXJ0UkVBRE9OTFkDDHd4TG9ja0Ftb3VudAxsb2NrRHVyYXRpb24PbWF4TG9ja0R1cmF0aW9uBAdjb2VmZlg4CQBrAwUMbG9ja0R1cmF0aW9uBQVNVUxUOAUPbWF4TG9ja0R1cmF0aW9uBA5nV3hBbW91bnRTdGFydAkAawMFDHd4TG9ja0Ftb3VudAUHY29lZmZYOAUFTVVMVDgJAJQKAgUDbmlsCQDMCAIFDmdXeEFtb3VudFN0YXJ0BQNuaWwBaQEVb25FbWlzc2lvbkZvckd3eFN0YXJ0AAMJAQIhPQIIBQFpBmNhbGxlcgUPZmFjdG9yeUNvbnRyYWN0CQACAQIScGVybWlzc2lvbnMgZGVuaWVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEfa2V5R3d4UmV3YXJkRW1pc3Npb25TdGFydEhlaWdodAAFBmhlaWdodAUDbmlsAWkBI2xhdGVzdFBlcmlvZEVtaXNzaW9uUmV3YXJkc1JFQURPTkxZAQdhZGRyZXNzBAZwZXJpb2QJAQpuZXh0UGVyaW9kAAkAlAoCBQNuaWwJAMwIAgkBDmdldE51bWJlckJ5S2V5AQkBHWtleUF1eEVtaXNzaW9uUmV3YXJkRm9yUGVyaW9kAQUGcGVyaW9kBQNuaWwBaQEFY2FsY0QFC3gxQmlnSW50U3RyC3gyQmlnSW50U3RyDGFtcEJpZ0ludFN0chNhUHJlY2lzaW9uQmlnSW50U3RyGHRhcmdldFByZWNpc2lvbkJpZ0ludFN0cgQGbkNvaW5zCQC2AgEAAgQKYVByZWNpc2lvbgkApwMBBRNhUHJlY2lzaW9uQmlnSW50U3RyBA90YXJnZXRQcmVjaXNpb24JAKcDAQUYdGFyZ2V0UHJlY2lzaW9uQmlnSW50U3RyBAJ4MQkApwMBBQt4MUJpZ0ludFN0cgQCeDIJAKcDAQULeDJCaWdJbnRTdHIEA2FtcAkAuQICCQCnAwEFDGFtcEJpZ0ludFN0cgUKYVByZWNpc2lvbgQBcwkAtwICBQJ4MQUCeDIDCQAAAgUBcwUKemVyb0JpZ0ludAkAlAoCBQNuaWwJAKYDAQUKemVyb0JpZ0ludAQDYW5uCQC5AgIFA2FtcAUGbkNvaW5zBANhcnIJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGBQNuaWwKAQRjYWxjAgNhY2MDY3VyBA0kdDAyMDg0ODIwODc1BQNhY2MEAWQIBQ0kdDAyMDg0ODIwODc1Al8xBAVkUHJldggFDSR0MDIwODQ4MjA4NzUCXzIEBWZvdW5kCAUNJHQwMjA4NDgyMDg3NQJfMwMJAQIhPQIFBWZvdW5kBQR1bml0BQNhY2MEAmRwCQC6AgIJALkCAgkAuQICBQFkBQFkBQFkCQC5AgIJALkCAgkAuQICBQJ4MQUCeDIFBm5Db2lucwUGbkNvaW5zBAVkTmV4dAkAugICCQC5AgIJALcCAgkAugICCQC5AgIFA2FubgUBcwUKYVByZWNpc2lvbgkAuQICBQJkcAUGbkNvaW5zBQFkCQC3AgIJALoCAgkAuQICCQC4AgIFA2FubgUKYVByZWNpc2lvbgUBZAUKYVByZWNpc2lvbgkAuQICCQC3AgIFBm5Db2lucwkAtgIBAAEFAmRwBAVkRGlmZgkBCWFic0JpZ0ludAEJALgCAgUFZE5leHQJAQV2YWx1ZQEFAWQDCQDAAgIFD3RhcmdldFByZWNpc2lvbgUFZERpZmYJAJUKAwUFZE5leHQFAWQFA2N1cgkAlQoDBQVkTmV4dAUBZAUEdW5pdAQNJHQwMjE0NzMyMTUzNgoAAiRsBQNhcnIKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFAXMFBHVuaXQFBHVuaXQKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGNhbGMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDcJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwQFZE5leHQIBQ0kdDAyMTQ3MzIxNTM2Al8xBAVkUHJldggFDSR0MDIxNDczMjE1MzYCXzIEBWZvdW5kCAUNJHQwMjE0NzMyMTUzNgJfMwMJAQIhPQIFBWZvdW5kBQR1bml0CQCUCgIFA25pbAkApgMBBQVkTmV4dAQFZERpZmYJAQlhYnNCaWdJbnQBCQC4AgIFBWROZXh0CQEFdmFsdWUBBQVkUHJldgkAAgEJAKwCAgIdRCBjYWxjdWxhdGlvbiBlcnJvciwgZERpZmYgPSAJAKYDAQUFZERpZmYBaQEKc2V0TWFuYWdlcgEXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkEC2NoZWNrQ2FsbGVyCQELbXVzdE1hbmFnZXIBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQVY2hlY2tNYW5hZ2VyUHVibGljS2V5CQDZBAEFF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AwkAAAIFFWNoZWNrTWFuYWdlclB1YmxpY0tleQUVY2hlY2tNYW5hZ2VyUHVibGljS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIJARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAFF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOY29uZmlybU1hbmFnZXIABAJwbQkBHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0AAQFaGFzUE0DCQEJaXNEZWZpbmVkAQUCcG0GCQACAQISTm8gcGVuZGluZyBtYW5hZ2VyAwkAAAIFBWhhc1BNBQVoYXNQTQQHY2hlY2tQTQMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAnBtBgkAAgECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQdjaGVja1BNBQdjaGVja1BNCQDMCAIJAQtTdHJpbmdFbnRyeQIJARNrZXlNYW5hZ2VyUHVibGljS2V5AAkA2AQBCQEFdmFsdWUBBQJwbQkAzAgCCQELRGVsZXRlRW50cnkBCQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABA90YXJnZXRQdWJsaWNLZXkEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAUCcGsDCQABAgUHJG1hdGNoMAIEVW5pdAgFAnR4D3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQ90YXJnZXRQdWJsaWNLZXlHQ9kn", "chainId": 84, "height": 2261894, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: H8GGdRXh1ZirYYDJTjVmhm2rEbRoG5kPuLXVo2P3C5SW Next: kQcGL3CeytmviVJDQ9f48c3bD3RPr6ZWVtuyYKk4cQ6 Diff:
OldNewDifferences
577577
578578
579579 @Callable(i)
580-func calcPutXOnly (amountAssetAmountBigIntStr,amountAssetBalanceBigIntStr,priceAssetBalanceBigIntStr,dBigIntStr,amplificatorBigIntStr,amplificatorPrecisionBigIntStr,targetXPrecisionBigIntStr,targetDPrecisionBigIntStr) = {
581- let nCoins = toBigInt(2)
582- let aPrecision = parseBigIntValue(amplificatorPrecisionBigIntStr)
583- let targetPrecision = parseBigIntValue(targetXPrecisionBigIntStr)
584- let X = parseBigIntValue(amountAssetBalanceBigIntStr)
585- let Y = parseBigIntValue(priceAssetBalanceBigIntStr)
586- let d = if ((dBigIntStr == ""))
587- then parseBigIntValue({
588- let @ = invoke(this, "calcD", [amountAssetBalanceBigIntStr, priceAssetBalanceBigIntStr, amplificatorBigIntStr, amplificatorPrecisionBigIntStr, targetDPrecisionBigIntStr], nil)
589- if ($isInstanceOf(@, "String"))
590- then @
591- else throw(($getType(@) + " couldn't be cast to String"))
592- })
593- else parseBigIntValue(dBigIntStr)
594- let amp = (parseBigIntValue(amplificatorBigIntStr) * aPrecision)
595- let S = parseBigIntValue(amountAssetAmountBigIntStr)
596- let ann = (amp * nCoins)
597- let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
598- func calc (acc,cur) = {
599- let $t02317723204 = acc
600- let x = $t02317723204._1
601- let xPrev = $t02317723204._2
602- let found = $t02317723204._3
603- if ((found != unit))
604- then acc
605- else {
606- let newX = ((X + S) - x)
607- let newY = (Y - ((x * Y) / X))
608- let dp = (((d * d) * d) / (((newX * newY) * nCoins) * nCoins))
609- let xNext = (x + ((((((-(d) * ann) / aPrecision) + d) + ((ann * (newX + newY)) / aPrecision)) - dp) / ((((-(ann) * (toBigInt(-1) - (Y / X))) / aPrecision) + (dp / newX)) + ((Y * dp) / (X * newY)))))
610- let xDiff = absBigInt((xNext - value(x)))
611- if ((targetPrecision >= xDiff))
612- then $Tuple3(xNext, x, cur)
613- else $Tuple3(xNext, x, unit)
614- }
615- }
616-
617- let $t02370723780 = {
618- let $l = arr
619- let $s = size($l)
620- let $acc0 = $Tuple3(zeroBigInt, unit, unit)
621- func $f0_1 ($a,$i) = if (($i >= $s))
622- then $a
623- else calc($a, $l[$i])
624-
625- func $f0_2 ($a,$i) = if (($i >= $s))
626- then $a
627- else throw("List size exceeds 20")
628-
629- $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)
630- }
631- let xNext = $t02370723780._1
632- let xPrev = $t02370723780._2
633- let found = $t02370723780._3
634- if ((found != unit))
635- then $Tuple2(nil, $Tuple2(toInt(xNext), toInt(fraction(xNext, Y, X))))
636- else {
637- let xDiff = absBigInt((xNext - value(xPrev)))
638- throw(("X calculation error, xDiff = " + toString(xDiff)))
639- }
640- }
641-
642-
643-
644-@Callable(i)
645580 func setManager (pendingManagerPublicKey) = {
646581 let checkCaller = mustManager(i)
647582 if ((checkCaller == checkCaller))
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(@) + " 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(@) + " 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 = [0, 1, 2, 3, 4, 5, 6]
534534 func calc (acc,cur) = {
535535 let $t02084820875 = acc
536536 let d = $t02084820875._1
537537 let dPrev = $t02084820875._2
538538 let found = $t02084820875._3
539539 if ((found != unit))
540540 then acc
541541 else {
542542 let dp = (((d * d) * d) / (((x1 * x2) * nCoins) * nCoins))
543543 let dNext = (((((ann * s) / aPrecision) + (dp * nCoins)) * d) / ((((ann - aPrecision) * d) / aPrecision) + ((nCoins + toBigInt(1)) * dp)))
544544 let dDiff = absBigInt((dNext - value(d)))
545545 if ((targetPrecision >= dDiff))
546546 then $Tuple3(dNext, d, cur)
547547 else $Tuple3(dNext, d, unit)
548548 }
549549 }
550550
551551 let $t02147321536 = {
552552 let $l = arr
553553 let $s = size($l)
554554 let $acc0 = $Tuple3(s, unit, unit)
555555 func $f0_1 ($a,$i) = if (($i >= $s))
556556 then $a
557557 else calc($a, $l[$i])
558558
559559 func $f0_2 ($a,$i) = if (($i >= $s))
560560 then $a
561561 else throw("List size exceeds 7")
562562
563563 $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)
564564 }
565565 let dNext = $t02147321536._1
566566 let dPrev = $t02147321536._2
567567 let found = $t02147321536._3
568568 if ((found != unit))
569569 then $Tuple2(nil, toString(dNext))
570570 else {
571571 let dDiff = absBigInt((dNext - value(dPrev)))
572572 throw(("D calculation error, dDiff = " + toString(dDiff)))
573573 }
574574 }
575575 }
576576
577577
578578
579579 @Callable(i)
580-func calcPutXOnly (amountAssetAmountBigIntStr,amountAssetBalanceBigIntStr,priceAssetBalanceBigIntStr,dBigIntStr,amplificatorBigIntStr,amplificatorPrecisionBigIntStr,targetXPrecisionBigIntStr,targetDPrecisionBigIntStr) = {
581- let nCoins = toBigInt(2)
582- let aPrecision = parseBigIntValue(amplificatorPrecisionBigIntStr)
583- let targetPrecision = parseBigIntValue(targetXPrecisionBigIntStr)
584- let X = parseBigIntValue(amountAssetBalanceBigIntStr)
585- let Y = parseBigIntValue(priceAssetBalanceBigIntStr)
586- let d = if ((dBigIntStr == ""))
587- then parseBigIntValue({
588- let @ = invoke(this, "calcD", [amountAssetBalanceBigIntStr, priceAssetBalanceBigIntStr, amplificatorBigIntStr, amplificatorPrecisionBigIntStr, targetDPrecisionBigIntStr], nil)
589- if ($isInstanceOf(@, "String"))
590- then @
591- else throw(($getType(@) + " couldn't be cast to String"))
592- })
593- else parseBigIntValue(dBigIntStr)
594- let amp = (parseBigIntValue(amplificatorBigIntStr) * aPrecision)
595- let S = parseBigIntValue(amountAssetAmountBigIntStr)
596- let ann = (amp * nCoins)
597- let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
598- func calc (acc,cur) = {
599- let $t02317723204 = acc
600- let x = $t02317723204._1
601- let xPrev = $t02317723204._2
602- let found = $t02317723204._3
603- if ((found != unit))
604- then acc
605- else {
606- let newX = ((X + S) - x)
607- let newY = (Y - ((x * Y) / X))
608- let dp = (((d * d) * d) / (((newX * newY) * nCoins) * nCoins))
609- let xNext = (x + ((((((-(d) * ann) / aPrecision) + d) + ((ann * (newX + newY)) / aPrecision)) - dp) / ((((-(ann) * (toBigInt(-1) - (Y / X))) / aPrecision) + (dp / newX)) + ((Y * dp) / (X * newY)))))
610- let xDiff = absBigInt((xNext - value(x)))
611- if ((targetPrecision >= xDiff))
612- then $Tuple3(xNext, x, cur)
613- else $Tuple3(xNext, x, unit)
614- }
615- }
616-
617- let $t02370723780 = {
618- let $l = arr
619- let $s = size($l)
620- let $acc0 = $Tuple3(zeroBigInt, unit, unit)
621- func $f0_1 ($a,$i) = if (($i >= $s))
622- then $a
623- else calc($a, $l[$i])
624-
625- func $f0_2 ($a,$i) = if (($i >= $s))
626- then $a
627- else throw("List size exceeds 20")
628-
629- $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)
630- }
631- let xNext = $t02370723780._1
632- let xPrev = $t02370723780._2
633- let found = $t02370723780._3
634- if ((found != unit))
635- then $Tuple2(nil, $Tuple2(toInt(xNext), toInt(fraction(xNext, Y, X))))
636- else {
637- let xDiff = absBigInt((xNext - value(xPrev)))
638- throw(("X calculation error, xDiff = " + toString(xDiff)))
639- }
640- }
641-
642-
643-
644-@Callable(i)
645580 func setManager (pendingManagerPublicKey) = {
646581 let checkCaller = mustManager(i)
647582 if ((checkCaller == checkCaller))
648583 then {
649584 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
650585 if ((checkManagerPublicKey == checkManagerPublicKey))
651586 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
652587 else throw("Strict value is not equal to itself.")
653588 }
654589 else throw("Strict value is not equal to itself.")
655590 }
656591
657592
658593
659594 @Callable(i)
660595 func confirmManager () = {
661596 let pm = pendingManagerPublicKeyOrUnit()
662597 let hasPM = if (isDefined(pm))
663598 then true
664599 else throw("No pending manager")
665600 if ((hasPM == hasPM))
666601 then {
667602 let checkPM = if ((i.callerPublicKey == value(pm)))
668603 then true
669604 else throw("You are not pending manager")
670605 if ((checkPM == checkPM))
671606 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
672607 else throw("Strict value is not equal to itself.")
673608 }
674609 else throw("Strict value is not equal to itself.")
675610 }
676611
677612
678613 @Verifier(tx)
679614 func verify () = {
680615 let targetPublicKey = match managerPublicKeyOrUnit() {
681616 case pk: ByteVector =>
682617 pk
683618 case _: Unit =>
684619 tx.senderPublicKey
685620 case _ =>
686621 throw("Match error")
687622 }
688623 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
689624 }
690625

github/deemru/w8io/026f985 
102.82 ms