tx · 21ShvRyKzTdF21hRKhh696EKv42ysnqTFoHC7JpfjwQX

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.01900000 Waves

2023.03.24 06:27 [2503547] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "21ShvRyKzTdF21hRKhh696EKv42ysnqTFoHC7JpfjwQX", "fee": 1900000, "feeAssetId": null, "timestamp": 1679628471864, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "48HghycSw8oftFjMY8uygkSHeuqMPpCea5eLG8i3JtMfrP8N4jT7ZLGfbNJEfyV3pgKjYC3YLuAhEmX4eVdUHQah" ], "script": "base64:BgL1FAgCEgQKAggIEhAKDggICAgICAgICAgICAEIEg8KDQgICAgICAgICAgIAQgSBgoECAgICBIECgIICBIICgYIAQEIAQgSBAoCCAgSBAoCCAgSBwoFCAgICAgSBgoECAgICCIOZ2V0U3RyaW5nQnlLZXkiA2tleSIIdW5pdFRlc3QiCW9yYWNsZUZlZSIIc2lnbkRhcHAiC2ZlZVJlY2VpdmVyIgh1c2VyRGFwcCINd2hpdGVsaXN0RGFwcCILc2lnbkFzc2V0SWQiC3VzZG5Bc3NldElkIgt1c2R0QXNzZXRJZCIMd2F2ZXNBc3NldElkIgVjaHJpcyIZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZSIPZ2V0SW50ZWdlckJ5S2V5Ig5jaGVja1doaXRlbGlzdCIPZ2V0Qm9vbGVhbkJ5S2V5IgdzaWduQ3V0Igt1c2RuV2F2ZUN1dCIOZGVmYXVsdExpY2VuY2UiEmRlZmF1bHRIYXNoTGljZW5jZSILZGFwcFJ1bm5pbmciDm1haW50ZW5hbmNlTVNHIg11c2VyU3VzcGVuZGVkIgt1c2VyUmVtb3ZlZCIQdXNlclVucmVnaXN0ZXJlZCILdXNlckFsbG93ZWQiGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UiFGNoZWNrU2lnbkNlcnRpZmljYXRlIgZzaWduSUQiBU93bmVyIgpzaGEyNTZIYXNoIgckbWF0Y2gwIgFhIgt2YWxpZGF0ZUNJRCIDY2lkIgx2YWxpZGF0ZUhhc2giBGhhc2giDWtleVVzZXJTdGF0dXMiBmNhbGxlciIHa2V5RGF0ZSIFYXJ0SWQiB2tleU5hbWUiB2tleURlc2MiDWtleURpc3BsYXlDaWQiDWtleUV4cG9ydEhhc2giDGtleUV4cG9ydENpZCIKa2V5TWF4TWludCIJa2V5U2lnbklEIglrZXlJc3N1ZWQiCWtleU9uU2FsZSIOa2V5TGljZW5jZUhhc2giDWtleUxpY2VuY2VDaWQiB2tleVRhZ3MiB2tleVR5cGUiB2tleU5vdGUiCmtleUNyYXdsZXIiDGtleVJveWFsdGllcyIIa2V5UHJpY2UiCmtleUVuZFNhbGUiEmtleUFzc2V0SWRBY2NlcHRlZCIHa2V5RmxhZyISa2V5QXJ0aXN0QWdlbnRBZGRyIgphcnRpc3RBZGRyIhRrZXlQcmltYXJ5U2hhcmVBZ2VudCIYa2V5QXJ0aXN0UHVibGljQWdlbnRBZGRyIhprZXlQcmltYXJ5U2hhcmVQdWJsaWNBZ2VudCIRa2V5SGFzaEJ5VHhpZEFkZHIiBHR4aWQiDmtleU93bmVyQnlIYXNoIg1rZXlpZEJ5U2lnbmlkIgZzaWduSWQiEmtleVR4aWRCeUhhc2hPd25lciIOdmFsaWRhdGVBbGxDSUQiCmNpZERpc3BsYXkiCWNpZEV4cG9ydCIKY2lkTGljZW5jZSIPdmFsaWRhdGVBbGxIYXNoIgxzaGEyNTZFeHBvcnQiDXNoYTI1NkxpY2VuY2UiDnZhbGlkYXRlU3RyaW5nIgNzdHIiA21heCIMdmFsaWRhdGVVc2VyIgp1c2VyU3RhdHVzIgpzZXRMSWNlbmNlIhN2YWxpZGF0ZUFydHdvcmtEYXRhIgpsaWNlbmNlQ0lEIgtsaWNlbmNlSGFzaCIEbmFtZSILZGVzY3JpcHRpb24iBHRhZ3MiCXJveWFsdGllcyIJY2hlY2tVc2VyIglpc1BheW1lbnQiAWkiB3BheW1lbnQiBmFtb3VudCIPdmFsaWRhdGVQYXltZW50IgskdDA5MTgwOTIxNiIHYXNzZXRJZCILaXNBcnRNaW50ZWQiCWFkZHJUb1VzZSIBYiIUdmFsaWRhdGVQcmljZUFzc2V0SWQiDHByaWNlQXNzZXRJZCIMYXJ0d29ya1ByaWNlIgskdDA5ODA0OTg0MCIQYWNjZXB0ZWRBc3NldElkcyIPdmFsaWRhdGVNaW5TZWxsIgVwcmljZSIMbWluU2VsbFdhdmVzIgttaW5TZWxsVXNkbiILbWluU2VsbFNpZ24iDWdldEJpZEFzc2V0SWQiFmdldFByaWNlQXNzZXRJZEZyb21CaWQiCmJpZERhdGFLZXkiB2JpZERhdGEiCmJpZERhdGFBcnIiCWJpZEFtb3VudCIKYmlkQXNzZXRJZCIVaWRDYWxsZXJEYXRlU3BvbnNvcmVkIgZwdWJLZXkiC2lzU3BvbnNvcmVkIhNnZXRfc3BvbnNvcmVkX3dhdmVzIgxpZENhbGxlckRhdGUiB2J1eU1pbnQiBmlzc3VlciIFYmlkSWQiCGJpZE93bmVyIg0kdDAxMzE1MzEzMjQyIgJpZCIEZGF0ZSIFaXNCaWQiCGJsb2NrRW5kIg5jYWxsZXJJc0lzc3VlciIIdG90YWxORlQiC2FydHdvcmtOYW1lIghpc09uU2FsZSIKYW1vdW50U29sZCIKbWF4Q2FuU2VsbCINJHQwMTQ4NDUxNTAzNyIFYWdlbnQiCmFnZW50U2hhcmUiC3B1YmxpY0FnZW50IhBwdWJsaWNBZ2VudFNoYXJlIg1pc1doaXRlbGlzdGVkIgNjdXQiDWFtb3VudEZvclNpZ24iDmFtb3VudEZvckFnZW50IhRhbW91bnRGb3JQdWJsaWNBZ2VudCIQYW1vdW50Rm9yQ3JlYXRvciINbmV3QW1vdW50U29sZCIJaXNzdWVNZXRhIghpc3N1ZU5GVCIFaWRORlQiCnNlbGxTdGF0dXMiCnJlY2VpdmVORlQiCmFzc2V0SWRCaWQiCWJpZERlbE9sZCIJYmlkVXBkYXRlIgdzb2xkS2V5Iglzb2xkVmFsdWUiCHNvbGREYXRhIhRjb21taXNzaW9uc1dpdGhBZ2VudCIaY29tbWlzc2lvbnNXaXRoUHVibGljQWdlbnQiCnR4VG9DYWxsZXIiBmJ1eVJlcyIIYXNTdHJpbmciAmJ2IgNidjAiBmludm9rZSIDdmFsIgR0eXBlIgdjcmF3bGVyIg0kdDAyMDIxMzIwMjg2Ig0kdDAyMDM4NzIwNDU2Ig92YWxpZGF0ZUFydHdvcmsiEHdoaXRlbGlzdGVkX2Ryb3AiDSR0MDIwNzU1MjA4MzkiCmVudHJ5RXhpc3QiCWhhc2hFeGlzdCIPaXNTaWduQ2VydGlmaWVkIhdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcCINJHQwMjM4NzMyMzk0MyINJHQwMjM5NTMyNDAyMiIEZmxhZyIEYWRkciIEbm90ZSINJHQwMjU2NDkyNTY4MyINJHQwMjYxMTkyNjE1MyIMZGF0YVRvRGVsZXRlIgdtYXhNaW50Ig0kdDAyODk4OTI5MDU5IgZiaWROYnIiCmJhc2VIZWlnaHQiDSR0MDMxNDQxMzE0ODEiDSR0MDMxNDg2MzE1MjIiDSR0MDMyNzQyMzI4MTIiDSR0MDMzMDQ2MzMxMDciDXJldHVybk1vbmV5VG8iCWJpZFN0YXR1cyICdHgiCHZlcmlmaWVyIgNpbnZOAQFhAQFiCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFAWICAAABYwcAAWQJAQV2YWx1ZQEJAKYIAQkBAWEBAg9jb25mX29yYWNsZV9mZWUAAWUJAQV2YWx1ZQEJAKYIAQkBAWEBAhFjb25mX3NpZ253ZWJfZGFwcAABZgkBAWEBAhFjb25mX2ZlZV9yZWNlaXZlcgABZwMFAWMJAQV2YWx1ZQEJAKYIAQIjM010NFJHTUV5alNXWUFvY1RQcWQ1NXdkSFFRQjNQVTJVQ20JAQV2YWx1ZQEJAKYIAQkBAWEBAg9jb25mX3VzZXJzX2RhcHAAAWgJAQV2YWx1ZQEJAKYIAQkBAWEBAhNjb25mX3doaXRlbGlzdF9kYXBwAAFpCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9TSUdOAAFqCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9VU0ROAAFrCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9VU0RUAAFsAQAAAW0JAQFhAQIMY29uZl9hZG1pbl8xAQFuAQFiCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUBZAUBYgIfSW50ZWdlciB1bmRlZmluZSBvciAwIGluIG9yYWNsZQEBbwEBYgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFiAAABAXABAWIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUBaAUBYgAAAQFxAQFiCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFAWIHAAFyAAcAAXMACgABdAkBAWEBAhRjb25mX2RlZmF1bHRfbGljZW5jZQABdQkBAWEBAhljb25mX2RlZmF1bHRfbGljZW5jZV9oYXNoAAF2CQELdmFsdWVPckVsc2UCCQCbCAIFAWcCFGNvbmZfZGFwcF9pc19ydW5uaW5nBgABdwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQFnAhRjb25mX21haW50ZW5hbmNlX21zZwIAAAF4AglTVVNQRU5ERUQAAXkCB1JFTU9WRUQAAXoCDFVOUkVHSVNURVJFRAABQQIHQUxMT1dFRAABQgkBAW4BCQCsAgICEmNlcnRpZmljYXRpb25fZmVlXwkA2AQBBQFpAQFDAwFEAUUBRgQBRwkAnQgCBQFlCQCsAgIJAKwCAgkArAICAghkYXRhX2ZjXwUBRAIBXwUBRQMJAAECBQFHAgZTdHJpbmcEAUgFAUcDCQEIY29udGFpbnMCBQFIBQFGBgcHAQFJAQFKAwkBCGNvbnRhaW5zAgUBSgIBLwMDCQBmAgBMCQCxAgEFAUoJAAACCQCxAgEJAJEDAgkAtQkCBQFKAgEvAAAAOwcJAGYCABAJALECAQkAkQMCCQC1CQIFAUoCAS8AAQcHAQFLAQFMCQAAAgkAsQIBBQFMAEABAU0BAU4JAKwCAgIMdXNlcl9zdGF0dXNfBQFOAQFPAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF9kYXRlXwUBUAIBXwUBTgEBUQIBTgFQCQCsAgIJAKwCAgkArAICAglhcnRfbmFtZV8FAVACAV8FAU4BAVICAU4BUAkArAICCQCsAgIJAKwCAgIJYXJ0X2Rlc2NfBQFQAgFfBQFOAQFTAgFOAVAJAKwCAgkArAICCQCsAgICEGFydF9kaXNwbGF5X2NpZF8FAVACAV8FAU4BAVQCAU4BUAkArAICCQCsAgIJAKwCAgIQYXJ0X2V4cG9ydF9oYXNoXwUBUAIBXwUBTgEBVQIBTgFQCQCsAgIJAKwCAgkArAICAg9hcnRfZXhwb3J0X2NpZF8FAVACAV8FAU4BAVYCAU4BUAkArAICCQCsAgIJAKwCAgIMYXJ0X21heG1pbnRfBQFQAgFfBQFOAQFXAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9zaWduaWRfBQFQAgFfBQFOAQFYAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9pc3N1ZWRfBQFQAgFfBQFOAQFZAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9vbnNhbGVfBQFQAgFfBQFOAQFaAgFOAVAJAKwCAgkArAICCQCsAgICEWFydF9saWNlbmNlX2hhc2hfBQFQAgFfBQFOAQJhYQIBTgFQCQCsAgIJAKwCAgkArAICAhBhcnRfbGljZW5jZV9jaWRfBQFQAgFfBQFOAQJhYgIBTgFQCQCsAgIJAKwCAgkArAICAglhcnRfdGFnc18FAVACAV8FAU4BAmFjAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF90eXBlXwUBUAIBXwUBTgECYWQCAU4BUAkArAICCQCsAgIJAKwCAgIJYXJ0X25vdGVfBQFQAgFfBQFOAQJhZQIBTgFQCQCsAgIJAKwCAgkArAICAhBhcnRfY3Jhd2xlcl9jaWRfBQFQAgFfBQFOAQJhZgIBTgFQCQCsAgIJAKwCAgkArAICAg5hcnRfcm95YWx0aWVzXwUBUAIBXwUBTgECYWcCAU4BUAkArAICCQCsAgIJAKwCAgIKYXJ0X3ByaWNlXwUBUAIBXwUBTgECYWgCAU4BUAkArAICCQCsAgIJAKwCAgIMYXJ0X2VuZHNhbGVfBQFQAgFfBQFOAQJhaQIBTgFQCQCsAgIJAKwCAgkArAICAhJhcnRfYXNzZXRBY2NlcHRlZF8FAVACAV8FAU4BAmFqAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF9mbGFnXwUBUAIBXwUBTgECYWsBAmFsCQCsAgICDWFydGlzdF9hZ2VudF8FAmFsAQJhbQECYWwJAKwCAgIVYXJ0aXN0X2FnZW50X3ByaW1hcnlfBQJhbAECYW4BAmFsCQCsAgICFGFydGlzdF9wdWJsaWNfYWdlbnRfBQJhbAECYW8BAmFsCQCsAgICHGFydGlzdF9wdWJsaWNfYWdlbnRfcHJpbWFyeV8FAmFsAQJhcAIBTgJhcQkArAICCQCsAgIJAKwCAgITZ2V0X2hhc2hieXR4aWRhZGRyXwUCYXECAV8FAU4BAmFyAQFGCQCsAgICEmdldF9vd25lcl9ieV9oYXNoXwUBRgECYXMCAU4CYXQJAKwCAgkArAICCQCsAgICEmdldF9hcnRpZGJ5c2lnbmlkXwUCYXQCAV8FAU4BAmF1AgFGAU4JAKwCAgIXZ2V0X3R4aWRfYnlfaGFzaF9vd25lcl8JANgEAQkA1BYBCQCbAwEJAKwCAgUBRgUBTgECYXYDAmF3AmF4AmF5AwkBASEBCQEBSQEFAmF3CQACAQIRV3JvbmcgRGlzcGxheSBDSUQDCQEBIQEJAQFJAQUCYXgJAAIBAhBXcm9uZyBFeHBvcnQgQ0lEAwMJAQIhPQIFAmF5AgAJAQEhAQkBAUkBBQJheQcJAAIBAhFXcm9uZyBMaWNlbmNlIENJRAYBAmF6AgJhQQJhQgMJAQEhAQkBAUsBBQJhQQkAAgECGEV4cG9ydCBIYXNoIDY0IGNoYXIuIG1heAMJAQEhAQkBAUsBBQJhQgkAAgECGUxpY2VuY2UgSGFzaCA2NCBjaGFyLiBtYXgGAQJhQwICYUQCYUUDCQAAAgkAsQIBBQJhRAAACQACAQIYRmllbGQgY2Fubm90IGJlIGlzIGVtcHR5AwkAZgIJALECAQUCYUQFAmFFCQACAQkArAICBQJhRAIMIGlzIHRvbyBsb25nBgECYUYBAU4EAmFHCQELdmFsdWVPckVsc2UCCQCdCAIFAWcJAQFNAQUBTgUBegMDCQAAAgUCYUcFAXoGCQAAAgUCYUcFAUECLlJlZ2lzdGVyIHRoaXMgYWNjb3VudCBmaXJzdCB3aXRoICJBY2NvdW50IiB0YWIDCQAAAgUCYUcFAXgCEUFjY291bnQgc3VzcGVuZGVkAwkAAAIFAmFHBQF5Ag9BY2NvdW50IHJlbW92ZWQCAAECYUgCAmF5AmFCBAFKAwkAAAIJALECAQUCYXkAAAUBdAUCYXkEAUwDCQAAAgkAsQIBBQJhQgAABQF1BQJhQgkAlAoCBQFKBQFMAQJhSQoBTgJhdwJheAJhSgJhQQJhSwJhTAJhTQJhTgJhTwQCYVAJAQJhRgEFAU4DCQECIT0CBQJhUAIACQACAQUCYVADCQAAAgkAsQIBBQJhdwAACQACAQIbRGlzcGxheSBDSUQgY2Fubm90IGJlIGVtcHR5AwkBASEBCQECYXYDBQJhdwUCYXgFAmFKCQACAQIQUHJvYmxlbSB3aXRoIENJRAMJAQEhAQkBAmF6AgUCYUEFAmFLCQACAQITUHJvYmxlbSB3aXRoIEhhc2hlcwMJAQEhAQkBAmFDAgUCYUwAZAkAAgECEjEwMCBDaGFyLiBtYXggbmFtZQMJAQEhAQkBAmFDAgUCYU0A6AcJAAIBAhoxMDAwIENoYXIuIG1heCBkZXNjcmlwdGlvbgMDCQBmAgAABQJhTwYJAGYCBQJhTwDoBwkAAgECM1JveWFsdGllcyBjYW5ub3QgYmUgbGVzcyB0aGFuIDAlIG9yIGhpZ2hlciB0aGFuIDEwJQMJAGYCCQCQAwEJALUJAgUCYU4CASwABQkAAgECCzUgdGFncyBtYXguAgABAmFRAQJhUgMJAAACCQCQAwEIBQJhUghwYXltZW50cwAACQACAQITTm8gcGF5bWVudCBhdHRhY2hlZAQCYVMJAQV2YWx1ZQEJAJEDAggFAmFSCHBheW1lbnRzAAAEAmFUCQEFdmFsdWUBCAUCYVMGYW1vdW50CQCUCgIFAmFTBQJhVAECYVUBAmFSBAJhVgkBAmFRAQUCYVIEAmFTCAUCYVYCXzEEAmFUCAUCYVYCXzIEAmFXAwMJAQlpc0RlZmluZWQBCAUCYVMHYXNzZXRJZAkAAAIIBQJhUwdhc3NldElkBQFpBwgFAmFTB2Fzc2V0SWQJAAIBAitPbmx5IFNJR04gdG9rZW4gYWNjZXB0ZWQgYXMgdHJhbnNhY3Rpb24gZmVlAwkBAiE9AgUCYVQFAUIJAAIBCQCsAgICGVBheW1lbnQgYW1vdW50IHNob3VsZCBiZSAJAKQDAQUBQgkAlAoCBQJhVAUCYVcBAmFYAgJhWQFQBAFHCQCaCAIFBHRoaXMJAQFYAgUCYVkFAVADCQABAgUBRwIDSW50BAJhWgUBRwMJAQIhPQIFAmFaAAAGBwcBAmJhAwJhUgJiYgJiYwQCYmQJAQJhUQEFAmFSBAJhUwgFAmJkAl8xBAJhVAgFAmJkAl8yBAJhVwMJAQEhAQkBCWlzRGVmaW5lZAEIBQJhUwdhc3NldElkBQR1bml0AwMJAGYCCQCxAgEFAmJiAAAJAAACCQDYBAEJAQV2YWx1ZQEIBQJhUwdhc3NldElkBQJiYgcIBQJhUwdhc3NldElkCQACAQIOV3JvbmcgYXNzZXQgaWQDAwkAAAIFAmFXBQR1bml0CQECIT0CBQJiYgIABwkAAgECDldyb25nIGFzc2V0IGlkAwkBAiE9AgUCYmMFAmFUCQACAQITUGF5bWVudCBkb24ndCBtYXRjaAkAlAoCBQJhVAUCYVcBAmJlAQJhVwMDAwMDCQECIT0CBQJhVwkA2AQBBQFpCQECIT0CBQJhVwkA2AQBBQFsBwkBAiE9AgUCYVcCBVdBVkVTBwkBAiE9AgUCYVcJANgEAQUBagcJAQIhPQIFAmFXCQDYBAEFAWsHCQACAQImT25seSBTSUdOLCBVU0ROLFVTRFQgb3IgV0FWRVMgYWNjZXB0ZWQGAQJiZgICYVcCYmcEAmJoAwUBYwAKCQEBbgECDndhdmVzX21pbl9zZWxsBAJiaQDAhD0EAmJqAwUBYwABCQBoAgUBQgACAwMDAwMDCQAAAgUCYVcJANgEAQUBagkAZgIFAmJpBQJiZwcJAQIhPQIFAmJnAAAHBgMDCQAAAgUCYVcJANgEAQUBawkAZgIFAmJpBQJiZwcJAQIhPQIFAmJnAAAHBgMDCQAAAgUCYVcJANgEAQUBaQkAZgIFAmJqBQJiZwcJAQIhPQIFAmJnAAAHBgMDAwkAAAIFAmFXCQDYBAEFAWwGCQAAAgUCYVcCBVdBVkVTCQBmAgUCYmgFAmJnBwkBAiE9AgUCYmcAAAcJAAIBAhhXcm9uZyBtaW5pbXVtIHNlbGwgcHJpY2UGAQJiawECYVcDCQAAAgUCYVcCBVdBVkVTBQR1bml0CQDZBAEFAmFXAQJibAECYm0EAmJuCQEBYQEJAKwCAgUCYm0CBV9PUEVOAwkAAAIFAmJuAgAJAAIBAg1CaWQgbm90IGZvdW5kBAJibwkAtQkCBQJibgIBXwQCYnAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJibwABBAJicQkBAmJrAQkAkQMCBQJibwAAAwkAZwIAAAUCYnAJAAIBAgxXcm9uZyBhbW91bnQJAJQKAgUCYnAFAmJxAQJicgICYVICYnMDCQEBIQEFAXYJAAIBBQF3BAJidAMJAQIhPQIFAmJzAgAJAQt2YWx1ZU9yRWxzZQIJAQFwAQkArAICCQClCAEJAKcIAQkA2QQBBQJicwIJX2ZyZWVfdHhzAAAAAAMGCQACAQkArAICCQCsAgIJAKwCAgkArAICCQDYBAEICAUCYVIGY2FsbGVyBWJ5dGVzAgMgLyAJAKUIAQUEdGhpcwIDIC8gCQCkAwEFAmJ0BAFOAwMJAAACCQDYBAEICAUCYVIGY2FsbGVyBWJ5dGVzCQClCAEFBHRoaXMJAGYCBQJidAAABwkApQgBCQCnCAEJANkEAQUCYnMJANgEAQgIBQJhUgZjYWxsZXIFYnl0ZXMEAmJ1AwMJAQIhPQIFAmJzAgAJAGYCBQJidAAABwkA/AcEBQFoAgl1c2VGcmVlVHgJAMwIAgkApQgBCQCnCAEJANkEAQUCYnMFA25pbAUDbmlsBQR1bml0AwkAAAIFAmJ1BQJidQkAlgoECQDYBAEIBQJhUg10cmFuc2FjdGlvbklkBQFOCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAZgIFAmJ0AAAJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAmJ2AQJhUgMJAQEhAQUBdgkAAgEFAXcJAJUKAwkA2AQBCAUCYVINdHJhbnNhY3Rpb25JZAkA2AQBCAgFAmFSBmNhbGxlcgVieXRlcwgFCWxhc3RCbG9jawl0aW1lc3RhbXABAmJ3BgJhUgFQAmJ4AmJ5AmJ6AmJzBAJiQQkBAmJyAgUCYVIFAmJzBAJiQggFAmJBAl8xBAFOCAUCYkECXzIEAmJDCAUCYkECXzMEAmJ0CAUCYkECXzQDBgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFAU4CAyAvIAUCYngCAyAvIAUCYnoCAyAvIAUCYnMEAmJEAwMDCQAAAgUBTgUCYngJAQIhPQIFAmJ6AgAHCQECIT0CBQJieQIABwYHBAJiRQkBAW8BCQECYWgCBQFOBQFQAwMDCQECIT0CBQJiRQAACQBnAgUGaGVpZ2h0BQJiRQcJAQEhAQUCYkQHCQACAQILU2FsZSBlbmRlZC4EAmJGCQAAAgUBTgUCYngEAmJHCQEBbwECEHRvdGFsX25mdF9pc3N1ZWQEAUQJAQFhAQkBAVcCBQJieAUBUAQCYkgJAQFhAQkBAVECBQJieAUBUAMJAAACBQJiSAIACQACAQIRQXJ0IGRvZXNuJ3QgZXhpc3QEAmJJCQEBcQEJAQFZAgUCYngFAVAEAmJKCQEBbwEJAQFYAgUCYngFAVAEAmJjAwUCYkYJAGgCBQFCAAIJAQFvAQkBAmFnAgUCYngFAVAEAmJiAwUCYkYJANgEAQUBaQkBAWEBCQECYWkCBQJieAUBUAQCYksJAQFvAQkBAVYCBQJieAUBUAMDAwkBASEBBQJiRAkBASEBBQJiRgcDAwkAZwIAAAUCYmMGCQEBIQEFAmJJBgkAZwIAAAUCYksHCQACAQIQQXJ0IG5vdCBmb3Igc2FsZQMDAwkBASEBBQJiRAUCYkYHCQBnAgAABQJiSwcJAAIBAhRNYXggaXNzdWFibGUgbm90IHNldAQCYVAJAQJhRgEFAmJ4AwMFAmJECQECIT0CBQJhUAIABwkAAgEFAmFQBAJibQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQFQAgFfBQJieAIBXwUCYnoCAV8FAmJ5BAJiTAMFAmJECQECYmwBBQJibQkBAmJhAwUCYVIFAmJiBQJiYwQCYVQIBQJiTAJfMQQCYVcIBQJiTAJfMgQCYk0JAQt2YWx1ZU9yRWxzZQIJAJ0IAgUBZwkBAmFrAQUCYngFAWYEAmJOCQELdmFsdWVPckVsc2UCCQCaCAIFAWcJAQJhbQEFAmJ4AAAEAmJPCQELdmFsdWVPckVsc2UCCQCdCAIFAWcJAQJhbgEFAmJ4BQFmBAJiUAkBC3ZhbHVlT3JFbHNlAgkAmggCBQFnCQECYW8BBQJieAAABAJiUQkBAXABBQJieAQCYlIDCQBmAgUCYlEFBmhlaWdodAAAAwkAAAIFAmFXBQFpBQFyBQFzBAJiUwkAawMFAmFUBQJiUgBkBAJiVAMDAwkBAiE9AgUCYk0FAWYJAGYCBQJiTgAABwkAZgIFBmhlaWdodAUCYlEHCQBrAwUCYVQFAmJOAJBOAAAEAmJVAwMDCQECIT0CBQJiTwUBZgkAZgIFAmJQAAAHCQBmAgUGaGVpZ2h0BQJiUQcJAGsDBQJhVAUCYlAAkE4AAAQCYlYJAGUCBQJhVAUCYlMDCQAAAgUCYkoFAmJLCQACAQIMQXJ0IHNvbGQgb3V0BAJiVwkAZAIFAmJKAAEEAmJYCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJQ3JlYXRvcjogBQJieAIKLAogQXJ0SUQ6IAUBUAILLAogU2lnbklEOiAFAUQCESwKIEFydHdvcmsgbmFtZTogBQJiSAIKLAogSXNzdWU6IAkApAMBBQJiVwIBLwkApAMBBQJiSwQCYlkJAMIIBQkArAICAgNTQV8JAKQDAQkAZAIFAmJHAAEFAmJYAAEAAAcEAmJaCQC4CAEFAmJZBAJjYQMDCQAAAgUCYlcFAmJLBgkBASEBBQJiSQcGBAJjYgMDAwkAAAIFAU4FAmJ4CQECIT0CBQJiegIABwkBAiE9AgUCYnkCAAcJARFAZXh0ck5hdGl2ZSgxMDYyKQEFAmJ6CAUCYVIGY2FsbGVyBAJjYwMJAQEhAQkBCWlzRGVmaW5lZAEFAmFXAgVXQVZFUwkA2AQBCQEFdmFsdWUBBQJhVwQCYm4JAQFhAQkArAICBQJibQIFX09QRU4EAmNkCQELRGVsZXRlRW50cnkBCQCsAgIFAmJtAgVfT1BFTgQCY2UJAQtTdHJpbmdFbnRyeQIJAKwCAgUCYm0CB19DTE9TRUQJAKwCAgkArAICBQJibgIBXwkApAMBBQJiQwQCY2YJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJYXJ0X3NvbGRfCQCkAwEFAmJXAgRfb2ZfCQCkAwEFAmJLAgFfBQFQAgFfBQJieAQCY2cDCQEBIQEFAmJECQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFAU4CAV8JAKQDAQUCYkMCAV8FAmJCAgFfCQCkAwEFAmJjAgFfBQJiYgIBXwkA2AQBBQJiWgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQClCAEFAmNiAgFfCQCkAwEFAmJDAgFfBQJiQgIBXwkApAMBBQJhVAIBXwUCY2MCAV8JANgEAQUCYloEAmNoCQELU3RyaW5nRW50cnkCBQJjZgUCY2cEAmNpAwkBAiE9AgUCYlQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUBZgkAZQIFAmJTBQJiVAUCYVcJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAmJNBQJiVAUCYVcFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUBZgUCYlMFAmFXBQNuaWwEAmNqAwkBAiE9AgUCYlUAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUCYk8FAmJVBQJhVwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUCYngJAGUCBQJiVgUCYlUFAmFXBQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAmJ4BQJiVgUCYVcFA25pbAQCY2sDBQJidAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUBTgAABQR1bml0BQNuaWwFA25pbAQCY2wJAM4IAgkAzggCCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFYAgUCYngFAVAFAmJXCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgIEbmZ0XwkA2AQBBQJiWgUCY2YJAMwIAgkBDEludGVnZXJFbnRyeQICEHRvdGFsX25mdF9pc3N1ZWQJAGQCBQJiRwABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWgCBQJieAUBUAAACQDMCAIJAQxCb29sZWFuRW50cnkCCQEBWQIFAmJ4BQFQBQJjYQkAzAgCBQJiWQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQJjYgABBQJiWgUDbmlsBQJjaQUCY2oFAmNrAwUCYkQJAMwIAgUCY2gJAMwIAgUCY2UJAMwIAgUCY2QFAmNsCQDMCAIFAmNoBQJjbAECY20BAmNuBAFHBQJjbgMJAAECBQFHAgZTdHJpbmcEAmNvBQFHBQJjbwkAAgECJFNwb25zb3JlZCBQdWJsaWMgS2V5IFN0cmluZyBleHBlY3RlZAoCY3ABB3NldENvbmYCAWICY3EEAU4JAKUIAQgFAmNwBmNhbGxlcgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFAW0JAMwIAgkApQgBBQR0aGlzBQNuaWwFAU4DCQEIY29udGFpbnMCBQFiAgVjb25mXwkAzAgCCQELU3RyaW5nRW50cnkCBQFiBQJjcQUDbmlsCQACAQIgRW50cmllcyBzdGFydGluZyB3aXRoIGNvbmZfIG9ubHkJAAIBAiJZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIGNoYW5nZSB0aGlzAmFSAQphZGRBcnR3b3JrDgFGAUQCYUwCYU0CYU4CY3ICYXcCYUECYXgCYUICYXkCY3MCYU8CYnMEAmN0CQECYnICBQJhUgUCYnMEAVAIBQJjdAJfMQQBTggFAmN0Al8yBAJiQwgFAmN0Al8zBAJidAgFAmN0Al80AwkBASEBCQEBSwEFAUYJAAIBAiRIYXNoIHNob3VsZCBiZSA2NCBjaGFyYWN0ZXJzIG1heGltdW0EAmN1CQECYUgCBQJheQUCYUIEAmFKCAUCY3UCXzEEAmFLCAUCY3UCXzIEAmN2CQECYUkKBQFOBQJhdwUCYXgFAmFKBQJhQQUCYUsFAmFMBQJhTQUCYU4FAmFPAwkBAiE9AgUCY3YCAAkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQQCY3cJAGYCCQEBcAEJAKwCAgUBTgILX2ZyZWVfZHJvcHMAAAQCY3gDBQJjdwkAlAoCAAAFAUQJAQJhVQEFAmFSBAJhVAgFAmN4Al8xBAJhVwgFAmN4Al8yAwkBASEBCQEJaXNEZWZpbmVkAQUCYVQJAAIBAhRTb21ldGhpbmcgd2VudCB3cm9uZwQCY3kJAQFhAQkBAmF1AgUBRgUBTgMJAQIhPQIFAmN5AgAJAAIBAhRZb3UgYWxyZWFkeSBhZGRlZCBpdAQCY3oJAQFhAQkBAmFyAQUBRgMJAQIhPQIFAmN6AgAJAAIBAhdIYXNoIGFscmVhZHkgcmVnaXN0ZXJlZAQCY0EJAQFDAwUBRAUBTgUBRgMJAQEhAQUCY0EJAAIBAixTaWduIENlcnRpZmljYXRlIG5vdCBmb3VuZCBmb3IgdGhpcyBhZGRyZXNzLgQCY0IDBQJjdwkA/AcEBQFoAgt1c2VGcmVlRHJvcAkAzAgCBQFOBQNuaWwFA25pbAUEdW5pdAMJAAACBQJjQgUCY0IEAmNrAwUCYnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAU4AAAUEdW5pdAUDbmlsBQNuaWwJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCCQECYXIBBQFGBQFOCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhdQIFAUYFAU4FAVAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFPAgUBTgUBUAUCYkMJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVECBQFOBQFQBQJhTAkAzAgCCQELU3RyaW5nRW50cnkCCQEBUgIFAU4FAVAFAmFNCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFTAgUBTgUBUAUCYXcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVUCBQFOBQFQBQJheAkAzAgCCQELU3RyaW5nRW50cnkCCQEBVAIFAU4FAVAFAmFBCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFaAgUBTgUBUAUCYUsJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFhAgUBTgUBUAUCYUoJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFjAgUBTgUBUAUCY3IJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFiAgUBTgUBUAUCYU4JAMwIAgkBDEludGVnZXJFbnRyeQIJAQFWAgUBTgUBUAAACQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFXAgUBTgUBUAUBRAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVgCBQFOBQFQAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQFZAgUBTgUBUAcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFzAgUBTgUBRAUBUAkAzAgCCQELU3RyaW5nRW50cnkCCQECYXACBQFOBQFQBQFGCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhZQIFAU4FAVAFAmNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWYCBQFOBQFQBQJhTwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUBZgUCYVQFAWkFA25pbAUCY2sJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4CYVIBDXVwZGF0ZUFydHdvcmsNAmFxAmFMAmFNAmFOAmNyAmF3AmFBAmF4AmFCAmF5AmNzAmFPAmJzAwkBASEBBQF2CQACAQUBdwQCY0MJAQJicgIFAmFSBQJicwQCYkIIBQJjQwJfMQQBTggFAmNDAl8yBAJiQwgFAmNDAl8zBAJidAgFAmNDAl80BAJjRAkBAmFIAgUCYXkFAmFCBAJhSggFAmNEAl8xBAJhSwgFAmNEAl8yBAJjdgkBAmFJCgUBTgUCYXcFAmF4BQJhSgUCYUEFAmFLBQJhTAUCYU0FAmFOBQJhTwMJAQIhPQIFAmN2AgAJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEEAmN5CQEBYQEJAQFRAgUBTgUCYXEDCQAAAgUCY3kCAAkAAgECD0VudHJ5IG5vdCBmb3VuZAQCY0UJAQFhAQkBAmFqAgUBTgUCYXEDCQAAAgUCY0UCB0lMTEVHQUwJAAIBAh1DYW5ub3QgdXBkYXRlIElMTEVHQUwgYXJ0d29yawMJAQEhAQkBAmFYAgUBTgUCYXEEAmNrAwUCYnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAU4AAAUEdW5pdAUDbmlsBQNuaWwJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCCQEBUQIFAU4FAmFxBQJhTAkAzAgCCQELU3RyaW5nRW50cnkCCQEBUgIFAU4FAmFxBQJhTQkAzAgCCQELU3RyaW5nRW50cnkCCQEBUwIFAU4FAmFxBQJhdwkAzAgCCQELU3RyaW5nRW50cnkCCQEBVQIFAU4FAmFxBQJheAkAzAgCCQELU3RyaW5nRW50cnkCCQEBVAIFAU4FAmFxBQJhQQkAzAgCCQELU3RyaW5nRW50cnkCCQECYWECBQFOBQJhcQUCYUoJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVoCBQFOBQJhcQUCYUsJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFiAgUBTgUCYXEFAmFOCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYwIFAU4FAmFxBQJjcgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWUCBQFOBQJhcQUCY3MJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhZgIFAU4FAmFxBQJhTwUDbmlsBQJjawkAAgECDkFscmVhZHkgbWludGVkAmFSAQtmbGFnQXJ0d29yawQBUAJjRgJjRQJjRwQCY0gJAQJidgEFAmFSBAJiQggFAmNIAl8xBAFOCAUCY0gCXzIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQFtCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQFOAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgIHQ09OU0VOVAkAzAgCAgAJAMwIAgIPQ0hBTkdFX1JFUVVJUkVECQDMCAICB0ZMQUdHRUQJAMwIAgIHSUxMRUdBTAUDbmlsBQJjRQkAzAgCCQELU3RyaW5nRW50cnkCCQECYWoCBQJjRgUBUAUCY0UJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFkAgUCY0YFAVAFAmNHBQNuaWwJAAIBCQCsAgICDlVua25vdyBzdGF0dXMgBQJjRQkAAgECE1lvdSBhcmUgbm90IGFsbG93ZWQCYVIBDWRlbGV0ZUFydHdvcmsCAVACY0YEAmNJCQECYnYBBQJhUgQCYkIIBQJjSQJfMQQBTggFAmNJAl8yBAJhWQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFAW0JAMwIAgkApQgBBQR0aGlzBQNuaWwFAU4FAmNGBQFOBAJjeQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQEBYQEJAQFRAgUCYVkFAVACIE5vIGFydCBtYXRjaGluZyBmb3IgdGhpcyBhZGRyZXNzAwkAAAIFAmN5AgAJAAIBAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwQBRgkBAWEBCQECYXACBQJhWQUBUAMJAAACBQFGAgAJAAIBAiVObyBhcnQgaGFzaCBtYXRjaGluZyBmb3IgdGhpcyBhZGRyZXNzBAFECQEBYQEJAQFXAgUCYVkFAVADCQAAAgUBRAIACQACAQITTm8gU0lHTiBJRCBtYXRjaGluZwQCY0oJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAU8CBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBUQIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFSAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVMCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBVQIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFUAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVoCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWECBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWMCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWICBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBVgIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFXAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVgCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBWQIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhagIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhZwIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhaQIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhcgEFAUYJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFzAgUCYVkFAUQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmF1AgUBRgUCYVkJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFoAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFkAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFlAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFmAgUCYVkFAVAFA25pbAMJAQEhAQkBAmFYAgUCYVkFAVADCQEBIQEFAXYJAAIBBQF3BQJjSgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFAW0JAMwIAgkApQgBBQR0aGlzBQNuaWwFAU4FAmNKCQACAQIoQXJ0IGFscmVhZHkgbWludGVkLCB5b3UgY2Fubm90IGRlbGV0ZSBpdAJhUgELc2VsbEFydHdvcmsGAVACYmcCY0sCYVcCYkUCYnMEAmNMCQECYnICBQJhUgUCYnMEAmJCCAUCY0wCXzEEAU4IBQJjTAJfMgQCYkMIBQJjTAJfMwQCYnQIBQJjTAJfNAQCYkgJAQFhAQkBAVECBQFOBQFQAwkAAAIFAmJIAgAJAAIBAiNUaGlzIGFydCBkb2Vzbid0IG1hdGNoIHlvdXIgYWNjb3VudAQCY0UJAQFhAQkBAmFqAgUBTgUBUAMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAICD0NIQU5HRV9SRVFVSVJFRAkAzAgCAgdGTEFHR0VECQDMCAICB0lMTEVHQUwFA25pbAUCY0UJAAIBAg9GbGFnZ2VkIGFydHdvcmsEAmNNCQEBbwEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQFQAwkAZgIAAAUCYkUJAAIBAgxOZWdhdGl2ZSBlbmQDAwkAZgIFAmJFAAADCQECIT0CBQJjSwABBgkBAiE9AgUCYmcAAAcJAAIBAjpUaW1lZCBvZmZlciBvbmx5IGFsbG93ZWQgZm9yIHVuaXF1ZSBlZGl0aW9uIGFuZCBvZmZlciBvbmx5BAJjTgMJAAACBQJiRQAAAAAFBmhlaWdodAMJAQEhAQkBAmJlAQUCYVcJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEDCQEBIQEJAQJiZgIFAmFXBQJiZwkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQQCYVAJAQJhRgEFAU4DCQECIT0CBQJhUAIACQACAQUCYVAEAmJKCQEBbwEJAQFYAgUBTgUBUAQCYksJAQFvAQkBAVYCBQFOBQFQAwkAZgIFAmNLAGQJAAIBAhwxMDAgZWRpdGlvbnMgbWF4IHBlciBhcnR3b3JrAwMJAQIhPQIFAmJKAAAJAAACBQJiSgUCYksHCQACAQIUTWF4IGVkaXRpb24gcmVhY2hlZC4DAwkAZgIFAmJKAAAJAQIhPQIFAmJLBQJjSwcJAAIBAiZDYW5ub3QgY2hhbmdlIG1heGltdW0gaXNzdWFibGUgYW55bW9yZQMDCQBmAgUCY00AAAkBAiE9AgUCYksFAmNLBwkAAgECMUNhbm5vdCBjaGFuZ2UgbWF4aW11bSBpc3N1YWJsZSB3aXRoIGFjdGl2ZSBvcmRlcnMEAmNhAwMJAGYCBQJiZwAACQBmAgUCY0sAAAcGBwQCY2sDBQJidAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUBTgAABQR1bml0BQNuaWwFA25pbAkAzggCCQDMCAIJAQxCb29sZWFuRW50cnkCCQEBWQIFAU4FAVAFAmNhCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWcCBQFOBQFQBQJiZwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVYCBQFOBQFQBQJjSwkAzAgCCQELU3RyaW5nRW50cnkCCQECYWkCBQFOBQFQBQJhVwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFoAgUBTgUBUAkAZAIFAmNOBQJiRQUDbmlsBQJjawJhUgEKYnV5QXJ0d29yawIBUAJieAkBAmJ3BgUCYVIFAVAFAmJ4AgACAAIAAmFSAQZzZXRCaWQCAVACYngEAmNPCQECYnYBBQJhUgQCYkIIBQJjTwJfMQQBTggFAmNPAl8yBAJiQwgFAmNPAl8zBAJjUAkBAmFRAQUCYVIEAmFTCAUCY1ACXzEEAmFUCAUCY1ACXzIEAmFXAwkBASEBCQEJaXNEZWZpbmVkAQgFAmFTB2Fzc2V0SWQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEIBQJhUwdhc3NldElkBAJiRQkBAW8BCQECYWgCBQJieAUBUAMDCQECIT0CBQJiRQAACQBnAgUGaGVpZ2h0BQJiRQcJAAIBAgtTYWxlIGVuZGVkLgQCY00JAQFvAQkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FAVADCQEBIQEJAQJiZQEFAmFXCQACAQISYXNzZXQgbm90IGFjY2VwdGVkAwkBASEBCQECYmYCBQJhVwUCYVQJAAIBAg5Xcm9uZyBtaW4gc2VsbAQCYkoJAQFvAQkBAVgCBQJieAUBUAQCYksJAQFvAQkBAVYCBQJieAUBUAMJAGcCAAAFAmJLCQACAQIjTm8gbWF4IGVkaXRpb24gc2V0IGZvciB0aGlzIGFydHdvcmsDCQBnAgUCYkoFAmJLCQACAQIYU29sZCBvdXQsIHlvdSBjYW5ub3QgYmlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQFQAgFfBQJieAIBXwUBTgIBXwUCYkICBV9PUEVOCQCsAgIJAKwCAgkArAICCQCsAgIFAmFXAgFfCQCkAwEFAmFUAgFfCQCkAwEFAmJDCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUBUAkAZAIFAmNNAAEFA25pbAJhUgEJYWNjZXB0QmlkBQFQAmJ4AmJ5AmJ6AmJzBAJjUQkBAmJyAgUCYVIFAmJzBAJiQggFAmNRAl8xBAFOCAUCY1ECXzIEAmJDCAUCY1ECXzMEAmJ0CAUCY1ECXzQDCQECIT0CBQFOBQJieAkAAgECGVlvdSBjYW5ub3QgZG8gdGhpcyBhY3Rpb24JAQJidwYFAmFSBQFQBQJieAUCYnkFAmJ6BQJicwJhUgEJY2FuY2VsQmlkBAFQAmJ4AmJ5AmJ6BAJjUgkBAmJ2AQUCYVIEAmJCCAUCY1ICXzEEAU4IBQJjUgJfMgQCYkMIBQJjUgJfMwMDCQECIT0CBQFOBQJiegkBAiE9AgUBTgUCYngHCQACAQIZWW91IGNhbm5vdCBkbyB0aGlzIGFjdGlvbgQCY1MDCQAAAgUBTgUCYngFAmJ6BQFOBAJjTQkBAW8BCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUBUAQCYm0JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUBUAIBXwUCYngCAV8FAmJ6AgFfBQJieQQCYm4JAQFhAQkArAICBQJibQIFX09QRU4DCQAAAgUCYm4CAAkAAgECDUJpZCBub3QgZm91bmQEAmJvCQC1CQIFAmJuAgFfBAJhVwkBAmJrAQkAkQMCBQJibwAABAJjVAIIQ0FOQ0VMRUQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQJibQIFX09QRU4JAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIFAmJtAgFfBQJjVAkArAICCQCsAgIFAmJuAgFfCQCkAwEFAmJDCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUBUAkAZQIFAmNNAAEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAmNTCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYm8AAQUCYVcFA25pbAECY1UBAmNWAAQBRwUCY1UDCQABAgUBRwIXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EAmNXBQFHAwMDAwkAAAIIBQJjVwhmdW5jdGlvbgIKYWRkQXJ0d29yawkAAAIIBQJjVwRkQXBwBQR0aGlzBwkAAAIIBQJjVwNmZWUAoMIeBwkAAAIIBQJjVwpmZWVBc3NldElkBQR1bml0BwkA9AMDCAUCY1UJYm9keUJ5dGVzCQCRAwIIBQJjVQZwcm9vZnMAAAkA2QQBCQECY20BCQCRAwIIBQJjVwRhcmdzAA0DAwMDCQAAAggFAmNXCGZ1bmN0aW9uAg11cGRhdGVBcnR3b3JrCQAAAggFAmNXBGRBcHAFBHRoaXMHCQAAAggFAmNXA2ZlZQCgwh4HCQAAAggFAmNXCmZlZUFzc2V0SWQFBHVuaXQHCQD0AwMIBQJjVQlib2R5Qnl0ZXMJAJEDAggFAmNVBnByb29mcwAACQDZBAEJAQJjbQEJAJEDAggFAmNXBGFyZ3MADAMDAwMJAAACCAUCY1cIZnVuY3Rpb24CC3NlbGxBcnR3b3JrCQAAAggFAmNXBGRBcHAFBHRoaXMHCQAAAggFAmNXA2ZlZQCgwh4HCQAAAggFAmNXCmZlZUFzc2V0SWQFBHVuaXQHCQD0AwMIBQJjVQlib2R5Qnl0ZXMJAJEDAggFAmNVBnByb29mcwAACQDZBAEJAQJjbQEJAJEDAggFAmNXBGFyZ3MABQMDAwMJAAACCAUCY1cIZnVuY3Rpb24CCWFjY2VwdEJpZAkAAAIIBQJjVwRkQXBwBQR0aGlzBwkAAAIIBQJjVwNmZWUAoMIeBwkAAAIIBQJjVwpmZWVBc3NldElkBQR1bml0BwkAyBMDCAUCY1UJYm9keUJ5dGVzCQCRAwIIBQJjVQZwcm9vZnMAAAkA2QQBCQECY20BCQCRAwIIBQJjVwRhcmdzAAQJAPQDAwgFAmNVCWJvZHlCeXRlcwkAkQMCCAUCY1UGcHJvb2ZzAAAIBQJjVQ9zZW5kZXJQdWJsaWNLZXkJAPQDAwgFAmNVCWJvZHlCeXRlcwkAkQMCCAUCY1UGcHJvb2ZzAAAIBQJjVQ9zZW5kZXJQdWJsaWNLZXkTnOHM", "height": 2503547, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: RsxDFmCvRAsyNaHqGYM4obYoUXFaHKghESZgCGiyaqK Next: GRoWPzbPfPtAv4EVySGGbTznMAXdN8DyewHScH8XYq5q Diff:
OldNewDifferences
380380 let isSponsored = if ((pubKey != ""))
381381 then valueOrElse(checkWhitelist((toString(addressFromPublicKey(fromBase58String(pubKey))) + "_free_txs")), 0)
382382 else 0
383- let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
384- then (isSponsored > 0)
385- else false)
386- then toString(addressFromPublicKey(fromBase58String(pubKey)))
387- 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))
395- else throw("Strict value is not equal to itself.")
383+ if (true)
384+ then throw(((((toBase58String(i.caller.bytes) + " / ") + toString(this)) + " / ") + toString(isSponsored)))
385+ else {
386+ let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
387+ then (isSponsored > 0)
388+ else false)
389+ then toString(addressFromPublicKey(fromBase58String(pubKey)))
390+ else toBase58String(i.caller.bytes)
391+ let get_sponsored_waves = if (if ((pubKey != ""))
392+ then (isSponsored > 0)
393+ else false)
394+ then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
395+ else unit
396+ if ((get_sponsored_waves == get_sponsored_waves))
397+ then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
398+ else throw("Strict value is not equal to itself.")
399+ }
396400 }
397401
398402
402406
403407
404408 func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
405- let $t01303913128 = idCallerDateSponsored(i, pubKey)
406- let id = $t01303913128._1
407- let caller = $t01303913128._2
408- let date = $t01303913128._3
409- let isSponsored = $t01303913128._4
409+ let $t01315313242 = idCallerDateSponsored(i, pubKey)
410+ let id = $t01315313242._1
411+ let caller = $t01315313242._2
412+ let date = $t01315313242._3
413+ let isSponsored = $t01315313242._4
410414 if (true)
411415 then throw(((((((caller + " / ") + issuer) + " / ") + bidOwner) + " / ") + pubKey))
412416 else {
465469 then throw(checkUser)
466470 else {
467471 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
468- let $t01473114923 = if (isBid)
472+ let $t01484515037 = if (isBid)
469473 then getPriceAssetIdFromBid(bidDataKey)
470474 else validatePriceAssetId(i, priceAssetId, artworkPrice)
471- let amount = $t01473114923._1
472- let assetId = $t01473114923._2
475+ let amount = $t01484515037._1
476+ let assetId = $t01484515037._2
473477 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
474478 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
475479 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
574578
575579 @Callable(i)
576580 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
577- let $t02009920172 = idCallerDateSponsored(i, pubKey)
578- let artId = $t02009920172._1
579- let caller = $t02009920172._2
580- let date = $t02009920172._3
581- let isSponsored = $t02009920172._4
581+ let $t02021320286 = idCallerDateSponsored(i, pubKey)
582+ let artId = $t02021320286._1
583+ let caller = $t02021320286._2
584+ let date = $t02021320286._3
585+ let isSponsored = $t02021320286._4
582586 if (!(validateHash(sha256Hash)))
583587 then throw("Hash should be 64 characters maximum")
584588 else {
585- let $t02027320342 = setLIcence(cidLicence, sha256Licence)
586- let licenceCID = $t02027320342._1
587- let licenceHash = $t02027320342._2
589+ let $t02038720456 = setLIcence(cidLicence, sha256Licence)
590+ let licenceCID = $t02038720456._1
591+ let licenceHash = $t02038720456._2
588592 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
589593 if ((validateArtwork != ""))
590594 then throw("Something went wrong!")
591595 else {
592596 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
593- let $t02064120725 = if (whitelisted_drop)
597+ let $t02075520839 = if (whitelisted_drop)
594598 then $Tuple2(0, signID)
595599 else validatePayment(i)
596- let amount = $t02064120725._1
597- let assetId = $t02064120725._2
600+ let amount = $t02075520839._1
601+ let assetId = $t02075520839._2
598602 if (!(isDefined(amount)))
599603 then throw("Something went wrong")
600604 else {
635639 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
636640 then throw(maintenanceMSG)
637641 else {
638- let $t02375923829 = idCallerDateSponsored(i, pubKey)
639- let id = $t02375923829._1
640- let caller = $t02375923829._2
641- let date = $t02375923829._3
642- let isSponsored = $t02375923829._4
643- let $t02383923908 = setLIcence(cidLicence, sha256Licence)
644- let licenceCID = $t02383923908._1
645- let licenceHash = $t02383923908._2
642+ let $t02387323943 = idCallerDateSponsored(i, pubKey)
643+ let id = $t02387323943._1
644+ let caller = $t02387323943._2
645+ let date = $t02387323943._3
646+ let isSponsored = $t02387323943._4
647+ let $t02395324022 = setLIcence(cidLicence, sha256Licence)
648+ let licenceCID = $t02395324022._1
649+ let licenceHash = $t02395324022._2
646650 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
647651 if ((validateArtwork != ""))
648652 then throw("Something went wrong!")
670674
671675 @Callable(i)
672676 func flagArtwork (artId,addr,flag,note) = {
673- let $t02553525569 = idCallerDate(i)
674- let id = $t02553525569._1
675- let caller = $t02553525569._2
677+ let $t02564925683 = idCallerDate(i)
678+ let id = $t02564925683._1
679+ let caller = $t02564925683._2
676680 if (containsElement([chris, toString(this)], caller))
677681 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
678682 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
684688
685689 @Callable(i)
686690 func deleteArtwork (artId,addr) = {
687- let $t02600526039 = idCallerDate(i)
688- let id = $t02600526039._1
689- let caller = $t02600526039._2
691+ let $t02611926153 = idCallerDate(i)
692+ let id = $t02611926153._1
693+ let caller = $t02611926153._2
690694 let addrToUse = if (containsElement([chris, toString(this)], caller))
691695 then addr
692696 else caller
719723
720724 @Callable(i)
721725 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
722- let $t02887528945 = idCallerDateSponsored(i, pubKey)
723- let id = $t02887528945._1
724- let caller = $t02887528945._2
725- let date = $t02887528945._3
726- let isSponsored = $t02887528945._4
726+ let $t02898929059 = idCallerDateSponsored(i, pubKey)
727+ let id = $t02898929059._1
728+ let caller = $t02898929059._2
729+ let date = $t02898929059._3
730+ let isSponsored = $t02898929059._4
727731 let artworkName = getStringByKey(keyName(caller, artId))
728732 if ((artworkName == ""))
729733 then throw("This art doesn't match your account")
797801
798802 @Callable(i)
799803 func setBid (artId,issuer) = {
800- let $t03132731367 = idCallerDate(i)
801- let id = $t03132731367._1
802- let caller = $t03132731367._2
803- let date = $t03132731367._3
804- let $t03137231408 = isPayment(i)
805- let payment = $t03137231408._1
806- let amount = $t03137231408._2
804+ let $t03144131481 = idCallerDate(i)
805+ let id = $t03144131481._1
806+ let caller = $t03144131481._2
807+ let date = $t03144131481._3
808+ let $t03148631522 = isPayment(i)
809+ let payment = $t03148631522._1
810+ let amount = $t03148631522._2
807811 let assetId = if (!(isDefined(payment.assetId)))
808812 then "WAVES"
809813 else toBase58String(value(payment.assetId))
834838
835839 @Callable(i)
836840 func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = {
837- let $t03262832698 = idCallerDateSponsored(i, pubKey)
838- let id = $t03262832698._1
839- let caller = $t03262832698._2
840- let date = $t03262832698._3
841- let isSponsored = $t03262832698._4
841+ let $t03274232812 = idCallerDateSponsored(i, pubKey)
842+ let id = $t03274232812._1
843+ let caller = $t03274232812._2
844+ let date = $t03274232812._3
845+ let isSponsored = $t03274232812._4
842846 if ((caller != issuer))
843847 then throw("You cannot do this action")
844848 else buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
848852
849853 @Callable(i)
850854 func cancelBid (artId,issuer,bidId,bidOwner) = {
851- let $t03293232993 = idCallerDate(i)
852- let id = $t03293232993._1
853- let caller = $t03293232993._2
854- let date = $t03293232993._3
855+ let $t03304633107 = idCallerDate(i)
856+ let id = $t03304633107._1
857+ let caller = $t03304633107._2
858+ let date = $t03304633107._3
855859 if (if ((caller != bidOwner))
856860 then (caller != issuer)
857861 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
383- let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
384- then (isSponsored > 0)
385- else false)
386- then toString(addressFromPublicKey(fromBase58String(pubKey)))
387- 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))
395- else throw("Strict value is not equal to itself.")
383+ if (true)
384+ then throw(((((toBase58String(i.caller.bytes) + " / ") + toString(this)) + " / ") + toString(isSponsored)))
385+ else {
386+ let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
387+ then (isSponsored > 0)
388+ else false)
389+ then toString(addressFromPublicKey(fromBase58String(pubKey)))
390+ else toBase58String(i.caller.bytes)
391+ let get_sponsored_waves = if (if ((pubKey != ""))
392+ then (isSponsored > 0)
393+ else false)
394+ then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
395+ else unit
396+ if ((get_sponsored_waves == get_sponsored_waves))
397+ then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
398+ else throw("Strict value is not equal to itself.")
399+ }
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 $t01303913128 = idCallerDateSponsored(i, pubKey)
406- let id = $t01303913128._1
407- let caller = $t01303913128._2
408- let date = $t01303913128._3
409- let isSponsored = $t01303913128._4
409+ let $t01315313242 = idCallerDateSponsored(i, pubKey)
410+ let id = $t01315313242._1
411+ let caller = $t01315313242._2
412+ let date = $t01315313242._3
413+ let isSponsored = $t01315313242._4
410414 if (true)
411415 then throw(((((((caller + " / ") + issuer) + " / ") + bidOwner) + " / ") + pubKey))
412416 else {
413417 let isBid = if (if (if ((caller == issuer))
414418 then (bidOwner != "")
415419 else false)
416420 then (bidId != "")
417421 else false)
418422 then true
419423 else false
420424 let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
421425 if (if (if ((blockEnd != 0))
422426 then (height >= blockEnd)
423427 else false)
424428 then !(isBid)
425429 else false)
426430 then throw("Sale ended.")
427431 else {
428432 let callerIsIssuer = (caller == issuer)
429433 let totalNFT = getIntegerByKey("total_nft_issued")
430434 let signID = getStringByKey(keySignID(issuer, artId))
431435 let artworkName = getStringByKey(keyName(issuer, artId))
432436 if ((artworkName == ""))
433437 then throw("Art doesn't exist")
434438 else {
435439 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
436440 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
437441 let artworkPrice = if (callerIsIssuer)
438442 then (currentCertificationPrice * 2)
439443 else getIntegerByKey(keyPrice(issuer, artId))
440444 let priceAssetId = if (callerIsIssuer)
441445 then toBase58String(signAssetId)
442446 else getStringByKey(keyAssetIdAccepted(issuer, artId))
443447 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
444448 if (if (if (!(isBid))
445449 then !(callerIsIssuer)
446450 else false)
447451 then if (if ((0 >= artworkPrice))
448452 then true
449453 else !(isOnSale))
450454 then true
451455 else (0 >= maxCanSell)
452456 else false)
453457 then throw("Art not for sale")
454458 else if (if (if (!(isBid))
455459 then callerIsIssuer
456460 else false)
457461 then (0 >= maxCanSell)
458462 else false)
459463 then throw("Max issuable not set")
460464 else {
461465 let checkUser = validateUser(issuer)
462466 if (if (isBid)
463467 then (checkUser != "")
464468 else false)
465469 then throw(checkUser)
466470 else {
467471 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
468- let $t01473114923 = if (isBid)
472+ let $t01484515037 = if (isBid)
469473 then getPriceAssetIdFromBid(bidDataKey)
470474 else validatePriceAssetId(i, priceAssetId, artworkPrice)
471- let amount = $t01473114923._1
472- let assetId = $t01473114923._2
475+ let amount = $t01484515037._1
476+ let assetId = $t01484515037._2
473477 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
474478 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
475479 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
476480 let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
477481 let isWhitelisted = checkWhitelist(issuer)
478482 let cut = if ((isWhitelisted > height))
479483 then 0
480484 else if ((assetId == signAssetId))
481485 then signCut
482486 else usdnWaveCut
483487 let amountForSign = fraction(amount, cut, 100)
484488 let amountForAgent = if (if (if ((agent != feeReceiver))
485489 then (agentShare > 0)
486490 else false)
487491 then (height > isWhitelisted)
488492 else false)
489493 then fraction(amount, agentShare, 10000)
490494 else 0
491495 let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
492496 then (publicAgentShare > 0)
493497 else false)
494498 then (height > isWhitelisted)
495499 else false)
496500 then fraction(amount, publicAgentShare, 10000)
497501 else 0
498502 let amountForCreator = (amount - amountForSign)
499503 if ((amountSold == maxCanSell))
500504 then throw("Art sold out")
501505 else {
502506 let newAmountSold = (amountSold + 1)
503507 let issueMeta = ((((((((((("Creator: " + issuer) + ",
504508 ArtID: ") + artId) + ",
505509 SignID: ") + signID) + ",
506510 Artwork name: ") + artworkName) + ",
507511 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
508512 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
509513 let idNFT = calculateAssetId(issueNFT)
510514 let sellStatus = if (if ((newAmountSold == maxCanSell))
511515 then true
512516 else !(isOnSale))
513517 then false
514518 else true
515519 let receiveNFT = if (if (if ((caller == issuer))
516520 then (bidOwner != "")
517521 else false)
518522 then (bidId != "")
519523 else false)
520524 then addressFromStringValue(bidOwner)
521525 else i.caller
522526 let assetIdBid = if (!(isDefined(assetId)))
523527 then "WAVES"
524528 else toBase58String(value(assetId))
525529 let bidData = getStringByKey((bidDataKey + "_OPEN"))
526530 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
527531 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
528532 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
529533 let soldValue = if (!(isBid))
530534 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
531535 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
532536 let soldData = StringEntry(soldKey, soldValue)
533537 let commissionsWithAgent = if ((amountForAgent != 0))
534538 then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
535539 else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
536540 let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
537541 then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
538542 else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
539543 let txToCaller = if (isSponsored)
540544 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
541545 else nil
542546 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)
543547 if (isBid)
544548 then [soldData, bidUpdate, bidDelOld] :: buyRes
545549 else soldData :: buyRes
546550 }
547551 }
548552 }
549553 }
550554 }
551555 }
552556 }
553557
554558
555559 func asString (bv) = match bv {
556560 case bv0: String =>
557561 bv0
558562 case _ =>
559563 throw("Sponsored Public Key String expected")
560564 }
561565
562566
563567 @Callable(invoke)
564568 func setConf (key,val) = {
565569 let caller = toString(invoke.caller)
566570 if (containsElement([chris, toString(this)], caller))
567571 then if (contains(key, "conf_"))
568572 then [StringEntry(key, val)]
569573 else throw("Entries starting with conf_ only")
570574 else throw("You are not allowed to change this")
571575 }
572576
573577
574578
575579 @Callable(i)
576580 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
577- let $t02009920172 = idCallerDateSponsored(i, pubKey)
578- let artId = $t02009920172._1
579- let caller = $t02009920172._2
580- let date = $t02009920172._3
581- let isSponsored = $t02009920172._4
581+ let $t02021320286 = idCallerDateSponsored(i, pubKey)
582+ let artId = $t02021320286._1
583+ let caller = $t02021320286._2
584+ let date = $t02021320286._3
585+ let isSponsored = $t02021320286._4
582586 if (!(validateHash(sha256Hash)))
583587 then throw("Hash should be 64 characters maximum")
584588 else {
585- let $t02027320342 = setLIcence(cidLicence, sha256Licence)
586- let licenceCID = $t02027320342._1
587- let licenceHash = $t02027320342._2
589+ let $t02038720456 = setLIcence(cidLicence, sha256Licence)
590+ let licenceCID = $t02038720456._1
591+ let licenceHash = $t02038720456._2
588592 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
589593 if ((validateArtwork != ""))
590594 then throw("Something went wrong!")
591595 else {
592596 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
593- let $t02064120725 = if (whitelisted_drop)
597+ let $t02075520839 = if (whitelisted_drop)
594598 then $Tuple2(0, signID)
595599 else validatePayment(i)
596- let amount = $t02064120725._1
597- let assetId = $t02064120725._2
600+ let amount = $t02075520839._1
601+ let assetId = $t02075520839._2
598602 if (!(isDefined(amount)))
599603 then throw("Something went wrong")
600604 else {
601605 let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
602606 if ((entryExist != ""))
603607 then throw("You already added it")
604608 else {
605609 let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
606610 if ((hashExist != ""))
607611 then throw("Hash already registered")
608612 else {
609613 let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
610614 if (!(isSignCertified))
611615 then throw("Sign Certificate not found for this address.")
612616 else {
613617 let decrease_whitelist_drop = if (whitelisted_drop)
614618 then invoke(whitelistDapp, "useFreeDrop", [caller], nil)
615619 else unit
616620 if ((decrease_whitelist_drop == decrease_whitelist_drop))
617621 then {
618622 let txToCaller = if (isSponsored)
619623 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
620624 else nil
621625 ([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)
622626 }
623627 else throw("Strict value is not equal to itself.")
624628 }
625629 }
626630 }
627631 }
628632 }
629633 }
630634 }
631635
632636
633637
634638 @Callable(i)
635639 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
636640 then throw(maintenanceMSG)
637641 else {
638- let $t02375923829 = idCallerDateSponsored(i, pubKey)
639- let id = $t02375923829._1
640- let caller = $t02375923829._2
641- let date = $t02375923829._3
642- let isSponsored = $t02375923829._4
643- let $t02383923908 = setLIcence(cidLicence, sha256Licence)
644- let licenceCID = $t02383923908._1
645- let licenceHash = $t02383923908._2
642+ let $t02387323943 = idCallerDateSponsored(i, pubKey)
643+ let id = $t02387323943._1
644+ let caller = $t02387323943._2
645+ let date = $t02387323943._3
646+ let isSponsored = $t02387323943._4
647+ let $t02395324022 = setLIcence(cidLicence, sha256Licence)
648+ let licenceCID = $t02395324022._1
649+ let licenceHash = $t02395324022._2
646650 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
647651 if ((validateArtwork != ""))
648652 then throw("Something went wrong!")
649653 else {
650654 let entryExist = getStringByKey(keyName(caller, txid))
651655 if ((entryExist == ""))
652656 then throw("Entry not found")
653657 else {
654658 let flag = getStringByKey(keyFlag(caller, txid))
655659 if ((flag == "ILLEGAL"))
656660 then throw("Cannot update ILLEGAL artwork")
657661 else if (!(isArtMinted(caller, txid)))
658662 then {
659663 let txToCaller = if (isSponsored)
660664 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
661665 else nil
662666 ([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)
663667 }
664668 else throw("Already minted")
665669 }
666670 }
667671 }
668672
669673
670674
671675 @Callable(i)
672676 func flagArtwork (artId,addr,flag,note) = {
673- let $t02553525569 = idCallerDate(i)
674- let id = $t02553525569._1
675- let caller = $t02553525569._2
677+ let $t02564925683 = idCallerDate(i)
678+ let id = $t02564925683._1
679+ let caller = $t02564925683._2
676680 if (containsElement([chris, toString(this)], caller))
677681 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
678682 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
679683 else throw(("Unknow status " + flag))
680684 else throw("You are not allowed")
681685 }
682686
683687
684688
685689 @Callable(i)
686690 func deleteArtwork (artId,addr) = {
687- let $t02600526039 = idCallerDate(i)
688- let id = $t02600526039._1
689- let caller = $t02600526039._2
691+ let $t02611926153 = idCallerDate(i)
692+ let id = $t02611926153._1
693+ let caller = $t02611926153._2
690694 let addrToUse = if (containsElement([chris, toString(this)], caller))
691695 then addr
692696 else caller
693697 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
694698 if ((entryExist == ""))
695699 then throw("No art matching for this address")
696700 else {
697701 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
698702 if ((sha256Hash == ""))
699703 then throw("No art hash matching for this address")
700704 else {
701705 let signID = getStringByKey(keySignID(addrToUse, artId))
702706 if ((signID == ""))
703707 then throw("No SIGN ID matching")
704708 else {
705709 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))]
706710 if (!(isArtMinted(addrToUse, artId)))
707711 then if (!(dappRunning))
708712 then throw(maintenanceMSG)
709713 else dataToDelete
710714 else if (containsElement([chris, toString(this)], caller))
711715 then dataToDelete
712716 else throw("Art already minted, you cannot delete it")
713717 }
714718 }
715719 }
716720 }
717721
718722
719723
720724 @Callable(i)
721725 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
722- let $t02887528945 = idCallerDateSponsored(i, pubKey)
723- let id = $t02887528945._1
724- let caller = $t02887528945._2
725- let date = $t02887528945._3
726- let isSponsored = $t02887528945._4
726+ let $t02898929059 = idCallerDateSponsored(i, pubKey)
727+ let id = $t02898929059._1
728+ let caller = $t02898929059._2
729+ let date = $t02898929059._3
730+ let isSponsored = $t02898929059._4
727731 let artworkName = getStringByKey(keyName(caller, artId))
728732 if ((artworkName == ""))
729733 then throw("This art doesn't match your account")
730734 else {
731735 let flag = getStringByKey(keyFlag(caller, artId))
732736 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
733737 then throw("Flagged artwork")
734738 else {
735739 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
736740 if ((0 > blockEnd))
737741 then throw("Negative end")
738742 else if (if ((blockEnd > 0))
739743 then if ((maxMint != 1))
740744 then true
741745 else (price != 0)
742746 else false)
743747 then throw("Timed offer only allowed for unique edition and offer only")
744748 else {
745749 let baseHeight = if ((blockEnd == 0))
746750 then 0
747751 else height
748752 if (!(acceptedAssetIds(assetId)))
749753 then throw("Something went wrong!")
750754 else if (!(validateMinSell(assetId, price)))
751755 then throw("Something went wrong!")
752756 else {
753757 let checkUser = validateUser(caller)
754758 if ((checkUser != ""))
755759 then throw(checkUser)
756760 else {
757761 let amountSold = getIntegerByKey(keyIssued(caller, artId))
758762 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
759763 if ((maxMint > 100))
760764 then throw("100 editions max per artwork")
761765 else if (if ((amountSold != 0))
762766 then (amountSold == maxCanSell)
763767 else false)
764768 then throw("Max edition reached.")
765769 else if (if ((amountSold > 0))
766770 then (maxCanSell != maxMint)
767771 else false)
768772 then throw("Cannot change maximum issuable anymore")
769773 else if (if ((bidNbr > 0))
770774 then (maxCanSell != maxMint)
771775 else false)
772776 then throw("Cannot change maximum issuable with active orders")
773777 else {
774778 let sellStatus = if (if ((price > 0))
775779 then (maxMint > 0)
776780 else false)
777781 then true
778782 else false
779783 let txToCaller = if (isSponsored)
780784 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
781785 else nil
782786 ([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)
783787 }
784788 }
785789 }
786790 }
787791 }
788792 }
789793 }
790794
791795
792796
793797 @Callable(i)
794798 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", "")
795799
796800
797801
798802 @Callable(i)
799803 func setBid (artId,issuer) = {
800- let $t03132731367 = idCallerDate(i)
801- let id = $t03132731367._1
802- let caller = $t03132731367._2
803- let date = $t03132731367._3
804- let $t03137231408 = isPayment(i)
805- let payment = $t03137231408._1
806- let amount = $t03137231408._2
804+ let $t03144131481 = idCallerDate(i)
805+ let id = $t03144131481._1
806+ let caller = $t03144131481._2
807+ let date = $t03144131481._3
808+ let $t03148631522 = isPayment(i)
809+ let payment = $t03148631522._1
810+ let amount = $t03148631522._2
807811 let assetId = if (!(isDefined(payment.assetId)))
808812 then "WAVES"
809813 else toBase58String(value(payment.assetId))
810814 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
811815 if (if ((blockEnd != 0))
812816 then (height >= blockEnd)
813817 else false)
814818 then throw("Sale ended.")
815819 else {
816820 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
817821 if (!(acceptedAssetIds(assetId)))
818822 then throw("asset not accepted")
819823 else if (!(validateMinSell(assetId, amount)))
820824 then throw("Wrong min sell")
821825 else {
822826 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
823827 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
824828 if ((0 >= maxCanSell))
825829 then throw("No max edition set for this artwork")
826830 else if ((amountSold >= maxCanSell))
827831 then throw("Sold out, you cannot bid")
828832 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
829833 }
830834 }
831835 }
832836
833837
834838
835839 @Callable(i)
836840 func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = {
837- let $t03262832698 = idCallerDateSponsored(i, pubKey)
838- let id = $t03262832698._1
839- let caller = $t03262832698._2
840- let date = $t03262832698._3
841- let isSponsored = $t03262832698._4
841+ let $t03274232812 = idCallerDateSponsored(i, pubKey)
842+ let id = $t03274232812._1
843+ let caller = $t03274232812._2
844+ let date = $t03274232812._3
845+ let isSponsored = $t03274232812._4
842846 if ((caller != issuer))
843847 then throw("You cannot do this action")
844848 else buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
845849 }
846850
847851
848852
849853 @Callable(i)
850854 func cancelBid (artId,issuer,bidId,bidOwner) = {
851- let $t03293232993 = idCallerDate(i)
852- let id = $t03293232993._1
853- let caller = $t03293232993._2
854- let date = $t03293232993._3
855+ let $t03304633107 = idCallerDate(i)
856+ let id = $t03304633107._1
857+ let caller = $t03304633107._2
858+ let date = $t03304633107._3
855859 if (if ((caller != bidOwner))
856860 then (caller != issuer)
857861 else false)
858862 then throw("You cannot do this action")
859863 else {
860864 let returnMoneyTo = if ((caller == issuer))
861865 then bidOwner
862866 else caller
863867 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
864868 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
865869 let bidData = getStringByKey((bidDataKey + "_OPEN"))
866870 if ((bidData == ""))
867871 then throw("Bid not found")
868872 else {
869873 let bidDataArr = split(bidData, "_")
870874 let assetId = getBidAssetId(bidDataArr[0])
871875 let bidStatus = "CANCELED"
872876 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
873877 }
874878 }
875879 }
876880
877881
878882 @Verifier(tx)
879883 func verifier () = match tx {
880884 case inv: InvokeScriptTransaction =>
881885 if (if (if (if ((inv.function == "addArtwork"))
882886 then (inv.dApp == this)
883887 else false)
884888 then (inv.fee == 500000)
885889 else false)
886890 then (inv.feeAssetId == unit)
887891 else false)
888892 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[13])))
889893 else if (if (if (if ((inv.function == "updateArtwork"))
890894 then (inv.dApp == this)
891895 else false)
892896 then (inv.fee == 500000)
893897 else false)
894898 then (inv.feeAssetId == unit)
895899 else false)
896900 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
897901 else if (if (if (if ((inv.function == "sellArtwork"))
898902 then (inv.dApp == this)
899903 else false)
900904 then (inv.fee == 500000)
901905 else false)
902906 then (inv.feeAssetId == unit)
903907 else false)
904908 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
905909 else if (if (if (if ((inv.function == "acceptBid"))
906910 then (inv.dApp == this)
907911 else false)
908912 then (inv.fee == 500000)
909913 else false)
910914 then (inv.feeAssetId == unit)
911915 else false)
912916 then sigVerify_128Kb(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[4])))
913917 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
914918 case _ =>
915919 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
916920 }
917921

github/deemru/w8io/873ac7e 
274.14 ms