tx · A1ichLYXomENmwL7xKAmyQgqWz8tiegia1TctBb2uBkL

3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE:  -0.02600000 Waves

2022.08.02 17:53 [2167017] smart account 3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE > SELF 0.00000000 Waves

{ "type": 13, "id": "A1ichLYXomENmwL7xKAmyQgqWz8tiegia1TctBb2uBkL", "fee": 2600000, "feeAssetId": null, "timestamp": 1659452054835, "version": 1, "sender": "3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE", "senderPublicKey": "G349Uq3FTox7dRNLeAfAQeoACvwZ9iEnVSaHcEYn6j8J", "proofs": [ "3LRmcoe43qiqiq4yigbiyjMqWfrxLb4xpimGarnJYxqhMsh2nPLK5zya3auSPvogttG5XThDduAiDVvpGZ6p8bqv" ], "script": "base64:BgJ2CAISBAoCCAESABIDCgEBEgASABIICgYCAQEBAQESABIDCgEIEgQKAggBEgMKAQgSBAoCCAESAwoBCBIDCgEIEgUKAwEBARIFCgMBAQESBgoECAgIARIDCgEIEgMKAQgSABIDCgEIEgcKBQgICAgIEgMKAQgSAE8AA1NFUAICX18ACVVTRVJERVBUSAAaAAVTQ0FMRQDoBwAFTVVMVDgAgMLXLwAKemVyb0JpZ0ludAkAtgIBAAAAFHByb2Nlc3NpbmdTdGFnZVRvdGFsAAAAFXByb2Nlc3NpbmdTdGFnZVNoYXJlcwABAQ5nZXROdW1iZXJCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAAAQ9nZXROdW1iZXJPckZhaWwBA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFA2tleQkArAICCQCsAgICD21hbmRhdG9yeSB0aGlzLgUDa2V5Ag8gaXMgbm90IGRlZmluZWQBDmdldFN0cmluZ0J5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUDa2V5AgABD2dldFN0cmluZ09yRmFpbAEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUDa2V5CQCsAgIJAKwCAgIPbWFuZGF0b3J5IHRoaXMuBQNrZXkCDyBpcyBub3QgZGVmaW5lZAEDYWJzAQN2YWwDCQC/AgIFCnplcm9CaWdJbnQFA3ZhbAkAvgIBBQN2YWwFA3ZhbAALa2V5TWF4RGVwdGgCDCVzX19tYXhEZXB0aAAPbWF4RGVwdGhEZWZhdWx0AB4ACG1heERlcHRoCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFC2tleU1heERlcHRoBQ9tYXhEZXB0aERlZmF1bHQBEWtleUZhY3RvcnlBZGRyZXNzAAIcJXMlc19fY29uZmlnX19mYWN0b3J5QWRkcmVzcwARZmFjdG9yeUFkZHJlc3NTdHIJAQ9nZXRTdHJpbmdPckZhaWwBCQERa2V5RmFjdG9yeUFkZHJlc3MAAA9mYWN0b3J5Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEWZhY3RvcnlBZGRyZXNzU3RyARJrZXlFbWlzc2lvbkFkZHJlc3MAAh0lcyVzX19jb25maWdfX2VtaXNzaW9uQWRkcmVzcwETa2V5TnVtVG9Vc2VyTWFwcGluZwEDbnVtCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICB21hcHBpbmcJAMwIAgIIbnVtMnVzZXIJAMwIAgkApAMBBQNudW0FA25pbAUDU0VQABZrZXlSZWZlcnJhbFByb2dyYW1OYW1lCQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAgtwcm9ncmFtTmFtZQUDbmlsBQNTRVAAGnJlZmVycmFsUHJvZ3JhbU5hbWVEZWZhdWx0AgZ3eGxvY2sAE3JlZmVycmFsUHJvZ3JhbU5hbWUJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUWa2V5UmVmZXJyYWxQcm9ncmFtTmFtZQUacmVmZXJyYWxQcm9ncmFtTmFtZURlZmF1bHQAF2tleVJlZmVycmFsTWluR1d4QW1vdW50CQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAgxtaW5HV3hBbW91bnQFA25pbAUDU0VQABtyZWZlcnJhbE1pbkdXeEFtb3VudERlZmF1bHQJAGgCAPQDBQVNVUxUOAAUcmVmZXJyYWxNaW5HV3hBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUXa2V5UmVmZXJyYWxNaW5HV3hBbW91bnQFG3JlZmVycmFsTWluR1d4QW1vdW50RGVmYXVsdAAZa2V5UmVmZXJyZXJSZXdhcmRQZXJtaWxsZQkAuQkCCQDMCAICBCVzJXMJAMwIAgIIcmVmZXJyYWwJAMwIAgIWcmVmZXJyZXJSZXdhcmRQZXJtaWxsZQUDbmlsBQNTRVAAHXJlZmVycmVyUmV3YXJkUGVybWlsbGVEZWZhdWx0ADIAFnJlZmVycmVyUmV3YXJkUGVybWlsbGUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUZa2V5UmVmZXJyZXJSZXdhcmRQZXJtaWxsZQUdcmVmZXJyZXJSZXdhcmRQZXJtaWxsZURlZmF1bHQAGWtleVJlZmVycmFsUmV3YXJkUGVybWlsbGUJALkJAgkAzAgCAgQlcyVzCQDMCAICCHJlZmVycmFsCQDMCAICFnJlZmVycmFsUmV3YXJkUGVybWlsbGUFA25pbAUDU0VQAB1yZWZlcnJhbFJld2FyZFBlcm1pbGxlRGVmYXVsdAAyABZyZWZlcnJhbFJld2FyZFBlcm1pbGxlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFGWtleVJlZmVycmFsUmV3YXJkUGVybWlsbGUFHXJlZmVycmFsUmV3YXJkUGVybWlsbGVEZWZhdWx0AQtrZXlSZWZlcnJlcgEPcmVmZXJyYWxBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCHJlZmVycmVyCQDMCAIFE3JlZmVycmFsUHJvZ3JhbU5hbWUJAMwIAgUPcmVmZXJyYWxBZGRyZXNzBQNuaWwFA1NFUAASZW1pc3Npb25BZGRyZXNzU3RyCQEPZ2V0U3RyaW5nT3JGYWlsAQkBEmtleUVtaXNzaW9uQWRkcmVzcwAAEGVtaXNzaW9uQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEmVtaXNzaW9uQWRkcmVzc1N0cgANSWR4Q2ZnQXNzZXRJZAABABZJZHhDZmdQYWNlbWFrZXJBZGRyZXNzAAIAFklkeENmZ0Jvb3N0aW5nQ29udHJhY3QAAwAOSWR4Q2ZnTWF4RGVwdGgABAEJa2V5Q29uZmlnAAIKJXNfX2NvbmZpZwEVcmVhZENvbmZpZ0FycmF5T3JGYWlsAAkAtQkCCQEPZ2V0U3RyaW5nT3JGYWlsAQkBCWtleUNvbmZpZwAFA1NFUAEMZm9ybWF0Q29uZmlnBAx3eEFzc2V0SWRTdHIabWF0Y2hlclBhY2VtYWtlckFkZHJlc3NTdHIaYm9vc3RpbmdDb250cmFjdEFkZHJlc3NTdHIIbWF4RGVwdGgJALkJAgkAzAgCAgglcyVzJXMlZAkAzAgCBQx3eEFzc2V0SWRTdHIJAMwIAgUabWF0Y2hlclBhY2VtYWtlckFkZHJlc3NTdHIJAMwIAgUaYm9vc3RpbmdDb250cmFjdEFkZHJlc3NTdHIJAMwIAgkApAMBBQhtYXhEZXB0aAUDbmlsBQNTRVABFmJvb3N0aW5nQ29udHJhY3RPckZhaWwABAhjZmdBcnJheQkBFXJlYWRDb25maWdBcnJheU9yRmFpbAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFCGNmZ0FycmF5BRZJZHhDZmdCb29zdGluZ0NvbnRyYWN0Aihib29zdGluZyBjb250cmFjdCBhZGRyZXNzIGlzIG5vdCBkZWZpbmVkAR9rZXlHd3hSZXdhcmRFbWlzc2lvblN0YXJ0SGVpZ2h0AAIoJXMlc19fZ3d4UmV3YXJkRW1pc3Npb25QYXJ0X19zdGFydEhlaWdodAENa2V5VXNlcnNDb3VudAACDyVzX19uZXh0VXNlck51bQEWa2V5UmF0ZVBlckJsb2NrQ3VycmVudAACGyVzJXNfX3JhdGVQZXJCbG9ja19fY3VycmVudAEUa2V5UG9vbFdlaWdodFZpcnR1YWwAAiAlcyVzX19wb29sV2VpZ2h0X19HV1h2aXJ0dWFsUE9PTAEUa2V5TmV4dFByb2Nlc3NlZFVzZXIAAhUlc19fbmV4dFByb2Nlc3NlZFVzZXIBD2tleUxhdGVzdFBlcmlvZAACECVzX19sYXRlc3RQZXJpb2QBDWtleU5leHRQZXJpb2QAAg4lc19fbmV4dFBlcmlvZAESa2V5UHJvY2Vzc2luZ1N0YWdlAAITJXNfX3Byb2Nlc3NpbmdTdGFnZQEWa2V5TmV4dFByb2Nlc3NlZFBlcmlvZAACFyVzX19uZXh0UHJvY2Vzc2VkUGVyaW9kARtrZXlOZXh0VW5sYWltZWRQZXJpb2RPZlVzZXIBCXVzZXJJbmRleAkAuQkCCQDMCAICFyVzJWRfX25leHRDbGFpbWVkUGVyaW9kCQDMCAIJAKQDAQUJdXNlckluZGV4BQNuaWwFA1NFUAEca2V5TGFzdFByb2Nlc3NlZFBlcmlvZE9mVXNlcgEJdXNlckluZGV4CQC5CQIJAMwIAgIZJXMlZF9fbGFzdFByb2Nlc3NlZFBlcmlvZAkAzAgCCQCkAwEFCXVzZXJJbmRleAUDbmlsBQNTRVABEmtleUhlaWdodEZvclBlcmlvZAEGcGVyaW9kCQC5CQIJAMwIAgIaJXMlZF9fc3RhcnRIZWlnaHRGb3JQZXJpb2QJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQAR1rZXlBdXhFbWlzc2lvblJld2FyZEZvclBlcmlvZAEGcGVyaW9kCQC5CQIJAMwIAgIXJXMlZF9fYXV4RW1pc3Npb25SZXdhcmQJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARdrZXlUb3RhbEFtb3VudEZvclBlcmlvZAEGcGVyaW9kCQC5CQIJAMwIAgIaJXMlZF9fdG90YWxBbW91bnRGb3JQZXJpb2QJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARFrZXlMYXN0UGF5b3V0SW5mbwACEiVzX19sYXN0UGF5b3V0SW5mbwEQUGVyaW9kUGF5b3V0SW5mbwMGcGVyaW9kDW1hdGNoZXJSZXdhcmQOZW1pc3Npb25SZXdhcmQJALkJAgkAzAgCAgYlZCVkJWQJAMwIAgkApAMBBQZwZXJpb2QJAMwIAgkApAMBBQ1tYXRjaGVyUmV3YXJkCQDMCAIJAKQDAQUOZW1pc3Npb25SZXdhcmQFA25pbAUDU0VQARRrZXlQYXlvdXRIaXN0b3J5SW5mbwEGcGVyaW9kCQC5CQIJAMwIAgIYJXMlcyVkX19wYXlvdXRzX19oaXN0b3J5CQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEXa2V5VG90YWxXZWlnaHRGb3JQZXJpb2QBBnBlcmlvZAkAuQkCCQDMCAICGiVzJWRfX3RvdGFsV2VpZ2h0Rm9yUGVyaW9kCQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEWa2V5VXNlcktWYWx1ZUZvclBlcmlvZAIGcGVyaW9kCXVzZXJJbmRleAkAuQkCCQDMCAICFyVzJWQlcyVkX19wYXJhbUJ5UGVyaW9kCQDMCAIJAKQDAQUJdXNlckluZGV4CQDMCAICAWsJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARZrZXlVc2VyQlZhbHVlRm9yUGVyaW9kAgZwZXJpb2QJdXNlckluZGV4CQC5CQIJAMwIAgIXJXMlZCVzJWRfX3BhcmFtQnlQZXJpb2QJAMwIAgkApAMBBQl1c2VySW5kZXgJAMwIAgIBYgkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABFmtleVVzZXJXZWlnaHRGb3JQZXJpb2QCBnBlcmlvZAl1c2VySW5kZXgJALkJAgkAzAgCAhclcyVkJXMlZF9fcGFyYW1CeVBlcmlvZAkAzAgCCQCkAwEFCXVzZXJJbmRleAkAzAgCAgZ3ZWlnaHQJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARtrZXlSZWZlcnJhbHNDb250cmFjdEFkZHJlc3MACQC5CQIJAMwIAgIEJXMlcwkAzAgCAgZjb25maWcJAMwIAgIYcmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzBQNuaWwFA1NFUAAecmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzT3JGYWlsCQERQGV4dHJOYXRpdmUoMTA2MikBCQEPZ2V0U3RyaW5nT3JGYWlsAQkBG2tleVJlZmVycmFsc0NvbnRyYWN0QWRkcmVzcwABDEhpc3RvcnlFbnRyeQcEdHlwZQR1c2VyEWFtb3VudEZyb21NYXRjaGVyEmFtb3VudEZyb21FbWlzc2lvbg1jdXJyZW50UGVyaW9kDGxhdGVzdFBlcmlvZAFpBApoaXN0b3J5S0VZCQC5CQIJAMwIAgIRJXMlcyVzJXNfX2hpc3RvcnkJAMwIAgUEdHlwZQkAzAgCBQR1c2VyCQDMCAIJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAUDbmlsBQNTRVAEC2hpc3RvcnlEQVRBCQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQgFCWxhc3RCbG9jawZoZWlnaHQJAMwIAgkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQCkAwEFEWFtb3VudEZyb21NYXRjaGVyCQDMCAIJAKQDAQUSYW1vdW50RnJvbUVtaXNzaW9uCQDMCAIJAKQDAQUNY3VycmVudFBlcmlvZAkAzAgCCQCkAwEFDGxhdGVzdFBlcmlvZAUDbmlsBQNTRVAJAQtTdHJpbmdFbnRyeQIFCmhpc3RvcnlLRVkFC2hpc3RvcnlEQVRBARNrZXlNYW5hZ2VyUHVibGljS2V5AAIUJXNfX21hbmFnZXJQdWJsaWNLZXkBGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAIbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5ARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAQHJG1hdGNoMAkAoggBCQETa2V5TWFuYWdlclB1YmxpY0tleQADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQDZBAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAR1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdAAEByRtYXRjaDAJAKIIAQkBGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJANkEAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBC211c3RNYW5hZ2VyAQFpBAJwZAkAAgECEVBlcm1pc3Npb24gZGVuaWVkBAckbWF0Y2gwCQEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCcGsFByRtYXRjaDADCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQJwawYFAnBkAwkAAQIFByRtYXRjaDACBFVuaXQDCQAAAggFAWkGY2FsbGVyBQR0aGlzBgUCcGQJAAIBAgtNYXRjaCBlcnJvcgEOY2FsY1VzZXJXZWlnaHQEF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzD2hlaWdodEZvclBlcmlvZAZwZXJpb2QJdXNlckluZGV4BAVrTGFzdAkBHGtleUxhc3RQcm9jZXNzZWRQZXJpb2RPZlVzZXIBBQl1c2VySW5kZXgEBGtLZXkJARZrZXlVc2VyS1ZhbHVlRm9yUGVyaW9kAgUGcGVyaW9kBQl1c2VySW5kZXgEBGtSYXcJAJoIAgUXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MFBGtLZXkEC2tVc2VyV2VpZ2h0CQEWa2V5VXNlcldlaWdodEZvclBlcmlvZAIFBnBlcmlvZAUJdXNlckluZGV4AwkBCWlzRGVmaW5lZAEFBGtSYXcEAWsJAQV2YWx1ZQEFBGtSYXcEAWIJAQV2YWx1ZQEJAJoIAgUXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MJARZrZXlVc2VyQlZhbHVlRm9yUGVyaW9kAgUGcGVyaW9kBQl1c2VySW5kZXgEAXcJAGQCCQBoAgUBawUPaGVpZ2h0Rm9yUGVyaW9kBQFiAwkAZgIFAXcAAAkAlAoCCQBpAgUBdwUFU0NBTEUJAMwIAgkBDEludGVnZXJFbnRyeQIFBWtMYXN0BQZwZXJpb2QJAMwIAgkBDEludGVnZXJFbnRyeQIFC2tVc2VyV2VpZ2h0BQF3BQNuaWwJAJQKAgAABQNuaWwEAXAJAJoIAgUEdGhpcwUFa0xhc3QDAwkBCWlzRGVmaW5lZAEFAXAJAGcCBQZwZXJpb2QJAQV2YWx1ZQEFAXAHBAJwdgkBBXZhbHVlAQUBcAQBawkBBXZhbHVlAQkAmggCBRdib29zdGluZ0NvbnRyYWN0QWRkcmVzcwkBFmtleVVzZXJLVmFsdWVGb3JQZXJpb2QCBQJwdgUJdXNlckluZGV4BAFiCQEFdmFsdWUBCQCaCAIFF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzCQEWa2V5VXNlckJWYWx1ZUZvclBlcmlvZAIFAnB2BQl1c2VySW5kZXgEAXcJAGQCCQBoAgUBawUPaGVpZ2h0Rm9yUGVyaW9kBQFiAwkAZgIFAXcAAAkAlAoCCQBpAgUBdwUFU0NBTEUJAMwIAgkBDEludGVnZXJFbnRyeQIFC2tVc2VyV2VpZ2h0BQF3BQNuaWwJAJQKAgAABQNuaWwJAJQKAgAABQNuaWwBFmNhbGNVc2VyV2VpZ2h0Rm9yQ2xhaW0EF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzD2hlaWdodEZvclBlcmlvZAZwZXJpb2QJdXNlckluZGV4BAtrVXNlcldlaWdodAkBFmtleVVzZXJXZWlnaHRGb3JQZXJpb2QCBQZwZXJpb2QFCXVzZXJJbmRleAQQdXNlcldlaWdodE9yVW5pdAkAnwgBBQtrVXNlcldlaWdodAQHJG1hdGNoMAUQdXNlcldlaWdodE9yVW5pdAMJAAECBQckbWF0Y2gwAgRVbml0AAADCQABAgUHJG1hdGNoMAIDSW50BAF3BQckbWF0Y2gwCQBpAgUBdwUFU0NBTEUJAAIBAgtNYXRjaCBlcnJvcgEVZ2V0VXNlckluZGV4QnlBZGRyZXNzAhpib29zdGluZ0NvbnRyYWN0QWRkcmVzc1N0cgt1c2VyQWRkcmVzcwQDa2V5CQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICB21hcHBpbmcJAMwIAgIIdXNlcjJudW0JAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQCQENcGFyc2VJbnRWYWx1ZQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQEHQWRkcmVzcwEJANkEAQUaYm9vc3RpbmdDb250cmFjdEFkZHJlc3NTdHIFA2tleQkArAICCQCsAgIJAKwCAgINVXNlciBhZGRyZXNzIAULdXNlckFkZHJlc3MCLSBpcyBub3QgZm91bmQgaW4gYm9vc3RpbmcgY29udHJhY3QgZGF0YSwga2V5PQUDa2V5AQpuZXh0UGVyaW9kAAkBDmdldE51bWJlckJ5S2V5AQkBDWtleU5leHRQZXJpb2QAAQtpbnZva2VDbGFpbQYQYm9vc3RpbmdDb250cmFjdAZwZXJpb2QEdXNlcgVkZXB0aBB0b3RhbEZyb21NYXRjaGVyEXRvdGFsRnJvbUVtaXNzaW9uBAZyZXN1bHQJAPwHBAUEdGhpcwIOY2xhaW1OZXh0QmF0Y2gJAMwIAgUQYm9vc3RpbmdDb250cmFjdAkAzAgCBQZwZXJpb2QJAMwIAgUEdXNlcgkAzAgCBQVkZXB0aAkAzAgCBRB0b3RhbEZyb21NYXRjaGVyCQDMCAIFEXRvdGFsRnJvbUVtaXNzaW9uBQNuaWwFA25pbAMJAAACBQZyZXN1bHQFBnJlc3VsdAQHJG1hdGNoMAUGcmVzdWx0AwkAAQIFByRtYXRjaDACDyhJbnQsIEludCwgSW50KQQBcgUHJG1hdGNoMAUBcgkAAgECF0luY29ycmVjdCBpbnZva2UgcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ1jbGFpbUludGVybmFsBhBib29zdGluZ0NvbnRyYWN0DWN1cnJlbnRQZXJpb2QLY3VycmVudFVzZXIFZGVwdGgWdXNlckFjY3VtdWxhdGVkTWF0Y2hlchd1c2VyQWNjdW11bGF0ZWRFbWlzc2lvbgQXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MJAQdBZGRyZXNzAQUQYm9vc3RpbmdDb250cmFjdAQMbGF0ZXN0UGVyaW9kCQEOZ2V0TnVtYmVyQnlLZXkBCQEWa2V5TmV4dFByb2Nlc3NlZFBlcmlvZAAEC3RvdGFsV2VpZ2h0CQEOZ2V0TnVtYmVyQnlLZXkBCQEXa2V5VG90YWxXZWlnaHRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBA9oZWlnaHRGb3JQZXJpb2QJAQ5nZXROdW1iZXJCeUtleQEJARJrZXlIZWlnaHRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBAp1c2VyV2VpZ2h0CQEWY2FsY1VzZXJXZWlnaHRGb3JDbGFpbQQFF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzBQ9oZWlnaHRGb3JQZXJpb2QFDWN1cnJlbnRQZXJpb2QFC2N1cnJlbnRVc2VyBBp1c2VyQW1vdW50TWF0Y2hlckZvclBlcmlvZAkAawMJAQ5nZXROdW1iZXJCeUtleQEJARdrZXlUb3RhbEFtb3VudEZvclBlcmlvZAEFDWN1cnJlbnRQZXJpb2QFCnVzZXJXZWlnaHQFC3RvdGFsV2VpZ2h0BBt1c2VyQW1vdW50RW1pc3Npb25Gb3JQZXJpb2QJAGsDCQEOZ2V0TnVtYmVyQnlLZXkBCQEda2V5QXV4RW1pc3Npb25SZXdhcmRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBQp1c2VyV2VpZ2h0BQt0b3RhbFdlaWdodAMDCQBnAgAABQVkZXB0aAYJAGcCCQBkAgUNY3VycmVudFBlcmlvZAABBQxsYXRlc3RQZXJpb2QJAJUKAwkAZAIFDWN1cnJlbnRQZXJpb2QAAQkAZAIFFnVzZXJBY2N1bXVsYXRlZE1hdGNoZXIFGnVzZXJBbW91bnRNYXRjaGVyRm9yUGVyaW9kCQBkAgUXdXNlckFjY3VtdWxhdGVkRW1pc3Npb24FG3VzZXJBbW91bnRFbWlzc2lvbkZvclBlcmlvZAkBC2ludm9rZUNsYWltBgUQYm9vc3RpbmdDb250cmFjdAkAZAIFDWN1cnJlbnRQZXJpb2QAAQULY3VycmVudFVzZXIJAGUCBQVkZXB0aAABCQBkAgUWdXNlckFjY3VtdWxhdGVkTWF0Y2hlcgUadXNlckFtb3VudE1hdGNoZXJGb3JQZXJpb2QJAGQCBRd1c2VyQWNjdW11bGF0ZWRFbWlzc2lvbgUbdXNlckFtb3VudEVtaXNzaW9uRm9yUGVyaW9kARFjb21tb25DbGFpbVJld2FyZAILdXNlckFkZHJlc3MLc3RhcnRQZXJpb2QECGNmZ0FycmF5CQEVcmVhZENvbmZpZ0FycmF5T3JGYWlsAAQHdXNlcklkeAkBFWdldFVzZXJJbmRleEJ5QWRkcmVzcwIJAJEDAgUIY2ZnQXJyYXkFFklkeENmZ0Jvb3N0aW5nQ29udHJhY3QFC3VzZXJBZGRyZXNzBA1jdXJyZW50UGVyaW9kAwkBAiE9AgULc3RhcnRQZXJpb2QFBHVuaXQJAQV2YWx1ZQEFC3N0YXJ0UGVyaW9kCQEOZ2V0TnVtYmVyQnlLZXkBCQEba2V5TmV4dFVubGFpbWVkUGVyaW9kT2ZVc2VyAQUHdXNlcklkeAQTbmV4dFByb2Nlc3NlZFBlcmlvZAkBDmdldE51bWJlckJ5S2V5AQkBFmtleU5leHRQcm9jZXNzZWRQZXJpb2QAAwkAZwIFDWN1cnJlbnRQZXJpb2QFE25leHRQcm9jZXNzZWRQZXJpb2QJAAIBAhBOb3RoaW5nIHRvIGNsYWltBBBib29zdGluZ0NvbnRyYWN0CQDZBAEJAJEDAgUIY2ZnQXJyYXkFFklkeENmZ0Jvb3N0aW5nQ29udHJhY3QEDSR0MDEyNTY5MTI2OTUJAQ1jbGFpbUludGVybmFsBgUQYm9vc3RpbmdDb250cmFjdAUNY3VycmVudFBlcmlvZAUHdXNlcklkeAUJVVNFUkRFUFRIAAAAAAQGcGVyaW9kCAUNJHQwMTI1NjkxMjY5NQJfMQQRYW1vdW50RnJvbU1hdGNoZXIIBQ0kdDAxMjU2OTEyNjk1Al8yBBJhbW91bnRGcm9tRW1pc3Npb24IBQ0kdDAxMjU2OTEyNjk1Al8zCQCYCgYFBnBlcmlvZAURYW1vdW50RnJvbU1hdGNoZXIFEmFtb3VudEZyb21FbWlzc2lvbgUHdXNlcklkeAUIY2ZnQXJyYXkFE25leHRQcm9jZXNzZWRQZXJpb2QXAWkBFnVwZGF0ZVJlZmVycmFsQWN0aXZpdHkCC3VzZXJBZGRyZXNzDmdXeEFtb3VudFN0YXJ0BAhyZWZlcnJlcgkAnQgCBR5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwJAQtrZXlSZWZlcnJlcgEFC3VzZXJBZGRyZXNzBBFhY3RpdmVSZWZlcnJhbEludgMJAAACBQhyZWZlcnJlcgUEdW5pdAUEdW5pdAkA/AcEBR5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwCFnVwZGF0ZVJlZmVycmFsQWN0aXZpdHkJAMwIAgUTcmVmZXJyYWxQcm9ncmFtTmFtZQkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCCQBnAgUOZ1d4QW1vdW50U3RhcnQFFHJlZmVycmFsTWluR1d4QW1vdW50BQNuaWwFA25pbAMJAAACBRFhY3RpdmVSZWZlcnJhbEludgURYWN0aXZlUmVmZXJyYWxJbnYJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmZpbmFsaXplSGVscGVyAAQPcHJvY2Vzc2luZ1N0YWdlCQELdmFsdWVPckVsc2UCCQCfCAEJARJrZXlQcm9jZXNzaW5nU3RhZ2UABRRwcm9jZXNzaW5nU3RhZ2VUb3RhbAQNY3VycmVudFBlcmlvZAkBDmdldE51bWJlckJ5S2V5AQkBFmtleU5leHRQcm9jZXNzZWRQZXJpb2QABAtjdXJyZW50VXNlcgkBDmdldE51bWJlckJ5S2V5AQkBFGtleU5leHRQcm9jZXNzZWRVc2VyAAQMbGF0ZXN0UGVyaW9kCQEOZ2V0TnVtYmVyQnlLZXkBCQEPa2V5TGF0ZXN0UGVyaW9kAAQKdXNlcnNDb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCCQEWYm9vc3RpbmdDb250cmFjdE9yRmFpbAAJAQ1rZXlVc2Vyc0NvdW50AAAABA50b3RhbFdlaWdodEtleQkBF2tleVRvdGFsV2VpZ2h0Rm9yUGVyaW9kAQUNY3VycmVudFBlcmlvZAQLdG90YWxXZWlnaHQJAQ5nZXROdW1iZXJCeUtleQEJARdrZXlUb3RhbFdlaWdodEZvclBlcmlvZAEFDWN1cnJlbnRQZXJpb2QED2hlaWdodEZvclBlcmlvZAkBDmdldE51bWJlckJ5S2V5AQkBEmtleUhlaWdodEZvclBlcmlvZAEFDWN1cnJlbnRQZXJpb2QDCQBmAgUNY3VycmVudFBlcmlvZAUMbGF0ZXN0UGVyaW9kCQCUCgIFA25pbAcDCQAAAgUPcHJvY2Vzc2luZ1N0YWdlBRRwcm9jZXNzaW5nU3RhZ2VUb3RhbAQNJHQwMTQwOTUxNDIxMQkBDmNhbGNVc2VyV2VpZ2h0BAkBFmJvb3N0aW5nQ29udHJhY3RPckZhaWwABQ9oZWlnaHRGb3JQZXJpb2QFDWN1cnJlbnRQZXJpb2QFC2N1cnJlbnRVc2VyBAp1c2VyV2VpZ2h0CAUNJHQwMTQwOTUxNDIxMQJfMQQLdXNlckFjdGlvbnMIBQ0kdDAxNDA5NTE0MjExAl8yBA50b3RhbFdlaWdodE5ldwkAZAIFC3RvdGFsV2VpZ2h0BQp1c2VyV2VpZ2h0BBFwcm9jZXNzaW5nQWN0aW9ucwMJAGYCCQBlAgUKdXNlcnNDb3VudAABBQtjdXJyZW50VXNlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleU5leHRQcm9jZXNzZWRVc2VyAAkAZAIFC2N1cnJlbnRVc2VyAAEFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmtleVByb2Nlc3NpbmdTdGFnZQAFFXByb2Nlc3NpbmdTdGFnZVNoYXJlcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleU5leHRQcm9jZXNzZWRVc2VyAAAABQNuaWwJAJQKAgkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFDnRvdGFsV2VpZ2h0S2V5BQ50b3RhbFdlaWdodE5ldwUDbmlsBRFwcm9jZXNzaW5nQWN0aW9ucwULdXNlckFjdGlvbnMGAwkAAAIFD3Byb2Nlc3NpbmdTdGFnZQUVcHJvY2Vzc2luZ1N0YWdlU2hhcmVzBAp1c2VyV2VpZ2h0CQEWY2FsY1VzZXJXZWlnaHRGb3JDbGFpbQQJARZib29zdGluZ0NvbnRyYWN0T3JGYWlsAAUPaGVpZ2h0Rm9yUGVyaW9kBQ1jdXJyZW50UGVyaW9kBQtjdXJyZW50VXNlcgQadXNlckFtb3VudE1hdGNoZXJGb3JQZXJpb2QJAGsDCQEOZ2V0TnVtYmVyQnlLZXkBCQEXa2V5VG90YWxBbW91bnRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBQp1c2VyV2VpZ2h0BQt0b3RhbFdlaWdodAQbdXNlckFtb3VudEVtaXNzaW9uRm9yUGVyaW9kCQBrAwkBDmdldE51bWJlckJ5S2V5AQkBHWtleUF1eEVtaXNzaW9uUmV3YXJkRm9yUGVyaW9kAQUNY3VycmVudFBlcmlvZAUKdXNlcldlaWdodAULdG90YWxXZWlnaHQED3VzZXJUb3RhbEFtb3VudAkAZAIFG3VzZXJBbW91bnRFbWlzc2lvbkZvclBlcmlvZAUadXNlckFtb3VudE1hdGNoZXJGb3JQZXJpb2QEC3VzZXJBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA1MykCCQEWYm9vc3RpbmdDb250cmFjdE9yRmFpbAAJARNrZXlOdW1Ub1VzZXJNYXBwaW5nAQULY3VycmVudFVzZXIECHJlZmVycmVyCQCdCAIFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAkBC2tleVJlZmVycmVyAQULdXNlckFkZHJlc3MEEWFjdGl2ZVJlZmVycmFsSW52AwkAAAIFCHJlZmVycmVyBQR1bml0BQR1bml0CQD8BwQFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAIWdXBkYXRlUmVmZXJyYWxBY3Rpdml0eQkAzAgCBRNyZWZlcnJhbFByb2dyYW1OYW1lCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIJAGcCBQp1c2VyV2VpZ2h0BRRyZWZlcnJhbE1pbkdXeEFtb3VudAUDbmlsBQNuaWwDCQAAAgURYWN0aXZlUmVmZXJyYWxJbnYFEWFjdGl2ZVJlZmVycmFsSW52BAtyZWZlcnJhbEludgMDCQAAAgUIcmVmZXJyZXIFBHVuaXQGCQBmAgUUcmVmZXJyYWxNaW5HV3hBbW91bnQFCnVzZXJXZWlnaHQFBHVuaXQEDnJlZmVycmVyUmV3YXJkCQBrAwUPdXNlclRvdGFsQW1vdW50BRZyZWZlcnJlclJld2FyZFBlcm1pbGxlBQVTQ0FMRQQOcmVmZXJyYWxSZXdhcmQJAGsDBQ91c2VyVG90YWxBbW91bnQFFnJlZmVycmFsUmV3YXJkUGVybWlsbGUFBVNDQUxFCQD8BwQFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAIMaW5jVW5jbGFpbWVkCQDMCAIFE3JlZmVycmFsUHJvZ3JhbU5hbWUJAMwIAgULdXNlckFkZHJlc3MJAMwIAgUOcmVmZXJyZXJSZXdhcmQJAMwIAgUOcmVmZXJyYWxSZXdhcmQFA25pbAUDbmlsAwkAAAIFC3JlZmVycmFsSW52BQtyZWZlcnJhbEludgQRcHJvY2Vzc2luZ0FjdGlvbnMDCQBmAgkAZQIFCnVzZXJzQ291bnQAAQULY3VycmVudFVzZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlOZXh0UHJvY2Vzc2VkVXNlcgAJAGQCBQtjdXJyZW50VXNlcgABBQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlOZXh0UHJvY2Vzc2VkUGVyaW9kAAkAZAIFDWN1cnJlbnRQZXJpb2QAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleU5leHRQcm9jZXNzZWRVc2VyAAAACQDMCAIJAQtEZWxldGVFbnRyeQEJARJrZXlQcm9jZXNzaW5nU3RhZ2UABQNuaWwJAJQKAgURcHJvY2Vzc2luZ0FjdGlvbnMGCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIYaW52YWxpZCBwcm9jZXNzaW5nIHN0YWdlAWkBD2ZpbmFsaXplV3JhcHBlcgEHY291bnRlcgQGcmVzdWx0CgABQAkA/AcEBQR0aGlzAg5maW5hbGl6ZUhlbHBlcgUDbmlsBQNuaWwDCQABAgUBQAIHQm9vbGVhbgUBQAkAAgEJAKwCAgkAAwEJAPwHBAUEdGhpcwIOZmluYWxpemVIZWxwZXIFA25pbAUDbmlsAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuAwkAAAIFBnJlc3VsdAUGcmVzdWx0AwkBASEBBQZyZXN1bHQDCQAAAgUHY291bnRlcgUIbWF4RGVwdGgJAAIBAhJOb3RoaW5nIHRvIHByb2Nlc3MJAJQKAgUDbmlsBQR1bml0AwkAZgIFB2NvdW50ZXIAAAkAlAoCBQNuaWwJAPwHBAUEdGhpcwIPZmluYWxpemVXcmFwcGVyCQDMCAIJAGUCBQdjb3VudGVyAAEFA25pbAUDbmlsCQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAR1wcm9jZXNzUGVuZGluZ1BlcmlvZHNBbmRVc2VycwAJAJQKAgUDbmlsCQD8BwQFBHRoaXMCD2ZpbmFsaXplV3JhcHBlcgkAzAgCBQhtYXhEZXB0aAUDbmlsBQNuaWwBaQEHZGVwb3NpdAAECGNmZ0FycmF5CQEVcmVhZENvbmZpZ0FycmF5T3JGYWlsAAMJAQIhPQIIBQFpBmNhbGxlcgkBB0FkZHJlc3MBCQDZBAEJAJEDAgUIY2ZnQXJyYXkFFklkeENmZ1BhY2VtYWtlckFkZHJlc3MJAAIBAhRXcm9uZyBjYWxsZXIgYWRkcmVzcwQHYXNzZXRJZAkBBXZhbHVlAQgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAwkBAiE9AgUHYXNzZXRJZAkA2QQBCQCRAwIFCGNmZ0FycmF5BQ1JZHhDZmdBc3NldElkCQACAQITV3JvbmcgcGF5bWVudCBhc3NldAQGcGVyaW9kCQEKbmV4dFBlcmlvZAAEBmRlbHRhSAkAZQIFBmhlaWdodAkBD2dldE51bWJlck9yRmFpbAEJAR9rZXlHd3hSZXdhcmRFbWlzc2lvblN0YXJ0SGVpZ2h0AAQMZW1pc3Npb25SYXRlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUQZW1pc3Npb25Db250cmFjdAkBFmtleVJhdGVQZXJCbG9ja0N1cnJlbnQACQCsAgIJAKwCAgIcbWFuZGF0b3J5IGVtaXNzaW9uX2NvbnRyYWN0LgkBFmtleVJhdGVQZXJCbG9ja0N1cnJlbnQAAg8gaXMgbm90IGRlZmluZWQEBndlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFD2ZhY3RvcnlDb250cmFjdAkBFGtleVBvb2xXZWlnaHRWaXJ0dWFsAAkArAICCQCsAgICG21hbmRhdG9yeSBmYWN0b3J5X2NvbnRyYWN0LgkBFGtleVBvb2xXZWlnaHRWaXJ0dWFsAAIPIGlzIG5vdCBkZWZpbmVkBAlhdXhBbW91bnQJAGsDCQBoAgUGZGVsdGFIBQZ3ZWlnaHQFDGVtaXNzaW9uUmF0ZQUFTVVMVDgEAmVtCQD8BwQFEGVtaXNzaW9uQ29udHJhY3QCBGVtaXQJAMwIAgUJYXV4QW1vdW50BQNuaWwFA25pbAMJAAACBQJlbQUCZW0EC21hdGNoZXJQYXJ0CAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQKcGF5b3V0SW5mbwkBEFBlcmlvZFBheW91dEluZm8DBQZwZXJpb2QFC21hdGNoZXJQYXJ0BQlhdXhBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlMYXRlc3RQZXJpb2QABQZwZXJpb2QJAMwIAgkBDEludGVnZXJFbnRyeQIJARJrZXlIZWlnaHRGb3JQZXJpb2QBBQZwZXJpb2QFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBHWtleUF1eEVtaXNzaW9uUmV3YXJkRm9yUGVyaW9kAQUGcGVyaW9kBQlhdXhBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAR9rZXlHd3hSZXdhcmRFbWlzc2lvblN0YXJ0SGVpZ2h0AAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEXa2V5VG90YWxBbW91bnRGb3JQZXJpb2QBBQZwZXJpb2QFC21hdGNoZXJQYXJ0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQENa2V5TmV4dFBlcmlvZAAJAGQCBQZwZXJpb2QAAQkAzAgCCQELU3RyaW5nRW50cnkCCQERa2V5TGFzdFBheW91dEluZm8ABQpwYXlvdXRJbmZvCQDMCAIJAQtTdHJpbmdFbnRyeQIJARRrZXlQYXlvdXRIaXN0b3J5SW5mbwEFBnBlcmlvZAUKcGF5b3V0SW5mbwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmNsYWltTmV4dEJhdGNoBhBib29zdGluZ0NvbnRyYWN0DWN1cnJlbnRQZXJpb2QLY3VycmVudFVzZXIFZGVwdGgQdG90YWxGcm9tTWF0Y2hlchF0b3RhbEZyb21FbWlzc2lvbgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECJFNob3VsZCBiZSBjYWxsZWQgYnkgdGhpcyBzY3JpcHQgb25seQQPcGVyaW9kQW5kVG90YWxzCQENY2xhaW1JbnRlcm5hbAYFEGJvb3N0aW5nQ29udHJhY3QFDWN1cnJlbnRQZXJpb2QFC2N1cnJlbnRVc2VyBQVkZXB0aAUQdG90YWxGcm9tTWF0Y2hlcgURdG90YWxGcm9tRW1pc3Npb24JAJQKAgUDbmlsBQ9wZXJpb2RBbmRUb3RhbHMBaQELY2xhaW1SZXdhcmQABAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgQNJHQwMTk3NDUxOTg3MQkBEWNvbW1vbkNsYWltUmV3YXJkAgUHYWRkcmVzcwUEdW5pdAQGcGVyaW9kCAUNJHQwMTk3NDUxOTg3MQJfMQQRYW1vdW50RnJvbU1hdGNoZXIIBQ0kdDAxOTc0NTE5ODcxAl8yBBJhbW91bnRGcm9tRW1pc3Npb24IBQ0kdDAxOTc0NTE5ODcxAl8zBAd1c2VySWR4CAUNJHQwMTk3NDUxOTg3MQJfNAQIY2ZnQXJyYXkIBQ0kdDAxOTc0NTE5ODcxAl81BBNuZXh0UHJvY2Vzc2VkUGVyaW9kCAUNJHQwMTk3NDUxOTg3MQJfNgkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEba2V5TmV4dFVubGFpbWVkUGVyaW9kT2ZVc2VyAQUHdXNlcklkeAUGcGVyaW9kCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZAIFEWFtb3VudEZyb21NYXRjaGVyBRJhbW91bnRGcm9tRW1pc3Npb24JANkEAQkAkQMCBQhjZmdBcnJheQUNSWR4Q2ZnQXNzZXRJZAkAzAgCCQEMSGlzdG9yeUVudHJ5BwIFY2xhaW0FB2FkZHJlc3MFEWFtb3VudEZyb21NYXRjaGVyBRJhbW91bnRGcm9tRW1pc3Npb24FBnBlcmlvZAUTbmV4dFByb2Nlc3NlZFBlcmlvZAUBaQUDbmlsCQDMCAIFEWFtb3VudEZyb21NYXRjaGVyCQDMCAIFEmFtb3VudEZyb21FbWlzc2lvbgUDbmlsAWkBE2NsYWltUmV3YXJkUkVBRE9OTFkBB2FkZHJlc3MEDGNsYWltUmVzdWx0cwkBEWNvbW1vbkNsYWltUmV3YXJkAgUHYWRkcmVzcwUEdW5pdAQGYW1vdW50CQBkAggFDGNsYWltUmVzdWx0cwJfMggFDGNsYWltUmVzdWx0cwJfMwkAlAoCBQNuaWwFBmFtb3VudAFpARxjbGFpbVJld2FyZFBhZ2luYXRlZFJFQURPTkxZAgdhZGRyZXNzC3N0YXJ0UGVyaW9kBA0kdDAyMDYxNDIwNzMxCQERY29tbW9uQ2xhaW1SZXdhcmQCBQdhZGRyZXNzAwkAZgIAAAULc3RhcnRQZXJpb2QFBHVuaXQFC3N0YXJ0UGVyaW9kBAZwZXJpb2QIBQ0kdDAyMDYxNDIwNzMxAl8xBAtmcm9tTWF0Y2hlcggFDSR0MDIwNjE0MjA3MzECXzIEDGZyb21FbWlzc2lvbggFDSR0MDIwNjE0MjA3MzECXzMEBmFtb3VudAkAZAIFC2Zyb21NYXRjaGVyBQxmcm9tRW1pc3Npb24JAJQKAgUDbmlsCQCUCgIFBmFtb3VudAUGcGVyaW9kAWkBG2NsYWltUmV3YXJkRGV0YWlsZWRSRUFET05MWQEHYWRkcmVzcwQNJHQwMjA5ODIyMTA1NwkBEWNvbW1vbkNsYWltUmV3YXJkAgUHYWRkcmVzcwUEdW5pdAQHaWdub3JlZAgFDSR0MDIwOTgyMjEwNTcCXzEEC2Zyb21NYXRjaGVyCAUNJHQwMjA5ODIyMTA1NwJfMgQMZnJvbUVtaXNzaW9uCAUNJHQwMjA5ODIyMTA1NwJfMwkAlAoCBQNuaWwJALkJAgkAzAgCAgYlZCVkJWQJAMwIAgkApAMBCQBkAgULZnJvbU1hdGNoZXIFDGZyb21FbWlzc2lvbgkAzAgCCQCkAwEFC2Zyb21NYXRjaGVyCQDMCAIJAKQDAQUMZnJvbUVtaXNzaW9uBQNuaWwFA1NFUAFpASRjbGFpbVJld2FyZERldGFpbGVkUGFnaW5hdGVkUkVBRE9OTFkCB2FkZHJlc3MLc3RhcnRQZXJpb2QEDSR0MDIxMzUzMjE0NzAJARFjb21tb25DbGFpbVJld2FyZAIFB2FkZHJlc3MDCQBmAgAABQtzdGFydFBlcmlvZAUEdW5pdAULc3RhcnRQZXJpb2QEBnBlcmlvZAgFDSR0MDIxMzUzMjE0NzACXzEEC2Zyb21NYXRjaGVyCAUNJHQwMjEzNTMyMTQ3MAJfMgQMZnJvbUVtaXNzaW9uCAUNJHQwMjEzNTMyMTQ3MAJfMwkAlAoCBQNuaWwJAJQKAgkAuQkCCQDMCAICBiVkJWQlZAkAzAgCCQCkAwEJAGQCBQtmcm9tTWF0Y2hlcgUMZnJvbUVtaXNzaW9uCQDMCAIJAKQDAQULZnJvbU1hdGNoZXIJAMwIAgkApAMBBQxmcm9tRW1pc3Npb24FA25pbAUDU0VQBQZwZXJpb2QBaQEdbGF0ZXN0RmluYWxpemVkUGVyaW9kUkVBRE9OTFkBB2FkZHJlc3MJAJQKAgUDbmlsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ9rZXlMYXRlc3RQZXJpb2QAAP///////////wEBaQEhbGF0ZXN0RmluYWxpemVkUGVyaW9kSW5mb1JFQURPTkxZAQdhZGRyZXNzCQCUCgIFA25pbAkBDmdldFN0cmluZ0J5S2V5AQkBEWtleUxhc3RQYXlvdXRJbmZvAAFpARVjYWxjR3d4UGFyYW1zUkVBRE9OTFkDDmd3eEFtb3VudFN0YXJ0D2xvY2tTdGFydEhlaWdodBJsb2NrRHVyYXRpb25CbG9ja3MEDWxvY2tFbmRIZWlnaHQJAGQCBQ9sb2NrU3RhcnRIZWlnaHQFEmxvY2tEdXJhdGlvbkJsb2NrcwQMc2NhbGU4UGFyYW1LCQEBLQEJAGsDBQ5nd3hBbW91bnRTdGFydAUFU0NBTEUFEmxvY2tEdXJhdGlvbkJsb2NrcwQMc2NhbGU4UGFyYW1CCQBoAgkAawMFDmd3eEFtb3VudFN0YXJ0BQVTQ0FMRQUSbG9ja0R1cmF0aW9uQmxvY2tzBQ1sb2NrRW5kSGVpZ2h0CQCUCgIFA25pbAkAzAgCBQxzY2FsZThQYXJhbUsJAMwIAgUMc2NhbGU4UGFyYW1CCQDMCAIJAQpuZXh0UGVyaW9kAAUDbmlsAWkBGmNhbGNHd3hBbW91bnRTdGFydFJFQURPTkxZAwx3eExvY2tBbW91bnQMbG9ja0R1cmF0aW9uD21heExvY2tEdXJhdGlvbgQHY29lZmZYOAkAawMFDGxvY2tEdXJhdGlvbgUFTVVMVDgFD21heExvY2tEdXJhdGlvbgQOZ1d4QW1vdW50U3RhcnQJAGsDBQx3eExvY2tBbW91bnQFB2NvZWZmWDgFBU1VTFQ4CQCUCgIFA25pbAkAzAgCBQ5nV3hBbW91bnRTdGFydAUDbmlsAWkBC2NvbnN0cnVjdG9yBAx3eEFzc2V0SWRTdHIabWF0Y2hlclBhY2VtYWtlckFkZHJlc3NTdHIaYm9vc3RpbmdDb250cmFjdEFkZHJlc3NTdHIIbWF4RGVwdGgDCQECIT0CBQR0aGlzCAUBaQZjYWxsZXIJAAIBAg5ub3QgYXV0aG9yaXplZAkAzAgCCQELU3RyaW5nRW50cnkCCQEJa2V5Q29uZmlnAAkBDGZvcm1hdENvbmZpZwQFDHd4QXNzZXRJZFN0cgUabWF0Y2hlclBhY2VtYWtlckFkZHJlc3NTdHIFGmJvb3N0aW5nQ29udHJhY3RBZGRyZXNzU3RyBQhtYXhEZXB0aAUDbmlsAWkBDWNvbnN0cnVjdG9yVjIBDmZhY3RvcnlBZGRyZXNzAwkBAiE9AgUEdGhpcwgFAWkGY2FsbGVyCQACAQIObm90IGF1dGhvcml6ZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWtleUZhY3RvcnlBZGRyZXNzAAUOZmFjdG9yeUFkZHJlc3MFA25pbAFpAQ1jb25zdHJ1Y3RvclYzAQ9lbWlzc2lvbkFkZHJlc3MDCQECIT0CBQR0aGlzCAUBaQZjYWxsZXIJAAIBAg5ub3QgYXV0aG9yaXplZAQQaW5pdExhdGVzdFBlcmlvZAMJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAQ9rZXlMYXRlc3RQZXJpb2QABQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlMYXRlc3RQZXJpb2QAAP///////////wEFA25pbAkAzQgCBRBpbml0TGF0ZXN0UGVyaW9kCQELU3RyaW5nRW50cnkCCQESa2V5RW1pc3Npb25BZGRyZXNzAAUPZW1pc3Npb25BZGRyZXNzAWkBFW9uRW1pc3Npb25Gb3JHd3hTdGFydAADCQECIT0CCAUBaQZjYWxsZXIFD2ZhY3RvcnlDb250cmFjdAkAAgECEnBlcm1pc3Npb25zIGRlbmllZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBH2tleUd3eFJld2FyZEVtaXNzaW9uU3RhcnRIZWlnaHQABQZoZWlnaHQFA25pbAFpASNsYXRlc3RQZXJpb2RFbWlzc2lvblJld2FyZHNSRUFET05MWQEHYWRkcmVzcwQGcGVyaW9kCQEKbmV4dFBlcmlvZAAJAJQKAgUDbmlsCQDMCAIJAQ5nZXROdW1iZXJCeUtleQEJAR1rZXlBdXhFbWlzc2lvblJld2FyZEZvclBlcmlvZAEFBnBlcmlvZAUDbmlsAWkBBWNhbGNEBQt4MUJpZ0ludFN0cgt4MkJpZ0ludFN0cgxhbXBCaWdJbnRTdHITYVByZWNpc2lvbkJpZ0ludFN0chh0YXJnZXRQcmVjaXNpb25CaWdJbnRTdHIEBm5Db2lucwkAtgIBAAIECmFQcmVjaXNpb24JAKcDAQUTYVByZWNpc2lvbkJpZ0ludFN0cgQPdGFyZ2V0UHJlY2lzaW9uCQCnAwEFGHRhcmdldFByZWNpc2lvbkJpZ0ludFN0cgQCeDEJAKcDAQULeDFCaWdJbnRTdHIEAngyCQCnAwEFC3gyQmlnSW50U3RyBANhbXAJALkCAgkApwMBBQxhbXBCaWdJbnRTdHIFCmFQcmVjaXNpb24EAXMJALcCAgUCeDEFAngyAwkAAAIFAXMFCnplcm9CaWdJbnQJAJQKAgUDbmlsCQCmAwEFCnplcm9CaWdJbnQEA2FubgkAuQICBQNhbXAFBm5Db2lucwQDYXJyCQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwUDbmlsCgEEY2FsYwIDYWNjA2N1cgQNJHQwMjQ5NTkyNTE0OAUDYWNjBAFkCAUNJHQwMjQ5NTkyNTE0OAJfMQQFZFByZXYIBQ0kdDAyNDk1OTI1MTQ4Al8yBAJkcAkAugICCQC5AgIJALkCAgUBZAUBZAUBZAkAuQICCQC5AgIJALkCAgUCeDEFAngyBQZuQ29pbnMFBm5Db2lucwQFZE5leHQJALoCAgkAuQICCQC3AgIJALoCAgkAuQICBQNhbm4FAXMFCmFQcmVjaXNpb24JALkCAgUCZHAFBm5Db2lucwUBZAkAtwICCQC6AgIJALkCAgkAuAICBQNhbm4FCmFQcmVjaXNpb24FAWQFCmFQcmVjaXNpb24JALkCAgkAtwICBQZuQ29pbnMJALYCAQABBQJkcAkAlAoCBQVkTmV4dAUBZAQNJHQwMjUzNjEyNTQxMQoAAiRsBQNhcnIKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFAXMFBHVuaXQKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGNhbGMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDcJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwQFZE5leHQIBQ0kdDAyNTM2MTI1NDExAl8xBAVkUHJldggFDSR0MDI1MzYxMjU0MTECXzIEBWREaWZmCQEDYWJzAQkAuAICBQVkTmV4dAkBBXZhbHVlAQUFZFByZXYDCQDAAgIFD3RhcmdldFByZWNpc2lvbgUFZERpZmYJAJQKAgUDbmlsCQCmAwEFBWROZXh0CQACAQkArAICAh1EIGNhbGN1bGF0aW9uIGVycm9yLCBkRGlmZiA9IAkApgMBBQVkRGlmZgFpAQpzZXRNYW5hZ2VyARdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQQLY2hlY2tDYWxsZXIJAQttdXN0TWFuYWdlcgEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyBBVjaGVja01hbmFnZXJQdWJsaWNLZXkJANkEAQUXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkDCQAAAgUVY2hlY2tNYW5hZ2VyUHVibGljS2V5BRVjaGVja01hbmFnZXJQdWJsaWNLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAUXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5jb25maXJtTWFuYWdlcgAEAnBtCQEdcGVuZGluZ01hbmFnZXJQdWJsaWNLZXlPclVuaXQABAVoYXNQTQMJAQlpc0RlZmluZWQBBQJwbQYJAAIBAhJObyBwZW5kaW5nIG1hbmFnZXIDCQAAAgUFaGFzUE0FBWhhc1BNBAdjaGVja1BNAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQkBBXZhbHVlAQUCcG0GCQACAQIbWW91IGFyZSBub3QgcGVuZGluZyBtYW5hZ2VyAwkAAAIFB2NoZWNrUE0FB2NoZWNrUE0JAMwIAgkBC1N0cmluZ0VudHJ5AgkBE2tleU1hbmFnZXJQdWJsaWNLZXkACQDYBAEJAQV2YWx1ZQEFAnBtCQDMCAIJAQtEZWxldGVFbnRyeQEJARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAED3RhcmdldFB1YmxpY0tleQQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwBQJwawMJAAECBQckbWF0Y2gwAgRVbml0CAUCdHgPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFD3RhcmdldFB1YmxpY0tleYpHRLM=", "chainId": 84, "height": 2167017, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: aLSqKiHxtoT4rdT91jZAVZ3pSyjifCEEgVfR77CxoUu Next: 9rLwGED59tdymuYLAbVXxJwupzQpEqdMW6uLfMLLVeVb Diff:
OldNewDifferences
329329
330330
331331 @Callable(i)
332+func updateReferralActivity (userAddress,gWxAmountStart) = {
333+ let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
334+ let activeReferralInv = if ((referrer == unit))
335+ then unit
336+ else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (gWxAmountStart >= referralMinGWxAmount)], nil)
337+ if ((activeReferralInv == activeReferralInv))
338+ then $Tuple2(nil, unit)
339+ else throw("Strict value is not equal to itself.")
340+ }
341+
342+
343+
344+@Callable(i)
332345 func finalizeHelper () = {
333346 let processingStage = valueOrElse(getInteger(keyProcessingStage()), processingStageTotal)
334347 let currentPeriod = getNumberByKey(keyNextProcessedPeriod())
342355 then $Tuple2(nil, false)
343356 else if ((processingStage == processingStageTotal))
344357 then {
345- let $t01368513801 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
346- let userWeight = $t01368513801._1
347- let userActions = $t01368513801._2
358+ let $t01409514211 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
359+ let userWeight = $t01409514211._1
360+ let userActions = $t01409514211._2
348361 let totalWeightNew = (totalWeight + userWeight)
349362 let processingActions = if (((usersCount - 1) > currentUser))
350363 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
457470 @Callable(i)
458471 func claimReward () = {
459472 let address = toString(i.caller)
460- let $t01933519461 = commonClaimReward(address, unit)
461- let period = $t01933519461._1
462- let amountFromMatcher = $t01933519461._2
463- let amountFromEmission = $t01933519461._3
464- let userIdx = $t01933519461._4
465- let cfgArray = $t01933519461._5
466- let nextProcessedPeriod = $t01933519461._6
473+ let $t01974519871 = commonClaimReward(address, unit)
474+ let period = $t01974519871._1
475+ let amountFromMatcher = $t01974519871._2
476+ let amountFromEmission = $t01974519871._3
477+ let userIdx = $t01974519871._4
478+ let cfgArray = $t01974519871._5
479+ let nextProcessedPeriod = $t01974519871._6
467480 $Tuple2([IntegerEntry(keyNextUnlaimedPeriodOfUser(userIdx), period), ScriptTransfer(i.caller, (amountFromMatcher + amountFromEmission), fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, amountFromMatcher, amountFromEmission, period, nextProcessedPeriod, i)], [amountFromMatcher, amountFromEmission])
468481 }
469482
480493
481494 @Callable(i)
482495 func claimRewardPaginatedREADONLY (address,startPeriod) = {
483- let $t02020420321 = commonClaimReward(address, if ((0 > startPeriod))
496+ let $t02061420731 = commonClaimReward(address, if ((0 > startPeriod))
484497 then unit
485498 else startPeriod)
486- let period = $t02020420321._1
487- let fromMatcher = $t02020420321._2
488- let fromEmission = $t02020420321._3
499+ let period = $t02061420731._1
500+ let fromMatcher = $t02061420731._2
501+ let fromEmission = $t02061420731._3
489502 let amount = (fromMatcher + fromEmission)
490503 $Tuple2(nil, $Tuple2(amount, period))
491504 }
494507
495508 @Callable(i)
496509 func claimRewardDetailedREADONLY (address) = {
497- let $t02057220647 = commonClaimReward(address, unit)
498- let ignored = $t02057220647._1
499- let fromMatcher = $t02057220647._2
500- let fromEmission = $t02057220647._3
510+ let $t02098221057 = commonClaimReward(address, unit)
511+ let ignored = $t02098221057._1
512+ let fromMatcher = $t02098221057._2
513+ let fromEmission = $t02098221057._3
501514 $Tuple2(nil, makeString(["%d%d%d", toString((fromMatcher + fromEmission)), toString(fromMatcher), toString(fromEmission)], SEP))
502515 }
503516
505518
506519 @Callable(i)
507520 func claimRewardDetailedPaginatedREADONLY (address,startPeriod) = {
508- let $t02094321060 = commonClaimReward(address, if ((0 > startPeriod))
521+ let $t02135321470 = commonClaimReward(address, if ((0 > startPeriod))
509522 then unit
510523 else startPeriod)
511- let period = $t02094321060._1
512- let fromMatcher = $t02094321060._2
513- let fromEmission = $t02094321060._3
524+ let period = $t02135321470._1
525+ let fromMatcher = $t02135321470._2
526+ let fromEmission = $t02135321470._3
514527 $Tuple2(nil, $Tuple2(makeString(["%d%d%d", toString((fromMatcher + fromEmission)), toString(fromMatcher), toString(fromEmission)], SEP), period))
515528 }
516529
601614 let ann = (amp * nCoins)
602615 let arr = [1, 2, 3, 4, 5, 6, 7]
603616 func calc (acc,cur) = {
604- let $t02454924738 = acc
605- let d = $t02454924738._1
606- let dPrev = $t02454924738._2
617+ let $t02495925148 = acc
618+ let d = $t02495925148._1
619+ let dPrev = $t02495925148._2
607620 let dp = (((d * d) * d) / (((x1 * x2) * nCoins) * nCoins))
608621 let dNext = (((((ann * s) / aPrecision) + (dp * nCoins)) * d) / ((((ann - aPrecision) * d) / aPrecision) + ((nCoins + toBigInt(1)) * dp)))
609622 $Tuple2(dNext, d)
610623 }
611624
612- let $t02495125001 = {
625+ let $t02536125411 = {
613626 let $l = arr
614627 let $s = size($l)
615628 let $acc0 = $Tuple2(s, unit)
623636
624637 $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)
625638 }
626- let dNext = $t02495125001._1
627- let dPrev = $t02495125001._2
639+ let dNext = $t02536125411._1
640+ let dPrev = $t02536125411._2
628641 let dDiff = abs((dNext - value(dPrev)))
629642 if ((targetPrecision >= dDiff))
630643 then $Tuple2(nil, toString(dNext))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let USERDEPTH = 26
77
88 let SCALE = 1000
99
1010 let MULT8 = 100000000
1111
1212 let zeroBigInt = toBigInt(0)
1313
1414 let processingStageTotal = 0
1515
1616 let processingStageShares = 1
1717
1818 func getNumberByKey (key) = valueOrElse(getInteger(this, key), 0)
1919
2020
2121 func getNumberOrFail (key) = valueOrErrorMessage(getInteger(this, key), (("mandatory this." + key) + " is not defined"))
2222
2323
2424 func getStringByKey (key) = valueOrElse(getString(this, key), "")
2525
2626
2727 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (("mandatory this." + key) + " is not defined"))
2828
2929
3030 func abs (val) = if ((zeroBigInt > val))
3131 then -(val)
3232 else val
3333
3434
3535 let keyMaxDepth = "%s__maxDepth"
3636
3737 let maxDepthDefault = 30
3838
3939 let maxDepth = valueOrElse(getInteger(this, keyMaxDepth), maxDepthDefault)
4040
4141 func keyFactoryAddress () = "%s%s__config__factoryAddress"
4242
4343
4444 let factoryAddressStr = getStringOrFail(keyFactoryAddress())
4545
4646 let factoryContract = addressFromStringValue(factoryAddressStr)
4747
4848 func keyEmissionAddress () = "%s%s__config__emissionAddress"
4949
5050
5151 func keyNumToUserMapping (num) = makeString(["%s%s%s", "mapping", "num2user", toString(num)], SEP)
5252
5353
5454 let keyReferralProgramName = makeString(["%s%s", "referral", "programName"], SEP)
5555
5656 let referralProgramNameDefault = "wxlock"
5757
5858 let referralProgramName = valueOrElse(getString(this, keyReferralProgramName), referralProgramNameDefault)
5959
6060 let keyReferralMinGWxAmount = makeString(["%s%s", "referral", "minGWxAmount"], SEP)
6161
6262 let referralMinGWxAmountDefault = (500 * MULT8)
6363
6464 let referralMinGWxAmount = valueOrElse(getInteger(this, keyReferralMinGWxAmount), referralMinGWxAmountDefault)
6565
6666 let keyReferrerRewardPermille = makeString(["%s%s", "referral", "referrerRewardPermille"], SEP)
6767
6868 let referrerRewardPermilleDefault = 50
6969
7070 let referrerRewardPermille = valueOrElse(getInteger(this, keyReferrerRewardPermille), referrerRewardPermilleDefault)
7171
7272 let keyReferralRewardPermille = makeString(["%s%s", "referral", "referralRewardPermille"], SEP)
7373
7474 let referralRewardPermilleDefault = 50
7575
7676 let referralRewardPermille = valueOrElse(getInteger(this, keyReferralRewardPermille), referralRewardPermilleDefault)
7777
7878 func keyReferrer (referralAddress) = makeString(["%s%s%s", "referrer", referralProgramName, referralAddress], SEP)
7979
8080
8181 let emissionAddressStr = getStringOrFail(keyEmissionAddress())
8282
8383 let emissionContract = addressFromStringValue(emissionAddressStr)
8484
8585 let IdxCfgAssetId = 1
8686
8787 let IdxCfgPacemakerAddress = 2
8888
8989 let IdxCfgBoostingContract = 3
9090
9191 let IdxCfgMaxDepth = 4
9292
9393 func keyConfig () = "%s__config"
9494
9595
9696 func readConfigArrayOrFail () = split(getStringOrFail(keyConfig()), SEP)
9797
9898
9999 func formatConfig (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr,maxDepth) = makeString(["%s%s%s%d", wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr, toString(maxDepth)], SEP)
100100
101101
102102 func boostingContractOrFail () = {
103103 let cfgArray = readConfigArrayOrFail()
104104 valueOrErrorMessage(addressFromString(cfgArray[IdxCfgBoostingContract]), "boosting contract address is not defined")
105105 }
106106
107107
108108 func keyGwxRewardEmissionStartHeight () = "%s%s__gwxRewardEmissionPart__startHeight"
109109
110110
111111 func keyUsersCount () = "%s__nextUserNum"
112112
113113
114114 func keyRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
115115
116116
117117 func keyPoolWeightVirtual () = "%s%s__poolWeight__GWXvirtualPOOL"
118118
119119
120120 func keyNextProcessedUser () = "%s__nextProcessedUser"
121121
122122
123123 func keyLatestPeriod () = "%s__latestPeriod"
124124
125125
126126 func keyNextPeriod () = "%s__nextPeriod"
127127
128128
129129 func keyProcessingStage () = "%s__processingStage"
130130
131131
132132 func keyNextProcessedPeriod () = "%s__nextProcessedPeriod"
133133
134134
135135 func keyNextUnlaimedPeriodOfUser (userIndex) = makeString(["%s%d__nextClaimedPeriod", toString(userIndex)], SEP)
136136
137137
138138 func keyLastProcessedPeriodOfUser (userIndex) = makeString(["%s%d__lastProcessedPeriod", toString(userIndex)], SEP)
139139
140140
141141 func keyHeightForPeriod (period) = makeString(["%s%d__startHeightForPeriod", toString(period)], SEP)
142142
143143
144144 func keyAuxEmissionRewardForPeriod (period) = makeString(["%s%d__auxEmissionReward", toString(period)], SEP)
145145
146146
147147 func keyTotalAmountForPeriod (period) = makeString(["%s%d__totalAmountForPeriod", toString(period)], SEP)
148148
149149
150150 func keyLastPayoutInfo () = "%s__lastPayoutInfo"
151151
152152
153153 func PeriodPayoutInfo (period,matcherReward,emissionReward) = makeString(["%d%d%d", toString(period), toString(matcherReward), toString(emissionReward)], SEP)
154154
155155
156156 func keyPayoutHistoryInfo (period) = makeString(["%s%s%d__payouts__history", toString(period)], SEP)
157157
158158
159159 func keyTotalWeightForPeriod (period) = makeString(["%s%d__totalWeightForPeriod", toString(period)], SEP)
160160
161161
162162 func keyUserKValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "k", toString(period)], SEP)
163163
164164
165165 func keyUserBValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "b", toString(period)], SEP)
166166
167167
168168 func keyUserWeightForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "weight", toString(period)], SEP)
169169
170170
171171 func keyReferralsContractAddress () = makeString(["%s%s", "config", "referralsContractAddress"], SEP)
172172
173173
174174 let referralsContractAddressOrFail = addressFromStringValue(getStringOrFail(keyReferralsContractAddress()))
175175
176176 func HistoryEntry (type,user,amountFromMatcher,amountFromEmission,currentPeriod,latestPeriod,i) = {
177177 let historyKEY = makeString(["%s%s%s%s__history", type, user, toBase58String(i.transactionId)], SEP)
178178 let historyDATA = makeString(["%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amountFromMatcher), toString(amountFromEmission), toString(currentPeriod), toString(latestPeriod)], SEP)
179179 StringEntry(historyKEY, historyDATA)
180180 }
181181
182182
183183 func keyManagerPublicKey () = "%s__managerPublicKey"
184184
185185
186186 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
187187
188188
189189 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
190190 case s: String =>
191191 fromBase58String(s)
192192 case _: Unit =>
193193 unit
194194 case _ =>
195195 throw("Match error")
196196 }
197197
198198
199199 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
200200 case s: String =>
201201 fromBase58String(s)
202202 case _: Unit =>
203203 unit
204204 case _ =>
205205 throw("Match error")
206206 }
207207
208208
209209 func mustManager (i) = {
210210 let pd = throw("Permission denied")
211211 match managerPublicKeyOrUnit() {
212212 case pk: ByteVector =>
213213 if ((i.callerPublicKey == pk))
214214 then true
215215 else pd
216216 case _: Unit =>
217217 if ((i.caller == this))
218218 then true
219219 else pd
220220 case _ =>
221221 throw("Match error")
222222 }
223223 }
224224
225225
226226 func calcUserWeight (boostingContractAddress,heightForPeriod,period,userIndex) = {
227227 let kLast = keyLastProcessedPeriodOfUser(userIndex)
228228 let kKey = keyUserKValueForPeriod(period, userIndex)
229229 let kRaw = getInteger(boostingContractAddress, kKey)
230230 let kUserWeight = keyUserWeightForPeriod(period, userIndex)
231231 if (isDefined(kRaw))
232232 then {
233233 let k = value(kRaw)
234234 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(period, userIndex)))
235235 let w = ((k * heightForPeriod) + b)
236236 if ((w > 0))
237237 then $Tuple2((w / SCALE), [IntegerEntry(kLast, period), IntegerEntry(kUserWeight, w)])
238238 else $Tuple2(0, nil)
239239 }
240240 else {
241241 let p = getInteger(this, kLast)
242242 if (if (isDefined(p))
243243 then (period >= value(p))
244244 else false)
245245 then {
246246 let pv = value(p)
247247 let k = value(getInteger(boostingContractAddress, keyUserKValueForPeriod(pv, userIndex)))
248248 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(pv, userIndex)))
249249 let w = ((k * heightForPeriod) + b)
250250 if ((w > 0))
251251 then $Tuple2((w / SCALE), [IntegerEntry(kUserWeight, w)])
252252 else $Tuple2(0, nil)
253253 }
254254 else $Tuple2(0, nil)
255255 }
256256 }
257257
258258
259259 func calcUserWeightForClaim (boostingContractAddress,heightForPeriod,period,userIndex) = {
260260 let kUserWeight = keyUserWeightForPeriod(period, userIndex)
261261 let userWeightOrUnit = getInteger(kUserWeight)
262262 match userWeightOrUnit {
263263 case _: Unit =>
264264 0
265265 case w: Int =>
266266 (w / SCALE)
267267 case _ =>
268268 throw("Match error")
269269 }
270270 }
271271
272272
273273 func getUserIndexByAddress (boostingContractAddressStr,userAddress) = {
274274 let key = makeString(["%s%s%s", "mapping", "user2num", userAddress], SEP)
275275 parseIntValue(valueOrErrorMessage(getString(Address(fromBase58String(boostingContractAddressStr)), key), ((("User address " + userAddress) + " is not found in boosting contract data, key=") + key)))
276276 }
277277
278278
279279 func nextPeriod () = getNumberByKey(keyNextPeriod())
280280
281281
282282 func invokeClaim (boostingContract,period,user,depth,totalFromMatcher,totalFromEmission) = {
283283 let result = invoke(this, "claimNextBatch", [boostingContract, period, user, depth, totalFromMatcher, totalFromEmission], nil)
284284 if ((result == result))
285285 then match result {
286286 case r: (Int, Int, Int) =>
287287 r
288288 case _ =>
289289 throw("Incorrect invoke result")
290290 }
291291 else throw("Strict value is not equal to itself.")
292292 }
293293
294294
295295 func claimInternal (boostingContract,currentPeriod,currentUser,depth,userAccumulatedMatcher,userAccumulatedEmission) = {
296296 let boostingContractAddress = Address(boostingContract)
297297 let latestPeriod = getNumberByKey(keyNextProcessedPeriod())
298298 let totalWeight = getNumberByKey(keyTotalWeightForPeriod(currentPeriod))
299299 let heightForPeriod = getNumberByKey(keyHeightForPeriod(currentPeriod))
300300 let userWeight = calcUserWeightForClaim(boostingContractAddress, heightForPeriod, currentPeriod, currentUser)
301301 let userAmountMatcherForPeriod = fraction(getNumberByKey(keyTotalAmountForPeriod(currentPeriod)), userWeight, totalWeight)
302302 let userAmountEmissionForPeriod = fraction(getNumberByKey(keyAuxEmissionRewardForPeriod(currentPeriod)), userWeight, totalWeight)
303303 if (if ((0 >= depth))
304304 then true
305305 else ((currentPeriod + 1) >= latestPeriod))
306306 then $Tuple3((currentPeriod + 1), (userAccumulatedMatcher + userAmountMatcherForPeriod), (userAccumulatedEmission + userAmountEmissionForPeriod))
307307 else invokeClaim(boostingContract, (currentPeriod + 1), currentUser, (depth - 1), (userAccumulatedMatcher + userAmountMatcherForPeriod), (userAccumulatedEmission + userAmountEmissionForPeriod))
308308 }
309309
310310
311311 func commonClaimReward (userAddress,startPeriod) = {
312312 let cfgArray = readConfigArrayOrFail()
313313 let userIdx = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddress)
314314 let currentPeriod = if ((startPeriod != unit))
315315 then value(startPeriod)
316316 else getNumberByKey(keyNextUnlaimedPeriodOfUser(userIdx))
317317 let nextProcessedPeriod = getNumberByKey(keyNextProcessedPeriod())
318318 if ((currentPeriod >= nextProcessedPeriod))
319319 then throw("Nothing to claim")
320320 else {
321321 let boostingContract = fromBase58String(cfgArray[IdxCfgBoostingContract])
322322 let $t01256912695 = claimInternal(boostingContract, currentPeriod, userIdx, USERDEPTH, 0, 0)
323323 let period = $t01256912695._1
324324 let amountFromMatcher = $t01256912695._2
325325 let amountFromEmission = $t01256912695._3
326326 $Tuple6(period, amountFromMatcher, amountFromEmission, userIdx, cfgArray, nextProcessedPeriod)
327327 }
328328 }
329329
330330
331331 @Callable(i)
332+func updateReferralActivity (userAddress,gWxAmountStart) = {
333+ let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
334+ let activeReferralInv = if ((referrer == unit))
335+ then unit
336+ else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (gWxAmountStart >= referralMinGWxAmount)], nil)
337+ if ((activeReferralInv == activeReferralInv))
338+ then $Tuple2(nil, unit)
339+ else throw("Strict value is not equal to itself.")
340+ }
341+
342+
343+
344+@Callable(i)
332345 func finalizeHelper () = {
333346 let processingStage = valueOrElse(getInteger(keyProcessingStage()), processingStageTotal)
334347 let currentPeriod = getNumberByKey(keyNextProcessedPeriod())
335348 let currentUser = getNumberByKey(keyNextProcessedUser())
336349 let latestPeriod = getNumberByKey(keyLatestPeriod())
337350 let usersCount = valueOrElse(getInteger(boostingContractOrFail(), keyUsersCount()), 0)
338351 let totalWeightKey = keyTotalWeightForPeriod(currentPeriod)
339352 let totalWeight = getNumberByKey(keyTotalWeightForPeriod(currentPeriod))
340353 let heightForPeriod = getNumberByKey(keyHeightForPeriod(currentPeriod))
341354 if ((currentPeriod > latestPeriod))
342355 then $Tuple2(nil, false)
343356 else if ((processingStage == processingStageTotal))
344357 then {
345- let $t01368513801 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
346- let userWeight = $t01368513801._1
347- let userActions = $t01368513801._2
358+ let $t01409514211 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
359+ let userWeight = $t01409514211._1
360+ let userActions = $t01409514211._2
348361 let totalWeightNew = (totalWeight + userWeight)
349362 let processingActions = if (((usersCount - 1) > currentUser))
350363 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
351364 else [IntegerEntry(keyProcessingStage(), processingStageShares), IntegerEntry(keyNextProcessedUser(), 0)]
352365 $Tuple2((([IntegerEntry(totalWeightKey, totalWeightNew)] ++ processingActions) ++ userActions), true)
353366 }
354367 else if ((processingStage == processingStageShares))
355368 then {
356369 let userWeight = calcUserWeightForClaim(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
357370 let userAmountMatcherForPeriod = fraction(getNumberByKey(keyTotalAmountForPeriod(currentPeriod)), userWeight, totalWeight)
358371 let userAmountEmissionForPeriod = fraction(getNumberByKey(keyAuxEmissionRewardForPeriod(currentPeriod)), userWeight, totalWeight)
359372 let userTotalAmount = (userAmountEmissionForPeriod + userAmountMatcherForPeriod)
360373 let userAddress = getStringValue(boostingContractOrFail(), keyNumToUserMapping(currentUser))
361374 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
362375 let activeReferralInv = if ((referrer == unit))
363376 then unit
364377 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (userWeight >= referralMinGWxAmount)], nil)
365378 if ((activeReferralInv == activeReferralInv))
366379 then {
367380 let referralInv = if (if ((referrer == unit))
368381 then true
369382 else (referralMinGWxAmount > userWeight))
370383 then unit
371384 else {
372385 let referrerReward = fraction(userTotalAmount, referrerRewardPermille, SCALE)
373386 let referralReward = fraction(userTotalAmount, referralRewardPermille, SCALE)
374387 invoke(referralsContractAddressOrFail, "incUnclaimed", [referralProgramName, userAddress, referrerReward, referralReward], nil)
375388 }
376389 if ((referralInv == referralInv))
377390 then {
378391 let processingActions = if (((usersCount - 1) > currentUser))
379392 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
380393 else [IntegerEntry(keyNextProcessedPeriod(), (currentPeriod + 1)), IntegerEntry(keyNextProcessedUser(), 0), DeleteEntry(keyProcessingStage())]
381394 $Tuple2(processingActions, true)
382395 }
383396 else throw("Strict value is not equal to itself.")
384397 }
385398 else throw("Strict value is not equal to itself.")
386399 }
387400 else throw("invalid processing stage")
388401 }
389402
390403
391404
392405 @Callable(i)
393406 func finalizeWrapper (counter) = {
394407 let result = {
395408 let @ = invoke(this, "finalizeHelper", nil, nil)
396409 if ($isInstanceOf(@, "Boolean"))
397410 then @
398411 else throw(($getType(invoke(this, "finalizeHelper", nil, nil)) + " couldn't be cast to Boolean"))
399412 }
400413 if ((result == result))
401414 then if (!(result))
402415 then if ((counter == maxDepth))
403416 then throw("Nothing to process")
404417 else $Tuple2(nil, unit)
405418 else if ((counter > 0))
406419 then $Tuple2(nil, invoke(this, "finalizeWrapper", [(counter - 1)], nil))
407420 else $Tuple2(nil, unit)
408421 else throw("Strict value is not equal to itself.")
409422 }
410423
411424
412425
413426 @Callable(i)
414427 func processPendingPeriodsAndUsers () = $Tuple2(nil, invoke(this, "finalizeWrapper", [maxDepth], nil))
415428
416429
417430
418431 @Callable(i)
419432 func deposit () = {
420433 let cfgArray = readConfigArrayOrFail()
421434 if ((i.caller != Address(fromBase58String(cfgArray[IdxCfgPacemakerAddress]))))
422435 then throw("Wrong caller address")
423436 else {
424437 let assetId = value(value(i.payments[0]).assetId)
425438 if ((assetId != fromBase58String(cfgArray[IdxCfgAssetId])))
426439 then throw("Wrong payment asset")
427440 else {
428441 let period = nextPeriod()
429442 let deltaH = (height - getNumberOrFail(keyGwxRewardEmissionStartHeight()))
430443 let emissionRate = valueOrErrorMessage(getInteger(emissionContract, keyRatePerBlockCurrent()), (("mandatory emission_contract." + keyRatePerBlockCurrent()) + " is not defined"))
431444 let weight = valueOrErrorMessage(getInteger(factoryContract, keyPoolWeightVirtual()), (("mandatory factory_contract." + keyPoolWeightVirtual()) + " is not defined"))
432445 let auxAmount = fraction((deltaH * weight), emissionRate, MULT8)
433446 let em = invoke(emissionContract, "emit", [auxAmount], nil)
434447 if ((em == em))
435448 then {
436449 let matcherPart = value(i.payments[0]).amount
437450 let payoutInfo = PeriodPayoutInfo(period, matcherPart, auxAmount)
438451 [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)]
439452 }
440453 else throw("Strict value is not equal to itself.")
441454 }
442455 }
443456 }
444457
445458
446459
447460 @Callable(i)
448461 func claimNextBatch (boostingContract,currentPeriod,currentUser,depth,totalFromMatcher,totalFromEmission) = if ((i.caller != this))
449462 then throw("Should be called by this script only")
450463 else {
451464 let periodAndTotals = claimInternal(boostingContract, currentPeriod, currentUser, depth, totalFromMatcher, totalFromEmission)
452465 $Tuple2(nil, periodAndTotals)
453466 }
454467
455468
456469
457470 @Callable(i)
458471 func claimReward () = {
459472 let address = toString(i.caller)
460- let $t01933519461 = commonClaimReward(address, unit)
461- let period = $t01933519461._1
462- let amountFromMatcher = $t01933519461._2
463- let amountFromEmission = $t01933519461._3
464- let userIdx = $t01933519461._4
465- let cfgArray = $t01933519461._5
466- let nextProcessedPeriod = $t01933519461._6
473+ let $t01974519871 = commonClaimReward(address, unit)
474+ let period = $t01974519871._1
475+ let amountFromMatcher = $t01974519871._2
476+ let amountFromEmission = $t01974519871._3
477+ let userIdx = $t01974519871._4
478+ let cfgArray = $t01974519871._5
479+ let nextProcessedPeriod = $t01974519871._6
467480 $Tuple2([IntegerEntry(keyNextUnlaimedPeriodOfUser(userIdx), period), ScriptTransfer(i.caller, (amountFromMatcher + amountFromEmission), fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, amountFromMatcher, amountFromEmission, period, nextProcessedPeriod, i)], [amountFromMatcher, amountFromEmission])
468481 }
469482
470483
471484
472485 @Callable(i)
473486 func claimRewardREADONLY (address) = {
474487 let claimResults = commonClaimReward(address, unit)
475488 let amount = (claimResults._2 + claimResults._3)
476489 $Tuple2(nil, amount)
477490 }
478491
479492
480493
481494 @Callable(i)
482495 func claimRewardPaginatedREADONLY (address,startPeriod) = {
483- let $t02020420321 = commonClaimReward(address, if ((0 > startPeriod))
496+ let $t02061420731 = commonClaimReward(address, if ((0 > startPeriod))
484497 then unit
485498 else startPeriod)
486- let period = $t02020420321._1
487- let fromMatcher = $t02020420321._2
488- let fromEmission = $t02020420321._3
499+ let period = $t02061420731._1
500+ let fromMatcher = $t02061420731._2
501+ let fromEmission = $t02061420731._3
489502 let amount = (fromMatcher + fromEmission)
490503 $Tuple2(nil, $Tuple2(amount, period))
491504 }
492505
493506
494507
495508 @Callable(i)
496509 func claimRewardDetailedREADONLY (address) = {
497- let $t02057220647 = commonClaimReward(address, unit)
498- let ignored = $t02057220647._1
499- let fromMatcher = $t02057220647._2
500- let fromEmission = $t02057220647._3
510+ let $t02098221057 = commonClaimReward(address, unit)
511+ let ignored = $t02098221057._1
512+ let fromMatcher = $t02098221057._2
513+ let fromEmission = $t02098221057._3
501514 $Tuple2(nil, makeString(["%d%d%d", toString((fromMatcher + fromEmission)), toString(fromMatcher), toString(fromEmission)], SEP))
502515 }
503516
504517
505518
506519 @Callable(i)
507520 func claimRewardDetailedPaginatedREADONLY (address,startPeriod) = {
508- let $t02094321060 = commonClaimReward(address, if ((0 > startPeriod))
521+ let $t02135321470 = commonClaimReward(address, if ((0 > startPeriod))
509522 then unit
510523 else startPeriod)
511- let period = $t02094321060._1
512- let fromMatcher = $t02094321060._2
513- let fromEmission = $t02094321060._3
524+ let period = $t02135321470._1
525+ let fromMatcher = $t02135321470._2
526+ let fromEmission = $t02135321470._3
514527 $Tuple2(nil, $Tuple2(makeString(["%d%d%d", toString((fromMatcher + fromEmission)), toString(fromMatcher), toString(fromEmission)], SEP), period))
515528 }
516529
517530
518531
519532 @Callable(i)
520533 func latestFinalizedPeriodREADONLY (address) = $Tuple2(nil, valueOrElse(getInteger(this, keyLatestPeriod()), -1))
521534
522535
523536
524537 @Callable(i)
525538 func latestFinalizedPeriodInfoREADONLY (address) = $Tuple2(nil, getStringByKey(keyLastPayoutInfo()))
526539
527540
528541
529542 @Callable(i)
530543 func calcGwxParamsREADONLY (gwxAmountStart,lockStartHeight,lockDurationBlocks) = {
531544 let lockEndHeight = (lockStartHeight + lockDurationBlocks)
532545 let scale8ParamK = -(fraction(gwxAmountStart, SCALE, lockDurationBlocks))
533546 let scale8ParamB = (fraction(gwxAmountStart, SCALE, lockDurationBlocks) * lockEndHeight)
534547 $Tuple2(nil, [scale8ParamK, scale8ParamB, nextPeriod()])
535548 }
536549
537550
538551
539552 @Callable(i)
540553 func calcGwxAmountStartREADONLY (wxLockAmount,lockDuration,maxLockDuration) = {
541554 let coeffX8 = fraction(lockDuration, MULT8, maxLockDuration)
542555 let gWxAmountStart = fraction(wxLockAmount, coeffX8, MULT8)
543556 $Tuple2(nil, [gWxAmountStart])
544557 }
545558
546559
547560
548561 @Callable(i)
549562 func constructor (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr,maxDepth) = if ((this != i.caller))
550563 then throw("not authorized")
551564 else [StringEntry(keyConfig(), formatConfig(wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr, maxDepth))]
552565
553566
554567
555568 @Callable(i)
556569 func constructorV2 (factoryAddress) = if ((this != i.caller))
557570 then throw("not authorized")
558571 else [StringEntry(keyFactoryAddress(), factoryAddress)]
559572
560573
561574
562575 @Callable(i)
563576 func constructorV3 (emissionAddress) = if ((this != i.caller))
564577 then throw("not authorized")
565578 else {
566579 let initLatestPeriod = if (isDefined(getInteger(this, keyLatestPeriod())))
567580 then nil
568581 else [IntegerEntry(keyLatestPeriod(), -1)]
569582 (initLatestPeriod :+ StringEntry(keyEmissionAddress(), emissionAddress))
570583 }
571584
572585
573586
574587 @Callable(i)
575588 func onEmissionForGwxStart () = if ((i.caller != factoryContract))
576589 then throw("permissions denied")
577590 else [IntegerEntry(keyGwxRewardEmissionStartHeight(), height)]
578591
579592
580593
581594 @Callable(i)
582595 func latestPeriodEmissionRewardsREADONLY (address) = {
583596 let period = nextPeriod()
584597 $Tuple2(nil, [getNumberByKey(keyAuxEmissionRewardForPeriod(period))])
585598 }
586599
587600
588601
589602 @Callable(i)
590603 func calcD (x1BigIntStr,x2BigIntStr,ampBigIntStr,aPrecisionBigIntStr,targetPrecisionBigIntStr) = {
591604 let nCoins = toBigInt(2)
592605 let aPrecision = parseBigIntValue(aPrecisionBigIntStr)
593606 let targetPrecision = parseBigIntValue(targetPrecisionBigIntStr)
594607 let x1 = parseBigIntValue(x1BigIntStr)
595608 let x2 = parseBigIntValue(x2BigIntStr)
596609 let amp = (parseBigIntValue(ampBigIntStr) * aPrecision)
597610 let s = (x1 + x2)
598611 if ((s == zeroBigInt))
599612 then $Tuple2(nil, toString(zeroBigInt))
600613 else {
601614 let ann = (amp * nCoins)
602615 let arr = [1, 2, 3, 4, 5, 6, 7]
603616 func calc (acc,cur) = {
604- let $t02454924738 = acc
605- let d = $t02454924738._1
606- let dPrev = $t02454924738._2
617+ let $t02495925148 = acc
618+ let d = $t02495925148._1
619+ let dPrev = $t02495925148._2
607620 let dp = (((d * d) * d) / (((x1 * x2) * nCoins) * nCoins))
608621 let dNext = (((((ann * s) / aPrecision) + (dp * nCoins)) * d) / ((((ann - aPrecision) * d) / aPrecision) + ((nCoins + toBigInt(1)) * dp)))
609622 $Tuple2(dNext, d)
610623 }
611624
612- let $t02495125001 = {
625+ let $t02536125411 = {
613626 let $l = arr
614627 let $s = size($l)
615628 let $acc0 = $Tuple2(s, unit)
616629 func $f0_1 ($a,$i) = if (($i >= $s))
617630 then $a
618631 else calc($a, $l[$i])
619632
620633 func $f0_2 ($a,$i) = if (($i >= $s))
621634 then $a
622635 else throw("List size exceeds 7")
623636
624637 $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)
625638 }
626- let dNext = $t02495125001._1
627- let dPrev = $t02495125001._2
639+ let dNext = $t02536125411._1
640+ let dPrev = $t02536125411._2
628641 let dDiff = abs((dNext - value(dPrev)))
629642 if ((targetPrecision >= dDiff))
630643 then $Tuple2(nil, toString(dNext))
631644 else throw(("D calculation error, dDiff = " + toString(dDiff)))
632645 }
633646 }
634647
635648
636649
637650 @Callable(i)
638651 func setManager (pendingManagerPublicKey) = {
639652 let checkCaller = mustManager(i)
640653 if ((checkCaller == checkCaller))
641654 then {
642655 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
643656 if ((checkManagerPublicKey == checkManagerPublicKey))
644657 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
645658 else throw("Strict value is not equal to itself.")
646659 }
647660 else throw("Strict value is not equal to itself.")
648661 }
649662
650663
651664
652665 @Callable(i)
653666 func confirmManager () = {
654667 let pm = pendingManagerPublicKeyOrUnit()
655668 let hasPM = if (isDefined(pm))
656669 then true
657670 else throw("No pending manager")
658671 if ((hasPM == hasPM))
659672 then {
660673 let checkPM = if ((i.callerPublicKey == value(pm)))
661674 then true
662675 else throw("You are not pending manager")
663676 if ((checkPM == checkPM))
664677 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
665678 else throw("Strict value is not equal to itself.")
666679 }
667680 else throw("Strict value is not equal to itself.")
668681 }
669682
670683
671684 @Verifier(tx)
672685 func verify () = {
673686 let targetPublicKey = match managerPublicKeyOrUnit() {
674687 case pk: ByteVector =>
675688 pk
676689 case _: Unit =>
677690 tx.senderPublicKey
678691 case _ =>
679692 throw("Match error")
680693 }
681694 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
682695 }
683696

github/deemru/w8io/169f3d6 
88.07 ms