tx · ZcWuPVLVaCx4apnEpDD7yyM7QwGrUu2VCdxycmpRzMG

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.19000000 Waves

2023.03.24 07:18 [2503597] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "ZcWuPVLVaCx4apnEpDD7yyM7QwGrUu2VCdxycmpRzMG", "fee": 19000000, "feeAssetId": null, "timestamp": 1679631599034, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "2hdjteUNLYXPokXdzFUCFuWmPaSnjegC4g8JsdCTPw7iXsuzdQTjzJ6RvqTh5kcRM862uJ5M2K9MirLzSZFW8TFA" ], "script": "base64:BgL+FAgCEgQKAggIEhAKDggICAgICAgICAgICAEIEg8KDQgICAgICAgICAgIAQgSBgoECAgICBIECgIICBIICgYIAQEIAQgSBAoCCAgSBAoCCAgSBwoFCAgICAgSBgoECAgICCIOZ2V0U3RyaW5nQnlLZXkiA2tleSIIdW5pdFRlc3QiCW9yYWNsZUZlZSIIc2lnbkRhcHAiC2ZlZVJlY2VpdmVyIgh1c2VyRGFwcCINd2hpdGVsaXN0RGFwcCILc2lnbkFzc2V0SWQiC3VzZG5Bc3NldElkIgt1c2R0QXNzZXRJZCIMd2F2ZXNBc3NldElkIgVjaHJpcyIZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZSIPZ2V0SW50ZWdlckJ5S2V5Ig5jaGVja1doaXRlbGlzdCIPZ2V0Qm9vbGVhbkJ5S2V5IgdzaWduQ3V0Igt1c2RuV2F2ZUN1dCIOZGVmYXVsdExpY2VuY2UiEmRlZmF1bHRIYXNoTGljZW5jZSILZGFwcFJ1bm5pbmciDm1haW50ZW5hbmNlTVNHIg11c2VyU3VzcGVuZGVkIgt1c2VyUmVtb3ZlZCIQdXNlclVucmVnaXN0ZXJlZCILdXNlckFsbG93ZWQiGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UiFGNoZWNrU2lnbkNlcnRpZmljYXRlIgZzaWduSUQiBU93bmVyIgpzaGEyNTZIYXNoIgckbWF0Y2gwIgFhIgt2YWxpZGF0ZUNJRCIDY2lkIgx2YWxpZGF0ZUhhc2giBGhhc2giDWtleVVzZXJTdGF0dXMiBmNhbGxlciIHa2V5RGF0ZSIFYXJ0SWQiB2tleU5hbWUiB2tleURlc2MiDWtleURpc3BsYXlDaWQiDWtleUV4cG9ydEhhc2giDGtleUV4cG9ydENpZCIKa2V5TWF4TWludCIJa2V5U2lnbklEIglrZXlJc3N1ZWQiCWtleU9uU2FsZSIOa2V5TGljZW5jZUhhc2giDWtleUxpY2VuY2VDaWQiB2tleVRhZ3MiB2tleVR5cGUiB2tleU5vdGUiCmtleUNyYXdsZXIiDGtleVJveWFsdGllcyIIa2V5UHJpY2UiCmtleUVuZFNhbGUiEmtleUFzc2V0SWRBY2NlcHRlZCIHa2V5RmxhZyISa2V5QXJ0aXN0QWdlbnRBZGRyIgphcnRpc3RBZGRyIhRrZXlQcmltYXJ5U2hhcmVBZ2VudCIYa2V5QXJ0aXN0UHVibGljQWdlbnRBZGRyIhprZXlQcmltYXJ5U2hhcmVQdWJsaWNBZ2VudCIRa2V5SGFzaEJ5VHhpZEFkZHIiBHR4aWQiDmtleU93bmVyQnlIYXNoIg1rZXlpZEJ5U2lnbmlkIgZzaWduSWQiEmtleVR4aWRCeUhhc2hPd25lciIOdmFsaWRhdGVBbGxDSUQiCmNpZERpc3BsYXkiCWNpZEV4cG9ydCIKY2lkTGljZW5jZSIPdmFsaWRhdGVBbGxIYXNoIgxzaGEyNTZFeHBvcnQiDXNoYTI1NkxpY2VuY2UiDnZhbGlkYXRlU3RyaW5nIgNzdHIiA21heCIMdmFsaWRhdGVVc2VyIgp1c2VyU3RhdHVzIgpzZXRMSWNlbmNlIhN2YWxpZGF0ZUFydHdvcmtEYXRhIgpsaWNlbmNlQ0lEIgtsaWNlbmNlSGFzaCIEbmFtZSILZGVzY3JpcHRpb24iBHRhZ3MiCXJveWFsdGllcyIJY2hlY2tVc2VyIglpc1BheW1lbnQiAWkiB3BheW1lbnQiBmFtb3VudCIPdmFsaWRhdGVQYXltZW50IgskdDA5MTgwOTIxNiIHYXNzZXRJZCILaXNBcnRNaW50ZWQiCWFkZHJUb1VzZSIBYiIUdmFsaWRhdGVQcmljZUFzc2V0SWQiDHByaWNlQXNzZXRJZCIMYXJ0d29ya1ByaWNlIgskdDA5ODA0OTg0MCIQYWNjZXB0ZWRBc3NldElkcyIPdmFsaWRhdGVNaW5TZWxsIgVwcmljZSIMbWluU2VsbFdhdmVzIgttaW5TZWxsVXNkbiILbWluU2VsbFNpZ24iDWdldEJpZEFzc2V0SWQiFmdldFByaWNlQXNzZXRJZEZyb21CaWQiCmJpZERhdGFLZXkiB2JpZERhdGEiCmJpZERhdGFBcnIiCWJpZEFtb3VudCIKYmlkQXNzZXRJZCIVaWRDYWxsZXJEYXRlU3BvbnNvcmVkIgZwdWJLZXkiC2lzU3BvbnNvcmVkIhNnZXRfc3BvbnNvcmVkX3dhdmVzIgxpZENhbGxlckRhdGUiB2J1eU1pbnQiBmlzc3VlciIFYmlkSWQiCGJpZE93bmVyIg0kdDAxMzA0MTEzMTExIgJpZCIEZGF0ZSIFaXNCaWQiCGJsb2NrRW5kIg5jYWxsZXJJc0lzc3VlciIIdG90YWxORlQiC2FydHdvcmtOYW1lIghpc09uU2FsZSIKYW1vdW50U29sZCIKbWF4Q2FuU2VsbCINJHQwMTQ3MzcxNDkyOSIFYWdlbnQiCmFnZW50U2hhcmUiC3B1YmxpY0FnZW50IhBwdWJsaWNBZ2VudFNoYXJlIg1pc1doaXRlbGlzdGVkIgNjdXQiDWFtb3VudEZvclNpZ24iDmFtb3VudEZvckFnZW50IhRhbW91bnRGb3JQdWJsaWNBZ2VudCIQYW1vdW50Rm9yQ3JlYXRvciINbmV3QW1vdW50U29sZCIJaXNzdWVNZXRhIghpc3N1ZU5GVCIFaWRORlQiCnNlbGxTdGF0dXMiCnJlY2VpdmVORlQiCmFzc2V0SWRCaWQiCWJpZERlbE9sZCIJYmlkVXBkYXRlIgdzb2xkS2V5Iglzb2xkVmFsdWUiCHNvbGREYXRhIhRjb21taXNzaW9uc1dpdGhBZ2VudCIaY29tbWlzc2lvbnNXaXRoUHVibGljQWdlbnQiCnR4VG9DYWxsZXIiBmJ1eVJlcyIIYXNTdHJpbmciAmJ2IgNidjAiBmludm9rZSIDdmFsIgR0eXBlIgdjcmF3bGVyIg0kdDAyMDEwNTIwMTc4Ig0kdDAyMDI3OTIwMzQ4Ig92YWxpZGF0ZUFydHdvcmsiEHdoaXRlbGlzdGVkX2Ryb3AiDSR0MDIwNjQ3MjA3MzEiCmVudHJ5RXhpc3QiCWhhc2hFeGlzdCIPaXNTaWduQ2VydGlmaWVkIhdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcCINJHQwMjM3NjUyMzgzNSINJHQwMjM4NDUyMzkxNCIEZmxhZyIEYWRkciIEbm90ZSINJHQwMjU1NDEyNTU3NSINJHQwMjYwMTEyNjA0NSIMZGF0YVRvRGVsZXRlIgdtYXhNaW50Ig0kdDAyODg4MTI4OTUxIgZiaWROYnIiCmJhc2VIZWlnaHQiDSR0MDMxMzMzMzEzNzMiDSR0MDMxMzc4MzE0MTQiDSR0MDMyNjM0MzI3MDUiB2NhbGxlcjEiDSR0MDMyOTQwMzMwMDEiDXJldHVybk1vbmV5VG8iCWJpZFN0YXR1cyICdHgiCHZlcmlmaWVyIgNpbnZOAQFhAQFiCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFAWICAAABYwcAAWQJAQV2YWx1ZQEJAKYIAQkBAWEBAg9jb25mX29yYWNsZV9mZWUAAWUJAQV2YWx1ZQEJAKYIAQkBAWEBAhFjb25mX3NpZ253ZWJfZGFwcAABZgkBAWEBAhFjb25mX2ZlZV9yZWNlaXZlcgABZwMFAWMJAQV2YWx1ZQEJAKYIAQIjM010NFJHTUV5alNXWUFvY1RQcWQ1NXdkSFFRQjNQVTJVQ20JAQV2YWx1ZQEJAKYIAQkBAWEBAg9jb25mX3VzZXJzX2RhcHAAAWgJAQV2YWx1ZQEJAKYIAQkBAWEBAhNjb25mX3doaXRlbGlzdF9kYXBwAAFpCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9TSUdOAAFqCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9VU0ROAAFrCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9VU0RUAAFsAQAAAW0JAQFhAQIMY29uZl9hZG1pbl8xAQFuAQFiCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUBZAUBYgIfSW50ZWdlciB1bmRlZmluZSBvciAwIGluIG9yYWNsZQEBbwEBYgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFiAAABAXABAWIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUBaAUBYgAAAQFxAQFiCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFAWIHAAFyAAcAAXMACgABdAkBAWEBAhRjb25mX2RlZmF1bHRfbGljZW5jZQABdQkBAWEBAhljb25mX2RlZmF1bHRfbGljZW5jZV9oYXNoAAF2CQELdmFsdWVPckVsc2UCCQCbCAIFAWcCFGNvbmZfZGFwcF9pc19ydW5uaW5nBgABdwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQFnAhRjb25mX21haW50ZW5hbmNlX21zZwIAAAF4AglTVVNQRU5ERUQAAXkCB1JFTU9WRUQAAXoCDFVOUkVHSVNURVJFRAABQQIHQUxMT1dFRAABQgkBAW4BCQCsAgICEmNlcnRpZmljYXRpb25fZmVlXwkA2AQBBQFpAQFDAwFEAUUBRgQBRwkAnQgCBQFlCQCsAgIJAKwCAgkArAICAghkYXRhX2ZjXwUBRAIBXwUBRQMJAAECBQFHAgZTdHJpbmcEAUgFAUcDCQEIY29udGFpbnMCBQFIBQFGBgcHAQFJAQFKAwkBCGNvbnRhaW5zAgUBSgIBLwMDCQBmAgBMCQCxAgEFAUoJAAACCQCxAgEJAJEDAgkAtQkCBQFKAgEvAAAAOwcJAGYCABAJALECAQkAkQMCCQC1CQIFAUoCAS8AAQcHAQFLAQFMCQAAAgkAsQIBBQFMAEABAU0BAU4JAKwCAgIMdXNlcl9zdGF0dXNfBQFOAQFPAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF9kYXRlXwUBUAIBXwUBTgEBUQIBTgFQCQCsAgIJAKwCAgkArAICAglhcnRfbmFtZV8FAVACAV8FAU4BAVICAU4BUAkArAICCQCsAgIJAKwCAgIJYXJ0X2Rlc2NfBQFQAgFfBQFOAQFTAgFOAVAJAKwCAgkArAICCQCsAgICEGFydF9kaXNwbGF5X2NpZF8FAVACAV8FAU4BAVQCAU4BUAkArAICCQCsAgIJAKwCAgIQYXJ0X2V4cG9ydF9oYXNoXwUBUAIBXwUBTgEBVQIBTgFQCQCsAgIJAKwCAgkArAICAg9hcnRfZXhwb3J0X2NpZF8FAVACAV8FAU4BAVYCAU4BUAkArAICCQCsAgIJAKwCAgIMYXJ0X21heG1pbnRfBQFQAgFfBQFOAQFXAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9zaWduaWRfBQFQAgFfBQFOAQFYAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9pc3N1ZWRfBQFQAgFfBQFOAQFZAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9vbnNhbGVfBQFQAgFfBQFOAQFaAgFOAVAJAKwCAgkArAICCQCsAgICEWFydF9saWNlbmNlX2hhc2hfBQFQAgFfBQFOAQJhYQIBTgFQCQCsAgIJAKwCAgkArAICAhBhcnRfbGljZW5jZV9jaWRfBQFQAgFfBQFOAQJhYgIBTgFQCQCsAgIJAKwCAgkArAICAglhcnRfdGFnc18FAVACAV8FAU4BAmFjAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF90eXBlXwUBUAIBXwUBTgECYWQCAU4BUAkArAICCQCsAgIJAKwCAgIJYXJ0X25vdGVfBQFQAgFfBQFOAQJhZQIBTgFQCQCsAgIJAKwCAgkArAICAhBhcnRfY3Jhd2xlcl9jaWRfBQFQAgFfBQFOAQJhZgIBTgFQCQCsAgIJAKwCAgkArAICAg5hcnRfcm95YWx0aWVzXwUBUAIBXwUBTgECYWcCAU4BUAkArAICCQCsAgIJAKwCAgIKYXJ0X3ByaWNlXwUBUAIBXwUBTgECYWgCAU4BUAkArAICCQCsAgIJAKwCAgIMYXJ0X2VuZHNhbGVfBQFQAgFfBQFOAQJhaQIBTgFQCQCsAgIJAKwCAgkArAICAhJhcnRfYXNzZXRBY2NlcHRlZF8FAVACAV8FAU4BAmFqAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF9mbGFnXwUBUAIBXwUBTgECYWsBAmFsCQCsAgICDWFydGlzdF9hZ2VudF8FAmFsAQJhbQECYWwJAKwCAgIVYXJ0aXN0X2FnZW50X3ByaW1hcnlfBQJhbAECYW4BAmFsCQCsAgICFGFydGlzdF9wdWJsaWNfYWdlbnRfBQJhbAECYW8BAmFsCQCsAgICHGFydGlzdF9wdWJsaWNfYWdlbnRfcHJpbWFyeV8FAmFsAQJhcAIBTgJhcQkArAICCQCsAgIJAKwCAgITZ2V0X2hhc2hieXR4aWRhZGRyXwUCYXECAV8FAU4BAmFyAQFGCQCsAgICEmdldF9vd25lcl9ieV9oYXNoXwUBRgECYXMCAU4CYXQJAKwCAgkArAICCQCsAgICEmdldF9hcnRpZGJ5c2lnbmlkXwUCYXQCAV8FAU4BAmF1AgFGAU4JAKwCAgIXZ2V0X3R4aWRfYnlfaGFzaF9vd25lcl8JANgEAQkA1BYBCQCbAwEJAKwCAgUBRgUBTgECYXYDAmF3AmF4AmF5AwkBASEBCQEBSQEFAmF3CQACAQIRV3JvbmcgRGlzcGxheSBDSUQDCQEBIQEJAQFJAQUCYXgJAAIBAhBXcm9uZyBFeHBvcnQgQ0lEAwMJAQIhPQIFAmF5AgAJAQEhAQkBAUkBBQJheQcJAAIBAhFXcm9uZyBMaWNlbmNlIENJRAYBAmF6AgJhQQJhQgMJAQEhAQkBAUsBBQJhQQkAAgECGEV4cG9ydCBIYXNoIDY0IGNoYXIuIG1heAMJAQEhAQkBAUsBBQJhQgkAAgECGUxpY2VuY2UgSGFzaCA2NCBjaGFyLiBtYXgGAQJhQwICYUQCYUUDCQAAAgkAsQIBBQJhRAAACQACAQIYRmllbGQgY2Fubm90IGJlIGlzIGVtcHR5AwkAZgIJALECAQUCYUQFAmFFCQACAQkArAICBQJhRAIMIGlzIHRvbyBsb25nBgECYUYBAU4EAmFHCQELdmFsdWVPckVsc2UCCQCdCAIFAWcJAQFNAQUBTgUBegMDCQAAAgUCYUcFAXoGCQAAAgUCYUcFAUECLlJlZ2lzdGVyIHRoaXMgYWNjb3VudCBmaXJzdCB3aXRoICJBY2NvdW50IiB0YWIDCQAAAgUCYUcFAXgCEUFjY291bnQgc3VzcGVuZGVkAwkAAAIFAmFHBQF5Ag9BY2NvdW50IHJlbW92ZWQCAAECYUgCAmF5AmFCBAFKAwkAAAIJALECAQUCYXkAAAUBdAUCYXkEAUwDCQAAAgkAsQIBBQJhQgAABQF1BQJhQgkAlAoCBQFKBQFMAQJhSQoBTgJhdwJheAJhSgJhQQJhSwJhTAJhTQJhTgJhTwQCYVAJAQJhRgEFAU4DCQECIT0CBQJhUAIACQACAQUCYVADCQAAAgkAsQIBBQJhdwAACQACAQIbRGlzcGxheSBDSUQgY2Fubm90IGJlIGVtcHR5AwkBASEBCQECYXYDBQJhdwUCYXgFAmFKCQACAQIQUHJvYmxlbSB3aXRoIENJRAMJAQEhAQkBAmF6AgUCYUEFAmFLCQACAQITUHJvYmxlbSB3aXRoIEhhc2hlcwMJAQEhAQkBAmFDAgUCYUwAZAkAAgECEjEwMCBDaGFyLiBtYXggbmFtZQMJAQEhAQkBAmFDAgUCYU0A6AcJAAIBAhoxMDAwIENoYXIuIG1heCBkZXNjcmlwdGlvbgMDCQBmAgAABQJhTwYJAGYCBQJhTwDoBwkAAgECM1JveWFsdGllcyBjYW5ub3QgYmUgbGVzcyB0aGFuIDAlIG9yIGhpZ2hlciB0aGFuIDEwJQMJAGYCCQCQAwEJALUJAgUCYU4CASwABQkAAgECCzUgdGFncyBtYXguAgABAmFRAQJhUgMJAAACCQCQAwEIBQJhUghwYXltZW50cwAACQACAQITTm8gcGF5bWVudCBhdHRhY2hlZAQCYVMJAQV2YWx1ZQEJAJEDAggFAmFSCHBheW1lbnRzAAAEAmFUCQEFdmFsdWUBCAUCYVMGYW1vdW50CQCUCgIFAmFTBQJhVAECYVUBAmFSBAJhVgkBAmFRAQUCYVIEAmFTCAUCYVYCXzEEAmFUCAUCYVYCXzIEAmFXAwMJAQlpc0RlZmluZWQBCAUCYVMHYXNzZXRJZAkAAAIIBQJhUwdhc3NldElkBQFpBwgFAmFTB2Fzc2V0SWQJAAIBAitPbmx5IFNJR04gdG9rZW4gYWNjZXB0ZWQgYXMgdHJhbnNhY3Rpb24gZmVlAwkBAiE9AgUCYVQFAUIJAAIBCQCsAgICGVBheW1lbnQgYW1vdW50IHNob3VsZCBiZSAJAKQDAQUBQgkAlAoCBQJhVAUCYVcBAmFYAgJhWQFQBAFHCQCaCAIFBHRoaXMJAQFYAgUCYVkFAVADCQABAgUBRwIDSW50BAJhWgUBRwMJAQIhPQIFAmFaAAAGBwcBAmJhAwJhUgJiYgJiYwQCYmQJAQJhUQEFAmFSBAJhUwgFAmJkAl8xBAJhVAgFAmJkAl8yBAJhVwMJAQEhAQkBCWlzRGVmaW5lZAEIBQJhUwdhc3NldElkBQR1bml0AwMJAGYCCQCxAgEFAmJiAAAJAAACCQDYBAEJAQV2YWx1ZQEIBQJhUwdhc3NldElkBQJiYgcIBQJhUwdhc3NldElkCQACAQIOV3JvbmcgYXNzZXQgaWQDAwkAAAIFAmFXBQR1bml0CQECIT0CBQJiYgIABwkAAgECDldyb25nIGFzc2V0IGlkAwkBAiE9AgUCYmMFAmFUCQACAQITUGF5bWVudCBkb24ndCBtYXRjaAkAlAoCBQJhVAUCYVcBAmJlAQJhVwMDAwMDCQECIT0CBQJhVwkA2AQBBQFpCQECIT0CBQJhVwkA2AQBBQFsBwkBAiE9AgUCYVcCBVdBVkVTBwkBAiE9AgUCYVcJANgEAQUBagcJAQIhPQIFAmFXCQDYBAEFAWsHCQACAQImT25seSBTSUdOLCBVU0ROLFVTRFQgb3IgV0FWRVMgYWNjZXB0ZWQGAQJiZgICYVcCYmcEAmJoAwUBYwAKCQEBbgECDndhdmVzX21pbl9zZWxsBAJiaQDAhD0EAmJqAwUBYwABCQBoAgUBQgACAwMDAwMDCQAAAgUCYVcJANgEAQUBagkAZgIFAmJpBQJiZwcJAQIhPQIFAmJnAAAHBgMDCQAAAgUCYVcJANgEAQUBawkAZgIFAmJpBQJiZwcJAQIhPQIFAmJnAAAHBgMDCQAAAgUCYVcJANgEAQUBaQkAZgIFAmJqBQJiZwcJAQIhPQIFAmJnAAAHBgMDAwkAAAIFAmFXCQDYBAEFAWwGCQAAAgUCYVcCBVdBVkVTCQBmAgUCYmgFAmJnBwkBAiE9AgUCYmcAAAcJAAIBAhhXcm9uZyBtaW5pbXVtIHNlbGwgcHJpY2UGAQJiawECYVcDCQAAAgUCYVcCBVdBVkVTBQR1bml0CQDZBAEFAmFXAQJibAECYm0EAmJuCQEBYQEJAKwCAgUCYm0CBV9PUEVOAwkAAAIFAmJuAgAJAAIBAg1CaWQgbm90IGZvdW5kBAJibwkAtQkCBQJibgIBXwQCYnAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJibwABBAJicQkBAmJrAQkAkQMCBQJibwAAAwkAZwIAAAUCYnAJAAIBAgxXcm9uZyBhbW91bnQJAJQKAgUCYnAFAmJxAQJicgICYVICYnMDCQEBIQEFAXYJAAIBBQF3BAJidAMJAQIhPQIFAmJzAgAJAQt2YWx1ZU9yRWxzZQIJAQFwAQkArAICCQClCAEJAKcIAQkA2QQBBQJicwIJX2ZyZWVfdHhzAAAAAAQBTgMDCQAAAgkA2AQBCAgFAmFSBmNhbGxlcgVieXRlcwkApQgBBQR0aGlzCQBmAgUCYnQAAAcJAKUIAQkApwgBCQDZBAEFAmJzCQDYBAEICAUCYVIGY2FsbGVyBWJ5dGVzBAJidQMDCQECIT0CBQJicwIACQBmAgUCYnQAAAcJAPwHBAUBaAIJdXNlRnJlZVR4CQDMCAIJAKUIAQkApwgBCQDZBAEFAmJzBQNuaWwFA25pbAUEdW5pdAMJAAACBQJidQUCYnUJAJYKBAkA2AQBCAUCYVINdHJhbnNhY3Rpb25JZAUBTggFCWxhc3RCbG9jawl0aW1lc3RhbXAJAGYCBQJidAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJidgECYVIDCQEBIQEFAXYJAAIBBQF3CQCVCgMJANgEAQgFAmFSDXRyYW5zYWN0aW9uSWQJANgEAQgIBQJhUgZjYWxsZXIFYnl0ZXMIBQlsYXN0QmxvY2sJdGltZXN0YW1wAQJidwYCYVIBUAJieAJieQJiegJicwQCYkEJAQJicgIFAmFSBQJicwQCYkIIBQJiQQJfMQQBTggFAmJBAl8yBAJiQwgFAmJBAl8zBAJidAgFAmJBAl80AwYJAAIBCQCsAgIJAKwCAgkApQMBCQAAAgUBTgUCYngCAyAvIAkApQMBBQJidAQCYkQDAwMJAAACBQFOBQJieAkBAiE9AgUCYnoCAAcJAQIhPQIFAmJ5AgAHBgcEAmJFCQEBbwEJAQJhaAIFAU4FAVADAwMJAQIhPQIFAmJFAAAJAGcCBQZoZWlnaHQFAmJFBwkBASEBBQJiRAcJAAIBAgtTYWxlIGVuZGVkLgQCYkYJAAACBQFOBQJieAQCYkcJAQFvAQIQdG90YWxfbmZ0X2lzc3VlZAQBRAkBAWEBCQEBVwIFAmJ4BQFQBAJiSAkBAWEBCQEBUQIFAmJ4BQFQAwkAAAIFAmJIAgAJAAIBAhFBcnQgZG9lc24ndCBleGlzdAQCYkkJAQFxAQkBAVkCBQJieAUBUAQCYkoJAQFvAQkBAVgCBQJieAUBUAQCYmMDBQJiRgkAaAIFAUIAAgkBAW8BCQECYWcCBQJieAUBUAQCYmIDBQJiRgkA2AQBBQFpCQEBYQEJAQJhaQIFAmJ4BQFQBAJiSwkBAW8BCQEBVgIFAmJ4BQFQAwMDCQEBIQEFAmJECQEBIQEFAmJGBwMDCQBnAgAABQJiYwYJAQEhAQUCYkkGCQBnAgAABQJiSwcJAAIBAhBBcnQgbm90IGZvciBzYWxlAwMDCQEBIQEFAmJEBQJiRgcJAGcCAAAFAmJLBwkAAgECFE1heCBpc3N1YWJsZSBub3Qgc2V0BAJhUAkBAmFGAQUCYngDAwUCYkQJAQIhPQIFAmFQAgAHCQACAQUCYVAEAmJtCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FAVACAV8FAmJ4AgFfBQJiegIBXwUCYnkEAmJMAwUCYkQJAQJibAEFAmJtCQECYmEDBQJhUgUCYmIFAmJjBAJhVAgFAmJMAl8xBAJhVwgFAmJMAl8yBAJiTQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQFnCQECYWsBBQJieAUBZgQCYk4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUBZwkBAmFtAQUCYngAAAQCYk8JAQt2YWx1ZU9yRWxzZQIJAJ0IAgUBZwkBAmFuAQUCYngFAWYEAmJQCQELdmFsdWVPckVsc2UCCQCaCAIFAWcJAQJhbwEFAmJ4AAAEAmJRCQEBcAEFAmJ4BAJiUgMJAGYCBQJiUQUGaGVpZ2h0AAADCQAAAgUCYVcFAWkFAXIFAXMEAmJTCQBrAwUCYVQFAmJSAGQEAmJUAwMDCQECIT0CBQJiTQUBZgkAZgIFAmJOAAAHCQBmAgUGaGVpZ2h0BQJiUQcJAGsDBQJhVAUCYk4AkE4AAAQCYlUDAwMJAQIhPQIFAmJPBQFmCQBmAgUCYlAAAAcJAGYCBQZoZWlnaHQFAmJRBwkAawMFAmFUBQJiUACQTgAABAJiVgkAZQIFAmFUBQJiUwMJAAACBQJiSgUCYksJAAIBAgxBcnQgc29sZCBvdXQEAmJXCQBkAgUCYkoAAQQCYlgJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglDcmVhdG9yOiAFAmJ4AgosCiBBcnRJRDogBQFQAgssCiBTaWduSUQ6IAUBRAIRLAogQXJ0d29yayBuYW1lOiAFAmJIAgosCiBJc3N1ZTogCQCkAwEFAmJXAgEvCQCkAwEFAmJLBAJiWQkAwggFCQCsAgICA1NBXwkApAMBCQBkAgUCYkcAAQUCYlgAAQAABwQCYloJALgIAQUCYlkEAmNhAwMJAAACBQJiVwUCYksGCQEBIQEFAmJJBwYEAmNiAwMDCQAAAgUBTgUCYngJAQIhPQIFAmJ6AgAHCQECIT0CBQJieQIABwkBEUBleHRyTmF0aXZlKDEwNjIpAQUCYnoIBQJhUgZjYWxsZXIEAmNjAwkBASEBCQEJaXNEZWZpbmVkAQUCYVcCBVdBVkVTCQDYBAEJAQV2YWx1ZQEFAmFXBAJibgkBAWEBCQCsAgIFAmJtAgVfT1BFTgQCY2QJAQtEZWxldGVFbnRyeQEJAKwCAgUCYm0CBV9PUEVOBAJjZQkBC1N0cmluZ0VudHJ5AgkArAICBQJibQIHX0NMT1NFRAkArAICCQCsAgIFAmJuAgFfCQCkAwEFAmJDBAJjZgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglhcnRfc29sZF8JAKQDAQUCYlcCBF9vZl8JAKQDAQUCYksCAV8FAVACAV8FAmJ4BAJjZwMJAQEhAQUCYkQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUBTgIBXwkApAMBBQJiQwIBXwUCYkICAV8JAKQDAQUCYmMCAV8FAmJiAgFfCQDYBAEFAmJaCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQUCY2ICAV8JAKQDAQUCYkMCAV8FAmJCAgFfCQCkAwEFAmFUAgFfBQJjYwIBXwkA2AQBBQJiWgQCY2gJAQtTdHJpbmdFbnRyeQIFAmNmBQJjZwQCY2kDCQECIT0CBQJiVAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQFmCQBlAgUCYlMFAmJUBQJhVwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUCYk0FAmJUBQJhVwUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQFmBQJiUwUCYVcFA25pbAQCY2oDCQECIT0CBQJiVQAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQJiTwUCYlUFAmFXCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQJieAkAZQIFAmJWBQJiVQUCYVcFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUCYngFAmJWBQJhVwUDbmlsBAJjawMFAmJ0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQFOAAAFBHVuaXQFA25pbAUDbmlsBAJjbAkAzggCCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVgCBQJieAUBUAUCYlcJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICAgRuZnRfCQDYBAEFAmJaBQJjZgkAzAgCCQEMSW50ZWdlckVudHJ5AgIQdG90YWxfbmZ0X2lzc3VlZAkAZAIFAmJHAAEJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhaAIFAmJ4BQFQAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQFZAgUCYngFAVAFAmNhCQDMCAIFAmJZCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmNiAAEFAmJaBQNuaWwFAmNpBQJjagUCY2sDBQJiRAkAzAgCBQJjaAkAzAgCBQJjZQkAzAgCBQJjZAUCY2wJAMwIAgUCY2gFAmNsAQJjbQECY24EAUcFAmNuAwkAAQIFAUcCBlN0cmluZwQCY28FAUcFAmNvCQACAQIkU3BvbnNvcmVkIFB1YmxpYyBLZXkgU3RyaW5nIGV4cGVjdGVkCgJjcAEHc2V0Q29uZgIBYgJjcQQBTgkApQgBCAUCY3AGY2FsbGVyAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUBbQkAzAgCCQClCAEFBHRoaXMFA25pbAUBTgMJAQhjb250YWlucwIFAWICBWNvbmZfCQDMCAIJAQtTdHJpbmdFbnRyeQIFAWIFAmNxBQNuaWwJAAIBAiBFbnRyaWVzIHN0YXJ0aW5nIHdpdGggY29uZl8gb25seQkAAgECIllvdSBhcmUgbm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoaXMCYVIBCmFkZEFydHdvcmsOAUYBRAJhTAJhTQJhTgJjcgJhdwJhQQJheAJhQgJheQJjcwJhTwJicwQCY3QJAQJicgIFAmFSBQJicwQBUAgFAmN0Al8xBAFOCAUCY3QCXzIEAmJDCAUCY3QCXzMEAmJ0CAUCY3QCXzQDCQEBIQEJAQFLAQUBRgkAAgECJEhhc2ggc2hvdWxkIGJlIDY0IGNoYXJhY3RlcnMgbWF4aW11bQQCY3UJAQJhSAIFAmF5BQJhQgQCYUoIBQJjdQJfMQQCYUsIBQJjdQJfMgQCY3YJAQJhSQoFAU4FAmF3BQJheAUCYUoFAmFBBQJhSwUCYUwFAmFNBQJhTgUCYU8DCQECIT0CBQJjdgIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAJjdwkAZgIJAQFwAQkArAICBQFOAgtfZnJlZV9kcm9wcwAABAJjeAMFAmN3CQCUCgIAAAUBRAkBAmFVAQUCYVIEAmFUCAUCY3gCXzEEAmFXCAUCY3gCXzIDCQEBIQEJAQlpc0RlZmluZWQBBQJhVAkAAgECFFNvbWV0aGluZyB3ZW50IHdyb25nBAJjeQkBAWEBCQECYXUCBQFGBQFOAwkBAiE9AgUCY3kCAAkAAgECFFlvdSBhbHJlYWR5IGFkZGVkIGl0BAJjegkBAWEBCQECYXIBBQFGAwkBAiE9AgUCY3oCAAkAAgECF0hhc2ggYWxyZWFkeSByZWdpc3RlcmVkBAJjQQkBAUMDBQFEBQFOBQFGAwkBASEBBQJjQQkAAgECLFNpZ24gQ2VydGlmaWNhdGUgbm90IGZvdW5kIGZvciB0aGlzIGFkZHJlc3MuBAJjQgMFAmN3CQD8BwQFAWgCC3VzZUZyZWVEcm9wCQDMCAIFAU4FA25pbAUDbmlsBQR1bml0AwkAAAIFAmNCBQJjQgQCY2sDBQJidAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUBTgAABQR1bml0BQNuaWwFA25pbAkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhcgEFAUYFAU4JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmF1AgUBRgUBTgUBUAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAU8CBQFOBQFQBQJiQwkAzAgCCQELU3RyaW5nRW50cnkCCQEBUQIFAU4FAVAFAmFMCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFSAgUBTgUBUAUCYU0JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVMCBQFOBQFQBQJhdwkAzAgCCQELU3RyaW5nRW50cnkCCQEBVQIFAU4FAVAFAmF4CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFUAgUBTgUBUAUCYUEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVoCBQFOBQFQBQJhSwkAzAgCCQELU3RyaW5nRW50cnkCCQECYWECBQFOBQFQBQJhSgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWMCBQFOBQFQBQJjcgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWICBQFOBQFQBQJhTgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVYCBQFOBQFQAAAJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVcCBQFOBQFQBQFECQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBWAIFAU4FAVAAAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAVkCBQFOBQFQBwkAzAgCCQELU3RyaW5nRW50cnkCCQECYXMCBQFOBQFEBQFQCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhcAIFAU4FAVAFAUYJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFlAgUBTgUBUAUCY3MJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhZgIFAU4FAVAFAmFPCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQFmBQJhVAUBaQUDbmlsBQJjawkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhUgENdXBkYXRlQXJ0d29yaw0CYXECYUwCYU0CYU4CY3ICYXcCYUECYXgCYUICYXkCY3MCYU8CYnMDCQEBIQEFAXYJAAIBBQF3BAJjQwkBAmJyAgUCYVIFAmJzBAJiQggFAmNDAl8xBAFOCAUCY0MCXzIEAmJDCAUCY0MCXzMEAmJ0CAUCY0MCXzQEAmNECQECYUgCBQJheQUCYUIEAmFKCAUCY0QCXzEEAmFLCAUCY0QCXzIEAmN2CQECYUkKBQFOBQJhdwUCYXgFAmFKBQJhQQUCYUsFAmFMBQJhTQUCYU4FAmFPAwkBAiE9AgUCY3YCAAkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQQCY3kJAQFhAQkBAVECBQFOBQJhcQMJAAACBQJjeQIACQACAQIPRW50cnkgbm90IGZvdW5kBAJjRQkBAWEBCQECYWoCBQFOBQJhcQMJAAACBQJjRQIHSUxMRUdBTAkAAgECHUNhbm5vdCB1cGRhdGUgSUxMRUdBTCBhcnR3b3JrAwkBASEBCQECYVgCBQFOBQJhcQQCY2sDBQJidAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUBTgAABQR1bml0BQNuaWwFA25pbAkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFRAgUBTgUCYXEFAmFMCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFSAgUBTgUCYXEFAmFNCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFTAgUBTgUCYXEFAmF3CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFVAgUBTgUCYXEFAmF4CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFUAgUBTgUCYXEFAmFBCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYQIFAU4FAmFxBQJhSgkAzAgCCQELU3RyaW5nRW50cnkCCQEBWgIFAU4FAmFxBQJhSwkAzAgCCQELU3RyaW5nRW50cnkCCQECYWICBQFOBQJhcQUCYU4JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFjAgUBTgUCYXEFAmNyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhZQIFAU4FAmFxBQJjcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFmAgUBTgUCYXEFAmFPBQNuaWwFAmNrCQACAQIOQWxyZWFkeSBtaW50ZWQCYVIBC2ZsYWdBcnR3b3JrBAFQAmNGAmNFAmNHBAJjSAkBAmJ2AQUCYVIEAmJCCAUCY0gCXzEEAU4IBQJjSAJfMgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFAW0JAMwIAgkApQgBBQR0aGlzBQNuaWwFAU4DCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAgdDT05TRU5UCQDMCAICAAkAzAgCAg9DSEFOR0VfUkVRVUlSRUQJAMwIAgIHRkxBR0dFRAkAzAgCAgdJTExFR0FMBQNuaWwFAmNFCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhagIFAmNGBQFQBQJjRQkAzAgCCQELU3RyaW5nRW50cnkCCQECYWQCBQJjRgUBUAUCY0cFA25pbAkAAgEJAKwCAgIOVW5rbm93IHN0YXR1cyAFAmNFCQACAQITWW91IGFyZSBub3QgYWxsb3dlZAJhUgENZGVsZXRlQXJ0d29yawIBUAJjRgQCY0kJAQJidgEFAmFSBAJiQggFAmNJAl8xBAFOCAUCY0kCXzIEAmFZAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUBbQkAzAgCCQClCAEFBHRoaXMFA25pbAUBTgUCY0YFAU4EAmN5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAQFhAQkBAVECBQJhWQUBUAIgTm8gYXJ0IG1hdGNoaW5nIGZvciB0aGlzIGFkZHJlc3MDCQAAAgUCY3kCAAkAAgECIE5vIGFydCBtYXRjaGluZyBmb3IgdGhpcyBhZGRyZXNzBAFGCQEBYQEJAQJhcAIFAmFZBQFQAwkAAAIFAUYCAAkAAgECJU5vIGFydCBoYXNoIG1hdGNoaW5nIGZvciB0aGlzIGFkZHJlc3MEAUQJAQFhAQkBAVcCBQJhWQUBUAMJAAACBQFEAgAJAAIBAhNObyBTSUdOIElEIG1hdGNoaW5nBAJjSgkAzAgCCQELRGVsZXRlRW50cnkBCQEBTwIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFRAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVICBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBUwIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFVAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVQCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBWgIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhYQIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhYwIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhYgIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFWAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVcCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBWAIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFZAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFqAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFnAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFpAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFyAQUBRgkAzAgCCQELRGVsZXRlRW50cnkBCQECYXMCBQJhWQUBRAkAzAgCCQELRGVsZXRlRW50cnkBCQECYXUCBQFGBQJhWQkAzAgCCQELRGVsZXRlRW50cnkBCQECYWgCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWQCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWUCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWYCBQJhWQUBUAUDbmlsAwkBASEBCQECYVgCBQJhWQUBUAMJAQEhAQUBdgkAAgEFAXcFAmNKAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUBbQkAzAgCCQClCAEFBHRoaXMFA25pbAUBTgUCY0oJAAIBAihBcnQgYWxyZWFkeSBtaW50ZWQsIHlvdSBjYW5ub3QgZGVsZXRlIGl0AmFSAQtzZWxsQXJ0d29yawYBUAJiZwJjSwJhVwJiRQJicwQCY0wJAQJicgIFAmFSBQJicwQCYkIIBQJjTAJfMQQBTggFAmNMAl8yBAJiQwgFAmNMAl8zBAJidAgFAmNMAl80BAJiSAkBAWEBCQEBUQIFAU4FAVADCQAAAgUCYkgCAAkAAgECI1RoaXMgYXJ0IGRvZXNuJ3QgbWF0Y2ggeW91ciBhY2NvdW50BAJjRQkBAWEBCQECYWoCBQFOBQFQAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgIPQ0hBTkdFX1JFUVVJUkVECQDMCAICB0ZMQUdHRUQJAMwIAgIHSUxMRUdBTAUDbmlsBQJjRQkAAgECD0ZsYWdnZWQgYXJ0d29yawQCY00JAQFvAQkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FAVADCQBmAgAABQJiRQkAAgECDE5lZ2F0aXZlIGVuZAMDCQBmAgUCYkUAAAMJAQIhPQIFAmNLAAEGCQECIT0CBQJiZwAABwkAAgECOlRpbWVkIG9mZmVyIG9ubHkgYWxsb3dlZCBmb3IgdW5pcXVlIGVkaXRpb24gYW5kIG9mZmVyIG9ubHkEAmNOAwkAAAIFAmJFAAAAAAUGaGVpZ2h0AwkBASEBCQECYmUBBQJhVwkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQMJAQEhAQkBAmJmAgUCYVcFAmJnCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAJhUAkBAmFGAQUBTgMJAQIhPQIFAmFQAgAJAAIBBQJhUAQCYkoJAQFvAQkBAVgCBQFOBQFQBAJiSwkBAW8BCQEBVgIFAU4FAVADCQBmAgUCY0sAZAkAAgECHDEwMCBlZGl0aW9ucyBtYXggcGVyIGFydHdvcmsDAwkBAiE9AgUCYkoAAAkAAAIFAmJKBQJiSwcJAAIBAhRNYXggZWRpdGlvbiByZWFjaGVkLgMDCQBmAgUCYkoAAAkBAiE9AgUCYksFAmNLBwkAAgECJkNhbm5vdCBjaGFuZ2UgbWF4aW11bSBpc3N1YWJsZSBhbnltb3JlAwMJAGYCBQJjTQAACQECIT0CBQJiSwUCY0sHCQACAQIxQ2Fubm90IGNoYW5nZSBtYXhpbXVtIGlzc3VhYmxlIHdpdGggYWN0aXZlIG9yZGVycwQCY2EDAwkAZgIFAmJnAAAJAGYCBQJjSwAABwYHBAJjawMFAmJ0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQFOAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQFZAgUBTgUBUAUCY2EJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhZwIFAU4FAVAFAmJnCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVgIFAU4FAVAFAmNLCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhaQIFAU4FAVAFAmFXCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWgCBQFOBQFQCQBkAgUCY04FAmJFBQNuaWwFAmNrAmFSAQpidXlBcnR3b3JrAgFQAmJ4CQECYncGBQJhUgUBUAUCYngCAAIAAgACYVIBBnNldEJpZAIBUAJieAQCY08JAQJidgEFAmFSBAJiQggFAmNPAl8xBAFOCAUCY08CXzIEAmJDCAUCY08CXzMEAmNQCQECYVEBBQJhUgQCYVMIBQJjUAJfMQQCYVQIBQJjUAJfMgQCYVcDCQEBIQEJAQlpc0RlZmluZWQBCAUCYVMHYXNzZXRJZAIFV0FWRVMJANgEAQkBBXZhbHVlAQgFAmFTB2Fzc2V0SWQEAmJFCQEBbwEJAQJhaAIFAmJ4BQFQAwMJAQIhPQIFAmJFAAAJAGcCBQZoZWlnaHQFAmJFBwkAAgECC1NhbGUgZW5kZWQuBAJjTQkBAW8BCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUBUAMJAQEhAQkBAmJlAQUCYVcJAAIBAhJhc3NldCBub3QgYWNjZXB0ZWQDCQEBIQEJAQJiZgIFAmFXBQJhVAkAAgECDldyb25nIG1pbiBzZWxsBAJiSgkBAW8BCQEBWAIFAmJ4BQFQBAJiSwkBAW8BCQEBVgIFAmJ4BQFQAwkAZwIAAAUCYksJAAIBAiNObyBtYXggZWRpdGlvbiBzZXQgZm9yIHRoaXMgYXJ0d29yawMJAGcCBQJiSgUCYksJAAIBAhhTb2xkIG91dCwgeW91IGNhbm5vdCBiaWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FAVACAV8FAmJ4AgFfBQFOAgFfBQJiQgIFX09QRU4JAKwCAgkArAICCQCsAgIJAKwCAgUCYVcCAV8JAKQDAQUCYVQCAV8JAKQDAQUCYkMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQFQCQBkAgUCY00AAQUDbmlsAmFSAQlhY2NlcHRCaWQFAVACYngCYnkCYnoCYnMEAmNRCQECYnICBQJhUgUCYnMEAmJCCAUCY1ECXzEEAmNSCAUCY1ECXzIEAmJDCAUCY1ECXzMEAmJ0CAUCY1ECXzQDCQECIT0CBQJjUgUCYngJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uCQECYncGBQJhUgUBUAUCYngFAmJ5BQJiegUCYnMCYVIBCWNhbmNlbEJpZAQBUAJieAJieQJiegQCY1MJAQJidgEFAmFSBAJiQggFAmNTAl8xBAFOCAUCY1MCXzIEAmJDCAUCY1MCXzMDAwkBAiE9AgUBTgUCYnoJAQIhPQIFAU4FAmJ4BwkAAgECGVlvdSBjYW5ub3QgZG8gdGhpcyBhY3Rpb24EAmNUAwkAAAIFAU4FAmJ4BQJiegUBTgQCY00JAQFvAQkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FAVAEAmJtCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FAVACAV8FAmJ4AgFfBQJiegIBXwUCYnkEAmJuCQEBYQEJAKwCAgUCYm0CBV9PUEVOAwkAAAIFAmJuAgAJAAIBAg1CaWQgbm90IGZvdW5kBAJibwkAtQkCBQJibgIBXwQCYVcJAQJiawEJAJEDAgUCYm8AAAQCY1UCCENBTkNFTEVECQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUCYm0CBV9PUEVOCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICBQJibQIBXwUCY1UJAKwCAgkArAICBQJibgIBXwkApAMBBQJiQwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FAVAJAGUCBQJjTQABCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQJjVAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJvAAEFAmFXBQNuaWwBAmNWAQJjVwAEAUcFAmNWAwkAAQIFAUcCF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBAJjWAUBRwMDAwMJAAACCAUCY1gIZnVuY3Rpb24CCmFkZEFydHdvcmsJAAACCAUCY1gEZEFwcAUEdGhpcwcJAAACCAUCY1gDZmVlAKDCHgcJAAACCAUCY1gKZmVlQXNzZXRJZAUEdW5pdAcJAPQDAwgFAmNWCWJvZHlCeXRlcwkAkQMCCAUCY1YGcHJvb2ZzAAAJANkEAQkBAmNtAQkAkQMCCAUCY1gEYXJncwANAwMDAwkAAAIIBQJjWAhmdW5jdGlvbgINdXBkYXRlQXJ0d29yawkAAAIIBQJjWARkQXBwBQR0aGlzBwkAAAIIBQJjWANmZWUAoMIeBwkAAAIIBQJjWApmZWVBc3NldElkBQR1bml0BwkA9AMDCAUCY1YJYm9keUJ5dGVzCQCRAwIIBQJjVgZwcm9vZnMAAAkA2QQBCQECY20BCQCRAwIIBQJjWARhcmdzAAwDAwMDCQAAAggFAmNYCGZ1bmN0aW9uAgtzZWxsQXJ0d29yawkAAAIIBQJjWARkQXBwBQR0aGlzBwkAAAIIBQJjWANmZWUAoMIeBwkAAAIIBQJjWApmZWVBc3NldElkBQR1bml0BwkA9AMDCAUCY1YJYm9keUJ5dGVzCQCRAwIIBQJjVgZwcm9vZnMAAAkA2QQBCQECY20BCQCRAwIIBQJjWARhcmdzAAUDAwMDCQAAAggFAmNYCGZ1bmN0aW9uAglhY2NlcHRCaWQJAAACCAUCY1gEZEFwcAUEdGhpcwcJAAACCAUCY1gDZmVlAKDCHgcJAAACCAUCY1gKZmVlQXNzZXRJZAUEdW5pdAcJAMgTAwgFAmNWCWJvZHlCeXRlcwkAkQMCCAUCY1YGcHJvb2ZzAAAJANkEAQkBAmNtAQkAkQMCCAUCY1gEYXJncwAECQD0AwMIBQJjVglib2R5Qnl0ZXMJAJEDAggFAmNWBnByb29mcwAACAUCY1YPc2VuZGVyUHVibGljS2V5CQD0AwMIBQJjVglib2R5Qnl0ZXMJAJEDAggFAmNWBnByb29mcwAACAUCY1YPc2VuZGVyUHVibGljS2V5SXeYWQ==", "height": 2503597, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FkuTsD32pNZdaBBLGokWqL4FPdosVqonf1uzEfJsNME9 Next: J8zf2vhEUaVQ3VaBE3CuEXHDMcr5km2bvvRX2pEz2Gk6 Diff:
OldNewDifferences
380380 let isSponsored = if ((pubKey != ""))
381381 then valueOrElse(checkWhitelist((toString(addressFromPublicKey(fromBase58String(pubKey))) + "_free_txs")), 0)
382382 else 0
383- if ((isSponsored == isSponsored))
384- then {
385- let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
386- then (isSponsored > 0)
387- else false)
388- then toString(addressFromPublicKey(fromBase58String(pubKey)))
389- else toBase58String(i.caller.bytes)
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- }
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))
399395 else throw("Strict value is not equal to itself.")
400396 }
401397
406402
407403
408404 func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
409- let $t01304413114 = idCallerDateSponsored(i, pubKey)
410- let id = $t01304413114._1
411- let caller = $t01304413114._2
412- let date = $t01304413114._3
413- let isSponsored = $t01304413114._4
405+ let $t01304113111 = idCallerDateSponsored(i, pubKey)
406+ let id = $t01304113111._1
407+ let caller = $t01304113111._2
408+ let date = $t01304113111._3
409+ let isSponsored = $t01304113111._4
414410 if (true)
415411 then throw(((toString((caller == issuer)) + " / ") + toString(isSponsored)))
416412 else {
469465 then throw(checkUser)
470466 else {
471467 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
472- let $t01474014932 = if (isBid)
468+ let $t01473714929 = if (isBid)
473469 then getPriceAssetIdFromBid(bidDataKey)
474470 else validatePriceAssetId(i, priceAssetId, artworkPrice)
475- let amount = $t01474014932._1
476- let assetId = $t01474014932._2
471+ let amount = $t01473714929._1
472+ let assetId = $t01473714929._2
477473 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
478474 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
479475 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
578574
579575 @Callable(i)
580576 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
581- let $t02010820181 = idCallerDateSponsored(i, pubKey)
582- let artId = $t02010820181._1
583- let caller = $t02010820181._2
584- let date = $t02010820181._3
585- let isSponsored = $t02010820181._4
577+ let $t02010520178 = idCallerDateSponsored(i, pubKey)
578+ let artId = $t02010520178._1
579+ let caller = $t02010520178._2
580+ let date = $t02010520178._3
581+ let isSponsored = $t02010520178._4
586582 if (!(validateHash(sha256Hash)))
587583 then throw("Hash should be 64 characters maximum")
588584 else {
589- let $t02028220351 = setLIcence(cidLicence, sha256Licence)
590- let licenceCID = $t02028220351._1
591- let licenceHash = $t02028220351._2
585+ let $t02027920348 = setLIcence(cidLicence, sha256Licence)
586+ let licenceCID = $t02027920348._1
587+ let licenceHash = $t02027920348._2
592588 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
593589 if ((validateArtwork != ""))
594590 then throw("Something went wrong!")
595591 else {
596592 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
597- let $t02065020734 = if (whitelisted_drop)
593+ let $t02064720731 = if (whitelisted_drop)
598594 then $Tuple2(0, signID)
599595 else validatePayment(i)
600- let amount = $t02065020734._1
601- let assetId = $t02065020734._2
596+ let amount = $t02064720731._1
597+ let assetId = $t02064720731._2
602598 if (!(isDefined(amount)))
603599 then throw("Something went wrong")
604600 else {
639635 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
640636 then throw(maintenanceMSG)
641637 else {
642- let $t02376823838 = idCallerDateSponsored(i, pubKey)
643- let id = $t02376823838._1
644- let caller = $t02376823838._2
645- let date = $t02376823838._3
646- let isSponsored = $t02376823838._4
647- let $t02384823917 = setLIcence(cidLicence, sha256Licence)
648- let licenceCID = $t02384823917._1
649- let licenceHash = $t02384823917._2
638+ let $t02376523835 = idCallerDateSponsored(i, pubKey)
639+ let id = $t02376523835._1
640+ let caller = $t02376523835._2
641+ let date = $t02376523835._3
642+ let isSponsored = $t02376523835._4
643+ let $t02384523914 = setLIcence(cidLicence, sha256Licence)
644+ let licenceCID = $t02384523914._1
645+ let licenceHash = $t02384523914._2
650646 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
651647 if ((validateArtwork != ""))
652648 then throw("Something went wrong!")
674670
675671 @Callable(i)
676672 func flagArtwork (artId,addr,flag,note) = {
677- let $t02554425578 = idCallerDate(i)
678- let id = $t02554425578._1
679- let caller = $t02554425578._2
673+ let $t02554125575 = idCallerDate(i)
674+ let id = $t02554125575._1
675+ let caller = $t02554125575._2
680676 if (containsElement([chris, toString(this)], caller))
681677 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
682678 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
688684
689685 @Callable(i)
690686 func deleteArtwork (artId,addr) = {
691- let $t02601426048 = idCallerDate(i)
692- let id = $t02601426048._1
693- let caller = $t02601426048._2
687+ let $t02601126045 = idCallerDate(i)
688+ let id = $t02601126045._1
689+ let caller = $t02601126045._2
694690 let addrToUse = if (containsElement([chris, toString(this)], caller))
695691 then addr
696692 else caller
723719
724720 @Callable(i)
725721 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
726- let $t02888428954 = idCallerDateSponsored(i, pubKey)
727- let id = $t02888428954._1
728- let caller = $t02888428954._2
729- let date = $t02888428954._3
730- let isSponsored = $t02888428954._4
722+ let $t02888128951 = idCallerDateSponsored(i, pubKey)
723+ let id = $t02888128951._1
724+ let caller = $t02888128951._2
725+ let date = $t02888128951._3
726+ let isSponsored = $t02888128951._4
731727 let artworkName = getStringByKey(keyName(caller, artId))
732728 if ((artworkName == ""))
733729 then throw("This art doesn't match your account")
801797
802798 @Callable(i)
803799 func setBid (artId,issuer) = {
804- let $t03133631376 = idCallerDate(i)
805- let id = $t03133631376._1
806- let caller = $t03133631376._2
807- let date = $t03133631376._3
808- let $t03138131417 = isPayment(i)
809- let payment = $t03138131417._1
810- let amount = $t03138131417._2
800+ let $t03133331373 = idCallerDate(i)
801+ let id = $t03133331373._1
802+ let caller = $t03133331373._2
803+ let date = $t03133331373._3
804+ let $t03137831414 = isPayment(i)
805+ let payment = $t03137831414._1
806+ let amount = $t03137831414._2
811807 let assetId = if (!(isDefined(payment.assetId)))
812808 then "WAVES"
813809 else toBase58String(value(payment.assetId))
838834
839835 @Callable(i)
840836 func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = {
841- let $t03263732708 = idCallerDateSponsored(i, pubKey)
842- let id = $t03263732708._1
843- let caller1 = $t03263732708._2
844- let date = $t03263732708._3
845- let isSponsored = $t03263732708._4
837+ let $t03263432705 = idCallerDateSponsored(i, pubKey)
838+ let id = $t03263432705._1
839+ let caller1 = $t03263432705._2
840+ let date = $t03263432705._3
841+ let isSponsored = $t03263432705._4
846842 if ((caller1 != issuer))
847843 then throw("You cannot do this action")
848844 else buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
852848
853849 @Callable(i)
854850 func cancelBid (artId,issuer,bidId,bidOwner) = {
855- let $t03294333004 = idCallerDate(i)
856- let id = $t03294333004._1
857- let caller = $t03294333004._2
858- let date = $t03294333004._3
851+ let $t03294033001 = idCallerDate(i)
852+ let id = $t03294033001._1
853+ let caller = $t03294033001._2
854+ let date = $t03294033001._3
859855 if (if ((caller != bidOwner))
860856 then (caller != issuer)
861857 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- if ((isSponsored == isSponsored))
384- then {
385- let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
386- then (isSponsored > 0)
387- else false)
388- then toString(addressFromPublicKey(fromBase58String(pubKey)))
389- else toBase58String(i.caller.bytes)
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- }
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))
399395 else throw("Strict value is not equal to itself.")
400396 }
401397
402398
403399 func idCallerDate (i) = if (!(dappRunning))
404400 then throw(maintenanceMSG)
405401 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
406402
407403
408404 func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
409- let $t01304413114 = idCallerDateSponsored(i, pubKey)
410- let id = $t01304413114._1
411- let caller = $t01304413114._2
412- let date = $t01304413114._3
413- let isSponsored = $t01304413114._4
405+ let $t01304113111 = idCallerDateSponsored(i, pubKey)
406+ let id = $t01304113111._1
407+ let caller = $t01304113111._2
408+ let date = $t01304113111._3
409+ let isSponsored = $t01304113111._4
414410 if (true)
415411 then throw(((toString((caller == issuer)) + " / ") + toString(isSponsored)))
416412 else {
417413 let isBid = if (if (if ((caller == issuer))
418414 then (bidOwner != "")
419415 else false)
420416 then (bidId != "")
421417 else false)
422418 then true
423419 else false
424420 let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
425421 if (if (if ((blockEnd != 0))
426422 then (height >= blockEnd)
427423 else false)
428424 then !(isBid)
429425 else false)
430426 then throw("Sale ended.")
431427 else {
432428 let callerIsIssuer = (caller == issuer)
433429 let totalNFT = getIntegerByKey("total_nft_issued")
434430 let signID = getStringByKey(keySignID(issuer, artId))
435431 let artworkName = getStringByKey(keyName(issuer, artId))
436432 if ((artworkName == ""))
437433 then throw("Art doesn't exist")
438434 else {
439435 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
440436 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
441437 let artworkPrice = if (callerIsIssuer)
442438 then (currentCertificationPrice * 2)
443439 else getIntegerByKey(keyPrice(issuer, artId))
444440 let priceAssetId = if (callerIsIssuer)
445441 then toBase58String(signAssetId)
446442 else getStringByKey(keyAssetIdAccepted(issuer, artId))
447443 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
448444 if (if (if (!(isBid))
449445 then !(callerIsIssuer)
450446 else false)
451447 then if (if ((0 >= artworkPrice))
452448 then true
453449 else !(isOnSale))
454450 then true
455451 else (0 >= maxCanSell)
456452 else false)
457453 then throw("Art not for sale")
458454 else if (if (if (!(isBid))
459455 then callerIsIssuer
460456 else false)
461457 then (0 >= maxCanSell)
462458 else false)
463459 then throw("Max issuable not set")
464460 else {
465461 let checkUser = validateUser(issuer)
466462 if (if (isBid)
467463 then (checkUser != "")
468464 else false)
469465 then throw(checkUser)
470466 else {
471467 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
472- let $t01474014932 = if (isBid)
468+ let $t01473714929 = if (isBid)
473469 then getPriceAssetIdFromBid(bidDataKey)
474470 else validatePriceAssetId(i, priceAssetId, artworkPrice)
475- let amount = $t01474014932._1
476- let assetId = $t01474014932._2
471+ let amount = $t01473714929._1
472+ let assetId = $t01473714929._2
477473 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
478474 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
479475 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
480476 let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
481477 let isWhitelisted = checkWhitelist(issuer)
482478 let cut = if ((isWhitelisted > height))
483479 then 0
484480 else if ((assetId == signAssetId))
485481 then signCut
486482 else usdnWaveCut
487483 let amountForSign = fraction(amount, cut, 100)
488484 let amountForAgent = if (if (if ((agent != feeReceiver))
489485 then (agentShare > 0)
490486 else false)
491487 then (height > isWhitelisted)
492488 else false)
493489 then fraction(amount, agentShare, 10000)
494490 else 0
495491 let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
496492 then (publicAgentShare > 0)
497493 else false)
498494 then (height > isWhitelisted)
499495 else false)
500496 then fraction(amount, publicAgentShare, 10000)
501497 else 0
502498 let amountForCreator = (amount - amountForSign)
503499 if ((amountSold == maxCanSell))
504500 then throw("Art sold out")
505501 else {
506502 let newAmountSold = (amountSold + 1)
507503 let issueMeta = ((((((((((("Creator: " + issuer) + ",
508504 ArtID: ") + artId) + ",
509505 SignID: ") + signID) + ",
510506 Artwork name: ") + artworkName) + ",
511507 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
512508 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
513509 let idNFT = calculateAssetId(issueNFT)
514510 let sellStatus = if (if ((newAmountSold == maxCanSell))
515511 then true
516512 else !(isOnSale))
517513 then false
518514 else true
519515 let receiveNFT = if (if (if ((caller == issuer))
520516 then (bidOwner != "")
521517 else false)
522518 then (bidId != "")
523519 else false)
524520 then addressFromStringValue(bidOwner)
525521 else i.caller
526522 let assetIdBid = if (!(isDefined(assetId)))
527523 then "WAVES"
528524 else toBase58String(value(assetId))
529525 let bidData = getStringByKey((bidDataKey + "_OPEN"))
530526 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
531527 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
532528 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
533529 let soldValue = if (!(isBid))
534530 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
535531 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
536532 let soldData = StringEntry(soldKey, soldValue)
537533 let commissionsWithAgent = if ((amountForAgent != 0))
538534 then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
539535 else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
540536 let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
541537 then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
542538 else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
543539 let txToCaller = if (isSponsored)
544540 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
545541 else nil
546542 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)
547543 if (isBid)
548544 then [soldData, bidUpdate, bidDelOld] :: buyRes
549545 else soldData :: buyRes
550546 }
551547 }
552548 }
553549 }
554550 }
555551 }
556552 }
557553
558554
559555 func asString (bv) = match bv {
560556 case bv0: String =>
561557 bv0
562558 case _ =>
563559 throw("Sponsored Public Key String expected")
564560 }
565561
566562
567563 @Callable(invoke)
568564 func setConf (key,val) = {
569565 let caller = toString(invoke.caller)
570566 if (containsElement([chris, toString(this)], caller))
571567 then if (contains(key, "conf_"))
572568 then [StringEntry(key, val)]
573569 else throw("Entries starting with conf_ only")
574570 else throw("You are not allowed to change this")
575571 }
576572
577573
578574
579575 @Callable(i)
580576 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
581- let $t02010820181 = idCallerDateSponsored(i, pubKey)
582- let artId = $t02010820181._1
583- let caller = $t02010820181._2
584- let date = $t02010820181._3
585- let isSponsored = $t02010820181._4
577+ let $t02010520178 = idCallerDateSponsored(i, pubKey)
578+ let artId = $t02010520178._1
579+ let caller = $t02010520178._2
580+ let date = $t02010520178._3
581+ let isSponsored = $t02010520178._4
586582 if (!(validateHash(sha256Hash)))
587583 then throw("Hash should be 64 characters maximum")
588584 else {
589- let $t02028220351 = setLIcence(cidLicence, sha256Licence)
590- let licenceCID = $t02028220351._1
591- let licenceHash = $t02028220351._2
585+ let $t02027920348 = setLIcence(cidLicence, sha256Licence)
586+ let licenceCID = $t02027920348._1
587+ let licenceHash = $t02027920348._2
592588 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
593589 if ((validateArtwork != ""))
594590 then throw("Something went wrong!")
595591 else {
596592 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
597- let $t02065020734 = if (whitelisted_drop)
593+ let $t02064720731 = if (whitelisted_drop)
598594 then $Tuple2(0, signID)
599595 else validatePayment(i)
600- let amount = $t02065020734._1
601- let assetId = $t02065020734._2
596+ let amount = $t02064720731._1
597+ let assetId = $t02064720731._2
602598 if (!(isDefined(amount)))
603599 then throw("Something went wrong")
604600 else {
605601 let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
606602 if ((entryExist != ""))
607603 then throw("You already added it")
608604 else {
609605 let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
610606 if ((hashExist != ""))
611607 then throw("Hash already registered")
612608 else {
613609 let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
614610 if (!(isSignCertified))
615611 then throw("Sign Certificate not found for this address.")
616612 else {
617613 let decrease_whitelist_drop = if (whitelisted_drop)
618614 then invoke(whitelistDapp, "useFreeDrop", [caller], nil)
619615 else unit
620616 if ((decrease_whitelist_drop == decrease_whitelist_drop))
621617 then {
622618 let txToCaller = if (isSponsored)
623619 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
624620 else nil
625621 ([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)
626622 }
627623 else throw("Strict value is not equal to itself.")
628624 }
629625 }
630626 }
631627 }
632628 }
633629 }
634630 }
635631
636632
637633
638634 @Callable(i)
639635 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
640636 then throw(maintenanceMSG)
641637 else {
642- let $t02376823838 = idCallerDateSponsored(i, pubKey)
643- let id = $t02376823838._1
644- let caller = $t02376823838._2
645- let date = $t02376823838._3
646- let isSponsored = $t02376823838._4
647- let $t02384823917 = setLIcence(cidLicence, sha256Licence)
648- let licenceCID = $t02384823917._1
649- let licenceHash = $t02384823917._2
638+ let $t02376523835 = idCallerDateSponsored(i, pubKey)
639+ let id = $t02376523835._1
640+ let caller = $t02376523835._2
641+ let date = $t02376523835._3
642+ let isSponsored = $t02376523835._4
643+ let $t02384523914 = setLIcence(cidLicence, sha256Licence)
644+ let licenceCID = $t02384523914._1
645+ let licenceHash = $t02384523914._2
650646 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
651647 if ((validateArtwork != ""))
652648 then throw("Something went wrong!")
653649 else {
654650 let entryExist = getStringByKey(keyName(caller, txid))
655651 if ((entryExist == ""))
656652 then throw("Entry not found")
657653 else {
658654 let flag = getStringByKey(keyFlag(caller, txid))
659655 if ((flag == "ILLEGAL"))
660656 then throw("Cannot update ILLEGAL artwork")
661657 else if (!(isArtMinted(caller, txid)))
662658 then {
663659 let txToCaller = if (isSponsored)
664660 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
665661 else nil
666662 ([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)
667663 }
668664 else throw("Already minted")
669665 }
670666 }
671667 }
672668
673669
674670
675671 @Callable(i)
676672 func flagArtwork (artId,addr,flag,note) = {
677- let $t02554425578 = idCallerDate(i)
678- let id = $t02554425578._1
679- let caller = $t02554425578._2
673+ let $t02554125575 = idCallerDate(i)
674+ let id = $t02554125575._1
675+ let caller = $t02554125575._2
680676 if (containsElement([chris, toString(this)], caller))
681677 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
682678 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
683679 else throw(("Unknow status " + flag))
684680 else throw("You are not allowed")
685681 }
686682
687683
688684
689685 @Callable(i)
690686 func deleteArtwork (artId,addr) = {
691- let $t02601426048 = idCallerDate(i)
692- let id = $t02601426048._1
693- let caller = $t02601426048._2
687+ let $t02601126045 = idCallerDate(i)
688+ let id = $t02601126045._1
689+ let caller = $t02601126045._2
694690 let addrToUse = if (containsElement([chris, toString(this)], caller))
695691 then addr
696692 else caller
697693 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
698694 if ((entryExist == ""))
699695 then throw("No art matching for this address")
700696 else {
701697 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
702698 if ((sha256Hash == ""))
703699 then throw("No art hash matching for this address")
704700 else {
705701 let signID = getStringByKey(keySignID(addrToUse, artId))
706702 if ((signID == ""))
707703 then throw("No SIGN ID matching")
708704 else {
709705 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))]
710706 if (!(isArtMinted(addrToUse, artId)))
711707 then if (!(dappRunning))
712708 then throw(maintenanceMSG)
713709 else dataToDelete
714710 else if (containsElement([chris, toString(this)], caller))
715711 then dataToDelete
716712 else throw("Art already minted, you cannot delete it")
717713 }
718714 }
719715 }
720716 }
721717
722718
723719
724720 @Callable(i)
725721 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
726- let $t02888428954 = idCallerDateSponsored(i, pubKey)
727- let id = $t02888428954._1
728- let caller = $t02888428954._2
729- let date = $t02888428954._3
730- let isSponsored = $t02888428954._4
722+ let $t02888128951 = idCallerDateSponsored(i, pubKey)
723+ let id = $t02888128951._1
724+ let caller = $t02888128951._2
725+ let date = $t02888128951._3
726+ let isSponsored = $t02888128951._4
731727 let artworkName = getStringByKey(keyName(caller, artId))
732728 if ((artworkName == ""))
733729 then throw("This art doesn't match your account")
734730 else {
735731 let flag = getStringByKey(keyFlag(caller, artId))
736732 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
737733 then throw("Flagged artwork")
738734 else {
739735 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
740736 if ((0 > blockEnd))
741737 then throw("Negative end")
742738 else if (if ((blockEnd > 0))
743739 then if ((maxMint != 1))
744740 then true
745741 else (price != 0)
746742 else false)
747743 then throw("Timed offer only allowed for unique edition and offer only")
748744 else {
749745 let baseHeight = if ((blockEnd == 0))
750746 then 0
751747 else height
752748 if (!(acceptedAssetIds(assetId)))
753749 then throw("Something went wrong!")
754750 else if (!(validateMinSell(assetId, price)))
755751 then throw("Something went wrong!")
756752 else {
757753 let checkUser = validateUser(caller)
758754 if ((checkUser != ""))
759755 then throw(checkUser)
760756 else {
761757 let amountSold = getIntegerByKey(keyIssued(caller, artId))
762758 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
763759 if ((maxMint > 100))
764760 then throw("100 editions max per artwork")
765761 else if (if ((amountSold != 0))
766762 then (amountSold == maxCanSell)
767763 else false)
768764 then throw("Max edition reached.")
769765 else if (if ((amountSold > 0))
770766 then (maxCanSell != maxMint)
771767 else false)
772768 then throw("Cannot change maximum issuable anymore")
773769 else if (if ((bidNbr > 0))
774770 then (maxCanSell != maxMint)
775771 else false)
776772 then throw("Cannot change maximum issuable with active orders")
777773 else {
778774 let sellStatus = if (if ((price > 0))
779775 then (maxMint > 0)
780776 else false)
781777 then true
782778 else false
783779 let txToCaller = if (isSponsored)
784780 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
785781 else nil
786782 ([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)
787783 }
788784 }
789785 }
790786 }
791787 }
792788 }
793789 }
794790
795791
796792
797793 @Callable(i)
798794 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", "")
799795
800796
801797
802798 @Callable(i)
803799 func setBid (artId,issuer) = {
804- let $t03133631376 = idCallerDate(i)
805- let id = $t03133631376._1
806- let caller = $t03133631376._2
807- let date = $t03133631376._3
808- let $t03138131417 = isPayment(i)
809- let payment = $t03138131417._1
810- let amount = $t03138131417._2
800+ let $t03133331373 = idCallerDate(i)
801+ let id = $t03133331373._1
802+ let caller = $t03133331373._2
803+ let date = $t03133331373._3
804+ let $t03137831414 = isPayment(i)
805+ let payment = $t03137831414._1
806+ let amount = $t03137831414._2
811807 let assetId = if (!(isDefined(payment.assetId)))
812808 then "WAVES"
813809 else toBase58String(value(payment.assetId))
814810 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
815811 if (if ((blockEnd != 0))
816812 then (height >= blockEnd)
817813 else false)
818814 then throw("Sale ended.")
819815 else {
820816 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
821817 if (!(acceptedAssetIds(assetId)))
822818 then throw("asset not accepted")
823819 else if (!(validateMinSell(assetId, amount)))
824820 then throw("Wrong min sell")
825821 else {
826822 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
827823 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
828824 if ((0 >= maxCanSell))
829825 then throw("No max edition set for this artwork")
830826 else if ((amountSold >= maxCanSell))
831827 then throw("Sold out, you cannot bid")
832828 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
833829 }
834830 }
835831 }
836832
837833
838834
839835 @Callable(i)
840836 func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = {
841- let $t03263732708 = idCallerDateSponsored(i, pubKey)
842- let id = $t03263732708._1
843- let caller1 = $t03263732708._2
844- let date = $t03263732708._3
845- let isSponsored = $t03263732708._4
837+ let $t03263432705 = idCallerDateSponsored(i, pubKey)
838+ let id = $t03263432705._1
839+ let caller1 = $t03263432705._2
840+ let date = $t03263432705._3
841+ let isSponsored = $t03263432705._4
846842 if ((caller1 != issuer))
847843 then throw("You cannot do this action")
848844 else buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
849845 }
850846
851847
852848
853849 @Callable(i)
854850 func cancelBid (artId,issuer,bidId,bidOwner) = {
855- let $t03294333004 = idCallerDate(i)
856- let id = $t03294333004._1
857- let caller = $t03294333004._2
858- let date = $t03294333004._3
851+ let $t03294033001 = idCallerDate(i)
852+ let id = $t03294033001._1
853+ let caller = $t03294033001._2
854+ let date = $t03294033001._3
859855 if (if ((caller != bidOwner))
860856 then (caller != issuer)
861857 else false)
862858 then throw("You cannot do this action")
863859 else {
864860 let returnMoneyTo = if ((caller == issuer))
865861 then bidOwner
866862 else caller
867863 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
868864 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
869865 let bidData = getStringByKey((bidDataKey + "_OPEN"))
870866 if ((bidData == ""))
871867 then throw("Bid not found")
872868 else {
873869 let bidDataArr = split(bidData, "_")
874870 let assetId = getBidAssetId(bidDataArr[0])
875871 let bidStatus = "CANCELED"
876872 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
877873 }
878874 }
879875 }
880876
881877
882878 @Verifier(tx)
883879 func verifier () = match tx {
884880 case inv: InvokeScriptTransaction =>
885881 if (if (if (if ((inv.function == "addArtwork"))
886882 then (inv.dApp == this)
887883 else false)
888884 then (inv.fee == 500000)
889885 else false)
890886 then (inv.feeAssetId == unit)
891887 else false)
892888 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[13])))
893889 else if (if (if (if ((inv.function == "updateArtwork"))
894890 then (inv.dApp == this)
895891 else false)
896892 then (inv.fee == 500000)
897893 else false)
898894 then (inv.feeAssetId == unit)
899895 else false)
900896 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
901897 else if (if (if (if ((inv.function == "sellArtwork"))
902898 then (inv.dApp == this)
903899 else false)
904900 then (inv.fee == 500000)
905901 else false)
906902 then (inv.feeAssetId == unit)
907903 else false)
908904 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
909905 else if (if (if (if ((inv.function == "acceptBid"))
910906 then (inv.dApp == this)
911907 else false)
912908 then (inv.fee == 500000)
913909 else false)
914910 then (inv.feeAssetId == unit)
915911 else false)
916912 then sigVerify_128Kb(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[4])))
917913 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
918914 case _ =>
919915 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
920916 }
921917

github/deemru/w8io/026f985 
134.16 ms