tx · 3xhLHtSSwxKaEY6jERqmZaQF4p1gJwzcCnFoG8Z5tSvd

3NAsFvuLwxz1iUtZ9fmhfmSN16r9NEsPqsh:  -0.01800000 Waves

2022.10.21 12:54 [2282017] smart account 3NAsFvuLwxz1iUtZ9fmhfmSN16r9NEsPqsh > SELF 0.00000000 Waves

{ "type": 13, "id": "3xhLHtSSwxKaEY6jERqmZaQF4p1gJwzcCnFoG8Z5tSvd", "fee": 1800000, "feeAssetId": null, "timestamp": 1666346054023, "version": 1, "sender": "3NAsFvuLwxz1iUtZ9fmhfmSN16r9NEsPqsh", "senderPublicKey": "33fpjdpM9FMu87RZKePniPardKqQXM96sm7VhAk3JEVQ", "proofs": [ "2ddGRLzT7VzAgx5sHhoXUrGpeZHGhboMmiZHt4KdrLcUzpooxxcLLhv7ZEZpfCLQ33GLz35Zv2gZq3qtXKyZJKZY" ], "script": "base64:BgKUFAgCEgUKAwgIBBIFCgMIGAESBwoFEQgYAQESBgoECAgICBIGCgQICAgCEgUKAwgIBBIGCgQICAEBEgQKAggYEgMKAQgSABIECgIICBIDCgEIEgQKAggIEgMKAQgSACIJc2VwYXJhdG9yIgxrZXlXeEFzc2V0SWQiE2tleUJhY2tlbmRQdWJsaWNLZXkiG2tleUV4aXN0c1JlZmVycmVyVG9SZWZlcnJhbCILcHJvZ3JhbU5hbWUiD3JlZmVycmVyQWRkcmVzcyIPcmVmZXJyYWxBZGRyZXNzIhJrZXlDbGFpbWVkUmVmZXJyZXIiDmNsYWltZXJBZGRyZXNzIhJrZXlDbGFpbWVkUmVmZXJyYWwiFGtleVVuY2xhaW1lZFJlZmVycmVyIhRrZXlVbmNsYWltZWRSZWZlcnJhbCILa2V5UmVmZXJyZXIiDmtleVByb2dyYW1OYW1lIhVrZXlUb3RhbFJlZmVycmFsQ291bnQiFmtleUFjdGl2ZVJlZmVycmFsQ291bnQiE2tleUlzUmVmZXJyYWxBY3RpdmUiFmtleUNsYWltZWRUb3RhbEFkZHJlc3MiB2FkZHJlc3MiGGtleVVuY2xhaW1lZFRvdGFsQWRkcmVzcyIPa2V5Q2xhaW1lZFRvdGFsIg9rZXlSZXdhcmRzVG90YWwiEGtleVJld2FyZEFzc2V0SWQiE2tleVRyZWFzdXJ5Q29udHJhY3QiGWtleUltcGxlbWVudGF0aW9uQ29udHJhY3QiFmtleUFsbFJlZmVycmFsUHJvZ3JhbXMiJ2tleUxhc3RJbmNVbmNsYWltZWRXaXRoUGF5bWVudENhbGxCbG9jayITa2V5TWFuYWdlclB1YmxpY0tleSIaa2V5UGVuZGluZ01hbmFnZXJQdWJsaWNLZXkiD2tleUNsYWltSGlzdG9yeSILdXNlckFkZHJlc3MiDXRyYW5zYWN0aW9uSWQiBHR5cGUiEmZvcm1hdENsYWltSGlzdG9yeSIGYW1vdW50Igh0aHJvd0VyciIDbXNnIhZtYW5hZ2VyUHVibGljS2V5T3JVbml0IgckbWF0Y2gwIgFzIh1wZW5kaW5nTWFuYWdlclB1YmxpY0tleU9yVW5pdCILbXVzdE1hbmFnZXIiAWkiAnBkIgJwayIZdXBkYXRlQWxsUmVmZXJyYWxQcm9ncmFtcyITYWxsUmVmZXJyYWxQcm9ncmFtcyIadXBkYXRlZEFsbFJlZmVycmFsUHJvZ3JhbXMiFm5ld0FsbFJlZmVycmFsUHJvZ3JhbXMiGGlzSW1wbGVtZW50YXRpb25Db250cmFjdCISY2hlY2tQcm9ncmFtRXhpc3RzIgskdDA0ODIxNTc1OCIOY2xhaW1lckNsYWltZWQiEGNsYWltZXJVbmNsYWltZWQiCmtleUNsYWltZWQiDGtleVVuY2xhaW1lZCIPY2xhaW1IaXN0b3J5S2V5IgxjbGFpbWVkVG90YWwiEHRyZWFzdXJ5Q29udHJhY3QiDXJld2FyZEFzc2V0SWQiE2NsYWltZWRUb3RhbEFkZHJlc3MiFXVuY2xhaW1lZFRvdGFsQWRkcmVzcyINY2hlY2tDYW5DbGFpbSIRbmV3Q2xhaW1lckNsYWltZWQiD25ld0NsYWltZWRUb3RhbCIWbmV3Q2xhaW1lZFRvdGFsQWRkcmVzcyIYbmV3VW5jbGFpbWVkVG90YWxBZGRyZXNzIg1iYWxhbmNlQmVmb3JlIgNyZXMiDGJhbGFuY2VBZnRlciILYmFsYW5jZURpZmYiDGNoZWNrQmFsYW5jZSIHY2xhaW1lciIMcHJvZ3JhbU5hbWVzIgtjdXJyZW50SXRlciILY2hlY2tDYWxsZXIiEHByb2dyYW1VbmNsYWltZWQiEWNsYWltQnVsa0ludGVybmFsIhF1bmNsYWltZWRSZWZlcnJlciIFY2xhaW0iDnBheW1lbnRBbW91bnRzIhFyZWZlcnJlckFkZHJlc3NlcyIJcmVzQW1vdW50Ig5hcmdzQ29tcGFyaXNvbiIFY2hlY2siEXJlZmVycmVyVW5jbGFpbWVkIgxyZXdhcmRzVG90YWwiFG5ld1JlZmVycmVyVW5jbGFpbWVkIgxuZXdSZXNBbW91bnQiA2ludiITYWxsUmVmZXJyZXJQcm9ncmFtcyIWbmV3QWxsUmVmZXJyZXJQcm9ncmFtcyIWaW1wbGVtZW50YXRpb25Db250cmFjdCIQY2hlY2tQcm9ncmFtTmFtZSIScHJvZ3JhbU5hbWVJc1ZhbGlkIhBjaGVja1Jld2FyZEFzc2V0IglzaWduYXR1cmUiIHBhaXJSZWZlcnJlclRvUmVmZXJyYWxFeGlzdENoZWNrIglub1JlZlNlbGYiBHBhaXIiEGJhY2tlbmRQdWJsaWNLZXkiEXZhbGlkYXRlU2lnbmF0dXJlIhJ0b3RhbFJlZmVycmFsQ291bnQiFW5ld1RvdGFsUmVmZXJyYWxDb3VudCIadXBkYXRlZEFsbFJlZmVycmVyUHJvZ3JhbXMiCGlzQWN0aXZlIhBpc1JlZmVycmFsQWN0aXZlIgZ1cGRhdGUiFm5ld0FjdGl2ZVJlZmVycmFsQ291bnQiDnJlZmVycmVyUmV3YXJkIg5yZWZlcnJhbFJld2FyZCIMY2hlY2tQcm9ncmFtIhZjaGVja1JlZmVycmVySW5Qcm9ncmFtIhZjaGVja1JlZmVycmFsSW5Qcm9ncmFtIhZ1bmNsYWltZWRUb3RhbFJlZmVycmVyIhZ1bmNsYWltZWRUb3RhbFJlZmVycmFsIhFyZWZlcnJhbFVuY2xhaW1lZCIZbmV3VW5jbGFpbWVkVG90YWxSZWZlcnJlciIZbmV3VW5jbGFpbWVkVG90YWxSZWZlcnJhbCIUbmV3UmVmZXJyYWxVbmNsYWltZWQiDWNhbGxlckFkZHJlc3MiCGxhc3RDYWxsIgp3YWl0QmxvY2tzIg1sYXN0Q2FsbENoZWNrIgNtYXAiBWFjY3VtIgRuZXh0Igxhc3NldElkQ2hlY2siC2Ftb3VudENoZWNrIghwYXltZW50cyICJGwiAiRzIgUkYWNjMCIFJGYwXzEiAiRhIgIkaSIFJGYwXzIiAUAiDWNsYWltSW50ZXJuYWwiEWNhbGxlclByb2dyYW1zU3RyIg5wcm9ncmFtc0V4aXN0cyIOY2FsbGVyUHJvZ3JhbXMiCWJ1bGtDbGFpbSIPY2xhaW1lZFJlZmVycmVyIg9jbGFpbWVkUmVmZXJyYWwiEXVuY2xhaW1lZFJlZmVycmFsIhdwZW5kaW5nTWFuYWdlclB1YmxpY0tleSIVY2hlY2tNYW5hZ2VyUHVibGljS2V5IgJwbSIFaGFzUE0iB2NoZWNrUE0iAnR4IgZ2ZXJpZnkiD3RhcmdldFB1YmxpY0tleR8AAWECAl9fAQFiAAkAuQkCCQDMCAICAiVzCQDMCAICCXd4QXNzZXRJZAUDbmlsBQFhAAFjCQC5CQIJAMwIAgICJXMJAMwIAgIQYmFja2VuZFB1YmxpY0tleQUDbmlsBQFhAQFkAwFlAWYBZwkAuQkCCQDMCAICCCVzJXMlcyVzCQDMCAICGGV4aXN0c1JlZmVycmVyVG9SZWZlcnJhbAkAzAgCBQFlCQDMCAIFAWYJAMwIAgUBZwUDbmlsBQFhAQFoAgFlAWkJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIPY2xhaW1lZFJlZmVycmVyCQDMCAIFAWUJAMwIAgUBaQUDbmlsBQFhAQFqAgFlAWkJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIPY2xhaW1lZFJlZmVycmFsCQDMCAIFAWUJAMwIAgUBaQUDbmlsBQFhAQFrAgFlAWkJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIRdW5jbGFpbWVkUmVmZXJyZXIJAMwIAgUBZQkAzAgCBQFpBQNuaWwFAWEBAWwCAWUBaQkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAhF1bmNsYWltZWRSZWZlcnJhbAkAzAgCBQFlCQDMCAIFAWkFA25pbAUBYQEBbQIBZQFnCQC5CQIJAMwIAgIGJXMlcyVzCQDMCAICCHJlZmVycmVyCQDMCAIFAWUJAMwIAgUBZwUDbmlsBQFhAQFuAQFlCQC5CQIJAMwIAgIEJXMlcwkAzAgCAgtwcm9ncmFtTmFtZQkAzAgCBQFlBQNuaWwFAWEBAW8CAWUBZgkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAhJ0b3RhbFJlZmVycmFsQ291bnQJAMwIAgUBZQkAzAgCBQFmBQNuaWwFAWEBAXACAWUBZgkAuQkCCQDMCAICBiVzJXMlcwkAzAgCAhNhY3RpdmVSZWZlcnJhbENvdW50CQDMCAIFAWUJAMwIAgUBZgUDbmlsBQFhAQFxAgFlAWcJALkJAgkAzAgCAgYlcyVzJXMJAMwIAgIOYWN0aXZlUmVmZXJyYWwJAMwIAgUBZQkAzAgCBQFnBQNuaWwFAWEBAXIBAXMJALkJAgkAzAgCAgQlcyVzCQDMCAICE2NsYWltZWRUb3RhbEFkZHJlc3MJAMwIAgUBcwUDbmlsBQFhAQF0AQFzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAhV1bmNsYWltZWRUb3RhbEFkZHJlc3MJAMwIAgUBcwUDbmlsBQFhAQF1AQFlCQC5CQIJAMwIAgIEJXMlcwkAzAgCAgxjbGFpbWVkVG90YWwJAMwIAgUBZQUDbmlsBQFhAQF2AQFlCQC5CQIJAMwIAgIEJXMlcwkAzAgCAgxyZXdhcmRzVG90YWwJAMwIAgUBZQUDbmlsBQFhAQF3AQFlCQC5CQIJAMwIAgIEJXMlcwkAzAgCAg1yZXdhcmRBc3NldElkCQDMCAIFAWUFA25pbAUBYQEBeAEBZQkAuQkCCQDMCAICBCVzJXMJAMwIAgIQdHJlYXN1cnlDb250cmFjdAkAzAgCBQFlBQNuaWwFAWEBAXkBAWUJALkJAgkAzAgCAgQlcyVzCQDMCAICFmltcGxlbWVudGF0aW9uQ29udHJhY3QJAMwIAgUBZQUDbmlsBQFhAQF6AQFzCQC5CQIJAMwIAgIEJXMlcwkAzAgCAhNhbGxSZWZlcnJhbFByb2dyYW1zCQDMCAIFAXMFA25pbAUBYQEBQQEBcwkAuQkCCQDMCAICBCVzJXMJAMwIAgIkbGFzdEluY1VuY2xhaW1lZFdpdGhQYXltZW50Q2FsbEJsb2NrCQDMCAIFAXMFA25pbAUBYQEBQgACFCVzX19tYW5hZ2VyUHVibGljS2V5AQFDAAIbJXNfX3BlbmRpbmdNYW5hZ2VyUHVibGljS2V5AQFEBAFlAUUBRgFHCQC5CQIJAMwIAgIKJXMlcyVzJXMlcwkAzAgCAgdoaXN0b3J5CQDMCAIFAUcJAMwIAgUBZQkAzAgCBQFFCQDMCAIFAUYFA25pbAUBYQEBSAEBSQkAuQkCCQDMCAICBiVkJWQlZAkAzAgCCQCkAwEIBQlsYXN0QmxvY2sGaGVpZ2h0CQDMCAIJAKQDAQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkApAMBBQFJBQNuaWwFAWEBAUoBAUsJAAIBCQC5CQIJAMwIAgIOcmVmZXJyYWwucmlkZToJAMwIAgUBSwUDbmlsAgEgAQFMAAQBTQkAoggBCQEBQgADCQABAgUBTQIGU3RyaW5nBAFOBQFNCQDZBAEFAU4DCQABAgUBTQIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQFPAAQBTQkAoggBCQEBQwADCQABAgUBTQIGU3RyaW5nBAFOBQFNCQDZBAEFAU4DCQABAgUBTQIEVW5pdAUEdW5pdAkAAgECC01hdGNoIGVycm9yAQFQAQFRBAFSCQEBSgECEXBlcm1pc3Npb24gZGVuaWVkBAFNCQEBTAADCQABAgUBTQIKQnl0ZVZlY3RvcgQBUwUBTQMJAAACCAUBUQ9jYWxsZXJQdWJsaWNLZXkFAVMGBQFSAwkAAQIFAU0CBFVuaXQDCQAAAggFAVEGY2FsbGVyBQR0aGlzBgUBUgkAAgECC01hdGNoIGVycm9yAQFUAgFzAWUEAVUJAQt2YWx1ZU9yRWxzZQIJAKIIAQkBAXoBBQFzAgAEAVYDCQEIY29udGFpbnMCBQFVBQFlBQNuaWwEAVcDCQAAAgUBVQIABQFlCQC5CQIJAMwIAgUBVQkAzAgCBQFlBQNuaWwFAWEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAXoBBQFzBQFXBQNuaWwFAVYPAVEBDWNsYWltSW50ZXJuYWwDAWUBaQFYBAFZAwkBC3ZhbHVlT3JFbHNlAgkAoAgBCQEBbgEFAWUHBgkBAUoBAhZwcm9ncmFtIGRvZXMgbm90IGV4aXN0AwkAAAIFAVkFAVkEAVoDBQFYCQCXCgUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAWoCBQFlBQFpAAAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAWwCBQFlBQFpAAAJAQFqAgUBZQUBaQkBAWwCBQFlBQFpCQEBRAQFAWUFAWkJANgEAQgFAVENdHJhbnNhY3Rpb25JZAINY2xhaW1SZWZlcnJhbAkAlwoFCQELdmFsdWVPckVsc2UCCQCfCAEJAQFoAgUBZQUBaQAACQELdmFsdWVPckVsc2UCCQCfCAEJAQFrAgUBZQUBaQAACQEBaAIFAWUFAWkJAQFrAgUBZQUBaQkBAUQEBQFlBQFpCQDYBAEIBQFRDXRyYW5zYWN0aW9uSWQCDWNsYWltUmVmZXJyZXIEAmFhCAUBWgJfMQQCYWIIBQFaAl8yBAJhYwgFAVoCXzMEAmFkCAUBWgJfNAQCYWUIBQFaAl81BAJhZgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBdQEFAWUAAAQCYWcJAQV2YWx1ZQEJAKYIAQkBBXZhbHVlAQkAoggBCQEBeAEFAWUEAmFoCQDZBAEJAQV2YWx1ZQEJAKIIAQkBAXcBBQFlBAJhaQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBcgEFAWkAAAQCYWoJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAXQBBQFpAAADAwUBWAkAAAIFAmFiAAAHCQCUCgIFA25pbAAABAJhawMJAGYCBQJhYgAABgkBAUoBAhBub3RoaW5nIHRvIGNsYWltAwkAAAIFAmFrBQJhawQCYWwJAGQCBQJhYQUCYWIEAmFtCQBkAgUCYWYFAmFiBAJhbgkAZAIFAmFpBQJhYgQCYW8JAGUCBQJhagUCYWIEAmFwCQEFdmFsdWUBCQDwBwIFBHRoaXMFAmFoAwkAAAIFAmFwBQJhcAQCYXEJAPwHBAUCYWcCFndpdGhkcmF3UmVmZXJyYWxSZXdhcmQJAMwIAgUCYWIFA25pbAUDbmlsAwkAAAIFAmFxBQJhcQQCYXIJAQV2YWx1ZQEJAPAHAgUEdGhpcwUCYWgDCQAAAgUCYXIFAmFyBAJhcwkAZQIFAmFyBQJhcAMJAAACBQJhcwUCYXMEAmF0AwkAAAIFAmFzBQJhYgYJAQFKAQIpaW5zdWZmaWNpZW50IGJhbGFuY2Ugb24gcmVmZXJyYWwgY29udHJhY3QDCQAAAgUCYXQFAmF0CQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIFAmFjBQJhbAkAzAgCCQEMSW50ZWdlckVudHJ5AgUCYWQAAAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAXUBBQFlBQJhbQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAXIBBQFpBQJhbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAXQBBQFpBQJhbwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQERQGV4dHJOYXRpdmUoMTA2MikBBQFpBQJhYgUCYWgJAMwIAgkBC1N0cmluZ0VudHJ5AgUCYWUJAQFIAQUCYWIFA25pbAUCYWIJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BUQERY2xhaW1CdWxrSW50ZXJuYWwDAmF1AmF2AmF3BAJheAMJAAACCAUBUQZjYWxsZXIFBHRoaXMGCQEBSgECEXBlcm1pc3Npb24gZGVuaWVkAwkAAAIFAmF4BQJheAMJAAACBQJhdwkAkAMBBQJhdgUDbmlsBAFlCQCRAwIFAmF2BQJhdwQCYXkJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAWsCBQFlBQJhdQAABAJhZQkBAUQEBQFlBQJhdQkA2AQBCAUBUQ10cmFuc2FjdGlvbklkAgljbGFpbUJ1bGsEAmF6CQD8BwQFBHRoaXMCEWNsYWltQnVsa0ludGVybmFsCQDMCAIFAmF1CQDMCAIFAmF2CQDMCAIJAGQCBQJhdwABBQNuaWwFA25pbAMJAAACBQJhegUCYXoEAmFBCQELdmFsdWVPckVsc2UCCQCfCAEJAQFrAgUBZQUCYXUAAAQCYUIDCQBmAgUCYUEAAAkA/AcEBQR0aGlzAg1jbGFpbUludGVybmFsCQDMCAIFAWUJAMwIAgUCYXUJAMwIAgcFA25pbAUDbmlsBQR1bml0AwkAAAIFAmFCBQJhQgkAlAoCBQNuaWwJAMwIAgUCYXoJAMwIAgUCYUIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFRAR9pbmNVbmNsYWltZWRXaXRoUGF5bWVudEludGVybmFsBQJhQwFlAmFEAmF3AmFFBAJheAMJAAACCAUBUQZjYWxsZXIFBHRoaXMGCQEBSgECEXBlcm1pc3Npb24gZGVuaWVkAwkAAAIFAmF4BQJheAQCYUYJAAACCQCQAwEFAmFDCQCQAwEFAmFEBAJhRwMFAmFGBgkBAUoBAh9saXN0cyBpbiBhcmdzIG11c3QgYmUgc2FtZSBzaXplAwkAAAIFAmFHBQJhRwMJAAACBQJhdwkAkAMBBQJhQwkAlAoCBQNuaWwFAmFFBAFmCQCRAwIFAmFEBQJhdwQCYWoJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAXQBBQFmAAAEAmFICQELdmFsdWVPckVsc2UCCQCfCAEJAQFrAgUBZQUBZgAABAJhSQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBdgEFAWUAAAQCYW8JAGQCBQJhagkAkQMCBQJhQwUCYXcEAmFKCQBkAgUCYUgJAJEDAgUCYUMFAmF3BAJhSwkAZAIFAmFFCQCRAwIFAmFDBQJhdwQCYUwJAPwHBAUEdGhpcwIfaW5jVW5jbGFpbWVkV2l0aFBheW1lbnRJbnRlcm5hbAkAzAgCBQJhQwkAzAgCBQFlCQDMCAIFAmFECQDMCAIJAGQCBQJhdwABCQDMCAIFAmFLBQNuaWwFA25pbAMJAAACBQJhTAUCYUwEAmFNCQELdmFsdWVPckVsc2UCCQCiCAEJAQF6AQUBZgIABAJhTgMJAAACBQJhTQIABQFlCQC5CQIJAMwIAgUCYU0JAMwIAgUBZQUDbmlsBQFhCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQF0AQUBZgUCYW8JAMwIAgkBDEludGVnZXJFbnRyeQIJAQFrAgUBZQUBZgUCYUoJAMwIAgkBDEludGVnZXJFbnRyeQIJAQF2AQUBZQkAZAIFAmFJCQCRAwIFAmFDBQJhdwkAzAgCCQELU3RyaW5nRW50cnkCCQEBegEFAWYFAmFOBQNuaWwFAmFMCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAVEBFWNyZWF0ZVJlZmVycmFsUHJvZ3JhbQQBZQJhZwJhTwJhaAQCYXgJAQFQAQUBUQMJAAACBQJheAUCYXgEAmFQAwkAAAIJAKAIAQkBAW4BBQFlBQR1bml0BgkBAUoBAhtwcm9ncmFtIG5hbWUgYWxyZWFkeSBleGlzdHMDCQAAAgUCYVAFAmFQBAJhUQMJAQEhAQkBCGNvbnRhaW5zAgUBZQUBYQkBASEBCQEIY29udGFpbnMCBQFlAgEgBwQBWQMFAmFRBgkBAUoBAhRpbnZhbGlkIHByb2dyYW0gbmFtZQMJAAACBQFZBQFZBAJhUgMJAQIhPQIJAOwHAQkA2QQBBQJhaAUEdW5pdAYJAQFKAQIXaW52YWxpZCByZXdhcmQgYXNzZXQgaWQDCQAAAgUCYVIFAmFSCQCUCgIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQFuAQUBZQYJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAXgBBQFlBQJhZwkAzAgCCQELU3RyaW5nRW50cnkCCQEBeQEFAWUFAmFPCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQF3AQUBZQUCYWgJAMwIAgkBDEludGVnZXJFbnRyeQIJAQF2AQUBZQAABQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BUQEKY3JlYXRlUGFpcgQBZQFmAWcCYVMEAVkDCQELdmFsdWVPckVsc2UCCQCgCAEJAQFuAQUBZQcGCQEBSgECFnByb2dyYW0gZG9lcyBub3QgZXhpc3QDCQAAAgUBWQUBWQQCYVQDCQAAAgkAoAgBCQEBZAMFAWUFAWYFAWcFBHVuaXQGCQEBSgECE3BhaXIgYWxyZWFkeSBleGlzdHMDCQAAAgUCYVQFAmFUBAJhVQMJAQIhPQIFAWYFAWcGCQEBSgECFGNhbm5vdCByZWZlciB0byBzZWxmAwkAAAIFAmFVBQJhVQQCYVYJAJsDAQkAuQkCCQDMCAIFAWUJAMwIAgUBZgkAzAgCBQFnBQNuaWwCAToEAmFXCQDZBAEJAQV2YWx1ZQEJAKIIAQUBYwQCYVgDCQD0AwMFAmFWBQJhUwUCYVcGCQEBSgECDWJhZCBzaWduYXR1cmUDCQAAAgUCYVgFAmFYBAJhWQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBbwIFAWUFAWYAAAQCYVoJAGQCBQJhWQABBAJiYQkBAVQCBQFmBQFlBAFWCQEBVAIFAWcFAWUJAJQKAgkAzggCCQDOCAIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQFkAwUBZQUBZgUBZwYJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFvAgUBZQUBZgUCYVoJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAW0CBQFlBQFnBQFmBQNuaWwFAmJhBQFWBQR1bml0CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAVEBFnVwZGF0ZVJlZmVycmFsQWN0aXZpdHkDAWUBZwJiYgQCYU8JAQV2YWx1ZQEJAKIIAQkBAXkBBQFlBAJiYwkBAiE9AgkAoAgBCQEBcQIFAWUFAWcFBHVuaXQEAWYJAQV2YWx1ZQEJAKIIAQkBAW0CBQFlBQFnBAJheAMJAAACCQClCAEIBQFRBmNhbGxlcgUCYU8GCQEBSgECEXBlcm1pc3Npb24gZGVuaWVkAwkAAAIFAmF4BQJheAQCYmQDCQAAAgUCYmMFAmJiCQCUCgIFA25pbAUEdW5pdAQCYmQDCQAAAgUCYmIGBAJiZQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAXACBQFlBQFmAAAAAQkAlAoCCQDMCAIJAQxCb29sZWFuRW50cnkCCQEBcQIFAWUFAWcGCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBcAIFAWUFAWYFAmJlBQNuaWwFBHVuaXQEAmJlCQBlAgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBcAIFAWUFAWYAAAABCQCUCgIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAXECBQFlBQFnCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBcAIFAWUFAWYFAmJlBQNuaWwFBHVuaXQFAmJkBQJiZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFRAQxpbmNVbmNsYWltZWQEAWUBZwJiZgJiZwQCYU8JAQV2YWx1ZQEJAKIIAQkBAXkBBQFlBAFmCQEFdmFsdWUBCQCiCAEJAQFtAgUBZQUBZwQCYXgDCQAAAgkApQgBCAUBUQZjYWxsZXIFAmFPBgkBAUoBAhFwZXJtaXNzaW9uIGRlbmllZAMJAAACBQJheAUCYXgEAmJoAwkAAAIFAWUCBnd4bG9jawYJAQFKAQIPaW52YWxpZCBwcm9ncmFtAwkAAAIFAmJoBQJiaAQCYmkDCQEIY29udGFpbnMCCQELdmFsdWVPckVsc2UCCQCiCAEJAQF6AQUBZgIABQFlBgkBAUoBAhdyZWZlcnJlciBub3QgaW4gcHJvZ3JhbQMJAAACBQJiaQUCYmkEAmJqAwkBCGNvbnRhaW5zAgkBC3ZhbHVlT3JFbHNlAgkAoggBCQEBegEFAWcCAAUBZQYJAQFKAQIXcmVmZXJyYWwgbm90IGluIHByb2dyYW0DCQAAAgUCYmoFAmJqBAJiawkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBdAEFAWYAAAQCYUgJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAWsCBQFlBQFmAAAEAmJsCQELdmFsdWVPckVsc2UCCQCfCAEJAQF0AQUBZwAABAJibQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBbAIFAWUFAWcAAAQCYUkJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAXYBBQFlAAAEAmJuCQBkAgUCYmsFAmJmBAJhSgkAZAIFAmFIBQJiZgQCYm8JAGQCBQJibAUCYmcEAmJwCQBkAgUCYm0FAmJnCQCUCgIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQF0AQUBZgUCYm4JAMwIAgkBDEludGVnZXJFbnRyeQIJAQF0AQUBZwUCYm8JAMwIAgkBDEludGVnZXJFbnRyeQIJAQFrAgUBZQUBZgUCYUoJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFsAgUBZQUBZwUCYnAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQF2AQUBZQkAZAIJAGQCBQJhSQUCYmYFAmJnBQNuaWwFBHVuaXQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BUQEXaW5jVW5jbGFpbWVkV2l0aFBheW1lbnQCAWUCYUQEAmJoAwkAAAIFAWUCCXd4U3BvdEZlZQYJAQFKAQIPaW52YWxpZCBwcm9ncmFtAwkAAAIFAmJoBQJiaAQCYnEJAKUIAQgFAVEGY2FsbGVyBAJicgkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBQQEFAmJxAAAEAmJzCQBkAgkAZQIFAmJyBQZoZWlnaHQAAwQCYnQDCQBmAgkAZQIFBmhlaWdodAADBQJicgYJAQFKAQkAuQkCCQDMCAICBHdhaXQJAMwIAgkApAMBBQJicwkAzAgCAgZibG9ja3MFA25pbAIBIAMJAAACBQJidAUCYnQKAQJidQICYnYCYncEAmJ4CQAAAgkA2AQBCQEFdmFsdWUBCAUCYncHYXNzZXRJZAkBBXZhbHVlAQkAoggBCQEBdwEFAWUEAmJ5AwUCYngGCQEBSgECEGludmFsaWQgYXNzZXQgaWQDCQAAAgUCYnkFAmJ5CQDNCAIFAmJ2CAUCYncGYW1vdW50CQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBAJiegoAAmJBCAUBUQhwYXltZW50cwoAAmJCCQCQAwEFAmJBCgACYkMFA25pbAoBAmJEAgJiRQJiRgMJAGcCBQJiRgUCYkIFAmJFCQECYnUCBQJiRQkAkQMCBQJiQQUCYkYKAQJiRwICYkUCYkYDCQBnAgUCYkYFAmJCBQJiRQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQECYkcCCQECYkQCCQECYkQCCQECYkQCCQECYkQCCQECYkQCCQECYkQCCQECYkQCCQECYkQCCQECYkQCCQECYkQCBQJiQwAAAAEAAgADAAQABQAGAAcACAAJAAoEAmFFCgACYkgJAPwHBAUEdGhpcwIfaW5jVW5jbGFpbWVkV2l0aFBheW1lbnRJbnRlcm5hbAkAzAgCBQJiegkAzAgCBQFlCQDMCAIFAmFECQDMCAIAAAkAzAgCAAAFA25pbAUDbmlsAwkAAQIFAmJIAgNJbnQFAmJICQACAQkArAICCQADAQUCYkgCGCBjb3VsZG4ndCBiZSBjYXN0IHRvIEludAMJAAACBQJhRQUCYUUEAmFnCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBCQCiCAEJAQF4AQUBZQQCYWgJANkEAQkBBXZhbHVlAQkAoggBCQEBdwEFAWUJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCYWcFAmFFBQJhaAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAUEBBQJicQUGaGVpZ2h0BQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BUQEFY2xhaW0BAWUEAVkDCQELdmFsdWVPckVsc2UCCQCgCAEJAQFuAQUBZQcGCQEBSgECFnByb2dyYW0gZG9lcyBub3QgZXhpc3QDCQAAAgUBWQUBWQQBWAkAAAIJAKUIAQgFAVEGY2FsbGVyCQEFdmFsdWUBCQCiCAEJAQF5AQUBZQQBaQMFAVgJAKUIAQgFAVEMb3JpZ2luQ2FsbGVyCQClCAEIBQFRBmNhbGxlcgQCYkkJAPwHBAUEdGhpcwINY2xhaW1JbnRlcm5hbAkAzAgCBQFlCQDMCAIFAWkJAMwIAgUBWAUDbmlsBQNuaWwDCQAAAgUCYkkFAmJJCQCUCgIFA25pbAUCYkkJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BUQEJY2xhaW1CdWxrAAQCYnEJAKUIAQgFAVEGY2FsbGVyBAJiSgkAoggBCQEBegEJAKUIAQgFAVEGY2FsbGVyBAJiSwMJAQlpc0RlZmluZWQBBQJiSgYJAQFKAQIUbm8gcmVmZXJyYWwgcHJvZ3JhbXMDCQAAAgUCYksFAmJLBAJiTAkAtQkCCQEFdmFsdWUBBQJiSgICX18EAmJNCQD8BwQFBHRoaXMCEWNsYWltQnVsa0ludGVybmFsCQDMCAIFAmJxCQDMCAIFAmJMCQDMCAIAAAUDbmlsBQNuaWwDCQAAAgUCYk0FAmJNCQCUCgIFA25pbAUCYk0JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BUQENY2xhaW1SRUFET05MWQIBZQFFBAJhYQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBaAIFAWUFAUUAAAQCYWIJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAWsCBQFlBQFFAAAJAJQKAgUDbmlsCQDMCAIFAmFiCQDMCAIFAmFhBQNuaWwBUQERY2xhaW1CdWxrUkVBRE9OTFkBAmF1BAJhaQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBcgEFAmF1AAAEAmFqCQELdmFsdWVPckVsc2UCCQCfCAEJAQF0AQUCYXUAAAkAlAoCBQNuaWwJAMwIAgUCYWoJAMwIAgUCYWkFA25pbAFRAQxzZXRUb3RhbEtleXMCAWUBcwQCYk4JAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAWgCBQFlBQFzAAAEAmJPCQELdmFsdWVPckVsc2UCCQCfCAEJAQFqAgUBZQUBcwAABAJhQQkBC3ZhbHVlT3JFbHNlAgkAnwgBCQEBawIFAWUFAXMAAAQCYlAJAQt2YWx1ZU9yRWxzZQIJAJ8IAQkBAWwCBQFlBQFzAAAEAmFpCQBkAgUCYk4FAmJPBAJhagkAZAIFAmFBBQJiUAkAlAoCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBcgEFAXMFAmFpCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBdAEFAXMFAmFqBQNuaWwFBHVuaXQBUQEKc2V0TWFuYWdlcgECYlEEAmF4CQEBUAEFAVEDCQAAAgUCYXgFAmF4BAJiUgkA2QQBBQJiUQMJAAACBQJiUgUCYlIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAUMABQJiUQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAVEBDmNvbmZpcm1NYW5hZ2VyAAQCYlMJAQFPAAQCYlQDCQEJaXNEZWZpbmVkAQUCYlMGCQEBSgECEm5vIHBlbmRpbmcgbWFuYWdlcgMJAAACBQJiVAUCYlQEAmJVAwkAAAIIBQFRD2NhbGxlclB1YmxpY0tleQkBBXZhbHVlAQUCYlMGCQEBSgECG3lvdSBhcmUgbm90IHBlbmRpbmcgbWFuYWdlcgMJAAACBQJiVQUCYlUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAUIACQDYBAEJAQV2YWx1ZQEFAmJTCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFDAAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJiVgECYlcABAJiWAQBTQkBAUwAAwkAAQIFAU0CCkJ5dGVWZWN0b3IEAVMFAU0FAVMDCQABAgUBTQIEVW5pdAgFAmJWD3NlbmRlclB1YmxpY0tleQkAAgECC01hdGNoIGVycm9yCQD0AwMIBQJiVglib2R5Qnl0ZXMJAJEDAggFAmJWBnByb29mcwAABQJiWOIavek=", "chainId": 84, "height": 2282017, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HfEA2mXTse1i1tZii92uE8WbZ9CpmDgcXJDDKsha4S6W Next: FVGFexPdz6tRJnWb5YCRvfP7Y9Fnhw1fzA5DhEQq8deA 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 allReferrerPrograms = valueOrElse(getString(keyAllReferralPrograms(referrerAddress)), "")
259+ let newAllReferrerPrograms = if ((allReferrerPrograms == ""))
260+ then programName
261+ else makeString([allReferrerPrograms, programName], separator)
262+ $Tuple2([IntegerEntry(keyUnclaimedTotalAddress(referrerAddress), newUnclaimedTotalAddress), IntegerEntry(keyUnclaimedReferrer(programName, referrerAddress), newReferrerUnclaimed), IntegerEntry(keyRewardsTotal(programName), (rewardsTotal + paymentAmounts[currentIter])), StringEntry(keyAllReferralPrograms(referrerAddress), newAllReferrerPrograms)], inv)
263+ }
264+ else throw("Strict value is not equal to itself.")
265+ }
266+ else throw("Strict value is not equal to itself.")
267+ }
268+ else throw("Strict value is not equal to itself.")
269+ }
270+
103271
104272
105273 @Callable(i)
162330 then {
163331 let totalReferralCount = valueOrElse(getInteger(keyTotalReferralCount(programName, referrerAddress)), 0)
164332 let newTotalReferralCount = (totalReferralCount + 1)
165- $Tuple2([BooleanEntry(keyExistsReferrerToReferral(programName, referrerAddress, referralAddress), true), IntegerEntry(keyTotalReferralCount(programName, referrerAddress), newTotalReferralCount), StringEntry(keyReferrer(programName, referralAddress), referrerAddress)], unit)
333+ let updatedAllReferrerPrograms = updateAllReferralPrograms(referrerAddress, programName)
334+ let updatedAllReferralPrograms = updateAllReferralPrograms(referralAddress, programName)
335+ $Tuple2((([BooleanEntry(keyExistsReferrerToReferral(programName, referrerAddress, referralAddress), true), IntegerEntry(keyTotalReferralCount(programName, referrerAddress), newTotalReferralCount), StringEntry(keyReferrer(programName, referralAddress), referrerAddress)] ++ updatedAllReferrerPrograms) ++ updatedAllReferralPrograms), unit)
166336 }
167337 else throw("Strict value is not equal to itself.")
168338 }
209379 @Callable(i)
210380 func incUnclaimed (programName,referralAddress,referrerReward,referralReward) = {
211381 let implementationContract = value(getString(keyImplementationContract(programName)))
382+ let referrerAddress = value(getString(keyReferrer(programName, referralAddress)))
212383 let checkCaller = if ((toString(i.caller) == implementationContract))
213384 then true
214385 else throwErr("permission denied")
215386 if ((checkCaller == checkCaller))
216387 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)
388+ let checkProgram = if ((programName == "wxlock"))
389+ then true
390+ else throwErr("invalid program")
391+ if ((checkProgram == checkProgram))
392+ then {
393+ let checkReferrerInProgram = if (contains(valueOrElse(getString(keyAllReferralPrograms(referrerAddress)), ""), programName))
394+ then true
395+ else throwErr("referrer not in program")
396+ if ((checkReferrerInProgram == checkReferrerInProgram))
397+ then {
398+ let checkReferralInProgram = if (contains(valueOrElse(getString(keyAllReferralPrograms(referralAddress)), ""), programName))
399+ then true
400+ else throwErr("referral not in program")
401+ if ((checkReferralInProgram == checkReferralInProgram))
402+ then {
403+ let unclaimedTotalReferrer = valueOrElse(getInteger(keyUnclaimedTotalAddress(referrerAddress)), 0)
404+ let referrerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, referrerAddress)), 0)
405+ let unclaimedTotalReferral = valueOrElse(getInteger(keyUnclaimedTotalAddress(referralAddress)), 0)
406+ let referralUnclaimed = valueOrElse(getInteger(keyUnclaimedReferral(programName, referralAddress)), 0)
407+ let rewardsTotal = valueOrElse(getInteger(keyRewardsTotal(programName)), 0)
408+ let newUnclaimedTotalReferrer = (unclaimedTotalReferrer + referrerReward)
409+ let newReferrerUnclaimed = (referrerUnclaimed + referrerReward)
410+ let newUnclaimedTotalReferral = (unclaimedTotalReferral + referralReward)
411+ let newReferralUnclaimed = (referralUnclaimed + referralReward)
412+ $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)
413+ }
414+ else throw("Strict value is not equal to itself.")
415+ }
416+ else throw("Strict value is not equal to itself.")
417+ }
418+ else throw("Strict value is not equal to itself.")
419+ }
420+ else throw("Strict value is not equal to itself.")
421+ }
422+
423+
424+
425+@Callable(i)
426+func incUnclaimedWithPayment (programName,referrerAddresses) = {
427+ let checkProgram = if ((programName == "wxSpotFee"))
428+ then true
429+ else throwErr("invalid program")
430+ if ((checkProgram == checkProgram))
431+ then {
432+ let callerAddress = toString(i.caller)
433+ let lastCall = valueOrElse(getInteger(keyLastIncUnclaimedWithPaymentCallBlock(callerAddress)), 0)
434+ let waitBlocks = ((lastCall - height) + 3)
435+ let lastCallCheck = if (((height - 3) > lastCall))
436+ then true
437+ else throwErr(makeString(["wait", toString(waitBlocks), "blocks"], " "))
438+ if ((lastCallCheck == lastCallCheck))
439+ then {
440+ func map (accum,next) = {
441+ let assetIdCheck = (toBase58String(value(next.assetId)) == value(getString(keyRewardAssetId(programName))))
442+ let amountCheck = if (assetIdCheck)
443+ then true
444+ else throwErr("invalid asset id")
445+ if ((amountCheck == amountCheck))
446+ then (accum :+ next.amount)
447+ else throw("Strict value is not equal to itself.")
448+ }
449+
450+ let payments = {
451+ let $l = i.payments
452+ let $s = size($l)
453+ let $acc0 = nil
454+ func $f0_1 ($a,$i) = if (($i >= $s))
455+ then $a
456+ else map($a, $l[$i])
457+
458+ func $f0_2 ($a,$i) = if (($i >= $s))
459+ then $a
460+ else throw("List size exceeds 10")
461+
462+ $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)
463+ }
464+ let resAmount = {
465+ let @ = invoke(this, "incUnclaimedWithPaymentInternal", [payments, programName, referrerAddresses, 0, 0], nil)
466+ if ($isInstanceOf(@, "Int"))
467+ then @
468+ else throw(($getType(@) + " couldn't be cast to Int"))
469+ }
470+ if ((resAmount == resAmount))
471+ then {
472+ let treasuryContract = addressFromStringValue(value(getString(keyTreasuryContract(programName))))
473+ let rewardAssetId = fromBase58String(value(getString(keyRewardAssetId(programName))))
474+[ScriptTransfer(treasuryContract, resAmount, rewardAssetId), IntegerEntry(keyLastIncUnclaimedWithPaymentCallBlock(callerAddress), height)]
475+ }
476+ else throw("Strict value is not equal to itself.")
477+ }
478+ else throw("Strict value is not equal to itself.")
224479 }
225480 else throw("Strict value is not equal to itself.")
226481 }
235490 if ((checkProgramExists == checkProgramExists))
236491 then {
237492 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- }
493+ let claimerAddress = if (isImplementationContract)
494+ then toString(i.originCaller)
495+ else toString(i.caller)
496+ let claimInternal = invoke(this, "claimInternal", [programName, claimerAddress, isImplementationContract], nil)
497+ if ((claimInternal == claimInternal))
498+ then $Tuple2(nil, claimInternal)
499+ else throw("Strict value is not equal to itself.")
500+ }
501+ else throw("Strict value is not equal to itself.")
502+ }
503+
504+
505+
506+@Callable(i)
507+func claimBulk () = {
508+ let callerAddress = toString(i.caller)
509+ let callerProgramsStr = getString(keyAllReferralPrograms(toString(i.caller)))
510+ let programsExists = if (isDefined(callerProgramsStr))
511+ then true
512+ else throwErr("no referral programs")
513+ if ((programsExists == programsExists))
514+ then {
515+ let callerPrograms = split(value(callerProgramsStr), "__")
516+ let bulkClaim = invoke(this, "claimBulkInternal", [callerAddress, callerPrograms, 0], nil)
517+ if ((bulkClaim == bulkClaim))
518+ then $Tuple2(nil, bulkClaim)
519+ else throw("Strict value is not equal to itself.")
297520 }
298521 else throw("Strict value is not equal to itself.")
299522 }
305528 let claimerClaimed = valueOrElse(getInteger(keyClaimedReferrer(programName, userAddress)), 0)
306529 let claimerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, userAddress)), 0)
307530 $Tuple2(nil, [claimerUnclaimed, claimerClaimed])
531+ }
532+
533+
534+
535+@Callable(i)
536+func claimBulkREADONLY (claimer) = {
537+ let claimedTotalAddress = valueOrElse(getInteger(keyClaimedTotalAddress(claimer)), 0)
538+ let unclaimedTotalAddress = valueOrElse(getInteger(keyUnclaimedTotalAddress(claimer)), 0)
539+ $Tuple2(nil, [unclaimedTotalAddress, claimedTotalAddress])
540+ }
541+
542+
543+
544+@Callable(i)
545+func setTotalKeys (programName,address) = {
546+ let claimedReferrer = valueOrElse(getInteger(keyClaimedReferrer(programName, address)), 0)
547+ let claimedReferral = valueOrElse(getInteger(keyClaimedReferral(programName, address)), 0)
548+ let unclaimedReferrer = valueOrElse(getInteger(keyUnclaimedReferrer(programName, address)), 0)
549+ let unclaimedReferral = valueOrElse(getInteger(keyUnclaimedReferral(programName, address)), 0)
550+ let claimedTotalAddress = (claimedReferrer + claimedReferral)
551+ let unclaimedTotalAddress = (unclaimedReferrer + unclaimedReferral)
552+ $Tuple2([IntegerEntry(keyClaimedTotalAddress(address), claimedTotalAddress), IntegerEntry(keyUnclaimedTotalAddress(address), unclaimedTotalAddress)], unit)
308553 }
309554
310555
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 allReferrerPrograms = valueOrElse(getString(keyAllReferralPrograms(referrerAddress)), "")
259+ let newAllReferrerPrograms = if ((allReferrerPrograms == ""))
260+ then programName
261+ else makeString([allReferrerPrograms, programName], separator)
262+ $Tuple2([IntegerEntry(keyUnclaimedTotalAddress(referrerAddress), newUnclaimedTotalAddress), IntegerEntry(keyUnclaimedReferrer(programName, referrerAddress), newReferrerUnclaimed), IntegerEntry(keyRewardsTotal(programName), (rewardsTotal + paymentAmounts[currentIter])), StringEntry(keyAllReferralPrograms(referrerAddress), newAllReferrerPrograms)], inv)
263+ }
264+ else throw("Strict value is not equal to itself.")
265+ }
266+ else throw("Strict value is not equal to itself.")
267+ }
268+ else throw("Strict value is not equal to itself.")
269+ }
270+
103271
104272
105273 @Callable(i)
106274 func createReferralProgram (programName,treasuryContract,implementationContract,rewardAssetId) = {
107275 let checkCaller = mustManager(i)
108276 if ((checkCaller == checkCaller))
109277 then {
110278 let checkProgramName = if ((getBoolean(keyProgramName(programName)) == unit))
111279 then true
112280 else throwErr("program name already exists")
113281 if ((checkProgramName == checkProgramName))
114282 then {
115283 let programNameIsValid = if (!(contains(programName, separator)))
116284 then !(contains(programName, " "))
117285 else false
118286 let checkProgramExists = if (programNameIsValid)
119287 then true
120288 else throwErr("invalid program name")
121289 if ((checkProgramExists == checkProgramExists))
122290 then {
123291 let checkRewardAsset = if ((assetInfo(fromBase58String(rewardAssetId)) != unit))
124292 then true
125293 else throwErr("invalid reward asset id")
126294 if ((checkRewardAsset == checkRewardAsset))
127295 then $Tuple2([BooleanEntry(keyProgramName(programName), true), StringEntry(keyTreasuryContract(programName), treasuryContract), StringEntry(keyImplementationContract(programName), implementationContract), StringEntry(keyRewardAssetId(programName), rewardAssetId), IntegerEntry(keyRewardsTotal(programName), 0)], unit)
128296 else throw("Strict value is not equal to itself.")
129297 }
130298 else throw("Strict value is not equal to itself.")
131299 }
132300 else throw("Strict value is not equal to itself.")
133301 }
134302 else throw("Strict value is not equal to itself.")
135303 }
136304
137305
138306
139307 @Callable(i)
140308 func createPair (programName,referrerAddress,referralAddress,signature) = {
141309 let checkProgramExists = if (valueOrElse(getBoolean(keyProgramName(programName)), false))
142310 then true
143311 else throwErr("program does not exist")
144312 if ((checkProgramExists == checkProgramExists))
145313 then {
146314 let pairReferrerToReferralExistCheck = if ((getBoolean(keyExistsReferrerToReferral(programName, referrerAddress, referralAddress)) == unit))
147315 then true
148316 else throwErr("pair already exists")
149317 if ((pairReferrerToReferralExistCheck == pairReferrerToReferralExistCheck))
150318 then {
151319 let noRefSelf = if ((referrerAddress != referralAddress))
152320 then true
153321 else throwErr("cannot refer to self")
154322 if ((noRefSelf == noRefSelf))
155323 then {
156324 let pair = toBytes(makeString([programName, referrerAddress, referralAddress], ":"))
157325 let backendPublicKey = fromBase58String(value(getString(keyBackendPublicKey)))
158326 let validateSignature = if (sigVerify(pair, signature, backendPublicKey))
159327 then true
160328 else throwErr("bad signature")
161329 if ((validateSignature == validateSignature))
162330 then {
163331 let totalReferralCount = valueOrElse(getInteger(keyTotalReferralCount(programName, referrerAddress)), 0)
164332 let newTotalReferralCount = (totalReferralCount + 1)
165- $Tuple2([BooleanEntry(keyExistsReferrerToReferral(programName, referrerAddress, referralAddress), true), IntegerEntry(keyTotalReferralCount(programName, referrerAddress), newTotalReferralCount), StringEntry(keyReferrer(programName, referralAddress), referrerAddress)], unit)
333+ let updatedAllReferrerPrograms = updateAllReferralPrograms(referrerAddress, programName)
334+ let updatedAllReferralPrograms = updateAllReferralPrograms(referralAddress, programName)
335+ $Tuple2((([BooleanEntry(keyExistsReferrerToReferral(programName, referrerAddress, referralAddress), true), IntegerEntry(keyTotalReferralCount(programName, referrerAddress), newTotalReferralCount), StringEntry(keyReferrer(programName, referralAddress), referrerAddress)] ++ updatedAllReferrerPrograms) ++ updatedAllReferralPrograms), unit)
166336 }
167337 else throw("Strict value is not equal to itself.")
168338 }
169339 else throw("Strict value is not equal to itself.")
170340 }
171341 else throw("Strict value is not equal to itself.")
172342 }
173343 else throw("Strict value is not equal to itself.")
174344 }
175345
176346
177347
178348 @Callable(i)
179349 func updateReferralActivity (programName,referralAddress,isActive) = {
180350 let implementationContract = value(getString(keyImplementationContract(programName)))
181351 let isReferralActive = (getBoolean(keyIsReferralActive(programName, referralAddress)) != unit)
182352 let referrerAddress = value(getString(keyReferrer(programName, referralAddress)))
183353 let checkCaller = if ((toString(i.caller) == implementationContract))
184354 then true
185355 else throwErr("permission denied")
186356 if ((checkCaller == checkCaller))
187357 then {
188358 let update = if ((isReferralActive == isActive))
189359 then $Tuple2(nil, unit)
190360 else {
191361 let update = if ((isActive == true))
192362 then {
193363 let newActiveReferralCount = (valueOrElse(getInteger(keyActiveReferralCount(programName, referrerAddress)), 0) + 1)
194364 $Tuple2([BooleanEntry(keyIsReferralActive(programName, referralAddress), true), IntegerEntry(keyActiveReferralCount(programName, referrerAddress), newActiveReferralCount)], unit)
195365 }
196366 else {
197367 let newActiveReferralCount = (valueOrElse(getInteger(keyActiveReferralCount(programName, referrerAddress)), 0) - 1)
198368 $Tuple2([DeleteEntry(keyIsReferralActive(programName, referralAddress)), IntegerEntry(keyActiveReferralCount(programName, referrerAddress), newActiveReferralCount)], unit)
199369 }
200370 update
201371 }
202372 update
203373 }
204374 else throw("Strict value is not equal to itself.")
205375 }
206376
207377
208378
209379 @Callable(i)
210380 func incUnclaimed (programName,referralAddress,referrerReward,referralReward) = {
211381 let implementationContract = value(getString(keyImplementationContract(programName)))
382+ let referrerAddress = value(getString(keyReferrer(programName, referralAddress)))
212383 let checkCaller = if ((toString(i.caller) == implementationContract))
213384 then true
214385 else throwErr("permission denied")
215386 if ((checkCaller == checkCaller))
216387 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)
388+ let checkProgram = if ((programName == "wxlock"))
389+ then true
390+ else throwErr("invalid program")
391+ if ((checkProgram == checkProgram))
392+ then {
393+ let checkReferrerInProgram = if (contains(valueOrElse(getString(keyAllReferralPrograms(referrerAddress)), ""), programName))
394+ then true
395+ else throwErr("referrer not in program")
396+ if ((checkReferrerInProgram == checkReferrerInProgram))
397+ then {
398+ let checkReferralInProgram = if (contains(valueOrElse(getString(keyAllReferralPrograms(referralAddress)), ""), programName))
399+ then true
400+ else throwErr("referral not in program")
401+ if ((checkReferralInProgram == checkReferralInProgram))
402+ then {
403+ let unclaimedTotalReferrer = valueOrElse(getInteger(keyUnclaimedTotalAddress(referrerAddress)), 0)
404+ let referrerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, referrerAddress)), 0)
405+ let unclaimedTotalReferral = valueOrElse(getInteger(keyUnclaimedTotalAddress(referralAddress)), 0)
406+ let referralUnclaimed = valueOrElse(getInteger(keyUnclaimedReferral(programName, referralAddress)), 0)
407+ let rewardsTotal = valueOrElse(getInteger(keyRewardsTotal(programName)), 0)
408+ let newUnclaimedTotalReferrer = (unclaimedTotalReferrer + referrerReward)
409+ let newReferrerUnclaimed = (referrerUnclaimed + referrerReward)
410+ let newUnclaimedTotalReferral = (unclaimedTotalReferral + referralReward)
411+ let newReferralUnclaimed = (referralUnclaimed + referralReward)
412+ $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)
413+ }
414+ else throw("Strict value is not equal to itself.")
415+ }
416+ else throw("Strict value is not equal to itself.")
417+ }
418+ else throw("Strict value is not equal to itself.")
419+ }
420+ else throw("Strict value is not equal to itself.")
421+ }
422+
423+
424+
425+@Callable(i)
426+func incUnclaimedWithPayment (programName,referrerAddresses) = {
427+ let checkProgram = if ((programName == "wxSpotFee"))
428+ then true
429+ else throwErr("invalid program")
430+ if ((checkProgram == checkProgram))
431+ then {
432+ let callerAddress = toString(i.caller)
433+ let lastCall = valueOrElse(getInteger(keyLastIncUnclaimedWithPaymentCallBlock(callerAddress)), 0)
434+ let waitBlocks = ((lastCall - height) + 3)
435+ let lastCallCheck = if (((height - 3) > lastCall))
436+ then true
437+ else throwErr(makeString(["wait", toString(waitBlocks), "blocks"], " "))
438+ if ((lastCallCheck == lastCallCheck))
439+ then {
440+ func map (accum,next) = {
441+ let assetIdCheck = (toBase58String(value(next.assetId)) == value(getString(keyRewardAssetId(programName))))
442+ let amountCheck = if (assetIdCheck)
443+ then true
444+ else throwErr("invalid asset id")
445+ if ((amountCheck == amountCheck))
446+ then (accum :+ next.amount)
447+ else throw("Strict value is not equal to itself.")
448+ }
449+
450+ let payments = {
451+ let $l = i.payments
452+ let $s = size($l)
453+ let $acc0 = nil
454+ func $f0_1 ($a,$i) = if (($i >= $s))
455+ then $a
456+ else map($a, $l[$i])
457+
458+ func $f0_2 ($a,$i) = if (($i >= $s))
459+ then $a
460+ else throw("List size exceeds 10")
461+
462+ $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)
463+ }
464+ let resAmount = {
465+ let @ = invoke(this, "incUnclaimedWithPaymentInternal", [payments, programName, referrerAddresses, 0, 0], nil)
466+ if ($isInstanceOf(@, "Int"))
467+ then @
468+ else throw(($getType(@) + " couldn't be cast to Int"))
469+ }
470+ if ((resAmount == resAmount))
471+ then {
472+ let treasuryContract = addressFromStringValue(value(getString(keyTreasuryContract(programName))))
473+ let rewardAssetId = fromBase58String(value(getString(keyRewardAssetId(programName))))
474+[ScriptTransfer(treasuryContract, resAmount, rewardAssetId), IntegerEntry(keyLastIncUnclaimedWithPaymentCallBlock(callerAddress), height)]
475+ }
476+ else throw("Strict value is not equal to itself.")
477+ }
478+ else throw("Strict value is not equal to itself.")
224479 }
225480 else throw("Strict value is not equal to itself.")
226481 }
227482
228483
229484
230485 @Callable(i)
231486 func claim (programName) = {
232487 let checkProgramExists = if (valueOrElse(getBoolean(keyProgramName(programName)), false))
233488 then true
234489 else throwErr("program does not exist")
235490 if ((checkProgramExists == checkProgramExists))
236491 then {
237492 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- }
493+ let claimerAddress = if (isImplementationContract)
494+ then toString(i.originCaller)
495+ else toString(i.caller)
496+ let claimInternal = invoke(this, "claimInternal", [programName, claimerAddress, isImplementationContract], nil)
497+ if ((claimInternal == claimInternal))
498+ then $Tuple2(nil, claimInternal)
499+ else throw("Strict value is not equal to itself.")
500+ }
501+ else throw("Strict value is not equal to itself.")
502+ }
503+
504+
505+
506+@Callable(i)
507+func claimBulk () = {
508+ let callerAddress = toString(i.caller)
509+ let callerProgramsStr = getString(keyAllReferralPrograms(toString(i.caller)))
510+ let programsExists = if (isDefined(callerProgramsStr))
511+ then true
512+ else throwErr("no referral programs")
513+ if ((programsExists == programsExists))
514+ then {
515+ let callerPrograms = split(value(callerProgramsStr), "__")
516+ let bulkClaim = invoke(this, "claimBulkInternal", [callerAddress, callerPrograms, 0], nil)
517+ if ((bulkClaim == bulkClaim))
518+ then $Tuple2(nil, bulkClaim)
519+ else throw("Strict value is not equal to itself.")
297520 }
298521 else throw("Strict value is not equal to itself.")
299522 }
300523
301524
302525
303526 @Callable(i)
304527 func claimREADONLY (programName,userAddress) = {
305528 let claimerClaimed = valueOrElse(getInteger(keyClaimedReferrer(programName, userAddress)), 0)
306529 let claimerUnclaimed = valueOrElse(getInteger(keyUnclaimedReferrer(programName, userAddress)), 0)
307530 $Tuple2(nil, [claimerUnclaimed, claimerClaimed])
531+ }
532+
533+
534+
535+@Callable(i)
536+func claimBulkREADONLY (claimer) = {
537+ let claimedTotalAddress = valueOrElse(getInteger(keyClaimedTotalAddress(claimer)), 0)
538+ let unclaimedTotalAddress = valueOrElse(getInteger(keyUnclaimedTotalAddress(claimer)), 0)
539+ $Tuple2(nil, [unclaimedTotalAddress, claimedTotalAddress])
540+ }
541+
542+
543+
544+@Callable(i)
545+func setTotalKeys (programName,address) = {
546+ let claimedReferrer = valueOrElse(getInteger(keyClaimedReferrer(programName, address)), 0)
547+ let claimedReferral = valueOrElse(getInteger(keyClaimedReferral(programName, address)), 0)
548+ let unclaimedReferrer = valueOrElse(getInteger(keyUnclaimedReferrer(programName, address)), 0)
549+ let unclaimedReferral = valueOrElse(getInteger(keyUnclaimedReferral(programName, address)), 0)
550+ let claimedTotalAddress = (claimedReferrer + claimedReferral)
551+ let unclaimedTotalAddress = (unclaimedReferrer + unclaimedReferral)
552+ $Tuple2([IntegerEntry(keyClaimedTotalAddress(address), claimedTotalAddress), IntegerEntry(keyUnclaimedTotalAddress(address), unclaimedTotalAddress)], unit)
308553 }
309554
310555
311556
312557 @Callable(i)
313558 func setManager (pendingManagerPublicKey) = {
314559 let checkCaller = mustManager(i)
315560 if ((checkCaller == checkCaller))
316561 then {
317562 let checkManagerPublicKey = fromBase58String(pendingManagerPublicKey)
318563 if ((checkManagerPublicKey == checkManagerPublicKey))
319564 then [StringEntry(keyPendingManagerPublicKey(), pendingManagerPublicKey)]
320565 else throw("Strict value is not equal to itself.")
321566 }
322567 else throw("Strict value is not equal to itself.")
323568 }
324569
325570
326571
327572 @Callable(i)
328573 func confirmManager () = {
329574 let pm = pendingManagerPublicKeyOrUnit()
330575 let hasPM = if (isDefined(pm))
331576 then true
332577 else throwErr("no pending manager")
333578 if ((hasPM == hasPM))
334579 then {
335580 let checkPM = if ((i.callerPublicKey == value(pm)))
336581 then true
337582 else throwErr("you are not pending manager")
338583 if ((checkPM == checkPM))
339584 then [StringEntry(keyManagerPublicKey(), toBase58String(value(pm))), DeleteEntry(keyPendingManagerPublicKey())]
340585 else throw("Strict value is not equal to itself.")
341586 }
342587 else throw("Strict value is not equal to itself.")
343588 }
344589
345590
346591 @Verifier(tx)
347592 func verify () = {
348593 let targetPublicKey = match managerPublicKeyOrUnit() {
349594 case pk: ByteVector =>
350595 pk
351596 case _: Unit =>
352597 tx.senderPublicKey
353598 case _ =>
354599 throw("Match error")
355600 }
356601 sigVerify(tx.bodyBytes, tx.proofs[0], targetPublicKey)
357602 }
358603

github/deemru/w8io/169f3d6 
59.05 ms