tx · GzP3FRBH1wX2XX1TD842w1CDB7VqxWN5LWgp7d3yVv2M

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.01900000 Waves

2023.03.24 06:36 [2503555] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "GzP3FRBH1wX2XX1TD842w1CDB7VqxWN5LWgp7d3yVv2M", "fee": 1900000, "feeAssetId": null, "timestamp": 1679629029463, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "21XjzyKgEShuK5QwrXSotcxKbcy6mqgj92ykxWDngkspoBUkUVJmHJZpxE7skkcLU3mUmyAUu9S4W3tiCHavZdGY" ], "script": "base64:BgL+FAgCEgQKAggIEhAKDggICAgICAgICAgICAEIEg8KDQgICAgICAgICAgIAQgSBgoECAgICBIECgIICBIICgYIAQEIAQgSBAoCCAgSBAoCCAgSBwoFCAgICAgSBgoECAgICCIOZ2V0U3RyaW5nQnlLZXkiA2tleSIIdW5pdFRlc3QiCW9yYWNsZUZlZSIIc2lnbkRhcHAiC2ZlZVJlY2VpdmVyIgh1c2VyRGFwcCINd2hpdGVsaXN0RGFwcCILc2lnbkFzc2V0SWQiC3VzZG5Bc3NldElkIgt1c2R0QXNzZXRJZCIMd2F2ZXNBc3NldElkIgVjaHJpcyIZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZSIPZ2V0SW50ZWdlckJ5S2V5Ig5jaGVja1doaXRlbGlzdCIPZ2V0Qm9vbGVhbkJ5S2V5IgdzaWduQ3V0Igt1c2RuV2F2ZUN1dCIOZGVmYXVsdExpY2VuY2UiEmRlZmF1bHRIYXNoTGljZW5jZSILZGFwcFJ1bm5pbmciDm1haW50ZW5hbmNlTVNHIg11c2VyU3VzcGVuZGVkIgt1c2VyUmVtb3ZlZCIQdXNlclVucmVnaXN0ZXJlZCILdXNlckFsbG93ZWQiGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UiFGNoZWNrU2lnbkNlcnRpZmljYXRlIgZzaWduSUQiBU93bmVyIgpzaGEyNTZIYXNoIgckbWF0Y2gwIgFhIgt2YWxpZGF0ZUNJRCIDY2lkIgx2YWxpZGF0ZUhhc2giBGhhc2giDWtleVVzZXJTdGF0dXMiBmNhbGxlciIHa2V5RGF0ZSIFYXJ0SWQiB2tleU5hbWUiB2tleURlc2MiDWtleURpc3BsYXlDaWQiDWtleUV4cG9ydEhhc2giDGtleUV4cG9ydENpZCIKa2V5TWF4TWludCIJa2V5U2lnbklEIglrZXlJc3N1ZWQiCWtleU9uU2FsZSIOa2V5TGljZW5jZUhhc2giDWtleUxpY2VuY2VDaWQiB2tleVRhZ3MiB2tleVR5cGUiB2tleU5vdGUiCmtleUNyYXdsZXIiDGtleVJveWFsdGllcyIIa2V5UHJpY2UiCmtleUVuZFNhbGUiEmtleUFzc2V0SWRBY2NlcHRlZCIHa2V5RmxhZyISa2V5QXJ0aXN0QWdlbnRBZGRyIgphcnRpc3RBZGRyIhRrZXlQcmltYXJ5U2hhcmVBZ2VudCIYa2V5QXJ0aXN0UHVibGljQWdlbnRBZGRyIhprZXlQcmltYXJ5U2hhcmVQdWJsaWNBZ2VudCIRa2V5SGFzaEJ5VHhpZEFkZHIiBHR4aWQiDmtleU93bmVyQnlIYXNoIg1rZXlpZEJ5U2lnbmlkIgZzaWduSWQiEmtleVR4aWRCeUhhc2hPd25lciIOdmFsaWRhdGVBbGxDSUQiCmNpZERpc3BsYXkiCWNpZEV4cG9ydCIKY2lkTGljZW5jZSIPdmFsaWRhdGVBbGxIYXNoIgxzaGEyNTZFeHBvcnQiDXNoYTI1NkxpY2VuY2UiDnZhbGlkYXRlU3RyaW5nIgNzdHIiA21heCIMdmFsaWRhdGVVc2VyIgp1c2VyU3RhdHVzIgpzZXRMSWNlbmNlIhN2YWxpZGF0ZUFydHdvcmtEYXRhIgpsaWNlbmNlQ0lEIgtsaWNlbmNlSGFzaCIEbmFtZSILZGVzY3JpcHRpb24iBHRhZ3MiCXJveWFsdGllcyIJY2hlY2tVc2VyIglpc1BheW1lbnQiAWkiB3BheW1lbnQiBmFtb3VudCIPdmFsaWRhdGVQYXltZW50IgskdDA5MTgwOTIxNiIHYXNzZXRJZCILaXNBcnRNaW50ZWQiCWFkZHJUb1VzZSIBYiIUdmFsaWRhdGVQcmljZUFzc2V0SWQiDHByaWNlQXNzZXRJZCIMYXJ0d29ya1ByaWNlIgskdDA5ODA0OTg0MCIQYWNjZXB0ZWRBc3NldElkcyIPdmFsaWRhdGVNaW5TZWxsIgVwcmljZSIMbWluU2VsbFdhdmVzIgttaW5TZWxsVXNkbiILbWluU2VsbFNpZ24iDWdldEJpZEFzc2V0SWQiFmdldFByaWNlQXNzZXRJZEZyb21CaWQiCmJpZERhdGFLZXkiB2JpZERhdGEiCmJpZERhdGFBcnIiCWJpZEFtb3VudCIKYmlkQXNzZXRJZCIVaWRDYWxsZXJEYXRlU3BvbnNvcmVkIgZwdWJLZXkiC2lzU3BvbnNvcmVkIhNnZXRfc3BvbnNvcmVkX3dhdmVzIgxpZENhbGxlckRhdGUiB2J1eU1pbnQiBmlzc3VlciIFYmlkSWQiCGJpZE93bmVyIg0kdDAxMzA0NzEzMTM5IgRkYXRlIgJpZCIFaXNCaWQiCGJsb2NrRW5kIg5jYWxsZXJJc0lzc3VlciIIdG90YWxORlQiC2FydHdvcmtOYW1lIghpc09uU2FsZSIKYW1vdW50U29sZCIKbWF4Q2FuU2VsbCINJHQwMTQ3NDIxNDkzNCIFYWdlbnQiCmFnZW50U2hhcmUiC3B1YmxpY0FnZW50IhBwdWJsaWNBZ2VudFNoYXJlIg1pc1doaXRlbGlzdGVkIgNjdXQiDWFtb3VudEZvclNpZ24iDmFtb3VudEZvckFnZW50IhRhbW91bnRGb3JQdWJsaWNBZ2VudCIQYW1vdW50Rm9yQ3JlYXRvciINbmV3QW1vdW50U29sZCIJaXNzdWVNZXRhIghpc3N1ZU5GVCIFaWRORlQiCnNlbGxTdGF0dXMiCnJlY2VpdmVORlQiCmFzc2V0SWRCaWQiCWJpZERlbE9sZCIJYmlkVXBkYXRlIgdzb2xkS2V5Iglzb2xkVmFsdWUiCHNvbGREYXRhIhRjb21taXNzaW9uc1dpdGhBZ2VudCIaY29tbWlzc2lvbnNXaXRoUHVibGljQWdlbnQiCnR4VG9DYWxsZXIiBmJ1eVJlcyIIYXNTdHJpbmciAmJ2IgNidjAiBmludm9rZSIDdmFsIgR0eXBlIgdjcmF3bGVyIg0kdDAyMDExMDIwMTgzIg0kdDAyMDI4NDIwMzUzIg92YWxpZGF0ZUFydHdvcmsiEHdoaXRlbGlzdGVkX2Ryb3AiDSR0MDIwNjUyMjA3MzYiCmVudHJ5RXhpc3QiCWhhc2hFeGlzdCIPaXNTaWduQ2VydGlmaWVkIhdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcCINJHQwMjM3NzAyMzg0MCINJHQwMjM4NTAyMzkxOSIEZmxhZyIEYWRkciIEbm90ZSINJHQwMjU1NDYyNTU4MCINJHQwMjYwMTYyNjA1MCIMZGF0YVRvRGVsZXRlIgdtYXhNaW50Ig0kdDAyODg4NjI4OTU2IgZiaWROYnIiCmJhc2VIZWlnaHQiDSR0MDMxMzM4MzEzNzgiDSR0MDMxMzgzMzE0MTkiDSR0MDMyNjM5MzI3MTAiB2NhbGxlcjEiDSR0MDMyOTQ1MzMwMDYiDXJldHVybk1vbmV5VG8iCWJpZFN0YXR1cyICdHgiCHZlcmlmaWVyIgNpbnZOAQFhAQFiCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFAWICAAABYwcAAWQJAQV2YWx1ZQEJAKYIAQkBAWEBAg9jb25mX29yYWNsZV9mZWUAAWUJAQV2YWx1ZQEJAKYIAQkBAWEBAhFjb25mX3NpZ253ZWJfZGFwcAABZgkBAWEBAhFjb25mX2ZlZV9yZWNlaXZlcgABZwMFAWMJAQV2YWx1ZQEJAKYIAQIjM010NFJHTUV5alNXWUFvY1RQcWQ1NXdkSFFRQjNQVTJVQ20JAQV2YWx1ZQEJAKYIAQkBAWEBAg9jb25mX3VzZXJzX2RhcHAAAWgJAQV2YWx1ZQEJAKYIAQkBAWEBAhNjb25mX3doaXRlbGlzdF9kYXBwAAFpCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9TSUdOAAFqCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9VU0ROAAFrCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9VU0RUAAFsAQAAAW0JAQFhAQIMY29uZl9hZG1pbl8xAQFuAQFiCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUBZAUBYgIfSW50ZWdlciB1bmRlZmluZSBvciAwIGluIG9yYWNsZQEBbwEBYgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFiAAABAXABAWIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUBaAUBYgAAAQFxAQFiCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFAWIHAAFyAAcAAXMACgABdAkBAWEBAhRjb25mX2RlZmF1bHRfbGljZW5jZQABdQkBAWEBAhljb25mX2RlZmF1bHRfbGljZW5jZV9oYXNoAAF2CQELdmFsdWVPckVsc2UCCQCbCAIFAWcCFGNvbmZfZGFwcF9pc19ydW5uaW5nBgABdwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQFnAhRjb25mX21haW50ZW5hbmNlX21zZwIAAAF4AglTVVNQRU5ERUQAAXkCB1JFTU9WRUQAAXoCDFVOUkVHSVNURVJFRAABQQIHQUxMT1dFRAABQgkBAW4BCQCsAgICEmNlcnRpZmljYXRpb25fZmVlXwkA2AQBBQFpAQFDAwFEAUUBRgQBRwkAnQgCBQFlCQCsAgIJAKwCAgkArAICAghkYXRhX2ZjXwUBRAIBXwUBRQMJAAECBQFHAgZTdHJpbmcEAUgFAUcDCQEIY29udGFpbnMCBQFIBQFGBgcHAQFJAQFKAwkBCGNvbnRhaW5zAgUBSgIBLwMDCQBmAgBMCQCxAgEFAUoJAAACCQCxAgEJAJEDAgkAtQkCBQFKAgEvAAAAOwcJAGYCABAJALECAQkAkQMCCQC1CQIFAUoCAS8AAQcHAQFLAQFMCQAAAgkAsQIBBQFMAEABAU0BAU4JAKwCAgIMdXNlcl9zdGF0dXNfBQFOAQFPAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF9kYXRlXwUBUAIBXwUBTgEBUQIBTgFQCQCsAgIJAKwCAgkArAICAglhcnRfbmFtZV8FAVACAV8FAU4BAVICAU4BUAkArAICCQCsAgIJAKwCAgIJYXJ0X2Rlc2NfBQFQAgFfBQFOAQFTAgFOAVAJAKwCAgkArAICCQCsAgICEGFydF9kaXNwbGF5X2NpZF8FAVACAV8FAU4BAVQCAU4BUAkArAICCQCsAgIJAKwCAgIQYXJ0X2V4cG9ydF9oYXNoXwUBUAIBXwUBTgEBVQIBTgFQCQCsAgIJAKwCAgkArAICAg9hcnRfZXhwb3J0X2NpZF8FAVACAV8FAU4BAVYCAU4BUAkArAICCQCsAgIJAKwCAgIMYXJ0X21heG1pbnRfBQFQAgFfBQFOAQFXAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9zaWduaWRfBQFQAgFfBQFOAQFYAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9pc3N1ZWRfBQFQAgFfBQFOAQFZAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9vbnNhbGVfBQFQAgFfBQFOAQFaAgFOAVAJAKwCAgkArAICCQCsAgICEWFydF9saWNlbmNlX2hhc2hfBQFQAgFfBQFOAQJhYQIBTgFQCQCsAgIJAKwCAgkArAICAhBhcnRfbGljZW5jZV9jaWRfBQFQAgFfBQFOAQJhYgIBTgFQCQCsAgIJAKwCAgkArAICAglhcnRfdGFnc18FAVACAV8FAU4BAmFjAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF90eXBlXwUBUAIBXwUBTgECYWQCAU4BUAkArAICCQCsAgIJAKwCAgIJYXJ0X25vdGVfBQFQAgFfBQFOAQJhZQIBTgFQCQCsAgIJAKwCAgkArAICAhBhcnRfY3Jhd2xlcl9jaWRfBQFQAgFfBQFOAQJhZgIBTgFQCQCsAgIJAKwCAgkArAICAg5hcnRfcm95YWx0aWVzXwUBUAIBXwUBTgECYWcCAU4BUAkArAICCQCsAgIJAKwCAgIKYXJ0X3ByaWNlXwUBUAIBXwUBTgECYWgCAU4BUAkArAICCQCsAgIJAKwCAgIMYXJ0X2VuZHNhbGVfBQFQAgFfBQFOAQJhaQIBTgFQCQCsAgIJAKwCAgkArAICAhJhcnRfYXNzZXRBY2NlcHRlZF8FAVACAV8FAU4BAmFqAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF9mbGFnXwUBUAIBXwUBTgECYWsBAmFsCQCsAgICDWFydGlzdF9hZ2VudF8FAmFsAQJhbQECYWwJAKwCAgIVYXJ0aXN0X2FnZW50X3ByaW1hcnlfBQJhbAECYW4BAmFsCQCsAgICFGFydGlzdF9wdWJsaWNfYWdlbnRfBQJhbAECYW8BAmFsCQCsAgICHGFydGlzdF9wdWJsaWNfYWdlbnRfcHJpbWFyeV8FAmFsAQJhcAIBTgJhcQkArAICCQCsAgIJAKwCAgITZ2V0X2hhc2hieXR4aWRhZGRyXwUCYXECAV8FAU4BAmFyAQFGCQCsAgICEmdldF9vd25lcl9ieV9oYXNoXwUBRgECYXMCAU4CYXQJAKwCAgkArAICCQCsAgICEmdldF9hcnRpZGJ5c2lnbmlkXwUCYXQCAV8FAU4BAmF1AgFGAU4JAKwCAgIXZ2V0X3R4aWRfYnlfaGFzaF9vd25lcl8JANgEAQkA1BYBCQCbAwEJAKwCAgUBRgUBTgECYXYDAmF3AmF4AmF5AwkBASEBCQEBSQEFAmF3CQACAQIRV3JvbmcgRGlzcGxheSBDSUQDCQEBIQEJAQFJAQUCYXgJAAIBAhBXcm9uZyBFeHBvcnQgQ0lEAwMJAQIhPQIFAmF5AgAJAQEhAQkBAUkBBQJheQcJAAIBAhFXcm9uZyBMaWNlbmNlIENJRAYBAmF6AgJhQQJhQgMJAQEhAQkBAUsBBQJhQQkAAgECGEV4cG9ydCBIYXNoIDY0IGNoYXIuIG1heAMJAQEhAQkBAUsBBQJhQgkAAgECGUxpY2VuY2UgSGFzaCA2NCBjaGFyLiBtYXgGAQJhQwICYUQCYUUDCQAAAgkAsQIBBQJhRAAACQACAQIYRmllbGQgY2Fubm90IGJlIGlzIGVtcHR5AwkAZgIJALECAQUCYUQFAmFFCQACAQkArAICBQJhRAIMIGlzIHRvbyBsb25nBgECYUYBAU4EAmFHCQELdmFsdWVPckVsc2UCCQCdCAIFAWcJAQFNAQUBTgUBegMDCQAAAgUCYUcFAXoGCQAAAgUCYUcFAUECLlJlZ2lzdGVyIHRoaXMgYWNjb3VudCBmaXJzdCB3aXRoICJBY2NvdW50IiB0YWIDCQAAAgUCYUcFAXgCEUFjY291bnQgc3VzcGVuZGVkAwkAAAIFAmFHBQF5Ag9BY2NvdW50IHJlbW92ZWQCAAECYUgCAmF5AmFCBAFKAwkAAAIJALECAQUCYXkAAAUBdAUCYXkEAUwDCQAAAgkAsQIBBQJhQgAABQF1BQJhQgkAlAoCBQFKBQFMAQJhSQoBTgJhdwJheAJhSgJhQQJhSwJhTAJhTQJhTgJhTwQCYVAJAQJhRgEFAU4DCQECIT0CBQJhUAIACQACAQUCYVADCQAAAgkAsQIBBQJhdwAACQACAQIbRGlzcGxheSBDSUQgY2Fubm90IGJlIGVtcHR5AwkBASEBCQECYXYDBQJhdwUCYXgFAmFKCQACAQIQUHJvYmxlbSB3aXRoIENJRAMJAQEhAQkBAmF6AgUCYUEFAmFLCQACAQITUHJvYmxlbSB3aXRoIEhhc2hlcwMJAQEhAQkBAmFDAgUCYUwAZAkAAgECEjEwMCBDaGFyLiBtYXggbmFtZQMJAQEhAQkBAmFDAgUCYU0A6AcJAAIBAhoxMDAwIENoYXIuIG1heCBkZXNjcmlwdGlvbgMDCQBmAgAABQJhTwYJAGYCBQJhTwDoBwkAAgECM1JveWFsdGllcyBjYW5ub3QgYmUgbGVzcyB0aGFuIDAlIG9yIGhpZ2hlciB0aGFuIDEwJQMJAGYCCQCQAwEJALUJAgUCYU4CASwABQkAAgECCzUgdGFncyBtYXguAgABAmFRAQJhUgMJAAACCQCQAwEIBQJhUghwYXltZW50cwAACQACAQITTm8gcGF5bWVudCBhdHRhY2hlZAQCYVMJAQV2YWx1ZQEJAJEDAggFAmFSCHBheW1lbnRzAAAEAmFUCQEFdmFsdWUBCAUCYVMGYW1vdW50CQCUCgIFAmFTBQJhVAECYVUBAmFSBAJhVgkBAmFRAQUCYVIEAmFTCAUCYVYCXzEEAmFUCAUCYVYCXzIEAmFXAwMJAQlpc0RlZmluZWQBCAUCYVMHYXNzZXRJZAkAAAIIBQJhUwdhc3NldElkBQFpBwgFAmFTB2Fzc2V0SWQJAAIBAitPbmx5IFNJR04gdG9rZW4gYWNjZXB0ZWQgYXMgdHJhbnNhY3Rpb24gZmVlAwkBAiE9AgUCYVQFAUIJAAIBCQCsAgICGVBheW1lbnQgYW1vdW50IHNob3VsZCBiZSAJAKQDAQUBQgkAlAoCBQJhVAUCYVcBAmFYAgJhWQFQBAFHCQCaCAIFBHRoaXMJAQFYAgUCYVkFAVADCQABAgUBRwIDSW50BAJhWgUBRwMJAQIhPQIFAmFaAAAGBwcBAmJhAwJhUgJiYgJiYwQCYmQJAQJhUQEFAmFSBAJhUwgFAmJkAl8xBAJhVAgFAmJkAl8yBAJhVwMJAQEhAQkBCWlzRGVmaW5lZAEIBQJhUwdhc3NldElkBQR1bml0AwMJAGYCCQCxAgEFAmJiAAAJAAACCQDYBAEJAQV2YWx1ZQEIBQJhUwdhc3NldElkBQJiYgcIBQJhUwdhc3NldElkCQACAQIOV3JvbmcgYXNzZXQgaWQDAwkAAAIFAmFXBQR1bml0CQECIT0CBQJiYgIABwkAAgECDldyb25nIGFzc2V0IGlkAwkBAiE9AgUCYmMFAmFUCQACAQITUGF5bWVudCBkb24ndCBtYXRjaAkAlAoCBQJhVAUCYVcBAmJlAQJhVwMDAwMDCQECIT0CBQJhVwkA2AQBBQFpCQECIT0CBQJhVwkA2AQBBQFsBwkBAiE9AgUCYVcCBVdBVkVTBwkBAiE9AgUCYVcJANgEAQUBagcJAQIhPQIFAmFXCQDYBAEFAWsHCQACAQImT25seSBTSUdOLCBVU0ROLFVTRFQgb3IgV0FWRVMgYWNjZXB0ZWQGAQJiZgICYVcCYmcEAmJoAwUBYwAKCQEBbgECDndhdmVzX21pbl9zZWxsBAJiaQDAhD0EAmJqAwUBYwABCQBoAgUBQgACAwMDAwMDCQAAAgUCYVcJANgEAQUBagkAZgIFAmJpBQJiZwcJAQIhPQIFAmJnAAAHBgMDCQAAAgUCYVcJANgEAQUBawkAZgIFAmJpBQJiZwcJAQIhPQIFAmJnAAAHBgMDCQAAAgUCYVcJANgEAQUBaQkAZgIFAmJqBQJiZwcJAQIhPQIFAmJnAAAHBgMDAwkAAAIFAmFXCQDYBAEFAWwGCQAAAgUCYVcCBVdBVkVTCQBmAgUCYmgFAmJnBwkBAiE9AgUCYmcAAAcJAAIBAhhXcm9uZyBtaW5pbXVtIHNlbGwgcHJpY2UGAQJiawECYVcDCQAAAgUCYVcCBVdBVkVTBQR1bml0CQDZBAEFAmFXAQJibAECYm0EAmJuCQEBYQEJAKwCAgUCYm0CBV9PUEVOAwkAAAIFAmJuAgAJAAIBAg1CaWQgbm90IGZvdW5kBAJibwkAtQkCBQJibgIBXwQCYnAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJibwABBAJicQkBAmJrAQkAkQMCBQJibwAAAwkAZwIAAAUCYnAJAAIBAgxXcm9uZyBhbW91bnQJAJQKAgUCYnAFAmJxAQJicgICYVICYnMDCQEBIQEFAXYJAAIBBQF3BAJidAMJAQIhPQIFAmJzAgAJAQt2YWx1ZU9yRWxzZQIJAQFwAQkArAICCQClCAEJAKcIAQkA2QQBBQJicwIJX2ZyZWVfdHhzAAAAAAQBTgMDCQAAAgkA2AQBCAgFAmFSBmNhbGxlcgVieXRlcwkApQgBBQR0aGlzCQBmAgUCYnQAAAcJAKUIAQkApwgBCQDZBAEFAmJzCQDYBAEICAUCYVIGY2FsbGVyBWJ5dGVzAwkAAAIFAU4FAU4EAmJ1AwMJAQIhPQIFAmJzAgAJAGYCBQJidAAABwkA/AcEBQFoAgl1c2VGcmVlVHgJAMwIAgkApQgBCQCnCAEJANkEAQUCYnMFA25pbAUDbmlsBQR1bml0AwkAAAIFAmJ1BQJidQkAlgoECQDYBAEIBQJhUg10cmFuc2FjdGlvbklkBQFOCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAZgIFAmJ0AAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmJ2AQJhUgMJAQEhAQUBdgkAAgEFAXcJAJUKAwkA2AQBCAUCYVINdHJhbnNhY3Rpb25JZAkA2AQBCAgFAmFSBmNhbGxlcgVieXRlcwgFCWxhc3RCbG9jawl0aW1lc3RhbXABAmJ3BgJhUgFQAmJ4AmJ5AmJ6AmJzBAJiQQkBAmJyAgUCYVIFAmJzAwkAAAIFAmJBBQJiQQQCYnQIBQJiQQJfNAQCYkIIBQJiQQJfMwQBTggFAmJBAl8yBAJiQwgFAmJBAl8xAwYJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQFOAgMgLyAFAmJ4AgMgLyAFAmJ6AgMgLyAFAmJzBAJiRAMDAwkAAAIFAU4FAmJ4CQECIT0CBQJiegIABwkBAiE9AgUCYnkCAAcGBwQCYkUJAQFvAQkBAmFoAgUBTgUBUAMDAwkBAiE9AgUCYkUAAAkAZwIFBmhlaWdodAUCYkUHCQEBIQEFAmJEBwkAAgECC1NhbGUgZW5kZWQuBAJiRgkAAAIFAU4FAmJ4BAJiRwkBAW8BAhB0b3RhbF9uZnRfaXNzdWVkBAFECQEBYQEJAQFXAgUCYngFAVAEAmJICQEBYQEJAQFRAgUCYngFAVADCQAAAgUCYkgCAAkAAgECEUFydCBkb2Vzbid0IGV4aXN0BAJiSQkBAXEBCQEBWQIFAmJ4BQFQBAJiSgkBAW8BCQEBWAIFAmJ4BQFQBAJiYwMFAmJGCQBoAgUBQgACCQEBbwEJAQJhZwIFAmJ4BQFQBAJiYgMFAmJGCQDYBAEFAWkJAQFhAQkBAmFpAgUCYngFAVAEAmJLCQEBbwEJAQFWAgUCYngFAVADAwMJAQEhAQUCYkQJAQEhAQUCYkYHAwMJAGcCAAAFAmJjBgkBASEBBQJiSQYJAGcCAAAFAmJLBwkAAgECEEFydCBub3QgZm9yIHNhbGUDAwMJAQEhAQUCYkQFAmJGBwkAZwIAAAUCYksHCQACAQIUTWF4IGlzc3VhYmxlIG5vdCBzZXQEAmFQCQECYUYBBQJieAMDBQJiRAkBAiE9AgUCYVACAAcJAAIBBQJhUAQCYm0JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUBUAIBXwUCYngCAV8FAmJ6AgFfBQJieQQCYkwDBQJiRAkBAmJsAQUCYm0JAQJiYQMFAmFSBQJiYgUCYmMEAmFUCAUCYkwCXzEEAmFXCAUCYkwCXzIEAmJNCQELdmFsdWVPckVsc2UCCQCdCAIFAWcJAQJhawEFAmJ4BQFmBAJiTgkBC3ZhbHVlT3JFbHNlAgkAmggCBQFnCQECYW0BBQJieAAABAJiTwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQFnCQECYW4BBQJieAUBZgQCYlAJAQt2YWx1ZU9yRWxzZQIJAJoIAgUBZwkBAmFvAQUCYngAAAQCYlEJAQFwAQUCYngEAmJSAwkAZgIFAmJRBQZoZWlnaHQAAAMJAAACBQJhVwUBaQUBcgUBcwQCYlMJAGsDBQJhVAUCYlIAZAQCYlQDAwMJAQIhPQIFAmJNBQFmCQBmAgUCYk4AAAcJAGYCBQZoZWlnaHQFAmJRBwkAawMFAmFUBQJiTgCQTgAABAJiVQMDAwkBAiE9AgUCYk8FAWYJAGYCBQJiUAAABwkAZgIFBmhlaWdodAUCYlEHCQBrAwUCYVQFAmJQAJBOAAAEAmJWCQBlAgUCYVQFAmJTAwkAAAIFAmJKBQJiSwkAAgECDEFydCBzb2xkIG91dAQCYlcJAGQCBQJiSgABBAJiWAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCUNyZWF0b3I6IAUCYngCCiwKIEFydElEOiAFAVACCywKIFNpZ25JRDogBQFEAhEsCiBBcnR3b3JrIG5hbWU6IAUCYkgCCiwKIElzc3VlOiAJAKQDAQUCYlcCAS8JAKQDAQUCYksEAmJZCQDCCAUJAKwCAgIDU0FfCQCkAwEJAGQCBQJiRwABBQJiWAABAAAHBAJiWgkAuAgBBQJiWQQCY2EDAwkAAAIFAmJXBQJiSwYJAQEhAQUCYkkHBgQCY2IDAwMJAAACBQFOBQJieAkBAiE9AgUCYnoCAAcJAQIhPQIFAmJ5AgAHCQERQGV4dHJOYXRpdmUoMTA2MikBBQJieggFAmFSBmNhbGxlcgQCY2MDCQEBIQEJAQlpc0RlZmluZWQBBQJhVwIFV0FWRVMJANgEAQkBBXZhbHVlAQUCYVcEAmJuCQEBYQEJAKwCAgUCYm0CBV9PUEVOBAJjZAkBC0RlbGV0ZUVudHJ5AQkArAICBQJibQIFX09QRU4EAmNlCQELU3RyaW5nRW50cnkCCQCsAgIFAmJtAgdfQ0xPU0VECQCsAgIJAKwCAgUCYm4CAV8JAKQDAQUCYkIEAmNmCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCWFydF9zb2xkXwkApAMBBQJiVwIEX29mXwkApAMBBQJiSwIBXwUBUAIBXwUCYngEAmNnAwkBASEBBQJiRAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQFOAgFfCQCkAwEFAmJCAgFfBQJiQwIBXwkApAMBBQJiYwIBXwUCYmICAV8JANgEAQUCYloJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBBQJjYgIBXwkApAMBBQJiQgIBXwUCYkMCAV8JAKQDAQUCYVQCAV8FAmNjAgFfCQDYBAEFAmJaBAJjaAkBC1N0cmluZ0VudHJ5AgUCY2YFAmNnBAJjaQMJAQIhPQIFAmJUAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAWYJAGUCBQJiUwUCYlQFAmFXCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQJiTQUCYlQFAmFXBQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAWYFAmJTBQJhVwUDbmlsBAJjagMJAQIhPQIFAmJVAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAmJPBQJiVQUCYVcJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAmJ4CQBlAgUCYlYFAmJVBQJhVwUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQJieAUCYlYFAmFXBQNuaWwEAmNrAwUCYnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAU4AAAUEdW5pdAUDbmlsBQNuaWwEAmNsCQDOCAIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBWAIFAmJ4BQFQBQJiVwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgICBG5mdF8JANgEAQUCYloFAmNmCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhB0b3RhbF9uZnRfaXNzdWVkCQBkAgUCYkcAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFoAgUCYngFAVAAAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAVkCBQJieAUBUAUCY2EJAMwIAgUCYlkJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCY2IAAQUCYloFA25pbAUCY2kFAmNqBQJjawMFAmJECQDMCAIFAmNoCQDMCAIFAmNlCQDMCAIFAmNkBQJjbAkAzAgCBQJjaAUCY2wJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmNtAQJjbgQBRwUCY24DCQABAgUBRwIGU3RyaW5nBAJjbwUBRwUCY28JAAIBAiRTcG9uc29yZWQgUHVibGljIEtleSBTdHJpbmcgZXhwZWN0ZWQKAmNwAQdzZXRDb25mAgFiAmNxBAFOCQClCAEIBQJjcAZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQFtCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQFOAwkBCGNvbnRhaW5zAgUBYgIFY29uZl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUBYgUCY3EFA25pbAkAAgECIEVudHJpZXMgc3RhcnRpbmcgd2l0aCBjb25mXyBvbmx5CQACAQIiWW91IGFyZSBub3QgYWxsb3dlZCB0byBjaGFuZ2UgdGhpcwJhUgEKYWRkQXJ0d29yaw4BRgFEAmFMAmFNAmFOAmNyAmF3AmFBAmF4AmFCAmF5AmNzAmFPAmJzBAJjdAkBAmJyAgUCYVIFAmJzBAFQCAUCY3QCXzEEAU4IBQJjdAJfMgQCYkIIBQJjdAJfMwQCYnQIBQJjdAJfNAMJAQEhAQkBAUsBBQFGCQACAQIkSGFzaCBzaG91bGQgYmUgNjQgY2hhcmFjdGVycyBtYXhpbXVtBAJjdQkBAmFIAgUCYXkFAmFCBAJhSggFAmN1Al8xBAJhSwgFAmN1Al8yBAJjdgkBAmFJCgUBTgUCYXcFAmF4BQJhSgUCYUEFAmFLBQJhTAUCYU0FAmFOBQJhTwMJAQIhPQIFAmN2AgAJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEEAmN3CQBmAgkBAXABCQCsAgIFAU4CC19mcmVlX2Ryb3BzAAAEAmN4AwUCY3cJAJQKAgAABQFECQECYVUBBQJhUgQCYVQIBQJjeAJfMQQCYVcIBQJjeAJfMgMJAQEhAQkBCWlzRGVmaW5lZAEFAmFUCQACAQIUU29tZXRoaW5nIHdlbnQgd3JvbmcEAmN5CQEBYQEJAQJhdQIFAUYFAU4DCQECIT0CBQJjeQIACQACAQIUWW91IGFscmVhZHkgYWRkZWQgaXQEAmN6CQEBYQEJAQJhcgEFAUYDCQECIT0CBQJjegIACQACAQIXSGFzaCBhbHJlYWR5IHJlZ2lzdGVyZWQEAmNBCQEBQwMFAUQFAU4FAUYDCQEBIQEFAmNBCQACAQIsU2lnbiBDZXJ0aWZpY2F0ZSBub3QgZm91bmQgZm9yIHRoaXMgYWRkcmVzcy4EAmNCAwUCY3cJAPwHBAUBaAILdXNlRnJlZURyb3AJAMwIAgUBTgUDbmlsBQNuaWwFBHVuaXQDCQAAAgUCY0IFAmNCBAJjawMFAmJ0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQFOAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFyAQUBRgUBTgkAzAgCCQELU3RyaW5nRW50cnkCCQECYXUCBQFGBQFOBQFQCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBTwIFAU4FAVAFAmJCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFRAgUBTgUBUAUCYUwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVICBQFOBQFQBQJhTQkAzAgCCQELU3RyaW5nRW50cnkCCQEBUwIFAU4FAVAFAmF3CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFVAgUBTgUBUAUCYXgJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVQCBQFOBQFQBQJhQQkAzAgCCQELU3RyaW5nRW50cnkCCQEBWgIFAU4FAVAFAmFLCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYQIFAU4FAVAFAmFKCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYwIFAU4FAVAFAmNyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYgIFAU4FAVAFAmFOCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVgIFAU4FAVAAAAkAzAgCCQELU3RyaW5nRW50cnkCCQEBVwIFAU4FAVAFAUQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFYAgUBTgUBUAAACQDMCAIJAQxCb29sZWFuRW50cnkCCQEBWQIFAU4FAVAHCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhcwIFAU4FAUQFAVAJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFwAgUBTgUBUAUBRgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWUCBQFOBQFQBQJjcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFmAgUBTgUBUAUCYU8JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAWYFAmFUBQFpBQNuaWwFAmNrCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFSAQ11cGRhdGVBcnR3b3JrDQJhcQJhTAJhTQJhTgJjcgJhdwJhQQJheAJhQgJheQJjcwJhTwJicwMJAQEhAQUBdgkAAgEFAXcEAmNDCQECYnICBQJhUgUCYnMEAmJDCAUCY0MCXzEEAU4IBQJjQwJfMgQCYkIIBQJjQwJfMwQCYnQIBQJjQwJfNAQCY0QJAQJhSAIFAmF5BQJhQgQCYUoIBQJjRAJfMQQCYUsIBQJjRAJfMgQCY3YJAQJhSQoFAU4FAmF3BQJheAUCYUoFAmFBBQJhSwUCYUwFAmFNBQJhTgUCYU8DCQECIT0CBQJjdgIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAJjeQkBAWEBCQEBUQIFAU4FAmFxAwkAAAIFAmN5AgAJAAIBAg9FbnRyeSBub3QgZm91bmQEAmNFCQEBYQEJAQJhagIFAU4FAmFxAwkAAAIFAmNFAgdJTExFR0FMCQACAQIdQ2Fubm90IHVwZGF0ZSBJTExFR0FMIGFydHdvcmsDCQEBIQEJAQJhWAIFAU4FAmFxBAJjawMFAmJ0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQFOAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVECBQFOBQJhcQUCYUwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVICBQFOBQJhcQUCYU0JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVMCBQFOBQJhcQUCYXcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVUCBQFOBQJhcQUCYXgJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVQCBQFOBQJhcQUCYUEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFhAgUBTgUCYXEFAmFKCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFaAgUBTgUCYXEFAmFLCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYgIFAU4FAmFxBQJhTgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWMCBQFOBQJhcQUCY3IJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFlAgUBTgUCYXEFAmNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWYCBQFOBQJhcQUCYU8FA25pbAUCY2sJAAIBAg5BbHJlYWR5IG1pbnRlZAJhUgELZmxhZ0FydHdvcmsEAVACY0YCY0UCY0cEAmNICQECYnYBBQJhUgQCYkMIBQJjSAJfMQQBTggFAmNIAl8yAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUBbQkAzAgCCQClCAEFBHRoaXMFA25pbAUBTgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAICB0NPTlNFTlQJAMwIAgIACQDMCAICD0NIQU5HRV9SRVFVSVJFRAkAzAgCAgdGTEFHR0VECQDMCAICB0lMTEVHQUwFA25pbAUCY0UJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFqAgUCY0YFAVAFAmNFCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhZAIFAmNGBQFQBQJjRwUDbmlsCQACAQkArAICAg5Vbmtub3cgc3RhdHVzIAUCY0UJAAIBAhNZb3UgYXJlIG5vdCBhbGxvd2VkAmFSAQ1kZWxldGVBcnR3b3JrAgFQAmNGBAJjSQkBAmJ2AQUCYVIEAmJDCAUCY0kCXzEEAU4IBQJjSQJfMgQCYVkDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQFtCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQFOBQJjRgUBTgQCY3kJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBAWEBCQEBUQIFAmFZBQFQAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwMJAAACBQJjeQIACQACAQIgTm8gYXJ0IG1hdGNoaW5nIGZvciB0aGlzIGFkZHJlc3MEAUYJAQFhAQkBAmFwAgUCYVkFAVADCQAAAgUBRgIACQACAQIlTm8gYXJ0IGhhc2ggbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwQBRAkBAWEBCQEBVwIFAmFZBQFQAwkAAAIFAUQCAAkAAgECE05vIFNJR04gSUQgbWF0Y2hpbmcEAmNKCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFPAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVECBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBUgIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFTAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVUCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBVAIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFaAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFhAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFjAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFiAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVYCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBVwIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFYAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVkCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWoCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWcCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWkCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYXIBBQFGCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhcwIFAmFZBQFECQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhdQIFAUYFAmFZCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhaAIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhZAIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhZQIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhZgIFAmFZBQFQBQNuaWwDCQEBIQEJAQJhWAIFAmFZBQFQAwkBASEBBQF2CQACAQUBdwUCY0oDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQFtCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQFOBQJjSgkAAgECKEFydCBhbHJlYWR5IG1pbnRlZCwgeW91IGNhbm5vdCBkZWxldGUgaXQCYVIBC3NlbGxBcnR3b3JrBgFQAmJnAmNLAmFXAmJFAmJzBAJjTAkBAmJyAgUCYVIFAmJzBAJiQwgFAmNMAl8xBAFOCAUCY0wCXzIEAmJCCAUCY0wCXzMEAmJ0CAUCY0wCXzQEAmJICQEBYQEJAQFRAgUBTgUBUAMJAAACBQJiSAIACQACAQIjVGhpcyBhcnQgZG9lc24ndCBtYXRjaCB5b3VyIGFjY291bnQEAmNFCQEBYQEJAQJhagIFAU4FAVADCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAg9DSEFOR0VfUkVRVUlSRUQJAMwIAgIHRkxBR0dFRAkAzAgCAgdJTExFR0FMBQNuaWwFAmNFCQACAQIPRmxhZ2dlZCBhcnR3b3JrBAJjTQkBAW8BCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUBUAMJAGYCAAAFAmJFCQACAQIMTmVnYXRpdmUgZW5kAwMJAGYCBQJiRQAAAwkBAiE9AgUCY0sAAQYJAQIhPQIFAmJnAAAHCQACAQI6VGltZWQgb2ZmZXIgb25seSBhbGxvd2VkIGZvciB1bmlxdWUgZWRpdGlvbiBhbmQgb2ZmZXIgb25seQQCY04DCQAAAgUCYkUAAAAABQZoZWlnaHQDCQEBIQEJAQJiZQEFAmFXCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchAwkBASEBCQECYmYCBQJhVwUCYmcJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEEAmFQCQECYUYBBQFOAwkBAiE9AgUCYVACAAkAAgEFAmFQBAJiSgkBAW8BCQEBWAIFAU4FAVAEAmJLCQEBbwEJAQFWAgUBTgUBUAMJAGYCBQJjSwBkCQACAQIcMTAwIGVkaXRpb25zIG1heCBwZXIgYXJ0d29yawMDCQECIT0CBQJiSgAACQAAAgUCYkoFAmJLBwkAAgECFE1heCBlZGl0aW9uIHJlYWNoZWQuAwMJAGYCBQJiSgAACQECIT0CBQJiSwUCY0sHCQACAQImQ2Fubm90IGNoYW5nZSBtYXhpbXVtIGlzc3VhYmxlIGFueW1vcmUDAwkAZgIFAmNNAAAJAQIhPQIFAmJLBQJjSwcJAAIBAjFDYW5ub3QgY2hhbmdlIG1heGltdW0gaXNzdWFibGUgd2l0aCBhY3RpdmUgb3JkZXJzBAJjYQMDCQBmAgUCYmcAAAkAZgIFAmNLAAAHBgcEAmNrAwUCYnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAU4AAAUEdW5pdAUDbmlsBQNuaWwJAM4IAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAVkCBQFOBQFQBQJjYQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFnAgUBTgUBUAUCYmcJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFWAgUBTgUBUAUCY0sJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFpAgUBTgUBUAUCYVcJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhaAIFAU4FAVAJAGQCBQJjTgUCYkUFA25pbAUCY2sCYVIBCmJ1eUFydHdvcmsCAVACYngJAQJidwYFAmFSBQFQBQJieAIAAgACAAJhUgEGc2V0QmlkAgFQAmJ4BAJjTwkBAmJ2AQUCYVIEAmJDCAUCY08CXzEEAU4IBQJjTwJfMgQCYkIIBQJjTwJfMwQCY1AJAQJhUQEFAmFSBAJhUwgFAmNQAl8xBAJhVAgFAmNQAl8yBAJhVwMJAQEhAQkBCWlzRGVmaW5lZAEIBQJhUwdhc3NldElkAgVXQVZFUwkA2AQBCQEFdmFsdWUBCAUCYVMHYXNzZXRJZAQCYkUJAQFvAQkBAmFoAgUCYngFAVADAwkBAiE9AgUCYkUAAAkAZwIFBmhlaWdodAUCYkUHCQACAQILU2FsZSBlbmRlZC4EAmNNCQEBbwEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQFQAwkBASEBCQECYmUBBQJhVwkAAgECEmFzc2V0IG5vdCBhY2NlcHRlZAMJAQEhAQkBAmJmAgUCYVcFAmFUCQACAQIOV3JvbmcgbWluIHNlbGwEAmJKCQEBbwEJAQFYAgUCYngFAVAEAmJLCQEBbwEJAQFWAgUCYngFAVADCQBnAgAABQJiSwkAAgECI05vIG1heCBlZGl0aW9uIHNldCBmb3IgdGhpcyBhcnR3b3JrAwkAZwIFAmJKBQJiSwkAAgECGFNvbGQgb3V0LCB5b3UgY2Fubm90IGJpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUBUAIBXwUCYngCAV8FAU4CAV8FAmJDAgVfT1BFTgkArAICCQCsAgIJAKwCAgkArAICBQJhVwIBXwkApAMBBQJhVAIBXwkApAMBBQJiQgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FAVAJAGQCBQJjTQABBQNuaWwCYVIBCWFjY2VwdEJpZAUBUAJieAJieQJiegJicwQCY1EJAQJicgIFAmFSBQJicwQCYkMIBQJjUQJfMQQCY1IIBQJjUQJfMgQCYkIIBQJjUQJfMwQCYnQIBQJjUQJfNAMJAQIhPQIFAmNSBQJieAkAAgECGVlvdSBjYW5ub3QgZG8gdGhpcyBhY3Rpb24JAQJidwYFAmFSBQFQBQJieAUCYnkFAmJ6BQJicwJhUgEJY2FuY2VsQmlkBAFQAmJ4AmJ5AmJ6BAJjUwkBAmJ2AQUCYVIEAmJDCAUCY1MCXzEEAU4IBQJjUwJfMgQCYkIIBQJjUwJfMwMDCQECIT0CBQFOBQJiegkBAiE9AgUBTgUCYngHCQACAQIZWW91IGNhbm5vdCBkbyB0aGlzIGFjdGlvbgQCY1QDCQAAAgUBTgUCYngFAmJ6BQFOBAJjTQkBAW8BCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUBUAQCYm0JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUBUAIBXwUCYngCAV8FAmJ6AgFfBQJieQQCYm4JAQFhAQkArAICBQJibQIFX09QRU4DCQAAAgUCYm4CAAkAAgECDUJpZCBub3QgZm91bmQEAmJvCQC1CQIFAmJuAgFfBAJhVwkBAmJrAQkAkQMCBQJibwAABAJjVQIIQ0FOQ0VMRUQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQJibQIFX09QRU4JAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIFAmJtAgFfBQJjVQkArAICCQCsAgIFAmJuAgFfCQCkAwEFAmJCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUBUAkAZQIFAmNNAAEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAmNUCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYm8AAQUCYVcFA25pbAECY1YBAmNXAAQBRwUCY1YDCQABAgUBRwIXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EAmNYBQFHAwMDAwkAAAIIBQJjWAhmdW5jdGlvbgIKYWRkQXJ0d29yawkAAAIIBQJjWARkQXBwBQR0aGlzBwkAAAIIBQJjWANmZWUAoMIeBwkAAAIIBQJjWApmZWVBc3NldElkBQR1bml0BwkA9AMDCAUCY1YJYm9keUJ5dGVzCQCRAwIIBQJjVgZwcm9vZnMAAAkA2QQBCQECY20BCQCRAwIIBQJjWARhcmdzAA0DAwMDCQAAAggFAmNYCGZ1bmN0aW9uAg11cGRhdGVBcnR3b3JrCQAAAggFAmNYBGRBcHAFBHRoaXMHCQAAAggFAmNYA2ZlZQCgwh4HCQAAAggFAmNYCmZlZUFzc2V0SWQFBHVuaXQHCQD0AwMIBQJjVglib2R5Qnl0ZXMJAJEDAggFAmNWBnByb29mcwAACQDZBAEJAQJjbQEJAJEDAggFAmNYBGFyZ3MADAMDAwMJAAACCAUCY1gIZnVuY3Rpb24CC3NlbGxBcnR3b3JrCQAAAggFAmNYBGRBcHAFBHRoaXMHCQAAAggFAmNYA2ZlZQCgwh4HCQAAAggFAmNYCmZlZUFzc2V0SWQFBHVuaXQHCQD0AwMIBQJjVglib2R5Qnl0ZXMJAJEDAggFAmNWBnByb29mcwAACQDZBAEJAQJjbQEJAJEDAggFAmNYBGFyZ3MABQMDAwMJAAACCAUCY1gIZnVuY3Rpb24CCWFjY2VwdEJpZAkAAAIIBQJjWARkQXBwBQR0aGlzBwkAAAIIBQJjWANmZWUAoMIeBwkAAAIIBQJjWApmZWVBc3NldElkBQR1bml0BwkAyBMDCAUCY1YJYm9keUJ5dGVzCQCRAwIIBQJjVgZwcm9vZnMAAAkA2QQBCQECY20BCQCRAwIIBQJjWARhcmdzAAQJAPQDAwgFAmNWCWJvZHlCeXRlcwkAkQMCCAUCY1YGcHJvb2ZzAAAIBQJjVg9zZW5kZXJQdWJsaWNLZXkJAPQDAwgFAmNWCWJvZHlCeXRlcwkAkQMCCAUCY1YGcHJvb2ZzAAAIBQJjVg9zZW5kZXJQdWJsaWNLZXkuUHD7", "height": 2503555, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: B4CodCUVKyjqr1qmM9dbnUzUVLwb8r6ZCquaCQvx3zTK Next: AZy6L8z3BeBcwc287AJVsqpC7meF9mpub17KjuGyVDut Diff:
OldNewDifferences
385385 else false)
386386 then toString(addressFromPublicKey(fromBase58String(pubKey)))
387387 else toBase58String(i.caller.bytes)
388- let get_sponsored_waves = if (if ((pubKey != ""))
389- then (isSponsored > 0)
390- else false)
391- then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
392- else unit
393- if ((get_sponsored_waves == get_sponsored_waves))
394- then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
388+ if ((caller == caller))
389+ then {
390+ let get_sponsored_waves = if (if ((pubKey != ""))
391+ then (isSponsored > 0)
392+ else false)
393+ then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
394+ else unit
395+ if ((get_sponsored_waves == get_sponsored_waves))
396+ then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
397+ else throw("Strict value is not equal to itself.")
398+ }
395399 else throw("Strict value is not equal to itself.")
396400 }
397401
402406
403407
404408 func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
405- let $t01304413133 = idCallerDateSponsored(i, pubKey)
406- let id = $t01304413133._1
407- let caller = $t01304413133._2
408- let date = $t01304413133._3
409- let isSponsored = $t01304413133._4
410- if (true)
411- then throw(((((((caller + " / ") + issuer) + " / ") + bidOwner) + " / ") + pubKey))
412- else {
413- let isBid = if (if (if ((caller == issuer))
414- then (bidOwner != "")
415- else false)
416- then (bidId != "")
417- else false)
418- then true
419- else false
420- let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
421- if (if (if ((blockEnd != 0))
422- then (height >= blockEnd)
423- else false)
424- then !(isBid)
425- else false)
426- then throw("Sale ended.")
409+ let $t01304713139 = idCallerDateSponsored(i, pubKey)
410+ if (($t01304713139 == $t01304713139))
411+ then {
412+ let isSponsored = $t01304713139._4
413+ let date = $t01304713139._3
414+ let caller = $t01304713139._2
415+ let id = $t01304713139._1
416+ if (true)
417+ then throw(((((((caller + " / ") + issuer) + " / ") + bidOwner) + " / ") + pubKey))
427418 else {
428- let callerIsIssuer = (caller == issuer)
429- let totalNFT = getIntegerByKey("total_nft_issued")
430- let signID = getStringByKey(keySignID(issuer, artId))
431- let artworkName = getStringByKey(keyName(issuer, artId))
432- if ((artworkName == ""))
433- then throw("Art doesn't exist")
419+ let isBid = if (if (if ((caller == issuer))
420+ then (bidOwner != "")
421+ else false)
422+ then (bidId != "")
423+ else false)
424+ then true
425+ else false
426+ let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
427+ if (if (if ((blockEnd != 0))
428+ then (height >= blockEnd)
429+ else false)
430+ then !(isBid)
431+ else false)
432+ then throw("Sale ended.")
434433 else {
435- let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
436- let amountSold = getIntegerByKey(keyIssued(issuer, artId))
437- let artworkPrice = if (callerIsIssuer)
438- then (currentCertificationPrice * 2)
439- else getIntegerByKey(keyPrice(issuer, artId))
440- let priceAssetId = if (callerIsIssuer)
441- then toBase58String(signAssetId)
442- else getStringByKey(keyAssetIdAccepted(issuer, artId))
443- let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
444- if (if (if (!(isBid))
445- then !(callerIsIssuer)
446- else false)
447- then if (if ((0 >= artworkPrice))
448- then true
449- else !(isOnSale))
450- then true
451- else (0 >= maxCanSell)
452- else false)
453- then throw("Art not for sale")
454- else if (if (if (!(isBid))
455- then callerIsIssuer
456- else false)
457- then (0 >= maxCanSell)
458- else false)
459- then throw("Max issuable not set")
460- else {
461- let checkUser = validateUser(issuer)
462- if (if (isBid)
463- then (checkUser != "")
434+ let callerIsIssuer = (caller == issuer)
435+ let totalNFT = getIntegerByKey("total_nft_issued")
436+ let signID = getStringByKey(keySignID(issuer, artId))
437+ let artworkName = getStringByKey(keyName(issuer, artId))
438+ if ((artworkName == ""))
439+ then throw("Art doesn't exist")
440+ else {
441+ let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
442+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
443+ let artworkPrice = if (callerIsIssuer)
444+ then (currentCertificationPrice * 2)
445+ else getIntegerByKey(keyPrice(issuer, artId))
446+ let priceAssetId = if (callerIsIssuer)
447+ then toBase58String(signAssetId)
448+ else getStringByKey(keyAssetIdAccepted(issuer, artId))
449+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
450+ if (if (if (!(isBid))
451+ then !(callerIsIssuer)
452+ else false)
453+ then if (if ((0 >= artworkPrice))
454+ then true
455+ else !(isOnSale))
456+ then true
457+ else (0 >= maxCanSell)
458+ else false)
459+ then throw("Art not for sale")
460+ else if (if (if (!(isBid))
461+ then callerIsIssuer
464462 else false)
465- then throw(checkUser)
463+ then (0 >= maxCanSell)
464+ else false)
465+ then throw("Max issuable not set")
466466 else {
467- let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
468- let $t01473614928 = if (isBid)
469- then getPriceAssetIdFromBid(bidDataKey)
470- else validatePriceAssetId(i, priceAssetId, artworkPrice)
471- let amount = $t01473614928._1
472- let assetId = $t01473614928._2
473- let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
474- let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
475- let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
476- let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
477- let isWhitelisted = checkWhitelist(issuer)
478- let cut = if ((isWhitelisted > height))
479- then 0
480- else if ((assetId == signAssetId))
481- then signCut
482- else usdnWaveCut
483- let amountForSign = fraction(amount, cut, 100)
484- let amountForAgent = if (if (if ((agent != feeReceiver))
485- then (agentShare > 0)
467+ let checkUser = validateUser(issuer)
468+ if (if (isBid)
469+ then (checkUser != "")
486470 else false)
487- then (height > isWhitelisted)
488- else false)
489- then fraction(amount, agentShare, 10000)
490- else 0
491- let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
492- then (publicAgentShare > 0)
493- else false)
494- then (height > isWhitelisted)
495- else false)
496- then fraction(amount, publicAgentShare, 10000)
497- else 0
498- let amountForCreator = (amount - amountForSign)
499- if ((amountSold == maxCanSell))
500- then throw("Art sold out")
471+ then throw(checkUser)
501472 else {
502- let newAmountSold = (amountSold + 1)
503- let issueMeta = ((((((((((("Creator: " + issuer) + ",
473+ let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
474+ let $t01474214934 = if (isBid)
475+ then getPriceAssetIdFromBid(bidDataKey)
476+ else validatePriceAssetId(i, priceAssetId, artworkPrice)
477+ let amount = $t01474214934._1
478+ let assetId = $t01474214934._2
479+ let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
480+ let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
481+ let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
482+ let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
483+ let isWhitelisted = checkWhitelist(issuer)
484+ let cut = if ((isWhitelisted > height))
485+ then 0
486+ else if ((assetId == signAssetId))
487+ then signCut
488+ else usdnWaveCut
489+ let amountForSign = fraction(amount, cut, 100)
490+ let amountForAgent = if (if (if ((agent != feeReceiver))
491+ then (agentShare > 0)
492+ else false)
493+ then (height > isWhitelisted)
494+ else false)
495+ then fraction(amount, agentShare, 10000)
496+ else 0
497+ let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
498+ then (publicAgentShare > 0)
499+ else false)
500+ then (height > isWhitelisted)
501+ else false)
502+ then fraction(amount, publicAgentShare, 10000)
503+ else 0
504+ let amountForCreator = (amount - amountForSign)
505+ if ((amountSold == maxCanSell))
506+ then throw("Art sold out")
507+ else {
508+ let newAmountSold = (amountSold + 1)
509+ let issueMeta = ((((((((((("Creator: " + issuer) + ",
504510 ArtID: ") + artId) + ",
505511 SignID: ") + signID) + ",
506512 Artwork name: ") + artworkName) + ",
507513 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
508- let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
509- let idNFT = calculateAssetId(issueNFT)
510- let sellStatus = if (if ((newAmountSold == maxCanSell))
511- then true
512- else !(isOnSale))
513- then false
514- else true
515- let receiveNFT = if (if (if ((caller == issuer))
516- then (bidOwner != "")
517- else false)
518- then (bidId != "")
519- else false)
520- then addressFromStringValue(bidOwner)
521- else i.caller
522- let assetIdBid = if (!(isDefined(assetId)))
523- then "WAVES"
524- else toBase58String(value(assetId))
525- let bidData = getStringByKey((bidDataKey + "_OPEN"))
526- let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
527- let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
528- let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
529- let soldValue = if (!(isBid))
530- then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
531- else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
532- let soldData = StringEntry(soldKey, soldValue)
533- let commissionsWithAgent = if ((amountForAgent != 0))
534- then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
535- else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
536- let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
537- then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
538- else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
539- let txToCaller = if (isSponsored)
540- then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
541- else nil
542- let buyRes = ((([IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissionsWithAgent) ++ commissionsWithPublicAgent) ++ txToCaller)
543- if (isBid)
544- then [soldData, bidUpdate, bidDelOld] :: buyRes
545- else soldData :: buyRes
514+ let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
515+ let idNFT = calculateAssetId(issueNFT)
516+ let sellStatus = if (if ((newAmountSold == maxCanSell))
517+ then true
518+ else !(isOnSale))
519+ then false
520+ else true
521+ let receiveNFT = if (if (if ((caller == issuer))
522+ then (bidOwner != "")
523+ else false)
524+ then (bidId != "")
525+ else false)
526+ then addressFromStringValue(bidOwner)
527+ else i.caller
528+ let assetIdBid = if (!(isDefined(assetId)))
529+ then "WAVES"
530+ else toBase58String(value(assetId))
531+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
532+ let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
533+ let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
534+ let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
535+ let soldValue = if (!(isBid))
536+ then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
537+ else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
538+ let soldData = StringEntry(soldKey, soldValue)
539+ let commissionsWithAgent = if ((amountForAgent != 0))
540+ then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
541+ else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
542+ let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
543+ then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
544+ else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
545+ let txToCaller = if (isSponsored)
546+ then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
547+ else nil
548+ let buyRes = ((([IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissionsWithAgent) ++ commissionsWithPublicAgent) ++ txToCaller)
549+ if (isBid)
550+ then [soldData, bidUpdate, bidDelOld] :: buyRes
551+ else soldData :: buyRes
552+ }
546553 }
547554 }
548- }
555+ }
549556 }
550557 }
551558 }
559+ else throw("Strict value is not equal to itself.")
552560 }
553561
554562
574582
575583 @Callable(i)
576584 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
577- let $t02010420177 = idCallerDateSponsored(i, pubKey)
578- let artId = $t02010420177._1
579- let caller = $t02010420177._2
580- let date = $t02010420177._3
581- let isSponsored = $t02010420177._4
585+ let $t02011020183 = idCallerDateSponsored(i, pubKey)
586+ let artId = $t02011020183._1
587+ let caller = $t02011020183._2
588+ let date = $t02011020183._3
589+ let isSponsored = $t02011020183._4
582590 if (!(validateHash(sha256Hash)))
583591 then throw("Hash should be 64 characters maximum")
584592 else {
585- let $t02027820347 = setLIcence(cidLicence, sha256Licence)
586- let licenceCID = $t02027820347._1
587- let licenceHash = $t02027820347._2
593+ let $t02028420353 = setLIcence(cidLicence, sha256Licence)
594+ let licenceCID = $t02028420353._1
595+ let licenceHash = $t02028420353._2
588596 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
589597 if ((validateArtwork != ""))
590598 then throw("Something went wrong!")
591599 else {
592600 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
593- let $t02064620730 = if (whitelisted_drop)
601+ let $t02065220736 = if (whitelisted_drop)
594602 then $Tuple2(0, signID)
595603 else validatePayment(i)
596- let amount = $t02064620730._1
597- let assetId = $t02064620730._2
604+ let amount = $t02065220736._1
605+ let assetId = $t02065220736._2
598606 if (!(isDefined(amount)))
599607 then throw("Something went wrong")
600608 else {
635643 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
636644 then throw(maintenanceMSG)
637645 else {
638- let $t02376423834 = idCallerDateSponsored(i, pubKey)
639- let id = $t02376423834._1
640- let caller = $t02376423834._2
641- let date = $t02376423834._3
642- let isSponsored = $t02376423834._4
643- let $t02384423913 = setLIcence(cidLicence, sha256Licence)
644- let licenceCID = $t02384423913._1
645- let licenceHash = $t02384423913._2
646+ let $t02377023840 = idCallerDateSponsored(i, pubKey)
647+ let id = $t02377023840._1
648+ let caller = $t02377023840._2
649+ let date = $t02377023840._3
650+ let isSponsored = $t02377023840._4
651+ let $t02385023919 = setLIcence(cidLicence, sha256Licence)
652+ let licenceCID = $t02385023919._1
653+ let licenceHash = $t02385023919._2
646654 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
647655 if ((validateArtwork != ""))
648656 then throw("Something went wrong!")
670678
671679 @Callable(i)
672680 func flagArtwork (artId,addr,flag,note) = {
673- let $t02554025574 = idCallerDate(i)
674- let id = $t02554025574._1
675- let caller = $t02554025574._2
681+ let $t02554625580 = idCallerDate(i)
682+ let id = $t02554625580._1
683+ let caller = $t02554625580._2
676684 if (containsElement([chris, toString(this)], caller))
677685 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
678686 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
684692
685693 @Callable(i)
686694 func deleteArtwork (artId,addr) = {
687- let $t02601026044 = idCallerDate(i)
688- let id = $t02601026044._1
689- let caller = $t02601026044._2
695+ let $t02601626050 = idCallerDate(i)
696+ let id = $t02601626050._1
697+ let caller = $t02601626050._2
690698 let addrToUse = if (containsElement([chris, toString(this)], caller))
691699 then addr
692700 else caller
719727
720728 @Callable(i)
721729 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
722- let $t02888028950 = idCallerDateSponsored(i, pubKey)
723- let id = $t02888028950._1
724- let caller = $t02888028950._2
725- let date = $t02888028950._3
726- let isSponsored = $t02888028950._4
730+ let $t02888628956 = idCallerDateSponsored(i, pubKey)
731+ let id = $t02888628956._1
732+ let caller = $t02888628956._2
733+ let date = $t02888628956._3
734+ let isSponsored = $t02888628956._4
727735 let artworkName = getStringByKey(keyName(caller, artId))
728736 if ((artworkName == ""))
729737 then throw("This art doesn't match your account")
797805
798806 @Callable(i)
799807 func setBid (artId,issuer) = {
800- let $t03133231372 = idCallerDate(i)
801- let id = $t03133231372._1
802- let caller = $t03133231372._2
803- let date = $t03133231372._3
804- let $t03137731413 = isPayment(i)
805- let payment = $t03137731413._1
806- let amount = $t03137731413._2
808+ let $t03133831378 = idCallerDate(i)
809+ let id = $t03133831378._1
810+ let caller = $t03133831378._2
811+ let date = $t03133831378._3
812+ let $t03138331419 = isPayment(i)
813+ let payment = $t03138331419._1
814+ let amount = $t03138331419._2
807815 let assetId = if (!(isDefined(payment.assetId)))
808816 then "WAVES"
809817 else toBase58String(value(payment.assetId))
834842
835843 @Callable(i)
836844 func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = {
837- let $t03263332704 = idCallerDateSponsored(i, pubKey)
838- let id = $t03263332704._1
839- let caller1 = $t03263332704._2
840- let date = $t03263332704._3
841- let isSponsored = $t03263332704._4
845+ let $t03263932710 = idCallerDateSponsored(i, pubKey)
846+ let id = $t03263932710._1
847+ let caller1 = $t03263932710._2
848+ let date = $t03263932710._3
849+ let isSponsored = $t03263932710._4
842850 if ((caller1 != issuer))
843851 then throw("You cannot do this action")
844852 else buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
848856
849857 @Callable(i)
850858 func cancelBid (artId,issuer,bidId,bidOwner) = {
851- let $t03293933000 = idCallerDate(i)
852- let id = $t03293933000._1
853- let caller = $t03293933000._2
854- let date = $t03293933000._3
859+ let $t03294533006 = idCallerDate(i)
860+ let id = $t03294533006._1
861+ let caller = $t03294533006._2
862+ let date = $t03294533006._3
855863 if (if ((caller != bidOwner))
856864 then (caller != issuer)
857865 else false)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getStringByKey (key) = valueOrElse(getString(this, key), "")
55
66
77 let unitTest = false
88
99 let oracleFee = value(addressFromString(getStringByKey("conf_oracle_fee")))
1010
1111 let signDapp = value(addressFromString(getStringByKey("conf_signweb_dapp")))
1212
1313 let feeReceiver = getStringByKey("conf_fee_receiver")
1414
1515 let userDapp = if (unitTest)
1616 then value(addressFromString("3Mt4RGMEyjSWYAocTPqd55wdHQQB3PU2UCm"))
1717 else value(addressFromString(getStringByKey("conf_users_dapp")))
1818
1919 let whitelistDapp = value(addressFromString(getStringByKey("conf_whitelist_dapp")))
2020
2121 let signAssetId = fromBase58String(getStringByKey("conf_accepted_asset_SIGN"))
2222
2323 let usdnAssetId = fromBase58String(getStringByKey("conf_accepted_asset_USDN"))
2424
2525 let usdtAssetId = fromBase58String(getStringByKey("conf_accepted_asset_USDT"))
2626
2727 let wavesAssetId = base58''
2828
2929 let chris = getStringByKey("conf_admin_1")
3030
3131 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
3232
3333
3434 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
3535
3636
3737 func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
3838
3939
4040 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
4141
4242
4343 let signCut = 7
4444
4545 let usdnWaveCut = 10
4646
4747 let defaultLicence = getStringByKey("conf_default_licence")
4848
4949 let defaultHashLicence = getStringByKey("conf_default_licence_hash")
5050
5151 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
5252
5353 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
5454
5555 let userSuspended = "SUSPENDED"
5656
5757 let userRemoved = "REMOVED"
5858
5959 let userUnregistered = "UNREGISTERED"
6060
6161 let userAllowed = "ALLOWED"
6262
6363 let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
6464
6565 func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signDapp, ((("data_fc_" + signID) + "_") + Owner)) {
6666 case a: String =>
6767 if (contains(a, sha256Hash))
6868 then true
6969 else false
7070 case _ =>
7171 false
7272 }
7373
7474
7575 func validateCID (cid) = if (contains(cid, "/"))
7676 then if (if ((76 > size(cid)))
7777 then (size(split(cid, "/")[0]) == 59)
7878 else false)
7979 then (16 > size(split(cid, "/")[1]))
8080 else false
8181 else false
8282
8383
8484 func validateHash (hash) = (size(hash) == 64)
8585
8686
8787 func keyUserStatus (caller) = ("user_status_" + caller)
8888
8989
9090 func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
9191
9292
9393 func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
9494
9595
9696 func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
9797
9898
9999 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
100100
101101
102102 func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
103103
104104
105105 func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
106106
107107
108108 func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
109109
110110
111111 func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
112112
113113
114114 func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
115115
116116
117117 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
118118
119119
120120 func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
121121
122122
123123 func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
124124
125125
126126 func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
127127
128128
129129 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
130130
131131
132132 func keyNote (caller,artId) = ((("art_note_" + artId) + "_") + caller)
133133
134134
135135 func keyCrawler (caller,artId) = ((("art_crawler_cid_" + artId) + "_") + caller)
136136
137137
138138 func keyRoyalties (caller,artId) = ((("art_royalties_" + artId) + "_") + caller)
139139
140140
141141 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
142142
143143
144144 func keyEndSale (caller,artId) = ((("art_endsale_" + artId) + "_") + caller)
145145
146146
147147 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
148148
149149
150150 func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
151151
152152
153153 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
154154
155155
156156 func keyPrimaryShareAgent (artistAddr) = ("artist_agent_primary_" + artistAddr)
157157
158158
159159 func keyArtistPublicAgentAddr (artistAddr) = ("artist_public_agent_" + artistAddr)
160160
161161
162162 func keyPrimarySharePublicAgent (artistAddr) = ("artist_public_agent_primary_" + artistAddr)
163163
164164
165165 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
166166
167167
168168 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
169169
170170
171171 func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
172172
173173
174174 func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
175175
176176
177177 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
178178 then throw("Wrong Display CID")
179179 else if (!(validateCID(cidExport)))
180180 then throw("Wrong Export CID")
181181 else if (if ((cidLicence != ""))
182182 then !(validateCID(cidLicence))
183183 else false)
184184 then throw("Wrong Licence CID")
185185 else true
186186
187187
188188 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
189189 then throw("Export Hash 64 char. max")
190190 else if (!(validateHash(sha256Licence)))
191191 then throw("Licence Hash 64 char. max")
192192 else true
193193
194194
195195 func validateString (str,max) = if ((size(str) == 0))
196196 then throw("Field cannot be is empty")
197197 else if ((size(str) > max))
198198 then throw((str + " is too long"))
199199 else true
200200
201201
202202 func validateUser (caller) = {
203203 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
204204 if (if ((userStatus == userUnregistered))
205205 then true
206206 else (userStatus == userAllowed))
207207 then "Register this account first with \"Account\" tab"
208208 else if ((userStatus == userSuspended))
209209 then "Account suspended"
210210 else if ((userStatus == userRemoved))
211211 then "Account removed"
212212 else ""
213213 }
214214
215215
216216 func setLIcence (cidLicence,sha256Licence) = {
217217 let cid = if ((size(cidLicence) == 0))
218218 then defaultLicence
219219 else cidLicence
220220 let hash = if ((size(sha256Licence) == 0))
221221 then defaultHashLicence
222222 else sha256Licence
223223 $Tuple2(cid, hash)
224224 }
225225
226226
227227 func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,royalties) = {
228228 let checkUser = validateUser(caller)
229229 if ((checkUser != ""))
230230 then throw(checkUser)
231231 else if ((size(cidDisplay) == 0))
232232 then throw("Display CID cannot be empty")
233233 else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
234234 then throw("Problem with CID")
235235 else if (!(validateAllHash(sha256Export, licenceHash)))
236236 then throw("Problem with Hashes")
237237 else if (!(validateString(name, 100)))
238238 then throw("100 Char. max name")
239239 else if (!(validateString(description, 1000)))
240240 then throw("1000 Char. max description")
241241 else if (if ((0 > royalties))
242242 then true
243243 else (royalties > 1000))
244244 then throw("Royalties cannot be less than 0% or higher than 10%")
245245 else if ((size(split(tags, ",")) > 5))
246246 then throw("5 tags max.")
247247 else ""
248248 }
249249
250250
251251 func isPayment (i) = if ((size(i.payments) == 0))
252252 then throw("No payment attached")
253253 else {
254254 let payment = value(i.payments[0])
255255 let amount = value(payment.amount)
256256 $Tuple2(payment, amount)
257257 }
258258
259259
260260 func validatePayment (i) = {
261261 let $t091809216 = isPayment(i)
262262 let payment = $t091809216._1
263263 let amount = $t091809216._2
264264 let assetId = if (if (isDefined(payment.assetId))
265265 then (payment.assetId == signAssetId)
266266 else false)
267267 then payment.assetId
268268 else throw("Only SIGN token accepted as transaction fee")
269269 if ((amount != currentCertificationPrice))
270270 then throw(("Payment amount should be " + toString(currentCertificationPrice)))
271271 else $Tuple2(amount, assetId)
272272 }
273273
274274
275275 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
276276 case b: Int =>
277277 if ((b != 0))
278278 then true
279279 else false
280280 case _ =>
281281 false
282282 }
283283
284284
285285 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
286286 let $t098049840 = isPayment(i)
287287 let payment = $t098049840._1
288288 let amount = $t098049840._2
289289 let assetId = if (!(isDefined(payment.assetId)))
290290 then unit
291291 else if (if ((size(priceAssetId) > 0))
292292 then (toBase58String(value(payment.assetId)) == priceAssetId)
293293 else false)
294294 then payment.assetId
295295 else throw("Wrong asset id")
296296 if (if ((assetId == unit))
297297 then (priceAssetId != "")
298298 else false)
299299 then throw("Wrong asset id")
300300 else if ((artworkPrice != amount))
301301 then throw("Payment don't match")
302302 else $Tuple2(amount, assetId)
303303 }
304304
305305
306306 func acceptedAssetIds (assetId) = if (if (if (if (if ((assetId != toBase58String(signAssetId)))
307307 then (assetId != toBase58String(wavesAssetId))
308308 else false)
309309 then (assetId != "WAVES")
310310 else false)
311311 then (assetId != toBase58String(usdnAssetId))
312312 else false)
313313 then (assetId != toBase58String(usdtAssetId))
314314 else false)
315315 then throw("Only SIGN, USDN,USDT or WAVES accepted")
316316 else true
317317
318318
319319 func validateMinSell (assetId,price) = {
320320 let minSellWaves = if (unitTest)
321321 then 10
322322 else getIntegerByKeyFromOracle("waves_min_sell")
323323 let minSellUsdn = 1000000
324324 let minSellSign = if (unitTest)
325325 then 1
326326 else (currentCertificationPrice * 2)
327327 if (if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
328328 then (minSellUsdn > price)
329329 else false)
330330 then (price != 0)
331331 else false)
332332 then true
333333 else if (if ((assetId == toBase58String(usdtAssetId)))
334334 then (minSellUsdn > price)
335335 else false)
336336 then (price != 0)
337337 else false)
338338 then true
339339 else if (if ((assetId == toBase58String(signAssetId)))
340340 then (minSellSign > price)
341341 else false)
342342 then (price != 0)
343343 else false)
344344 then true
345345 else if (if (if ((assetId == toBase58String(wavesAssetId)))
346346 then true
347347 else (assetId == "WAVES"))
348348 then (minSellWaves > price)
349349 else false)
350350 then (price != 0)
351351 else false)
352352 then throw("Wrong minimum sell price")
353353 else true
354354 }
355355
356356
357357 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
358358 then unit
359359 else fromBase58String(assetId)
360360
361361
362362 func getPriceAssetIdFromBid (bidDataKey) = {
363363 let bidData = getStringByKey((bidDataKey + "_OPEN"))
364364 if ((bidData == ""))
365365 then throw("Bid not found")
366366 else {
367367 let bidDataArr = split(bidData, "_")
368368 let bidAmount = parseIntValue(bidDataArr[1])
369369 let bidAssetId = getBidAssetId(bidDataArr[0])
370370 if ((0 >= bidAmount))
371371 then throw("Wrong amount")
372372 else $Tuple2(bidAmount, bidAssetId)
373373 }
374374 }
375375
376376
377377 func idCallerDateSponsored (i,pubKey) = if (!(dappRunning))
378378 then throw(maintenanceMSG)
379379 else {
380380 let isSponsored = if ((pubKey != ""))
381381 then valueOrElse(checkWhitelist((toString(addressFromPublicKey(fromBase58String(pubKey))) + "_free_txs")), 0)
382382 else 0
383383 let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
384384 then (isSponsored > 0)
385385 else false)
386386 then toString(addressFromPublicKey(fromBase58String(pubKey)))
387387 else toBase58String(i.caller.bytes)
388- let get_sponsored_waves = if (if ((pubKey != ""))
389- then (isSponsored > 0)
390- else false)
391- then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
392- else unit
393- if ((get_sponsored_waves == get_sponsored_waves))
394- then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
388+ if ((caller == caller))
389+ then {
390+ let get_sponsored_waves = if (if ((pubKey != ""))
391+ then (isSponsored > 0)
392+ else false)
393+ then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
394+ else unit
395+ if ((get_sponsored_waves == get_sponsored_waves))
396+ then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
397+ else throw("Strict value is not equal to itself.")
398+ }
395399 else throw("Strict value is not equal to itself.")
396400 }
397401
398402
399403 func idCallerDate (i) = if (!(dappRunning))
400404 then throw(maintenanceMSG)
401405 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
402406
403407
404408 func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
405- let $t01304413133 = idCallerDateSponsored(i, pubKey)
406- let id = $t01304413133._1
407- let caller = $t01304413133._2
408- let date = $t01304413133._3
409- let isSponsored = $t01304413133._4
410- if (true)
411- then throw(((((((caller + " / ") + issuer) + " / ") + bidOwner) + " / ") + pubKey))
412- else {
413- let isBid = if (if (if ((caller == issuer))
414- then (bidOwner != "")
415- else false)
416- then (bidId != "")
417- else false)
418- then true
419- else false
420- let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
421- if (if (if ((blockEnd != 0))
422- then (height >= blockEnd)
423- else false)
424- then !(isBid)
425- else false)
426- then throw("Sale ended.")
409+ let $t01304713139 = idCallerDateSponsored(i, pubKey)
410+ if (($t01304713139 == $t01304713139))
411+ then {
412+ let isSponsored = $t01304713139._4
413+ let date = $t01304713139._3
414+ let caller = $t01304713139._2
415+ let id = $t01304713139._1
416+ if (true)
417+ then throw(((((((caller + " / ") + issuer) + " / ") + bidOwner) + " / ") + pubKey))
427418 else {
428- let callerIsIssuer = (caller == issuer)
429- let totalNFT = getIntegerByKey("total_nft_issued")
430- let signID = getStringByKey(keySignID(issuer, artId))
431- let artworkName = getStringByKey(keyName(issuer, artId))
432- if ((artworkName == ""))
433- then throw("Art doesn't exist")
419+ let isBid = if (if (if ((caller == issuer))
420+ then (bidOwner != "")
421+ else false)
422+ then (bidId != "")
423+ else false)
424+ then true
425+ else false
426+ let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
427+ if (if (if ((blockEnd != 0))
428+ then (height >= blockEnd)
429+ else false)
430+ then !(isBid)
431+ else false)
432+ then throw("Sale ended.")
434433 else {
435- let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
436- let amountSold = getIntegerByKey(keyIssued(issuer, artId))
437- let artworkPrice = if (callerIsIssuer)
438- then (currentCertificationPrice * 2)
439- else getIntegerByKey(keyPrice(issuer, artId))
440- let priceAssetId = if (callerIsIssuer)
441- then toBase58String(signAssetId)
442- else getStringByKey(keyAssetIdAccepted(issuer, artId))
443- let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
444- if (if (if (!(isBid))
445- then !(callerIsIssuer)
446- else false)
447- then if (if ((0 >= artworkPrice))
448- then true
449- else !(isOnSale))
450- then true
451- else (0 >= maxCanSell)
452- else false)
453- then throw("Art not for sale")
454- else if (if (if (!(isBid))
455- then callerIsIssuer
456- else false)
457- then (0 >= maxCanSell)
458- else false)
459- then throw("Max issuable not set")
460- else {
461- let checkUser = validateUser(issuer)
462- if (if (isBid)
463- then (checkUser != "")
434+ let callerIsIssuer = (caller == issuer)
435+ let totalNFT = getIntegerByKey("total_nft_issued")
436+ let signID = getStringByKey(keySignID(issuer, artId))
437+ let artworkName = getStringByKey(keyName(issuer, artId))
438+ if ((artworkName == ""))
439+ then throw("Art doesn't exist")
440+ else {
441+ let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
442+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
443+ let artworkPrice = if (callerIsIssuer)
444+ then (currentCertificationPrice * 2)
445+ else getIntegerByKey(keyPrice(issuer, artId))
446+ let priceAssetId = if (callerIsIssuer)
447+ then toBase58String(signAssetId)
448+ else getStringByKey(keyAssetIdAccepted(issuer, artId))
449+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
450+ if (if (if (!(isBid))
451+ then !(callerIsIssuer)
452+ else false)
453+ then if (if ((0 >= artworkPrice))
454+ then true
455+ else !(isOnSale))
456+ then true
457+ else (0 >= maxCanSell)
458+ else false)
459+ then throw("Art not for sale")
460+ else if (if (if (!(isBid))
461+ then callerIsIssuer
464462 else false)
465- then throw(checkUser)
463+ then (0 >= maxCanSell)
464+ else false)
465+ then throw("Max issuable not set")
466466 else {
467- let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
468- let $t01473614928 = if (isBid)
469- then getPriceAssetIdFromBid(bidDataKey)
470- else validatePriceAssetId(i, priceAssetId, artworkPrice)
471- let amount = $t01473614928._1
472- let assetId = $t01473614928._2
473- let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
474- let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
475- let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
476- let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
477- let isWhitelisted = checkWhitelist(issuer)
478- let cut = if ((isWhitelisted > height))
479- then 0
480- else if ((assetId == signAssetId))
481- then signCut
482- else usdnWaveCut
483- let amountForSign = fraction(amount, cut, 100)
484- let amountForAgent = if (if (if ((agent != feeReceiver))
485- then (agentShare > 0)
467+ let checkUser = validateUser(issuer)
468+ if (if (isBid)
469+ then (checkUser != "")
486470 else false)
487- then (height > isWhitelisted)
488- else false)
489- then fraction(amount, agentShare, 10000)
490- else 0
491- let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
492- then (publicAgentShare > 0)
493- else false)
494- then (height > isWhitelisted)
495- else false)
496- then fraction(amount, publicAgentShare, 10000)
497- else 0
498- let amountForCreator = (amount - amountForSign)
499- if ((amountSold == maxCanSell))
500- then throw("Art sold out")
471+ then throw(checkUser)
501472 else {
502- let newAmountSold = (amountSold + 1)
503- let issueMeta = ((((((((((("Creator: " + issuer) + ",
473+ let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
474+ let $t01474214934 = if (isBid)
475+ then getPriceAssetIdFromBid(bidDataKey)
476+ else validatePriceAssetId(i, priceAssetId, artworkPrice)
477+ let amount = $t01474214934._1
478+ let assetId = $t01474214934._2
479+ let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
480+ let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
481+ let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
482+ let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
483+ let isWhitelisted = checkWhitelist(issuer)
484+ let cut = if ((isWhitelisted > height))
485+ then 0
486+ else if ((assetId == signAssetId))
487+ then signCut
488+ else usdnWaveCut
489+ let amountForSign = fraction(amount, cut, 100)
490+ let amountForAgent = if (if (if ((agent != feeReceiver))
491+ then (agentShare > 0)
492+ else false)
493+ then (height > isWhitelisted)
494+ else false)
495+ then fraction(amount, agentShare, 10000)
496+ else 0
497+ let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
498+ then (publicAgentShare > 0)
499+ else false)
500+ then (height > isWhitelisted)
501+ else false)
502+ then fraction(amount, publicAgentShare, 10000)
503+ else 0
504+ let amountForCreator = (amount - amountForSign)
505+ if ((amountSold == maxCanSell))
506+ then throw("Art sold out")
507+ else {
508+ let newAmountSold = (amountSold + 1)
509+ let issueMeta = ((((((((((("Creator: " + issuer) + ",
504510 ArtID: ") + artId) + ",
505511 SignID: ") + signID) + ",
506512 Artwork name: ") + artworkName) + ",
507513 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
508- let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
509- let idNFT = calculateAssetId(issueNFT)
510- let sellStatus = if (if ((newAmountSold == maxCanSell))
511- then true
512- else !(isOnSale))
513- then false
514- else true
515- let receiveNFT = if (if (if ((caller == issuer))
516- then (bidOwner != "")
517- else false)
518- then (bidId != "")
519- else false)
520- then addressFromStringValue(bidOwner)
521- else i.caller
522- let assetIdBid = if (!(isDefined(assetId)))
523- then "WAVES"
524- else toBase58String(value(assetId))
525- let bidData = getStringByKey((bidDataKey + "_OPEN"))
526- let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
527- let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
528- let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
529- let soldValue = if (!(isBid))
530- then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
531- else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
532- let soldData = StringEntry(soldKey, soldValue)
533- let commissionsWithAgent = if ((amountForAgent != 0))
534- then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
535- else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
536- let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
537- then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
538- else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
539- let txToCaller = if (isSponsored)
540- then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
541- else nil
542- let buyRes = ((([IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissionsWithAgent) ++ commissionsWithPublicAgent) ++ txToCaller)
543- if (isBid)
544- then [soldData, bidUpdate, bidDelOld] :: buyRes
545- else soldData :: buyRes
514+ let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
515+ let idNFT = calculateAssetId(issueNFT)
516+ let sellStatus = if (if ((newAmountSold == maxCanSell))
517+ then true
518+ else !(isOnSale))
519+ then false
520+ else true
521+ let receiveNFT = if (if (if ((caller == issuer))
522+ then (bidOwner != "")
523+ else false)
524+ then (bidId != "")
525+ else false)
526+ then addressFromStringValue(bidOwner)
527+ else i.caller
528+ let assetIdBid = if (!(isDefined(assetId)))
529+ then "WAVES"
530+ else toBase58String(value(assetId))
531+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
532+ let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
533+ let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
534+ let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
535+ let soldValue = if (!(isBid))
536+ then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
537+ else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
538+ let soldData = StringEntry(soldKey, soldValue)
539+ let commissionsWithAgent = if ((amountForAgent != 0))
540+ then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
541+ else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
542+ let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
543+ then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
544+ else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
545+ let txToCaller = if (isSponsored)
546+ then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
547+ else nil
548+ let buyRes = ((([IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissionsWithAgent) ++ commissionsWithPublicAgent) ++ txToCaller)
549+ if (isBid)
550+ then [soldData, bidUpdate, bidDelOld] :: buyRes
551+ else soldData :: buyRes
552+ }
546553 }
547554 }
548- }
555+ }
549556 }
550557 }
551558 }
559+ else throw("Strict value is not equal to itself.")
552560 }
553561
554562
555563 func asString (bv) = match bv {
556564 case bv0: String =>
557565 bv0
558566 case _ =>
559567 throw("Sponsored Public Key String expected")
560568 }
561569
562570
563571 @Callable(invoke)
564572 func setConf (key,val) = {
565573 let caller = toString(invoke.caller)
566574 if (containsElement([chris, toString(this)], caller))
567575 then if (contains(key, "conf_"))
568576 then [StringEntry(key, val)]
569577 else throw("Entries starting with conf_ only")
570578 else throw("You are not allowed to change this")
571579 }
572580
573581
574582
575583 @Callable(i)
576584 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
577- let $t02010420177 = idCallerDateSponsored(i, pubKey)
578- let artId = $t02010420177._1
579- let caller = $t02010420177._2
580- let date = $t02010420177._3
581- let isSponsored = $t02010420177._4
585+ let $t02011020183 = idCallerDateSponsored(i, pubKey)
586+ let artId = $t02011020183._1
587+ let caller = $t02011020183._2
588+ let date = $t02011020183._3
589+ let isSponsored = $t02011020183._4
582590 if (!(validateHash(sha256Hash)))
583591 then throw("Hash should be 64 characters maximum")
584592 else {
585- let $t02027820347 = setLIcence(cidLicence, sha256Licence)
586- let licenceCID = $t02027820347._1
587- let licenceHash = $t02027820347._2
593+ let $t02028420353 = setLIcence(cidLicence, sha256Licence)
594+ let licenceCID = $t02028420353._1
595+ let licenceHash = $t02028420353._2
588596 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
589597 if ((validateArtwork != ""))
590598 then throw("Something went wrong!")
591599 else {
592600 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
593- let $t02064620730 = if (whitelisted_drop)
601+ let $t02065220736 = if (whitelisted_drop)
594602 then $Tuple2(0, signID)
595603 else validatePayment(i)
596- let amount = $t02064620730._1
597- let assetId = $t02064620730._2
604+ let amount = $t02065220736._1
605+ let assetId = $t02065220736._2
598606 if (!(isDefined(amount)))
599607 then throw("Something went wrong")
600608 else {
601609 let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
602610 if ((entryExist != ""))
603611 then throw("You already added it")
604612 else {
605613 let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
606614 if ((hashExist != ""))
607615 then throw("Hash already registered")
608616 else {
609617 let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
610618 if (!(isSignCertified))
611619 then throw("Sign Certificate not found for this address.")
612620 else {
613621 let decrease_whitelist_drop = if (whitelisted_drop)
614622 then invoke(whitelistDapp, "useFreeDrop", [caller], nil)
615623 else unit
616624 if ((decrease_whitelist_drop == decrease_whitelist_drop))
617625 then {
618626 let txToCaller = if (isSponsored)
619627 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
620628 else nil
621629 ([StringEntry(keyOwnerByHash(sha256Hash), caller), StringEntry(keyTxidByHashOwner(sha256Hash, caller), artId), IntegerEntry(keyDate(caller, artId), date), StringEntry(keyName(caller, artId), name), StringEntry(keyDesc(caller, artId), description), StringEntry(keyDisplayCid(caller, artId), cidDisplay), StringEntry(keyExportCid(caller, artId), cidExport), StringEntry(keyExportHash(caller, artId), sha256Export), StringEntry(keyLicenceHash(caller, artId), licenceHash), StringEntry(keyLicenceCid(caller, artId), licenceCID), StringEntry(keyType(caller, artId), type), StringEntry(keyTags(caller, artId), tags), IntegerEntry(keyMaxMint(caller, artId), 0), StringEntry(keySignID(caller, artId), signID), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyidBySignid(caller, signID), artId), StringEntry(keyHashByTxidAddr(caller, artId), sha256Hash), StringEntry(keyCrawler(caller, artId), crawler), IntegerEntry(keyRoyalties(caller, artId), royalties), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, signAssetId)] ++ txToCaller)
622630 }
623631 else throw("Strict value is not equal to itself.")
624632 }
625633 }
626634 }
627635 }
628636 }
629637 }
630638 }
631639
632640
633641
634642 @Callable(i)
635643 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
636644 then throw(maintenanceMSG)
637645 else {
638- let $t02376423834 = idCallerDateSponsored(i, pubKey)
639- let id = $t02376423834._1
640- let caller = $t02376423834._2
641- let date = $t02376423834._3
642- let isSponsored = $t02376423834._4
643- let $t02384423913 = setLIcence(cidLicence, sha256Licence)
644- let licenceCID = $t02384423913._1
645- let licenceHash = $t02384423913._2
646+ let $t02377023840 = idCallerDateSponsored(i, pubKey)
647+ let id = $t02377023840._1
648+ let caller = $t02377023840._2
649+ let date = $t02377023840._3
650+ let isSponsored = $t02377023840._4
651+ let $t02385023919 = setLIcence(cidLicence, sha256Licence)
652+ let licenceCID = $t02385023919._1
653+ let licenceHash = $t02385023919._2
646654 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
647655 if ((validateArtwork != ""))
648656 then throw("Something went wrong!")
649657 else {
650658 let entryExist = getStringByKey(keyName(caller, txid))
651659 if ((entryExist == ""))
652660 then throw("Entry not found")
653661 else {
654662 let flag = getStringByKey(keyFlag(caller, txid))
655663 if ((flag == "ILLEGAL"))
656664 then throw("Cannot update ILLEGAL artwork")
657665 else if (!(isArtMinted(caller, txid)))
658666 then {
659667 let txToCaller = if (isSponsored)
660668 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
661669 else nil
662670 ([StringEntry(keyName(caller, txid), name), StringEntry(keyDesc(caller, txid), description), StringEntry(keyDisplayCid(caller, txid), cidDisplay), StringEntry(keyExportCid(caller, txid), cidExport), StringEntry(keyExportHash(caller, txid), sha256Export), StringEntry(keyLicenceCid(caller, txid), licenceCID), StringEntry(keyLicenceHash(caller, txid), licenceHash), StringEntry(keyTags(caller, txid), tags), StringEntry(keyType(caller, txid), type), StringEntry(keyCrawler(caller, txid), crawler), IntegerEntry(keyRoyalties(caller, txid), royalties)] ++ txToCaller)
663671 }
664672 else throw("Already minted")
665673 }
666674 }
667675 }
668676
669677
670678
671679 @Callable(i)
672680 func flagArtwork (artId,addr,flag,note) = {
673- let $t02554025574 = idCallerDate(i)
674- let id = $t02554025574._1
675- let caller = $t02554025574._2
681+ let $t02554625580 = idCallerDate(i)
682+ let id = $t02554625580._1
683+ let caller = $t02554625580._2
676684 if (containsElement([chris, toString(this)], caller))
677685 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
678686 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
679687 else throw(("Unknow status " + flag))
680688 else throw("You are not allowed")
681689 }
682690
683691
684692
685693 @Callable(i)
686694 func deleteArtwork (artId,addr) = {
687- let $t02601026044 = idCallerDate(i)
688- let id = $t02601026044._1
689- let caller = $t02601026044._2
695+ let $t02601626050 = idCallerDate(i)
696+ let id = $t02601626050._1
697+ let caller = $t02601626050._2
690698 let addrToUse = if (containsElement([chris, toString(this)], caller))
691699 then addr
692700 else caller
693701 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
694702 if ((entryExist == ""))
695703 then throw("No art matching for this address")
696704 else {
697705 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
698706 if ((sha256Hash == ""))
699707 then throw("No art hash matching for this address")
700708 else {
701709 let signID = getStringByKey(keySignID(addrToUse, artId))
702710 if ((signID == ""))
703711 then throw("No SIGN ID matching")
704712 else {
705713 let dataToDelete = [DeleteEntry(keyDate(addrToUse, artId)), DeleteEntry(keyName(addrToUse, artId)), DeleteEntry(keyDesc(addrToUse, artId)), DeleteEntry(keyDisplayCid(addrToUse, artId)), DeleteEntry(keyExportCid(addrToUse, artId)), DeleteEntry(keyExportHash(addrToUse, artId)), DeleteEntry(keyLicenceHash(addrToUse, artId)), DeleteEntry(keyLicenceCid(addrToUse, artId)), DeleteEntry(keyType(addrToUse, artId)), DeleteEntry(keyTags(addrToUse, artId)), DeleteEntry(keyMaxMint(addrToUse, artId)), DeleteEntry(keySignID(addrToUse, artId)), DeleteEntry(keyIssued(addrToUse, artId)), DeleteEntry(keyOnSale(addrToUse, artId)), DeleteEntry(keyFlag(addrToUse, artId)), DeleteEntry(keyPrice(addrToUse, artId)), DeleteEntry(keyAssetIdAccepted(addrToUse, artId)), DeleteEntry(keyOwnerByHash(sha256Hash)), DeleteEntry(keyidBySignid(addrToUse, signID)), DeleteEntry(keyTxidByHashOwner(sha256Hash, addrToUse)), DeleteEntry(keyEndSale(addrToUse, artId)), DeleteEntry(keyNote(addrToUse, artId)), DeleteEntry(keyCrawler(addrToUse, artId)), DeleteEntry(keyRoyalties(addrToUse, artId))]
706714 if (!(isArtMinted(addrToUse, artId)))
707715 then if (!(dappRunning))
708716 then throw(maintenanceMSG)
709717 else dataToDelete
710718 else if (containsElement([chris, toString(this)], caller))
711719 then dataToDelete
712720 else throw("Art already minted, you cannot delete it")
713721 }
714722 }
715723 }
716724 }
717725
718726
719727
720728 @Callable(i)
721729 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
722- let $t02888028950 = idCallerDateSponsored(i, pubKey)
723- let id = $t02888028950._1
724- let caller = $t02888028950._2
725- let date = $t02888028950._3
726- let isSponsored = $t02888028950._4
730+ let $t02888628956 = idCallerDateSponsored(i, pubKey)
731+ let id = $t02888628956._1
732+ let caller = $t02888628956._2
733+ let date = $t02888628956._3
734+ let isSponsored = $t02888628956._4
727735 let artworkName = getStringByKey(keyName(caller, artId))
728736 if ((artworkName == ""))
729737 then throw("This art doesn't match your account")
730738 else {
731739 let flag = getStringByKey(keyFlag(caller, artId))
732740 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
733741 then throw("Flagged artwork")
734742 else {
735743 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
736744 if ((0 > blockEnd))
737745 then throw("Negative end")
738746 else if (if ((blockEnd > 0))
739747 then if ((maxMint != 1))
740748 then true
741749 else (price != 0)
742750 else false)
743751 then throw("Timed offer only allowed for unique edition and offer only")
744752 else {
745753 let baseHeight = if ((blockEnd == 0))
746754 then 0
747755 else height
748756 if (!(acceptedAssetIds(assetId)))
749757 then throw("Something went wrong!")
750758 else if (!(validateMinSell(assetId, price)))
751759 then throw("Something went wrong!")
752760 else {
753761 let checkUser = validateUser(caller)
754762 if ((checkUser != ""))
755763 then throw(checkUser)
756764 else {
757765 let amountSold = getIntegerByKey(keyIssued(caller, artId))
758766 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
759767 if ((maxMint > 100))
760768 then throw("100 editions max per artwork")
761769 else if (if ((amountSold != 0))
762770 then (amountSold == maxCanSell)
763771 else false)
764772 then throw("Max edition reached.")
765773 else if (if ((amountSold > 0))
766774 then (maxCanSell != maxMint)
767775 else false)
768776 then throw("Cannot change maximum issuable anymore")
769777 else if (if ((bidNbr > 0))
770778 then (maxCanSell != maxMint)
771779 else false)
772780 then throw("Cannot change maximum issuable with active orders")
773781 else {
774782 let sellStatus = if (if ((price > 0))
775783 then (maxMint > 0)
776784 else false)
777785 then true
778786 else false
779787 let txToCaller = if (isSponsored)
780788 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
781789 else nil
782790 ([BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), StringEntry(keyAssetIdAccepted(caller, artId), assetId), IntegerEntry(keyEndSale(caller, artId), (baseHeight + blockEnd))] ++ txToCaller)
783791 }
784792 }
785793 }
786794 }
787795 }
788796 }
789797 }
790798
791799
792800
793801 @Callable(i)
794802 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", "")
795803
796804
797805
798806 @Callable(i)
799807 func setBid (artId,issuer) = {
800- let $t03133231372 = idCallerDate(i)
801- let id = $t03133231372._1
802- let caller = $t03133231372._2
803- let date = $t03133231372._3
804- let $t03137731413 = isPayment(i)
805- let payment = $t03137731413._1
806- let amount = $t03137731413._2
808+ let $t03133831378 = idCallerDate(i)
809+ let id = $t03133831378._1
810+ let caller = $t03133831378._2
811+ let date = $t03133831378._3
812+ let $t03138331419 = isPayment(i)
813+ let payment = $t03138331419._1
814+ let amount = $t03138331419._2
807815 let assetId = if (!(isDefined(payment.assetId)))
808816 then "WAVES"
809817 else toBase58String(value(payment.assetId))
810818 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
811819 if (if ((blockEnd != 0))
812820 then (height >= blockEnd)
813821 else false)
814822 then throw("Sale ended.")
815823 else {
816824 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
817825 if (!(acceptedAssetIds(assetId)))
818826 then throw("asset not accepted")
819827 else if (!(validateMinSell(assetId, amount)))
820828 then throw("Wrong min sell")
821829 else {
822830 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
823831 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
824832 if ((0 >= maxCanSell))
825833 then throw("No max edition set for this artwork")
826834 else if ((amountSold >= maxCanSell))
827835 then throw("Sold out, you cannot bid")
828836 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
829837 }
830838 }
831839 }
832840
833841
834842
835843 @Callable(i)
836844 func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = {
837- let $t03263332704 = idCallerDateSponsored(i, pubKey)
838- let id = $t03263332704._1
839- let caller1 = $t03263332704._2
840- let date = $t03263332704._3
841- let isSponsored = $t03263332704._4
845+ let $t03263932710 = idCallerDateSponsored(i, pubKey)
846+ let id = $t03263932710._1
847+ let caller1 = $t03263932710._2
848+ let date = $t03263932710._3
849+ let isSponsored = $t03263932710._4
842850 if ((caller1 != issuer))
843851 then throw("You cannot do this action")
844852 else buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
845853 }
846854
847855
848856
849857 @Callable(i)
850858 func cancelBid (artId,issuer,bidId,bidOwner) = {
851- let $t03293933000 = idCallerDate(i)
852- let id = $t03293933000._1
853- let caller = $t03293933000._2
854- let date = $t03293933000._3
859+ let $t03294533006 = idCallerDate(i)
860+ let id = $t03294533006._1
861+ let caller = $t03294533006._2
862+ let date = $t03294533006._3
855863 if (if ((caller != bidOwner))
856864 then (caller != issuer)
857865 else false)
858866 then throw("You cannot do this action")
859867 else {
860868 let returnMoneyTo = if ((caller == issuer))
861869 then bidOwner
862870 else caller
863871 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
864872 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
865873 let bidData = getStringByKey((bidDataKey + "_OPEN"))
866874 if ((bidData == ""))
867875 then throw("Bid not found")
868876 else {
869877 let bidDataArr = split(bidData, "_")
870878 let assetId = getBidAssetId(bidDataArr[0])
871879 let bidStatus = "CANCELED"
872880 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
873881 }
874882 }
875883 }
876884
877885
878886 @Verifier(tx)
879887 func verifier () = match tx {
880888 case inv: InvokeScriptTransaction =>
881889 if (if (if (if ((inv.function == "addArtwork"))
882890 then (inv.dApp == this)
883891 else false)
884892 then (inv.fee == 500000)
885893 else false)
886894 then (inv.feeAssetId == unit)
887895 else false)
888896 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[13])))
889897 else if (if (if (if ((inv.function == "updateArtwork"))
890898 then (inv.dApp == this)
891899 else false)
892900 then (inv.fee == 500000)
893901 else false)
894902 then (inv.feeAssetId == unit)
895903 else false)
896904 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
897905 else if (if (if (if ((inv.function == "sellArtwork"))
898906 then (inv.dApp == this)
899907 else false)
900908 then (inv.fee == 500000)
901909 else false)
902910 then (inv.feeAssetId == unit)
903911 else false)
904912 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
905913 else if (if (if (if ((inv.function == "acceptBid"))
906914 then (inv.dApp == this)
907915 else false)
908916 then (inv.fee == 500000)
909917 else false)
910918 then (inv.feeAssetId == unit)
911919 else false)
912920 then sigVerify_128Kb(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[4])))
913921 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
914922 case _ =>
915923 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
916924 }
917925

github/deemru/w8io/873ac7e 
137.02 ms