tx · 8pucsi8J2FqpyARCJcRdmV9N36JjNBZcJBLpx3UMeMJZ

3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE:  -0.02300000 Waves

2022.08.10 13:37 [2178229] smart account 3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE > SELF 0.00000000 Waves

{ "type": 13, "id": "8pucsi8J2FqpyARCJcRdmV9N36JjNBZcJBLpx3UMeMJZ", "fee": 2300000, "feeAssetId": null, "timestamp": 1660127889629, "version": 1, "sender": "3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE", "senderPublicKey": "G349Uq3FTox7dRNLeAfAQeoACvwZ9iEnVSaHcEYn6j8J", "proofs": [ "2QuqXQkgQpCUhVL56kccj3g7tP5SD8DKzE4747zLsxTFQrWjQGpPbqfESKt3jKoQcz2kcj8jdwK1Zcdx1NvEE5N1" ], "script": "base64:BgJJCAISBAoCCAESABIDCgEBEgASABIAEgMKAQgSAwoBCBIDCgEIEgUKAwEBARIFCgMBAQESABIDCgEIEgcKBQgICAgIEgMKAQgSAFUAA1NFUAICX18ACVVTRVJERVBUSAAaAAVTQ0FMRQDoBwAFTVVMVDgAgMLXLwAKemVyb0JpZ0ludAkAtgIBAAAAFHByb2Nlc3NpbmdTdGFnZVRvdGFsAAAAFXByb2Nlc3NpbmdTdGFnZVNoYXJlcwABAQ5nZXROdW1iZXJCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAAAQ9nZXROdW1iZXJPckZhaWwBA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFA2tleQkArAICCQCsAgICD21hbmRhdG9yeSB0aGlzLgUDa2V5Ag8gaXMgbm90IGRlZmluZWQBDmdldFN0cmluZ0J5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUDa2V5AgABD2dldFN0cmluZ09yRmFpbAEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUDa2V5CQCsAgIJAKwCAgIPbWFuZGF0b3J5IHRoaXMuBQNrZXkCDyBpcyBub3QgZGVmaW5lZAEDYWJzAQN2YWwDCQC/AgIFCnplcm9CaWdJbnQFA3ZhbAkAvgIBBQN2YWwFA3ZhbAALa2V5TWF4RGVwdGgCDCVzX19tYXhEZXB0aAAPbWF4RGVwdGhEZWZhdWx0AB4ACG1heERlcHRoCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFC2tleU1heERlcHRoBQ9tYXhEZXB0aERlZmF1bHQAFGtleU1heERlcHRoTWlncmF0aW9uAhUlc19fbWF4RGVwdGhNaWdyYXRpb24AGG1heERlcHRoTWlncmF0aW9uRGVmYXVsdAADABFtYXhEZXB0aE1pZ3JhdGlvbgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRRrZXlNYXhEZXB0aE1pZ3JhdGlvbgUYbWF4RGVwdGhNaWdyYXRpb25EZWZhdWx0AAtrZXlNaWdyYXRlZAIIbWlncmF0ZWQACG1pZ3JhdGVkCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFC2tleU1pZ3JhdGVkBwAda2V5TmV4dFByb2Nlc3NlZFVzZXJNaWdyYXRpb24CGm5leHRQcm9jZXNzZWRVc2VyTWlncmF0aW9uARFrZXlGYWN0b3J5QWRkcmVzcwACHCVzJXNfX2NvbmZpZ19fZmFjdG9yeUFkZHJlc3MAEWZhY3RvcnlBZGRyZXNzU3RyCQEPZ2V0U3RyaW5nT3JGYWlsAQkBEWtleUZhY3RvcnlBZGRyZXNzAAAPZmFjdG9yeUNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBBRFmYWN0b3J5QWRkcmVzc1N0cgESa2V5RW1pc3Npb25BZGRyZXNzAAIdJXMlc19fY29uZmlnX19lbWlzc2lvbkFkZHJlc3MBE2tleU51bVRvVXNlck1hcHBpbmcBA251bQkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAgdtYXBwaW5nCQDMCAICCG51bTJ1c2VyCQDMCAIJAKQDAQUDbnVtBQNuaWwFA1NFUAAWa2V5UmVmZXJyYWxQcm9ncmFtTmFtZQkAuQkCCQDMCAICBCVzJXMJAMwIAgIIcmVmZXJyYWwJAMwIAgILcHJvZ3JhbU5hbWUFA25pbAUDU0VQABpyZWZlcnJhbFByb2dyYW1OYW1lRGVmYXVsdAIGd3hsb2NrABNyZWZlcnJhbFByb2dyYW1OYW1lCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFFmtleVJlZmVycmFsUHJvZ3JhbU5hbWUFGnJlZmVycmFsUHJvZ3JhbU5hbWVEZWZhdWx0ABdrZXlSZWZlcnJhbE1pbkdXeEFtb3VudAkAuQkCCQDMCAICBCVzJXMJAMwIAgIIcmVmZXJyYWwJAMwIAgIMbWluR1d4QW1vdW50BQNuaWwFA1NFUAAbcmVmZXJyYWxNaW5HV3hBbW91bnREZWZhdWx0CQBoAgD0AwUFTVVMVDgAFHJlZmVycmFsTWluR1d4QW1vdW50CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFF2tleVJlZmVycmFsTWluR1d4QW1vdW50BRtyZWZlcnJhbE1pbkdXeEFtb3VudERlZmF1bHQAGWtleVJlZmVycmVyUmV3YXJkUGVybWlsbGUJALkJAgkAzAgCAgQlcyVzCQDMCAICCHJlZmVycmFsCQDMCAICFnJlZmVycmVyUmV3YXJkUGVybWlsbGUFA25pbAUDU0VQAB1yZWZlcnJlclJld2FyZFBlcm1pbGxlRGVmYXVsdAAyABZyZWZlcnJlclJld2FyZFBlcm1pbGxlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFGWtleVJlZmVycmVyUmV3YXJkUGVybWlsbGUFHXJlZmVycmVyUmV3YXJkUGVybWlsbGVEZWZhdWx0ABlrZXlSZWZlcnJhbFJld2FyZFBlcm1pbGxlCQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAhZyZWZlcnJhbFJld2FyZFBlcm1pbGxlBQNuaWwFA1NFUAAdcmVmZXJyYWxSZXdhcmRQZXJtaWxsZURlZmF1bHQAMgAWcmVmZXJyYWxSZXdhcmRQZXJtaWxsZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRlrZXlSZWZlcnJhbFJld2FyZFBlcm1pbGxlBR1yZWZlcnJhbFJld2FyZFBlcm1pbGxlRGVmYXVsdAELa2V5UmVmZXJyZXIBD3JlZmVycmFsQWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAghyZWZlcnJlcgkAzAgCBRNyZWZlcnJhbFByb2dyYW1OYW1lCQDMCAIFD3JlZmVycmFsQWRkcmVzcwUDbmlsBQNTRVABFGtleVVuY2xhaW1lZFJlZmVycmFsAgtwcm9ncmFtTmFtZQ5jbGFpbWVyQWRkcmVzcwkAuQkCCQDMCAICCCVzJXMlcyVzCQDMCAICEXVuY2xhaW1lZFJlZmVycmFsCQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFDmNsYWltZXJBZGRyZXNzBQNuaWwFA1NFUAASZW1pc3Npb25BZGRyZXNzU3RyCQEPZ2V0U3RyaW5nT3JGYWlsAQkBEmtleUVtaXNzaW9uQWRkcmVzcwAAEGVtaXNzaW9uQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEmVtaXNzaW9uQWRkcmVzc1N0cgANSWR4Q2ZnQXNzZXRJZAABABZJZHhDZmdQYWNlbWFrZXJBZGRyZXNzAAIAFklkeENmZ0Jvb3N0aW5nQ29udHJhY3QAAwAOSWR4Q2ZnTWF4RGVwdGgABAEJa2V5Q29uZmlnAAIKJXNfX2NvbmZpZwEVcmVhZENvbmZpZ0FycmF5T3JGYWlsAAkAtQkCCQEPZ2V0U3RyaW5nT3JGYWlsAQkBCWtleUNvbmZpZwAFA1NFUAEMZm9ybWF0Q29uZmlnBAx3eEFzc2V0SWRTdHIabWF0Y2hlclBhY2VtYWtlckFkZHJlc3NTdHIaYm9vc3RpbmdDb250cmFjdEFkZHJlc3NTdHIIbWF4RGVwdGgJALkJAgkAzAgCAgglcyVzJXMlZAkAzAgCBQx3eEFzc2V0SWRTdHIJAMwIAgUabWF0Y2hlclBhY2VtYWtlckFkZHJlc3NTdHIJAMwIAgUaYm9vc3RpbmdDb250cmFjdEFkZHJlc3NTdHIJAMwIAgkApAMBBQhtYXhEZXB0aAUDbmlsBQNTRVABFmJvb3N0aW5nQ29udHJhY3RPckZhaWwABAhjZmdBcnJheQkBFXJlYWRDb25maWdBcnJheU9yRmFpbAAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQCRAwIFCGNmZ0FycmF5BRZJZHhDZmdCb29zdGluZ0NvbnRyYWN0Aihib29zdGluZyBjb250cmFjdCBhZGRyZXNzIGlzIG5vdCBkZWZpbmVkAR9rZXlHd3hSZXdhcmRFbWlzc2lvblN0YXJ0SGVpZ2h0AAIoJXMlc19fZ3d4UmV3YXJkRW1pc3Npb25QYXJ0X19zdGFydEhlaWdodAENa2V5VXNlcnNDb3VudAACDyVzX19uZXh0VXNlck51bQEWa2V5UmF0ZVBlckJsb2NrQ3VycmVudAACGyVzJXNfX3JhdGVQZXJCbG9ja19fY3VycmVudAEUa2V5UG9vbFdlaWdodFZpcnR1YWwAAiAlcyVzX19wb29sV2VpZ2h0X19HV1h2aXJ0dWFsUE9PTAEUa2V5TmV4dFByb2Nlc3NlZFVzZXIAAhUlc19fbmV4dFByb2Nlc3NlZFVzZXIBD2tleUxhdGVzdFBlcmlvZAACECVzX19sYXRlc3RQZXJpb2QBDWtleU5leHRQZXJpb2QAAg4lc19fbmV4dFBlcmlvZAESa2V5UHJvY2Vzc2luZ1N0YWdlAAITJXNfX3Byb2Nlc3NpbmdTdGFnZQEWa2V5TmV4dFByb2Nlc3NlZFBlcmlvZAACFyVzX19uZXh0UHJvY2Vzc2VkUGVyaW9kARBrZXlVc2VyVW5jbGFpbWVkAQl1c2VySW5kZXgJALkJAgkAzAgCAgQlcyVkCQDMCAICDXVzZXJVbmNsYWltZWQJAMwIAgkApAMBBQl1c2VySW5kZXgFA25pbAUDU0VQARtrZXlOZXh0VW5sYWltZWRQZXJpb2RPZlVzZXIBCXVzZXJJbmRleAkAuQkCCQDMCAICFyVzJWRfX25leHRDbGFpbWVkUGVyaW9kCQDMCAIJAKQDAQUJdXNlckluZGV4BQNuaWwFA1NFUAEca2V5TGFzdFByb2Nlc3NlZFBlcmlvZE9mVXNlcgEJdXNlckluZGV4CQC5CQIJAMwIAgIZJXMlZF9fbGFzdFByb2Nlc3NlZFBlcmlvZAkAzAgCCQCkAwEFCXVzZXJJbmRleAUDbmlsBQNTRVABEmtleUhlaWdodEZvclBlcmlvZAEGcGVyaW9kCQC5CQIJAMwIAgIaJXMlZF9fc3RhcnRIZWlnaHRGb3JQZXJpb2QJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQAR1rZXlBdXhFbWlzc2lvblJld2FyZEZvclBlcmlvZAEGcGVyaW9kCQC5CQIJAMwIAgIXJXMlZF9fYXV4RW1pc3Npb25SZXdhcmQJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARdrZXlUb3RhbEFtb3VudEZvclBlcmlvZAEGcGVyaW9kCQC5CQIJAMwIAgIaJXMlZF9fdG90YWxBbW91bnRGb3JQZXJpb2QJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARFrZXlMYXN0UGF5b3V0SW5mbwACEiVzX19sYXN0UGF5b3V0SW5mbwEQUGVyaW9kUGF5b3V0SW5mbwMGcGVyaW9kDW1hdGNoZXJSZXdhcmQOZW1pc3Npb25SZXdhcmQJALkJAgkAzAgCAgYlZCVkJWQJAMwIAgkApAMBBQZwZXJpb2QJAMwIAgkApAMBBQ1tYXRjaGVyUmV3YXJkCQDMCAIJAKQDAQUOZW1pc3Npb25SZXdhcmQFA25pbAUDU0VQARRrZXlQYXlvdXRIaXN0b3J5SW5mbwEGcGVyaW9kCQC5CQIJAMwIAgIYJXMlcyVkX19wYXlvdXRzX19oaXN0b3J5CQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEXa2V5VG90YWxXZWlnaHRGb3JQZXJpb2QBBnBlcmlvZAkAuQkCCQDMCAICGiVzJWRfX3RvdGFsV2VpZ2h0Rm9yUGVyaW9kCQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEWa2V5VXNlcktWYWx1ZUZvclBlcmlvZAIGcGVyaW9kCXVzZXJJbmRleAkAuQkCCQDMCAICFyVzJWQlcyVkX19wYXJhbUJ5UGVyaW9kCQDMCAIJAKQDAQUJdXNlckluZGV4CQDMCAICAWsJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARZrZXlVc2VyQlZhbHVlRm9yUGVyaW9kAgZwZXJpb2QJdXNlckluZGV4CQC5CQIJAMwIAgIXJXMlZCVzJWRfX3BhcmFtQnlQZXJpb2QJAMwIAgkApAMBBQl1c2VySW5kZXgJAMwIAgIBYgkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABFmtleVVzZXJXZWlnaHRGb3JQZXJpb2QCBnBlcmlvZAl1c2VySW5kZXgJALkJAgkAzAgCAhclcyVkJXMlZF9fcGFyYW1CeVBlcmlvZAkAzAgCCQCkAwEFCXVzZXJJbmRleAkAzAgCAgZ3ZWlnaHQJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARtrZXlSZWZlcnJhbHNDb250cmFjdEFkZHJlc3MACQC5CQIJAMwIAgIEJXMlcwkAzAgCAgZjb25maWcJAMwIAgIYcmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzBQNuaWwFA1NFUAAecmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzT3JGYWlsCQERQGV4dHJOYXRpdmUoMTA2MikBCQEPZ2V0U3RyaW5nT3JGYWlsAQkBG2tleVJlZmVycmFsc0NvbnRyYWN0QWRkcmVzcwABDEhpc3RvcnlFbnRyeQQEdHlwZQR1c2VyBmFtb3VudAFpBApoaXN0b3J5S0VZCQC5CQIJAMwIAgIRJXMlcyVzJXNfX2hpc3RvcnkJAMwIAgUEdHlwZQkAzAgCBQR1c2VyCQDMCAIJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAUDbmlsBQNTRVAEC2hpc3RvcnlEQVRBCQC5CQIJAMwIAgIMJWQlZCVkJWQlZCVkCQDMCAIJAKQDAQgFCWxhc3RCbG9jawZoZWlnaHQJAMwIAgkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQCkAwEFBmFtb3VudAUDbmlsBQNTRVAJAQtTdHJpbmdFbnRyeQIFCmhpc3RvcnlLRVkFC2hpc3RvcnlEQVRBARNrZXlNYW5hZ2VyUHVibGljS2V5AAIUJXNfX21hbmFnZXJQdWJsaWNLZXkBGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAIbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5ARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAQHJG1hdGNoMAkAoggBCQETa2V5TWFuYWdlclB1YmxpY0tleQADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQDZBAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAR1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdAAEByRtYXRjaDAJAKIIAQkBGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJANkEAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBC211c3RNYW5hZ2VyAQFpBAJwZAkAAgECEVBlcm1pc3Npb24gZGVuaWVkBAckbWF0Y2gwCQEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCcGsFByRtYXRjaDADCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQJwawYFAnBkAwkAAQIFByRtYXRjaDACBFVuaXQDCQAAAggFAWkGY2FsbGVyBQR0aGlzBgUCcGQJAAIBAgtNYXRjaCBlcnJvcgEOY2FsY1VzZXJXZWlnaHQEF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzD2hlaWdodEZvclBlcmlvZAZwZXJpb2QJdXNlckluZGV4BAVrTGFzdAkBHGtleUxhc3RQcm9jZXNzZWRQZXJpb2RPZlVzZXIBBQl1c2VySW5kZXgEBGtLZXkJARZrZXlVc2VyS1ZhbHVlRm9yUGVyaW9kAgUGcGVyaW9kBQl1c2VySW5kZXgEBGtSYXcJAJoIAgUXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MFBGtLZXkEC2tVc2VyV2VpZ2h0CQEWa2V5VXNlcldlaWdodEZvclBlcmlvZAIFBnBlcmlvZAUJdXNlckluZGV4AwkBCWlzRGVmaW5lZAEFBGtSYXcEAWsJAQV2YWx1ZQEFBGtSYXcEAWIJAQV2YWx1ZQEJAJoIAgUXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MJARZrZXlVc2VyQlZhbHVlRm9yUGVyaW9kAgUGcGVyaW9kBQl1c2VySW5kZXgEAXcJAGQCCQBoAgUBawUPaGVpZ2h0Rm9yUGVyaW9kBQFiAwkAZgIFAXcAAAkAlAoCCQBpAgUBdwUFU0NBTEUJAMwIAgkBDEludGVnZXJFbnRyeQIFBWtMYXN0BQZwZXJpb2QJAMwIAgkBDEludGVnZXJFbnRyeQIFC2tVc2VyV2VpZ2h0BQF3BQNuaWwJAJQKAgAABQNuaWwEAXAJAJoIAgUEdGhpcwUFa0xhc3QDAwkBCWlzRGVmaW5lZAEFAXAJAGcCBQZwZXJpb2QJAQV2YWx1ZQEFAXAHBAJwdgkBBXZhbHVlAQUBcAQBawkBBXZhbHVlAQkAmggCBRdib29zdGluZ0NvbnRyYWN0QWRkcmVzcwkBFmtleVVzZXJLVmFsdWVGb3JQZXJpb2QCBQJwdgUJdXNlckluZGV4BAFiCQEFdmFsdWUBCQCaCAIFF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzCQEWa2V5VXNlckJWYWx1ZUZvclBlcmlvZAIFAnB2BQl1c2VySW5kZXgEAXcJAGQCCQBoAgUBawUPaGVpZ2h0Rm9yUGVyaW9kBQFiAwkAZgIFAXcAAAkAlAoCCQBpAgUBdwUFU0NBTEUJAMwIAgkBDEludGVnZXJFbnRyeQIFC2tVc2VyV2VpZ2h0BQF3BQNuaWwJAJQKAgAABQNuaWwJAJQKAgAABQNuaWwBFmNhbGNVc2VyV2VpZ2h0Rm9yQ2xhaW0EF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzD2hlaWdodEZvclBlcmlvZAZwZXJpb2QJdXNlckluZGV4BAtrVXNlcldlaWdodAkBFmtleVVzZXJXZWlnaHRGb3JQZXJpb2QCBQZwZXJpb2QFCXVzZXJJbmRleAQQdXNlcldlaWdodE9yVW5pdAkAnwgBBQtrVXNlcldlaWdodAQHJG1hdGNoMAUQdXNlcldlaWdodE9yVW5pdAMJAAECBQckbWF0Y2gwAgRVbml0AAADCQABAgUHJG1hdGNoMAIDSW50BAF3BQckbWF0Y2gwCQBpAgUBdwUFU0NBTEUJAAIBAgtNYXRjaCBlcnJvcgEVZ2V0VXNlckluZGV4QnlBZGRyZXNzAhpib29zdGluZ0NvbnRyYWN0QWRkcmVzc1N0cgt1c2VyQWRkcmVzcwQDa2V5CQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICB21hcHBpbmcJAMwIAgIIdXNlcjJudW0JAMwIAgULdXNlckFkZHJlc3MFA25pbAUDU0VQCQENcGFyc2VJbnRWYWx1ZQEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCCQEHQWRkcmVzcwEJANkEAQUaYm9vc3RpbmdDb250cmFjdEFkZHJlc3NTdHIFA2tleQkArAICCQCsAgIJAKwCAgINVXNlciBhZGRyZXNzIAULdXNlckFkZHJlc3MCLSBpcyBub3QgZm91bmQgaW4gYm9vc3RpbmcgY29udHJhY3QgZGF0YSwga2V5PQUDa2V5AQpuZXh0UGVyaW9kAAkBDmdldE51bWJlckJ5S2V5AQkBDWtleU5leHRQZXJpb2QAARFjb21tb25DbGFpbVJld2FyZAELdXNlckFkZHJlc3MECGNmZ0FycmF5CQEVcmVhZENvbmZpZ0FycmF5T3JGYWlsAAQHdXNlcklkeAkBFWdldFVzZXJJbmRleEJ5QWRkcmVzcwIJAJEDAgUIY2ZnQXJyYXkFFklkeENmZ0Jvb3N0aW5nQ29udHJhY3QFC3VzZXJBZGRyZXNzBBN1c2VyVW5jbGFpbWVkT3B0aW9uCQCfCAEJARBrZXlVc2VyVW5jbGFpbWVkAQUHdXNlcklkeAQHJG1hdGNoMAUTdXNlclVuY2xhaW1lZE9wdGlvbgMJAAECBQckbWF0Y2gwAgRVbml0CQCUCgIAAAUDbmlsAwkAAQIFByRtYXRjaDACA0ludAQBdQUHJG1hdGNoMAkAlAoCBQF1CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEQa2V5VXNlclVuY2xhaW1lZAEFB3VzZXJJZHgAAAUDbmlsCQACAQILTWF0Y2ggZXJyb3IQAWkBFnVwZGF0ZVJlZmVycmFsQWN0aXZpdHkCC3VzZXJBZGRyZXNzDmdXeEFtb3VudFN0YXJ0BAhyZWZlcnJlcgkAnQgCBR5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwJAQtrZXlSZWZlcnJlcgEFC3VzZXJBZGRyZXNzBBFhY3RpdmVSZWZlcnJhbEludgMJAAACBQhyZWZlcnJlcgUEdW5pdAUEdW5pdAkA/AcEBR5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwCFnVwZGF0ZVJlZmVycmFsQWN0aXZpdHkJAMwIAgUTcmVmZXJyYWxQcm9ncmFtTmFtZQkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCCQBnAgUOZ1d4QW1vdW50U3RhcnQFFHJlZmVycmFsTWluR1d4QW1vdW50BQNuaWwFA25pbAMJAAACBRFhY3RpdmVSZWZlcnJhbEludgURYWN0aXZlUmVmZXJyYWxJbnYJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmZpbmFsaXplSGVscGVyAAQPcHJvY2Vzc2luZ1N0YWdlCQELdmFsdWVPckVsc2UCCQCfCAEJARJrZXlQcm9jZXNzaW5nU3RhZ2UABRRwcm9jZXNzaW5nU3RhZ2VUb3RhbAQNY3VycmVudFBlcmlvZAkBDmdldE51bWJlckJ5S2V5AQkBFmtleU5leHRQcm9jZXNzZWRQZXJpb2QABAtjdXJyZW50VXNlcgkBDmdldE51bWJlckJ5S2V5AQkBFGtleU5leHRQcm9jZXNzZWRVc2VyAAQMbGF0ZXN0UGVyaW9kCQEOZ2V0TnVtYmVyQnlLZXkBCQEPa2V5TGF0ZXN0UGVyaW9kAAQKdXNlcnNDb3VudAkBC3ZhbHVlT3JFbHNlAgkAmggCCQEWYm9vc3RpbmdDb250cmFjdE9yRmFpbAAJAQ1rZXlVc2Vyc0NvdW50AAAABA50b3RhbFdlaWdodEtleQkBF2tleVRvdGFsV2VpZ2h0Rm9yUGVyaW9kAQUNY3VycmVudFBlcmlvZAQLdG90YWxXZWlnaHQJAQ5nZXROdW1iZXJCeUtleQEJARdrZXlUb3RhbFdlaWdodEZvclBlcmlvZAEFDWN1cnJlbnRQZXJpb2QED2hlaWdodEZvclBlcmlvZAkBDmdldE51bWJlckJ5S2V5AQkBEmtleUhlaWdodEZvclBlcmlvZAEFDWN1cnJlbnRQZXJpb2QDCQBmAgUNY3VycmVudFBlcmlvZAUMbGF0ZXN0UGVyaW9kCQCUCgIFA25pbAcDCQAAAgUPcHJvY2Vzc2luZ1N0YWdlBRRwcm9jZXNzaW5nU3RhZ2VUb3RhbAQNJHQwMTIzODcxMjUwMwkBDmNhbGNVc2VyV2VpZ2h0BAkBFmJvb3N0aW5nQ29udHJhY3RPckZhaWwABQ9oZWlnaHRGb3JQZXJpb2QFDWN1cnJlbnRQZXJpb2QFC2N1cnJlbnRVc2VyBAp1c2VyV2VpZ2h0CAUNJHQwMTIzODcxMjUwMwJfMQQLdXNlckFjdGlvbnMIBQ0kdDAxMjM4NzEyNTAzAl8yBA50b3RhbFdlaWdodE5ldwkAZAIFC3RvdGFsV2VpZ2h0BQp1c2VyV2VpZ2h0BBFwcm9jZXNzaW5nQWN0aW9ucwMJAGYCCQBlAgUKdXNlcnNDb3VudAABBQtjdXJyZW50VXNlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleU5leHRQcm9jZXNzZWRVc2VyAAkAZAIFC2N1cnJlbnRVc2VyAAEFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmtleVByb2Nlc3NpbmdTdGFnZQAFFXByb2Nlc3NpbmdTdGFnZVNoYXJlcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleU5leHRQcm9jZXNzZWRVc2VyAAAABQNuaWwJAJQKAgkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFDnRvdGFsV2VpZ2h0S2V5BQ50b3RhbFdlaWdodE5ldwUDbmlsBRFwcm9jZXNzaW5nQWN0aW9ucwULdXNlckFjdGlvbnMGAwkAAAIFD3Byb2Nlc3NpbmdTdGFnZQUVcHJvY2Vzc2luZ1N0YWdlU2hhcmVzBAp1c2VyV2VpZ2h0CQEWY2FsY1VzZXJXZWlnaHRGb3JDbGFpbQQJARZib29zdGluZ0NvbnRyYWN0T3JGYWlsAAUPaGVpZ2h0Rm9yUGVyaW9kBQ1jdXJyZW50UGVyaW9kBQtjdXJyZW50VXNlcgQadXNlckFtb3VudE1hdGNoZXJGb3JQZXJpb2QJAGsDCQEOZ2V0TnVtYmVyQnlLZXkBCQEXa2V5VG90YWxBbW91bnRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBQp1c2VyV2VpZ2h0BQt0b3RhbFdlaWdodAQbdXNlckFtb3VudEVtaXNzaW9uRm9yUGVyaW9kCQBrAwkBDmdldE51bWJlckJ5S2V5AQkBHWtleUF1eEVtaXNzaW9uUmV3YXJkRm9yUGVyaW9kAQUNY3VycmVudFBlcmlvZAUKdXNlcldlaWdodAULdG90YWxXZWlnaHQED3VzZXJUb3RhbEFtb3VudAkAZAIFG3VzZXJBbW91bnRFbWlzc2lvbkZvclBlcmlvZAUadXNlckFtb3VudE1hdGNoZXJGb3JQZXJpb2QEE3VzZXJVbmNsYWltZWRPcHRpb24JAJ8IAQkBEGtleVVzZXJVbmNsYWltZWQBBQtjdXJyZW50VXNlcgQLdXNlckFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDUzKQIJARZib29zdGluZ0NvbnRyYWN0T3JGYWlsAAkBE2tleU51bVRvVXNlck1hcHBpbmcBBQtjdXJyZW50VXNlcgQIcmVmZXJyZXIJAJ0IAgUecmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzT3JGYWlsCQELa2V5UmVmZXJyZXIBBQt1c2VyQWRkcmVzcwQRYWN0aXZlUmVmZXJyYWxJbnYDCQAAAgUIcmVmZXJyZXIFBHVuaXQFBHVuaXQJAPwHBAUecmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzT3JGYWlsAhZ1cGRhdGVSZWZlcnJhbEFjdGl2aXR5CQDMCAIFE3JlZmVycmFsUHJvZ3JhbU5hbWUJAMwIAgULdXNlckFkZHJlc3MJAMwIAgkAZwIFCnVzZXJXZWlnaHQFFHJlZmVycmFsTWluR1d4QW1vdW50BQNuaWwFA25pbAMJAAACBRFhY3RpdmVSZWZlcnJhbEludgURYWN0aXZlUmVmZXJyYWxJbnYEC3JlZmVycmFsSW52AwMJAAACBQhyZWZlcnJlcgUEdW5pdAYJAGYCBRRyZWZlcnJhbE1pbkdXeEFtb3VudAUKdXNlcldlaWdodAUEdW5pdAQOcmVmZXJyZXJSZXdhcmQJAGsDBQ91c2VyVG90YWxBbW91bnQFFnJlZmVycmVyUmV3YXJkUGVybWlsbGUFBVNDQUxFBA5yZWZlcnJhbFJld2FyZAkAawMFD3VzZXJUb3RhbEFtb3VudAUWcmVmZXJyYWxSZXdhcmRQZXJtaWxsZQUFU0NBTEUJAPwHBAUecmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzT3JGYWlsAgxpbmNVbmNsYWltZWQJAMwIAgUTcmVmZXJyYWxQcm9ncmFtTmFtZQkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCBQ5yZWZlcnJlclJld2FyZAkAzAgCBQ5yZWZlcnJhbFJld2FyZAUDbmlsBQNuaWwDCQAAAgULcmVmZXJyYWxJbnYFC3JlZmVycmFsSW52BBB1bmNsYWltZWRBY3Rpb25zAwMFCG1pZ3JhdGVkBgkBAiE9AgUTdXNlclVuY2xhaW1lZE9wdGlvbgUEdW5pdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEGtleVVzZXJVbmNsYWltZWQBBQtjdXJyZW50VXNlcgkAZAIJAQt2YWx1ZU9yRWxzZQIFE3VzZXJVbmNsYWltZWRPcHRpb24AAAUPdXNlclRvdGFsQW1vdW50BQNuaWwFA25pbAQRcHJvY2Vzc2luZ0FjdGlvbnMDCQBmAgkAZQIFCnVzZXJzQ291bnQAAQULY3VycmVudFVzZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlOZXh0UHJvY2Vzc2VkVXNlcgAJAGQCBQtjdXJyZW50VXNlcgABBQNuaWwJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlOZXh0UHJvY2Vzc2VkUGVyaW9kAAkAZAIFDWN1cnJlbnRQZXJpb2QAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleU5leHRQcm9jZXNzZWRVc2VyAAAACQDMCAIJAQtEZWxldGVFbnRyeQEJARJrZXlQcm9jZXNzaW5nU3RhZ2UABQNuaWwJAJQKAgkAzggCBRB1bmNsYWltZWRBY3Rpb25zBRFwcm9jZXNzaW5nQWN0aW9ucwYJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAhhpbnZhbGlkIHByb2Nlc3Npbmcgc3RhZ2UBaQEPZmluYWxpemVXcmFwcGVyAQdjb3VudGVyBAZyZXN1bHQKAAFACQD8BwQFBHRoaXMCDmZpbmFsaXplSGVscGVyBQNuaWwFA25pbAMJAAECBQFAAgdCb29sZWFuBQFACQACAQkArAICCQADAQkA/AcEBQR0aGlzAg5maW5hbGl6ZUhlbHBlcgUDbmlsBQNuaWwCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4DCQAAAgUGcmVzdWx0BQZyZXN1bHQDCQEBIQEFBnJlc3VsdAMJAAACBQdjb3VudGVyBQhtYXhEZXB0aAkAAgECEk5vdGhpbmcgdG8gcHJvY2VzcwkAlAoCBQNuaWwFBHVuaXQDCQBmAgUHY291bnRlcgAACQCUCgIFA25pbAkA/AcEBQR0aGlzAg9maW5hbGl6ZVdyYXBwZXIJAMwIAgkAZQIFB2NvdW50ZXIAAQUDbmlsBQNuaWwJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBHXByb2Nlc3NQZW5kaW5nUGVyaW9kc0FuZFVzZXJzAAkAlAoCBQNuaWwJAPwHBAUEdGhpcwIPZmluYWxpemVXcmFwcGVyCQDMCAIFCG1heERlcHRoBQNuaWwFA25pbAFpAQdkZXBvc2l0AAQIY2ZnQXJyYXkJARVyZWFkQ29uZmlnQXJyYXlPckZhaWwAAwkBAiE9AggFAWkGY2FsbGVyCQEHQWRkcmVzcwEJANkEAQkAkQMCBQhjZmdBcnJheQUWSWR4Q2ZnUGFjZW1ha2VyQWRkcmVzcwkAAgECFFdyb25nIGNhbGxlciBhZGRyZXNzBAdhc3NldElkCQEFdmFsdWUBCAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQDCQECIT0CBQdhc3NldElkCQDZBAEJAJEDAgUIY2ZnQXJyYXkFDUlkeENmZ0Fzc2V0SWQJAAIBAhNXcm9uZyBwYXltZW50IGFzc2V0BAZwZXJpb2QJAQpuZXh0UGVyaW9kAAQGZGVsdGFICQBlAgUGaGVpZ2h0CQEPZ2V0TnVtYmVyT3JGYWlsAQkBH2tleUd3eFJld2FyZEVtaXNzaW9uU3RhcnRIZWlnaHQABAxlbWlzc2lvblJhdGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRBlbWlzc2lvbkNvbnRyYWN0CQEWa2V5UmF0ZVBlckJsb2NrQ3VycmVudAAJAKwCAgkArAICAhxtYW5kYXRvcnkgZW1pc3Npb25fY29udHJhY3QuCQEWa2V5UmF0ZVBlckJsb2NrQ3VycmVudAACDyBpcyBub3QgZGVmaW5lZAQGd2VpZ2h0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUPZmFjdG9yeUNvbnRyYWN0CQEUa2V5UG9vbFdlaWdodFZpcnR1YWwACQCsAgIJAKwCAgIbbWFuZGF0b3J5IGZhY3RvcnlfY29udHJhY3QuCQEUa2V5UG9vbFdlaWdodFZpcnR1YWwAAg8gaXMgbm90IGRlZmluZWQECWF1eEFtb3VudAkAawMJAGgCBQZkZWx0YUgFBndlaWdodAUMZW1pc3Npb25SYXRlBQVNVUxUOAQCZW0JAPwHBAUQZW1pc3Npb25Db250cmFjdAIEZW1pdAkAzAgCBQlhdXhBbW91bnQFA25pbAUDbmlsAwkAAAIFAmVtBQJlbQQLbWF0Y2hlclBhcnQICQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BApwYXlvdXRJbmZvCQEQUGVyaW9kUGF5b3V0SW5mbwMFBnBlcmlvZAULbWF0Y2hlclBhcnQFCWF1eEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBD2tleUxhdGVzdFBlcmlvZAAFBnBlcmlvZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmtleUhlaWdodEZvclBlcmlvZAEFBnBlcmlvZAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEda2V5QXV4RW1pc3Npb25SZXdhcmRGb3JQZXJpb2QBBQZwZXJpb2QFCWF1eEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBH2tleUd3eFJld2FyZEVtaXNzaW9uU3RhcnRIZWlnaHQABQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJARdrZXlUb3RhbEFtb3VudEZvclBlcmlvZAEFBnBlcmlvZAULbWF0Y2hlclBhcnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ1rZXlOZXh0UGVyaW9kAAkAZAIFBnBlcmlvZAABCQDMCAIJAQtTdHJpbmdFbnRyeQIJARFrZXlMYXN0UGF5b3V0SW5mbwAFCnBheW91dEluZm8JAMwIAgkBC1N0cmluZ0VudHJ5AgkBFGtleVBheW91dEhpc3RvcnlJbmZvAQUGcGVyaW9kBQpwYXlvdXRJbmZvBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQELY2xhaW1SZXdhcmQABAhjZmdBcnJheQkBFXJlYWRDb25maWdBcnJheU9yRmFpbAAEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBA0kdDAxNzkxNzE3OTY3CQERY29tbW9uQ2xhaW1SZXdhcmQBBQdhZGRyZXNzBAZhbW91bnQIBQ0kdDAxNzkxNzE3OTY3Al8xBAdhY3Rpb25zCAUNJHQwMTc5MTcxNzk2NwJfMgQLY2hlY2tBbW91bnQDCQBmAgUGYW1vdW50AAAGCQACAQIQTm90aGluZyB0byBjbGFpbQMJAAACBQtjaGVja0Ftb3VudAULY2hlY2tBbW91bnQEEmFtb3VudEZyb21FbWlzc2lvbgAABA9jbGFpbWVkUmVmZXJyYWwKAAFACQD8BwQFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAIFY2xhaW0JAMwIAgUTcmVmZXJyYWxQcm9ncmFtTmFtZQUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQkA/AcEBR5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwCBWNsYWltCQDMCAIFE3JlZmVycmFsUHJvZ3JhbU5hbWUFA25pbAUDbmlsAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQEC3RvdGFsQW1vdW50CQBkAgUGYW1vdW50BQ9jbGFpbWVkUmVmZXJyYWwJAJQKAgkAzggCCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgULdG90YWxBbW91bnQJANkEAQkAkQMCBQhjZmdBcnJheQUNSWR4Q2ZnQXNzZXRJZAkAzAgCCQEMSGlzdG9yeUVudHJ5BAIFY2xhaW0FB2FkZHJlc3MFBmFtb3VudAUBaQUDbmlsBQdhY3Rpb25zCQDMCAIFC3RvdGFsQW1vdW50CQDMCAIFEmFtb3VudEZyb21FbWlzc2lvbgUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBE2NsYWltUmV3YXJkUkVBRE9OTFkBB2FkZHJlc3MEDSR0MDE4NTQwMTg1OTAJARFjb21tb25DbGFpbVJld2FyZAEFB2FkZHJlc3MEBmFtb3VudAgFDSR0MDE4NTQwMTg1OTACXzEEB2FjdGlvbnMIBQ0kdDAxODU0MDE4NTkwAl8yBBFyZWZlcnJhbFVuY2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAmggCBR5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwJARRrZXlVbmNsYWltZWRSZWZlcnJhbAIFE3JlZmVycmFsUHJvZ3JhbU5hbWUFB2FkZHJlc3MAAAQLdG90YWxBbW91bnQJAGQCBQZhbW91bnQFEXJlZmVycmFsVW5jbGFpbWVkCQCUCgIFA25pbAULdG90YWxBbW91bnQBaQEdbGF0ZXN0RmluYWxpemVkUGVyaW9kUkVBRE9OTFkBB2FkZHJlc3MJAJQKAgUDbmlsCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAQ9rZXlMYXRlc3RQZXJpb2QAAP///////////wEBaQEhbGF0ZXN0RmluYWxpemVkUGVyaW9kSW5mb1JFQURPTkxZAQdhZGRyZXNzCQCUCgIFA25pbAkBDmdldFN0cmluZ0J5S2V5AQkBEWtleUxhc3RQYXlvdXRJbmZvAAFpARVjYWxjR3d4UGFyYW1zUkVBRE9OTFkDDmd3eEFtb3VudFN0YXJ0D2xvY2tTdGFydEhlaWdodBJsb2NrRHVyYXRpb25CbG9ja3MEDWxvY2tFbmRIZWlnaHQJAGQCBQ9sb2NrU3RhcnRIZWlnaHQFEmxvY2tEdXJhdGlvbkJsb2NrcwQMc2NhbGU4UGFyYW1LCQEBLQEJAGsDBQ5nd3hBbW91bnRTdGFydAUFU0NBTEUFEmxvY2tEdXJhdGlvbkJsb2NrcwQMc2NhbGU4UGFyYW1CCQBoAgkAawMFDmd3eEFtb3VudFN0YXJ0BQVTQ0FMRQUSbG9ja0R1cmF0aW9uQmxvY2tzBQ1sb2NrRW5kSGVpZ2h0CQCUCgIFA25pbAkAzAgCBQxzY2FsZThQYXJhbUsJAMwIAgUMc2NhbGU4UGFyYW1CCQDMCAIJAQpuZXh0UGVyaW9kAAUDbmlsAWkBGmNhbGNHd3hBbW91bnRTdGFydFJFQURPTkxZAwx3eExvY2tBbW91bnQMbG9ja0R1cmF0aW9uD21heExvY2tEdXJhdGlvbgQHY29lZmZYOAkAawMFDGxvY2tEdXJhdGlvbgUFTVVMVDgFD21heExvY2tEdXJhdGlvbgQOZ1d4QW1vdW50U3RhcnQJAGsDBQx3eExvY2tBbW91bnQFB2NvZWZmWDgFBU1VTFQ4CQCUCgIFA25pbAkAzAgCBQ5nV3hBbW91bnRTdGFydAUDbmlsAWkBFW9uRW1pc3Npb25Gb3JHd3hTdGFydAADCQECIT0CCAUBaQZjYWxsZXIFD2ZhY3RvcnlDb250cmFjdAkAAgECEnBlcm1pc3Npb25zIGRlbmllZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBH2tleUd3eFJld2FyZEVtaXNzaW9uU3RhcnRIZWlnaHQABQZoZWlnaHQFA25pbAFpASNsYXRlc3RQZXJpb2RFbWlzc2lvblJld2FyZHNSRUFET05MWQEHYWRkcmVzcwQGcGVyaW9kCQEKbmV4dFBlcmlvZAAJAJQKAgUDbmlsCQDMCAIJAQ5nZXROdW1iZXJCeUtleQEJAR1rZXlBdXhFbWlzc2lvblJld2FyZEZvclBlcmlvZAEFBnBlcmlvZAUDbmlsAWkBBWNhbGNEBQt4MUJpZ0ludFN0cgt4MkJpZ0ludFN0cgxhbXBCaWdJbnRTdHITYVByZWNpc2lvbkJpZ0ludFN0chh0YXJnZXRQcmVjaXNpb25CaWdJbnRTdHIEBm5Db2lucwkAtgIBAAIECmFQcmVjaXNpb24JAKcDAQUTYVByZWNpc2lvbkJpZ0ludFN0cgQPdGFyZ2V0UHJlY2lzaW9uCQCnAwEFGHRhcmdldFByZWNpc2lvbkJpZ0ludFN0cgQCeDEJAKcDAQULeDFCaWdJbnRTdHIEAngyCQCnAwEFC3gyQmlnSW50U3RyBANhbXAJALkCAgkApwMBBQxhbXBCaWdJbnRTdHIFCmFQcmVjaXNpb24EAXMJALcCAgUCeDEFAngyAwkAAAIFAXMFCnplcm9CaWdJbnQJAJQKAgUDbmlsCQCmAwEFCnplcm9CaWdJbnQEA2FubgkAuQICBQNhbXAFBm5Db2lucwQDYXJyCQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUJAMwIAgAGCQDMCAIABwUDbmlsCgEEY2FsYwIDYWNjA2N1cgQNJHQwMjEyMTMyMTQwMgUDYWNjBAFkCAUNJHQwMjEyMTMyMTQwMgJfMQQFZFByZXYIBQ0kdDAyMTIxMzIxNDAyAl8yBAJkcAkAugICCQC5AgIJALkCAgUBZAUBZAUBZAkAuQICCQC5AgIJALkCAgUCeDEFAngyBQZuQ29pbnMFBm5Db2lucwQFZE5leHQJALoCAgkAuQICCQC3AgIJALoCAgkAuQICBQNhbm4FAXMFCmFQcmVjaXNpb24JALkCAgUCZHAFBm5Db2lucwUBZAkAtwICCQC6AgIJALkCAgkAuAICBQNhbm4FCmFQcmVjaXNpb24FAWQFCmFQcmVjaXNpb24JALkCAgkAtwICBQZuQ29pbnMJALYCAQABBQJkcAkAlAoCBQVkTmV4dAUBZAQNJHQwMjE2MTUyMTY2NQoAAiRsBQNhcnIKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFAXMFBHVuaXQKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBGNhbGMCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDcJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwQFZE5leHQIBQ0kdDAyMTYxNTIxNjY1Al8xBAVkUHJldggFDSR0MDIxNjE1MjE2NjUCXzIEBWREaWZmCQEDYWJzAQkAuAICBQVkTmV4dAkBBXZhbHVlAQUFZFByZXYDCQDAAgIFD3RhcmdldFByZWNpc2lvbgUFZERpZmYJAJQKAgUDbmlsCQCmAwEFBWROZXh0CQACAQkArAICAh1EIGNhbGN1bGF0aW9uIGVycm9yLCBkRGlmZiA9IAkApgMBBQVkRGlmZgFpAQpzZXRNYW5hZ2VyARdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQQLY2hlY2tDYWxsZXIJAQttdXN0TWFuYWdlcgEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyBBVjaGVja01hbmFnZXJQdWJsaWNLZXkJANkEAQUXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkDCQAAAgUVY2hlY2tNYW5hZ2VyUHVibGljS2V5BRVjaGVja01hbmFnZXJQdWJsaWNLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAUXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5jb25maXJtTWFuYWdlcgAEAnBtCQEdcGVuZGluZ01hbmFnZXJQdWJsaWNLZXlPclVuaXQABAVoYXNQTQMJAQlpc0RlZmluZWQBBQJwbQYJAAIBAhJObyBwZW5kaW5nIG1hbmFnZXIDCQAAAgUFaGFzUE0FBWhhc1BNBAdjaGVja1BNAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQkBBXZhbHVlAQUCcG0GCQACAQIbWW91IGFyZSBub3QgcGVuZGluZyBtYW5hZ2VyAwkAAAIFB2NoZWNrUE0FB2NoZWNrUE0JAMwIAgkBC1N0cmluZ0VudHJ5AgkBE2tleU1hbmFnZXJQdWJsaWNLZXkACQDYBAEJAQV2YWx1ZQEFAnBtCQDMCAIJAQtEZWxldGVFbnRyeQEJARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAED3RhcmdldFB1YmxpY0tleQQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwBQJwawMJAAECBQckbWF0Y2gwAgRVbml0CAUCdHgPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFD3RhcmdldFB1YmxpY0tlean3feg=", "chainId": 84, "height": 2178229, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HrX9jd4WXY1LyPWsfqpRnh69JduaogDsoYDzDF1Ewnrj Next: 8WkzGvaixETERnvaADLmZ6YTPLw1VeqmuXCeqivPcDjZ Diff:
OldNewDifferences
297297 func nextPeriod () = getNumberByKey(keyNextPeriod())
298298
299299
300-func invokeClaim (boostingContract,period,user,depth,totalFromMatcher,totalFromEmission) = {
301- let result = invoke(this, "claimNextBatch", [boostingContract, period, user, depth, totalFromMatcher, totalFromEmission], nil)
302- if ((result == result))
303- then match result {
304- case r: (Int, Int, Int) =>
305- r
306- case _ =>
307- throw("Incorrect invoke result")
308- }
309- else throw("Strict value is not equal to itself.")
310- }
311-
312-
313-func claimInternal (boostingContract,currentPeriod,currentUser,depth,userAccumulatedMatcher,userAccumulatedEmission) = {
314- let boostingContractAddress = Address(boostingContract)
315- let latestPeriod = getNumberByKey(keyNextProcessedPeriod())
316- let totalWeight = getNumberByKey(keyTotalWeightForPeriod(currentPeriod))
317- let heightForPeriod = getNumberByKey(keyHeightForPeriod(currentPeriod))
318- let userWeight = calcUserWeightForClaim(boostingContractAddress, heightForPeriod, currentPeriod, currentUser)
319- let userAmountMatcherForPeriod = fraction(getNumberByKey(keyTotalAmountForPeriod(currentPeriod)), userWeight, totalWeight)
320- let userAmountEmissionForPeriod = fraction(getNumberByKey(keyAuxEmissionRewardForPeriod(currentPeriod)), userWeight, totalWeight)
321- if (if ((0 >= depth))
322- then true
323- else ((currentPeriod + 1) >= latestPeriod))
324- then $Tuple3((currentPeriod + 1), (userAccumulatedMatcher + userAmountMatcherForPeriod), (userAccumulatedEmission + userAmountEmissionForPeriod))
325- else invokeClaim(boostingContract, (currentPeriod + 1), currentUser, (depth - 1), (userAccumulatedMatcher + userAmountMatcherForPeriod), (userAccumulatedEmission + userAmountEmissionForPeriod))
326- }
327-
328-
329300 func commonClaimReward (userAddress) = {
330301 let cfgArray = readConfigArrayOrFail()
331302 let userIdx = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddress)
332303 let userUnclaimedOption = getInteger(keyUserUnclaimed(userIdx))
333304 match userUnclaimedOption {
334305 case _: Unit =>
335- if (migrated)
336- then $Tuple2(0, nil)
337- else {
338- let currentPeriod = getNumberByKey(keyNextUnlaimedPeriodOfUser(userIdx))
339- let nextProcessedPeriod = getNumberByKey(keyNextProcessedPeriod())
340- if ((currentPeriod >= nextProcessedPeriod))
341- then $Tuple2(0, nil)
342- else {
343- let boostingContract = fromBase58String(cfgArray[IdxCfgBoostingContract])
344- let $t01306313189 = claimInternal(boostingContract, currentPeriod, userIdx, USERDEPTH, 0, 0)
345- let period = $t01306313189._1
346- let amountFromMatcher = $t01306313189._2
347- let amountFromEmission = $t01306313189._3
348- let amount = (amountFromMatcher + amountFromEmission)
349- let actions = [IntegerEntry(keyNextUnlaimedPeriodOfUser(userIdx), period)]
350- $Tuple2(amount, actions)
351- }
352- }
306+ $Tuple2(0, nil)
353307 case u: Int =>
354308 $Tuple2(u, [IntegerEntry(keyUserUnclaimed(userIdx), 0)])
355309 case _ =>
385339 then $Tuple2(nil, false)
386340 else if ((processingStage == processingStageTotal))
387341 then {
388- let $t01477114887 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
389- let userWeight = $t01477114887._1
390- let userActions = $t01477114887._2
342+ let $t01238712503 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
343+ let userWeight = $t01238712503._1
344+ let userActions = $t01238712503._2
391345 let totalWeightNew = (totalWeight + userWeight)
392346 let processingActions = if (((usersCount - 1) > currentUser))
393347 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
465419
466420
467421 @Callable(i)
468-func migrateHelper () = {
469- let currentUser = getNumberByKey(keyNextProcessedUserMigration)
470- let usersCount = valueOrElse(getInteger(boostingContractOrFail(), keyUsersCount()), 0)
471- if (migrated)
472- then $Tuple2(nil, false)
473- else {
474- let userAddress = getStringValue(boostingContractOrFail(), keyNumToUserMapping(currentUser))
475- let $t01831618377 = commonClaimReward(userAddress)
476- let userUnclaimed = $t01831618377._1
477- let actions = $t01831618377._2
478- let processingActions = if (((usersCount - 1) > currentUser))
479- then [IntegerEntry(keyNextProcessedUserMigration, (currentUser + 1))]
480- else [DeleteEntry(keyNextProcessedUserMigration), BooleanEntry(keyMigrated, true)]
481- $Tuple2(([IntegerEntry(keyUserUnclaimed(currentUser), userUnclaimed)] ++ processingActions), true)
482- }
483- }
484-
485-
486-
487-@Callable(i)
488-func migrateWrapper (counter) = {
489- let result = {
490- let @ = invoke(this, "migrateHelper", nil, nil)
491- if ($isInstanceOf(@, "Boolean"))
492- then @
493- else throw(($getType(invoke(this, "migrateHelper", nil, nil)) + " couldn't be cast to Boolean"))
494- }
495- if ((result == result))
496- then if (!(result))
497- then if ((counter == maxDepthMigration))
498- then throw("Migration is over")
499- else $Tuple2(nil, unit)
500- else if ((counter > 0))
501- then $Tuple2(nil, invoke(this, "migrateWrapper", [(counter - 1)], nil))
502- else $Tuple2(nil, unit)
503- else throw("Strict value is not equal to itself.")
504- }
505-
506-
507-
508-@Callable(i)
509-func migrate () = $Tuple2(nil, invoke(this, "migrateWrapper", [maxDepthMigration], nil))
510-
511-
512-
513-@Callable(i)
514422 func deposit () = {
515423 let cfgArray = readConfigArrayOrFail()
516424 if ((i.caller != Address(fromBase58String(cfgArray[IdxCfgPacemakerAddress]))))
540448
541449
542450 @Callable(i)
543-func claimNextBatch (boostingContract,currentPeriod,currentUser,depth,totalFromMatcher,totalFromEmission) = if ((i.caller != this))
544- then throw("Should be called by this script only")
545- else {
546- let periodAndTotals = claimInternal(boostingContract, currentPeriod, currentUser, depth, totalFromMatcher, totalFromEmission)
547- $Tuple2(nil, periodAndTotals)
548- }
549-
550-
551-
552-@Callable(i)
553451 func claimReward () = {
554452 let cfgArray = readConfigArrayOrFail()
555453 let address = toString(i.caller)
556- let $t02203522085 = commonClaimReward(address)
557- let amount = $t02203522085._1
558- let actions = $t02203522085._2
454+ let $t01791717967 = commonClaimReward(address)
455+ let amount = $t01791717967._1
456+ let actions = $t01791717967._2
559457 let checkAmount = if ((amount > 0))
560458 then true
561459 else throw("Nothing to claim")
578476
579477 @Callable(i)
580478 func claimRewardREADONLY (address) = {
581- let $t02265822708 = commonClaimReward(address)
582- let amount = $t02265822708._1
583- let actions = $t02265822708._2
479+ let $t01854018590 = commonClaimReward(address)
480+ let amount = $t01854018590._1
481+ let actions = $t01854018590._2
584482 let referralUnclaimed = valueOrElse(getInteger(referralsContractAddressOrFail, keyUnclaimedReferral(referralProgramName, address)), 0)
585483 let totalAmount = (amount + referralUnclaimed)
586484 $Tuple2(nil, totalAmount)
618516
619517
620518 @Callable(i)
621-func constructor (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr,maxDepth) = if ((this != i.caller))
622- then throw("not authorized")
623- else [StringEntry(keyConfig(), formatConfig(wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr, maxDepth))]
624-
625-
626-
627-@Callable(i)
628-func constructorV2 (factoryAddress) = if ((this != i.caller))
629- then throw("not authorized")
630- else [StringEntry(keyFactoryAddress(), factoryAddress)]
631-
632-
633-
634-@Callable(i)
635-func constructorV3 (emissionAddress) = if ((this != i.caller))
636- then throw("not authorized")
637- else {
638- let initLatestPeriod = if (isDefined(getInteger(this, keyLatestPeriod())))
639- then nil
640- else [IntegerEntry(keyLatestPeriod(), -1)]
641- (initLatestPeriod :+ StringEntry(keyEmissionAddress(), emissionAddress))
642- }
643-
644-
645-
646-@Callable(i)
647519 func onEmissionForGwxStart () = if ((i.caller != factoryContract))
648520 then throw("permissions denied")
649521 else [IntegerEntry(keyGwxRewardEmissionStartHeight(), height)]
673545 let ann = (amp * nCoins)
674546 let arr = [1, 2, 3, 4, 5, 6, 7]
675547 func calc (acc,cur) = {
676- let $t02626726456 = acc
677- let d = $t02626726456._1
678- let dPrev = $t02626726456._2
548+ let $t02121321402 = acc
549+ let d = $t02121321402._1
550+ let dPrev = $t02121321402._2
679551 let dp = (((d * d) * d) / (((x1 * x2) * nCoins) * nCoins))
680552 let dNext = (((((ann * s) / aPrecision) + (dp * nCoins)) * d) / ((((ann - aPrecision) * d) / aPrecision) + ((nCoins + toBigInt(1)) * dp)))
681553 $Tuple2(dNext, d)
682554 }
683555
684- let $t02666926719 = {
556+ let $t02161521665 = {
685557 let $l = arr
686558 let $s = size($l)
687559 let $acc0 = $Tuple2(s, unit)
695567
696568 $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)
697569 }
698- let dNext = $t02666926719._1
699- let dPrev = $t02666926719._2
570+ let dNext = $t02161521665._1
571+ let dPrev = $t02161521665._2
700572 let dDiff = abs((dNext - value(dPrev)))
701573 if ((targetPrecision >= dDiff))
702574 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 let keyMaxDepthMigration = "%s__maxDepthMigration"
4242
4343 let maxDepthMigrationDefault = 3
4444
4545 let maxDepthMigration = valueOrElse(getInteger(this, keyMaxDepthMigration), maxDepthMigrationDefault)
4646
4747 let keyMigrated = "migrated"
4848
4949 let migrated = valueOrElse(getBoolean(this, keyMigrated), false)
5050
5151 let keyNextProcessedUserMigration = "nextProcessedUserMigration"
5252
5353 func keyFactoryAddress () = "%s%s__config__factoryAddress"
5454
5555
5656 let factoryAddressStr = getStringOrFail(keyFactoryAddress())
5757
5858 let factoryContract = addressFromStringValue(factoryAddressStr)
5959
6060 func keyEmissionAddress () = "%s%s__config__emissionAddress"
6161
6262
6363 func keyNumToUserMapping (num) = makeString(["%s%s%s", "mapping", "num2user", toString(num)], SEP)
6464
6565
6666 let keyReferralProgramName = makeString(["%s%s", "referral", "programName"], SEP)
6767
6868 let referralProgramNameDefault = "wxlock"
6969
7070 let referralProgramName = valueOrElse(getString(this, keyReferralProgramName), referralProgramNameDefault)
7171
7272 let keyReferralMinGWxAmount = makeString(["%s%s", "referral", "minGWxAmount"], SEP)
7373
7474 let referralMinGWxAmountDefault = (500 * MULT8)
7575
7676 let referralMinGWxAmount = valueOrElse(getInteger(this, keyReferralMinGWxAmount), referralMinGWxAmountDefault)
7777
7878 let keyReferrerRewardPermille = makeString(["%s%s", "referral", "referrerRewardPermille"], SEP)
7979
8080 let referrerRewardPermilleDefault = 50
8181
8282 let referrerRewardPermille = valueOrElse(getInteger(this, keyReferrerRewardPermille), referrerRewardPermilleDefault)
8383
8484 let keyReferralRewardPermille = makeString(["%s%s", "referral", "referralRewardPermille"], SEP)
8585
8686 let referralRewardPermilleDefault = 50
8787
8888 let referralRewardPermille = valueOrElse(getInteger(this, keyReferralRewardPermille), referralRewardPermilleDefault)
8989
9090 func keyReferrer (referralAddress) = makeString(["%s%s%s", "referrer", referralProgramName, referralAddress], SEP)
9191
9292
9393 func keyUnclaimedReferral (programName,claimerAddress) = makeString(["%s%s%s%s", "unclaimedReferral", programName, claimerAddress], SEP)
9494
9595
9696 let emissionAddressStr = getStringOrFail(keyEmissionAddress())
9797
9898 let emissionContract = addressFromStringValue(emissionAddressStr)
9999
100100 let IdxCfgAssetId = 1
101101
102102 let IdxCfgPacemakerAddress = 2
103103
104104 let IdxCfgBoostingContract = 3
105105
106106 let IdxCfgMaxDepth = 4
107107
108108 func keyConfig () = "%s__config"
109109
110110
111111 func readConfigArrayOrFail () = split(getStringOrFail(keyConfig()), SEP)
112112
113113
114114 func formatConfig (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr,maxDepth) = makeString(["%s%s%s%d", wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr, toString(maxDepth)], SEP)
115115
116116
117117 func boostingContractOrFail () = {
118118 let cfgArray = readConfigArrayOrFail()
119119 valueOrErrorMessage(addressFromString(cfgArray[IdxCfgBoostingContract]), "boosting contract address is not defined")
120120 }
121121
122122
123123 func keyGwxRewardEmissionStartHeight () = "%s%s__gwxRewardEmissionPart__startHeight"
124124
125125
126126 func keyUsersCount () = "%s__nextUserNum"
127127
128128
129129 func keyRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
130130
131131
132132 func keyPoolWeightVirtual () = "%s%s__poolWeight__GWXvirtualPOOL"
133133
134134
135135 func keyNextProcessedUser () = "%s__nextProcessedUser"
136136
137137
138138 func keyLatestPeriod () = "%s__latestPeriod"
139139
140140
141141 func keyNextPeriod () = "%s__nextPeriod"
142142
143143
144144 func keyProcessingStage () = "%s__processingStage"
145145
146146
147147 func keyNextProcessedPeriod () = "%s__nextProcessedPeriod"
148148
149149
150150 func keyUserUnclaimed (userIndex) = makeString(["%s%d", "userUnclaimed", toString(userIndex)], SEP)
151151
152152
153153 func keyNextUnlaimedPeriodOfUser (userIndex) = makeString(["%s%d__nextClaimedPeriod", toString(userIndex)], SEP)
154154
155155
156156 func keyLastProcessedPeriodOfUser (userIndex) = makeString(["%s%d__lastProcessedPeriod", toString(userIndex)], SEP)
157157
158158
159159 func keyHeightForPeriod (period) = makeString(["%s%d__startHeightForPeriod", toString(period)], SEP)
160160
161161
162162 func keyAuxEmissionRewardForPeriod (period) = makeString(["%s%d__auxEmissionReward", toString(period)], SEP)
163163
164164
165165 func keyTotalAmountForPeriod (period) = makeString(["%s%d__totalAmountForPeriod", toString(period)], SEP)
166166
167167
168168 func keyLastPayoutInfo () = "%s__lastPayoutInfo"
169169
170170
171171 func PeriodPayoutInfo (period,matcherReward,emissionReward) = makeString(["%d%d%d", toString(period), toString(matcherReward), toString(emissionReward)], SEP)
172172
173173
174174 func keyPayoutHistoryInfo (period) = makeString(["%s%s%d__payouts__history", toString(period)], SEP)
175175
176176
177177 func keyTotalWeightForPeriod (period) = makeString(["%s%d__totalWeightForPeriod", toString(period)], SEP)
178178
179179
180180 func keyUserKValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "k", toString(period)], SEP)
181181
182182
183183 func keyUserBValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "b", toString(period)], SEP)
184184
185185
186186 func keyUserWeightForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "weight", toString(period)], SEP)
187187
188188
189189 func keyReferralsContractAddress () = makeString(["%s%s", "config", "referralsContractAddress"], SEP)
190190
191191
192192 let referralsContractAddressOrFail = addressFromStringValue(getStringOrFail(keyReferralsContractAddress()))
193193
194194 func HistoryEntry (type,user,amount,i) = {
195195 let historyKEY = makeString(["%s%s%s%s__history", type, user, toBase58String(i.transactionId)], SEP)
196196 let historyDATA = makeString(["%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount)], SEP)
197197 StringEntry(historyKEY, historyDATA)
198198 }
199199
200200
201201 func keyManagerPublicKey () = "%s__managerPublicKey"
202202
203203
204204 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
205205
206206
207207 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
208208 case s: String =>
209209 fromBase58String(s)
210210 case _: Unit =>
211211 unit
212212 case _ =>
213213 throw("Match error")
214214 }
215215
216216
217217 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
218218 case s: String =>
219219 fromBase58String(s)
220220 case _: Unit =>
221221 unit
222222 case _ =>
223223 throw("Match error")
224224 }
225225
226226
227227 func mustManager (i) = {
228228 let pd = throw("Permission denied")
229229 match managerPublicKeyOrUnit() {
230230 case pk: ByteVector =>
231231 if ((i.callerPublicKey == pk))
232232 then true
233233 else pd
234234 case _: Unit =>
235235 if ((i.caller == this))
236236 then true
237237 else pd
238238 case _ =>
239239 throw("Match error")
240240 }
241241 }
242242
243243
244244 func calcUserWeight (boostingContractAddress,heightForPeriod,period,userIndex) = {
245245 let kLast = keyLastProcessedPeriodOfUser(userIndex)
246246 let kKey = keyUserKValueForPeriod(period, userIndex)
247247 let kRaw = getInteger(boostingContractAddress, kKey)
248248 let kUserWeight = keyUserWeightForPeriod(period, userIndex)
249249 if (isDefined(kRaw))
250250 then {
251251 let k = value(kRaw)
252252 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(period, userIndex)))
253253 let w = ((k * heightForPeriod) + b)
254254 if ((w > 0))
255255 then $Tuple2((w / SCALE), [IntegerEntry(kLast, period), IntegerEntry(kUserWeight, w)])
256256 else $Tuple2(0, nil)
257257 }
258258 else {
259259 let p = getInteger(this, kLast)
260260 if (if (isDefined(p))
261261 then (period >= value(p))
262262 else false)
263263 then {
264264 let pv = value(p)
265265 let k = value(getInteger(boostingContractAddress, keyUserKValueForPeriod(pv, userIndex)))
266266 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(pv, userIndex)))
267267 let w = ((k * heightForPeriod) + b)
268268 if ((w > 0))
269269 then $Tuple2((w / SCALE), [IntegerEntry(kUserWeight, w)])
270270 else $Tuple2(0, nil)
271271 }
272272 else $Tuple2(0, nil)
273273 }
274274 }
275275
276276
277277 func calcUserWeightForClaim (boostingContractAddress,heightForPeriod,period,userIndex) = {
278278 let kUserWeight = keyUserWeightForPeriod(period, userIndex)
279279 let userWeightOrUnit = getInteger(kUserWeight)
280280 match userWeightOrUnit {
281281 case _: Unit =>
282282 0
283283 case w: Int =>
284284 (w / SCALE)
285285 case _ =>
286286 throw("Match error")
287287 }
288288 }
289289
290290
291291 func getUserIndexByAddress (boostingContractAddressStr,userAddress) = {
292292 let key = makeString(["%s%s%s", "mapping", "user2num", userAddress], SEP)
293293 parseIntValue(valueOrErrorMessage(getString(Address(fromBase58String(boostingContractAddressStr)), key), ((("User address " + userAddress) + " is not found in boosting contract data, key=") + key)))
294294 }
295295
296296
297297 func nextPeriod () = getNumberByKey(keyNextPeriod())
298298
299299
300-func invokeClaim (boostingContract,period,user,depth,totalFromMatcher,totalFromEmission) = {
301- let result = invoke(this, "claimNextBatch", [boostingContract, period, user, depth, totalFromMatcher, totalFromEmission], nil)
302- if ((result == result))
303- then match result {
304- case r: (Int, Int, Int) =>
305- r
306- case _ =>
307- throw("Incorrect invoke result")
308- }
309- else throw("Strict value is not equal to itself.")
310- }
311-
312-
313-func claimInternal (boostingContract,currentPeriod,currentUser,depth,userAccumulatedMatcher,userAccumulatedEmission) = {
314- let boostingContractAddress = Address(boostingContract)
315- let latestPeriod = getNumberByKey(keyNextProcessedPeriod())
316- let totalWeight = getNumberByKey(keyTotalWeightForPeriod(currentPeriod))
317- let heightForPeriod = getNumberByKey(keyHeightForPeriod(currentPeriod))
318- let userWeight = calcUserWeightForClaim(boostingContractAddress, heightForPeriod, currentPeriod, currentUser)
319- let userAmountMatcherForPeriod = fraction(getNumberByKey(keyTotalAmountForPeriod(currentPeriod)), userWeight, totalWeight)
320- let userAmountEmissionForPeriod = fraction(getNumberByKey(keyAuxEmissionRewardForPeriod(currentPeriod)), userWeight, totalWeight)
321- if (if ((0 >= depth))
322- then true
323- else ((currentPeriod + 1) >= latestPeriod))
324- then $Tuple3((currentPeriod + 1), (userAccumulatedMatcher + userAmountMatcherForPeriod), (userAccumulatedEmission + userAmountEmissionForPeriod))
325- else invokeClaim(boostingContract, (currentPeriod + 1), currentUser, (depth - 1), (userAccumulatedMatcher + userAmountMatcherForPeriod), (userAccumulatedEmission + userAmountEmissionForPeriod))
326- }
327-
328-
329300 func commonClaimReward (userAddress) = {
330301 let cfgArray = readConfigArrayOrFail()
331302 let userIdx = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddress)
332303 let userUnclaimedOption = getInteger(keyUserUnclaimed(userIdx))
333304 match userUnclaimedOption {
334305 case _: Unit =>
335- if (migrated)
336- then $Tuple2(0, nil)
337- else {
338- let currentPeriod = getNumberByKey(keyNextUnlaimedPeriodOfUser(userIdx))
339- let nextProcessedPeriod = getNumberByKey(keyNextProcessedPeriod())
340- if ((currentPeriod >= nextProcessedPeriod))
341- then $Tuple2(0, nil)
342- else {
343- let boostingContract = fromBase58String(cfgArray[IdxCfgBoostingContract])
344- let $t01306313189 = claimInternal(boostingContract, currentPeriod, userIdx, USERDEPTH, 0, 0)
345- let period = $t01306313189._1
346- let amountFromMatcher = $t01306313189._2
347- let amountFromEmission = $t01306313189._3
348- let amount = (amountFromMatcher + amountFromEmission)
349- let actions = [IntegerEntry(keyNextUnlaimedPeriodOfUser(userIdx), period)]
350- $Tuple2(amount, actions)
351- }
352- }
306+ $Tuple2(0, nil)
353307 case u: Int =>
354308 $Tuple2(u, [IntegerEntry(keyUserUnclaimed(userIdx), 0)])
355309 case _ =>
356310 throw("Match error")
357311 }
358312 }
359313
360314
361315 @Callable(i)
362316 func updateReferralActivity (userAddress,gWxAmountStart) = {
363317 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
364318 let activeReferralInv = if ((referrer == unit))
365319 then unit
366320 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (gWxAmountStart >= referralMinGWxAmount)], nil)
367321 if ((activeReferralInv == activeReferralInv))
368322 then $Tuple2(nil, unit)
369323 else throw("Strict value is not equal to itself.")
370324 }
371325
372326
373327
374328 @Callable(i)
375329 func finalizeHelper () = {
376330 let processingStage = valueOrElse(getInteger(keyProcessingStage()), processingStageTotal)
377331 let currentPeriod = getNumberByKey(keyNextProcessedPeriod())
378332 let currentUser = getNumberByKey(keyNextProcessedUser())
379333 let latestPeriod = getNumberByKey(keyLatestPeriod())
380334 let usersCount = valueOrElse(getInteger(boostingContractOrFail(), keyUsersCount()), 0)
381335 let totalWeightKey = keyTotalWeightForPeriod(currentPeriod)
382336 let totalWeight = getNumberByKey(keyTotalWeightForPeriod(currentPeriod))
383337 let heightForPeriod = getNumberByKey(keyHeightForPeriod(currentPeriod))
384338 if ((currentPeriod > latestPeriod))
385339 then $Tuple2(nil, false)
386340 else if ((processingStage == processingStageTotal))
387341 then {
388- let $t01477114887 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
389- let userWeight = $t01477114887._1
390- let userActions = $t01477114887._2
342+ let $t01238712503 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
343+ let userWeight = $t01238712503._1
344+ let userActions = $t01238712503._2
391345 let totalWeightNew = (totalWeight + userWeight)
392346 let processingActions = if (((usersCount - 1) > currentUser))
393347 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
394348 else [IntegerEntry(keyProcessingStage(), processingStageShares), IntegerEntry(keyNextProcessedUser(), 0)]
395349 $Tuple2((([IntegerEntry(totalWeightKey, totalWeightNew)] ++ processingActions) ++ userActions), true)
396350 }
397351 else if ((processingStage == processingStageShares))
398352 then {
399353 let userWeight = calcUserWeightForClaim(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
400354 let userAmountMatcherForPeriod = fraction(getNumberByKey(keyTotalAmountForPeriod(currentPeriod)), userWeight, totalWeight)
401355 let userAmountEmissionForPeriod = fraction(getNumberByKey(keyAuxEmissionRewardForPeriod(currentPeriod)), userWeight, totalWeight)
402356 let userTotalAmount = (userAmountEmissionForPeriod + userAmountMatcherForPeriod)
403357 let userUnclaimedOption = getInteger(keyUserUnclaimed(currentUser))
404358 let userAddress = getStringValue(boostingContractOrFail(), keyNumToUserMapping(currentUser))
405359 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
406360 let activeReferralInv = if ((referrer == unit))
407361 then unit
408362 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (userWeight >= referralMinGWxAmount)], nil)
409363 if ((activeReferralInv == activeReferralInv))
410364 then {
411365 let referralInv = if (if ((referrer == unit))
412366 then true
413367 else (referralMinGWxAmount > userWeight))
414368 then unit
415369 else {
416370 let referrerReward = fraction(userTotalAmount, referrerRewardPermille, SCALE)
417371 let referralReward = fraction(userTotalAmount, referralRewardPermille, SCALE)
418372 invoke(referralsContractAddressOrFail, "incUnclaimed", [referralProgramName, userAddress, referrerReward, referralReward], nil)
419373 }
420374 if ((referralInv == referralInv))
421375 then {
422376 let unclaimedActions = if (if (migrated)
423377 then true
424378 else (userUnclaimedOption != unit))
425379 then [IntegerEntry(keyUserUnclaimed(currentUser), (valueOrElse(userUnclaimedOption, 0) + userTotalAmount))]
426380 else nil
427381 let processingActions = if (((usersCount - 1) > currentUser))
428382 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
429383 else [IntegerEntry(keyNextProcessedPeriod(), (currentPeriod + 1)), IntegerEntry(keyNextProcessedUser(), 0), DeleteEntry(keyProcessingStage())]
430384 $Tuple2((unclaimedActions ++ processingActions), true)
431385 }
432386 else throw("Strict value is not equal to itself.")
433387 }
434388 else throw("Strict value is not equal to itself.")
435389 }
436390 else throw("invalid processing stage")
437391 }
438392
439393
440394
441395 @Callable(i)
442396 func finalizeWrapper (counter) = {
443397 let result = {
444398 let @ = invoke(this, "finalizeHelper", nil, nil)
445399 if ($isInstanceOf(@, "Boolean"))
446400 then @
447401 else throw(($getType(invoke(this, "finalizeHelper", nil, nil)) + " couldn't be cast to Boolean"))
448402 }
449403 if ((result == result))
450404 then if (!(result))
451405 then if ((counter == maxDepth))
452406 then throw("Nothing to process")
453407 else $Tuple2(nil, unit)
454408 else if ((counter > 0))
455409 then $Tuple2(nil, invoke(this, "finalizeWrapper", [(counter - 1)], nil))
456410 else $Tuple2(nil, unit)
457411 else throw("Strict value is not equal to itself.")
458412 }
459413
460414
461415
462416 @Callable(i)
463417 func processPendingPeriodsAndUsers () = $Tuple2(nil, invoke(this, "finalizeWrapper", [maxDepth], nil))
464418
465419
466420
467421 @Callable(i)
468-func migrateHelper () = {
469- let currentUser = getNumberByKey(keyNextProcessedUserMigration)
470- let usersCount = valueOrElse(getInteger(boostingContractOrFail(), keyUsersCount()), 0)
471- if (migrated)
472- then $Tuple2(nil, false)
473- else {
474- let userAddress = getStringValue(boostingContractOrFail(), keyNumToUserMapping(currentUser))
475- let $t01831618377 = commonClaimReward(userAddress)
476- let userUnclaimed = $t01831618377._1
477- let actions = $t01831618377._2
478- let processingActions = if (((usersCount - 1) > currentUser))
479- then [IntegerEntry(keyNextProcessedUserMigration, (currentUser + 1))]
480- else [DeleteEntry(keyNextProcessedUserMigration), BooleanEntry(keyMigrated, true)]
481- $Tuple2(([IntegerEntry(keyUserUnclaimed(currentUser), userUnclaimed)] ++ processingActions), true)
482- }
483- }
484-
485-
486-
487-@Callable(i)
488-func migrateWrapper (counter) = {
489- let result = {
490- let @ = invoke(this, "migrateHelper", nil, nil)
491- if ($isInstanceOf(@, "Boolean"))
492- then @
493- else throw(($getType(invoke(this, "migrateHelper", nil, nil)) + " couldn't be cast to Boolean"))
494- }
495- if ((result == result))
496- then if (!(result))
497- then if ((counter == maxDepthMigration))
498- then throw("Migration is over")
499- else $Tuple2(nil, unit)
500- else if ((counter > 0))
501- then $Tuple2(nil, invoke(this, "migrateWrapper", [(counter - 1)], nil))
502- else $Tuple2(nil, unit)
503- else throw("Strict value is not equal to itself.")
504- }
505-
506-
507-
508-@Callable(i)
509-func migrate () = $Tuple2(nil, invoke(this, "migrateWrapper", [maxDepthMigration], nil))
510-
511-
512-
513-@Callable(i)
514422 func deposit () = {
515423 let cfgArray = readConfigArrayOrFail()
516424 if ((i.caller != Address(fromBase58String(cfgArray[IdxCfgPacemakerAddress]))))
517425 then throw("Wrong caller address")
518426 else {
519427 let assetId = value(value(i.payments[0]).assetId)
520428 if ((assetId != fromBase58String(cfgArray[IdxCfgAssetId])))
521429 then throw("Wrong payment asset")
522430 else {
523431 let period = nextPeriod()
524432 let deltaH = (height - getNumberOrFail(keyGwxRewardEmissionStartHeight()))
525433 let emissionRate = valueOrErrorMessage(getInteger(emissionContract, keyRatePerBlockCurrent()), (("mandatory emission_contract." + keyRatePerBlockCurrent()) + " is not defined"))
526434 let weight = valueOrErrorMessage(getInteger(factoryContract, keyPoolWeightVirtual()), (("mandatory factory_contract." + keyPoolWeightVirtual()) + " is not defined"))
527435 let auxAmount = fraction((deltaH * weight), emissionRate, MULT8)
528436 let em = invoke(emissionContract, "emit", [auxAmount], nil)
529437 if ((em == em))
530438 then {
531439 let matcherPart = value(i.payments[0]).amount
532440 let payoutInfo = PeriodPayoutInfo(period, matcherPart, auxAmount)
533441 [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)]
534442 }
535443 else throw("Strict value is not equal to itself.")
536444 }
537445 }
538446 }
539447
540448
541449
542450 @Callable(i)
543-func claimNextBatch (boostingContract,currentPeriod,currentUser,depth,totalFromMatcher,totalFromEmission) = if ((i.caller != this))
544- then throw("Should be called by this script only")
545- else {
546- let periodAndTotals = claimInternal(boostingContract, currentPeriod, currentUser, depth, totalFromMatcher, totalFromEmission)
547- $Tuple2(nil, periodAndTotals)
548- }
549-
550-
551-
552-@Callable(i)
553451 func claimReward () = {
554452 let cfgArray = readConfigArrayOrFail()
555453 let address = toString(i.caller)
556- let $t02203522085 = commonClaimReward(address)
557- let amount = $t02203522085._1
558- let actions = $t02203522085._2
454+ let $t01791717967 = commonClaimReward(address)
455+ let amount = $t01791717967._1
456+ let actions = $t01791717967._2
559457 let checkAmount = if ((amount > 0))
560458 then true
561459 else throw("Nothing to claim")
562460 if ((checkAmount == checkAmount))
563461 then {
564462 let amountFromEmission = 0
565463 let claimedReferral = {
566464 let @ = invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)
567465 if ($isInstanceOf(@, "Int"))
568466 then @
569467 else throw(($getType(invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)) + " couldn't be cast to Int"))
570468 }
571469 let totalAmount = (amount + claimedReferral)
572470 $Tuple2(([ScriptTransfer(i.caller, totalAmount, fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, amount, i)] ++ actions), [totalAmount, amountFromEmission])
573471 }
574472 else throw("Strict value is not equal to itself.")
575473 }
576474
577475
578476
579477 @Callable(i)
580478 func claimRewardREADONLY (address) = {
581- let $t02265822708 = commonClaimReward(address)
582- let amount = $t02265822708._1
583- let actions = $t02265822708._2
479+ let $t01854018590 = commonClaimReward(address)
480+ let amount = $t01854018590._1
481+ let actions = $t01854018590._2
584482 let referralUnclaimed = valueOrElse(getInteger(referralsContractAddressOrFail, keyUnclaimedReferral(referralProgramName, address)), 0)
585483 let totalAmount = (amount + referralUnclaimed)
586484 $Tuple2(nil, totalAmount)
587485 }
588486
589487
590488
591489 @Callable(i)
592490 func latestFinalizedPeriodREADONLY (address) = $Tuple2(nil, valueOrElse(getInteger(this, keyLatestPeriod()), -1))
593491
594492
595493
596494 @Callable(i)
597495 func latestFinalizedPeriodInfoREADONLY (address) = $Tuple2(nil, getStringByKey(keyLastPayoutInfo()))
598496
599497
600498
601499 @Callable(i)
602500 func calcGwxParamsREADONLY (gwxAmountStart,lockStartHeight,lockDurationBlocks) = {
603501 let lockEndHeight = (lockStartHeight + lockDurationBlocks)
604502 let scale8ParamK = -(fraction(gwxAmountStart, SCALE, lockDurationBlocks))
605503 let scale8ParamB = (fraction(gwxAmountStart, SCALE, lockDurationBlocks) * lockEndHeight)
606504 $Tuple2(nil, [scale8ParamK, scale8ParamB, nextPeriod()])
607505 }
608506
609507
610508
611509 @Callable(i)
612510 func calcGwxAmountStartREADONLY (wxLockAmount,lockDuration,maxLockDuration) = {
613511 let coeffX8 = fraction(lockDuration, MULT8, maxLockDuration)
614512 let gWxAmountStart = fraction(wxLockAmount, coeffX8, MULT8)
615513 $Tuple2(nil, [gWxAmountStart])
616514 }
617515
618516
619517
620518 @Callable(i)
621-func constructor (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr,maxDepth) = if ((this != i.caller))
622- then throw("not authorized")
623- else [StringEntry(keyConfig(), formatConfig(wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr, maxDepth))]
624-
625-
626-
627-@Callable(i)
628-func constructorV2 (factoryAddress) = if ((this != i.caller))
629- then throw("not authorized")
630- else [StringEntry(keyFactoryAddress(), factoryAddress)]
631-
632-
633-
634-@Callable(i)
635-func constructorV3 (emissionAddress) = if ((this != i.caller))
636- then throw("not authorized")
637- else {
638- let initLatestPeriod = if (isDefined(getInteger(this, keyLatestPeriod())))
639- then nil
640- else [IntegerEntry(keyLatestPeriod(), -1)]
641- (initLatestPeriod :+ StringEntry(keyEmissionAddress(), emissionAddress))
642- }
643-
644-
645-
646-@Callable(i)
647519 func onEmissionForGwxStart () = if ((i.caller != factoryContract))
648520 then throw("permissions denied")
649521 else [IntegerEntry(keyGwxRewardEmissionStartHeight(), height)]
650522
651523
652524
653525 @Callable(i)
654526 func latestPeriodEmissionRewardsREADONLY (address) = {
655527 let period = nextPeriod()
656528 $Tuple2(nil, [getNumberByKey(keyAuxEmissionRewardForPeriod(period))])
657529 }
658530
659531
660532
661533 @Callable(i)
662534 func calcD (x1BigIntStr,x2BigIntStr,ampBigIntStr,aPrecisionBigIntStr,targetPrecisionBigIntStr) = {
663535 let nCoins = toBigInt(2)
664536 let aPrecision = parseBigIntValue(aPrecisionBigIntStr)
665537 let targetPrecision = parseBigIntValue(targetPrecisionBigIntStr)
666538 let x1 = parseBigIntValue(x1BigIntStr)
667539 let x2 = parseBigIntValue(x2BigIntStr)
668540 let amp = (parseBigIntValue(ampBigIntStr) * aPrecision)
669541 let s = (x1 + x2)
670542 if ((s == zeroBigInt))
671543 then $Tuple2(nil, toString(zeroBigInt))
672544 else {
673545 let ann = (amp * nCoins)
674546 let arr = [1, 2, 3, 4, 5, 6, 7]
675547 func calc (acc,cur) = {
676- let $t02626726456 = acc
677- let d = $t02626726456._1
678- let dPrev = $t02626726456._2
548+ let $t02121321402 = acc
549+ let d = $t02121321402._1
550+ let dPrev = $t02121321402._2
679551 let dp = (((d * d) * d) / (((x1 * x2) * nCoins) * nCoins))
680552 let dNext = (((((ann * s) / aPrecision) + (dp * nCoins)) * d) / ((((ann - aPrecision) * d) / aPrecision) + ((nCoins + toBigInt(1)) * dp)))
681553 $Tuple2(dNext, d)
682554 }
683555
684- let $t02666926719 = {
556+ let $t02161521665 = {
685557 let $l = arr
686558 let $s = size($l)
687559 let $acc0 = $Tuple2(s, unit)
688560 func $f0_1 ($a,$i) = if (($i >= $s))
689561 then $a
690562 else calc($a, $l[$i])
691563
692564 func $f0_2 ($a,$i) = if (($i >= $s))
693565 then $a
694566 else throw("List size exceeds 7")
695567
696568 $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)
697569 }
698- let dNext = $t02666926719._1
699- let dPrev = $t02666926719._2
570+ let dNext = $t02161521665._1
571+ let dPrev = $t02161521665._2
700572 let dDiff = abs((dNext - value(dPrev)))
701573 if ((targetPrecision >= dDiff))
702574 then $Tuple2(nil, toString(dNext))
703575 else throw(("D calculation error, dDiff = " + toString(dDiff)))
704576 }
705577 }
706578
707579
708580
709581 @Callable(i)
710582 func setManager (pendingManagerPublicKey) = {
711583 let checkCaller = mustManager(i)
712584 if ((checkCaller == checkCaller))
713585 then {
714586 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
715587 if ((checkManagerPublicKey == checkManagerPublicKey))
716588 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
717589 else throw("Strict value is not equal to itself.")
718590 }
719591 else throw("Strict value is not equal to itself.")
720592 }
721593
722594
723595
724596 @Callable(i)
725597 func confirmManager () = {
726598 let pm = pendingManagerPublicKeyOrUnit()
727599 let hasPM = if (isDefined(pm))
728600 then true
729601 else throw("No pending manager")
730602 if ((hasPM == hasPM))
731603 then {
732604 let checkPM = if ((i.callerPublicKey == value(pm)))
733605 then true
734606 else throw("You are not pending manager")
735607 if ((checkPM == checkPM))
736608 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
737609 else throw("Strict value is not equal to itself.")
738610 }
739611 else throw("Strict value is not equal to itself.")
740612 }
741613
742614
743615 @Verifier(tx)
744616 func verify () = {
745617 let targetPublicKey = match managerPublicKeyOrUnit() {
746618 case pk: ByteVector =>
747619 pk
748620 case _: Unit =>
749621 tx.senderPublicKey
750622 case _ =>
751623 throw("Match error")
752624 }
753625 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
754626 }
755627

github/deemru/w8io/c3f4982 
79.25 ms