tx · BcSpEitptjueFL2gM1FA796wTpQMroztSG46yArVX2z5

3MuWBHccrEuDEvozJ8b7t5JdYrhqfyWePd6:  -0.02500000 Waves

2023.05.04 13:13 [2562879] smart account 3MuWBHccrEuDEvozJ8b7t5JdYrhqfyWePd6 > SELF 0.00000000 Waves

{ "type": 13, "id": "BcSpEitptjueFL2gM1FA796wTpQMroztSG46yArVX2z5", "fee": 2500000, "feeAssetId": null, "timestamp": 1683195179318, "version": 2, "chainId": 84, "sender": "3MuWBHccrEuDEvozJ8b7t5JdYrhqfyWePd6", "senderPublicKey": "9RHv7r4mz9AqLab5WvSMeJe5cgGJqeG45LC9KbMaGKia", "proofs": [ "KhgCzWBYtyV47xeuV5PT6vSbm8EyDhfVBsa1fVfhSSSMVi2YJJeHoNza95Dd2D1F5s31hvoFSfcGtLRpsYNE6cg" ], "script": "base64:BgJWCAISBQoDCAgEEgUKAwgYARIHCgURCBgBARIGCgQICAgIEgYKBAgICAISBQoDCAgEEgYKBAgIAQESBAoCCBgSAwoBCBIAEgQKAggIEgMKAQgSBAoCCAgeAAlzZXBhcmF0b3ICAl9fAQxrZXlXeEFzc2V0SWQACQC5CQIJAMwIAgICJXMJAMwIAgIJd3hBc3NldElkBQNuaWwFCXNlcGFyYXRvcgATa2V5QmFja2VuZFB1YmxpY0tleQkAuQkCCQDMCAICAiVzCQDMCAICEGJhY2tlbmRQdWJsaWNLZXkFA25pbAUJc2VwYXJhdG9yARtrZXlFeGlzdHNSZWZlcnJlclRvUmVmZXJyYWwDC3Byb2dyYW1OYW1lD3JlZmVycmVyQWRkcmVzcw9yZWZlcnJhbEFkZHJlc3MJALkJAgkAzAgCAgglcyVzJXMlcwkAzAgCAhhleGlzdHNSZWZlcnJlclRvUmVmZXJyYWwJAMwIAgULcHJvZ3JhbU5hbWUJAMwIAgUPcmVmZXJyZXJBZGRyZXNzCQDMCAIFD3JlZmVycmFsQWRkcmVzcwUDbmlsBQlzZXBhcmF0b3IBEmtleUNsYWltZWRSZWZlcnJlcgILcHJvZ3JhbU5hbWUOY2xhaW1lckFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIPY2xhaW1lZFJlZmVycmVyCQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFDmNsYWltZXJBZGRyZXNzBQNuaWwFCXNlcGFyYXRvcgESa2V5Q2xhaW1lZFJlZmVycmFsAgtwcm9ncmFtTmFtZQ5jbGFpbWVyQWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAg9jbGFpbWVkUmVmZXJyYWwJAMwIAgULcHJvZ3JhbU5hbWUJAMwIAgUOY2xhaW1lckFkZHJlc3MFA25pbAUJc2VwYXJhdG9yARRrZXlVbmNsYWltZWRSZWZlcnJlcgILcHJvZ3JhbU5hbWUOY2xhaW1lckFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIRdW5jbGFpbWVkUmVmZXJyZXIJAMwIAgULcHJvZ3JhbU5hbWUJAMwIAgUOY2xhaW1lckFkZHJlc3MFA25pbAUJc2VwYXJhdG9yARRrZXlVbmNsYWltZWRSZWZlcnJhbAILcHJvZ3JhbU5hbWUOY2xhaW1lckFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIRdW5jbGFpbWVkUmVmZXJyYWwJAMwIAgULcHJvZ3JhbU5hbWUJAMwIAgUOY2xhaW1lckFkZHJlc3MFA25pbAUJc2VwYXJhdG9yAQtrZXlSZWZlcnJlcgILcHJvZ3JhbU5hbWUPcmVmZXJyYWxBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCHJlZmVycmVyCQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFD3JlZmVycmFsQWRkcmVzcwUDbmlsBQlzZXBhcmF0b3IBDmtleVByb2dyYW1OYW1lAQtwcm9ncmFtTmFtZQkAuQkCCQDMCAICBCVzJXMJAMwIAgILcHJvZ3JhbU5hbWUJAMwIAgULcHJvZ3JhbU5hbWUFA25pbAUJc2VwYXJhdG9yARVrZXlUb3RhbFJlZmVycmFsQ291bnQCC3Byb2dyYW1OYW1lD3JlZmVycmVyQWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAhJ0b3RhbFJlZmVycmFsQ291bnQJAMwIAgULcHJvZ3JhbU5hbWUJAMwIAgUPcmVmZXJyZXJBZGRyZXNzBQNuaWwFCXNlcGFyYXRvcgEWa2V5QWN0aXZlUmVmZXJyYWxDb3VudAILcHJvZ3JhbU5hbWUPcmVmZXJyZXJBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICE2FjdGl2ZVJlZmVycmFsQ291bnQJAMwIAgULcHJvZ3JhbU5hbWUJAMwIAgUPcmVmZXJyZXJBZGRyZXNzBQNuaWwFCXNlcGFyYXRvcgETa2V5SXNSZWZlcnJhbEFjdGl2ZQILcHJvZ3JhbU5hbWUPcmVmZXJyYWxBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICDmFjdGl2ZVJlZmVycmFsCQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFD3JlZmVycmFsQWRkcmVzcwUDbmlsBQlzZXBhcmF0b3IBFmtleUNsYWltZWRUb3RhbEFkZHJlc3MBB2FkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICE2NsYWltZWRUb3RhbEFkZHJlc3MJAMwIAgUHYWRkcmVzcwUDbmlsBQlzZXBhcmF0b3IBGGtleVVuY2xhaW1lZFRvdGFsQWRkcmVzcwEHYWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIVdW5jbGFpbWVkVG90YWxBZGRyZXNzCQDMCAIFB2FkZHJlc3MFA25pbAUJc2VwYXJhdG9yAQ9rZXlDbGFpbWVkVG90YWwBC3Byb2dyYW1OYW1lCQC5CQIJAMwIAgIEJXMlcwkAzAgCAgxjbGFpbWVkVG90YWwJAMwIAgULcHJvZ3JhbU5hbWUFA25pbAUJc2VwYXJhdG9yAQ9rZXlSZXdhcmRzVG90YWwBC3Byb2dyYW1OYW1lCQC5CQIJAMwIAgIEJXMlcwkAzAgCAgxyZXdhcmRzVG90YWwJAMwIAgULcHJvZ3JhbU5hbWUFA25pbAUJc2VwYXJhdG9yARBrZXlSZXdhcmRBc3NldElkAQtwcm9ncmFtTmFtZQkAuQkCCQDMCAICBCVzJXMJAMwIAgINcmV3YXJkQXNzZXRJZAkAzAgCBQtwcm9ncmFtTmFtZQUDbmlsBQlzZXBhcmF0b3IBE2tleVRyZWFzdXJ5Q29udHJhY3QBC3Byb2dyYW1OYW1lCQC5CQIJAMwIAgIEJXMlcwkAzAgCAhB0cmVhc3VyeUNvbnRyYWN0CQDMCAIFC3Byb2dyYW1OYW1lBQNuaWwFCXNlcGFyYXRvcgEZa2V5SW1wbGVtZW50YXRpb25Db250cmFjdAELcHJvZ3JhbU5hbWUJALkJAgkAzAgCAgQlcyVzCQDMCAICFmltcGxlbWVudGF0aW9uQ29udHJhY3QJAMwIAgULcHJvZ3JhbU5hbWUFA25pbAUJc2VwYXJhdG9yARZrZXlBbGxSZWZlcnJhbFByb2dyYW1zAQdhZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAhNhbGxSZWZlcnJhbFByb2dyYW1zCQDMCAIFB2FkZHJlc3MFA25pbAUJc2VwYXJhdG9yARNrZXlNYW5hZ2VyUHVibGljS2V5AAIUJXNfX21hbmFnZXJQdWJsaWNLZXkBFmtleU1hbmFnZXJWYXVsdEFkZHJlc3MAAhclc19fbWFuYWdlclZhdWx0QWRkcmVzcwEXZ2V0TWFuYWdlckFkZHJlc3NPckZhaWwACQERQGV4dHJOYXRpdmUoMTA2MikBCQERQGV4dHJOYXRpdmUoMTA1OCkBCQEWa2V5TWFuYWdlclZhdWx0QWRkcmVzcwABD2tleUNsYWltSGlzdG9yeQQLcHJvZ3JhbU5hbWULdXNlckFkZHJlc3MNdHJhbnNhY3Rpb25JZAR0eXBlCQC5CQIJAMwIAgIKJXMlcyVzJXMlcwkAzAgCAgdoaXN0b3J5CQDMCAIFBHR5cGUJAMwIAgULcHJvZ3JhbU5hbWUJAMwIAgULdXNlckFkZHJlc3MJAMwIAgUNdHJhbnNhY3Rpb25JZAUDbmlsBQlzZXBhcmF0b3IBEmZvcm1hdENsYWltSGlzdG9yeQEGYW1vdW50CQC5CQIJAMwIAgIGJWQlZCVkCQDMCAIJAKQDAQgFCWxhc3RCbG9jawZoZWlnaHQJAMwIAgkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQCkAwEFBmFtb3VudAUDbmlsBQlzZXBhcmF0b3IBCHRocm93RXJyAQNtc2cJAAIBCQC5CQIJAMwIAgIOcmVmZXJyYWwucmlkZToJAMwIAgUDbXNnBQNuaWwCASABFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQABBNtYW5hZ2VyVmF1bHRBZGRyZXNzCQEXZ2V0TWFuYWdlckFkZHJlc3NPckZhaWwABAckbWF0Y2gwCQCdCAIFE21hbmFnZXJWYXVsdEFkZHJlc3MJARNrZXlNYW5hZ2VyUHVibGljS2V5AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJANkEAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBC211c3RNYW5hZ2VyAQFpBAJwZAkBCHRocm93RXJyAQIRcGVybWlzc2lvbiBkZW5pZWQEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFAnBrBgUCcGQDCQABAgUHJG1hdGNoMAIEVW5pdAMJAAACCAUBaQZjYWxsZXIFBHRoaXMGBQJwZAkAAgECC01hdGNoIGVycm9yARl1cGRhdGVBbGxSZWZlcnJhbFByb2dyYW1zAgdhZGRyZXNzC3Byb2dyYW1OYW1lBBNhbGxSZWZlcnJhbFByb2dyYW1zCQELdmFsdWVPckVsc2UCCQCiCAEJARZrZXlBbGxSZWZlcnJhbFByb2dyYW1zAQUHYWRkcmVzcwIABBp1cGRhdGVkQWxsUmVmZXJyYWxQcm9ncmFtcwMJAQhjb250YWlucwIFE2FsbFJlZmVycmFsUHJvZ3JhbXMFC3Byb2dyYW1OYW1lBQNuaWwEFm5ld0FsbFJlZmVycmFsUHJvZ3JhbXMDCQAAAgUTYWxsUmVmZXJyYWxQcm9ncmFtcwIABQtwcm9ncmFtTmFtZQkAuQkCCQDMCAIFE2FsbFJlZmVycmFsUHJvZ3JhbXMJAMwIAgULcHJvZ3JhbU5hbWUFA25pbAUJc2VwYXJhdG9yCQDMCAIJAQtTdHJpbmdFbnRyeQIJARZrZXlBbGxSZWZlcnJhbFByb2dyYW1zAQUHYWRkcmVzcwUWbmV3QWxsUmVmZXJyYWxQcm9ncmFtcwUDbmlsBRp1cGRhdGVkQWxsUmVmZXJyYWxQcm9ncmFtcw0BaQENY2xhaW1JbnRlcm5hbAMLcHJvZ3JhbU5hbWUOY2xhaW1lckFkZHJlc3MYaXNJbXBsZW1lbnRhdGlvbkNvbnRyYWN0BBJjaGVja1Byb2dyYW1FeGlzdHMDCQELdmFsdWVPckVsc2UCCQCgCAEJAQ5rZXlQcm9ncmFtTmFtZQEFC3Byb2dyYW1OYW1lBwYJAQh0aHJvd0VycgECFnByb2dyYW0gZG9lcyBub3QgZXhpc3QDCQAAAgUSY2hlY2tQcm9ncmFtRXhpc3RzBRJjaGVja1Byb2dyYW1FeGlzdHMECyR0MDQ3MDA1NjM3AwUYaXNJbXBsZW1lbnRhdGlvbkNvbnRyYWN0CQCXCgUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEmtleUNsYWltZWRSZWZlcnJhbAIFC3Byb2dyYW1OYW1lBQ5jbGFpbWVyQWRkcmVzcwAACQELdmFsdWVPckVsc2UCCQCfCAEJARRrZXlVbmNsYWltZWRSZWZlcnJhbAIFC3Byb2dyYW1OYW1lBQ5jbGFpbWVyQWRkcmVzcwAACQESa2V5Q2xhaW1lZFJlZmVycmFsAgULcHJvZ3JhbU5hbWUFDmNsYWltZXJBZGRyZXNzCQEUa2V5VW5jbGFpbWVkUmVmZXJyYWwCBQtwcm9ncmFtTmFtZQUOY2xhaW1lckFkZHJlc3MJAQ9rZXlDbGFpbUhpc3RvcnkEBQtwcm9ncmFtTmFtZQUOY2xhaW1lckFkZHJlc3MJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAINY2xhaW1SZWZlcnJhbAkAlwoFCQELdmFsdWVPckVsc2UCCQCfCAEJARJrZXlDbGFpbWVkUmVmZXJyZXICBQtwcm9ncmFtTmFtZQUOY2xhaW1lckFkZHJlc3MAAAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEUa2V5VW5jbGFpbWVkUmVmZXJyZXICBQtwcm9ncmFtTmFtZQUOY2xhaW1lckFkZHJlc3MAAAkBEmtleUNsYWltZWRSZWZlcnJlcgIFC3Byb2dyYW1OYW1lBQ5jbGFpbWVyQWRkcmVzcwkBFGtleVVuY2xhaW1lZFJlZmVycmVyAgULcHJvZ3JhbU5hbWUFDmNsYWltZXJBZGRyZXNzCQEPa2V5Q2xhaW1IaXN0b3J5BAULcHJvZ3JhbU5hbWUFDmNsYWltZXJBZGRyZXNzCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQCDWNsYWltUmVmZXJyZXIEDmNsYWltZXJDbGFpbWVkCAULJHQwNDcwMDU2MzcCXzEEEGNsYWltZXJVbmNsYWltZWQIBQskdDA0NzAwNTYzNwJfMgQKa2V5Q2xhaW1lZAgFCyR0MDQ3MDA1NjM3Al8zBAxrZXlVbmNsYWltZWQIBQskdDA0NzAwNTYzNwJfNAQPY2xhaW1IaXN0b3J5S2V5CAULJHQwNDcwMDU2MzcCXzUEDGNsYWltZWRUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEPa2V5Q2xhaW1lZFRvdGFsAQULcHJvZ3JhbU5hbWUAAAQQdHJlYXN1cnlDb250cmFjdAkBBXZhbHVlAQkApggBCQEFdmFsdWUBCQCiCAEJARNrZXlUcmVhc3VyeUNvbnRyYWN0AQULcHJvZ3JhbU5hbWUEDXJld2FyZEFzc2V0SWQJANkEAQkBBXZhbHVlAQkAoggBCQEQa2V5UmV3YXJkQXNzZXRJZAEFC3Byb2dyYW1OYW1lBBNjbGFpbWVkVG90YWxBZGRyZXNzCQELdmFsdWVPckVsc2UCCQCfCAEJARZrZXlDbGFpbWVkVG90YWxBZGRyZXNzAQUOY2xhaW1lckFkZHJlc3MAAAQVdW5jbGFpbWVkVG90YWxBZGRyZXNzCQELdmFsdWVPckVsc2UCCQCfCAEJARhrZXlVbmNsYWltZWRUb3RhbEFkZHJlc3MBBQ5jbGFpbWVyQWRkcmVzcwAAAwMFGGlzSW1wbGVtZW50YXRpb25Db250cmFjdAkAAAIFEGNsYWltZXJVbmNsYWltZWQAAAcJAJQKAgUDbmlsAAAEDWNoZWNrQ2FuQ2xhaW0DCQBmAgUQY2xhaW1lclVuY2xhaW1lZAAABgkBCHRocm93RXJyAQIQbm90aGluZyB0byBjbGFpbQMJAAACBQ1jaGVja0NhbkNsYWltBQ1jaGVja0NhbkNsYWltBBFuZXdDbGFpbWVyQ2xhaW1lZAkAZAIFDmNsYWltZXJDbGFpbWVkBRBjbGFpbWVyVW5jbGFpbWVkBA9uZXdDbGFpbWVkVG90YWwJAGQCBQxjbGFpbWVkVG90YWwFEGNsYWltZXJVbmNsYWltZWQEFm5ld0NsYWltZWRUb3RhbEFkZHJlc3MJAGQCBRNjbGFpbWVkVG90YWxBZGRyZXNzBRBjbGFpbWVyVW5jbGFpbWVkBBhuZXdVbmNsYWltZWRUb3RhbEFkZHJlc3MJAGUCBRV1bmNsYWltZWRUb3RhbEFkZHJlc3MFEGNsYWltZXJVbmNsYWltZWQEDWJhbGFuY2VCZWZvcmUJAQV2YWx1ZQEJAPAHAgUEdGhpcwUNcmV3YXJkQXNzZXRJZAMJAAACBQ1iYWxhbmNlQmVmb3JlBQ1iYWxhbmNlQmVmb3JlBANyZXMJAPwHBAUQdHJlYXN1cnlDb250cmFjdAIWd2l0aGRyYXdSZWZlcnJhbFJld2FyZAkAzAgCBRBjbGFpbWVyVW5jbGFpbWVkBQNuaWwFA25pbAMJAAACBQNyZXMFA3JlcwQMYmFsYW5jZUFmdGVyCQEFdmFsdWUBCQDwBwIFBHRoaXMFDXJld2FyZEFzc2V0SWQDCQAAAgUMYmFsYW5jZUFmdGVyBQxiYWxhbmNlQWZ0ZXIEC2JhbGFuY2VEaWZmCQBlAgUMYmFsYW5jZUFmdGVyBQ1iYWxhbmNlQmVmb3JlAwkAAAIFC2JhbGFuY2VEaWZmBQtiYWxhbmNlRGlmZgQMY2hlY2tCYWxhbmNlAwkAAAIFC2JhbGFuY2VEaWZmBRBjbGFpbWVyVW5jbGFpbWVkBgkBCHRocm93RXJyAQIpaW5zdWZmaWNpZW50IGJhbGFuY2Ugb24gcmVmZXJyYWwgY29udHJhY3QDCQAAAgUMY2hlY2tCYWxhbmNlBQxjaGVja0JhbGFuY2UJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUKa2V5Q2xhaW1lZAURbmV3Q2xhaW1lckNsYWltZWQJAMwIAgkBDEludGVnZXJFbnRyeQIFDGtleVVuY2xhaW1lZAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEPa2V5Q2xhaW1lZFRvdGFsAQULcHJvZ3JhbU5hbWUFD25ld0NsYWltZWRUb3RhbAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleUNsYWltZWRUb3RhbEFkZHJlc3MBBQ5jbGFpbWVyQWRkcmVzcwUWbmV3Q2xhaW1lZFRvdGFsQWRkcmVzcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGGtleVVuY2xhaW1lZFRvdGFsQWRkcmVzcwEFDmNsYWltZXJBZGRyZXNzBRhuZXdVbmNsYWltZWRUb3RhbEFkZHJlc3MJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBEUBleHRyTmF0aXZlKDEwNjIpAQUOY2xhaW1lckFkZHJlc3MFEGNsYWltZXJVbmNsYWltZWQFDXJld2FyZEFzc2V0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUPY2xhaW1IaXN0b3J5S2V5CQESZm9ybWF0Q2xhaW1IaXN0b3J5AQUQY2xhaW1lclVuY2xhaW1lZAUDbmlsBRBjbGFpbWVyVW5jbGFpbWVkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBEWNsYWltQnVsa0ludGVybmFsAwdjbGFpbWVyDHByb2dyYW1OYW1lcwtjdXJyZW50SXRlcgQLY2hlY2tDYWxsZXIDCQAAAggFAWkGY2FsbGVyBQR0aGlzBgkBCHRocm93RXJyAQIRcGVybWlzc2lvbiBkZW5pZWQDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyAwkAAAIFC2N1cnJlbnRJdGVyCQCQAwEFDHByb2dyYW1OYW1lcwUDbmlsBAtwcm9ncmFtTmFtZQkAkQMCBQxwcm9ncmFtTmFtZXMFC2N1cnJlbnRJdGVyBBBwcm9ncmFtVW5jbGFpbWVkCQELdmFsdWVPckVsc2UCCQCfCAEJARRrZXlVbmNsYWltZWRSZWZlcnJlcgIFC3Byb2dyYW1OYW1lBQdjbGFpbWVyAAAED2NsYWltSGlzdG9yeUtleQkBD2tleUNsYWltSGlzdG9yeQQFC3Byb2dyYW1OYW1lBQdjbGFpbWVyCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQCCWNsYWltQnVsawQRY2xhaW1CdWxrSW50ZXJuYWwJAPwHBAUEdGhpcwIRY2xhaW1CdWxrSW50ZXJuYWwJAMwIAgUHY2xhaW1lcgkAzAgCBQxwcm9ncmFtTmFtZXMJAMwIAgkAZAIFC2N1cnJlbnRJdGVyAAEFA25pbAUDbmlsAwkAAAIFEWNsYWltQnVsa0ludGVybmFsBRFjbGFpbUJ1bGtJbnRlcm5hbAQRdW5jbGFpbWVkUmVmZXJyZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFGtleVVuY2xhaW1lZFJlZmVycmVyAgULcHJvZ3JhbU5hbWUFB2NsYWltZXIAAAQFY2xhaW0DCQBmAgURdW5jbGFpbWVkUmVmZXJyZXIAAAkA/AcEBQR0aGlzAg1jbGFpbUludGVybmFsCQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFB2NsYWltZXIJAMwIAgcFA25pbAUDbmlsBQR1bml0AwkAAAIFBWNsYWltBQVjbGFpbQkAlAoCBQNuaWwJAMwIAgURY2xhaW1CdWxrSW50ZXJuYWwJAMwIAgUFY2xhaW0FA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAR9pbmNVbmNsYWltZWRXaXRoUGF5bWVudEludGVybmFsBQ5wYXltZW50QW1vdW50cwtwcm9ncmFtTmFtZRFyZWZlcnJlckFkZHJlc3NlcwtjdXJyZW50SXRlcglyZXNBbW91bnQEC2NoZWNrQ2FsbGVyAwkAAAIIBQFpBmNhbGxlcgUEdGhpcwYJAQh0aHJvd0VycgECEXBlcm1pc3Npb24gZGVuaWVkAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQOYXJnc0NvbXBhcmlzb24JAAACCQCQAwEFDnBheW1lbnRBbW91bnRzCQCQAwEFEXJlZmVycmVyQWRkcmVzc2VzBAVjaGVjawMFDmFyZ3NDb21wYXJpc29uBgkBCHRocm93RXJyAQIfbGlzdHMgaW4gYXJncyBtdXN0IGJlIHNhbWUgc2l6ZQMJAAACBQVjaGVjawUFY2hlY2sDCQAAAgULY3VycmVudEl0ZXIJAJADAQUOcGF5bWVudEFtb3VudHMJAJQKAgUDbmlsBQlyZXNBbW91bnQED3JlZmVycmVyQWRkcmVzcwkAkQMCBRFyZWZlcnJlckFkZHJlc3NlcwULY3VycmVudEl0ZXIEFXVuY2xhaW1lZFRvdGFsQWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEYa2V5VW5jbGFpbWVkVG90YWxBZGRyZXNzAQUPcmVmZXJyZXJBZGRyZXNzAAAEEXJlZmVycmVyVW5jbGFpbWVkCQELdmFsdWVPckVsc2UCCQCfCAEJARRrZXlVbmNsYWltZWRSZWZlcnJlcgIFC3Byb2dyYW1OYW1lBQ9yZWZlcnJlckFkZHJlc3MAAAQMcmV3YXJkc1RvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEJAQ9rZXlSZXdhcmRzVG90YWwBBQtwcm9ncmFtTmFtZQAABBhuZXdVbmNsYWltZWRUb3RhbEFkZHJlc3MJAGQCBRV1bmNsYWltZWRUb3RhbEFkZHJlc3MJAJEDAgUOcGF5bWVudEFtb3VudHMFC2N1cnJlbnRJdGVyBBRuZXdSZWZlcnJlclVuY2xhaW1lZAkAZAIFEXJlZmVycmVyVW5jbGFpbWVkCQCRAwIFDnBheW1lbnRBbW91bnRzBQtjdXJyZW50SXRlcgQMbmV3UmVzQW1vdW50CQBkAgUJcmVzQW1vdW50CQCRAwIFDnBheW1lbnRBbW91bnRzBQtjdXJyZW50SXRlcgQDaW52CQD8BwQFBHRoaXMCH2luY1VuY2xhaW1lZFdpdGhQYXltZW50SW50ZXJuYWwJAMwIAgUOcGF5bWVudEFtb3VudHMJAMwIAgULcHJvZ3JhbU5hbWUJAMwIAgURcmVmZXJyZXJBZGRyZXNzZXMJAMwIAgkAZAIFC2N1cnJlbnRJdGVyAAEJAMwIAgUMbmV3UmVzQW1vdW50BQNuaWwFA25pbAMJAAACBQNpbnYFA2ludgQadXBkYXRlZEFsbFJlZmVycmVyUHJvZ3JhbXMJARl1cGRhdGVBbGxSZWZlcnJhbFByb2dyYW1zAgUPcmVmZXJyZXJBZGRyZXNzBQtwcm9ncmFtTmFtZQkAlAoCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJARhrZXlVbmNsYWltZWRUb3RhbEFkZHJlc3MBBQ9yZWZlcnJlckFkZHJlc3MFGG5ld1VuY2xhaW1lZFRvdGFsQWRkcmVzcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleVVuY2xhaW1lZFJlZmVycmVyAgULcHJvZ3JhbU5hbWUFD3JlZmVycmVyQWRkcmVzcwUUbmV3UmVmZXJyZXJVbmNsYWltZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlSZXdhcmRzVG90YWwBBQtwcm9ncmFtTmFtZQkAZAIFDHJld2FyZHNUb3RhbAkAkQMCBQ5wYXltZW50QW1vdW50cwULY3VycmVudEl0ZXIFA25pbAUadXBkYXRlZEFsbFJlZmVycmVyUHJvZ3JhbXMFA2ludgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARVjcmVhdGVSZWZlcnJhbFByb2dyYW0EC3Byb2dyYW1OYW1lEHRyZWFzdXJ5Q29udHJhY3QWaW1wbGVtZW50YXRpb25Db250cmFjdA1yZXdhcmRBc3NldElkBAtjaGVja0NhbGxlcgkBC211c3RNYW5hZ2VyAQUBaQMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEEGNoZWNrUHJvZ3JhbU5hbWUDCQAAAgkAoAgBCQEOa2V5UHJvZ3JhbU5hbWUBBQtwcm9ncmFtTmFtZQUEdW5pdAYJAQh0aHJvd0VycgECG3Byb2dyYW0gbmFtZSBhbHJlYWR5IGV4aXN0cwMJAAACBRBjaGVja1Byb2dyYW1OYW1lBRBjaGVja1Byb2dyYW1OYW1lBBJwcm9ncmFtTmFtZUlzVmFsaWQDCQEBIQEJAQhjb250YWlucwIFC3Byb2dyYW1OYW1lBQlzZXBhcmF0b3IJAQEhAQkBCGNvbnRhaW5zAgULcHJvZ3JhbU5hbWUCASAHBBJjaGVja1Byb2dyYW1FeGlzdHMDBRJwcm9ncmFtTmFtZUlzVmFsaWQGCQEIdGhyb3dFcnIBAhRpbnZhbGlkIHByb2dyYW0gbmFtZQMJAAACBRJjaGVja1Byb2dyYW1FeGlzdHMFEmNoZWNrUHJvZ3JhbUV4aXN0cwQQY2hlY2tSZXdhcmRBc3NldAMJAQIhPQIJAOwHAQkA2QQBBQ1yZXdhcmRBc3NldElkBQR1bml0BgkBCHRocm93RXJyAQIXaW52YWxpZCByZXdhcmQgYXNzZXQgaWQDCQAAAgUQY2hlY2tSZXdhcmRBc3NldAUQY2hlY2tSZXdhcmRBc3NldAkAlAoCCQDMCAIJAQxCb29sZWFuRW50cnkCCQEOa2V5UHJvZ3JhbU5hbWUBBQtwcm9ncmFtTmFtZQYJAMwIAgkBC1N0cmluZ0VudHJ5AgkBE2tleVRyZWFzdXJ5Q29udHJhY3QBBQtwcm9ncmFtTmFtZQUQdHJlYXN1cnlDb250cmFjdAkAzAgCCQELU3RyaW5nRW50cnkCCQEZa2V5SW1wbGVtZW50YXRpb25Db250cmFjdAEFC3Byb2dyYW1OYW1lBRZpbXBsZW1lbnRhdGlvbkNvbnRyYWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJARBrZXlSZXdhcmRBc3NldElkAQULcHJvZ3JhbU5hbWUFDXJld2FyZEFzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlSZXdhcmRzVG90YWwBBQtwcm9ncmFtTmFtZQAABQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKY3JlYXRlUGFpcgQLcHJvZ3JhbU5hbWUPcmVmZXJyZXJBZGRyZXNzD3JlZmVycmFsQWRkcmVzcwlzaWduYXR1cmUEEmNoZWNrUHJvZ3JhbUV4aXN0cwMJAQt2YWx1ZU9yRWxzZQIJAKAIAQkBDmtleVByb2dyYW1OYW1lAQULcHJvZ3JhbU5hbWUHBgkBCHRocm93RXJyAQIWcHJvZ3JhbSBkb2VzIG5vdCBleGlzdAMJAAACBRJjaGVja1Byb2dyYW1FeGlzdHMFEmNoZWNrUHJvZ3JhbUV4aXN0cwQgcGFpclJlZmVycmVyVG9SZWZlcnJhbEV4aXN0Q2hlY2sDCQAAAgkAoAgBCQEba2V5RXhpc3RzUmVmZXJyZXJUb1JlZmVycmFsAwULcHJvZ3JhbU5hbWUFD3JlZmVycmVyQWRkcmVzcwUPcmVmZXJyYWxBZGRyZXNzBQR1bml0BgkBCHRocm93RXJyAQITcGFpciBhbHJlYWR5IGV4aXN0cwMJAAACBSBwYWlyUmVmZXJyZXJUb1JlZmVycmFsRXhpc3RDaGVjawUgcGFpclJlZmVycmVyVG9SZWZlcnJhbEV4aXN0Q2hlY2sECW5vUmVmU2VsZgMJAQIhPQIFD3JlZmVycmVyQWRkcmVzcwUPcmVmZXJyYWxBZGRyZXNzBgkBCHRocm93RXJyAQIUY2Fubm90IHJlZmVyIHRvIHNlbGYDCQAAAgUJbm9SZWZTZWxmBQlub1JlZlNlbGYEBHBhaXIJAJsDAQkAuQkCCQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFD3JlZmVycmVyQWRkcmVzcwkAzAgCBQ9yZWZlcnJhbEFkZHJlc3MFA25pbAIBOgQQYmFja2VuZFB1YmxpY0tleQkA2QQBCQEFdmFsdWUBCQCiCAEFE2tleUJhY2tlbmRQdWJsaWNLZXkEEXZhbGlkYXRlU2lnbmF0dXJlAwkA9AMDBQRwYWlyBQlzaWduYXR1cmUFEGJhY2tlbmRQdWJsaWNLZXkGCQEIdGhyb3dFcnIBAg1iYWQgc2lnbmF0dXJlAwkAAAIFEXZhbGlkYXRlU2lnbmF0dXJlBRF2YWxpZGF0ZVNpZ25hdHVyZQQSdG90YWxSZWZlcnJhbENvdW50CQELdmFsdWVPckVsc2UCCQCfCAEJARVrZXlUb3RhbFJlZmVycmFsQ291bnQCBQtwcm9ncmFtTmFtZQUPcmVmZXJyZXJBZGRyZXNzAAAEFW5ld1RvdGFsUmVmZXJyYWxDb3VudAkAZAIFEnRvdGFsUmVmZXJyYWxDb3VudAABBBp1cGRhdGVkQWxsUmVmZXJyZXJQcm9ncmFtcwkBGXVwZGF0ZUFsbFJlZmVycmFsUHJvZ3JhbXMCBQ9yZWZlcnJlckFkZHJlc3MFC3Byb2dyYW1OYW1lBBp1cGRhdGVkQWxsUmVmZXJyYWxQcm9ncmFtcwkBGXVwZGF0ZUFsbFJlZmVycmFsUHJvZ3JhbXMCBQ9yZWZlcnJhbEFkZHJlc3MFC3Byb2dyYW1OYW1lCQCUCgIJAM4IAgkAzggCCQDMCAIJAQxCb29sZWFuRW50cnkCCQEba2V5RXhpc3RzUmVmZXJyZXJUb1JlZmVycmFsAwULcHJvZ3JhbU5hbWUFD3JlZmVycmVyQWRkcmVzcwUPcmVmZXJyYWxBZGRyZXNzBgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFWtleVRvdGFsUmVmZXJyYWxDb3VudAIFC3Byb2dyYW1OYW1lBQ9yZWZlcnJlckFkZHJlc3MFFW5ld1RvdGFsUmVmZXJyYWxDb3VudAkAzAgCCQELU3RyaW5nRW50cnkCCQELa2V5UmVmZXJyZXICBQtwcm9ncmFtTmFtZQUPcmVmZXJyYWxBZGRyZXNzBQ9yZWZlcnJlckFkZHJlc3MFA25pbAUadXBkYXRlZEFsbFJlZmVycmVyUHJvZ3JhbXMFGnVwZGF0ZWRBbGxSZWZlcnJhbFByb2dyYW1zBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFnVwZGF0ZVJlZmVycmFsQWN0aXZpdHkDC3Byb2dyYW1OYW1lD3JlZmVycmFsQWRkcmVzcwhpc0FjdGl2ZQQWaW1wbGVtZW50YXRpb25Db250cmFjdAkBBXZhbHVlAQkAoggBCQEZa2V5SW1wbGVtZW50YXRpb25Db250cmFjdAEFC3Byb2dyYW1OYW1lBBBpc1JlZmVycmFsQWN0aXZlCQECIT0CCQCgCAEJARNrZXlJc1JlZmVycmFsQWN0aXZlAgULcHJvZ3JhbU5hbWUFD3JlZmVycmFsQWRkcmVzcwUEdW5pdAQPcmVmZXJyZXJBZGRyZXNzCQEFdmFsdWUBCQCiCAEJAQtrZXlSZWZlcnJlcgIFC3Byb2dyYW1OYW1lBQ9yZWZlcnJhbEFkZHJlc3MEC2NoZWNrQ2FsbGVyAwkAAAIJAKUIAQgFAWkGY2FsbGVyBRZpbXBsZW1lbnRhdGlvbkNvbnRyYWN0BgkBCHRocm93RXJyAQIRcGVybWlzc2lvbiBkZW5pZWQDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyBAZ1cGRhdGUDCQAAAgUQaXNSZWZlcnJhbEFjdGl2ZQUIaXNBY3RpdmUJAJQKAgUDbmlsBQR1bml0BAZ1cGRhdGUDCQAAAgUIaXNBY3RpdmUGBBZuZXdBY3RpdmVSZWZlcnJhbENvdW50CQBkAgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEWa2V5QWN0aXZlUmVmZXJyYWxDb3VudAIFC3Byb2dyYW1OYW1lBQ9yZWZlcnJlckFkZHJlc3MAAAABCQCUCgIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJARNrZXlJc1JlZmVycmFsQWN0aXZlAgULcHJvZ3JhbU5hbWUFD3JlZmVycmFsQWRkcmVzcwYJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlBY3RpdmVSZWZlcnJhbENvdW50AgULcHJvZ3JhbU5hbWUFD3JlZmVycmVyQWRkcmVzcwUWbmV3QWN0aXZlUmVmZXJyYWxDb3VudAUDbmlsBQR1bml0BBZuZXdBY3RpdmVSZWZlcnJhbENvdW50CQBlAgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEWa2V5QWN0aXZlUmVmZXJyYWxDb3VudAIFC3Byb2dyYW1OYW1lBQ9yZWZlcnJlckFkZHJlc3MAAAABCQCUCgIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBE2tleUlzUmVmZXJyYWxBY3RpdmUCBQtwcm9ncmFtTmFtZQUPcmVmZXJyYWxBZGRyZXNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5QWN0aXZlUmVmZXJyYWxDb3VudAIFC3Byb2dyYW1OYW1lBQ9yZWZlcnJlckFkZHJlc3MFFm5ld0FjdGl2ZVJlZmVycmFsQ291bnQFA25pbAUEdW5pdAUGdXBkYXRlBQZ1cGRhdGUJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEMaW5jVW5jbGFpbWVkBAtwcm9ncmFtTmFtZQ9yZWZlcnJhbEFkZHJlc3MOcmVmZXJyZXJSZXdhcmQOcmVmZXJyYWxSZXdhcmQEFmltcGxlbWVudGF0aW9uQ29udHJhY3QJAQV2YWx1ZQEJAKIIAQkBGWtleUltcGxlbWVudGF0aW9uQ29udHJhY3QBBQtwcm9ncmFtTmFtZQQPcmVmZXJyZXJBZGRyZXNzCQEFdmFsdWUBCQCiCAEJAQtrZXlSZWZlcnJlcgIFC3Byb2dyYW1OYW1lBQ9yZWZlcnJhbEFkZHJlc3MEC2NoZWNrQ2FsbGVyAwkAAAIJAKUIAQgFAWkGY2FsbGVyBRZpbXBsZW1lbnRhdGlvbkNvbnRyYWN0BgkBCHRocm93RXJyAQIRcGVybWlzc2lvbiBkZW5pZWQDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyBAxjaGVja1Byb2dyYW0DCQAAAgULcHJvZ3JhbU5hbWUCBnd4bG9jawYJAQh0aHJvd0VycgECD2ludmFsaWQgcHJvZ3JhbQMJAAACBQxjaGVja1Byb2dyYW0FDGNoZWNrUHJvZ3JhbQQWY2hlY2tSZWZlcnJlckluUHJvZ3JhbQMJAQhjb250YWlucwIJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBFmtleUFsbFJlZmVycmFsUHJvZ3JhbXMBBQ9yZWZlcnJlckFkZHJlc3MCAAULcHJvZ3JhbU5hbWUGCQEIdGhyb3dFcnIBCQCsAgIJAKwCAgkArAICAhhyZWZlcnJlciBub3QgaW4gcHJvZ3JhbT0FC3Byb2dyYW1OYW1lAgYgYWRkcj0FD3JlZmVycmVyQWRkcmVzcwMJAAACBRZjaGVja1JlZmVycmVySW5Qcm9ncmFtBRZjaGVja1JlZmVycmVySW5Qcm9ncmFtBBZjaGVja1JlZmVycmFsSW5Qcm9ncmFtAwkBCGNvbnRhaW5zAgkBC3ZhbHVlT3JFbHNlAgkAoggBCQEWa2V5QWxsUmVmZXJyYWxQcm9ncmFtcwEFD3JlZmVycmFsQWRkcmVzcwIABQtwcm9ncmFtTmFtZQYJAQh0aHJvd0VycgEJAKwCAgkArAICCQCsAgICGHJlZmVycmFsIG5vdCBpbiBwcm9ncmFtPQULcHJvZ3JhbU5hbWUCBiBhZGRyPQUPcmVmZXJyYWxBZGRyZXNzAwkAAAIFFmNoZWNrUmVmZXJyYWxJblByb2dyYW0FFmNoZWNrUmVmZXJyYWxJblByb2dyYW0EFnVuY2xhaW1lZFRvdGFsUmVmZXJyZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGGtleVVuY2xhaW1lZFRvdGFsQWRkcmVzcwEFD3JlZmVycmVyQWRkcmVzcwAABBFyZWZlcnJlclVuY2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEUa2V5VW5jbGFpbWVkUmVmZXJyZXICBQtwcm9ncmFtTmFtZQUPcmVmZXJyZXJBZGRyZXNzAAAEFnVuY2xhaW1lZFRvdGFsUmVmZXJyYWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGGtleVVuY2xhaW1lZFRvdGFsQWRkcmVzcwEFD3JlZmVycmFsQWRkcmVzcwAABBFyZWZlcnJhbFVuY2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEUa2V5VW5jbGFpbWVkUmVmZXJyYWwCBQtwcm9ncmFtTmFtZQUPcmVmZXJyYWxBZGRyZXNzAAAEDHJld2FyZHNUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEPa2V5UmV3YXJkc1RvdGFsAQULcHJvZ3JhbU5hbWUAAAQZbmV3VW5jbGFpbWVkVG90YWxSZWZlcnJlcgkAZAIFFnVuY2xhaW1lZFRvdGFsUmVmZXJyZXIFDnJlZmVycmVyUmV3YXJkBBRuZXdSZWZlcnJlclVuY2xhaW1lZAkAZAIFEXJlZmVycmVyVW5jbGFpbWVkBQ5yZWZlcnJlclJld2FyZAQZbmV3VW5jbGFpbWVkVG90YWxSZWZlcnJhbAkAZAIFFnVuY2xhaW1lZFRvdGFsUmVmZXJyYWwFDnJlZmVycmFsUmV3YXJkBBRuZXdSZWZlcnJhbFVuY2xhaW1lZAkAZAIFEXJlZmVycmFsVW5jbGFpbWVkBQ5yZWZlcnJhbFJld2FyZAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEYa2V5VW5jbGFpbWVkVG90YWxBZGRyZXNzAQUPcmVmZXJyZXJBZGRyZXNzBRluZXdVbmNsYWltZWRUb3RhbFJlZmVycmVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEYa2V5VW5jbGFpbWVkVG90YWxBZGRyZXNzAQUPcmVmZXJyYWxBZGRyZXNzBRluZXdVbmNsYWltZWRUb3RhbFJlZmVycmFsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5VW5jbGFpbWVkUmVmZXJyZXICBQtwcm9ncmFtTmFtZQUPcmVmZXJyZXJBZGRyZXNzBRRuZXdSZWZlcnJlclVuY2xhaW1lZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleVVuY2xhaW1lZFJlZmVycmFsAgULcHJvZ3JhbU5hbWUFD3JlZmVycmFsQWRkcmVzcwUUbmV3UmVmZXJyYWxVbmNsYWltZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlSZXdhcmRzVG90YWwBBQtwcm9ncmFtTmFtZQkAZAIJAGQCBQxyZXdhcmRzVG90YWwFDnJlZmVycmVyUmV3YXJkBQ5yZWZlcnJhbFJld2FyZAUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBF2luY1VuY2xhaW1lZFdpdGhQYXltZW50Agtwcm9ncmFtTmFtZRFyZWZlcnJlckFkZHJlc3NlcwQMY2hlY2tQcm9ncmFtAwkAAAIFC3Byb2dyYW1OYW1lAgl3eFNwb3RGZWUGCQEIdGhyb3dFcnIBAg9pbnZhbGlkIHByb2dyYW0DCQAAAgUMY2hlY2tQcm9ncmFtBQxjaGVja1Byb2dyYW0KAQNtYXACBWFjY3VtBG5leHQEDGFzc2V0SWRDaGVjawkAAAIJANgEAQkBBXZhbHVlAQgFBG5leHQHYXNzZXRJZAkBBXZhbHVlAQkAoggBCQEQa2V5UmV3YXJkQXNzZXRJZAEFC3Byb2dyYW1OYW1lBAthbW91bnRDaGVjawMFDGFzc2V0SWRDaGVjawYJAQh0aHJvd0VycgECEGludmFsaWQgYXNzZXQgaWQDCQAAAgULYW1vdW50Q2hlY2sFC2Ftb3VudENoZWNrCQDNCAIFBWFjY3VtCAUEbmV4dAZhbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4ECHBheW1lbnRzCgACJGwIBQFpCHBheW1lbnRzCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQNtYXACBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoECXJlc0Ftb3VudAoAAUAJAPwHBAUEdGhpcwIfaW5jVW5jbGFpbWVkV2l0aFBheW1lbnRJbnRlcm5hbAkAzAgCBQhwYXltZW50cwkAzAgCBQtwcm9ncmFtTmFtZQkAzAgCBRFyZWZlcnJlckFkZHJlc3NlcwkAzAgCAAAJAMwIAgAABQNuaWwFA25pbAMJAAECBQFAAgNJbnQFAUAJAAIBCQCsAgIJAAMBBQFAAhggY291bGRuJ3QgYmUgY2FzdCB0byBJbnQDCQAAAgUJcmVzQW1vdW50BQlyZXNBbW91bnQEEHRyZWFzdXJ5Q29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEJAQV2YWx1ZQEJAKIIAQkBE2tleVRyZWFzdXJ5Q29udHJhY3QBBQtwcm9ncmFtTmFtZQQNcmV3YXJkQXNzZXRJZAkA2QQBCQEFdmFsdWUBCQCiCAEJARBrZXlSZXdhcmRBc3NldElkAQULcHJvZ3JhbU5hbWUJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUQdHJlYXN1cnlDb250cmFjdAUJcmVzQW1vdW50BQ1yZXdhcmRBc3NldElkBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEFY2xhaW0BC3Byb2dyYW1OYW1lBBJjaGVja1Byb2dyYW1FeGlzdHMDCQELdmFsdWVPckVsc2UCCQCgCAEJAQ5rZXlQcm9ncmFtTmFtZQEFC3Byb2dyYW1OYW1lBwYJAQh0aHJvd0VycgECFnByb2dyYW0gZG9lcyBub3QgZXhpc3QDCQAAAgUSY2hlY2tQcm9ncmFtRXhpc3RzBRJjaGVja1Byb2dyYW1FeGlzdHMEGGlzSW1wbGVtZW50YXRpb25Db250cmFjdAkAAAIJAKUIAQgFAWkGY2FsbGVyCQEFdmFsdWUBCQCiCAEJARlrZXlJbXBsZW1lbnRhdGlvbkNvbnRyYWN0AQULcHJvZ3JhbU5hbWUEDmNsYWltZXJBZGRyZXNzAwUYaXNJbXBsZW1lbnRhdGlvbkNvbnRyYWN0CQClCAEIBQFpDG9yaWdpbkNhbGxlcgkApQgBCAUBaQZjYWxsZXIEDWNsYWltSW50ZXJuYWwJAPwHBAUEdGhpcwINY2xhaW1JbnRlcm5hbAkAzAgCBQtwcm9ncmFtTmFtZQkAzAgCBQ5jbGFpbWVyQWRkcmVzcwkAzAgCBRhpc0ltcGxlbWVudGF0aW9uQ29udHJhY3QFA25pbAUDbmlsAwkAAAIFDWNsYWltSW50ZXJuYWwFDWNsYWltSW50ZXJuYWwJAJQKAgUDbmlsBQ1jbGFpbUludGVybmFsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCWNsYWltQnVsawAEDWNhbGxlckFkZHJlc3MJAKUIAQgFAWkGY2FsbGVyBBFjYWxsZXJQcm9ncmFtc1N0cgkAoggBCQEWa2V5QWxsUmVmZXJyYWxQcm9ncmFtcwEJAKUIAQgFAWkGY2FsbGVyBA5wcm9ncmFtc0V4aXN0cwMJAQlpc0RlZmluZWQBBRFjYWxsZXJQcm9ncmFtc1N0cgYJAQh0aHJvd0VycgECFG5vIHJlZmVycmFsIHByb2dyYW1zAwkAAAIFDnByb2dyYW1zRXhpc3RzBQ5wcm9ncmFtc0V4aXN0cwQOY2FsbGVyUHJvZ3JhbXMJALUJAgkBBXZhbHVlAQURY2FsbGVyUHJvZ3JhbXNTdHICAl9fBAlidWxrQ2xhaW0JAPwHBAUEdGhpcwIRY2xhaW1CdWxrSW50ZXJuYWwJAMwIAgUNY2FsbGVyQWRkcmVzcwkAzAgCBQ5jYWxsZXJQcm9ncmFtcwkAzAgCAAAFA25pbAUDbmlsAwkAAAIFCWJ1bGtDbGFpbQUJYnVsa0NsYWltCQCUCgIFA25pbAUJYnVsa0NsYWltCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDWNsYWltUkVBRE9OTFkCC3Byb2dyYW1OYW1lC3VzZXJBZGRyZXNzBA5jbGFpbWVyQ2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQESa2V5Q2xhaW1lZFJlZmVycmVyAgULcHJvZ3JhbU5hbWUFC3VzZXJBZGRyZXNzAAAEEGNsYWltZXJVbmNsYWltZWQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFGtleVVuY2xhaW1lZFJlZmVycmVyAgULcHJvZ3JhbU5hbWUFC3VzZXJBZGRyZXNzAAAJAJQKAgUDbmlsCQDMCAIFEGNsYWltZXJVbmNsYWltZWQJAMwIAgUOY2xhaW1lckNsYWltZWQFA25pbAFpARFjbGFpbUJ1bGtSRUFET05MWQEHY2xhaW1lcgQTY2xhaW1lZFRvdGFsQWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEWa2V5Q2xhaW1lZFRvdGFsQWRkcmVzcwEFB2NsYWltZXIAAAQVdW5jbGFpbWVkVG90YWxBZGRyZXNzCQELdmFsdWVPckVsc2UCCQCfCAEJARhrZXlVbmNsYWltZWRUb3RhbEFkZHJlc3MBBQdjbGFpbWVyAAAJAJQKAgUDbmlsCQDMCAIFFXVuY2xhaW1lZFRvdGFsQWRkcmVzcwkAzAgCBRNjbGFpbWVkVG90YWxBZGRyZXNzBQNuaWwBaQEMc2V0VG90YWxLZXlzAgtwcm9ncmFtTmFtZQdhZGRyZXNzBA9jbGFpbWVkUmVmZXJyZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEmtleUNsYWltZWRSZWZlcnJlcgIFC3Byb2dyYW1OYW1lBQdhZGRyZXNzAAAED2NsYWltZWRSZWZlcnJhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQESa2V5Q2xhaW1lZFJlZmVycmFsAgULcHJvZ3JhbU5hbWUFB2FkZHJlc3MAAAQRdW5jbGFpbWVkUmVmZXJyZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFGtleVVuY2xhaW1lZFJlZmVycmVyAgULcHJvZ3JhbU5hbWUFB2FkZHJlc3MAAAQRdW5jbGFpbWVkUmVmZXJyYWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFGtleVVuY2xhaW1lZFJlZmVycmFsAgULcHJvZ3JhbU5hbWUFB2FkZHJlc3MAAAQTY2xhaW1lZFRvdGFsQWRkcmVzcwkAZAIFD2NsYWltZWRSZWZlcnJlcgUPY2xhaW1lZFJlZmVycmFsBBV1bmNsYWltZWRUb3RhbEFkZHJlc3MJAGQCBRF1bmNsYWltZWRSZWZlcnJlcgURdW5jbGFpbWVkUmVmZXJyYWwJAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleUNsYWltZWRUb3RhbEFkZHJlc3MBBQdhZGRyZXNzBRNjbGFpbWVkVG90YWxBZGRyZXNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEYa2V5VW5jbGFpbWVkVG90YWxBZGRyZXNzAQUHYWRkcmVzcwUVdW5jbGFpbWVkVG90YWxBZGRyZXNzBQNuaWwFBHVuaXQBAnR4AQZ2ZXJpZnkABA90YXJnZXRQdWJsaWNLZXkEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAUCcGsDCQABAgUHJG1hdGNoMAIEVW5pdAgFAnR4D3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQ90YXJnZXRQdWJsaWNLZXlOLAaL", "height": 2562879, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3u9veMhkm3g1N8gKqfnrNCnQMGoF4EMZC5UwtiPWxDoG Next: none Diff:
OldNewDifferences
6565 func keyManagerPublicKey () = "%s__managerPublicKey"
6666
6767
68-func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
68+func keyManagerVaultAddress () = "%s__managerVaultAddress"
69+
70+
71+func getManagerAddressOrFail () = addressFromStringValue(getStringValue(keyManagerVaultAddress()))
6972
7073
7174 func keyClaimHistory (programName,userAddress,transactionId,type) = makeString(["%s%s%s%s%s", "history", type, programName, userAddress, transactionId], separator)
7780 func throwErr (msg) = throw(makeString(["referral.ride:", msg], " "))
7881
7982
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-}
83+func managerPublicKeyOrUnit () = {
84+ let managerVaultAddress = getManagerAddressOrFail()
85+ match getString(managerVaultAddress, keyManagerPublicKey()) {
86+ case s: String =>
87+ fromBase58String(s)
88+ case _: Unit =>
89+ unit
90+ case _ =>
91+ throw("Match error")
92+ }
93+ }
9894
9995
10096 func mustManager (i) = {
135131 else throwErr("program does not exist")
136132 if ((checkProgramExists == checkProgramExists))
137133 then {
138- let $t046775614 = if (isImplementationContract)
134+ let $t047005637 = if (isImplementationContract)
139135 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"))
140136 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 = $t046775614._1
142- let claimerUnclaimed = $t046775614._2
143- let keyClaimed = $t046775614._3
144- let keyUnclaimed = $t046775614._4
145- let claimHistoryKey = $t046775614._5
137+ let claimerClaimed = $t047005637._1
138+ let claimerUnclaimed = $t047005637._2
139+ let keyClaimed = $t047005637._3
140+ let keyUnclaimed = $t047005637._4
141+ let claimHistoryKey = $t047005637._5
146142 let claimedTotal = valueOrElse(getInteger(keyClaimedTotal(programName)), 0)
147143 let treasuryContract = value(addressFromString(value(getString(keyTreasuryContract(programName)))))
148144 let rewardAssetId = fromBase58String(value(getString(keyRewardAssetId(programName))))
537533 }
538534
539535
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-
575536 @Verifier(tx)
576537 func verify () = {
577538 let targetPublicKey = match managerPublicKeyOrUnit() {
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "__"
55
66 func keyWxAssetId () = makeString(["%s", "wxAssetId"], separator)
77
88
99 let keyBackendPublicKey = makeString(["%s", "backendPublicKey"], separator)
1010
1111 func keyExistsReferrerToReferral (programName,referrerAddress,referralAddress) = makeString(["%s%s%s%s", "existsReferrerToReferral", programName, referrerAddress, referralAddress], separator)
1212
1313
1414 func keyClaimedReferrer (programName,claimerAddress) = makeString(["%s%s%s", "claimedReferrer", programName, claimerAddress], separator)
1515
1616
1717 func keyClaimedReferral (programName,claimerAddress) = makeString(["%s%s%s", "claimedReferral", programName, claimerAddress], separator)
1818
1919
2020 func keyUnclaimedReferrer (programName,claimerAddress) = makeString(["%s%s%s", "unclaimedReferrer", programName, claimerAddress], separator)
2121
2222
2323 func keyUnclaimedReferral (programName,claimerAddress) = makeString(["%s%s%s", "unclaimedReferral", programName, claimerAddress], separator)
2424
2525
2626 func keyReferrer (programName,referralAddress) = makeString(["%s%s%s", "referrer", programName, referralAddress], separator)
2727
2828
2929 func keyProgramName (programName) = makeString(["%s%s", "programName", programName], separator)
3030
3131
3232 func keyTotalReferralCount (programName,referrerAddress) = makeString(["%s%s%s", "totalReferralCount", programName, referrerAddress], separator)
3333
3434
3535 func keyActiveReferralCount (programName,referrerAddress) = makeString(["%s%s%s", "activeReferralCount", programName, referrerAddress], separator)
3636
3737
3838 func keyIsReferralActive (programName,referralAddress) = makeString(["%s%s%s", "activeReferral", programName, referralAddress], separator)
3939
4040
4141 func keyClaimedTotalAddress (address) = makeString(["%s%s", "claimedTotalAddress", address], separator)
4242
4343
4444 func keyUnclaimedTotalAddress (address) = makeString(["%s%s", "unclaimedTotalAddress", address], separator)
4545
4646
4747 func keyClaimedTotal (programName) = makeString(["%s%s", "claimedTotal", programName], separator)
4848
4949
5050 func keyRewardsTotal (programName) = makeString(["%s%s", "rewardsTotal", programName], separator)
5151
5252
5353 func keyRewardAssetId (programName) = makeString(["%s%s", "rewardAssetId", programName], separator)
5454
5555
5656 func keyTreasuryContract (programName) = makeString(["%s%s", "treasuryContract", programName], separator)
5757
5858
5959 func keyImplementationContract (programName) = makeString(["%s%s", "implementationContract", programName], separator)
6060
6161
6262 func keyAllReferralPrograms (address) = makeString(["%s%s", "allReferralPrograms", address], separator)
6363
6464
6565 func keyManagerPublicKey () = "%s__managerPublicKey"
6666
6767
68-func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
68+func keyManagerVaultAddress () = "%s__managerVaultAddress"
69+
70+
71+func getManagerAddressOrFail () = addressFromStringValue(getStringValue(keyManagerVaultAddress()))
6972
7073
7174 func keyClaimHistory (programName,userAddress,transactionId,type) = makeString(["%s%s%s%s%s", "history", type, programName, userAddress, transactionId], separator)
7275
7376
7477 func formatClaimHistory (amount) = makeString(["%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount)], separator)
7578
7679
7780 func throwErr (msg) = throw(makeString(["referral.ride:", msg], " "))
7881
7982
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-}
83+func managerPublicKeyOrUnit () = {
84+ let managerVaultAddress = getManagerAddressOrFail()
85+ match getString(managerVaultAddress, keyManagerPublicKey()) {
86+ case s: String =>
87+ fromBase58String(s)
88+ case _: Unit =>
89+ unit
90+ case _ =>
91+ throw("Match error")
92+ }
93+ }
9894
9995
10096 func mustManager (i) = {
10197 let pd = throwErr("permission denied")
10298 match managerPublicKeyOrUnit() {
10399 case pk: ByteVector =>
104100 if ((i.callerPublicKey == pk))
105101 then true
106102 else pd
107103 case _: Unit =>
108104 if ((i.caller == this))
109105 then true
110106 else pd
111107 case _ =>
112108 throw("Match error")
113109 }
114110 }
115111
116112
117113 func updateAllReferralPrograms (address,programName) = {
118114 let allReferralPrograms = valueOrElse(getString(keyAllReferralPrograms(address)), "")
119115 let updatedAllReferralPrograms = if (contains(allReferralPrograms, programName))
120116 then nil
121117 else {
122118 let newAllReferralPrograms = if ((allReferralPrograms == ""))
123119 then programName
124120 else makeString([allReferralPrograms, programName], separator)
125121 [StringEntry(keyAllReferralPrograms(address), newAllReferralPrograms)]
126122 }
127123 updatedAllReferralPrograms
128124 }
129125
130126
131127 @Callable(i)
132128 func claimInternal (programName,claimerAddress,isImplementationContract) = {
133129 let checkProgramExists = if (valueOrElse(getBoolean(keyProgramName(programName)), false))
134130 then true
135131 else throwErr("program does not exist")
136132 if ((checkProgramExists == checkProgramExists))
137133 then {
138- let $t046775614 = if (isImplementationContract)
134+ let $t047005637 = if (isImplementationContract)
139135 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"))
140136 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 = $t046775614._1
142- let claimerUnclaimed = $t046775614._2
143- let keyClaimed = $t046775614._3
144- let keyUnclaimed = $t046775614._4
145- let claimHistoryKey = $t046775614._5
137+ let claimerClaimed = $t047005637._1
138+ let claimerUnclaimed = $t047005637._2
139+ let keyClaimed = $t047005637._3
140+ let keyUnclaimed = $t047005637._4
141+ let claimHistoryKey = $t047005637._5
146142 let claimedTotal = valueOrElse(getInteger(keyClaimedTotal(programName)), 0)
147143 let treasuryContract = value(addressFromString(value(getString(keyTreasuryContract(programName)))))
148144 let rewardAssetId = fromBase58String(value(getString(keyRewardAssetId(programName))))
149145 let claimedTotalAddress = valueOrElse(getInteger(keyClaimedTotalAddress(claimerAddress)), 0)
150146 let unclaimedTotalAddress = valueOrElse(getInteger(keyUnclaimedTotalAddress(claimerAddress)), 0)
151147 if (if (isImplementationContract)
152148 then (claimerUnclaimed == 0)
153149 else false)
154150 then $Tuple2(nil, 0)
155151 else {
156152 let checkCanClaim = if ((claimerUnclaimed > 0))
157153 then true
158154 else throwErr("nothing to claim")
159155 if ((checkCanClaim == checkCanClaim))
160156 then {
161157 let newClaimerClaimed = (claimerClaimed + claimerUnclaimed)
162158 let newClaimedTotal = (claimedTotal + claimerUnclaimed)
163159 let newClaimedTotalAddress = (claimedTotalAddress + claimerUnclaimed)
164160 let newUnclaimedTotalAddress = (unclaimedTotalAddress - claimerUnclaimed)
165161 let balanceBefore = value(assetBalance(this, rewardAssetId))
166162 if ((balanceBefore == balanceBefore))
167163 then {
168164 let res = invoke(treasuryContract, "withdrawReferralReward", [claimerUnclaimed], nil)
169165 if ((res == res))
170166 then {
171167 let balanceAfter = value(assetBalance(this, rewardAssetId))
172168 if ((balanceAfter == balanceAfter))
173169 then {
174170 let balanceDiff = (balanceAfter - balanceBefore)
175171 if ((balanceDiff == balanceDiff))
176172 then {
177173 let checkBalance = if ((balanceDiff == claimerUnclaimed))
178174 then true
179175 else throwErr("insufficient balance on referral contract")
180176 if ((checkBalance == checkBalance))
181177 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)
182178 else throw("Strict value is not equal to itself.")
183179 }
184180 else throw("Strict value is not equal to itself.")
185181 }
186182 else throw("Strict value is not equal to itself.")
187183 }
188184 else throw("Strict value is not equal to itself.")
189185 }
190186 else throw("Strict value is not equal to itself.")
191187 }
192188 else throw("Strict value is not equal to itself.")
193189 }
194190 }
195191 else throw("Strict value is not equal to itself.")
196192 }
197193
198194
199195
200196 @Callable(i)
201197 func claimBulkInternal (claimer,programNames,currentIter) = {
202198 let checkCaller = if ((i.caller == this))
203199 then true
204200 else throwErr("permission denied")
205201 if ((checkCaller == checkCaller))
206202 then if ((currentIter == size(programNames)))
207203 then nil
208204 else {
209205 let programName = programNames[currentIter]
210206 let programUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, claimer)), 0)
211207 let claimHistoryKey = keyClaimHistory(programName, claimer, toBase58String(i.transactionId), "claimBulk")
212208 let claimBulkInternal = invoke(this, "claimBulkInternal", [claimer, programNames, (currentIter + 1)], nil)
213209 if ((claimBulkInternal == claimBulkInternal))
214210 then {
215211 let unclaimedReferrer = valueOrElse(getInteger(keyUnclaimedReferrer(programName, claimer)), 0)
216212 let claim = if ((unclaimedReferrer > 0))
217213 then invoke(this, "claimInternal", [programName, claimer, false], nil)
218214 else unit
219215 if ((claim == claim))
220216 then $Tuple2(nil, [claimBulkInternal, claim])
221217 else throw("Strict value is not equal to itself.")
222218 }
223219 else throw("Strict value is not equal to itself.")
224220 }
225221 else throw("Strict value is not equal to itself.")
226222 }
227223
228224
229225
230226 @Callable(i)
231227 func incUnclaimedWithPaymentInternal (paymentAmounts,programName,referrerAddresses,currentIter,resAmount) = {
232228 let checkCaller = if ((i.caller == this))
233229 then true
234230 else throwErr("permission denied")
235231 if ((checkCaller == checkCaller))
236232 then {
237233 let argsComparison = (size(paymentAmounts) == size(referrerAddresses))
238234 let check = if (argsComparison)
239235 then true
240236 else throwErr("lists in args must be same size")
241237 if ((check == check))
242238 then if ((currentIter == size(paymentAmounts)))
243239 then $Tuple2(nil, resAmount)
244240 else {
245241 let referrerAddress = referrerAddresses[currentIter]
246242 let unclaimedTotalAddress = valueOrElse(getInteger(keyUnclaimedTotalAddress(referrerAddress)), 0)
247243 let referrerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, referrerAddress)), 0)
248244 let rewardsTotal = valueOrElse(getInteger(keyRewardsTotal(programName)), 0)
249245 let newUnclaimedTotalAddress = (unclaimedTotalAddress + paymentAmounts[currentIter])
250246 let newReferrerUnclaimed = (referrerUnclaimed + paymentAmounts[currentIter])
251247 let newResAmount = (resAmount + paymentAmounts[currentIter])
252248 let inv = invoke(this, "incUnclaimedWithPaymentInternal", [paymentAmounts, programName, referrerAddresses, (currentIter + 1), newResAmount], nil)
253249 if ((inv == inv))
254250 then {
255251 let updatedAllReferrerPrograms = updateAllReferralPrograms(referrerAddress, programName)
256252 $Tuple2(([IntegerEntry(keyUnclaimedTotalAddress(referrerAddress), newUnclaimedTotalAddress), IntegerEntry(keyUnclaimedReferrer(programName, referrerAddress), newReferrerUnclaimed), IntegerEntry(keyRewardsTotal(programName), (rewardsTotal + paymentAmounts[currentIter]))] ++ updatedAllReferrerPrograms), inv)
257253 }
258254 else throw("Strict value is not equal to itself.")
259255 }
260256 else throw("Strict value is not equal to itself.")
261257 }
262258 else throw("Strict value is not equal to itself.")
263259 }
264260
265261
266262
267263 @Callable(i)
268264 func createReferralProgram (programName,treasuryContract,implementationContract,rewardAssetId) = {
269265 let checkCaller = mustManager(i)
270266 if ((checkCaller == checkCaller))
271267 then {
272268 let checkProgramName = if ((getBoolean(keyProgramName(programName)) == unit))
273269 then true
274270 else throwErr("program name already exists")
275271 if ((checkProgramName == checkProgramName))
276272 then {
277273 let programNameIsValid = if (!(contains(programName, separator)))
278274 then !(contains(programName, " "))
279275 else false
280276 let checkProgramExists = if (programNameIsValid)
281277 then true
282278 else throwErr("invalid program name")
283279 if ((checkProgramExists == checkProgramExists))
284280 then {
285281 let checkRewardAsset = if ((assetInfo(fromBase58String(rewardAssetId)) != unit))
286282 then true
287283 else throwErr("invalid reward asset id")
288284 if ((checkRewardAsset == checkRewardAsset))
289285 then $Tuple2([BooleanEntry(keyProgramName(programName), true), StringEntry(keyTreasuryContract(programName), treasuryContract), StringEntry(keyImplementationContract(programName), implementationContract), StringEntry(keyRewardAssetId(programName), rewardAssetId), IntegerEntry(keyRewardsTotal(programName), 0)], unit)
290286 else throw("Strict value is not equal to itself.")
291287 }
292288 else throw("Strict value is not equal to itself.")
293289 }
294290 else throw("Strict value is not equal to itself.")
295291 }
296292 else throw("Strict value is not equal to itself.")
297293 }
298294
299295
300296
301297 @Callable(i)
302298 func createPair (programName,referrerAddress,referralAddress,signature) = {
303299 let checkProgramExists = if (valueOrElse(getBoolean(keyProgramName(programName)), false))
304300 then true
305301 else throwErr("program does not exist")
306302 if ((checkProgramExists == checkProgramExists))
307303 then {
308304 let pairReferrerToReferralExistCheck = if ((getBoolean(keyExistsReferrerToReferral(programName, referrerAddress, referralAddress)) == unit))
309305 then true
310306 else throwErr("pair already exists")
311307 if ((pairReferrerToReferralExistCheck == pairReferrerToReferralExistCheck))
312308 then {
313309 let noRefSelf = if ((referrerAddress != referralAddress))
314310 then true
315311 else throwErr("cannot refer to self")
316312 if ((noRefSelf == noRefSelf))
317313 then {
318314 let pair = toBytes(makeString([programName, referrerAddress, referralAddress], ":"))
319315 let backendPublicKey = fromBase58String(value(getString(keyBackendPublicKey)))
320316 let validateSignature = if (sigVerify(pair, signature, backendPublicKey))
321317 then true
322318 else throwErr("bad signature")
323319 if ((validateSignature == validateSignature))
324320 then {
325321 let totalReferralCount = valueOrElse(getInteger(keyTotalReferralCount(programName, referrerAddress)), 0)
326322 let newTotalReferralCount = (totalReferralCount + 1)
327323 let updatedAllReferrerPrograms = updateAllReferralPrograms(referrerAddress, programName)
328324 let updatedAllReferralPrograms = updateAllReferralPrograms(referralAddress, programName)
329325 $Tuple2((([BooleanEntry(keyExistsReferrerToReferral(programName, referrerAddress, referralAddress), true), IntegerEntry(keyTotalReferralCount(programName, referrerAddress), newTotalReferralCount), StringEntry(keyReferrer(programName, referralAddress), referrerAddress)] ++ updatedAllReferrerPrograms) ++ updatedAllReferralPrograms), unit)
330326 }
331327 else throw("Strict value is not equal to itself.")
332328 }
333329 else throw("Strict value is not equal to itself.")
334330 }
335331 else throw("Strict value is not equal to itself.")
336332 }
337333 else throw("Strict value is not equal to itself.")
338334 }
339335
340336
341337
342338 @Callable(i)
343339 func updateReferralActivity (programName,referralAddress,isActive) = {
344340 let implementationContract = value(getString(keyImplementationContract(programName)))
345341 let isReferralActive = (getBoolean(keyIsReferralActive(programName, referralAddress)) != unit)
346342 let referrerAddress = value(getString(keyReferrer(programName, referralAddress)))
347343 let checkCaller = if ((toString(i.caller) == implementationContract))
348344 then true
349345 else throwErr("permission denied")
350346 if ((checkCaller == checkCaller))
351347 then {
352348 let update = if ((isReferralActive == isActive))
353349 then $Tuple2(nil, unit)
354350 else {
355351 let update = if ((isActive == true))
356352 then {
357353 let newActiveReferralCount = (valueOrElse(getInteger(keyActiveReferralCount(programName, referrerAddress)), 0) + 1)
358354 $Tuple2([BooleanEntry(keyIsReferralActive(programName, referralAddress), true), IntegerEntry(keyActiveReferralCount(programName, referrerAddress), newActiveReferralCount)], unit)
359355 }
360356 else {
361357 let newActiveReferralCount = (valueOrElse(getInteger(keyActiveReferralCount(programName, referrerAddress)), 0) - 1)
362358 $Tuple2([DeleteEntry(keyIsReferralActive(programName, referralAddress)), IntegerEntry(keyActiveReferralCount(programName, referrerAddress), newActiveReferralCount)], unit)
363359 }
364360 update
365361 }
366362 update
367363 }
368364 else throw("Strict value is not equal to itself.")
369365 }
370366
371367
372368
373369 @Callable(i)
374370 func incUnclaimed (programName,referralAddress,referrerReward,referralReward) = {
375371 let implementationContract = value(getString(keyImplementationContract(programName)))
376372 let referrerAddress = value(getString(keyReferrer(programName, referralAddress)))
377373 let checkCaller = if ((toString(i.caller) == implementationContract))
378374 then true
379375 else throwErr("permission denied")
380376 if ((checkCaller == checkCaller))
381377 then {
382378 let checkProgram = if ((programName == "wxlock"))
383379 then true
384380 else throwErr("invalid program")
385381 if ((checkProgram == checkProgram))
386382 then {
387383 let checkReferrerInProgram = if (contains(valueOrElse(getString(keyAllReferralPrograms(referrerAddress)), ""), programName))
388384 then true
389385 else throwErr(((("referrer not in program=" + programName) + " addr=") + referrerAddress))
390386 if ((checkReferrerInProgram == checkReferrerInProgram))
391387 then {
392388 let checkReferralInProgram = if (contains(valueOrElse(getString(keyAllReferralPrograms(referralAddress)), ""), programName))
393389 then true
394390 else throwErr(((("referral not in program=" + programName) + " addr=") + referralAddress))
395391 if ((checkReferralInProgram == checkReferralInProgram))
396392 then {
397393 let unclaimedTotalReferrer = valueOrElse(getInteger(keyUnclaimedTotalAddress(referrerAddress)), 0)
398394 let referrerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, referrerAddress)), 0)
399395 let unclaimedTotalReferral = valueOrElse(getInteger(keyUnclaimedTotalAddress(referralAddress)), 0)
400396 let referralUnclaimed = valueOrElse(getInteger(keyUnclaimedReferral(programName, referralAddress)), 0)
401397 let rewardsTotal = valueOrElse(getInteger(keyRewardsTotal(programName)), 0)
402398 let newUnclaimedTotalReferrer = (unclaimedTotalReferrer + referrerReward)
403399 let newReferrerUnclaimed = (referrerUnclaimed + referrerReward)
404400 let newUnclaimedTotalReferral = (unclaimedTotalReferral + referralReward)
405401 let newReferralUnclaimed = (referralUnclaimed + referralReward)
406402 $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)
407403 }
408404 else throw("Strict value is not equal to itself.")
409405 }
410406 else throw("Strict value is not equal to itself.")
411407 }
412408 else throw("Strict value is not equal to itself.")
413409 }
414410 else throw("Strict value is not equal to itself.")
415411 }
416412
417413
418414
419415 @Callable(i)
420416 func incUnclaimedWithPayment (programName,referrerAddresses) = {
421417 let checkProgram = if ((programName == "wxSpotFee"))
422418 then true
423419 else throwErr("invalid program")
424420 if ((checkProgram == checkProgram))
425421 then {
426422 func map (accum,next) = {
427423 let assetIdCheck = (toBase58String(value(next.assetId)) == value(getString(keyRewardAssetId(programName))))
428424 let amountCheck = if (assetIdCheck)
429425 then true
430426 else throwErr("invalid asset id")
431427 if ((amountCheck == amountCheck))
432428 then (accum :+ next.amount)
433429 else throw("Strict value is not equal to itself.")
434430 }
435431
436432 let payments = {
437433 let $l = i.payments
438434 let $s = size($l)
439435 let $acc0 = nil
440436 func $f0_1 ($a,$i) = if (($i >= $s))
441437 then $a
442438 else map($a, $l[$i])
443439
444440 func $f0_2 ($a,$i) = if (($i >= $s))
445441 then $a
446442 else throw("List size exceeds 10")
447443
448444 $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)
449445 }
450446 let resAmount = {
451447 let @ = invoke(this, "incUnclaimedWithPaymentInternal", [payments, programName, referrerAddresses, 0, 0], nil)
452448 if ($isInstanceOf(@, "Int"))
453449 then @
454450 else throw(($getType(@) + " couldn't be cast to Int"))
455451 }
456452 if ((resAmount == resAmount))
457453 then {
458454 let treasuryContract = addressFromStringValue(value(getString(keyTreasuryContract(programName))))
459455 let rewardAssetId = fromBase58String(value(getString(keyRewardAssetId(programName))))
460456 [ScriptTransfer(treasuryContract, resAmount, rewardAssetId)]
461457 }
462458 else throw("Strict value is not equal to itself.")
463459 }
464460 else throw("Strict value is not equal to itself.")
465461 }
466462
467463
468464
469465 @Callable(i)
470466 func claim (programName) = {
471467 let checkProgramExists = if (valueOrElse(getBoolean(keyProgramName(programName)), false))
472468 then true
473469 else throwErr("program does not exist")
474470 if ((checkProgramExists == checkProgramExists))
475471 then {
476472 let isImplementationContract = (toString(i.caller) == value(getString(keyImplementationContract(programName))))
477473 let claimerAddress = if (isImplementationContract)
478474 then toString(i.originCaller)
479475 else toString(i.caller)
480476 let claimInternal = invoke(this, "claimInternal", [programName, claimerAddress, isImplementationContract], nil)
481477 if ((claimInternal == claimInternal))
482478 then $Tuple2(nil, claimInternal)
483479 else throw("Strict value is not equal to itself.")
484480 }
485481 else throw("Strict value is not equal to itself.")
486482 }
487483
488484
489485
490486 @Callable(i)
491487 func claimBulk () = {
492488 let callerAddress = toString(i.caller)
493489 let callerProgramsStr = getString(keyAllReferralPrograms(toString(i.caller)))
494490 let programsExists = if (isDefined(callerProgramsStr))
495491 then true
496492 else throwErr("no referral programs")
497493 if ((programsExists == programsExists))
498494 then {
499495 let callerPrograms = split(value(callerProgramsStr), "__")
500496 let bulkClaim = invoke(this, "claimBulkInternal", [callerAddress, callerPrograms, 0], nil)
501497 if ((bulkClaim == bulkClaim))
502498 then $Tuple2(nil, bulkClaim)
503499 else throw("Strict value is not equal to itself.")
504500 }
505501 else throw("Strict value is not equal to itself.")
506502 }
507503
508504
509505
510506 @Callable(i)
511507 func claimREADONLY (programName,userAddress) = {
512508 let claimerClaimed = valueOrElse(getInteger(keyClaimedReferrer(programName, userAddress)), 0)
513509 let claimerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, userAddress)), 0)
514510 $Tuple2(nil, [claimerUnclaimed, claimerClaimed])
515511 }
516512
517513
518514
519515 @Callable(i)
520516 func claimBulkREADONLY (claimer) = {
521517 let claimedTotalAddress = valueOrElse(getInteger(keyClaimedTotalAddress(claimer)), 0)
522518 let unclaimedTotalAddress = valueOrElse(getInteger(keyUnclaimedTotalAddress(claimer)), 0)
523519 $Tuple2(nil, [unclaimedTotalAddress, claimedTotalAddress])
524520 }
525521
526522
527523
528524 @Callable(i)
529525 func setTotalKeys (programName,address) = {
530526 let claimedReferrer = valueOrElse(getInteger(keyClaimedReferrer(programName, address)), 0)
531527 let claimedReferral = valueOrElse(getInteger(keyClaimedReferral(programName, address)), 0)
532528 let unclaimedReferrer = valueOrElse(getInteger(keyUnclaimedReferrer(programName, address)), 0)
533529 let unclaimedReferral = valueOrElse(getInteger(keyUnclaimedReferral(programName, address)), 0)
534530 let claimedTotalAddress = (claimedReferrer + claimedReferral)
535531 let unclaimedTotalAddress = (unclaimedReferrer + unclaimedReferral)
536532 $Tuple2([IntegerEntry(keyClaimedTotalAddress(address), claimedTotalAddress), IntegerEntry(keyUnclaimedTotalAddress(address), unclaimedTotalAddress)], unit)
537533 }
538534
539535
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-
575536 @Verifier(tx)
576537 func verify () = {
577538 let targetPublicKey = match managerPublicKeyOrUnit() {
578539 case pk: ByteVector =>
579540 pk
580541 case _: Unit =>
581542 tx.senderPublicKey
582543 case _ =>
583544 throw("Match error")
584545 }
585546 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
586547 }
587548

github/deemru/w8io/873ac7e 
60.04 ms