tx · Pr2nisUmQ8kLQGRWyjbeyFkopZv25fP1fvvBhFXb9Gf

3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE:  -0.02500000 Waves

2022.07.26 16:34 [2156832] smart account 3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE > SELF 0.00000000 Waves

{ "type": 13, "id": "Pr2nisUmQ8kLQGRWyjbeyFkopZv25fP1fvvBhFXb9Gf", "fee": 2500000, "feeAssetId": null, "timestamp": 1658842477404, "version": 1, "sender": "3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE", "senderPublicKey": "G349Uq3FTox7dRNLeAfAQeoACvwZ9iEnVSaHcEYn6j8J", "proofs": [ "3fxV4f2Ep2c4xXBedh6GrWcE6vo4LNaY1ERw5Cfo4Rx2YUffbhb6yUU5kWjZe7ndzBNdWxB1m5UUSLLu5sQmgQtD" ], "script": "base64:BgJwCAISABIDCgEBEgASABIICgYCAQEBAQESABIDCgEIEgQKAggBEgMKAQgSBAoCCAESAwoBCBIDCgEIEgUKAwEBARIFCgMBAQESBgoECAgIARIDCgEIEgMKAQgSABIDCgEIEgcKBQgICAgIEgMKAQgSAE8AA1NFUAICX18ACVVTRVJERVBUSAAaAAVTQ0FMRQDoBwAFTVVMVDgAgMLXLwAKemVyb0JpZ0ludAkAtgIBAAAAFHByb2Nlc3NpbmdTdGFnZVRvdGFsAAAAFXByb2Nlc3NpbmdTdGFnZVNoYXJlcwABAQ5nZXROdW1iZXJCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAAAQ9nZXROdW1iZXJPckZhaWwBA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFA2tleQkArAICCQCsAgICD21hbmRhdG9yeSB0aGlzLgUDa2V5Ag8gaXMgbm90IGRlZmluZWQBDmdldFN0cmluZ0J5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUDa2V5AgABD2dldFN0cmluZ09yRmFpbAEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUDa2V5CQCsAgIJAKwCAgIPbWFuZGF0b3J5IHRoaXMuBQNrZXkCDyBpcyBub3QgZGVmaW5lZAEDYWJzAQN2YWwDCQC/AgIFCnplcm9CaWdJbnQFA3ZhbAkAvgIBBQN2YWwFA3ZhbAALa2V5TWF4RGVwdGgCDCVzX19tYXhEZXB0aAAPbWF4RGVwdGhEZWZhdWx0AB4ACG1heERlcHRoCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFC2tleU1heERlcHRoBQ9tYXhEZXB0aERlZmF1bHQBEWtleUZhY3RvcnlBZGRyZXNzAAIcJXMlc19fY29uZmlnX19mYWN0b3J5QWRkcmVzcwARZmFjdG9yeUFkZHJlc3NTdHIJAQ9nZXRTdHJpbmdPckZhaWwBCQERa2V5RmFjdG9yeUFkZHJlc3MAAA9mYWN0b3J5Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEWZhY3RvcnlBZGRyZXNzU3RyARJrZXlFbWlzc2lvbkFkZHJlc3MAAh0lcyVzX19jb25maWdfX2VtaXNzaW9uQWRkcmVzcwETa2V5TnVtVG9Vc2VyTWFwcGluZwEDbnVtCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICB21hcHBpbmcJAMwIAgIIbnVtMnVzZXIJAMwIAgkApAMBBQNudW0FA25pbAUDU0VQABZrZXlSZWZlcnJhbFByb2dyYW1OYW1lCQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAgtwcm9ncmFtTmFtZQUDbmlsBQNTRVAAGnJlZmVycmFsUHJvZ3JhbU5hbWVEZWZhdWx0AgZ3eGxvY2sAE3JlZmVycmFsUHJvZ3JhbU5hbWUJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUWa2V5UmVmZXJyYWxQcm9ncmFtTmFtZQUacmVmZXJyYWxQcm9ncmFtTmFtZURlZmF1bHQAF2tleVJlZmVycmFsTWluR1d4QW1vdW50CQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAgxtaW5HV3hBbW91bnQFA25pbAUDU0VQABtyZWZlcnJhbE1pbkdXeEFtb3VudERlZmF1bHQJAGgCAPQDBQVNVUxUOAAUcmVmZXJyYWxNaW5HV3hBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUXa2V5UmVmZXJyYWxNaW5HV3hBbW91bnQFG3JlZmVycmFsTWluR1d4QW1vdW50RGVmYXVsdAAZa2V5UmVmZXJyZXJSZXdhcmRQZXJtaWxsZQkAuQkCCQDMCAICBCVzJXMJAMwIAgIIcmVmZXJyYWwJAMwIAgIWcmVmZXJyZXJSZXdhcmRQZXJtaWxsZQUDbmlsBQNTRVAAHXJlZmVycmVyUmV3YXJkUGVybWlsbGVEZWZhdWx0ADIAFnJlZmVycmVyUmV3YXJkUGVybWlsbGUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUZa2V5UmVmZXJyZXJSZXdhcmRQZXJtaWxsZQUdcmVmZXJyZXJSZXdhcmRQZXJtaWxsZURlZmF1bHQAGWtleVJlZmVycmFsUmV3YXJkUGVybWlsbGUJALkJAgkAzAgCAgQlcyVzCQDMCAICCHJlZmVycmFsCQDMCAICFnJlZmVycmFsUmV3YXJkUGVybWlsbGUFA25pbAUDU0VQAB1yZWZlcnJhbFJld2FyZFBlcm1pbGxlRGVmYXVsdAAyABZyZWZlcnJhbFJld2FyZFBlcm1pbGxlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFGWtleVJlZmVycmFsUmV3YXJkUGVybWlsbGUFHXJlZmVycmFsUmV3YXJkUGVybWlsbGVEZWZhdWx0AQtrZXlSZWZlcnJlcgEPcmVmZXJyYWxBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCHJlZmVycmVyCQDMCAIFE3JlZmVycmFsUHJvZ3JhbU5hbWUJAMwIAgUPcmVmZXJyYWxBZGRyZXNzBQNuaWwFA1NFUAASZW1pc3Npb25BZGRyZXNzU3RyCQEPZ2V0U3RyaW5nT3JGYWlsAQkBEmtleUVtaXNzaW9uQWRkcmVzcwAAEGVtaXNzaW9uQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEmVtaXNzaW9uQWRkcmVzc1N0cgANSWR4Q2ZnQXNzZXRJZAABABZJZHhDZmdQYWNlbWFrZXJBZGRyZXNzAAIAFklkeENmZ0Jvb3N0aW5nQ29udHJhY3QAAwAOSWR4Q2ZnTWF4RGVwdGgABAEJa2V5Q29uZmlnAAIKJXNfX2NvbmZpZwEVcmVhZENvbmZpZ0FycmF5T3JGYWlsAAkAtQkCCQEPZ2V0U3RyaW5nT3JGYWlsAQkBCWtleUNvbmZpZwAFA1NFUAEMZm9ybWF0Q29uZmlnBAx3eEFzc2V0SWRTdHIabWF0Y2hlclBhY2VtYWtlckFkZHJlc3NTdHIaYm9vc3RpbmdDb250cmFjdEFkZHJlc3NTdHIIbWF4RGVwdGgJALkJAgkAzAgCAgglcyVzJXMlZAkAzAgCBQx3eEFzc2V0SWRTdHIJAMwIAgUabWF0Y2hlclBhY2VtYWtlckFkZHJlc3NTdHIJAMwIAgUaYm9vc3RpbmdDb250cmFjdEFkZHJlc3NTdHIJAMwIAgkApAMBBQhtYXhEZXB0aAUDbmlsBQNTRVABFmJvb3N0aW5nQ29udHJhY3RPckZhaWwABAhjZmdBcnJheQkBFXJlYWRDb25maWdBcnJheU9yRmFpbAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFCGNmZ0FycmF5BRZJZHhDZmdCb29zdGluZ0NvbnRyYWN0Aihib29zdGluZyBjb250cmFjdCBhZGRyZXNzIGlzIG5vdCBkZWZpbmVkAR9rZXlHd3hSZXdhcmRFbWlzc2lvblN0YXJ0SGVpZ2h0AAIoJXMlc19fZ3d4UmV3YXJkRW1pc3Npb25QYXJ0X19zdGFydEhlaWdodAENa2V5VXNlcnNDb3VudAACDyVzX19uZXh0VXNlck51bQEWa2V5UmF0ZVBlckJsb2NrQ3VycmVudAACGyVzJXNfX3JhdGVQZXJCbG9ja19fY3VycmVudAEUa2V5UG9vbFdlaWdodFZpcnR1YWwAAiAlcyVzX19wb29sV2VpZ2h0X19HV1h2aXJ0dWFsUE9PTAEUa2V5TmV4dFByb2Nlc3NlZFVzZXIAAhUlc19fbmV4dFByb2Nlc3NlZFVzZXIBD2tleUxhdGVzdFBlcmlvZAACECVzX19sYXRlc3RQZXJpb2QBDWtleU5leHRQZXJpb2QAAg4lc19fbmV4dFBlcmlvZAESa2V5UHJvY2Vzc2luZ1N0YWdlAAITJXNfX3Byb2Nlc3NpbmdTdGFnZQEWa2V5TmV4dFByb2Nlc3NlZFBlcmlvZAACFyVzX19uZXh0UHJvY2Vzc2VkUGVyaW9kARtrZXlOZXh0VW5sYWltZWRQZXJpb2RPZlVzZXIBCXVzZXJJbmRleAkAuQkCCQDMCAICFyVzJWRfX25leHRDbGFpbWVkUGVyaW9kCQDMCAIJAKQDAQUJdXNlckluZGV4BQNuaWwFA1NFUAEca2V5TGFzdFByb2Nlc3NlZFBlcmlvZE9mVXNlcgEJdXNlckluZGV4CQC5CQIJAMwIAgIZJXMlZF9fbGFzdFByb2Nlc3NlZFBlcmlvZAkAzAgCCQCkAwEFCXVzZXJJbmRleAUDbmlsBQNTRVABEmtleUhlaWdodEZvclBlcmlvZAEGcGVyaW9kCQC5CQIJAMwIAgIaJXMlZF9fc3RhcnRIZWlnaHRGb3JQZXJpb2QJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQAR1rZXlBdXhFbWlzc2lvblJld2FyZEZvclBlcmlvZAEGcGVyaW9kCQC5CQIJAMwIAgIXJXMlZF9fYXV4RW1pc3Npb25SZXdhcmQJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARdrZXlUb3RhbEFtb3VudEZvclBlcmlvZAEGcGVyaW9kCQC5CQIJAMwIAgIaJXMlZF9fdG90YWxBbW91bnRGb3JQZXJpb2QJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARFrZXlMYXN0UGF5b3V0SW5mbwACEiVzX19sYXN0UGF5b3V0SW5mbwEQUGVyaW9kUGF5b3V0SW5mbwMGcGVyaW9kDW1hdGNoZXJSZXdhcmQOZW1pc3Npb25SZXdhcmQJALkJAgkAzAgCAgYlZCVkJWQJAMwIAgkApAMBBQZwZXJpb2QJAMwIAgkApAMBBQ1tYXRjaGVyUmV3YXJkCQDMCAIJAKQDAQUOZW1pc3Npb25SZXdhcmQFA25pbAUDU0VQARRrZXlQYXlvdXRIaXN0b3J5SW5mbwEGcGVyaW9kCQC5CQIJAMwIAgIYJXMlcyVkX19wYXlvdXRzX19oaXN0b3J5CQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEXa2V5VG90YWxXZWlnaHRGb3JQZXJpb2QBBnBlcmlvZAkAuQkCCQDMCAICGiVzJWRfX3RvdGFsV2VpZ2h0Rm9yUGVyaW9kCQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEWa2V5VXNlcktWYWx1ZUZvclBlcmlvZAIGcGVyaW9kCXVzZXJJbmRleAkAuQkCCQDMCAICFyVzJWQlcyVkX19wYXJhbUJ5UGVyaW9kCQDMCAIJAKQDAQUJdXNlckluZGV4CQDMCAICAWsJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARZrZXlVc2VyQlZhbHVlRm9yUGVyaW9kAgZwZXJpb2QJdXNlckluZGV4CQC5CQIJAMwIAgIXJXMlZCVzJWRfX3BhcmFtQnlQZXJpb2QJAMwIAgkApAMBBQl1c2VySW5kZXgJAMwIAgIBYgkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABFmtleVVzZXJXZWlnaHRGb3JQZXJpb2QCBnBlcmlvZAl1c2VySW5kZXgJALkJAgkAzAgCAhclcyVkJXMlZF9fcGFyYW1CeVBlcmlvZAkAzAgCCQCkAwEFCXVzZXJJbmRleAkAzAgCAgZ3ZWlnaHQJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARtrZXlSZWZlcnJhbHNDb250cmFjdEFkZHJlc3MACQC5CQIJAMwIAgIEJXMlcwkAzAgCAgZjb25maWcJAMwIAgIYcmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzBQNuaWwFA1NFUAAecmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzT3JGYWlsCQERQGV4dHJOYXRpdmUoMTA2MikBCQEPZ2V0U3RyaW5nT3JGYWlsAQkBG2tleVJlZmVycmFsc0NvbnRyYWN0QWRkcmVzcwABDEhpc3RvcnlFbnRyeQcEdHlwZQR1c2VyEWFtb3VudEZyb21NYXRjaGVyEmFtb3VudEZyb21FbWlzc2lvbg1jdXJyZW50UGVyaW9kDGxhdGVzdFBlcmlvZAFpBApoaXN0b3J5S0VZCQC5CQIJAMwIAgIRJXMlcyVzJXNfX2hpc3RvcnkJAMwIAgUEdHlwZQkAzAgCBQR1c2VyCQDMCAIJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAUDbmlsBQNTRVAEC2hpc3RvcnlEQVRBCQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQgFCWxhc3RCbG9jawZoZWlnaHQJAMwIAgkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQCkAwEFEWFtb3VudEZyb21NYXRjaGVyCQDMCAIJAKQDAQUSYW1vdW50RnJvbUVtaXNzaW9uCQDMCAIJAKQDAQUNY3VycmVudFBlcmlvZAkAzAgCCQCkAwEFDGxhdGVzdFBlcmlvZAUDbmlsBQNTRVAJAQtTdHJpbmdFbnRyeQIFCmhpc3RvcnlLRVkFC2hpc3RvcnlEQVRBARNrZXlNYW5hZ2VyUHVibGljS2V5AAIUJXNfX21hbmFnZXJQdWJsaWNLZXkBGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAIbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5ARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAQHJG1hdGNoMAkAoggBCQETa2V5TWFuYWdlclB1YmxpY0tleQADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQDZBAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAR1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdAAEByRtYXRjaDAJAKIIAQkBGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJANkEAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBC211c3RNYW5hZ2VyAQFpBAJwZAkAAgECEVBlcm1pc3Npb24gZGVuaWVkBAckbWF0Y2gwCQEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCcGsFByRtYXRjaDADCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQJwawYFAnBkAwkAAQIFByRtYXRjaDACBFVuaXQDCQAAAggFAWkGY2FsbGVyBQR0aGlzBgUCcGQJAAIBAgtNYXRjaCBlcnJvcgEOY2FsY1VzZXJXZWlnaHQEF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzD2hlaWdodEZvclBlcmlvZAZwZXJpb2QJdXNlckluZGV4BAVrTGFzdAkBHGtleUxhc3RQcm9jZXNzZWRQZXJpb2RPZlVzZXIBBQl1c2VySW5kZXgEBGtLZXkJARZrZXlVc2VyS1ZhbHVlRm9yUGVyaW9kAgUGcGVyaW9kBQl1c2VySW5kZXgEBGtSYXcJAJoIAgUXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MFBGtLZXkEC2tVc2VyV2VpZ2h0CQEWa2V5VXNlcldlaWdodEZvclBlcmlvZAIFBnBlcmlvZAUJdXNlckluZGV4AwkBCWlzRGVmaW5lZAEFBGtSYXcEAWsJAQV2YWx1ZQEFBGtSYXcEAWIJAQV2YWx1ZQEJAJoIAgUXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MJARZrZXlVc2VyQlZhbHVlRm9yUGVyaW9kAgUGcGVyaW9kBQl1c2VySW5kZXgEAXcJAGQCCQBoAgUBawUPaGVpZ2h0Rm9yUGVyaW9kBQFiAwkAZgIFAXcAAAkAlAoCCQBpAgUBdwUFU0NBTEUJAMwIAgkBDEludGVnZXJFbnRyeQIFBWtMYXN0BQZwZXJpb2QJAMwIAgkBDEludGVnZXJFbnRyeQIFC2tVc2VyV2VpZ2h0BQF3BQNuaWwJAJQKAgAABQNuaWwEAXAJAJoIAgUEdGhpcwUFa0xhc3QDAwkBCWlzRGVmaW5lZAEFAXAJAGcCBQZwZXJpb2QJAQV2YWx1ZQEFAXAHBAJwdgkBBXZhbHVlAQUBcAQBawkBBXZhbHVlAQkAmggCBRdib29zdGluZ0NvbnRyYWN0QWRkcmVzcwkBFmtleVVzZXJLVmFsdWVGb3JQZXJpb2QCBQJwdgUJdXNlckluZGV4BAFiCQEFdmFsdWUBCQCaCAIFF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzCQEWa2V5VXNlckJWYWx1ZUZvclBlcmlvZAIFAnB2BQl1c2VySW5kZXgEAXcJAGQCCQBoAgUBawUPaGVpZ2h0Rm9yUGVyaW9kBQFiAwkAZgIFAXcAAAkAlAoCCQBpAgUBdwUFU0NBTEUJAMwIAgkBDEludGVnZXJFbnRyeQIFC2tVc2VyV2VpZ2h0BQF3BQNuaWwJAJQKAgAABQNuaWwJAJQKAgAABQNuaWwBFmNhbGNVc2VyV2VpZ2h0Rm9yQ2xhaW0EF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzD2hlaWdodEZvclBlcmlvZAZwZXJpb2QJdXNlckluZGV4BAtrVXNlcldlaWdodAkBFmtleVVzZXJXZWlnaHRGb3JQZXJpb2QCBQZwZXJpb2QFCXVzZXJJbmRleAQQdXNlcldlaWdodE9yVW5pdAkAnwgBBQtrVXNlcldlaWdodAQHJG1hdGNoMAUQdXNlcldlaWdodE9yVW5pdAMJAAECBQckbWF0Y2gwAgRVbml0AAADCQABAgUHJG1hdGNoMAIDSW50BAF3BQckbWF0Y2gwCQBpAgUBdwUFU0NBTEUJAAIBAgtNYXRjaCBlcnJvcgEVZ2V0VXNlckluZGV4QnlBZGRyZXNzAhpib29zdGluZ0NvbnRyYWN0QWRkcmVzc1N0cgt1c2VyQWRkcmVzcwQDa2V5CQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICB21hcHBpbmcJAMwIAgIIdXNlcjJudW0JAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQCQENcGFyc2VJbnRWYWx1ZQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQEHQWRkcmVzcwEJANkEAQUaYm9vc3RpbmdDb250cmFjdEFkZHJlc3NTdHIFA2tleQkArAICCQCsAgIJAKwCAgINVXNlciBhZGRyZXNzIAULdXNlckFkZHJlc3MCLSBpcyBub3QgZm91bmQgaW4gYm9vc3RpbmcgY29udHJhY3QgZGF0YSwga2V5PQUDa2V5AQpuZXh0UGVyaW9kAAkBDmdldE51bWJlckJ5S2V5AQkBDWtleU5leHRQZXJpb2QAAQtpbnZva2VDbGFpbQYQYm9vc3RpbmdDb250cmFjdAZwZXJpb2QEdXNlcgVkZXB0aBB0b3RhbEZyb21NYXRjaGVyEXRvdGFsRnJvbUVtaXNzaW9uBAZyZXN1bHQJAPwHBAUEdGhpcwIOY2xhaW1OZXh0QmF0Y2gJAMwIAgUQYm9vc3RpbmdDb250cmFjdAkAzAgCBQZwZXJpb2QJAMwIAgUEdXNlcgkAzAgCBQVkZXB0aAkAzAgCBRB0b3RhbEZyb21NYXRjaGVyCQDMCAIFEXRvdGFsRnJvbUVtaXNzaW9uBQNuaWwFA25pbAMJAAACBQZyZXN1bHQFBnJlc3VsdAQHJG1hdGNoMAUGcmVzdWx0AwkAAQIFByRtYXRjaDACDyhJbnQsIEludCwgSW50KQQBcgUHJG1hdGNoMAUBcgkAAgECF0luY29ycmVjdCBpbnZva2UgcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ1jbGFpbUludGVybmFsBhBib29zdGluZ0NvbnRyYWN0DWN1cnJlbnRQZXJpb2QLY3VycmVudFVzZXIFZGVwdGgWdXNlckFjY3VtdWxhdGVkTWF0Y2hlchd1c2VyQWNjdW11bGF0ZWRFbWlzc2lvbgQXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MJAQdBZGRyZXNzAQUQYm9vc3RpbmdDb250cmFjdAQMbGF0ZXN0UGVyaW9kCQEOZ2V0TnVtYmVyQnlLZXkBCQEWa2V5TmV4dFByb2Nlc3NlZFBlcmlvZAAEC3RvdGFsV2VpZ2h0CQEOZ2V0TnVtYmVyQnlLZXkBCQEXa2V5VG90YWxXZWlnaHRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBA9oZWlnaHRGb3JQZXJpb2QJAQ5nZXROdW1iZXJCeUtleQEJARJrZXlIZWlnaHRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBAp1c2VyV2VpZ2h0CQEWY2FsY1VzZXJXZWlnaHRGb3JDbGFpbQQFF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzBQ9oZWlnaHRGb3JQZXJpb2QFDWN1cnJlbnRQZXJpb2QFC2N1cnJlbnRVc2VyBBp1c2VyQW1vdW50TWF0Y2hlckZvclBlcmlvZAkAawMJAQ5nZXROdW1iZXJCeUtleQEJARdrZXlUb3RhbEFtb3VudEZvclBlcmlvZAEFDWN1cnJlbnRQZXJpb2QFCnVzZXJXZWlnaHQFC3RvdGFsV2VpZ2h0BBt1c2VyQW1vdW50RW1pc3Npb25Gb3JQZXJpb2QJAGsDCQEOZ2V0TnVtYmVyQnlLZXkBCQEda2V5QXV4RW1pc3Npb25SZXdhcmRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBQp1c2VyV2VpZ2h0BQt0b3RhbFdlaWdodAMDCQBnAgAABQVkZXB0aAYJAGcCCQBkAgUNY3VycmVudFBlcmlvZAABBQxsYXRlc3RQZXJpb2QJAJUKAwkAZAIFDWN1cnJlbnRQZXJpb2QAAQkAZAIFFnVzZXJBY2N1bXVsYXRlZE1hdGNoZXIFGnVzZXJBbW91bnRNYXRjaGVyRm9yUGVyaW9kCQBkAgUXdXNlckFjY3VtdWxhdGVkRW1pc3Npb24FG3VzZXJBbW91bnRFbWlzc2lvbkZvclBlcmlvZAkBC2ludm9rZUNsYWltBgUQYm9vc3RpbmdDb250cmFjdAkAZAIFDWN1cnJlbnRQZXJpb2QAAQULY3VycmVudFVzZXIJAGUCBQVkZXB0aAABCQBkAgUWdXNlckFjY3VtdWxhdGVkTWF0Y2hlcgUadXNlckFtb3VudE1hdGNoZXJGb3JQZXJpb2QJAGQCBRd1c2VyQWNjdW11bGF0ZWRFbWlzc2lvbgUbdXNlckFtb3VudEVtaXNzaW9uRm9yUGVyaW9kARFjb21tb25DbGFpbVJld2FyZAILdXNlckFkZHJlc3MLc3RhcnRQZXJpb2QECGNmZ0FycmF5CQEVcmVhZENvbmZpZ0FycmF5T3JGYWlsAAQHdXNlcklkeAkBFWdldFVzZXJJbmRleEJ5QWRkcmVzcwIJAJEDAgUIY2ZnQXJyYXkFFklkeENmZ0Jvb3N0aW5nQ29udHJhY3QFC3VzZXJBZGRyZXNzBA1jdXJyZW50UGVyaW9kAwkBAiE9AgULc3RhcnRQZXJpb2QFBHVuaXQJAQV2YWx1ZQEFC3N0YXJ0UGVyaW9kCQEOZ2V0TnVtYmVyQnlLZXkBCQEba2V5TmV4dFVubGFpbWVkUGVyaW9kT2ZVc2VyAQUHdXNlcklkeAQTbmV4dFByb2Nlc3NlZFBlcmlvZAkBDmdldE51bWJlckJ5S2V5AQkBFmtleU5leHRQcm9jZXNzZWRQZXJpb2QAAwkAZwIFDWN1cnJlbnRQZXJpb2QFE25leHRQcm9jZXNzZWRQZXJpb2QJAAIBAhBOb3RoaW5nIHRvIGNsYWltBBBib29zdGluZ0NvbnRyYWN0CQDZBAEJAJEDAgUIY2ZnQXJyYXkFFklkeENmZ0Jvb3N0aW5nQ29udHJhY3QEDSR0MDEyNTY5MTI2OTUJAQ1jbGFpbUludGVybmFsBgUQYm9vc3RpbmdDb250cmFjdAUNY3VycmVudFBlcmlvZAUHdXNlcklkeAUJVVNFUkRFUFRIAAAAAAQGcGVyaW9kCAUNJHQwMTI1NjkxMjY5NQJfMQQRYW1vdW50RnJvbU1hdGNoZXIIBQ0kdDAxMjU2OTEyNjk1Al8yBBJhbW91bnRGcm9tRW1pc3Npb24IBQ0kdDAxMjU2OTEyNjk1Al8zCQCYCgYFBnBlcmlvZAURYW1vdW50RnJvbU1hdGNoZXIFEmFtb3VudEZyb21FbWlzc2lvbgUHdXNlcklkeAUIY2ZnQXJyYXkFE25leHRQcm9jZXNzZWRQZXJpb2QWAWkBDmZpbmFsaXplSGVscGVyAAQPcHJvY2Vzc2luZ1N0YWdlCQELdmFsdWVPckVsc2UCCQCfCAEJARJrZXlQcm9jZXNzaW5nU3RhZ2UABRRwcm9jZXNzaW5nU3RhZ2VUb3RhbAQNY3VycmVudFBlcmlvZAkBDmdldE51bWJlckJ5S2V5AQkBFmtleU5leHRQcm9jZXNzZWRQZXJpb2QABAtjdXJyZW50VXNlcgkBDmdldE51bWJlckJ5S2V5AQkBFGtleU5leHRQcm9jZXNzZWRVc2VyAAQMbGF0ZXN0UGVyaW9kCQEOZ2V0TnVtYmVyQnlLZXkBCQEPa2V5TGF0ZXN0UGVyaW9kAAQKdXNlcnNDb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCCQEWYm9vc3RpbmdDb250cmFjdE9yRmFpbAAJAQ1rZXlVc2Vyc0NvdW50AAAABA50b3RhbFdlaWdodEtleQkBF2tleVRvdGFsV2VpZ2h0Rm9yUGVyaW9kAQUNY3VycmVudFBlcmlvZAQLdG90YWxXZWlnaHQJAQ5nZXROdW1iZXJCeUtleQEJARdrZXlUb3RhbFdlaWdodEZvclBlcmlvZAEFDWN1cnJlbnRQZXJpb2QED2hlaWdodEZvclBlcmlvZAkBDmdldE51bWJlckJ5S2V5AQkBEmtleUhlaWdodEZvclBlcmlvZAEFDWN1cnJlbnRQZXJpb2QDCQBmAgUNY3VycmVudFBlcmlvZAUMbGF0ZXN0UGVyaW9kCQCUCgIFA25pbAcDCQAAAgUPcHJvY2Vzc2luZ1N0YWdlBRRwcm9jZXNzaW5nU3RhZ2VUb3RhbAQNJHQwMTM2ODUxMzgwMQkBDmNhbGNVc2VyV2VpZ2h0BAkBFmJvb3N0aW5nQ29udHJhY3RPckZhaWwABQ9oZWlnaHRGb3JQZXJpb2QFDWN1cnJlbnRQZXJpb2QFC2N1cnJlbnRVc2VyBAp1c2VyV2VpZ2h0CAUNJHQwMTM2ODUxMzgwMQJfMQQLdXNlckFjdGlvbnMIBQ0kdDAxMzY4NTEzODAxAl8yBA50b3RhbFdlaWdodE5ldwkAZAIFC3RvdGFsV2VpZ2h0BQp1c2VyV2VpZ2h0BBFwcm9jZXNzaW5nQWN0aW9ucwMJAGYCBQp1c2Vyc0NvdW50BQtjdXJyZW50VXNlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleU5leHRQcm9jZXNzZWRVc2VyAAkAZAIFC2N1cnJlbnRVc2VyAAEFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmtleVByb2Nlc3NpbmdTdGFnZQAFFXByb2Nlc3NpbmdTdGFnZVNoYXJlcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleU5leHRQcm9jZXNzZWRVc2VyAAAABQNuaWwJAJQKAgkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFDnRvdGFsV2VpZ2h0S2V5BQ50b3RhbFdlaWdodE5ldwUDbmlsBRFwcm9jZXNzaW5nQWN0aW9ucwULdXNlckFjdGlvbnMGAwkAAAIFD3Byb2Nlc3NpbmdTdGFnZQUVcHJvY2Vzc2luZ1N0YWdlU2hhcmVzBAp1c2VyV2VpZ2h0CQEWY2FsY1VzZXJXZWlnaHRGb3JDbGFpbQQJARZib29zdGluZ0NvbnRyYWN0T3JGYWlsAAUPaGVpZ2h0Rm9yUGVyaW9kBQ1jdXJyZW50UGVyaW9kBQtjdXJyZW50VXNlcgQadXNlckFtb3VudE1hdGNoZXJGb3JQZXJpb2QJAGsDCQEOZ2V0TnVtYmVyQnlLZXkBCQEXa2V5VG90YWxBbW91bnRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBQp1c2VyV2VpZ2h0BQt0b3RhbFdlaWdodAQbdXNlckFtb3VudEVtaXNzaW9uRm9yUGVyaW9kCQBrAwkBDmdldE51bWJlckJ5S2V5AQkBHWtleUF1eEVtaXNzaW9uUmV3YXJkRm9yUGVyaW9kAQUNY3VycmVudFBlcmlvZAUKdXNlcldlaWdodAULdG90YWxXZWlnaHQED3VzZXJUb3RhbEFtb3VudAkAZAIFG3VzZXJBbW91bnRFbWlzc2lvbkZvclBlcmlvZAUadXNlckFtb3VudE1hdGNoZXJGb3JQZXJpb2QEC3VzZXJBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA1MykCCQEWYm9vc3RpbmdDb250cmFjdE9yRmFpbAAJARNrZXlOdW1Ub1VzZXJNYXBwaW5nAQULY3VycmVudFVzZXIECHJlZmVycmVyCQCdCAIFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAkBC2tleVJlZmVycmVyAQULdXNlckFkZHJlc3MEEWFjdGl2ZVJlZmVycmFsSW52AwkAAAIFCHJlZmVycmVyBQR1bml0BQR1bml0CQD8BwQFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAIRc2V0QWN0aXZlUmVmZXJyYWwJAMwIAgUTcmVmZXJyYWxQcm9ncmFtTmFtZQkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCCQBnAgUKdXNlcldlaWdodAUUcmVmZXJyYWxNaW5HV3hBbW91bnQFA25pbAUDbmlsAwkAAAIFEWFjdGl2ZVJlZmVycmFsSW52BRFhY3RpdmVSZWZlcnJhbEludgQLcmVmZXJyYWxJbnYDAwkAAAIFCHJlZmVycmVyBQR1bml0BgkAZgIFFHJlZmVycmFsTWluR1d4QW1vdW50BQp1c2VyV2VpZ2h0BQR1bml0BA5yZWZlcnJlclJld2FyZAkAawMFD3VzZXJUb3RhbEFtb3VudAUWcmVmZXJyZXJSZXdhcmRQZXJtaWxsZQUFU0NBTEUEDnJlZmVycmFsUmV3YXJkCQBrAwUPdXNlclRvdGFsQW1vdW50BRZyZWZlcnJhbFJld2FyZFBlcm1pbGxlBQVTQ0FMRQkA/AcEBR5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwCDGluY1VuY2xhaW1lZAkAzAgCBRNyZWZlcnJhbFByb2dyYW1OYW1lCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIFDnJlZmVycmVyUmV3YXJkCQDMCAIFDnJlZmVycmFsUmV3YXJkBQNuaWwFA25pbAMJAAACBQtyZWZlcnJhbEludgULcmVmZXJyYWxJbnYEEXByb2Nlc3NpbmdBY3Rpb25zAwkAZgIFCnVzZXJzQ291bnQFC2N1cnJlbnRVc2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TmV4dFByb2Nlc3NlZFVzZXIACQBkAgULY3VycmVudFVzZXIAAQUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5TmV4dFByb2Nlc3NlZFBlcmlvZAAJAGQCBQ1jdXJyZW50UGVyaW9kAAEJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlOZXh0UHJvY2Vzc2VkVXNlcgAAAAUDbmlsCQCUCgIFEXByb2Nlc3NpbmdBY3Rpb25zBgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECGGludmFsaWQgcHJvY2Vzc2luZyBzdGFnZQFpAQ9maW5hbGl6ZVdyYXBwZXIBB2NvdW50ZXIEBnJlc3VsdAoAAUAJAPwHBAUEdGhpcwIOZmluYWxpemVIZWxwZXIFA25pbAUDbmlsAwkAAQIFAUACB0Jvb2xlYW4FAUAJAAIBCQCsAgIJAAMBCQD8BwQFBHRoaXMCDmZpbmFsaXplSGVscGVyBQNuaWwFA25pbAIcIGNvdWxkbid0IGJlIGNhc3QgdG8gQm9vbGVhbgMJAAACBQZyZXN1bHQFBnJlc3VsdAMDCQEBIQEFBnJlc3VsdAkAAAIFB2NvdW50ZXIFCG1heERlcHRoBwkAAgECEk5vdGhpbmcgdG8gcHJvY2VzcwMJAGYCBQdjb3VudGVyAAAJAJQKAgUDbmlsCQD8BwQFBHRoaXMCD2ZpbmFsaXplV3JhcHBlcgkAzAgCCQBlAgUHY291bnRlcgABBQNuaWwFA25pbAkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEdcHJvY2Vzc1BlbmRpbmdQZXJpb2RzQW5kVXNlcnMACQCUCgIFA25pbAkA/AcEBQR0aGlzAg9maW5hbGl6ZVdyYXBwZXIJAMwIAgUIbWF4RGVwdGgFA25pbAUDbmlsAWkBB2RlcG9zaXQABAhjZmdBcnJheQkBFXJlYWRDb25maWdBcnJheU9yRmFpbAADCQECIT0CCAUBaQZjYWxsZXIJAQdBZGRyZXNzAQkA2QQBCQCRAwIFCGNmZ0FycmF5BRZJZHhDZmdQYWNlbWFrZXJBZGRyZXNzCQACAQIUV3JvbmcgY2FsbGVyIGFkZHJlc3MEB2Fzc2V0SWQJAQV2YWx1ZQEICQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAHYXNzZXRJZAMJAQIhPQIFB2Fzc2V0SWQJANkEAQkAkQMCBQhjZmdBcnJheQUNSWR4Q2ZnQXNzZXRJZAkAAgECE1dyb25nIHBheW1lbnQgYXNzZXQEBnBlcmlvZAkBCm5leHRQZXJpb2QABAZkZWx0YUgJAGUCBQZoZWlnaHQJAQ9nZXROdW1iZXJPckZhaWwBCQEfa2V5R3d4UmV3YXJkRW1pc3Npb25TdGFydEhlaWdodAAEDGVtaXNzaW9uUmF0ZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFEGVtaXNzaW9uQ29udHJhY3QJARZrZXlSYXRlUGVyQmxvY2tDdXJyZW50AAkArAICCQCsAgICHG1hbmRhdG9yeSBlbWlzc2lvbl9jb250cmFjdC4JARZrZXlSYXRlUGVyQmxvY2tDdXJyZW50AAIPIGlzIG5vdCBkZWZpbmVkBAZ3ZWlnaHQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQ9mYWN0b3J5Q29udHJhY3QJARRrZXlQb29sV2VpZ2h0VmlydHVhbAAJAKwCAgkArAICAhttYW5kYXRvcnkgZmFjdG9yeV9jb250cmFjdC4JARRrZXlQb29sV2VpZ2h0VmlydHVhbAACDyBpcyBub3QgZGVmaW5lZAQJYXV4QW1vdW50CQBrAwkAaAIFBmRlbHRhSAUGd2VpZ2h0BQxlbWlzc2lvblJhdGUFBU1VTFQ4BAJlbQkA/AcEBRBlbWlzc2lvbkNvbnRyYWN0AgRlbWl0CQDMCAIFCWF1eEFtb3VudAUDbmlsBQNuaWwDCQAAAgUCZW0FAmVtBAttYXRjaGVyUGFydAgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAZhbW91bnQECnBheW91dEluZm8JARBQZXJpb2RQYXlvdXRJbmZvAwUGcGVyaW9kBQttYXRjaGVyUGFydAUJYXV4QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEPa2V5TGF0ZXN0UGVyaW9kAAUGcGVyaW9kCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESa2V5SGVpZ2h0Rm9yUGVyaW9kAQUGcGVyaW9kBQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJAR1rZXlBdXhFbWlzc2lvblJld2FyZEZvclBlcmlvZAEFBnBlcmlvZAUJYXV4QW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEfa2V5R3d4UmV3YXJkRW1pc3Npb25TdGFydEhlaWdodAAFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBF2tleVRvdGFsQW1vdW50Rm9yUGVyaW9kAQUGcGVyaW9kBQttYXRjaGVyUGFydAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDWtleU5leHRQZXJpb2QACQBkAgUGcGVyaW9kAAEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWtleUxhc3RQYXlvdXRJbmZvAAUKcGF5b3V0SW5mbwkAzAgCCQELU3RyaW5nRW50cnkCCQEUa2V5UGF5b3V0SGlzdG9yeUluZm8BBQZwZXJpb2QFCnBheW91dEluZm8FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5jbGFpbU5leHRCYXRjaAYQYm9vc3RpbmdDb250cmFjdA1jdXJyZW50UGVyaW9kC2N1cnJlbnRVc2VyBWRlcHRoEHRvdGFsRnJvbU1hdGNoZXIRdG90YWxGcm9tRW1pc3Npb24DCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAiRTaG91bGQgYmUgY2FsbGVkIGJ5IHRoaXMgc2NyaXB0IG9ubHkED3BlcmlvZEFuZFRvdGFscwkBDWNsYWltSW50ZXJuYWwGBRBib29zdGluZ0NvbnRyYWN0BQ1jdXJyZW50UGVyaW9kBQtjdXJyZW50VXNlcgUFZGVwdGgFEHRvdGFsRnJvbU1hdGNoZXIFEXRvdGFsRnJvbUVtaXNzaW9uCQCUCgIFA25pbAUPcGVyaW9kQW5kVG90YWxzAWkBC2NsYWltUmV3YXJkAAQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEDSR0MDE5MjU2MTkzODIJARFjb21tb25DbGFpbVJld2FyZAIFB2FkZHJlc3MFBHVuaXQEBnBlcmlvZAgFDSR0MDE5MjU2MTkzODICXzEEEWFtb3VudEZyb21NYXRjaGVyCAUNJHQwMTkyNTYxOTM4MgJfMgQSYW1vdW50RnJvbUVtaXNzaW9uCAUNJHQwMTkyNTYxOTM4MgJfMwQHdXNlcklkeAgFDSR0MDE5MjU2MTkzODICXzQECGNmZ0FycmF5CAUNJHQwMTkyNTYxOTM4MgJfNQQTbmV4dFByb2Nlc3NlZFBlcmlvZAgFDSR0MDE5MjU2MTkzODICXzYJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBG2tleU5leHRVbmxhaW1lZFBlcmlvZE9mVXNlcgEFB3VzZXJJZHgFBnBlcmlvZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGQCBRFhbW91bnRGcm9tTWF0Y2hlcgUSYW1vdW50RnJvbUVtaXNzaW9uCQDZBAEJAJEDAgUIY2ZnQXJyYXkFDUlkeENmZ0Fzc2V0SWQJAMwIAgkBDEhpc3RvcnlFbnRyeQcCBWNsYWltBQdhZGRyZXNzBRFhbW91bnRGcm9tTWF0Y2hlcgUSYW1vdW50RnJvbUVtaXNzaW9uBQZwZXJpb2QFE25leHRQcm9jZXNzZWRQZXJpb2QFAWkFA25pbAkAzAgCBRFhbW91bnRGcm9tTWF0Y2hlcgkAzAgCBRJhbW91bnRGcm9tRW1pc3Npb24FA25pbAFpARNjbGFpbVJld2FyZFJFQURPTkxZAQdhZGRyZXNzBAxjbGFpbVJlc3VsdHMJARFjb21tb25DbGFpbVJld2FyZAIFB2FkZHJlc3MFBHVuaXQEBmFtb3VudAkAZAIIBQxjbGFpbVJlc3VsdHMCXzIIBQxjbGFpbVJlc3VsdHMCXzMJAJQKAgUDbmlsBQZhbW91bnQBaQEcY2xhaW1SZXdhcmRQYWdpbmF0ZWRSRUFET05MWQIHYWRkcmVzcwtzdGFydFBlcmlvZAQNJHQwMjAxMjUyMDI0MgkBEWNvbW1vbkNsYWltUmV3YXJkAgUHYWRkcmVzcwMJAGYCAAAFC3N0YXJ0UGVyaW9kBQR1bml0BQtzdGFydFBlcmlvZAQGcGVyaW9kCAUNJHQwMjAxMjUyMDI0MgJfMQQLZnJvbU1hdGNoZXIIBQ0kdDAyMDEyNTIwMjQyAl8yBAxmcm9tRW1pc3Npb24IBQ0kdDAyMDEyNTIwMjQyAl8zBAZhbW91bnQJAGQCBQtmcm9tTWF0Y2hlcgUMZnJvbUVtaXNzaW9uCQCUCgIFA25pbAkAlAoCBQZhbW91bnQFBnBlcmlvZAFpARtjbGFpbVJld2FyZERldGFpbGVkUkVBRE9OTFkBB2FkZHJlc3MEDSR0MDIwNDkzMjA1NjgJARFjb21tb25DbGFpbVJld2FyZAIFB2FkZHJlc3MFBHVuaXQEB2lnbm9yZWQIBQ0kdDAyMDQ5MzIwNTY4Al8xBAtmcm9tTWF0Y2hlcggFDSR0MDIwNDkzMjA1NjgCXzIEDGZyb21FbWlzc2lvbggFDSR0MDIwNDkzMjA1NjgCXzMJAJQKAgUDbmlsCQC5CQIJAMwIAgIGJWQlZCVkCQDMCAIJAKQDAQkAZAIFC2Zyb21NYXRjaGVyBQxmcm9tRW1pc3Npb24JAMwIAgkApAMBBQtmcm9tTWF0Y2hlcgkAzAgCCQCkAwEFDGZyb21FbWlzc2lvbgUDbmlsBQNTRVABaQEkY2xhaW1SZXdhcmREZXRhaWxlZFBhZ2luYXRlZFJFQURPTkxZAgdhZGRyZXNzC3N0YXJ0UGVyaW9kBA0kdDAyMDg2NDIwOTgxCQERY29tbW9uQ2xhaW1SZXdhcmQCBQdhZGRyZXNzAwkAZgIAAAULc3RhcnRQZXJpb2QFBHVuaXQFC3N0YXJ0UGVyaW9kBAZwZXJpb2QIBQ0kdDAyMDg2NDIwOTgxAl8xBAtmcm9tTWF0Y2hlcggFDSR0MDIwODY0MjA5ODECXzIEDGZyb21FbWlzc2lvbggFDSR0MDIwODY0MjA5ODECXzMJAJQKAgUDbmlsCQCUCgIJALkJAgkAzAgCAgYlZCVkJWQJAMwIAgkApAMBCQBkAgULZnJvbU1hdGNoZXIFDGZyb21FbWlzc2lvbgkAzAgCCQCkAwEFC2Zyb21NYXRjaGVyCQDMCAIJAKQDAQUMZnJvbUVtaXNzaW9uBQNuaWwFA1NFUAUGcGVyaW9kAWkBHWxhdGVzdEZpbmFsaXplZFBlcmlvZFJFQURPTkxZAQdhZGRyZXNzCQCUCgIFA25pbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEPa2V5TGF0ZXN0UGVyaW9kAAD///////////8BAWkBIWxhdGVzdEZpbmFsaXplZFBlcmlvZEluZm9SRUFET05MWQEHYWRkcmVzcwkAlAoCBQNuaWwJAQ5nZXRTdHJpbmdCeUtleQEJARFrZXlMYXN0UGF5b3V0SW5mbwABaQEVY2FsY0d3eFBhcmFtc1JFQURPTkxZAw5nd3hBbW91bnRTdGFydA9sb2NrU3RhcnRIZWlnaHQSbG9ja0R1cmF0aW9uQmxvY2tzBA1sb2NrRW5kSGVpZ2h0CQBkAgUPbG9ja1N0YXJ0SGVpZ2h0BRJsb2NrRHVyYXRpb25CbG9ja3MEDHNjYWxlOFBhcmFtSwkBAS0BCQBrAwUOZ3d4QW1vdW50U3RhcnQFBVNDQUxFBRJsb2NrRHVyYXRpb25CbG9ja3MEDHNjYWxlOFBhcmFtQgkAaAIJAGsDBQ5nd3hBbW91bnRTdGFydAUFU0NBTEUFEmxvY2tEdXJhdGlvbkJsb2NrcwUNbG9ja0VuZEhlaWdodAkAlAoCBQNuaWwJAMwIAgUMc2NhbGU4UGFyYW1LCQDMCAIFDHNjYWxlOFBhcmFtQgkAzAgCCQEKbmV4dFBlcmlvZAAFA25pbAFpARpjYWxjR3d4QW1vdW50U3RhcnRSRUFET05MWQMMd3hMb2NrQW1vdW50DGxvY2tEdXJhdGlvbg9tYXhMb2NrRHVyYXRpb24EB2NvZWZmWDgJAGsDBQxsb2NrRHVyYXRpb24FBU1VTFQ4BQ9tYXhMb2NrRHVyYXRpb24EDmdXeEFtb3VudFN0YXJ0CQBrAwUMd3hMb2NrQW1vdW50BQdjb2VmZlg4BQVNVUxUOAkAlAoCBQNuaWwJAMwIAgUOZ1d4QW1vdW50U3RhcnQFA25pbAFpAQtjb25zdHJ1Y3RvcgQMd3hBc3NldElkU3RyGm1hdGNoZXJQYWNlbWFrZXJBZGRyZXNzU3RyGmJvb3N0aW5nQ29udHJhY3RBZGRyZXNzU3RyCG1heERlcHRoAwkBAiE9AgUEdGhpcwgFAWkGY2FsbGVyCQACAQIObm90IGF1dGhvcml6ZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCWtleUNvbmZpZwAJAQxmb3JtYXRDb25maWcEBQx3eEFzc2V0SWRTdHIFGm1hdGNoZXJQYWNlbWFrZXJBZGRyZXNzU3RyBRpib29zdGluZ0NvbnRyYWN0QWRkcmVzc1N0cgUIbWF4RGVwdGgFA25pbAFpAQ1jb25zdHJ1Y3RvclYyAQ5mYWN0b3J5QWRkcmVzcwMJAQIhPQIFBHRoaXMIBQFpBmNhbGxlcgkAAgECDm5vdCBhdXRob3JpemVkCQDMCAIJAQtTdHJpbmdFbnRyeQIJARFrZXlGYWN0b3J5QWRkcmVzcwAFDmZhY3RvcnlBZGRyZXNzBQNuaWwBaQENY29uc3RydWN0b3JWMwEPZW1pc3Npb25BZGRyZXNzAwkBAiE9AgUEdGhpcwgFAWkGY2FsbGVyCQACAQIObm90IGF1dGhvcml6ZWQEEGluaXRMYXRlc3RQZXJpb2QDCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQEPa2V5TGF0ZXN0UGVyaW9kAAUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEPa2V5TGF0ZXN0UGVyaW9kAAD///////////8BBQNuaWwJAM0IAgUQaW5pdExhdGVzdFBlcmlvZAkBC1N0cmluZ0VudHJ5AgkBEmtleUVtaXNzaW9uQWRkcmVzcwAFD2VtaXNzaW9uQWRkcmVzcwFpARVvbkVtaXNzaW9uRm9yR3d4U3RhcnQAAwkBAiE9AggFAWkGY2FsbGVyBQ9mYWN0b3J5Q29udHJhY3QJAAIBAhJwZXJtaXNzaW9ucyBkZW5pZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAR9rZXlHd3hSZXdhcmRFbWlzc2lvblN0YXJ0SGVpZ2h0AAUGaGVpZ2h0BQNuaWwBaQEjbGF0ZXN0UGVyaW9kRW1pc3Npb25SZXdhcmRzUkVBRE9OTFkBB2FkZHJlc3MEBnBlcmlvZAkBCm5leHRQZXJpb2QACQCUCgIFA25pbAkAzAgCCQEOZ2V0TnVtYmVyQnlLZXkBCQEda2V5QXV4RW1pc3Npb25SZXdhcmRGb3JQZXJpb2QBBQZwZXJpb2QFA25pbAFpAQVjYWxjRAULeDFCaWdJbnRTdHILeDJCaWdJbnRTdHIMYW1wQmlnSW50U3RyE2FQcmVjaXNpb25CaWdJbnRTdHIYdGFyZ2V0UHJlY2lzaW9uQmlnSW50U3RyBAZuQ29pbnMJALYCAQACBAphUHJlY2lzaW9uCQCnAwEFE2FQcmVjaXNpb25CaWdJbnRTdHIED3RhcmdldFByZWNpc2lvbgkApwMBBRh0YXJnZXRQcmVjaXNpb25CaWdJbnRTdHIEAngxCQCnAwEFC3gxQmlnSW50U3RyBAJ4MgkApwMBBQt4MkJpZ0ludFN0cgQDYW1wCQC5AgIJAKcDAQUMYW1wQmlnSW50U3RyBQphUHJlY2lzaW9uBAFzCQC3AgIFAngxBQJ4MgMJAAACBQFzBQp6ZXJvQmlnSW50CQCUCgIFA25pbAkApgMBBQp6ZXJvQmlnSW50BANhbm4JALkCAgUDYW1wBQZuQ29pbnMEA2FycgkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcFA25pbAoBBGNhbGMCA2FjYwNjdXIEDSR0MDI0NDcwMjQ2NTkFA2FjYwQBZAgFDSR0MDI0NDcwMjQ2NTkCXzEEBWRQcmV2CAUNJHQwMjQ0NzAyNDY1OQJfMgQCZHAJALoCAgkAuQICCQC5AgIFAWQFAWQFAWQJALkCAgkAuQICCQC5AgIFAngxBQJ4MgUGbkNvaW5zBQZuQ29pbnMEBWROZXh0CQC6AgIJALkCAgkAtwICCQC6AgIJALkCAgUDYW5uBQFzBQphUHJlY2lzaW9uCQC5AgIFAmRwBQZuQ29pbnMFAWQJALcCAgkAugICCQC5AgIJALgCAgUDYW5uBQphUHJlY2lzaW9uBQFkBQphUHJlY2lzaW9uCQC5AgIJALcCAgUGbkNvaW5zCQC2AgEAAQUCZHAJAJQKAgUFZE5leHQFAWQEDSR0MDI0ODcyMjQ5MjIKAAIkbAUDYXJyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQFzBQR1bml0CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRjYWxjAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA3CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcEBWROZXh0CAUNJHQwMjQ4NzIyNDkyMgJfMQQFZFByZXYIBQ0kdDAyNDg3MjI0OTIyAl8yBAVkRGlmZgkBA2FicwEJALgCAgUFZE5leHQJAQV2YWx1ZQEFBWRQcmV2AwkAwAICBQ90YXJnZXRQcmVjaXNpb24FBWREaWZmCQCUCgIFA25pbAkApgMBBQVkTmV4dAkAAgEJAKwCAgIdRCBjYWxjdWxhdGlvbiBlcnJvciwgZERpZmYgPSAJAKYDAQUFZERpZmYBaQEKc2V0TWFuYWdlcgEXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkEC2NoZWNrQ2FsbGVyCQELbXVzdE1hbmFnZXIBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQVY2hlY2tNYW5hZ2VyUHVibGljS2V5CQDZBAEFF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AwkAAAIFFWNoZWNrTWFuYWdlclB1YmxpY0tleQUVY2hlY2tNYW5hZ2VyUHVibGljS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIJARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAFF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOY29uZmlybU1hbmFnZXIABAJwbQkBHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0AAQFaGFzUE0DCQEJaXNEZWZpbmVkAQUCcG0GCQACAQISTm8gcGVuZGluZyBtYW5hZ2VyAwkAAAIFBWhhc1BNBQVoYXNQTQQHY2hlY2tQTQMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAnBtBgkAAgECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQdjaGVja1BNBQdjaGVja1BNCQDMCAIJAQtTdHJpbmdFbnRyeQIJARNrZXlNYW5hZ2VyUHVibGljS2V5AAkA2AQBCQEFdmFsdWUBBQJwbQkAzAgCCQELRGVsZXRlRW50cnkBCQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABA90YXJnZXRQdWJsaWNLZXkEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAUCcGsDCQABAgUHJG1hdGNoMAIEVW5pdAgFAnR4D3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQ90YXJnZXRQdWJsaWNLZXnHcdSb", "chainId": 84, "height": 2156832, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HUdWaWuUtAgmgcCdQUQbdpTBwiR6mwRrM2S2qKGKVfut Next: HhRwwZcCU2M4ecTHx7CZcTQmopfMm4DAcF6yooigcR8d Diff:
OldNewDifferences
359359 let userTotalAmount = (userAmountEmissionForPeriod + userAmountMatcherForPeriod)
360360 let userAddress = getStringValue(boostingContractOrFail(), keyNumToUserMapping(currentUser))
361361 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
362- let referralInv = if (if ((referrer == unit))
363- then true
364- else (referralMinGWxAmount > userWeight))
362+ let activeReferralInv = if ((referrer == unit))
365363 then unit
366- else {
367- let referrerReward = fraction(userTotalAmount, referrerRewardPermille, SCALE)
368- let referralReward = fraction(userTotalAmount, referralRewardPermille, SCALE)
369- invoke(referralsContractAddressOrFail, "incUnclaimed", [referralProgramName, userAddress, referrerReward, referralReward], nil)
370- }
371- if ((referralInv == referralInv))
364+ else invoke(referralsContractAddressOrFail, "setActiveReferral", [referralProgramName, userAddress, (userWeight >= referralMinGWxAmount)], nil)
365+ if ((activeReferralInv == activeReferralInv))
372366 then {
373- let processingActions = if ((usersCount > currentUser))
374- then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
375- else [IntegerEntry(keyNextProcessedPeriod(), (currentPeriod + 1)), IntegerEntry(keyNextProcessedUser(), 0)]
376- $Tuple2(processingActions, true)
367+ let referralInv = if (if ((referrer == unit))
368+ then true
369+ else (referralMinGWxAmount > userWeight))
370+ then unit
371+ else {
372+ let referrerReward = fraction(userTotalAmount, referrerRewardPermille, SCALE)
373+ let referralReward = fraction(userTotalAmount, referralRewardPermille, SCALE)
374+ invoke(referralsContractAddressOrFail, "incUnclaimed", [referralProgramName, userAddress, referrerReward, referralReward], nil)
375+ }
376+ if ((referralInv == referralInv))
377+ then {
378+ let processingActions = if ((usersCount > currentUser))
379+ then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
380+ else [IntegerEntry(keyNextProcessedPeriod(), (currentPeriod + 1)), IntegerEntry(keyNextProcessedUser(), 0)]
381+ $Tuple2(processingActions, true)
382+ }
383+ else throw("Strict value is not equal to itself.")
377384 }
378385 else throw("Strict value is not equal to itself.")
379386 }
450457 @Callable(i)
451458 func claimReward () = {
452459 let address = toString(i.caller)
453- let $t01903919165 = commonClaimReward(address, unit)
454- let period = $t01903919165._1
455- let amountFromMatcher = $t01903919165._2
456- let amountFromEmission = $t01903919165._3
457- let userIdx = $t01903919165._4
458- let cfgArray = $t01903919165._5
459- let nextProcessedPeriod = $t01903919165._6
460+ let $t01925619382 = commonClaimReward(address, unit)
461+ let period = $t01925619382._1
462+ let amountFromMatcher = $t01925619382._2
463+ let amountFromEmission = $t01925619382._3
464+ let userIdx = $t01925619382._4
465+ let cfgArray = $t01925619382._5
466+ let nextProcessedPeriod = $t01925619382._6
460467 $Tuple2([IntegerEntry(keyNextUnlaimedPeriodOfUser(userIdx), period), ScriptTransfer(i.caller, (amountFromMatcher + amountFromEmission), fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, amountFromMatcher, amountFromEmission, period, nextProcessedPeriod, i)], [amountFromMatcher, amountFromEmission])
461468 }
462469
473480
474481 @Callable(i)
475482 func claimRewardPaginatedREADONLY (address,startPeriod) = {
476- let $t01990820025 = commonClaimReward(address, if ((0 > startPeriod))
483+ let $t02012520242 = commonClaimReward(address, if ((0 > startPeriod))
477484 then unit
478485 else startPeriod)
479- let period = $t01990820025._1
480- let fromMatcher = $t01990820025._2
481- let fromEmission = $t01990820025._3
486+ let period = $t02012520242._1
487+ let fromMatcher = $t02012520242._2
488+ let fromEmission = $t02012520242._3
482489 let amount = (fromMatcher + fromEmission)
483490 $Tuple2(nil, $Tuple2(amount, period))
484491 }
487494
488495 @Callable(i)
489496 func claimRewardDetailedREADONLY (address) = {
490- let $t02027620351 = commonClaimReward(address, unit)
491- let ignored = $t02027620351._1
492- let fromMatcher = $t02027620351._2
493- let fromEmission = $t02027620351._3
497+ let $t02049320568 = commonClaimReward(address, unit)
498+ let ignored = $t02049320568._1
499+ let fromMatcher = $t02049320568._2
500+ let fromEmission = $t02049320568._3
494501 $Tuple2(nil, makeString(["%d%d%d", toString((fromMatcher + fromEmission)), toString(fromMatcher), toString(fromEmission)], SEP))
495502 }
496503
498505
499506 @Callable(i)
500507 func claimRewardDetailedPaginatedREADONLY (address,startPeriod) = {
501- let $t02064720764 = commonClaimReward(address, if ((0 > startPeriod))
508+ let $t02086420981 = commonClaimReward(address, if ((0 > startPeriod))
502509 then unit
503510 else startPeriod)
504- let period = $t02064720764._1
505- let fromMatcher = $t02064720764._2
506- let fromEmission = $t02064720764._3
511+ let period = $t02086420981._1
512+ let fromMatcher = $t02086420981._2
513+ let fromEmission = $t02086420981._3
507514 $Tuple2(nil, $Tuple2(makeString(["%d%d%d", toString((fromMatcher + fromEmission)), toString(fromMatcher), toString(fromEmission)], SEP), period))
508515 }
509516
594601 let ann = (amp * nCoins)
595602 let arr = [1, 2, 3, 4, 5, 6, 7]
596603 func calc (acc,cur) = {
597- let $t02425324442 = acc
598- let d = $t02425324442._1
599- let dPrev = $t02425324442._2
604+ let $t02447024659 = acc
605+ let d = $t02447024659._1
606+ let dPrev = $t02447024659._2
600607 let dp = (((d * d) * d) / (((x1 * x2) * nCoins) * nCoins))
601608 let dNext = (((((ann * s) / aPrecision) + (dp * nCoins)) * d) / ((((ann - aPrecision) * d) / aPrecision) + ((nCoins + toBigInt(1)) * dp)))
602609 $Tuple2(dNext, d)
603610 }
604611
605- let $t02465524705 = {
612+ let $t02487224922 = {
606613 let $l = arr
607614 let $s = size($l)
608615 let $acc0 = $Tuple2(s, unit)
616623
617624 $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)
618625 }
619- let dNext = $t02465524705._1
620- let dPrev = $t02465524705._2
626+ let dNext = $t02487224922._1
627+ let dPrev = $t02487224922._2
621628 let dDiff = abs((dNext - value(dPrev)))
622629 if ((targetPrecision >= dDiff))
623630 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)
332332 func finalizeHelper () = {
333333 let processingStage = valueOrElse(getInteger(keyProcessingStage()), processingStageTotal)
334334 let currentPeriod = getNumberByKey(keyNextProcessedPeriod())
335335 let currentUser = getNumberByKey(keyNextProcessedUser())
336336 let latestPeriod = getNumberByKey(keyLatestPeriod())
337337 let usersCount = valueOrElse(getInteger(boostingContractOrFail(), keyUsersCount()), 0)
338338 let totalWeightKey = keyTotalWeightForPeriod(currentPeriod)
339339 let totalWeight = getNumberByKey(keyTotalWeightForPeriod(currentPeriod))
340340 let heightForPeriod = getNumberByKey(keyHeightForPeriod(currentPeriod))
341341 if ((currentPeriod > latestPeriod))
342342 then $Tuple2(nil, false)
343343 else if ((processingStage == processingStageTotal))
344344 then {
345345 let $t01368513801 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
346346 let userWeight = $t01368513801._1
347347 let userActions = $t01368513801._2
348348 let totalWeightNew = (totalWeight + userWeight)
349349 let processingActions = if ((usersCount > currentUser))
350350 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
351351 else [IntegerEntry(keyProcessingStage(), processingStageShares), IntegerEntry(keyNextProcessedUser(), 0)]
352352 $Tuple2((([IntegerEntry(totalWeightKey, totalWeightNew)] ++ processingActions) ++ userActions), true)
353353 }
354354 else if ((processingStage == processingStageShares))
355355 then {
356356 let userWeight = calcUserWeightForClaim(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
357357 let userAmountMatcherForPeriod = fraction(getNumberByKey(keyTotalAmountForPeriod(currentPeriod)), userWeight, totalWeight)
358358 let userAmountEmissionForPeriod = fraction(getNumberByKey(keyAuxEmissionRewardForPeriod(currentPeriod)), userWeight, totalWeight)
359359 let userTotalAmount = (userAmountEmissionForPeriod + userAmountMatcherForPeriod)
360360 let userAddress = getStringValue(boostingContractOrFail(), keyNumToUserMapping(currentUser))
361361 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
362- let referralInv = if (if ((referrer == unit))
363- then true
364- else (referralMinGWxAmount > userWeight))
362+ let activeReferralInv = if ((referrer == unit))
365363 then unit
366- else {
367- let referrerReward = fraction(userTotalAmount, referrerRewardPermille, SCALE)
368- let referralReward = fraction(userTotalAmount, referralRewardPermille, SCALE)
369- invoke(referralsContractAddressOrFail, "incUnclaimed", [referralProgramName, userAddress, referrerReward, referralReward], nil)
370- }
371- if ((referralInv == referralInv))
364+ else invoke(referralsContractAddressOrFail, "setActiveReferral", [referralProgramName, userAddress, (userWeight >= referralMinGWxAmount)], nil)
365+ if ((activeReferralInv == activeReferralInv))
372366 then {
373- let processingActions = if ((usersCount > currentUser))
374- then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
375- else [IntegerEntry(keyNextProcessedPeriod(), (currentPeriod + 1)), IntegerEntry(keyNextProcessedUser(), 0)]
376- $Tuple2(processingActions, true)
367+ let referralInv = if (if ((referrer == unit))
368+ then true
369+ else (referralMinGWxAmount > userWeight))
370+ then unit
371+ else {
372+ let referrerReward = fraction(userTotalAmount, referrerRewardPermille, SCALE)
373+ let referralReward = fraction(userTotalAmount, referralRewardPermille, SCALE)
374+ invoke(referralsContractAddressOrFail, "incUnclaimed", [referralProgramName, userAddress, referrerReward, referralReward], nil)
375+ }
376+ if ((referralInv == referralInv))
377+ then {
378+ let processingActions = if ((usersCount > currentUser))
379+ then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
380+ else [IntegerEntry(keyNextProcessedPeriod(), (currentPeriod + 1)), IntegerEntry(keyNextProcessedUser(), 0)]
381+ $Tuple2(processingActions, true)
382+ }
383+ else throw("Strict value is not equal to itself.")
377384 }
378385 else throw("Strict value is not equal to itself.")
379386 }
380387 else throw("invalid processing stage")
381388 }
382389
383390
384391
385392 @Callable(i)
386393 func finalizeWrapper (counter) = {
387394 let result = {
388395 let @ = invoke(this, "finalizeHelper", nil, nil)
389396 if ($isInstanceOf(@, "Boolean"))
390397 then @
391398 else throw(($getType(invoke(this, "finalizeHelper", nil, nil)) + " couldn't be cast to Boolean"))
392399 }
393400 if ((result == result))
394401 then if (if (!(result))
395402 then (counter == maxDepth)
396403 else false)
397404 then throw("Nothing to process")
398405 else if ((counter > 0))
399406 then $Tuple2(nil, invoke(this, "finalizeWrapper", [(counter - 1)], nil))
400407 else $Tuple2(nil, unit)
401408 else throw("Strict value is not equal to itself.")
402409 }
403410
404411
405412
406413 @Callable(i)
407414 func processPendingPeriodsAndUsers () = $Tuple2(nil, invoke(this, "finalizeWrapper", [maxDepth], nil))
408415
409416
410417
411418 @Callable(i)
412419 func deposit () = {
413420 let cfgArray = readConfigArrayOrFail()
414421 if ((i.caller != Address(fromBase58String(cfgArray[IdxCfgPacemakerAddress]))))
415422 then throw("Wrong caller address")
416423 else {
417424 let assetId = value(value(i.payments[0]).assetId)
418425 if ((assetId != fromBase58String(cfgArray[IdxCfgAssetId])))
419426 then throw("Wrong payment asset")
420427 else {
421428 let period = nextPeriod()
422429 let deltaH = (height - getNumberOrFail(keyGwxRewardEmissionStartHeight()))
423430 let emissionRate = valueOrErrorMessage(getInteger(emissionContract, keyRatePerBlockCurrent()), (("mandatory emission_contract." + keyRatePerBlockCurrent()) + " is not defined"))
424431 let weight = valueOrErrorMessage(getInteger(factoryContract, keyPoolWeightVirtual()), (("mandatory factory_contract." + keyPoolWeightVirtual()) + " is not defined"))
425432 let auxAmount = fraction((deltaH * weight), emissionRate, MULT8)
426433 let em = invoke(emissionContract, "emit", [auxAmount], nil)
427434 if ((em == em))
428435 then {
429436 let matcherPart = value(i.payments[0]).amount
430437 let payoutInfo = PeriodPayoutInfo(period, matcherPart, auxAmount)
431438 [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)]
432439 }
433440 else throw("Strict value is not equal to itself.")
434441 }
435442 }
436443 }
437444
438445
439446
440447 @Callable(i)
441448 func claimNextBatch (boostingContract,currentPeriod,currentUser,depth,totalFromMatcher,totalFromEmission) = if ((i.caller != this))
442449 then throw("Should be called by this script only")
443450 else {
444451 let periodAndTotals = claimInternal(boostingContract, currentPeriod, currentUser, depth, totalFromMatcher, totalFromEmission)
445452 $Tuple2(nil, periodAndTotals)
446453 }
447454
448455
449456
450457 @Callable(i)
451458 func claimReward () = {
452459 let address = toString(i.caller)
453- let $t01903919165 = commonClaimReward(address, unit)
454- let period = $t01903919165._1
455- let amountFromMatcher = $t01903919165._2
456- let amountFromEmission = $t01903919165._3
457- let userIdx = $t01903919165._4
458- let cfgArray = $t01903919165._5
459- let nextProcessedPeriod = $t01903919165._6
460+ let $t01925619382 = commonClaimReward(address, unit)
461+ let period = $t01925619382._1
462+ let amountFromMatcher = $t01925619382._2
463+ let amountFromEmission = $t01925619382._3
464+ let userIdx = $t01925619382._4
465+ let cfgArray = $t01925619382._5
466+ let nextProcessedPeriod = $t01925619382._6
460467 $Tuple2([IntegerEntry(keyNextUnlaimedPeriodOfUser(userIdx), period), ScriptTransfer(i.caller, (amountFromMatcher + amountFromEmission), fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, amountFromMatcher, amountFromEmission, period, nextProcessedPeriod, i)], [amountFromMatcher, amountFromEmission])
461468 }
462469
463470
464471
465472 @Callable(i)
466473 func claimRewardREADONLY (address) = {
467474 let claimResults = commonClaimReward(address, unit)
468475 let amount = (claimResults._2 + claimResults._3)
469476 $Tuple2(nil, amount)
470477 }
471478
472479
473480
474481 @Callable(i)
475482 func claimRewardPaginatedREADONLY (address,startPeriod) = {
476- let $t01990820025 = commonClaimReward(address, if ((0 > startPeriod))
483+ let $t02012520242 = commonClaimReward(address, if ((0 > startPeriod))
477484 then unit
478485 else startPeriod)
479- let period = $t01990820025._1
480- let fromMatcher = $t01990820025._2
481- let fromEmission = $t01990820025._3
486+ let period = $t02012520242._1
487+ let fromMatcher = $t02012520242._2
488+ let fromEmission = $t02012520242._3
482489 let amount = (fromMatcher + fromEmission)
483490 $Tuple2(nil, $Tuple2(amount, period))
484491 }
485492
486493
487494
488495 @Callable(i)
489496 func claimRewardDetailedREADONLY (address) = {
490- let $t02027620351 = commonClaimReward(address, unit)
491- let ignored = $t02027620351._1
492- let fromMatcher = $t02027620351._2
493- let fromEmission = $t02027620351._3
497+ let $t02049320568 = commonClaimReward(address, unit)
498+ let ignored = $t02049320568._1
499+ let fromMatcher = $t02049320568._2
500+ let fromEmission = $t02049320568._3
494501 $Tuple2(nil, makeString(["%d%d%d", toString((fromMatcher + fromEmission)), toString(fromMatcher), toString(fromEmission)], SEP))
495502 }
496503
497504
498505
499506 @Callable(i)
500507 func claimRewardDetailedPaginatedREADONLY (address,startPeriod) = {
501- let $t02064720764 = commonClaimReward(address, if ((0 > startPeriod))
508+ let $t02086420981 = commonClaimReward(address, if ((0 > startPeriod))
502509 then unit
503510 else startPeriod)
504- let period = $t02064720764._1
505- let fromMatcher = $t02064720764._2
506- let fromEmission = $t02064720764._3
511+ let period = $t02086420981._1
512+ let fromMatcher = $t02086420981._2
513+ let fromEmission = $t02086420981._3
507514 $Tuple2(nil, $Tuple2(makeString(["%d%d%d", toString((fromMatcher + fromEmission)), toString(fromMatcher), toString(fromEmission)], SEP), period))
508515 }
509516
510517
511518
512519 @Callable(i)
513520 func latestFinalizedPeriodREADONLY (address) = $Tuple2(nil, valueOrElse(getInteger(this, keyLatestPeriod()), -1))
514521
515522
516523
517524 @Callable(i)
518525 func latestFinalizedPeriodInfoREADONLY (address) = $Tuple2(nil, getStringByKey(keyLastPayoutInfo()))
519526
520527
521528
522529 @Callable(i)
523530 func calcGwxParamsREADONLY (gwxAmountStart,lockStartHeight,lockDurationBlocks) = {
524531 let lockEndHeight = (lockStartHeight + lockDurationBlocks)
525532 let scale8ParamK = -(fraction(gwxAmountStart, SCALE, lockDurationBlocks))
526533 let scale8ParamB = (fraction(gwxAmountStart, SCALE, lockDurationBlocks) * lockEndHeight)
527534 $Tuple2(nil, [scale8ParamK, scale8ParamB, nextPeriod()])
528535 }
529536
530537
531538
532539 @Callable(i)
533540 func calcGwxAmountStartREADONLY (wxLockAmount,lockDuration,maxLockDuration) = {
534541 let coeffX8 = fraction(lockDuration, MULT8, maxLockDuration)
535542 let gWxAmountStart = fraction(wxLockAmount, coeffX8, MULT8)
536543 $Tuple2(nil, [gWxAmountStart])
537544 }
538545
539546
540547
541548 @Callable(i)
542549 func constructor (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr,maxDepth) = if ((this != i.caller))
543550 then throw("not authorized")
544551 else [StringEntry(keyConfig(), formatConfig(wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr, maxDepth))]
545552
546553
547554
548555 @Callable(i)
549556 func constructorV2 (factoryAddress) = if ((this != i.caller))
550557 then throw("not authorized")
551558 else [StringEntry(keyFactoryAddress(), factoryAddress)]
552559
553560
554561
555562 @Callable(i)
556563 func constructorV3 (emissionAddress) = if ((this != i.caller))
557564 then throw("not authorized")
558565 else {
559566 let initLatestPeriod = if (isDefined(getInteger(this, keyLatestPeriod())))
560567 then nil
561568 else [IntegerEntry(keyLatestPeriod(), -1)]
562569 (initLatestPeriod :+ StringEntry(keyEmissionAddress(), emissionAddress))
563570 }
564571
565572
566573
567574 @Callable(i)
568575 func onEmissionForGwxStart () = if ((i.caller != factoryContract))
569576 then throw("permissions denied")
570577 else [IntegerEntry(keyGwxRewardEmissionStartHeight(), height)]
571578
572579
573580
574581 @Callable(i)
575582 func latestPeriodEmissionRewardsREADONLY (address) = {
576583 let period = nextPeriod()
577584 $Tuple2(nil, [getNumberByKey(keyAuxEmissionRewardForPeriod(period))])
578585 }
579586
580587
581588
582589 @Callable(i)
583590 func calcD (x1BigIntStr,x2BigIntStr,ampBigIntStr,aPrecisionBigIntStr,targetPrecisionBigIntStr) = {
584591 let nCoins = toBigInt(2)
585592 let aPrecision = parseBigIntValue(aPrecisionBigIntStr)
586593 let targetPrecision = parseBigIntValue(targetPrecisionBigIntStr)
587594 let x1 = parseBigIntValue(x1BigIntStr)
588595 let x2 = parseBigIntValue(x2BigIntStr)
589596 let amp = (parseBigIntValue(ampBigIntStr) * aPrecision)
590597 let s = (x1 + x2)
591598 if ((s == zeroBigInt))
592599 then $Tuple2(nil, toString(zeroBigInt))
593600 else {
594601 let ann = (amp * nCoins)
595602 let arr = [1, 2, 3, 4, 5, 6, 7]
596603 func calc (acc,cur) = {
597- let $t02425324442 = acc
598- let d = $t02425324442._1
599- let dPrev = $t02425324442._2
604+ let $t02447024659 = acc
605+ let d = $t02447024659._1
606+ let dPrev = $t02447024659._2
600607 let dp = (((d * d) * d) / (((x1 * x2) * nCoins) * nCoins))
601608 let dNext = (((((ann * s) / aPrecision) + (dp * nCoins)) * d) / ((((ann - aPrecision) * d) / aPrecision) + ((nCoins + toBigInt(1)) * dp)))
602609 $Tuple2(dNext, d)
603610 }
604611
605- let $t02465524705 = {
612+ let $t02487224922 = {
606613 let $l = arr
607614 let $s = size($l)
608615 let $acc0 = $Tuple2(s, unit)
609616 func $f0_1 ($a,$i) = if (($i >= $s))
610617 then $a
611618 else calc($a, $l[$i])
612619
613620 func $f0_2 ($a,$i) = if (($i >= $s))
614621 then $a
615622 else throw("List size exceeds 7")
616623
617624 $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)
618625 }
619- let dNext = $t02465524705._1
620- let dPrev = $t02465524705._2
626+ let dNext = $t02487224922._1
627+ let dPrev = $t02487224922._2
621628 let dDiff = abs((dNext - value(dPrev)))
622629 if ((targetPrecision >= dDiff))
623630 then $Tuple2(nil, toString(dNext))
624631 else throw(("D calculation error, dDiff = " + toString(dDiff)))
625632 }
626633 }
627634
628635
629636
630637 @Callable(i)
631638 func setManager (pendingManagerPublicKey) = {
632639 let checkCaller = mustManager(i)
633640 if ((checkCaller == checkCaller))
634641 then {
635642 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
636643 if ((checkManagerPublicKey == checkManagerPublicKey))
637644 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
638645 else throw("Strict value is not equal to itself.")
639646 }
640647 else throw("Strict value is not equal to itself.")
641648 }
642649
643650
644651
645652 @Callable(i)
646653 func confirmManager () = {
647654 let pm = pendingManagerPublicKeyOrUnit()
648655 let hasPM = if (isDefined(pm))
649656 then true
650657 else throw("No pending manager")
651658 if ((hasPM == hasPM))
652659 then {
653660 let checkPM = if ((i.callerPublicKey == value(pm)))
654661 then true
655662 else throw("You are not pending manager")
656663 if ((checkPM == checkPM))
657664 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
658665 else throw("Strict value is not equal to itself.")
659666 }
660667 else throw("Strict value is not equal to itself.")
661668 }
662669
663670
664671 @Verifier(tx)
665672 func verify () = {
666673 let targetPublicKey = match managerPublicKeyOrUnit() {
667674 case pk: ByteVector =>
668675 pk
669676 case _: Unit =>
670677 tx.senderPublicKey
671678 case _ =>
672679 throw("Match error")
673680 }
674681 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
675682 }
676683

github/deemru/w8io/03bedc9 
80.30 ms