tx · 6LBiWHJtBq4SEgwbgHh6LHr9JP1qomvtv1BhQaHEhni8

3PJWdC3vouNYMUfzgcA4scj9gBbnyRqf8g3:  -0.02600000 Waves

2022.11.04 12:19 [3367557] smart account 3PJWdC3vouNYMUfzgcA4scj9gBbnyRqf8g3 > SELF 0.00000000 Waves

{ "type": 13, "id": "6LBiWHJtBq4SEgwbgHh6LHr9JP1qomvtv1BhQaHEhni8", "fee": 2600000, "feeAssetId": null, "timestamp": 1667552606304, "version": 1, "sender": "3PJWdC3vouNYMUfzgcA4scj9gBbnyRqf8g3", "senderPublicKey": "AEV7LzxNAcdrjC2NC4182iTxuyTyqfCLzqJ14TXnVSCm", "proofs": [ "3VXj4zE9YXTzs4w6xMjDrA4UB7v6W3Lbsisjb3x2Mrnwj7gdtFioBp4qSHL65t3r3wajfVwDs8MAaX5sQCcQceDH" ], "script": "base64:BgJdCAISBQoDCAgEEgUKAwgYARIHCgURCBgBARIGCgQICAgIEgYKBAgICAISBQoDCAgEEgYKBAgIAQESBAoCCBgSAwoBCBIAEgQKAggIEgMKAQgSBAoCCAgSAwoBCBIAHwAJc2VwYXJhdG9yAgJfXwEMa2V5V3hBc3NldElkAAkAuQkCCQDMCAICAiVzCQDMCAICCXd4QXNzZXRJZAUDbmlsBQlzZXBhcmF0b3IAE2tleUJhY2tlbmRQdWJsaWNLZXkJALkJAgkAzAgCAgIlcwkAzAgCAhBiYWNrZW5kUHVibGljS2V5BQNuaWwFCXNlcGFyYXRvcgEba2V5RXhpc3RzUmVmZXJyZXJUb1JlZmVycmFsAwtwcm9ncmFtTmFtZQ9yZWZlcnJlckFkZHJlc3MPcmVmZXJyYWxBZGRyZXNzCQC5CQIJAMwIAgIIJXMlcyVzJXMJAMwIAgIYZXhpc3RzUmVmZXJyZXJUb1JlZmVycmFsCQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFD3JlZmVycmVyQWRkcmVzcwkAzAgCBQ9yZWZlcnJhbEFkZHJlc3MFA25pbAUJc2VwYXJhdG9yARJrZXlDbGFpbWVkUmVmZXJyZXICC3Byb2dyYW1OYW1lDmNsYWltZXJBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICD2NsYWltZWRSZWZlcnJlcgkAzAgCBQtwcm9ncmFtTmFtZQkAzAgCBQ5jbGFpbWVyQWRkcmVzcwUDbmlsBQlzZXBhcmF0b3IBEmtleUNsYWltZWRSZWZlcnJhbAILcHJvZ3JhbU5hbWUOY2xhaW1lckFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIPY2xhaW1lZFJlZmVycmFsCQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFDmNsYWltZXJBZGRyZXNzBQNuaWwFCXNlcGFyYXRvcgEUa2V5VW5jbGFpbWVkUmVmZXJyZXICC3Byb2dyYW1OYW1lDmNsYWltZXJBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICEXVuY2xhaW1lZFJlZmVycmVyCQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFDmNsYWltZXJBZGRyZXNzBQNuaWwFCXNlcGFyYXRvcgEUa2V5VW5jbGFpbWVkUmVmZXJyYWwCC3Byb2dyYW1OYW1lDmNsYWltZXJBZGRyZXNzCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICEXVuY2xhaW1lZFJlZmVycmFsCQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFDmNsYWltZXJBZGRyZXNzBQNuaWwFCXNlcGFyYXRvcgELa2V5UmVmZXJyZXICC3Byb2dyYW1OYW1lD3JlZmVycmFsQWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAghyZWZlcnJlcgkAzAgCBQtwcm9ncmFtTmFtZQkAzAgCBQ9yZWZlcnJhbEFkZHJlc3MFA25pbAUJc2VwYXJhdG9yAQ5rZXlQcm9ncmFtTmFtZQELcHJvZ3JhbU5hbWUJALkJAgkAzAgCAgQlcyVzCQDMCAICC3Byb2dyYW1OYW1lCQDMCAIFC3Byb2dyYW1OYW1lBQNuaWwFCXNlcGFyYXRvcgEVa2V5VG90YWxSZWZlcnJhbENvdW50Agtwcm9ncmFtTmFtZQ9yZWZlcnJlckFkZHJlc3MJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgISdG90YWxSZWZlcnJhbENvdW50CQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFD3JlZmVycmVyQWRkcmVzcwUDbmlsBQlzZXBhcmF0b3IBFmtleUFjdGl2ZVJlZmVycmFsQ291bnQCC3Byb2dyYW1OYW1lD3JlZmVycmVyQWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAhNhY3RpdmVSZWZlcnJhbENvdW50CQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFD3JlZmVycmVyQWRkcmVzcwUDbmlsBQlzZXBhcmF0b3IBE2tleUlzUmVmZXJyYWxBY3RpdmUCC3Byb2dyYW1OYW1lD3JlZmVycmFsQWRkcmVzcwkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAg5hY3RpdmVSZWZlcnJhbAkAzAgCBQtwcm9ncmFtTmFtZQkAzAgCBQ9yZWZlcnJhbEFkZHJlc3MFA25pbAUJc2VwYXJhdG9yARZrZXlDbGFpbWVkVG90YWxBZGRyZXNzAQdhZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAhNjbGFpbWVkVG90YWxBZGRyZXNzCQDMCAIFB2FkZHJlc3MFA25pbAUJc2VwYXJhdG9yARhrZXlVbmNsYWltZWRUb3RhbEFkZHJlc3MBB2FkZHJlc3MJALkJAgkAzAgCAgQlcyVzCQDMCAICFXVuY2xhaW1lZFRvdGFsQWRkcmVzcwkAzAgCBQdhZGRyZXNzBQNuaWwFCXNlcGFyYXRvcgEPa2V5Q2xhaW1lZFRvdGFsAQtwcm9ncmFtTmFtZQkAuQkCCQDMCAICBCVzJXMJAMwIAgIMY2xhaW1lZFRvdGFsCQDMCAIFC3Byb2dyYW1OYW1lBQNuaWwFCXNlcGFyYXRvcgEPa2V5UmV3YXJkc1RvdGFsAQtwcm9ncmFtTmFtZQkAuQkCCQDMCAICBCVzJXMJAMwIAgIMcmV3YXJkc1RvdGFsCQDMCAIFC3Byb2dyYW1OYW1lBQNuaWwFCXNlcGFyYXRvcgEQa2V5UmV3YXJkQXNzZXRJZAELcHJvZ3JhbU5hbWUJALkJAgkAzAgCAgQlcyVzCQDMCAICDXJld2FyZEFzc2V0SWQJAMwIAgULcHJvZ3JhbU5hbWUFA25pbAUJc2VwYXJhdG9yARNrZXlUcmVhc3VyeUNvbnRyYWN0AQtwcm9ncmFtTmFtZQkAuQkCCQDMCAICBCVzJXMJAMwIAgIQdHJlYXN1cnlDb250cmFjdAkAzAgCBQtwcm9ncmFtTmFtZQUDbmlsBQlzZXBhcmF0b3IBGWtleUltcGxlbWVudGF0aW9uQ29udHJhY3QBC3Byb2dyYW1OYW1lCQC5CQIJAMwIAgIEJXMlcwkAzAgCAhZpbXBsZW1lbnRhdGlvbkNvbnRyYWN0CQDMCAIFC3Byb2dyYW1OYW1lBQNuaWwFCXNlcGFyYXRvcgEWa2V5QWxsUmVmZXJyYWxQcm9ncmFtcwEHYWRkcmVzcwkAuQkCCQDMCAICBCVzJXMJAMwIAgITYWxsUmVmZXJyYWxQcm9ncmFtcwkAzAgCBQdhZGRyZXNzBQNuaWwFCXNlcGFyYXRvcgEna2V5TGFzdEluY1VuY2xhaW1lZFdpdGhQYXltZW50Q2FsbEJsb2NrAQdhZGRyZXNzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAiRsYXN0SW5jVW5jbGFpbWVkV2l0aFBheW1lbnRDYWxsQmxvY2sJAMwIAgUHYWRkcmVzcwUDbmlsBQlzZXBhcmF0b3IBE2tleU1hbmFnZXJQdWJsaWNLZXkAAhQlc19fbWFuYWdlclB1YmxpY0tleQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkAAhslc19fcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkBD2tleUNsYWltSGlzdG9yeQQLcHJvZ3JhbU5hbWULdXNlckFkZHJlc3MNdHJhbnNhY3Rpb25JZAR0eXBlCQC5CQIJAMwIAgIKJXMlcyVzJXMlcwkAzAgCAgdoaXN0b3J5CQDMCAIFBHR5cGUJAMwIAgULcHJvZ3JhbU5hbWUJAMwIAgULdXNlckFkZHJlc3MJAMwIAgUNdHJhbnNhY3Rpb25JZAUDbmlsBQlzZXBhcmF0b3IBEmZvcm1hdENsYWltSGlzdG9yeQEGYW1vdW50CQC5CQIJAMwIAgIGJWQlZCVkCQDMCAIJAKQDAQgFCWxhc3RCbG9jawZoZWlnaHQJAMwIAgkApAMBCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQCkAwEFBmFtb3VudAUDbmlsBQlzZXBhcmF0b3IBCHRocm93RXJyAQNtc2cJAAIBCQC5CQIJAMwIAgIOcmVmZXJyYWwucmlkZToJAMwIAgUDbXNnBQNuaWwCASABFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQABAckbWF0Y2gwCQCiCAEJARNrZXlNYW5hZ2VyUHVibGljS2V5AAMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAJANkEAQUBcwMJAAECBQckbWF0Y2gwAgRVbml0BQR1bml0CQACAQILTWF0Y2ggZXJyb3IBHXBlbmRpbmdNYW5hZ2VyUHVibGljS2V5T3JVbml0AAQHJG1hdGNoMAkAoggBCQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkAAwkAAQIFByRtYXRjaDACBlN0cmluZwQBcwUHJG1hdGNoMAkA2QQBBQFzAwkAAQIFByRtYXRjaDACBFVuaXQFBHVuaXQJAAIBAgtNYXRjaCBlcnJvcgELbXVzdE1hbmFnZXIBAWkEAnBkCQEIdGhyb3dFcnIBAhFwZXJtaXNzaW9uIGRlbmllZAQHJG1hdGNoMAkBFm1hbmFnZXJQdWJsaWNLZXlPclVuaXQAAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAnBrBQckbWF0Y2gwAwkAAAIIBQFpD2NhbGxlclB1YmxpY0tleQUCcGsGBQJwZAMJAAECBQckbWF0Y2gwAgRVbml0AwkAAAIIBQFpBmNhbGxlcgUEdGhpcwYFAnBkCQACAQILTWF0Y2ggZXJyb3IBGXVwZGF0ZUFsbFJlZmVycmFsUHJvZ3JhbXMCB2FkZHJlc3MLcHJvZ3JhbU5hbWUEE2FsbFJlZmVycmFsUHJvZ3JhbXMJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBFmtleUFsbFJlZmVycmFsUHJvZ3JhbXMBBQdhZGRyZXNzAgAEGnVwZGF0ZWRBbGxSZWZlcnJhbFByb2dyYW1zAwkBCGNvbnRhaW5zAgUTYWxsUmVmZXJyYWxQcm9ncmFtcwULcHJvZ3JhbU5hbWUFA25pbAQWbmV3QWxsUmVmZXJyYWxQcm9ncmFtcwMJAAACBRNhbGxSZWZlcnJhbFByb2dyYW1zAgAFC3Byb2dyYW1OYW1lCQC5CQIJAMwIAgUTYWxsUmVmZXJyYWxQcm9ncmFtcwkAzAgCBQtwcm9ncmFtTmFtZQUDbmlsBQlzZXBhcmF0b3IJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFmtleUFsbFJlZmVycmFsUHJvZ3JhbXMBBQdhZGRyZXNzBRZuZXdBbGxSZWZlcnJhbFByb2dyYW1zBQNuaWwFGnVwZGF0ZWRBbGxSZWZlcnJhbFByb2dyYW1zDwFpAQ1jbGFpbUludGVybmFsAwtwcm9ncmFtTmFtZQ5jbGFpbWVyQWRkcmVzcxhpc0ltcGxlbWVudGF0aW9uQ29udHJhY3QEEmNoZWNrUHJvZ3JhbUV4aXN0cwMJAQt2YWx1ZU9yRWxzZQIJAKAIAQkBDmtleVByb2dyYW1OYW1lAQULcHJvZ3JhbU5hbWUHBgkBCHRocm93RXJyAQIWcHJvZ3JhbSBkb2VzIG5vdCBleGlzdAMJAAACBRJjaGVja1Byb2dyYW1FeGlzdHMFEmNoZWNrUHJvZ3JhbUV4aXN0cwQLJHQwNDgyMTU3NTgDBRhpc0ltcGxlbWVudGF0aW9uQ29udHJhY3QJAJcKBQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQESa2V5Q2xhaW1lZFJlZmVycmFsAgULcHJvZ3JhbU5hbWUFDmNsYWltZXJBZGRyZXNzAAAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFGtleVVuY2xhaW1lZFJlZmVycmFsAgULcHJvZ3JhbU5hbWUFDmNsYWltZXJBZGRyZXNzAAAJARJrZXlDbGFpbWVkUmVmZXJyYWwCBQtwcm9ncmFtTmFtZQUOY2xhaW1lckFkZHJlc3MJARRrZXlVbmNsYWltZWRSZWZlcnJhbAIFC3Byb2dyYW1OYW1lBQ5jbGFpbWVyQWRkcmVzcwkBD2tleUNsYWltSGlzdG9yeQQFC3Byb2dyYW1OYW1lBQ5jbGFpbWVyQWRkcmVzcwkA2AQBCAUBaQ10cmFuc2FjdGlvbklkAg1jbGFpbVJlZmVycmFsCQCXCgUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBEmtleUNsYWltZWRSZWZlcnJlcgIFC3Byb2dyYW1OYW1lBQ5jbGFpbWVyQWRkcmVzcwAACQELdmFsdWVPckVsc2UCCQCfCAEJARRrZXlVbmNsYWltZWRSZWZlcnJlcgIFC3Byb2dyYW1OYW1lBQ5jbGFpbWVyQWRkcmVzcwAACQESa2V5Q2xhaW1lZFJlZmVycmVyAgULcHJvZ3JhbU5hbWUFDmNsYWltZXJBZGRyZXNzCQEUa2V5VW5jbGFpbWVkUmVmZXJyZXICBQtwcm9ncmFtTmFtZQUOY2xhaW1lckFkZHJlc3MJAQ9rZXlDbGFpbUhpc3RvcnkEBQtwcm9ncmFtTmFtZQUOY2xhaW1lckFkZHJlc3MJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAINY2xhaW1SZWZlcnJlcgQOY2xhaW1lckNsYWltZWQIBQskdDA0ODIxNTc1OAJfMQQQY2xhaW1lclVuY2xhaW1lZAgFCyR0MDQ4MjE1NzU4Al8yBAprZXlDbGFpbWVkCAULJHQwNDgyMTU3NTgCXzMEDGtleVVuY2xhaW1lZAgFCyR0MDQ4MjE1NzU4Al80BA9jbGFpbUhpc3RvcnlLZXkIBQskdDA0ODIxNTc1OAJfNQQMY2xhaW1lZFRvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEJAQ9rZXlDbGFpbWVkVG90YWwBBQtwcm9ncmFtTmFtZQAABBB0cmVhc3VyeUNvbnRyYWN0CQEFdmFsdWUBCQCmCAEJAQV2YWx1ZQEJAKIIAQkBE2tleVRyZWFzdXJ5Q29udHJhY3QBBQtwcm9ncmFtTmFtZQQNcmV3YXJkQXNzZXRJZAkA2QQBCQEFdmFsdWUBCQCiCAEJARBrZXlSZXdhcmRBc3NldElkAQULcHJvZ3JhbU5hbWUEE2NsYWltZWRUb3RhbEFkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFmtleUNsYWltZWRUb3RhbEFkZHJlc3MBBQ5jbGFpbWVyQWRkcmVzcwAABBV1bmNsYWltZWRUb3RhbEFkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGGtleVVuY2xhaW1lZFRvdGFsQWRkcmVzcwEFDmNsYWltZXJBZGRyZXNzAAADAwUYaXNJbXBsZW1lbnRhdGlvbkNvbnRyYWN0CQAAAgUQY2xhaW1lclVuY2xhaW1lZAAABwkAlAoCBQNuaWwAAAQNY2hlY2tDYW5DbGFpbQMJAGYCBRBjbGFpbWVyVW5jbGFpbWVkAAAGCQEIdGhyb3dFcnIBAhBub3RoaW5nIHRvIGNsYWltAwkAAAIFDWNoZWNrQ2FuQ2xhaW0FDWNoZWNrQ2FuQ2xhaW0EEW5ld0NsYWltZXJDbGFpbWVkCQBkAgUOY2xhaW1lckNsYWltZWQFEGNsYWltZXJVbmNsYWltZWQED25ld0NsYWltZWRUb3RhbAkAZAIFDGNsYWltZWRUb3RhbAUQY2xhaW1lclVuY2xhaW1lZAQWbmV3Q2xhaW1lZFRvdGFsQWRkcmVzcwkAZAIFE2NsYWltZWRUb3RhbEFkZHJlc3MFEGNsYWltZXJVbmNsYWltZWQEGG5ld1VuY2xhaW1lZFRvdGFsQWRkcmVzcwkAZQIFFXVuY2xhaW1lZFRvdGFsQWRkcmVzcwUQY2xhaW1lclVuY2xhaW1lZAQNYmFsYW5jZUJlZm9yZQkBBXZhbHVlAQkA8AcCBQR0aGlzBQ1yZXdhcmRBc3NldElkAwkAAAIFDWJhbGFuY2VCZWZvcmUFDWJhbGFuY2VCZWZvcmUEA3JlcwkA/AcEBRB0cmVhc3VyeUNvbnRyYWN0AhZ3aXRoZHJhd1JlZmVycmFsUmV3YXJkCQDMCAIFEGNsYWltZXJVbmNsYWltZWQFA25pbAUDbmlsAwkAAAIFA3JlcwUDcmVzBAxiYWxhbmNlQWZ0ZXIJAQV2YWx1ZQEJAPAHAgUEdGhpcwUNcmV3YXJkQXNzZXRJZAMJAAACBQxiYWxhbmNlQWZ0ZXIFDGJhbGFuY2VBZnRlcgQLYmFsYW5jZURpZmYJAGUCBQxiYWxhbmNlQWZ0ZXIFDWJhbGFuY2VCZWZvcmUDCQAAAgULYmFsYW5jZURpZmYFC2JhbGFuY2VEaWZmBAxjaGVja0JhbGFuY2UDCQAAAgULYmFsYW5jZURpZmYFEGNsYWltZXJVbmNsYWltZWQGCQEIdGhyb3dFcnIBAilpbnN1ZmZpY2llbnQgYmFsYW5jZSBvbiByZWZlcnJhbCBjb250cmFjdAMJAAACBQxjaGVja0JhbGFuY2UFDGNoZWNrQmFsYW5jZQkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQprZXlDbGFpbWVkBRFuZXdDbGFpbWVyQ2xhaW1lZAkAzAgCCQEMSW50ZWdlckVudHJ5AgUMa2V5VW5jbGFpbWVkAAAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlDbGFpbWVkVG90YWwBBQtwcm9ncmFtTmFtZQUPbmV3Q2xhaW1lZFRvdGFsCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5Q2xhaW1lZFRvdGFsQWRkcmVzcwEFDmNsYWltZXJBZGRyZXNzBRZuZXdDbGFpbWVkVG90YWxBZGRyZXNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEYa2V5VW5jbGFpbWVkVG90YWxBZGRyZXNzAQUOY2xhaW1lckFkZHJlc3MFGG5ld1VuY2xhaW1lZFRvdGFsQWRkcmVzcwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQ5jbGFpbWVyQWRkcmVzcwUQY2xhaW1lclVuY2xhaW1lZAUNcmV3YXJkQXNzZXRJZAkAzAgCCQELU3RyaW5nRW50cnkCBQ9jbGFpbUhpc3RvcnlLZXkJARJmb3JtYXRDbGFpbUhpc3RvcnkBBRBjbGFpbWVyVW5jbGFpbWVkBQNuaWwFEGNsYWltZXJVbmNsYWltZWQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQERY2xhaW1CdWxrSW50ZXJuYWwDB2NsYWltZXIMcHJvZ3JhbU5hbWVzC2N1cnJlbnRJdGVyBAtjaGVja0NhbGxlcgMJAAACCAUBaQZjYWxsZXIFBHRoaXMGCQEIdGhyb3dFcnIBAhFwZXJtaXNzaW9uIGRlbmllZAMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIDCQAAAgULY3VycmVudEl0ZXIJAJADAQUMcHJvZ3JhbU5hbWVzBQNuaWwEC3Byb2dyYW1OYW1lCQCRAwIFDHByb2dyYW1OYW1lcwULY3VycmVudEl0ZXIEEHByb2dyYW1VbmNsYWltZWQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFGtleVVuY2xhaW1lZFJlZmVycmVyAgULcHJvZ3JhbU5hbWUFB2NsYWltZXIAAAQPY2xhaW1IaXN0b3J5S2V5CQEPa2V5Q2xhaW1IaXN0b3J5BAULcHJvZ3JhbU5hbWUFB2NsYWltZXIJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAIJY2xhaW1CdWxrBBFjbGFpbUJ1bGtJbnRlcm5hbAkA/AcEBQR0aGlzAhFjbGFpbUJ1bGtJbnRlcm5hbAkAzAgCBQdjbGFpbWVyCQDMCAIFDHByb2dyYW1OYW1lcwkAzAgCCQBkAgULY3VycmVudEl0ZXIAAQUDbmlsBQNuaWwDCQAAAgURY2xhaW1CdWxrSW50ZXJuYWwFEWNsYWltQnVsa0ludGVybmFsBBF1bmNsYWltZWRSZWZlcnJlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEUa2V5VW5jbGFpbWVkUmVmZXJyZXICBQtwcm9ncmFtTmFtZQUHY2xhaW1lcgAABAVjbGFpbQMJAGYCBRF1bmNsYWltZWRSZWZlcnJlcgAACQD8BwQFBHRoaXMCDWNsYWltSW50ZXJuYWwJAMwIAgULcHJvZ3JhbU5hbWUJAMwIAgUHY2xhaW1lcgkAzAgCBwUDbmlsBQNuaWwFBHVuaXQDCQAAAgUFY2xhaW0FBWNsYWltCQCUCgIFA25pbAkAzAgCBRFjbGFpbUJ1bGtJbnRlcm5hbAkAzAgCBQVjbGFpbQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBH2luY1VuY2xhaW1lZFdpdGhQYXltZW50SW50ZXJuYWwFDnBheW1lbnRBbW91bnRzC3Byb2dyYW1OYW1lEXJlZmVycmVyQWRkcmVzc2VzC2N1cnJlbnRJdGVyCXJlc0Ftb3VudAQLY2hlY2tDYWxsZXIDCQAAAggFAWkGY2FsbGVyBQR0aGlzBgkBCHRocm93RXJyAQIRcGVybWlzc2lvbiBkZW5pZWQDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyBA5hcmdzQ29tcGFyaXNvbgkAAAIJAJADAQUOcGF5bWVudEFtb3VudHMJAJADAQURcmVmZXJyZXJBZGRyZXNzZXMEBWNoZWNrAwUOYXJnc0NvbXBhcmlzb24GCQEIdGhyb3dFcnIBAh9saXN0cyBpbiBhcmdzIG11c3QgYmUgc2FtZSBzaXplAwkAAAIFBWNoZWNrBQVjaGVjawMJAAACBQtjdXJyZW50SXRlcgkAkAMBBQ5wYXltZW50QW1vdW50cwkAlAoCBQNuaWwFCXJlc0Ftb3VudAQPcmVmZXJyZXJBZGRyZXNzCQCRAwIFEXJlZmVycmVyQWRkcmVzc2VzBQtjdXJyZW50SXRlcgQVdW5jbGFpbWVkVG90YWxBZGRyZXNzCQELdmFsdWVPckVsc2UCCQCfCAEJARhrZXlVbmNsYWltZWRUb3RhbEFkZHJlc3MBBQ9yZWZlcnJlckFkZHJlc3MAAAQRcmVmZXJyZXJVbmNsYWltZWQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFGtleVVuY2xhaW1lZFJlZmVycmVyAgULcHJvZ3JhbU5hbWUFD3JlZmVycmVyQWRkcmVzcwAABAxyZXdhcmRzVG90YWwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBD2tleVJld2FyZHNUb3RhbAEFC3Byb2dyYW1OYW1lAAAEGG5ld1VuY2xhaW1lZFRvdGFsQWRkcmVzcwkAZAIFFXVuY2xhaW1lZFRvdGFsQWRkcmVzcwkAkQMCBQ5wYXltZW50QW1vdW50cwULY3VycmVudEl0ZXIEFG5ld1JlZmVycmVyVW5jbGFpbWVkCQBkAgURcmVmZXJyZXJVbmNsYWltZWQJAJEDAgUOcGF5bWVudEFtb3VudHMFC2N1cnJlbnRJdGVyBAxuZXdSZXNBbW91bnQJAGQCBQlyZXNBbW91bnQJAJEDAgUOcGF5bWVudEFtb3VudHMFC2N1cnJlbnRJdGVyBANpbnYJAPwHBAUEdGhpcwIfaW5jVW5jbGFpbWVkV2l0aFBheW1lbnRJbnRlcm5hbAkAzAgCBQ5wYXltZW50QW1vdW50cwkAzAgCBQtwcm9ncmFtTmFtZQkAzAgCBRFyZWZlcnJlckFkZHJlc3NlcwkAzAgCCQBkAgULY3VycmVudEl0ZXIAAQkAzAgCBQxuZXdSZXNBbW91bnQFA25pbAUDbmlsAwkAAAIFA2ludgUDaW52BBp1cGRhdGVkQWxsUmVmZXJyZXJQcm9ncmFtcwkBGXVwZGF0ZUFsbFJlZmVycmFsUHJvZ3JhbXMCBQ9yZWZlcnJlckFkZHJlc3MFC3Byb2dyYW1OYW1lCQCUCgIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBGGtleVVuY2xhaW1lZFRvdGFsQWRkcmVzcwEFD3JlZmVycmVyQWRkcmVzcwUYbmV3VW5jbGFpbWVkVG90YWxBZGRyZXNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5VW5jbGFpbWVkUmVmZXJyZXICBQtwcm9ncmFtTmFtZQUPcmVmZXJyZXJBZGRyZXNzBRRuZXdSZWZlcnJlclVuY2xhaW1lZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBD2tleVJld2FyZHNUb3RhbAEFC3Byb2dyYW1OYW1lCQBkAgUMcmV3YXJkc1RvdGFsCQCRAwIFDnBheW1lbnRBbW91bnRzBQtjdXJyZW50SXRlcgUDbmlsBRp1cGRhdGVkQWxsUmVmZXJyZXJQcm9ncmFtcwUDaW52CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFWNyZWF0ZVJlZmVycmFsUHJvZ3JhbQQLcHJvZ3JhbU5hbWUQdHJlYXN1cnlDb250cmFjdBZpbXBsZW1lbnRhdGlvbkNvbnRyYWN0DXJld2FyZEFzc2V0SWQEC2NoZWNrQ2FsbGVyCQELbXVzdE1hbmFnZXIBBQFpAwkAAAIFC2NoZWNrQ2FsbGVyBQtjaGVja0NhbGxlcgQQY2hlY2tQcm9ncmFtTmFtZQMJAAACCQCgCAEJAQ5rZXlQcm9ncmFtTmFtZQEFC3Byb2dyYW1OYW1lBQR1bml0BgkBCHRocm93RXJyAQIbcHJvZ3JhbSBuYW1lIGFscmVhZHkgZXhpc3RzAwkAAAIFEGNoZWNrUHJvZ3JhbU5hbWUFEGNoZWNrUHJvZ3JhbU5hbWUEEnByb2dyYW1OYW1lSXNWYWxpZAMJAQEhAQkBCGNvbnRhaW5zAgULcHJvZ3JhbU5hbWUFCXNlcGFyYXRvcgkBASEBCQEIY29udGFpbnMCBQtwcm9ncmFtTmFtZQIBIAcEEmNoZWNrUHJvZ3JhbUV4aXN0cwMFEnByb2dyYW1OYW1lSXNWYWxpZAYJAQh0aHJvd0VycgECFGludmFsaWQgcHJvZ3JhbSBuYW1lAwkAAAIFEmNoZWNrUHJvZ3JhbUV4aXN0cwUSY2hlY2tQcm9ncmFtRXhpc3RzBBBjaGVja1Jld2FyZEFzc2V0AwkBAiE9AgkA7AcBCQDZBAEFDXJld2FyZEFzc2V0SWQFBHVuaXQGCQEIdGhyb3dFcnIBAhdpbnZhbGlkIHJld2FyZCBhc3NldCBpZAMJAAACBRBjaGVja1Jld2FyZEFzc2V0BRBjaGVja1Jld2FyZEFzc2V0CQCUCgIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQ5rZXlQcm9ncmFtTmFtZQEFC3Byb2dyYW1OYW1lBgkAzAgCCQELU3RyaW5nRW50cnkCCQETa2V5VHJlYXN1cnlDb250cmFjdAEFC3Byb2dyYW1OYW1lBRB0cmVhc3VyeUNvbnRyYWN0CQDMCAIJAQtTdHJpbmdFbnRyeQIJARlrZXlJbXBsZW1lbnRhdGlvbkNvbnRyYWN0AQULcHJvZ3JhbU5hbWUFFmltcGxlbWVudGF0aW9uQ29udHJhY3QJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEGtleVJld2FyZEFzc2V0SWQBBQtwcm9ncmFtTmFtZQUNcmV3YXJkQXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBD2tleVJld2FyZHNUb3RhbAEFC3Byb2dyYW1OYW1lAAAFA25pbAUEdW5pdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQpjcmVhdGVQYWlyBAtwcm9ncmFtTmFtZQ9yZWZlcnJlckFkZHJlc3MPcmVmZXJyYWxBZGRyZXNzCXNpZ25hdHVyZQQSY2hlY2tQcm9ncmFtRXhpc3RzAwkBC3ZhbHVlT3JFbHNlAgkAoAgBCQEOa2V5UHJvZ3JhbU5hbWUBBQtwcm9ncmFtTmFtZQcGCQEIdGhyb3dFcnIBAhZwcm9ncmFtIGRvZXMgbm90IGV4aXN0AwkAAAIFEmNoZWNrUHJvZ3JhbUV4aXN0cwUSY2hlY2tQcm9ncmFtRXhpc3RzBCBwYWlyUmVmZXJyZXJUb1JlZmVycmFsRXhpc3RDaGVjawMJAAACCQCgCAEJARtrZXlFeGlzdHNSZWZlcnJlclRvUmVmZXJyYWwDBQtwcm9ncmFtTmFtZQUPcmVmZXJyZXJBZGRyZXNzBQ9yZWZlcnJhbEFkZHJlc3MFBHVuaXQGCQEIdGhyb3dFcnIBAhNwYWlyIGFscmVhZHkgZXhpc3RzAwkAAAIFIHBhaXJSZWZlcnJlclRvUmVmZXJyYWxFeGlzdENoZWNrBSBwYWlyUmVmZXJyZXJUb1JlZmVycmFsRXhpc3RDaGVjawQJbm9SZWZTZWxmAwkBAiE9AgUPcmVmZXJyZXJBZGRyZXNzBQ9yZWZlcnJhbEFkZHJlc3MGCQEIdGhyb3dFcnIBAhRjYW5ub3QgcmVmZXIgdG8gc2VsZgMJAAACBQlub1JlZlNlbGYFCW5vUmVmU2VsZgQEcGFpcgkAmwMBCQC5CQIJAMwIAgULcHJvZ3JhbU5hbWUJAMwIAgUPcmVmZXJyZXJBZGRyZXNzCQDMCAIFD3JlZmVycmFsQWRkcmVzcwUDbmlsAgE6BBBiYWNrZW5kUHVibGljS2V5CQDZBAEJAQV2YWx1ZQEJAKIIAQUTa2V5QmFja2VuZFB1YmxpY0tleQQRdmFsaWRhdGVTaWduYXR1cmUDCQD0AwMFBHBhaXIFCXNpZ25hdHVyZQUQYmFja2VuZFB1YmxpY0tleQYJAQh0aHJvd0VycgECDWJhZCBzaWduYXR1cmUDCQAAAgURdmFsaWRhdGVTaWduYXR1cmUFEXZhbGlkYXRlU2lnbmF0dXJlBBJ0b3RhbFJlZmVycmFsQ291bnQJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBFWtleVRvdGFsUmVmZXJyYWxDb3VudAIFC3Byb2dyYW1OYW1lBQ9yZWZlcnJlckFkZHJlc3MAAAQVbmV3VG90YWxSZWZlcnJhbENvdW50CQBkAgUSdG90YWxSZWZlcnJhbENvdW50AAEEGnVwZGF0ZWRBbGxSZWZlcnJlclByb2dyYW1zCQEZdXBkYXRlQWxsUmVmZXJyYWxQcm9ncmFtcwIFD3JlZmVycmVyQWRkcmVzcwULcHJvZ3JhbU5hbWUEGnVwZGF0ZWRBbGxSZWZlcnJhbFByb2dyYW1zCQEZdXBkYXRlQWxsUmVmZXJyYWxQcm9ncmFtcwIFD3JlZmVycmFsQWRkcmVzcwULcHJvZ3JhbU5hbWUJAJQKAgkAzggCCQDOCAIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJARtrZXlFeGlzdHNSZWZlcnJlclRvUmVmZXJyYWwDBQtwcm9ncmFtTmFtZQUPcmVmZXJyZXJBZGRyZXNzBQ9yZWZlcnJhbEFkZHJlc3MGCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEVa2V5VG90YWxSZWZlcnJhbENvdW50AgULcHJvZ3JhbU5hbWUFD3JlZmVycmVyQWRkcmVzcwUVbmV3VG90YWxSZWZlcnJhbENvdW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQtrZXlSZWZlcnJlcgIFC3Byb2dyYW1OYW1lBQ9yZWZlcnJhbEFkZHJlc3MFD3JlZmVycmVyQWRkcmVzcwUDbmlsBRp1cGRhdGVkQWxsUmVmZXJyZXJQcm9ncmFtcwUadXBkYXRlZEFsbFJlZmVycmFsUHJvZ3JhbXMFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEWdXBkYXRlUmVmZXJyYWxBY3Rpdml0eQMLcHJvZ3JhbU5hbWUPcmVmZXJyYWxBZGRyZXNzCGlzQWN0aXZlBBZpbXBsZW1lbnRhdGlvbkNvbnRyYWN0CQEFdmFsdWUBCQCiCAEJARlrZXlJbXBsZW1lbnRhdGlvbkNvbnRyYWN0AQULcHJvZ3JhbU5hbWUEEGlzUmVmZXJyYWxBY3RpdmUJAQIhPQIJAKAIAQkBE2tleUlzUmVmZXJyYWxBY3RpdmUCBQtwcm9ncmFtTmFtZQUPcmVmZXJyYWxBZGRyZXNzBQR1bml0BA9yZWZlcnJlckFkZHJlc3MJAQV2YWx1ZQEJAKIIAQkBC2tleVJlZmVycmVyAgULcHJvZ3JhbU5hbWUFD3JlZmVycmFsQWRkcmVzcwQLY2hlY2tDYWxsZXIDCQAAAgkApQgBCAUBaQZjYWxsZXIFFmltcGxlbWVudGF0aW9uQ29udHJhY3QGCQEIdGhyb3dFcnIBAhFwZXJtaXNzaW9uIGRlbmllZAMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEBnVwZGF0ZQMJAAACBRBpc1JlZmVycmFsQWN0aXZlBQhpc0FjdGl2ZQkAlAoCBQNuaWwFBHVuaXQEBnVwZGF0ZQMJAAACBQhpc0FjdGl2ZQYEFm5ld0FjdGl2ZVJlZmVycmFsQ291bnQJAGQCCQELdmFsdWVPckVsc2UCCQCfCAEJARZrZXlBY3RpdmVSZWZlcnJhbENvdW50AgULcHJvZ3JhbU5hbWUFD3JlZmVycmVyQWRkcmVzcwAAAAEJAJQKAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBE2tleUlzUmVmZXJyYWxBY3RpdmUCBQtwcm9ncmFtTmFtZQUPcmVmZXJyYWxBZGRyZXNzBgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFmtleUFjdGl2ZVJlZmVycmFsQ291bnQCBQtwcm9ncmFtTmFtZQUPcmVmZXJyZXJBZGRyZXNzBRZuZXdBY3RpdmVSZWZlcnJhbENvdW50BQNuaWwFBHVuaXQEFm5ld0FjdGl2ZVJlZmVycmFsQ291bnQJAGUCCQELdmFsdWVPckVsc2UCCQCfCAEJARZrZXlBY3RpdmVSZWZlcnJhbENvdW50AgULcHJvZ3JhbU5hbWUFD3JlZmVycmVyQWRkcmVzcwAAAAEJAJQKAgkAzAgCCQELRGVsZXRlRW50cnkBCQETa2V5SXNSZWZlcnJhbEFjdGl2ZQIFC3Byb2dyYW1OYW1lBQ9yZWZlcnJhbEFkZHJlc3MJAMwIAgkBDEludGVnZXJFbnRyeQIJARZrZXlBY3RpdmVSZWZlcnJhbENvdW50AgULcHJvZ3JhbU5hbWUFD3JlZmVycmVyQWRkcmVzcwUWbmV3QWN0aXZlUmVmZXJyYWxDb3VudAUDbmlsBQR1bml0BQZ1cGRhdGUFBnVwZGF0ZQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQxpbmNVbmNsYWltZWQEC3Byb2dyYW1OYW1lD3JlZmVycmFsQWRkcmVzcw5yZWZlcnJlclJld2FyZA5yZWZlcnJhbFJld2FyZAQWaW1wbGVtZW50YXRpb25Db250cmFjdAkBBXZhbHVlAQkAoggBCQEZa2V5SW1wbGVtZW50YXRpb25Db250cmFjdAEFC3Byb2dyYW1OYW1lBA9yZWZlcnJlckFkZHJlc3MJAQV2YWx1ZQEJAKIIAQkBC2tleVJlZmVycmVyAgULcHJvZ3JhbU5hbWUFD3JlZmVycmFsQWRkcmVzcwQLY2hlY2tDYWxsZXIDCQAAAgkApQgBCAUBaQZjYWxsZXIFFmltcGxlbWVudGF0aW9uQ29udHJhY3QGCQEIdGhyb3dFcnIBAhFwZXJtaXNzaW9uIGRlbmllZAMJAAACBQtjaGVja0NhbGxlcgULY2hlY2tDYWxsZXIEDGNoZWNrUHJvZ3JhbQMJAAACBQtwcm9ncmFtTmFtZQIGd3hsb2NrBgkBCHRocm93RXJyAQIPaW52YWxpZCBwcm9ncmFtAwkAAAIFDGNoZWNrUHJvZ3JhbQUMY2hlY2tQcm9ncmFtBBZjaGVja1JlZmVycmVySW5Qcm9ncmFtAwkBCGNvbnRhaW5zAgkBC3ZhbHVlT3JFbHNlAgkAoggBCQEWa2V5QWxsUmVmZXJyYWxQcm9ncmFtcwEFD3JlZmVycmVyQWRkcmVzcwIABQtwcm9ncmFtTmFtZQYJAQh0aHJvd0VycgECF3JlZmVycmVyIG5vdCBpbiBwcm9ncmFtAwkAAAIFFmNoZWNrUmVmZXJyZXJJblByb2dyYW0FFmNoZWNrUmVmZXJyZXJJblByb2dyYW0EFmNoZWNrUmVmZXJyYWxJblByb2dyYW0DCQEIY29udGFpbnMCCQELdmFsdWVPckVsc2UCCQCiCAEJARZrZXlBbGxSZWZlcnJhbFByb2dyYW1zAQUPcmVmZXJyYWxBZGRyZXNzAgAFC3Byb2dyYW1OYW1lBgkBCHRocm93RXJyAQIXcmVmZXJyYWwgbm90IGluIHByb2dyYW0DCQAAAgUWY2hlY2tSZWZlcnJhbEluUHJvZ3JhbQUWY2hlY2tSZWZlcnJhbEluUHJvZ3JhbQQWdW5jbGFpbWVkVG90YWxSZWZlcnJlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEYa2V5VW5jbGFpbWVkVG90YWxBZGRyZXNzAQUPcmVmZXJyZXJBZGRyZXNzAAAEEXJlZmVycmVyVW5jbGFpbWVkCQELdmFsdWVPckVsc2UCCQCfCAEJARRrZXlVbmNsYWltZWRSZWZlcnJlcgIFC3Byb2dyYW1OYW1lBQ9yZWZlcnJlckFkZHJlc3MAAAQWdW5jbGFpbWVkVG90YWxSZWZlcnJhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEYa2V5VW5jbGFpbWVkVG90YWxBZGRyZXNzAQUPcmVmZXJyYWxBZGRyZXNzAAAEEXJlZmVycmFsVW5jbGFpbWVkCQELdmFsdWVPckVsc2UCCQCfCAEJARRrZXlVbmNsYWltZWRSZWZlcnJhbAIFC3Byb2dyYW1OYW1lBQ9yZWZlcnJhbEFkZHJlc3MAAAQMcmV3YXJkc1RvdGFsCQELdmFsdWVPckVsc2UCCQCfCAEJAQ9rZXlSZXdhcmRzVG90YWwBBQtwcm9ncmFtTmFtZQAABBluZXdVbmNsYWltZWRUb3RhbFJlZmVycmVyCQBkAgUWdW5jbGFpbWVkVG90YWxSZWZlcnJlcgUOcmVmZXJyZXJSZXdhcmQEFG5ld1JlZmVycmVyVW5jbGFpbWVkCQBkAgURcmVmZXJyZXJVbmNsYWltZWQFDnJlZmVycmVyUmV3YXJkBBluZXdVbmNsYWltZWRUb3RhbFJlZmVycmFsCQBkAgUWdW5jbGFpbWVkVG90YWxSZWZlcnJhbAUOcmVmZXJyYWxSZXdhcmQEFG5ld1JlZmVycmFsVW5jbGFpbWVkCQBkAgURcmVmZXJyYWxVbmNsYWltZWQFDnJlZmVycmFsUmV3YXJkCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJARhrZXlVbmNsYWltZWRUb3RhbEFkZHJlc3MBBQ9yZWZlcnJlckFkZHJlc3MFGW5ld1VuY2xhaW1lZFRvdGFsUmVmZXJyZXIJAMwIAgkBDEludGVnZXJFbnRyeQIJARhrZXlVbmNsYWltZWRUb3RhbEFkZHJlc3MBBQ9yZWZlcnJhbEFkZHJlc3MFGW5ld1VuY2xhaW1lZFRvdGFsUmVmZXJyYWwJAMwIAgkBDEludGVnZXJFbnRyeQIJARRrZXlVbmNsYWltZWRSZWZlcnJlcgIFC3Byb2dyYW1OYW1lBQ9yZWZlcnJlckFkZHJlc3MFFG5ld1JlZmVycmVyVW5jbGFpbWVkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEUa2V5VW5jbGFpbWVkUmVmZXJyYWwCBQtwcm9ncmFtTmFtZQUPcmVmZXJyYWxBZGRyZXNzBRRuZXdSZWZlcnJhbFVuY2xhaW1lZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBD2tleVJld2FyZHNUb3RhbAEFC3Byb2dyYW1OYW1lCQBkAgkAZAIFDHJld2FyZHNUb3RhbAUOcmVmZXJyZXJSZXdhcmQFDnJlZmVycmFsUmV3YXJkBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEXaW5jVW5jbGFpbWVkV2l0aFBheW1lbnQCC3Byb2dyYW1OYW1lEXJlZmVycmVyQWRkcmVzc2VzBAxjaGVja1Byb2dyYW0DCQAAAgULcHJvZ3JhbU5hbWUCCXd4U3BvdEZlZQYJAQh0aHJvd0VycgECD2ludmFsaWQgcHJvZ3JhbQMJAAACBQxjaGVja1Byb2dyYW0FDGNoZWNrUHJvZ3JhbQQNY2FsbGVyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIECGxhc3RDYWxsCQELdmFsdWVPckVsc2UCCQCfCAEJASdrZXlMYXN0SW5jVW5jbGFpbWVkV2l0aFBheW1lbnRDYWxsQmxvY2sBBQ1jYWxsZXJBZGRyZXNzAAAECndhaXRCbG9ja3MJAGQCCQBlAgUIbGFzdENhbGwFBmhlaWdodAADBA1sYXN0Q2FsbENoZWNrAwkAZgIJAGUCBQZoZWlnaHQAAwUIbGFzdENhbGwGCQEIdGhyb3dFcnIBCQC5CQIJAMwIAgIEd2FpdAkAzAgCCQCkAwEFCndhaXRCbG9ja3MJAMwIAgIGYmxvY2tzBQNuaWwCASADCQAAAgUNbGFzdENhbGxDaGVjawUNbGFzdENhbGxDaGVjawoBA21hcAIFYWNjdW0EbmV4dAQMYXNzZXRJZENoZWNrCQAAAgkA2AQBCQEFdmFsdWUBCAUEbmV4dAdhc3NldElkCQEFdmFsdWUBCQCiCAEJARBrZXlSZXdhcmRBc3NldElkAQULcHJvZ3JhbU5hbWUEC2Ftb3VudENoZWNrAwUMYXNzZXRJZENoZWNrBgkBCHRocm93RXJyAQIQaW52YWxpZCBhc3NldCBpZAMJAAACBQthbW91bnRDaGVjawULYW1vdW50Q2hlY2sJAM0IAgUFYWNjdW0IBQRuZXh0BmFtb3VudAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgQIcGF5bWVudHMKAAIkbAgFAWkIcGF5bWVudHMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBA21hcAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQJcmVzQW1vdW50CgABQAkA/AcEBQR0aGlzAh9pbmNVbmNsYWltZWRXaXRoUGF5bWVudEludGVybmFsCQDMCAIFCHBheW1lbnRzCQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFEXJlZmVycmVyQWRkcmVzc2VzCQDMCAIAAAkAzAgCAAAFA25pbAUDbmlsAwkAAQIFAUACA0ludAUBQAkAAgEJAKwCAgkAAwEFAUACGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQlyZXNBbW91bnQFCXJlc0Ftb3VudAQQdHJlYXN1cnlDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQkAoggBCQETa2V5VHJlYXN1cnlDb250cmFjdAEFC3Byb2dyYW1OYW1lBA1yZXdhcmRBc3NldElkCQDZBAEJAQV2YWx1ZQEJAKIIAQkBEGtleVJld2FyZEFzc2V0SWQBBQtwcm9ncmFtTmFtZQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBRB0cmVhc3VyeUNvbnRyYWN0BQlyZXNBbW91bnQFDXJld2FyZEFzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJASdrZXlMYXN0SW5jVW5jbGFpbWVkV2l0aFBheW1lbnRDYWxsQmxvY2sBBQ1jYWxsZXJBZGRyZXNzBQZoZWlnaHQFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQVjbGFpbQELcHJvZ3JhbU5hbWUEEmNoZWNrUHJvZ3JhbUV4aXN0cwMJAQt2YWx1ZU9yRWxzZQIJAKAIAQkBDmtleVByb2dyYW1OYW1lAQULcHJvZ3JhbU5hbWUHBgkBCHRocm93RXJyAQIWcHJvZ3JhbSBkb2VzIG5vdCBleGlzdAMJAAACBRJjaGVja1Byb2dyYW1FeGlzdHMFEmNoZWNrUHJvZ3JhbUV4aXN0cwQYaXNJbXBsZW1lbnRhdGlvbkNvbnRyYWN0CQAAAgkApQgBCAUBaQZjYWxsZXIJAQV2YWx1ZQEJAKIIAQkBGWtleUltcGxlbWVudGF0aW9uQ29udHJhY3QBBQtwcm9ncmFtTmFtZQQOY2xhaW1lckFkZHJlc3MDBRhpc0ltcGxlbWVudGF0aW9uQ29udHJhY3QJAKUIAQgFAWkMb3JpZ2luQ2FsbGVyCQClCAEIBQFpBmNhbGxlcgQNY2xhaW1JbnRlcm5hbAkA/AcEBQR0aGlzAg1jbGFpbUludGVybmFsCQDMCAIFC3Byb2dyYW1OYW1lCQDMCAIFDmNsYWltZXJBZGRyZXNzCQDMCAIFGGlzSW1wbGVtZW50YXRpb25Db250cmFjdAUDbmlsBQNuaWwDCQAAAgUNY2xhaW1JbnRlcm5hbAUNY2xhaW1JbnRlcm5hbAkAlAoCBQNuaWwFDWNsYWltSW50ZXJuYWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEJY2xhaW1CdWxrAAQNY2FsbGVyQWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEEWNhbGxlclByb2dyYW1zU3RyCQCiCAEJARZrZXlBbGxSZWZlcnJhbFByb2dyYW1zAQkApQgBCAUBaQZjYWxsZXIEDnByb2dyYW1zRXhpc3RzAwkBCWlzRGVmaW5lZAEFEWNhbGxlclByb2dyYW1zU3RyBgkBCHRocm93RXJyAQIUbm8gcmVmZXJyYWwgcHJvZ3JhbXMDCQAAAgUOcHJvZ3JhbXNFeGlzdHMFDnByb2dyYW1zRXhpc3RzBA5jYWxsZXJQcm9ncmFtcwkAtQkCCQEFdmFsdWUBBRFjYWxsZXJQcm9ncmFtc1N0cgICX18ECWJ1bGtDbGFpbQkA/AcEBQR0aGlzAhFjbGFpbUJ1bGtJbnRlcm5hbAkAzAgCBQ1jYWxsZXJBZGRyZXNzCQDMCAIFDmNhbGxlclByb2dyYW1zCQDMCAIAAAUDbmlsBQNuaWwDCQAAAgUJYnVsa0NsYWltBQlidWxrQ2xhaW0JAJQKAgUDbmlsBQlidWxrQ2xhaW0JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQENY2xhaW1SRUFET05MWQILcHJvZ3JhbU5hbWULdXNlckFkZHJlc3MEDmNsYWltZXJDbGFpbWVkCQELdmFsdWVPckVsc2UCCQCfCAEJARJrZXlDbGFpbWVkUmVmZXJyZXICBQtwcm9ncmFtTmFtZQULdXNlckFkZHJlc3MAAAQQY2xhaW1lclVuY2xhaW1lZAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEUa2V5VW5jbGFpbWVkUmVmZXJyZXICBQtwcm9ncmFtTmFtZQULdXNlckFkZHJlc3MAAAkAlAoCBQNuaWwJAMwIAgUQY2xhaW1lclVuY2xhaW1lZAkAzAgCBQ5jbGFpbWVyQ2xhaW1lZAUDbmlsAWkBEWNsYWltQnVsa1JFQURPTkxZAQdjbGFpbWVyBBNjbGFpbWVkVG90YWxBZGRyZXNzCQELdmFsdWVPckVsc2UCCQCfCAEJARZrZXlDbGFpbWVkVG90YWxBZGRyZXNzAQUHY2xhaW1lcgAABBV1bmNsYWltZWRUb3RhbEFkZHJlc3MJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBGGtleVVuY2xhaW1lZFRvdGFsQWRkcmVzcwEFB2NsYWltZXIAAAkAlAoCBQNuaWwJAMwIAgUVdW5jbGFpbWVkVG90YWxBZGRyZXNzCQDMCAIFE2NsYWltZWRUb3RhbEFkZHJlc3MFA25pbAFpAQxzZXRUb3RhbEtleXMCC3Byb2dyYW1OYW1lB2FkZHJlc3MED2NsYWltZWRSZWZlcnJlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQESa2V5Q2xhaW1lZFJlZmVycmVyAgULcHJvZ3JhbU5hbWUFB2FkZHJlc3MAAAQPY2xhaW1lZFJlZmVycmFsCQELdmFsdWVPckVsc2UCCQCfCAEJARJrZXlDbGFpbWVkUmVmZXJyYWwCBQtwcm9ncmFtTmFtZQUHYWRkcmVzcwAABBF1bmNsYWltZWRSZWZlcnJlcgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEUa2V5VW5jbGFpbWVkUmVmZXJyZXICBQtwcm9ncmFtTmFtZQUHYWRkcmVzcwAABBF1bmNsYWltZWRSZWZlcnJhbAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEUa2V5VW5jbGFpbWVkUmVmZXJyYWwCBQtwcm9ncmFtTmFtZQUHYWRkcmVzcwAABBNjbGFpbWVkVG90YWxBZGRyZXNzCQBkAgUPY2xhaW1lZFJlZmVycmVyBQ9jbGFpbWVkUmVmZXJyYWwEFXVuY2xhaW1lZFRvdGFsQWRkcmVzcwkAZAIFEXVuY2xhaW1lZFJlZmVycmVyBRF1bmNsYWltZWRSZWZlcnJhbAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEWa2V5Q2xhaW1lZFRvdGFsQWRkcmVzcwEFB2FkZHJlc3MFE2NsYWltZWRUb3RhbEFkZHJlc3MJAMwIAgkBDEludGVnZXJFbnRyeQIJARhrZXlVbmNsYWltZWRUb3RhbEFkZHJlc3MBBQdhZGRyZXNzBRV1bmNsYWltZWRUb3RhbEFkZHJlc3MFA25pbAUEdW5pdAFpAQpzZXRNYW5hZ2VyARdwZW5kaW5nTWFuYWdlclB1YmxpY0tleQQLY2hlY2tDYWxsZXIJAQttdXN0TWFuYWdlcgEFAWkDCQAAAgULY2hlY2tDYWxsZXIFC2NoZWNrQ2FsbGVyBBVjaGVja01hbmFnZXJQdWJsaWNLZXkJANkEAQUXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkDCQAAAgUVY2hlY2tNYW5hZ2VyUHVibGljS2V5BRVjaGVja01hbmFnZXJQdWJsaWNLZXkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBGmtleVBlbmRpbmdNYW5hZ2VyUHVibGljS2V5AAUXcGVuZGluZ01hbmFnZXJQdWJsaWNLZXkFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQ5jb25maXJtTWFuYWdlcgAEAnBtCQEdcGVuZGluZ01hbmFnZXJQdWJsaWNLZXlPclVuaXQABAVoYXNQTQMJAQlpc0RlZmluZWQBBQJwbQYJAQh0aHJvd0VycgECEm5vIHBlbmRpbmcgbWFuYWdlcgMJAAACBQVoYXNQTQUFaGFzUE0EB2NoZWNrUE0DCQAAAggFAWkPY2FsbGVyUHVibGljS2V5CQEFdmFsdWUBBQJwbQYJAQh0aHJvd0VycgECG3lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQdjaGVja1BNBQdjaGVja1BNCQDMCAIJAQtTdHJpbmdFbnRyeQIJARNrZXlNYW5hZ2VyUHVibGljS2V5AAkA2AQBCQEFdmFsdWUBBQJwbQkAzAgCCQELRGVsZXRlRW50cnkBCQEaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABA90YXJnZXRQdWJsaWNLZXkEByRtYXRjaDAJARZtYW5hZ2VyUHVibGljS2V5T3JVbml0AAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAJwawUHJG1hdGNoMAUCcGsDCQABAgUHJG1hdGNoMAIEVW5pdAgFAnR4D3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAABQ90YXJnZXRQdWJsaWNLZXl40VSv", "chainId": 87, "height": 3367557, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: ECCt777mzfUDuaX8xdTx53YC8oHaGQfJNXdsF1BejthW Next: AsB5dk26csqVcYusxtKaML3kQe8EQoUeSKAXbGCXFbvk Diff:
OldNewDifferences
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "__"
5+
6+func keyWxAssetId () = makeString(["%s", "wxAssetId"], separator)
7+
58
69 let keyBackendPublicKey = makeString(["%s", "backendPublicKey"], separator)
710
811 func keyExistsReferrerToReferral (programName,referrerAddress,referralAddress) = makeString(["%s%s%s%s", "existsReferrerToReferral", programName, referrerAddress, referralAddress], separator)
912
1013
11-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)
1215
1316
14-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)
1518
1619
17-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)
1821
1922
20-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)
2124
2225
2326 func keyReferrer (programName,referralAddress) = makeString(["%s%s%s", "referrer", programName, referralAddress], separator)
3538 func keyIsReferralActive (programName,referralAddress) = makeString(["%s%s%s", "activeReferral", programName, referralAddress], separator)
3639
3740
41+func keyClaimedTotalAddress (address) = makeString(["%s%s", "claimedTotalAddress", address], separator)
42+
43+
44+func keyUnclaimedTotalAddress (address) = makeString(["%s%s", "unclaimedTotalAddress", address], separator)
45+
46+
3847 func keyClaimedTotal (programName) = makeString(["%s%s", "claimedTotal", programName], separator)
3948
4049
4857
4958
5059 func keyImplementationContract (programName) = makeString(["%s%s", "implementationContract", programName], separator)
60+
61+
62+func keyAllReferralPrograms (address) = makeString(["%s%s", "allReferralPrograms", address], separator)
63+
64+
65+func keyLastIncUnclaimedWithPaymentCallBlock (address) = makeString(["%s%s", "lastIncUnclaimedWithPaymentCallBlock", address], separator)
5166
5267
5368 func keyManagerPublicKey () = "%s__managerPublicKey"
100115 throw("Match error")
101116 }
102117 }
118+
119+
120+func updateAllReferralPrograms (address,programName) = {
121+ let allReferralPrograms = valueOrElse(getString(keyAllReferralPrograms(address)), "")
122+ let updatedAllReferralPrograms = if (contains(allReferralPrograms, programName))
123+ then nil
124+ else {
125+ let newAllReferralPrograms = if ((allReferralPrograms == ""))
126+ then programName
127+ else makeString([allReferralPrograms, programName], separator)
128+[StringEntry(keyAllReferralPrograms(address), newAllReferralPrograms)]
129+ }
130+ updatedAllReferralPrograms
131+ }
132+
133+
134+@Callable(i)
135+func claimInternal (programName,claimerAddress,isImplementationContract) = {
136+ let checkProgramExists = if (valueOrElse(getBoolean(keyProgramName(programName)), false))
137+ then true
138+ else throwErr("program does not exist")
139+ if ((checkProgramExists == checkProgramExists))
140+ then {
141+ let $t048215758 = if (isImplementationContract)
142+ 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"))
143+ 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"))
144+ let claimerClaimed = $t048215758._1
145+ let claimerUnclaimed = $t048215758._2
146+ let keyClaimed = $t048215758._3
147+ let keyUnclaimed = $t048215758._4
148+ let claimHistoryKey = $t048215758._5
149+ let claimedTotal = valueOrElse(getInteger(keyClaimedTotal(programName)), 0)
150+ let treasuryContract = value(addressFromString(value(getString(keyTreasuryContract(programName)))))
151+ let rewardAssetId = fromBase58String(value(getString(keyRewardAssetId(programName))))
152+ let claimedTotalAddress = valueOrElse(getInteger(keyClaimedTotalAddress(claimerAddress)), 0)
153+ let unclaimedTotalAddress = valueOrElse(getInteger(keyUnclaimedTotalAddress(claimerAddress)), 0)
154+ if (if (isImplementationContract)
155+ then (claimerUnclaimed == 0)
156+ else false)
157+ then $Tuple2(nil, 0)
158+ else {
159+ let checkCanClaim = if ((claimerUnclaimed > 0))
160+ then true
161+ else throwErr("nothing to claim")
162+ if ((checkCanClaim == checkCanClaim))
163+ then {
164+ let newClaimerClaimed = (claimerClaimed + claimerUnclaimed)
165+ let newClaimedTotal = (claimedTotal + claimerUnclaimed)
166+ let newClaimedTotalAddress = (claimedTotalAddress + claimerUnclaimed)
167+ let newUnclaimedTotalAddress = (unclaimedTotalAddress - claimerUnclaimed)
168+ let balanceBefore = value(assetBalance(this, rewardAssetId))
169+ if ((balanceBefore == balanceBefore))
170+ then {
171+ let res = invoke(treasuryContract, "withdrawReferralReward", [claimerUnclaimed], nil)
172+ if ((res == res))
173+ then {
174+ let balanceAfter = value(assetBalance(this, rewardAssetId))
175+ if ((balanceAfter == balanceAfter))
176+ then {
177+ let balanceDiff = (balanceAfter - balanceBefore)
178+ if ((balanceDiff == balanceDiff))
179+ then {
180+ let checkBalance = if ((balanceDiff == claimerUnclaimed))
181+ then true
182+ else throwErr("insufficient balance on referral contract")
183+ if ((checkBalance == checkBalance))
184+ 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)
185+ else throw("Strict value is not equal to itself.")
186+ }
187+ else throw("Strict value is not equal to itself.")
188+ }
189+ else throw("Strict value is not equal to itself.")
190+ }
191+ else throw("Strict value is not equal to itself.")
192+ }
193+ else throw("Strict value is not equal to itself.")
194+ }
195+ else throw("Strict value is not equal to itself.")
196+ }
197+ }
198+ else throw("Strict value is not equal to itself.")
199+ }
200+
201+
202+
203+@Callable(i)
204+func claimBulkInternal (claimer,programNames,currentIter) = {
205+ let checkCaller = if ((i.caller == this))
206+ then true
207+ else throwErr("permission denied")
208+ if ((checkCaller == checkCaller))
209+ then if ((currentIter == size(programNames)))
210+ then nil
211+ else {
212+ let programName = programNames[currentIter]
213+ let programUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, claimer)), 0)
214+ let claimHistoryKey = keyClaimHistory(programName, claimer, toBase58String(i.transactionId), "claimBulk")
215+ let claimBulkInternal = invoke(this, "claimBulkInternal", [claimer, programNames, (currentIter + 1)], nil)
216+ if ((claimBulkInternal == claimBulkInternal))
217+ then {
218+ let unclaimedReferrer = valueOrElse(getInteger(keyUnclaimedReferrer(programName, claimer)), 0)
219+ let claim = if ((unclaimedReferrer > 0))
220+ then invoke(this, "claimInternal", [programName, claimer, false], nil)
221+ else unit
222+ if ((claim == claim))
223+ then $Tuple2(nil, [claimBulkInternal, claim])
224+ else throw("Strict value is not equal to itself.")
225+ }
226+ else throw("Strict value is not equal to itself.")
227+ }
228+ else throw("Strict value is not equal to itself.")
229+ }
230+
231+
232+
233+@Callable(i)
234+func incUnclaimedWithPaymentInternal (paymentAmounts,programName,referrerAddresses,currentIter,resAmount) = {
235+ let checkCaller = if ((i.caller == this))
236+ then true
237+ else throwErr("permission denied")
238+ if ((checkCaller == checkCaller))
239+ then {
240+ let argsComparison = (size(paymentAmounts) == size(referrerAddresses))
241+ let check = if (argsComparison)
242+ then true
243+ else throwErr("lists in args must be same size")
244+ if ((check == check))
245+ then if ((currentIter == size(paymentAmounts)))
246+ then $Tuple2(nil, resAmount)
247+ else {
248+ let referrerAddress = referrerAddresses[currentIter]
249+ let unclaimedTotalAddress = valueOrElse(getInteger(keyUnclaimedTotalAddress(referrerAddress)), 0)
250+ let referrerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, referrerAddress)), 0)
251+ let rewardsTotal = valueOrElse(getInteger(keyRewardsTotal(programName)), 0)
252+ let newUnclaimedTotalAddress = (unclaimedTotalAddress + paymentAmounts[currentIter])
253+ let newReferrerUnclaimed = (referrerUnclaimed + paymentAmounts[currentIter])
254+ let newResAmount = (resAmount + paymentAmounts[currentIter])
255+ let inv = invoke(this, "incUnclaimedWithPaymentInternal", [paymentAmounts, programName, referrerAddresses, (currentIter + 1), newResAmount], nil)
256+ if ((inv == inv))
257+ then {
258+ let updatedAllReferrerPrograms = updateAllReferralPrograms(referrerAddress, programName)
259+ $Tuple2(([IntegerEntry(keyUnclaimedTotalAddress(referrerAddress), newUnclaimedTotalAddress), IntegerEntry(keyUnclaimedReferrer(programName, referrerAddress), newReferrerUnclaimed), IntegerEntry(keyRewardsTotal(programName), (rewardsTotal + paymentAmounts[currentIter]))] ++ updatedAllReferrerPrograms), inv)
260+ }
261+ else throw("Strict value is not equal to itself.")
262+ }
263+ else throw("Strict value is not equal to itself.")
264+ }
265+ else throw("Strict value is not equal to itself.")
266+ }
267+
103268
104269
105270 @Callable(i)
162327 then {
163328 let totalReferralCount = valueOrElse(getInteger(keyTotalReferralCount(programName, referrerAddress)), 0)
164329 let newTotalReferralCount = (totalReferralCount + 1)
165- $Tuple2([BooleanEntry(keyExistsReferrerToReferral(programName, referrerAddress, referralAddress), true), IntegerEntry(keyTotalReferralCount(programName, referrerAddress), newTotalReferralCount), StringEntry(keyReferrer(programName, referralAddress), referrerAddress)], unit)
330+ let updatedAllReferrerPrograms = updateAllReferralPrograms(referrerAddress, programName)
331+ let updatedAllReferralPrograms = updateAllReferralPrograms(referralAddress, programName)
332+ $Tuple2((([BooleanEntry(keyExistsReferrerToReferral(programName, referrerAddress, referralAddress), true), IntegerEntry(keyTotalReferralCount(programName, referrerAddress), newTotalReferralCount), StringEntry(keyReferrer(programName, referralAddress), referrerAddress)] ++ updatedAllReferrerPrograms) ++ updatedAllReferralPrograms), unit)
166333 }
167334 else throw("Strict value is not equal to itself.")
168335 }
209376 @Callable(i)
210377 func incUnclaimed (programName,referralAddress,referrerReward,referralReward) = {
211378 let implementationContract = value(getString(keyImplementationContract(programName)))
379+ let referrerAddress = value(getString(keyReferrer(programName, referralAddress)))
212380 let checkCaller = if ((toString(i.caller) == implementationContract))
213381 then true
214382 else throwErr("permission denied")
215383 if ((checkCaller == checkCaller))
216384 then {
217- let referrerAddress = value(getString(keyReferrer(programName, referralAddress)))
218- let referrerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, referrerAddress)), 0)
219- let referralUnclaimed = valueOrElse(getInteger(keyUnclaimedReferral(programName, referralAddress)), 0)
220- let rewardsTotal = valueOrElse(getInteger(keyRewardsTotal(programName)), 0)
221- let newReferrerUnclaimed = (referrerUnclaimed + referrerReward)
222- let newReferralUnclaimed = (referralUnclaimed + referralReward)
223- $Tuple2([IntegerEntry(keyUnclaimedReferrer(programName, referrerAddress), newReferrerUnclaimed), IntegerEntry(keyUnclaimedReferral(programName, referralAddress), newReferralUnclaimed), IntegerEntry(keyRewardsTotal(programName), ((rewardsTotal + referrerReward) + referralReward))], unit)
385+ let checkProgram = if ((programName == "wxlock"))
386+ then true
387+ else throwErr("invalid program")
388+ if ((checkProgram == checkProgram))
389+ then {
390+ let checkReferrerInProgram = if (contains(valueOrElse(getString(keyAllReferralPrograms(referrerAddress)), ""), programName))
391+ then true
392+ else throwErr("referrer not in program")
393+ if ((checkReferrerInProgram == checkReferrerInProgram))
394+ then {
395+ let checkReferralInProgram = if (contains(valueOrElse(getString(keyAllReferralPrograms(referralAddress)), ""), programName))
396+ then true
397+ else throwErr("referral not in program")
398+ if ((checkReferralInProgram == checkReferralInProgram))
399+ then {
400+ let unclaimedTotalReferrer = valueOrElse(getInteger(keyUnclaimedTotalAddress(referrerAddress)), 0)
401+ let referrerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, referrerAddress)), 0)
402+ let unclaimedTotalReferral = valueOrElse(getInteger(keyUnclaimedTotalAddress(referralAddress)), 0)
403+ let referralUnclaimed = valueOrElse(getInteger(keyUnclaimedReferral(programName, referralAddress)), 0)
404+ let rewardsTotal = valueOrElse(getInteger(keyRewardsTotal(programName)), 0)
405+ let newUnclaimedTotalReferrer = (unclaimedTotalReferrer + referrerReward)
406+ let newReferrerUnclaimed = (referrerUnclaimed + referrerReward)
407+ let newUnclaimedTotalReferral = (unclaimedTotalReferral + referralReward)
408+ let newReferralUnclaimed = (referralUnclaimed + referralReward)
409+ $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)
410+ }
411+ else throw("Strict value is not equal to itself.")
412+ }
413+ else throw("Strict value is not equal to itself.")
414+ }
415+ else throw("Strict value is not equal to itself.")
416+ }
417+ else throw("Strict value is not equal to itself.")
418+ }
419+
420+
421+
422+@Callable(i)
423+func incUnclaimedWithPayment (programName,referrerAddresses) = {
424+ let checkProgram = if ((programName == "wxSpotFee"))
425+ then true
426+ else throwErr("invalid program")
427+ if ((checkProgram == checkProgram))
428+ then {
429+ let callerAddress = toString(i.caller)
430+ let lastCall = valueOrElse(getInteger(keyLastIncUnclaimedWithPaymentCallBlock(callerAddress)), 0)
431+ let waitBlocks = ((lastCall - height) + 3)
432+ let lastCallCheck = if (((height - 3) > lastCall))
433+ then true
434+ else throwErr(makeString(["wait", toString(waitBlocks), "blocks"], " "))
435+ if ((lastCallCheck == lastCallCheck))
436+ then {
437+ func map (accum,next) = {
438+ let assetIdCheck = (toBase58String(value(next.assetId)) == value(getString(keyRewardAssetId(programName))))
439+ let amountCheck = if (assetIdCheck)
440+ then true
441+ else throwErr("invalid asset id")
442+ if ((amountCheck == amountCheck))
443+ then (accum :+ next.amount)
444+ else throw("Strict value is not equal to itself.")
445+ }
446+
447+ let payments = {
448+ let $l = i.payments
449+ let $s = size($l)
450+ let $acc0 = nil
451+ func $f0_1 ($a,$i) = if (($i >= $s))
452+ then $a
453+ else map($a, $l[$i])
454+
455+ func $f0_2 ($a,$i) = if (($i >= $s))
456+ then $a
457+ else throw("List size exceeds 10")
458+
459+ $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)
460+ }
461+ let resAmount = {
462+ let @ = invoke(this, "incUnclaimedWithPaymentInternal", [payments, programName, referrerAddresses, 0, 0], nil)
463+ if ($isInstanceOf(@, "Int"))
464+ then @
465+ else throw(($getType(@) + " couldn't be cast to Int"))
466+ }
467+ if ((resAmount == resAmount))
468+ then {
469+ let treasuryContract = addressFromStringValue(value(getString(keyTreasuryContract(programName))))
470+ let rewardAssetId = fromBase58String(value(getString(keyRewardAssetId(programName))))
471+[ScriptTransfer(treasuryContract, resAmount, rewardAssetId), IntegerEntry(keyLastIncUnclaimedWithPaymentCallBlock(callerAddress), height)]
472+ }
473+ else throw("Strict value is not equal to itself.")
474+ }
475+ else throw("Strict value is not equal to itself.")
224476 }
225477 else throw("Strict value is not equal to itself.")
226478 }
235487 if ((checkProgramExists == checkProgramExists))
236488 then {
237489 let isImplementationContract = (toString(i.caller) == value(getString(keyImplementationContract(programName))))
238- let $t084179346 = if (isImplementationContract)
239- then {
240- let user = toString(i.originCaller)
241- $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"))
242- }
243- else {
244- let user = toString(i.caller)
245- $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"))
246- }
247- let userAddressStr = $t084179346._1
248- let claimerClaimed = $t084179346._2
249- let claimerUnclaimed = $t084179346._3
250- let keyClaimed = $t084179346._4
251- let keyUnclaimed = $t084179346._5
252- let claimHistoryKey = $t084179346._6
253- let claimedTotal = valueOrElse(getInteger(keyClaimedTotal(programName)), 0)
254- let treasuryContract = value(addressFromString(value(getString(keyTreasuryContract(programName)))))
255- let rewardAssetId = fromBase58String(value(getString(keyRewardAssetId(programName))))
256- if (if (isImplementationContract)
257- then (claimerUnclaimed == 0)
258- else false)
259- then $Tuple2(nil, 0)
260- else {
261- let checkCanClaim = if ((claimerUnclaimed > 0))
262- then true
263- else throwErr("nothing to claim")
264- if ((checkCanClaim == checkCanClaim))
265- then {
266- let newClaimerClaimed = (claimerClaimed + claimerUnclaimed)
267- let newClaimedTotal = (claimedTotal + claimerUnclaimed)
268- let balanceBefore = value(assetBalance(this, rewardAssetId))
269- if ((balanceBefore == balanceBefore))
270- then {
271- let res = invoke(treasuryContract, "withdrawReferralReward", [claimerUnclaimed], nil)
272- if ((res == res))
273- then {
274- let balanceAfter = value(assetBalance(this, rewardAssetId))
275- if ((balanceAfter == balanceAfter))
276- then {
277- let balanceDiff = (balanceAfter - balanceBefore)
278- if ((balanceDiff == balanceDiff))
279- then {
280- let checkBalance = if ((balanceDiff == claimerUnclaimed))
281- then true
282- else throwErr("insufficient balance on referral contract")
283- if ((checkBalance == checkBalance))
284- then $Tuple2([IntegerEntry(keyClaimed, newClaimerClaimed), IntegerEntry(keyClaimedTotal(programName), newClaimedTotal), IntegerEntry(keyUnclaimed, 0), ScriptTransfer(addressFromStringValue(userAddressStr), claimerUnclaimed, rewardAssetId), StringEntry(claimHistoryKey, formatClaimHistory(claimerUnclaimed))], claimerUnclaimed)
285- else throw("Strict value is not equal to itself.")
286- }
287- else throw("Strict value is not equal to itself.")
288- }
289- else throw("Strict value is not equal to itself.")
290- }
291- else throw("Strict value is not equal to itself.")
292- }
293- else throw("Strict value is not equal to itself.")
294- }
295- else throw("Strict value is not equal to itself.")
296- }
490+ let claimerAddress = if (isImplementationContract)
491+ then toString(i.originCaller)
492+ else toString(i.caller)
493+ let claimInternal = invoke(this, "claimInternal", [programName, claimerAddress, isImplementationContract], nil)
494+ if ((claimInternal == claimInternal))
495+ then $Tuple2(nil, claimInternal)
496+ else throw("Strict value is not equal to itself.")
497+ }
498+ else throw("Strict value is not equal to itself.")
499+ }
500+
501+
502+
503+@Callable(i)
504+func claimBulk () = {
505+ let callerAddress = toString(i.caller)
506+ let callerProgramsStr = getString(keyAllReferralPrograms(toString(i.caller)))
507+ let programsExists = if (isDefined(callerProgramsStr))
508+ then true
509+ else throwErr("no referral programs")
510+ if ((programsExists == programsExists))
511+ then {
512+ let callerPrograms = split(value(callerProgramsStr), "__")
513+ let bulkClaim = invoke(this, "claimBulkInternal", [callerAddress, callerPrograms, 0], nil)
514+ if ((bulkClaim == bulkClaim))
515+ then $Tuple2(nil, bulkClaim)
516+ else throw("Strict value is not equal to itself.")
297517 }
298518 else throw("Strict value is not equal to itself.")
299519 }
305525 let claimerClaimed = valueOrElse(getInteger(keyClaimedReferrer(programName, userAddress)), 0)
306526 let claimerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, userAddress)), 0)
307527 $Tuple2(nil, [claimerUnclaimed, claimerClaimed])
528+ }
529+
530+
531+
532+@Callable(i)
533+func claimBulkREADONLY (claimer) = {
534+ let claimedTotalAddress = valueOrElse(getInteger(keyClaimedTotalAddress(claimer)), 0)
535+ let unclaimedTotalAddress = valueOrElse(getInteger(keyUnclaimedTotalAddress(claimer)), 0)
536+ $Tuple2(nil, [unclaimedTotalAddress, claimedTotalAddress])
537+ }
538+
539+
540+
541+@Callable(i)
542+func setTotalKeys (programName,address) = {
543+ let claimedReferrer = valueOrElse(getInteger(keyClaimedReferrer(programName, address)), 0)
544+ let claimedReferral = valueOrElse(getInteger(keyClaimedReferral(programName, address)), 0)
545+ let unclaimedReferrer = valueOrElse(getInteger(keyUnclaimedReferrer(programName, address)), 0)
546+ let unclaimedReferral = valueOrElse(getInteger(keyUnclaimedReferral(programName, address)), 0)
547+ let claimedTotalAddress = (claimedReferrer + claimedReferral)
548+ let unclaimedTotalAddress = (unclaimedReferrer + unclaimedReferral)
549+ $Tuple2([IntegerEntry(keyClaimedTotalAddress(address), claimedTotalAddress), IntegerEntry(keyUnclaimedTotalAddress(address), unclaimedTotalAddress)], unit)
308550 }
309551
310552
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let separator = "__"
5+
6+func keyWxAssetId () = makeString(["%s", "wxAssetId"], separator)
7+
58
69 let keyBackendPublicKey = makeString(["%s", "backendPublicKey"], separator)
710
811 func keyExistsReferrerToReferral (programName,referrerAddress,referralAddress) = makeString(["%s%s%s%s", "existsReferrerToReferral", programName, referrerAddress, referralAddress], separator)
912
1013
11-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)
1215
1316
14-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)
1518
1619
17-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)
1821
1922
20-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)
2124
2225
2326 func keyReferrer (programName,referralAddress) = makeString(["%s%s%s", "referrer", programName, referralAddress], separator)
2427
2528
2629 func keyProgramName (programName) = makeString(["%s%s", "programName", programName], separator)
2730
2831
2932 func keyTotalReferralCount (programName,referrerAddress) = makeString(["%s%s%s", "totalReferralCount", programName, referrerAddress], separator)
3033
3134
3235 func keyActiveReferralCount (programName,referrerAddress) = makeString(["%s%s%s", "activeReferralCount", programName, referrerAddress], separator)
3336
3437
3538 func keyIsReferralActive (programName,referralAddress) = makeString(["%s%s%s", "activeReferral", programName, referralAddress], separator)
3639
3740
41+func keyClaimedTotalAddress (address) = makeString(["%s%s", "claimedTotalAddress", address], separator)
42+
43+
44+func keyUnclaimedTotalAddress (address) = makeString(["%s%s", "unclaimedTotalAddress", address], separator)
45+
46+
3847 func keyClaimedTotal (programName) = makeString(["%s%s", "claimedTotal", programName], separator)
3948
4049
4150 func keyRewardsTotal (programName) = makeString(["%s%s", "rewardsTotal", programName], separator)
4251
4352
4453 func keyRewardAssetId (programName) = makeString(["%s%s", "rewardAssetId", programName], separator)
4554
4655
4756 func keyTreasuryContract (programName) = makeString(["%s%s", "treasuryContract", programName], separator)
4857
4958
5059 func keyImplementationContract (programName) = makeString(["%s%s", "implementationContract", programName], separator)
60+
61+
62+func keyAllReferralPrograms (address) = makeString(["%s%s", "allReferralPrograms", address], separator)
63+
64+
65+func keyLastIncUnclaimedWithPaymentCallBlock (address) = makeString(["%s%s", "lastIncUnclaimedWithPaymentCallBlock", address], separator)
5166
5267
5368 func keyManagerPublicKey () = "%s__managerPublicKey"
5469
5570
5671 func keyPendingManagerPublicKey () = "%s__pendingManagerPublicKey"
5772
5873
5974 func keyClaimHistory (programName,userAddress,transactionId,type) = makeString(["%s%s%s%s%s", "history", type, programName, userAddress, transactionId], separator)
6075
6176
6277 func formatClaimHistory (amount) = makeString(["%d%d%d", toString(lastBlock.height), toString(lastBlock.timestamp), toString(amount)], separator)
6378
6479
6580 func throwErr (msg) = throw(makeString(["referral.ride:", msg], " "))
6681
6782
6883 func managerPublicKeyOrUnit () = match getString(keyManagerPublicKey()) {
6984 case s: String =>
7085 fromBase58String(s)
7186 case _: Unit =>
7287 unit
7388 case _ =>
7489 throw("Match error")
7590 }
7691
7792
7893 func pendingManagerPublicKeyOrUnit () = match getString(keyPendingManagerPublicKey()) {
7994 case s: String =>
8095 fromBase58String(s)
8196 case _: Unit =>
8297 unit
8398 case _ =>
8499 throw("Match error")
85100 }
86101
87102
88103 func mustManager (i) = {
89104 let pd = throwErr("permission denied")
90105 match managerPublicKeyOrUnit() {
91106 case pk: ByteVector =>
92107 if ((i.callerPublicKey == pk))
93108 then true
94109 else pd
95110 case _: Unit =>
96111 if ((i.caller == this))
97112 then true
98113 else pd
99114 case _ =>
100115 throw("Match error")
101116 }
102117 }
118+
119+
120+func updateAllReferralPrograms (address,programName) = {
121+ let allReferralPrograms = valueOrElse(getString(keyAllReferralPrograms(address)), "")
122+ let updatedAllReferralPrograms = if (contains(allReferralPrograms, programName))
123+ then nil
124+ else {
125+ let newAllReferralPrograms = if ((allReferralPrograms == ""))
126+ then programName
127+ else makeString([allReferralPrograms, programName], separator)
128+[StringEntry(keyAllReferralPrograms(address), newAllReferralPrograms)]
129+ }
130+ updatedAllReferralPrograms
131+ }
132+
133+
134+@Callable(i)
135+func claimInternal (programName,claimerAddress,isImplementationContract) = {
136+ let checkProgramExists = if (valueOrElse(getBoolean(keyProgramName(programName)), false))
137+ then true
138+ else throwErr("program does not exist")
139+ if ((checkProgramExists == checkProgramExists))
140+ then {
141+ let $t048215758 = if (isImplementationContract)
142+ 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"))
143+ 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"))
144+ let claimerClaimed = $t048215758._1
145+ let claimerUnclaimed = $t048215758._2
146+ let keyClaimed = $t048215758._3
147+ let keyUnclaimed = $t048215758._4
148+ let claimHistoryKey = $t048215758._5
149+ let claimedTotal = valueOrElse(getInteger(keyClaimedTotal(programName)), 0)
150+ let treasuryContract = value(addressFromString(value(getString(keyTreasuryContract(programName)))))
151+ let rewardAssetId = fromBase58String(value(getString(keyRewardAssetId(programName))))
152+ let claimedTotalAddress = valueOrElse(getInteger(keyClaimedTotalAddress(claimerAddress)), 0)
153+ let unclaimedTotalAddress = valueOrElse(getInteger(keyUnclaimedTotalAddress(claimerAddress)), 0)
154+ if (if (isImplementationContract)
155+ then (claimerUnclaimed == 0)
156+ else false)
157+ then $Tuple2(nil, 0)
158+ else {
159+ let checkCanClaim = if ((claimerUnclaimed > 0))
160+ then true
161+ else throwErr("nothing to claim")
162+ if ((checkCanClaim == checkCanClaim))
163+ then {
164+ let newClaimerClaimed = (claimerClaimed + claimerUnclaimed)
165+ let newClaimedTotal = (claimedTotal + claimerUnclaimed)
166+ let newClaimedTotalAddress = (claimedTotalAddress + claimerUnclaimed)
167+ let newUnclaimedTotalAddress = (unclaimedTotalAddress - claimerUnclaimed)
168+ let balanceBefore = value(assetBalance(this, rewardAssetId))
169+ if ((balanceBefore == balanceBefore))
170+ then {
171+ let res = invoke(treasuryContract, "withdrawReferralReward", [claimerUnclaimed], nil)
172+ if ((res == res))
173+ then {
174+ let balanceAfter = value(assetBalance(this, rewardAssetId))
175+ if ((balanceAfter == balanceAfter))
176+ then {
177+ let balanceDiff = (balanceAfter - balanceBefore)
178+ if ((balanceDiff == balanceDiff))
179+ then {
180+ let checkBalance = if ((balanceDiff == claimerUnclaimed))
181+ then true
182+ else throwErr("insufficient balance on referral contract")
183+ if ((checkBalance == checkBalance))
184+ 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)
185+ else throw("Strict value is not equal to itself.")
186+ }
187+ else throw("Strict value is not equal to itself.")
188+ }
189+ else throw("Strict value is not equal to itself.")
190+ }
191+ else throw("Strict value is not equal to itself.")
192+ }
193+ else throw("Strict value is not equal to itself.")
194+ }
195+ else throw("Strict value is not equal to itself.")
196+ }
197+ }
198+ else throw("Strict value is not equal to itself.")
199+ }
200+
201+
202+
203+@Callable(i)
204+func claimBulkInternal (claimer,programNames,currentIter) = {
205+ let checkCaller = if ((i.caller == this))
206+ then true
207+ else throwErr("permission denied")
208+ if ((checkCaller == checkCaller))
209+ then if ((currentIter == size(programNames)))
210+ then nil
211+ else {
212+ let programName = programNames[currentIter]
213+ let programUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, claimer)), 0)
214+ let claimHistoryKey = keyClaimHistory(programName, claimer, toBase58String(i.transactionId), "claimBulk")
215+ let claimBulkInternal = invoke(this, "claimBulkInternal", [claimer, programNames, (currentIter + 1)], nil)
216+ if ((claimBulkInternal == claimBulkInternal))
217+ then {
218+ let unclaimedReferrer = valueOrElse(getInteger(keyUnclaimedReferrer(programName, claimer)), 0)
219+ let claim = if ((unclaimedReferrer > 0))
220+ then invoke(this, "claimInternal", [programName, claimer, false], nil)
221+ else unit
222+ if ((claim == claim))
223+ then $Tuple2(nil, [claimBulkInternal, claim])
224+ else throw("Strict value is not equal to itself.")
225+ }
226+ else throw("Strict value is not equal to itself.")
227+ }
228+ else throw("Strict value is not equal to itself.")
229+ }
230+
231+
232+
233+@Callable(i)
234+func incUnclaimedWithPaymentInternal (paymentAmounts,programName,referrerAddresses,currentIter,resAmount) = {
235+ let checkCaller = if ((i.caller == this))
236+ then true
237+ else throwErr("permission denied")
238+ if ((checkCaller == checkCaller))
239+ then {
240+ let argsComparison = (size(paymentAmounts) == size(referrerAddresses))
241+ let check = if (argsComparison)
242+ then true
243+ else throwErr("lists in args must be same size")
244+ if ((check == check))
245+ then if ((currentIter == size(paymentAmounts)))
246+ then $Tuple2(nil, resAmount)
247+ else {
248+ let referrerAddress = referrerAddresses[currentIter]
249+ let unclaimedTotalAddress = valueOrElse(getInteger(keyUnclaimedTotalAddress(referrerAddress)), 0)
250+ let referrerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, referrerAddress)), 0)
251+ let rewardsTotal = valueOrElse(getInteger(keyRewardsTotal(programName)), 0)
252+ let newUnclaimedTotalAddress = (unclaimedTotalAddress + paymentAmounts[currentIter])
253+ let newReferrerUnclaimed = (referrerUnclaimed + paymentAmounts[currentIter])
254+ let newResAmount = (resAmount + paymentAmounts[currentIter])
255+ let inv = invoke(this, "incUnclaimedWithPaymentInternal", [paymentAmounts, programName, referrerAddresses, (currentIter + 1), newResAmount], nil)
256+ if ((inv == inv))
257+ then {
258+ let updatedAllReferrerPrograms = updateAllReferralPrograms(referrerAddress, programName)
259+ $Tuple2(([IntegerEntry(keyUnclaimedTotalAddress(referrerAddress), newUnclaimedTotalAddress), IntegerEntry(keyUnclaimedReferrer(programName, referrerAddress), newReferrerUnclaimed), IntegerEntry(keyRewardsTotal(programName), (rewardsTotal + paymentAmounts[currentIter]))] ++ updatedAllReferrerPrograms), inv)
260+ }
261+ else throw("Strict value is not equal to itself.")
262+ }
263+ else throw("Strict value is not equal to itself.")
264+ }
265+ else throw("Strict value is not equal to itself.")
266+ }
267+
103268
104269
105270 @Callable(i)
106271 func createReferralProgram (programName,treasuryContract,implementationContract,rewardAssetId) = {
107272 let checkCaller = mustManager(i)
108273 if ((checkCaller == checkCaller))
109274 then {
110275 let checkProgramName = if ((getBoolean(keyProgramName(programName)) == unit))
111276 then true
112277 else throwErr("program name already exists")
113278 if ((checkProgramName == checkProgramName))
114279 then {
115280 let programNameIsValid = if (!(contains(programName, separator)))
116281 then !(contains(programName, " "))
117282 else false
118283 let checkProgramExists = if (programNameIsValid)
119284 then true
120285 else throwErr("invalid program name")
121286 if ((checkProgramExists == checkProgramExists))
122287 then {
123288 let checkRewardAsset = if ((assetInfo(fromBase58String(rewardAssetId)) != unit))
124289 then true
125290 else throwErr("invalid reward asset id")
126291 if ((checkRewardAsset == checkRewardAsset))
127292 then $Tuple2([BooleanEntry(keyProgramName(programName), true), StringEntry(keyTreasuryContract(programName), treasuryContract), StringEntry(keyImplementationContract(programName), implementationContract), StringEntry(keyRewardAssetId(programName), rewardAssetId), IntegerEntry(keyRewardsTotal(programName), 0)], unit)
128293 else throw("Strict value is not equal to itself.")
129294 }
130295 else throw("Strict value is not equal to itself.")
131296 }
132297 else throw("Strict value is not equal to itself.")
133298 }
134299 else throw("Strict value is not equal to itself.")
135300 }
136301
137302
138303
139304 @Callable(i)
140305 func createPair (programName,referrerAddress,referralAddress,signature) = {
141306 let checkProgramExists = if (valueOrElse(getBoolean(keyProgramName(programName)), false))
142307 then true
143308 else throwErr("program does not exist")
144309 if ((checkProgramExists == checkProgramExists))
145310 then {
146311 let pairReferrerToReferralExistCheck = if ((getBoolean(keyExistsReferrerToReferral(programName, referrerAddress, referralAddress)) == unit))
147312 then true
148313 else throwErr("pair already exists")
149314 if ((pairReferrerToReferralExistCheck == pairReferrerToReferralExistCheck))
150315 then {
151316 let noRefSelf = if ((referrerAddress != referralAddress))
152317 then true
153318 else throwErr("cannot refer to self")
154319 if ((noRefSelf == noRefSelf))
155320 then {
156321 let pair = toBytes(makeString([programName, referrerAddress, referralAddress], ":"))
157322 let backendPublicKey = fromBase58String(value(getString(keyBackendPublicKey)))
158323 let validateSignature = if (sigVerify(pair, signature, backendPublicKey))
159324 then true
160325 else throwErr("bad signature")
161326 if ((validateSignature == validateSignature))
162327 then {
163328 let totalReferralCount = valueOrElse(getInteger(keyTotalReferralCount(programName, referrerAddress)), 0)
164329 let newTotalReferralCount = (totalReferralCount + 1)
165- $Tuple2([BooleanEntry(keyExistsReferrerToReferral(programName, referrerAddress, referralAddress), true), IntegerEntry(keyTotalReferralCount(programName, referrerAddress), newTotalReferralCount), StringEntry(keyReferrer(programName, referralAddress), referrerAddress)], unit)
330+ let updatedAllReferrerPrograms = updateAllReferralPrograms(referrerAddress, programName)
331+ let updatedAllReferralPrograms = updateAllReferralPrograms(referralAddress, programName)
332+ $Tuple2((([BooleanEntry(keyExistsReferrerToReferral(programName, referrerAddress, referralAddress), true), IntegerEntry(keyTotalReferralCount(programName, referrerAddress), newTotalReferralCount), StringEntry(keyReferrer(programName, referralAddress), referrerAddress)] ++ updatedAllReferrerPrograms) ++ updatedAllReferralPrograms), unit)
166333 }
167334 else throw("Strict value is not equal to itself.")
168335 }
169336 else throw("Strict value is not equal to itself.")
170337 }
171338 else throw("Strict value is not equal to itself.")
172339 }
173340 else throw("Strict value is not equal to itself.")
174341 }
175342
176343
177344
178345 @Callable(i)
179346 func updateReferralActivity (programName,referralAddress,isActive) = {
180347 let implementationContract = value(getString(keyImplementationContract(programName)))
181348 let isReferralActive = (getBoolean(keyIsReferralActive(programName, referralAddress)) != unit)
182349 let referrerAddress = value(getString(keyReferrer(programName, referralAddress)))
183350 let checkCaller = if ((toString(i.caller) == implementationContract))
184351 then true
185352 else throwErr("permission denied")
186353 if ((checkCaller == checkCaller))
187354 then {
188355 let update = if ((isReferralActive == isActive))
189356 then $Tuple2(nil, unit)
190357 else {
191358 let update = if ((isActive == true))
192359 then {
193360 let newActiveReferralCount = (valueOrElse(getInteger(keyActiveReferralCount(programName, referrerAddress)), 0) + 1)
194361 $Tuple2([BooleanEntry(keyIsReferralActive(programName, referralAddress), true), IntegerEntry(keyActiveReferralCount(programName, referrerAddress), newActiveReferralCount)], unit)
195362 }
196363 else {
197364 let newActiveReferralCount = (valueOrElse(getInteger(keyActiveReferralCount(programName, referrerAddress)), 0) - 1)
198365 $Tuple2([DeleteEntry(keyIsReferralActive(programName, referralAddress)), IntegerEntry(keyActiveReferralCount(programName, referrerAddress), newActiveReferralCount)], unit)
199366 }
200367 update
201368 }
202369 update
203370 }
204371 else throw("Strict value is not equal to itself.")
205372 }
206373
207374
208375
209376 @Callable(i)
210377 func incUnclaimed (programName,referralAddress,referrerReward,referralReward) = {
211378 let implementationContract = value(getString(keyImplementationContract(programName)))
379+ let referrerAddress = value(getString(keyReferrer(programName, referralAddress)))
212380 let checkCaller = if ((toString(i.caller) == implementationContract))
213381 then true
214382 else throwErr("permission denied")
215383 if ((checkCaller == checkCaller))
216384 then {
217- let referrerAddress = value(getString(keyReferrer(programName, referralAddress)))
218- let referrerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, referrerAddress)), 0)
219- let referralUnclaimed = valueOrElse(getInteger(keyUnclaimedReferral(programName, referralAddress)), 0)
220- let rewardsTotal = valueOrElse(getInteger(keyRewardsTotal(programName)), 0)
221- let newReferrerUnclaimed = (referrerUnclaimed + referrerReward)
222- let newReferralUnclaimed = (referralUnclaimed + referralReward)
223- $Tuple2([IntegerEntry(keyUnclaimedReferrer(programName, referrerAddress), newReferrerUnclaimed), IntegerEntry(keyUnclaimedReferral(programName, referralAddress), newReferralUnclaimed), IntegerEntry(keyRewardsTotal(programName), ((rewardsTotal + referrerReward) + referralReward))], unit)
385+ let checkProgram = if ((programName == "wxlock"))
386+ then true
387+ else throwErr("invalid program")
388+ if ((checkProgram == checkProgram))
389+ then {
390+ let checkReferrerInProgram = if (contains(valueOrElse(getString(keyAllReferralPrograms(referrerAddress)), ""), programName))
391+ then true
392+ else throwErr("referrer not in program")
393+ if ((checkReferrerInProgram == checkReferrerInProgram))
394+ then {
395+ let checkReferralInProgram = if (contains(valueOrElse(getString(keyAllReferralPrograms(referralAddress)), ""), programName))
396+ then true
397+ else throwErr("referral not in program")
398+ if ((checkReferralInProgram == checkReferralInProgram))
399+ then {
400+ let unclaimedTotalReferrer = valueOrElse(getInteger(keyUnclaimedTotalAddress(referrerAddress)), 0)
401+ let referrerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, referrerAddress)), 0)
402+ let unclaimedTotalReferral = valueOrElse(getInteger(keyUnclaimedTotalAddress(referralAddress)), 0)
403+ let referralUnclaimed = valueOrElse(getInteger(keyUnclaimedReferral(programName, referralAddress)), 0)
404+ let rewardsTotal = valueOrElse(getInteger(keyRewardsTotal(programName)), 0)
405+ let newUnclaimedTotalReferrer = (unclaimedTotalReferrer + referrerReward)
406+ let newReferrerUnclaimed = (referrerUnclaimed + referrerReward)
407+ let newUnclaimedTotalReferral = (unclaimedTotalReferral + referralReward)
408+ let newReferralUnclaimed = (referralUnclaimed + referralReward)
409+ $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)
410+ }
411+ else throw("Strict value is not equal to itself.")
412+ }
413+ else throw("Strict value is not equal to itself.")
414+ }
415+ else throw("Strict value is not equal to itself.")
416+ }
417+ else throw("Strict value is not equal to itself.")
418+ }
419+
420+
421+
422+@Callable(i)
423+func incUnclaimedWithPayment (programName,referrerAddresses) = {
424+ let checkProgram = if ((programName == "wxSpotFee"))
425+ then true
426+ else throwErr("invalid program")
427+ if ((checkProgram == checkProgram))
428+ then {
429+ let callerAddress = toString(i.caller)
430+ let lastCall = valueOrElse(getInteger(keyLastIncUnclaimedWithPaymentCallBlock(callerAddress)), 0)
431+ let waitBlocks = ((lastCall - height) + 3)
432+ let lastCallCheck = if (((height - 3) > lastCall))
433+ then true
434+ else throwErr(makeString(["wait", toString(waitBlocks), "blocks"], " "))
435+ if ((lastCallCheck == lastCallCheck))
436+ then {
437+ func map (accum,next) = {
438+ let assetIdCheck = (toBase58String(value(next.assetId)) == value(getString(keyRewardAssetId(programName))))
439+ let amountCheck = if (assetIdCheck)
440+ then true
441+ else throwErr("invalid asset id")
442+ if ((amountCheck == amountCheck))
443+ then (accum :+ next.amount)
444+ else throw("Strict value is not equal to itself.")
445+ }
446+
447+ let payments = {
448+ let $l = i.payments
449+ let $s = size($l)
450+ let $acc0 = nil
451+ func $f0_1 ($a,$i) = if (($i >= $s))
452+ then $a
453+ else map($a, $l[$i])
454+
455+ func $f0_2 ($a,$i) = if (($i >= $s))
456+ then $a
457+ else throw("List size exceeds 10")
458+
459+ $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)
460+ }
461+ let resAmount = {
462+ let @ = invoke(this, "incUnclaimedWithPaymentInternal", [payments, programName, referrerAddresses, 0, 0], nil)
463+ if ($isInstanceOf(@, "Int"))
464+ then @
465+ else throw(($getType(@) + " couldn't be cast to Int"))
466+ }
467+ if ((resAmount == resAmount))
468+ then {
469+ let treasuryContract = addressFromStringValue(value(getString(keyTreasuryContract(programName))))
470+ let rewardAssetId = fromBase58String(value(getString(keyRewardAssetId(programName))))
471+[ScriptTransfer(treasuryContract, resAmount, rewardAssetId), IntegerEntry(keyLastIncUnclaimedWithPaymentCallBlock(callerAddress), height)]
472+ }
473+ else throw("Strict value is not equal to itself.")
474+ }
475+ else throw("Strict value is not equal to itself.")
224476 }
225477 else throw("Strict value is not equal to itself.")
226478 }
227479
228480
229481
230482 @Callable(i)
231483 func claim (programName) = {
232484 let checkProgramExists = if (valueOrElse(getBoolean(keyProgramName(programName)), false))
233485 then true
234486 else throwErr("program does not exist")
235487 if ((checkProgramExists == checkProgramExists))
236488 then {
237489 let isImplementationContract = (toString(i.caller) == value(getString(keyImplementationContract(programName))))
238- let $t084179346 = if (isImplementationContract)
239- then {
240- let user = toString(i.originCaller)
241- $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"))
242- }
243- else {
244- let user = toString(i.caller)
245- $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"))
246- }
247- let userAddressStr = $t084179346._1
248- let claimerClaimed = $t084179346._2
249- let claimerUnclaimed = $t084179346._3
250- let keyClaimed = $t084179346._4
251- let keyUnclaimed = $t084179346._5
252- let claimHistoryKey = $t084179346._6
253- let claimedTotal = valueOrElse(getInteger(keyClaimedTotal(programName)), 0)
254- let treasuryContract = value(addressFromString(value(getString(keyTreasuryContract(programName)))))
255- let rewardAssetId = fromBase58String(value(getString(keyRewardAssetId(programName))))
256- if (if (isImplementationContract)
257- then (claimerUnclaimed == 0)
258- else false)
259- then $Tuple2(nil, 0)
260- else {
261- let checkCanClaim = if ((claimerUnclaimed > 0))
262- then true
263- else throwErr("nothing to claim")
264- if ((checkCanClaim == checkCanClaim))
265- then {
266- let newClaimerClaimed = (claimerClaimed + claimerUnclaimed)
267- let newClaimedTotal = (claimedTotal + claimerUnclaimed)
268- let balanceBefore = value(assetBalance(this, rewardAssetId))
269- if ((balanceBefore == balanceBefore))
270- then {
271- let res = invoke(treasuryContract, "withdrawReferralReward", [claimerUnclaimed], nil)
272- if ((res == res))
273- then {
274- let balanceAfter = value(assetBalance(this, rewardAssetId))
275- if ((balanceAfter == balanceAfter))
276- then {
277- let balanceDiff = (balanceAfter - balanceBefore)
278- if ((balanceDiff == balanceDiff))
279- then {
280- let checkBalance = if ((balanceDiff == claimerUnclaimed))
281- then true
282- else throwErr("insufficient balance on referral contract")
283- if ((checkBalance == checkBalance))
284- then $Tuple2([IntegerEntry(keyClaimed, newClaimerClaimed), IntegerEntry(keyClaimedTotal(programName), newClaimedTotal), IntegerEntry(keyUnclaimed, 0), ScriptTransfer(addressFromStringValue(userAddressStr), claimerUnclaimed, rewardAssetId), StringEntry(claimHistoryKey, formatClaimHistory(claimerUnclaimed))], claimerUnclaimed)
285- else throw("Strict value is not equal to itself.")
286- }
287- else throw("Strict value is not equal to itself.")
288- }
289- else throw("Strict value is not equal to itself.")
290- }
291- else throw("Strict value is not equal to itself.")
292- }
293- else throw("Strict value is not equal to itself.")
294- }
295- else throw("Strict value is not equal to itself.")
296- }
490+ let claimerAddress = if (isImplementationContract)
491+ then toString(i.originCaller)
492+ else toString(i.caller)
493+ let claimInternal = invoke(this, "claimInternal", [programName, claimerAddress, isImplementationContract], nil)
494+ if ((claimInternal == claimInternal))
495+ then $Tuple2(nil, claimInternal)
496+ else throw("Strict value is not equal to itself.")
497+ }
498+ else throw("Strict value is not equal to itself.")
499+ }
500+
501+
502+
503+@Callable(i)
504+func claimBulk () = {
505+ let callerAddress = toString(i.caller)
506+ let callerProgramsStr = getString(keyAllReferralPrograms(toString(i.caller)))
507+ let programsExists = if (isDefined(callerProgramsStr))
508+ then true
509+ else throwErr("no referral programs")
510+ if ((programsExists == programsExists))
511+ then {
512+ let callerPrograms = split(value(callerProgramsStr), "__")
513+ let bulkClaim = invoke(this, "claimBulkInternal", [callerAddress, callerPrograms, 0], nil)
514+ if ((bulkClaim == bulkClaim))
515+ then $Tuple2(nil, bulkClaim)
516+ else throw("Strict value is not equal to itself.")
297517 }
298518 else throw("Strict value is not equal to itself.")
299519 }
300520
301521
302522
303523 @Callable(i)
304524 func claimREADONLY (programName,userAddress) = {
305525 let claimerClaimed = valueOrElse(getInteger(keyClaimedReferrer(programName, userAddress)), 0)
306526 let claimerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, userAddress)), 0)
307527 $Tuple2(nil, [claimerUnclaimed, claimerClaimed])
528+ }
529+
530+
531+
532+@Callable(i)
533+func claimBulkREADONLY (claimer) = {
534+ let claimedTotalAddress = valueOrElse(getInteger(keyClaimedTotalAddress(claimer)), 0)
535+ let unclaimedTotalAddress = valueOrElse(getInteger(keyUnclaimedTotalAddress(claimer)), 0)
536+ $Tuple2(nil, [unclaimedTotalAddress, claimedTotalAddress])
537+ }
538+
539+
540+
541+@Callable(i)
542+func setTotalKeys (programName,address) = {
543+ let claimedReferrer = valueOrElse(getInteger(keyClaimedReferrer(programName, address)), 0)
544+ let claimedReferral = valueOrElse(getInteger(keyClaimedReferral(programName, address)), 0)
545+ let unclaimedReferrer = valueOrElse(getInteger(keyUnclaimedReferrer(programName, address)), 0)
546+ let unclaimedReferral = valueOrElse(getInteger(keyUnclaimedReferral(programName, address)), 0)
547+ let claimedTotalAddress = (claimedReferrer + claimedReferral)
548+ let unclaimedTotalAddress = (unclaimedReferrer + unclaimedReferral)
549+ $Tuple2([IntegerEntry(keyClaimedTotalAddress(address), claimedTotalAddress), IntegerEntry(keyUnclaimedTotalAddress(address), unclaimedTotalAddress)], unit)
308550 }
309551
310552
311553
312554 @Callable(i)
313555 func setManager (pendingManagerPublicKey) = {
314556 let checkCaller = mustManager(i)
315557 if ((checkCaller == checkCaller))
316558 then {
317559 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
318560 if ((checkManagerPublicKey == checkManagerPublicKey))
319561 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
320562 else throw("Strict value is not equal to itself.")
321563 }
322564 else throw("Strict value is not equal to itself.")
323565 }
324566
325567
326568
327569 @Callable(i)
328570 func confirmManager () = {
329571 let pm = pendingManagerPublicKeyOrUnit()
330572 let hasPM = if (isDefined(pm))
331573 then true
332574 else throwErr("no pending manager")
333575 if ((hasPM == hasPM))
334576 then {
335577 let checkPM = if ((i.callerPublicKey == value(pm)))
336578 then true
337579 else throwErr("you are not pending manager")
338580 if ((checkPM == checkPM))
339581 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
340582 else throw("Strict value is not equal to itself.")
341583 }
342584 else throw("Strict value is not equal to itself.")
343585 }
344586
345587
346588 @Verifier(tx)
347589 func verify () = {
348590 let targetPublicKey = match managerPublicKeyOrUnit() {
349591 case pk: ByteVector =>
350592 pk
351593 case _: Unit =>
352594 tx.senderPublicKey
353595 case _ =>
354596 throw("Match error")
355597 }
356598 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
357599 }
358600

github/deemru/w8io/6500d08 
52.85 ms