tx · 97f6ErKWY6KhG9dFkVyWrjc5UGQH6Moy7AhRzTBhd9Wr

3N9vabWFoy1tnEwQgiR547qrvbubRopDv2T:  -0.02500000 Waves

2023.03.20 11:07 [2498072] smart account 3N9vabWFoy1tnEwQgiR547qrvbubRopDv2T > SELF 0.00000000 Waves

{ "type": 13, "id": "97f6ErKWY6KhG9dFkVyWrjc5UGQH6Moy7AhRzTBhd9Wr", "fee": 2500000, "feeAssetId": null, "timestamp": 1679299673520, "version": 2, "chainId": 84, "sender": "3N9vabWFoy1tnEwQgiR547qrvbubRopDv2T", "senderPublicKey": "33BEcDo5AsokUDAoQxy87v3NPnmQFUWWnhxbaZMPPFiq", "proofs": [ "5MCdBoP9iwCSXiMuSh4vqjyUZRZanb8uo1RerBpRmsYQhaR2YbbMs6qbGo6nXvJ5ujPgZJDMqRxAkNoEYcsta5hF" ], "script": "base64:BgJdCAISBQoDCAgEEgUKAwgYARIHCgURCBgBARIGCgQICAgIEgYKBAgICAISBQoDCAgEEgYKBAgIAQESBAoCCBgSAwoBCBIAEgQKAggIEgMKAQgSBAoCCAgSAwoBCBIAHgAJc2VwYXJhdG9yAgJfXwEMa2V5V3hBc3NldElkAAkAuQkCCQDMCAICAiVzCQDMCAICCXd4QXNzZXRJZAUDbmlsBQlzZXBhcmF0b3IAE2tleUJhY2tlbmRQdWJsaWNLZXkJALkJAgkAzAgCAgIlcwkAzAgCAhBiYWNrZW5kUHVibGljS2V5BQNuaWwFCXNlcGFyYXRvcgEba2V5RXhpc3RzUmVmZXJyZXJUb1JlZmVycmFsAwtwcm9ncmFtTmFtZQ9yZWZlcnJlckFkZHJlc3MPcmVmZXJyYWxBZGRyZXNzCQC5CQIJAMwIAgIIJXMlcyVzJXMJAMwIAgIYZXhpc3RzUmVmZXJyZXJUb1JlZmVycmFsCQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFD3JlZmVycmVyQWRkcmVzcwkAzAgCBQ9yZWZlcnJhbEFkZHJlc3MFA25pbAUJc2VwYXJhdG9yARJrZXlDbGFpbWVkUmVmZXJyZXICC3Byb2dyYW1OYW1lDmNsYWltZXJBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICD2NsYWltZWRSZWZlcnJlcgkAzAgCBQtwcm9ncmFtTmFtZQkAzAgCBQ5jbGFpbWVyQWRkcmVzcwUDbmlsBQlzZXBhcmF0b3IBEmtleUNsYWltZWRSZWZlcnJhbAILcHJvZ3JhbU5hbWUOY2xhaW1lckFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIPY2xhaW1lZFJlZmVycmFsCQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFDmNsYWltZXJBZGRyZXNzBQNuaWwFCXNlcGFyYXRvcgEUa2V5VW5jbGFpbWVkUmVmZXJyZXICC3Byb2dyYW1OYW1lDmNsYWltZXJBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICEXVuY2xhaW1lZFJlZmVycmVyCQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFDmNsYWltZXJBZGRyZXNzBQNuaWwFCXNlcGFyYXRvcgEUa2V5VW5jbGFpbWVkUmVmZXJyYWwCC3Byb2dyYW1OYW1lDmNsYWltZXJBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICEXVuY2xhaW1lZFJlZmVycmFsCQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFDmNsYWltZXJBZGRyZXNzBQNuaWwFCXNlcGFyYXRvcgELa2V5UmVmZXJyZXICC3Byb2dyYW1OYW1lD3JlZmVycmFsQWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAghyZWZlcnJlcgkAzAgCBQtwcm9ncmFtTmFtZQkAzAgCBQ9yZWZlcnJhbEFkZHJlc3MFA25pbAUJc2VwYXJhdG9yAQ5rZXlQcm9ncmFtTmFtZQELcHJvZ3JhbU5hbWUJALkJAgkAzAgCAgQlcyVzCQDMCAICC3Byb2dyYW1OYW1lCQDMCAIFC3Byb2dyYW1OYW1lBQNuaWwFCXNlcGFyYXRvcgEVa2V5VG90YWxSZWZlcnJhbENvdW50Agtwcm9ncmFtTmFtZQ9yZWZlcnJlckFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgISdG90YWxSZWZlcnJhbENvdW50CQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFD3JlZmVycmVyQWRkcmVzcwUDbmlsBQlzZXBhcmF0b3IBFmtleUFjdGl2ZVJlZmVycmFsQ291bnQCC3Byb2dyYW1OYW1lD3JlZmVycmVyQWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAhNhY3RpdmVSZWZlcnJhbENvdW50CQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFD3JlZmVycmVyQWRkcmVzcwUDbmlsBQlzZXBhcmF0b3IBE2tleUlzUmVmZXJyYWxBY3RpdmUCC3Byb2dyYW1OYW1lD3JlZmVycmFsQWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAg5hY3RpdmVSZWZlcnJhbAkAzAgCBQtwcm9ncmFtTmFtZQkAzAgCBQ9yZWZlcnJhbEFkZHJlc3MFA25pbAUJc2VwYXJhdG9yARZrZXlDbGFpbWVkVG90YWxBZGRyZXNzAQdhZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAhNjbGFpbWVkVG90YWxBZGRyZXNzCQDMCAIFB2FkZHJlc3MFA25pbAUJc2VwYXJhdG9yARhrZXlVbmNsYWltZWRUb3RhbEFkZHJlc3MBB2FkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICFXVuY2xhaW1lZFRvdGFsQWRkcmVzcwkAzAgCBQdhZGRyZXNzBQNuaWwFCXNlcGFyYXRvcgEPa2V5Q2xhaW1lZFRvdGFsAQtwcm9ncmFtTmFtZQkAuQkCCQDMCAICBCVzJXMJAMwIAgIMY2xhaW1lZFRvdGFsCQDMCAIFC3Byb2dyYW1OYW1lBQNuaWwFCXNlcGFyYXRvcgEPa2V5UmV3YXJkc1RvdGFsAQtwcm9ncmFtTmFtZQkAuQkCCQDMCAICBCVzJXMJAMwIAgIMcmV3YXJkc1RvdGFsCQDMCAIFC3Byb2dyYW1OYW1lBQNuaWwFCXNlcGFyYXRvcgEQa2V5UmV3YXJkQXNzZXRJZAELcHJvZ3JhbU5hbWUJALkJAgkAzAgCAgQlcyVzCQDMCAICDXJld2FyZEFzc2V0SWQJAMwIAgULcHJvZ3JhbU5hbWUFA25pbAUJc2VwYXJhdG9yARNrZXlUcmVhc3VyeUNvbnRyYWN0AQtwcm9ncmFtTmFtZQkAuQkCCQDMCAICBCVzJXMJAMwIAgIQdHJlYXN1cnlDb250cmFjdAkAzAgCBQtwcm9ncmFtTmFtZQUDbmlsBQlzZXBhcmF0b3IBGWtleUltcGxlbWVudGF0aW9uQ29udHJhY3QBC3Byb2dyYW1OYW1lCQC5CQIJAMwIAgIEJXMlcwkAzAgCAhZpbXBsZW1lbnRhdGlvbkNvbnRyYWN0CQDMCAIFC3Byb2dyYW1OYW1lBQNuaWwFCXNlcGFyYXRvcgEWa2V5QWxsUmVmZXJyYWxQcm9ncmFtcwEHYWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgITYWxsUmVmZXJyYWxQcm9ncmFtcwkAzAgCBQdhZGRyZXNzBQNuaWwFCXNlcGFyYXRvcgETa2V5TWFuYWdlclB1YmxpY0tleQACFCVzX19tYW5hZ2VyUHVibGljS2V5ARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQACGyVzX19wZW5kaW5nTWFuYWdlclB1YmxpY0tleQEPa2V5Q2xhaW1IaXN0b3J5BAtwcm9ncmFtTmFtZQt1c2VyQWRkcmVzcw10cmFuc2FjdGlvbklkBHR5cGUJALkJAgkAzAgCAgolcyVzJXMlcyVzCQDMCAICB2hpc3RvcnkJAMwIAgUEdHlwZQkAzAgCBQtwcm9ncmFtTmFtZQkAzAgCBQt1c2VyQWRkcmVzcwkAzAgCBQ10cmFuc2FjdGlvbklkBQNuaWwFCXNlcGFyYXRvcgESZm9ybWF0Q2xhaW1IaXN0b3J5AQZhbW91bnQJALkJAgkAzAgCAgYlZCVkJWQJAMwIAgkApAMBCAUJbGFzdEJsb2NrBmhlaWdodAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAKQDAQUGYW1vdW50BQNuaWwFCXNlcGFyYXRvcgEIdGhyb3dFcnIBA21zZwkAAgEJALkJAgkAzAgCAg5yZWZlcnJhbC5yaWRlOgkAzAgCBQNtc2cFA25pbAIBIAEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAAEByRtYXRjaDAJAKIIAQkBE2tleU1hbmFnZXJQdWJsaWNLZXkAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkA2QQBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgEdcGVuZGluZ01hbmFnZXJQdWJsaWNLZXlPclVuaXQABAckbWF0Y2gwCQCiCAEJARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQDZBAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQttdXN0TWFuYWdlcgEBaQQCcGQJAQh0aHJvd0VycgECEXBlcm1pc3Npb24gZGVuaWVkBAckbWF0Y2gwCQEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCcGsFByRtYXRjaDADCQAAAggFAWkPY2FsbGVyUHVibGljS2V5BQJwawYFAnBkAwkAAQIFByRtYXRjaDACBFVuaXQDCQAAAggFAWkGY2FsbGVyBQR0aGlzBgUCcGQJAAIBAgtNYXRjaCBlcnJvcgEZdXBkYXRlQWxsUmVmZXJyYWxQcm9ncmFtcwIHYWRkcmVzcwtwcm9ncmFtTmFtZQQTYWxsUmVmZXJyYWxQcm9ncmFtcwkBC3ZhbHVlT3JFbHNlAgkAoggBCQEWa2V5QWxsUmVmZXJyYWxQcm9ncmFtcwEFB2FkZHJlc3MCAAQadXBkYXRlZEFsbFJlZmVycmFsUHJvZ3JhbXMDCQEIY29udGFpbnMCBRNhbGxSZWZlcnJhbFByb2dyYW1zBQtwcm9ncmFtTmFtZQUDbmlsBBZuZXdBbGxSZWZlcnJhbFByb2dyYW1zAwkAAAIFE2FsbFJlZmVycmFsUHJvZ3JhbXMCAAULcHJvZ3JhbU5hbWUJALkJAgkAzAgCBRNhbGxSZWZlcnJhbFByb2dyYW1zCQDMCAIFC3Byb2dyYW1OYW1lBQNuaWwFCXNlcGFyYXRvcgkAzAgCCQELU3RyaW5nRW50cnkCCQEWa2V5QWxsUmVmZXJyYWxQcm9ncmFtcwEFB2FkZHJlc3MFFm5ld0FsbFJlZmVycmFsUHJvZ3JhbXMFA25pbAUadXBkYXRlZEFsbFJlZmVycmFsUHJvZ3JhbXMPAWkBDWNsYWltSW50ZXJuYWwDC3Byb2dyYW1OYW1lDmNsYWltZXJBZGRyZXNzGGlzSW1wbGVtZW50YXRpb25Db250cmFjdAQSY2hlY2tQcm9ncmFtRXhpc3RzAwkBC3ZhbHVlT3JFbHNlAgkAoAgBCQEOa2V5UHJvZ3JhbU5hbWUBBQtwcm9ncmFtTmFtZQcGCQEIdGhyb3dFcnIBAhZwcm9ncmFtIGRvZXMgbm90IGV4aXN0AwkAAAIFEmNoZWNrUHJvZ3JhbUV4aXN0cwUSY2hlY2tQcm9ncmFtRXhpc3RzBAskdDA0Nzk0NTc1MwMFGGlzSW1wbGVtZW50YXRpb25Db250cmFjdAkAlwoFCQELdmFsdWVPckVsc2UCCQCfCAEJARJrZXlDbGFpbWVkUmVmZXJyYWwCBQtwcm9ncmFtTmFtZQUOY2xhaW1lckFkZHJlc3MAAAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEUa2V5VW5jbGFpbWVkUmVmZXJyYWwCBQtwcm9ncmFtTmFtZQUOY2xhaW1lckFkZHJlc3MAAAkBEmtleUNsYWltZWRSZWZlcnJhbAIFC3Byb2dyYW1OYW1lBQ5jbGFpbWVyQWRkcmVzcwkBFGtleVVuY2xhaW1lZFJlZmVycmFsAgULcHJvZ3JhbU5hbWUFDmNsYWltZXJBZGRyZXNzCQEPa2V5Q2xhaW1IaXN0b3J5BAULcHJvZ3JhbU5hbWUFDmNsYWltZXJBZGRyZXNzCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQCDWNsYWltUmVmZXJyYWwJAJcKBQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQESa2V5Q2xhaW1lZFJlZmVycmVyAgULcHJvZ3JhbU5hbWUFDmNsYWltZXJBZGRyZXNzAAAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFGtleVVuY2xhaW1lZFJlZmVycmVyAgULcHJvZ3JhbU5hbWUFDmNsYWltZXJBZGRyZXNzAAAJARJrZXlDbGFpbWVkUmVmZXJyZXICBQtwcm9ncmFtTmFtZQUOY2xhaW1lckFkZHJlc3MJARRrZXlVbmNsYWltZWRSZWZlcnJlcgIFC3Byb2dyYW1OYW1lBQ5jbGFpbWVyQWRkcmVzcwkBD2tleUNsYWltSGlzdG9yeQQFC3Byb2dyYW1OYW1lBQ5jbGFpbWVyQWRkcmVzcwkA2AQBCAUBaQ10cmFuc2FjdGlvbklkAg1jbGFpbVJlZmVycmVyBA5jbGFpbWVyQ2xhaW1lZAgFCyR0MDQ3OTQ1NzUzAl8xBBBjbGFpbWVyVW5jbGFpbWVkCAULJHQwNDc5NDU3NTMCXzIECmtleUNsYWltZWQIBQskdDA0Nzk0NTc1MwJfMwQMa2V5VW5jbGFpbWVkCAULJHQwNDc5NDU3NTMCXzQED2NsYWltSGlzdG9yeUtleQgFCyR0MDQ3OTQ1NzUzAl81BAxjbGFpbWVkVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBD2tleUNsYWltZWRUb3RhbAEFC3Byb2dyYW1OYW1lAAAEEHRyZWFzdXJ5Q29udHJhY3QJAQV2YWx1ZQEJAKYIAQkBBXZhbHVlAQkAoggBCQETa2V5VHJlYXN1cnlDb250cmFjdAEFC3Byb2dyYW1OYW1lBA1yZXdhcmRBc3NldElkCQDZBAEJAQV2YWx1ZQEJAKIIAQkBEGtleVJld2FyZEFzc2V0SWQBBQtwcm9ncmFtTmFtZQQTY2xhaW1lZFRvdGFsQWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEWa2V5Q2xhaW1lZFRvdGFsQWRkcmVzcwEFDmNsYWltZXJBZGRyZXNzAAAEFXVuY2xhaW1lZFRvdGFsQWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEYa2V5VW5jbGFpbWVkVG90YWxBZGRyZXNzAQUOY2xhaW1lckFkZHJlc3MAAAMDBRhpc0ltcGxlbWVudGF0aW9uQ29udHJhY3QJAAACBRBjbGFpbWVyVW5jbGFpbWVkAAAHCQCUCgIFA25pbAAABA1jaGVja0NhbkNsYWltAwkAZgIFEGNsYWltZXJVbmNsYWltZWQAAAYJAQh0aHJvd0VycgECEG5vdGhpbmcgdG8gY2xhaW0DCQAAAgUNY2hlY2tDYW5DbGFpbQUNY2hlY2tDYW5DbGFpbQQRbmV3Q2xhaW1lckNsYWltZWQJAGQCBQ5jbGFpbWVyQ2xhaW1lZAUQY2xhaW1lclVuY2xhaW1lZAQPbmV3Q2xhaW1lZFRvdGFsCQBkAgUMY2xhaW1lZFRvdGFsBRBjbGFpbWVyVW5jbGFpbWVkBBZuZXdDbGFpbWVkVG90YWxBZGRyZXNzCQBkAgUTY2xhaW1lZFRvdGFsQWRkcmVzcwUQY2xhaW1lclVuY2xhaW1lZAQYbmV3VW5jbGFpbWVkVG90YWxBZGRyZXNzCQBlAgUVdW5jbGFpbWVkVG90YWxBZGRyZXNzBRBjbGFpbWVyVW5jbGFpbWVkBA1iYWxhbmNlQmVmb3JlCQEFdmFsdWUBCQDwBwIFBHRoaXMFDXJld2FyZEFzc2V0SWQDCQAAAgUNYmFsYW5jZUJlZm9yZQUNYmFsYW5jZUJlZm9yZQQDcmVzCQD8BwQFEHRyZWFzdXJ5Q29udHJhY3QCFndpdGhkcmF3UmVmZXJyYWxSZXdhcmQJAMwIAgUQY2xhaW1lclVuY2xhaW1lZAUDbmlsBQNuaWwDCQAAAgUDcmVzBQNyZXMEDGJhbGFuY2VBZnRlcgkBBXZhbHVlAQkA8AcCBQR0aGlzBQ1yZXdhcmRBc3NldElkAwkAAAIFDGJhbGFuY2VBZnRlcgUMYmFsYW5jZUFmdGVyBAtiYWxhbmNlRGlmZgkAZQIFDGJhbGFuY2VBZnRlcgUNYmFsYW5jZUJlZm9yZQMJAAACBQtiYWxhbmNlRGlmZgULYmFsYW5jZURpZmYEDGNoZWNrQmFsYW5jZQMJAAACBQtiYWxhbmNlRGlmZgUQY2xhaW1lclVuY2xhaW1lZAYJAQh0aHJvd0VycgECKWluc3VmZmljaWVudCBiYWxhbmNlIG9uIHJlZmVycmFsIGNvbnRyYWN0AwkAAAIFDGNoZWNrQmFsYW5jZQUMY2hlY2tCYWxhbmNlCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFCmtleUNsYWltZWQFEW5ld0NsYWltZXJDbGFpbWVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxrZXlVbmNsYWltZWQAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBD2tleUNsYWltZWRUb3RhbAEFC3Byb2dyYW1OYW1lBQ9uZXdDbGFpbWVkVG90YWwJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlDbGFpbWVkVG90YWxBZGRyZXNzAQUOY2xhaW1lckFkZHJlc3MFFm5ld0NsYWltZWRUb3RhbEFkZHJlc3MJAMwIAgkBDEludGVnZXJFbnRyeQIJARhrZXlVbmNsYWltZWRUb3RhbEFkZHJlc3MBBQ5jbGFpbWVyQWRkcmVzcwUYbmV3VW5jbGFpbWVkVG90YWxBZGRyZXNzCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFDmNsYWltZXJBZGRyZXNzBRBjbGFpbWVyVW5jbGFpbWVkBQ1yZXdhcmRBc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIFD2NsYWltSGlzdG9yeUtleQkBEmZvcm1hdENsYWltSGlzdG9yeQEFEGNsYWltZXJVbmNsYWltZWQFA25pbAUQY2xhaW1lclVuY2xhaW1lZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARFjbGFpbUJ1bGtJbnRlcm5hbAMHY2xhaW1lcgxwcm9ncmFtTmFtZXMLY3VycmVudEl0ZXIEC2NoZWNrQ2FsbGVyAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwYJAQh0aHJvd0VycgECEXBlcm1pc3Npb24gZGVuaWVkAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgMJAAACBQtjdXJyZW50SXRlcgkAkAMBBQxwcm9ncmFtTmFtZXMFA25pbAQLcHJvZ3JhbU5hbWUJAJEDAgUMcHJvZ3JhbU5hbWVzBQtjdXJyZW50SXRlcgQQcHJvZ3JhbVVuY2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEUa2V5VW5jbGFpbWVkUmVmZXJyZXICBQtwcm9ncmFtTmFtZQUHY2xhaW1lcgAABA9jbGFpbUhpc3RvcnlLZXkJAQ9rZXlDbGFpbUhpc3RvcnkEBQtwcm9ncmFtTmFtZQUHY2xhaW1lcgkA2AQBCAUBaQ10cmFuc2FjdGlvbklkAgljbGFpbUJ1bGsEEWNsYWltQnVsa0ludGVybmFsCQD8BwQFBHRoaXMCEWNsYWltQnVsa0ludGVybmFsCQDMCAIFB2NsYWltZXIJAMwIAgUMcHJvZ3JhbU5hbWVzCQDMCAIJAGQCBQtjdXJyZW50SXRlcgABBQNuaWwFA25pbAMJAAACBRFjbGFpbUJ1bGtJbnRlcm5hbAURY2xhaW1CdWxrSW50ZXJuYWwEEXVuY2xhaW1lZFJlZmVycmVyCQELdmFsdWVPckVsc2UCCQCfCAEJARRrZXlVbmNsYWltZWRSZWZlcnJlcgIFC3Byb2dyYW1OYW1lBQdjbGFpbWVyAAAEBWNsYWltAwkAZgIFEXVuY2xhaW1lZFJlZmVycmVyAAAJAPwHBAUEdGhpcwINY2xhaW1JbnRlcm5hbAkAzAgCBQtwcm9ncmFtTmFtZQkAzAgCBQdjbGFpbWVyCQDMCAIHBQNuaWwFA25pbAUEdW5pdAMJAAACBQVjbGFpbQUFY2xhaW0JAJQKAgUDbmlsCQDMCAIFEWNsYWltQnVsa0ludGVybmFsCQDMCAIFBWNsYWltBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEfaW5jVW5jbGFpbWVkV2l0aFBheW1lbnRJbnRlcm5hbAUOcGF5bWVudEFtb3VudHMLcHJvZ3JhbU5hbWURcmVmZXJyZXJBZGRyZXNzZXMLY3VycmVudEl0ZXIJcmVzQW1vdW50BAtjaGVja0NhbGxlcgMJAAACCAUBaQZjYWxsZXIFBHRoaXMGCQEIdGhyb3dFcnIBAhFwZXJtaXNzaW9uIGRlbmllZAMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEDmFyZ3NDb21wYXJpc29uCQAAAgkAkAMBBQ5wYXltZW50QW1vdW50cwkAkAMBBRFyZWZlcnJlckFkZHJlc3NlcwQFY2hlY2sDBQ5hcmdzQ29tcGFyaXNvbgYJAQh0aHJvd0VycgECH2xpc3RzIGluIGFyZ3MgbXVzdCBiZSBzYW1lIHNpemUDCQAAAgUFY2hlY2sFBWNoZWNrAwkAAAIFC2N1cnJlbnRJdGVyCQCQAwEFDnBheW1lbnRBbW91bnRzCQCUCgIFA25pbAUJcmVzQW1vdW50BA9yZWZlcnJlckFkZHJlc3MJAJEDAgURcmVmZXJyZXJBZGRyZXNzZXMFC2N1cnJlbnRJdGVyBBV1bmNsYWltZWRUb3RhbEFkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGGtleVVuY2xhaW1lZFRvdGFsQWRkcmVzcwEFD3JlZmVycmVyQWRkcmVzcwAABBFyZWZlcnJlclVuY2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEUa2V5VW5jbGFpbWVkUmVmZXJyZXICBQtwcm9ncmFtTmFtZQUPcmVmZXJyZXJBZGRyZXNzAAAEDHJld2FyZHNUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEPa2V5UmV3YXJkc1RvdGFsAQULcHJvZ3JhbU5hbWUAAAQYbmV3VW5jbGFpbWVkVG90YWxBZGRyZXNzCQBkAgUVdW5jbGFpbWVkVG90YWxBZGRyZXNzCQCRAwIFDnBheW1lbnRBbW91bnRzBQtjdXJyZW50SXRlcgQUbmV3UmVmZXJyZXJVbmNsYWltZWQJAGQCBRFyZWZlcnJlclVuY2xhaW1lZAkAkQMCBQ5wYXltZW50QW1vdW50cwULY3VycmVudEl0ZXIEDG5ld1Jlc0Ftb3VudAkAZAIFCXJlc0Ftb3VudAkAkQMCBQ5wYXltZW50QW1vdW50cwULY3VycmVudEl0ZXIEA2ludgkA/AcEBQR0aGlzAh9pbmNVbmNsYWltZWRXaXRoUGF5bWVudEludGVybmFsCQDMCAIFDnBheW1lbnRBbW91bnRzCQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFEXJlZmVycmVyQWRkcmVzc2VzCQDMCAIJAGQCBQtjdXJyZW50SXRlcgABCQDMCAIFDG5ld1Jlc0Ftb3VudAUDbmlsBQNuaWwDCQAAAgUDaW52BQNpbnYEGnVwZGF0ZWRBbGxSZWZlcnJlclByb2dyYW1zCQEZdXBkYXRlQWxsUmVmZXJyYWxQcm9ncmFtcwIFD3JlZmVycmVyQWRkcmVzcwULcHJvZ3JhbU5hbWUJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEYa2V5VW5jbGFpbWVkVG90YWxBZGRyZXNzAQUPcmVmZXJyZXJBZGRyZXNzBRhuZXdVbmNsYWltZWRUb3RhbEFkZHJlc3MJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlVbmNsYWltZWRSZWZlcnJlcgIFC3Byb2dyYW1OYW1lBQ9yZWZlcnJlckFkZHJlc3MFFG5ld1JlZmVycmVyVW5jbGFpbWVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEPa2V5UmV3YXJkc1RvdGFsAQULcHJvZ3JhbU5hbWUJAGQCBQxyZXdhcmRzVG90YWwJAJEDAgUOcGF5bWVudEFtb3VudHMFC2N1cnJlbnRJdGVyBQNuaWwFGnVwZGF0ZWRBbGxSZWZlcnJlclByb2dyYW1zBQNpbnYJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEVY3JlYXRlUmVmZXJyYWxQcm9ncmFtBAtwcm9ncmFtTmFtZRB0cmVhc3VyeUNvbnRyYWN0FmltcGxlbWVudGF0aW9uQ29udHJhY3QNcmV3YXJkQXNzZXRJZAQLY2hlY2tDYWxsZXIJAQttdXN0TWFuYWdlcgEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyBBBjaGVja1Byb2dyYW1OYW1lAwkAAAIJAKAIAQkBDmtleVByb2dyYW1OYW1lAQULcHJvZ3JhbU5hbWUFBHVuaXQGCQEIdGhyb3dFcnIBAhtwcm9ncmFtIG5hbWUgYWxyZWFkeSBleGlzdHMDCQAAAgUQY2hlY2tQcm9ncmFtTmFtZQUQY2hlY2tQcm9ncmFtTmFtZQQScHJvZ3JhbU5hbWVJc1ZhbGlkAwkBASEBCQEIY29udGFpbnMCBQtwcm9ncmFtTmFtZQUJc2VwYXJhdG9yCQEBIQEJAQhjb250YWlucwIFC3Byb2dyYW1OYW1lAgEgBwQSY2hlY2tQcm9ncmFtRXhpc3RzAwUScHJvZ3JhbU5hbWVJc1ZhbGlkBgkBCHRocm93RXJyAQIUaW52YWxpZCBwcm9ncmFtIG5hbWUDCQAAAgUSY2hlY2tQcm9ncmFtRXhpc3RzBRJjaGVja1Byb2dyYW1FeGlzdHMEEGNoZWNrUmV3YXJkQXNzZXQDCQECIT0CCQDsBwEJANkEAQUNcmV3YXJkQXNzZXRJZAUEdW5pdAYJAQh0aHJvd0VycgECF2ludmFsaWQgcmV3YXJkIGFzc2V0IGlkAwkAAAIFEGNoZWNrUmV3YXJkQXNzZXQFEGNoZWNrUmV3YXJkQXNzZXQJAJQKAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBDmtleVByb2dyYW1OYW1lAQULcHJvZ3JhbU5hbWUGCQDMCAIJAQtTdHJpbmdFbnRyeQIJARNrZXlUcmVhc3VyeUNvbnRyYWN0AQULcHJvZ3JhbU5hbWUFEHRyZWFzdXJ5Q29udHJhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkBGWtleUltcGxlbWVudGF0aW9uQ29udHJhY3QBBQtwcm9ncmFtTmFtZQUWaW1wbGVtZW50YXRpb25Db250cmFjdAkAzAgCCQELU3RyaW5nRW50cnkCCQEQa2V5UmV3YXJkQXNzZXRJZAEFC3Byb2dyYW1OYW1lBQ1yZXdhcmRBc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEPa2V5UmV3YXJkc1RvdGFsAQULcHJvZ3JhbU5hbWUAAAUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCmNyZWF0ZVBhaXIEC3Byb2dyYW1OYW1lD3JlZmVycmVyQWRkcmVzcw9yZWZlcnJhbEFkZHJlc3MJc2lnbmF0dXJlBBJjaGVja1Byb2dyYW1FeGlzdHMDCQELdmFsdWVPckVsc2UCCQCgCAEJAQ5rZXlQcm9ncmFtTmFtZQEFC3Byb2dyYW1OYW1lBwYJAQh0aHJvd0VycgECFnByb2dyYW0gZG9lcyBub3QgZXhpc3QDCQAAAgUSY2hlY2tQcm9ncmFtRXhpc3RzBRJjaGVja1Byb2dyYW1FeGlzdHMEIHBhaXJSZWZlcnJlclRvUmVmZXJyYWxFeGlzdENoZWNrAwkAAAIJAKAIAQkBG2tleUV4aXN0c1JlZmVycmVyVG9SZWZlcnJhbAMFC3Byb2dyYW1OYW1lBQ9yZWZlcnJlckFkZHJlc3MFD3JlZmVycmFsQWRkcmVzcwUEdW5pdAYJAQh0aHJvd0VycgECE3BhaXIgYWxyZWFkeSBleGlzdHMDCQAAAgUgcGFpclJlZmVycmVyVG9SZWZlcnJhbEV4aXN0Q2hlY2sFIHBhaXJSZWZlcnJlclRvUmVmZXJyYWxFeGlzdENoZWNrBAlub1JlZlNlbGYDCQECIT0CBQ9yZWZlcnJlckFkZHJlc3MFD3JlZmVycmFsQWRkcmVzcwYJAQh0aHJvd0VycgECFGNhbm5vdCByZWZlciB0byBzZWxmAwkAAAIFCW5vUmVmU2VsZgUJbm9SZWZTZWxmBARwYWlyCQCbAwEJALkJAgkAzAgCBQtwcm9ncmFtTmFtZQkAzAgCBQ9yZWZlcnJlckFkZHJlc3MJAMwIAgUPcmVmZXJyYWxBZGRyZXNzBQNuaWwCAToEEGJhY2tlbmRQdWJsaWNLZXkJANkEAQkBBXZhbHVlAQkAoggBBRNrZXlCYWNrZW5kUHVibGljS2V5BBF2YWxpZGF0ZVNpZ25hdHVyZQMJAPQDAwUEcGFpcgUJc2lnbmF0dXJlBRBiYWNrZW5kUHVibGljS2V5BgkBCHRocm93RXJyAQINYmFkIHNpZ25hdHVyZQMJAAACBRF2YWxpZGF0ZVNpZ25hdHVyZQURdmFsaWRhdGVTaWduYXR1cmUEEnRvdGFsUmVmZXJyYWxDb3VudAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEVa2V5VG90YWxSZWZlcnJhbENvdW50AgULcHJvZ3JhbU5hbWUFD3JlZmVycmVyQWRkcmVzcwAABBVuZXdUb3RhbFJlZmVycmFsQ291bnQJAGQCBRJ0b3RhbFJlZmVycmFsQ291bnQAAQQadXBkYXRlZEFsbFJlZmVycmVyUHJvZ3JhbXMJARl1cGRhdGVBbGxSZWZlcnJhbFByb2dyYW1zAgUPcmVmZXJyZXJBZGRyZXNzBQtwcm9ncmFtTmFtZQQadXBkYXRlZEFsbFJlZmVycmFsUHJvZ3JhbXMJARl1cGRhdGVBbGxSZWZlcnJhbFByb2dyYW1zAgUPcmVmZXJyYWxBZGRyZXNzBQtwcm9ncmFtTmFtZQkAlAoCCQDOCAIJAM4IAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBG2tleUV4aXN0c1JlZmVycmVyVG9SZWZlcnJhbAMFC3Byb2dyYW1OYW1lBQ9yZWZlcnJlckFkZHJlc3MFD3JlZmVycmFsQWRkcmVzcwYJAMwIAgkBDEludGVnZXJFbnRyeQIJARVrZXlUb3RhbFJlZmVycmFsQ291bnQCBQtwcm9ncmFtTmFtZQUPcmVmZXJyZXJBZGRyZXNzBRVuZXdUb3RhbFJlZmVycmFsQ291bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBC2tleVJlZmVycmVyAgULcHJvZ3JhbU5hbWUFD3JlZmVycmFsQWRkcmVzcwUPcmVmZXJyZXJBZGRyZXNzBQNuaWwFGnVwZGF0ZWRBbGxSZWZlcnJlclByb2dyYW1zBRp1cGRhdGVkQWxsUmVmZXJyYWxQcm9ncmFtcwUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARZ1cGRhdGVSZWZlcnJhbEFjdGl2aXR5Awtwcm9ncmFtTmFtZQ9yZWZlcnJhbEFkZHJlc3MIaXNBY3RpdmUEFmltcGxlbWVudGF0aW9uQ29udHJhY3QJAQV2YWx1ZQEJAKIIAQkBGWtleUltcGxlbWVudGF0aW9uQ29udHJhY3QBBQtwcm9ncmFtTmFtZQQQaXNSZWZlcnJhbEFjdGl2ZQkBAiE9AgkAoAgBCQETa2V5SXNSZWZlcnJhbEFjdGl2ZQIFC3Byb2dyYW1OYW1lBQ9yZWZlcnJhbEFkZHJlc3MFBHVuaXQED3JlZmVycmVyQWRkcmVzcwkBBXZhbHVlAQkAoggBCQELa2V5UmVmZXJyZXICBQtwcm9ncmFtTmFtZQUPcmVmZXJyYWxBZGRyZXNzBAtjaGVja0NhbGxlcgMJAAACCQClCAEIBQFpBmNhbGxlcgUWaW1wbGVtZW50YXRpb25Db250cmFjdAYJAQh0aHJvd0VycgECEXBlcm1pc3Npb24gZGVuaWVkAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQGdXBkYXRlAwkAAAIFEGlzUmVmZXJyYWxBY3RpdmUFCGlzQWN0aXZlCQCUCgIFA25pbAUEdW5pdAQGdXBkYXRlAwkAAAIFCGlzQWN0aXZlBgQWbmV3QWN0aXZlUmVmZXJyYWxDb3VudAkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFmtleUFjdGl2ZVJlZmVycmFsQ291bnQCBQtwcm9ncmFtTmFtZQUPcmVmZXJyZXJBZGRyZXNzAAAAAQkAlAoCCQDMCAIJAQxCb29sZWFuRW50cnkCCQETa2V5SXNSZWZlcnJhbEFjdGl2ZQIFC3Byb2dyYW1OYW1lBQ9yZWZlcnJhbEFkZHJlc3MGCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5QWN0aXZlUmVmZXJyYWxDb3VudAIFC3Byb2dyYW1OYW1lBQ9yZWZlcnJlckFkZHJlc3MFFm5ld0FjdGl2ZVJlZmVycmFsQ291bnQFA25pbAUEdW5pdAQWbmV3QWN0aXZlUmVmZXJyYWxDb3VudAkAZQIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFmtleUFjdGl2ZVJlZmVycmFsQ291bnQCBQtwcm9ncmFtTmFtZQUPcmVmZXJyZXJBZGRyZXNzAAAAAQkAlAoCCQDMCAIJAQtEZWxldGVFbnRyeQEJARNrZXlJc1JlZmVycmFsQWN0aXZlAgULcHJvZ3JhbU5hbWUFD3JlZmVycmFsQWRkcmVzcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleUFjdGl2ZVJlZmVycmFsQ291bnQCBQtwcm9ncmFtTmFtZQUPcmVmZXJyZXJBZGRyZXNzBRZuZXdBY3RpdmVSZWZlcnJhbENvdW50BQNuaWwFBHVuaXQFBnVwZGF0ZQUGdXBkYXRlCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDGluY1VuY2xhaW1lZAQLcHJvZ3JhbU5hbWUPcmVmZXJyYWxBZGRyZXNzDnJlZmVycmVyUmV3YXJkDnJlZmVycmFsUmV3YXJkBBZpbXBsZW1lbnRhdGlvbkNvbnRyYWN0CQEFdmFsdWUBCQCiCAEJARlrZXlJbXBsZW1lbnRhdGlvbkNvbnRyYWN0AQULcHJvZ3JhbU5hbWUED3JlZmVycmVyQWRkcmVzcwkBBXZhbHVlAQkAoggBCQELa2V5UmVmZXJyZXICBQtwcm9ncmFtTmFtZQUPcmVmZXJyYWxBZGRyZXNzBAtjaGVja0NhbGxlcgMJAAACCQClCAEIBQFpBmNhbGxlcgUWaW1wbGVtZW50YXRpb25Db250cmFjdAYJAQh0aHJvd0VycgECEXBlcm1pc3Npb24gZGVuaWVkAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQMY2hlY2tQcm9ncmFtAwkAAAIFC3Byb2dyYW1OYW1lAgZ3eGxvY2sGCQEIdGhyb3dFcnIBAg9pbnZhbGlkIHByb2dyYW0DCQAAAgUMY2hlY2tQcm9ncmFtBQxjaGVja1Byb2dyYW0EFmNoZWNrUmVmZXJyZXJJblByb2dyYW0DCQEIY29udGFpbnMCCQELdmFsdWVPckVsc2UCCQCiCAEJARZrZXlBbGxSZWZlcnJhbFByb2dyYW1zAQUPcmVmZXJyZXJBZGRyZXNzAgAFC3Byb2dyYW1OYW1lBgkBCHRocm93RXJyAQkArAICCQCsAgIJAKwCAgIYcmVmZXJyZXIgbm90IGluIHByb2dyYW09BQtwcm9ncmFtTmFtZQIGIGFkZHI9BQ9yZWZlcnJlckFkZHJlc3MDCQAAAgUWY2hlY2tSZWZlcnJlckluUHJvZ3JhbQUWY2hlY2tSZWZlcnJlckluUHJvZ3JhbQQWY2hlY2tSZWZlcnJhbEluUHJvZ3JhbQMJAQhjb250YWlucwIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBFmtleUFsbFJlZmVycmFsUHJvZ3JhbXMBBQ9yZWZlcnJhbEFkZHJlc3MCAAULcHJvZ3JhbU5hbWUGCQEIdGhyb3dFcnIBCQCsAgIJAKwCAgkArAICAhhyZWZlcnJhbCBub3QgaW4gcHJvZ3JhbT0FC3Byb2dyYW1OYW1lAgYgYWRkcj0FD3JlZmVycmFsQWRkcmVzcwMJAAACBRZjaGVja1JlZmVycmFsSW5Qcm9ncmFtBRZjaGVja1JlZmVycmFsSW5Qcm9ncmFtBBZ1bmNsYWltZWRUb3RhbFJlZmVycmVyCQELdmFsdWVPckVsc2UCCQCfCAEJARhrZXlVbmNsYWltZWRUb3RhbEFkZHJlc3MBBQ9yZWZlcnJlckFkZHJlc3MAAAQRcmVmZXJyZXJVbmNsYWltZWQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFGtleVVuY2xhaW1lZFJlZmVycmVyAgULcHJvZ3JhbU5hbWUFD3JlZmVycmVyQWRkcmVzcwAABBZ1bmNsYWltZWRUb3RhbFJlZmVycmFsCQELdmFsdWVPckVsc2UCCQCfCAEJARhrZXlVbmNsYWltZWRUb3RhbEFkZHJlc3MBBQ9yZWZlcnJhbEFkZHJlc3MAAAQRcmVmZXJyYWxVbmNsYWltZWQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFGtleVVuY2xhaW1lZFJlZmVycmFsAgULcHJvZ3JhbU5hbWUFD3JlZmVycmFsQWRkcmVzcwAABAxyZXdhcmRzVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBD2tleVJld2FyZHNUb3RhbAEFC3Byb2dyYW1OYW1lAAAEGW5ld1VuY2xhaW1lZFRvdGFsUmVmZXJyZXIJAGQCBRZ1bmNsYWltZWRUb3RhbFJlZmVycmVyBQ5yZWZlcnJlclJld2FyZAQUbmV3UmVmZXJyZXJVbmNsYWltZWQJAGQCBRFyZWZlcnJlclVuY2xhaW1lZAUOcmVmZXJyZXJSZXdhcmQEGW5ld1VuY2xhaW1lZFRvdGFsUmVmZXJyYWwJAGQCBRZ1bmNsYWltZWRUb3RhbFJlZmVycmFsBQ5yZWZlcnJhbFJld2FyZAQUbmV3UmVmZXJyYWxVbmNsYWltZWQJAGQCBRFyZWZlcnJhbFVuY2xhaW1lZAUOcmVmZXJyYWxSZXdhcmQJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGGtleVVuY2xhaW1lZFRvdGFsQWRkcmVzcwEFD3JlZmVycmVyQWRkcmVzcwUZbmV3VW5jbGFpbWVkVG90YWxSZWZlcnJlcgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGGtleVVuY2xhaW1lZFRvdGFsQWRkcmVzcwEFD3JlZmVycmFsQWRkcmVzcwUZbmV3VW5jbGFpbWVkVG90YWxSZWZlcnJhbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleVVuY2xhaW1lZFJlZmVycmVyAgULcHJvZ3JhbU5hbWUFD3JlZmVycmVyQWRkcmVzcwUUbmV3UmVmZXJyZXJVbmNsYWltZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlVbmNsYWltZWRSZWZlcnJhbAIFC3Byb2dyYW1OYW1lBQ9yZWZlcnJhbEFkZHJlc3MFFG5ld1JlZmVycmFsVW5jbGFpbWVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEPa2V5UmV3YXJkc1RvdGFsAQULcHJvZ3JhbU5hbWUJAGQCCQBkAgUMcmV3YXJkc1RvdGFsBQ5yZWZlcnJlclJld2FyZAUOcmVmZXJyYWxSZXdhcmQFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARdpbmNVbmNsYWltZWRXaXRoUGF5bWVudAILcHJvZ3JhbU5hbWURcmVmZXJyZXJBZGRyZXNzZXMEDGNoZWNrUHJvZ3JhbQMJAAACBQtwcm9ncmFtTmFtZQIJd3hTcG90RmVlBgkBCHRocm93RXJyAQIPaW52YWxpZCBwcm9ncmFtAwkAAAIFDGNoZWNrUHJvZ3JhbQUMY2hlY2tQcm9ncmFtCgEDbWFwAgVhY2N1bQRuZXh0BAxhc3NldElkQ2hlY2sJAAACCQDYBAEJAQV2YWx1ZQEIBQRuZXh0B2Fzc2V0SWQJAQV2YWx1ZQEJAKIIAQkBEGtleVJld2FyZEFzc2V0SWQBBQtwcm9ncmFtTmFtZQQLYW1vdW50Q2hlY2sDBQxhc3NldElkQ2hlY2sGCQEIdGhyb3dFcnIBAhBpbnZhbGlkIGFzc2V0IGlkAwkAAAIFC2Ftb3VudENoZWNrBQthbW91bnRDaGVjawkAzQgCBQVhY2N1bQgFBG5leHQGYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAhwYXltZW50cwoAAiRsCAUBaQhwYXltZW50cwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEDbWFwAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKBAlyZXNBbW91bnQKAAFACQD8BwQFBHRoaXMCH2luY1VuY2xhaW1lZFdpdGhQYXltZW50SW50ZXJuYWwJAMwIAgUIcGF5bWVudHMJAMwIAgULcHJvZ3JhbU5hbWUJAMwIAgURcmVmZXJyZXJBZGRyZXNzZXMJAMwIAgAACQDMCAIAAAUDbmlsBQNuaWwDCQABAgUBQAIDSW50BQFACQACAQkArAICCQADAQUBQAIYIGNvdWxkbid0IGJlIGNhc3QgdG8gSW50AwkAAAIFCXJlc0Ftb3VudAUJcmVzQW1vdW50BBB0cmVhc3VyeUNvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBCQCiCAEJARNrZXlUcmVhc3VyeUNvbnRyYWN0AQULcHJvZ3JhbU5hbWUEDXJld2FyZEFzc2V0SWQJANkEAQkBBXZhbHVlAQkAoggBCQEQa2V5UmV3YXJkQXNzZXRJZAEFC3Byb2dyYW1OYW1lCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFEHRyZWFzdXJ5Q29udHJhY3QFCXJlc0Ftb3VudAUNcmV3YXJkQXNzZXRJZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBBWNsYWltAQtwcm9ncmFtTmFtZQQSY2hlY2tQcm9ncmFtRXhpc3RzAwkBC3ZhbHVlT3JFbHNlAgkAoAgBCQEOa2V5UHJvZ3JhbU5hbWUBBQtwcm9ncmFtTmFtZQcGCQEIdGhyb3dFcnIBAhZwcm9ncmFtIGRvZXMgbm90IGV4aXN0AwkAAAIFEmNoZWNrUHJvZ3JhbUV4aXN0cwUSY2hlY2tQcm9ncmFtRXhpc3RzBBhpc0ltcGxlbWVudGF0aW9uQ29udHJhY3QJAAACCQClCAEIBQFpBmNhbGxlcgkBBXZhbHVlAQkAoggBCQEZa2V5SW1wbGVtZW50YXRpb25Db250cmFjdAEFC3Byb2dyYW1OYW1lBA5jbGFpbWVyQWRkcmVzcwMFGGlzSW1wbGVtZW50YXRpb25Db250cmFjdAkApQgBCAUBaQxvcmlnaW5DYWxsZXIJAKUIAQgFAWkGY2FsbGVyBA1jbGFpbUludGVybmFsCQD8BwQFBHRoaXMCDWNsYWltSW50ZXJuYWwJAMwIAgULcHJvZ3JhbU5hbWUJAMwIAgUOY2xhaW1lckFkZHJlc3MJAMwIAgUYaXNJbXBsZW1lbnRhdGlvbkNvbnRyYWN0BQNuaWwFA25pbAMJAAACBQ1jbGFpbUludGVybmFsBQ1jbGFpbUludGVybmFsCQCUCgIFA25pbAUNY2xhaW1JbnRlcm5hbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQljbGFpbUJ1bGsABA1jYWxsZXJBZGRyZXNzCQClCAEIBQFpBmNhbGxlcgQRY2FsbGVyUHJvZ3JhbXNTdHIJAKIIAQkBFmtleUFsbFJlZmVycmFsUHJvZ3JhbXMBCQClCAEIBQFpBmNhbGxlcgQOcHJvZ3JhbXNFeGlzdHMDCQEJaXNEZWZpbmVkAQURY2FsbGVyUHJvZ3JhbXNTdHIGCQEIdGhyb3dFcnIBAhRubyByZWZlcnJhbCBwcm9ncmFtcwMJAAACBQ5wcm9ncmFtc0V4aXN0cwUOcHJvZ3JhbXNFeGlzdHMEDmNhbGxlclByb2dyYW1zCQC1CQIJAQV2YWx1ZQEFEWNhbGxlclByb2dyYW1zU3RyAgJfXwQJYnVsa0NsYWltCQD8BwQFBHRoaXMCEWNsYWltQnVsa0ludGVybmFsCQDMCAIFDWNhbGxlckFkZHJlc3MJAMwIAgUOY2FsbGVyUHJvZ3JhbXMJAMwIAgAABQNuaWwFA25pbAMJAAACBQlidWxrQ2xhaW0FCWJ1bGtDbGFpbQkAlAoCBQNuaWwFCWJ1bGtDbGFpbQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ1jbGFpbVJFQURPTkxZAgtwcm9ncmFtTmFtZQt1c2VyQWRkcmVzcwQOY2xhaW1lckNsYWltZWQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEmtleUNsYWltZWRSZWZlcnJlcgIFC3Byb2dyYW1OYW1lBQt1c2VyQWRkcmVzcwAABBBjbGFpbWVyVW5jbGFpbWVkCQELdmFsdWVPckVsc2UCCQCfCAEJARRrZXlVbmNsYWltZWRSZWZlcnJlcgIFC3Byb2dyYW1OYW1lBQt1c2VyQWRkcmVzcwAACQCUCgIFA25pbAkAzAgCBRBjbGFpbWVyVW5jbGFpbWVkCQDMCAIFDmNsYWltZXJDbGFpbWVkBQNuaWwBaQERY2xhaW1CdWxrUkVBRE9OTFkBB2NsYWltZXIEE2NsYWltZWRUb3RhbEFkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFmtleUNsYWltZWRUb3RhbEFkZHJlc3MBBQdjbGFpbWVyAAAEFXVuY2xhaW1lZFRvdGFsQWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEYa2V5VW5jbGFpbWVkVG90YWxBZGRyZXNzAQUHY2xhaW1lcgAACQCUCgIFA25pbAkAzAgCBRV1bmNsYWltZWRUb3RhbEFkZHJlc3MJAMwIAgUTY2xhaW1lZFRvdGFsQWRkcmVzcwUDbmlsAWkBDHNldFRvdGFsS2V5cwILcHJvZ3JhbU5hbWUHYWRkcmVzcwQPY2xhaW1lZFJlZmVycmVyCQELdmFsdWVPckVsc2UCCQCfCAEJARJrZXlDbGFpbWVkUmVmZXJyZXICBQtwcm9ncmFtTmFtZQUHYWRkcmVzcwAABA9jbGFpbWVkUmVmZXJyYWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEmtleUNsYWltZWRSZWZlcnJhbAIFC3Byb2dyYW1OYW1lBQdhZGRyZXNzAAAEEXVuY2xhaW1lZFJlZmVycmVyCQELdmFsdWVPckVsc2UCCQCfCAEJARRrZXlVbmNsYWltZWRSZWZlcnJlcgIFC3Byb2dyYW1OYW1lBQdhZGRyZXNzAAAEEXVuY2xhaW1lZFJlZmVycmFsCQELdmFsdWVPckVsc2UCCQCfCAEJARRrZXlVbmNsYWltZWRSZWZlcnJhbAIFC3Byb2dyYW1OYW1lBQdhZGRyZXNzAAAEE2NsYWltZWRUb3RhbEFkZHJlc3MJAGQCBQ9jbGFpbWVkUmVmZXJyZXIFD2NsYWltZWRSZWZlcnJhbAQVdW5jbGFpbWVkVG90YWxBZGRyZXNzCQBkAgURdW5jbGFpbWVkUmVmZXJyZXIFEXVuY2xhaW1lZFJlZmVycmFsCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlDbGFpbWVkVG90YWxBZGRyZXNzAQUHYWRkcmVzcwUTY2xhaW1lZFRvdGFsQWRkcmVzcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGGtleVVuY2xhaW1lZFRvdGFsQWRkcmVzcwEFB2FkZHJlc3MFFXVuY2xhaW1lZFRvdGFsQWRkcmVzcwUDbmlsBQR1bml0AWkBCnNldE1hbmFnZXIBF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5BAtjaGVja0NhbGxlcgkBC211c3RNYW5hZ2VyAQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEFWNoZWNrTWFuYWdlclB1YmxpY0tleQkA2QQBBRdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQMJAAACBRVjaGVja01hbmFnZXJQdWJsaWNLZXkFFWNoZWNrTWFuYWdlclB1YmxpY0tleQkAzAgCCQELU3RyaW5nRW50cnkCCQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkABRdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDmNvbmZpcm1NYW5hZ2VyAAQCcG0JAR1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdAAEBWhhc1BNAwkBCWlzRGVmaW5lZAEFAnBtBgkBCHRocm93RXJyAQISbm8gcGVuZGluZyBtYW5hZ2VyAwkAAAIFBWhhc1BNBQVoYXNQTQQHY2hlY2tQTQMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAQV2YWx1ZQEFAnBtBgkBCHRocm93RXJyAQIbeW91IGFyZSBub3QgcGVuZGluZyBtYW5hZ2VyAwkAAAIFB2NoZWNrUE0FB2NoZWNrUE0JAMwIAgkBC1N0cmluZ0VudHJ5AgkBE2tleU1hbmFnZXJQdWJsaWNLZXkACQDYBAEJAQV2YWx1ZQEFAnBtCQDMCAIJAQtEZWxldGVFbnRyeQEJARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgECdHgBBnZlcmlmeQAED3RhcmdldFB1YmxpY0tleQQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwBQJwawMJAAECBQckbWF0Y2gwAgRVbml0CAUCdHgPc2VuZGVyUHVibGljS2V5CQACAQILTWF0Y2ggZXJyb3IJAPQDAwgFAnR4CWJvZHlCeXRlcwkAkQMCCAUCdHgGcHJvb2ZzAAAFD3RhcmdldFB1YmxpY0tleZZaMrc=", "height": 2498072, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: B8dAH8fnSkvMqf2m7YJQ7mkgHLmcS7WqmNKgg5BHJkLy Next: D69PP3Wgnyy7K16MGewBA13tMKZbDTK3GhhwsrzzCQeF Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 6 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let separator = "__"
5+
6+func keyWxAssetId () = makeString(["%s", "wxAssetId"], separator)
7+
8+
9+let keyBackendPublicKey = makeString(["%s", "backendPublicKey"], separator)
10+
11+func keyExistsReferrerToReferral (programName,referrerAddress,referralAddress) = makeString(["%s%s%s%s", "existsReferrerToReferral", programName, referrerAddress, referralAddress], separator)
12+
13+
14+func keyClaimedReferrer (programName,claimerAddress) = makeString(["%s%s%s", "claimedReferrer", programName, claimerAddress], separator)
15+
16+
17+func keyClaimedReferral (programName,claimerAddress) = makeString(["%s%s%s", "claimedReferral", programName, claimerAddress], separator)
18+
19+
20+func keyUnclaimedReferrer (programName,claimerAddress) = makeString(["%s%s%s", "unclaimedReferrer", programName, claimerAddress], separator)
21+
22+
23+func keyUnclaimedReferral (programName,claimerAddress) = makeString(["%s%s%s", "unclaimedReferral", programName, claimerAddress], separator)
24+
25+
26+func keyReferrer (programName,referralAddress) = makeString(["%s%s%s", "referrer", programName, referralAddress], separator)
27+
28+
29+func keyProgramName (programName) = makeString(["%s%s", "programName", programName], separator)
30+
31+
32+func keyTotalReferralCount (programName,referrerAddress) = makeString(["%s%s%s", "totalReferralCount", programName, referrerAddress], separator)
33+
34+
35+func keyActiveReferralCount (programName,referrerAddress) = makeString(["%s%s%s", "activeReferralCount", programName, referrerAddress], separator)
36+
37+
38+func keyIsReferralActive (programName,referralAddress) = makeString(["%s%s%s", "activeReferral", programName, referralAddress], separator)
39+
40+
41+func keyClaimedTotalAddress (address) = makeString(["%s%s", "claimedTotalAddress", address], separator)
42+
43+
44+func keyUnclaimedTotalAddress (address) = makeString(["%s%s", "unclaimedTotalAddress", address], separator)
45+
46+
47+func keyClaimedTotal (programName) = makeString(["%s%s", "claimedTotal", programName], separator)
48+
49+
50+func keyRewardsTotal (programName) = makeString(["%s%s", "rewardsTotal", programName], separator)
51+
52+
53+func keyRewardAssetId (programName) = makeString(["%s%s", "rewardAssetId", programName], separator)
54+
55+
56+func keyTreasuryContract (programName) = makeString(["%s%s", "treasuryContract", programName], separator)
57+
58+
59+func keyImplementationContract (programName) = makeString(["%s%s", "implementationContract", programName], separator)
60+
61+
62+func keyAllReferralPrograms (address) = makeString(["%s%s", "allReferralPrograms", address], separator)
63+
64+
65+func keyManagerPublicKey () = "%s__managerPublicKey"
66+
67+
68+func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
69+
70+
71+func keyClaimHistory (programName,userAddress,transactionId,type) = makeString(["%s%s%s%s%s", "history", type, programName, userAddress, transactionId], separator)
72+
73+
74+func formatClaimHistory (amount) = makeString(["%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount)], separator)
75+
76+
77+func throwErr (msg) = throw(makeString(["referral.ride:", msg], " "))
78+
79+
80+func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
81+ case s: String =>
82+ fromBase58String(s)
83+ case _: Unit =>
84+ unit
85+ case _ =>
86+ throw("Match error")
87+}
88+
89+
90+func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
91+ case s: String =>
92+ fromBase58String(s)
93+ case _: Unit =>
94+ unit
95+ case _ =>
96+ throw("Match error")
97+}
98+
99+
100+func mustManager (i) = {
101+ let pd = throwErr("permission denied")
102+ match managerPublicKeyOrUnit() {
103+ case pk: ByteVector =>
104+ if ((i.callerPublicKey == pk))
105+ then true
106+ else pd
107+ case _: Unit =>
108+ if ((i.caller == this))
109+ then true
110+ else pd
111+ case _ =>
112+ throw("Match error")
113+ }
114+ }
115+
116+
117+func updateAllReferralPrograms (address,programName) = {
118+ let allReferralPrograms = valueOrElse(getString(keyAllReferralPrograms(address)), "")
119+ let updatedAllReferralPrograms = if (contains(allReferralPrograms, programName))
120+ then nil
121+ else {
122+ let newAllReferralPrograms = if ((allReferralPrograms == ""))
123+ then programName
124+ else makeString([allReferralPrograms, programName], separator)
125+[StringEntry(keyAllReferralPrograms(address), newAllReferralPrograms)]
126+ }
127+ updatedAllReferralPrograms
128+ }
129+
130+
131+@Callable(i)
132+func claimInternal (programName,claimerAddress,isImplementationContract) = {
133+ let checkProgramExists = if (valueOrElse(getBoolean(keyProgramName(programName)), false))
134+ then true
135+ else throwErr("program does not exist")
136+ if ((checkProgramExists == checkProgramExists))
137+ then {
138+ let $t047945753 = if (isImplementationContract)
139+ then $Tuple5(valueOrElse(getInteger(keyClaimedReferral(programName, claimerAddress)), 0), valueOrElse(getInteger(keyUnclaimedReferral(programName, claimerAddress)), 0), keyClaimedReferral(programName, claimerAddress), keyUnclaimedReferral(programName, claimerAddress), keyClaimHistory(programName, claimerAddress, toBase58String(i.transactionId), "claimReferral"))
140+ else $Tuple5(valueOrElse(getInteger(keyClaimedReferrer(programName, claimerAddress)), 0), valueOrElse(getInteger(keyUnclaimedReferrer(programName, claimerAddress)), 0), keyClaimedReferrer(programName, claimerAddress), keyUnclaimedReferrer(programName, claimerAddress), keyClaimHistory(programName, claimerAddress, toBase58String(i.transactionId), "claimReferrer"))
141+ let claimerClaimed = $t047945753._1
142+ let claimerUnclaimed = $t047945753._2
143+ let keyClaimed = $t047945753._3
144+ let keyUnclaimed = $t047945753._4
145+ let claimHistoryKey = $t047945753._5
146+ let claimedTotal = valueOrElse(getInteger(keyClaimedTotal(programName)), 0)
147+ let treasuryContract = value(addressFromString(value(getString(keyTreasuryContract(programName)))))
148+ let rewardAssetId = fromBase58String(value(getString(keyRewardAssetId(programName))))
149+ let claimedTotalAddress = valueOrElse(getInteger(keyClaimedTotalAddress(claimerAddress)), 0)
150+ let unclaimedTotalAddress = valueOrElse(getInteger(keyUnclaimedTotalAddress(claimerAddress)), 0)
151+ if (if (isImplementationContract)
152+ then (claimerUnclaimed == 0)
153+ else false)
154+ then $Tuple2(nil, 0)
155+ else {
156+ let checkCanClaim = if ((claimerUnclaimed > 0))
157+ then true
158+ else throwErr("nothing to claim")
159+ if ((checkCanClaim == checkCanClaim))
160+ then {
161+ let newClaimerClaimed = (claimerClaimed + claimerUnclaimed)
162+ let newClaimedTotal = (claimedTotal + claimerUnclaimed)
163+ let newClaimedTotalAddress = (claimedTotalAddress + claimerUnclaimed)
164+ let newUnclaimedTotalAddress = (unclaimedTotalAddress - claimerUnclaimed)
165+ let balanceBefore = value(assetBalance(this, rewardAssetId))
166+ if ((balanceBefore == balanceBefore))
167+ then {
168+ let res = invoke(treasuryContract, "withdrawReferralReward", [claimerUnclaimed], nil)
169+ if ((res == res))
170+ then {
171+ let balanceAfter = value(assetBalance(this, rewardAssetId))
172+ if ((balanceAfter == balanceAfter))
173+ then {
174+ let balanceDiff = (balanceAfter - balanceBefore)
175+ if ((balanceDiff == balanceDiff))
176+ then {
177+ let checkBalance = if ((balanceDiff == claimerUnclaimed))
178+ then true
179+ else throwErr("insufficient balance on referral contract")
180+ if ((checkBalance == checkBalance))
181+ then $Tuple2([IntegerEntry(keyClaimed, newClaimerClaimed), IntegerEntry(keyUnclaimed, 0), IntegerEntry(keyClaimedTotal(programName), newClaimedTotal), IntegerEntry(keyClaimedTotalAddress(claimerAddress), newClaimedTotalAddress), IntegerEntry(keyUnclaimedTotalAddress(claimerAddress), newUnclaimedTotalAddress), ScriptTransfer(addressFromStringValue(claimerAddress), claimerUnclaimed, rewardAssetId), StringEntry(claimHistoryKey, formatClaimHistory(claimerUnclaimed))], claimerUnclaimed)
182+ else throw("Strict value is not equal to itself.")
183+ }
184+ else throw("Strict value is not equal to itself.")
185+ }
186+ else throw("Strict value is not equal to itself.")
187+ }
188+ else throw("Strict value is not equal to itself.")
189+ }
190+ else throw("Strict value is not equal to itself.")
191+ }
192+ else throw("Strict value is not equal to itself.")
193+ }
194+ }
195+ else throw("Strict value is not equal to itself.")
196+ }
197+
198+
199+
200+@Callable(i)
201+func claimBulkInternal (claimer,programNames,currentIter) = {
202+ let checkCaller = if ((i.caller == this))
203+ then true
204+ else throwErr("permission denied")
205+ if ((checkCaller == checkCaller))
206+ then if ((currentIter == size(programNames)))
207+ then nil
208+ else {
209+ let programName = programNames[currentIter]
210+ let programUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, claimer)), 0)
211+ let claimHistoryKey = keyClaimHistory(programName, claimer, toBase58String(i.transactionId), "claimBulk")
212+ let claimBulkInternal = invoke(this, "claimBulkInternal", [claimer, programNames, (currentIter + 1)], nil)
213+ if ((claimBulkInternal == claimBulkInternal))
214+ then {
215+ let unclaimedReferrer = valueOrElse(getInteger(keyUnclaimedReferrer(programName, claimer)), 0)
216+ let claim = if ((unclaimedReferrer > 0))
217+ then invoke(this, "claimInternal", [programName, claimer, false], nil)
218+ else unit
219+ if ((claim == claim))
220+ then $Tuple2(nil, [claimBulkInternal, claim])
221+ else throw("Strict value is not equal to itself.")
222+ }
223+ else throw("Strict value is not equal to itself.")
224+ }
225+ else throw("Strict value is not equal to itself.")
226+ }
227+
228+
229+
230+@Callable(i)
231+func incUnclaimedWithPaymentInternal (paymentAmounts,programName,referrerAddresses,currentIter,resAmount) = {
232+ let checkCaller = if ((i.caller == this))
233+ then true
234+ else throwErr("permission denied")
235+ if ((checkCaller == checkCaller))
236+ then {
237+ let argsComparison = (size(paymentAmounts) == size(referrerAddresses))
238+ let check = if (argsComparison)
239+ then true
240+ else throwErr("lists in args must be same size")
241+ if ((check == check))
242+ then if ((currentIter == size(paymentAmounts)))
243+ then $Tuple2(nil, resAmount)
244+ else {
245+ let referrerAddress = referrerAddresses[currentIter]
246+ let unclaimedTotalAddress = valueOrElse(getInteger(keyUnclaimedTotalAddress(referrerAddress)), 0)
247+ let referrerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, referrerAddress)), 0)
248+ let rewardsTotal = valueOrElse(getInteger(keyRewardsTotal(programName)), 0)
249+ let newUnclaimedTotalAddress = (unclaimedTotalAddress + paymentAmounts[currentIter])
250+ let newReferrerUnclaimed = (referrerUnclaimed + paymentAmounts[currentIter])
251+ let newResAmount = (resAmount + paymentAmounts[currentIter])
252+ let inv = invoke(this, "incUnclaimedWithPaymentInternal", [paymentAmounts, programName, referrerAddresses, (currentIter + 1), newResAmount], nil)
253+ if ((inv == inv))
254+ then {
255+ let updatedAllReferrerPrograms = updateAllReferralPrograms(referrerAddress, programName)
256+ $Tuple2(([IntegerEntry(keyUnclaimedTotalAddress(referrerAddress), newUnclaimedTotalAddress), IntegerEntry(keyUnclaimedReferrer(programName, referrerAddress), newReferrerUnclaimed), IntegerEntry(keyRewardsTotal(programName), (rewardsTotal + paymentAmounts[currentIter]))] ++ updatedAllReferrerPrograms), inv)
257+ }
258+ else throw("Strict value is not equal to itself.")
259+ }
260+ else throw("Strict value is not equal to itself.")
261+ }
262+ else throw("Strict value is not equal to itself.")
263+ }
264+
265+
266+
267+@Callable(i)
268+func createReferralProgram (programName,treasuryContract,implementationContract,rewardAssetId) = {
269+ let checkCaller = mustManager(i)
270+ if ((checkCaller == checkCaller))
271+ then {
272+ let checkProgramName = if ((getBoolean(keyProgramName(programName)) == unit))
273+ then true
274+ else throwErr("program name already exists")
275+ if ((checkProgramName == checkProgramName))
276+ then {
277+ let programNameIsValid = if (!(contains(programName, separator)))
278+ then !(contains(programName, " "))
279+ else false
280+ let checkProgramExists = if (programNameIsValid)
281+ then true
282+ else throwErr("invalid program name")
283+ if ((checkProgramExists == checkProgramExists))
284+ then {
285+ let checkRewardAsset = if ((assetInfo(fromBase58String(rewardAssetId)) != unit))
286+ then true
287+ else throwErr("invalid reward asset id")
288+ if ((checkRewardAsset == checkRewardAsset))
289+ then $Tuple2([BooleanEntry(keyProgramName(programName), true), StringEntry(keyTreasuryContract(programName), treasuryContract), StringEntry(keyImplementationContract(programName), implementationContract), StringEntry(keyRewardAssetId(programName), rewardAssetId), IntegerEntry(keyRewardsTotal(programName), 0)], unit)
290+ else throw("Strict value is not equal to itself.")
291+ }
292+ else throw("Strict value is not equal to itself.")
293+ }
294+ else throw("Strict value is not equal to itself.")
295+ }
296+ else throw("Strict value is not equal to itself.")
297+ }
298+
299+
300+
301+@Callable(i)
302+func createPair (programName,referrerAddress,referralAddress,signature) = {
303+ let checkProgramExists = if (valueOrElse(getBoolean(keyProgramName(programName)), false))
304+ then true
305+ else throwErr("program does not exist")
306+ if ((checkProgramExists == checkProgramExists))
307+ then {
308+ let pairReferrerToReferralExistCheck = if ((getBoolean(keyExistsReferrerToReferral(programName, referrerAddress, referralAddress)) == unit))
309+ then true
310+ else throwErr("pair already exists")
311+ if ((pairReferrerToReferralExistCheck == pairReferrerToReferralExistCheck))
312+ then {
313+ let noRefSelf = if ((referrerAddress != referralAddress))
314+ then true
315+ else throwErr("cannot refer to self")
316+ if ((noRefSelf == noRefSelf))
317+ then {
318+ let pair = toBytes(makeString([programName, referrerAddress, referralAddress], ":"))
319+ let backendPublicKey = fromBase58String(value(getString(keyBackendPublicKey)))
320+ let validateSignature = if (sigVerify(pair, signature, backendPublicKey))
321+ then true
322+ else throwErr("bad signature")
323+ if ((validateSignature == validateSignature))
324+ then {
325+ let totalReferralCount = valueOrElse(getInteger(keyTotalReferralCount(programName, referrerAddress)), 0)
326+ let newTotalReferralCount = (totalReferralCount + 1)
327+ let updatedAllReferrerPrograms = updateAllReferralPrograms(referrerAddress, programName)
328+ let updatedAllReferralPrograms = updateAllReferralPrograms(referralAddress, programName)
329+ $Tuple2((([BooleanEntry(keyExistsReferrerToReferral(programName, referrerAddress, referralAddress), true), IntegerEntry(keyTotalReferralCount(programName, referrerAddress), newTotalReferralCount), StringEntry(keyReferrer(programName, referralAddress), referrerAddress)] ++ updatedAllReferrerPrograms) ++ updatedAllReferralPrograms), unit)
330+ }
331+ else throw("Strict value is not equal to itself.")
332+ }
333+ else throw("Strict value is not equal to itself.")
334+ }
335+ else throw("Strict value is not equal to itself.")
336+ }
337+ else throw("Strict value is not equal to itself.")
338+ }
339+
340+
341+
342+@Callable(i)
343+func updateReferralActivity (programName,referralAddress,isActive) = {
344+ let implementationContract = value(getString(keyImplementationContract(programName)))
345+ let isReferralActive = (getBoolean(keyIsReferralActive(programName, referralAddress)) != unit)
346+ let referrerAddress = value(getString(keyReferrer(programName, referralAddress)))
347+ let checkCaller = if ((toString(i.caller) == implementationContract))
348+ then true
349+ else throwErr("permission denied")
350+ if ((checkCaller == checkCaller))
351+ then {
352+ let update = if ((isReferralActive == isActive))
353+ then $Tuple2(nil, unit)
354+ else {
355+ let update = if ((isActive == true))
356+ then {
357+ let newActiveReferralCount = (valueOrElse(getInteger(keyActiveReferralCount(programName, referrerAddress)), 0) + 1)
358+ $Tuple2([BooleanEntry(keyIsReferralActive(programName, referralAddress), true), IntegerEntry(keyActiveReferralCount(programName, referrerAddress), newActiveReferralCount)], unit)
359+ }
360+ else {
361+ let newActiveReferralCount = (valueOrElse(getInteger(keyActiveReferralCount(programName, referrerAddress)), 0) - 1)
362+ $Tuple2([DeleteEntry(keyIsReferralActive(programName, referralAddress)), IntegerEntry(keyActiveReferralCount(programName, referrerAddress), newActiveReferralCount)], unit)
363+ }
364+ update
365+ }
366+ update
367+ }
368+ else throw("Strict value is not equal to itself.")
369+ }
370+
371+
372+
373+@Callable(i)
374+func incUnclaimed (programName,referralAddress,referrerReward,referralReward) = {
375+ let implementationContract = value(getString(keyImplementationContract(programName)))
376+ let referrerAddress = value(getString(keyReferrer(programName, referralAddress)))
377+ let checkCaller = if ((toString(i.caller) == implementationContract))
378+ then true
379+ else throwErr("permission denied")
380+ if ((checkCaller == checkCaller))
381+ then {
382+ let checkProgram = if ((programName == "wxlock"))
383+ then true
384+ else throwErr("invalid program")
385+ if ((checkProgram == checkProgram))
386+ then {
387+ let checkReferrerInProgram = if (contains(valueOrElse(getString(keyAllReferralPrograms(referrerAddress)), ""), programName))
388+ then true
389+ else throwErr(((("referrer not in program=" + programName) + " addr=") + referrerAddress))
390+ if ((checkReferrerInProgram == checkReferrerInProgram))
391+ then {
392+ let checkReferralInProgram = if (contains(valueOrElse(getString(keyAllReferralPrograms(referralAddress)), ""), programName))
393+ then true
394+ else throwErr(((("referral not in program=" + programName) + " addr=") + referralAddress))
395+ if ((checkReferralInProgram == checkReferralInProgram))
396+ then {
397+ let unclaimedTotalReferrer = valueOrElse(getInteger(keyUnclaimedTotalAddress(referrerAddress)), 0)
398+ let referrerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, referrerAddress)), 0)
399+ let unclaimedTotalReferral = valueOrElse(getInteger(keyUnclaimedTotalAddress(referralAddress)), 0)
400+ let referralUnclaimed = valueOrElse(getInteger(keyUnclaimedReferral(programName, referralAddress)), 0)
401+ let rewardsTotal = valueOrElse(getInteger(keyRewardsTotal(programName)), 0)
402+ let newUnclaimedTotalReferrer = (unclaimedTotalReferrer + referrerReward)
403+ let newReferrerUnclaimed = (referrerUnclaimed + referrerReward)
404+ let newUnclaimedTotalReferral = (unclaimedTotalReferral + referralReward)
405+ let newReferralUnclaimed = (referralUnclaimed + referralReward)
406+ $Tuple2([IntegerEntry(keyUnclaimedTotalAddress(referrerAddress), newUnclaimedTotalReferrer), IntegerEntry(keyUnclaimedTotalAddress(referralAddress), newUnclaimedTotalReferral), IntegerEntry(keyUnclaimedReferrer(programName, referrerAddress), newReferrerUnclaimed), IntegerEntry(keyUnclaimedReferral(programName, referralAddress), newReferralUnclaimed), IntegerEntry(keyRewardsTotal(programName), ((rewardsTotal + referrerReward) + referralReward))], unit)
407+ }
408+ else throw("Strict value is not equal to itself.")
409+ }
410+ else throw("Strict value is not equal to itself.")
411+ }
412+ else throw("Strict value is not equal to itself.")
413+ }
414+ else throw("Strict value is not equal to itself.")
415+ }
416+
417+
418+
419+@Callable(i)
420+func incUnclaimedWithPayment (programName,referrerAddresses) = {
421+ let checkProgram = if ((programName == "wxSpotFee"))
422+ then true
423+ else throwErr("invalid program")
424+ if ((checkProgram == checkProgram))
425+ then {
426+ func map (accum,next) = {
427+ let assetIdCheck = (toBase58String(value(next.assetId)) == value(getString(keyRewardAssetId(programName))))
428+ let amountCheck = if (assetIdCheck)
429+ then true
430+ else throwErr("invalid asset id")
431+ if ((amountCheck == amountCheck))
432+ then (accum :+ next.amount)
433+ else throw("Strict value is not equal to itself.")
434+ }
435+
436+ let payments = {
437+ let $l = i.payments
438+ let $s = size($l)
439+ let $acc0 = nil
440+ func $f0_1 ($a,$i) = if (($i >= $s))
441+ then $a
442+ else map($a, $l[$i])
443+
444+ func $f0_2 ($a,$i) = if (($i >= $s))
445+ then $a
446+ else throw("List size exceeds 10")
447+
448+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
449+ }
450+ let resAmount = {
451+ let @ = invoke(this, "incUnclaimedWithPaymentInternal", [payments, programName, referrerAddresses, 0, 0], nil)
452+ if ($isInstanceOf(@, "Int"))
453+ then @
454+ else throw(($getType(@) + " couldn't be cast to Int"))
455+ }
456+ if ((resAmount == resAmount))
457+ then {
458+ let treasuryContract = addressFromStringValue(value(getString(keyTreasuryContract(programName))))
459+ let rewardAssetId = fromBase58String(value(getString(keyRewardAssetId(programName))))
460+[ScriptTransfer(treasuryContract, resAmount, rewardAssetId)]
461+ }
462+ else throw("Strict value is not equal to itself.")
463+ }
464+ else throw("Strict value is not equal to itself.")
465+ }
466+
467+
468+
469+@Callable(i)
470+func claim (programName) = {
471+ let checkProgramExists = if (valueOrElse(getBoolean(keyProgramName(programName)), false))
472+ then true
473+ else throwErr("program does not exist")
474+ if ((checkProgramExists == checkProgramExists))
475+ then {
476+ let isImplementationContract = (toString(i.caller) == value(getString(keyImplementationContract(programName))))
477+ let claimerAddress = if (isImplementationContract)
478+ then toString(i.originCaller)
479+ else toString(i.caller)
480+ let claimInternal = invoke(this, "claimInternal", [programName, claimerAddress, isImplementationContract], nil)
481+ if ((claimInternal == claimInternal))
482+ then $Tuple2(nil, claimInternal)
483+ else throw("Strict value is not equal to itself.")
484+ }
485+ else throw("Strict value is not equal to itself.")
486+ }
487+
488+
489+
490+@Callable(i)
491+func claimBulk () = {
492+ let callerAddress = toString(i.caller)
493+ let callerProgramsStr = getString(keyAllReferralPrograms(toString(i.caller)))
494+ let programsExists = if (isDefined(callerProgramsStr))
495+ then true
496+ else throwErr("no referral programs")
497+ if ((programsExists == programsExists))
498+ then {
499+ let callerPrograms = split(value(callerProgramsStr), "__")
500+ let bulkClaim = invoke(this, "claimBulkInternal", [callerAddress, callerPrograms, 0], nil)
501+ if ((bulkClaim == bulkClaim))
502+ then $Tuple2(nil, bulkClaim)
503+ else throw("Strict value is not equal to itself.")
504+ }
505+ else throw("Strict value is not equal to itself.")
506+ }
507+
508+
509+
510+@Callable(i)
511+func claimREADONLY (programName,userAddress) = {
512+ let claimerClaimed = valueOrElse(getInteger(keyClaimedReferrer(programName, userAddress)), 0)
513+ let claimerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, userAddress)), 0)
514+ $Tuple2(nil, [claimerUnclaimed, claimerClaimed])
515+ }
516+
517+
518+
519+@Callable(i)
520+func claimBulkREADONLY (claimer) = {
521+ let claimedTotalAddress = valueOrElse(getInteger(keyClaimedTotalAddress(claimer)), 0)
522+ let unclaimedTotalAddress = valueOrElse(getInteger(keyUnclaimedTotalAddress(claimer)), 0)
523+ $Tuple2(nil, [unclaimedTotalAddress, claimedTotalAddress])
524+ }
525+
526+
527+
528+@Callable(i)
529+func setTotalKeys (programName,address) = {
530+ let claimedReferrer = valueOrElse(getInteger(keyClaimedReferrer(programName, address)), 0)
531+ let claimedReferral = valueOrElse(getInteger(keyClaimedReferral(programName, address)), 0)
532+ let unclaimedReferrer = valueOrElse(getInteger(keyUnclaimedReferrer(programName, address)), 0)
533+ let unclaimedReferral = valueOrElse(getInteger(keyUnclaimedReferral(programName, address)), 0)
534+ let claimedTotalAddress = (claimedReferrer + claimedReferral)
535+ let unclaimedTotalAddress = (unclaimedReferrer + unclaimedReferral)
536+ $Tuple2([IntegerEntry(keyClaimedTotalAddress(address), claimedTotalAddress), IntegerEntry(keyUnclaimedTotalAddress(address), unclaimedTotalAddress)], unit)
537+ }
538+
539+
540+
541+@Callable(i)
542+func setManager (pendingManagerPublicKey) = {
543+ let checkCaller = mustManager(i)
544+ if ((checkCaller == checkCaller))
545+ then {
546+ let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
547+ if ((checkManagerPublicKey == checkManagerPublicKey))
548+ then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
549+ else throw("Strict value is not equal to itself.")
550+ }
551+ else throw("Strict value is not equal to itself.")
552+ }
553+
554+
555+
556+@Callable(i)
557+func confirmManager () = {
558+ let pm = pendingManagerPublicKeyOrUnit()
559+ let hasPM = if (isDefined(pm))
560+ then true
561+ else throwErr("no pending manager")
562+ if ((hasPM == hasPM))
563+ then {
564+ let checkPM = if ((i.callerPublicKey == value(pm)))
565+ then true
566+ else throwErr("you are not pending manager")
567+ if ((checkPM == checkPM))
568+ then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
569+ else throw("Strict value is not equal to itself.")
570+ }
571+ else throw("Strict value is not equal to itself.")
572+ }
573+
574+
575+@Verifier(tx)
576+func verify () = {
577+ let targetPublicKey = match managerPublicKeyOrUnit() {
578+ case pk: ByteVector =>
579+ pk
580+ case _: Unit =>
581+ tx.senderPublicKey
582+ case _ =>
583+ throw("Match error")
584+ }
585+ sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
586+ }
587+

github/deemru/w8io/026f985 
35.33 ms