tx · 3YqNDACvPo89pLvGdSNmd9AWe3t3KVLCjMM8bxwKWwzh

3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE:  -0.02500000 Waves

2022.07.27 09:35 [2157871] smart account 3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE > SELF 0.00000000 Waves

{ "type": 13, "id": "3YqNDACvPo89pLvGdSNmd9AWe3t3KVLCjMM8bxwKWwzh", "fee": 2500000, "feeAssetId": null, "timestamp": 1658903707770, "version": 1, "sender": "3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE", "senderPublicKey": "G349Uq3FTox7dRNLeAfAQeoACvwZ9iEnVSaHcEYn6j8J", "proofs": [ "2RxxhP1kHKkE2Wi3Y161AZRtQZ79DZLtANzzUoYA9y8eWdZsABFxBe29Y219hmwetjkNbUjZdi2q51j5q4aaixgc" ], "script": "base64:BgJwCAISABIDCgEBEgASABIICgYCAQEBAQESABIDCgEIEgQKAggBEgMKAQgSBAoCCAESAwoBCBIDCgEIEgUKAwEBARIFCgMBAQESBgoECAgIARIDCgEIEgMKAQgSABIDCgEIEgcKBQgICAgIEgMKAQgSAE8AA1NFUAICX18ACVVTRVJERVBUSAAaAAVTQ0FMRQDoBwAFTVVMVDgAgMLXLwAKemVyb0JpZ0ludAkAtgIBAAAAFHByb2Nlc3NpbmdTdGFnZVRvdGFsAAAAFXByb2Nlc3NpbmdTdGFnZVNoYXJlcwABAQ5nZXROdW1iZXJCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAAAQ9nZXROdW1iZXJPckZhaWwBA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFA2tleQkArAICCQCsAgICD21hbmRhdG9yeSB0aGlzLgUDa2V5Ag8gaXMgbm90IGRlZmluZWQBDmdldFN0cmluZ0J5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUDa2V5AgABD2dldFN0cmluZ09yRmFpbAEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUDa2V5CQCsAgIJAKwCAgIPbWFuZGF0b3J5IHRoaXMuBQNrZXkCDyBpcyBub3QgZGVmaW5lZAEDYWJzAQN2YWwDCQC/AgIFCnplcm9CaWdJbnQFA3ZhbAkAvgIBBQN2YWwFA3ZhbAALa2V5TWF4RGVwdGgCDCVzX19tYXhEZXB0aAAPbWF4RGVwdGhEZWZhdWx0AB4ACG1heERlcHRoCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFC2tleU1heERlcHRoBQ9tYXhEZXB0aERlZmF1bHQBEWtleUZhY3RvcnlBZGRyZXNzAAIcJXMlc19fY29uZmlnX19mYWN0b3J5QWRkcmVzcwARZmFjdG9yeUFkZHJlc3NTdHIJAQ9nZXRTdHJpbmdPckZhaWwBCQERa2V5RmFjdG9yeUFkZHJlc3MAAA9mYWN0b3J5Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEWZhY3RvcnlBZGRyZXNzU3RyARJrZXlFbWlzc2lvbkFkZHJlc3MAAh0lcyVzX19jb25maWdfX2VtaXNzaW9uQWRkcmVzcwETa2V5TnVtVG9Vc2VyTWFwcGluZwEDbnVtCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICB21hcHBpbmcJAMwIAgIIbnVtMnVzZXIJAMwIAgkApAMBBQNudW0FA25pbAUDU0VQABZrZXlSZWZlcnJhbFByb2dyYW1OYW1lCQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAgtwcm9ncmFtTmFtZQUDbmlsBQNTRVAAGnJlZmVycmFsUHJvZ3JhbU5hbWVEZWZhdWx0AgZ3eGxvY2sAE3JlZmVycmFsUHJvZ3JhbU5hbWUJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUWa2V5UmVmZXJyYWxQcm9ncmFtTmFtZQUacmVmZXJyYWxQcm9ncmFtTmFtZURlZmF1bHQAF2tleVJlZmVycmFsTWluR1d4QW1vdW50CQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAgxtaW5HV3hBbW91bnQFA25pbAUDU0VQABtyZWZlcnJhbE1pbkdXeEFtb3VudERlZmF1bHQJAGgCAPQDBQVNVUxUOAAUcmVmZXJyYWxNaW5HV3hBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUXa2V5UmVmZXJyYWxNaW5HV3hBbW91bnQFG3JlZmVycmFsTWluR1d4QW1vdW50RGVmYXVsdAAZa2V5UmVmZXJyZXJSZXdhcmRQZXJtaWxsZQkAuQkCCQDMCAICBCVzJXMJAMwIAgIIcmVmZXJyYWwJAMwIAgIWcmVmZXJyZXJSZXdhcmRQZXJtaWxsZQUDbmlsBQNTRVAAHXJlZmVycmVyUmV3YXJkUGVybWlsbGVEZWZhdWx0ADIAFnJlZmVycmVyUmV3YXJkUGVybWlsbGUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUZa2V5UmVmZXJyZXJSZXdhcmRQZXJtaWxsZQUdcmVmZXJyZXJSZXdhcmRQZXJtaWxsZURlZmF1bHQAGWtleVJlZmVycmFsUmV3YXJkUGVybWlsbGUJALkJAgkAzAgCAgQlcyVzCQDMCAICCHJlZmVycmFsCQDMCAICFnJlZmVycmFsUmV3YXJkUGVybWlsbGUFA25pbAUDU0VQAB1yZWZlcnJhbFJld2FyZFBlcm1pbGxlRGVmYXVsdAAyABZyZWZlcnJhbFJld2FyZFBlcm1pbGxlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFGWtleVJlZmVycmFsUmV3YXJkUGVybWlsbGUFHXJlZmVycmFsUmV3YXJkUGVybWlsbGVEZWZhdWx0AQtrZXlSZWZlcnJlcgEPcmVmZXJyYWxBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCHJlZmVycmVyCQDMCAIFE3JlZmVycmFsUHJvZ3JhbU5hbWUJAMwIAgUPcmVmZXJyYWxBZGRyZXNzBQNuaWwFA1NFUAASZW1pc3Npb25BZGRyZXNzU3RyCQEPZ2V0U3RyaW5nT3JGYWlsAQkBEmtleUVtaXNzaW9uQWRkcmVzcwAAEGVtaXNzaW9uQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEmVtaXNzaW9uQWRkcmVzc1N0cgANSWR4Q2ZnQXNzZXRJZAABABZJZHhDZmdQYWNlbWFrZXJBZGRyZXNzAAIAFklkeENmZ0Jvb3N0aW5nQ29udHJhY3QAAwAOSWR4Q2ZnTWF4RGVwdGgABAEJa2V5Q29uZmlnAAIKJXNfX2NvbmZpZwEVcmVhZENvbmZpZ0FycmF5T3JGYWlsAAkAtQkCCQEPZ2V0U3RyaW5nT3JGYWlsAQkBCWtleUNvbmZpZwAFA1NFUAEMZm9ybWF0Q29uZmlnBAx3eEFzc2V0SWRTdHIabWF0Y2hlclBhY2VtYWtlckFkZHJlc3NTdHIaYm9vc3RpbmdDb250cmFjdEFkZHJlc3NTdHIIbWF4RGVwdGgJALkJAgkAzAgCAgglcyVzJXMlZAkAzAgCBQx3eEFzc2V0SWRTdHIJAMwIAgUabWF0Y2hlclBhY2VtYWtlckFkZHJlc3NTdHIJAMwIAgUaYm9vc3RpbmdDb250cmFjdEFkZHJlc3NTdHIJAMwIAgkApAMBBQhtYXhEZXB0aAUDbmlsBQNTRVABFmJvb3N0aW5nQ29udHJhY3RPckZhaWwABAhjZmdBcnJheQkBFXJlYWRDb25maWdBcnJheU9yRmFpbAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFCGNmZ0FycmF5BRZJZHhDZmdCb29zdGluZ0NvbnRyYWN0Aihib29zdGluZyBjb250cmFjdCBhZGRyZXNzIGlzIG5vdCBkZWZpbmVkAR9rZXlHd3hSZXdhcmRFbWlzc2lvblN0YXJ0SGVpZ2h0AAIoJXMlc19fZ3d4UmV3YXJkRW1pc3Npb25QYXJ0X19zdGFydEhlaWdodAENa2V5VXNlcnNDb3VudAACDyVzX19uZXh0VXNlck51bQEWa2V5UmF0ZVBlckJsb2NrQ3VycmVudAACGyVzJXNfX3JhdGVQZXJCbG9ja19fY3VycmVudAEUa2V5UG9vbFdlaWdodFZpcnR1YWwAAiAlcyVzX19wb29sV2VpZ2h0X19HV1h2aXJ0dWFsUE9PTAEUa2V5TmV4dFByb2Nlc3NlZFVzZXIAAhUlc19fbmV4dFByb2Nlc3NlZFVzZXIBD2tleUxhdGVzdFBlcmlvZAACECVzX19sYXRlc3RQZXJpb2QBDWtleU5leHRQZXJpb2QAAg4lc19fbmV4dFBlcmlvZAESa2V5UHJvY2Vzc2luZ1N0YWdlAAITJXNfX3Byb2Nlc3NpbmdTdGFnZQEWa2V5TmV4dFByb2Nlc3NlZFBlcmlvZAACFyVzX19uZXh0UHJvY2Vzc2VkUGVyaW9kARtrZXlOZXh0VW5sYWltZWRQZXJpb2RPZlVzZXIBCXVzZXJJbmRleAkAuQkCCQDMCAICFyVzJWRfX25leHRDbGFpbWVkUGVyaW9kCQDMCAIJAKQDAQUJdXNlckluZGV4BQNuaWwFA1NFUAEca2V5TGFzdFByb2Nlc3NlZFBlcmlvZE9mVXNlcgEJdXNlckluZGV4CQC5CQIJAMwIAgIZJXMlZF9fbGFzdFByb2Nlc3NlZFBlcmlvZAkAzAgCCQCkAwEFCXVzZXJJbmRleAUDbmlsBQNTRVABEmtleUhlaWdodEZvclBlcmlvZAEGcGVyaW9kCQC5CQIJAMwIAgIaJXMlZF9fc3RhcnRIZWlnaHRGb3JQZXJpb2QJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQAR1rZXlBdXhFbWlzc2lvblJld2FyZEZvclBlcmlvZAEGcGVyaW9kCQC5CQIJAMwIAgIXJXMlZF9fYXV4RW1pc3Npb25SZXdhcmQJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARdrZXlUb3RhbEFtb3VudEZvclBlcmlvZAEGcGVyaW9kCQC5CQIJAMwIAgIaJXMlZF9fdG90YWxBbW91bnRGb3JQZXJpb2QJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARFrZXlMYXN0UGF5b3V0SW5mbwACEiVzX19sYXN0UGF5b3V0SW5mbwEQUGVyaW9kUGF5b3V0SW5mbwMGcGVyaW9kDW1hdGNoZXJSZXdhcmQOZW1pc3Npb25SZXdhcmQJALkJAgkAzAgCAgYlZCVkJWQJAMwIAgkApAMBBQZwZXJpb2QJAMwIAgkApAMBBQ1tYXRjaGVyUmV3YXJkCQDMCAIJAKQDAQUOZW1pc3Npb25SZXdhcmQFA25pbAUDU0VQARRrZXlQYXlvdXRIaXN0b3J5SW5mbwEGcGVyaW9kCQC5CQIJAMwIAgIYJXMlcyVkX19wYXlvdXRzX19oaXN0b3J5CQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEXa2V5VG90YWxXZWlnaHRGb3JQZXJpb2QBBnBlcmlvZAkAuQkCCQDMCAICGiVzJWRfX3RvdGFsV2VpZ2h0Rm9yUGVyaW9kCQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEWa2V5VXNlcktWYWx1ZUZvclBlcmlvZAIGcGVyaW9kCXVzZXJJbmRleAkAuQkCCQDMCAICFyVzJWQlcyVkX19wYXJhbUJ5UGVyaW9kCQDMCAIJAKQDAQUJdXNlckluZGV4CQDMCAICAWsJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARZrZXlVc2VyQlZhbHVlRm9yUGVyaW9kAgZwZXJpb2QJdXNlckluZGV4CQC5CQIJAMwIAgIXJXMlZCVzJWRfX3BhcmFtQnlQZXJpb2QJAMwIAgkApAMBBQl1c2VySW5kZXgJAMwIAgIBYgkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABFmtleVVzZXJXZWlnaHRGb3JQZXJpb2QCBnBlcmlvZAl1c2VySW5kZXgJALkJAgkAzAgCAhclcyVkJXMlZF9fcGFyYW1CeVBlcmlvZAkAzAgCCQCkAwEFCXVzZXJJbmRleAkAzAgCAgZ3ZWlnaHQJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARtrZXlSZWZlcnJhbHNDb250cmFjdEFkZHJlc3MACQC5CQIJAMwIAgIEJXMlcwkAzAgCAgZjb25maWcJAMwIAgIYcmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzBQNuaWwFA1NFUAAecmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzT3JGYWlsCQERQGV4dHJOYXRpdmUoMTA2MikBCQEPZ2V0U3RyaW5nT3JGYWlsAQkBG2tleVJlZmVycmFsc0NvbnRyYWN0QWRkcmVzcwABDEhpc3RvcnlFbnRyeQcEdHlwZQR1c2VyEWFtb3VudEZyb21NYXRjaGVyEmFtb3VudEZyb21FbWlzc2lvbg1jdXJyZW50UGVyaW9kDGxhdGVzdFBlcmlvZAFpBApoaXN0b3J5S0VZCQC5CQIJAMwIAgIRJXMlcyVzJXNfX2hpc3RvcnkJAMwIAgUEdHlwZQkAzAgCBQR1c2VyCQDMCAIJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAUDbmlsBQNTRVAEC2hpc3RvcnlEQVRBCQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQgFCWxhc3RCbG9jawZoZWlnaHQJAMwIAgkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQCkAwEFEWFtb3VudEZyb21NYXRjaGVyCQDMCAIJAKQDAQUSYW1vdW50RnJvbUVtaXNzaW9uCQDMCAIJAKQDAQUNY3VycmVudFBlcmlvZAkAzAgCCQCkAwEFDGxhdGVzdFBlcmlvZAUDbmlsBQNTRVAJAQtTdHJpbmdFbnRyeQIFCmhpc3RvcnlLRVkFC2hpc3RvcnlEQVRBARNrZXlNYW5hZ2VyUHVibGljS2V5AAIUJXNfX21hbmFnZXJQdWJsaWNLZXkBGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAIbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5ARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAQHJG1hdGNoMAkAoggBCQETa2V5TWFuYWdlclB1YmxpY0tleQADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQDZBAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAR1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdAAEByRtYXRjaDAJAKIIAQkBGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJANkEAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBC211c3RNYW5hZ2VyAQFpBAJwZAkAAgECEVBlcm1pc3Npb24gZGVuaWVkBAckbWF0Y2gwCQEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCcGsFByRtYXRjaDADCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQJwawYFAnBkAwkAAQIFByRtYXRjaDACBFVuaXQDCQAAAggFAWkGY2FsbGVyBQR0aGlzBgUCcGQJAAIBAgtNYXRjaCBlcnJvcgEOY2FsY1VzZXJXZWlnaHQEF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzD2hlaWdodEZvclBlcmlvZAZwZXJpb2QJdXNlckluZGV4BAVrTGFzdAkBHGtleUxhc3RQcm9jZXNzZWRQZXJpb2RPZlVzZXIBBQl1c2VySW5kZXgEBGtLZXkJARZrZXlVc2VyS1ZhbHVlRm9yUGVyaW9kAgUGcGVyaW9kBQl1c2VySW5kZXgEBGtSYXcJAJoIAgUXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MFBGtLZXkEC2tVc2VyV2VpZ2h0CQEWa2V5VXNlcldlaWdodEZvclBlcmlvZAIFBnBlcmlvZAUJdXNlckluZGV4AwkBCWlzRGVmaW5lZAEFBGtSYXcEAWsJAQV2YWx1ZQEFBGtSYXcEAWIJAQV2YWx1ZQEJAJoIAgUXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MJARZrZXlVc2VyQlZhbHVlRm9yUGVyaW9kAgUGcGVyaW9kBQl1c2VySW5kZXgEAXcJAGQCCQBoAgUBawUPaGVpZ2h0Rm9yUGVyaW9kBQFiAwkAZgIFAXcAAAkAlAoCCQBpAgUBdwUFU0NBTEUJAMwIAgkBDEludGVnZXJFbnRyeQIFBWtMYXN0BQZwZXJpb2QJAMwIAgkBDEludGVnZXJFbnRyeQIFC2tVc2VyV2VpZ2h0BQF3BQNuaWwJAJQKAgAABQNuaWwEAXAJAJoIAgUEdGhpcwUFa0xhc3QDAwkBCWlzRGVmaW5lZAEFAXAJAGcCBQZwZXJpb2QJAQV2YWx1ZQEFAXAHBAJwdgkBBXZhbHVlAQUBcAQBawkBBXZhbHVlAQkAmggCBRdib29zdGluZ0NvbnRyYWN0QWRkcmVzcwkBFmtleVVzZXJLVmFsdWVGb3JQZXJpb2QCBQJwdgUJdXNlckluZGV4BAFiCQEFdmFsdWUBCQCaCAIFF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzCQEWa2V5VXNlckJWYWx1ZUZvclBlcmlvZAIFAnB2BQl1c2VySW5kZXgEAXcJAGQCCQBoAgUBawUPaGVpZ2h0Rm9yUGVyaW9kBQFiAwkAZgIFAXcAAAkAlAoCCQBpAgUBdwUFU0NBTEUJAMwIAgkBDEludGVnZXJFbnRyeQIFC2tVc2VyV2VpZ2h0BQF3BQNuaWwJAJQKAgAABQNuaWwJAJQKAgAABQNuaWwBFmNhbGNVc2VyV2VpZ2h0Rm9yQ2xhaW0EF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzD2hlaWdodEZvclBlcmlvZAZwZXJpb2QJdXNlckluZGV4BAtrVXNlcldlaWdodAkBFmtleVVzZXJXZWlnaHRGb3JQZXJpb2QCBQZwZXJpb2QFCXVzZXJJbmRleAQQdXNlcldlaWdodE9yVW5pdAkAnwgBBQtrVXNlcldlaWdodAQHJG1hdGNoMAUQdXNlcldlaWdodE9yVW5pdAMJAAECBQckbWF0Y2gwAgRVbml0AAADCQABAgUHJG1hdGNoMAIDSW50BAF3BQckbWF0Y2gwCQBpAgUBdwUFU0NBTEUJAAIBAgtNYXRjaCBlcnJvcgEVZ2V0VXNlckluZGV4QnlBZGRyZXNzAhpib29zdGluZ0NvbnRyYWN0QWRkcmVzc1N0cgt1c2VyQWRkcmVzcwQDa2V5CQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICB21hcHBpbmcJAMwIAgIIdXNlcjJudW0JAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQCQENcGFyc2VJbnRWYWx1ZQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQEHQWRkcmVzcwEJANkEAQUaYm9vc3RpbmdDb250cmFjdEFkZHJlc3NTdHIFA2tleQkArAICCQCsAgIJAKwCAgINVXNlciBhZGRyZXNzIAULdXNlckFkZHJlc3MCLSBpcyBub3QgZm91bmQgaW4gYm9vc3RpbmcgY29udHJhY3QgZGF0YSwga2V5PQUDa2V5AQpuZXh0UGVyaW9kAAkBDmdldE51bWJlckJ5S2V5AQkBDWtleU5leHRQZXJpb2QAAQtpbnZva2VDbGFpbQYQYm9vc3RpbmdDb250cmFjdAZwZXJpb2QEdXNlcgVkZXB0aBB0b3RhbEZyb21NYXRjaGVyEXRvdGFsRnJvbUVtaXNzaW9uBAZyZXN1bHQJAPwHBAUEdGhpcwIOY2xhaW1OZXh0QmF0Y2gJAMwIAgUQYm9vc3RpbmdDb250cmFjdAkAzAgCBQZwZXJpb2QJAMwIAgUEdXNlcgkAzAgCBQVkZXB0aAkAzAgCBRB0b3RhbEZyb21NYXRjaGVyCQDMCAIFEXRvdGFsRnJvbUVtaXNzaW9uBQNuaWwFA25pbAMJAAACBQZyZXN1bHQFBnJlc3VsdAQHJG1hdGNoMAUGcmVzdWx0AwkAAQIFByRtYXRjaDACDyhJbnQsIEludCwgSW50KQQBcgUHJG1hdGNoMAUBcgkAAgECF0luY29ycmVjdCBpbnZva2UgcmVzdWx0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ1jbGFpbUludGVybmFsBhBib29zdGluZ0NvbnRyYWN0DWN1cnJlbnRQZXJpb2QLY3VycmVudFVzZXIFZGVwdGgWdXNlckFjY3VtdWxhdGVkTWF0Y2hlchd1c2VyQWNjdW11bGF0ZWRFbWlzc2lvbgQXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MJAQdBZGRyZXNzAQUQYm9vc3RpbmdDb250cmFjdAQMbGF0ZXN0UGVyaW9kCQEOZ2V0TnVtYmVyQnlLZXkBCQEWa2V5TmV4dFByb2Nlc3NlZFBlcmlvZAAEC3RvdGFsV2VpZ2h0CQEOZ2V0TnVtYmVyQnlLZXkBCQEXa2V5VG90YWxXZWlnaHRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBA9oZWlnaHRGb3JQZXJpb2QJAQ5nZXROdW1iZXJCeUtleQEJARJrZXlIZWlnaHRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBAp1c2VyV2VpZ2h0CQEWY2FsY1VzZXJXZWlnaHRGb3JDbGFpbQQFF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzBQ9oZWlnaHRGb3JQZXJpb2QFDWN1cnJlbnRQZXJpb2QFC2N1cnJlbnRVc2VyBBp1c2VyQW1vdW50TWF0Y2hlckZvclBlcmlvZAkAawMJAQ5nZXROdW1iZXJCeUtleQEJARdrZXlUb3RhbEFtb3VudEZvclBlcmlvZAEFDWN1cnJlbnRQZXJpb2QFCnVzZXJXZWlnaHQFC3RvdGFsV2VpZ2h0BBt1c2VyQW1vdW50RW1pc3Npb25Gb3JQZXJpb2QJAGsDCQEOZ2V0TnVtYmVyQnlLZXkBCQEda2V5QXV4RW1pc3Npb25SZXdhcmRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBQp1c2VyV2VpZ2h0BQt0b3RhbFdlaWdodAMDCQBnAgAABQVkZXB0aAYJAGcCCQBkAgUNY3VycmVudFBlcmlvZAABBQxsYXRlc3RQZXJpb2QJAJUKAwkAZAIFDWN1cnJlbnRQZXJpb2QAAQkAZAIFFnVzZXJBY2N1bXVsYXRlZE1hdGNoZXIFGnVzZXJBbW91bnRNYXRjaGVyRm9yUGVyaW9kCQBkAgUXdXNlckFjY3VtdWxhdGVkRW1pc3Npb24FG3VzZXJBbW91bnRFbWlzc2lvbkZvclBlcmlvZAkBC2ludm9rZUNsYWltBgUQYm9vc3RpbmdDb250cmFjdAkAZAIFDWN1cnJlbnRQZXJpb2QAAQULY3VycmVudFVzZXIJAGUCBQVkZXB0aAABCQBkAgUWdXNlckFjY3VtdWxhdGVkTWF0Y2hlcgUadXNlckFtb3VudE1hdGNoZXJGb3JQZXJpb2QJAGQCBRd1c2VyQWNjdW11bGF0ZWRFbWlzc2lvbgUbdXNlckFtb3VudEVtaXNzaW9uRm9yUGVyaW9kARFjb21tb25DbGFpbVJld2FyZAILdXNlckFkZHJlc3MLc3RhcnRQZXJpb2QECGNmZ0FycmF5CQEVcmVhZENvbmZpZ0FycmF5T3JGYWlsAAQHdXNlcklkeAkBFWdldFVzZXJJbmRleEJ5QWRkcmVzcwIJAJEDAgUIY2ZnQXJyYXkFFklkeENmZ0Jvb3N0aW5nQ29udHJhY3QFC3VzZXJBZGRyZXNzBA1jdXJyZW50UGVyaW9kAwkBAiE9AgULc3RhcnRQZXJpb2QFBHVuaXQJAQV2YWx1ZQEFC3N0YXJ0UGVyaW9kCQEOZ2V0TnVtYmVyQnlLZXkBCQEba2V5TmV4dFVubGFpbWVkUGVyaW9kT2ZVc2VyAQUHdXNlcklkeAQTbmV4dFByb2Nlc3NlZFBlcmlvZAkBDmdldE51bWJlckJ5S2V5AQkBFmtleU5leHRQcm9jZXNzZWRQZXJpb2QAAwkAZwIFDWN1cnJlbnRQZXJpb2QFE25leHRQcm9jZXNzZWRQZXJpb2QJAAIBAhBOb3RoaW5nIHRvIGNsYWltBBBib29zdGluZ0NvbnRyYWN0CQDZBAEJAJEDAgUIY2ZnQXJyYXkFFklkeENmZ0Jvb3N0aW5nQ29udHJhY3QEDSR0MDEyNTY5MTI2OTUJAQ1jbGFpbUludGVybmFsBgUQYm9vc3RpbmdDb250cmFjdAUNY3VycmVudFBlcmlvZAUHdXNlcklkeAUJVVNFUkRFUFRIAAAAAAQGcGVyaW9kCAUNJHQwMTI1NjkxMjY5NQJfMQQRYW1vdW50RnJvbU1hdGNoZXIIBQ0kdDAxMjU2OTEyNjk1Al8yBBJhbW91bnRGcm9tRW1pc3Npb24IBQ0kdDAxMjU2OTEyNjk1Al8zCQCYCgYFBnBlcmlvZAURYW1vdW50RnJvbU1hdGNoZXIFEmFtb3VudEZyb21FbWlzc2lvbgUHdXNlcklkeAUIY2ZnQXJyYXkFE25leHRQcm9jZXNzZWRQZXJpb2QWAWkBDmZpbmFsaXplSGVscGVyAAQPcHJvY2Vzc2luZ1N0YWdlCQELdmFsdWVPckVsc2UCCQCfCAEJARJrZXlQcm9jZXNzaW5nU3RhZ2UABRRwcm9jZXNzaW5nU3RhZ2VUb3RhbAQNY3VycmVudFBlcmlvZAkBDmdldE51bWJlckJ5S2V5AQkBFmtleU5leHRQcm9jZXNzZWRQZXJpb2QABAtjdXJyZW50VXNlcgkBDmdldE51bWJlckJ5S2V5AQkBFGtleU5leHRQcm9jZXNzZWRVc2VyAAQMbGF0ZXN0UGVyaW9kCQEOZ2V0TnVtYmVyQnlLZXkBCQEPa2V5TGF0ZXN0UGVyaW9kAAQKdXNlcnNDb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCCQEWYm9vc3RpbmdDb250cmFjdE9yRmFpbAAJAQ1rZXlVc2Vyc0NvdW50AAAABA50b3RhbFdlaWdodEtleQkBF2tleVRvdGFsV2VpZ2h0Rm9yUGVyaW9kAQUNY3VycmVudFBlcmlvZAQLdG90YWxXZWlnaHQJAQ5nZXROdW1iZXJCeUtleQEJARdrZXlUb3RhbFdlaWdodEZvclBlcmlvZAEFDWN1cnJlbnRQZXJpb2QED2hlaWdodEZvclBlcmlvZAkBDmdldE51bWJlckJ5S2V5AQkBEmtleUhlaWdodEZvclBlcmlvZAEFDWN1cnJlbnRQZXJpb2QDCQBmAgUNY3VycmVudFBlcmlvZAUMbGF0ZXN0UGVyaW9kCQCUCgIFA25pbAcDCQAAAgUPcHJvY2Vzc2luZ1N0YWdlBRRwcm9jZXNzaW5nU3RhZ2VUb3RhbAQNJHQwMTM2ODUxMzgwMQkBDmNhbGNVc2VyV2VpZ2h0BAkBFmJvb3N0aW5nQ29udHJhY3RPckZhaWwABQ9oZWlnaHRGb3JQZXJpb2QFDWN1cnJlbnRQZXJpb2QFC2N1cnJlbnRVc2VyBAp1c2VyV2VpZ2h0CAUNJHQwMTM2ODUxMzgwMQJfMQQLdXNlckFjdGlvbnMIBQ0kdDAxMzY4NTEzODAxAl8yBA50b3RhbFdlaWdodE5ldwkAZAIFC3RvdGFsV2VpZ2h0BQp1c2VyV2VpZ2h0BBFwcm9jZXNzaW5nQWN0aW9ucwMJAGYCCQBlAgUKdXNlcnNDb3VudAABBQtjdXJyZW50VXNlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleU5leHRQcm9jZXNzZWRVc2VyAAkAZAIFC2N1cnJlbnRVc2VyAAEFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmtleVByb2Nlc3NpbmdTdGFnZQAFFXByb2Nlc3NpbmdTdGFnZVNoYXJlcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleU5leHRQcm9jZXNzZWRVc2VyAAAABQNuaWwJAJQKAgkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFDnRvdGFsV2VpZ2h0S2V5BQ50b3RhbFdlaWdodE5ldwUDbmlsBRFwcm9jZXNzaW5nQWN0aW9ucwULdXNlckFjdGlvbnMGAwkAAAIFD3Byb2Nlc3NpbmdTdGFnZQUVcHJvY2Vzc2luZ1N0YWdlU2hhcmVzBAp1c2VyV2VpZ2h0CQEWY2FsY1VzZXJXZWlnaHRGb3JDbGFpbQQJARZib29zdGluZ0NvbnRyYWN0T3JGYWlsAAUPaGVpZ2h0Rm9yUGVyaW9kBQ1jdXJyZW50UGVyaW9kBQtjdXJyZW50VXNlcgQadXNlckFtb3VudE1hdGNoZXJGb3JQZXJpb2QJAGsDCQEOZ2V0TnVtYmVyQnlLZXkBCQEXa2V5VG90YWxBbW91bnRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBQp1c2VyV2VpZ2h0BQt0b3RhbFdlaWdodAQbdXNlckFtb3VudEVtaXNzaW9uRm9yUGVyaW9kCQBrAwkBDmdldE51bWJlckJ5S2V5AQkBHWtleUF1eEVtaXNzaW9uUmV3YXJkRm9yUGVyaW9kAQUNY3VycmVudFBlcmlvZAUKdXNlcldlaWdodAULdG90YWxXZWlnaHQED3VzZXJUb3RhbEFtb3VudAkAZAIFG3VzZXJBbW91bnRFbWlzc2lvbkZvclBlcmlvZAUadXNlckFtb3VudE1hdGNoZXJGb3JQZXJpb2QEC3VzZXJBZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA1MykCCQEWYm9vc3RpbmdDb250cmFjdE9yRmFpbAAJARNrZXlOdW1Ub1VzZXJNYXBwaW5nAQULY3VycmVudFVzZXIECHJlZmVycmVyCQCdCAIFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAkBC2tleVJlZmVycmVyAQULdXNlckFkZHJlc3MEEWFjdGl2ZVJlZmVycmFsSW52AwkAAAIFCHJlZmVycmVyBQR1bml0BQR1bml0CQD8BwQFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAIWdXBkYXRlUmVmZXJyYWxBY3Rpdml0eQkAzAgCBRNyZWZlcnJhbFByb2dyYW1OYW1lCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIJAGcCBQp1c2VyV2VpZ2h0BRRyZWZlcnJhbE1pbkdXeEFtb3VudAUDbmlsBQNuaWwDCQAAAgURYWN0aXZlUmVmZXJyYWxJbnYFEWFjdGl2ZVJlZmVycmFsSW52BAtyZWZlcnJhbEludgMDCQAAAgUIcmVmZXJyZXIFBHVuaXQGCQBmAgUUcmVmZXJyYWxNaW5HV3hBbW91bnQFCnVzZXJXZWlnaHQFBHVuaXQEDnJlZmVycmVyUmV3YXJkCQBrAwUPdXNlclRvdGFsQW1vdW50BRZyZWZlcnJlclJld2FyZFBlcm1pbGxlBQVTQ0FMRQQOcmVmZXJyYWxSZXdhcmQJAGsDBQ91c2VyVG90YWxBbW91bnQFFnJlZmVycmFsUmV3YXJkUGVybWlsbGUFBVNDQUxFCQD8BwQFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAIMaW5jVW5jbGFpbWVkCQDMCAIFE3JlZmVycmFsUHJvZ3JhbU5hbWUJAMwIAgULdXNlckFkZHJlc3MJAMwIAgUOcmVmZXJyZXJSZXdhcmQJAMwIAgUOcmVmZXJyYWxSZXdhcmQFA25pbAUDbmlsAwkAAAIFC3JlZmVycmFsSW52BQtyZWZlcnJhbEludgQRcHJvY2Vzc2luZ0FjdGlvbnMDCQBmAgUKdXNlcnNDb3VudAULY3VycmVudFVzZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlOZXh0UHJvY2Vzc2VkVXNlcgAJAGQCBQtjdXJyZW50VXNlcgABBQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlOZXh0UHJvY2Vzc2VkUGVyaW9kAAkAZAIFDWN1cnJlbnRQZXJpb2QAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleU5leHRQcm9jZXNzZWRVc2VyAAAABQNuaWwJAJQKAgURcHJvY2Vzc2luZ0FjdGlvbnMGCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIYaW52YWxpZCBwcm9jZXNzaW5nIHN0YWdlAWkBD2ZpbmFsaXplV3JhcHBlcgEHY291bnRlcgQGcmVzdWx0CgABQAkA/AcEBQR0aGlzAg5maW5hbGl6ZUhlbHBlcgUDbmlsBQNuaWwDCQABAgUBQAIHQm9vbGVhbgUBQAkAAgEJAKwCAgkAAwEJAPwHBAUEdGhpcwIOZmluYWxpemVIZWxwZXIFA25pbAUDbmlsAhwgY291bGRuJ3QgYmUgY2FzdCB0byBCb29sZWFuAwkAAAIFBnJlc3VsdAUGcmVzdWx0AwMJAQEhAQUGcmVzdWx0CQAAAgUHY291bnRlcgUIbWF4RGVwdGgHCQACAQISTm90aGluZyB0byBwcm9jZXNzAwkAZgIFB2NvdW50ZXIAAAkAlAoCBQNuaWwJAPwHBAUEdGhpcwIPZmluYWxpemVXcmFwcGVyCQDMCAIJAGUCBQdjb3VudGVyAAEFA25pbAUDbmlsCQCUCgIFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAR1wcm9jZXNzUGVuZGluZ1BlcmlvZHNBbmRVc2VycwAJAJQKAgUDbmlsCQD8BwQFBHRoaXMCD2ZpbmFsaXplV3JhcHBlcgkAzAgCBQhtYXhEZXB0aAUDbmlsBQNuaWwBaQEHZGVwb3NpdAAECGNmZ0FycmF5CQEVcmVhZENvbmZpZ0FycmF5T3JGYWlsAAMJAQIhPQIIBQFpBmNhbGxlcgkBB0FkZHJlc3MBCQDZBAEJAJEDAgUIY2ZnQXJyYXkFFklkeENmZ1BhY2VtYWtlckFkZHJlc3MJAAIBAhRXcm9uZyBjYWxsZXIgYWRkcmVzcwQHYXNzZXRJZAkBBXZhbHVlAQgJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAwkBAiE9AgUHYXNzZXRJZAkA2QQBCQCRAwIFCGNmZ0FycmF5BQ1JZHhDZmdBc3NldElkCQACAQITV3JvbmcgcGF5bWVudCBhc3NldAQGcGVyaW9kCQEKbmV4dFBlcmlvZAAEBmRlbHRhSAkAZQIFBmhlaWdodAkBD2dldE51bWJlck9yRmFpbAEJAR9rZXlHd3hSZXdhcmRFbWlzc2lvblN0YXJ0SGVpZ2h0AAQMZW1pc3Npb25SYXRlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUQZW1pc3Npb25Db250cmFjdAkBFmtleVJhdGVQZXJCbG9ja0N1cnJlbnQACQCsAgIJAKwCAgIcbWFuZGF0b3J5IGVtaXNzaW9uX2NvbnRyYWN0LgkBFmtleVJhdGVQZXJCbG9ja0N1cnJlbnQAAg8gaXMgbm90IGRlZmluZWQEBndlaWdodAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFD2ZhY3RvcnlDb250cmFjdAkBFGtleVBvb2xXZWlnaHRWaXJ0dWFsAAkArAICCQCsAgICG21hbmRhdG9yeSBmYWN0b3J5X2NvbnRyYWN0LgkBFGtleVBvb2xXZWlnaHRWaXJ0dWFsAAIPIGlzIG5vdCBkZWZpbmVkBAlhdXhBbW91bnQJAGsDCQBoAgUGZGVsdGFIBQZ3ZWlnaHQFDGVtaXNzaW9uUmF0ZQUFTVVMVDgEAmVtCQD8BwQFEGVtaXNzaW9uQ29udHJhY3QCBGVtaXQJAMwIAgUJYXV4QW1vdW50BQNuaWwFA25pbAMJAAACBQJlbQUCZW0EC21hdGNoZXJQYXJ0CAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAQKcGF5b3V0SW5mbwkBEFBlcmlvZFBheW91dEluZm8DBQZwZXJpb2QFC21hdGNoZXJQYXJ0BQlhdXhBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlMYXRlc3RQZXJpb2QABQZwZXJpb2QJAMwIAgkBDEludGVnZXJFbnRyeQIJARJrZXlIZWlnaHRGb3JQZXJpb2QBBQZwZXJpb2QFBmhlaWdodAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBHWtleUF1eEVtaXNzaW9uUmV3YXJkRm9yUGVyaW9kAQUGcGVyaW9kBQlhdXhBbW91bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAR9rZXlHd3hSZXdhcmRFbWlzc2lvblN0YXJ0SGVpZ2h0AAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEXa2V5VG90YWxBbW91bnRGb3JQZXJpb2QBBQZwZXJpb2QFC21hdGNoZXJQYXJ0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQENa2V5TmV4dFBlcmlvZAAJAGQCBQZwZXJpb2QAAQkAzAgCCQELU3RyaW5nRW50cnkCCQERa2V5TGFzdFBheW91dEluZm8ABQpwYXlvdXRJbmZvCQDMCAIJAQtTdHJpbmdFbnRyeQIJARRrZXlQYXlvdXRIaXN0b3J5SW5mbwEFBnBlcmlvZAUKcGF5b3V0SW5mbwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmNsYWltTmV4dEJhdGNoBhBib29zdGluZ0NvbnRyYWN0DWN1cnJlbnRQZXJpb2QLY3VycmVudFVzZXIFZGVwdGgQdG90YWxGcm9tTWF0Y2hlchF0b3RhbEZyb21FbWlzc2lvbgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECJFNob3VsZCBiZSBjYWxsZWQgYnkgdGhpcyBzY3JpcHQgb25seQQPcGVyaW9kQW5kVG90YWxzCQENY2xhaW1JbnRlcm5hbAYFEGJvb3N0aW5nQ29udHJhY3QFDWN1cnJlbnRQZXJpb2QFC2N1cnJlbnRVc2VyBQVkZXB0aAUQdG90YWxGcm9tTWF0Y2hlcgURdG90YWxGcm9tRW1pc3Npb24JAJQKAgUDbmlsBQ9wZXJpb2RBbmRUb3RhbHMBaQELY2xhaW1SZXdhcmQABAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgQNJHQwMTkyNjUxOTM5MQkBEWNvbW1vbkNsYWltUmV3YXJkAgUHYWRkcmVzcwUEdW5pdAQGcGVyaW9kCAUNJHQwMTkyNjUxOTM5MQJfMQQRYW1vdW50RnJvbU1hdGNoZXIIBQ0kdDAxOTI2NTE5MzkxAl8yBBJhbW91bnRGcm9tRW1pc3Npb24IBQ0kdDAxOTI2NTE5MzkxAl8zBAd1c2VySWR4CAUNJHQwMTkyNjUxOTM5MQJfNAQIY2ZnQXJyYXkIBQ0kdDAxOTI2NTE5MzkxAl81BBNuZXh0UHJvY2Vzc2VkUGVyaW9kCAUNJHQwMTkyNjUxOTM5MQJfNgkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEba2V5TmV4dFVubGFpbWVkUGVyaW9kT2ZVc2VyAQUHdXNlcklkeAUGcGVyaW9kCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZAIFEWFtb3VudEZyb21NYXRjaGVyBRJhbW91bnRGcm9tRW1pc3Npb24JANkEAQkAkQMCBQhjZmdBcnJheQUNSWR4Q2ZnQXNzZXRJZAkAzAgCCQEMSGlzdG9yeUVudHJ5BwIFY2xhaW0FB2FkZHJlc3MFEWFtb3VudEZyb21NYXRjaGVyBRJhbW91bnRGcm9tRW1pc3Npb24FBnBlcmlvZAUTbmV4dFByb2Nlc3NlZFBlcmlvZAUBaQUDbmlsCQDMCAIFEWFtb3VudEZyb21NYXRjaGVyCQDMCAIFEmFtb3VudEZyb21FbWlzc2lvbgUDbmlsAWkBE2NsYWltUmV3YXJkUkVBRE9OTFkBB2FkZHJlc3MEDGNsYWltUmVzdWx0cwkBEWNvbW1vbkNsYWltUmV3YXJkAgUHYWRkcmVzcwUEdW5pdAQGYW1vdW50CQBkAggFDGNsYWltUmVzdWx0cwJfMggFDGNsYWltUmVzdWx0cwJfMwkAlAoCBQNuaWwFBmFtb3VudAFpARxjbGFpbVJld2FyZFBhZ2luYXRlZFJFQURPTkxZAgdhZGRyZXNzC3N0YXJ0UGVyaW9kBA0kdDAyMDEzNDIwMjUxCQERY29tbW9uQ2xhaW1SZXdhcmQCBQdhZGRyZXNzAwkAZgIAAAULc3RhcnRQZXJpb2QFBHVuaXQFC3N0YXJ0UGVyaW9kBAZwZXJpb2QIBQ0kdDAyMDEzNDIwMjUxAl8xBAtmcm9tTWF0Y2hlcggFDSR0MDIwMTM0MjAyNTECXzIEDGZyb21FbWlzc2lvbggFDSR0MDIwMTM0MjAyNTECXzMEBmFtb3VudAkAZAIFC2Zyb21NYXRjaGVyBQxmcm9tRW1pc3Npb24JAJQKAgUDbmlsCQCUCgIFBmFtb3VudAUGcGVyaW9kAWkBG2NsYWltUmV3YXJkRGV0YWlsZWRSRUFET05MWQEHYWRkcmVzcwQNJHQwMjA1MDIyMDU3NwkBEWNvbW1vbkNsYWltUmV3YXJkAgUHYWRkcmVzcwUEdW5pdAQHaWdub3JlZAgFDSR0MDIwNTAyMjA1NzcCXzEEC2Zyb21NYXRjaGVyCAUNJHQwMjA1MDIyMDU3NwJfMgQMZnJvbUVtaXNzaW9uCAUNJHQwMjA1MDIyMDU3NwJfMwkAlAoCBQNuaWwJALkJAgkAzAgCAgYlZCVkJWQJAMwIAgkApAMBCQBkAgULZnJvbU1hdGNoZXIFDGZyb21FbWlzc2lvbgkAzAgCCQCkAwEFC2Zyb21NYXRjaGVyCQDMCAIJAKQDAQUMZnJvbUVtaXNzaW9uBQNuaWwFA1NFUAFpASRjbGFpbVJld2FyZERldGFpbGVkUGFnaW5hdGVkUkVBRE9OTFkCB2FkZHJlc3MLc3RhcnRQZXJpb2QEDSR0MDIwODczMjA5OTAJARFjb21tb25DbGFpbVJld2FyZAIFB2FkZHJlc3MDCQBmAgAABQtzdGFydFBlcmlvZAUEdW5pdAULc3RhcnRQZXJpb2QEBnBlcmlvZAgFDSR0MDIwODczMjA5OTACXzEEC2Zyb21NYXRjaGVyCAUNJHQwMjA4NzMyMDk5MAJfMgQMZnJvbUVtaXNzaW9uCAUNJHQwMjA4NzMyMDk5MAJfMwkAlAoCBQNuaWwJAJQKAgkAuQkCCQDMCAICBiVkJWQlZAkAzAgCCQCkAwEJAGQCBQtmcm9tTWF0Y2hlcgUMZnJvbUVtaXNzaW9uCQDMCAIJAKQDAQULZnJvbU1hdGNoZXIJAMwIAgkApAMBBQxmcm9tRW1pc3Npb24FA25pbAUDU0VQBQZwZXJpb2QBaQEdbGF0ZXN0RmluYWxpemVkUGVyaW9kUkVBRE9OTFkBB2FkZHJlc3MJAJQKAgUDbmlsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ9rZXlMYXRlc3RQZXJpb2QAAP///////////wEBaQEhbGF0ZXN0RmluYWxpemVkUGVyaW9kSW5mb1JFQURPTkxZAQdhZGRyZXNzCQCUCgIFA25pbAkBDmdldFN0cmluZ0J5S2V5AQkBEWtleUxhc3RQYXlvdXRJbmZvAAFpARVjYWxjR3d4UGFyYW1zUkVBRE9OTFkDDmd3eEFtb3VudFN0YXJ0D2xvY2tTdGFydEhlaWdodBJsb2NrRHVyYXRpb25CbG9ja3MEDWxvY2tFbmRIZWlnaHQJAGQCBQ9sb2NrU3RhcnRIZWlnaHQFEmxvY2tEdXJhdGlvbkJsb2NrcwQMc2NhbGU4UGFyYW1LCQEBLQEJAGsDBQ5nd3hBbW91bnRTdGFydAUFU0NBTEUFEmxvY2tEdXJhdGlvbkJsb2NrcwQMc2NhbGU4UGFyYW1CCQBoAgkAawMFDmd3eEFtb3VudFN0YXJ0BQVTQ0FMRQUSbG9ja0R1cmF0aW9uQmxvY2tzBQ1sb2NrRW5kSGVpZ2h0CQCUCgIFA25pbAkAzAgCBQxzY2FsZThQYXJhbUsJAMwIAgUMc2NhbGU4UGFyYW1CCQDMCAIJAQpuZXh0UGVyaW9kAAUDbmlsAWkBGmNhbGNHd3hBbW91bnRTdGFydFJFQURPTkxZAwx3eExvY2tBbW91bnQMbG9ja0R1cmF0aW9uD21heExvY2tEdXJhdGlvbgQHY29lZmZYOAkAawMFDGxvY2tEdXJhdGlvbgUFTVVMVDgFD21heExvY2tEdXJhdGlvbgQOZ1d4QW1vdW50U3RhcnQJAGsDBQx3eExvY2tBbW91bnQFB2NvZWZmWDgFBU1VTFQ4CQCUCgIFA25pbAkAzAgCBQ5nV3hBbW91bnRTdGFydAUDbmlsAWkBC2NvbnN0cnVjdG9yBAx3eEFzc2V0SWRTdHIabWF0Y2hlclBhY2VtYWtlckFkZHJlc3NTdHIaYm9vc3RpbmdDb250cmFjdEFkZHJlc3NTdHIIbWF4RGVwdGgDCQECIT0CBQR0aGlzCAUBaQZjYWxsZXIJAAIBAg5ub3QgYXV0aG9yaXplZAkAzAgCCQELU3RyaW5nRW50cnkCCQEJa2V5Q29uZmlnAAkBDGZvcm1hdENvbmZpZwQFDHd4QXNzZXRJZFN0cgUabWF0Y2hlclBhY2VtYWtlckFkZHJlc3NTdHIFGmJvb3N0aW5nQ29udHJhY3RBZGRyZXNzU3RyBQhtYXhEZXB0aAUDbmlsAWkBDWNvbnN0cnVjdG9yVjIBDmZhY3RvcnlBZGRyZXNzAwkBAiE9AgUEdGhpcwgFAWkGY2FsbGVyCQACAQIObm90IGF1dGhvcml6ZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWtleUZhY3RvcnlBZGRyZXNzAAUOZmFjdG9yeUFkZHJlc3MFA25pbAFpAQ1jb25zdHJ1Y3RvclYzAQ9lbWlzc2lvbkFkZHJlc3MDCQECIT0CBQR0aGlzCAUBaQZjYWxsZXIJAAIBAg5ub3QgYXV0aG9yaXplZAQQaW5pdExhdGVzdFBlcmlvZAMJAQlpc0RlZmluZWQBCQCaCAIFBHRoaXMJAQ9rZXlMYXRlc3RQZXJpb2QABQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlMYXRlc3RQZXJpb2QAAP///////////wEFA25pbAkAzQgCBRBpbml0TGF0ZXN0UGVyaW9kCQELU3RyaW5nRW50cnkCCQESa2V5RW1pc3Npb25BZGRyZXNzAAUPZW1pc3Npb25BZGRyZXNzAWkBFW9uRW1pc3Npb25Gb3JHd3hTdGFydAADCQECIT0CCAUBaQZjYWxsZXIFD2ZhY3RvcnlDb250cmFjdAkAAgECEnBlcm1pc3Npb25zIGRlbmllZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBH2tleUd3eFJld2FyZEVtaXNzaW9uU3RhcnRIZWlnaHQABQZoZWlnaHQFA25pbAFpASNsYXRlc3RQZXJpb2RFbWlzc2lvblJld2FyZHNSRUFET05MWQEHYWRkcmVzcwQGcGVyaW9kCQEKbmV4dFBlcmlvZAAJAJQKAgUDbmlsCQDMCAIJAQ5nZXROdW1iZXJCeUtleQEJAR1rZXlBdXhFbWlzc2lvblJld2FyZEZvclBlcmlvZAEFBnBlcmlvZAUDbmlsAWkBBWNhbGNEBQt4MUJpZ0ludFN0cgt4MkJpZ0ludFN0cgxhbXBCaWdJbnRTdHITYVByZWNpc2lvbkJpZ0ludFN0chh0YXJnZXRQcmVjaXNpb25CaWdJbnRTdHIEBm5Db2lucwkAtgIBAAIECmFQcmVjaXNpb24JAKcDAQUTYVByZWNpc2lvbkJpZ0ludFN0cgQPdGFyZ2V0UHJlY2lzaW9uCQCnAwEFGHRhcmdldFByZWNpc2lvbkJpZ0ludFN0cgQCeDEJAKcDAQULeDFCaWdJbnRTdHIEAngyCQCnAwEFC3gyQmlnSW50U3RyBANhbXAJALkCAgkApwMBBQxhbXBCaWdJbnRTdHIFCmFQcmVjaXNpb24EAXMJALcCAgUCeDEFAngyAwkAAAIFAXMFCnplcm9CaWdJbnQJAJQKAgUDbmlsCQCmAwEFCnplcm9CaWdJbnQEA2FubgkAuQICBQNhbXAFBm5Db2lucwQDYXJyCQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwUDbmlsCgEEY2FsYwIDYWNjA2N1cgQNJHQwMjQ0NzkyNDY2OAUDYWNjBAFkCAUNJHQwMjQ0NzkyNDY2OAJfMQQFZFByZXYIBQ0kdDAyNDQ3OTI0NjY4Al8yBAJkcAkAugICCQC5AgIJALkCAgUBZAUBZAUBZAkAuQICCQC5AgIJALkCAgUCeDEFAngyBQZuQ29pbnMFBm5Db2lucwQFZE5leHQJALoCAgkAuQICCQC3AgIJALoCAgkAuQICBQNhbm4FAXMFCmFQcmVjaXNpb24JALkCAgUCZHAFBm5Db2lucwUBZAkAtwICCQC6AgIJALkCAgkAuAICBQNhbm4FCmFQcmVjaXNpb24FAWQFCmFQcmVjaXNpb24JALkCAgkAtwICBQZuQ29pbnMJALYCAQABBQJkcAkAlAoCBQVkTmV4dAUBZAQNJHQwMjQ4ODEyNDkzMQoAAiRsBQNhcnIKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFAXMFBHVuaXQKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGNhbGMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDcJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwQFZE5leHQIBQ0kdDAyNDg4MTI0OTMxAl8xBAVkUHJldggFDSR0MDI0ODgxMjQ5MzECXzIEBWREaWZmCQEDYWJzAQkAuAICBQVkTmV4dAkBBXZhbHVlAQUFZFByZXYDCQDAAgIFD3RhcmdldFByZWNpc2lvbgUFZERpZmYJAJQKAgUDbmlsCQCmAwEFBWROZXh0CQACAQkArAICAh1EIGNhbGN1bGF0aW9uIGVycm9yLCBkRGlmZiA9IAkApgMBBQVkRGlmZgFpAQpzZXRNYW5hZ2VyARdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQQLY2hlY2tDYWxsZXIJAQttdXN0TWFuYWdlcgEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyBBVjaGVja01hbmFnZXJQdWJsaWNLZXkJANkEAQUXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkDCQAAAgUVY2hlY2tNYW5hZ2VyUHVibGljS2V5BRVjaGVja01hbmFnZXJQdWJsaWNLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAUXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5jb25maXJtTWFuYWdlcgAEAnBtCQEdcGVuZGluZ01hbmFnZXJQdWJsaWNLZXlPclVuaXQABAVoYXNQTQMJAQlpc0RlZmluZWQBBQJwbQYJAAIBAhJObyBwZW5kaW5nIG1hbmFnZXIDCQAAAgUFaGFzUE0FBWhhc1BNBAdjaGVja1BNAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQkBBXZhbHVlAQUCcG0GCQACAQIbWW91IGFyZSBub3QgcGVuZGluZyBtYW5hZ2VyAwkAAAIFB2NoZWNrUE0FB2NoZWNrUE0JAMwIAgkBC1N0cmluZ0VudHJ5AgkBE2tleU1hbmFnZXJQdWJsaWNLZXkACQDYBAEJAQV2YWx1ZQEFAnBtCQDMCAIJAQtEZWxldGVFbnRyeQEJARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAED3RhcmdldFB1YmxpY0tleQQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwBQJwawMJAAECBQckbWF0Y2gwAgRVbml0CAUCdHgPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFD3RhcmdldFB1YmxpY0tleedaRgk=", "chainId": 84, "height": 2157871, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HhRwwZcCU2M4ecTHx7CZcTQmopfMm4DAcF6yooigcR8d Next: CSX47KyqYvnfvjfbp7jmtWXmW78HD78aKQ3HGbZvVasQ Diff:
OldNewDifferences
346346 let userWeight = $t01368513801._1
347347 let userActions = $t01368513801._2
348348 let totalWeightNew = (totalWeight + userWeight)
349- let processingActions = if ((usersCount > currentUser))
349+ let processingActions = if (((usersCount - 1) > currentUser))
350350 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
351351 else [IntegerEntry(keyProcessingStage(), processingStageShares), IntegerEntry(keyNextProcessedUser(), 0)]
352352 $Tuple2((([IntegerEntry(totalWeightKey, totalWeightNew)] ++ processingActions) ++ userActions), true)
457457 @Callable(i)
458458 func claimReward () = {
459459 let address = toString(i.caller)
460- let $t01926119387 = commonClaimReward(address, unit)
461- let period = $t01926119387._1
462- let amountFromMatcher = $t01926119387._2
463- let amountFromEmission = $t01926119387._3
464- let userIdx = $t01926119387._4
465- let cfgArray = $t01926119387._5
466- let nextProcessedPeriod = $t01926119387._6
460+ let $t01926519391 = commonClaimReward(address, unit)
461+ let period = $t01926519391._1
462+ let amountFromMatcher = $t01926519391._2
463+ let amountFromEmission = $t01926519391._3
464+ let userIdx = $t01926519391._4
465+ let cfgArray = $t01926519391._5
466+ let nextProcessedPeriod = $t01926519391._6
467467 $Tuple2([IntegerEntry(keyNextUnlaimedPeriodOfUser(userIdx), period), ScriptTransfer(i.caller, (amountFromMatcher + amountFromEmission), fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, amountFromMatcher, amountFromEmission, period, nextProcessedPeriod, i)], [amountFromMatcher, amountFromEmission])
468468 }
469469
480480
481481 @Callable(i)
482482 func claimRewardPaginatedREADONLY (address,startPeriod) = {
483- let $t02013020247 = commonClaimReward(address, if ((0 > startPeriod))
483+ let $t02013420251 = commonClaimReward(address, if ((0 > startPeriod))
484484 then unit
485485 else startPeriod)
486- let period = $t02013020247._1
487- let fromMatcher = $t02013020247._2
488- let fromEmission = $t02013020247._3
486+ let period = $t02013420251._1
487+ let fromMatcher = $t02013420251._2
488+ let fromEmission = $t02013420251._3
489489 let amount = (fromMatcher + fromEmission)
490490 $Tuple2(nil, $Tuple2(amount, period))
491491 }
494494
495495 @Callable(i)
496496 func claimRewardDetailedREADONLY (address) = {
497- let $t02049820573 = commonClaimReward(address, unit)
498- let ignored = $t02049820573._1
499- let fromMatcher = $t02049820573._2
500- let fromEmission = $t02049820573._3
497+ let $t02050220577 = commonClaimReward(address, unit)
498+ let ignored = $t02050220577._1
499+ let fromMatcher = $t02050220577._2
500+ let fromEmission = $t02050220577._3
501501 $Tuple2(nil, makeString(["%d%d%d", toString((fromMatcher + fromEmission)), toString(fromMatcher), toString(fromEmission)], SEP))
502502 }
503503
505505
506506 @Callable(i)
507507 func claimRewardDetailedPaginatedREADONLY (address,startPeriod) = {
508- let $t02086920986 = commonClaimReward(address, if ((0 > startPeriod))
508+ let $t02087320990 = commonClaimReward(address, if ((0 > startPeriod))
509509 then unit
510510 else startPeriod)
511- let period = $t02086920986._1
512- let fromMatcher = $t02086920986._2
513- let fromEmission = $t02086920986._3
511+ let period = $t02087320990._1
512+ let fromMatcher = $t02087320990._2
513+ let fromEmission = $t02087320990._3
514514 $Tuple2(nil, $Tuple2(makeString(["%d%d%d", toString((fromMatcher + fromEmission)), toString(fromMatcher), toString(fromEmission)], SEP), period))
515515 }
516516
601601 let ann = (amp * nCoins)
602602 let arr = [1, 2, 3, 4, 5, 6, 7]
603603 func calc (acc,cur) = {
604- let $t02447524664 = acc
605- let d = $t02447524664._1
606- let dPrev = $t02447524664._2
604+ let $t02447924668 = acc
605+ let d = $t02447924668._1
606+ let dPrev = $t02447924668._2
607607 let dp = (((d * d) * d) / (((x1 * x2) * nCoins) * nCoins))
608608 let dNext = (((((ann * s) / aPrecision) + (dp * nCoins)) * d) / ((((ann - aPrecision) * d) / aPrecision) + ((nCoins + toBigInt(1)) * dp)))
609609 $Tuple2(dNext, d)
610610 }
611611
612- let $t02487724927 = {
612+ let $t02488124931 = {
613613 let $l = arr
614614 let $s = size($l)
615615 let $acc0 = $Tuple2(s, unit)
623623
624624 $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)
625625 }
626- let dNext = $t02487724927._1
627- let dPrev = $t02487724927._2
626+ let dNext = $t02488124931._1
627+ let dPrev = $t02488124931._2
628628 let dDiff = abs((dNext - value(dPrev)))
629629 if ((targetPrecision >= dDiff))
630630 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)
349- let processingActions = if ((usersCount > currentUser))
349+ let processingActions = if (((usersCount - 1) > 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))
362362 let activeReferralInv = if ((referrer == unit))
363363 then unit
364364 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (userWeight >= referralMinGWxAmount)], nil)
365365 if ((activeReferralInv == activeReferralInv))
366366 then {
367367 let referralInv = if (if ((referrer == unit))
368368 then true
369369 else (referralMinGWxAmount > userWeight))
370370 then unit
371371 else {
372372 let referrerReward = fraction(userTotalAmount, referrerRewardPermille, SCALE)
373373 let referralReward = fraction(userTotalAmount, referralRewardPermille, SCALE)
374374 invoke(referralsContractAddressOrFail, "incUnclaimed", [referralProgramName, userAddress, referrerReward, referralReward], nil)
375375 }
376376 if ((referralInv == referralInv))
377377 then {
378378 let processingActions = if ((usersCount > currentUser))
379379 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
380380 else [IntegerEntry(keyNextProcessedPeriod(), (currentPeriod + 1)), IntegerEntry(keyNextProcessedUser(), 0)]
381381 $Tuple2(processingActions, true)
382382 }
383383 else throw("Strict value is not equal to itself.")
384384 }
385385 else throw("Strict value is not equal to itself.")
386386 }
387387 else throw("invalid processing stage")
388388 }
389389
390390
391391
392392 @Callable(i)
393393 func finalizeWrapper (counter) = {
394394 let result = {
395395 let @ = invoke(this, "finalizeHelper", nil, nil)
396396 if ($isInstanceOf(@, "Boolean"))
397397 then @
398398 else throw(($getType(invoke(this, "finalizeHelper", nil, nil)) + " couldn't be cast to Boolean"))
399399 }
400400 if ((result == result))
401401 then if (if (!(result))
402402 then (counter == maxDepth)
403403 else false)
404404 then throw("Nothing to process")
405405 else if ((counter > 0))
406406 then $Tuple2(nil, invoke(this, "finalizeWrapper", [(counter - 1)], nil))
407407 else $Tuple2(nil, unit)
408408 else throw("Strict value is not equal to itself.")
409409 }
410410
411411
412412
413413 @Callable(i)
414414 func processPendingPeriodsAndUsers () = $Tuple2(nil, invoke(this, "finalizeWrapper", [maxDepth], nil))
415415
416416
417417
418418 @Callable(i)
419419 func deposit () = {
420420 let cfgArray = readConfigArrayOrFail()
421421 if ((i.caller != Address(fromBase58String(cfgArray[IdxCfgPacemakerAddress]))))
422422 then throw("Wrong caller address")
423423 else {
424424 let assetId = value(value(i.payments[0]).assetId)
425425 if ((assetId != fromBase58String(cfgArray[IdxCfgAssetId])))
426426 then throw("Wrong payment asset")
427427 else {
428428 let period = nextPeriod()
429429 let deltaH = (height - getNumberOrFail(keyGwxRewardEmissionStartHeight()))
430430 let emissionRate = valueOrErrorMessage(getInteger(emissionContract, keyRatePerBlockCurrent()), (("mandatory emission_contract." + keyRatePerBlockCurrent()) + " is not defined"))
431431 let weight = valueOrErrorMessage(getInteger(factoryContract, keyPoolWeightVirtual()), (("mandatory factory_contract." + keyPoolWeightVirtual()) + " is not defined"))
432432 let auxAmount = fraction((deltaH * weight), emissionRate, MULT8)
433433 let em = invoke(emissionContract, "emit", [auxAmount], nil)
434434 if ((em == em))
435435 then {
436436 let matcherPart = value(i.payments[0]).amount
437437 let payoutInfo = PeriodPayoutInfo(period, matcherPart, auxAmount)
438438 [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)]
439439 }
440440 else throw("Strict value is not equal to itself.")
441441 }
442442 }
443443 }
444444
445445
446446
447447 @Callable(i)
448448 func claimNextBatch (boostingContract,currentPeriod,currentUser,depth,totalFromMatcher,totalFromEmission) = if ((i.caller != this))
449449 then throw("Should be called by this script only")
450450 else {
451451 let periodAndTotals = claimInternal(boostingContract, currentPeriod, currentUser, depth, totalFromMatcher, totalFromEmission)
452452 $Tuple2(nil, periodAndTotals)
453453 }
454454
455455
456456
457457 @Callable(i)
458458 func claimReward () = {
459459 let address = toString(i.caller)
460- let $t01926119387 = commonClaimReward(address, unit)
461- let period = $t01926119387._1
462- let amountFromMatcher = $t01926119387._2
463- let amountFromEmission = $t01926119387._3
464- let userIdx = $t01926119387._4
465- let cfgArray = $t01926119387._5
466- let nextProcessedPeriod = $t01926119387._6
460+ let $t01926519391 = commonClaimReward(address, unit)
461+ let period = $t01926519391._1
462+ let amountFromMatcher = $t01926519391._2
463+ let amountFromEmission = $t01926519391._3
464+ let userIdx = $t01926519391._4
465+ let cfgArray = $t01926519391._5
466+ let nextProcessedPeriod = $t01926519391._6
467467 $Tuple2([IntegerEntry(keyNextUnlaimedPeriodOfUser(userIdx), period), ScriptTransfer(i.caller, (amountFromMatcher + amountFromEmission), fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, amountFromMatcher, amountFromEmission, period, nextProcessedPeriod, i)], [amountFromMatcher, amountFromEmission])
468468 }
469469
470470
471471
472472 @Callable(i)
473473 func claimRewardREADONLY (address) = {
474474 let claimResults = commonClaimReward(address, unit)
475475 let amount = (claimResults._2 + claimResults._3)
476476 $Tuple2(nil, amount)
477477 }
478478
479479
480480
481481 @Callable(i)
482482 func claimRewardPaginatedREADONLY (address,startPeriod) = {
483- let $t02013020247 = commonClaimReward(address, if ((0 > startPeriod))
483+ let $t02013420251 = commonClaimReward(address, if ((0 > startPeriod))
484484 then unit
485485 else startPeriod)
486- let period = $t02013020247._1
487- let fromMatcher = $t02013020247._2
488- let fromEmission = $t02013020247._3
486+ let period = $t02013420251._1
487+ let fromMatcher = $t02013420251._2
488+ let fromEmission = $t02013420251._3
489489 let amount = (fromMatcher + fromEmission)
490490 $Tuple2(nil, $Tuple2(amount, period))
491491 }
492492
493493
494494
495495 @Callable(i)
496496 func claimRewardDetailedREADONLY (address) = {
497- let $t02049820573 = commonClaimReward(address, unit)
498- let ignored = $t02049820573._1
499- let fromMatcher = $t02049820573._2
500- let fromEmission = $t02049820573._3
497+ let $t02050220577 = commonClaimReward(address, unit)
498+ let ignored = $t02050220577._1
499+ let fromMatcher = $t02050220577._2
500+ let fromEmission = $t02050220577._3
501501 $Tuple2(nil, makeString(["%d%d%d", toString((fromMatcher + fromEmission)), toString(fromMatcher), toString(fromEmission)], SEP))
502502 }
503503
504504
505505
506506 @Callable(i)
507507 func claimRewardDetailedPaginatedREADONLY (address,startPeriod) = {
508- let $t02086920986 = commonClaimReward(address, if ((0 > startPeriod))
508+ let $t02087320990 = commonClaimReward(address, if ((0 > startPeriod))
509509 then unit
510510 else startPeriod)
511- let period = $t02086920986._1
512- let fromMatcher = $t02086920986._2
513- let fromEmission = $t02086920986._3
511+ let period = $t02087320990._1
512+ let fromMatcher = $t02087320990._2
513+ let fromEmission = $t02087320990._3
514514 $Tuple2(nil, $Tuple2(makeString(["%d%d%d", toString((fromMatcher + fromEmission)), toString(fromMatcher), toString(fromEmission)], SEP), period))
515515 }
516516
517517
518518
519519 @Callable(i)
520520 func latestFinalizedPeriodREADONLY (address) = $Tuple2(nil, valueOrElse(getInteger(this, keyLatestPeriod()), -1))
521521
522522
523523
524524 @Callable(i)
525525 func latestFinalizedPeriodInfoREADONLY (address) = $Tuple2(nil, getStringByKey(keyLastPayoutInfo()))
526526
527527
528528
529529 @Callable(i)
530530 func calcGwxParamsREADONLY (gwxAmountStart,lockStartHeight,lockDurationBlocks) = {
531531 let lockEndHeight = (lockStartHeight + lockDurationBlocks)
532532 let scale8ParamK = -(fraction(gwxAmountStart, SCALE, lockDurationBlocks))
533533 let scale8ParamB = (fraction(gwxAmountStart, SCALE, lockDurationBlocks) * lockEndHeight)
534534 $Tuple2(nil, [scale8ParamK, scale8ParamB, nextPeriod()])
535535 }
536536
537537
538538
539539 @Callable(i)
540540 func calcGwxAmountStartREADONLY (wxLockAmount,lockDuration,maxLockDuration) = {
541541 let coeffX8 = fraction(lockDuration, MULT8, maxLockDuration)
542542 let gWxAmountStart = fraction(wxLockAmount, coeffX8, MULT8)
543543 $Tuple2(nil, [gWxAmountStart])
544544 }
545545
546546
547547
548548 @Callable(i)
549549 func constructor (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr,maxDepth) = if ((this != i.caller))
550550 then throw("not authorized")
551551 else [StringEntry(keyConfig(), formatConfig(wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr, maxDepth))]
552552
553553
554554
555555 @Callable(i)
556556 func constructorV2 (factoryAddress) = if ((this != i.caller))
557557 then throw("not authorized")
558558 else [StringEntry(keyFactoryAddress(), factoryAddress)]
559559
560560
561561
562562 @Callable(i)
563563 func constructorV3 (emissionAddress) = if ((this != i.caller))
564564 then throw("not authorized")
565565 else {
566566 let initLatestPeriod = if (isDefined(getInteger(this, keyLatestPeriod())))
567567 then nil
568568 else [IntegerEntry(keyLatestPeriod(), -1)]
569569 (initLatestPeriod :+ StringEntry(keyEmissionAddress(), emissionAddress))
570570 }
571571
572572
573573
574574 @Callable(i)
575575 func onEmissionForGwxStart () = if ((i.caller != factoryContract))
576576 then throw("permissions denied")
577577 else [IntegerEntry(keyGwxRewardEmissionStartHeight(), height)]
578578
579579
580580
581581 @Callable(i)
582582 func latestPeriodEmissionRewardsREADONLY (address) = {
583583 let period = nextPeriod()
584584 $Tuple2(nil, [getNumberByKey(keyAuxEmissionRewardForPeriod(period))])
585585 }
586586
587587
588588
589589 @Callable(i)
590590 func calcD (x1BigIntStr,x2BigIntStr,ampBigIntStr,aPrecisionBigIntStr,targetPrecisionBigIntStr) = {
591591 let nCoins = toBigInt(2)
592592 let aPrecision = parseBigIntValue(aPrecisionBigIntStr)
593593 let targetPrecision = parseBigIntValue(targetPrecisionBigIntStr)
594594 let x1 = parseBigIntValue(x1BigIntStr)
595595 let x2 = parseBigIntValue(x2BigIntStr)
596596 let amp = (parseBigIntValue(ampBigIntStr) * aPrecision)
597597 let s = (x1 + x2)
598598 if ((s == zeroBigInt))
599599 then $Tuple2(nil, toString(zeroBigInt))
600600 else {
601601 let ann = (amp * nCoins)
602602 let arr = [1, 2, 3, 4, 5, 6, 7]
603603 func calc (acc,cur) = {
604- let $t02447524664 = acc
605- let d = $t02447524664._1
606- let dPrev = $t02447524664._2
604+ let $t02447924668 = acc
605+ let d = $t02447924668._1
606+ let dPrev = $t02447924668._2
607607 let dp = (((d * d) * d) / (((x1 * x2) * nCoins) * nCoins))
608608 let dNext = (((((ann * s) / aPrecision) + (dp * nCoins)) * d) / ((((ann - aPrecision) * d) / aPrecision) + ((nCoins + toBigInt(1)) * dp)))
609609 $Tuple2(dNext, d)
610610 }
611611
612- let $t02487724927 = {
612+ let $t02488124931 = {
613613 let $l = arr
614614 let $s = size($l)
615615 let $acc0 = $Tuple2(s, unit)
616616 func $f0_1 ($a,$i) = if (($i >= $s))
617617 then $a
618618 else calc($a, $l[$i])
619619
620620 func $f0_2 ($a,$i) = if (($i >= $s))
621621 then $a
622622 else throw("List size exceeds 7")
623623
624624 $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)
625625 }
626- let dNext = $t02487724927._1
627- let dPrev = $t02487724927._2
626+ let dNext = $t02488124931._1
627+ let dPrev = $t02488124931._2
628628 let dDiff = abs((dNext - value(dPrev)))
629629 if ((targetPrecision >= dDiff))
630630 then $Tuple2(nil, toString(dNext))
631631 else throw(("D calculation error, dDiff = " + toString(dDiff)))
632632 }
633633 }
634634
635635
636636
637637 @Callable(i)
638638 func setManager (pendingManagerPublicKey) = {
639639 let checkCaller = mustManager(i)
640640 if ((checkCaller == checkCaller))
641641 then {
642642 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
643643 if ((checkManagerPublicKey == checkManagerPublicKey))
644644 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
645645 else throw("Strict value is not equal to itself.")
646646 }
647647 else throw("Strict value is not equal to itself.")
648648 }
649649
650650
651651
652652 @Callable(i)
653653 func confirmManager () = {
654654 let pm = pendingManagerPublicKeyOrUnit()
655655 let hasPM = if (isDefined(pm))
656656 then true
657657 else throw("No pending manager")
658658 if ((hasPM == hasPM))
659659 then {
660660 let checkPM = if ((i.callerPublicKey == value(pm)))
661661 then true
662662 else throw("You are not pending manager")
663663 if ((checkPM == checkPM))
664664 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
665665 else throw("Strict value is not equal to itself.")
666666 }
667667 else throw("Strict value is not equal to itself.")
668668 }
669669
670670
671671 @Verifier(tx)
672672 func verify () = {
673673 let targetPublicKey = match managerPublicKeyOrUnit() {
674674 case pk: ByteVector =>
675675 pk
676676 case _: Unit =>
677677 tx.senderPublicKey
678678 case _ =>
679679 throw("Match error")
680680 }
681681 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
682682 }
683683

github/deemru/w8io/873ac7e 
103.88 ms