tx · J8zf2vhEUaVQ3VaBE3CuEXHDMcr5km2bvvRX2pEz2Gk6

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.01900000 Waves

2023.03.24 07:25 [2503604] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "J8zf2vhEUaVQ3VaBE3CuEXHDMcr5km2bvvRX2pEz2Gk6", "fee": 1900000, "feeAssetId": null, "timestamp": 1679631947298, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "3A35UKb1a2hdq3AX6FkFE1PTDbCYHd7veUt42rBsGxtirJ94DU3ezf41h2AHQfpZBWjAp5tfT4qwrAhvZb8ZUC2q" ], "script": "base64:BgL+FAgCEgQKAggIEhAKDggICAgICAgICAgICAEIEg8KDQgICAgICAgICAgIAQgSBgoECAgICBIECgIICBIICgYIAQEIAQgSBAoCCAgSBAoCCAgSBwoFCAgICAgSBgoECAgICCIOZ2V0U3RyaW5nQnlLZXkiA2tleSIIdW5pdFRlc3QiCW9yYWNsZUZlZSIIc2lnbkRhcHAiC2ZlZVJlY2VpdmVyIgh1c2VyRGFwcCINd2hpdGVsaXN0RGFwcCILc2lnbkFzc2V0SWQiC3VzZG5Bc3NldElkIgt1c2R0QXNzZXRJZCIMd2F2ZXNBc3NldElkIgVjaHJpcyIZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZSIPZ2V0SW50ZWdlckJ5S2V5Ig5jaGVja1doaXRlbGlzdCIPZ2V0Qm9vbGVhbkJ5S2V5IgdzaWduQ3V0Igt1c2RuV2F2ZUN1dCIOZGVmYXVsdExpY2VuY2UiEmRlZmF1bHRIYXNoTGljZW5jZSILZGFwcFJ1bm5pbmciDm1haW50ZW5hbmNlTVNHIg11c2VyU3VzcGVuZGVkIgt1c2VyUmVtb3ZlZCIQdXNlclVucmVnaXN0ZXJlZCILdXNlckFsbG93ZWQiGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UiFGNoZWNrU2lnbkNlcnRpZmljYXRlIgZzaWduSUQiBU93bmVyIgpzaGEyNTZIYXNoIgckbWF0Y2gwIgFhIgt2YWxpZGF0ZUNJRCIDY2lkIgx2YWxpZGF0ZUhhc2giBGhhc2giDWtleVVzZXJTdGF0dXMiBmNhbGxlciIHa2V5RGF0ZSIFYXJ0SWQiB2tleU5hbWUiB2tleURlc2MiDWtleURpc3BsYXlDaWQiDWtleUV4cG9ydEhhc2giDGtleUV4cG9ydENpZCIKa2V5TWF4TWludCIJa2V5U2lnbklEIglrZXlJc3N1ZWQiCWtleU9uU2FsZSIOa2V5TGljZW5jZUhhc2giDWtleUxpY2VuY2VDaWQiB2tleVRhZ3MiB2tleVR5cGUiB2tleU5vdGUiCmtleUNyYXdsZXIiDGtleVJveWFsdGllcyIIa2V5UHJpY2UiCmtleUVuZFNhbGUiEmtleUFzc2V0SWRBY2NlcHRlZCIHa2V5RmxhZyISa2V5QXJ0aXN0QWdlbnRBZGRyIgphcnRpc3RBZGRyIhRrZXlQcmltYXJ5U2hhcmVBZ2VudCIYa2V5QXJ0aXN0UHVibGljQWdlbnRBZGRyIhprZXlQcmltYXJ5U2hhcmVQdWJsaWNBZ2VudCIRa2V5SGFzaEJ5VHhpZEFkZHIiBHR4aWQiDmtleU93bmVyQnlIYXNoIg1rZXlpZEJ5U2lnbmlkIgZzaWduSWQiEmtleVR4aWRCeUhhc2hPd25lciIOdmFsaWRhdGVBbGxDSUQiCmNpZERpc3BsYXkiCWNpZEV4cG9ydCIKY2lkTGljZW5jZSIPdmFsaWRhdGVBbGxIYXNoIgxzaGEyNTZFeHBvcnQiDXNoYTI1NkxpY2VuY2UiDnZhbGlkYXRlU3RyaW5nIgNzdHIiA21heCIMdmFsaWRhdGVVc2VyIgp1c2VyU3RhdHVzIgpzZXRMSWNlbmNlIhN2YWxpZGF0ZUFydHdvcmtEYXRhIgpsaWNlbmNlQ0lEIgtsaWNlbmNlSGFzaCIEbmFtZSILZGVzY3JpcHRpb24iBHRhZ3MiCXJveWFsdGllcyIJY2hlY2tVc2VyIglpc1BheW1lbnQiAWkiB3BheW1lbnQiBmFtb3VudCIPdmFsaWRhdGVQYXltZW50IgskdDA5MTgwOTIxNiIHYXNzZXRJZCILaXNBcnRNaW50ZWQiCWFkZHJUb1VzZSIBYiIUdmFsaWRhdGVQcmljZUFzc2V0SWQiDHByaWNlQXNzZXRJZCIMYXJ0d29ya1ByaWNlIgskdDA5ODA0OTg0MCIQYWNjZXB0ZWRBc3NldElkcyIPdmFsaWRhdGVNaW5TZWxsIgVwcmljZSIMbWluU2VsbFdhdmVzIgttaW5TZWxsVXNkbiILbWluU2VsbFNpZ24iDWdldEJpZEFzc2V0SWQiFmdldFByaWNlQXNzZXRJZEZyb21CaWQiCmJpZERhdGFLZXkiB2JpZERhdGEiCmJpZERhdGFBcnIiCWJpZEFtb3VudCIKYmlkQXNzZXRJZCIVaWRDYWxsZXJEYXRlU3BvbnNvcmVkIgZwdWJLZXkiC2lzU3BvbnNvcmVkIhNnZXRfc3BvbnNvcmVkX3dhdmVzIgxpZENhbGxlckRhdGUiB2J1eU1pbnQiBmlzc3VlciIFYmlkSWQiCGJpZE93bmVyIg0kdDAxMzA0MTEzMTExIgJpZCIEZGF0ZSIFaXNCaWQiCGJsb2NrRW5kIg5jYWxsZXJJc0lzc3VlciIIdG90YWxORlQiC2FydHdvcmtOYW1lIghpc09uU2FsZSIKYW1vdW50U29sZCIKbWF4Q2FuU2VsbCINJHQwMTQ3MzIxNDkyNCIFYWdlbnQiCmFnZW50U2hhcmUiC3B1YmxpY0FnZW50IhBwdWJsaWNBZ2VudFNoYXJlIg1pc1doaXRlbGlzdGVkIgNjdXQiDWFtb3VudEZvclNpZ24iDmFtb3VudEZvckFnZW50IhRhbW91bnRGb3JQdWJsaWNBZ2VudCIQYW1vdW50Rm9yQ3JlYXRvciINbmV3QW1vdW50U29sZCIJaXNzdWVNZXRhIghpc3N1ZU5GVCIFaWRORlQiCnNlbGxTdGF0dXMiCnJlY2VpdmVORlQiCmFzc2V0SWRCaWQiCWJpZERlbE9sZCIJYmlkVXBkYXRlIgdzb2xkS2V5Iglzb2xkVmFsdWUiCHNvbGREYXRhIhRjb21taXNzaW9uc1dpdGhBZ2VudCIaY29tbWlzc2lvbnNXaXRoUHVibGljQWdlbnQiCnR4VG9DYWxsZXIiBmJ1eVJlcyIIYXNTdHJpbmciAmJ2IgNidjAiBmludm9rZSIDdmFsIgR0eXBlIgdjcmF3bGVyIg0kdDAyMDEwMDIwMTczIg0kdDAyMDI3NDIwMzQzIg92YWxpZGF0ZUFydHdvcmsiEHdoaXRlbGlzdGVkX2Ryb3AiDSR0MDIwNjQyMjA3MjYiCmVudHJ5RXhpc3QiCWhhc2hFeGlzdCIPaXNTaWduQ2VydGlmaWVkIhdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcCINJHQwMjM3NjAyMzgzMCINJHQwMjM4NDAyMzkwOSIEZmxhZyIEYWRkciIEbm90ZSINJHQwMjU1MzYyNTU3MCINJHQwMjYwMDYyNjA0MCIMZGF0YVRvRGVsZXRlIgdtYXhNaW50Ig0kdDAyODg3NjI4OTQ2IgZiaWROYnIiCmJhc2VIZWlnaHQiDSR0MDMxMzI4MzEzNjgiDSR0MDMxMzczMzE0MDkiDSR0MDMyNjI5MzI3MDAiB2NhbGxlcjEiDSR0MDMyOTM1MzI5OTYiDXJldHVybk1vbmV5VG8iCWJpZFN0YXR1cyICdHgiCHZlcmlmaWVyIgNpbnZOAQFhAQFiCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFAWICAAABYwcAAWQJAQV2YWx1ZQEJAKYIAQkBAWEBAg9jb25mX29yYWNsZV9mZWUAAWUJAQV2YWx1ZQEJAKYIAQkBAWEBAhFjb25mX3NpZ253ZWJfZGFwcAABZgkBAWEBAhFjb25mX2ZlZV9yZWNlaXZlcgABZwMFAWMJAQV2YWx1ZQEJAKYIAQIjM010NFJHTUV5alNXWUFvY1RQcWQ1NXdkSFFRQjNQVTJVQ20JAQV2YWx1ZQEJAKYIAQkBAWEBAg9jb25mX3VzZXJzX2RhcHAAAWgJAQV2YWx1ZQEJAKYIAQkBAWEBAhNjb25mX3doaXRlbGlzdF9kYXBwAAFpCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9TSUdOAAFqCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9VU0ROAAFrCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9VU0RUAAFsAQAAAW0JAQFhAQIMY29uZl9hZG1pbl8xAQFuAQFiCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUBZAUBYgIfSW50ZWdlciB1bmRlZmluZSBvciAwIGluIG9yYWNsZQEBbwEBYgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFiAAABAXABAWIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUBaAUBYgAAAQFxAQFiCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFAWIHAAFyAAcAAXMACgABdAkBAWEBAhRjb25mX2RlZmF1bHRfbGljZW5jZQABdQkBAWEBAhljb25mX2RlZmF1bHRfbGljZW5jZV9oYXNoAAF2CQELdmFsdWVPckVsc2UCCQCbCAIFAWcCFGNvbmZfZGFwcF9pc19ydW5uaW5nBgABdwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQFnAhRjb25mX21haW50ZW5hbmNlX21zZwIAAAF4AglTVVNQRU5ERUQAAXkCB1JFTU9WRUQAAXoCDFVOUkVHSVNURVJFRAABQQIHQUxMT1dFRAABQgkBAW4BCQCsAgICEmNlcnRpZmljYXRpb25fZmVlXwkA2AQBBQFpAQFDAwFEAUUBRgQBRwkAnQgCBQFlCQCsAgIJAKwCAgkArAICAghkYXRhX2ZjXwUBRAIBXwUBRQMJAAECBQFHAgZTdHJpbmcEAUgFAUcDCQEIY29udGFpbnMCBQFIBQFGBgcHAQFJAQFKAwkBCGNvbnRhaW5zAgUBSgIBLwMDCQBmAgBMCQCxAgEFAUoJAAACCQCxAgEJAJEDAgkAtQkCBQFKAgEvAAAAOwcJAGYCABAJALECAQkAkQMCCQC1CQIFAUoCAS8AAQcHAQFLAQFMCQAAAgkAsQIBBQFMAEABAU0BAU4JAKwCAgIMdXNlcl9zdGF0dXNfBQFOAQFPAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF9kYXRlXwUBUAIBXwUBTgEBUQIBTgFQCQCsAgIJAKwCAgkArAICAglhcnRfbmFtZV8FAVACAV8FAU4BAVICAU4BUAkArAICCQCsAgIJAKwCAgIJYXJ0X2Rlc2NfBQFQAgFfBQFOAQFTAgFOAVAJAKwCAgkArAICCQCsAgICEGFydF9kaXNwbGF5X2NpZF8FAVACAV8FAU4BAVQCAU4BUAkArAICCQCsAgIJAKwCAgIQYXJ0X2V4cG9ydF9oYXNoXwUBUAIBXwUBTgEBVQIBTgFQCQCsAgIJAKwCAgkArAICAg9hcnRfZXhwb3J0X2NpZF8FAVACAV8FAU4BAVYCAU4BUAkArAICCQCsAgIJAKwCAgIMYXJ0X21heG1pbnRfBQFQAgFfBQFOAQFXAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9zaWduaWRfBQFQAgFfBQFOAQFYAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9pc3N1ZWRfBQFQAgFfBQFOAQFZAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9vbnNhbGVfBQFQAgFfBQFOAQFaAgFOAVAJAKwCAgkArAICCQCsAgICEWFydF9saWNlbmNlX2hhc2hfBQFQAgFfBQFOAQJhYQIBTgFQCQCsAgIJAKwCAgkArAICAhBhcnRfbGljZW5jZV9jaWRfBQFQAgFfBQFOAQJhYgIBTgFQCQCsAgIJAKwCAgkArAICAglhcnRfdGFnc18FAVACAV8FAU4BAmFjAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF90eXBlXwUBUAIBXwUBTgECYWQCAU4BUAkArAICCQCsAgIJAKwCAgIJYXJ0X25vdGVfBQFQAgFfBQFOAQJhZQIBTgFQCQCsAgIJAKwCAgkArAICAhBhcnRfY3Jhd2xlcl9jaWRfBQFQAgFfBQFOAQJhZgIBTgFQCQCsAgIJAKwCAgkArAICAg5hcnRfcm95YWx0aWVzXwUBUAIBXwUBTgECYWcCAU4BUAkArAICCQCsAgIJAKwCAgIKYXJ0X3ByaWNlXwUBUAIBXwUBTgECYWgCAU4BUAkArAICCQCsAgIJAKwCAgIMYXJ0X2VuZHNhbGVfBQFQAgFfBQFOAQJhaQIBTgFQCQCsAgIJAKwCAgkArAICAhJhcnRfYXNzZXRBY2NlcHRlZF8FAVACAV8FAU4BAmFqAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF9mbGFnXwUBUAIBXwUBTgECYWsBAmFsCQCsAgICDWFydGlzdF9hZ2VudF8FAmFsAQJhbQECYWwJAKwCAgIVYXJ0aXN0X2FnZW50X3ByaW1hcnlfBQJhbAECYW4BAmFsCQCsAgICFGFydGlzdF9wdWJsaWNfYWdlbnRfBQJhbAECYW8BAmFsCQCsAgICHGFydGlzdF9wdWJsaWNfYWdlbnRfcHJpbWFyeV8FAmFsAQJhcAIBTgJhcQkArAICCQCsAgIJAKwCAgITZ2V0X2hhc2hieXR4aWRhZGRyXwUCYXECAV8FAU4BAmFyAQFGCQCsAgICEmdldF9vd25lcl9ieV9oYXNoXwUBRgECYXMCAU4CYXQJAKwCAgkArAICCQCsAgICEmdldF9hcnRpZGJ5c2lnbmlkXwUCYXQCAV8FAU4BAmF1AgFGAU4JAKwCAgIXZ2V0X3R4aWRfYnlfaGFzaF9vd25lcl8JANgEAQkA1BYBCQCbAwEJAKwCAgUBRgUBTgECYXYDAmF3AmF4AmF5AwkBASEBCQEBSQEFAmF3CQACAQIRV3JvbmcgRGlzcGxheSBDSUQDCQEBIQEJAQFJAQUCYXgJAAIBAhBXcm9uZyBFeHBvcnQgQ0lEAwMJAQIhPQIFAmF5AgAJAQEhAQkBAUkBBQJheQcJAAIBAhFXcm9uZyBMaWNlbmNlIENJRAYBAmF6AgJhQQJhQgMJAQEhAQkBAUsBBQJhQQkAAgECGEV4cG9ydCBIYXNoIDY0IGNoYXIuIG1heAMJAQEhAQkBAUsBBQJhQgkAAgECGUxpY2VuY2UgSGFzaCA2NCBjaGFyLiBtYXgGAQJhQwICYUQCYUUDCQAAAgkAsQIBBQJhRAAACQACAQIYRmllbGQgY2Fubm90IGJlIGlzIGVtcHR5AwkAZgIJALECAQUCYUQFAmFFCQACAQkArAICBQJhRAIMIGlzIHRvbyBsb25nBgECYUYBAU4EAmFHCQELdmFsdWVPckVsc2UCCQCdCAIFAWcJAQFNAQUBTgUBegMDCQAAAgUCYUcFAXoGCQAAAgUCYUcFAUECLlJlZ2lzdGVyIHRoaXMgYWNjb3VudCBmaXJzdCB3aXRoICJBY2NvdW50IiB0YWIDCQAAAgUCYUcFAXgCEUFjY291bnQgc3VzcGVuZGVkAwkAAAIFAmFHBQF5Ag9BY2NvdW50IHJlbW92ZWQCAAECYUgCAmF5AmFCBAFKAwkAAAIJALECAQUCYXkAAAUBdAUCYXkEAUwDCQAAAgkAsQIBBQJhQgAABQF1BQJhQgkAlAoCBQFKBQFMAQJhSQoBTgJhdwJheAJhSgJhQQJhSwJhTAJhTQJhTgJhTwQCYVAJAQJhRgEFAU4DCQECIT0CBQJhUAIACQACAQUCYVADCQAAAgkAsQIBBQJhdwAACQACAQIbRGlzcGxheSBDSUQgY2Fubm90IGJlIGVtcHR5AwkBASEBCQECYXYDBQJhdwUCYXgFAmFKCQACAQIQUHJvYmxlbSB3aXRoIENJRAMJAQEhAQkBAmF6AgUCYUEFAmFLCQACAQITUHJvYmxlbSB3aXRoIEhhc2hlcwMJAQEhAQkBAmFDAgUCYUwAZAkAAgECEjEwMCBDaGFyLiBtYXggbmFtZQMJAQEhAQkBAmFDAgUCYU0A6AcJAAIBAhoxMDAwIENoYXIuIG1heCBkZXNjcmlwdGlvbgMDCQBmAgAABQJhTwYJAGYCBQJhTwDoBwkAAgECM1JveWFsdGllcyBjYW5ub3QgYmUgbGVzcyB0aGFuIDAlIG9yIGhpZ2hlciB0aGFuIDEwJQMJAGYCCQCQAwEJALUJAgUCYU4CASwABQkAAgECCzUgdGFncyBtYXguAgABAmFRAQJhUgMJAAACCQCQAwEIBQJhUghwYXltZW50cwAACQACAQITTm8gcGF5bWVudCBhdHRhY2hlZAQCYVMJAQV2YWx1ZQEJAJEDAggFAmFSCHBheW1lbnRzAAAEAmFUCQEFdmFsdWUBCAUCYVMGYW1vdW50CQCUCgIFAmFTBQJhVAECYVUBAmFSBAJhVgkBAmFRAQUCYVIEAmFTCAUCYVYCXzEEAmFUCAUCYVYCXzIEAmFXAwMJAQlpc0RlZmluZWQBCAUCYVMHYXNzZXRJZAkAAAIIBQJhUwdhc3NldElkBQFpBwgFAmFTB2Fzc2V0SWQJAAIBAitPbmx5IFNJR04gdG9rZW4gYWNjZXB0ZWQgYXMgdHJhbnNhY3Rpb24gZmVlAwkBAiE9AgUCYVQFAUIJAAIBCQCsAgICGVBheW1lbnQgYW1vdW50IHNob3VsZCBiZSAJAKQDAQUBQgkAlAoCBQJhVAUCYVcBAmFYAgJhWQFQBAFHCQCaCAIFBHRoaXMJAQFYAgUCYVkFAVADCQABAgUBRwIDSW50BAJhWgUBRwMJAQIhPQIFAmFaAAAGBwcBAmJhAwJhUgJiYgJiYwQCYmQJAQJhUQEFAmFSBAJhUwgFAmJkAl8xBAJhVAgFAmJkAl8yBAJhVwMJAQEhAQkBCWlzRGVmaW5lZAEIBQJhUwdhc3NldElkBQR1bml0AwMJAGYCCQCxAgEFAmJiAAAJAAACCQDYBAEJAQV2YWx1ZQEIBQJhUwdhc3NldElkBQJiYgcIBQJhUwdhc3NldElkCQACAQIOV3JvbmcgYXNzZXQgaWQDAwkAAAIFAmFXBQR1bml0CQECIT0CBQJiYgIABwkAAgECDldyb25nIGFzc2V0IGlkAwkBAiE9AgUCYmMFAmFUCQACAQITUGF5bWVudCBkb24ndCBtYXRjaAkAlAoCBQJhVAUCYVcBAmJlAQJhVwMDAwMDCQECIT0CBQJhVwkA2AQBBQFpCQECIT0CBQJhVwkA2AQBBQFsBwkBAiE9AgUCYVcCBVdBVkVTBwkBAiE9AgUCYVcJANgEAQUBagcJAQIhPQIFAmFXCQDYBAEFAWsHCQACAQImT25seSBTSUdOLCBVU0ROLFVTRFQgb3IgV0FWRVMgYWNjZXB0ZWQGAQJiZgICYVcCYmcEAmJoAwUBYwAKCQEBbgECDndhdmVzX21pbl9zZWxsBAJiaQDAhD0EAmJqAwUBYwABCQBoAgUBQgACAwMDAwMDCQAAAgUCYVcJANgEAQUBagkAZgIFAmJpBQJiZwcJAQIhPQIFAmJnAAAHBgMDCQAAAgUCYVcJANgEAQUBawkAZgIFAmJpBQJiZwcJAQIhPQIFAmJnAAAHBgMDCQAAAgUCYVcJANgEAQUBaQkAZgIFAmJqBQJiZwcJAQIhPQIFAmJnAAAHBgMDAwkAAAIFAmFXCQDYBAEFAWwGCQAAAgUCYVcCBVdBVkVTCQBmAgUCYmgFAmJnBwkBAiE9AgUCYmcAAAcJAAIBAhhXcm9uZyBtaW5pbXVtIHNlbGwgcHJpY2UGAQJiawECYVcDCQAAAgUCYVcCBVdBVkVTBQR1bml0CQDZBAEFAmFXAQJibAECYm0EAmJuCQEBYQEJAKwCAgUCYm0CBV9PUEVOAwkAAAIFAmJuAgAJAAIBAg1CaWQgbm90IGZvdW5kBAJibwkAtQkCBQJibgIBXwQCYnAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJibwABBAJicQkBAmJrAQkAkQMCBQJibwAAAwkAZwIAAAUCYnAJAAIBAgxXcm9uZyBhbW91bnQJAJQKAgUCYnAFAmJxAQJicgICYVICYnMDCQEBIQEFAXYJAAIBBQF3BAJidAMJAQIhPQIFAmJzAgAJAQt2YWx1ZU9yRWxzZQIJAQFwAQkArAICCQClCAEJAKcIAQkA2QQBBQJicwIJX2ZyZWVfdHhzAAAAAAQBTgMDCQAAAgkA2AQBCAgFAmFSBmNhbGxlcgVieXRlcwkApQgBBQR0aGlzCQBmAgUCYnQAAAcJAKUIAQkApwgBCQDZBAEFAmJzCQDYBAEICAUCYVIGY2FsbGVyBWJ5dGVzBAJidQMDCQECIT0CBQJicwIACQBmAgUCYnQAAAcJAPwHBAUBaAIJdXNlRnJlZVR4CQDMCAIJAKUIAQkApwgBCQDZBAEFAmJzBQNuaWwFA25pbAUEdW5pdAMJAAACBQJidQUCYnUJAJYKBAkA2AQBCAUCYVINdHJhbnNhY3Rpb25JZAUBTggFCWxhc3RCbG9jawl0aW1lc3RhbXAJAGYCBQJidAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJidgECYVIDCQEBIQEFAXYJAAIBBQF3CQCVCgMJANgEAQgFAmFSDXRyYW5zYWN0aW9uSWQJANgEAQgIBQJhUgZjYWxsZXIFYnl0ZXMIBQlsYXN0QmxvY2sJdGltZXN0YW1wAQJidwYCYVIBUAJieAJieQJiegJicwQCYkEJAQJicgIFAmFSBQJicwQCYkIIBQJiQQJfMQQBTggFAmJBAl8yBAJiQwgFAmJBAl8zBAJidAgFAmJBAl80AwYJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIFAU4CAyAvIAUCYngCAyAvIAkApQMBBQJidAQCYkQDAwMJAAACBQFOBQJieAkBAiE9AgUCYnoCAAcJAQIhPQIFAmJ5AgAHBgcEAmJFCQEBbwEJAQJhaAIFAU4FAVADAwMJAQIhPQIFAmJFAAAJAGcCBQZoZWlnaHQFAmJFBwkBASEBBQJiRAcJAAIBAgtTYWxlIGVuZGVkLgQCYkYJAAACBQFOBQJieAQCYkcJAQFvAQIQdG90YWxfbmZ0X2lzc3VlZAQBRAkBAWEBCQEBVwIFAmJ4BQFQBAJiSAkBAWEBCQEBUQIFAmJ4BQFQAwkAAAIFAmJIAgAJAAIBAhFBcnQgZG9lc24ndCBleGlzdAQCYkkJAQFxAQkBAVkCBQJieAUBUAQCYkoJAQFvAQkBAVgCBQJieAUBUAQCYmMDBQJiRgkAaAIFAUIAAgkBAW8BCQECYWcCBQJieAUBUAQCYmIDBQJiRgkA2AQBBQFpCQEBYQEJAQJhaQIFAmJ4BQFQBAJiSwkBAW8BCQEBVgIFAmJ4BQFQAwMDCQEBIQEFAmJECQEBIQEFAmJGBwMDCQBnAgAABQJiYwYJAQEhAQUCYkkGCQBnAgAABQJiSwcJAAIBAhBBcnQgbm90IGZvciBzYWxlAwMDCQEBIQEFAmJEBQJiRgcJAGcCAAAFAmJLBwkAAgECFE1heCBpc3N1YWJsZSBub3Qgc2V0BAJhUAkBAmFGAQUCYngDAwUCYkQJAQIhPQIFAmFQAgAHCQACAQUCYVAEAmJtCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FAVACAV8FAmJ4AgFfBQJiegIBXwUCYnkEAmJMAwUCYkQJAQJibAEFAmJtCQECYmEDBQJhUgUCYmIFAmJjBAJhVAgFAmJMAl8xBAJhVwgFAmJMAl8yBAJiTQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQFnCQECYWsBBQJieAUBZgQCYk4JAQt2YWx1ZU9yRWxzZQIJAJoIAgUBZwkBAmFtAQUCYngAAAQCYk8JAQt2YWx1ZU9yRWxzZQIJAJ0IAgUBZwkBAmFuAQUCYngFAWYEAmJQCQELdmFsdWVPckVsc2UCCQCaCAIFAWcJAQJhbwEFAmJ4AAAEAmJRCQEBcAEFAmJ4BAJiUgMJAGYCBQJiUQUGaGVpZ2h0AAADCQAAAgUCYVcFAWkFAXIFAXMEAmJTCQBrAwUCYVQFAmJSAGQEAmJUAwMDCQECIT0CBQJiTQUBZgkAZgIFAmJOAAAHCQBmAgUGaGVpZ2h0BQJiUQcJAGsDBQJhVAUCYk4AkE4AAAQCYlUDAwMJAQIhPQIFAmJPBQFmCQBmAgUCYlAAAAcJAGYCBQZoZWlnaHQFAmJRBwkAawMFAmFUBQJiUACQTgAABAJiVgkAZQIFAmFUBQJiUwMJAAACBQJiSgUCYksJAAIBAgxBcnQgc29sZCBvdXQEAmJXCQBkAgUCYkoAAQQCYlgJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglDcmVhdG9yOiAFAmJ4AgosCiBBcnRJRDogBQFQAgssCiBTaWduSUQ6IAUBRAIRLAogQXJ0d29yayBuYW1lOiAFAmJIAgosCiBJc3N1ZTogCQCkAwEFAmJXAgEvCQCkAwEFAmJLBAJiWQkAwggFCQCsAgICA1NBXwkApAMBCQBkAgUCYkcAAQUCYlgAAQAABwQCYloJALgIAQUCYlkEAmNhAwMJAAACBQJiVwUCYksGCQEBIQEFAmJJBwYEAmNiAwMDCQAAAgUBTgUCYngJAQIhPQIFAmJ6AgAHCQECIT0CBQJieQIABwkBEUBleHRyTmF0aXZlKDEwNjIpAQUCYnoIBQJhUgZjYWxsZXIEAmNjAwkBASEBCQEJaXNEZWZpbmVkAQUCYVcCBVdBVkVTCQDYBAEJAQV2YWx1ZQEFAmFXBAJibgkBAWEBCQCsAgIFAmJtAgVfT1BFTgQCY2QJAQtEZWxldGVFbnRyeQEJAKwCAgUCYm0CBV9PUEVOBAJjZQkBC1N0cmluZ0VudHJ5AgkArAICBQJibQIHX0NMT1NFRAkArAICCQCsAgIFAmJuAgFfCQCkAwEFAmJDBAJjZgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAglhcnRfc29sZF8JAKQDAQUCYlcCBF9vZl8JAKQDAQUCYksCAV8FAVACAV8FAmJ4BAJjZwMJAQEhAQUCYkQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUBTgIBXwkApAMBBQJiQwIBXwUCYkICAV8JAKQDAQUCYmMCAV8FAmJiAgFfCQDYBAEFAmJaCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQUCY2ICAV8JAKQDAQUCYkMCAV8FAmJCAgFfCQCkAwEFAmFUAgFfBQJjYwIBXwkA2AQBBQJiWgQCY2gJAQtTdHJpbmdFbnRyeQIFAmNmBQJjZwQCY2kDCQECIT0CBQJiVAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQFmCQBlAgUCYlMFAmJUBQJhVwkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUCYk0FAmJUBQJhVwUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQFmBQJiUwUCYVcFA25pbAQCY2oDCQECIT0CBQJiVQAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQJiTwUCYlUFAmFXCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQJieAkAZQIFAmJWBQJiVQUCYVcFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUCYngFAmJWBQJhVwUDbmlsBAJjawMFAmJ0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQFOAAAFBHVuaXQFA25pbAUDbmlsBAJjbAkAzggCCQDOCAIJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVgCBQJieAUBUAUCYlcJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICAgRuZnRfCQDYBAEFAmJaBQJjZgkAzAgCCQEMSW50ZWdlckVudHJ5AgIQdG90YWxfbmZ0X2lzc3VlZAkAZAIFAmJHAAEJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhaAIFAmJ4BQFQAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQFZAgUCYngFAVAFAmNhCQDMCAIFAmJZCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFAmNiAAEFAmJaBQNuaWwFAmNpBQJjagUCY2sDBQJiRAkAzAgCBQJjaAkAzAgCBQJjZQkAzAgCBQJjZAUCY2wJAMwIAgUCY2gFAmNsAQJjbQECY24EAUcFAmNuAwkAAQIFAUcCBlN0cmluZwQCY28FAUcFAmNvCQACAQIkU3BvbnNvcmVkIFB1YmxpYyBLZXkgU3RyaW5nIGV4cGVjdGVkCgJjcAEHc2V0Q29uZgIBYgJjcQQBTgkApQgBCAUCY3AGY2FsbGVyAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUBbQkAzAgCCQClCAEFBHRoaXMFA25pbAUBTgMJAQhjb250YWlucwIFAWICBWNvbmZfCQDMCAIJAQtTdHJpbmdFbnRyeQIFAWIFAmNxBQNuaWwJAAIBAiBFbnRyaWVzIHN0YXJ0aW5nIHdpdGggY29uZl8gb25seQkAAgECIllvdSBhcmUgbm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoaXMCYVIBCmFkZEFydHdvcmsOAUYBRAJhTAJhTQJhTgJjcgJhdwJhQQJheAJhQgJheQJjcwJhTwJicwQCY3QJAQJicgIFAmFSBQJicwQBUAgFAmN0Al8xBAFOCAUCY3QCXzIEAmJDCAUCY3QCXzMEAmJ0CAUCY3QCXzQDCQEBIQEJAQFLAQUBRgkAAgECJEhhc2ggc2hvdWxkIGJlIDY0IGNoYXJhY3RlcnMgbWF4aW11bQQCY3UJAQJhSAIFAmF5BQJhQgQCYUoIBQJjdQJfMQQCYUsIBQJjdQJfMgQCY3YJAQJhSQoFAU4FAmF3BQJheAUCYUoFAmFBBQJhSwUCYUwFAmFNBQJhTgUCYU8DCQECIT0CBQJjdgIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAJjdwkAZgIJAQFwAQkArAICBQFOAgtfZnJlZV9kcm9wcwAABAJjeAMFAmN3CQCUCgIAAAUBRAkBAmFVAQUCYVIEAmFUCAUCY3gCXzEEAmFXCAUCY3gCXzIDCQEBIQEJAQlpc0RlZmluZWQBBQJhVAkAAgECFFNvbWV0aGluZyB3ZW50IHdyb25nBAJjeQkBAWEBCQECYXUCBQFGBQFOAwkBAiE9AgUCY3kCAAkAAgECFFlvdSBhbHJlYWR5IGFkZGVkIGl0BAJjegkBAWEBCQECYXIBBQFGAwkBAiE9AgUCY3oCAAkAAgECF0hhc2ggYWxyZWFkeSByZWdpc3RlcmVkBAJjQQkBAUMDBQFEBQFOBQFGAwkBASEBBQJjQQkAAgECLFNpZ24gQ2VydGlmaWNhdGUgbm90IGZvdW5kIGZvciB0aGlzIGFkZHJlc3MuBAJjQgMFAmN3CQD8BwQFAWgCC3VzZUZyZWVEcm9wCQDMCAIFAU4FA25pbAUDbmlsBQR1bml0AwkAAAIFAmNCBQJjQgQCY2sDBQJidAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUBTgAABQR1bml0BQNuaWwFA25pbAkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhcgEFAUYFAU4JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmF1AgUBRgUBTgUBUAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAU8CBQFOBQFQBQJiQwkAzAgCCQELU3RyaW5nRW50cnkCCQEBUQIFAU4FAVAFAmFMCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFSAgUBTgUBUAUCYU0JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVMCBQFOBQFQBQJhdwkAzAgCCQELU3RyaW5nRW50cnkCCQEBVQIFAU4FAVAFAmF4CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFUAgUBTgUBUAUCYUEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVoCBQFOBQFQBQJhSwkAzAgCCQELU3RyaW5nRW50cnkCCQECYWECBQFOBQFQBQJhSgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWMCBQFOBQFQBQJjcgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWICBQFOBQFQBQJhTgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAVYCBQFOBQFQAAAJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVcCBQFOBQFQBQFECQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBWAIFAU4FAVAAAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAVkCBQFOBQFQBwkAzAgCCQELU3RyaW5nRW50cnkCCQECYXMCBQFOBQFEBQFQCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhcAIFAU4FAVAFAUYJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFlAgUBTgUBUAUCY3MJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhZgIFAU4FAVAFAmFPCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQFmBQJhVAUBaQUDbmlsBQJjawkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgJhUgENdXBkYXRlQXJ0d29yaw0CYXECYUwCYU0CYU4CY3ICYXcCYUECYXgCYUICYXkCY3MCYU8CYnMDCQEBIQEFAXYJAAIBBQF3BAJjQwkBAmJyAgUCYVIFAmJzBAJiQggFAmNDAl8xBAFOCAUCY0MCXzIEAmJDCAUCY0MCXzMEAmJ0CAUCY0MCXzQEAmNECQECYUgCBQJheQUCYUIEAmFKCAUCY0QCXzEEAmFLCAUCY0QCXzIEAmN2CQECYUkKBQFOBQJhdwUCYXgFAmFKBQJhQQUCYUsFAmFMBQJhTQUCYU4FAmFPAwkBAiE9AgUCY3YCAAkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQQCY3kJAQFhAQkBAVECBQFOBQJhcQMJAAACBQJjeQIACQACAQIPRW50cnkgbm90IGZvdW5kBAJjRQkBAWEBCQECYWoCBQFOBQJhcQMJAAACBQJjRQIHSUxMRUdBTAkAAgECHUNhbm5vdCB1cGRhdGUgSUxMRUdBTCBhcnR3b3JrAwkBASEBCQECYVgCBQFOBQJhcQQCY2sDBQJidAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUBTgAABQR1bml0BQNuaWwFA25pbAkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFRAgUBTgUCYXEFAmFMCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFSAgUBTgUCYXEFAmFNCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFTAgUBTgUCYXEFAmF3CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFVAgUBTgUCYXEFAmF4CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFUAgUBTgUCYXEFAmFBCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYQIFAU4FAmFxBQJhSgkAzAgCCQELU3RyaW5nRW50cnkCCQEBWgIFAU4FAmFxBQJhSwkAzAgCCQELU3RyaW5nRW50cnkCCQECYWICBQFOBQJhcQUCYU4JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFjAgUBTgUCYXEFAmNyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhZQIFAU4FAmFxBQJjcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFmAgUBTgUCYXEFAmFPBQNuaWwFAmNrCQACAQIOQWxyZWFkeSBtaW50ZWQCYVIBC2ZsYWdBcnR3b3JrBAFQAmNGAmNFAmNHBAJjSAkBAmJ2AQUCYVIEAmJCCAUCY0gCXzEEAU4IBQJjSAJfMgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFAW0JAMwIAgkApQgBBQR0aGlzBQNuaWwFAU4DCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAgdDT05TRU5UCQDMCAICAAkAzAgCAg9DSEFOR0VfUkVRVUlSRUQJAMwIAgIHRkxBR0dFRAkAzAgCAgdJTExFR0FMBQNuaWwFAmNFCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhagIFAmNGBQFQBQJjRQkAzAgCCQELU3RyaW5nRW50cnkCCQECYWQCBQJjRgUBUAUCY0cFA25pbAkAAgEJAKwCAgIOVW5rbm93IHN0YXR1cyAFAmNFCQACAQITWW91IGFyZSBub3QgYWxsb3dlZAJhUgENZGVsZXRlQXJ0d29yawIBUAJjRgQCY0kJAQJidgEFAmFSBAJiQggFAmNJAl8xBAFOCAUCY0kCXzIEAmFZAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUBbQkAzAgCCQClCAEFBHRoaXMFA25pbAUBTgUCY0YFAU4EAmN5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAQFhAQkBAVECBQJhWQUBUAIgTm8gYXJ0IG1hdGNoaW5nIGZvciB0aGlzIGFkZHJlc3MDCQAAAgUCY3kCAAkAAgECIE5vIGFydCBtYXRjaGluZyBmb3IgdGhpcyBhZGRyZXNzBAFGCQEBYQEJAQJhcAIFAmFZBQFQAwkAAAIFAUYCAAkAAgECJU5vIGFydCBoYXNoIG1hdGNoaW5nIGZvciB0aGlzIGFkZHJlc3MEAUQJAQFhAQkBAVcCBQJhWQUBUAMJAAACBQFEAgAJAAIBAhNObyBTSUdOIElEIG1hdGNoaW5nBAJjSgkAzAgCCQELRGVsZXRlRW50cnkBCQEBTwIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFRAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVICBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBUwIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFVAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVQCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBWgIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhYQIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhYwIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhYgIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFWAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVcCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBWAIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFZAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFqAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFnAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFpAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFyAQUBRgkAzAgCCQELRGVsZXRlRW50cnkBCQECYXMCBQJhWQUBRAkAzAgCCQELRGVsZXRlRW50cnkBCQECYXUCBQFGBQJhWQkAzAgCCQELRGVsZXRlRW50cnkBCQECYWgCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWQCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWUCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWYCBQJhWQUBUAUDbmlsAwkBASEBCQECYVgCBQJhWQUBUAMJAQEhAQUBdgkAAgEFAXcFAmNKAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUBbQkAzAgCCQClCAEFBHRoaXMFA25pbAUBTgUCY0oJAAIBAihBcnQgYWxyZWFkeSBtaW50ZWQsIHlvdSBjYW5ub3QgZGVsZXRlIGl0AmFSAQtzZWxsQXJ0d29yawYBUAJiZwJjSwJhVwJiRQJicwQCY0wJAQJicgIFAmFSBQJicwQCYkIIBQJjTAJfMQQBTggFAmNMAl8yBAJiQwgFAmNMAl8zBAJidAgFAmNMAl80BAJiSAkBAWEBCQEBUQIFAU4FAVADCQAAAgUCYkgCAAkAAgECI1RoaXMgYXJ0IGRvZXNuJ3QgbWF0Y2ggeW91ciBhY2NvdW50BAJjRQkBAWEBCQECYWoCBQFOBQFQAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgIPQ0hBTkdFX1JFUVVJUkVECQDMCAICB0ZMQUdHRUQJAMwIAgIHSUxMRUdBTAUDbmlsBQJjRQkAAgECD0ZsYWdnZWQgYXJ0d29yawQCY00JAQFvAQkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FAVADCQBmAgAABQJiRQkAAgECDE5lZ2F0aXZlIGVuZAMDCQBmAgUCYkUAAAMJAQIhPQIFAmNLAAEGCQECIT0CBQJiZwAABwkAAgECOlRpbWVkIG9mZmVyIG9ubHkgYWxsb3dlZCBmb3IgdW5pcXVlIGVkaXRpb24gYW5kIG9mZmVyIG9ubHkEAmNOAwkAAAIFAmJFAAAAAAUGaGVpZ2h0AwkBASEBCQECYmUBBQJhVwkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQMJAQEhAQkBAmJmAgUCYVcFAmJnCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAJhUAkBAmFGAQUBTgMJAQIhPQIFAmFQAgAJAAIBBQJhUAQCYkoJAQFvAQkBAVgCBQFOBQFQBAJiSwkBAW8BCQEBVgIFAU4FAVADCQBmAgUCY0sAZAkAAgECHDEwMCBlZGl0aW9ucyBtYXggcGVyIGFydHdvcmsDAwkBAiE9AgUCYkoAAAkAAAIFAmJKBQJiSwcJAAIBAhRNYXggZWRpdGlvbiByZWFjaGVkLgMDCQBmAgUCYkoAAAkBAiE9AgUCYksFAmNLBwkAAgECJkNhbm5vdCBjaGFuZ2UgbWF4aW11bSBpc3N1YWJsZSBhbnltb3JlAwMJAGYCBQJjTQAACQECIT0CBQJiSwUCY0sHCQACAQIxQ2Fubm90IGNoYW5nZSBtYXhpbXVtIGlzc3VhYmxlIHdpdGggYWN0aXZlIG9yZGVycwQCY2EDAwkAZgIFAmJnAAAJAGYCBQJjSwAABwYHBAJjawMFAmJ0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQFOAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQFZAgUBTgUBUAUCY2EJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhZwIFAU4FAVAFAmJnCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVgIFAU4FAVAFAmNLCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhaQIFAU4FAVAFAmFXCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWgCBQFOBQFQCQBkAgUCY04FAmJFBQNuaWwFAmNrAmFSAQpidXlBcnR3b3JrAgFQAmJ4CQECYncGBQJhUgUBUAUCYngCAAIAAgACYVIBBnNldEJpZAIBUAJieAQCY08JAQJidgEFAmFSBAJiQggFAmNPAl8xBAFOCAUCY08CXzIEAmJDCAUCY08CXzMEAmNQCQECYVEBBQJhUgQCYVMIBQJjUAJfMQQCYVQIBQJjUAJfMgQCYVcDCQEBIQEJAQlpc0RlZmluZWQBCAUCYVMHYXNzZXRJZAIFV0FWRVMJANgEAQkBBXZhbHVlAQgFAmFTB2Fzc2V0SWQEAmJFCQEBbwEJAQJhaAIFAmJ4BQFQAwMJAQIhPQIFAmJFAAAJAGcCBQZoZWlnaHQFAmJFBwkAAgECC1NhbGUgZW5kZWQuBAJjTQkBAW8BCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUBUAMJAQEhAQkBAmJlAQUCYVcJAAIBAhJhc3NldCBub3QgYWNjZXB0ZWQDCQEBIQEJAQJiZgIFAmFXBQJhVAkAAgECDldyb25nIG1pbiBzZWxsBAJiSgkBAW8BCQEBWAIFAmJ4BQFQBAJiSwkBAW8BCQEBVgIFAmJ4BQFQAwkAZwIAAAUCYksJAAIBAiNObyBtYXggZWRpdGlvbiBzZXQgZm9yIHRoaXMgYXJ0d29yawMJAGcCBQJiSgUCYksJAAIBAhhTb2xkIG91dCwgeW91IGNhbm5vdCBiaWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FAVACAV8FAmJ4AgFfBQFOAgFfBQJiQgIFX09QRU4JAKwCAgkArAICCQCsAgIJAKwCAgUCYVcCAV8JAKQDAQUCYVQCAV8JAKQDAQUCYkMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQFQCQBkAgUCY00AAQUDbmlsAmFSAQlhY2NlcHRCaWQFAVACYngCYnkCYnoCYnMEAmNRCQECYnICBQJhUgUCYnMEAmJCCAUCY1ECXzEEAmNSCAUCY1ECXzIEAmJDCAUCY1ECXzMEAmJ0CAUCY1ECXzQDCQECIT0CBQJjUgUCYngJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uCQECYncGBQJhUgUBUAUCYngFAmJ5BQJiegUCYnMCYVIBCWNhbmNlbEJpZAQBUAJieAJieQJiegQCY1MJAQJidgEFAmFSBAJiQggFAmNTAl8xBAFOCAUCY1MCXzIEAmJDCAUCY1MCXzMDAwkBAiE9AgUBTgUCYnoJAQIhPQIFAU4FAmJ4BwkAAgECGVlvdSBjYW5ub3QgZG8gdGhpcyBhY3Rpb24EAmNUAwkAAAIFAU4FAmJ4BQJiegUBTgQCY00JAQFvAQkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FAVAEAmJtCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FAVACAV8FAmJ4AgFfBQJiegIBXwUCYnkEAmJuCQEBYQEJAKwCAgUCYm0CBV9PUEVOAwkAAAIFAmJuAgAJAAIBAg1CaWQgbm90IGZvdW5kBAJibwkAtQkCBQJibgIBXwQCYVcJAQJiawEJAJEDAgUCYm8AAAQCY1UCCENBTkNFTEVECQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUCYm0CBV9PUEVOCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICBQJibQIBXwUCY1UJAKwCAgkArAICBQJibgIBXwkApAMBBQJiQwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FAVAJAGUCBQJjTQABCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQJjVAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJvAAEFAmFXBQNuaWwBAmNWAQJjVwAEAUcFAmNWAwkAAQIFAUcCF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBAJjWAUBRwMDAwMJAAACCAUCY1gIZnVuY3Rpb24CCmFkZEFydHdvcmsJAAACCAUCY1gEZEFwcAUEdGhpcwcJAAACCAUCY1gDZmVlAKDCHgcJAAACCAUCY1gKZmVlQXNzZXRJZAUEdW5pdAcJAPQDAwgFAmNWCWJvZHlCeXRlcwkAkQMCCAUCY1YGcHJvb2ZzAAAJANkEAQkBAmNtAQkAkQMCCAUCY1gEYXJncwANAwMDAwkAAAIIBQJjWAhmdW5jdGlvbgINdXBkYXRlQXJ0d29yawkAAAIIBQJjWARkQXBwBQR0aGlzBwkAAAIIBQJjWANmZWUAoMIeBwkAAAIIBQJjWApmZWVBc3NldElkBQR1bml0BwkA9AMDCAUCY1YJYm9keUJ5dGVzCQCRAwIIBQJjVgZwcm9vZnMAAAkA2QQBCQECY20BCQCRAwIIBQJjWARhcmdzAAwDAwMDCQAAAggFAmNYCGZ1bmN0aW9uAgtzZWxsQXJ0d29yawkAAAIIBQJjWARkQXBwBQR0aGlzBwkAAAIIBQJjWANmZWUAoMIeBwkAAAIIBQJjWApmZWVBc3NldElkBQR1bml0BwkA9AMDCAUCY1YJYm9keUJ5dGVzCQCRAwIIBQJjVgZwcm9vZnMAAAkA2QQBCQECY20BCQCRAwIIBQJjWARhcmdzAAUDAwMDCQAAAggFAmNYCGZ1bmN0aW9uAglhY2NlcHRCaWQJAAACCAUCY1gEZEFwcAUEdGhpcwcJAAACCAUCY1gDZmVlAKDCHgcJAAACCAUCY1gKZmVlQXNzZXRJZAUEdW5pdAcJAMgTAwgFAmNWCWJvZHlCeXRlcwkAkQMCCAUCY1YGcHJvb2ZzAAAJANkEAQkBAmNtAQkAkQMCCAUCY1gEYXJncwAECQD0AwMIBQJjVglib2R5Qnl0ZXMJAJEDAggFAmNWBnByb29mcwAACAUCY1YPc2VuZGVyUHVibGljS2V5CQD0AwMIBQJjVglib2R5Qnl0ZXMJAJEDAggFAmNWBnByb29mcwAACAUCY1YPc2VuZGVyUHVibGljS2V54X+IrQ==", "height": 2503604, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: ZcWuPVLVaCx4apnEpDD7yyM7QwGrUu2VCdxycmpRzMG Next: PZAJ9HQMsdyrhTLFW3XNd3oEJ3pgKGo6tavU1hnjR9b Diff:
OldNewDifferences
408408 let date = $t01304113111._3
409409 let isSponsored = $t01304113111._4
410410 if (true)
411- then throw(((toString((caller == issuer)) + " / ") + toString(isSponsored)))
411+ then throw(((((caller + " / ") + issuer) + " / ") + toString(isSponsored)))
412412 else {
413413 let isBid = if (if (if ((caller == issuer))
414414 then (bidOwner != "")
465465 then throw(checkUser)
466466 else {
467467 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
468- let $t01473714929 = if (isBid)
468+ let $t01473214924 = if (isBid)
469469 then getPriceAssetIdFromBid(bidDataKey)
470470 else validatePriceAssetId(i, priceAssetId, artworkPrice)
471- let amount = $t01473714929._1
472- let assetId = $t01473714929._2
471+ let amount = $t01473214924._1
472+ let assetId = $t01473214924._2
473473 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
474474 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
475475 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
574574
575575 @Callable(i)
576576 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
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
577+ let $t02010020173 = idCallerDateSponsored(i, pubKey)
578+ let artId = $t02010020173._1
579+ let caller = $t02010020173._2
580+ let date = $t02010020173._3
581+ let isSponsored = $t02010020173._4
582582 if (!(validateHash(sha256Hash)))
583583 then throw("Hash should be 64 characters maximum")
584584 else {
585- let $t02027920348 = setLIcence(cidLicence, sha256Licence)
586- let licenceCID = $t02027920348._1
587- let licenceHash = $t02027920348._2
585+ let $t02027420343 = setLIcence(cidLicence, sha256Licence)
586+ let licenceCID = $t02027420343._1
587+ let licenceHash = $t02027420343._2
588588 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
589589 if ((validateArtwork != ""))
590590 then throw("Something went wrong!")
591591 else {
592592 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
593- let $t02064720731 = if (whitelisted_drop)
593+ let $t02064220726 = if (whitelisted_drop)
594594 then $Tuple2(0, signID)
595595 else validatePayment(i)
596- let amount = $t02064720731._1
597- let assetId = $t02064720731._2
596+ let amount = $t02064220726._1
597+ let assetId = $t02064220726._2
598598 if (!(isDefined(amount)))
599599 then throw("Something went wrong")
600600 else {
635635 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
636636 then throw(maintenanceMSG)
637637 else {
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
638+ let $t02376023830 = idCallerDateSponsored(i, pubKey)
639+ let id = $t02376023830._1
640+ let caller = $t02376023830._2
641+ let date = $t02376023830._3
642+ let isSponsored = $t02376023830._4
643+ let $t02384023909 = setLIcence(cidLicence, sha256Licence)
644+ let licenceCID = $t02384023909._1
645+ let licenceHash = $t02384023909._2
646646 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
647647 if ((validateArtwork != ""))
648648 then throw("Something went wrong!")
670670
671671 @Callable(i)
672672 func flagArtwork (artId,addr,flag,note) = {
673- let $t02554125575 = idCallerDate(i)
674- let id = $t02554125575._1
675- let caller = $t02554125575._2
673+ let $t02553625570 = idCallerDate(i)
674+ let id = $t02553625570._1
675+ let caller = $t02553625570._2
676676 if (containsElement([chris, toString(this)], caller))
677677 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
678678 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
684684
685685 @Callable(i)
686686 func deleteArtwork (artId,addr) = {
687- let $t02601126045 = idCallerDate(i)
688- let id = $t02601126045._1
689- let caller = $t02601126045._2
687+ let $t02600626040 = idCallerDate(i)
688+ let id = $t02600626040._1
689+ let caller = $t02600626040._2
690690 let addrToUse = if (containsElement([chris, toString(this)], caller))
691691 then addr
692692 else caller
719719
720720 @Callable(i)
721721 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
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
722+ let $t02887628946 = idCallerDateSponsored(i, pubKey)
723+ let id = $t02887628946._1
724+ let caller = $t02887628946._2
725+ let date = $t02887628946._3
726+ let isSponsored = $t02887628946._4
727727 let artworkName = getStringByKey(keyName(caller, artId))
728728 if ((artworkName == ""))
729729 then throw("This art doesn't match your account")
797797
798798 @Callable(i)
799799 func setBid (artId,issuer) = {
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
800+ let $t03132831368 = idCallerDate(i)
801+ let id = $t03132831368._1
802+ let caller = $t03132831368._2
803+ let date = $t03132831368._3
804+ let $t03137331409 = isPayment(i)
805+ let payment = $t03137331409._1
806+ let amount = $t03137331409._2
807807 let assetId = if (!(isDefined(payment.assetId)))
808808 then "WAVES"
809809 else toBase58String(value(payment.assetId))
834834
835835 @Callable(i)
836836 func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = {
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
837+ let $t03262932700 = idCallerDateSponsored(i, pubKey)
838+ let id = $t03262932700._1
839+ let caller1 = $t03262932700._2
840+ let date = $t03262932700._3
841+ let isSponsored = $t03262932700._4
842842 if ((caller1 != issuer))
843843 then throw("You cannot do this action")
844844 else buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
848848
849849 @Callable(i)
850850 func cancelBid (artId,issuer,bidId,bidOwner) = {
851- let $t03294033001 = idCallerDate(i)
852- let id = $t03294033001._1
853- let caller = $t03294033001._2
854- let date = $t03294033001._3
851+ let $t03293532996 = idCallerDate(i)
852+ let id = $t03293532996._1
853+ let caller = $t03293532996._2
854+ let date = $t03293532996._3
855855 if (if ((caller != bidOwner))
856856 then (caller != issuer)
857857 else false)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getStringByKey (key) = valueOrElse(getString(this, key), "")
55
66
77 let unitTest = false
88
99 let oracleFee = value(addressFromString(getStringByKey("conf_oracle_fee")))
1010
1111 let signDapp = value(addressFromString(getStringByKey("conf_signweb_dapp")))
1212
1313 let feeReceiver = getStringByKey("conf_fee_receiver")
1414
1515 let userDapp = if (unitTest)
1616 then value(addressFromString("3Mt4RGMEyjSWYAocTPqd55wdHQQB3PU2UCm"))
1717 else value(addressFromString(getStringByKey("conf_users_dapp")))
1818
1919 let whitelistDapp = value(addressFromString(getStringByKey("conf_whitelist_dapp")))
2020
2121 let signAssetId = fromBase58String(getStringByKey("conf_accepted_asset_SIGN"))
2222
2323 let usdnAssetId = fromBase58String(getStringByKey("conf_accepted_asset_USDN"))
2424
2525 let usdtAssetId = fromBase58String(getStringByKey("conf_accepted_asset_USDT"))
2626
2727 let wavesAssetId = base58''
2828
2929 let chris = getStringByKey("conf_admin_1")
3030
3131 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
3232
3333
3434 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
3535
3636
3737 func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
3838
3939
4040 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
4141
4242
4343 let signCut = 7
4444
4545 let usdnWaveCut = 10
4646
4747 let defaultLicence = getStringByKey("conf_default_licence")
4848
4949 let defaultHashLicence = getStringByKey("conf_default_licence_hash")
5050
5151 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
5252
5353 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
5454
5555 let userSuspended = "SUSPENDED"
5656
5757 let userRemoved = "REMOVED"
5858
5959 let userUnregistered = "UNREGISTERED"
6060
6161 let userAllowed = "ALLOWED"
6262
6363 let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
6464
6565 func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signDapp, ((("data_fc_" + signID) + "_") + Owner)) {
6666 case a: String =>
6767 if (contains(a, sha256Hash))
6868 then true
6969 else false
7070 case _ =>
7171 false
7272 }
7373
7474
7575 func validateCID (cid) = if (contains(cid, "/"))
7676 then if (if ((76 > size(cid)))
7777 then (size(split(cid, "/")[0]) == 59)
7878 else false)
7979 then (16 > size(split(cid, "/")[1]))
8080 else false
8181 else false
8282
8383
8484 func validateHash (hash) = (size(hash) == 64)
8585
8686
8787 func keyUserStatus (caller) = ("user_status_" + caller)
8888
8989
9090 func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
9191
9292
9393 func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
9494
9595
9696 func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
9797
9898
9999 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
100100
101101
102102 func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
103103
104104
105105 func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
106106
107107
108108 func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
109109
110110
111111 func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
112112
113113
114114 func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
115115
116116
117117 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
118118
119119
120120 func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
121121
122122
123123 func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
124124
125125
126126 func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
127127
128128
129129 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
130130
131131
132132 func keyNote (caller,artId) = ((("art_note_" + artId) + "_") + caller)
133133
134134
135135 func keyCrawler (caller,artId) = ((("art_crawler_cid_" + artId) + "_") + caller)
136136
137137
138138 func keyRoyalties (caller,artId) = ((("art_royalties_" + artId) + "_") + caller)
139139
140140
141141 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
142142
143143
144144 func keyEndSale (caller,artId) = ((("art_endsale_" + artId) + "_") + caller)
145145
146146
147147 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
148148
149149
150150 func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
151151
152152
153153 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
154154
155155
156156 func keyPrimaryShareAgent (artistAddr) = ("artist_agent_primary_" + artistAddr)
157157
158158
159159 func keyArtistPublicAgentAddr (artistAddr) = ("artist_public_agent_" + artistAddr)
160160
161161
162162 func keyPrimarySharePublicAgent (artistAddr) = ("artist_public_agent_primary_" + artistAddr)
163163
164164
165165 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
166166
167167
168168 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
169169
170170
171171 func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
172172
173173
174174 func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
175175
176176
177177 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
178178 then throw("Wrong Display CID")
179179 else if (!(validateCID(cidExport)))
180180 then throw("Wrong Export CID")
181181 else if (if ((cidLicence != ""))
182182 then !(validateCID(cidLicence))
183183 else false)
184184 then throw("Wrong Licence CID")
185185 else true
186186
187187
188188 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
189189 then throw("Export Hash 64 char. max")
190190 else if (!(validateHash(sha256Licence)))
191191 then throw("Licence Hash 64 char. max")
192192 else true
193193
194194
195195 func validateString (str,max) = if ((size(str) == 0))
196196 then throw("Field cannot be is empty")
197197 else if ((size(str) > max))
198198 then throw((str + " is too long"))
199199 else true
200200
201201
202202 func validateUser (caller) = {
203203 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
204204 if (if ((userStatus == userUnregistered))
205205 then true
206206 else (userStatus == userAllowed))
207207 then "Register this account first with \"Account\" tab"
208208 else if ((userStatus == userSuspended))
209209 then "Account suspended"
210210 else if ((userStatus == userRemoved))
211211 then "Account removed"
212212 else ""
213213 }
214214
215215
216216 func setLIcence (cidLicence,sha256Licence) = {
217217 let cid = if ((size(cidLicence) == 0))
218218 then defaultLicence
219219 else cidLicence
220220 let hash = if ((size(sha256Licence) == 0))
221221 then defaultHashLicence
222222 else sha256Licence
223223 $Tuple2(cid, hash)
224224 }
225225
226226
227227 func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,royalties) = {
228228 let checkUser = validateUser(caller)
229229 if ((checkUser != ""))
230230 then throw(checkUser)
231231 else if ((size(cidDisplay) == 0))
232232 then throw("Display CID cannot be empty")
233233 else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
234234 then throw("Problem with CID")
235235 else if (!(validateAllHash(sha256Export, licenceHash)))
236236 then throw("Problem with Hashes")
237237 else if (!(validateString(name, 100)))
238238 then throw("100 Char. max name")
239239 else if (!(validateString(description, 1000)))
240240 then throw("1000 Char. max description")
241241 else if (if ((0 > royalties))
242242 then true
243243 else (royalties > 1000))
244244 then throw("Royalties cannot be less than 0% or higher than 10%")
245245 else if ((size(split(tags, ",")) > 5))
246246 then throw("5 tags max.")
247247 else ""
248248 }
249249
250250
251251 func isPayment (i) = if ((size(i.payments) == 0))
252252 then throw("No payment attached")
253253 else {
254254 let payment = value(i.payments[0])
255255 let amount = value(payment.amount)
256256 $Tuple2(payment, amount)
257257 }
258258
259259
260260 func validatePayment (i) = {
261261 let $t091809216 = isPayment(i)
262262 let payment = $t091809216._1
263263 let amount = $t091809216._2
264264 let assetId = if (if (isDefined(payment.assetId))
265265 then (payment.assetId == signAssetId)
266266 else false)
267267 then payment.assetId
268268 else throw("Only SIGN token accepted as transaction fee")
269269 if ((amount != currentCertificationPrice))
270270 then throw(("Payment amount should be " + toString(currentCertificationPrice)))
271271 else $Tuple2(amount, assetId)
272272 }
273273
274274
275275 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
276276 case b: Int =>
277277 if ((b != 0))
278278 then true
279279 else false
280280 case _ =>
281281 false
282282 }
283283
284284
285285 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
286286 let $t098049840 = isPayment(i)
287287 let payment = $t098049840._1
288288 let amount = $t098049840._2
289289 let assetId = if (!(isDefined(payment.assetId)))
290290 then unit
291291 else if (if ((size(priceAssetId) > 0))
292292 then (toBase58String(value(payment.assetId)) == priceAssetId)
293293 else false)
294294 then payment.assetId
295295 else throw("Wrong asset id")
296296 if (if ((assetId == unit))
297297 then (priceAssetId != "")
298298 else false)
299299 then throw("Wrong asset id")
300300 else if ((artworkPrice != amount))
301301 then throw("Payment don't match")
302302 else $Tuple2(amount, assetId)
303303 }
304304
305305
306306 func acceptedAssetIds (assetId) = if (if (if (if (if ((assetId != toBase58String(signAssetId)))
307307 then (assetId != toBase58String(wavesAssetId))
308308 else false)
309309 then (assetId != "WAVES")
310310 else false)
311311 then (assetId != toBase58String(usdnAssetId))
312312 else false)
313313 then (assetId != toBase58String(usdtAssetId))
314314 else false)
315315 then throw("Only SIGN, USDN,USDT or WAVES accepted")
316316 else true
317317
318318
319319 func validateMinSell (assetId,price) = {
320320 let minSellWaves = if (unitTest)
321321 then 10
322322 else getIntegerByKeyFromOracle("waves_min_sell")
323323 let minSellUsdn = 1000000
324324 let minSellSign = if (unitTest)
325325 then 1
326326 else (currentCertificationPrice * 2)
327327 if (if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
328328 then (minSellUsdn > price)
329329 else false)
330330 then (price != 0)
331331 else false)
332332 then true
333333 else if (if ((assetId == toBase58String(usdtAssetId)))
334334 then (minSellUsdn > price)
335335 else false)
336336 then (price != 0)
337337 else false)
338338 then true
339339 else if (if ((assetId == toBase58String(signAssetId)))
340340 then (minSellSign > price)
341341 else false)
342342 then (price != 0)
343343 else false)
344344 then true
345345 else if (if (if ((assetId == toBase58String(wavesAssetId)))
346346 then true
347347 else (assetId == "WAVES"))
348348 then (minSellWaves > price)
349349 else false)
350350 then (price != 0)
351351 else false)
352352 then throw("Wrong minimum sell price")
353353 else true
354354 }
355355
356356
357357 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
358358 then unit
359359 else fromBase58String(assetId)
360360
361361
362362 func getPriceAssetIdFromBid (bidDataKey) = {
363363 let bidData = getStringByKey((bidDataKey + "_OPEN"))
364364 if ((bidData == ""))
365365 then throw("Bid not found")
366366 else {
367367 let bidDataArr = split(bidData, "_")
368368 let bidAmount = parseIntValue(bidDataArr[1])
369369 let bidAssetId = getBidAssetId(bidDataArr[0])
370370 if ((0 >= bidAmount))
371371 then throw("Wrong amount")
372372 else $Tuple2(bidAmount, bidAssetId)
373373 }
374374 }
375375
376376
377377 func idCallerDateSponsored (i,pubKey) = if (!(dappRunning))
378378 then throw(maintenanceMSG)
379379 else {
380380 let isSponsored = if ((pubKey != ""))
381381 then valueOrElse(checkWhitelist((toString(addressFromPublicKey(fromBase58String(pubKey))) + "_free_txs")), 0)
382382 else 0
383383 let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
384384 then (isSponsored > 0)
385385 else false)
386386 then toString(addressFromPublicKey(fromBase58String(pubKey)))
387387 else toBase58String(i.caller.bytes)
388388 let get_sponsored_waves = if (if ((pubKey != ""))
389389 then (isSponsored > 0)
390390 else false)
391391 then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
392392 else unit
393393 if ((get_sponsored_waves == get_sponsored_waves))
394394 then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
395395 else throw("Strict value is not equal to itself.")
396396 }
397397
398398
399399 func idCallerDate (i) = if (!(dappRunning))
400400 then throw(maintenanceMSG)
401401 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
402402
403403
404404 func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
405405 let $t01304113111 = idCallerDateSponsored(i, pubKey)
406406 let id = $t01304113111._1
407407 let caller = $t01304113111._2
408408 let date = $t01304113111._3
409409 let isSponsored = $t01304113111._4
410410 if (true)
411- then throw(((toString((caller == issuer)) + " / ") + toString(isSponsored)))
411+ then throw(((((caller + " / ") + issuer) + " / ") + toString(isSponsored)))
412412 else {
413413 let isBid = if (if (if ((caller == issuer))
414414 then (bidOwner != "")
415415 else false)
416416 then (bidId != "")
417417 else false)
418418 then true
419419 else false
420420 let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
421421 if (if (if ((blockEnd != 0))
422422 then (height >= blockEnd)
423423 else false)
424424 then !(isBid)
425425 else false)
426426 then throw("Sale ended.")
427427 else {
428428 let callerIsIssuer = (caller == issuer)
429429 let totalNFT = getIntegerByKey("total_nft_issued")
430430 let signID = getStringByKey(keySignID(issuer, artId))
431431 let artworkName = getStringByKey(keyName(issuer, artId))
432432 if ((artworkName == ""))
433433 then throw("Art doesn't exist")
434434 else {
435435 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
436436 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
437437 let artworkPrice = if (callerIsIssuer)
438438 then (currentCertificationPrice * 2)
439439 else getIntegerByKey(keyPrice(issuer, artId))
440440 let priceAssetId = if (callerIsIssuer)
441441 then toBase58String(signAssetId)
442442 else getStringByKey(keyAssetIdAccepted(issuer, artId))
443443 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
444444 if (if (if (!(isBid))
445445 then !(callerIsIssuer)
446446 else false)
447447 then if (if ((0 >= artworkPrice))
448448 then true
449449 else !(isOnSale))
450450 then true
451451 else (0 >= maxCanSell)
452452 else false)
453453 then throw("Art not for sale")
454454 else if (if (if (!(isBid))
455455 then callerIsIssuer
456456 else false)
457457 then (0 >= maxCanSell)
458458 else false)
459459 then throw("Max issuable not set")
460460 else {
461461 let checkUser = validateUser(issuer)
462462 if (if (isBid)
463463 then (checkUser != "")
464464 else false)
465465 then throw(checkUser)
466466 else {
467467 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
468- let $t01473714929 = if (isBid)
468+ let $t01473214924 = if (isBid)
469469 then getPriceAssetIdFromBid(bidDataKey)
470470 else validatePriceAssetId(i, priceAssetId, artworkPrice)
471- let amount = $t01473714929._1
472- let assetId = $t01473714929._2
471+ let amount = $t01473214924._1
472+ let assetId = $t01473214924._2
473473 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
474474 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
475475 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
476476 let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
477477 let isWhitelisted = checkWhitelist(issuer)
478478 let cut = if ((isWhitelisted > height))
479479 then 0
480480 else if ((assetId == signAssetId))
481481 then signCut
482482 else usdnWaveCut
483483 let amountForSign = fraction(amount, cut, 100)
484484 let amountForAgent = if (if (if ((agent != feeReceiver))
485485 then (agentShare > 0)
486486 else false)
487487 then (height > isWhitelisted)
488488 else false)
489489 then fraction(amount, agentShare, 10000)
490490 else 0
491491 let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
492492 then (publicAgentShare > 0)
493493 else false)
494494 then (height > isWhitelisted)
495495 else false)
496496 then fraction(amount, publicAgentShare, 10000)
497497 else 0
498498 let amountForCreator = (amount - amountForSign)
499499 if ((amountSold == maxCanSell))
500500 then throw("Art sold out")
501501 else {
502502 let newAmountSold = (amountSold + 1)
503503 let issueMeta = ((((((((((("Creator: " + issuer) + ",
504504 ArtID: ") + artId) + ",
505505 SignID: ") + signID) + ",
506506 Artwork name: ") + artworkName) + ",
507507 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
508508 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
509509 let idNFT = calculateAssetId(issueNFT)
510510 let sellStatus = if (if ((newAmountSold == maxCanSell))
511511 then true
512512 else !(isOnSale))
513513 then false
514514 else true
515515 let receiveNFT = if (if (if ((caller == issuer))
516516 then (bidOwner != "")
517517 else false)
518518 then (bidId != "")
519519 else false)
520520 then addressFromStringValue(bidOwner)
521521 else i.caller
522522 let assetIdBid = if (!(isDefined(assetId)))
523523 then "WAVES"
524524 else toBase58String(value(assetId))
525525 let bidData = getStringByKey((bidDataKey + "_OPEN"))
526526 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
527527 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
528528 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
529529 let soldValue = if (!(isBid))
530530 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
531531 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
532532 let soldData = StringEntry(soldKey, soldValue)
533533 let commissionsWithAgent = if ((amountForAgent != 0))
534534 then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
535535 else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
536536 let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
537537 then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
538538 else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
539539 let txToCaller = if (isSponsored)
540540 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
541541 else nil
542542 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)
543543 if (isBid)
544544 then [soldData, bidUpdate, bidDelOld] :: buyRes
545545 else soldData :: buyRes
546546 }
547547 }
548548 }
549549 }
550550 }
551551 }
552552 }
553553
554554
555555 func asString (bv) = match bv {
556556 case bv0: String =>
557557 bv0
558558 case _ =>
559559 throw("Sponsored Public Key String expected")
560560 }
561561
562562
563563 @Callable(invoke)
564564 func setConf (key,val) = {
565565 let caller = toString(invoke.caller)
566566 if (containsElement([chris, toString(this)], caller))
567567 then if (contains(key, "conf_"))
568568 then [StringEntry(key, val)]
569569 else throw("Entries starting with conf_ only")
570570 else throw("You are not allowed to change this")
571571 }
572572
573573
574574
575575 @Callable(i)
576576 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
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
577+ let $t02010020173 = idCallerDateSponsored(i, pubKey)
578+ let artId = $t02010020173._1
579+ let caller = $t02010020173._2
580+ let date = $t02010020173._3
581+ let isSponsored = $t02010020173._4
582582 if (!(validateHash(sha256Hash)))
583583 then throw("Hash should be 64 characters maximum")
584584 else {
585- let $t02027920348 = setLIcence(cidLicence, sha256Licence)
586- let licenceCID = $t02027920348._1
587- let licenceHash = $t02027920348._2
585+ let $t02027420343 = setLIcence(cidLicence, sha256Licence)
586+ let licenceCID = $t02027420343._1
587+ let licenceHash = $t02027420343._2
588588 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
589589 if ((validateArtwork != ""))
590590 then throw("Something went wrong!")
591591 else {
592592 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
593- let $t02064720731 = if (whitelisted_drop)
593+ let $t02064220726 = if (whitelisted_drop)
594594 then $Tuple2(0, signID)
595595 else validatePayment(i)
596- let amount = $t02064720731._1
597- let assetId = $t02064720731._2
596+ let amount = $t02064220726._1
597+ let assetId = $t02064220726._2
598598 if (!(isDefined(amount)))
599599 then throw("Something went wrong")
600600 else {
601601 let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
602602 if ((entryExist != ""))
603603 then throw("You already added it")
604604 else {
605605 let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
606606 if ((hashExist != ""))
607607 then throw("Hash already registered")
608608 else {
609609 let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
610610 if (!(isSignCertified))
611611 then throw("Sign Certificate not found for this address.")
612612 else {
613613 let decrease_whitelist_drop = if (whitelisted_drop)
614614 then invoke(whitelistDapp, "useFreeDrop", [caller], nil)
615615 else unit
616616 if ((decrease_whitelist_drop == decrease_whitelist_drop))
617617 then {
618618 let txToCaller = if (isSponsored)
619619 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
620620 else nil
621621 ([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)
622622 }
623623 else throw("Strict value is not equal to itself.")
624624 }
625625 }
626626 }
627627 }
628628 }
629629 }
630630 }
631631
632632
633633
634634 @Callable(i)
635635 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
636636 then throw(maintenanceMSG)
637637 else {
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
638+ let $t02376023830 = idCallerDateSponsored(i, pubKey)
639+ let id = $t02376023830._1
640+ let caller = $t02376023830._2
641+ let date = $t02376023830._3
642+ let isSponsored = $t02376023830._4
643+ let $t02384023909 = setLIcence(cidLicence, sha256Licence)
644+ let licenceCID = $t02384023909._1
645+ let licenceHash = $t02384023909._2
646646 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
647647 if ((validateArtwork != ""))
648648 then throw("Something went wrong!")
649649 else {
650650 let entryExist = getStringByKey(keyName(caller, txid))
651651 if ((entryExist == ""))
652652 then throw("Entry not found")
653653 else {
654654 let flag = getStringByKey(keyFlag(caller, txid))
655655 if ((flag == "ILLEGAL"))
656656 then throw("Cannot update ILLEGAL artwork")
657657 else if (!(isArtMinted(caller, txid)))
658658 then {
659659 let txToCaller = if (isSponsored)
660660 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
661661 else nil
662662 ([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)
663663 }
664664 else throw("Already minted")
665665 }
666666 }
667667 }
668668
669669
670670
671671 @Callable(i)
672672 func flagArtwork (artId,addr,flag,note) = {
673- let $t02554125575 = idCallerDate(i)
674- let id = $t02554125575._1
675- let caller = $t02554125575._2
673+ let $t02553625570 = idCallerDate(i)
674+ let id = $t02553625570._1
675+ let caller = $t02553625570._2
676676 if (containsElement([chris, toString(this)], caller))
677677 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
678678 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
679679 else throw(("Unknow status " + flag))
680680 else throw("You are not allowed")
681681 }
682682
683683
684684
685685 @Callable(i)
686686 func deleteArtwork (artId,addr) = {
687- let $t02601126045 = idCallerDate(i)
688- let id = $t02601126045._1
689- let caller = $t02601126045._2
687+ let $t02600626040 = idCallerDate(i)
688+ let id = $t02600626040._1
689+ let caller = $t02600626040._2
690690 let addrToUse = if (containsElement([chris, toString(this)], caller))
691691 then addr
692692 else caller
693693 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
694694 if ((entryExist == ""))
695695 then throw("No art matching for this address")
696696 else {
697697 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
698698 if ((sha256Hash == ""))
699699 then throw("No art hash matching for this address")
700700 else {
701701 let signID = getStringByKey(keySignID(addrToUse, artId))
702702 if ((signID == ""))
703703 then throw("No SIGN ID matching")
704704 else {
705705 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))]
706706 if (!(isArtMinted(addrToUse, artId)))
707707 then if (!(dappRunning))
708708 then throw(maintenanceMSG)
709709 else dataToDelete
710710 else if (containsElement([chris, toString(this)], caller))
711711 then dataToDelete
712712 else throw("Art already minted, you cannot delete it")
713713 }
714714 }
715715 }
716716 }
717717
718718
719719
720720 @Callable(i)
721721 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
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
722+ let $t02887628946 = idCallerDateSponsored(i, pubKey)
723+ let id = $t02887628946._1
724+ let caller = $t02887628946._2
725+ let date = $t02887628946._3
726+ let isSponsored = $t02887628946._4
727727 let artworkName = getStringByKey(keyName(caller, artId))
728728 if ((artworkName == ""))
729729 then throw("This art doesn't match your account")
730730 else {
731731 let flag = getStringByKey(keyFlag(caller, artId))
732732 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
733733 then throw("Flagged artwork")
734734 else {
735735 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
736736 if ((0 > blockEnd))
737737 then throw("Negative end")
738738 else if (if ((blockEnd > 0))
739739 then if ((maxMint != 1))
740740 then true
741741 else (price != 0)
742742 else false)
743743 then throw("Timed offer only allowed for unique edition and offer only")
744744 else {
745745 let baseHeight = if ((blockEnd == 0))
746746 then 0
747747 else height
748748 if (!(acceptedAssetIds(assetId)))
749749 then throw("Something went wrong!")
750750 else if (!(validateMinSell(assetId, price)))
751751 then throw("Something went wrong!")
752752 else {
753753 let checkUser = validateUser(caller)
754754 if ((checkUser != ""))
755755 then throw(checkUser)
756756 else {
757757 let amountSold = getIntegerByKey(keyIssued(caller, artId))
758758 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
759759 if ((maxMint > 100))
760760 then throw("100 editions max per artwork")
761761 else if (if ((amountSold != 0))
762762 then (amountSold == maxCanSell)
763763 else false)
764764 then throw("Max edition reached.")
765765 else if (if ((amountSold > 0))
766766 then (maxCanSell != maxMint)
767767 else false)
768768 then throw("Cannot change maximum issuable anymore")
769769 else if (if ((bidNbr > 0))
770770 then (maxCanSell != maxMint)
771771 else false)
772772 then throw("Cannot change maximum issuable with active orders")
773773 else {
774774 let sellStatus = if (if ((price > 0))
775775 then (maxMint > 0)
776776 else false)
777777 then true
778778 else false
779779 let txToCaller = if (isSponsored)
780780 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
781781 else nil
782782 ([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)
783783 }
784784 }
785785 }
786786 }
787787 }
788788 }
789789 }
790790
791791
792792
793793 @Callable(i)
794794 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", "")
795795
796796
797797
798798 @Callable(i)
799799 func setBid (artId,issuer) = {
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
800+ let $t03132831368 = idCallerDate(i)
801+ let id = $t03132831368._1
802+ let caller = $t03132831368._2
803+ let date = $t03132831368._3
804+ let $t03137331409 = isPayment(i)
805+ let payment = $t03137331409._1
806+ let amount = $t03137331409._2
807807 let assetId = if (!(isDefined(payment.assetId)))
808808 then "WAVES"
809809 else toBase58String(value(payment.assetId))
810810 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
811811 if (if ((blockEnd != 0))
812812 then (height >= blockEnd)
813813 else false)
814814 then throw("Sale ended.")
815815 else {
816816 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
817817 if (!(acceptedAssetIds(assetId)))
818818 then throw("asset not accepted")
819819 else if (!(validateMinSell(assetId, amount)))
820820 then throw("Wrong min sell")
821821 else {
822822 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
823823 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
824824 if ((0 >= maxCanSell))
825825 then throw("No max edition set for this artwork")
826826 else if ((amountSold >= maxCanSell))
827827 then throw("Sold out, you cannot bid")
828828 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
829829 }
830830 }
831831 }
832832
833833
834834
835835 @Callable(i)
836836 func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = {
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
837+ let $t03262932700 = idCallerDateSponsored(i, pubKey)
838+ let id = $t03262932700._1
839+ let caller1 = $t03262932700._2
840+ let date = $t03262932700._3
841+ let isSponsored = $t03262932700._4
842842 if ((caller1 != issuer))
843843 then throw("You cannot do this action")
844844 else buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
845845 }
846846
847847
848848
849849 @Callable(i)
850850 func cancelBid (artId,issuer,bidId,bidOwner) = {
851- let $t03294033001 = idCallerDate(i)
852- let id = $t03294033001._1
853- let caller = $t03294033001._2
854- let date = $t03294033001._3
851+ let $t03293532996 = idCallerDate(i)
852+ let id = $t03293532996._1
853+ let caller = $t03293532996._2
854+ let date = $t03293532996._3
855855 if (if ((caller != bidOwner))
856856 then (caller != issuer)
857857 else false)
858858 then throw("You cannot do this action")
859859 else {
860860 let returnMoneyTo = if ((caller == issuer))
861861 then bidOwner
862862 else caller
863863 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
864864 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
865865 let bidData = getStringByKey((bidDataKey + "_OPEN"))
866866 if ((bidData == ""))
867867 then throw("Bid not found")
868868 else {
869869 let bidDataArr = split(bidData, "_")
870870 let assetId = getBidAssetId(bidDataArr[0])
871871 let bidStatus = "CANCELED"
872872 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
873873 }
874874 }
875875 }
876876
877877
878878 @Verifier(tx)
879879 func verifier () = match tx {
880880 case inv: InvokeScriptTransaction =>
881881 if (if (if (if ((inv.function == "addArtwork"))
882882 then (inv.dApp == this)
883883 else false)
884884 then (inv.fee == 500000)
885885 else false)
886886 then (inv.feeAssetId == unit)
887887 else false)
888888 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[13])))
889889 else if (if (if (if ((inv.function == "updateArtwork"))
890890 then (inv.dApp == this)
891891 else false)
892892 then (inv.fee == 500000)
893893 else false)
894894 then (inv.feeAssetId == unit)
895895 else false)
896896 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
897897 else if (if (if (if ((inv.function == "sellArtwork"))
898898 then (inv.dApp == this)
899899 else false)
900900 then (inv.fee == 500000)
901901 else false)
902902 then (inv.feeAssetId == unit)
903903 else false)
904904 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
905905 else if (if (if (if ((inv.function == "acceptBid"))
906906 then (inv.dApp == this)
907907 else false)
908908 then (inv.fee == 500000)
909909 else false)
910910 then (inv.feeAssetId == unit)
911911 else false)
912912 then sigVerify_128Kb(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[4])))
913913 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
914914 case _ =>
915915 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
916916 }
917917

github/deemru/w8io/3ef1775 
180.94 ms