tx · BVcdgVpYKXrT3UXeLm48ZvPcM9TQLhiH1qPNc7jnnBXN

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.01900000 Waves

2023.03.24 06:29 [2503549] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "BVcdgVpYKXrT3UXeLm48ZvPcM9TQLhiH1qPNc7jnnBXN", "fee": 1900000, "feeAssetId": null, "timestamp": 1679628599750, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "dfFy9C1v6LBT3HHhzAowWWTz1XKodr5Pmt1pXFM8XWuSdXR1nsSG18Vtf4zU67jgMDBA8uGYHpVegzvscLBkqdg" ], "script": "base64:BgL1FAgCEgQKAggIEhAKDggICAgICAgICAgICAEIEg8KDQgICAgICAgICAgIAQgSBgoECAgICBIECgIICBIICgYIAQEIAQgSBAoCCAgSBAoCCAgSBwoFCAgICAgSBgoECAgICCIOZ2V0U3RyaW5nQnlLZXkiA2tleSIIdW5pdFRlc3QiCW9yYWNsZUZlZSIIc2lnbkRhcHAiC2ZlZVJlY2VpdmVyIgh1c2VyRGFwcCINd2hpdGVsaXN0RGFwcCILc2lnbkFzc2V0SWQiC3VzZG5Bc3NldElkIgt1c2R0QXNzZXRJZCIMd2F2ZXNBc3NldElkIgVjaHJpcyIZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZSIPZ2V0SW50ZWdlckJ5S2V5Ig5jaGVja1doaXRlbGlzdCIPZ2V0Qm9vbGVhbkJ5S2V5IgdzaWduQ3V0Igt1c2RuV2F2ZUN1dCIOZGVmYXVsdExpY2VuY2UiEmRlZmF1bHRIYXNoTGljZW5jZSILZGFwcFJ1bm5pbmciDm1haW50ZW5hbmNlTVNHIg11c2VyU3VzcGVuZGVkIgt1c2VyUmVtb3ZlZCIQdXNlclVucmVnaXN0ZXJlZCILdXNlckFsbG93ZWQiGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UiFGNoZWNrU2lnbkNlcnRpZmljYXRlIgZzaWduSUQiBU93bmVyIgpzaGEyNTZIYXNoIgckbWF0Y2gwIgFhIgt2YWxpZGF0ZUNJRCIDY2lkIgx2YWxpZGF0ZUhhc2giBGhhc2giDWtleVVzZXJTdGF0dXMiBmNhbGxlciIHa2V5RGF0ZSIFYXJ0SWQiB2tleU5hbWUiB2tleURlc2MiDWtleURpc3BsYXlDaWQiDWtleUV4cG9ydEhhc2giDGtleUV4cG9ydENpZCIKa2V5TWF4TWludCIJa2V5U2lnbklEIglrZXlJc3N1ZWQiCWtleU9uU2FsZSIOa2V5TGljZW5jZUhhc2giDWtleUxpY2VuY2VDaWQiB2tleVRhZ3MiB2tleVR5cGUiB2tleU5vdGUiCmtleUNyYXdsZXIiDGtleVJveWFsdGllcyIIa2V5UHJpY2UiCmtleUVuZFNhbGUiEmtleUFzc2V0SWRBY2NlcHRlZCIHa2V5RmxhZyISa2V5QXJ0aXN0QWdlbnRBZGRyIgphcnRpc3RBZGRyIhRrZXlQcmltYXJ5U2hhcmVBZ2VudCIYa2V5QXJ0aXN0UHVibGljQWdlbnRBZGRyIhprZXlQcmltYXJ5U2hhcmVQdWJsaWNBZ2VudCIRa2V5SGFzaEJ5VHhpZEFkZHIiBHR4aWQiDmtleU93bmVyQnlIYXNoIg1rZXlpZEJ5U2lnbmlkIgZzaWduSWQiEmtleVR4aWRCeUhhc2hPd25lciIOdmFsaWRhdGVBbGxDSUQiCmNpZERpc3BsYXkiCWNpZEV4cG9ydCIKY2lkTGljZW5jZSIPdmFsaWRhdGVBbGxIYXNoIgxzaGEyNTZFeHBvcnQiDXNoYTI1NkxpY2VuY2UiDnZhbGlkYXRlU3RyaW5nIgNzdHIiA21heCIMdmFsaWRhdGVVc2VyIgp1c2VyU3RhdHVzIgpzZXRMSWNlbmNlIhN2YWxpZGF0ZUFydHdvcmtEYXRhIgpsaWNlbmNlQ0lEIgtsaWNlbmNlSGFzaCIEbmFtZSILZGVzY3JpcHRpb24iBHRhZ3MiCXJveWFsdGllcyIJY2hlY2tVc2VyIglpc1BheW1lbnQiAWkiB3BheW1lbnQiBmFtb3VudCIPdmFsaWRhdGVQYXltZW50IgskdDA5MTgwOTIxNiIHYXNzZXRJZCILaXNBcnRNaW50ZWQiCWFkZHJUb1VzZSIBYiIUdmFsaWRhdGVQcmljZUFzc2V0SWQiDHByaWNlQXNzZXRJZCIMYXJ0d29ya1ByaWNlIgskdDA5ODA0OTg0MCIQYWNjZXB0ZWRBc3NldElkcyIPdmFsaWRhdGVNaW5TZWxsIgVwcmljZSIMbWluU2VsbFdhdmVzIgttaW5TZWxsVXNkbiILbWluU2VsbFNpZ24iDWdldEJpZEFzc2V0SWQiFmdldFByaWNlQXNzZXRJZEZyb21CaWQiCmJpZERhdGFLZXkiB2JpZERhdGEiCmJpZERhdGFBcnIiCWJpZEFtb3VudCIKYmlkQXNzZXRJZCIVaWRDYWxsZXJEYXRlU3BvbnNvcmVkIgZwdWJLZXkiC2lzU3BvbnNvcmVkIhNnZXRfc3BvbnNvcmVkX3dhdmVzIgxpZENhbGxlckRhdGUiB2J1eU1pbnQiBmlzc3VlciIFYmlkSWQiCGJpZE93bmVyIg0kdDAxMzA4MTEzMTcwIgJpZCIEZGF0ZSIFaXNCaWQiCGJsb2NrRW5kIg5jYWxsZXJJc0lzc3VlciIIdG90YWxORlQiC2FydHdvcmtOYW1lIghpc09uU2FsZSIKYW1vdW50U29sZCIKbWF4Q2FuU2VsbCINJHQwMTQ3NzMxNDk2NSIFYWdlbnQiCmFnZW50U2hhcmUiC3B1YmxpY0FnZW50IhBwdWJsaWNBZ2VudFNoYXJlIg1pc1doaXRlbGlzdGVkIgNjdXQiDWFtb3VudEZvclNpZ24iDmFtb3VudEZvckFnZW50IhRhbW91bnRGb3JQdWJsaWNBZ2VudCIQYW1vdW50Rm9yQ3JlYXRvciINbmV3QW1vdW50U29sZCIJaXNzdWVNZXRhIghpc3N1ZU5GVCIFaWRORlQiCnNlbGxTdGF0dXMiCnJlY2VpdmVORlQiCmFzc2V0SWRCaWQiCWJpZERlbE9sZCIJYmlkVXBkYXRlIgdzb2xkS2V5Iglzb2xkVmFsdWUiCHNvbGREYXRhIhRjb21taXNzaW9uc1dpdGhBZ2VudCIaY29tbWlzc2lvbnNXaXRoUHVibGljQWdlbnQiCnR4VG9DYWxsZXIiBmJ1eVJlcyIIYXNTdHJpbmciAmJ2IgNidjAiBmludm9rZSIDdmFsIgR0eXBlIgdjcmF3bGVyIg0kdDAyMDE0MTIwMjE0Ig0kdDAyMDMxNTIwMzg0Ig92YWxpZGF0ZUFydHdvcmsiEHdoaXRlbGlzdGVkX2Ryb3AiDSR0MDIwNjgzMjA3NjciCmVudHJ5RXhpc3QiCWhhc2hFeGlzdCIPaXNTaWduQ2VydGlmaWVkIhdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcCINJHQwMjM4MDEyMzg3MSINJHQwMjM4ODEyMzk1MCIEZmxhZyIEYWRkciIEbm90ZSINJHQwMjU1NzcyNTYxMSINJHQwMjYwNDcyNjA4MSIMZGF0YVRvRGVsZXRlIgdtYXhNaW50Ig0kdDAyODkxNzI4OTg3IgZiaWROYnIiCmJhc2VIZWlnaHQiDSR0MDMxMzY5MzE0MDkiDSR0MDMxNDE0MzE0NTAiDSR0MDMyNjcwMzI3NDAiDSR0MDMyOTc0MzMwMzUiDXJldHVybk1vbmV5VG8iCWJpZFN0YXR1cyICdHgiCHZlcmlmaWVyIgNpbnZOAQFhAQFiCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFAWICAAABYwcAAWQJAQV2YWx1ZQEJAKYIAQkBAWEBAg9jb25mX29yYWNsZV9mZWUAAWUJAQV2YWx1ZQEJAKYIAQkBAWEBAhFjb25mX3NpZ253ZWJfZGFwcAABZgkBAWEBAhFjb25mX2ZlZV9yZWNlaXZlcgABZwMFAWMJAQV2YWx1ZQEJAKYIAQIjM010NFJHTUV5alNXWUFvY1RQcWQ1NXdkSFFRQjNQVTJVQ20JAQV2YWx1ZQEJAKYIAQkBAWEBAg9jb25mX3VzZXJzX2RhcHAAAWgJAQV2YWx1ZQEJAKYIAQkBAWEBAhNjb25mX3doaXRlbGlzdF9kYXBwAAFpCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9TSUdOAAFqCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9VU0ROAAFrCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9VU0RUAAFsAQAAAW0JAQFhAQIMY29uZl9hZG1pbl8xAQFuAQFiCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUBZAUBYgIfSW50ZWdlciB1bmRlZmluZSBvciAwIGluIG9yYWNsZQEBbwEBYgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFiAAABAXABAWIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUBaAUBYgAAAQFxAQFiCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFAWIHAAFyAAcAAXMACgABdAkBAWEBAhRjb25mX2RlZmF1bHRfbGljZW5jZQABdQkBAWEBAhljb25mX2RlZmF1bHRfbGljZW5jZV9oYXNoAAF2CQELdmFsdWVPckVsc2UCCQCbCAIFAWcCFGNvbmZfZGFwcF9pc19ydW5uaW5nBgABdwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQFnAhRjb25mX21haW50ZW5hbmNlX21zZwIAAAF4AglTVVNQRU5ERUQAAXkCB1JFTU9WRUQAAXoCDFVOUkVHSVNURVJFRAABQQIHQUxMT1dFRAABQgkBAW4BCQCsAgICEmNlcnRpZmljYXRpb25fZmVlXwkA2AQBBQFpAQFDAwFEAUUBRgQBRwkAnQgCBQFlCQCsAgIJAKwCAgkArAICAghkYXRhX2ZjXwUBRAIBXwUBRQMJAAECBQFHAgZTdHJpbmcEAUgFAUcDCQEIY29udGFpbnMCBQFIBQFGBgcHAQFJAQFKAwkBCGNvbnRhaW5zAgUBSgIBLwMDCQBmAgBMCQCxAgEFAUoJAAACCQCxAgEJAJEDAgkAtQkCBQFKAgEvAAAAOwcJAGYCABAJALECAQkAkQMCCQC1CQIFAUoCAS8AAQcHAQFLAQFMCQAAAgkAsQIBBQFMAEABAU0BAU4JAKwCAgIMdXNlcl9zdGF0dXNfBQFOAQFPAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF9kYXRlXwUBUAIBXwUBTgEBUQIBTgFQCQCsAgIJAKwCAgkArAICAglhcnRfbmFtZV8FAVACAV8FAU4BAVICAU4BUAkArAICCQCsAgIJAKwCAgIJYXJ0X2Rlc2NfBQFQAgFfBQFOAQFTAgFOAVAJAKwCAgkArAICCQCsAgICEGFydF9kaXNwbGF5X2NpZF8FAVACAV8FAU4BAVQCAU4BUAkArAICCQCsAgIJAKwCAgIQYXJ0X2V4cG9ydF9oYXNoXwUBUAIBXwUBTgEBVQIBTgFQCQCsAgIJAKwCAgkArAICAg9hcnRfZXhwb3J0X2NpZF8FAVACAV8FAU4BAVYCAU4BUAkArAICCQCsAgIJAKwCAgIMYXJ0X21heG1pbnRfBQFQAgFfBQFOAQFXAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9zaWduaWRfBQFQAgFfBQFOAQFYAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9pc3N1ZWRfBQFQAgFfBQFOAQFZAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9vbnNhbGVfBQFQAgFfBQFOAQFaAgFOAVAJAKwCAgkArAICCQCsAgICEWFydF9saWNlbmNlX2hhc2hfBQFQAgFfBQFOAQJhYQIBTgFQCQCsAgIJAKwCAgkArAICAhBhcnRfbGljZW5jZV9jaWRfBQFQAgFfBQFOAQJhYgIBTgFQCQCsAgIJAKwCAgkArAICAglhcnRfdGFnc18FAVACAV8FAU4BAmFjAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF90eXBlXwUBUAIBXwUBTgECYWQCAU4BUAkArAICCQCsAgIJAKwCAgIJYXJ0X25vdGVfBQFQAgFfBQFOAQJhZQIBTgFQCQCsAgIJAKwCAgkArAICAhBhcnRfY3Jhd2xlcl9jaWRfBQFQAgFfBQFOAQJhZgIBTgFQCQCsAgIJAKwCAgkArAICAg5hcnRfcm95YWx0aWVzXwUBUAIBXwUBTgECYWcCAU4BUAkArAICCQCsAgIJAKwCAgIKYXJ0X3ByaWNlXwUBUAIBXwUBTgECYWgCAU4BUAkArAICCQCsAgIJAKwCAgIMYXJ0X2VuZHNhbGVfBQFQAgFfBQFOAQJhaQIBTgFQCQCsAgIJAKwCAgkArAICAhJhcnRfYXNzZXRBY2NlcHRlZF8FAVACAV8FAU4BAmFqAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF9mbGFnXwUBUAIBXwUBTgECYWsBAmFsCQCsAgICDWFydGlzdF9hZ2VudF8FAmFsAQJhbQECYWwJAKwCAgIVYXJ0aXN0X2FnZW50X3ByaW1hcnlfBQJhbAECYW4BAmFsCQCsAgICFGFydGlzdF9wdWJsaWNfYWdlbnRfBQJhbAECYW8BAmFsCQCsAgICHGFydGlzdF9wdWJsaWNfYWdlbnRfcHJpbWFyeV8FAmFsAQJhcAIBTgJhcQkArAICCQCsAgIJAKwCAgITZ2V0X2hhc2hieXR4aWRhZGRyXwUCYXECAV8FAU4BAmFyAQFGCQCsAgICEmdldF9vd25lcl9ieV9oYXNoXwUBRgECYXMCAU4CYXQJAKwCAgkArAICCQCsAgICEmdldF9hcnRpZGJ5c2lnbmlkXwUCYXQCAV8FAU4BAmF1AgFGAU4JAKwCAgIXZ2V0X3R4aWRfYnlfaGFzaF9vd25lcl8JANgEAQkA1BYBCQCbAwEJAKwCAgUBRgUBTgECYXYDAmF3AmF4AmF5AwkBASEBCQEBSQEFAmF3CQACAQIRV3JvbmcgRGlzcGxheSBDSUQDCQEBIQEJAQFJAQUCYXgJAAIBAhBXcm9uZyBFeHBvcnQgQ0lEAwMJAQIhPQIFAmF5AgAJAQEhAQkBAUkBBQJheQcJAAIBAhFXcm9uZyBMaWNlbmNlIENJRAYBAmF6AgJhQQJhQgMJAQEhAQkBAUsBBQJhQQkAAgECGEV4cG9ydCBIYXNoIDY0IGNoYXIuIG1heAMJAQEhAQkBAUsBBQJhQgkAAgECGUxpY2VuY2UgSGFzaCA2NCBjaGFyLiBtYXgGAQJhQwICYUQCYUUDCQAAAgkAsQIBBQJhRAAACQACAQIYRmllbGQgY2Fubm90IGJlIGlzIGVtcHR5AwkAZgIJALECAQUCYUQFAmFFCQACAQkArAICBQJhRAIMIGlzIHRvbyBsb25nBgECYUYBAU4EAmFHCQELdmFsdWVPckVsc2UCCQCdCAIFAWcJAQFNAQUBTgUBegMDCQAAAgUCYUcFAXoGCQAAAgUCYUcFAUECLlJlZ2lzdGVyIHRoaXMgYWNjb3VudCBmaXJzdCB3aXRoICJBY2NvdW50IiB0YWIDCQAAAgUCYUcFAXgCEUFjY291bnQgc3VzcGVuZGVkAwkAAAIFAmFHBQF5Ag9BY2NvdW50IHJlbW92ZWQCAAECYUgCAmF5AmFCBAFKAwkAAAIJALECAQUCYXkAAAUBdAUCYXkEAUwDCQAAAgkAsQIBBQJhQgAABQF1BQJhQgkAlAoCBQFKBQFMAQJhSQoBTgJhdwJheAJhSgJhQQJhSwJhTAJhTQJhTgJhTwQCYVAJAQJhRgEFAU4DCQECIT0CBQJhUAIACQACAQUCYVADCQAAAgkAsQIBBQJhdwAACQACAQIbRGlzcGxheSBDSUQgY2Fubm90IGJlIGVtcHR5AwkBASEBCQECYXYDBQJhdwUCYXgFAmFKCQACAQIQUHJvYmxlbSB3aXRoIENJRAMJAQEhAQkBAmF6AgUCYUEFAmFLCQACAQITUHJvYmxlbSB3aXRoIEhhc2hlcwMJAQEhAQkBAmFDAgUCYUwAZAkAAgECEjEwMCBDaGFyLiBtYXggbmFtZQMJAQEhAQkBAmFDAgUCYU0A6AcJAAIBAhoxMDAwIENoYXIuIG1heCBkZXNjcmlwdGlvbgMDCQBmAgAABQJhTwYJAGYCBQJhTwDoBwkAAgECM1JveWFsdGllcyBjYW5ub3QgYmUgbGVzcyB0aGFuIDAlIG9yIGhpZ2hlciB0aGFuIDEwJQMJAGYCCQCQAwEJALUJAgUCYU4CASwABQkAAgECCzUgdGFncyBtYXguAgABAmFRAQJhUgMJAAACCQCQAwEIBQJhUghwYXltZW50cwAACQACAQITTm8gcGF5bWVudCBhdHRhY2hlZAQCYVMJAQV2YWx1ZQEJAJEDAggFAmFSCHBheW1lbnRzAAAEAmFUCQEFdmFsdWUBCAUCYVMGYW1vdW50CQCUCgIFAmFTBQJhVAECYVUBAmFSBAJhVgkBAmFRAQUCYVIEAmFTCAUCYVYCXzEEAmFUCAUCYVYCXzIEAmFXAwMJAQlpc0RlZmluZWQBCAUCYVMHYXNzZXRJZAkAAAIIBQJhUwdhc3NldElkBQFpBwgFAmFTB2Fzc2V0SWQJAAIBAitPbmx5IFNJR04gdG9rZW4gYWNjZXB0ZWQgYXMgdHJhbnNhY3Rpb24gZmVlAwkBAiE9AgUCYVQFAUIJAAIBCQCsAgICGVBheW1lbnQgYW1vdW50IHNob3VsZCBiZSAJAKQDAQUBQgkAlAoCBQJhVAUCYVcBAmFYAgJhWQFQBAFHCQCaCAIFBHRoaXMJAQFYAgUCYVkFAVADCQABAgUBRwIDSW50BAJhWgUBRwMJAQIhPQIFAmFaAAAGBwcBAmJhAwJhUgJiYgJiYwQCYmQJAQJhUQEFAmFSBAJhUwgFAmJkAl8xBAJhVAgFAmJkAl8yBAJhVwMJAQEhAQkBCWlzRGVmaW5lZAEIBQJhUwdhc3NldElkBQR1bml0AwMJAGYCCQCxAgEFAmJiAAAJAAACCQDYBAEJAQV2YWx1ZQEIBQJhUwdhc3NldElkBQJiYgcIBQJhUwdhc3NldElkCQACAQIOV3JvbmcgYXNzZXQgaWQDAwkAAAIFAmFXBQR1bml0CQECIT0CBQJiYgIABwkAAgECDldyb25nIGFzc2V0IGlkAwkBAiE9AgUCYmMFAmFUCQACAQITUGF5bWVudCBkb24ndCBtYXRjaAkAlAoCBQJhVAUCYVcBAmJlAQJhVwMDAwMDCQECIT0CBQJhVwkA2AQBBQFpCQECIT0CBQJhVwkA2AQBBQFsBwkBAiE9AgUCYVcCBVdBVkVTBwkBAiE9AgUCYVcJANgEAQUBagcJAQIhPQIFAmFXCQDYBAEFAWsHCQACAQImT25seSBTSUdOLCBVU0ROLFVTRFQgb3IgV0FWRVMgYWNjZXB0ZWQGAQJiZgICYVcCYmcEAmJoAwUBYwAKCQEBbgECDndhdmVzX21pbl9zZWxsBAJiaQDAhD0EAmJqAwUBYwABCQBoAgUBQgACAwMDAwMDCQAAAgUCYVcJANgEAQUBagkAZgIFAmJpBQJiZwcJAQIhPQIFAmJnAAAHBgMDCQAAAgUCYVcJANgEAQUBawkAZgIFAmJpBQJiZwcJAQIhPQIFAmJnAAAHBgMDCQAAAgUCYVcJANgEAQUBaQkAZgIFAmJqBQJiZwcJAQIhPQIFAmJnAAAHBgMDAwkAAAIFAmFXCQDYBAEFAWwGCQAAAgUCYVcCBVdBVkVTCQBmAgUCYmgFAmJnBwkBAiE9AgUCYmcAAAcJAAIBAhhXcm9uZyBtaW5pbXVtIHNlbGwgcHJpY2UGAQJiawECYVcDCQAAAgUCYVcCBVdBVkVTBQR1bml0CQDZBAEFAmFXAQJibAECYm0EAmJuCQEBYQEJAKwCAgUCYm0CBV9PUEVOAwkAAAIFAmJuAgAJAAIBAg1CaWQgbm90IGZvdW5kBAJibwkAtQkCBQJibgIBXwQCYnAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJibwABBAJicQkBAmJrAQkAkQMCBQJibwAAAwkAZwIAAAUCYnAJAAIBAgxXcm9uZyBhbW91bnQJAJQKAgUCYnAFAmJxAQJicgICYVICYnMDCQEBIQEFAXYJAAIBBQF3BAJidAMJAQIhPQIFAmJzAgAJAQt2YWx1ZU9yRWxzZQIJAQFwAQkArAICCQClCAEJAKcIAQkA2QQBBQJicwIJX2ZyZWVfdHhzAAAAAAQBTgMDCQAAAgkA2AQBCAgFAmFSBmNhbGxlcgVieXRlcwkApQgBBQR0aGlzCQBmAgUCYnQAAAcJAKUIAQkApwgBCQDZBAEFAmJzCQDYBAEICAUCYVIGY2FsbGVyBWJ5dGVzBAJidQMDCQECIT0CBQJicwIACQBmAgUCYnQAAAcJAPwHBAUBaAIJdXNlRnJlZVR4CQDMCAIJAKUIAQkApwgBCQDZBAEFAmJzBQNuaWwFA25pbAUEdW5pdAMJAAACBQJidQUCYnUDBgkAAgEFAU4JAJYKBAkA2AQBCAUCYVINdHJhbnNhY3Rpb25JZAUBTggFCWxhc3RCbG9jawl0aW1lc3RhbXAJAGYCBQJidAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJidgECYVIDCQEBIQEFAXYJAAIBBQF3CQCVCgMJANgEAQgFAmFSDXRyYW5zYWN0aW9uSWQJANgEAQgIBQJhUgZjYWxsZXIFYnl0ZXMIBQlsYXN0QmxvY2sJdGltZXN0YW1wAQJidwYCYVIBUAJieAJieQJiegJicwQCYkEJAQJicgIFAmFSBQJicwQCYkIIBQJiQQJfMQQBTggFAmJBAl8yBAJiQwgFAmJBAl8zBAJidAgFAmJBAl80AwYJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQFOAgMgLyAFAmJ4AgMgLyAFAmJ6AgMgLyAFAmJzBAJiRAMDAwkAAAIFAU4FAmJ4CQECIT0CBQJiegIABwkBAiE9AgUCYnkCAAcGBwQCYkUJAQFvAQkBAmFoAgUBTgUBUAMDAwkBAiE9AgUCYkUAAAkAZwIFBmhlaWdodAUCYkUHCQEBIQEFAmJEBwkAAgECC1NhbGUgZW5kZWQuBAJiRgkAAAIFAU4FAmJ4BAJiRwkBAW8BAhB0b3RhbF9uZnRfaXNzdWVkBAFECQEBYQEJAQFXAgUCYngFAVAEAmJICQEBYQEJAQFRAgUCYngFAVADCQAAAgUCYkgCAAkAAgECEUFydCBkb2Vzbid0IGV4aXN0BAJiSQkBAXEBCQEBWQIFAmJ4BQFQBAJiSgkBAW8BCQEBWAIFAmJ4BQFQBAJiYwMFAmJGCQBoAgUBQgACCQEBbwEJAQJhZwIFAmJ4BQFQBAJiYgMFAmJGCQDYBAEFAWkJAQFhAQkBAmFpAgUCYngFAVAEAmJLCQEBbwEJAQFWAgUCYngFAVADAwMJAQEhAQUCYkQJAQEhAQUCYkYHAwMJAGcCAAAFAmJjBgkBASEBBQJiSQYJAGcCAAAFAmJLBwkAAgECEEFydCBub3QgZm9yIHNhbGUDAwMJAQEhAQUCYkQFAmJGBwkAZwIAAAUCYksHCQACAQIUTWF4IGlzc3VhYmxlIG5vdCBzZXQEAmFQCQECYUYBBQJieAMDBQJiRAkBAiE9AgUCYVACAAcJAAIBBQJhUAQCYm0JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUBUAIBXwUCYngCAV8FAmJ6AgFfBQJieQQCYkwDBQJiRAkBAmJsAQUCYm0JAQJiYQMFAmFSBQJiYgUCYmMEAmFUCAUCYkwCXzEEAmFXCAUCYkwCXzIEAmJNCQELdmFsdWVPckVsc2UCCQCdCAIFAWcJAQJhawEFAmJ4BQFmBAJiTgkBC3ZhbHVlT3JFbHNlAgkAmggCBQFnCQECYW0BBQJieAAABAJiTwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQFnCQECYW4BBQJieAUBZgQCYlAJAQt2YWx1ZU9yRWxzZQIJAJoIAgUBZwkBAmFvAQUCYngAAAQCYlEJAQFwAQUCYngEAmJSAwkAZgIFAmJRBQZoZWlnaHQAAAMJAAACBQJhVwUBaQUBcgUBcwQCYlMJAGsDBQJhVAUCYlIAZAQCYlQDAwMJAQIhPQIFAmJNBQFmCQBmAgUCYk4AAAcJAGYCBQZoZWlnaHQFAmJRBwkAawMFAmFUBQJiTgCQTgAABAJiVQMDAwkBAiE9AgUCYk8FAWYJAGYCBQJiUAAABwkAZgIFBmhlaWdodAUCYlEHCQBrAwUCYVQFAmJQAJBOAAAEAmJWCQBlAgUCYVQFAmJTAwkAAAIFAmJKBQJiSwkAAgECDEFydCBzb2xkIG91dAQCYlcJAGQCBQJiSgABBAJiWAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCUNyZWF0b3I6IAUCYngCCiwKIEFydElEOiAFAVACCywKIFNpZ25JRDogBQFEAhEsCiBBcnR3b3JrIG5hbWU6IAUCYkgCCiwKIElzc3VlOiAJAKQDAQUCYlcCAS8JAKQDAQUCYksEAmJZCQDCCAUJAKwCAgIDU0FfCQCkAwEJAGQCBQJiRwABBQJiWAABAAAHBAJiWgkAuAgBBQJiWQQCY2EDAwkAAAIFAmJXBQJiSwYJAQEhAQUCYkkHBgQCY2IDAwMJAAACBQFOBQJieAkBAiE9AgUCYnoCAAcJAQIhPQIFAmJ5AgAHCQERQGV4dHJOYXRpdmUoMTA2MikBBQJieggFAmFSBmNhbGxlcgQCY2MDCQEBIQEJAQlpc0RlZmluZWQBBQJhVwIFV0FWRVMJANgEAQkBBXZhbHVlAQUCYVcEAmJuCQEBYQEJAKwCAgUCYm0CBV9PUEVOBAJjZAkBC0RlbGV0ZUVudHJ5AQkArAICBQJibQIFX09QRU4EAmNlCQELU3RyaW5nRW50cnkCCQCsAgIFAmJtAgdfQ0xPU0VECQCsAgIJAKwCAgUCYm4CAV8JAKQDAQUCYkMEAmNmCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCWFydF9zb2xkXwkApAMBBQJiVwIEX29mXwkApAMBBQJiSwIBXwUBUAIBXwUCYngEAmNnAwkBASEBBQJiRAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQFOAgFfCQCkAwEFAmJDAgFfBQJiQgIBXwkApAMBBQJiYwIBXwUCYmICAV8JANgEAQUCYloJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBBQJjYgIBXwkApAMBBQJiQwIBXwUCYkICAV8JAKQDAQUCYVQCAV8FAmNjAgFfCQDYBAEFAmJaBAJjaAkBC1N0cmluZ0VudHJ5AgUCY2YFAmNnBAJjaQMJAQIhPQIFAmJUAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAWYJAGUCBQJiUwUCYlQFAmFXCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQJiTQUCYlQFAmFXBQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAWYFAmJTBQJhVwUDbmlsBAJjagMJAQIhPQIFAmJVAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAmJPBQJiVQUCYVcJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAmJ4CQBlAgUCYlYFAmJVBQJhVwUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQJieAUCYlYFAmFXBQNuaWwEAmNrAwUCYnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAU4AAAUEdW5pdAUDbmlsBQNuaWwEAmNsCQDOCAIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBWAIFAmJ4BQFQBQJiVwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgICBG5mdF8JANgEAQUCYloFAmNmCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhB0b3RhbF9uZnRfaXNzdWVkCQBkAgUCYkcAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFoAgUCYngFAVAAAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAVkCBQJieAUBUAUCY2EJAMwIAgUCYlkJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCY2IAAQUCYloFA25pbAUCY2kFAmNqBQJjawMFAmJECQDMCAIFAmNoCQDMCAIFAmNlCQDMCAIFAmNkBQJjbAkAzAgCBQJjaAUCY2wBAmNtAQJjbgQBRwUCY24DCQABAgUBRwIGU3RyaW5nBAJjbwUBRwUCY28JAAIBAiRTcG9uc29yZWQgUHVibGljIEtleSBTdHJpbmcgZXhwZWN0ZWQKAmNwAQdzZXRDb25mAgFiAmNxBAFOCQClCAEIBQJjcAZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQFtCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQFOAwkBCGNvbnRhaW5zAgUBYgIFY29uZl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUBYgUCY3EFA25pbAkAAgECIEVudHJpZXMgc3RhcnRpbmcgd2l0aCBjb25mXyBvbmx5CQACAQIiWW91IGFyZSBub3QgYWxsb3dlZCB0byBjaGFuZ2UgdGhpcwJhUgEKYWRkQXJ0d29yaw4BRgFEAmFMAmFNAmFOAmNyAmF3AmFBAmF4AmFCAmF5AmNzAmFPAmJzBAJjdAkBAmJyAgUCYVIFAmJzBAFQCAUCY3QCXzEEAU4IBQJjdAJfMgQCYkMIBQJjdAJfMwQCYnQIBQJjdAJfNAMJAQEhAQkBAUsBBQFGCQACAQIkSGFzaCBzaG91bGQgYmUgNjQgY2hhcmFjdGVycyBtYXhpbXVtBAJjdQkBAmFIAgUCYXkFAmFCBAJhSggFAmN1Al8xBAJhSwgFAmN1Al8yBAJjdgkBAmFJCgUBTgUCYXcFAmF4BQJhSgUCYUEFAmFLBQJhTAUCYU0FAmFOBQJhTwMJAQIhPQIFAmN2AgAJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEEAmN3CQBmAgkBAXABCQCsAgIFAU4CC19mcmVlX2Ryb3BzAAAEAmN4AwUCY3cJAJQKAgAABQFECQECYVUBBQJhUgQCYVQIBQJjeAJfMQQCYVcIBQJjeAJfMgMJAQEhAQkBCWlzRGVmaW5lZAEFAmFUCQACAQIUU29tZXRoaW5nIHdlbnQgd3JvbmcEAmN5CQEBYQEJAQJhdQIFAUYFAU4DCQECIT0CBQJjeQIACQACAQIUWW91IGFscmVhZHkgYWRkZWQgaXQEAmN6CQEBYQEJAQJhcgEFAUYDCQECIT0CBQJjegIACQACAQIXSGFzaCBhbHJlYWR5IHJlZ2lzdGVyZWQEAmNBCQEBQwMFAUQFAU4FAUYDCQEBIQEFAmNBCQACAQIsU2lnbiBDZXJ0aWZpY2F0ZSBub3QgZm91bmQgZm9yIHRoaXMgYWRkcmVzcy4EAmNCAwUCY3cJAPwHBAUBaAILdXNlRnJlZURyb3AJAMwIAgUBTgUDbmlsBQNuaWwFBHVuaXQDCQAAAgUCY0IFAmNCBAJjawMFAmJ0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQFOAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFyAQUBRgUBTgkAzAgCCQELU3RyaW5nRW50cnkCCQECYXUCBQFGBQFOBQFQCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBTwIFAU4FAVAFAmJDCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFRAgUBTgUBUAUCYUwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVICBQFOBQFQBQJhTQkAzAgCCQELU3RyaW5nRW50cnkCCQEBUwIFAU4FAVAFAmF3CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFVAgUBTgUBUAUCYXgJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVQCBQFOBQFQBQJhQQkAzAgCCQELU3RyaW5nRW50cnkCCQEBWgIFAU4FAVAFAmFLCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYQIFAU4FAVAFAmFKCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYwIFAU4FAVAFAmNyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYgIFAU4FAVAFAmFOCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVgIFAU4FAVAAAAkAzAgCCQELU3RyaW5nRW50cnkCCQEBVwIFAU4FAVAFAUQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFYAgUBTgUBUAAACQDMCAIJAQxCb29sZWFuRW50cnkCCQEBWQIFAU4FAVAHCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhcwIFAU4FAUQFAVAJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFwAgUBTgUBUAUBRgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWUCBQFOBQFQBQJjcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFmAgUBTgUBUAUCYU8JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAWYFAmFUBQFpBQNuaWwFAmNrCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFSAQ11cGRhdGVBcnR3b3JrDQJhcQJhTAJhTQJhTgJjcgJhdwJhQQJheAJhQgJheQJjcwJhTwJicwMJAQEhAQUBdgkAAgEFAXcEAmNDCQECYnICBQJhUgUCYnMEAmJCCAUCY0MCXzEEAU4IBQJjQwJfMgQCYkMIBQJjQwJfMwQCYnQIBQJjQwJfNAQCY0QJAQJhSAIFAmF5BQJhQgQCYUoIBQJjRAJfMQQCYUsIBQJjRAJfMgQCY3YJAQJhSQoFAU4FAmF3BQJheAUCYUoFAmFBBQJhSwUCYUwFAmFNBQJhTgUCYU8DCQECIT0CBQJjdgIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAJjeQkBAWEBCQEBUQIFAU4FAmFxAwkAAAIFAmN5AgAJAAIBAg9FbnRyeSBub3QgZm91bmQEAmNFCQEBYQEJAQJhagIFAU4FAmFxAwkAAAIFAmNFAgdJTExFR0FMCQACAQIdQ2Fubm90IHVwZGF0ZSBJTExFR0FMIGFydHdvcmsDCQEBIQEJAQJhWAIFAU4FAmFxBAJjawMFAmJ0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQFOAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVECBQFOBQJhcQUCYUwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVICBQFOBQJhcQUCYU0JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVMCBQFOBQJhcQUCYXcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVUCBQFOBQJhcQUCYXgJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVQCBQFOBQJhcQUCYUEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFhAgUBTgUCYXEFAmFKCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFaAgUBTgUCYXEFAmFLCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYgIFAU4FAmFxBQJhTgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWMCBQFOBQJhcQUCY3IJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFlAgUBTgUCYXEFAmNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWYCBQFOBQJhcQUCYU8FA25pbAUCY2sJAAIBAg5BbHJlYWR5IG1pbnRlZAJhUgELZmxhZ0FydHdvcmsEAVACY0YCY0UCY0cEAmNICQECYnYBBQJhUgQCYkIIBQJjSAJfMQQBTggFAmNIAl8yAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUBbQkAzAgCCQClCAEFBHRoaXMFA25pbAUBTgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAICB0NPTlNFTlQJAMwIAgIACQDMCAICD0NIQU5HRV9SRVFVSVJFRAkAzAgCAgdGTEFHR0VECQDMCAICB0lMTEVHQUwFA25pbAUCY0UJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFqAgUCY0YFAVAFAmNFCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhZAIFAmNGBQFQBQJjRwUDbmlsCQACAQkArAICAg5Vbmtub3cgc3RhdHVzIAUCY0UJAAIBAhNZb3UgYXJlIG5vdCBhbGxvd2VkAmFSAQ1kZWxldGVBcnR3b3JrAgFQAmNGBAJjSQkBAmJ2AQUCYVIEAmJCCAUCY0kCXzEEAU4IBQJjSQJfMgQCYVkDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQFtCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQFOBQJjRgUBTgQCY3kJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBAWEBCQEBUQIFAmFZBQFQAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwMJAAACBQJjeQIACQACAQIgTm8gYXJ0IG1hdGNoaW5nIGZvciB0aGlzIGFkZHJlc3MEAUYJAQFhAQkBAmFwAgUCYVkFAVADCQAAAgUBRgIACQACAQIlTm8gYXJ0IGhhc2ggbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwQBRAkBAWEBCQEBVwIFAmFZBQFQAwkAAAIFAUQCAAkAAgECE05vIFNJR04gSUQgbWF0Y2hpbmcEAmNKCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFPAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVECBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBUgIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFTAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVUCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBVAIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFaAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFhAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFjAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFiAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVYCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBVwIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFYAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVkCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWoCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWcCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWkCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYXIBBQFGCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhcwIFAmFZBQFECQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhdQIFAUYFAmFZCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhaAIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhZAIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhZQIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhZgIFAmFZBQFQBQNuaWwDCQEBIQEJAQJhWAIFAmFZBQFQAwkBASEBBQF2CQACAQUBdwUCY0oDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQFtCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQFOBQJjSgkAAgECKEFydCBhbHJlYWR5IG1pbnRlZCwgeW91IGNhbm5vdCBkZWxldGUgaXQCYVIBC3NlbGxBcnR3b3JrBgFQAmJnAmNLAmFXAmJFAmJzBAJjTAkBAmJyAgUCYVIFAmJzBAJiQggFAmNMAl8xBAFOCAUCY0wCXzIEAmJDCAUCY0wCXzMEAmJ0CAUCY0wCXzQEAmJICQEBYQEJAQFRAgUBTgUBUAMJAAACBQJiSAIACQACAQIjVGhpcyBhcnQgZG9lc24ndCBtYXRjaCB5b3VyIGFjY291bnQEAmNFCQEBYQEJAQJhagIFAU4FAVADCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAg9DSEFOR0VfUkVRVUlSRUQJAMwIAgIHRkxBR0dFRAkAzAgCAgdJTExFR0FMBQNuaWwFAmNFCQACAQIPRmxhZ2dlZCBhcnR3b3JrBAJjTQkBAW8BCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUBUAMJAGYCAAAFAmJFCQACAQIMTmVnYXRpdmUgZW5kAwMJAGYCBQJiRQAAAwkBAiE9AgUCY0sAAQYJAQIhPQIFAmJnAAAHCQACAQI6VGltZWQgb2ZmZXIgb25seSBhbGxvd2VkIGZvciB1bmlxdWUgZWRpdGlvbiBhbmQgb2ZmZXIgb25seQQCY04DCQAAAgUCYkUAAAAABQZoZWlnaHQDCQEBIQEJAQJiZQEFAmFXCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchAwkBASEBCQECYmYCBQJhVwUCYmcJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEEAmFQCQECYUYBBQFOAwkBAiE9AgUCYVACAAkAAgEFAmFQBAJiSgkBAW8BCQEBWAIFAU4FAVAEAmJLCQEBbwEJAQFWAgUBTgUBUAMJAGYCBQJjSwBkCQACAQIcMTAwIGVkaXRpb25zIG1heCBwZXIgYXJ0d29yawMDCQECIT0CBQJiSgAACQAAAgUCYkoFAmJLBwkAAgECFE1heCBlZGl0aW9uIHJlYWNoZWQuAwMJAGYCBQJiSgAACQECIT0CBQJiSwUCY0sHCQACAQImQ2Fubm90IGNoYW5nZSBtYXhpbXVtIGlzc3VhYmxlIGFueW1vcmUDAwkAZgIFAmNNAAAJAQIhPQIFAmJLBQJjSwcJAAIBAjFDYW5ub3QgY2hhbmdlIG1heGltdW0gaXNzdWFibGUgd2l0aCBhY3RpdmUgb3JkZXJzBAJjYQMDCQBmAgUCYmcAAAkAZgIFAmNLAAAHBgcEAmNrAwUCYnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAU4AAAUEdW5pdAUDbmlsBQNuaWwJAM4IAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAVkCBQFOBQFQBQJjYQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFnAgUBTgUBUAUCYmcJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFWAgUBTgUBUAUCY0sJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFpAgUBTgUBUAUCYVcJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhaAIFAU4FAVAJAGQCBQJjTgUCYkUFA25pbAUCY2sCYVIBCmJ1eUFydHdvcmsCAVACYngJAQJidwYFAmFSBQFQBQJieAIAAgACAAJhUgEGc2V0QmlkAgFQAmJ4BAJjTwkBAmJ2AQUCYVIEAmJCCAUCY08CXzEEAU4IBQJjTwJfMgQCYkMIBQJjTwJfMwQCY1AJAQJhUQEFAmFSBAJhUwgFAmNQAl8xBAJhVAgFAmNQAl8yBAJhVwMJAQEhAQkBCWlzRGVmaW5lZAEIBQJhUwdhc3NldElkAgVXQVZFUwkA2AQBCQEFdmFsdWUBCAUCYVMHYXNzZXRJZAQCYkUJAQFvAQkBAmFoAgUCYngFAVADAwkBAiE9AgUCYkUAAAkAZwIFBmhlaWdodAUCYkUHCQACAQILU2FsZSBlbmRlZC4EAmNNCQEBbwEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQFQAwkBASEBCQECYmUBBQJhVwkAAgECEmFzc2V0IG5vdCBhY2NlcHRlZAMJAQEhAQkBAmJmAgUCYVcFAmFUCQACAQIOV3JvbmcgbWluIHNlbGwEAmJKCQEBbwEJAQFYAgUCYngFAVAEAmJLCQEBbwEJAQFWAgUCYngFAVADCQBnAgAABQJiSwkAAgECI05vIG1heCBlZGl0aW9uIHNldCBmb3IgdGhpcyBhcnR3b3JrAwkAZwIFAmJKBQJiSwkAAgECGFNvbGQgb3V0LCB5b3UgY2Fubm90IGJpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUBUAIBXwUCYngCAV8FAU4CAV8FAmJCAgVfT1BFTgkArAICCQCsAgIJAKwCAgkArAICBQJhVwIBXwkApAMBBQJhVAIBXwkApAMBBQJiQwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FAVAJAGQCBQJjTQABBQNuaWwCYVIBCWFjY2VwdEJpZAUBUAJieAJieQJiegJicwQCY1EJAQJicgIFAmFSBQJicwQCYkIIBQJjUQJfMQQBTggFAmNRAl8yBAJiQwgFAmNRAl8zBAJidAgFAmNRAl80AwkBAiE9AgUBTgUCYngJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uCQECYncGBQJhUgUBUAUCYngFAmJ5BQJiegUCYnMCYVIBCWNhbmNlbEJpZAQBUAJieAJieQJiegQCY1IJAQJidgEFAmFSBAJiQggFAmNSAl8xBAFOCAUCY1ICXzIEAmJDCAUCY1ICXzMDAwkBAiE9AgUBTgUCYnoJAQIhPQIFAU4FAmJ4BwkAAgECGVlvdSBjYW5ub3QgZG8gdGhpcyBhY3Rpb24EAmNTAwkAAAIFAU4FAmJ4BQJiegUBTgQCY00JAQFvAQkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FAVAEAmJtCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FAVACAV8FAmJ4AgFfBQJiegIBXwUCYnkEAmJuCQEBYQEJAKwCAgUCYm0CBV9PUEVOAwkAAAIFAmJuAgAJAAIBAg1CaWQgbm90IGZvdW5kBAJibwkAtQkCBQJibgIBXwQCYVcJAQJiawEJAJEDAgUCYm8AAAQCY1QCCENBTkNFTEVECQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUCYm0CBV9PUEVOCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICBQJibQIBXwUCY1QJAKwCAgkArAICBQJibgIBXwkApAMBBQJiQwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FAVAJAGUCBQJjTQABCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQJjUwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJvAAEFAmFXBQNuaWwBAmNVAQJjVgAEAUcFAmNVAwkAAQIFAUcCF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBAJjVwUBRwMDAwMJAAACCAUCY1cIZnVuY3Rpb24CCmFkZEFydHdvcmsJAAACCAUCY1cEZEFwcAUEdGhpcwcJAAACCAUCY1cDZmVlAKDCHgcJAAACCAUCY1cKZmVlQXNzZXRJZAUEdW5pdAcJAPQDAwgFAmNVCWJvZHlCeXRlcwkAkQMCCAUCY1UGcHJvb2ZzAAAJANkEAQkBAmNtAQkAkQMCCAUCY1cEYXJncwANAwMDAwkAAAIIBQJjVwhmdW5jdGlvbgINdXBkYXRlQXJ0d29yawkAAAIIBQJjVwRkQXBwBQR0aGlzBwkAAAIIBQJjVwNmZWUAoMIeBwkAAAIIBQJjVwpmZWVBc3NldElkBQR1bml0BwkA9AMDCAUCY1UJYm9keUJ5dGVzCQCRAwIIBQJjVQZwcm9vZnMAAAkA2QQBCQECY20BCQCRAwIIBQJjVwRhcmdzAAwDAwMDCQAAAggFAmNXCGZ1bmN0aW9uAgtzZWxsQXJ0d29yawkAAAIIBQJjVwRkQXBwBQR0aGlzBwkAAAIIBQJjVwNmZWUAoMIeBwkAAAIIBQJjVwpmZWVBc3NldElkBQR1bml0BwkA9AMDCAUCY1UJYm9keUJ5dGVzCQCRAwIIBQJjVQZwcm9vZnMAAAkA2QQBCQECY20BCQCRAwIIBQJjVwRhcmdzAAUDAwMDCQAAAggFAmNXCGZ1bmN0aW9uAglhY2NlcHRCaWQJAAACCAUCY1cEZEFwcAUEdGhpcwcJAAACCAUCY1cDZmVlAKDCHgcJAAACCAUCY1cKZmVlQXNzZXRJZAUEdW5pdAcJAMgTAwgFAmNVCWJvZHlCeXRlcwkAkQMCCAUCY1UGcHJvb2ZzAAAJANkEAQkBAmNtAQkAkQMCCAUCY1cEYXJncwAECQD0AwMIBQJjVQlib2R5Qnl0ZXMJAJEDAggFAmNVBnByb29mcwAACAUCY1UPc2VuZGVyUHVibGljS2V5CQD0AwMIBQJjVQlib2R5Qnl0ZXMJAJEDAggFAmNVBnByb29mcwAACAUCY1UPc2VuZGVyUHVibGljS2V5gFuQWA==", "height": 2503549, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GRoWPzbPfPtAv4EVySGGbTznMAXdN8DyewHScH8XYq5q Next: EHxU475ATs1h4vS3zrgBNuypCZtPUEn243Hne1irszuo Diff:
OldNewDifferences
380380 let isSponsored = if ((pubKey != ""))
381381 then valueOrElse(checkWhitelist((toString(addressFromPublicKey(fromBase58String(pubKey))) + "_free_txs")), 0)
382382 else 0
383- if (true)
384- then throw(((((((toBase58String(i.caller.bytes) + " / ") + toString(this)) + " / ") + toString(isSponsored)) + " / ") + toString(addressFromPublicKey(fromBase58String(pubKey)))))
385- else {
386- let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
387- then (isSponsored > 0)
388- else false)
389- then toString(addressFromPublicKey(fromBase58String(pubKey)))
390- else toBase58String(i.caller.bytes)
391- let get_sponsored_waves = if (if ((pubKey != ""))
392- then (isSponsored > 0)
393- else false)
394- then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
395- else unit
396- if ((get_sponsored_waves == get_sponsored_waves))
397- then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
398- else throw("Strict value is not equal to itself.")
399- }
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 if (true)
395+ then throw(caller)
396+ else $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
397+ else throw("Strict value is not equal to itself.")
400398 }
401399
402400
406404
407405
408406 func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
409- let $t01322013309 = idCallerDateSponsored(i, pubKey)
410- let id = $t01322013309._1
411- let caller = $t01322013309._2
412- let date = $t01322013309._3
413- let isSponsored = $t01322013309._4
407+ let $t01308113170 = idCallerDateSponsored(i, pubKey)
408+ let id = $t01308113170._1
409+ let caller = $t01308113170._2
410+ let date = $t01308113170._3
411+ let isSponsored = $t01308113170._4
414412 if (true)
415413 then throw(((((((caller + " / ") + issuer) + " / ") + bidOwner) + " / ") + pubKey))
416414 else {
469467 then throw(checkUser)
470468 else {
471469 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
472- let $t01491215104 = if (isBid)
470+ let $t01477314965 = if (isBid)
473471 then getPriceAssetIdFromBid(bidDataKey)
474472 else validatePriceAssetId(i, priceAssetId, artworkPrice)
475- let amount = $t01491215104._1
476- let assetId = $t01491215104._2
473+ let amount = $t01477314965._1
474+ let assetId = $t01477314965._2
477475 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
478476 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
479477 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
578576
579577 @Callable(i)
580578 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
581- let $t02028020353 = idCallerDateSponsored(i, pubKey)
582- let artId = $t02028020353._1
583- let caller = $t02028020353._2
584- let date = $t02028020353._3
585- let isSponsored = $t02028020353._4
579+ let $t02014120214 = idCallerDateSponsored(i, pubKey)
580+ let artId = $t02014120214._1
581+ let caller = $t02014120214._2
582+ let date = $t02014120214._3
583+ let isSponsored = $t02014120214._4
586584 if (!(validateHash(sha256Hash)))
587585 then throw("Hash should be 64 characters maximum")
588586 else {
589- let $t02045420523 = setLIcence(cidLicence, sha256Licence)
590- let licenceCID = $t02045420523._1
591- let licenceHash = $t02045420523._2
587+ let $t02031520384 = setLIcence(cidLicence, sha256Licence)
588+ let licenceCID = $t02031520384._1
589+ let licenceHash = $t02031520384._2
592590 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
593591 if ((validateArtwork != ""))
594592 then throw("Something went wrong!")
595593 else {
596594 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
597- let $t02082220906 = if (whitelisted_drop)
595+ let $t02068320767 = if (whitelisted_drop)
598596 then $Tuple2(0, signID)
599597 else validatePayment(i)
600- let amount = $t02082220906._1
601- let assetId = $t02082220906._2
598+ let amount = $t02068320767._1
599+ let assetId = $t02068320767._2
602600 if (!(isDefined(amount)))
603601 then throw("Something went wrong")
604602 else {
639637 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
640638 then throw(maintenanceMSG)
641639 else {
642- let $t02394024010 = idCallerDateSponsored(i, pubKey)
643- let id = $t02394024010._1
644- let caller = $t02394024010._2
645- let date = $t02394024010._3
646- let isSponsored = $t02394024010._4
647- let $t02402024089 = setLIcence(cidLicence, sha256Licence)
648- let licenceCID = $t02402024089._1
649- let licenceHash = $t02402024089._2
640+ let $t02380123871 = idCallerDateSponsored(i, pubKey)
641+ let id = $t02380123871._1
642+ let caller = $t02380123871._2
643+ let date = $t02380123871._3
644+ let isSponsored = $t02380123871._4
645+ let $t02388123950 = setLIcence(cidLicence, sha256Licence)
646+ let licenceCID = $t02388123950._1
647+ let licenceHash = $t02388123950._2
650648 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
651649 if ((validateArtwork != ""))
652650 then throw("Something went wrong!")
674672
675673 @Callable(i)
676674 func flagArtwork (artId,addr,flag,note) = {
677- let $t02571625750 = idCallerDate(i)
678- let id = $t02571625750._1
679- let caller = $t02571625750._2
675+ let $t02557725611 = idCallerDate(i)
676+ let id = $t02557725611._1
677+ let caller = $t02557725611._2
680678 if (containsElement([chris, toString(this)], caller))
681679 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
682680 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
688686
689687 @Callable(i)
690688 func deleteArtwork (artId,addr) = {
691- let $t02618626220 = idCallerDate(i)
692- let id = $t02618626220._1
693- let caller = $t02618626220._2
689+ let $t02604726081 = idCallerDate(i)
690+ let id = $t02604726081._1
691+ let caller = $t02604726081._2
694692 let addrToUse = if (containsElement([chris, toString(this)], caller))
695693 then addr
696694 else caller
723721
724722 @Callable(i)
725723 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
726- let $t02905629126 = idCallerDateSponsored(i, pubKey)
727- let id = $t02905629126._1
728- let caller = $t02905629126._2
729- let date = $t02905629126._3
730- let isSponsored = $t02905629126._4
724+ let $t02891728987 = idCallerDateSponsored(i, pubKey)
725+ let id = $t02891728987._1
726+ let caller = $t02891728987._2
727+ let date = $t02891728987._3
728+ let isSponsored = $t02891728987._4
731729 let artworkName = getStringByKey(keyName(caller, artId))
732730 if ((artworkName == ""))
733731 then throw("This art doesn't match your account")
801799
802800 @Callable(i)
803801 func setBid (artId,issuer) = {
804- let $t03150831548 = idCallerDate(i)
805- let id = $t03150831548._1
806- let caller = $t03150831548._2
807- let date = $t03150831548._3
808- let $t03155331589 = isPayment(i)
809- let payment = $t03155331589._1
810- let amount = $t03155331589._2
802+ let $t03136931409 = idCallerDate(i)
803+ let id = $t03136931409._1
804+ let caller = $t03136931409._2
805+ let date = $t03136931409._3
806+ let $t03141431450 = isPayment(i)
807+ let payment = $t03141431450._1
808+ let amount = $t03141431450._2
811809 let assetId = if (!(isDefined(payment.assetId)))
812810 then "WAVES"
813811 else toBase58String(value(payment.assetId))
838836
839837 @Callable(i)
840838 func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = {
841- let $t03280932879 = idCallerDateSponsored(i, pubKey)
842- let id = $t03280932879._1
843- let caller = $t03280932879._2
844- let date = $t03280932879._3
845- let isSponsored = $t03280932879._4
839+ let $t03267032740 = idCallerDateSponsored(i, pubKey)
840+ let id = $t03267032740._1
841+ let caller = $t03267032740._2
842+ let date = $t03267032740._3
843+ let isSponsored = $t03267032740._4
846844 if ((caller != issuer))
847845 then throw("You cannot do this action")
848846 else buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
852850
853851 @Callable(i)
854852 func cancelBid (artId,issuer,bidId,bidOwner) = {
855- let $t03311333174 = idCallerDate(i)
856- let id = $t03311333174._1
857- let caller = $t03311333174._2
858- let date = $t03311333174._3
853+ let $t03297433035 = idCallerDate(i)
854+ let id = $t03297433035._1
855+ let caller = $t03297433035._2
856+ let date = $t03297433035._3
859857 if (if ((caller != bidOwner))
860858 then (caller != issuer)
861859 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 (true)
384- then throw(((((((toBase58String(i.caller.bytes) + " / ") + toString(this)) + " / ") + toString(isSponsored)) + " / ") + toString(addressFromPublicKey(fromBase58String(pubKey)))))
385- else {
386- let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
387- then (isSponsored > 0)
388- else false)
389- then toString(addressFromPublicKey(fromBase58String(pubKey)))
390- else toBase58String(i.caller.bytes)
391- let get_sponsored_waves = if (if ((pubKey != ""))
392- then (isSponsored > 0)
393- else false)
394- then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
395- else unit
396- if ((get_sponsored_waves == get_sponsored_waves))
397- then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
398- else throw("Strict value is not equal to itself.")
399- }
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 if (true)
395+ then throw(caller)
396+ else $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
397+ else throw("Strict value is not equal to itself.")
400398 }
401399
402400
403401 func idCallerDate (i) = if (!(dappRunning))
404402 then throw(maintenanceMSG)
405403 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
406404
407405
408406 func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
409- let $t01322013309 = idCallerDateSponsored(i, pubKey)
410- let id = $t01322013309._1
411- let caller = $t01322013309._2
412- let date = $t01322013309._3
413- let isSponsored = $t01322013309._4
407+ let $t01308113170 = idCallerDateSponsored(i, pubKey)
408+ let id = $t01308113170._1
409+ let caller = $t01308113170._2
410+ let date = $t01308113170._3
411+ let isSponsored = $t01308113170._4
414412 if (true)
415413 then throw(((((((caller + " / ") + issuer) + " / ") + bidOwner) + " / ") + pubKey))
416414 else {
417415 let isBid = if (if (if ((caller == issuer))
418416 then (bidOwner != "")
419417 else false)
420418 then (bidId != "")
421419 else false)
422420 then true
423421 else false
424422 let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
425423 if (if (if ((blockEnd != 0))
426424 then (height >= blockEnd)
427425 else false)
428426 then !(isBid)
429427 else false)
430428 then throw("Sale ended.")
431429 else {
432430 let callerIsIssuer = (caller == issuer)
433431 let totalNFT = getIntegerByKey("total_nft_issued")
434432 let signID = getStringByKey(keySignID(issuer, artId))
435433 let artworkName = getStringByKey(keyName(issuer, artId))
436434 if ((artworkName == ""))
437435 then throw("Art doesn't exist")
438436 else {
439437 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
440438 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
441439 let artworkPrice = if (callerIsIssuer)
442440 then (currentCertificationPrice * 2)
443441 else getIntegerByKey(keyPrice(issuer, artId))
444442 let priceAssetId = if (callerIsIssuer)
445443 then toBase58String(signAssetId)
446444 else getStringByKey(keyAssetIdAccepted(issuer, artId))
447445 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
448446 if (if (if (!(isBid))
449447 then !(callerIsIssuer)
450448 else false)
451449 then if (if ((0 >= artworkPrice))
452450 then true
453451 else !(isOnSale))
454452 then true
455453 else (0 >= maxCanSell)
456454 else false)
457455 then throw("Art not for sale")
458456 else if (if (if (!(isBid))
459457 then callerIsIssuer
460458 else false)
461459 then (0 >= maxCanSell)
462460 else false)
463461 then throw("Max issuable not set")
464462 else {
465463 let checkUser = validateUser(issuer)
466464 if (if (isBid)
467465 then (checkUser != "")
468466 else false)
469467 then throw(checkUser)
470468 else {
471469 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
472- let $t01491215104 = if (isBid)
470+ let $t01477314965 = if (isBid)
473471 then getPriceAssetIdFromBid(bidDataKey)
474472 else validatePriceAssetId(i, priceAssetId, artworkPrice)
475- let amount = $t01491215104._1
476- let assetId = $t01491215104._2
473+ let amount = $t01477314965._1
474+ let assetId = $t01477314965._2
477475 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
478476 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
479477 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
480478 let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
481479 let isWhitelisted = checkWhitelist(issuer)
482480 let cut = if ((isWhitelisted > height))
483481 then 0
484482 else if ((assetId == signAssetId))
485483 then signCut
486484 else usdnWaveCut
487485 let amountForSign = fraction(amount, cut, 100)
488486 let amountForAgent = if (if (if ((agent != feeReceiver))
489487 then (agentShare > 0)
490488 else false)
491489 then (height > isWhitelisted)
492490 else false)
493491 then fraction(amount, agentShare, 10000)
494492 else 0
495493 let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
496494 then (publicAgentShare > 0)
497495 else false)
498496 then (height > isWhitelisted)
499497 else false)
500498 then fraction(amount, publicAgentShare, 10000)
501499 else 0
502500 let amountForCreator = (amount - amountForSign)
503501 if ((amountSold == maxCanSell))
504502 then throw("Art sold out")
505503 else {
506504 let newAmountSold = (amountSold + 1)
507505 let issueMeta = ((((((((((("Creator: " + issuer) + ",
508506 ArtID: ") + artId) + ",
509507 SignID: ") + signID) + ",
510508 Artwork name: ") + artworkName) + ",
511509 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
512510 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
513511 let idNFT = calculateAssetId(issueNFT)
514512 let sellStatus = if (if ((newAmountSold == maxCanSell))
515513 then true
516514 else !(isOnSale))
517515 then false
518516 else true
519517 let receiveNFT = if (if (if ((caller == issuer))
520518 then (bidOwner != "")
521519 else false)
522520 then (bidId != "")
523521 else false)
524522 then addressFromStringValue(bidOwner)
525523 else i.caller
526524 let assetIdBid = if (!(isDefined(assetId)))
527525 then "WAVES"
528526 else toBase58String(value(assetId))
529527 let bidData = getStringByKey((bidDataKey + "_OPEN"))
530528 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
531529 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
532530 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
533531 let soldValue = if (!(isBid))
534532 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
535533 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
536534 let soldData = StringEntry(soldKey, soldValue)
537535 let commissionsWithAgent = if ((amountForAgent != 0))
538536 then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
539537 else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
540538 let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
541539 then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
542540 else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
543541 let txToCaller = if (isSponsored)
544542 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
545543 else nil
546544 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)
547545 if (isBid)
548546 then [soldData, bidUpdate, bidDelOld] :: buyRes
549547 else soldData :: buyRes
550548 }
551549 }
552550 }
553551 }
554552 }
555553 }
556554 }
557555
558556
559557 func asString (bv) = match bv {
560558 case bv0: String =>
561559 bv0
562560 case _ =>
563561 throw("Sponsored Public Key String expected")
564562 }
565563
566564
567565 @Callable(invoke)
568566 func setConf (key,val) = {
569567 let caller = toString(invoke.caller)
570568 if (containsElement([chris, toString(this)], caller))
571569 then if (contains(key, "conf_"))
572570 then [StringEntry(key, val)]
573571 else throw("Entries starting with conf_ only")
574572 else throw("You are not allowed to change this")
575573 }
576574
577575
578576
579577 @Callable(i)
580578 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
581- let $t02028020353 = idCallerDateSponsored(i, pubKey)
582- let artId = $t02028020353._1
583- let caller = $t02028020353._2
584- let date = $t02028020353._3
585- let isSponsored = $t02028020353._4
579+ let $t02014120214 = idCallerDateSponsored(i, pubKey)
580+ let artId = $t02014120214._1
581+ let caller = $t02014120214._2
582+ let date = $t02014120214._3
583+ let isSponsored = $t02014120214._4
586584 if (!(validateHash(sha256Hash)))
587585 then throw("Hash should be 64 characters maximum")
588586 else {
589- let $t02045420523 = setLIcence(cidLicence, sha256Licence)
590- let licenceCID = $t02045420523._1
591- let licenceHash = $t02045420523._2
587+ let $t02031520384 = setLIcence(cidLicence, sha256Licence)
588+ let licenceCID = $t02031520384._1
589+ let licenceHash = $t02031520384._2
592590 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
593591 if ((validateArtwork != ""))
594592 then throw("Something went wrong!")
595593 else {
596594 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
597- let $t02082220906 = if (whitelisted_drop)
595+ let $t02068320767 = if (whitelisted_drop)
598596 then $Tuple2(0, signID)
599597 else validatePayment(i)
600- let amount = $t02082220906._1
601- let assetId = $t02082220906._2
598+ let amount = $t02068320767._1
599+ let assetId = $t02068320767._2
602600 if (!(isDefined(amount)))
603601 then throw("Something went wrong")
604602 else {
605603 let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
606604 if ((entryExist != ""))
607605 then throw("You already added it")
608606 else {
609607 let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
610608 if ((hashExist != ""))
611609 then throw("Hash already registered")
612610 else {
613611 let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
614612 if (!(isSignCertified))
615613 then throw("Sign Certificate not found for this address.")
616614 else {
617615 let decrease_whitelist_drop = if (whitelisted_drop)
618616 then invoke(whitelistDapp, "useFreeDrop", [caller], nil)
619617 else unit
620618 if ((decrease_whitelist_drop == decrease_whitelist_drop))
621619 then {
622620 let txToCaller = if (isSponsored)
623621 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
624622 else nil
625623 ([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)
626624 }
627625 else throw("Strict value is not equal to itself.")
628626 }
629627 }
630628 }
631629 }
632630 }
633631 }
634632 }
635633
636634
637635
638636 @Callable(i)
639637 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
640638 then throw(maintenanceMSG)
641639 else {
642- let $t02394024010 = idCallerDateSponsored(i, pubKey)
643- let id = $t02394024010._1
644- let caller = $t02394024010._2
645- let date = $t02394024010._3
646- let isSponsored = $t02394024010._4
647- let $t02402024089 = setLIcence(cidLicence, sha256Licence)
648- let licenceCID = $t02402024089._1
649- let licenceHash = $t02402024089._2
640+ let $t02380123871 = idCallerDateSponsored(i, pubKey)
641+ let id = $t02380123871._1
642+ let caller = $t02380123871._2
643+ let date = $t02380123871._3
644+ let isSponsored = $t02380123871._4
645+ let $t02388123950 = setLIcence(cidLicence, sha256Licence)
646+ let licenceCID = $t02388123950._1
647+ let licenceHash = $t02388123950._2
650648 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
651649 if ((validateArtwork != ""))
652650 then throw("Something went wrong!")
653651 else {
654652 let entryExist = getStringByKey(keyName(caller, txid))
655653 if ((entryExist == ""))
656654 then throw("Entry not found")
657655 else {
658656 let flag = getStringByKey(keyFlag(caller, txid))
659657 if ((flag == "ILLEGAL"))
660658 then throw("Cannot update ILLEGAL artwork")
661659 else if (!(isArtMinted(caller, txid)))
662660 then {
663661 let txToCaller = if (isSponsored)
664662 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
665663 else nil
666664 ([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)
667665 }
668666 else throw("Already minted")
669667 }
670668 }
671669 }
672670
673671
674672
675673 @Callable(i)
676674 func flagArtwork (artId,addr,flag,note) = {
677- let $t02571625750 = idCallerDate(i)
678- let id = $t02571625750._1
679- let caller = $t02571625750._2
675+ let $t02557725611 = idCallerDate(i)
676+ let id = $t02557725611._1
677+ let caller = $t02557725611._2
680678 if (containsElement([chris, toString(this)], caller))
681679 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
682680 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
683681 else throw(("Unknow status " + flag))
684682 else throw("You are not allowed")
685683 }
686684
687685
688686
689687 @Callable(i)
690688 func deleteArtwork (artId,addr) = {
691- let $t02618626220 = idCallerDate(i)
692- let id = $t02618626220._1
693- let caller = $t02618626220._2
689+ let $t02604726081 = idCallerDate(i)
690+ let id = $t02604726081._1
691+ let caller = $t02604726081._2
694692 let addrToUse = if (containsElement([chris, toString(this)], caller))
695693 then addr
696694 else caller
697695 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
698696 if ((entryExist == ""))
699697 then throw("No art matching for this address")
700698 else {
701699 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
702700 if ((sha256Hash == ""))
703701 then throw("No art hash matching for this address")
704702 else {
705703 let signID = getStringByKey(keySignID(addrToUse, artId))
706704 if ((signID == ""))
707705 then throw("No SIGN ID matching")
708706 else {
709707 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))]
710708 if (!(isArtMinted(addrToUse, artId)))
711709 then if (!(dappRunning))
712710 then throw(maintenanceMSG)
713711 else dataToDelete
714712 else if (containsElement([chris, toString(this)], caller))
715713 then dataToDelete
716714 else throw("Art already minted, you cannot delete it")
717715 }
718716 }
719717 }
720718 }
721719
722720
723721
724722 @Callable(i)
725723 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
726- let $t02905629126 = idCallerDateSponsored(i, pubKey)
727- let id = $t02905629126._1
728- let caller = $t02905629126._2
729- let date = $t02905629126._3
730- let isSponsored = $t02905629126._4
724+ let $t02891728987 = idCallerDateSponsored(i, pubKey)
725+ let id = $t02891728987._1
726+ let caller = $t02891728987._2
727+ let date = $t02891728987._3
728+ let isSponsored = $t02891728987._4
731729 let artworkName = getStringByKey(keyName(caller, artId))
732730 if ((artworkName == ""))
733731 then throw("This art doesn't match your account")
734732 else {
735733 let flag = getStringByKey(keyFlag(caller, artId))
736734 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
737735 then throw("Flagged artwork")
738736 else {
739737 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
740738 if ((0 > blockEnd))
741739 then throw("Negative end")
742740 else if (if ((blockEnd > 0))
743741 then if ((maxMint != 1))
744742 then true
745743 else (price != 0)
746744 else false)
747745 then throw("Timed offer only allowed for unique edition and offer only")
748746 else {
749747 let baseHeight = if ((blockEnd == 0))
750748 then 0
751749 else height
752750 if (!(acceptedAssetIds(assetId)))
753751 then throw("Something went wrong!")
754752 else if (!(validateMinSell(assetId, price)))
755753 then throw("Something went wrong!")
756754 else {
757755 let checkUser = validateUser(caller)
758756 if ((checkUser != ""))
759757 then throw(checkUser)
760758 else {
761759 let amountSold = getIntegerByKey(keyIssued(caller, artId))
762760 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
763761 if ((maxMint > 100))
764762 then throw("100 editions max per artwork")
765763 else if (if ((amountSold != 0))
766764 then (amountSold == maxCanSell)
767765 else false)
768766 then throw("Max edition reached.")
769767 else if (if ((amountSold > 0))
770768 then (maxCanSell != maxMint)
771769 else false)
772770 then throw("Cannot change maximum issuable anymore")
773771 else if (if ((bidNbr > 0))
774772 then (maxCanSell != maxMint)
775773 else false)
776774 then throw("Cannot change maximum issuable with active orders")
777775 else {
778776 let sellStatus = if (if ((price > 0))
779777 then (maxMint > 0)
780778 else false)
781779 then true
782780 else false
783781 let txToCaller = if (isSponsored)
784782 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
785783 else nil
786784 ([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)
787785 }
788786 }
789787 }
790788 }
791789 }
792790 }
793791 }
794792
795793
796794
797795 @Callable(i)
798796 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", "")
799797
800798
801799
802800 @Callable(i)
803801 func setBid (artId,issuer) = {
804- let $t03150831548 = idCallerDate(i)
805- let id = $t03150831548._1
806- let caller = $t03150831548._2
807- let date = $t03150831548._3
808- let $t03155331589 = isPayment(i)
809- let payment = $t03155331589._1
810- let amount = $t03155331589._2
802+ let $t03136931409 = idCallerDate(i)
803+ let id = $t03136931409._1
804+ let caller = $t03136931409._2
805+ let date = $t03136931409._3
806+ let $t03141431450 = isPayment(i)
807+ let payment = $t03141431450._1
808+ let amount = $t03141431450._2
811809 let assetId = if (!(isDefined(payment.assetId)))
812810 then "WAVES"
813811 else toBase58String(value(payment.assetId))
814812 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
815813 if (if ((blockEnd != 0))
816814 then (height >= blockEnd)
817815 else false)
818816 then throw("Sale ended.")
819817 else {
820818 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
821819 if (!(acceptedAssetIds(assetId)))
822820 then throw("asset not accepted")
823821 else if (!(validateMinSell(assetId, amount)))
824822 then throw("Wrong min sell")
825823 else {
826824 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
827825 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
828826 if ((0 >= maxCanSell))
829827 then throw("No max edition set for this artwork")
830828 else if ((amountSold >= maxCanSell))
831829 then throw("Sold out, you cannot bid")
832830 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
833831 }
834832 }
835833 }
836834
837835
838836
839837 @Callable(i)
840838 func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = {
841- let $t03280932879 = idCallerDateSponsored(i, pubKey)
842- let id = $t03280932879._1
843- let caller = $t03280932879._2
844- let date = $t03280932879._3
845- let isSponsored = $t03280932879._4
839+ let $t03267032740 = idCallerDateSponsored(i, pubKey)
840+ let id = $t03267032740._1
841+ let caller = $t03267032740._2
842+ let date = $t03267032740._3
843+ let isSponsored = $t03267032740._4
846844 if ((caller != issuer))
847845 then throw("You cannot do this action")
848846 else buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
849847 }
850848
851849
852850
853851 @Callable(i)
854852 func cancelBid (artId,issuer,bidId,bidOwner) = {
855- let $t03311333174 = idCallerDate(i)
856- let id = $t03311333174._1
857- let caller = $t03311333174._2
858- let date = $t03311333174._3
853+ let $t03297433035 = idCallerDate(i)
854+ let id = $t03297433035._1
855+ let caller = $t03297433035._2
856+ let date = $t03297433035._3
859857 if (if ((caller != bidOwner))
860858 then (caller != issuer)
861859 else false)
862860 then throw("You cannot do this action")
863861 else {
864862 let returnMoneyTo = if ((caller == issuer))
865863 then bidOwner
866864 else caller
867865 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
868866 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
869867 let bidData = getStringByKey((bidDataKey + "_OPEN"))
870868 if ((bidData == ""))
871869 then throw("Bid not found")
872870 else {
873871 let bidDataArr = split(bidData, "_")
874872 let assetId = getBidAssetId(bidDataArr[0])
875873 let bidStatus = "CANCELED"
876874 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
877875 }
878876 }
879877 }
880878
881879
882880 @Verifier(tx)
883881 func verifier () = match tx {
884882 case inv: InvokeScriptTransaction =>
885883 if (if (if (if ((inv.function == "addArtwork"))
886884 then (inv.dApp == this)
887885 else false)
888886 then (inv.fee == 500000)
889887 else false)
890888 then (inv.feeAssetId == unit)
891889 else false)
892890 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[13])))
893891 else if (if (if (if ((inv.function == "updateArtwork"))
894892 then (inv.dApp == this)
895893 else false)
896894 then (inv.fee == 500000)
897895 else false)
898896 then (inv.feeAssetId == unit)
899897 else false)
900898 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
901899 else if (if (if (if ((inv.function == "sellArtwork"))
902900 then (inv.dApp == this)
903901 else false)
904902 then (inv.fee == 500000)
905903 else false)
906904 then (inv.feeAssetId == unit)
907905 else false)
908906 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
909907 else if (if (if (if ((inv.function == "acceptBid"))
910908 then (inv.dApp == this)
911909 else false)
912910 then (inv.fee == 500000)
913911 else false)
914912 then (inv.feeAssetId == unit)
915913 else false)
916914 then sigVerify_128Kb(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[4])))
917915 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
918916 case _ =>
919917 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
920918 }
921919

github/deemru/w8io/c3f4982 
109.49 ms