tx · G8n6rox5LycvVVH6jAwZciynRyPk4FYCGbtBqBM8p7PF

3NAsFvuLwxz1iUtZ9fmhfmSN16r9NEsPqsh:  -0.02400000 Waves

2022.10.07 18:33 [2262096] smart account 3NAsFvuLwxz1iUtZ9fmhfmSN16r9NEsPqsh > SELF 0.00000000 Waves

{ "type": 13, "id": "G8n6rox5LycvVVH6jAwZciynRyPk4FYCGbtBqBM8p7PF", "fee": 2400000, "feeAssetId": null, "timestamp": 1665156804817, "version": 1, "sender": "3NAsFvuLwxz1iUtZ9fmhfmSN16r9NEsPqsh", "senderPublicKey": "33fpjdpM9FMu87RZKePniPardKqQXM96sm7VhAk3JEVQ", "proofs": [ "51x1Ahwfb1rcXwyj9uXtCtp8W8tYYtxYrTJVaKRFQaGVCMobtRyHgBPxTx8sKZJZbDCyRBjpHGzrvQBqn2L9LmT" ], "script": "base64:BgJXCAISBQoDCAgEEgUKAwgYARIHCgURCBgBARIGCgQICAgIEgYKBAgICAISBQoDCAgEEgYKBAgIAQESBAoCCBgSAwoBCBIAEgQKAggIEgMKAQgSAwoBCBIAIAAJc2VwYXJhdG9yAgJfXwEMa2V5V3hBc3NldElkAAkAuQkCCQDMCAICAiVzCQDMCAICCXd4QXNzZXRJZAUDbmlsBQlzZXBhcmF0b3IAE2tleUJhY2tlbmRQdWJsaWNLZXkJALkJAgkAzAgCAgIlcwkAzAgCAhBiYWNrZW5kUHVibGljS2V5BQNuaWwFCXNlcGFyYXRvcgEba2V5RXhpc3RzUmVmZXJyZXJUb1JlZmVycmFsAwtwcm9ncmFtTmFtZQ9yZWZlcnJlckFkZHJlc3MPcmVmZXJyYWxBZGRyZXNzCQC5CQIJAMwIAgIIJXMlcyVzJXMJAMwIAgIYZXhpc3RzUmVmZXJyZXJUb1JlZmVycmFsCQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFD3JlZmVycmVyQWRkcmVzcwkAzAgCBQ9yZWZlcnJhbEFkZHJlc3MFA25pbAUJc2VwYXJhdG9yARJrZXlDbGFpbWVkUmVmZXJyZXICC3Byb2dyYW1OYW1lDmNsYWltZXJBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICD2NsYWltZWRSZWZlcnJlcgkAzAgCBQtwcm9ncmFtTmFtZQkAzAgCBQ5jbGFpbWVyQWRkcmVzcwUDbmlsBQlzZXBhcmF0b3IBEmtleUNsYWltZWRSZWZlcnJhbAILcHJvZ3JhbU5hbWUOY2xhaW1lckFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIPY2xhaW1lZFJlZmVycmFsCQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFDmNsYWltZXJBZGRyZXNzBQNuaWwFCXNlcGFyYXRvcgEUa2V5VW5jbGFpbWVkUmVmZXJyZXICC3Byb2dyYW1OYW1lDmNsYWltZXJBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICEXVuY2xhaW1lZFJlZmVycmVyCQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFDmNsYWltZXJBZGRyZXNzBQNuaWwFCXNlcGFyYXRvcgEUa2V5VW5jbGFpbWVkUmVmZXJyYWwCC3Byb2dyYW1OYW1lDmNsYWltZXJBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICEXVuY2xhaW1lZFJlZmVycmFsCQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFDmNsYWltZXJBZGRyZXNzBQNuaWwFCXNlcGFyYXRvcgELa2V5UmVmZXJyZXICC3Byb2dyYW1OYW1lD3JlZmVycmFsQWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAghyZWZlcnJlcgkAzAgCBQtwcm9ncmFtTmFtZQkAzAgCBQ9yZWZlcnJhbEFkZHJlc3MFA25pbAUJc2VwYXJhdG9yAQ5rZXlQcm9ncmFtTmFtZQELcHJvZ3JhbU5hbWUJALkJAgkAzAgCAgQlcyVzCQDMCAICC3Byb2dyYW1OYW1lCQDMCAIFC3Byb2dyYW1OYW1lBQNuaWwFCXNlcGFyYXRvcgEVa2V5VG90YWxSZWZlcnJhbENvdW50Agtwcm9ncmFtTmFtZQ9yZWZlcnJlckFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgISdG90YWxSZWZlcnJhbENvdW50CQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFD3JlZmVycmVyQWRkcmVzcwUDbmlsBQlzZXBhcmF0b3IBFmtleUFjdGl2ZVJlZmVycmFsQ291bnQCC3Byb2dyYW1OYW1lD3JlZmVycmVyQWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAhNhY3RpdmVSZWZlcnJhbENvdW50CQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFD3JlZmVycmVyQWRkcmVzcwUDbmlsBQlzZXBhcmF0b3IBE2tleUlzUmVmZXJyYWxBY3RpdmUCC3Byb2dyYW1OYW1lD3JlZmVycmFsQWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAg5hY3RpdmVSZWZlcnJhbAkAzAgCBQtwcm9ncmFtTmFtZQkAzAgCBQ9yZWZlcnJhbEFkZHJlc3MFA25pbAUJc2VwYXJhdG9yARZrZXlDbGFpbWVkVG90YWxBZGRyZXNzAQdhZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAhNjbGFpbWVkVG90YWxBZGRyZXNzCQDMCAIFB2FkZHJlc3MFA25pbAUJc2VwYXJhdG9yARhrZXlVbmNsYWltZWRUb3RhbEFkZHJlc3MBB2FkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICFXVuY2xhaW1lZFRvdGFsQWRkcmVzcwkAzAgCBQdhZGRyZXNzBQNuaWwFCXNlcGFyYXRvcgEPa2V5Q2xhaW1lZFRvdGFsAQtwcm9ncmFtTmFtZQkAuQkCCQDMCAICBCVzJXMJAMwIAgIMY2xhaW1lZFRvdGFsCQDMCAIFC3Byb2dyYW1OYW1lBQNuaWwFCXNlcGFyYXRvcgEPa2V5UmV3YXJkc1RvdGFsAQtwcm9ncmFtTmFtZQkAuQkCCQDMCAICBCVzJXMJAMwIAgIMcmV3YXJkc1RvdGFsCQDMCAIFC3Byb2dyYW1OYW1lBQNuaWwFCXNlcGFyYXRvcgEQa2V5UmV3YXJkQXNzZXRJZAELcHJvZ3JhbU5hbWUJALkJAgkAzAgCAgQlcyVzCQDMCAICDXJld2FyZEFzc2V0SWQJAMwIAgULcHJvZ3JhbU5hbWUFA25pbAUJc2VwYXJhdG9yARNrZXlUcmVhc3VyeUNvbnRyYWN0AQtwcm9ncmFtTmFtZQkAuQkCCQDMCAICBCVzJXMJAMwIAgIQdHJlYXN1cnlDb250cmFjdAkAzAgCBQtwcm9ncmFtTmFtZQUDbmlsBQlzZXBhcmF0b3IBGWtleUltcGxlbWVudGF0aW9uQ29udHJhY3QBC3Byb2dyYW1OYW1lCQC5CQIJAMwIAgIEJXMlcwkAzAgCAhZpbXBsZW1lbnRhdGlvbkNvbnRyYWN0CQDMCAIFC3Byb2dyYW1OYW1lBQNuaWwFCXNlcGFyYXRvcgEWa2V5QWxsUmVmZmVyYWxQcm9ncmFtcwEHYWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgITYWxsUmVmZXJyYWxQcm9ncmFtcwkAzAgCBQdhZGRyZXNzBQNuaWwFCXNlcGFyYXRvcgEWa2V5Q2xhaW1lZFRvdGFsUHJvZ3JhbQELcHJvZ3JhbU5hbWUJALkJAgkAzAgCAgQlcyVzCQDMCAICE2NsYWltZWRUb3RhbFByb2dyYW0JAMwIAgULcHJvZ3JhbU5hbWUFA25pbAUJc2VwYXJhdG9yARFrZXlVbmNsYWltZWRUb3RhbAEHYWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIVdW5jbGFpbWVkVG90YWxBZGRyZXNzCQDMCAIFB2FkZHJlc3MFA25pbAUJc2VwYXJhdG9yARlrZXlMYXN0QnVsa0NsYWltQ2FsbEJsb2NrAQdhZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAhZsYXN0QnVsa0NsYWltQ2FsbEJsb2NrCQDMCAIFB2FkZHJlc3MFA25pbAUJc2VwYXJhdG9yARNrZXlNYW5hZ2VyUHVibGljS2V5AAIUJXNfX21hbmFnZXJQdWJsaWNLZXkBGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAIbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AQ9rZXlDbGFpbUhpc3RvcnkEC3Byb2dyYW1OYW1lC3VzZXJBZGRyZXNzDXRyYW5zYWN0aW9uSWQEdHlwZQkAuQkCCQDMCAICCiVzJXMlcyVzJXMJAMwIAgIHaGlzdG9yeQkAzAgCBQR0eXBlCQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFC3VzZXJBZGRyZXNzCQDMCAIFDXRyYW5zYWN0aW9uSWQFA25pbAUJc2VwYXJhdG9yARJmb3JtYXRDbGFpbUhpc3RvcnkBBmFtb3VudAkAuQkCCQDMCAICBiVkJWQlZAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sGaGVpZ2h0CQDMCAIJAKQDAQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkApAMBBQZhbW91bnQFA25pbAUJc2VwYXJhdG9yAQh0aHJvd0VycgEDbXNnCQACAQkAuQkCCQDMCAICDnJlZmVycmFsLnJpZGU6CQDMCAIFA21zZwUDbmlsAgEgARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAQHJG1hdGNoMAkAoggBCQETa2V5TWFuYWdlclB1YmxpY0tleQADCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQDZBAEFAXMDCQABAgUHJG1hdGNoMAIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAR1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdAAEByRtYXRjaDAJAKIIAQkBGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJANkEAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBC211c3RNYW5hZ2VyAQFpBAJwZAkBCHRocm93RXJyAQIRcGVybWlzc2lvbiBkZW5pZWQEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAMJAAACCAUBaQ9jYWxsZXJQdWJsaWNLZXkFAnBrBgUCcGQDCQABAgUHJG1hdGNoMAIEVW5pdAMJAAACCAUBaQZjYWxsZXIFBHRoaXMGBQJwZAkAAgECC01hdGNoIGVycm9yDgFpAQ1jbGFpbUludGVybmFsAwtwcm9ncmFtTmFtZQ5jbGFpbWVyQWRkcmVzcxhpc0ltcGxlbWVudGF0aW9uQ29udHJhY3QEEmNoZWNrUHJvZ3JhbUV4aXN0cwMJAQt2YWx1ZU9yRWxzZQIJAKAIAQkBDmtleVByb2dyYW1OYW1lAQULcHJvZ3JhbU5hbWUHBgkBCHRocm93RXJyAQIWcHJvZ3JhbSBkb2VzIG5vdCBleGlzdAMJAAACBRJjaGVja1Byb2dyYW1FeGlzdHMFEmNoZWNrUHJvZ3JhbUV4aXN0cwQLJHQwNDQ3MjU0MDkDBRhpc0ltcGxlbWVudGF0aW9uQ29udHJhY3QJAJcKBQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQESa2V5Q2xhaW1lZFJlZmVycmFsAgULcHJvZ3JhbU5hbWUFDmNsYWltZXJBZGRyZXNzAAAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFGtleVVuY2xhaW1lZFJlZmVycmFsAgULcHJvZ3JhbU5hbWUFDmNsYWltZXJBZGRyZXNzAAAJARJrZXlDbGFpbWVkUmVmZXJyYWwCBQtwcm9ncmFtTmFtZQUOY2xhaW1lckFkZHJlc3MJARRrZXlVbmNsYWltZWRSZWZlcnJhbAIFC3Byb2dyYW1OYW1lBQ5jbGFpbWVyQWRkcmVzcwkBD2tleUNsYWltSGlzdG9yeQQFC3Byb2dyYW1OYW1lBQ5jbGFpbWVyQWRkcmVzcwkA2AQBCAUBaQ10cmFuc2FjdGlvbklkAg1jbGFpbVJlZmVycmFsCQCXCgUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEmtleUNsYWltZWRSZWZlcnJlcgIFC3Byb2dyYW1OYW1lBQ5jbGFpbWVyQWRkcmVzcwAACQELdmFsdWVPckVsc2UCCQCfCAEJARRrZXlVbmNsYWltZWRSZWZlcnJlcgIFC3Byb2dyYW1OYW1lBQ5jbGFpbWVyQWRkcmVzcwAACQESa2V5Q2xhaW1lZFJlZmVycmVyAgULcHJvZ3JhbU5hbWUFDmNsYWltZXJBZGRyZXNzCQEUa2V5VW5jbGFpbWVkUmVmZXJyZXICBQtwcm9ncmFtTmFtZQUOY2xhaW1lckFkZHJlc3MJAQ9rZXlDbGFpbUhpc3RvcnkEBQtwcm9ncmFtTmFtZQUOY2xhaW1lckFkZHJlc3MJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAINY2xhaW1SZWZlcnJlcgQOY2xhaW1lckNsYWltZWQIBQskdDA0NDcyNTQwOQJfMQQQY2xhaW1lclVuY2xhaW1lZAgFCyR0MDQ0NzI1NDA5Al8yBAprZXlDbGFpbWVkCAULJHQwNDQ3MjU0MDkCXzMEDGtleVVuY2xhaW1lZAgFCyR0MDQ0NzI1NDA5Al80BA9jbGFpbUhpc3RvcnlLZXkIBQskdDA0NDcyNTQwOQJfNQQMY2xhaW1lZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEJAQ9rZXlDbGFpbWVkVG90YWwBBQtwcm9ncmFtTmFtZQAABBB0cmVhc3VyeUNvbnRyYWN0CQEFdmFsdWUBCQCmCAEJAQV2YWx1ZQEJAKIIAQkBE2tleVRyZWFzdXJ5Q29udHJhY3QBBQtwcm9ncmFtTmFtZQQNcmV3YXJkQXNzZXRJZAkA2QQBCQEFdmFsdWUBCQCiCAEJARBrZXlSZXdhcmRBc3NldElkAQULcHJvZ3JhbU5hbWUEE2NsYWltZWRUb3RhbEFkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFmtleUNsYWltZWRUb3RhbEFkZHJlc3MBBQ5jbGFpbWVyQWRkcmVzcwAABBV1bmNsYWltZWRUb3RhbEFkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGGtleVVuY2xhaW1lZFRvdGFsQWRkcmVzcwEFDmNsYWltZXJBZGRyZXNzAAADAwUYaXNJbXBsZW1lbnRhdGlvbkNvbnRyYWN0CQAAAgUQY2xhaW1lclVuY2xhaW1lZAAABwkAlAoCBQNuaWwAAAQNY2hlY2tDYW5DbGFpbQMJAGYCBRBjbGFpbWVyVW5jbGFpbWVkAAAGCQEIdGhyb3dFcnIBAhBub3RoaW5nIHRvIGNsYWltAwkAAAIFDWNoZWNrQ2FuQ2xhaW0FDWNoZWNrQ2FuQ2xhaW0EEW5ld0NsYWltZXJDbGFpbWVkCQBkAgUOY2xhaW1lckNsYWltZWQFEGNsYWltZXJVbmNsYWltZWQED25ld0NsYWltZWRUb3RhbAkAZAIFDGNsYWltZWRUb3RhbAUQY2xhaW1lclVuY2xhaW1lZAQWbmV3Q2xhaW1lZFRvdGFsQWRkcmVzcwkAZAIFE2NsYWltZWRUb3RhbEFkZHJlc3MFEGNsYWltZXJVbmNsYWltZWQEGG5ld1VuY2xhaW1lZFRvdGFsQWRkcmVzcwkAZQIFFXVuY2xhaW1lZFRvdGFsQWRkcmVzcwUQY2xhaW1lclVuY2xhaW1lZAQNYmFsYW5jZUJlZm9yZQkBBXZhbHVlAQkA8AcCBQR0aGlzBQ1yZXdhcmRBc3NldElkAwkAAAIFDWJhbGFuY2VCZWZvcmUFDWJhbGFuY2VCZWZvcmUEA3JlcwkA/AcEBRB0cmVhc3VyeUNvbnRyYWN0AhZ3aXRoZHJhd1JlZmVycmFsUmV3YXJkCQDMCAIFEGNsYWltZXJVbmNsYWltZWQFA25pbAUDbmlsAwkAAAIFA3JlcwUDcmVzBAxiYWxhbmNlQWZ0ZXIJAQV2YWx1ZQEJAPAHAgUEdGhpcwUNcmV3YXJkQXNzZXRJZAMJAAACBQxiYWxhbmNlQWZ0ZXIFDGJhbGFuY2VBZnRlcgQLYmFsYW5jZURpZmYJAGUCBQxiYWxhbmNlQWZ0ZXIFDWJhbGFuY2VCZWZvcmUDCQAAAgULYmFsYW5jZURpZmYFC2JhbGFuY2VEaWZmBAxjaGVja0JhbGFuY2UDCQAAAgULYmFsYW5jZURpZmYFEGNsYWltZXJVbmNsYWltZWQGCQEIdGhyb3dFcnIBAilpbnN1ZmZpY2llbnQgYmFsYW5jZSBvbiByZWZlcnJhbCBjb250cmFjdAMJAAACBQxjaGVja0JhbGFuY2UFDGNoZWNrQmFsYW5jZQkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQprZXlDbGFpbWVkBRFuZXdDbGFpbWVyQ2xhaW1lZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUMa2V5VW5jbGFpbWVkAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlDbGFpbWVkVG90YWwBBQtwcm9ncmFtTmFtZQUPbmV3Q2xhaW1lZFRvdGFsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5Q2xhaW1lZFRvdGFsQWRkcmVzcwEFDmNsYWltZXJBZGRyZXNzBRZuZXdDbGFpbWVkVG90YWxBZGRyZXNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEYa2V5VW5jbGFpbWVkVG90YWxBZGRyZXNzAQUOY2xhaW1lckFkZHJlc3MFGG5ld1VuY2xhaW1lZFRvdGFsQWRkcmVzcwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQ5jbGFpbWVyQWRkcmVzcwUQY2xhaW1lclVuY2xhaW1lZAUNcmV3YXJkQXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCBQ9jbGFpbUhpc3RvcnlLZXkJARJmb3JtYXRDbGFpbUhpc3RvcnkBBRBjbGFpbWVyVW5jbGFpbWVkBQNuaWwFEGNsYWltZXJVbmNsYWltZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERY2xhaW1CdWxrSW50ZXJuYWwDB2NsYWltZXIMcHJvZ3JhbU5hbWVzC2N1cnJlbnRJdGVyBAtjaGVja0NhbGxlcgMJAAACCAUBaQZjYWxsZXIFBHRoaXMGCQEIdGhyb3dFcnIBAhFwZXJtaXNzaW9uIGRlbmllZAMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIDCQAAAgULY3VycmVudEl0ZXIJAJADAQUMcHJvZ3JhbU5hbWVzBQNuaWwEC3Byb2dyYW1OYW1lCQCRAwIFDHByb2dyYW1OYW1lcwULY3VycmVudEl0ZXIEEHByb2dyYW1VbmNsYWltZWQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFGtleVVuY2xhaW1lZFJlZmVycmVyAgULcHJvZ3JhbU5hbWUFB2NsYWltZXIAAAQPY2xhaW1IaXN0b3J5S2V5CQEPa2V5Q2xhaW1IaXN0b3J5BAULcHJvZ3JhbU5hbWUFB2NsYWltZXIJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAIJY2xhaW1CdWxrBBFjbGFpbUJ1bGtJbnRlcm5hbAkA/AcEBQR0aGlzAhFjbGFpbUJ1bGtJbnRlcm5hbAkAzAgCBQdjbGFpbWVyCQDMCAIFDHByb2dyYW1OYW1lcwkAzAgCCQBkAgULY3VycmVudEl0ZXIAAQUDbmlsBQNuaWwDCQAAAgURY2xhaW1CdWxrSW50ZXJuYWwFEWNsYWltQnVsa0ludGVybmFsBA1jbGFpbUludGVybmFsCQD8BwQFBHRoaXMCDWNsYWltSW50ZXJuYWwJAMwIAgULcHJvZ3JhbU5hbWUJAMwIAgUHY2xhaW1lcgkAzAgCBwUDbmlsBQNuaWwDCQAAAgUNY2xhaW1JbnRlcm5hbAUNY2xhaW1JbnRlcm5hbAkAlAoCBQNuaWwJAMwIAgURY2xhaW1CdWxrSW50ZXJuYWwJAMwIAgUNY2xhaW1JbnRlcm5hbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBH2luY1VuY2xhaW1lZFdpdGhQYXltZW50SW50ZXJuYWwFDnBheW1lbnRBbW91bnRzC3Byb2dyYW1OYW1lEXJlZmVycmVyQWRkcmVzc2VzC2N1cnJlbnRJdGVyCXJlc0Ftb3VudAQLY2hlY2tDYWxsZXIDCQAAAggFAWkGY2FsbGVyBQR0aGlzBgkBCHRocm93RXJyAQIRcGVybWlzc2lvbiBkZW5pZWQDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyBA5hcmdzQ29tcGFyaXNvbgkAAAIJAJADAQUOcGF5bWVudEFtb3VudHMJAJADAQURcmVmZXJyZXJBZGRyZXNzZXMEBWNoZWNrAwUOYXJnc0NvbXBhcmlzb24GCQEIdGhyb3dFcnIBAh9saXN0cyBpbiBhcmdzIG11c3QgYmUgc2FtZSBzaXplAwkAAAIFBWNoZWNrBQVjaGVjawMJAAACBQtjdXJyZW50SXRlcgkAkAMBBQ5wYXltZW50QW1vdW50cwkAlAoCBQNuaWwFCXJlc0Ftb3VudAQPcmVmZXJyZXJBZGRyZXNzCQCRAwIFEXJlZmVycmVyQWRkcmVzc2VzBQtjdXJyZW50SXRlcgQVdW5jbGFpbWVkVG90YWxBZGRyZXNzCQELdmFsdWVPckVsc2UCCQCfCAEJARhrZXlVbmNsYWltZWRUb3RhbEFkZHJlc3MBBQ9yZWZlcnJlckFkZHJlc3MAAAQRcmVmZXJyZXJVbmNsYWltZWQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFGtleVVuY2xhaW1lZFJlZmVycmVyAgULcHJvZ3JhbU5hbWUFD3JlZmVycmVyQWRkcmVzcwAABAxyZXdhcmRzVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBD2tleVJld2FyZHNUb3RhbAEFC3Byb2dyYW1OYW1lAAAEGG5ld1VuY2xhaW1lZFRvdGFsQWRkcmVzcwkAZAIFFXVuY2xhaW1lZFRvdGFsQWRkcmVzcwkAkQMCBQ5wYXltZW50QW1vdW50cwULY3VycmVudEl0ZXIEFG5ld1JlZmVycmVyVW5jbGFpbWVkCQBkAgURcmVmZXJyZXJVbmNsYWltZWQJAJEDAgUOcGF5bWVudEFtb3VudHMFC2N1cnJlbnRJdGVyBAxuZXdSZXNBbW91bnQJAGQCBQlyZXNBbW91bnQJAJEDAgUOcGF5bWVudEFtb3VudHMFC2N1cnJlbnRJdGVyBANpbnYJAPwHBAUEdGhpcwIfaW5jVW5jbGFpbWVkV2l0aFBheW1lbnRJbnRlcm5hbAkAzAgCBQ5wYXltZW50QW1vdW50cwkAzAgCBQtwcm9ncmFtTmFtZQkAzAgCBRFyZWZlcnJlckFkZHJlc3NlcwkAzAgCCQBkAgULY3VycmVudEl0ZXIAAQkAzAgCBQxuZXdSZXNBbW91bnQFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52CQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJARhrZXlVbmNsYWltZWRUb3RhbEFkZHJlc3MBBQ9yZWZlcnJlckFkZHJlc3MFGG5ld1VuY2xhaW1lZFRvdGFsQWRkcmVzcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleVVuY2xhaW1lZFJlZmVycmVyAgULcHJvZ3JhbU5hbWUFD3JlZmVycmVyQWRkcmVzcwUUbmV3UmVmZXJyZXJVbmNsYWltZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlSZXdhcmRzVG90YWwBBQtwcm9ncmFtTmFtZQkAZAIFDHJld2FyZHNUb3RhbAkAkQMCBQ5wYXltZW50QW1vdW50cwULY3VycmVudEl0ZXIFA25pbAUDaW52CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFWNyZWF0ZVJlZmVycmFsUHJvZ3JhbQQLcHJvZ3JhbU5hbWUQdHJlYXN1cnlDb250cmFjdBZpbXBsZW1lbnRhdGlvbkNvbnRyYWN0DXJld2FyZEFzc2V0SWQEC2NoZWNrQ2FsbGVyCQELbXVzdE1hbmFnZXIBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQQY2hlY2tQcm9ncmFtTmFtZQMJAAACCQCgCAEJAQ5rZXlQcm9ncmFtTmFtZQEFC3Byb2dyYW1OYW1lBQR1bml0BgkBCHRocm93RXJyAQIbcHJvZ3JhbSBuYW1lIGFscmVhZHkgZXhpc3RzAwkAAAIFEGNoZWNrUHJvZ3JhbU5hbWUFEGNoZWNrUHJvZ3JhbU5hbWUEEnByb2dyYW1OYW1lSXNWYWxpZAMJAQEhAQkBCGNvbnRhaW5zAgULcHJvZ3JhbU5hbWUFCXNlcGFyYXRvcgkBASEBCQEIY29udGFpbnMCBQtwcm9ncmFtTmFtZQIBIAcEEmNoZWNrUHJvZ3JhbUV4aXN0cwMFEnByb2dyYW1OYW1lSXNWYWxpZAYJAQh0aHJvd0VycgECFGludmFsaWQgcHJvZ3JhbSBuYW1lAwkAAAIFEmNoZWNrUHJvZ3JhbUV4aXN0cwUSY2hlY2tQcm9ncmFtRXhpc3RzBBBjaGVja1Jld2FyZEFzc2V0AwkBAiE9AgkA7AcBCQDZBAEFDXJld2FyZEFzc2V0SWQFBHVuaXQGCQEIdGhyb3dFcnIBAhdpbnZhbGlkIHJld2FyZCBhc3NldCBpZAMJAAACBRBjaGVja1Jld2FyZEFzc2V0BRBjaGVja1Jld2FyZEFzc2V0CQCUCgIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQ5rZXlQcm9ncmFtTmFtZQEFC3Byb2dyYW1OYW1lBgkAzAgCCQELU3RyaW5nRW50cnkCCQETa2V5VHJlYXN1cnlDb250cmFjdAEFC3Byb2dyYW1OYW1lBRB0cmVhc3VyeUNvbnRyYWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJARlrZXlJbXBsZW1lbnRhdGlvbkNvbnRyYWN0AQULcHJvZ3JhbU5hbWUFFmltcGxlbWVudGF0aW9uQ29udHJhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEGtleVJld2FyZEFzc2V0SWQBBQtwcm9ncmFtTmFtZQUNcmV3YXJkQXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBD2tleVJld2FyZHNUb3RhbAEFC3Byb2dyYW1OYW1lAAAFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpjcmVhdGVQYWlyBAtwcm9ncmFtTmFtZQ9yZWZlcnJlckFkZHJlc3MPcmVmZXJyYWxBZGRyZXNzCXNpZ25hdHVyZQQSY2hlY2tQcm9ncmFtRXhpc3RzAwkBC3ZhbHVlT3JFbHNlAgkAoAgBCQEOa2V5UHJvZ3JhbU5hbWUBBQtwcm9ncmFtTmFtZQcGCQEIdGhyb3dFcnIBAhZwcm9ncmFtIGRvZXMgbm90IGV4aXN0AwkAAAIFEmNoZWNrUHJvZ3JhbUV4aXN0cwUSY2hlY2tQcm9ncmFtRXhpc3RzBCBwYWlyUmVmZXJyZXJUb1JlZmVycmFsRXhpc3RDaGVjawMJAAACCQCgCAEJARtrZXlFeGlzdHNSZWZlcnJlclRvUmVmZXJyYWwDBQtwcm9ncmFtTmFtZQUPcmVmZXJyZXJBZGRyZXNzBQ9yZWZlcnJhbEFkZHJlc3MFBHVuaXQGCQEIdGhyb3dFcnIBAhNwYWlyIGFscmVhZHkgZXhpc3RzAwkAAAIFIHBhaXJSZWZlcnJlclRvUmVmZXJyYWxFeGlzdENoZWNrBSBwYWlyUmVmZXJyZXJUb1JlZmVycmFsRXhpc3RDaGVjawQJbm9SZWZTZWxmAwkBAiE9AgUPcmVmZXJyZXJBZGRyZXNzBQ9yZWZlcnJhbEFkZHJlc3MGCQEIdGhyb3dFcnIBAhRjYW5ub3QgcmVmZXIgdG8gc2VsZgMJAAACBQlub1JlZlNlbGYFCW5vUmVmU2VsZgQEcGFpcgkAmwMBCQC5CQIJAMwIAgULcHJvZ3JhbU5hbWUJAMwIAgUPcmVmZXJyZXJBZGRyZXNzCQDMCAIFD3JlZmVycmFsQWRkcmVzcwUDbmlsAgE6BBBiYWNrZW5kUHVibGljS2V5CQDZBAEJAQV2YWx1ZQEJAKIIAQUTa2V5QmFja2VuZFB1YmxpY0tleQQRdmFsaWRhdGVTaWduYXR1cmUDCQD0AwMFBHBhaXIFCXNpZ25hdHVyZQUQYmFja2VuZFB1YmxpY0tleQYJAQh0aHJvd0VycgECDWJhZCBzaWduYXR1cmUDCQAAAgURdmFsaWRhdGVTaWduYXR1cmUFEXZhbGlkYXRlU2lnbmF0dXJlBBJ0b3RhbFJlZmVycmFsQ291bnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFWtleVRvdGFsUmVmZXJyYWxDb3VudAIFC3Byb2dyYW1OYW1lBQ9yZWZlcnJlckFkZHJlc3MAAAQVbmV3VG90YWxSZWZlcnJhbENvdW50CQBkAgUSdG90YWxSZWZlcnJhbENvdW50AAEEE2FsbFJlZmVycmVyUHJvZ3JhbXMJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBFmtleUFsbFJlZmZlcmFsUHJvZ3JhbXMBBQ9yZWZlcnJlckFkZHJlc3MCAAQWbmV3QWxsUmVmZXJyZXJQcm9ncmFtcwMJAAACBRNhbGxSZWZlcnJlclByb2dyYW1zAgAFC3Byb2dyYW1OYW1lCQC5CQIJAMwIAgUTYWxsUmVmZXJyZXJQcm9ncmFtcwkAzAgCBQtwcm9ncmFtTmFtZQUDbmlsBQlzZXBhcmF0b3IEE2FsbFJlZmVycmFsUHJvZ3JhbXMJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBFmtleUFsbFJlZmZlcmFsUHJvZ3JhbXMBBQ9yZWZlcnJhbEFkZHJlc3MCAAQWbmV3QWxsUmVmZXJyYWxQcm9ncmFtcwMJAAACBRNhbGxSZWZlcnJhbFByb2dyYW1zAgAFC3Byb2dyYW1OYW1lCQC5CQIJAMwIAgUTYWxsUmVmZXJyYWxQcm9ncmFtcwkAzAgCBQtwcm9ncmFtTmFtZQUDbmlsBQlzZXBhcmF0b3IJAJQKAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBG2tleUV4aXN0c1JlZmVycmVyVG9SZWZlcnJhbAMFC3Byb2dyYW1OYW1lBQ9yZWZlcnJlckFkZHJlc3MFD3JlZmVycmFsQWRkcmVzcwYJAMwIAgkBDEludGVnZXJFbnRyeQIJARVrZXlUb3RhbFJlZmVycmFsQ291bnQCBQtwcm9ncmFtTmFtZQUPcmVmZXJyZXJBZGRyZXNzBRVuZXdUb3RhbFJlZmVycmFsQ291bnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBC2tleVJlZmVycmVyAgULcHJvZ3JhbU5hbWUFD3JlZmVycmFsQWRkcmVzcwUPcmVmZXJyZXJBZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQIJARZrZXlBbGxSZWZmZXJhbFByb2dyYW1zAQUPcmVmZXJyZXJBZGRyZXNzBRZuZXdBbGxSZWZlcnJlclByb2dyYW1zCQDMCAIJAQtTdHJpbmdFbnRyeQIJARZrZXlBbGxSZWZmZXJhbFByb2dyYW1zAQUPcmVmZXJyYWxBZGRyZXNzBRZuZXdBbGxSZWZlcnJhbFByb2dyYW1zBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEWdXBkYXRlUmVmZXJyYWxBY3Rpdml0eQMLcHJvZ3JhbU5hbWUPcmVmZXJyYWxBZGRyZXNzCGlzQWN0aXZlBBZpbXBsZW1lbnRhdGlvbkNvbnRyYWN0CQEFdmFsdWUBCQCiCAEJARlrZXlJbXBsZW1lbnRhdGlvbkNvbnRyYWN0AQULcHJvZ3JhbU5hbWUEEGlzUmVmZXJyYWxBY3RpdmUJAQIhPQIJAKAIAQkBE2tleUlzUmVmZXJyYWxBY3RpdmUCBQtwcm9ncmFtTmFtZQUPcmVmZXJyYWxBZGRyZXNzBQR1bml0BA9yZWZlcnJlckFkZHJlc3MJAQV2YWx1ZQEJAKIIAQkBC2tleVJlZmVycmVyAgULcHJvZ3JhbU5hbWUFD3JlZmVycmFsQWRkcmVzcwQLY2hlY2tDYWxsZXIDCQAAAgkApQgBCAUBaQZjYWxsZXIFFmltcGxlbWVudGF0aW9uQ29udHJhY3QGCQEIdGhyb3dFcnIBAhFwZXJtaXNzaW9uIGRlbmllZAMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEBnVwZGF0ZQMJAAACBRBpc1JlZmVycmFsQWN0aXZlBQhpc0FjdGl2ZQkAlAoCBQNuaWwFBHVuaXQEBnVwZGF0ZQMJAAACBQhpc0FjdGl2ZQYEFm5ld0FjdGl2ZVJlZmVycmFsQ291bnQJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEJARZrZXlBY3RpdmVSZWZlcnJhbENvdW50AgULcHJvZ3JhbU5hbWUFD3JlZmVycmVyQWRkcmVzcwAAAAEJAJQKAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBE2tleUlzUmVmZXJyYWxBY3RpdmUCBQtwcm9ncmFtTmFtZQUPcmVmZXJyYWxBZGRyZXNzBgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleUFjdGl2ZVJlZmVycmFsQ291bnQCBQtwcm9ncmFtTmFtZQUPcmVmZXJyZXJBZGRyZXNzBRZuZXdBY3RpdmVSZWZlcnJhbENvdW50BQNuaWwFBHVuaXQEFm5ld0FjdGl2ZVJlZmVycmFsQ291bnQJAGUCCQELdmFsdWVPckVsc2UCCQCfCAEJARZrZXlBY3RpdmVSZWZlcnJhbENvdW50AgULcHJvZ3JhbU5hbWUFD3JlZmVycmVyQWRkcmVzcwAAAAEJAJQKAgkAzAgCCQELRGVsZXRlRW50cnkBCQETa2V5SXNSZWZlcnJhbEFjdGl2ZQIFC3Byb2dyYW1OYW1lBQ9yZWZlcnJhbEFkZHJlc3MJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlBY3RpdmVSZWZlcnJhbENvdW50AgULcHJvZ3JhbU5hbWUFD3JlZmVycmVyQWRkcmVzcwUWbmV3QWN0aXZlUmVmZXJyYWxDb3VudAUDbmlsBQR1bml0BQZ1cGRhdGUFBnVwZGF0ZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQxpbmNVbmNsYWltZWQEC3Byb2dyYW1OYW1lD3JlZmVycmFsQWRkcmVzcw5yZWZlcnJlclJld2FyZA5yZWZlcnJhbFJld2FyZAQWaW1wbGVtZW50YXRpb25Db250cmFjdAkBBXZhbHVlAQkAoggBCQEZa2V5SW1wbGVtZW50YXRpb25Db250cmFjdAEFC3Byb2dyYW1OYW1lBAtjaGVja0NhbGxlcgMJAAACCQClCAEIBQFpBmNhbGxlcgUWaW1wbGVtZW50YXRpb25Db250cmFjdAYJAQh0aHJvd0VycgECEXBlcm1pc3Npb24gZGVuaWVkAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQPcmVmZXJyZXJBZGRyZXNzCQEFdmFsdWUBCQCiCAEJAQtrZXlSZWZlcnJlcgIFC3Byb2dyYW1OYW1lBQ9yZWZlcnJhbEFkZHJlc3MEFnVuY2xhaW1lZFRvdGFsUmVmZXJyZXIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGGtleVVuY2xhaW1lZFRvdGFsQWRkcmVzcwEFD3JlZmVycmVyQWRkcmVzcwAABBFyZWZlcnJlclVuY2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEUa2V5VW5jbGFpbWVkUmVmZXJyZXICBQtwcm9ncmFtTmFtZQUPcmVmZXJyZXJBZGRyZXNzAAAEFnVuY2xhaW1lZFRvdGFsUmVmZXJyYWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGGtleVVuY2xhaW1lZFRvdGFsQWRkcmVzcwEFD3JlZmVycmFsQWRkcmVzcwAABBFyZWZlcnJhbFVuY2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEUa2V5VW5jbGFpbWVkUmVmZXJyYWwCBQtwcm9ncmFtTmFtZQUPcmVmZXJyYWxBZGRyZXNzAAAEDHJld2FyZHNUb3RhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEPa2V5UmV3YXJkc1RvdGFsAQULcHJvZ3JhbU5hbWUAAAQZbmV3VW5jbGFpbWVkVG90YWxSZWZlcnJlcgkAZAIFFnVuY2xhaW1lZFRvdGFsUmVmZXJyZXIFDnJlZmVycmVyUmV3YXJkBBRuZXdSZWZlcnJlclVuY2xhaW1lZAkAZAIFEXJlZmVycmVyVW5jbGFpbWVkBQ5yZWZlcnJlclJld2FyZAQZbmV3VW5jbGFpbWVkVG90YWxSZWZlcnJhbAkAZAIFFnVuY2xhaW1lZFRvdGFsUmVmZXJyYWwFDnJlZmVycmFsUmV3YXJkBBRuZXdSZWZlcnJhbFVuY2xhaW1lZAkAZAIFEXJlZmVycmFsVW5jbGFpbWVkBQ5yZWZlcnJhbFJld2FyZAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEYa2V5VW5jbGFpbWVkVG90YWxBZGRyZXNzAQUPcmVmZXJyZXJBZGRyZXNzBRluZXdVbmNsYWltZWRUb3RhbFJlZmVycmVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEYa2V5VW5jbGFpbWVkVG90YWxBZGRyZXNzAQUPcmVmZXJyYWxBZGRyZXNzBRluZXdVbmNsYWltZWRUb3RhbFJlZmVycmFsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5VW5jbGFpbWVkUmVmZXJyZXICBQtwcm9ncmFtTmFtZQUPcmVmZXJyZXJBZGRyZXNzBRRuZXdSZWZlcnJlclVuY2xhaW1lZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleVVuY2xhaW1lZFJlZmVycmFsAgULcHJvZ3JhbU5hbWUFD3JlZmVycmFsQWRkcmVzcwUUbmV3UmVmZXJyYWxVbmNsYWltZWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlSZXdhcmRzVG90YWwBBQtwcm9ncmFtTmFtZQkAZAIJAGQCBQxyZXdhcmRzVG90YWwFDnJlZmVycmVyUmV3YXJkBQ5yZWZlcnJhbFJld2FyZAUDbmlsBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBF2luY1VuY2xhaW1lZFdpdGhQYXltZW50Agtwcm9ncmFtTmFtZRFyZWZlcnJlckFkZHJlc3NlcwoBA21hcAIFYWNjdW0EbmV4dAQMYXNzZXRJZENoZWNrCQAAAgkA2AQBCQEFdmFsdWUBCAUEbmV4dAdhc3NldElkCQEFdmFsdWUBCQCiCAEJARBrZXlSZXdhcmRBc3NldElkAQULcHJvZ3JhbU5hbWUEC2Ftb3VudENoZWNrAwUMYXNzZXRJZENoZWNrBgkBCHRocm93RXJyAQIQaW52YWxpZCBhc3NldCBpZAMJAAACBQthbW91bnRDaGVjawULYW1vdW50Q2hlY2sJAM0IAgUFYWNjdW0IBQRuZXh0BmFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQIcGF5bWVudHMKAAIkbAgFAWkIcGF5bWVudHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBA21hcAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQJcmVzQW1vdW50CgABQAkA/AcEBQR0aGlzAh9pbmNVbmNsYWltZWRXaXRoUGF5bWVudEludGVybmFsCQDMCAIFCHBheW1lbnRzCQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFEXJlZmVycmVyQWRkcmVzc2VzCQDMCAIAAAkAzAgCAAAFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQlyZXNBbW91bnQFCXJlc0Ftb3VudAQQdHJlYXN1cnlDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAoggBCQETa2V5VHJlYXN1cnlDb250cmFjdAEFC3Byb2dyYW1OYW1lBA1yZXdhcmRBc3NldElkCQDZBAEJAQV2YWx1ZQEJAKIIAQkBEGtleVJld2FyZEFzc2V0SWQBBQtwcm9ncmFtTmFtZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRB0cmVhc3VyeUNvbnRyYWN0BQlyZXNBbW91bnQFDXJld2FyZEFzc2V0SWQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVjbGFpbQELcHJvZ3JhbU5hbWUEEmNoZWNrUHJvZ3JhbUV4aXN0cwMJAQt2YWx1ZU9yRWxzZQIJAKAIAQkBDmtleVByb2dyYW1OYW1lAQULcHJvZ3JhbU5hbWUHBgkBCHRocm93RXJyAQIWcHJvZ3JhbSBkb2VzIG5vdCBleGlzdAMJAAACBRJjaGVja1Byb2dyYW1FeGlzdHMFEmNoZWNrUHJvZ3JhbUV4aXN0cwQYaXNJbXBsZW1lbnRhdGlvbkNvbnRyYWN0CQAAAgkApQgBCAUBaQZjYWxsZXIJAQV2YWx1ZQEJAKIIAQkBGWtleUltcGxlbWVudGF0aW9uQ29udHJhY3QBBQtwcm9ncmFtTmFtZQQOY2xhaW1lckFkZHJlc3MDBRhpc0ltcGxlbWVudGF0aW9uQ29udHJhY3QJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyCQClCAEIBQFpBmNhbGxlcgQNY2xhaW1JbnRlcm5hbAkA/AcEBQR0aGlzAg1jbGFpbUludGVybmFsCQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFDmNsYWltZXJBZGRyZXNzCQDMCAIFGGlzSW1wbGVtZW50YXRpb25Db250cmFjdAUDbmlsBQNuaWwDCQAAAgUNY2xhaW1JbnRlcm5hbAUNY2xhaW1JbnRlcm5hbAkAlAoCBQNuaWwFDWNsYWltSW50ZXJuYWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJY2xhaW1CdWxrAAQRY2FsbGVyUHJvZ3JhbXNTdHIJAKIIAQkBFmtleUFsbFJlZmZlcmFsUHJvZ3JhbXMBCQClCAEIBQFpBmNhbGxlcgQNY2FsbGVyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIECGxhc3RDYWxsCQELdmFsdWVPckVsc2UCCQCfCAEJARlrZXlMYXN0QnVsa0NsYWltQ2FsbEJsb2NrAQUNY2FsbGVyQWRkcmVzcwUGaGVpZ2h0BAp3YWl0QmxvY2tzCQBlAgkAZQIFBmhlaWdodAUIbGFzdENhbGwAAwQNbGFzdENhbGxDaGVjawMJAGYCBQhsYXN0Q2FsbAkAZQIFBmhlaWdodAADBgkBCHRocm93RXJyAQkAuQkCCQDMCAICBHdhaXQJAMwIAgkApAMBBQp3YWl0QmxvY2tzCQDMCAICBmJsb2NrcwUDbmlsAgEgAwkAAAIFDWxhc3RDYWxsQ2hlY2sFDWxhc3RDYWxsQ2hlY2sEDnByb2dyYW1zRXhpc3RzAwkBCWlzRGVmaW5lZAEFEWNhbGxlclByb2dyYW1zU3RyBgkBCHRocm93RXJyAQIUbm8gcmVmZXJyYWwgcHJvZ3JhbXMDCQAAAgUOcHJvZ3JhbXNFeGlzdHMFDnByb2dyYW1zRXhpc3RzBA5jYWxsZXJQcm9ncmFtcwkAtQkCCQEFdmFsdWUBBRFjYWxsZXJQcm9ncmFtc1N0cgICX18ECWJ1bGtDbGFpbQkA/AcEBQR0aGlzAhFjbGFpbUJ1bGtJbnRlcm5hbAkAzAgCBQ1jYWxsZXJBZGRyZXNzCQDMCAIFDmNhbGxlclByb2dyYW1zCQDMCAIAAAUDbmlsBQNuaWwDCQAAAgUJYnVsa0NsYWltBQlidWxrQ2xhaW0JAJQKAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGWtleUxhc3RCdWxrQ2xhaW1DYWxsQmxvY2sBBQ1jYWxsZXJBZGRyZXNzBQZoZWlnaHQFA25pbAUJYnVsa0NsYWltCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDWNsYWltUkVBRE9OTFkCC3Byb2dyYW1OYW1lC3VzZXJBZGRyZXNzBA5jbGFpbWVyQ2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQESa2V5Q2xhaW1lZFJlZmVycmVyAgULcHJvZ3JhbU5hbWUFC3VzZXJBZGRyZXNzAAAEEGNsYWltZXJVbmNsYWltZWQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFGtleVVuY2xhaW1lZFJlZmVycmVyAgULcHJvZ3JhbU5hbWUFC3VzZXJBZGRyZXNzAAAJAJQKAgUDbmlsCQDMCAIFEGNsYWltZXJVbmNsYWltZWQJAMwIAgUOY2xhaW1lckNsYWltZWQFA25pbAFpARFjbGFpbUJ1bGtSRUFET05MWQEHY2xhaW1lcgQTY2xhaW1lZFRvdGFsQWRkcmVzcwkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEWa2V5Q2xhaW1lZFRvdGFsQWRkcmVzcwEFB2NsYWltZXIAAAQVdW5jbGVpbWVkVG90YWxBZGRyZXNzCQELdmFsdWVPckVsc2UCCQCfCAEJARhrZXlVbmNsYWltZWRUb3RhbEFkZHJlc3MBBQdjbGFpbWVyAAAJAJQKAgUDbmlsCQDMCAIFFXVuY2xlaW1lZFRvdGFsQWRkcmVzcwkAzAgCBRNjbGFpbWVkVG90YWxBZGRyZXNzBQNuaWwBaQEKc2V0TWFuYWdlcgEXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkEC2NoZWNrQ2FsbGVyCQELbXVzdE1hbmFnZXIBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQVY2hlY2tNYW5hZ2VyUHVibGljS2V5CQDZBAEFF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AwkAAAIFFWNoZWNrTWFuYWdlclB1YmxpY0tleQUVY2hlY2tNYW5hZ2VyUHVibGljS2V5CQDMCAIJAQtTdHJpbmdFbnRyeQIJARprZXlQZW5kaW5nTWFuYWdlclB1YmxpY0tleQAFF3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEOY29uZmlybU1hbmFnZXIABAJwbQkBHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0AAQFaGFzUE0DCQEJaXNEZWZpbmVkAQUCcG0GCQEIdGhyb3dFcnIBAhJubyBwZW5kaW5nIG1hbmFnZXIDCQAAAgUFaGFzUE0FBWhhc1BNBAdjaGVja1BNAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQkBBXZhbHVlAQUCcG0GCQEIdGhyb3dFcnIBAht5b3UgYXJlIG5vdCBwZW5kaW5nIG1hbmFnZXIDCQAAAgUHY2hlY2tQTQUHY2hlY2tQTQkAzAgCCQELU3RyaW5nRW50cnkCCQETa2V5TWFuYWdlclB1YmxpY0tleQAJANgEAQkBBXZhbHVlAQUCcG0JAMwIAgkBC0RlbGV0ZUVudHJ5AQkBGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAQPdGFyZ2V0UHVibGljS2V5BAckbWF0Y2gwCQEWbWFuYWdlclB1YmxpY0tleU9yVW5pdAADCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQCcGsFByRtYXRjaDAFAnBrAwkAAQIFByRtYXRjaDACBFVuaXQIBQJ0eA9zZW5kZXJQdWJsaWNLZXkJAAIBAgtNYXRjaCBlcnJvcgkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAUPdGFyZ2V0UHVibGljS2V5MLAQRQ==", "chainId": 84, "height": 2262096, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3i1dnjtTF4fjtCk22kEDMeHDfRydMgrRcs74PDBGSU9J Next: H3BrL4hndd6dN9Ku7ih6gApYseb2NixTAVyF8tcNK72Y Diff:
OldNewDifferences
1111 func keyExistsReferrerToReferral (programName,referrerAddress,referralAddress) = makeString(["%s%s%s%s", "existsReferrerToReferral", programName, referrerAddress, referralAddress], separator)
1212
1313
14-func keyClaimedReferrer (programName,claimerAddress) = makeString(["%s%s%s%s", "claimedReferrer", programName, claimerAddress], separator)
14+func keyClaimedReferrer (programName,claimerAddress) = makeString(["%s%s%s", "claimedReferrer", programName, claimerAddress], separator)
1515
1616
17-func keyClaimedReferral (programName,claimerAddress) = makeString(["%s%s%s%s", "claimedReferral", programName, claimerAddress], separator)
17+func keyClaimedReferral (programName,claimerAddress) = makeString(["%s%s%s", "claimedReferral", programName, claimerAddress], separator)
1818
1919
20-func keyUnclaimedReferrer (programName,claimerAddress) = makeString(["%s%s%s%s", "unclaimedReferrer", programName, claimerAddress], separator)
20+func keyUnclaimedReferrer (programName,claimerAddress) = makeString(["%s%s%s", "unclaimedReferrer", programName, claimerAddress], separator)
2121
2222
23-func keyUnclaimedReferral (programName,claimerAddress) = makeString(["%s%s%s%s", "unclaimedReferral", programName, claimerAddress], separator)
23+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)
3636
3737
3838 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)
3945
4046
4147 func keyClaimedTotal (programName) = makeString(["%s%s", "claimedTotal", programName], separator)
118124
119125
120126 @Callable(i)
127+func claimInternal (programName,claimerAddress,isImplementationContract) = {
128+ let checkProgramExists = if (valueOrElse(getBoolean(keyProgramName(programName)), false))
129+ then true
130+ else throwErr("program does not exist")
131+ if ((checkProgramExists == checkProgramExists))
132+ then {
133+ let $t044725409 = if (isImplementationContract)
134+ 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"))
135+ 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"))
136+ let claimerClaimed = $t044725409._1
137+ let claimerUnclaimed = $t044725409._2
138+ let keyClaimed = $t044725409._3
139+ let keyUnclaimed = $t044725409._4
140+ let claimHistoryKey = $t044725409._5
141+ let claimedTotal = valueOrElse(getInteger(keyClaimedTotal(programName)), 0)
142+ let treasuryContract = value(addressFromString(value(getString(keyTreasuryContract(programName)))))
143+ let rewardAssetId = fromBase58String(value(getString(keyRewardAssetId(programName))))
144+ let claimedTotalAddress = valueOrElse(getInteger(keyClaimedTotalAddress(claimerAddress)), 0)
145+ let unclaimedTotalAddress = valueOrElse(getInteger(keyUnclaimedTotalAddress(claimerAddress)), 0)
146+ if (if (isImplementationContract)
147+ then (claimerUnclaimed == 0)
148+ else false)
149+ then $Tuple2(nil, 0)
150+ else {
151+ let checkCanClaim = if ((claimerUnclaimed > 0))
152+ then true
153+ else throwErr("nothing to claim")
154+ if ((checkCanClaim == checkCanClaim))
155+ then {
156+ let newClaimerClaimed = (claimerClaimed + claimerUnclaimed)
157+ let newClaimedTotal = (claimedTotal + claimerUnclaimed)
158+ let newClaimedTotalAddress = (claimedTotalAddress + claimerUnclaimed)
159+ let newUnclaimedTotalAddress = (unclaimedTotalAddress - claimerUnclaimed)
160+ let balanceBefore = value(assetBalance(this, rewardAssetId))
161+ if ((balanceBefore == balanceBefore))
162+ then {
163+ let res = invoke(treasuryContract, "withdrawReferralReward", [claimerUnclaimed], nil)
164+ if ((res == res))
165+ then {
166+ let balanceAfter = value(assetBalance(this, rewardAssetId))
167+ if ((balanceAfter == balanceAfter))
168+ then {
169+ let balanceDiff = (balanceAfter - balanceBefore)
170+ if ((balanceDiff == balanceDiff))
171+ then {
172+ let checkBalance = if ((balanceDiff == claimerUnclaimed))
173+ then true
174+ else throwErr("insufficient balance on referral contract")
175+ if ((checkBalance == checkBalance))
176+ 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)
177+ else throw("Strict value is not equal to itself.")
178+ }
179+ else throw("Strict value is not equal to itself.")
180+ }
181+ else throw("Strict value is not equal to itself.")
182+ }
183+ else throw("Strict value is not equal to itself.")
184+ }
185+ else throw("Strict value is not equal to itself.")
186+ }
187+ else throw("Strict value is not equal to itself.")
188+ }
189+ }
190+ else throw("Strict value is not equal to itself.")
191+ }
192+
193+
194+
195+@Callable(i)
121196 func claimBulkInternal (claimer,programNames,currentIter) = {
122197 let checkCaller = if ((i.caller == this))
123198 then true
129204 let programName = programNames[currentIter]
130205 let programUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, claimer)), 0)
131206 let claimHistoryKey = keyClaimHistory(programName, claimer, toBase58String(i.transactionId), "claimBulk")
132- let inv = invoke(this, "claimBulkInternal", [claimer, programNames, (currentIter + 1)], nil)
133- if ((inv == inv))
207+ let claimBulkInternal = invoke(this, "claimBulkInternal", [claimer, programNames, (currentIter + 1)], nil)
208+ if ((claimBulkInternal == claimBulkInternal))
134209 then {
135- let claimedTotal = valueOrElse(getInteger(keyClaimedTotal(programName)), 0)
136- let treasuryContract = value(addressFromString(value(getString(keyTreasuryContract(programName)))))
137- let rewardAssetId = fromBase58String(value(getString(keyRewardAssetId(programName))))
138- let claimerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, claimer)), 0)
139- let balanceBefore = value(assetBalance(this, rewardAssetId))
140- if ((balanceBefore == balanceBefore))
141- then {
142- let res = invoke(treasuryContract, "withdrawReferralReward", [claimerUnclaimed], nil)
143- if ((res == res))
144- then {
145- let balanceAfter = value(assetBalance(this, rewardAssetId))
146- if ((balanceAfter == balanceAfter))
147- then {
148- let balanceDiff = (balanceAfter - balanceBefore)
149- if ((balanceDiff == balanceDiff))
150- then {
151- let checkBalance = if ((balanceDiff == claimerUnclaimed))
152- then true
153- else throwErr("insufficient balance on referral contract")
154- if ((checkBalance == checkBalance))
155- then [ScriptTransfer(addressFromStringValue(claimer), programUnclaimed, rewardAssetId), StringEntry(claimHistoryKey, formatClaimHistory(programUnclaimed))]
156- else throw("Strict value is not equal to itself.")
157- }
158- else throw("Strict value is not equal to itself.")
159- }
160- else throw("Strict value is not equal to itself.")
161- }
162- else throw("Strict value is not equal to itself.")
163- }
210+ let claimInternal = invoke(this, "claimInternal", [programName, claimer, false], nil)
211+ if ((claimInternal == claimInternal))
212+ then $Tuple2(nil, [claimBulkInternal, claimInternal])
164213 else throw("Strict value is not equal to itself.")
165214 }
166215 else throw("Strict value is not equal to itself.")
185234 then if ((currentIter == size(paymentAmounts)))
186235 then $Tuple2(nil, resAmount)
187236 else {
188- let referrerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, referrerAddresses[currentIter])), 0)
237+ let referrerAddress = referrerAddresses[currentIter]
238+ let unclaimedTotalAddress = valueOrElse(getInteger(keyUnclaimedTotalAddress(referrerAddress)), 0)
239+ let referrerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, referrerAddress)), 0)
189240 let rewardsTotal = valueOrElse(getInteger(keyRewardsTotal(programName)), 0)
241+ let newUnclaimedTotalAddress = (unclaimedTotalAddress + paymentAmounts[currentIter])
190242 let newReferrerUnclaimed = (referrerUnclaimed + paymentAmounts[currentIter])
191243 let newResAmount = (resAmount + paymentAmounts[currentIter])
192244 let inv = invoke(this, "incUnclaimedWithPaymentInternal", [paymentAmounts, programName, referrerAddresses, (currentIter + 1), newResAmount], nil)
193245 if ((inv == inv))
194- then $Tuple2([IntegerEntry(keyUnclaimedReferrer(programName, referrerAddresses[currentIter]), newReferrerUnclaimed), IntegerEntry(keyRewardsTotal(programName), (rewardsTotal + paymentAmounts[currentIter]))], inv)
246+ then $Tuple2([IntegerEntry(keyUnclaimedTotalAddress(referrerAddress), newUnclaimedTotalAddress), IntegerEntry(keyUnclaimedReferrer(programName, referrerAddress), newReferrerUnclaimed), IntegerEntry(keyRewardsTotal(programName), (rewardsTotal + paymentAmounts[currentIter]))], inv)
195247 else throw("Strict value is not equal to itself.")
196248 }
197249 else throw("Strict value is not equal to itself.")
322374 if ((checkCaller == checkCaller))
323375 then {
324376 let referrerAddress = value(getString(keyReferrer(programName, referralAddress)))
377+ let unclaimedTotalReferrer = valueOrElse(getInteger(keyUnclaimedTotalAddress(referrerAddress)), 0)
325378 let referrerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, referrerAddress)), 0)
379+ let unclaimedTotalReferral = valueOrElse(getInteger(keyUnclaimedTotalAddress(referralAddress)), 0)
326380 let referralUnclaimed = valueOrElse(getInteger(keyUnclaimedReferral(programName, referralAddress)), 0)
327381 let rewardsTotal = valueOrElse(getInteger(keyRewardsTotal(programName)), 0)
382+ let newUnclaimedTotalReferrer = (unclaimedTotalReferrer + referrerReward)
328383 let newReferrerUnclaimed = (referrerUnclaimed + referrerReward)
384+ let newUnclaimedTotalReferral = (unclaimedTotalReferral + referralReward)
329385 let newReferralUnclaimed = (referralUnclaimed + referralReward)
330- $Tuple2([IntegerEntry(keyUnclaimedReferrer(programName, referrerAddress), newReferrerUnclaimed), IntegerEntry(keyUnclaimedReferral(programName, referralAddress), newReferralUnclaimed), IntegerEntry(keyRewardsTotal(programName), ((rewardsTotal + referrerReward) + referralReward))], unit)
386+ $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)
331387 }
332388 else throw("Strict value is not equal to itself.")
333389 }
336392
337393 @Callable(i)
338394 func incUnclaimedWithPayment (programName,referrerAddresses) = {
339- func map (accum,next) = (accum :+ next.amount)
395+ func map (accum,next) = {
396+ let assetIdCheck = (toBase58String(value(next.assetId)) == value(getString(keyRewardAssetId(programName))))
397+ let amountCheck = if (assetIdCheck)
398+ then true
399+ else throwErr("invalid asset id")
400+ if ((amountCheck == amountCheck))
401+ then (accum :+ next.amount)
402+ else throw("Strict value is not equal to itself.")
403+ }
340404
341405 let payments = {
342406 let $l = i.payments
377441 if ((checkProgramExists == checkProgramExists))
378442 then {
379443 let isImplementationContract = (toString(i.caller) == value(getString(keyImplementationContract(programName))))
380- let $t01314614075 = if (isImplementationContract)
381- then {
382- let user = toString(i.originCaller)
383- $Tuple6(user, valueOrElse(getInteger(keyClaimedReferral(programName, user)), 0), valueOrElse(getInteger(keyUnclaimedReferral(programName, user)), 0), keyClaimedReferral(programName, user), keyUnclaimedReferral(programName, user), keyClaimHistory(programName, user, toBase58String(i.transactionId), "claimReferral"))
384- }
385- else {
386- let user = toString(i.caller)
387- $Tuple6(user, valueOrElse(getInteger(keyClaimedReferrer(programName, user)), 0), valueOrElse(getInteger(keyUnclaimedReferrer(programName, user)), 0), keyClaimedReferrer(programName, user), keyUnclaimedReferrer(programName, user), keyClaimHistory(programName, user, toBase58String(i.transactionId), "claimReferrer"))
388- }
389- let userAddressStr = $t01314614075._1
390- let claimerClaimed = $t01314614075._2
391- let claimerUnclaimed = $t01314614075._3
392- let keyClaimed = $t01314614075._4
393- let keyUnclaimed = $t01314614075._5
394- let claimHistoryKey = $t01314614075._6
395- let claimedTotal = valueOrElse(getInteger(keyClaimedTotal(programName)), 0)
396- let treasuryContract = value(addressFromString(value(getString(keyTreasuryContract(programName)))))
397- let rewardAssetId = fromBase58String(value(getString(keyRewardAssetId(programName))))
398- if (if (isImplementationContract)
399- then (claimerUnclaimed == 0)
400- else false)
401- then $Tuple2(nil, 0)
402- else {
403- let checkCanClaim = if ((claimerUnclaimed > 0))
404- then true
405- else throwErr("nothing to claim")
406- if ((checkCanClaim == checkCanClaim))
407- then {
408- let newClaimerClaimed = (claimerClaimed + claimerUnclaimed)
409- let newClaimedTotal = (claimedTotal + claimerUnclaimed)
410- let balanceBefore = value(assetBalance(this, rewardAssetId))
411- if ((balanceBefore == balanceBefore))
412- then {
413- let res = invoke(treasuryContract, "withdrawReferralReward", [claimerUnclaimed], nil)
414- if ((res == res))
415- then {
416- let balanceAfter = value(assetBalance(this, rewardAssetId))
417- if ((balanceAfter == balanceAfter))
418- then {
419- let balanceDiff = (balanceAfter - balanceBefore)
420- if ((balanceDiff == balanceDiff))
421- then {
422- let checkBalance = if ((balanceDiff == claimerUnclaimed))
423- then true
424- else throwErr("insufficient balance on referral contract")
425- if ((checkBalance == checkBalance))
426- then $Tuple2([IntegerEntry(keyClaimed, newClaimerClaimed), IntegerEntry(keyClaimedTotal(programName), newClaimedTotal), IntegerEntry(keyUnclaimed, 0), ScriptTransfer(addressFromStringValue(userAddressStr), claimerUnclaimed, rewardAssetId), StringEntry(claimHistoryKey, formatClaimHistory(claimerUnclaimed))], claimerUnclaimed)
427- else throw("Strict value is not equal to itself.")
428- }
429- else throw("Strict value is not equal to itself.")
430- }
431- else throw("Strict value is not equal to itself.")
432- }
433- else throw("Strict value is not equal to itself.")
434- }
435- else throw("Strict value is not equal to itself.")
436- }
437- else throw("Strict value is not equal to itself.")
438- }
444+ let claimerAddress = if (isImplementationContract)
445+ then toString(i.originCaller)
446+ else toString(i.caller)
447+ let claimInternal = invoke(this, "claimInternal", [programName, claimerAddress, isImplementationContract], nil)
448+ if ((claimInternal == claimInternal))
449+ then $Tuple2(nil, claimInternal)
450+ else throw("Strict value is not equal to itself.")
439451 }
440452 else throw("Strict value is not equal to itself.")
441453 }
476488 let claimerClaimed = valueOrElse(getInteger(keyClaimedReferrer(programName, userAddress)), 0)
477489 let claimerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, userAddress)), 0)
478490 $Tuple2(nil, [claimerUnclaimed, claimerClaimed])
491+ }
492+
493+
494+
495+@Callable(i)
496+func claimBulkREADONLY (claimer) = {
497+ let claimedTotalAddress = valueOrElse(getInteger(keyClaimedTotalAddress(claimer)), 0)
498+ let uncleimedTotalAddress = valueOrElse(getInteger(keyUnclaimedTotalAddress(claimer)), 0)
499+ $Tuple2(nil, [uncleimedTotalAddress, claimedTotalAddress])
479500 }
480501
481502
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
14-func keyClaimedReferrer (programName,claimerAddress) = makeString(["%s%s%s%s", "claimedReferrer", programName, claimerAddress], separator)
14+func keyClaimedReferrer (programName,claimerAddress) = makeString(["%s%s%s", "claimedReferrer", programName, claimerAddress], separator)
1515
1616
17-func keyClaimedReferral (programName,claimerAddress) = makeString(["%s%s%s%s", "claimedReferral", programName, claimerAddress], separator)
17+func keyClaimedReferral (programName,claimerAddress) = makeString(["%s%s%s", "claimedReferral", programName, claimerAddress], separator)
1818
1919
20-func keyUnclaimedReferrer (programName,claimerAddress) = makeString(["%s%s%s%s", "unclaimedReferrer", programName, claimerAddress], separator)
20+func keyUnclaimedReferrer (programName,claimerAddress) = makeString(["%s%s%s", "unclaimedReferrer", programName, claimerAddress], separator)
2121
2222
23-func keyUnclaimedReferral (programName,claimerAddress) = makeString(["%s%s%s%s", "unclaimedReferral", programName, claimerAddress], separator)
23+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)
39+
40+
41+func keyClaimedTotalAddress (address) = makeString(["%s%s", "claimedTotalAddress", address], separator)
42+
43+
44+func keyUnclaimedTotalAddress (address) = makeString(["%s%s", "unclaimedTotalAddress", address], separator)
3945
4046
4147 func keyClaimedTotal (programName) = makeString(["%s%s", "claimedTotal", programName], separator)
4248
4349
4450 func keyRewardsTotal (programName) = makeString(["%s%s", "rewardsTotal", programName], separator)
4551
4652
4753 func keyRewardAssetId (programName) = makeString(["%s%s", "rewardAssetId", programName], separator)
4854
4955
5056 func keyTreasuryContract (programName) = makeString(["%s%s", "treasuryContract", programName], separator)
5157
5258
5359 func keyImplementationContract (programName) = makeString(["%s%s", "implementationContract", programName], separator)
5460
5561
5662 func keyAllRefferalPrograms (address) = makeString(["%s%s", "allReferralPrograms", address], separator)
5763
5864
5965 func keyClaimedTotalProgram (programName) = makeString(["%s%s", "claimedTotalProgram", programName], separator)
6066
6167
6268 func keyUnclaimedTotal (address) = makeString(["%s%s", "unclaimedTotalAddress", address], separator)
6369
6470
6571 func keyLastBulkClaimCallBlock (address) = makeString(["%s%s", "lastBulkClaimCallBlock", address], separator)
6672
6773
6874 func keyManagerPublicKey () = "%s__managerPublicKey"
6975
7076
7177 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
7278
7379
7480 func keyClaimHistory (programName,userAddress,transactionId,type) = makeString(["%s%s%s%s%s", "history", type, programName, userAddress, transactionId], separator)
7581
7682
7783 func formatClaimHistory (amount) = makeString(["%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount)], separator)
7884
7985
8086 func throwErr (msg) = throw(makeString(["referral.ride:", msg], " "))
8187
8288
8389 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
8490 case s: String =>
8591 fromBase58String(s)
8692 case _: Unit =>
8793 unit
8894 case _ =>
8995 throw("Match error")
9096 }
9197
9298
9399 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
94100 case s: String =>
95101 fromBase58String(s)
96102 case _: Unit =>
97103 unit
98104 case _ =>
99105 throw("Match error")
100106 }
101107
102108
103109 func mustManager (i) = {
104110 let pd = throwErr("permission denied")
105111 match managerPublicKeyOrUnit() {
106112 case pk: ByteVector =>
107113 if ((i.callerPublicKey == pk))
108114 then true
109115 else pd
110116 case _: Unit =>
111117 if ((i.caller == this))
112118 then true
113119 else pd
114120 case _ =>
115121 throw("Match error")
116122 }
117123 }
118124
119125
120126 @Callable(i)
127+func claimInternal (programName,claimerAddress,isImplementationContract) = {
128+ let checkProgramExists = if (valueOrElse(getBoolean(keyProgramName(programName)), false))
129+ then true
130+ else throwErr("program does not exist")
131+ if ((checkProgramExists == checkProgramExists))
132+ then {
133+ let $t044725409 = if (isImplementationContract)
134+ 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"))
135+ 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"))
136+ let claimerClaimed = $t044725409._1
137+ let claimerUnclaimed = $t044725409._2
138+ let keyClaimed = $t044725409._3
139+ let keyUnclaimed = $t044725409._4
140+ let claimHistoryKey = $t044725409._5
141+ let claimedTotal = valueOrElse(getInteger(keyClaimedTotal(programName)), 0)
142+ let treasuryContract = value(addressFromString(value(getString(keyTreasuryContract(programName)))))
143+ let rewardAssetId = fromBase58String(value(getString(keyRewardAssetId(programName))))
144+ let claimedTotalAddress = valueOrElse(getInteger(keyClaimedTotalAddress(claimerAddress)), 0)
145+ let unclaimedTotalAddress = valueOrElse(getInteger(keyUnclaimedTotalAddress(claimerAddress)), 0)
146+ if (if (isImplementationContract)
147+ then (claimerUnclaimed == 0)
148+ else false)
149+ then $Tuple2(nil, 0)
150+ else {
151+ let checkCanClaim = if ((claimerUnclaimed > 0))
152+ then true
153+ else throwErr("nothing to claim")
154+ if ((checkCanClaim == checkCanClaim))
155+ then {
156+ let newClaimerClaimed = (claimerClaimed + claimerUnclaimed)
157+ let newClaimedTotal = (claimedTotal + claimerUnclaimed)
158+ let newClaimedTotalAddress = (claimedTotalAddress + claimerUnclaimed)
159+ let newUnclaimedTotalAddress = (unclaimedTotalAddress - claimerUnclaimed)
160+ let balanceBefore = value(assetBalance(this, rewardAssetId))
161+ if ((balanceBefore == balanceBefore))
162+ then {
163+ let res = invoke(treasuryContract, "withdrawReferralReward", [claimerUnclaimed], nil)
164+ if ((res == res))
165+ then {
166+ let balanceAfter = value(assetBalance(this, rewardAssetId))
167+ if ((balanceAfter == balanceAfter))
168+ then {
169+ let balanceDiff = (balanceAfter - balanceBefore)
170+ if ((balanceDiff == balanceDiff))
171+ then {
172+ let checkBalance = if ((balanceDiff == claimerUnclaimed))
173+ then true
174+ else throwErr("insufficient balance on referral contract")
175+ if ((checkBalance == checkBalance))
176+ 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)
177+ else throw("Strict value is not equal to itself.")
178+ }
179+ else throw("Strict value is not equal to itself.")
180+ }
181+ else throw("Strict value is not equal to itself.")
182+ }
183+ else throw("Strict value is not equal to itself.")
184+ }
185+ else throw("Strict value is not equal to itself.")
186+ }
187+ else throw("Strict value is not equal to itself.")
188+ }
189+ }
190+ else throw("Strict value is not equal to itself.")
191+ }
192+
193+
194+
195+@Callable(i)
121196 func claimBulkInternal (claimer,programNames,currentIter) = {
122197 let checkCaller = if ((i.caller == this))
123198 then true
124199 else throwErr("permission denied")
125200 if ((checkCaller == checkCaller))
126201 then if ((currentIter == size(programNames)))
127202 then nil
128203 else {
129204 let programName = programNames[currentIter]
130205 let programUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, claimer)), 0)
131206 let claimHistoryKey = keyClaimHistory(programName, claimer, toBase58String(i.transactionId), "claimBulk")
132- let inv = invoke(this, "claimBulkInternal", [claimer, programNames, (currentIter + 1)], nil)
133- if ((inv == inv))
207+ let claimBulkInternal = invoke(this, "claimBulkInternal", [claimer, programNames, (currentIter + 1)], nil)
208+ if ((claimBulkInternal == claimBulkInternal))
134209 then {
135- let claimedTotal = valueOrElse(getInteger(keyClaimedTotal(programName)), 0)
136- let treasuryContract = value(addressFromString(value(getString(keyTreasuryContract(programName)))))
137- let rewardAssetId = fromBase58String(value(getString(keyRewardAssetId(programName))))
138- let claimerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, claimer)), 0)
139- let balanceBefore = value(assetBalance(this, rewardAssetId))
140- if ((balanceBefore == balanceBefore))
141- then {
142- let res = invoke(treasuryContract, "withdrawReferralReward", [claimerUnclaimed], nil)
143- if ((res == res))
144- then {
145- let balanceAfter = value(assetBalance(this, rewardAssetId))
146- if ((balanceAfter == balanceAfter))
147- then {
148- let balanceDiff = (balanceAfter - balanceBefore)
149- if ((balanceDiff == balanceDiff))
150- then {
151- let checkBalance = if ((balanceDiff == claimerUnclaimed))
152- then true
153- else throwErr("insufficient balance on referral contract")
154- if ((checkBalance == checkBalance))
155- then [ScriptTransfer(addressFromStringValue(claimer), programUnclaimed, rewardAssetId), StringEntry(claimHistoryKey, formatClaimHistory(programUnclaimed))]
156- else throw("Strict value is not equal to itself.")
157- }
158- else throw("Strict value is not equal to itself.")
159- }
160- else throw("Strict value is not equal to itself.")
161- }
162- else throw("Strict value is not equal to itself.")
163- }
210+ let claimInternal = invoke(this, "claimInternal", [programName, claimer, false], nil)
211+ if ((claimInternal == claimInternal))
212+ then $Tuple2(nil, [claimBulkInternal, claimInternal])
164213 else throw("Strict value is not equal to itself.")
165214 }
166215 else throw("Strict value is not equal to itself.")
167216 }
168217 else throw("Strict value is not equal to itself.")
169218 }
170219
171220
172221
173222 @Callable(i)
174223 func incUnclaimedWithPaymentInternal (paymentAmounts,programName,referrerAddresses,currentIter,resAmount) = {
175224 let checkCaller = if ((i.caller == this))
176225 then true
177226 else throwErr("permission denied")
178227 if ((checkCaller == checkCaller))
179228 then {
180229 let argsComparison = (size(paymentAmounts) == size(referrerAddresses))
181230 let check = if (argsComparison)
182231 then true
183232 else throwErr("lists in args must be same size")
184233 if ((check == check))
185234 then if ((currentIter == size(paymentAmounts)))
186235 then $Tuple2(nil, resAmount)
187236 else {
188- let referrerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, referrerAddresses[currentIter])), 0)
237+ let referrerAddress = referrerAddresses[currentIter]
238+ let unclaimedTotalAddress = valueOrElse(getInteger(keyUnclaimedTotalAddress(referrerAddress)), 0)
239+ let referrerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, referrerAddress)), 0)
189240 let rewardsTotal = valueOrElse(getInteger(keyRewardsTotal(programName)), 0)
241+ let newUnclaimedTotalAddress = (unclaimedTotalAddress + paymentAmounts[currentIter])
190242 let newReferrerUnclaimed = (referrerUnclaimed + paymentAmounts[currentIter])
191243 let newResAmount = (resAmount + paymentAmounts[currentIter])
192244 let inv = invoke(this, "incUnclaimedWithPaymentInternal", [paymentAmounts, programName, referrerAddresses, (currentIter + 1), newResAmount], nil)
193245 if ((inv == inv))
194- then $Tuple2([IntegerEntry(keyUnclaimedReferrer(programName, referrerAddresses[currentIter]), newReferrerUnclaimed), IntegerEntry(keyRewardsTotal(programName), (rewardsTotal + paymentAmounts[currentIter]))], inv)
246+ then $Tuple2([IntegerEntry(keyUnclaimedTotalAddress(referrerAddress), newUnclaimedTotalAddress), IntegerEntry(keyUnclaimedReferrer(programName, referrerAddress), newReferrerUnclaimed), IntegerEntry(keyRewardsTotal(programName), (rewardsTotal + paymentAmounts[currentIter]))], inv)
195247 else throw("Strict value is not equal to itself.")
196248 }
197249 else throw("Strict value is not equal to itself.")
198250 }
199251 else throw("Strict value is not equal to itself.")
200252 }
201253
202254
203255
204256 @Callable(i)
205257 func createReferralProgram (programName,treasuryContract,implementationContract,rewardAssetId) = {
206258 let checkCaller = mustManager(i)
207259 if ((checkCaller == checkCaller))
208260 then {
209261 let checkProgramName = if ((getBoolean(keyProgramName(programName)) == unit))
210262 then true
211263 else throwErr("program name already exists")
212264 if ((checkProgramName == checkProgramName))
213265 then {
214266 let programNameIsValid = if (!(contains(programName, separator)))
215267 then !(contains(programName, " "))
216268 else false
217269 let checkProgramExists = if (programNameIsValid)
218270 then true
219271 else throwErr("invalid program name")
220272 if ((checkProgramExists == checkProgramExists))
221273 then {
222274 let checkRewardAsset = if ((assetInfo(fromBase58String(rewardAssetId)) != unit))
223275 then true
224276 else throwErr("invalid reward asset id")
225277 if ((checkRewardAsset == checkRewardAsset))
226278 then $Tuple2([BooleanEntry(keyProgramName(programName), true), StringEntry(keyTreasuryContract(programName), treasuryContract), StringEntry(keyImplementationContract(programName), implementationContract), StringEntry(keyRewardAssetId(programName), rewardAssetId), IntegerEntry(keyRewardsTotal(programName), 0)], unit)
227279 else throw("Strict value is not equal to itself.")
228280 }
229281 else throw("Strict value is not equal to itself.")
230282 }
231283 else throw("Strict value is not equal to itself.")
232284 }
233285 else throw("Strict value is not equal to itself.")
234286 }
235287
236288
237289
238290 @Callable(i)
239291 func createPair (programName,referrerAddress,referralAddress,signature) = {
240292 let checkProgramExists = if (valueOrElse(getBoolean(keyProgramName(programName)), false))
241293 then true
242294 else throwErr("program does not exist")
243295 if ((checkProgramExists == checkProgramExists))
244296 then {
245297 let pairReferrerToReferralExistCheck = if ((getBoolean(keyExistsReferrerToReferral(programName, referrerAddress, referralAddress)) == unit))
246298 then true
247299 else throwErr("pair already exists")
248300 if ((pairReferrerToReferralExistCheck == pairReferrerToReferralExistCheck))
249301 then {
250302 let noRefSelf = if ((referrerAddress != referralAddress))
251303 then true
252304 else throwErr("cannot refer to self")
253305 if ((noRefSelf == noRefSelf))
254306 then {
255307 let pair = toBytes(makeString([programName, referrerAddress, referralAddress], ":"))
256308 let backendPublicKey = fromBase58String(value(getString(keyBackendPublicKey)))
257309 let validateSignature = if (sigVerify(pair, signature, backendPublicKey))
258310 then true
259311 else throwErr("bad signature")
260312 if ((validateSignature == validateSignature))
261313 then {
262314 let totalReferralCount = valueOrElse(getInteger(keyTotalReferralCount(programName, referrerAddress)), 0)
263315 let newTotalReferralCount = (totalReferralCount + 1)
264316 let allReferrerPrograms = valueOrElse(getString(keyAllRefferalPrograms(referrerAddress)), "")
265317 let newAllReferrerPrograms = if ((allReferrerPrograms == ""))
266318 then programName
267319 else makeString([allReferrerPrograms, programName], separator)
268320 let allReferralPrograms = valueOrElse(getString(keyAllRefferalPrograms(referralAddress)), "")
269321 let newAllReferralPrograms = if ((allReferralPrograms == ""))
270322 then programName
271323 else makeString([allReferralPrograms, programName], separator)
272324 $Tuple2([BooleanEntry(keyExistsReferrerToReferral(programName, referrerAddress, referralAddress), true), IntegerEntry(keyTotalReferralCount(programName, referrerAddress), newTotalReferralCount), StringEntry(keyReferrer(programName, referralAddress), referrerAddress), StringEntry(keyAllRefferalPrograms(referrerAddress), newAllReferrerPrograms), StringEntry(keyAllRefferalPrograms(referralAddress), newAllReferralPrograms)], unit)
273325 }
274326 else throw("Strict value is not equal to itself.")
275327 }
276328 else throw("Strict value is not equal to itself.")
277329 }
278330 else throw("Strict value is not equal to itself.")
279331 }
280332 else throw("Strict value is not equal to itself.")
281333 }
282334
283335
284336
285337 @Callable(i)
286338 func updateReferralActivity (programName,referralAddress,isActive) = {
287339 let implementationContract = value(getString(keyImplementationContract(programName)))
288340 let isReferralActive = (getBoolean(keyIsReferralActive(programName, referralAddress)) != unit)
289341 let referrerAddress = value(getString(keyReferrer(programName, referralAddress)))
290342 let checkCaller = if ((toString(i.caller) == implementationContract))
291343 then true
292344 else throwErr("permission denied")
293345 if ((checkCaller == checkCaller))
294346 then {
295347 let update = if ((isReferralActive == isActive))
296348 then $Tuple2(nil, unit)
297349 else {
298350 let update = if ((isActive == true))
299351 then {
300352 let newActiveReferralCount = (valueOrElse(getInteger(keyActiveReferralCount(programName, referrerAddress)), 0) + 1)
301353 $Tuple2([BooleanEntry(keyIsReferralActive(programName, referralAddress), true), IntegerEntry(keyActiveReferralCount(programName, referrerAddress), newActiveReferralCount)], unit)
302354 }
303355 else {
304356 let newActiveReferralCount = (valueOrElse(getInteger(keyActiveReferralCount(programName, referrerAddress)), 0) - 1)
305357 $Tuple2([DeleteEntry(keyIsReferralActive(programName, referralAddress)), IntegerEntry(keyActiveReferralCount(programName, referrerAddress), newActiveReferralCount)], unit)
306358 }
307359 update
308360 }
309361 update
310362 }
311363 else throw("Strict value is not equal to itself.")
312364 }
313365
314366
315367
316368 @Callable(i)
317369 func incUnclaimed (programName,referralAddress,referrerReward,referralReward) = {
318370 let implementationContract = value(getString(keyImplementationContract(programName)))
319371 let checkCaller = if ((toString(i.caller) == implementationContract))
320372 then true
321373 else throwErr("permission denied")
322374 if ((checkCaller == checkCaller))
323375 then {
324376 let referrerAddress = value(getString(keyReferrer(programName, referralAddress)))
377+ let unclaimedTotalReferrer = valueOrElse(getInteger(keyUnclaimedTotalAddress(referrerAddress)), 0)
325378 let referrerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, referrerAddress)), 0)
379+ let unclaimedTotalReferral = valueOrElse(getInteger(keyUnclaimedTotalAddress(referralAddress)), 0)
326380 let referralUnclaimed = valueOrElse(getInteger(keyUnclaimedReferral(programName, referralAddress)), 0)
327381 let rewardsTotal = valueOrElse(getInteger(keyRewardsTotal(programName)), 0)
382+ let newUnclaimedTotalReferrer = (unclaimedTotalReferrer + referrerReward)
328383 let newReferrerUnclaimed = (referrerUnclaimed + referrerReward)
384+ let newUnclaimedTotalReferral = (unclaimedTotalReferral + referralReward)
329385 let newReferralUnclaimed = (referralUnclaimed + referralReward)
330- $Tuple2([IntegerEntry(keyUnclaimedReferrer(programName, referrerAddress), newReferrerUnclaimed), IntegerEntry(keyUnclaimedReferral(programName, referralAddress), newReferralUnclaimed), IntegerEntry(keyRewardsTotal(programName), ((rewardsTotal + referrerReward) + referralReward))], unit)
386+ $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)
331387 }
332388 else throw("Strict value is not equal to itself.")
333389 }
334390
335391
336392
337393 @Callable(i)
338394 func incUnclaimedWithPayment (programName,referrerAddresses) = {
339- func map (accum,next) = (accum :+ next.amount)
395+ func map (accum,next) = {
396+ let assetIdCheck = (toBase58String(value(next.assetId)) == value(getString(keyRewardAssetId(programName))))
397+ let amountCheck = if (assetIdCheck)
398+ then true
399+ else throwErr("invalid asset id")
400+ if ((amountCheck == amountCheck))
401+ then (accum :+ next.amount)
402+ else throw("Strict value is not equal to itself.")
403+ }
340404
341405 let payments = {
342406 let $l = i.payments
343407 let $s = size($l)
344408 let $acc0 = nil
345409 func $f0_1 ($a,$i) = if (($i >= $s))
346410 then $a
347411 else map($a, $l[$i])
348412
349413 func $f0_2 ($a,$i) = if (($i >= $s))
350414 then $a
351415 else throw("List size exceeds 10")
352416
353417 $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)
354418 }
355419 let resAmount = {
356420 let @ = invoke(this, "incUnclaimedWithPaymentInternal", [payments, programName, referrerAddresses, 0, 0], nil)
357421 if ($isInstanceOf(@, "Int"))
358422 then @
359423 else throw(($getType(@) + " couldn't be cast to Int"))
360424 }
361425 if ((resAmount == resAmount))
362426 then {
363427 let treasuryContract = addressFromStringValue(value(getString(keyTreasuryContract(programName))))
364428 let rewardAssetId = fromBase58String(value(getString(keyRewardAssetId(programName))))
365429 [ScriptTransfer(treasuryContract, resAmount, rewardAssetId)]
366430 }
367431 else throw("Strict value is not equal to itself.")
368432 }
369433
370434
371435
372436 @Callable(i)
373437 func claim (programName) = {
374438 let checkProgramExists = if (valueOrElse(getBoolean(keyProgramName(programName)), false))
375439 then true
376440 else throwErr("program does not exist")
377441 if ((checkProgramExists == checkProgramExists))
378442 then {
379443 let isImplementationContract = (toString(i.caller) == value(getString(keyImplementationContract(programName))))
380- let $t01314614075 = if (isImplementationContract)
381- then {
382- let user = toString(i.originCaller)
383- $Tuple6(user, valueOrElse(getInteger(keyClaimedReferral(programName, user)), 0), valueOrElse(getInteger(keyUnclaimedReferral(programName, user)), 0), keyClaimedReferral(programName, user), keyUnclaimedReferral(programName, user), keyClaimHistory(programName, user, toBase58String(i.transactionId), "claimReferral"))
384- }
385- else {
386- let user = toString(i.caller)
387- $Tuple6(user, valueOrElse(getInteger(keyClaimedReferrer(programName, user)), 0), valueOrElse(getInteger(keyUnclaimedReferrer(programName, user)), 0), keyClaimedReferrer(programName, user), keyUnclaimedReferrer(programName, user), keyClaimHistory(programName, user, toBase58String(i.transactionId), "claimReferrer"))
388- }
389- let userAddressStr = $t01314614075._1
390- let claimerClaimed = $t01314614075._2
391- let claimerUnclaimed = $t01314614075._3
392- let keyClaimed = $t01314614075._4
393- let keyUnclaimed = $t01314614075._5
394- let claimHistoryKey = $t01314614075._6
395- let claimedTotal = valueOrElse(getInteger(keyClaimedTotal(programName)), 0)
396- let treasuryContract = value(addressFromString(value(getString(keyTreasuryContract(programName)))))
397- let rewardAssetId = fromBase58String(value(getString(keyRewardAssetId(programName))))
398- if (if (isImplementationContract)
399- then (claimerUnclaimed == 0)
400- else false)
401- then $Tuple2(nil, 0)
402- else {
403- let checkCanClaim = if ((claimerUnclaimed > 0))
404- then true
405- else throwErr("nothing to claim")
406- if ((checkCanClaim == checkCanClaim))
407- then {
408- let newClaimerClaimed = (claimerClaimed + claimerUnclaimed)
409- let newClaimedTotal = (claimedTotal + claimerUnclaimed)
410- let balanceBefore = value(assetBalance(this, rewardAssetId))
411- if ((balanceBefore == balanceBefore))
412- then {
413- let res = invoke(treasuryContract, "withdrawReferralReward", [claimerUnclaimed], nil)
414- if ((res == res))
415- then {
416- let balanceAfter = value(assetBalance(this, rewardAssetId))
417- if ((balanceAfter == balanceAfter))
418- then {
419- let balanceDiff = (balanceAfter - balanceBefore)
420- if ((balanceDiff == balanceDiff))
421- then {
422- let checkBalance = if ((balanceDiff == claimerUnclaimed))
423- then true
424- else throwErr("insufficient balance on referral contract")
425- if ((checkBalance == checkBalance))
426- then $Tuple2([IntegerEntry(keyClaimed, newClaimerClaimed), IntegerEntry(keyClaimedTotal(programName), newClaimedTotal), IntegerEntry(keyUnclaimed, 0), ScriptTransfer(addressFromStringValue(userAddressStr), claimerUnclaimed, rewardAssetId), StringEntry(claimHistoryKey, formatClaimHistory(claimerUnclaimed))], claimerUnclaimed)
427- else throw("Strict value is not equal to itself.")
428- }
429- else throw("Strict value is not equal to itself.")
430- }
431- else throw("Strict value is not equal to itself.")
432- }
433- else throw("Strict value is not equal to itself.")
434- }
435- else throw("Strict value is not equal to itself.")
436- }
437- else throw("Strict value is not equal to itself.")
438- }
444+ let claimerAddress = if (isImplementationContract)
445+ then toString(i.originCaller)
446+ else toString(i.caller)
447+ let claimInternal = invoke(this, "claimInternal", [programName, claimerAddress, isImplementationContract], nil)
448+ if ((claimInternal == claimInternal))
449+ then $Tuple2(nil, claimInternal)
450+ else throw("Strict value is not equal to itself.")
439451 }
440452 else throw("Strict value is not equal to itself.")
441453 }
442454
443455
444456
445457 @Callable(i)
446458 func claimBulk () = {
447459 let callerProgramsStr = getString(keyAllRefferalPrograms(toString(i.caller)))
448460 let callerAddress = toString(i.caller)
449461 let lastCall = valueOrElse(getInteger(keyLastBulkClaimCallBlock(callerAddress)), height)
450462 let waitBlocks = ((height - lastCall) - 3)
451463 let lastCallCheck = if ((lastCall > (height - 3)))
452464 then true
453465 else throwErr(makeString(["wait", toString(waitBlocks), "blocks"], " "))
454466 if ((lastCallCheck == lastCallCheck))
455467 then {
456468 let programsExists = if (isDefined(callerProgramsStr))
457469 then true
458470 else throwErr("no referral programs")
459471 if ((programsExists == programsExists))
460472 then {
461473 let callerPrograms = split(value(callerProgramsStr), "__")
462474 let bulkClaim = invoke(this, "claimBulkInternal", [callerAddress, callerPrograms, 0], nil)
463475 if ((bulkClaim == bulkClaim))
464476 then $Tuple2([IntegerEntry(keyLastBulkClaimCallBlock(callerAddress), height)], bulkClaim)
465477 else throw("Strict value is not equal to itself.")
466478 }
467479 else throw("Strict value is not equal to itself.")
468480 }
469481 else throw("Strict value is not equal to itself.")
470482 }
471483
472484
473485
474486 @Callable(i)
475487 func claimREADONLY (programName,userAddress) = {
476488 let claimerClaimed = valueOrElse(getInteger(keyClaimedReferrer(programName, userAddress)), 0)
477489 let claimerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, userAddress)), 0)
478490 $Tuple2(nil, [claimerUnclaimed, claimerClaimed])
491+ }
492+
493+
494+
495+@Callable(i)
496+func claimBulkREADONLY (claimer) = {
497+ let claimedTotalAddress = valueOrElse(getInteger(keyClaimedTotalAddress(claimer)), 0)
498+ let uncleimedTotalAddress = valueOrElse(getInteger(keyUnclaimedTotalAddress(claimer)), 0)
499+ $Tuple2(nil, [uncleimedTotalAddress, claimedTotalAddress])
479500 }
480501
481502
482503
483504 @Callable(i)
484505 func setManager (pendingManagerPublicKey) = {
485506 let checkCaller = mustManager(i)
486507 if ((checkCaller == checkCaller))
487508 then {
488509 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
489510 if ((checkManagerPublicKey == checkManagerPublicKey))
490511 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
491512 else throw("Strict value is not equal to itself.")
492513 }
493514 else throw("Strict value is not equal to itself.")
494515 }
495516
496517
497518
498519 @Callable(i)
499520 func confirmManager () = {
500521 let pm = pendingManagerPublicKeyOrUnit()
501522 let hasPM = if (isDefined(pm))
502523 then true
503524 else throwErr("no pending manager")
504525 if ((hasPM == hasPM))
505526 then {
506527 let checkPM = if ((i.callerPublicKey == value(pm)))
507528 then true
508529 else throwErr("you are not pending manager")
509530 if ((checkPM == checkPM))
510531 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
511532 else throw("Strict value is not equal to itself.")
512533 }
513534 else throw("Strict value is not equal to itself.")
514535 }
515536
516537
517538 @Verifier(tx)
518539 func verify () = {
519540 let targetPublicKey = match managerPublicKeyOrUnit() {
520541 case pk: ByteVector =>
521542 pk
522543 case _: Unit =>
523544 tx.senderPublicKey
524545 case _ =>
525546 throw("Match error")
526547 }
527548 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
528549 }
529550

github/deemru/w8io/169f3d6 
61.32 ms