tx · CRYTDdRbivdC4hk6YLCh5FocfLRJjrKbSqVasZwm73sB

3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE:  -0.02200000 Waves

2022.08.10 12:25 [2178159] smart account 3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE > SELF 0.00000000 Waves

{ "type": 13, "id": "CRYTDdRbivdC4hk6YLCh5FocfLRJjrKbSqVasZwm73sB", "fee": 2200000, "feeAssetId": null, "timestamp": 1660123562618, "version": 2, "chainId": 84, "sender": "3Mp5kisFrqESzrXxAMEPk2k69zpeF41czEE", "senderPublicKey": "G349Uq3FTox7dRNLeAfAQeoACvwZ9iEnVSaHcEYn6j8J", "proofs": [ "524iMLqBB4qmVBE8dy6PJRSyNc6Ysi2UhvxUgicQQRkcR9fGarzFndaUi1RjzmMVKQSRrk9JH3mm85B5wTDgB5uv" ], "script": "base64:BgJ2CAISBAoCCAESABIDCgEBEgASABIICgYCAQEBAQESABIDCgEIEgQKAggBEgMKAQgSBAoCCAESAwoBCBIDCgEIEgUKAwEBARIFCgMBAQESBgoECAgIARIDCgEIEgMKAQgSABIDCgEIEgcKBQgICAgIEgMKAQgSAFAAA1NFUAICX18ACVVTRVJERVBUSAAaAAVTQ0FMRQDoBwAFTVVMVDgAgMLXLwAKemVyb0JpZ0ludAkAtgIBAAAAFHByb2Nlc3NpbmdTdGFnZVRvdGFsAAAAFXByb2Nlc3NpbmdTdGFnZVNoYXJlcwABAQ5nZXROdW1iZXJCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAAAQ9nZXROdW1iZXJPckZhaWwBA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFBHRoaXMFA2tleQkArAICCQCsAgICD21hbmRhdG9yeSB0aGlzLgUDa2V5Ag8gaXMgbm90IGRlZmluZWQBDmdldFN0cmluZ0J5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUDa2V5AgABD2dldFN0cmluZ09yRmFpbAEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUDa2V5CQCsAgIJAKwCAgIPbWFuZGF0b3J5IHRoaXMuBQNrZXkCDyBpcyBub3QgZGVmaW5lZAEDYWJzAQN2YWwDCQC/AgIFCnplcm9CaWdJbnQFA3ZhbAkAvgIBBQN2YWwFA3ZhbAALa2V5TWF4RGVwdGgCDCVzX19tYXhEZXB0aAAPbWF4RGVwdGhEZWZhdWx0AB4ACG1heERlcHRoCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFC2tleU1heERlcHRoBQ9tYXhEZXB0aERlZmF1bHQBEWtleUZhY3RvcnlBZGRyZXNzAAIcJXMlc19fY29uZmlnX19mYWN0b3J5QWRkcmVzcwARZmFjdG9yeUFkZHJlc3NTdHIJAQ9nZXRTdHJpbmdPckZhaWwBCQERa2V5RmFjdG9yeUFkZHJlc3MAAA9mYWN0b3J5Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEFEWZhY3RvcnlBZGRyZXNzU3RyARJrZXlFbWlzc2lvbkFkZHJlc3MAAh0lcyVzX19jb25maWdfX2VtaXNzaW9uQWRkcmVzcwETa2V5TnVtVG9Vc2VyTWFwcGluZwEDbnVtCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICB21hcHBpbmcJAMwIAgIIbnVtMnVzZXIJAMwIAgkApAMBBQNudW0FA25pbAUDU0VQABZrZXlSZWZlcnJhbFByb2dyYW1OYW1lCQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAgtwcm9ncmFtTmFtZQUDbmlsBQNTRVAAGnJlZmVycmFsUHJvZ3JhbU5hbWVEZWZhdWx0AgZ3eGxvY2sAE3JlZmVycmFsUHJvZ3JhbU5hbWUJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUWa2V5UmVmZXJyYWxQcm9ncmFtTmFtZQUacmVmZXJyYWxQcm9ncmFtTmFtZURlZmF1bHQAF2tleVJlZmVycmFsTWluR1d4QW1vdW50CQC5CQIJAMwIAgIEJXMlcwkAzAgCAghyZWZlcnJhbAkAzAgCAgxtaW5HV3hBbW91bnQFA25pbAUDU0VQABtyZWZlcnJhbE1pbkdXeEFtb3VudERlZmF1bHQJAGgCAPQDBQVNVUxUOAAUcmVmZXJyYWxNaW5HV3hBbW91bnQJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUXa2V5UmVmZXJyYWxNaW5HV3hBbW91bnQFG3JlZmVycmFsTWluR1d4QW1vdW50RGVmYXVsdAAZa2V5UmVmZXJyZXJSZXdhcmRQZXJtaWxsZQkAuQkCCQDMCAICBCVzJXMJAMwIAgIIcmVmZXJyYWwJAMwIAgIWcmVmZXJyZXJSZXdhcmRQZXJtaWxsZQUDbmlsBQNTRVAAHXJlZmVycmVyUmV3YXJkUGVybWlsbGVEZWZhdWx0ADIAFnJlZmVycmVyUmV3YXJkUGVybWlsbGUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUZa2V5UmVmZXJyZXJSZXdhcmRQZXJtaWxsZQUdcmVmZXJyZXJSZXdhcmRQZXJtaWxsZURlZmF1bHQAGWtleVJlZmVycmFsUmV3YXJkUGVybWlsbGUJALkJAgkAzAgCAgQlcyVzCQDMCAICCHJlZmVycmFsCQDMCAICFnJlZmVycmFsUmV3YXJkUGVybWlsbGUFA25pbAUDU0VQAB1yZWZlcnJhbFJld2FyZFBlcm1pbGxlRGVmYXVsdAAyABZyZWZlcnJhbFJld2FyZFBlcm1pbGxlCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFGWtleVJlZmVycmFsUmV3YXJkUGVybWlsbGUFHXJlZmVycmFsUmV3YXJkUGVybWlsbGVEZWZhdWx0AQtrZXlSZWZlcnJlcgEPcmVmZXJyYWxBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCHJlZmVycmVyCQDMCAIFE3JlZmVycmFsUHJvZ3JhbU5hbWUJAMwIAgUPcmVmZXJyYWxBZGRyZXNzBQNuaWwFA1NFUAEUa2V5VW5jbGFpbWVkUmVmZXJyYWwCC3Byb2dyYW1OYW1lDmNsYWltZXJBZGRyZXNzCQC5CQIJAMwIAgIIJXMlcyVzJXMJAMwIAgIRdW5jbGFpbWVkUmVmZXJyYWwJAMwIAgULcHJvZ3JhbU5hbWUJAMwIAgUOY2xhaW1lckFkZHJlc3MFA25pbAUDU0VQABJlbWlzc2lvbkFkZHJlc3NTdHIJAQ9nZXRTdHJpbmdPckZhaWwBCQESa2V5RW1pc3Npb25BZGRyZXNzAAAQZW1pc3Npb25Db250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQUSZW1pc3Npb25BZGRyZXNzU3RyAA1JZHhDZmdBc3NldElkAAEAFklkeENmZ1BhY2VtYWtlckFkZHJlc3MAAgAWSWR4Q2ZnQm9vc3RpbmdDb250cmFjdAADAA5JZHhDZmdNYXhEZXB0aAAEAQlrZXlDb25maWcAAgolc19fY29uZmlnARVyZWFkQ29uZmlnQXJyYXlPckZhaWwACQC1CQIJAQ9nZXRTdHJpbmdPckZhaWwBCQEJa2V5Q29uZmlnAAUDU0VQAQxmb3JtYXRDb25maWcEDHd4QXNzZXRJZFN0chptYXRjaGVyUGFjZW1ha2VyQWRkcmVzc1N0chpib29zdGluZ0NvbnRyYWN0QWRkcmVzc1N0cghtYXhEZXB0aAkAuQkCCQDMCAICCCVzJXMlcyVkCQDMCAIFDHd4QXNzZXRJZFN0cgkAzAgCBRptYXRjaGVyUGFjZW1ha2VyQWRkcmVzc1N0cgkAzAgCBRpib29zdGluZ0NvbnRyYWN0QWRkcmVzc1N0cgkAzAgCCQCkAwEFCG1heERlcHRoBQNuaWwFA1NFUAEWYm9vc3RpbmdDb250cmFjdE9yRmFpbAAECGNmZ0FycmF5CQEVcmVhZENvbmZpZ0FycmF5T3JGYWlsAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJAJEDAgUIY2ZnQXJyYXkFFklkeENmZ0Jvb3N0aW5nQ29udHJhY3QCKGJvb3N0aW5nIGNvbnRyYWN0IGFkZHJlc3MgaXMgbm90IGRlZmluZWQBH2tleUd3eFJld2FyZEVtaXNzaW9uU3RhcnRIZWlnaHQAAiglcyVzX19nd3hSZXdhcmRFbWlzc2lvblBhcnRfX3N0YXJ0SGVpZ2h0AQ1rZXlVc2Vyc0NvdW50AAIPJXNfX25leHRVc2VyTnVtARZrZXlSYXRlUGVyQmxvY2tDdXJyZW50AAIbJXMlc19fcmF0ZVBlckJsb2NrX19jdXJyZW50ARRrZXlQb29sV2VpZ2h0VmlydHVhbAACICVzJXNfX3Bvb2xXZWlnaHRfX0dXWHZpcnR1YWxQT09MARRrZXlOZXh0UHJvY2Vzc2VkVXNlcgACFSVzX19uZXh0UHJvY2Vzc2VkVXNlcgEPa2V5TGF0ZXN0UGVyaW9kAAIQJXNfX2xhdGVzdFBlcmlvZAENa2V5TmV4dFBlcmlvZAACDiVzX19uZXh0UGVyaW9kARJrZXlQcm9jZXNzaW5nU3RhZ2UAAhMlc19fcHJvY2Vzc2luZ1N0YWdlARZrZXlOZXh0UHJvY2Vzc2VkUGVyaW9kAAIXJXNfX25leHRQcm9jZXNzZWRQZXJpb2QBG2tleU5leHRVbmxhaW1lZFBlcmlvZE9mVXNlcgEJdXNlckluZGV4CQC5CQIJAMwIAgIXJXMlZF9fbmV4dENsYWltZWRQZXJpb2QJAMwIAgkApAMBBQl1c2VySW5kZXgFA25pbAUDU0VQARxrZXlMYXN0UHJvY2Vzc2VkUGVyaW9kT2ZVc2VyAQl1c2VySW5kZXgJALkJAgkAzAgCAhklcyVkX19sYXN0UHJvY2Vzc2VkUGVyaW9kCQDMCAIJAKQDAQUJdXNlckluZGV4BQNuaWwFA1NFUAESa2V5SGVpZ2h0Rm9yUGVyaW9kAQZwZXJpb2QJALkJAgkAzAgCAholcyVkX19zdGFydEhlaWdodEZvclBlcmlvZAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABHWtleUF1eEVtaXNzaW9uUmV3YXJkRm9yUGVyaW9kAQZwZXJpb2QJALkJAgkAzAgCAhclcyVkX19hdXhFbWlzc2lvblJld2FyZAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABF2tleVRvdGFsQW1vdW50Rm9yUGVyaW9kAQZwZXJpb2QJALkJAgkAzAgCAholcyVkX190b3RhbEFtb3VudEZvclBlcmlvZAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABEWtleUxhc3RQYXlvdXRJbmZvAAISJXNfX2xhc3RQYXlvdXRJbmZvARBQZXJpb2RQYXlvdXRJbmZvAwZwZXJpb2QNbWF0Y2hlclJld2FyZA5lbWlzc2lvblJld2FyZAkAuQkCCQDMCAICBiVkJWQlZAkAzAgCCQCkAwEFBnBlcmlvZAkAzAgCCQCkAwEFDW1hdGNoZXJSZXdhcmQJAMwIAgkApAMBBQ5lbWlzc2lvblJld2FyZAUDbmlsBQNTRVABFGtleVBheW91dEhpc3RvcnlJbmZvAQZwZXJpb2QJALkJAgkAzAgCAhglcyVzJWRfX3BheW91dHNfX2hpc3RvcnkJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARdrZXlUb3RhbFdlaWdodEZvclBlcmlvZAEGcGVyaW9kCQC5CQIJAMwIAgIaJXMlZF9fdG90YWxXZWlnaHRGb3JQZXJpb2QJAMwIAgkApAMBBQZwZXJpb2QFA25pbAUDU0VQARZrZXlVc2VyS1ZhbHVlRm9yUGVyaW9kAgZwZXJpb2QJdXNlckluZGV4CQC5CQIJAMwIAgIXJXMlZCVzJWRfX3BhcmFtQnlQZXJpb2QJAMwIAgkApAMBBQl1c2VySW5kZXgJAMwIAgIBawkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABFmtleVVzZXJCVmFsdWVGb3JQZXJpb2QCBnBlcmlvZAl1c2VySW5kZXgJALkJAgkAzAgCAhclcyVkJXMlZF9fcGFyYW1CeVBlcmlvZAkAzAgCCQCkAwEFCXVzZXJJbmRleAkAzAgCAgFiCQDMCAIJAKQDAQUGcGVyaW9kBQNuaWwFA1NFUAEWa2V5VXNlcldlaWdodEZvclBlcmlvZAIGcGVyaW9kCXVzZXJJbmRleAkAuQkCCQDMCAICFyVzJWQlcyVkX19wYXJhbUJ5UGVyaW9kCQDMCAIJAKQDAQUJdXNlckluZGV4CQDMCAICBndlaWdodAkAzAgCCQCkAwEFBnBlcmlvZAUDbmlsBQNTRVABG2tleVJlZmVycmFsc0NvbnRyYWN0QWRkcmVzcwAJALkJAgkAzAgCAgQlcyVzCQDMCAICBmNvbmZpZwkAzAgCAhhyZWZlcnJhbHNDb250cmFjdEFkZHJlc3MFA25pbAUDU0VQAB5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQ9nZXRTdHJpbmdPckZhaWwBCQEba2V5UmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzAAEMSGlzdG9yeUVudHJ5BwR0eXBlBHVzZXIRYW1vdW50RnJvbU1hdGNoZXISYW1vdW50RnJvbUVtaXNzaW9uDWN1cnJlbnRQZXJpb2QMbGF0ZXN0UGVyaW9kAWkECmhpc3RvcnlLRVkJALkJAgkAzAgCAhElcyVzJXMlc19faGlzdG9yeQkAzAgCBQR0eXBlCQDMCAIFBHVzZXIJAMwIAgkA2AQBCAUBaQ10cmFuc2FjdGlvbklkBQNuaWwFA1NFUAQLaGlzdG9yeURBVEEJALkJAgkAzAgCAgwlZCVkJWQlZCVkJWQJAMwIAgkApAMBCAUJbGFzdEJsb2NrBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAKQDAQURYW1vdW50RnJvbU1hdGNoZXIJAMwIAgkApAMBBRJhbW91bnRGcm9tRW1pc3Npb24JAMwIAgkApAMBBQ1jdXJyZW50UGVyaW9kCQDMCAIJAKQDAQUMbGF0ZXN0UGVyaW9kBQNuaWwFA1NFUAkBC1N0cmluZ0VudHJ5AgUKaGlzdG9yeUtFWQULaGlzdG9yeURBVEEBE2tleU1hbmFnZXJQdWJsaWNLZXkAAhQlc19fbWFuYWdlclB1YmxpY0tleQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkAAhslc19fcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQABAckbWF0Y2gwCQCiCAEJARNrZXlNYW5hZ2VyUHVibGljS2V5AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJANkEAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0AAQHJG1hdGNoMAkAoggBCQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkA2QQBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgELbXVzdE1hbmFnZXIBAWkEAnBkCQACAQIRUGVybWlzc2lvbiBkZW5pZWQEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFAnBrBgUCcGQDCQABAgUHJG1hdGNoMAIEVW5pdAMJAAACCAUBaQZjYWxsZXIFBHRoaXMGBQJwZAkAAgECC01hdGNoIGVycm9yAQ5jYWxjVXNlcldlaWdodAQXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MPaGVpZ2h0Rm9yUGVyaW9kBnBlcmlvZAl1c2VySW5kZXgEBWtMYXN0CQEca2V5TGFzdFByb2Nlc3NlZFBlcmlvZE9mVXNlcgEFCXVzZXJJbmRleAQEa0tleQkBFmtleVVzZXJLVmFsdWVGb3JQZXJpb2QCBQZwZXJpb2QFCXVzZXJJbmRleAQEa1JhdwkAmggCBRdib29zdGluZ0NvbnRyYWN0QWRkcmVzcwUEa0tleQQLa1VzZXJXZWlnaHQJARZrZXlVc2VyV2VpZ2h0Rm9yUGVyaW9kAgUGcGVyaW9kBQl1c2VySW5kZXgDCQEJaXNEZWZpbmVkAQUEa1JhdwQBawkBBXZhbHVlAQUEa1JhdwQBYgkBBXZhbHVlAQkAmggCBRdib29zdGluZ0NvbnRyYWN0QWRkcmVzcwkBFmtleVVzZXJCVmFsdWVGb3JQZXJpb2QCBQZwZXJpb2QFCXVzZXJJbmRleAQBdwkAZAIJAGgCBQFrBQ9oZWlnaHRGb3JQZXJpb2QFAWIDCQBmAgUBdwAACQCUCgIJAGkCBQF3BQVTQ0FMRQkAzAgCCQEMSW50ZWdlckVudHJ5AgUFa0xhc3QFBnBlcmlvZAkAzAgCCQEMSW50ZWdlckVudHJ5AgULa1VzZXJXZWlnaHQFAXcFA25pbAkAlAoCAAAFA25pbAQBcAkAmggCBQR0aGlzBQVrTGFzdAMDCQEJaXNEZWZpbmVkAQUBcAkAZwIFBnBlcmlvZAkBBXZhbHVlAQUBcAcEAnB2CQEFdmFsdWUBBQFwBAFrCQEFdmFsdWUBCQCaCAIFF2Jvb3N0aW5nQ29udHJhY3RBZGRyZXNzCQEWa2V5VXNlcktWYWx1ZUZvclBlcmlvZAIFAnB2BQl1c2VySW5kZXgEAWIJAQV2YWx1ZQEJAJoIAgUXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MJARZrZXlVc2VyQlZhbHVlRm9yUGVyaW9kAgUCcHYFCXVzZXJJbmRleAQBdwkAZAIJAGgCBQFrBQ9oZWlnaHRGb3JQZXJpb2QFAWIDCQBmAgUBdwAACQCUCgIJAGkCBQF3BQVTQ0FMRQkAzAgCCQEMSW50ZWdlckVudHJ5AgULa1VzZXJXZWlnaHQFAXcFA25pbAkAlAoCAAAFA25pbAkAlAoCAAAFA25pbAEWY2FsY1VzZXJXZWlnaHRGb3JDbGFpbQQXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MPaGVpZ2h0Rm9yUGVyaW9kBnBlcmlvZAl1c2VySW5kZXgEC2tVc2VyV2VpZ2h0CQEWa2V5VXNlcldlaWdodEZvclBlcmlvZAIFBnBlcmlvZAUJdXNlckluZGV4BBB1c2VyV2VpZ2h0T3JVbml0CQCfCAEFC2tVc2VyV2VpZ2h0BAckbWF0Y2gwBRB1c2VyV2VpZ2h0T3JVbml0AwkAAQIFByRtYXRjaDACBFVuaXQAAAMJAAECBQckbWF0Y2gwAgNJbnQEAXcFByRtYXRjaDAJAGkCBQF3BQVTQ0FMRQkAAgECC01hdGNoIGVycm9yARVnZXRVc2VySW5kZXhCeUFkZHJlc3MCGmJvb3N0aW5nQ29udHJhY3RBZGRyZXNzU3RyC3VzZXJBZGRyZXNzBANrZXkJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIHbWFwcGluZwkAzAgCAgh1c2VyMm51bQkAzAgCBQt1c2VyQWRkcmVzcwUDbmlsBQNTRVAJAQ1wYXJzZUludFZhbHVlAQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIJAQdBZGRyZXNzAQkA2QQBBRpib29zdGluZ0NvbnRyYWN0QWRkcmVzc1N0cgUDa2V5CQCsAgIJAKwCAgkArAICAg1Vc2VyIGFkZHJlc3MgBQt1c2VyQWRkcmVzcwItIGlzIG5vdCBmb3VuZCBpbiBib29zdGluZyBjb250cmFjdCBkYXRhLCBrZXk9BQNrZXkBCm5leHRQZXJpb2QACQEOZ2V0TnVtYmVyQnlLZXkBCQENa2V5TmV4dFBlcmlvZAABC2ludm9rZUNsYWltBhBib29zdGluZ0NvbnRyYWN0BnBlcmlvZAR1c2VyBWRlcHRoEHRvdGFsRnJvbU1hdGNoZXIRdG90YWxGcm9tRW1pc3Npb24EBnJlc3VsdAkA/AcEBQR0aGlzAg5jbGFpbU5leHRCYXRjaAkAzAgCBRBib29zdGluZ0NvbnRyYWN0CQDMCAIFBnBlcmlvZAkAzAgCBQR1c2VyCQDMCAIFBWRlcHRoCQDMCAIFEHRvdGFsRnJvbU1hdGNoZXIJAMwIAgURdG90YWxGcm9tRW1pc3Npb24FA25pbAUDbmlsAwkAAAIFBnJlc3VsdAUGcmVzdWx0BAckbWF0Y2gwBQZyZXN1bHQDCQABAgUHJG1hdGNoMAIPKEludCwgSW50LCBJbnQpBAFyBQckbWF0Y2gwBQFyCQACAQIXSW5jb3JyZWN0IGludm9rZSByZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BDWNsYWltSW50ZXJuYWwGEGJvb3N0aW5nQ29udHJhY3QNY3VycmVudFBlcmlvZAtjdXJyZW50VXNlcgVkZXB0aBZ1c2VyQWNjdW11bGF0ZWRNYXRjaGVyF3VzZXJBY2N1bXVsYXRlZEVtaXNzaW9uBBdib29zdGluZ0NvbnRyYWN0QWRkcmVzcwkBB0FkZHJlc3MBBRBib29zdGluZ0NvbnRyYWN0BAxsYXRlc3RQZXJpb2QJAQ5nZXROdW1iZXJCeUtleQEJARZrZXlOZXh0UHJvY2Vzc2VkUGVyaW9kAAQLdG90YWxXZWlnaHQJAQ5nZXROdW1iZXJCeUtleQEJARdrZXlUb3RhbFdlaWdodEZvclBlcmlvZAEFDWN1cnJlbnRQZXJpb2QED2hlaWdodEZvclBlcmlvZAkBDmdldE51bWJlckJ5S2V5AQkBEmtleUhlaWdodEZvclBlcmlvZAEFDWN1cnJlbnRQZXJpb2QECnVzZXJXZWlnaHQJARZjYWxjVXNlcldlaWdodEZvckNsYWltBAUXYm9vc3RpbmdDb250cmFjdEFkZHJlc3MFD2hlaWdodEZvclBlcmlvZAUNY3VycmVudFBlcmlvZAULY3VycmVudFVzZXIEGnVzZXJBbW91bnRNYXRjaGVyRm9yUGVyaW9kCQBrAwkBDmdldE51bWJlckJ5S2V5AQkBF2tleVRvdGFsQW1vdW50Rm9yUGVyaW9kAQUNY3VycmVudFBlcmlvZAUKdXNlcldlaWdodAULdG90YWxXZWlnaHQEG3VzZXJBbW91bnRFbWlzc2lvbkZvclBlcmlvZAkAawMJAQ5nZXROdW1iZXJCeUtleQEJAR1rZXlBdXhFbWlzc2lvblJld2FyZEZvclBlcmlvZAEFDWN1cnJlbnRQZXJpb2QFCnVzZXJXZWlnaHQFC3RvdGFsV2VpZ2h0AwMJAGcCAAAFBWRlcHRoBgkAZwIJAGQCBQ1jdXJyZW50UGVyaW9kAAEFDGxhdGVzdFBlcmlvZAkAlQoDCQBkAgUNY3VycmVudFBlcmlvZAABCQBkAgUWdXNlckFjY3VtdWxhdGVkTWF0Y2hlcgUadXNlckFtb3VudE1hdGNoZXJGb3JQZXJpb2QJAGQCBRd1c2VyQWNjdW11bGF0ZWRFbWlzc2lvbgUbdXNlckFtb3VudEVtaXNzaW9uRm9yUGVyaW9kCQELaW52b2tlQ2xhaW0GBRBib29zdGluZ0NvbnRyYWN0CQBkAgUNY3VycmVudFBlcmlvZAABBQtjdXJyZW50VXNlcgkAZQIFBWRlcHRoAAEJAGQCBRZ1c2VyQWNjdW11bGF0ZWRNYXRjaGVyBRp1c2VyQW1vdW50TWF0Y2hlckZvclBlcmlvZAkAZAIFF3VzZXJBY2N1bXVsYXRlZEVtaXNzaW9uBRt1c2VyQW1vdW50RW1pc3Npb25Gb3JQZXJpb2QBEWNvbW1vbkNsYWltUmV3YXJkAgt1c2VyQWRkcmVzcwtzdGFydFBlcmlvZAQIY2ZnQXJyYXkJARVyZWFkQ29uZmlnQXJyYXlPckZhaWwABAd1c2VySWR4CQEVZ2V0VXNlckluZGV4QnlBZGRyZXNzAgkAkQMCBQhjZmdBcnJheQUWSWR4Q2ZnQm9vc3RpbmdDb250cmFjdAULdXNlckFkZHJlc3MEDWN1cnJlbnRQZXJpb2QDCQECIT0CBQtzdGFydFBlcmlvZAUEdW5pdAkBBXZhbHVlAQULc3RhcnRQZXJpb2QJAQ5nZXROdW1iZXJCeUtleQEJARtrZXlOZXh0VW5sYWltZWRQZXJpb2RPZlVzZXIBBQd1c2VySWR4BBNuZXh0UHJvY2Vzc2VkUGVyaW9kCQEOZ2V0TnVtYmVyQnlLZXkBCQEWa2V5TmV4dFByb2Nlc3NlZFBlcmlvZAADCQBnAgUNY3VycmVudFBlcmlvZAUTbmV4dFByb2Nlc3NlZFBlcmlvZAkAAgECEE5vdGhpbmcgdG8gY2xhaW0EEGJvb3N0aW5nQ29udHJhY3QJANkEAQkAkQMCBQhjZmdBcnJheQUWSWR4Q2ZnQm9vc3RpbmdDb250cmFjdAQNJHQwMTI3MjkxMjg1NQkBDWNsYWltSW50ZXJuYWwGBRBib29zdGluZ0NvbnRyYWN0BQ1jdXJyZW50UGVyaW9kBQd1c2VySWR4BQlVU0VSREVQVEgAAAAABAZwZXJpb2QIBQ0kdDAxMjcyOTEyODU1Al8xBBFhbW91bnRGcm9tTWF0Y2hlcggFDSR0MDEyNzI5MTI4NTUCXzIEEmFtb3VudEZyb21FbWlzc2lvbggFDSR0MDEyNzI5MTI4NTUCXzMJAJgKBgUGcGVyaW9kBRFhbW91bnRGcm9tTWF0Y2hlcgUSYW1vdW50RnJvbUVtaXNzaW9uBQd1c2VySWR4BQhjZmdBcnJheQUTbmV4dFByb2Nlc3NlZFBlcmlvZBcBaQEWdXBkYXRlUmVmZXJyYWxBY3Rpdml0eQILdXNlckFkZHJlc3MOZ1d4QW1vdW50U3RhcnQECHJlZmVycmVyCQCdCAIFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAkBC2tleVJlZmVycmVyAQULdXNlckFkZHJlc3MEEWFjdGl2ZVJlZmVycmFsSW52AwkAAAIFCHJlZmVycmVyBQR1bml0BQR1bml0CQD8BwQFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAIWdXBkYXRlUmVmZXJyYWxBY3Rpdml0eQkAzAgCBRNyZWZlcnJhbFByb2dyYW1OYW1lCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIJAGcCBQ5nV3hBbW91bnRTdGFydAUUcmVmZXJyYWxNaW5HV3hBbW91bnQFA25pbAUDbmlsAwkAAAIFEWFjdGl2ZVJlZmVycmFsSW52BRFhY3RpdmVSZWZlcnJhbEludgkAlAoCBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOZmluYWxpemVIZWxwZXIABA9wcm9jZXNzaW5nU3RhZ2UJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEmtleVByb2Nlc3NpbmdTdGFnZQAFFHByb2Nlc3NpbmdTdGFnZVRvdGFsBA1jdXJyZW50UGVyaW9kCQEOZ2V0TnVtYmVyQnlLZXkBCQEWa2V5TmV4dFByb2Nlc3NlZFBlcmlvZAAEC2N1cnJlbnRVc2VyCQEOZ2V0TnVtYmVyQnlLZXkBCQEUa2V5TmV4dFByb2Nlc3NlZFVzZXIABAxsYXRlc3RQZXJpb2QJAQ5nZXROdW1iZXJCeUtleQEJAQ9rZXlMYXRlc3RQZXJpb2QABAp1c2Vyc0NvdW50CQELdmFsdWVPckVsc2UCCQCaCAIJARZib29zdGluZ0NvbnRyYWN0T3JGYWlsAAkBDWtleVVzZXJzQ291bnQAAAAEDnRvdGFsV2VpZ2h0S2V5CQEXa2V5VG90YWxXZWlnaHRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBAt0b3RhbFdlaWdodAkBDmdldE51bWJlckJ5S2V5AQkBF2tleVRvdGFsV2VpZ2h0Rm9yUGVyaW9kAQUNY3VycmVudFBlcmlvZAQPaGVpZ2h0Rm9yUGVyaW9kCQEOZ2V0TnVtYmVyQnlLZXkBCQESa2V5SGVpZ2h0Rm9yUGVyaW9kAQUNY3VycmVudFBlcmlvZAMJAGYCBQ1jdXJyZW50UGVyaW9kBQxsYXRlc3RQZXJpb2QJAJQKAgUDbmlsBwMJAAACBQ9wcm9jZXNzaW5nU3RhZ2UFFHByb2Nlc3NpbmdTdGFnZVRvdGFsBA0kdDAxNDI1NTE0MzcxCQEOY2FsY1VzZXJXZWlnaHQECQEWYm9vc3RpbmdDb250cmFjdE9yRmFpbAAFD2hlaWdodEZvclBlcmlvZAUNY3VycmVudFBlcmlvZAULY3VycmVudFVzZXIECnVzZXJXZWlnaHQIBQ0kdDAxNDI1NTE0MzcxAl8xBAt1c2VyQWN0aW9ucwgFDSR0MDE0MjU1MTQzNzECXzIEDnRvdGFsV2VpZ2h0TmV3CQBkAgULdG90YWxXZWlnaHQFCnVzZXJXZWlnaHQEEXByb2Nlc3NpbmdBY3Rpb25zAwkAZgIJAGUCBQp1c2Vyc0NvdW50AAEFC2N1cnJlbnRVc2VyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TmV4dFByb2Nlc3NlZFVzZXIACQBkAgULY3VycmVudFVzZXIAAQUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQESa2V5UHJvY2Vzc2luZ1N0YWdlAAUVcHJvY2Vzc2luZ1N0YWdlU2hhcmVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TmV4dFByb2Nlc3NlZFVzZXIAAAAFA25pbAkAlAoCCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUOdG90YWxXZWlnaHRLZXkFDnRvdGFsV2VpZ2h0TmV3BQNuaWwFEXByb2Nlc3NpbmdBY3Rpb25zBQt1c2VyQWN0aW9ucwYDCQAAAgUPcHJvY2Vzc2luZ1N0YWdlBRVwcm9jZXNzaW5nU3RhZ2VTaGFyZXMECnVzZXJXZWlnaHQJARZjYWxjVXNlcldlaWdodEZvckNsYWltBAkBFmJvb3N0aW5nQ29udHJhY3RPckZhaWwABQ9oZWlnaHRGb3JQZXJpb2QFDWN1cnJlbnRQZXJpb2QFC2N1cnJlbnRVc2VyBBp1c2VyQW1vdW50TWF0Y2hlckZvclBlcmlvZAkAawMJAQ5nZXROdW1iZXJCeUtleQEJARdrZXlUb3RhbEFtb3VudEZvclBlcmlvZAEFDWN1cnJlbnRQZXJpb2QFCnVzZXJXZWlnaHQFC3RvdGFsV2VpZ2h0BBt1c2VyQW1vdW50RW1pc3Npb25Gb3JQZXJpb2QJAGsDCQEOZ2V0TnVtYmVyQnlLZXkBCQEda2V5QXV4RW1pc3Npb25SZXdhcmRGb3JQZXJpb2QBBQ1jdXJyZW50UGVyaW9kBQp1c2VyV2VpZ2h0BQt0b3RhbFdlaWdodAQPdXNlclRvdGFsQW1vdW50CQBkAgUbdXNlckFtb3VudEVtaXNzaW9uRm9yUGVyaW9kBRp1c2VyQW1vdW50TWF0Y2hlckZvclBlcmlvZAQLdXNlckFkZHJlc3MJARFAZXh0ck5hdGl2ZSgxMDUzKQIJARZib29zdGluZ0NvbnRyYWN0T3JGYWlsAAkBE2tleU51bVRvVXNlck1hcHBpbmcBBQtjdXJyZW50VXNlcgQIcmVmZXJyZXIJAJ0IAgUecmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzT3JGYWlsCQELa2V5UmVmZXJyZXIBBQt1c2VyQWRkcmVzcwQRYWN0aXZlUmVmZXJyYWxJbnYDCQAAAgUIcmVmZXJyZXIFBHVuaXQFBHVuaXQJAPwHBAUecmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzT3JGYWlsAhZ1cGRhdGVSZWZlcnJhbEFjdGl2aXR5CQDMCAIFE3JlZmVycmFsUHJvZ3JhbU5hbWUJAMwIAgULdXNlckFkZHJlc3MJAMwIAgkAZwIFCnVzZXJXZWlnaHQFFHJlZmVycmFsTWluR1d4QW1vdW50BQNuaWwFA25pbAMJAAACBRFhY3RpdmVSZWZlcnJhbEludgURYWN0aXZlUmVmZXJyYWxJbnYEC3JlZmVycmFsSW52AwMJAAACBQhyZWZlcnJlcgUEdW5pdAYJAGYCBRRyZWZlcnJhbE1pbkdXeEFtb3VudAUKdXNlcldlaWdodAUEdW5pdAQOcmVmZXJyZXJSZXdhcmQJAGsDBQ91c2VyVG90YWxBbW91bnQFFnJlZmVycmVyUmV3YXJkUGVybWlsbGUFBVNDQUxFBA5yZWZlcnJhbFJld2FyZAkAawMFD3VzZXJUb3RhbEFtb3VudAUWcmVmZXJyYWxSZXdhcmRQZXJtaWxsZQUFU0NBTEUJAPwHBAUecmVmZXJyYWxzQ29udHJhY3RBZGRyZXNzT3JGYWlsAgxpbmNVbmNsYWltZWQJAMwIAgUTcmVmZXJyYWxQcm9ncmFtTmFtZQkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCBQ5yZWZlcnJlclJld2FyZAkAzAgCBQ5yZWZlcnJhbFJld2FyZAUDbmlsBQNuaWwDCQAAAgULcmVmZXJyYWxJbnYFC3JlZmVycmFsSW52BBFwcm9jZXNzaW5nQWN0aW9ucwMJAGYCCQBlAgUKdXNlcnNDb3VudAABBQtjdXJyZW50VXNlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleU5leHRQcm9jZXNzZWRVc2VyAAkAZAIFC2N1cnJlbnRVc2VyAAEFA25pbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleU5leHRQcm9jZXNzZWRQZXJpb2QACQBkAgUNY3VycmVudFBlcmlvZAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5TmV4dFByb2Nlc3NlZFVzZXIAAAAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEmtleVByb2Nlc3NpbmdTdGFnZQAFA25pbAkAlAoCBRFwcm9jZXNzaW5nQWN0aW9ucwYJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAhhpbnZhbGlkIHByb2Nlc3Npbmcgc3RhZ2UBaQEPZmluYWxpemVXcmFwcGVyAQdjb3VudGVyBAZyZXN1bHQKAAFACQD8BwQFBHRoaXMCDmZpbmFsaXplSGVscGVyBQNuaWwFA25pbAMJAAECBQFAAgdCb29sZWFuBQFACQACAQkArAICCQADAQkA/AcEBQR0aGlzAg5maW5hbGl6ZUhlbHBlcgUDbmlsBQNuaWwCHCBjb3VsZG4ndCBiZSBjYXN0IHRvIEJvb2xlYW4DCQAAAgUGcmVzdWx0BQZyZXN1bHQDCQEBIQEFBnJlc3VsdAMJAAACBQdjb3VudGVyBQhtYXhEZXB0aAkAAgECEk5vdGhpbmcgdG8gcHJvY2VzcwkAlAoCBQNuaWwFBHVuaXQDCQBmAgUHY291bnRlcgAACQCUCgIFA25pbAkA/AcEBQR0aGlzAg9maW5hbGl6ZVdyYXBwZXIJAMwIAgkAZQIFB2NvdW50ZXIAAQUDbmlsBQNuaWwJAJQKAgUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBHXByb2Nlc3NQZW5kaW5nUGVyaW9kc0FuZFVzZXJzAAkAlAoCBQNuaWwJAPwHBAUEdGhpcwIPZmluYWxpemVXcmFwcGVyCQDMCAIFCG1heERlcHRoBQNuaWwFA25pbAFpAQdkZXBvc2l0AAQIY2ZnQXJyYXkJARVyZWFkQ29uZmlnQXJyYXlPckZhaWwAAwkBAiE9AggFAWkGY2FsbGVyCQEHQWRkcmVzcwEJANkEAQkAkQMCBQhjZmdBcnJheQUWSWR4Q2ZnUGFjZW1ha2VyQWRkcmVzcwkAAgECFFdyb25nIGNhbGxlciBhZGRyZXNzBAdhc3NldElkCQEFdmFsdWUBCAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQDCQECIT0CBQdhc3NldElkCQDZBAEJAJEDAgUIY2ZnQXJyYXkFDUlkeENmZ0Fzc2V0SWQJAAIBAhNXcm9uZyBwYXltZW50IGFzc2V0BAZwZXJpb2QJAQpuZXh0UGVyaW9kAAQGZGVsdGFICQBlAgUGaGVpZ2h0CQEPZ2V0TnVtYmVyT3JGYWlsAQkBH2tleUd3eFJld2FyZEVtaXNzaW9uU3RhcnRIZWlnaHQABAxlbWlzc2lvblJhdGUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBRBlbWlzc2lvbkNvbnRyYWN0CQEWa2V5UmF0ZVBlckJsb2NrQ3VycmVudAAJAKwCAgkArAICAhxtYW5kYXRvcnkgZW1pc3Npb25fY29udHJhY3QuCQEWa2V5UmF0ZVBlckJsb2NrQ3VycmVudAACDyBpcyBub3QgZGVmaW5lZAQGd2VpZ2h0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUPZmFjdG9yeUNvbnRyYWN0CQEUa2V5UG9vbFdlaWdodFZpcnR1YWwACQCsAgIJAKwCAgIbbWFuZGF0b3J5IGZhY3RvcnlfY29udHJhY3QuCQEUa2V5UG9vbFdlaWdodFZpcnR1YWwAAg8gaXMgbm90IGRlZmluZWQECWF1eEFtb3VudAkAawMJAGgCBQZkZWx0YUgFBndlaWdodAUMZW1pc3Npb25SYXRlBQVNVUxUOAQCZW0JAPwHBAUQZW1pc3Npb25Db250cmFjdAIEZW1pdAkAzAgCBQlhdXhBbW91bnQFA25pbAUDbmlsAwkAAAIFAmVtBQJlbQQLbWF0Y2hlclBhcnQICQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50BApwYXlvdXRJbmZvCQEQUGVyaW9kUGF5b3V0SW5mbwMFBnBlcmlvZAULbWF0Y2hlclBhcnQFCWF1eEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBD2tleUxhdGVzdFBlcmlvZAAFBnBlcmlvZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEmtleUhlaWdodEZvclBlcmlvZAEFBnBlcmlvZAUGaGVpZ2h0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEda2V5QXV4RW1pc3Npb25SZXdhcmRGb3JQZXJpb2QBBQZwZXJpb2QFCWF1eEFtb3VudAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBH2tleUd3eFJld2FyZEVtaXNzaW9uU3RhcnRIZWlnaHQABQZoZWlnaHQJAMwIAgkBDEludGVnZXJFbnRyeQIJARdrZXlUb3RhbEFtb3VudEZvclBlcmlvZAEFBnBlcmlvZAULbWF0Y2hlclBhcnQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ1rZXlOZXh0UGVyaW9kAAkAZAIFBnBlcmlvZAABCQDMCAIJAQtTdHJpbmdFbnRyeQIJARFrZXlMYXN0UGF5b3V0SW5mbwAFCnBheW91dEluZm8JAMwIAgkBC1N0cmluZ0VudHJ5AgkBFGtleVBheW91dEhpc3RvcnlJbmZvAQUGcGVyaW9kBQpwYXlvdXRJbmZvBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOY2xhaW1OZXh0QmF0Y2gGEGJvb3N0aW5nQ29udHJhY3QNY3VycmVudFBlcmlvZAtjdXJyZW50VXNlcgVkZXB0aBB0b3RhbEZyb21NYXRjaGVyEXRvdGFsRnJvbUVtaXNzaW9uAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIkU2hvdWxkIGJlIGNhbGxlZCBieSB0aGlzIHNjcmlwdCBvbmx5BA9wZXJpb2RBbmRUb3RhbHMJAQ1jbGFpbUludGVybmFsBgUQYm9vc3RpbmdDb250cmFjdAUNY3VycmVudFBlcmlvZAULY3VycmVudFVzZXIFBWRlcHRoBRB0b3RhbEZyb21NYXRjaGVyBRF0b3RhbEZyb21FbWlzc2lvbgkAlAoCBQNuaWwFD3BlcmlvZEFuZFRvdGFscwFpAQtjbGFpbVJld2FyZAAEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBA0kdDAxOTkwNTIwMDMxCQERY29tbW9uQ2xhaW1SZXdhcmQCBQdhZGRyZXNzBQR1bml0BAZwZXJpb2QIBQ0kdDAxOTkwNTIwMDMxAl8xBBFhbW91bnRGcm9tTWF0Y2hlcggFDSR0MDE5OTA1MjAwMzECXzIEEmFtb3VudEZyb21FbWlzc2lvbggFDSR0MDE5OTA1MjAwMzECXzMEB3VzZXJJZHgIBQ0kdDAxOTkwNTIwMDMxAl80BAhjZmdBcnJheQgFDSR0MDE5OTA1MjAwMzECXzUEE25leHRQcm9jZXNzZWRQZXJpb2QIBQ0kdDAxOTkwNTIwMDMxAl82BA9jbGFpbWVkUmVmZXJyYWwKAAFACQD8BwQFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAIFY2xhaW0JAMwIAgUTcmVmZXJyYWxQcm9ncmFtTmFtZQUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQkA/AcEBR5yZWZlcnJhbHNDb250cmFjdEFkZHJlc3NPckZhaWwCBWNsYWltCQDMCAIFE3JlZmVycmFsUHJvZ3JhbU5hbWUFA25pbAUDbmlsAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBG2tleU5leHRVbmxhaW1lZFBlcmlvZE9mVXNlcgEFB3VzZXJJZHgFBnBlcmlvZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGQCBRFhbW91bnRGcm9tTWF0Y2hlcgUSYW1vdW50RnJvbUVtaXNzaW9uCQDZBAEJAJEDAgUIY2ZnQXJyYXkFDUlkeENmZ0Fzc2V0SWQJAMwIAgkBDEhpc3RvcnlFbnRyeQcCBWNsYWltBQdhZGRyZXNzCQBkAgURYW1vdW50RnJvbU1hdGNoZXIFD2NsYWltZWRSZWZlcnJhbAUSYW1vdW50RnJvbUVtaXNzaW9uBQZwZXJpb2QFE25leHRQcm9jZXNzZWRQZXJpb2QFAWkFA25pbAkAzAgCCQBkAgURYW1vdW50RnJvbU1hdGNoZXIFD2NsYWltZWRSZWZlcnJhbAkAzAgCBRJhbW91bnRGcm9tRW1pc3Npb24FA25pbAFpARNjbGFpbVJld2FyZFJFQURPTkxZAQdhZGRyZXNzBAxjbGFpbVJlc3VsdHMJARFjb21tb25DbGFpbVJld2FyZAIFB2FkZHJlc3MFBHVuaXQEEXJlZmVycmFsVW5jbGFpbWVkCQELdmFsdWVPckVsc2UCCQCaCAIFHnJlZmVycmFsc0NvbnRyYWN0QWRkcmVzc09yRmFpbAkBFGtleVVuY2xhaW1lZFJlZmVycmFsAgUTcmVmZXJyYWxQcm9ncmFtTmFtZQUHYWRkcmVzcwAABAZhbW91bnQJAGQCCQBkAggFDGNsYWltUmVzdWx0cwJfMggFDGNsYWltUmVzdWx0cwJfMwURcmVmZXJyYWxVbmNsYWltZWQJAJQKAgUDbmlsBQZhbW91bnQBaQEcY2xhaW1SZXdhcmRQYWdpbmF0ZWRSRUFET05MWQIHYWRkcmVzcwtzdGFydFBlcmlvZAQNJHQwMjEwODkyMTIwNgkBEWNvbW1vbkNsYWltUmV3YXJkAgUHYWRkcmVzcwMJAGYCAAAFC3N0YXJ0UGVyaW9kBQR1bml0BQtzdGFydFBlcmlvZAQGcGVyaW9kCAUNJHQwMjEwODkyMTIwNgJfMQQLZnJvbU1hdGNoZXIIBQ0kdDAyMTA4OTIxMjA2Al8yBAxmcm9tRW1pc3Npb24IBQ0kdDAyMTA4OTIxMjA2Al8zBAZhbW91bnQJAGQCBQtmcm9tTWF0Y2hlcgUMZnJvbUVtaXNzaW9uCQCUCgIFA25pbAkAlAoCBQZhbW91bnQFBnBlcmlvZAFpARtjbGFpbVJld2FyZERldGFpbGVkUkVBRE9OTFkBB2FkZHJlc3MEDSR0MDIxNDU3MjE1MzIJARFjb21tb25DbGFpbVJld2FyZAIFB2FkZHJlc3MFBHVuaXQEB2lnbm9yZWQIBQ0kdDAyMTQ1NzIxNTMyAl8xBAtmcm9tTWF0Y2hlcggFDSR0MDIxNDU3MjE1MzICXzIEDGZyb21FbWlzc2lvbggFDSR0MDIxNDU3MjE1MzICXzMJAJQKAgUDbmlsCQC5CQIJAMwIAgIGJWQlZCVkCQDMCAIJAKQDAQkAZAIFC2Zyb21NYXRjaGVyBQxmcm9tRW1pc3Npb24JAMwIAgkApAMBBQtmcm9tTWF0Y2hlcgkAzAgCCQCkAwEFDGZyb21FbWlzc2lvbgUDbmlsBQNTRVABaQEkY2xhaW1SZXdhcmREZXRhaWxlZFBhZ2luYXRlZFJFQURPTkxZAgdhZGRyZXNzC3N0YXJ0UGVyaW9kBA0kdDAyMTgyODIxOTQ1CQERY29tbW9uQ2xhaW1SZXdhcmQCBQdhZGRyZXNzAwkAZgIAAAULc3RhcnRQZXJpb2QFBHVuaXQFC3N0YXJ0UGVyaW9kBAZwZXJpb2QIBQ0kdDAyMTgyODIxOTQ1Al8xBAtmcm9tTWF0Y2hlcggFDSR0MDIxODI4MjE5NDUCXzIEDGZyb21FbWlzc2lvbggFDSR0MDIxODI4MjE5NDUCXzMJAJQKAgUDbmlsCQCUCgIJALkJAgkAzAgCAgYlZCVkJWQJAMwIAgkApAMBCQBkAgULZnJvbU1hdGNoZXIFDGZyb21FbWlzc2lvbgkAzAgCCQCkAwEFC2Zyb21NYXRjaGVyCQDMCAIJAKQDAQUMZnJvbUVtaXNzaW9uBQNuaWwFA1NFUAUGcGVyaW9kAWkBHWxhdGVzdEZpbmFsaXplZFBlcmlvZFJFQURPTkxZAQdhZGRyZXNzCQCUCgIFA25pbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEPa2V5TGF0ZXN0UGVyaW9kAAD///////////8BAWkBIWxhdGVzdEZpbmFsaXplZFBlcmlvZEluZm9SRUFET05MWQEHYWRkcmVzcwkAlAoCBQNuaWwJAQ5nZXRTdHJpbmdCeUtleQEJARFrZXlMYXN0UGF5b3V0SW5mbwABaQEVY2FsY0d3eFBhcmFtc1JFQURPTkxZAw5nd3hBbW91bnRTdGFydA9sb2NrU3RhcnRIZWlnaHQSbG9ja0R1cmF0aW9uQmxvY2tzBA1sb2NrRW5kSGVpZ2h0CQBkAgUPbG9ja1N0YXJ0SGVpZ2h0BRJsb2NrRHVyYXRpb25CbG9ja3MEDHNjYWxlOFBhcmFtSwkBAS0BCQBrAwUOZ3d4QW1vdW50U3RhcnQFBVNDQUxFBRJsb2NrRHVyYXRpb25CbG9ja3MEDHNjYWxlOFBhcmFtQgkAaAIJAGsDBQ5nd3hBbW91bnRTdGFydAUFU0NBTEUFEmxvY2tEdXJhdGlvbkJsb2NrcwUNbG9ja0VuZEhlaWdodAkAlAoCBQNuaWwJAMwIAgUMc2NhbGU4UGFyYW1LCQDMCAIFDHNjYWxlOFBhcmFtQgkAzAgCCQEKbmV4dFBlcmlvZAAFA25pbAFpARpjYWxjR3d4QW1vdW50U3RhcnRSRUFET05MWQMMd3hMb2NrQW1vdW50DGxvY2tEdXJhdGlvbg9tYXhMb2NrRHVyYXRpb24EB2NvZWZmWDgJAGsDBQxsb2NrRHVyYXRpb24FBU1VTFQ4BQ9tYXhMb2NrRHVyYXRpb24EDmdXeEFtb3VudFN0YXJ0CQBrAwUMd3hMb2NrQW1vdW50BQdjb2VmZlg4BQVNVUxUOAkAlAoCBQNuaWwJAMwIAgUOZ1d4QW1vdW50U3RhcnQFA25pbAFpAQtjb25zdHJ1Y3RvcgQMd3hBc3NldElkU3RyGm1hdGNoZXJQYWNlbWFrZXJBZGRyZXNzU3RyGmJvb3N0aW5nQ29udHJhY3RBZGRyZXNzU3RyCG1heERlcHRoAwkBAiE9AgUEdGhpcwgFAWkGY2FsbGVyCQACAQIObm90IGF1dGhvcml6ZWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCWtleUNvbmZpZwAJAQxmb3JtYXRDb25maWcEBQx3eEFzc2V0SWRTdHIFGm1hdGNoZXJQYWNlbWFrZXJBZGRyZXNzU3RyBRpib29zdGluZ0NvbnRyYWN0QWRkcmVzc1N0cgUIbWF4RGVwdGgFA25pbAFpAQ1jb25zdHJ1Y3RvclYyAQ5mYWN0b3J5QWRkcmVzcwMJAQIhPQIFBHRoaXMIBQFpBmNhbGxlcgkAAgECDm5vdCBhdXRob3JpemVkCQDMCAIJAQtTdHJpbmdFbnRyeQIJARFrZXlGYWN0b3J5QWRkcmVzcwAFDmZhY3RvcnlBZGRyZXNzBQNuaWwBaQENY29uc3RydWN0b3JWMwEPZW1pc3Npb25BZGRyZXNzAwkBAiE9AgUEdGhpcwgFAWkGY2FsbGVyCQACAQIObm90IGF1dGhvcml6ZWQEEGluaXRMYXRlc3RQZXJpb2QDCQEJaXNEZWZpbmVkAQkAmggCBQR0aGlzCQEPa2V5TGF0ZXN0UGVyaW9kAAUDbmlsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEPa2V5TGF0ZXN0UGVyaW9kAAD///////////8BBQNuaWwJAM0IAgUQaW5pdExhdGVzdFBlcmlvZAkBC1N0cmluZ0VudHJ5AgkBEmtleUVtaXNzaW9uQWRkcmVzcwAFD2VtaXNzaW9uQWRkcmVzcwFpARVvbkVtaXNzaW9uRm9yR3d4U3RhcnQAAwkBAiE9AggFAWkGY2FsbGVyBQ9mYWN0b3J5Q29udHJhY3QJAAIBAhJwZXJtaXNzaW9ucyBkZW5pZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAR9rZXlHd3hSZXdhcmRFbWlzc2lvblN0YXJ0SGVpZ2h0AAUGaGVpZ2h0BQNuaWwBaQEjbGF0ZXN0UGVyaW9kRW1pc3Npb25SZXdhcmRzUkVBRE9OTFkBB2FkZHJlc3MEBnBlcmlvZAkBCm5leHRQZXJpb2QACQCUCgIFA25pbAkAzAgCCQEOZ2V0TnVtYmVyQnlLZXkBCQEda2V5QXV4RW1pc3Npb25SZXdhcmRGb3JQZXJpb2QBBQZwZXJpb2QFA25pbAFpAQVjYWxjRAULeDFCaWdJbnRTdHILeDJCaWdJbnRTdHIMYW1wQmlnSW50U3RyE2FQcmVjaXNpb25CaWdJbnRTdHIYdGFyZ2V0UHJlY2lzaW9uQmlnSW50U3RyBAZuQ29pbnMJALYCAQACBAphUHJlY2lzaW9uCQCnAwEFE2FQcmVjaXNpb25CaWdJbnRTdHIED3RhcmdldFByZWNpc2lvbgkApwMBBRh0YXJnZXRQcmVjaXNpb25CaWdJbnRTdHIEAngxCQCnAwEFC3gxQmlnSW50U3RyBAJ4MgkApwMBBQt4MkJpZ0ludFN0cgQDYW1wCQC5AgIJAKcDAQUMYW1wQmlnSW50U3RyBQphUHJlY2lzaW9uBAFzCQC3AgIFAngxBQJ4MgMJAAACBQFzBQp6ZXJvQmlnSW50CQCUCgIFA25pbAkApgMBBQp6ZXJvQmlnSW50BANhbm4JALkCAgUDYW1wBQZuQ29pbnMEA2FycgkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcFA25pbAoBBGNhbGMCA2FjYwNjdXIEDSR0MDI1NDM0MjU2MjMFA2FjYwQBZAgFDSR0MDI1NDM0MjU2MjMCXzEEBWRQcmV2CAUNJHQwMjU0MzQyNTYyMwJfMgQCZHAJALoCAgkAuQICCQC5AgIFAWQFAWQFAWQJALkCAgkAuQICCQC5AgIFAngxBQJ4MgUGbkNvaW5zBQZuQ29pbnMEBWROZXh0CQC6AgIJALkCAgkAtwICCQC6AgIJALkCAgUDYW5uBQFzBQphUHJlY2lzaW9uCQC5AgIFAmRwBQZuQ29pbnMFAWQJALcCAgkAugICCQC5AgIJALgCAgUDYW5uBQphUHJlY2lzaW9uBQFkBQphUHJlY2lzaW9uCQC5AgIJALcCAgUGbkNvaW5zCQC2AgEAAQUCZHAJAJQKAgUFZE5leHQFAWQEDSR0MDI1ODM2MjU4ODYKAAIkbAUDYXJyCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCBQFzBQR1bml0CgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQRjYWxjAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA3CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcEBWROZXh0CAUNJHQwMjU4MzYyNTg4NgJfMQQFZFByZXYIBQ0kdDAyNTgzNjI1ODg2Al8yBAVkRGlmZgkBA2FicwEJALgCAgUFZE5leHQJAQV2YWx1ZQEFBWRQcmV2AwkAwAICBQ90YXJnZXRQcmVjaXNpb24FBWREaWZmCQCUCgIFA25pbAkApgMBBQVkTmV4dAkAAgEJAKwCAgIdRCBjYWxjdWxhdGlvbiBlcnJvciwgZERpZmYgPSAJAKYDAQUFZERpZmYBaQEKc2V0TWFuYWdlcgEXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkEC2NoZWNrQ2FsbGVyCQELbXVzdE1hbmFnZXIBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQVY2hlY2tNYW5hZ2VyUHVibGljS2V5CQDZBAEFF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AwkAAAIFFWNoZWNrTWFuYWdlclB1YmxpY0tleQUVY2hlY2tNYW5hZ2VyUHVibGljS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIJARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAFF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOY29uZmlybU1hbmFnZXIABAJwbQkBHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0AAQFaGFzUE0DCQEJaXNEZWZpbmVkAQUCcG0GCQACAQISTm8gcGVuZGluZyBtYW5hZ2VyAwkAAAIFBWhhc1BNBQVoYXNQTQQHY2hlY2tQTQMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAnBtBgkAAgECG1lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQdjaGVja1BNBQdjaGVja1BNCQDMCAIJAQtTdHJpbmdFbnRyeQIJARNrZXlNYW5hZ2VyUHVibGljS2V5AAkA2AQBCQEFdmFsdWUBBQJwbQkAzAgCCQELRGVsZXRlRW50cnkBCQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABA90YXJnZXRQdWJsaWNLZXkEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAUCcGsDCQABAgUHJG1hdGNoMAIEVW5pdAgFAnR4D3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQ90YXJnZXRQdWJsaWNLZXnYKvU2", "height": 2178159, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BKYHjSVEWbzpabmD8qLXnaA1CqVuD2t7GtadgeVjC1gA Next: HrX9jd4WXY1LyPWsfqpRnh69JduaogDsoYDzDF1Ewnrj Diff:
OldNewDifferences
3737 let maxDepthDefault = 30
3838
3939 let maxDepth = valueOrElse(getInteger(this, keyMaxDepth), maxDepthDefault)
40-
41-let keyMaxDepthMigration = "%s__maxDepthMigration"
42-
43-let maxDepthMigrationDefault = 3
44-
45-let maxDepthMigration = valueOrElse(getInteger(this, keyMaxDepthMigration), maxDepthMigrationDefault)
46-
47-let keyMigrated = "migrated"
48-
49-let migrated = valueOrElse(getBoolean(this, keyMigrated), false)
50-
51-let keyNextProcessedUserMigration = "nextProcessedUserMigration"
5240
5341 func keyFactoryAddress () = "%s%s__config__factoryAddress"
5442
147135 func keyNextProcessedPeriod () = "%s__nextProcessedPeriod"
148136
149137
150-func keyUserUnclaimed (userIndex) = makeString(["%s%d", "userUnclaimed", toString(userIndex)], SEP)
151-
152-
153138 func keyNextUnlaimedPeriodOfUser (userIndex) = makeString(["%s%d__nextClaimedPeriod", toString(userIndex)], SEP)
154139
155140
191176
192177 let referralsContractAddressOrFail = addressFromStringValue(getStringOrFail(keyReferralsContractAddress()))
193178
194-func HistoryEntry (type,user,amount,i) = {
179+func HistoryEntry (type,user,amountFromMatcher,amountFromEmission,currentPeriod,latestPeriod,i) = {
195180 let historyKEY = makeString(["%s%s%s%s__history", type, user, toBase58String(i.transactionId)], SEP)
196- let historyDATA = makeString(["%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount)], SEP)
181+ let historyDATA = makeString(["%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amountFromMatcher), toString(amountFromEmission), toString(currentPeriod), toString(latestPeriod)], SEP)
197182 StringEntry(historyKEY, historyDATA)
198183 }
199184
326311 }
327312
328313
329-func commonClaimReward (userAddress) = {
314+func commonClaimReward (userAddress,startPeriod) = {
330315 let cfgArray = readConfigArrayOrFail()
331316 let userIdx = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddress)
332- let userUnclaimedOption = getInteger(keyUserUnclaimed(userIdx))
333- match userUnclaimedOption {
334- 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- }
353- case u: Int =>
354- $Tuple2(u, [IntegerEntry(keyUserUnclaimed(userIdx), 0)])
355- case _ =>
356- throw("Match error")
357- }
317+ let currentPeriod = if ((startPeriod != unit))
318+ then value(startPeriod)
319+ else getNumberByKey(keyNextUnlaimedPeriodOfUser(userIdx))
320+ let nextProcessedPeriod = getNumberByKey(keyNextProcessedPeriod())
321+ if ((currentPeriod >= nextProcessedPeriod))
322+ then throw("Nothing to claim")
323+ else {
324+ let boostingContract = fromBase58String(cfgArray[IdxCfgBoostingContract])
325+ let $t01272912855 = claimInternal(boostingContract, currentPeriod, userIdx, USERDEPTH, 0, 0)
326+ let period = $t01272912855._1
327+ let amountFromMatcher = $t01272912855._2
328+ let amountFromEmission = $t01272912855._3
329+ $Tuple6(period, amountFromMatcher, amountFromEmission, userIdx, cfgArray, nextProcessedPeriod)
330+ }
358331 }
359332
360333
385358 then $Tuple2(nil, false)
386359 else if ((processingStage == processingStageTotal))
387360 then {
388- let $t01477114887 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
389- let userWeight = $t01477114887._1
390- let userActions = $t01477114887._2
361+ let $t01425514371 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
362+ let userWeight = $t01425514371._1
363+ let userActions = $t01425514371._2
391364 let totalWeightNew = (totalWeight + userWeight)
392365 let processingActions = if (((usersCount - 1) > currentUser))
393366 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
400373 let userAmountMatcherForPeriod = fraction(getNumberByKey(keyTotalAmountForPeriod(currentPeriod)), userWeight, totalWeight)
401374 let userAmountEmissionForPeriod = fraction(getNumberByKey(keyAuxEmissionRewardForPeriod(currentPeriod)), userWeight, totalWeight)
402375 let userTotalAmount = (userAmountEmissionForPeriod + userAmountMatcherForPeriod)
403- let userUnclaimedOption = getInteger(keyUserUnclaimed(currentUser))
404376 let userAddress = getStringValue(boostingContractOrFail(), keyNumToUserMapping(currentUser))
405377 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
406378 let activeReferralInv = if ((referrer == unit))
419391 }
420392 if ((referralInv == referralInv))
421393 then {
422- let unclaimedActions = if (if (migrated)
423- then true
424- else (userUnclaimedOption != unit))
425- then [IntegerEntry(keyUserUnclaimed(currentUser), (valueOrElse(userUnclaimedOption, 0) + userTotalAmount))]
426- else nil
427394 let processingActions = if (((usersCount - 1) > currentUser))
428395 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
429396 else [IntegerEntry(keyNextProcessedPeriod(), (currentPeriod + 1)), IntegerEntry(keyNextProcessedUser(), 0), DeleteEntry(keyProcessingStage())]
430- $Tuple2((unclaimedActions ++ processingActions), true)
397+ $Tuple2(processingActions, true)
431398 }
432399 else throw("Strict value is not equal to itself.")
433400 }
461428
462429 @Callable(i)
463430 func processPendingPeriodsAndUsers () = $Tuple2(nil, invoke(this, "finalizeWrapper", [maxDepth], nil))
464-
465-
466-
467-@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))
510431
511432
512433
551472
552473 @Callable(i)
553474 func claimReward () = {
554- let cfgArray = readConfigArrayOrFail()
555475 let address = toString(i.caller)
556- let $t02203522085 = commonClaimReward(address)
557- let amount = $t02203522085._1
558- let actions = $t02203522085._2
559- let checkAmount = if ((amount > 0))
560- then true
561- else throw("Nothing to claim")
562- if ((checkAmount == checkAmount))
563- then {
564- let amountFromEmission = 0
565- let claimedReferral = {
566- let @ = invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)
567- if ($isInstanceOf(@, "Int"))
568- then @
569- else throw(($getType(invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)) + " couldn't be cast to Int"))
570- }
571- let totalAmount = (amount + claimedReferral)
572- $Tuple2(([ScriptTransfer(i.caller, totalAmount, fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, amount, i)] ++ actions), [totalAmount, amountFromEmission])
573- }
574- else throw("Strict value is not equal to itself.")
476+ let $t01990520031 = commonClaimReward(address, unit)
477+ let period = $t01990520031._1
478+ let amountFromMatcher = $t01990520031._2
479+ let amountFromEmission = $t01990520031._3
480+ let userIdx = $t01990520031._4
481+ let cfgArray = $t01990520031._5
482+ let nextProcessedPeriod = $t01990520031._6
483+ let claimedReferral = {
484+ let @ = invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)
485+ if ($isInstanceOf(@, "Int"))
486+ then @
487+ else throw(($getType(invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)) + " couldn't be cast to Int"))
488+ }
489+ $Tuple2([IntegerEntry(keyNextUnlaimedPeriodOfUser(userIdx), period), ScriptTransfer(i.caller, (amountFromMatcher + amountFromEmission), fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, (amountFromMatcher + claimedReferral), amountFromEmission, period, nextProcessedPeriod, i)], [(amountFromMatcher + claimedReferral), amountFromEmission])
575490 }
576491
577492
578493
579494 @Callable(i)
580495 func claimRewardREADONLY (address) = {
581- let $t02265822708 = commonClaimReward(address)
582- let amount = $t02265822708._1
583- let actions = $t02265822708._2
496+ let claimResults = commonClaimReward(address, unit)
584497 let referralUnclaimed = valueOrElse(getInteger(referralsContractAddressOrFail, keyUnclaimedReferral(referralProgramName, address)), 0)
585- let totalAmount = (amount + referralUnclaimed)
586- $Tuple2(nil, totalAmount)
498+ let amount = ((claimResults._2 + claimResults._3) + referralUnclaimed)
499+ $Tuple2(nil, amount)
500+ }
501+
502+
503+
504+@Callable(i)
505+func claimRewardPaginatedREADONLY (address,startPeriod) = {
506+ let $t02108921206 = commonClaimReward(address, if ((0 > startPeriod))
507+ then unit
508+ else startPeriod)
509+ let period = $t02108921206._1
510+ let fromMatcher = $t02108921206._2
511+ let fromEmission = $t02108921206._3
512+ let amount = (fromMatcher + fromEmission)
513+ $Tuple2(nil, $Tuple2(amount, period))
514+ }
515+
516+
517+
518+@Callable(i)
519+func claimRewardDetailedREADONLY (address) = {
520+ let $t02145721532 = commonClaimReward(address, unit)
521+ let ignored = $t02145721532._1
522+ let fromMatcher = $t02145721532._2
523+ let fromEmission = $t02145721532._3
524+ $Tuple2(nil, makeString(["%d%d%d", toString((fromMatcher + fromEmission)), toString(fromMatcher), toString(fromEmission)], SEP))
525+ }
526+
527+
528+
529+@Callable(i)
530+func claimRewardDetailedPaginatedREADONLY (address,startPeriod) = {
531+ let $t02182821945 = commonClaimReward(address, if ((0 > startPeriod))
532+ then unit
533+ else startPeriod)
534+ let period = $t02182821945._1
535+ let fromMatcher = $t02182821945._2
536+ let fromEmission = $t02182821945._3
537+ $Tuple2(nil, $Tuple2(makeString(["%d%d%d", toString((fromMatcher + fromEmission)), toString(fromMatcher), toString(fromEmission)], SEP), period))
587538 }
588539
589540
673624 let ann = (amp * nCoins)
674625 let arr = [1, 2, 3, 4, 5, 6, 7]
675626 func calc (acc,cur) = {
676- let $t02626726456 = acc
677- let d = $t02626726456._1
678- let dPrev = $t02626726456._2
627+ let $t02543425623 = acc
628+ let d = $t02543425623._1
629+ let dPrev = $t02543425623._2
679630 let dp = (((d * d) * d) / (((x1 * x2) * nCoins) * nCoins))
680631 let dNext = (((((ann * s) / aPrecision) + (dp * nCoins)) * d) / ((((ann - aPrecision) * d) / aPrecision) + ((nCoins + toBigInt(1)) * dp)))
681632 $Tuple2(dNext, d)
682633 }
683634
684- let $t02666926719 = {
635+ let $t02583625886 = {
685636 let $l = arr
686637 let $s = size($l)
687638 let $acc0 = $Tuple2(s, unit)
695646
696647 $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)
697648 }
698- let dNext = $t02666926719._1
699- let dPrev = $t02666926719._2
649+ let dNext = $t02583625886._1
650+ let dPrev = $t02583625886._2
700651 let dDiff = abs((dNext - value(dPrev)))
701652 if ((targetPrecision >= dDiff))
702653 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)
40-
41-let keyMaxDepthMigration = "%s__maxDepthMigration"
42-
43-let maxDepthMigrationDefault = 3
44-
45-let maxDepthMigration = valueOrElse(getInteger(this, keyMaxDepthMigration), maxDepthMigrationDefault)
46-
47-let keyMigrated = "migrated"
48-
49-let migrated = valueOrElse(getBoolean(this, keyMigrated), false)
50-
51-let keyNextProcessedUserMigration = "nextProcessedUserMigration"
5240
5341 func keyFactoryAddress () = "%s%s__config__factoryAddress"
5442
5543
5644 let factoryAddressStr = getStringOrFail(keyFactoryAddress())
5745
5846 let factoryContract = addressFromStringValue(factoryAddressStr)
5947
6048 func keyEmissionAddress () = "%s%s__config__emissionAddress"
6149
6250
6351 func keyNumToUserMapping (num) = makeString(["%s%s%s", "mapping", "num2user", toString(num)], SEP)
6452
6553
6654 let keyReferralProgramName = makeString(["%s%s", "referral", "programName"], SEP)
6755
6856 let referralProgramNameDefault = "wxlock"
6957
7058 let referralProgramName = valueOrElse(getString(this, keyReferralProgramName), referralProgramNameDefault)
7159
7260 let keyReferralMinGWxAmount = makeString(["%s%s", "referral", "minGWxAmount"], SEP)
7361
7462 let referralMinGWxAmountDefault = (500 * MULT8)
7563
7664 let referralMinGWxAmount = valueOrElse(getInteger(this, keyReferralMinGWxAmount), referralMinGWxAmountDefault)
7765
7866 let keyReferrerRewardPermille = makeString(["%s%s", "referral", "referrerRewardPermille"], SEP)
7967
8068 let referrerRewardPermilleDefault = 50
8169
8270 let referrerRewardPermille = valueOrElse(getInteger(this, keyReferrerRewardPermille), referrerRewardPermilleDefault)
8371
8472 let keyReferralRewardPermille = makeString(["%s%s", "referral", "referralRewardPermille"], SEP)
8573
8674 let referralRewardPermilleDefault = 50
8775
8876 let referralRewardPermille = valueOrElse(getInteger(this, keyReferralRewardPermille), referralRewardPermilleDefault)
8977
9078 func keyReferrer (referralAddress) = makeString(["%s%s%s", "referrer", referralProgramName, referralAddress], SEP)
9179
9280
9381 func keyUnclaimedReferral (programName,claimerAddress) = makeString(["%s%s%s%s", "unclaimedReferral", programName, claimerAddress], SEP)
9482
9583
9684 let emissionAddressStr = getStringOrFail(keyEmissionAddress())
9785
9886 let emissionContract = addressFromStringValue(emissionAddressStr)
9987
10088 let IdxCfgAssetId = 1
10189
10290 let IdxCfgPacemakerAddress = 2
10391
10492 let IdxCfgBoostingContract = 3
10593
10694 let IdxCfgMaxDepth = 4
10795
10896 func keyConfig () = "%s__config"
10997
11098
11199 func readConfigArrayOrFail () = split(getStringOrFail(keyConfig()), SEP)
112100
113101
114102 func formatConfig (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr,maxDepth) = makeString(["%s%s%s%d", wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr, toString(maxDepth)], SEP)
115103
116104
117105 func boostingContractOrFail () = {
118106 let cfgArray = readConfigArrayOrFail()
119107 valueOrErrorMessage(addressFromString(cfgArray[IdxCfgBoostingContract]), "boosting contract address is not defined")
120108 }
121109
122110
123111 func keyGwxRewardEmissionStartHeight () = "%s%s__gwxRewardEmissionPart__startHeight"
124112
125113
126114 func keyUsersCount () = "%s__nextUserNum"
127115
128116
129117 func keyRatePerBlockCurrent () = "%s%s__ratePerBlock__current"
130118
131119
132120 func keyPoolWeightVirtual () = "%s%s__poolWeight__GWXvirtualPOOL"
133121
134122
135123 func keyNextProcessedUser () = "%s__nextProcessedUser"
136124
137125
138126 func keyLatestPeriod () = "%s__latestPeriod"
139127
140128
141129 func keyNextPeriod () = "%s__nextPeriod"
142130
143131
144132 func keyProcessingStage () = "%s__processingStage"
145133
146134
147135 func keyNextProcessedPeriod () = "%s__nextProcessedPeriod"
148136
149137
150-func keyUserUnclaimed (userIndex) = makeString(["%s%d", "userUnclaimed", toString(userIndex)], SEP)
151-
152-
153138 func keyNextUnlaimedPeriodOfUser (userIndex) = makeString(["%s%d__nextClaimedPeriod", toString(userIndex)], SEP)
154139
155140
156141 func keyLastProcessedPeriodOfUser (userIndex) = makeString(["%s%d__lastProcessedPeriod", toString(userIndex)], SEP)
157142
158143
159144 func keyHeightForPeriod (period) = makeString(["%s%d__startHeightForPeriod", toString(period)], SEP)
160145
161146
162147 func keyAuxEmissionRewardForPeriod (period) = makeString(["%s%d__auxEmissionReward", toString(period)], SEP)
163148
164149
165150 func keyTotalAmountForPeriod (period) = makeString(["%s%d__totalAmountForPeriod", toString(period)], SEP)
166151
167152
168153 func keyLastPayoutInfo () = "%s__lastPayoutInfo"
169154
170155
171156 func PeriodPayoutInfo (period,matcherReward,emissionReward) = makeString(["%d%d%d", toString(period), toString(matcherReward), toString(emissionReward)], SEP)
172157
173158
174159 func keyPayoutHistoryInfo (period) = makeString(["%s%s%d__payouts__history", toString(period)], SEP)
175160
176161
177162 func keyTotalWeightForPeriod (period) = makeString(["%s%d__totalWeightForPeriod", toString(period)], SEP)
178163
179164
180165 func keyUserKValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "k", toString(period)], SEP)
181166
182167
183168 func keyUserBValueForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "b", toString(period)], SEP)
184169
185170
186171 func keyUserWeightForPeriod (period,userIndex) = makeString(["%s%d%s%d__paramByPeriod", toString(userIndex), "weight", toString(period)], SEP)
187172
188173
189174 func keyReferralsContractAddress () = makeString(["%s%s", "config", "referralsContractAddress"], SEP)
190175
191176
192177 let referralsContractAddressOrFail = addressFromStringValue(getStringOrFail(keyReferralsContractAddress()))
193178
194-func HistoryEntry (type,user,amount,i) = {
179+func HistoryEntry (type,user,amountFromMatcher,amountFromEmission,currentPeriod,latestPeriod,i) = {
195180 let historyKEY = makeString(["%s%s%s%s__history", type, user, toBase58String(i.transactionId)], SEP)
196- let historyDATA = makeString(["%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount)], SEP)
181+ let historyDATA = makeString(["%d%d%d%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amountFromMatcher), toString(amountFromEmission), toString(currentPeriod), toString(latestPeriod)], SEP)
197182 StringEntry(historyKEY, historyDATA)
198183 }
199184
200185
201186 func keyManagerPublicKey () = "%s__managerPublicKey"
202187
203188
204189 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
205190
206191
207192 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
208193 case s: String =>
209194 fromBase58String(s)
210195 case _: Unit =>
211196 unit
212197 case _ =>
213198 throw("Match error")
214199 }
215200
216201
217202 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
218203 case s: String =>
219204 fromBase58String(s)
220205 case _: Unit =>
221206 unit
222207 case _ =>
223208 throw("Match error")
224209 }
225210
226211
227212 func mustManager (i) = {
228213 let pd = throw("Permission denied")
229214 match managerPublicKeyOrUnit() {
230215 case pk: ByteVector =>
231216 if ((i.callerPublicKey == pk))
232217 then true
233218 else pd
234219 case _: Unit =>
235220 if ((i.caller == this))
236221 then true
237222 else pd
238223 case _ =>
239224 throw("Match error")
240225 }
241226 }
242227
243228
244229 func calcUserWeight (boostingContractAddress,heightForPeriod,period,userIndex) = {
245230 let kLast = keyLastProcessedPeriodOfUser(userIndex)
246231 let kKey = keyUserKValueForPeriod(period, userIndex)
247232 let kRaw = getInteger(boostingContractAddress, kKey)
248233 let kUserWeight = keyUserWeightForPeriod(period, userIndex)
249234 if (isDefined(kRaw))
250235 then {
251236 let k = value(kRaw)
252237 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(period, userIndex)))
253238 let w = ((k * heightForPeriod) + b)
254239 if ((w > 0))
255240 then $Tuple2((w / SCALE), [IntegerEntry(kLast, period), IntegerEntry(kUserWeight, w)])
256241 else $Tuple2(0, nil)
257242 }
258243 else {
259244 let p = getInteger(this, kLast)
260245 if (if (isDefined(p))
261246 then (period >= value(p))
262247 else false)
263248 then {
264249 let pv = value(p)
265250 let k = value(getInteger(boostingContractAddress, keyUserKValueForPeriod(pv, userIndex)))
266251 let b = value(getInteger(boostingContractAddress, keyUserBValueForPeriod(pv, userIndex)))
267252 let w = ((k * heightForPeriod) + b)
268253 if ((w > 0))
269254 then $Tuple2((w / SCALE), [IntegerEntry(kUserWeight, w)])
270255 else $Tuple2(0, nil)
271256 }
272257 else $Tuple2(0, nil)
273258 }
274259 }
275260
276261
277262 func calcUserWeightForClaim (boostingContractAddress,heightForPeriod,period,userIndex) = {
278263 let kUserWeight = keyUserWeightForPeriod(period, userIndex)
279264 let userWeightOrUnit = getInteger(kUserWeight)
280265 match userWeightOrUnit {
281266 case _: Unit =>
282267 0
283268 case w: Int =>
284269 (w / SCALE)
285270 case _ =>
286271 throw("Match error")
287272 }
288273 }
289274
290275
291276 func getUserIndexByAddress (boostingContractAddressStr,userAddress) = {
292277 let key = makeString(["%s%s%s", "mapping", "user2num", userAddress], SEP)
293278 parseIntValue(valueOrErrorMessage(getString(Address(fromBase58String(boostingContractAddressStr)), key), ((("User address " + userAddress) + " is not found in boosting contract data, key=") + key)))
294279 }
295280
296281
297282 func nextPeriod () = getNumberByKey(keyNextPeriod())
298283
299284
300285 func invokeClaim (boostingContract,period,user,depth,totalFromMatcher,totalFromEmission) = {
301286 let result = invoke(this, "claimNextBatch", [boostingContract, period, user, depth, totalFromMatcher, totalFromEmission], nil)
302287 if ((result == result))
303288 then match result {
304289 case r: (Int, Int, Int) =>
305290 r
306291 case _ =>
307292 throw("Incorrect invoke result")
308293 }
309294 else throw("Strict value is not equal to itself.")
310295 }
311296
312297
313298 func claimInternal (boostingContract,currentPeriod,currentUser,depth,userAccumulatedMatcher,userAccumulatedEmission) = {
314299 let boostingContractAddress = Address(boostingContract)
315300 let latestPeriod = getNumberByKey(keyNextProcessedPeriod())
316301 let totalWeight = getNumberByKey(keyTotalWeightForPeriod(currentPeriod))
317302 let heightForPeriod = getNumberByKey(keyHeightForPeriod(currentPeriod))
318303 let userWeight = calcUserWeightForClaim(boostingContractAddress, heightForPeriod, currentPeriod, currentUser)
319304 let userAmountMatcherForPeriod = fraction(getNumberByKey(keyTotalAmountForPeriod(currentPeriod)), userWeight, totalWeight)
320305 let userAmountEmissionForPeriod = fraction(getNumberByKey(keyAuxEmissionRewardForPeriod(currentPeriod)), userWeight, totalWeight)
321306 if (if ((0 >= depth))
322307 then true
323308 else ((currentPeriod + 1) >= latestPeriod))
324309 then $Tuple3((currentPeriod + 1), (userAccumulatedMatcher + userAmountMatcherForPeriod), (userAccumulatedEmission + userAmountEmissionForPeriod))
325310 else invokeClaim(boostingContract, (currentPeriod + 1), currentUser, (depth - 1), (userAccumulatedMatcher + userAmountMatcherForPeriod), (userAccumulatedEmission + userAmountEmissionForPeriod))
326311 }
327312
328313
329-func commonClaimReward (userAddress) = {
314+func commonClaimReward (userAddress,startPeriod) = {
330315 let cfgArray = readConfigArrayOrFail()
331316 let userIdx = getUserIndexByAddress(cfgArray[IdxCfgBoostingContract], userAddress)
332- let userUnclaimedOption = getInteger(keyUserUnclaimed(userIdx))
333- match userUnclaimedOption {
334- 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- }
353- case u: Int =>
354- $Tuple2(u, [IntegerEntry(keyUserUnclaimed(userIdx), 0)])
355- case _ =>
356- throw("Match error")
357- }
317+ let currentPeriod = if ((startPeriod != unit))
318+ then value(startPeriod)
319+ else getNumberByKey(keyNextUnlaimedPeriodOfUser(userIdx))
320+ let nextProcessedPeriod = getNumberByKey(keyNextProcessedPeriod())
321+ if ((currentPeriod >= nextProcessedPeriod))
322+ then throw("Nothing to claim")
323+ else {
324+ let boostingContract = fromBase58String(cfgArray[IdxCfgBoostingContract])
325+ let $t01272912855 = claimInternal(boostingContract, currentPeriod, userIdx, USERDEPTH, 0, 0)
326+ let period = $t01272912855._1
327+ let amountFromMatcher = $t01272912855._2
328+ let amountFromEmission = $t01272912855._3
329+ $Tuple6(period, amountFromMatcher, amountFromEmission, userIdx, cfgArray, nextProcessedPeriod)
330+ }
358331 }
359332
360333
361334 @Callable(i)
362335 func updateReferralActivity (userAddress,gWxAmountStart) = {
363336 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
364337 let activeReferralInv = if ((referrer == unit))
365338 then unit
366339 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (gWxAmountStart >= referralMinGWxAmount)], nil)
367340 if ((activeReferralInv == activeReferralInv))
368341 then $Tuple2(nil, unit)
369342 else throw("Strict value is not equal to itself.")
370343 }
371344
372345
373346
374347 @Callable(i)
375348 func finalizeHelper () = {
376349 let processingStage = valueOrElse(getInteger(keyProcessingStage()), processingStageTotal)
377350 let currentPeriod = getNumberByKey(keyNextProcessedPeriod())
378351 let currentUser = getNumberByKey(keyNextProcessedUser())
379352 let latestPeriod = getNumberByKey(keyLatestPeriod())
380353 let usersCount = valueOrElse(getInteger(boostingContractOrFail(), keyUsersCount()), 0)
381354 let totalWeightKey = keyTotalWeightForPeriod(currentPeriod)
382355 let totalWeight = getNumberByKey(keyTotalWeightForPeriod(currentPeriod))
383356 let heightForPeriod = getNumberByKey(keyHeightForPeriod(currentPeriod))
384357 if ((currentPeriod > latestPeriod))
385358 then $Tuple2(nil, false)
386359 else if ((processingStage == processingStageTotal))
387360 then {
388- let $t01477114887 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
389- let userWeight = $t01477114887._1
390- let userActions = $t01477114887._2
361+ let $t01425514371 = calcUserWeight(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
362+ let userWeight = $t01425514371._1
363+ let userActions = $t01425514371._2
391364 let totalWeightNew = (totalWeight + userWeight)
392365 let processingActions = if (((usersCount - 1) > currentUser))
393366 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
394367 else [IntegerEntry(keyProcessingStage(), processingStageShares), IntegerEntry(keyNextProcessedUser(), 0)]
395368 $Tuple2((([IntegerEntry(totalWeightKey, totalWeightNew)] ++ processingActions) ++ userActions), true)
396369 }
397370 else if ((processingStage == processingStageShares))
398371 then {
399372 let userWeight = calcUserWeightForClaim(boostingContractOrFail(), heightForPeriod, currentPeriod, currentUser)
400373 let userAmountMatcherForPeriod = fraction(getNumberByKey(keyTotalAmountForPeriod(currentPeriod)), userWeight, totalWeight)
401374 let userAmountEmissionForPeriod = fraction(getNumberByKey(keyAuxEmissionRewardForPeriod(currentPeriod)), userWeight, totalWeight)
402375 let userTotalAmount = (userAmountEmissionForPeriod + userAmountMatcherForPeriod)
403- let userUnclaimedOption = getInteger(keyUserUnclaimed(currentUser))
404376 let userAddress = getStringValue(boostingContractOrFail(), keyNumToUserMapping(currentUser))
405377 let referrer = getString(referralsContractAddressOrFail, keyReferrer(userAddress))
406378 let activeReferralInv = if ((referrer == unit))
407379 then unit
408380 else invoke(referralsContractAddressOrFail, "updateReferralActivity", [referralProgramName, userAddress, (userWeight >= referralMinGWxAmount)], nil)
409381 if ((activeReferralInv == activeReferralInv))
410382 then {
411383 let referralInv = if (if ((referrer == unit))
412384 then true
413385 else (referralMinGWxAmount > userWeight))
414386 then unit
415387 else {
416388 let referrerReward = fraction(userTotalAmount, referrerRewardPermille, SCALE)
417389 let referralReward = fraction(userTotalAmount, referralRewardPermille, SCALE)
418390 invoke(referralsContractAddressOrFail, "incUnclaimed", [referralProgramName, userAddress, referrerReward, referralReward], nil)
419391 }
420392 if ((referralInv == referralInv))
421393 then {
422- let unclaimedActions = if (if (migrated)
423- then true
424- else (userUnclaimedOption != unit))
425- then [IntegerEntry(keyUserUnclaimed(currentUser), (valueOrElse(userUnclaimedOption, 0) + userTotalAmount))]
426- else nil
427394 let processingActions = if (((usersCount - 1) > currentUser))
428395 then [IntegerEntry(keyNextProcessedUser(), (currentUser + 1))]
429396 else [IntegerEntry(keyNextProcessedPeriod(), (currentPeriod + 1)), IntegerEntry(keyNextProcessedUser(), 0), DeleteEntry(keyProcessingStage())]
430- $Tuple2((unclaimedActions ++ processingActions), true)
397+ $Tuple2(processingActions, true)
431398 }
432399 else throw("Strict value is not equal to itself.")
433400 }
434401 else throw("Strict value is not equal to itself.")
435402 }
436403 else throw("invalid processing stage")
437404 }
438405
439406
440407
441408 @Callable(i)
442409 func finalizeWrapper (counter) = {
443410 let result = {
444411 let @ = invoke(this, "finalizeHelper", nil, nil)
445412 if ($isInstanceOf(@, "Boolean"))
446413 then @
447414 else throw(($getType(invoke(this, "finalizeHelper", nil, nil)) + " couldn't be cast to Boolean"))
448415 }
449416 if ((result == result))
450417 then if (!(result))
451418 then if ((counter == maxDepth))
452419 then throw("Nothing to process")
453420 else $Tuple2(nil, unit)
454421 else if ((counter > 0))
455422 then $Tuple2(nil, invoke(this, "finalizeWrapper", [(counter - 1)], nil))
456423 else $Tuple2(nil, unit)
457424 else throw("Strict value is not equal to itself.")
458425 }
459426
460427
461428
462429 @Callable(i)
463430 func processPendingPeriodsAndUsers () = $Tuple2(nil, invoke(this, "finalizeWrapper", [maxDepth], nil))
464-
465-
466-
467-@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))
510431
511432
512433
513434 @Callable(i)
514435 func deposit () = {
515436 let cfgArray = readConfigArrayOrFail()
516437 if ((i.caller != Address(fromBase58String(cfgArray[IdxCfgPacemakerAddress]))))
517438 then throw("Wrong caller address")
518439 else {
519440 let assetId = value(value(i.payments[0]).assetId)
520441 if ((assetId != fromBase58String(cfgArray[IdxCfgAssetId])))
521442 then throw("Wrong payment asset")
522443 else {
523444 let period = nextPeriod()
524445 let deltaH = (height - getNumberOrFail(keyGwxRewardEmissionStartHeight()))
525446 let emissionRate = valueOrErrorMessage(getInteger(emissionContract, keyRatePerBlockCurrent()), (("mandatory emission_contract." + keyRatePerBlockCurrent()) + " is not defined"))
526447 let weight = valueOrErrorMessage(getInteger(factoryContract, keyPoolWeightVirtual()), (("mandatory factory_contract." + keyPoolWeightVirtual()) + " is not defined"))
527448 let auxAmount = fraction((deltaH * weight), emissionRate, MULT8)
528449 let em = invoke(emissionContract, "emit", [auxAmount], nil)
529450 if ((em == em))
530451 then {
531452 let matcherPart = value(i.payments[0]).amount
532453 let payoutInfo = PeriodPayoutInfo(period, matcherPart, auxAmount)
533454 [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)]
534455 }
535456 else throw("Strict value is not equal to itself.")
536457 }
537458 }
538459 }
539460
540461
541462
542463 @Callable(i)
543464 func claimNextBatch (boostingContract,currentPeriod,currentUser,depth,totalFromMatcher,totalFromEmission) = if ((i.caller != this))
544465 then throw("Should be called by this script only")
545466 else {
546467 let periodAndTotals = claimInternal(boostingContract, currentPeriod, currentUser, depth, totalFromMatcher, totalFromEmission)
547468 $Tuple2(nil, periodAndTotals)
548469 }
549470
550471
551472
552473 @Callable(i)
553474 func claimReward () = {
554- let cfgArray = readConfigArrayOrFail()
555475 let address = toString(i.caller)
556- let $t02203522085 = commonClaimReward(address)
557- let amount = $t02203522085._1
558- let actions = $t02203522085._2
559- let checkAmount = if ((amount > 0))
560- then true
561- else throw("Nothing to claim")
562- if ((checkAmount == checkAmount))
563- then {
564- let amountFromEmission = 0
565- let claimedReferral = {
566- let @ = invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)
567- if ($isInstanceOf(@, "Int"))
568- then @
569- else throw(($getType(invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)) + " couldn't be cast to Int"))
570- }
571- let totalAmount = (amount + claimedReferral)
572- $Tuple2(([ScriptTransfer(i.caller, totalAmount, fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, amount, i)] ++ actions), [totalAmount, amountFromEmission])
573- }
574- else throw("Strict value is not equal to itself.")
476+ let $t01990520031 = commonClaimReward(address, unit)
477+ let period = $t01990520031._1
478+ let amountFromMatcher = $t01990520031._2
479+ let amountFromEmission = $t01990520031._3
480+ let userIdx = $t01990520031._4
481+ let cfgArray = $t01990520031._5
482+ let nextProcessedPeriod = $t01990520031._6
483+ let claimedReferral = {
484+ let @ = invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)
485+ if ($isInstanceOf(@, "Int"))
486+ then @
487+ else throw(($getType(invoke(referralsContractAddressOrFail, "claim", [referralProgramName], nil)) + " couldn't be cast to Int"))
488+ }
489+ $Tuple2([IntegerEntry(keyNextUnlaimedPeriodOfUser(userIdx), period), ScriptTransfer(i.caller, (amountFromMatcher + amountFromEmission), fromBase58String(cfgArray[IdxCfgAssetId])), HistoryEntry("claim", address, (amountFromMatcher + claimedReferral), amountFromEmission, period, nextProcessedPeriod, i)], [(amountFromMatcher + claimedReferral), amountFromEmission])
575490 }
576491
577492
578493
579494 @Callable(i)
580495 func claimRewardREADONLY (address) = {
581- let $t02265822708 = commonClaimReward(address)
582- let amount = $t02265822708._1
583- let actions = $t02265822708._2
496+ let claimResults = commonClaimReward(address, unit)
584497 let referralUnclaimed = valueOrElse(getInteger(referralsContractAddressOrFail, keyUnclaimedReferral(referralProgramName, address)), 0)
585- let totalAmount = (amount + referralUnclaimed)
586- $Tuple2(nil, totalAmount)
498+ let amount = ((claimResults._2 + claimResults._3) + referralUnclaimed)
499+ $Tuple2(nil, amount)
500+ }
501+
502+
503+
504+@Callable(i)
505+func claimRewardPaginatedREADONLY (address,startPeriod) = {
506+ let $t02108921206 = commonClaimReward(address, if ((0 > startPeriod))
507+ then unit
508+ else startPeriod)
509+ let period = $t02108921206._1
510+ let fromMatcher = $t02108921206._2
511+ let fromEmission = $t02108921206._3
512+ let amount = (fromMatcher + fromEmission)
513+ $Tuple2(nil, $Tuple2(amount, period))
514+ }
515+
516+
517+
518+@Callable(i)
519+func claimRewardDetailedREADONLY (address) = {
520+ let $t02145721532 = commonClaimReward(address, unit)
521+ let ignored = $t02145721532._1
522+ let fromMatcher = $t02145721532._2
523+ let fromEmission = $t02145721532._3
524+ $Tuple2(nil, makeString(["%d%d%d", toString((fromMatcher + fromEmission)), toString(fromMatcher), toString(fromEmission)], SEP))
525+ }
526+
527+
528+
529+@Callable(i)
530+func claimRewardDetailedPaginatedREADONLY (address,startPeriod) = {
531+ let $t02182821945 = commonClaimReward(address, if ((0 > startPeriod))
532+ then unit
533+ else startPeriod)
534+ let period = $t02182821945._1
535+ let fromMatcher = $t02182821945._2
536+ let fromEmission = $t02182821945._3
537+ $Tuple2(nil, $Tuple2(makeString(["%d%d%d", toString((fromMatcher + fromEmission)), toString(fromMatcher), toString(fromEmission)], SEP), period))
587538 }
588539
589540
590541
591542 @Callable(i)
592543 func latestFinalizedPeriodREADONLY (address) = $Tuple2(nil, valueOrElse(getInteger(this, keyLatestPeriod()), -1))
593544
594545
595546
596547 @Callable(i)
597548 func latestFinalizedPeriodInfoREADONLY (address) = $Tuple2(nil, getStringByKey(keyLastPayoutInfo()))
598549
599550
600551
601552 @Callable(i)
602553 func calcGwxParamsREADONLY (gwxAmountStart,lockStartHeight,lockDurationBlocks) = {
603554 let lockEndHeight = (lockStartHeight + lockDurationBlocks)
604555 let scale8ParamK = -(fraction(gwxAmountStart, SCALE, lockDurationBlocks))
605556 let scale8ParamB = (fraction(gwxAmountStart, SCALE, lockDurationBlocks) * lockEndHeight)
606557 $Tuple2(nil, [scale8ParamK, scale8ParamB, nextPeriod()])
607558 }
608559
609560
610561
611562 @Callable(i)
612563 func calcGwxAmountStartREADONLY (wxLockAmount,lockDuration,maxLockDuration) = {
613564 let coeffX8 = fraction(lockDuration, MULT8, maxLockDuration)
614565 let gWxAmountStart = fraction(wxLockAmount, coeffX8, MULT8)
615566 $Tuple2(nil, [gWxAmountStart])
616567 }
617568
618569
619570
620571 @Callable(i)
621572 func constructor (wxAssetIdStr,matcherPacemakerAddressStr,boostingContractAddressStr,maxDepth) = if ((this != i.caller))
622573 then throw("not authorized")
623574 else [StringEntry(keyConfig(), formatConfig(wxAssetIdStr, matcherPacemakerAddressStr, boostingContractAddressStr, maxDepth))]
624575
625576
626577
627578 @Callable(i)
628579 func constructorV2 (factoryAddress) = if ((this != i.caller))
629580 then throw("not authorized")
630581 else [StringEntry(keyFactoryAddress(), factoryAddress)]
631582
632583
633584
634585 @Callable(i)
635586 func constructorV3 (emissionAddress) = if ((this != i.caller))
636587 then throw("not authorized")
637588 else {
638589 let initLatestPeriod = if (isDefined(getInteger(this, keyLatestPeriod())))
639590 then nil
640591 else [IntegerEntry(keyLatestPeriod(), -1)]
641592 (initLatestPeriod :+ StringEntry(keyEmissionAddress(), emissionAddress))
642593 }
643594
644595
645596
646597 @Callable(i)
647598 func onEmissionForGwxStart () = if ((i.caller != factoryContract))
648599 then throw("permissions denied")
649600 else [IntegerEntry(keyGwxRewardEmissionStartHeight(), height)]
650601
651602
652603
653604 @Callable(i)
654605 func latestPeriodEmissionRewardsREADONLY (address) = {
655606 let period = nextPeriod()
656607 $Tuple2(nil, [getNumberByKey(keyAuxEmissionRewardForPeriod(period))])
657608 }
658609
659610
660611
661612 @Callable(i)
662613 func calcD (x1BigIntStr,x2BigIntStr,ampBigIntStr,aPrecisionBigIntStr,targetPrecisionBigIntStr) = {
663614 let nCoins = toBigInt(2)
664615 let aPrecision = parseBigIntValue(aPrecisionBigIntStr)
665616 let targetPrecision = parseBigIntValue(targetPrecisionBigIntStr)
666617 let x1 = parseBigIntValue(x1BigIntStr)
667618 let x2 = parseBigIntValue(x2BigIntStr)
668619 let amp = (parseBigIntValue(ampBigIntStr) * aPrecision)
669620 let s = (x1 + x2)
670621 if ((s == zeroBigInt))
671622 then $Tuple2(nil, toString(zeroBigInt))
672623 else {
673624 let ann = (amp * nCoins)
674625 let arr = [1, 2, 3, 4, 5, 6, 7]
675626 func calc (acc,cur) = {
676- let $t02626726456 = acc
677- let d = $t02626726456._1
678- let dPrev = $t02626726456._2
627+ let $t02543425623 = acc
628+ let d = $t02543425623._1
629+ let dPrev = $t02543425623._2
679630 let dp = (((d * d) * d) / (((x1 * x2) * nCoins) * nCoins))
680631 let dNext = (((((ann * s) / aPrecision) + (dp * nCoins)) * d) / ((((ann - aPrecision) * d) / aPrecision) + ((nCoins + toBigInt(1)) * dp)))
681632 $Tuple2(dNext, d)
682633 }
683634
684- let $t02666926719 = {
635+ let $t02583625886 = {
685636 let $l = arr
686637 let $s = size($l)
687638 let $acc0 = $Tuple2(s, unit)
688639 func $f0_1 ($a,$i) = if (($i >= $s))
689640 then $a
690641 else calc($a, $l[$i])
691642
692643 func $f0_2 ($a,$i) = if (($i >= $s))
693644 then $a
694645 else throw("List size exceeds 7")
695646
696647 $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)
697648 }
698- let dNext = $t02666926719._1
699- let dPrev = $t02666926719._2
649+ let dNext = $t02583625886._1
650+ let dPrev = $t02583625886._2
700651 let dDiff = abs((dNext - value(dPrev)))
701652 if ((targetPrecision >= dDiff))
702653 then $Tuple2(nil, toString(dNext))
703654 else throw(("D calculation error, dDiff = " + toString(dDiff)))
704655 }
705656 }
706657
707658
708659
709660 @Callable(i)
710661 func setManager (pendingManagerPublicKey) = {
711662 let checkCaller = mustManager(i)
712663 if ((checkCaller == checkCaller))
713664 then {
714665 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
715666 if ((checkManagerPublicKey == checkManagerPublicKey))
716667 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
717668 else throw("Strict value is not equal to itself.")
718669 }
719670 else throw("Strict value is not equal to itself.")
720671 }
721672
722673
723674
724675 @Callable(i)
725676 func confirmManager () = {
726677 let pm = pendingManagerPublicKeyOrUnit()
727678 let hasPM = if (isDefined(pm))
728679 then true
729680 else throw("No pending manager")
730681 if ((hasPM == hasPM))
731682 then {
732683 let checkPM = if ((i.callerPublicKey == value(pm)))
733684 then true
734685 else throw("You are not pending manager")
735686 if ((checkPM == checkPM))
736687 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
737688 else throw("Strict value is not equal to itself.")
738689 }
739690 else throw("Strict value is not equal to itself.")
740691 }
741692
742693
743694 @Verifier(tx)
744695 func verify () = {
745696 let targetPublicKey = match managerPublicKeyOrUnit() {
746697 case pk: ByteVector =>
747698 pk
748699 case _: Unit =>
749700 tx.senderPublicKey
750701 case _ =>
751702 throw("Match error")
752703 }
753704 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
754705 }
755706

github/deemru/w8io/c3f4982 
81.48 ms