tx · 9WA53dYhMo8abNYSBSwUrCkdBbMjbk8LkVPrdeeGrnYK

3NAsFvuLwxz1iUtZ9fmhfmSN16r9NEsPqsh:  -0.01800000 Waves

2022.10.27 10:23 [2290524] smart account 3NAsFvuLwxz1iUtZ9fmhfmSN16r9NEsPqsh > SELF 0.00000000 Waves

{ "type": 13, "id": "9WA53dYhMo8abNYSBSwUrCkdBbMjbk8LkVPrdeeGrnYK", "fee": 1800000, "feeAssetId": null, "timestamp": 1666855364820, "version": 1, "sender": "3NAsFvuLwxz1iUtZ9fmhfmSN16r9NEsPqsh", "senderPublicKey": "33fpjdpM9FMu87RZKePniPardKqQXM96sm7VhAk3JEVQ", "proofs": [ "5dD13guaNhsEL58Ahtm7bqqWrVkvwJqrSSLN61FVMZGpdYo8b5Xrvprr1ugwGidEbR2tcbDUxtfoL5hU7hsgCYdV" ], "script": "base64:BgLnEwgCEgUKAwgIBBIFCgMIGAESBwoFEQgYAQESBgoECAgICBIGCgQICAgCEgUKAwgIBBIGCgQICAEBEgQKAggYEgMKAQgSABIECgIICBIDCgEIEgQKAggIEgMKAQgSACIJc2VwYXJhdG9yIgxrZXlXeEFzc2V0SWQiE2tleUJhY2tlbmRQdWJsaWNLZXkiG2tleUV4aXN0c1JlZmVycmVyVG9SZWZlcnJhbCILcHJvZ3JhbU5hbWUiD3JlZmVycmVyQWRkcmVzcyIPcmVmZXJyYWxBZGRyZXNzIhJrZXlDbGFpbWVkUmVmZXJyZXIiDmNsYWltZXJBZGRyZXNzIhJrZXlDbGFpbWVkUmVmZXJyYWwiFGtleVVuY2xhaW1lZFJlZmVycmVyIhRrZXlVbmNsYWltZWRSZWZlcnJhbCILa2V5UmVmZXJyZXIiDmtleVByb2dyYW1OYW1lIhVrZXlUb3RhbFJlZmVycmFsQ291bnQiFmtleUFjdGl2ZVJlZmVycmFsQ291bnQiE2tleUlzUmVmZXJyYWxBY3RpdmUiFmtleUNsYWltZWRUb3RhbEFkZHJlc3MiB2FkZHJlc3MiGGtleVVuY2xhaW1lZFRvdGFsQWRkcmVzcyIPa2V5Q2xhaW1lZFRvdGFsIg9rZXlSZXdhcmRzVG90YWwiEGtleVJld2FyZEFzc2V0SWQiE2tleVRyZWFzdXJ5Q29udHJhY3QiGWtleUltcGxlbWVudGF0aW9uQ29udHJhY3QiFmtleUFsbFJlZmVycmFsUHJvZ3JhbXMiJ2tleUxhc3RJbmNVbmNsYWltZWRXaXRoUGF5bWVudENhbGxCbG9jayITa2V5TWFuYWdlclB1YmxpY0tleSIaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiD2tleUNsYWltSGlzdG9yeSILdXNlckFkZHJlc3MiDXRyYW5zYWN0aW9uSWQiBHR5cGUiEmZvcm1hdENsYWltSGlzdG9yeSIGYW1vdW50Igh0aHJvd0VyciIDbXNnIhZtYW5hZ2VyUHVibGljS2V5T3JVbml0IgckbWF0Y2gwIgFzIh1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdCILbXVzdE1hbmFnZXIiAWkiAnBkIgJwayIZdXBkYXRlQWxsUmVmZXJyYWxQcm9ncmFtcyITYWxsUmVmZXJyYWxQcm9ncmFtcyIadXBkYXRlZEFsbFJlZmVycmFsUHJvZ3JhbXMiFm5ld0FsbFJlZmVycmFsUHJvZ3JhbXMiGGlzSW1wbGVtZW50YXRpb25Db250cmFjdCISY2hlY2tQcm9ncmFtRXhpc3RzIgskdDA0ODIxNTc1OCIOY2xhaW1lckNsYWltZWQiEGNsYWltZXJVbmNsYWltZWQiCmtleUNsYWltZWQiDGtleVVuY2xhaW1lZCIPY2xhaW1IaXN0b3J5S2V5IgxjbGFpbWVkVG90YWwiEHRyZWFzdXJ5Q29udHJhY3QiDXJld2FyZEFzc2V0SWQiE2NsYWltZWRUb3RhbEFkZHJlc3MiFXVuY2xhaW1lZFRvdGFsQWRkcmVzcyINY2hlY2tDYW5DbGFpbSIRbmV3Q2xhaW1lckNsYWltZWQiD25ld0NsYWltZWRUb3RhbCIWbmV3Q2xhaW1lZFRvdGFsQWRkcmVzcyIYbmV3VW5jbGFpbWVkVG90YWxBZGRyZXNzIg1iYWxhbmNlQmVmb3JlIgNyZXMiDGJhbGFuY2VBZnRlciILYmFsYW5jZURpZmYiDGNoZWNrQmFsYW5jZSIHY2xhaW1lciIMcHJvZ3JhbU5hbWVzIgtjdXJyZW50SXRlciILY2hlY2tDYWxsZXIiEHByb2dyYW1VbmNsYWltZWQiEWNsYWltQnVsa0ludGVybmFsIhF1bmNsYWltZWRSZWZlcnJlciIFY2xhaW0iDnBheW1lbnRBbW91bnRzIhFyZWZlcnJlckFkZHJlc3NlcyIJcmVzQW1vdW50Ig5hcmdzQ29tcGFyaXNvbiIFY2hlY2siEXJlZmVycmVyVW5jbGFpbWVkIgxyZXdhcmRzVG90YWwiFG5ld1JlZmVycmVyVW5jbGFpbWVkIgxuZXdSZXNBbW91bnQiA2ludiIadXBkYXRlZEFsbFJlZmVycmVyUHJvZ3JhbXMiFmltcGxlbWVudGF0aW9uQ29udHJhY3QiEGNoZWNrUHJvZ3JhbU5hbWUiEnByb2dyYW1OYW1lSXNWYWxpZCIQY2hlY2tSZXdhcmRBc3NldCIJc2lnbmF0dXJlIiBwYWlyUmVmZXJyZXJUb1JlZmVycmFsRXhpc3RDaGVjayIJbm9SZWZTZWxmIgRwYWlyIhBiYWNrZW5kUHVibGljS2V5IhF2YWxpZGF0ZVNpZ25hdHVyZSISdG90YWxSZWZlcnJhbENvdW50IhVuZXdUb3RhbFJlZmVycmFsQ291bnQiCGlzQWN0aXZlIhBpc1JlZmVycmFsQWN0aXZlIgZ1cGRhdGUiFm5ld0FjdGl2ZVJlZmVycmFsQ291bnQiDnJlZmVycmVyUmV3YXJkIg5yZWZlcnJhbFJld2FyZCIMY2hlY2tQcm9ncmFtIhZjaGVja1JlZmVycmVySW5Qcm9ncmFtIhZjaGVja1JlZmVycmFsSW5Qcm9ncmFtIhZ1bmNsYWltZWRUb3RhbFJlZmVycmVyIhZ1bmNsYWltZWRUb3RhbFJlZmVycmFsIhFyZWZlcnJhbFVuY2xhaW1lZCIZbmV3VW5jbGFpbWVkVG90YWxSZWZlcnJlciIZbmV3VW5jbGFpbWVkVG90YWxSZWZlcnJhbCIUbmV3UmVmZXJyYWxVbmNsYWltZWQiDWNhbGxlckFkZHJlc3MiCGxhc3RDYWxsIgp3YWl0QmxvY2tzIg1sYXN0Q2FsbENoZWNrIgNtYXAiBWFjY3VtIgRuZXh0Igxhc3NldElkQ2hlY2siC2Ftb3VudENoZWNrIghwYXltZW50cyICJGwiAiRzIgUkYWNjMCIFJGYwXzEiAiRhIgIkaSIFJGYwXzIiAUAiDWNsYWltSW50ZXJuYWwiEWNhbGxlclByb2dyYW1zU3RyIg5wcm9ncmFtc0V4aXN0cyIOY2FsbGVyUHJvZ3JhbXMiCWJ1bGtDbGFpbSIPY2xhaW1lZFJlZmVycmVyIg9jbGFpbWVkUmVmZXJyYWwiEXVuY2xhaW1lZFJlZmVycmFsIhdwZW5kaW5nTWFuYWdlclB1YmxpY0tleSIVY2hlY2tNYW5hZ2VyUHVibGljS2V5IgJwbSIFaGFzUE0iB2NoZWNrUE0iAnR4IgZ2ZXJpZnkiD3RhcmdldFB1YmxpY0tleR8AAWECAl9fAQFiAAkAuQkCCQDMCAICAiVzCQDMCAICCXd4QXNzZXRJZAUDbmlsBQFhAAFjCQC5CQIJAMwIAgICJXMJAMwIAgIQYmFja2VuZFB1YmxpY0tleQUDbmlsBQFhAQFkAwFlAWYBZwkAuQkCCQDMCAICCCVzJXMlcyVzCQDMCAICGGV4aXN0c1JlZmVycmVyVG9SZWZlcnJhbAkAzAgCBQFlCQDMCAIFAWYJAMwIAgUBZwUDbmlsBQFhAQFoAgFlAWkJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIPY2xhaW1lZFJlZmVycmVyCQDMCAIFAWUJAMwIAgUBaQUDbmlsBQFhAQFqAgFlAWkJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIPY2xhaW1lZFJlZmVycmFsCQDMCAIFAWUJAMwIAgUBaQUDbmlsBQFhAQFrAgFlAWkJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIRdW5jbGFpbWVkUmVmZXJyZXIJAMwIAgUBZQkAzAgCBQFpBQNuaWwFAWEBAWwCAWUBaQkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAhF1bmNsYWltZWRSZWZlcnJhbAkAzAgCBQFlCQDMCAIFAWkFA25pbAUBYQEBbQIBZQFnCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCHJlZmVycmVyCQDMCAIFAWUJAMwIAgUBZwUDbmlsBQFhAQFuAQFlCQC5CQIJAMwIAgIEJXMlcwkAzAgCAgtwcm9ncmFtTmFtZQkAzAgCBQFlBQNuaWwFAWEBAW8CAWUBZgkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAhJ0b3RhbFJlZmVycmFsQ291bnQJAMwIAgUBZQkAzAgCBQFmBQNuaWwFAWEBAXACAWUBZgkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAhNhY3RpdmVSZWZlcnJhbENvdW50CQDMCAIFAWUJAMwIAgUBZgUDbmlsBQFhAQFxAgFlAWcJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIOYWN0aXZlUmVmZXJyYWwJAMwIAgUBZQkAzAgCBQFnBQNuaWwFAWEBAXIBAXMJALkJAgkAzAgCAgQlcyVzCQDMCAICE2NsYWltZWRUb3RhbEFkZHJlc3MJAMwIAgUBcwUDbmlsBQFhAQF0AQFzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAhV1bmNsYWltZWRUb3RhbEFkZHJlc3MJAMwIAgUBcwUDbmlsBQFhAQF1AQFlCQC5CQIJAMwIAgIEJXMlcwkAzAgCAgxjbGFpbWVkVG90YWwJAMwIAgUBZQUDbmlsBQFhAQF2AQFlCQC5CQIJAMwIAgIEJXMlcwkAzAgCAgxyZXdhcmRzVG90YWwJAMwIAgUBZQUDbmlsBQFhAQF3AQFlCQC5CQIJAMwIAgIEJXMlcwkAzAgCAg1yZXdhcmRBc3NldElkCQDMCAIFAWUFA25pbAUBYQEBeAEBZQkAuQkCCQDMCAICBCVzJXMJAMwIAgIQdHJlYXN1cnlDb250cmFjdAkAzAgCBQFlBQNuaWwFAWEBAXkBAWUJALkJAgkAzAgCAgQlcyVzCQDMCAICFmltcGxlbWVudGF0aW9uQ29udHJhY3QJAMwIAgUBZQUDbmlsBQFhAQF6AQFzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAhNhbGxSZWZlcnJhbFByb2dyYW1zCQDMCAIFAXMFA25pbAUBYQEBQQEBcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIkbGFzdEluY1VuY2xhaW1lZFdpdGhQYXltZW50Q2FsbEJsb2NrCQDMCAIFAXMFA25pbAUBYQEBQgACFCVzX19tYW5hZ2VyUHVibGljS2V5AQFDAAIbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AQFEBAFlAUUBRgFHCQC5CQIJAMwIAgIKJXMlcyVzJXMlcwkAzAgCAgdoaXN0b3J5CQDMCAIFAUcJAMwIAgUBZQkAzAgCBQFFCQDMCAIFAUYFA25pbAUBYQEBSAEBSQkAuQkCCQDMCAICBiVkJWQlZAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sGaGVpZ2h0CQDMCAIJAKQDAQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkApAMBBQFJBQNuaWwFAWEBAUoBAUsJAAIBCQC5CQIJAMwIAgIOcmVmZXJyYWwucmlkZToJAMwIAgUBSwUDbmlsAgEgAQFMAAQBTQkAoggBCQEBQgADCQABAgUBTQIGU3RyaW5nBAFOBQFNCQDZBAEFAU4DCQABAgUBTQIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQFPAAQBTQkAoggBCQEBQwADCQABAgUBTQIGU3RyaW5nBAFOBQFNCQDZBAEFAU4DCQABAgUBTQIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQFQAQFRBAFSCQEBSgECEXBlcm1pc3Npb24gZGVuaWVkBAFNCQEBTAADCQABAgUBTQIKQnl0ZVZlY3RvcgQBUwUBTQMJAAACCAUBUQ9jYWxsZXJQdWJsaWNLZXkFAVMGBQFSAwkAAQIFAU0CBFVuaXQDCQAAAggFAVEGY2FsbGVyBQR0aGlzBgUBUgkAAgECC01hdGNoIGVycm9yAQFUAgFzAWUEAVUJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBAXoBBQFzAgAEAVYDCQEIY29udGFpbnMCBQFVBQFlBQNuaWwEAVcDCQAAAgUBVQIABQFlCQC5CQIJAMwIAgUBVQkAzAgCBQFlBQNuaWwFAWEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAXoBBQFzBQFXBQNuaWwFAVYPAVEBDWNsYWltSW50ZXJuYWwDAWUBaQFYBAFZAwkBC3ZhbHVlT3JFbHNlAgkAoAgBCQEBbgEFAWUHBgkBAUoBAhZwcm9ncmFtIGRvZXMgbm90IGV4aXN0AwkAAAIFAVkFAVkEAVoDBQFYCQCXCgUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAWoCBQFlBQFpAAAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAWwCBQFlBQFpAAAJAQFqAgUBZQUBaQkBAWwCBQFlBQFpCQEBRAQFAWUFAWkJANgEAQgFAVENdHJhbnNhY3Rpb25JZAINY2xhaW1SZWZlcnJhbAkAlwoFCQELdmFsdWVPckVsc2UCCQCfCAEJAQFoAgUBZQUBaQAACQELdmFsdWVPckVsc2UCCQCfCAEJAQFrAgUBZQUBaQAACQEBaAIFAWUFAWkJAQFrAgUBZQUBaQkBAUQEBQFlBQFpCQDYBAEIBQFRDXRyYW5zYWN0aW9uSWQCDWNsYWltUmVmZXJyZXIEAmFhCAUBWgJfMQQCYWIIBQFaAl8yBAJhYwgFAVoCXzMEAmFkCAUBWgJfNAQCYWUIBQFaAl81BAJhZgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBdQEFAWUAAAQCYWcJAQV2YWx1ZQEJAKYIAQkBBXZhbHVlAQkAoggBCQEBeAEFAWUEAmFoCQDZBAEJAQV2YWx1ZQEJAKIIAQkBAXcBBQFlBAJhaQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBcgEFAWkAAAQCYWoJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAXQBBQFpAAADAwUBWAkAAAIFAmFiAAAHCQCUCgIFA25pbAAABAJhawMJAGYCBQJhYgAABgkBAUoBAhBub3RoaW5nIHRvIGNsYWltAwkAAAIFAmFrBQJhawQCYWwJAGQCBQJhYQUCYWIEAmFtCQBkAgUCYWYFAmFiBAJhbgkAZAIFAmFpBQJhYgQCYW8JAGUCBQJhagUCYWIEAmFwCQEFdmFsdWUBCQDwBwIFBHRoaXMFAmFoAwkAAAIFAmFwBQJhcAQCYXEJAPwHBAUCYWcCFndpdGhkcmF3UmVmZXJyYWxSZXdhcmQJAMwIAgUCYWIFA25pbAUDbmlsAwkAAAIFAmFxBQJhcQQCYXIJAQV2YWx1ZQEJAPAHAgUEdGhpcwUCYWgDCQAAAgUCYXIFAmFyBAJhcwkAZQIFAmFyBQJhcAMJAAACBQJhcwUCYXMEAmF0AwkAAAIFAmFzBQJhYgYJAQFKAQIpaW5zdWZmaWNpZW50IGJhbGFuY2Ugb24gcmVmZXJyYWwgY29udHJhY3QDCQAAAgUCYXQFAmF0CQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFAmFjBQJhbAkAzAgCCQEMSW50ZWdlckVudHJ5AgUCYWQAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAXUBBQFlBQJhbQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAXIBBQFpBQJhbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAXQBBQFpBQJhbwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQFpBQJhYgUCYWgJAMwIAgkBC1N0cmluZ0VudHJ5AgUCYWUJAQFIAQUCYWIFA25pbAUCYWIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BUQERY2xhaW1CdWxrSW50ZXJuYWwDAmF1AmF2AmF3BAJheAMJAAACCAUBUQZjYWxsZXIFBHRoaXMGCQEBSgECEXBlcm1pc3Npb24gZGVuaWVkAwkAAAIFAmF4BQJheAMJAAACBQJhdwkAkAMBBQJhdgUDbmlsBAFlCQCRAwIFAmF2BQJhdwQCYXkJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAWsCBQFlBQJhdQAABAJhZQkBAUQEBQFlBQJhdQkA2AQBCAUBUQ10cmFuc2FjdGlvbklkAgljbGFpbUJ1bGsEAmF6CQD8BwQFBHRoaXMCEWNsYWltQnVsa0ludGVybmFsCQDMCAIFAmF1CQDMCAIFAmF2CQDMCAIJAGQCBQJhdwABBQNuaWwFA25pbAMJAAACBQJhegUCYXoEAmFBCQELdmFsdWVPckVsc2UCCQCfCAEJAQFrAgUBZQUCYXUAAAQCYUIDCQBmAgUCYUEAAAkA/AcEBQR0aGlzAg1jbGFpbUludGVybmFsCQDMCAIFAWUJAMwIAgUCYXUJAMwIAgcFA25pbAUDbmlsBQR1bml0AwkAAAIFAmFCBQJhQgkAlAoCBQNuaWwJAMwIAgUCYXoJAMwIAgUCYUIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFRAR9pbmNVbmNsYWltZWRXaXRoUGF5bWVudEludGVybmFsBQJhQwFlAmFEAmF3AmFFBAJheAMJAAACCAUBUQZjYWxsZXIFBHRoaXMGCQEBSgECEXBlcm1pc3Npb24gZGVuaWVkAwkAAAIFAmF4BQJheAQCYUYJAAACCQCQAwEFAmFDCQCQAwEFAmFEBAJhRwMFAmFGBgkBAUoBAh9saXN0cyBpbiBhcmdzIG11c3QgYmUgc2FtZSBzaXplAwkAAAIFAmFHBQJhRwMJAAACBQJhdwkAkAMBBQJhQwkAlAoCBQNuaWwFAmFFBAFmCQCRAwIFAmFEBQJhdwQCYWoJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAXQBBQFmAAAEAmFICQELdmFsdWVPckVsc2UCCQCfCAEJAQFrAgUBZQUBZgAABAJhSQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBdgEFAWUAAAQCYW8JAGQCBQJhagkAkQMCBQJhQwUCYXcEAmFKCQBkAgUCYUgJAJEDAgUCYUMFAmF3BAJhSwkAZAIFAmFFCQCRAwIFAmFDBQJhdwQCYUwJAPwHBAUEdGhpcwIfaW5jVW5jbGFpbWVkV2l0aFBheW1lbnRJbnRlcm5hbAkAzAgCBQJhQwkAzAgCBQFlCQDMCAIFAmFECQDMCAIJAGQCBQJhdwABCQDMCAIFAmFLBQNuaWwFA25pbAMJAAACBQJhTAUCYUwEAmFNCQEBVAIFAWYFAWUJAJQKAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBdAEFAWYFAmFvCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBawIFAWUFAWYFAmFKCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBdgEFAWUJAGQCBQJhSQkAkQMCBQJhQwUCYXcFA25pbAUCYU0FAmFMCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAVEBFWNyZWF0ZVJlZmVycmFsUHJvZ3JhbQQBZQJhZwJhTgJhaAQCYXgJAQFQAQUBUQMJAAACBQJheAUCYXgEAmFPAwkAAAIJAKAIAQkBAW4BBQFlBQR1bml0BgkBAUoBAhtwcm9ncmFtIG5hbWUgYWxyZWFkeSBleGlzdHMDCQAAAgUCYU8FAmFPBAJhUAMJAQEhAQkBCGNvbnRhaW5zAgUBZQUBYQkBASEBCQEIY29udGFpbnMCBQFlAgEgBwQBWQMFAmFQBgkBAUoBAhRpbnZhbGlkIHByb2dyYW0gbmFtZQMJAAACBQFZBQFZBAJhUQMJAQIhPQIJAOwHAQkA2QQBBQJhaAUEdW5pdAYJAQFKAQIXaW52YWxpZCByZXdhcmQgYXNzZXQgaWQDCQAAAgUCYVEFAmFRCQCUCgIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQFuAQUBZQYJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAXgBBQFlBQJhZwkAzAgCCQELU3RyaW5nRW50cnkCCQEBeQEFAWUFAmFOCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQF3AQUBZQUCYWgJAMwIAgkBDEludGVnZXJFbnRyeQIJAQF2AQUBZQAABQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BUQEKY3JlYXRlUGFpcgQBZQFmAWcCYVIEAVkDCQELdmFsdWVPckVsc2UCCQCgCAEJAQFuAQUBZQcGCQEBSgECFnByb2dyYW0gZG9lcyBub3QgZXhpc3QDCQAAAgUBWQUBWQQCYVMDCQAAAgkAoAgBCQEBZAMFAWUFAWYFAWcFBHVuaXQGCQEBSgECE3BhaXIgYWxyZWFkeSBleGlzdHMDCQAAAgUCYVMFAmFTBAJhVAMJAQIhPQIFAWYFAWcGCQEBSgECFGNhbm5vdCByZWZlciB0byBzZWxmAwkAAAIFAmFUBQJhVAQCYVUJAJsDAQkAuQkCCQDMCAIFAWUJAMwIAgUBZgkAzAgCBQFnBQNuaWwCAToEAmFWCQDZBAEJAQV2YWx1ZQEJAKIIAQUBYwQCYVcDCQD0AwMFAmFVBQJhUgUCYVYGCQEBSgECDWJhZCBzaWduYXR1cmUDCQAAAgUCYVcFAmFXBAJhWAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBbwIFAWUFAWYAAAQCYVkJAGQCBQJhWAABBAJhTQkBAVQCBQFmBQFlBAFWCQEBVAIFAWcFAWUJAJQKAgkAzggCCQDOCAIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQFkAwUBZQUBZgUBZwYJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFvAgUBZQUBZgUCYVkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAW0CBQFlBQFnBQFmBQNuaWwFAmFNBQFWBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAVEBFnVwZGF0ZVJlZmVycmFsQWN0aXZpdHkDAWUBZwJhWgQCYU4JAQV2YWx1ZQEJAKIIAQkBAXkBBQFlBAJiYQkBAiE9AgkAoAgBCQEBcQIFAWUFAWcFBHVuaXQEAWYJAQV2YWx1ZQEJAKIIAQkBAW0CBQFlBQFnBAJheAMJAAACCQClCAEIBQFRBmNhbGxlcgUCYU4GCQEBSgECEXBlcm1pc3Npb24gZGVuaWVkAwkAAAIFAmF4BQJheAQCYmIDCQAAAgUCYmEFAmFaCQCUCgIFA25pbAUEdW5pdAQCYmIDCQAAAgUCYVoGBAJiYwkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAXACBQFlBQFmAAAAAQkAlAoCCQDMCAIJAQxCb29sZWFuRW50cnkCCQEBcQIFAWUFAWcGCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBcAIFAWUFAWYFAmJjBQNuaWwFBHVuaXQEAmJjCQBlAgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBcAIFAWUFAWYAAAABCQCUCgIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAXECBQFlBQFnCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBcAIFAWUFAWYFAmJjBQNuaWwFBHVuaXQFAmJiBQJiYgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFRAQxpbmNVbmNsYWltZWQEAWUBZwJiZAJiZQQCYU4JAQV2YWx1ZQEJAKIIAQkBAXkBBQFlBAFmCQEFdmFsdWUBCQCiCAEJAQFtAgUBZQUBZwQCYXgDCQAAAgkApQgBCAUBUQZjYWxsZXIFAmFOBgkBAUoBAhFwZXJtaXNzaW9uIGRlbmllZAMJAAACBQJheAUCYXgEAmJmAwkAAAIFAWUCBnd4bG9jawYJAQFKAQIPaW52YWxpZCBwcm9ncmFtAwkAAAIFAmJmBQJiZgQCYmcDCQEIY29udGFpbnMCCQELdmFsdWVPckVsc2UCCQCiCAEJAQF6AQUBZgIABQFlBgkBAUoBAhdyZWZlcnJlciBub3QgaW4gcHJvZ3JhbQMJAAACBQJiZwUCYmcEAmJoAwkBCGNvbnRhaW5zAgkBC3ZhbHVlT3JFbHNlAgkAoggBCQEBegEFAWcCAAUBZQYJAQFKAQIXcmVmZXJyYWwgbm90IGluIHByb2dyYW0DCQAAAgUCYmgFAmJoBAJiaQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBdAEFAWYAAAQCYUgJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAWsCBQFlBQFmAAAEAmJqCQELdmFsdWVPckVsc2UCCQCfCAEJAQF0AQUBZwAABAJiawkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBbAIFAWUFAWcAAAQCYUkJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAXYBBQFlAAAEAmJsCQBkAgUCYmkFAmJkBAJhSgkAZAIFAmFIBQJiZAQCYm0JAGQCBQJiagUCYmUEAmJuCQBkAgUCYmsFAmJlCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQF0AQUBZgUCYmwJAMwIAgkBDEludGVnZXJFbnRyeQIJAQF0AQUBZwUCYm0JAMwIAgkBDEludGVnZXJFbnRyeQIJAQFrAgUBZQUBZgUCYUoJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFsAgUBZQUBZwUCYm4JAMwIAgkBDEludGVnZXJFbnRyeQIJAQF2AQUBZQkAZAIJAGQCBQJhSQUCYmQFAmJlBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BUQEXaW5jVW5jbGFpbWVkV2l0aFBheW1lbnQCAWUCYUQEAmJmAwkAAAIFAWUCCXd4U3BvdEZlZQYJAQFKAQIPaW52YWxpZCBwcm9ncmFtAwkAAAIFAmJmBQJiZgQCYm8JAKUIAQgFAVEGY2FsbGVyBAJicAkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBQQEFAmJvAAAEAmJxCQBkAgkAZQIFAmJwBQZoZWlnaHQAAwQCYnIDCQBmAgkAZQIFBmhlaWdodAADBQJicAYJAQFKAQkAuQkCCQDMCAICBHdhaXQJAMwIAgkApAMBBQJicQkAzAgCAgZibG9ja3MFA25pbAIBIAMJAAACBQJicgUCYnIKAQJicwICYnQCYnUEAmJ2CQAAAgkA2AQBCQEFdmFsdWUBCAUCYnUHYXNzZXRJZAkBBXZhbHVlAQkAoggBCQEBdwEFAWUEAmJ3AwUCYnYGCQEBSgECEGludmFsaWQgYXNzZXQgaWQDCQAAAgUCYncFAmJ3CQDNCAIFAmJ0CAUCYnUGYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAJieAoAAmJ5CAUBUQhwYXltZW50cwoAAmJ6CQCQAwEFAmJ5CgACYkEFA25pbAoBAmJCAgJiQwJiRAMJAGcCBQJiRAUCYnoFAmJDCQECYnMCBQJiQwkAkQMCBQJieQUCYkQKAQJiRQICYkMCYkQDCQBnAgUCYkQFAmJ6BQJiQwkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQECYkUCCQECYkICCQECYkICCQECYkICCQECYkICCQECYkICCQECYkICCQECYkICCQECYkICCQECYkICCQECYkICBQJiQQAAAAEAAgADAAQABQAGAAcACAAJAAoEAmFFCgACYkYJAPwHBAUEdGhpcwIfaW5jVW5jbGFpbWVkV2l0aFBheW1lbnRJbnRlcm5hbAkAzAgCBQJieAkAzAgCBQFlCQDMCAIFAmFECQDMCAIAAAkAzAgCAAAFA25pbAUDbmlsAwkAAQIFAmJGAgNJbnQFAmJGCQACAQkArAICCQADAQUCYkYCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQJhRQUCYUUEAmFnCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBCQCiCAEJAQF4AQUBZQQCYWgJANkEAQkBBXZhbHVlAQkAoggBCQEBdwEFAWUJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCYWcFAmFFBQJhaAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAUEBBQJibwUGaGVpZ2h0BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BUQEFY2xhaW0BAWUEAVkDCQELdmFsdWVPckVsc2UCCQCgCAEJAQFuAQUBZQcGCQEBSgECFnByb2dyYW0gZG9lcyBub3QgZXhpc3QDCQAAAgUBWQUBWQQBWAkAAAIJAKUIAQgFAVEGY2FsbGVyCQEFdmFsdWUBCQCiCAEJAQF5AQUBZQQBaQMFAVgJAKUIAQgFAVEMb3JpZ2luQ2FsbGVyCQClCAEIBQFRBmNhbGxlcgQCYkcJAPwHBAUEdGhpcwINY2xhaW1JbnRlcm5hbAkAzAgCBQFlCQDMCAIFAWkJAMwIAgUBWAUDbmlsBQNuaWwDCQAAAgUCYkcFAmJHCQCUCgIFA25pbAUCYkcJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BUQEJY2xhaW1CdWxrAAQCYm8JAKUIAQgFAVEGY2FsbGVyBAJiSAkAoggBCQEBegEJAKUIAQgFAVEGY2FsbGVyBAJiSQMJAQlpc0RlZmluZWQBBQJiSAYJAQFKAQIUbm8gcmVmZXJyYWwgcHJvZ3JhbXMDCQAAAgUCYkkFAmJJBAJiSgkAtQkCCQEFdmFsdWUBBQJiSAICX18EAmJLCQD8BwQFBHRoaXMCEWNsYWltQnVsa0ludGVybmFsCQDMCAIFAmJvCQDMCAIFAmJKCQDMCAIAAAUDbmlsBQNuaWwDCQAAAgUCYksFAmJLCQCUCgIFA25pbAUCYksJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BUQENY2xhaW1SRUFET05MWQIBZQFFBAJhYQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBaAIFAWUFAUUAAAQCYWIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAWsCBQFlBQFFAAAJAJQKAgUDbmlsCQDMCAIFAmFiCQDMCAIFAmFhBQNuaWwBUQERY2xhaW1CdWxrUkVBRE9OTFkBAmF1BAJhaQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBcgEFAmF1AAAEAmFqCQELdmFsdWVPckVsc2UCCQCfCAEJAQF0AQUCYXUAAAkAlAoCBQNuaWwJAMwIAgUCYWoJAMwIAgUCYWkFA25pbAFRAQxzZXRUb3RhbEtleXMCAWUBcwQCYkwJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAWgCBQFlBQFzAAAEAmJNCQELdmFsdWVPckVsc2UCCQCfCAEJAQFqAgUBZQUBcwAABAJhQQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBawIFAWUFAXMAAAQCYk4JAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAWwCBQFlBQFzAAAEAmFpCQBkAgUCYkwFAmJNBAJhagkAZAIFAmFBBQJiTgkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBcgEFAXMFAmFpCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBdAEFAXMFAmFqBQNuaWwFBHVuaXQBUQEKc2V0TWFuYWdlcgECYk8EAmF4CQEBUAEFAVEDCQAAAgUCYXgFAmF4BAJiUAkA2QQBBQJiTwMJAAACBQJiUAUCYlAJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAUMABQJiTwUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAVEBDmNvbmZpcm1NYW5hZ2VyAAQCYlEJAQFPAAQCYlIDCQEJaXNEZWZpbmVkAQUCYlEGCQEBSgECEm5vIHBlbmRpbmcgbWFuYWdlcgMJAAACBQJiUgUCYlIEAmJTAwkAAAIIBQFRD2NhbGxlclB1YmxpY0tleQkBBXZhbHVlAQUCYlEGCQEBSgECG3lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQJiUwUCYlMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAUIACQDYBAEJAQV2YWx1ZQEFAmJRCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFDAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJiVAECYlUABAJiVgQBTQkBAUwAAwkAAQIFAU0CCkJ5dGVWZWN0b3IEAVMFAU0FAVMDCQABAgUBTQIEVW5pdAgFAmJUD3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJiVAlib2R5Qnl0ZXMJAJEDAggFAmJUBnByb29mcwAABQJiVpTNQYA=", "chainId": 84, "height": 2290524, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: F85abB5RAhaDewZHwtxKQE7YZRptbphgTcgBMJcqZbKX Next: EPiqXdrakwq5NydtB98s9ydE91rgp4i8zkvyUeRVvp8v 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/026f985 
74.01 ms