tx · 7rAHTwAPXdSpS2PdZ2sEpTsW15RdJ4e9YnVeFkvVboF6

3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE:  -0.02200000 Waves

2022.09.14 17:41 [2228905] smart account 3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE > SELF 0.00000000 Waves

{ "type": 13, "id": "7rAHTwAPXdSpS2PdZ2sEpTsW15RdJ4e9YnVeFkvVboF6", "fee": 2200000, "feeAssetId": null, "timestamp": 1663166506672, "version": 2, "chainId": 84, "sender": "3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE", "senderPublicKey": "G349Uq3FTox7dRNLeAfAQeoACvwZ9iEnVSaHcEYn6j8J", "proofs": [ "5Jy8kuDtfgogYgpjjg5CAvasTW4ieTb4VcmaGk2i6GGRKeWbz4J84qbp5hfC1iWg34cWNbyBSsXWzawXp89U1DSz" ], "script": "base64:BgJhCAISBAoCCAESABIDCgEBEgASABIAEgMKAQgSAwoBCBIDCgEIEgUKAwEBARIFCgMBAQESABIDCgEIEgcKBQgICAgIEgoKCAgICAgICAgIEgoKCAgICAgICAgIEgMKAQgSAE8AA1NFUAICX18ABVNDQUxFAOgHAAVNVUxUOACAwtcvAAp6ZXJvQmlnSW50CQC2AgEAAAAUcHJvY2Vzc2luZ1N0YWdlVG90YWwAAAAVcHJvY2Vzc2luZ1N0YWdlU2hhcmVzAAEBDmdldE51bWJlckJ5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUDa2V5AAABD2dldE51bWJlck9yRmFpbAEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUDa2V5CQCsAgIJAKwCAgIPbWFuZGF0b3J5IHRoaXMuBQNrZXkCDyBpcyBub3QgZGVmaW5lZAEOZ2V0U3RyaW5nQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQNrZXkCAAEPZ2V0U3RyaW5nT3JGYWlsAQNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQNrZXkJAKwCAgkArAICAg9tYW5kYXRvcnkgdGhpcy4FA2tleQIPIGlzIG5vdCBkZWZpbmVkAQNhYnMBA3ZhbAMJAGYCAAAFA3ZhbAkBAS0BBQN2YWwFA3ZhbAEJYWJzQmlnSW50AQN2YWwDCQC/AgIFCnplcm9CaWdJbnQFA3ZhbAkAvgIBBQN2YWwFA3ZhbAALa2V5TWF4RGVwdGgCDCVzX19tYXhEZXB0aAAPbWF4RGVwdGhEZWZhdWx0AB4ACG1heERlcHRoCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFC2tleU1heERlcHRoBQ9tYXhEZXB0aERlZmF1bHQBEWtleUZhY3RvcnlBZGRyZXNzAAIcJXMlc19fY29uZmlnX19mYWN0b3J5QWRkcmVzcwARZmFjdG9yeUFkZHJlc3NTdHIJAQ9nZXRTdHJpbmdPckZhaWwBCQERa2V5RmFjdG9yeUFkZHJlc3MAAA9mYWN0b3J5Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEWZhY3RvcnlBZGRyZXNzU3RyARJrZXlFbWlzc2lvbkFkZHJlc3MAAh0lcyVzX19jb25maWdfX2VtaXNzaW9uQWRkcmVzcwETa2V5TnVtVG9Vc2VyTWFwcGluZwEDbnVtCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICB21hcHBpbmcJAMwIAgIIbnVtMnVzZXIJAMwIAgkApAMBBQNudW0FA25pbAUDU0VQABZrZXlSZWZlcnJhbFByb2dyYW1OYW1lCQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAgtwcm9ncmFtTmFtZQUDbmlsBQNTRVAAGnJlZmVycmFsUHJvZ3JhbU5hbWVEZWZhdWx0AgZ3eGxvY2sAE3JlZmVycmFsUHJvZ3JhbU5hbWUJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUWa2V5UmVmZXJyYWxQcm9ncmFtTmFtZQUacmVmZXJyYWxQcm9ncmFtTmFtZURlZmF1bHQAF2tleVJlZmVycmFsTWluR1d4QW1vdW50CQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAgxtaW5HV3hBbW91bnQFA25pbAUDU0VQABtyZWZlcnJhbE1pbkdXeEFtb3VudERlZmF1bHQJAGgCAPQDBQVNVUxUOAAUcmVmZXJyYWxNaW5HV3hBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUXa2V5UmVmZXJyYWxNaW5HV3hBbW91bnQFG3JlZmVycmFsTWluR1d4QW1vdW50RGVmYXVsdAAZa2V5UmVmZXJyZXJSZXdhcmRQZXJtaWxsZQkAuQkCCQDMCAICBCVzJXMJAMwIAgIIcmVmZXJyYWwJAMwIAgIWcmVmZXJyZXJSZXdhcmRQZXJtaWxsZQUDbmlsBQNTRVAAHXJlZmVycmVyUmV3YXJkUGVybWlsbGVEZWZhdWx0ADIAFnJlZmVycmVyUmV3YXJkUGVybWlsbGUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUZa2V5UmVmZXJyZXJSZXdhcmRQZXJtaWxsZQUdcmVmZXJyZXJSZXdhcmRQZXJtaWxsZURlZmF1bHQAGWtleVJlZmVycmFsUmV3YXJkUGVybWlsbGUJALkJAgkAzAgCAgQlcyVzCQDMCAICCHJlZmVycmFsCQDMCAICFnJlZmVycmFsUmV3YXJkUGVybWlsbGUFA25pbAUDU0VQAB1yZWZlcnJhbFJld2FyZFBlcm1pbGxlRGVmYXVsdAAyABZyZWZlcnJhbFJld2FyZFBlcm1pbGxlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFGWtleVJlZmVycmFsUmV3YXJkUGVybWlsbGUFHXJlZmVycmFsUmV3YXJkUGVybWlsbGVEZWZhdWx0AQtrZXlSZWZlcnJlcgEPcmVmZXJyYWxBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCHJlZmVycmVyCQDMCAIFE3JlZmVycmFsUHJvZ3JhbU5hbWUJAMwIAgUPcmVmZXJyYWxBZGRyZXNzBQNuaWwFA1NFUAEUa2V5VW5jbGFpbWVkUmVmZXJyYWwCC3Byb2dyYW1OYW1lDmNsYWltZXJBZGRyZXNzCQC5CQIJAMwIAgIIJXMlcyVzJXMJAMwIAgIRdW5jbGFpbWVkUmVmZXJyYWwJAMwIAgULcHJvZ3JhbU5hbWUJAMwIAgUOY2xhaW1lckFkZHJlc3MFA25pbAUDU0VQABJlbWlzc2lvbkFkZHJlc3NTdHIJAQ9nZXRTdHJpbmdPckZhaWwBCQESa2V5RW1pc3Npb25BZGRyZXNzAAAQZW1pc3Npb25Db250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQUSZW1pc3Npb25BZGRyZXNzU3RyAA1JZHhDZmdBc3NldElkAAEAFklkeENmZ1BhY2VtYWtlckFkZHJlc3MAAgAWSWR4Q2ZnQm9vc3RpbmdDb250cmFjdAADAA5JZHhDZmdNYXhEZXB0aAAEAQlrZXlDb25maWcAAgolc19fY29uZmlnARVyZWFkQ29uZmlnQXJyYXlPckZhaWwACQC1CQIJAQ9nZXRTdHJpbmdPckZhaWwBCQEJa2V5Q29uZmlnAAUDU0VQAQxmb3JtYXRDb25maWcEDHd4QXNzZXRJZFN0chptYXRjaGVyUGFjZW1ha2VyQWRkcmVzc1N0chpib29zdGluZ0NvbnRyYWN0QWRkcmVzc1N0cghtYXhEZXB0aAkAuQkCCQDMCAICCCVzJXMlcyVkCQDMCAIFDHd4QXNzZXRJZFN0cgkAzAgCBRptYXRjaGVyUGFjZW1ha2VyQWRkcmVzc1N0cgkAzAgCBRpib29zdGluZ0NvbnRyYWN0QWRkcmVzc1N0cgkAzAgCCQCkAwEFCG1heERlcHRoBQNuaWwFA1NFUAEWYm9vc3RpbmdDb250cmFjdE9yRmFpbAAECGNmZ0FycmF5CQEVcmVhZENvbmZpZ0FycmF5T3JGYWlsAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUIY2ZnQXJyYXkFFklkeENmZ0Jvb3N0aW5nQ29udHJhY3QCKGJvb3N0aW5nIGNvbnRyYWN0IGFkZHJlc3MgaXMgbm90IGRlZmluZWQBH2tleUd3eFJld2FyZEVtaXNzaW9uU3RhcnRIZWlnaHQAAiglcyVzX19nd3hSZXdhcmRFbWlzc2lvblBhcnRfX3N0YXJ0SGVpZ2h0AQ1rZXlVc2Vyc0NvdW50AAIPJXNfX25leHRVc2VyTnVtARZrZXlSYXRlUGVyQmxvY2tDdXJyZW50AAIbJXMlc19fcmF0ZVBlckJsb2NrX19jdXJyZW50ARRrZXlQb29sV2VpZ2h0VmlydHVhbAACICVzJXNfX3Bvb2xXZWlnaHRfX0dXWHZpcnR1YWxQT09MARRrZXlOZXh0UHJvY2Vzc2VkVXNlcgACFSVzX19uZXh0UHJvY2Vzc2VkVXNlcgEPa2V5TGF0ZXN0UGVyaW9kAAIQJXNfX2xhdGVzdFBlcmlvZAENa2V5TmV4dFBlcmlvZAACDiVzX19uZXh0UGVyaW9kARJrZXlQcm9jZXNzaW5nU3RhZ2UAAhMlc19fcHJvY2Vzc2luZ1N0YWdlARZrZXlOZXh0UHJvY2Vzc2VkUGVyaW9kAAIXJXNfX25leHRQcm9jZXNzZWRQZXJpb2QBEGtleVVzZXJVbmNsYWltZWQBCXVzZXJJbmRleAkAuQkCCQDMCAICBCVzJWQJAMwIAgINdXNlclVuY2xhaW1lZAkAzAgCCQCkAwEFCXVzZXJJbmRleAUDbmlsBQNTRVABG2tleU5leHRVbmxhaW1lZFBlcmlvZE9mVXNlcgEJdXNlckluZGV4CQC5CQIJAMwIAgIXJXMlZF9fbmV4dENsYWltZWRQZXJpb2QJAMwIAgkApAMBBQl1c2VySW5kZXgFA25pbAUDU0VQARxrZXlMYXN0UHJvY2Vzc2VkUGVyaW9kT2ZVc2VyAQl1c2VySW5kZXgJALkJAgkAzAgCAhklcyVkX19sYXN0UHJvY2Vzc2VkUGVyaW9kCQDMCAIJAKQDAQUJdXNlckluZGV4BQNuaWwFA1NFUAESa2V5SGVpZ2h0Rm9yUGVyaW9kAQZwZXJpb2QJALkJAgkAzAgCAholcyVkX19zdGFydEhlaWdodEZvclBlcmlvZAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABHWtleUF1eEVtaXNzaW9uUmV3YXJkRm9yUGVyaW9kAQZwZXJpb2QJALkJAgkAzAgCAhclcyVkX19hdXhFbWlzc2lvblJld2FyZAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABF2tleVRvdGFsQW1vdW50Rm9yUGVyaW9kAQZwZXJpb2QJALkJAgkAzAgCAholcyVkX190b3RhbEFtb3VudEZvclBlcmlvZAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABEWtleUxhc3RQYXlvdXRJbmZvAAISJXNfX2xhc3RQYXlvdXRJbmZvARBQZXJpb2RQYXlvdXRJbmZvAwZwZXJpb2QNbWF0Y2hlclJld2FyZA5lbWlzc2lvblJld2FyZAkAuQkCCQDMCAICBiVkJWQlZAkAzAgCCQCkAwEFBnBlcmlvZAkAzAgCCQCkAwEFDW1hdGNoZXJSZXdhcmQJAMwIAgkApAMBBQ5lbWlzc2lvblJld2FyZAUDbmlsBQNTRVABFGtleVBheW91dEhpc3RvcnlJbmZvAQZwZXJpb2QJALkJAgkAzAgCAhglcyVzJWRfX3BheW91dHNfX2hpc3RvcnkJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARdrZXlUb3RhbFdlaWdodEZvclBlcmlvZAEGcGVyaW9kCQC5CQIJAMwIAgIaJXMlZF9fdG90YWxXZWlnaHRGb3JQZXJpb2QJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARZrZXlVc2VyS1ZhbHVlRm9yUGVyaW9kAgZwZXJpb2QJdXNlckluZGV4CQC5CQIJAMwIAgIXJXMlZCVzJWRfX3BhcmFtQnlQZXJpb2QJAMwIAgkApAMBBQl1c2VySW5kZXgJAMwIAgIBawkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABFmtleVVzZXJCVmFsdWVGb3JQZXJpb2QCBnBlcmlvZAl1c2VySW5kZXgJALkJAgkAzAgCAhclcyVkJXMlZF9fcGFyYW1CeVBlcmlvZAkAzAgCCQCkAwEFCXVzZXJJbmRleAkAzAgCAgFiCQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEWa2V5VXNlcldlaWdodEZvclBlcmlvZAIGcGVyaW9kCXVzZXJJbmRleAkAuQkCCQDMCAICFyVzJWQlcyVkX19wYXJhbUJ5UGVyaW9kCQDMCAIJAKQDAQUJdXNlckluZGV4CQDMCAICBndlaWdodAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABG2tleVJlZmVycmFsc0NvbnRyYWN0QWRkcmVzcwAJALkJAgkAzAgCAgQlcyVzCQDMCAICBmNvbmZpZwkAzAgCAhhyZWZlcnJhbHNDb250cmFjdEFkZHJlc3MFA25pbAUDU0VQAB5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQ9nZXRTdHJpbmdPckZhaWwBCQEba2V5UmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzAAEMSGlzdG9yeUVudHJ5BAR0eXBlBHVzZXIGYW1vdW50AWkECmhpc3RvcnlLRVkJALkJAgkAzAgCAhElcyVzJXMlc19faGlzdG9yeQkAzAgCBQR0eXBlCQDMCAIFBHVzZXIJAMwIAgkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBQNuaWwFA1NFUAQLaGlzdG9yeURBVEEJALkJAgkAzAgCAgwlZCVkJWQlZCVkJWQJAMwIAgkApAMBCAUJbGFzdEJsb2NrBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAKQDAQUGYW1vdW50BQNuaWwFA1NFUAkBC1N0cmluZ0VudHJ5AgUKaGlzdG9yeUtFWQULaGlzdG9yeURBVEEBE2tleU1hbmFnZXJQdWJsaWNLZXkAAhQlc19fbWFuYWdlclB1YmxpY0tleQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkAAhslc19fcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQABAckbWF0Y2gwCQCiCAEJARNrZXlNYW5hZ2VyUHVibGljS2V5AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJANkEAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0AAQHJG1hdGNoMAkAoggBCQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkA2QQBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgELbXVzdE1hbmFnZXIBAWkEAnBkCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFAnBrBgUCcGQDCQABAgUHJG1hdGNoMAIEVW5pdAMJAAACCAUBaQZjYWxsZXIFBHRoaXMGBQJwZAkAAgECC01hdGNoIGVycm9yAQ5jYWxjVXNlcldlaWdodAQXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MPaGVpZ2h0Rm9yUGVyaW9kBnBlcmlvZAl1c2VySW5kZXgEBWtMYXN0CQEca2V5TGFzdFByb2Nlc3NlZFBlcmlvZE9mVXNlcgEFCXVzZXJJbmRleAQEa0tleQkBFmtleVVzZXJLVmFsdWVGb3JQZXJpb2QCBQZwZXJpb2QFCXVzZXJJbmRleAQEa1JhdwkAmggCBRdib29zdGluZ0NvbnRyYWN0QWRkcmVzcwUEa0tleQQLa1VzZXJXZWlnaHQJARZrZXlVc2VyV2VpZ2h0Rm9yUGVyaW9kAgUGcGVyaW9kBQl1c2VySW5kZXgDCQEJaXNEZWZpbmVkAQUEa1JhdwQBawkBBXZhbHVlAQUEa1JhdwQBYgkBBXZhbHVlAQkAmggCBRdib29zdGluZ0NvbnRyYWN0QWRkcmVzcwkBFmtleVVzZXJCVmFsdWVGb3JQZXJpb2QCBQZwZXJpb2QFCXVzZXJJbmRleAQBdwkAZAIJAGgCBQFrBQ9oZWlnaHRGb3JQZXJpb2QFAWIDCQBmAgUBdwAACQCUCgIJAGkCBQF3BQVTQ0FMRQkAzAgCCQEMSW50ZWdlckVudHJ5AgUFa0xhc3QFBnBlcmlvZAkAzAgCCQEMSW50ZWdlckVudHJ5AgULa1VzZXJXZWlnaHQFAXcFA25pbAkAlAoCAAAFA25pbAQBcAkAmggCBQR0aGlzBQVrTGFzdAMDCQEJaXNEZWZpbmVkAQUBcAkAZwIFBnBlcmlvZAkBBXZhbHVlAQUBcAcEAnB2CQEFdmFsdWUBBQFwBAFrCQEFdmFsdWUBCQCaCAIFF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzCQEWa2V5VXNlcktWYWx1ZUZvclBlcmlvZAIFAnB2BQl1c2VySW5kZXgEAWIJAQV2YWx1ZQEJAJoIAgUXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MJARZrZXlVc2VyQlZhbHVlRm9yUGVyaW9kAgUCcHYFCXVzZXJJbmRleAQBdwkAZAIJAGgCBQFrBQ9oZWlnaHRGb3JQZXJpb2QFAWIDCQBmAgUBdwAACQCUCgIJAGkCBQF3BQVTQ0FMRQkAzAgCCQEMSW50ZWdlckVudHJ5AgULa1VzZXJXZWlnaHQFAXcFA25pbAkAlAoCAAAFA25pbAkAlAoCAAAFA25pbAEWY2FsY1VzZXJXZWlnaHRGb3JDbGFpbQQXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MPaGVpZ2h0Rm9yUGVyaW9kBnBlcmlvZAl1c2VySW5kZXgEC2tVc2VyV2VpZ2h0CQEWa2V5VXNlcldlaWdodEZvclBlcmlvZAIFBnBlcmlvZAUJdXNlckluZGV4BBB1c2VyV2VpZ2h0T3JVbml0CQCfCAEFC2tVc2VyV2VpZ2h0BAckbWF0Y2gwBRB1c2VyV2VpZ2h0T3JVbml0AwkAAQIFByRtYXRjaDACBFVuaXQAAAMJAAECBQckbWF0Y2gwAgNJbnQEAXcFByRtYXRjaDAJAGkCBQF3BQVTQ0FMRQkAAgECC01hdGNoIGVycm9yARVnZXRVc2VySW5kZXhCeUFkZHJlc3MCGmJvb3N0aW5nQ29udHJhY3RBZGRyZXNzU3RyC3VzZXJBZGRyZXNzBANrZXkJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIHbWFwcGluZwkAzAgCAgh1c2VyMm51bQkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVAJAQ1wYXJzZUludFZhbHVlAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIJAQdBZGRyZXNzAQkA2QQBBRpib29zdGluZ0NvbnRyYWN0QWRkcmVzc1N0cgUDa2V5CQCsAgIJAKwCAgkArAICAg1Vc2VyIGFkZHJlc3MgBQt1c2VyQWRkcmVzcwItIGlzIG5vdCBmb3VuZCBpbiBib29zdGluZyBjb250cmFjdCBkYXRhLCBrZXk9BQNrZXkBCm5leHRQZXJpb2QACQEOZ2V0TnVtYmVyQnlLZXkBCQENa2V5TmV4dFBlcmlvZAABEWNvbW1vbkNsYWltUmV3YXJkAQt1c2VyQWRkcmVzcwQIY2ZnQXJyYXkJARVyZWFkQ29uZmlnQXJyYXlPckZhaWwABAd1c2VySWR4CQEVZ2V0VXNlckluZGV4QnlBZGRyZXNzAgkAkQMCBQhjZmdBcnJheQUWSWR4Q2ZnQm9vc3RpbmdDb250cmFjdAULdXNlckFkZHJlc3MEE3VzZXJVbmNsYWltZWRPcHRpb24JAJ8IAQkBEGtleVVzZXJVbmNsYWltZWQBBQd1c2VySWR4BAckbWF0Y2gwBRN1c2VyVW5jbGFpbWVkT3B0aW9uAwkAAQIFByRtYXRjaDACBFVuaXQJAJQKAgAABQNuaWwDCQABAgUHJG1hdGNoMAIDSW50BAF1BQckbWF0Y2gwCQCUCgIFAXUJAMwIAgkBDEludGVnZXJFbnRyeQIJARBrZXlVc2VyVW5jbGFpbWVkAQUHdXNlcklkeAAABQNuaWwJAAIBAgtNYXRjaCBlcnJvchIBaQEWdXBkYXRlUmVmZXJyYWxBY3Rpdml0eQILdXNlckFkZHJlc3MOZ1d4QW1vdW50U3RhcnQECHJlZmVycmVyCQCdCAIFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAkBC2tleVJlZmVycmVyAQULdXNlckFkZHJlc3MEEWFjdGl2ZVJlZmVycmFsSW52AwkAAAIFCHJlZmVycmVyBQR1bml0BQR1bml0CQD8BwQFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAIWdXBkYXRlUmVmZXJyYWxBY3Rpdml0eQkAzAgCBRNyZWZlcnJhbFByb2dyYW1OYW1lCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIJAGcCBQ5nV3hBbW91bnRTdGFydAUUcmVmZXJyYWxNaW5HV3hBbW91bnQFA25pbAUDbmlsAwkAAAIFEWFjdGl2ZVJlZmVycmFsSW52BRFhY3RpdmVSZWZlcnJhbEludgkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOZmluYWxpemVIZWxwZXIABA9wcm9jZXNzaW5nU3RhZ2UJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEmtleVByb2Nlc3NpbmdTdGFnZQAFFHByb2Nlc3NpbmdTdGFnZVRvdGFsBA1jdXJyZW50UGVyaW9kCQEOZ2V0TnVtYmVyQnlLZXkBCQEWa2V5TmV4dFByb2Nlc3NlZFBlcmlvZAAEC2N1cnJlbnRVc2VyCQEOZ2V0TnVtYmVyQnlLZXkBCQEUa2V5TmV4dFByb2Nlc3NlZFVzZXIABAxsYXRlc3RQZXJpb2QJAQ5nZXROdW1iZXJCeUtleQEJAQ9rZXlMYXRlc3RQZXJpb2QABAp1c2Vyc0NvdW50CQELdmFsdWVPckVsc2UCCQCaCAIJARZib29zdGluZ0NvbnRyYWN0T3JGYWlsAAkBDWtleVVzZXJzQ291bnQAAAAEDnRvdGFsV2VpZ2h0S2V5CQEXa2V5VG90YWxXZWlnaHRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBAt0b3RhbFdlaWdodAkBDmdldE51bWJlckJ5S2V5AQkBF2tleVRvdGFsV2VpZ2h0Rm9yUGVyaW9kAQUNY3VycmVudFBlcmlvZAQPaGVpZ2h0Rm9yUGVyaW9kCQEOZ2V0TnVtYmVyQnlLZXkBCQESa2V5SGVpZ2h0Rm9yUGVyaW9kAQUNY3VycmVudFBlcmlvZAMJAGYCBQ1jdXJyZW50UGVyaW9kBQxsYXRlc3RQZXJpb2QJAJQKAgUDbmlsBwMJAAACBQ9wcm9jZXNzaW5nU3RhZ2UFFHByb2Nlc3NpbmdTdGFnZVRvdGFsBA0kdDAxMjA4NDEyMjAwCQEOY2FsY1VzZXJXZWlnaHQECQEWYm9vc3RpbmdDb250cmFjdE9yRmFpbAAFD2hlaWdodEZvclBlcmlvZAUNY3VycmVudFBlcmlvZAULY3VycmVudFVzZXIECnVzZXJXZWlnaHQIBQ0kdDAxMjA4NDEyMjAwAl8xBAt1c2VyQWN0aW9ucwgFDSR0MDEyMDg0MTIyMDACXzIEDnRvdGFsV2VpZ2h0TmV3CQBkAgULdG90YWxXZWlnaHQFCnVzZXJXZWlnaHQEEXByb2Nlc3NpbmdBY3Rpb25zAwkAZgIJAGUCBQp1c2Vyc0NvdW50AAEFC2N1cnJlbnRVc2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TmV4dFByb2Nlc3NlZFVzZXIACQBkAgULY3VycmVudFVzZXIAAQUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESa2V5UHJvY2Vzc2luZ1N0YWdlAAUVcHJvY2Vzc2luZ1N0YWdlU2hhcmVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TmV4dFByb2Nlc3NlZFVzZXIAAAAFA25pbAkAlAoCCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUOdG90YWxXZWlnaHRLZXkFDnRvdGFsV2VpZ2h0TmV3BQNuaWwFEXByb2Nlc3NpbmdBY3Rpb25zBQt1c2VyQWN0aW9ucwYDCQAAAgUPcHJvY2Vzc2luZ1N0YWdlBRVwcm9jZXNzaW5nU3RhZ2VTaGFyZXMECnVzZXJXZWlnaHQJARZjYWxjVXNlcldlaWdodEZvckNsYWltBAkBFmJvb3N0aW5nQ29udHJhY3RPckZhaWwABQ9oZWlnaHRGb3JQZXJpb2QFDWN1cnJlbnRQZXJpb2QFC2N1cnJlbnRVc2VyBBp1c2VyQW1vdW50TWF0Y2hlckZvclBlcmlvZAkAawMJAQ5nZXROdW1iZXJCeUtleQEJARdrZXlUb3RhbEFtb3VudEZvclBlcmlvZAEFDWN1cnJlbnRQZXJpb2QFCnVzZXJXZWlnaHQFC3RvdGFsV2VpZ2h0BBt1c2VyQW1vdW50RW1pc3Npb25Gb3JQZXJpb2QJAGsDCQEOZ2V0TnVtYmVyQnlLZXkBCQEda2V5QXV4RW1pc3Npb25SZXdhcmRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBQp1c2VyV2VpZ2h0BQt0b3RhbFdlaWdodAQPdXNlclRvdGFsQW1vdW50CQBkAgUbdXNlckFtb3VudEVtaXNzaW9uRm9yUGVyaW9kBRp1c2VyQW1vdW50TWF0Y2hlckZvclBlcmlvZAQTdXNlclVuY2xhaW1lZE9wdGlvbgkAnwgBCQEQa2V5VXNlclVuY2xhaW1lZAEFC2N1cnJlbnRVc2VyBAt1c2VyQWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNTMpAgkBFmJvb3N0aW5nQ29udHJhY3RPckZhaWwACQETa2V5TnVtVG9Vc2VyTWFwcGluZwEFC2N1cnJlbnRVc2VyBAhyZWZlcnJlcgkAnQgCBR5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwJAQtrZXlSZWZlcnJlcgEFC3VzZXJBZGRyZXNzBBFhY3RpdmVSZWZlcnJhbEludgMJAAACBQhyZWZlcnJlcgUEdW5pdAUEdW5pdAkA/AcEBR5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwCFnVwZGF0ZVJlZmVycmFsQWN0aXZpdHkJAMwIAgUTcmVmZXJyYWxQcm9ncmFtTmFtZQkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCCQBnAgUKdXNlcldlaWdodAUUcmVmZXJyYWxNaW5HV3hBbW91bnQFA25pbAUDbmlsAwkAAAIFEWFjdGl2ZVJlZmVycmFsSW52BRFhY3RpdmVSZWZlcnJhbEludgQLcmVmZXJyYWxJbnYDAwkAAAIFCHJlZmVycmVyBQR1bml0BgkAZgIFFHJlZmVycmFsTWluR1d4QW1vdW50BQp1c2VyV2VpZ2h0BQR1bml0BA5yZWZlcnJlclJld2FyZAkAawMFD3VzZXJUb3RhbEFtb3VudAUWcmVmZXJyZXJSZXdhcmRQZXJtaWxsZQUFU0NBTEUEDnJlZmVycmFsUmV3YXJkCQBrAwUPdXNlclRvdGFsQW1vdW50BRZyZWZlcnJhbFJld2FyZFBlcm1pbGxlBQVTQ0FMRQkA/AcEBR5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwCDGluY1VuY2xhaW1lZAkAzAgCBRNyZWZlcnJhbFByb2dyYW1OYW1lCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIFDnJlZmVycmVyUmV3YXJkCQDMCAIFDnJlZmVycmFsUmV3YXJkBQNuaWwFA25pbAMJAAACBQtyZWZlcnJhbEludgULcmVmZXJyYWxJbnYEEHVuY2xhaW1lZEFjdGlvbnMJAMwIAgkBDEludGVnZXJFbnRyeQIJARBrZXlVc2VyVW5jbGFpbWVkAQULY3VycmVudFVzZXIJAGQCCQELdmFsdWVPckVsc2UCBRN1c2VyVW5jbGFpbWVkT3B0aW9uAAAFD3VzZXJUb3RhbEFtb3VudAUDbmlsBBFwcm9jZXNzaW5nQWN0aW9ucwMJAGYCCQBlAgUKdXNlcnNDb3VudAABBQtjdXJyZW50VXNlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleU5leHRQcm9jZXNzZWRVc2VyAAkAZAIFC2N1cnJlbnRVc2VyAAEFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleU5leHRQcm9jZXNzZWRQZXJpb2QACQBkAgUNY3VycmVudFBlcmlvZAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TmV4dFByb2Nlc3NlZFVzZXIAAAAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEmtleVByb2Nlc3NpbmdTdGFnZQAFA25pbAkAlAoCCQDOCAIFEHVuY2xhaW1lZEFjdGlvbnMFEXByb2Nlc3NpbmdBY3Rpb25zBgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECGGludmFsaWQgcHJvY2Vzc2luZyBzdGFnZQFpAQ9maW5hbGl6ZVdyYXBwZXIBB2NvdW50ZXIEBnJlc3VsdAoAAUAJAPwHBAUEdGhpcwIOZmluYWxpemVIZWxwZXIFA25pbAUDbmlsAwkAAQIFAUACB0Jvb2xlYW4FAUAJAAIBCQCsAgIJAAMBCQD8BwQFBHRoaXMCDmZpbmFsaXplSGVscGVyBQNuaWwFA25pbAIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgMJAAACBQZyZXN1bHQFBnJlc3VsdAMJAQEhAQUGcmVzdWx0AwkAAAIFB2NvdW50ZXIFCG1heERlcHRoCQACAQISTm90aGluZyB0byBwcm9jZXNzCQCUCgIFA25pbAUEdW5pdAMJAGYCBQdjb3VudGVyAAAJAJQKAgUDbmlsCQD8BwQFBHRoaXMCD2ZpbmFsaXplV3JhcHBlcgkAzAgCCQBlAgUHY291bnRlcgABBQNuaWwFA25pbAkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEdcHJvY2Vzc1BlbmRpbmdQZXJpb2RzQW5kVXNlcnMACQCUCgIFA25pbAkA/AcEBQR0aGlzAg9maW5hbGl6ZVdyYXBwZXIJAMwIAgUIbWF4RGVwdGgFA25pbAUDbmlsAWkBB2RlcG9zaXQABAhjZmdBcnJheQkBFXJlYWRDb25maWdBcnJheU9yRmFpbAADCQECIT0CCAUBaQZjYWxsZXIJAQdBZGRyZXNzAQkA2QQBCQCRAwIFCGNmZ0FycmF5BRZJZHhDZmdQYWNlbWFrZXJBZGRyZXNzCQACAQIUV3JvbmcgY2FsbGVyIGFkZHJlc3MEB2Fzc2V0SWQJAQV2YWx1ZQEICQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAMJAQIhPQIFB2Fzc2V0SWQJANkEAQkAkQMCBQhjZmdBcnJheQUNSWR4Q2ZnQXNzZXRJZAkAAgECE1dyb25nIHBheW1lbnQgYXNzZXQEBnBlcmlvZAkBCm5leHRQZXJpb2QABAZkZWx0YUgJAGUCBQZoZWlnaHQJAQ9nZXROdW1iZXJPckZhaWwBCQEfa2V5R3d4UmV3YXJkRW1pc3Npb25TdGFydEhlaWdodAAEDGVtaXNzaW9uUmF0ZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFEGVtaXNzaW9uQ29udHJhY3QJARZrZXlSYXRlUGVyQmxvY2tDdXJyZW50AAkArAICCQCsAgICHG1hbmRhdG9yeSBlbWlzc2lvbl9jb250cmFjdC4JARZrZXlSYXRlUGVyQmxvY2tDdXJyZW50AAIPIGlzIG5vdCBkZWZpbmVkBAZ3ZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ9mYWN0b3J5Q29udHJhY3QJARRrZXlQb29sV2VpZ2h0VmlydHVhbAAJAKwCAgkArAICAhttYW5kYXRvcnkgZmFjdG9yeV9jb250cmFjdC4JARRrZXlQb29sV2VpZ2h0VmlydHVhbAACDyBpcyBub3QgZGVmaW5lZAQJYXV4QW1vdW50CQBrAwkAaAIFBmRlbHRhSAUGd2VpZ2h0BQxlbWlzc2lvblJhdGUFBU1VTFQ4BAJlbQkA/AcEBRBlbWlzc2lvbkNvbnRyYWN0AgRlbWl0CQDMCAIFCWF1eEFtb3VudAUDbmlsBQNuaWwDCQAAAgUCZW0FAmVtBAttYXRjaGVyUGFydAgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQECnBheW91dEluZm8JARBQZXJpb2RQYXlvdXRJbmZvAwUGcGVyaW9kBQttYXRjaGVyUGFydAUJYXV4QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEPa2V5TGF0ZXN0UGVyaW9kAAUGcGVyaW9kCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESa2V5SGVpZ2h0Rm9yUGVyaW9kAQUGcGVyaW9kBQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJAR1rZXlBdXhFbWlzc2lvblJld2FyZEZvclBlcmlvZAEFBnBlcmlvZAUJYXV4QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEfa2V5R3d4UmV3YXJkRW1pc3Npb25TdGFydEhlaWdodAAFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBF2tleVRvdGFsQW1vdW50Rm9yUGVyaW9kAQUGcGVyaW9kBQttYXRjaGVyUGFydAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDWtleU5leHRQZXJpb2QACQBkAgUGcGVyaW9kAAEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWtleUxhc3RQYXlvdXRJbmZvAAUKcGF5b3V0SW5mbwkAzAgCCQELU3RyaW5nRW50cnkCCQEUa2V5UGF5b3V0SGlzdG9yeUluZm8BBQZwZXJpb2QFCnBheW91dEluZm8FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtjbGFpbVJld2FyZAAECGNmZ0FycmF5CQEVcmVhZENvbmZpZ0FycmF5T3JGYWlsAAQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEDSR0MDE3NTQyMTc1OTIJARFjb21tb25DbGFpbVJld2FyZAEFB2FkZHJlc3MEBmFtb3VudAgFDSR0MDE3NTQyMTc1OTICXzEEB2FjdGlvbnMIBQ0kdDAxNzU0MjE3NTkyAl8yBAtjaGVja0Ftb3VudAMJAGYCBQZhbW91bnQAAAYJAAIBAhBOb3RoaW5nIHRvIGNsYWltAwkAAAIFC2NoZWNrQW1vdW50BQtjaGVja0Ftb3VudAQSYW1vdW50RnJvbUVtaXNzaW9uAAAED2NsYWltZWRSZWZlcnJhbAoAAUAJAPwHBAUecmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzT3JGYWlsAgVjbGFpbQkAzAgCBRNyZWZlcnJhbFByb2dyYW1OYW1lBQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBCQD8BwQFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAIFY2xhaW0JAMwIAgUTcmVmZXJyYWxQcm9ncmFtTmFtZQUDbmlsBQNuaWwCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAQLdG90YWxBbW91bnQJAGQCBQZhbW91bnQFD2NsYWltZWRSZWZlcnJhbAkAlAoCCQDOCAIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQt0b3RhbEFtb3VudAkA2QQBCQCRAwIFCGNmZ0FycmF5BQ1JZHhDZmdBc3NldElkCQDMCAIJAQxIaXN0b3J5RW50cnkEAgVjbGFpbQUHYWRkcmVzcwUGYW1vdW50BQFpBQNuaWwFB2FjdGlvbnMJAMwIAgULdG90YWxBbW91bnQJAMwIAgUSYW1vdW50RnJvbUVtaXNzaW9uBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQETY2xhaW1SZXdhcmRSRUFET05MWQEHYWRkcmVzcwQNJHQwMTgxNjUxODIxNQkBEWNvbW1vbkNsYWltUmV3YXJkAQUHYWRkcmVzcwQGYW1vdW50CAUNJHQwMTgxNjUxODIxNQJfMQQHYWN0aW9ucwgFDSR0MDE4MTY1MTgyMTUCXzIEEXJlZmVycmFsVW5jbGFpbWVkCQELdmFsdWVPckVsc2UCCQCaCAIFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAkBFGtleVVuY2xhaW1lZFJlZmVycmFsAgUTcmVmZXJyYWxQcm9ncmFtTmFtZQUHYWRkcmVzcwAABAt0b3RhbEFtb3VudAkAZAIFBmFtb3VudAURcmVmZXJyYWxVbmNsYWltZWQJAJQKAgUDbmlsBQt0b3RhbEFtb3VudAFpAR1sYXRlc3RGaW5hbGl6ZWRQZXJpb2RSRUFET05MWQEHYWRkcmVzcwkAlAoCBQNuaWwJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBD2tleUxhdGVzdFBlcmlvZAAA////////////AQFpASFsYXRlc3RGaW5hbGl6ZWRQZXJpb2RJbmZvUkVBRE9OTFkBB2FkZHJlc3MJAJQKAgUDbmlsCQEOZ2V0U3RyaW5nQnlLZXkBCQERa2V5TGFzdFBheW91dEluZm8AAWkBFWNhbGNHd3hQYXJhbXNSRUFET05MWQMOZ3d4QW1vdW50U3RhcnQPbG9ja1N0YXJ0SGVpZ2h0EmxvY2tEdXJhdGlvbkJsb2NrcwQNbG9ja0VuZEhlaWdodAkAZAIFD2xvY2tTdGFydEhlaWdodAUSbG9ja0R1cmF0aW9uQmxvY2tzBAxzY2FsZThQYXJhbUsJAQEtAQkAawMFDmd3eEFtb3VudFN0YXJ0BQVTQ0FMRQUSbG9ja0R1cmF0aW9uQmxvY2tzBAxzY2FsZThQYXJhbUIJAGgCCQBrAwUOZ3d4QW1vdW50U3RhcnQFBVNDQUxFBRJsb2NrRHVyYXRpb25CbG9ja3MFDWxvY2tFbmRIZWlnaHQJAJQKAgUDbmlsCQDMCAIFDHNjYWxlOFBhcmFtSwkAzAgCBQxzY2FsZThQYXJhbUIJAMwIAgkBCm5leHRQZXJpb2QABQNuaWwBaQEaY2FsY0d3eEFtb3VudFN0YXJ0UkVBRE9OTFkDDHd4TG9ja0Ftb3VudAxsb2NrRHVyYXRpb24PbWF4TG9ja0R1cmF0aW9uBAdjb2VmZlg4CQBrAwUMbG9ja0R1cmF0aW9uBQVNVUxUOAUPbWF4TG9ja0R1cmF0aW9uBA5nV3hBbW91bnRTdGFydAkAawMFDHd4TG9ja0Ftb3VudAUHY29lZmZYOAUFTVVMVDgJAJQKAgUDbmlsCQDMCAIFDmdXeEFtb3VudFN0YXJ0BQNuaWwBaQEVb25FbWlzc2lvbkZvckd3eFN0YXJ0AAMJAQIhPQIIBQFpBmNhbGxlcgUPZmFjdG9yeUNvbnRyYWN0CQACAQIScGVybWlzc2lvbnMgZGVuaWVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEfa2V5R3d4UmV3YXJkRW1pc3Npb25TdGFydEhlaWdodAAFBmhlaWdodAUDbmlsAWkBI2xhdGVzdFBlcmlvZEVtaXNzaW9uUmV3YXJkc1JFQURPTkxZAQdhZGRyZXNzBAZwZXJpb2QJAQpuZXh0UGVyaW9kAAkAlAoCBQNuaWwJAMwIAgkBDmdldE51bWJlckJ5S2V5AQkBHWtleUF1eEVtaXNzaW9uUmV3YXJkRm9yUGVyaW9kAQUGcGVyaW9kBQNuaWwBaQEFY2FsY0QFC3gxQmlnSW50U3RyC3gyQmlnSW50U3RyDGFtcEJpZ0ludFN0chNhUHJlY2lzaW9uQmlnSW50U3RyGHRhcmdldFByZWNpc2lvbkJpZ0ludFN0cgQGbkNvaW5zCQC2AgEAAgQKYVByZWNpc2lvbgkApwMBBRNhUHJlY2lzaW9uQmlnSW50U3RyBA90YXJnZXRQcmVjaXNpb24JAKcDAQUYdGFyZ2V0UHJlY2lzaW9uQmlnSW50U3RyBAJ4MQkApwMBBQt4MUJpZ0ludFN0cgQCeDIJAKcDAQULeDJCaWdJbnRTdHIEA2FtcAkAuQICCQCnAwEFDGFtcEJpZ0ludFN0cgUKYVByZWNpc2lvbgQBcwkAtwICBQJ4MQUCeDIDCQAAAgUBcwUKemVyb0JpZ0ludAkAlAoCBQNuaWwJAKYDAQUKemVyb0JpZ0ludAQDYW5uCQC5AgIFA2FtcAUGbkNvaW5zBANhcnIJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQkAzAgCAAYJAMwIAgAHBQNuaWwKAQRjYWxjAgNhY2MDY3VyBA0kdDAyMDgzODIxMDI3BQNhY2MEAWQIBQ0kdDAyMDgzODIxMDI3Al8xBAVkUHJldggFDSR0MDIwODM4MjEwMjcCXzIEAmRwCQC6AgIJALkCAgkAuQICBQFkBQFkBQFkCQC5AgIJALkCAgkAuQICBQJ4MQUCeDIFBm5Db2lucwUGbkNvaW5zBAVkTmV4dAkAugICCQC5AgIJALcCAgkAugICCQC5AgIFA2FubgUBcwUKYVByZWNpc2lvbgkAuQICBQJkcAUGbkNvaW5zBQFkCQC3AgIJALoCAgkAuQICCQC4AgIFA2FubgUKYVByZWNpc2lvbgUBZAUKYVByZWNpc2lvbgkAuQICCQC3AgIFBm5Db2lucwkAtgIBAAEFAmRwCQCUCgIFBWROZXh0BQFkBA0kdDAyMTI0MDIxMjkwCgACJGwFA2FycgoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUBcwUEdW5pdAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEY2FsYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNwkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHBAVkTmV4dAgFDSR0MDIxMjQwMjEyOTACXzEEBWRQcmV2CAUNJHQwMjEyNDAyMTI5MAJfMgQFZERpZmYJAQlhYnNCaWdJbnQBCQC4AgIFBWROZXh0CQEFdmFsdWUBBQVkUHJldgMJAMACAgUPdGFyZ2V0UHJlY2lzaW9uBQVkRGlmZgkAlAoCBQNuaWwJAKYDAQUFZE5leHQJAAIBCQCsAgICHUQgY2FsY3VsYXRpb24gZXJyb3IsIGREaWZmID0gCQCmAwEFBWREaWZmAWkBDGNhbGNQdXRYT25seQgaYW1vdW50QXNzZXRBbW91bnRCaWdJbnRTdHIbYW1vdW50QXNzZXRCYWxhbmNlQmlnSW50U3RyGnByaWNlQXNzZXRCYWxhbmNlQmlnSW50U3RyCmRCaWdJbnRTdHIVYW1wbGlmaWNhdG9yQmlnSW50U3RyHmFtcGxpZmljYXRvclByZWNpc2lvbkJpZ0ludFN0chl0YXJnZXRYUHJlY2lzaW9uQmlnSW50U3RyGXRhcmdldERQcmVjaXNpb25CaWdJbnRTdHIEBm5Db2lucwkAtgIBAAIECmFQcmVjaXNpb24JAKcDAQUeYW1wbGlmaWNhdG9yUHJlY2lzaW9uQmlnSW50U3RyBA90YXJnZXRQcmVjaXNpb24JAKcDAQUZdGFyZ2V0WFByZWNpc2lvbkJpZ0ludFN0cgQBWAkApwMBBRthbW91bnRBc3NldEJhbGFuY2VCaWdJbnRTdHIEAVkJAKcDAQUacHJpY2VBc3NldEJhbGFuY2VCaWdJbnRTdHIEAWQDCQAAAgUKZEJpZ0ludFN0cgIACQCnAwEKAAFACQD8BwQFBHRoaXMCBWNhbGNECQDMCAIFG2Ftb3VudEFzc2V0QmFsYW5jZUJpZ0ludFN0cgkAzAgCBRpwcmljZUFzc2V0QmFsYW5jZUJpZ0ludFN0cgkAzAgCBRVhbXBsaWZpY2F0b3JCaWdJbnRTdHIJAMwIAgUeYW1wbGlmaWNhdG9yUHJlY2lzaW9uQmlnSW50U3RyCQDMCAIFGXRhcmdldERQcmVjaXNpb25CaWdJbnRTdHIFA25pbAUDbmlsAwkAAQIFAUACBlN0cmluZwUBQAkAAgEJAKwCAgkAAwEJAPwHBAUEdGhpcwIFY2FsY0QJAMwIAgUbYW1vdW50QXNzZXRCYWxhbmNlQmlnSW50U3RyCQDMCAIFGnByaWNlQXNzZXRCYWxhbmNlQmlnSW50U3RyCQDMCAIFFWFtcGxpZmljYXRvckJpZ0ludFN0cgkAzAgCBR5hbXBsaWZpY2F0b3JQcmVjaXNpb25CaWdJbnRTdHIJAMwIAgUZdGFyZ2V0RFByZWNpc2lvbkJpZ0ludFN0cgUDbmlsBQNuaWwCGyBjb3VsZG4ndCBiZSBjYXN0IHRvIFN0cmluZwkApwMBBQpkQmlnSW50U3RyBANhbXAJALkCAgkApwMBBRVhbXBsaWZpY2F0b3JCaWdJbnRTdHIFCmFQcmVjaXNpb24EAVMJAKcDAQUaYW1vdW50QXNzZXRBbW91bnRCaWdJbnRTdHIEA2FubgkAuQICBQNhbXAFBm5Db2lucwQDYXJyCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQUDbmlsCgEEY2FsYwIDYWNjA2N1cgQNJHQwMjI4NTcyMjg3NwUDYWNjBAF4CAUNJHQwMjI4NTcyMjg3NwJfMQQFeFByZXYIBQ0kdDAyMjg1NzIyODc3Al8yBARuZXdYCQC4AgIJALcCAgUBWAUBUwUBeAQEbmV3WQkAuAICBQFZCQC6AgIJALkCAgUBeAUBWQUBWAQCZHAJALoCAgkAuQICCQC5AgIFAWQFAWQFAWQJALkCAgkAuQICCQC5AgIFBG5ld1gFBG5ld1kFBm5Db2lucwUGbkNvaW5zBAV4TmV4dAkAtwICBQF4CQC6AgIJALgCAgkAtwICCQC3AgIJALoCAgkAuQICCQC+AgEFAWQFA2FubgUKYVByZWNpc2lvbgUBZAkAugICCQC5AgIFA2FubgkAtwICBQRuZXdYBQRuZXdZBQphUHJlY2lzaW9uBQJkcAkAtwICCQC3AgIJALoCAgkAuQICCQC+AgEFA2FubgkAuAICCQC2AgEA////////////AQkAugICBQFZBQFYBQphUHJlY2lzaW9uCQC6AgIFAmRwBQRuZXdYCQC6AgIJALkCAgUBWQUCZHAJALkCAgUBWAUEbmV3WQkAlAoCBQV4TmV4dAUBeAQNJHQwMjMxODAyMzI0MAoAAiRsBQNhcnIKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFCnplcm9CaWdJbnQFBHVuaXQKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGNhbGMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoEBXhOZXh0CAUNJHQwMjMxODAyMzI0MAJfMQQFeFByZXYIBQ0kdDAyMzE4MDIzMjQwAl8yBAV4RGlmZgkBCWFic0JpZ0ludAEJALgCAgUFeE5leHQJAQV2YWx1ZQEFBXhQcmV2AwkAwAICBQ90YXJnZXRQcmVjaXNpb24FBXhEaWZmCQCUCgIFA25pbAkAlAoCCQCgAwEFBXhOZXh0CQCgAwEJALwCAwUFeE5leHQFAVkFAVgJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIdWCBjYWxjdWxhdGlvbiBlcnJvciwgeERpZmYgPSAJAKYDAQUFeERpZmYCCiwgeE5leHQgPSAJAKYDAQUFeE5leHQCCiwgeFByZXYgPSAJAKYDAQkBBXZhbHVlAQUFeFByZXYBaQEMY2FsY1N3YXBYVG9ZCBphbW91bnRBc3NldEFtb3VudEJpZ0ludFN0chthbW91bnRBc3NldEJhbGFuY2VCaWdJbnRTdHIacHJpY2VBc3NldEJhbGFuY2VCaWdJbnRTdHIKZEJpZ0ludFN0chVhbXBsaWZpY2F0b3JCaWdJbnRTdHIeYW1wbGlmaWNhdG9yUHJlY2lzaW9uQmlnSW50U3RyGXRhcmdldFhQcmVjaXNpb25CaWdJbnRTdHIZdGFyZ2V0RFByZWNpc2lvbkJpZ0ludFN0cgQGbkNvaW5zCQC2AgEAAgQKYVByZWNpc2lvbgkApwMBBR5hbXBsaWZpY2F0b3JQcmVjaXNpb25CaWdJbnRTdHIED3RhcmdldFByZWNpc2lvbgkApwMBBRl0YXJnZXRYUHJlY2lzaW9uQmlnSW50U3RyBAFYCQCnAwEFG2Ftb3VudEFzc2V0QmFsYW5jZUJpZ0ludFN0cgQBWQkApwMBBRpwcmljZUFzc2V0QmFsYW5jZUJpZ0ludFN0cgQBeAkApwMBBRphbW91bnRBc3NldEFtb3VudEJpZ0ludFN0cgQBZAMJAAACBQpkQmlnSW50U3RyAgAJAKcDAQoAAUAJAPwHBAUEdGhpcwIFY2FsY0QJAMwIAgUbYW1vdW50QXNzZXRCYWxhbmNlQmlnSW50U3RyCQDMCAIFGnByaWNlQXNzZXRCYWxhbmNlQmlnSW50U3RyCQDMCAIFFWFtcGxpZmljYXRvckJpZ0ludFN0cgkAzAgCBR5hbXBsaWZpY2F0b3JQcmVjaXNpb25CaWdJbnRTdHIJAMwIAgUZdGFyZ2V0RFByZWNpc2lvbkJpZ0ludFN0cgUDbmlsBQNuaWwDCQABAgUBQAIGU3RyaW5nBQFACQACAQkArAICCQADAQkA/AcEBQR0aGlzAgVjYWxjRAkAzAgCBRthbW91bnRBc3NldEJhbGFuY2VCaWdJbnRTdHIJAMwIAgUacHJpY2VBc3NldEJhbGFuY2VCaWdJbnRTdHIJAMwIAgUVYW1wbGlmaWNhdG9yQmlnSW50U3RyCQDMCAIFHmFtcGxpZmljYXRvclByZWNpc2lvbkJpZ0ludFN0cgkAzAgCBRl0YXJnZXREUHJlY2lzaW9uQmlnSW50U3RyBQNuaWwFA25pbAIbIGNvdWxkbid0IGJlIGNhc3QgdG8gU3RyaW5nCQCnAwEFCmRCaWdJbnRTdHIEA2FtcAkAuQICCQCnAwEFFWFtcGxpZmljYXRvckJpZ0ludFN0cgUKYVByZWNpc2lvbgQBUwkApwMBBRphbW91bnRBc3NldEFtb3VudEJpZ0ludFN0cgQDYW5uCQC5AgIFA2FtcAUGbkNvaW5zBANhcnIJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwkAzAgCAAgJAMwIAgAJBQNuaWwKAQRjYWxjAgNhY2MDY3VyBA0kdDAyNDkxMzI0OTMzBQNhY2MEAXkIBQ0kdDAyNDkxMzI0OTMzAl8xBAV5UHJldggFDSR0MDI0OTEzMjQ5MzMCXzIEBG5ld1gJALcCAgUBWAUBeAQEbmV3WQkAuAICBQFZBQF5BAJkcAkAugICCQC5AgIJALkCAgUBZAUBZAUBZAkAuQICCQC5AgIJALkCAgUEbmV3WAUEbmV3WQUGbkNvaW5zBQZuQ29pbnMEBXlOZXh0CQC3AgIFAXkJALoCAgkAuAICCQC3AgIJALcCAgkAugICCQC5AgIJAL4CAQUBZAUDYW5uBQphUHJlY2lzaW9uBQFkCQC6AgIJALkCAgUDYW5uCQC3AgIFBG5ld1gFBG5ld1kFCmFQcmVjaXNpb24FAmRwCQC3AgIJALoCAgUDYW5uBQphUHJlY2lzaW9uCQC6AgIFAmRwBQRuZXdZCQCUCgIFBXlOZXh0BQF5BA0kdDAyNTE3NTI1MjM1CgACJGwFA2FycgoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJQKAgUKemVyb0JpZ0ludAUEdW5pdAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEY2FsYwIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQFeU5leHQIBQ0kdDAyNTE3NTI1MjM1Al8xBAV5UHJldggFDSR0MDI1MTc1MjUyMzUCXzIEBXhEaWZmCQEJYWJzQmlnSW50AQkAuAICBQV5TmV4dAkBBXZhbHVlAQUFeVByZXYDCQDAAgIFD3RhcmdldFByZWNpc2lvbgUFeERpZmYJAJQKAgUDbmlsCQCgAwEFBXlOZXh0CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICHVkgY2FsY3VsYXRpb24gZXJyb3IsIHlEaWZmID0gCQCmAwEFBXhEaWZmAgosIHlOZXh0ID0gCQCmAwEFBXlOZXh0AgosIHlQcmV2ID0gCQCmAwEJAQV2YWx1ZQEFBXlQcmV2AWkBCnNldE1hbmFnZXIBF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5BAtjaGVja0NhbGxlcgkBC211c3RNYW5hZ2VyAQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEFWNoZWNrTWFuYWdlclB1YmxpY0tleQkA2QQBBRdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQMJAAACBRVjaGVja01hbmFnZXJQdWJsaWNLZXkFFWNoZWNrTWFuYWdlclB1YmxpY0tleQkAzAgCCQELU3RyaW5nRW50cnkCCQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkABRdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmNvbmZpcm1NYW5hZ2VyAAQCcG0JAR1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdAAEBWhhc1BNAwkBCWlzRGVmaW5lZAEFAnBtBgkAAgECEk5vIHBlbmRpbmcgbWFuYWdlcgMJAAACBQVoYXNQTQUFaGFzUE0EB2NoZWNrUE0DCQAAAggFAWkPY2FsbGVyUHVibGljS2V5CQEFdmFsdWUBBQJwbQYJAAIBAhtZb3UgYXJlIG5vdCBwZW5kaW5nIG1hbmFnZXIDCQAAAgUHY2hlY2tQTQUHY2hlY2tQTQkAzAgCCQELU3RyaW5nRW50cnkCCQETa2V5TWFuYWdlclB1YmxpY0tleQAJANgEAQkBBXZhbHVlAQUCcG0JAMwIAgkBC0RlbGV0ZUVudHJ5AQkBGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQPdGFyZ2V0UHVibGljS2V5BAckbWF0Y2gwCQEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCcGsFByRtYXRjaDAFAnBrAwkAAQIFByRtYXRjaDACBFVuaXQIBQJ0eA9zZW5kZXJQdWJsaWNLZXkJAAIBAgtNYXRjaCBlcnJvcgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUPdGFyZ2V0UHVibGljS2V5SzTBzg==", "height": 2228905, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BZSFryMfz8AkGdNhA9wYR5HVjyNpQd1B2GzMwqqLDxEA Next: 8bgwTfUnRA5atSxnUQXvb9V72WixCXyAE9Uybn2qr6xc Diff:
OldNewDifferences
2525 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (("mandatory this." + key) + " is not defined"))
2626
2727
28-func abs (val) = if ((zeroBigInt > val))
28+func abs (val) = if ((0 > val))
29+ then -(val)
30+ else val
31+
32+
33+func absBigInt (val) = if ((zeroBigInt > val))
2934 then -(val)
3035 else val
3136
325330 then $Tuple2(nil, false)
326331 else if ((processingStage == processingStageTotal))
327332 then {
328- let $t01202512141 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
329- let userWeight = $t01202512141._1
330- let userActions = $t01202512141._2
333+ let $t01208412200 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
334+ let userWeight = $t01208412200._1
335+ let userActions = $t01208412200._2
331336 let totalWeightNew = (totalWeight + userWeight)
332337 let processingActions = if (((usersCount - 1) > currentUser))
333338 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
433438 func claimReward () = {
434439 let cfgArray = readConfigArrayOrFail()
435440 let address = toString(i.caller)
436- let $t01748317533 = commonClaimReward(address)
437- let amount = $t01748317533._1
438- let actions = $t01748317533._2
441+ let $t01754217592 = commonClaimReward(address)
442+ let amount = $t01754217592._1
443+ let actions = $t01754217592._2
439444 let checkAmount = if ((amount > 0))
440445 then true
441446 else throw("Nothing to claim")
458463
459464 @Callable(i)
460465 func claimRewardREADONLY (address) = {
461- let $t01810618156 = commonClaimReward(address)
462- let amount = $t01810618156._1
463- let actions = $t01810618156._2
466+ let $t01816518215 = commonClaimReward(address)
467+ let amount = $t01816518215._1
468+ let actions = $t01816518215._2
464469 let referralUnclaimed = valueOrElse(getInteger(referralsContractAddressOrFail, keyUnclaimedReferral(referralProgramName, address)), 0)
465470 let totalAmount = (amount + referralUnclaimed)
466471 $Tuple2(nil, totalAmount)
527532 let ann = (amp * nCoins)
528533 let arr = [1, 2, 3, 4, 5, 6, 7]
529534 func calc (acc,cur) = {
530- let $t02077920968 = acc
531- let d = $t02077920968._1
532- let dPrev = $t02077920968._2
535+ let $t02083821027 = acc
536+ let d = $t02083821027._1
537+ let dPrev = $t02083821027._2
533538 let dp = (((d * d) * d) / (((x1 * x2) * nCoins) * nCoins))
534539 let dNext = (((((ann * s) / aPrecision) + (dp * nCoins)) * d) / ((((ann - aPrecision) * d) / aPrecision) + ((nCoins + toBigInt(1)) * dp)))
535540 $Tuple2(dNext, d)
536541 }
537542
538- let $t02118121231 = {
543+ let $t02124021290 = {
539544 let $l = arr
540545 let $s = size($l)
541546 let $acc0 = $Tuple2(s, unit)
549554
550555 $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)
551556 }
552- let dNext = $t02118121231._1
553- let dPrev = $t02118121231._2
554- let dDiff = abs((dNext - value(dPrev)))
557+ let dNext = $t02124021290._1
558+ let dPrev = $t02124021290._2
559+ let dDiff = absBigInt((dNext - value(dPrev)))
555560 if ((targetPrecision >= dDiff))
556561 then $Tuple2(nil, toString(dNext))
557562 else throw(("D calculation error, dDiff = " + toString(dDiff)))
558563 }
564+ }
565+
566+
567+
568+@Callable(i)
569+func calcPutXOnly (amountAssetAmountBigIntStr,amountAssetBalanceBigIntStr,priceAssetBalanceBigIntStr,dBigIntStr,amplificatorBigIntStr,amplificatorPrecisionBigIntStr,targetXPrecisionBigIntStr,targetDPrecisionBigIntStr) = {
570+ let nCoins = toBigInt(2)
571+ let aPrecision = parseBigIntValue(amplificatorPrecisionBigIntStr)
572+ let targetPrecision = parseBigIntValue(targetXPrecisionBigIntStr)
573+ let X = parseBigIntValue(amountAssetBalanceBigIntStr)
574+ let Y = parseBigIntValue(priceAssetBalanceBigIntStr)
575+ let d = if ((dBigIntStr == ""))
576+ then parseBigIntValue({
577+ let @ = invoke(this, "calcD", [amountAssetBalanceBigIntStr, priceAssetBalanceBigIntStr, amplificatorBigIntStr, amplificatorPrecisionBigIntStr, targetDPrecisionBigIntStr], nil)
578+ if ($isInstanceOf(@, "String"))
579+ then @
580+ else throw(($getType(invoke(this, "calcD", [amountAssetBalanceBigIntStr, priceAssetBalanceBigIntStr, amplificatorBigIntStr, amplificatorPrecisionBigIntStr, targetDPrecisionBigIntStr], nil)) + " couldn't be cast to String"))
581+ })
582+ else parseBigIntValue(dBigIntStr)
583+ let amp = (parseBigIntValue(amplificatorBigIntStr) * aPrecision)
584+ let S = parseBigIntValue(amountAssetAmountBigIntStr)
585+ let ann = (amp * nCoins)
586+ let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
587+ func calc (acc,cur) = {
588+ let $t02285722877 = acc
589+ let x = $t02285722877._1
590+ let xPrev = $t02285722877._2
591+ let newX = ((X + S) - x)
592+ let newY = (Y - ((x * Y) / X))
593+ let dp = (((d * d) * d) / (((newX * newY) * nCoins) * nCoins))
594+ let xNext = (x + ((((((-(d) * ann) / aPrecision) + d) + ((ann * (newX + newY)) / aPrecision)) - dp) / ((((-(ann) * (toBigInt(-1) - (Y / X))) / aPrecision) + (dp / newX)) + ((Y * dp) / (X * newY)))))
595+ $Tuple2(xNext, x)
596+ }
597+
598+ let $t02318023240 = {
599+ let $l = arr
600+ let $s = size($l)
601+ let $acc0 = $Tuple2(zeroBigInt, unit)
602+ func $f0_1 ($a,$i) = if (($i >= $s))
603+ then $a
604+ else calc($a, $l[$i])
605+
606+ func $f0_2 ($a,$i) = if (($i >= $s))
607+ then $a
608+ else throw("List size exceeds 10")
609+
610+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
611+ }
612+ let xNext = $t02318023240._1
613+ let xPrev = $t02318023240._2
614+ let xDiff = absBigInt((xNext - value(xPrev)))
615+ if ((targetPrecision >= xDiff))
616+ then $Tuple2(nil, $Tuple2(toInt(xNext), toInt(fraction(xNext, Y, X))))
617+ else throw(((((("X calculation error, xDiff = " + toString(xDiff)) + ", xNext = ") + toString(xNext)) + ", xPrev = ") + toString(value(xPrev))))
618+ }
619+
620+
621+
622+@Callable(i)
623+func calcSwapXToY (amountAssetAmountBigIntStr,amountAssetBalanceBigIntStr,priceAssetBalanceBigIntStr,dBigIntStr,amplificatorBigIntStr,amplificatorPrecisionBigIntStr,targetXPrecisionBigIntStr,targetDPrecisionBigIntStr) = {
624+ let nCoins = toBigInt(2)
625+ let aPrecision = parseBigIntValue(amplificatorPrecisionBigIntStr)
626+ let targetPrecision = parseBigIntValue(targetXPrecisionBigIntStr)
627+ let X = parseBigIntValue(amountAssetBalanceBigIntStr)
628+ let Y = parseBigIntValue(priceAssetBalanceBigIntStr)
629+ let x = parseBigIntValue(amountAssetAmountBigIntStr)
630+ let d = if ((dBigIntStr == ""))
631+ then parseBigIntValue({
632+ let @ = invoke(this, "calcD", [amountAssetBalanceBigIntStr, priceAssetBalanceBigIntStr, amplificatorBigIntStr, amplificatorPrecisionBigIntStr, targetDPrecisionBigIntStr], nil)
633+ if ($isInstanceOf(@, "String"))
634+ then @
635+ else throw(($getType(invoke(this, "calcD", [amountAssetBalanceBigIntStr, priceAssetBalanceBigIntStr, amplificatorBigIntStr, amplificatorPrecisionBigIntStr, targetDPrecisionBigIntStr], nil)) + " couldn't be cast to String"))
636+ })
637+ else parseBigIntValue(dBigIntStr)
638+ let amp = (parseBigIntValue(amplificatorBigIntStr) * aPrecision)
639+ let S = parseBigIntValue(amountAssetAmountBigIntStr)
640+ let ann = (amp * nCoins)
641+ let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
642+ func calc (acc,cur) = {
643+ let $t02491324933 = acc
644+ let y = $t02491324933._1
645+ let yPrev = $t02491324933._2
646+ let newX = (X + x)
647+ let newY = (Y - y)
648+ let dp = (((d * d) * d) / (((newX * newY) * nCoins) * nCoins))
649+ let yNext = (y + ((((((-(d) * ann) / aPrecision) + d) + ((ann * (newX + newY)) / aPrecision)) - dp) / ((ann / aPrecision) + (dp / newY))))
650+ $Tuple2(yNext, y)
651+ }
652+
653+ let $t02517525235 = {
654+ let $l = arr
655+ let $s = size($l)
656+ let $acc0 = $Tuple2(zeroBigInt, unit)
657+ func $f0_1 ($a,$i) = if (($i >= $s))
658+ then $a
659+ else calc($a, $l[$i])
660+
661+ func $f0_2 ($a,$i) = if (($i >= $s))
662+ then $a
663+ else throw("List size exceeds 10")
664+
665+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
666+ }
667+ let yNext = $t02517525235._1
668+ let yPrev = $t02517525235._2
669+ let xDiff = absBigInt((yNext - value(yPrev)))
670+ if ((targetPrecision >= xDiff))
671+ then $Tuple2(nil, toInt(yNext))
672+ else throw(((((("Y calculation error, yDiff = " + toString(xDiff)) + ", yNext = ") + toString(yNext)) + ", yPrev = ") + toString(value(yPrev))))
559673 }
560674
561675
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
28-func abs (val) = if ((zeroBigInt > val))
28+func abs (val) = if ((0 > val))
29+ then -(val)
30+ else val
31+
32+
33+func absBigInt (val) = if ((zeroBigInt > val))
2934 then -(val)
3035 else val
3136
3237
3338 let keyMaxDepth = "%s__maxDepth"
3439
3540 let maxDepthDefault = 30
3641
3742 let maxDepth = valueOrElse(getInteger(this, keyMaxDepth), maxDepthDefault)
3843
3944 func keyFactoryAddress () = "%s%s__config__factoryAddress"
4045
4146
4247 let factoryAddressStr = getStringOrFail(keyFactoryAddress())
4348
4449 let factoryContract = addressFromStringValue(factoryAddressStr)
4550
4651 func keyEmissionAddress () = "%s%s__config__emissionAddress"
4752
4853
4954 func keyNumToUserMapping (num) = makeString(["%s%s%s", "mapping", "num2user", toString(num)], SEP)
5055
5156
5257 let keyReferralProgramName = makeString(["%s%s", "referral", "programName"], SEP)
5358
5459 let referralProgramNameDefault = "wxlock"
5560
5661 let referralProgramName = valueOrElse(getString(this, keyReferralProgramName), referralProgramNameDefault)
5762
5863 let keyReferralMinGWxAmount = makeString(["%s%s", "referral", "minGWxAmount"], SEP)
5964
6065 let referralMinGWxAmountDefault = (500 * MULT8)
6166
6267 let referralMinGWxAmount = valueOrElse(getInteger(this, keyReferralMinGWxAmount), referralMinGWxAmountDefault)
6368
6469 let keyReferrerRewardPermille = makeString(["%s%s", "referral", "referrerRewardPermille"], SEP)
6570
6671 let referrerRewardPermilleDefault = 50
6772
6873 let referrerRewardPermille = valueOrElse(getInteger(this, keyReferrerRewardPermille), referrerRewardPermilleDefault)
6974
7075 let keyReferralRewardPermille = makeString(["%s%s", "referral", "referralRewardPermille"], SEP)
7176
7277 let referralRewardPermilleDefault = 50
7378
7479 let referralRewardPermille = valueOrElse(getInteger(this, keyReferralRewardPermille), referralRewardPermilleDefault)
7580
7681 func keyReferrer (referralAddress) = makeString(["%s%s%s", "referrer", referralProgramName, referralAddress], SEP)
7782
7883
7984 func keyUnclaimedReferral (programName,claimerAddress) = makeString(["%s%s%s%s", "unclaimedReferral", programName, claimerAddress], SEP)
8085
8186
8287 let emissionAddressStr = getStringOrFail(keyEmissionAddress())
8388
8489 let emissionContract = addressFromStringValue(emissionAddressStr)
8590
8691 let IdxCfgAssetId = 1
8792
8893 let IdxCfgPacemakerAddress = 2
8994
9095 let IdxCfgBoostingContract = 3
9196
9297 let IdxCfgMaxDepth = 4
9398
9499 func keyConfig () = "%s__config"
95100
96101
97102 func readConfigArrayOrFail () = split(getStringOrFail(keyConfig()), SEP)
98103
99104
100105 func formatConfig (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr,maxDepth) = makeString(["%s%s%s%d", wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr, toString(maxDepth)], SEP)
101106
102107
103108 func boostingContractOrFail () = {
104109 let cfgArray = readConfigArrayOrFail()
105110 valueOrErrorMessage(addressFromString(cfgArray[IdxCfgBoostingContract]), "boosting contract address is not defined")
106111 }
107112
108113
109114 func keyGwxRewardEmissionStartHeight () = "%s%s__gwxRewardEmissionPart__startHeight"
110115
111116
112117 func keyUsersCount () = "%s__nextUserNum"
113118
114119
115120 func keyRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
116121
117122
118123 func keyPoolWeightVirtual () = "%s%s__poolWeight__GWXvirtualPOOL"
119124
120125
121126 func keyNextProcessedUser () = "%s__nextProcessedUser"
122127
123128
124129 func keyLatestPeriod () = "%s__latestPeriod"
125130
126131
127132 func keyNextPeriod () = "%s__nextPeriod"
128133
129134
130135 func keyProcessingStage () = "%s__processingStage"
131136
132137
133138 func keyNextProcessedPeriod () = "%s__nextProcessedPeriod"
134139
135140
136141 func keyUserUnclaimed (userIndex) = makeString(["%s%d", "userUnclaimed", toString(userIndex)], SEP)
137142
138143
139144 func keyNextUnlaimedPeriodOfUser (userIndex) = makeString(["%s%d__nextClaimedPeriod", toString(userIndex)], SEP)
140145
141146
142147 func keyLastProcessedPeriodOfUser (userIndex) = makeString(["%s%d__lastProcessedPeriod", toString(userIndex)], SEP)
143148
144149
145150 func keyHeightForPeriod (period) = makeString(["%s%d__startHeightForPeriod", toString(period)], SEP)
146151
147152
148153 func keyAuxEmissionRewardForPeriod (period) = makeString(["%s%d__auxEmissionReward", toString(period)], SEP)
149154
150155
151156 func keyTotalAmountForPeriod (period) = makeString(["%s%d__totalAmountForPeriod", toString(period)], SEP)
152157
153158
154159 func keyLastPayoutInfo () = "%s__lastPayoutInfo"
155160
156161
157162 func PeriodPayoutInfo (period,matcherReward,emissionReward) = makeString(["%d%d%d", toString(period), toString(matcherReward), toString(emissionReward)], SEP)
158163
159164
160165 func keyPayoutHistoryInfo (period) = makeString(["%s%s%d__payouts__history", toString(period)], SEP)
161166
162167
163168 func keyTotalWeightForPeriod (period) = makeString(["%s%d__totalWeightForPeriod", toString(period)], SEP)
164169
165170
166171 func keyUserKValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "k", toString(period)], SEP)
167172
168173
169174 func keyUserBValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "b", toString(period)], SEP)
170175
171176
172177 func keyUserWeightForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "weight", toString(period)], SEP)
173178
174179
175180 func keyReferralsContractAddress () = makeString(["%s%s", "config", "referralsContractAddress"], SEP)
176181
177182
178183 let referralsContractAddressOrFail = addressFromStringValue(getStringOrFail(keyReferralsContractAddress()))
179184
180185 func HistoryEntry (type,user,amount,i) = {
181186 let historyKEY = makeString(["%s%s%s%s__history", type, user, toBase58String(i.transactionId)], SEP)
182187 let historyDATA = makeString(["%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount)], SEP)
183188 StringEntry(historyKEY, historyDATA)
184189 }
185190
186191
187192 func keyManagerPublicKey () = "%s__managerPublicKey"
188193
189194
190195 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
191196
192197
193198 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
194199 case s: String =>
195200 fromBase58String(s)
196201 case _: Unit =>
197202 unit
198203 case _ =>
199204 throw("Match error")
200205 }
201206
202207
203208 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
204209 case s: String =>
205210 fromBase58String(s)
206211 case _: Unit =>
207212 unit
208213 case _ =>
209214 throw("Match error")
210215 }
211216
212217
213218 func mustManager (i) = {
214219 let pd = throw("Permission denied")
215220 match managerPublicKeyOrUnit() {
216221 case pk: ByteVector =>
217222 if ((i.callerPublicKey == pk))
218223 then true
219224 else pd
220225 case _: Unit =>
221226 if ((i.caller == this))
222227 then true
223228 else pd
224229 case _ =>
225230 throw("Match error")
226231 }
227232 }
228233
229234
230235 func calcUserWeight (boostingContractAddress,heightForPeriod,period,userIndex) = {
231236 let kLast = keyLastProcessedPeriodOfUser(userIndex)
232237 let kKey = keyUserKValueForPeriod(period, userIndex)
233238 let kRaw = getInteger(boostingContractAddress, kKey)
234239 let kUserWeight = keyUserWeightForPeriod(period, userIndex)
235240 if (isDefined(kRaw))
236241 then {
237242 let k = value(kRaw)
238243 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(period, userIndex)))
239244 let w = ((k * heightForPeriod) + b)
240245 if ((w > 0))
241246 then $Tuple2((w / SCALE), [IntegerEntry(kLast, period), IntegerEntry(kUserWeight, w)])
242247 else $Tuple2(0, nil)
243248 }
244249 else {
245250 let p = getInteger(this, kLast)
246251 if (if (isDefined(p))
247252 then (period >= value(p))
248253 else false)
249254 then {
250255 let pv = value(p)
251256 let k = value(getInteger(boostingContractAddress, keyUserKValueForPeriod(pv, userIndex)))
252257 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(pv, userIndex)))
253258 let w = ((k * heightForPeriod) + b)
254259 if ((w > 0))
255260 then $Tuple2((w / SCALE), [IntegerEntry(kUserWeight, w)])
256261 else $Tuple2(0, nil)
257262 }
258263 else $Tuple2(0, nil)
259264 }
260265 }
261266
262267
263268 func calcUserWeightForClaim (boostingContractAddress,heightForPeriod,period,userIndex) = {
264269 let kUserWeight = keyUserWeightForPeriod(period, userIndex)
265270 let userWeightOrUnit = getInteger(kUserWeight)
266271 match userWeightOrUnit {
267272 case _: Unit =>
268273 0
269274 case w: Int =>
270275 (w / SCALE)
271276 case _ =>
272277 throw("Match error")
273278 }
274279 }
275280
276281
277282 func getUserIndexByAddress (boostingContractAddressStr,userAddress) = {
278283 let key = makeString(["%s%s%s", "mapping", "user2num", userAddress], SEP)
279284 parseIntValue(valueOrErrorMessage(getString(Address(fromBase58String(boostingContractAddressStr)), key), ((("User address " + userAddress) + " is not found in boosting contract data, key=") + key)))
280285 }
281286
282287
283288 func nextPeriod () = getNumberByKey(keyNextPeriod())
284289
285290
286291 func commonClaimReward (userAddress) = {
287292 let cfgArray = readConfigArrayOrFail()
288293 let userIdx = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddress)
289294 let userUnclaimedOption = getInteger(keyUserUnclaimed(userIdx))
290295 match userUnclaimedOption {
291296 case _: Unit =>
292297 $Tuple2(0, nil)
293298 case u: Int =>
294299 $Tuple2(u, [IntegerEntry(keyUserUnclaimed(userIdx), 0)])
295300 case _ =>
296301 throw("Match error")
297302 }
298303 }
299304
300305
301306 @Callable(i)
302307 func updateReferralActivity (userAddress,gWxAmountStart) = {
303308 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
304309 let activeReferralInv = if ((referrer == unit))
305310 then unit
306311 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (gWxAmountStart >= referralMinGWxAmount)], nil)
307312 if ((activeReferralInv == activeReferralInv))
308313 then $Tuple2(nil, unit)
309314 else throw("Strict value is not equal to itself.")
310315 }
311316
312317
313318
314319 @Callable(i)
315320 func finalizeHelper () = {
316321 let processingStage = valueOrElse(getInteger(keyProcessingStage()), processingStageTotal)
317322 let currentPeriod = getNumberByKey(keyNextProcessedPeriod())
318323 let currentUser = getNumberByKey(keyNextProcessedUser())
319324 let latestPeriod = getNumberByKey(keyLatestPeriod())
320325 let usersCount = valueOrElse(getInteger(boostingContractOrFail(), keyUsersCount()), 0)
321326 let totalWeightKey = keyTotalWeightForPeriod(currentPeriod)
322327 let totalWeight = getNumberByKey(keyTotalWeightForPeriod(currentPeriod))
323328 let heightForPeriod = getNumberByKey(keyHeightForPeriod(currentPeriod))
324329 if ((currentPeriod > latestPeriod))
325330 then $Tuple2(nil, false)
326331 else if ((processingStage == processingStageTotal))
327332 then {
328- let $t01202512141 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
329- let userWeight = $t01202512141._1
330- let userActions = $t01202512141._2
333+ let $t01208412200 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
334+ let userWeight = $t01208412200._1
335+ let userActions = $t01208412200._2
331336 let totalWeightNew = (totalWeight + userWeight)
332337 let processingActions = if (((usersCount - 1) > currentUser))
333338 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
334339 else [IntegerEntry(keyProcessingStage(), processingStageShares), IntegerEntry(keyNextProcessedUser(), 0)]
335340 $Tuple2((([IntegerEntry(totalWeightKey, totalWeightNew)] ++ processingActions) ++ userActions), true)
336341 }
337342 else if ((processingStage == processingStageShares))
338343 then {
339344 let userWeight = calcUserWeightForClaim(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
340345 let userAmountMatcherForPeriod = fraction(getNumberByKey(keyTotalAmountForPeriod(currentPeriod)), userWeight, totalWeight)
341346 let userAmountEmissionForPeriod = fraction(getNumberByKey(keyAuxEmissionRewardForPeriod(currentPeriod)), userWeight, totalWeight)
342347 let userTotalAmount = (userAmountEmissionForPeriod + userAmountMatcherForPeriod)
343348 let userUnclaimedOption = getInteger(keyUserUnclaimed(currentUser))
344349 let userAddress = getStringValue(boostingContractOrFail(), keyNumToUserMapping(currentUser))
345350 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
346351 let activeReferralInv = if ((referrer == unit))
347352 then unit
348353 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (userWeight >= referralMinGWxAmount)], nil)
349354 if ((activeReferralInv == activeReferralInv))
350355 then {
351356 let referralInv = if (if ((referrer == unit))
352357 then true
353358 else (referralMinGWxAmount > userWeight))
354359 then unit
355360 else {
356361 let referrerReward = fraction(userTotalAmount, referrerRewardPermille, SCALE)
357362 let referralReward = fraction(userTotalAmount, referralRewardPermille, SCALE)
358363 invoke(referralsContractAddressOrFail, "incUnclaimed", [referralProgramName, userAddress, referrerReward, referralReward], nil)
359364 }
360365 if ((referralInv == referralInv))
361366 then {
362367 let unclaimedActions = [IntegerEntry(keyUserUnclaimed(currentUser), (valueOrElse(userUnclaimedOption, 0) + userTotalAmount))]
363368 let processingActions = if (((usersCount - 1) > currentUser))
364369 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
365370 else [IntegerEntry(keyNextProcessedPeriod(), (currentPeriod + 1)), IntegerEntry(keyNextProcessedUser(), 0), DeleteEntry(keyProcessingStage())]
366371 $Tuple2((unclaimedActions ++ processingActions), true)
367372 }
368373 else throw("Strict value is not equal to itself.")
369374 }
370375 else throw("Strict value is not equal to itself.")
371376 }
372377 else throw("invalid processing stage")
373378 }
374379
375380
376381
377382 @Callable(i)
378383 func finalizeWrapper (counter) = {
379384 let result = {
380385 let @ = invoke(this, "finalizeHelper", nil, nil)
381386 if ($isInstanceOf(@, "Boolean"))
382387 then @
383388 else throw(($getType(invoke(this, "finalizeHelper", nil, nil)) + " couldn't be cast to Boolean"))
384389 }
385390 if ((result == result))
386391 then if (!(result))
387392 then if ((counter == maxDepth))
388393 then throw("Nothing to process")
389394 else $Tuple2(nil, unit)
390395 else if ((counter > 0))
391396 then $Tuple2(nil, invoke(this, "finalizeWrapper", [(counter - 1)], nil))
392397 else $Tuple2(nil, unit)
393398 else throw("Strict value is not equal to itself.")
394399 }
395400
396401
397402
398403 @Callable(i)
399404 func processPendingPeriodsAndUsers () = $Tuple2(nil, invoke(this, "finalizeWrapper", [maxDepth], nil))
400405
401406
402407
403408 @Callable(i)
404409 func deposit () = {
405410 let cfgArray = readConfigArrayOrFail()
406411 if ((i.caller != Address(fromBase58String(cfgArray[IdxCfgPacemakerAddress]))))
407412 then throw("Wrong caller address")
408413 else {
409414 let assetId = value(value(i.payments[0]).assetId)
410415 if ((assetId != fromBase58String(cfgArray[IdxCfgAssetId])))
411416 then throw("Wrong payment asset")
412417 else {
413418 let period = nextPeriod()
414419 let deltaH = (height - getNumberOrFail(keyGwxRewardEmissionStartHeight()))
415420 let emissionRate = valueOrErrorMessage(getInteger(emissionContract, keyRatePerBlockCurrent()), (("mandatory emission_contract." + keyRatePerBlockCurrent()) + " is not defined"))
416421 let weight = valueOrErrorMessage(getInteger(factoryContract, keyPoolWeightVirtual()), (("mandatory factory_contract." + keyPoolWeightVirtual()) + " is not defined"))
417422 let auxAmount = fraction((deltaH * weight), emissionRate, MULT8)
418423 let em = invoke(emissionContract, "emit", [auxAmount], nil)
419424 if ((em == em))
420425 then {
421426 let matcherPart = value(i.payments[0]).amount
422427 let payoutInfo = PeriodPayoutInfo(period, matcherPart, auxAmount)
423428 [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)]
424429 }
425430 else throw("Strict value is not equal to itself.")
426431 }
427432 }
428433 }
429434
430435
431436
432437 @Callable(i)
433438 func claimReward () = {
434439 let cfgArray = readConfigArrayOrFail()
435440 let address = toString(i.caller)
436- let $t01748317533 = commonClaimReward(address)
437- let amount = $t01748317533._1
438- let actions = $t01748317533._2
441+ let $t01754217592 = commonClaimReward(address)
442+ let amount = $t01754217592._1
443+ let actions = $t01754217592._2
439444 let checkAmount = if ((amount > 0))
440445 then true
441446 else throw("Nothing to claim")
442447 if ((checkAmount == checkAmount))
443448 then {
444449 let amountFromEmission = 0
445450 let claimedReferral = {
446451 let @ = invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)
447452 if ($isInstanceOf(@, "Int"))
448453 then @
449454 else throw(($getType(invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)) + " couldn't be cast to Int"))
450455 }
451456 let totalAmount = (amount + claimedReferral)
452457 $Tuple2(([ScriptTransfer(i.caller, totalAmount, fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, amount, i)] ++ actions), [totalAmount, amountFromEmission])
453458 }
454459 else throw("Strict value is not equal to itself.")
455460 }
456461
457462
458463
459464 @Callable(i)
460465 func claimRewardREADONLY (address) = {
461- let $t01810618156 = commonClaimReward(address)
462- let amount = $t01810618156._1
463- let actions = $t01810618156._2
466+ let $t01816518215 = commonClaimReward(address)
467+ let amount = $t01816518215._1
468+ let actions = $t01816518215._2
464469 let referralUnclaimed = valueOrElse(getInteger(referralsContractAddressOrFail, keyUnclaimedReferral(referralProgramName, address)), 0)
465470 let totalAmount = (amount + referralUnclaimed)
466471 $Tuple2(nil, totalAmount)
467472 }
468473
469474
470475
471476 @Callable(i)
472477 func latestFinalizedPeriodREADONLY (address) = $Tuple2(nil, valueOrElse(getInteger(this, keyLatestPeriod()), -1))
473478
474479
475480
476481 @Callable(i)
477482 func latestFinalizedPeriodInfoREADONLY (address) = $Tuple2(nil, getStringByKey(keyLastPayoutInfo()))
478483
479484
480485
481486 @Callable(i)
482487 func calcGwxParamsREADONLY (gwxAmountStart,lockStartHeight,lockDurationBlocks) = {
483488 let lockEndHeight = (lockStartHeight + lockDurationBlocks)
484489 let scale8ParamK = -(fraction(gwxAmountStart, SCALE, lockDurationBlocks))
485490 let scale8ParamB = (fraction(gwxAmountStart, SCALE, lockDurationBlocks) * lockEndHeight)
486491 $Tuple2(nil, [scale8ParamK, scale8ParamB, nextPeriod()])
487492 }
488493
489494
490495
491496 @Callable(i)
492497 func calcGwxAmountStartREADONLY (wxLockAmount,lockDuration,maxLockDuration) = {
493498 let coeffX8 = fraction(lockDuration, MULT8, maxLockDuration)
494499 let gWxAmountStart = fraction(wxLockAmount, coeffX8, MULT8)
495500 $Tuple2(nil, [gWxAmountStart])
496501 }
497502
498503
499504
500505 @Callable(i)
501506 func onEmissionForGwxStart () = if ((i.caller != factoryContract))
502507 then throw("permissions denied")
503508 else [IntegerEntry(keyGwxRewardEmissionStartHeight(), height)]
504509
505510
506511
507512 @Callable(i)
508513 func latestPeriodEmissionRewardsREADONLY (address) = {
509514 let period = nextPeriod()
510515 $Tuple2(nil, [getNumberByKey(keyAuxEmissionRewardForPeriod(period))])
511516 }
512517
513518
514519
515520 @Callable(i)
516521 func calcD (x1BigIntStr,x2BigIntStr,ampBigIntStr,aPrecisionBigIntStr,targetPrecisionBigIntStr) = {
517522 let nCoins = toBigInt(2)
518523 let aPrecision = parseBigIntValue(aPrecisionBigIntStr)
519524 let targetPrecision = parseBigIntValue(targetPrecisionBigIntStr)
520525 let x1 = parseBigIntValue(x1BigIntStr)
521526 let x2 = parseBigIntValue(x2BigIntStr)
522527 let amp = (parseBigIntValue(ampBigIntStr) * aPrecision)
523528 let s = (x1 + x2)
524529 if ((s == zeroBigInt))
525530 then $Tuple2(nil, toString(zeroBigInt))
526531 else {
527532 let ann = (amp * nCoins)
528533 let arr = [1, 2, 3, 4, 5, 6, 7]
529534 func calc (acc,cur) = {
530- let $t02077920968 = acc
531- let d = $t02077920968._1
532- let dPrev = $t02077920968._2
535+ let $t02083821027 = acc
536+ let d = $t02083821027._1
537+ let dPrev = $t02083821027._2
533538 let dp = (((d * d) * d) / (((x1 * x2) * nCoins) * nCoins))
534539 let dNext = (((((ann * s) / aPrecision) + (dp * nCoins)) * d) / ((((ann - aPrecision) * d) / aPrecision) + ((nCoins + toBigInt(1)) * dp)))
535540 $Tuple2(dNext, d)
536541 }
537542
538- let $t02118121231 = {
543+ let $t02124021290 = {
539544 let $l = arr
540545 let $s = size($l)
541546 let $acc0 = $Tuple2(s, unit)
542547 func $f0_1 ($a,$i) = if (($i >= $s))
543548 then $a
544549 else calc($a, $l[$i])
545550
546551 func $f0_2 ($a,$i) = if (($i >= $s))
547552 then $a
548553 else throw("List size exceeds 7")
549554
550555 $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)
551556 }
552- let dNext = $t02118121231._1
553- let dPrev = $t02118121231._2
554- let dDiff = abs((dNext - value(dPrev)))
557+ let dNext = $t02124021290._1
558+ let dPrev = $t02124021290._2
559+ let dDiff = absBigInt((dNext - value(dPrev)))
555560 if ((targetPrecision >= dDiff))
556561 then $Tuple2(nil, toString(dNext))
557562 else throw(("D calculation error, dDiff = " + toString(dDiff)))
558563 }
564+ }
565+
566+
567+
568+@Callable(i)
569+func calcPutXOnly (amountAssetAmountBigIntStr,amountAssetBalanceBigIntStr,priceAssetBalanceBigIntStr,dBigIntStr,amplificatorBigIntStr,amplificatorPrecisionBigIntStr,targetXPrecisionBigIntStr,targetDPrecisionBigIntStr) = {
570+ let nCoins = toBigInt(2)
571+ let aPrecision = parseBigIntValue(amplificatorPrecisionBigIntStr)
572+ let targetPrecision = parseBigIntValue(targetXPrecisionBigIntStr)
573+ let X = parseBigIntValue(amountAssetBalanceBigIntStr)
574+ let Y = parseBigIntValue(priceAssetBalanceBigIntStr)
575+ let d = if ((dBigIntStr == ""))
576+ then parseBigIntValue({
577+ let @ = invoke(this, "calcD", [amountAssetBalanceBigIntStr, priceAssetBalanceBigIntStr, amplificatorBigIntStr, amplificatorPrecisionBigIntStr, targetDPrecisionBigIntStr], nil)
578+ if ($isInstanceOf(@, "String"))
579+ then @
580+ else throw(($getType(invoke(this, "calcD", [amountAssetBalanceBigIntStr, priceAssetBalanceBigIntStr, amplificatorBigIntStr, amplificatorPrecisionBigIntStr, targetDPrecisionBigIntStr], nil)) + " couldn't be cast to String"))
581+ })
582+ else parseBigIntValue(dBigIntStr)
583+ let amp = (parseBigIntValue(amplificatorBigIntStr) * aPrecision)
584+ let S = parseBigIntValue(amountAssetAmountBigIntStr)
585+ let ann = (amp * nCoins)
586+ let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
587+ func calc (acc,cur) = {
588+ let $t02285722877 = acc
589+ let x = $t02285722877._1
590+ let xPrev = $t02285722877._2
591+ let newX = ((X + S) - x)
592+ let newY = (Y - ((x * Y) / X))
593+ let dp = (((d * d) * d) / (((newX * newY) * nCoins) * nCoins))
594+ let xNext = (x + ((((((-(d) * ann) / aPrecision) + d) + ((ann * (newX + newY)) / aPrecision)) - dp) / ((((-(ann) * (toBigInt(-1) - (Y / X))) / aPrecision) + (dp / newX)) + ((Y * dp) / (X * newY)))))
595+ $Tuple2(xNext, x)
596+ }
597+
598+ let $t02318023240 = {
599+ let $l = arr
600+ let $s = size($l)
601+ let $acc0 = $Tuple2(zeroBigInt, unit)
602+ func $f0_1 ($a,$i) = if (($i >= $s))
603+ then $a
604+ else calc($a, $l[$i])
605+
606+ func $f0_2 ($a,$i) = if (($i >= $s))
607+ then $a
608+ else throw("List size exceeds 10")
609+
610+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
611+ }
612+ let xNext = $t02318023240._1
613+ let xPrev = $t02318023240._2
614+ let xDiff = absBigInt((xNext - value(xPrev)))
615+ if ((targetPrecision >= xDiff))
616+ then $Tuple2(nil, $Tuple2(toInt(xNext), toInt(fraction(xNext, Y, X))))
617+ else throw(((((("X calculation error, xDiff = " + toString(xDiff)) + ", xNext = ") + toString(xNext)) + ", xPrev = ") + toString(value(xPrev))))
618+ }
619+
620+
621+
622+@Callable(i)
623+func calcSwapXToY (amountAssetAmountBigIntStr,amountAssetBalanceBigIntStr,priceAssetBalanceBigIntStr,dBigIntStr,amplificatorBigIntStr,amplificatorPrecisionBigIntStr,targetXPrecisionBigIntStr,targetDPrecisionBigIntStr) = {
624+ let nCoins = toBigInt(2)
625+ let aPrecision = parseBigIntValue(amplificatorPrecisionBigIntStr)
626+ let targetPrecision = parseBigIntValue(targetXPrecisionBigIntStr)
627+ let X = parseBigIntValue(amountAssetBalanceBigIntStr)
628+ let Y = parseBigIntValue(priceAssetBalanceBigIntStr)
629+ let x = parseBigIntValue(amountAssetAmountBigIntStr)
630+ let d = if ((dBigIntStr == ""))
631+ then parseBigIntValue({
632+ let @ = invoke(this, "calcD", [amountAssetBalanceBigIntStr, priceAssetBalanceBigIntStr, amplificatorBigIntStr, amplificatorPrecisionBigIntStr, targetDPrecisionBigIntStr], nil)
633+ if ($isInstanceOf(@, "String"))
634+ then @
635+ else throw(($getType(invoke(this, "calcD", [amountAssetBalanceBigIntStr, priceAssetBalanceBigIntStr, amplificatorBigIntStr, amplificatorPrecisionBigIntStr, targetDPrecisionBigIntStr], nil)) + " couldn't be cast to String"))
636+ })
637+ else parseBigIntValue(dBigIntStr)
638+ let amp = (parseBigIntValue(amplificatorBigIntStr) * aPrecision)
639+ let S = parseBigIntValue(amountAssetAmountBigIntStr)
640+ let ann = (amp * nCoins)
641+ let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
642+ func calc (acc,cur) = {
643+ let $t02491324933 = acc
644+ let y = $t02491324933._1
645+ let yPrev = $t02491324933._2
646+ let newX = (X + x)
647+ let newY = (Y - y)
648+ let dp = (((d * d) * d) / (((newX * newY) * nCoins) * nCoins))
649+ let yNext = (y + ((((((-(d) * ann) / aPrecision) + d) + ((ann * (newX + newY)) / aPrecision)) - dp) / ((ann / aPrecision) + (dp / newY))))
650+ $Tuple2(yNext, y)
651+ }
652+
653+ let $t02517525235 = {
654+ let $l = arr
655+ let $s = size($l)
656+ let $acc0 = $Tuple2(zeroBigInt, unit)
657+ func $f0_1 ($a,$i) = if (($i >= $s))
658+ then $a
659+ else calc($a, $l[$i])
660+
661+ func $f0_2 ($a,$i) = if (($i >= $s))
662+ then $a
663+ else throw("List size exceeds 10")
664+
665+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
666+ }
667+ let yNext = $t02517525235._1
668+ let yPrev = $t02517525235._2
669+ let xDiff = absBigInt((yNext - value(yPrev)))
670+ if ((targetPrecision >= xDiff))
671+ then $Tuple2(nil, toInt(yNext))
672+ else throw(((((("Y calculation error, yDiff = " + toString(xDiff)) + ", yNext = ") + toString(yNext)) + ", yPrev = ") + toString(value(yPrev))))
559673 }
560674
561675
562676
563677 @Callable(i)
564678 func setManager (pendingManagerPublicKey) = {
565679 let checkCaller = mustManager(i)
566680 if ((checkCaller == checkCaller))
567681 then {
568682 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
569683 if ((checkManagerPublicKey == checkManagerPublicKey))
570684 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
571685 else throw("Strict value is not equal to itself.")
572686 }
573687 else throw("Strict value is not equal to itself.")
574688 }
575689
576690
577691
578692 @Callable(i)
579693 func confirmManager () = {
580694 let pm = pendingManagerPublicKeyOrUnit()
581695 let hasPM = if (isDefined(pm))
582696 then true
583697 else throw("No pending manager")
584698 if ((hasPM == hasPM))
585699 then {
586700 let checkPM = if ((i.callerPublicKey == value(pm)))
587701 then true
588702 else throw("You are not pending manager")
589703 if ((checkPM == checkPM))
590704 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
591705 else throw("Strict value is not equal to itself.")
592706 }
593707 else throw("Strict value is not equal to itself.")
594708 }
595709
596710
597711 @Verifier(tx)
598712 func verify () = {
599713 let targetPublicKey = match managerPublicKeyOrUnit() {
600714 case pk: ByteVector =>
601715 pk
602716 case _: Unit =>
603717 tx.senderPublicKey
604718 case _ =>
605719 throw("Match error")
606720 }
607721 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
608722 }
609723

github/deemru/w8io/c3f4982 
122.66 ms