tx · BW71ipLmS71GkHjYi2zbxNroaXp21YwkfoaGfZeM7gUG

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.01900000 Waves

2023.03.24 06:07 [2503526] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "BW71ipLmS71GkHjYi2zbxNroaXp21YwkfoaGfZeM7gUG", "fee": 1900000, "feeAssetId": null, "timestamp": 1679627293341, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "3qWWzrwY7ZGPceAtVp9etiX2M1Wpz484VUTx36Xmh4hzzNq4ENbfNmubvUddFGG7hNxZ1VQrMohB2MGp18QM698j" ], "script": "base64:BgL1FAgCEgQKAggIEhAKDggICAgICAgICAgICAEIEg8KDQgICAgICAgICAgIAQgSBgoECAgICBIECgIICBIICgYIAQEIAQgSBAoCCAgSBAoCCAgSBwoFCAgICAgSBgoECAgICCIOZ2V0U3RyaW5nQnlLZXkiA2tleSIIdW5pdFRlc3QiCW9yYWNsZUZlZSIIc2lnbkRhcHAiC2ZlZVJlY2VpdmVyIgh1c2VyRGFwcCINd2hpdGVsaXN0RGFwcCILc2lnbkFzc2V0SWQiC3VzZG5Bc3NldElkIgt1c2R0QXNzZXRJZCIMd2F2ZXNBc3NldElkIgVjaHJpcyIZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZSIPZ2V0SW50ZWdlckJ5S2V5Ig5jaGVja1doaXRlbGlzdCIPZ2V0Qm9vbGVhbkJ5S2V5IgdzaWduQ3V0Igt1c2RuV2F2ZUN1dCIOZGVmYXVsdExpY2VuY2UiEmRlZmF1bHRIYXNoTGljZW5jZSILZGFwcFJ1bm5pbmciDm1haW50ZW5hbmNlTVNHIg11c2VyU3VzcGVuZGVkIgt1c2VyUmVtb3ZlZCIQdXNlclVucmVnaXN0ZXJlZCILdXNlckFsbG93ZWQiGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UiFGNoZWNrU2lnbkNlcnRpZmljYXRlIgZzaWduSUQiBU93bmVyIgpzaGEyNTZIYXNoIgckbWF0Y2gwIgFhIgt2YWxpZGF0ZUNJRCIDY2lkIgx2YWxpZGF0ZUhhc2giBGhhc2giDWtleVVzZXJTdGF0dXMiBmNhbGxlciIHa2V5RGF0ZSIFYXJ0SWQiB2tleU5hbWUiB2tleURlc2MiDWtleURpc3BsYXlDaWQiDWtleUV4cG9ydEhhc2giDGtleUV4cG9ydENpZCIKa2V5TWF4TWludCIJa2V5U2lnbklEIglrZXlJc3N1ZWQiCWtleU9uU2FsZSIOa2V5TGljZW5jZUhhc2giDWtleUxpY2VuY2VDaWQiB2tleVRhZ3MiB2tleVR5cGUiB2tleU5vdGUiCmtleUNyYXdsZXIiDGtleVJveWFsdGllcyIIa2V5UHJpY2UiCmtleUVuZFNhbGUiEmtleUFzc2V0SWRBY2NlcHRlZCIHa2V5RmxhZyISa2V5QXJ0aXN0QWdlbnRBZGRyIgphcnRpc3RBZGRyIhRrZXlQcmltYXJ5U2hhcmVBZ2VudCIYa2V5QXJ0aXN0UHVibGljQWdlbnRBZGRyIhprZXlQcmltYXJ5U2hhcmVQdWJsaWNBZ2VudCIRa2V5SGFzaEJ5VHhpZEFkZHIiBHR4aWQiDmtleU93bmVyQnlIYXNoIg1rZXlpZEJ5U2lnbmlkIgZzaWduSWQiEmtleVR4aWRCeUhhc2hPd25lciIOdmFsaWRhdGVBbGxDSUQiCmNpZERpc3BsYXkiCWNpZEV4cG9ydCIKY2lkTGljZW5jZSIPdmFsaWRhdGVBbGxIYXNoIgxzaGEyNTZFeHBvcnQiDXNoYTI1NkxpY2VuY2UiDnZhbGlkYXRlU3RyaW5nIgNzdHIiA21heCIMdmFsaWRhdGVVc2VyIgp1c2VyU3RhdHVzIgpzZXRMSWNlbmNlIhN2YWxpZGF0ZUFydHdvcmtEYXRhIgpsaWNlbmNlQ0lEIgtsaWNlbmNlSGFzaCIEbmFtZSILZGVzY3JpcHRpb24iBHRhZ3MiCXJveWFsdGllcyIJY2hlY2tVc2VyIglpc1BheW1lbnQiAWkiB3BheW1lbnQiBmFtb3VudCIPdmFsaWRhdGVQYXltZW50IgskdDA5MTgwOTIxNiIHYXNzZXRJZCILaXNBcnRNaW50ZWQiCWFkZHJUb1VzZSIBYiIUdmFsaWRhdGVQcmljZUFzc2V0SWQiDHByaWNlQXNzZXRJZCIMYXJ0d29ya1ByaWNlIgskdDA5ODA0OTg0MCIQYWNjZXB0ZWRBc3NldElkcyIPdmFsaWRhdGVNaW5TZWxsIgVwcmljZSIMbWluU2VsbFdhdmVzIgttaW5TZWxsVXNkbiILbWluU2VsbFNpZ24iDWdldEJpZEFzc2V0SWQiFmdldFByaWNlQXNzZXRJZEZyb21CaWQiCmJpZERhdGFLZXkiB2JpZERhdGEiCmJpZERhdGFBcnIiCWJpZEFtb3VudCIKYmlkQXNzZXRJZCIVaWRDYWxsZXJEYXRlU3BvbnNvcmVkIgZwdWJLZXkiC2lzU3BvbnNvcmVkIhNnZXRfc3BvbnNvcmVkX3dhdmVzIgxpZENhbGxlckRhdGUiB2J1eU1pbnQiBmlzc3VlciIFYmlkSWQiCGJpZE93bmVyIg0kdDAxMzAzOTEzMTI4IgJpZCIEZGF0ZSIFaXNCaWQiCGJsb2NrRW5kIg5jYWxsZXJJc0lzc3VlciIIdG90YWxORlQiC2FydHdvcmtOYW1lIghpc09uU2FsZSIKYW1vdW50U29sZCIKbWF4Q2FuU2VsbCINJHQwMTQ2NDcxNDgzOSIFYWdlbnQiCmFnZW50U2hhcmUiC3B1YmxpY0FnZW50IhBwdWJsaWNBZ2VudFNoYXJlIg1pc1doaXRlbGlzdGVkIgNjdXQiDWFtb3VudEZvclNpZ24iDmFtb3VudEZvckFnZW50IhRhbW91bnRGb3JQdWJsaWNBZ2VudCIQYW1vdW50Rm9yQ3JlYXRvciINbmV3QW1vdW50U29sZCIJaXNzdWVNZXRhIghpc3N1ZU5GVCIFaWRORlQiCnNlbGxTdGF0dXMiCnJlY2VpdmVORlQiCmFzc2V0SWRCaWQiCWJpZERlbE9sZCIJYmlkVXBkYXRlIgdzb2xkS2V5Iglzb2xkVmFsdWUiCHNvbGREYXRhIhRjb21taXNzaW9uc1dpdGhBZ2VudCIaY29tbWlzc2lvbnNXaXRoUHVibGljQWdlbnQiCnR4VG9DYWxsZXIiBmJ1eVJlcyIIYXNTdHJpbmciAmJ2IgNidjAiBmludm9rZSIDdmFsIgR0eXBlIgdjcmF3bGVyIg0kdDAyMDAxNTIwMDg4Ig0kdDAyMDE4OTIwMjU4Ig92YWxpZGF0ZUFydHdvcmsiEHdoaXRlbGlzdGVkX2Ryb3AiDSR0MDIwNTU3MjA2NDEiCmVudHJ5RXhpc3QiCWhhc2hFeGlzdCIPaXNTaWduQ2VydGlmaWVkIhdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcCINJHQwMjM2NzUyMzc0NSINJHQwMjM3NTUyMzgyNCIEZmxhZyIEYWRkciIEbm90ZSINJHQwMjU0NTEyNTQ4NSINJHQwMjU5MjEyNTk1NSIMZGF0YVRvRGVsZXRlIgdtYXhNaW50Ig0kdDAyODc5MTI4ODYxIgZiaWROYnIiCmJhc2VIZWlnaHQiDSR0MDMxMjQzMzEyODMiDSR0MDMxMjg4MzEzMjQiDSR0MDMyNTQ0MzI2MTQiDSR0MDMyODQ4MzI5MDkiDXJldHVybk1vbmV5VG8iCWJpZFN0YXR1cyICdHgiCHZlcmlmaWVyIgNpbnZOAQFhAQFiCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFAWICAAABYwcAAWQJAQV2YWx1ZQEJAKYIAQkBAWEBAg9jb25mX29yYWNsZV9mZWUAAWUJAQV2YWx1ZQEJAKYIAQkBAWEBAhFjb25mX3NpZ253ZWJfZGFwcAABZgkBAWEBAhFjb25mX2ZlZV9yZWNlaXZlcgABZwMFAWMJAQV2YWx1ZQEJAKYIAQIjM010NFJHTUV5alNXWUFvY1RQcWQ1NXdkSFFRQjNQVTJVQ20JAQV2YWx1ZQEJAKYIAQkBAWEBAg9jb25mX3VzZXJzX2RhcHAAAWgJAQV2YWx1ZQEJAKYIAQkBAWEBAhNjb25mX3doaXRlbGlzdF9kYXBwAAFpCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9TSUdOAAFqCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9VU0ROAAFrCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9VU0RUAAFsAQAAAW0JAQFhAQIMY29uZl9hZG1pbl8xAQFuAQFiCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUBZAUBYgIfSW50ZWdlciB1bmRlZmluZSBvciAwIGluIG9yYWNsZQEBbwEBYgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFiAAABAXABAWIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUBaAUBYgAAAQFxAQFiCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFAWIHAAFyAAcAAXMACgABdAkBAWEBAhRjb25mX2RlZmF1bHRfbGljZW5jZQABdQkBAWEBAhljb25mX2RlZmF1bHRfbGljZW5jZV9oYXNoAAF2CQELdmFsdWVPckVsc2UCCQCbCAIFAWcCFGNvbmZfZGFwcF9pc19ydW5uaW5nBgABdwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQFnAhRjb25mX21haW50ZW5hbmNlX21zZwIAAAF4AglTVVNQRU5ERUQAAXkCB1JFTU9WRUQAAXoCDFVOUkVHSVNURVJFRAABQQIHQUxMT1dFRAABQgkBAW4BCQCsAgICEmNlcnRpZmljYXRpb25fZmVlXwkA2AQBBQFpAQFDAwFEAUUBRgQBRwkAnQgCBQFlCQCsAgIJAKwCAgkArAICAghkYXRhX2ZjXwUBRAIBXwUBRQMJAAECBQFHAgZTdHJpbmcEAUgFAUcDCQEIY29udGFpbnMCBQFIBQFGBgcHAQFJAQFKAwkBCGNvbnRhaW5zAgUBSgIBLwMDCQBmAgBMCQCxAgEFAUoJAAACCQCxAgEJAJEDAgkAtQkCBQFKAgEvAAAAOwcJAGYCABAJALECAQkAkQMCCQC1CQIFAUoCAS8AAQcHAQFLAQFMCQAAAgkAsQIBBQFMAEABAU0BAU4JAKwCAgIMdXNlcl9zdGF0dXNfBQFOAQFPAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF9kYXRlXwUBUAIBXwUBTgEBUQIBTgFQCQCsAgIJAKwCAgkArAICAglhcnRfbmFtZV8FAVACAV8FAU4BAVICAU4BUAkArAICCQCsAgIJAKwCAgIJYXJ0X2Rlc2NfBQFQAgFfBQFOAQFTAgFOAVAJAKwCAgkArAICCQCsAgICEGFydF9kaXNwbGF5X2NpZF8FAVACAV8FAU4BAVQCAU4BUAkArAICCQCsAgIJAKwCAgIQYXJ0X2V4cG9ydF9oYXNoXwUBUAIBXwUBTgEBVQIBTgFQCQCsAgIJAKwCAgkArAICAg9hcnRfZXhwb3J0X2NpZF8FAVACAV8FAU4BAVYCAU4BUAkArAICCQCsAgIJAKwCAgIMYXJ0X21heG1pbnRfBQFQAgFfBQFOAQFXAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9zaWduaWRfBQFQAgFfBQFOAQFYAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9pc3N1ZWRfBQFQAgFfBQFOAQFZAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9vbnNhbGVfBQFQAgFfBQFOAQFaAgFOAVAJAKwCAgkArAICCQCsAgICEWFydF9saWNlbmNlX2hhc2hfBQFQAgFfBQFOAQJhYQIBTgFQCQCsAgIJAKwCAgkArAICAhBhcnRfbGljZW5jZV9jaWRfBQFQAgFfBQFOAQJhYgIBTgFQCQCsAgIJAKwCAgkArAICAglhcnRfdGFnc18FAVACAV8FAU4BAmFjAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF90eXBlXwUBUAIBXwUBTgECYWQCAU4BUAkArAICCQCsAgIJAKwCAgIJYXJ0X25vdGVfBQFQAgFfBQFOAQJhZQIBTgFQCQCsAgIJAKwCAgkArAICAhBhcnRfY3Jhd2xlcl9jaWRfBQFQAgFfBQFOAQJhZgIBTgFQCQCsAgIJAKwCAgkArAICAg5hcnRfcm95YWx0aWVzXwUBUAIBXwUBTgECYWcCAU4BUAkArAICCQCsAgIJAKwCAgIKYXJ0X3ByaWNlXwUBUAIBXwUBTgECYWgCAU4BUAkArAICCQCsAgIJAKwCAgIMYXJ0X2VuZHNhbGVfBQFQAgFfBQFOAQJhaQIBTgFQCQCsAgIJAKwCAgkArAICAhJhcnRfYXNzZXRBY2NlcHRlZF8FAVACAV8FAU4BAmFqAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF9mbGFnXwUBUAIBXwUBTgECYWsBAmFsCQCsAgICDWFydGlzdF9hZ2VudF8FAmFsAQJhbQECYWwJAKwCAgIVYXJ0aXN0X2FnZW50X3ByaW1hcnlfBQJhbAECYW4BAmFsCQCsAgICFGFydGlzdF9wdWJsaWNfYWdlbnRfBQJhbAECYW8BAmFsCQCsAgICHGFydGlzdF9wdWJsaWNfYWdlbnRfcHJpbWFyeV8FAmFsAQJhcAIBTgJhcQkArAICCQCsAgIJAKwCAgITZ2V0X2hhc2hieXR4aWRhZGRyXwUCYXECAV8FAU4BAmFyAQFGCQCsAgICEmdldF9vd25lcl9ieV9oYXNoXwUBRgECYXMCAU4CYXQJAKwCAgkArAICCQCsAgICEmdldF9hcnRpZGJ5c2lnbmlkXwUCYXQCAV8FAU4BAmF1AgFGAU4JAKwCAgIXZ2V0X3R4aWRfYnlfaGFzaF9vd25lcl8JANgEAQkA1BYBCQCbAwEJAKwCAgUBRgUBTgECYXYDAmF3AmF4AmF5AwkBASEBCQEBSQEFAmF3CQACAQIRV3JvbmcgRGlzcGxheSBDSUQDCQEBIQEJAQFJAQUCYXgJAAIBAhBXcm9uZyBFeHBvcnQgQ0lEAwMJAQIhPQIFAmF5AgAJAQEhAQkBAUkBBQJheQcJAAIBAhFXcm9uZyBMaWNlbmNlIENJRAYBAmF6AgJhQQJhQgMJAQEhAQkBAUsBBQJhQQkAAgECGEV4cG9ydCBIYXNoIDY0IGNoYXIuIG1heAMJAQEhAQkBAUsBBQJhQgkAAgECGUxpY2VuY2UgSGFzaCA2NCBjaGFyLiBtYXgGAQJhQwICYUQCYUUDCQAAAgkAsQIBBQJhRAAACQACAQIYRmllbGQgY2Fubm90IGJlIGlzIGVtcHR5AwkAZgIJALECAQUCYUQFAmFFCQACAQkArAICBQJhRAIMIGlzIHRvbyBsb25nBgECYUYBAU4EAmFHCQELdmFsdWVPckVsc2UCCQCdCAIFAWcJAQFNAQUBTgUBegMDCQAAAgUCYUcFAXoGCQAAAgUCYUcFAUECLlJlZ2lzdGVyIHRoaXMgYWNjb3VudCBmaXJzdCB3aXRoICJBY2NvdW50IiB0YWIDCQAAAgUCYUcFAXgCEUFjY291bnQgc3VzcGVuZGVkAwkAAAIFAmFHBQF5Ag9BY2NvdW50IHJlbW92ZWQCAAECYUgCAmF5AmFCBAFKAwkAAAIJALECAQUCYXkAAAUBdAUCYXkEAUwDCQAAAgkAsQIBBQJhQgAABQF1BQJhQgkAlAoCBQFKBQFMAQJhSQoBTgJhdwJheAJhSgJhQQJhSwJhTAJhTQJhTgJhTwQCYVAJAQJhRgEFAU4DCQECIT0CBQJhUAIACQACAQUCYVADCQAAAgkAsQIBBQJhdwAACQACAQIbRGlzcGxheSBDSUQgY2Fubm90IGJlIGVtcHR5AwkBASEBCQECYXYDBQJhdwUCYXgFAmFKCQACAQIQUHJvYmxlbSB3aXRoIENJRAMJAQEhAQkBAmF6AgUCYUEFAmFLCQACAQITUHJvYmxlbSB3aXRoIEhhc2hlcwMJAQEhAQkBAmFDAgUCYUwAZAkAAgECEjEwMCBDaGFyLiBtYXggbmFtZQMJAQEhAQkBAmFDAgUCYU0A6AcJAAIBAhoxMDAwIENoYXIuIG1heCBkZXNjcmlwdGlvbgMDCQBmAgAABQJhTwYJAGYCBQJhTwDoBwkAAgECM1JveWFsdGllcyBjYW5ub3QgYmUgbGVzcyB0aGFuIDAlIG9yIGhpZ2hlciB0aGFuIDEwJQMJAGYCCQCQAwEJALUJAgUCYU4CASwABQkAAgECCzUgdGFncyBtYXguAgABAmFRAQJhUgMJAAACCQCQAwEIBQJhUghwYXltZW50cwAACQACAQITTm8gcGF5bWVudCBhdHRhY2hlZAQCYVMJAQV2YWx1ZQEJAJEDAggFAmFSCHBheW1lbnRzAAAEAmFUCQEFdmFsdWUBCAUCYVMGYW1vdW50CQCUCgIFAmFTBQJhVAECYVUBAmFSBAJhVgkBAmFRAQUCYVIEAmFTCAUCYVYCXzEEAmFUCAUCYVYCXzIEAmFXAwMJAQlpc0RlZmluZWQBCAUCYVMHYXNzZXRJZAkAAAIIBQJhUwdhc3NldElkBQFpBwgFAmFTB2Fzc2V0SWQJAAIBAitPbmx5IFNJR04gdG9rZW4gYWNjZXB0ZWQgYXMgdHJhbnNhY3Rpb24gZmVlAwkBAiE9AgUCYVQFAUIJAAIBCQCsAgICGVBheW1lbnQgYW1vdW50IHNob3VsZCBiZSAJAKQDAQUBQgkAlAoCBQJhVAUCYVcBAmFYAgJhWQFQBAFHCQCaCAIFBHRoaXMJAQFYAgUCYVkFAVADCQABAgUBRwIDSW50BAJhWgUBRwMJAQIhPQIFAmFaAAAGBwcBAmJhAwJhUgJiYgJiYwQCYmQJAQJhUQEFAmFSBAJhUwgFAmJkAl8xBAJhVAgFAmJkAl8yBAJhVwMJAQEhAQkBCWlzRGVmaW5lZAEIBQJhUwdhc3NldElkBQR1bml0AwMJAGYCCQCxAgEFAmJiAAAJAAACCQDYBAEJAQV2YWx1ZQEIBQJhUwdhc3NldElkBQJiYgcIBQJhUwdhc3NldElkCQACAQIOV3JvbmcgYXNzZXQgaWQDAwkAAAIFAmFXBQR1bml0CQECIT0CBQJiYgIABwkAAgECDldyb25nIGFzc2V0IGlkAwkBAiE9AgUCYmMFAmFUCQACAQITUGF5bWVudCBkb24ndCBtYXRjaAkAlAoCBQJhVAUCYVcBAmJlAQJhVwMDAwMDCQECIT0CBQJhVwkA2AQBBQFpCQECIT0CBQJhVwkA2AQBBQFsBwkBAiE9AgUCYVcCBVdBVkVTBwkBAiE9AgUCYVcJANgEAQUBagcJAQIhPQIFAmFXCQDYBAEFAWsHCQACAQImT25seSBTSUdOLCBVU0ROLFVTRFQgb3IgV0FWRVMgYWNjZXB0ZWQGAQJiZgICYVcCYmcEAmJoAwUBYwAKCQEBbgECDndhdmVzX21pbl9zZWxsBAJiaQDAhD0EAmJqAwUBYwABCQBoAgUBQgACAwMDAwMDCQAAAgUCYVcJANgEAQUBagkAZgIFAmJpBQJiZwcJAQIhPQIFAmJnAAAHBgMDCQAAAgUCYVcJANgEAQUBawkAZgIFAmJpBQJiZwcJAQIhPQIFAmJnAAAHBgMDCQAAAgUCYVcJANgEAQUBaQkAZgIFAmJqBQJiZwcJAQIhPQIFAmJnAAAHBgMDAwkAAAIFAmFXCQDYBAEFAWwGCQAAAgUCYVcCBVdBVkVTCQBmAgUCYmgFAmJnBwkBAiE9AgUCYmcAAAcJAAIBAhhXcm9uZyBtaW5pbXVtIHNlbGwgcHJpY2UGAQJiawECYVcDCQAAAgUCYVcCBVdBVkVTBQR1bml0CQDZBAEFAmFXAQJibAECYm0EAmJuCQEBYQEJAKwCAgUCYm0CBV9PUEVOAwkAAAIFAmJuAgAJAAIBAg1CaWQgbm90IGZvdW5kBAJibwkAtQkCBQJibgIBXwQCYnAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJibwABBAJicQkBAmJrAQkAkQMCBQJibwAAAwkAZwIAAAUCYnAJAAIBAgxXcm9uZyBhbW91bnQJAJQKAgUCYnAFAmJxAQJicgICYVICYnMDCQEBIQEFAXYJAAIBBQF3BAJidAMJAQIhPQIFAmJzAgAJAQt2YWx1ZU9yRWxzZQIJAQFwAQkArAICCQClCAEJAKcIAQkA2QQBBQJicwIJX2ZyZWVfdHhzAAAAAAQBTgMDCQAAAgkA2AQBCAgFAmFSBmNhbGxlcgVieXRlcwkApQgBBQR0aGlzCQBmAgUCYnQAAAcJAKUIAQkApwgBCQDZBAEFAmJzCQDYBAEICAUCYVIGY2FsbGVyBWJ5dGVzBAJidQMDCQECIT0CBQJicwIACQBmAgUCYnQAAAcJAPwHBAUBaAIJdXNlRnJlZVR4CQDMCAIJAKUIAQkApwgBCQDZBAEFAmJzBQNuaWwFA25pbAUEdW5pdAMJAAACBQJidQUCYnUJAJYKBAkA2AQBCAUCYVINdHJhbnNhY3Rpb25JZAUBTggFCWxhc3RCbG9jawl0aW1lc3RhbXAJAGYCBQJidAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJidgECYVIDCQEBIQEFAXYJAAIBBQF3CQCVCgMJANgEAQgFAmFSDXRyYW5zYWN0aW9uSWQJANgEAQgIBQJhUgZjYWxsZXIFYnl0ZXMIBQlsYXN0QmxvY2sJdGltZXN0YW1wAQJidwYCYVIBUAJieAJieQJiegJicwQCYkEJAQJicgIFAmFSBQJicwQCYkIIBQJiQQJfMQQBTggFAmJBAl8yBAJiQwgFAmJBAl8zBAJidAgFAmJBAl80BAJiRAMDAwkAAAIFAU4FAmJ4CQECIT0CBQJiegIABwkBAiE9AgUCYnkCAAcGBwQCYkUJAQFvAQkBAmFoAgUBTgUBUAMDAwkBAiE9AgUCYkUAAAkAZwIFBmhlaWdodAUCYkUHCQEBIQEFAmJEBwkAAgECC1NhbGUgZW5kZWQuBAJiRgkAAAIFAU4FAmJ4BAJiRwkBAW8BAhB0b3RhbF9uZnRfaXNzdWVkBAFECQEBYQEJAQFXAgUCYngFAVAEAmJICQEBYQEJAQFRAgUCYngFAVADCQAAAgUCYkgCAAkAAgECEUFydCBkb2Vzbid0IGV4aXN0BAJiSQkBAXEBCQEBWQIFAmJ4BQFQBAJiSgkBAW8BCQEBWAIFAmJ4BQFQBAJiYwMFAmJGCQBoAgUBQgACCQEBbwEJAQJhZwIFAmJ4BQFQBAJiYgMFAmJGCQDYBAEFAWkJAQFhAQkBAmFpAgUCYngFAVAEAmJLCQEBbwEJAQFWAgUCYngFAVADAwMJAQEhAQUCYkQJAQEhAQUCYkYHAwMJAGcCAAAFAmJjBgkBASEBBQJiSQYJAGcCAAAFAmJLBwkAAgECEEFydCBub3QgZm9yIHNhbGUDAwMJAQEhAQUCYkQFAmJGBwkAZwIAAAUCYksHCQACAQIUTWF4IGlzc3VhYmxlIG5vdCBzZXQEAmFQCQECYUYBBQJieAMDBQJiRAkBAiE9AgUCYVACAAcJAAIBBQJhUAQCYm0JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUBUAIBXwUCYngCAV8FAmJ6AgFfBQJieQQCYkwDBQJiRAkBAmJsAQUCYm0JAQJiYQMFAmFSBQJiYgUCYmMEAmFUCAUCYkwCXzEEAmFXCAUCYkwCXzIEAmJNCQELdmFsdWVPckVsc2UCCQCdCAIFAWcJAQJhawEFAmJ4BQFmBAJiTgkBC3ZhbHVlT3JFbHNlAgkAmggCBQFnCQECYW0BBQJieAAABAJiTwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQFnCQECYW4BBQJieAUBZgQCYlAJAQt2YWx1ZU9yRWxzZQIJAJoIAgUBZwkBAmFvAQUCYngAAAQCYlEJAQFwAQUCYngEAmJSAwkAZgIFAmJRBQZoZWlnaHQAAAMJAAACBQJhVwUBaQUBcgUBcwQCYlMJAGsDBQJhVAUCYlIAZAQCYlQDAwMJAQIhPQIFAmJNBQFmCQBmAgUCYk4AAAcJAGYCBQZoZWlnaHQFAmJRBwkAawMFAmFUBQJiTgCQTgAABAJiVQMDAwkBAiE9AgUCYk8FAWYJAGYCBQJiUAAABwkAZgIFBmhlaWdodAUCYlEHCQBrAwUCYVQFAmJQAJBOAAAEAmJWCQBlAgUCYVQFAmJTAwkAAAIFAmJKBQJiSwkAAgECDEFydCBzb2xkIG91dAQCYlcJAGQCBQJiSgABBAJiWAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCUNyZWF0b3I6IAUCYngCCiwKIEFydElEOiAFAVACCywKIFNpZ25JRDogBQFEAhEsCiBBcnR3b3JrIG5hbWU6IAUCYkgCCiwKIElzc3VlOiAJAKQDAQUCYlcCAS8JAKQDAQUCYksEAmJZCQDCCAUJAKwCAgIDU0FfCQCkAwEJAGQCBQJiRwABBQJiWAABAAAHBAJiWgkAuAgBBQJiWQQCY2EDAwkAAAIFAmJXBQJiSwYJAQEhAQUCYkkHBgQCY2IDAwMJAAACBQFOBQJieAkBAiE9AgUCYnoCAAcJAQIhPQIFAmJ5AgAHCQERQGV4dHJOYXRpdmUoMTA2MikBBQJieggFAmFSBmNhbGxlcgQCY2MDCQEBIQEJAQlpc0RlZmluZWQBBQJhVwIFV0FWRVMJANgEAQkBBXZhbHVlAQUCYVcEAmJuCQEBYQEJAKwCAgUCYm0CBV9PUEVOBAJjZAkBC0RlbGV0ZUVudHJ5AQkArAICBQJibQIFX09QRU4EAmNlCQELU3RyaW5nRW50cnkCCQCsAgIFAmJtAgdfQ0xPU0VECQCsAgIJAKwCAgUCYm4CAV8JAKQDAQUCYkMEAmNmCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCWFydF9zb2xkXwkApAMBBQJiVwIEX29mXwkApAMBBQJiSwIBXwUBUAIBXwUCYngEAmNnAwkBASEBBQJiRAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQFOAgFfCQCkAwEFAmJDAgFfBQJiQgIBXwkApAMBBQJiYwIBXwUCYmICAV8JANgEAQUCYloJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBBQJjYgIBXwkApAMBBQJiQwIBXwUCYkICAV8JAKQDAQUCYVQCAV8FAmNjAgFfCQDYBAEFAmJaBAJjaAkBC1N0cmluZ0VudHJ5AgUCY2YFAmNnBAJjaQMJAQIhPQIFAmJUAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAWYJAGUCBQJiUwUCYlQFAmFXCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQJiTQUCYlQFAmFXBQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAWYFAmJTBQJhVwUDbmlsBAJjagMJAQIhPQIFAmJVAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAmJPBQJiVQUCYVcJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAmJ4CQBlAgUCYlYFAmJVBQJhVwUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQJieAUCYlYFAmFXBQNuaWwEAmNrAwUCYnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAU4AAAUEdW5pdAUDbmlsBQNuaWwEAmNsCQDOCAIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBWAIFAmJ4BQFQBQJiVwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgICBG5mdF8JANgEAQUCYloFAmNmCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhB0b3RhbF9uZnRfaXNzdWVkCQBkAgUCYkcAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFoAgUCYngFAVAAAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAVkCBQJieAUBUAUCY2EJAMwIAgUCYlkJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCY2IAAQUCYloFA25pbAUCY2kFAmNqBQJjawMFAmJECQDMCAIFAmNoCQDMCAIFAmNlCQDMCAIFAmNkBQJjbAkAzAgCBQJjaAUCY2wBAmNtAQJjbgQBRwUCY24DCQABAgUBRwIGU3RyaW5nBAJjbwUBRwUCY28JAAIBAiRTcG9uc29yZWQgUHVibGljIEtleSBTdHJpbmcgZXhwZWN0ZWQKAmNwAQdzZXRDb25mAgFiAmNxBAFOCQClCAEIBQJjcAZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQFtCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQFOAwkBCGNvbnRhaW5zAgUBYgIFY29uZl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUBYgUCY3EFA25pbAkAAgECIEVudHJpZXMgc3RhcnRpbmcgd2l0aCBjb25mXyBvbmx5CQACAQIiWW91IGFyZSBub3QgYWxsb3dlZCB0byBjaGFuZ2UgdGhpcwJhUgEKYWRkQXJ0d29yaw4BRgFEAmFMAmFNAmFOAmNyAmF3AmFBAmF4AmFCAmF5AmNzAmFPAmJzBAJjdAkBAmJyAgUCYVIFAmJzBAFQCAUCY3QCXzEEAU4IBQJjdAJfMgQCYkMIBQJjdAJfMwQCYnQIBQJjdAJfNAMJAQEhAQkBAUsBBQFGCQACAQIkSGFzaCBzaG91bGQgYmUgNjQgY2hhcmFjdGVycyBtYXhpbXVtBAJjdQkBAmFIAgUCYXkFAmFCBAJhSggFAmN1Al8xBAJhSwgFAmN1Al8yBAJjdgkBAmFJCgUBTgUCYXcFAmF4BQJhSgUCYUEFAmFLBQJhTAUCYU0FAmFOBQJhTwMJAQIhPQIFAmN2AgAJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEEAmN3CQBmAgkBAXABCQCsAgIFAU4CC19mcmVlX2Ryb3BzAAAEAmN4AwUCY3cJAJQKAgAABQFECQECYVUBBQJhUgQCYVQIBQJjeAJfMQQCYVcIBQJjeAJfMgMJAQEhAQkBCWlzRGVmaW5lZAEFAmFUCQACAQIUU29tZXRoaW5nIHdlbnQgd3JvbmcEAmN5CQEBYQEJAQJhdQIFAUYFAU4DCQECIT0CBQJjeQIACQACAQIUWW91IGFscmVhZHkgYWRkZWQgaXQEAmN6CQEBYQEJAQJhcgEFAUYDCQECIT0CBQJjegIACQACAQIXSGFzaCBhbHJlYWR5IHJlZ2lzdGVyZWQEAmNBCQEBQwMFAUQFAU4FAUYDCQEBIQEFAmNBCQACAQIsU2lnbiBDZXJ0aWZpY2F0ZSBub3QgZm91bmQgZm9yIHRoaXMgYWRkcmVzcy4EAmNCAwUCY3cJAPwHBAUBaAILdXNlRnJlZURyb3AJAMwIAgUBTgUDbmlsBQNuaWwFBHVuaXQDCQAAAgUCY0IFAmNCBAJjawMFAmJ0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQFOAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFyAQUBRgUBTgkAzAgCCQELU3RyaW5nRW50cnkCCQECYXUCBQFGBQFOBQFQCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBTwIFAU4FAVAFAmJDCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFRAgUBTgUBUAUCYUwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVICBQFOBQFQBQJhTQkAzAgCCQELU3RyaW5nRW50cnkCCQEBUwIFAU4FAVAFAmF3CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFVAgUBTgUBUAUCYXgJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVQCBQFOBQFQBQJhQQkAzAgCCQELU3RyaW5nRW50cnkCCQEBWgIFAU4FAVAFAmFLCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYQIFAU4FAVAFAmFKCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYwIFAU4FAVAFAmNyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYgIFAU4FAVAFAmFOCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVgIFAU4FAVAAAAkAzAgCCQELU3RyaW5nRW50cnkCCQEBVwIFAU4FAVAFAUQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFYAgUBTgUBUAAACQDMCAIJAQxCb29sZWFuRW50cnkCCQEBWQIFAU4FAVAHCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhcwIFAU4FAUQFAVAJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFwAgUBTgUBUAUBRgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWUCBQFOBQFQBQJjcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFmAgUBTgUBUAUCYU8JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAWYFAmFUBQFpBQNuaWwFAmNrCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFSAQ11cGRhdGVBcnR3b3JrDQJhcQJhTAJhTQJhTgJjcgJhdwJhQQJheAJhQgJheQJjcwJhTwJicwMJAQEhAQUBdgkAAgEFAXcEAmNDCQECYnICBQJhUgUCYnMEAmJCCAUCY0MCXzEEAU4IBQJjQwJfMgQCYkMIBQJjQwJfMwQCYnQIBQJjQwJfNAQCY0QJAQJhSAIFAmF5BQJhQgQCYUoIBQJjRAJfMQQCYUsIBQJjRAJfMgQCY3YJAQJhSQoFAU4FAmF3BQJheAUCYUoFAmFBBQJhSwUCYUwFAmFNBQJhTgUCYU8DCQECIT0CBQJjdgIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAJjeQkBAWEBCQEBUQIFAU4FAmFxAwkAAAIFAmN5AgAJAAIBAg9FbnRyeSBub3QgZm91bmQEAmNFCQEBYQEJAQJhagIFAU4FAmFxAwkAAAIFAmNFAgdJTExFR0FMCQACAQIdQ2Fubm90IHVwZGF0ZSBJTExFR0FMIGFydHdvcmsDCQEBIQEJAQJhWAIFAU4FAmFxBAJjawMFAmJ0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQFOAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVECBQFOBQJhcQUCYUwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVICBQFOBQJhcQUCYU0JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVMCBQFOBQJhcQUCYXcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVUCBQFOBQJhcQUCYXgJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVQCBQFOBQJhcQUCYUEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFhAgUBTgUCYXEFAmFKCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFaAgUBTgUCYXEFAmFLCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYgIFAU4FAmFxBQJhTgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWMCBQFOBQJhcQUCY3IJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFlAgUBTgUCYXEFAmNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWYCBQFOBQJhcQUCYU8FA25pbAUCY2sJAAIBAg5BbHJlYWR5IG1pbnRlZAJhUgELZmxhZ0FydHdvcmsEAVACY0YCY0UCY0cEAmNICQECYnYBBQJhUgQCYkIIBQJjSAJfMQQBTggFAmNIAl8yAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUBbQkAzAgCCQClCAEFBHRoaXMFA25pbAUBTgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAICB0NPTlNFTlQJAMwIAgIACQDMCAICD0NIQU5HRV9SRVFVSVJFRAkAzAgCAgdGTEFHR0VECQDMCAICB0lMTEVHQUwFA25pbAUCY0UJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFqAgUCY0YFAVAFAmNFCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhZAIFAmNGBQFQBQJjRwUDbmlsCQACAQkArAICAg5Vbmtub3cgc3RhdHVzIAUCY0UJAAIBAhNZb3UgYXJlIG5vdCBhbGxvd2VkAmFSAQ1kZWxldGVBcnR3b3JrAgFQAmNGBAJjSQkBAmJ2AQUCYVIEAmJCCAUCY0kCXzEEAU4IBQJjSQJfMgQCYVkDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQFtCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQFOBQJjRgUBTgQCY3kJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBAWEBCQEBUQIFAmFZBQFQAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwMJAAACBQJjeQIACQACAQIgTm8gYXJ0IG1hdGNoaW5nIGZvciB0aGlzIGFkZHJlc3MEAUYJAQFhAQkBAmFwAgUCYVkFAVADCQAAAgUBRgIACQACAQIlTm8gYXJ0IGhhc2ggbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwQBRAkBAWEBCQEBVwIFAmFZBQFQAwkAAAIFAUQCAAkAAgECE05vIFNJR04gSUQgbWF0Y2hpbmcEAmNKCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFPAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVECBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBUgIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFTAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVUCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBVAIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFaAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFhAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFjAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFiAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVYCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBVwIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFYAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVkCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWoCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWcCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWkCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYXIBBQFGCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhcwIFAmFZBQFECQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhdQIFAUYFAmFZCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhaAIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhZAIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhZQIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhZgIFAmFZBQFQBQNuaWwDCQEBIQEJAQJhWAIFAmFZBQFQAwkBASEBBQF2CQACAQUBdwUCY0oDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQFtCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQFOBQJjSgkAAgECKEFydCBhbHJlYWR5IG1pbnRlZCwgeW91IGNhbm5vdCBkZWxldGUgaXQCYVIBC3NlbGxBcnR3b3JrBgFQAmJnAmNLAmFXAmJFAmJzBAJjTAkBAmJyAgUCYVIFAmJzBAJiQggFAmNMAl8xBAFOCAUCY0wCXzIEAmJDCAUCY0wCXzMEAmJ0CAUCY0wCXzQEAmJICQEBYQEJAQFRAgUBTgUBUAMJAAACBQJiSAIACQACAQIjVGhpcyBhcnQgZG9lc24ndCBtYXRjaCB5b3VyIGFjY291bnQEAmNFCQEBYQEJAQJhagIFAU4FAVADCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAg9DSEFOR0VfUkVRVUlSRUQJAMwIAgIHRkxBR0dFRAkAzAgCAgdJTExFR0FMBQNuaWwFAmNFCQACAQIPRmxhZ2dlZCBhcnR3b3JrBAJjTQkBAW8BCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUBUAMJAGYCAAAFAmJFCQACAQIMTmVnYXRpdmUgZW5kAwMJAGYCBQJiRQAAAwkBAiE9AgUCY0sAAQYJAQIhPQIFAmJnAAAHCQACAQI6VGltZWQgb2ZmZXIgb25seSBhbGxvd2VkIGZvciB1bmlxdWUgZWRpdGlvbiBhbmQgb2ZmZXIgb25seQQCY04DCQAAAgUCYkUAAAAABQZoZWlnaHQDCQEBIQEJAQJiZQEFAmFXCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchAwkBASEBCQECYmYCBQJhVwUCYmcJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEEAmFQCQECYUYBBQFOAwkBAiE9AgUCYVACAAkAAgEFAmFQBAJiSgkBAW8BCQEBWAIFAU4FAVAEAmJLCQEBbwEJAQFWAgUBTgUBUAMJAGYCBQJjSwBkCQACAQIcMTAwIGVkaXRpb25zIG1heCBwZXIgYXJ0d29yawMDCQECIT0CBQJiSgAACQAAAgUCYkoFAmJLBwkAAgECFE1heCBlZGl0aW9uIHJlYWNoZWQuAwMJAGYCBQJiSgAACQECIT0CBQJiSwUCY0sHCQACAQImQ2Fubm90IGNoYW5nZSBtYXhpbXVtIGlzc3VhYmxlIGFueW1vcmUDAwkAZgIFAmNNAAAJAQIhPQIFAmJLBQJjSwcJAAIBAjFDYW5ub3QgY2hhbmdlIG1heGltdW0gaXNzdWFibGUgd2l0aCBhY3RpdmUgb3JkZXJzBAJjYQMDCQBmAgUCYmcAAAkAZgIFAmNLAAAHBgcEAmNrAwUCYnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAU4AAAUEdW5pdAUDbmlsBQNuaWwJAM4IAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAVkCBQFOBQFQBQJjYQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFnAgUBTgUBUAUCYmcJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFWAgUBTgUBUAUCY0sJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFpAgUBTgUBUAUCYVcJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhaAIFAU4FAVAJAGQCBQJjTgUCYkUFA25pbAUCY2sCYVIBCmJ1eUFydHdvcmsCAVACYngJAQJidwYFAmFSBQFQBQJieAIAAgACAAJhUgEGc2V0QmlkAgFQAmJ4BAJjTwkBAmJ2AQUCYVIEAmJCCAUCY08CXzEEAU4IBQJjTwJfMgQCYkMIBQJjTwJfMwQCY1AJAQJhUQEFAmFSBAJhUwgFAmNQAl8xBAJhVAgFAmNQAl8yBAJhVwMJAQEhAQkBCWlzRGVmaW5lZAEIBQJhUwdhc3NldElkAgVXQVZFUwkA2AQBCQEFdmFsdWUBCAUCYVMHYXNzZXRJZAQCYkUJAQFvAQkBAmFoAgUCYngFAVADAwkBAiE9AgUCYkUAAAkAZwIFBmhlaWdodAUCYkUHCQACAQILU2FsZSBlbmRlZC4EAmNNCQEBbwEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQFQAwkBASEBCQECYmUBBQJhVwkAAgECEmFzc2V0IG5vdCBhY2NlcHRlZAMJAQEhAQkBAmJmAgUCYVcFAmFUCQACAQIOV3JvbmcgbWluIHNlbGwEAmJKCQEBbwEJAQFYAgUCYngFAVAEAmJLCQEBbwEJAQFWAgUCYngFAVADCQBnAgAABQJiSwkAAgECI05vIG1heCBlZGl0aW9uIHNldCBmb3IgdGhpcyBhcnR3b3JrAwkAZwIFAmJKBQJiSwkAAgECGFNvbGQgb3V0LCB5b3UgY2Fubm90IGJpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUBUAIBXwUCYngCAV8FAU4CAV8FAmJCAgVfT1BFTgkArAICCQCsAgIJAKwCAgkArAICBQJhVwIBXwkApAMBBQJhVAIBXwkApAMBBQJiQwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FAVAJAGQCBQJjTQABBQNuaWwCYVIBCWFjY2VwdEJpZAUBUAJieAJieQJiegJicwQCY1EJAQJicgIFAmFSBQJicwQCYkIIBQJjUQJfMQQBTggFAmNRAl8yBAJiQwgFAmNRAl8zBAJidAgFAmNRAl80AwkBAiE9AgUBTgUCYngJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uCQECYncGBQJhUgUBUAUCYngFAmJ5BQJiegUCYnMCYVIBCWNhbmNlbEJpZAQBUAJieAJieQJiegQCY1IJAQJidgEFAmFSBAJiQggFAmNSAl8xBAFOCAUCY1ICXzIEAmJDCAUCY1ICXzMDAwkBAiE9AgUBTgUCYnoJAQIhPQIFAU4FAmJ4BwkAAgECGVlvdSBjYW5ub3QgZG8gdGhpcyBhY3Rpb24EAmNTAwkAAAIFAU4FAmJ4BQJiegUBTgQCY00JAQFvAQkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FAVAEAmJtCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FAVACAV8FAmJ4AgFfBQJiegIBXwUCYnkEAmJuCQEBYQEJAKwCAgUCYm0CBV9PUEVOAwkAAAIFAmJuAgAJAAIBAg1CaWQgbm90IGZvdW5kBAJibwkAtQkCBQJibgIBXwQCYVcJAQJiawEJAJEDAgUCYm8AAAQCY1QCCENBTkNFTEVECQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUCYm0CBV9PUEVOCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICBQJibQIBXwUCY1QJAKwCAgkArAICBQJibgIBXwkApAMBBQJiQwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FAVAJAGUCBQJjTQABCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQJjUwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJvAAEFAmFXBQNuaWwBAmNVAQJjVgAEAUcFAmNVAwkAAQIFAUcCF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBAJjVwUBRwMDAwMJAAACCAUCY1cIZnVuY3Rpb24CCmFkZEFydHdvcmsJAAACCAUCY1cEZEFwcAUEdGhpcwcJAAACCAUCY1cDZmVlAKDCHgcJAAACCAUCY1cKZmVlQXNzZXRJZAUEdW5pdAcJAPQDAwgFAmNVCWJvZHlCeXRlcwkAkQMCCAUCY1UGcHJvb2ZzAAAJANkEAQkBAmNtAQkAkQMCCAUCY1cEYXJncwANAwMDAwkAAAIIBQJjVwhmdW5jdGlvbgINdXBkYXRlQXJ0d29yawkAAAIIBQJjVwRkQXBwBQR0aGlzBwkAAAIIBQJjVwNmZWUAoMIeBwkAAAIIBQJjVwpmZWVBc3NldElkBQR1bml0BwkA9AMDCAUCY1UJYm9keUJ5dGVzCQCRAwIIBQJjVQZwcm9vZnMAAAkA2QQBCQECY20BCQCRAwIIBQJjVwRhcmdzAAwDAwMDCQAAAggFAmNXCGZ1bmN0aW9uAgtzZWxsQXJ0d29yawkAAAIIBQJjVwRkQXBwBQR0aGlzBwkAAAIIBQJjVwNmZWUAoMIeBwkAAAIIBQJjVwpmZWVBc3NldElkBQR1bml0BwkA9AMDCAUCY1UJYm9keUJ5dGVzCQCRAwIIBQJjVQZwcm9vZnMAAAkA2QQBCQECY20BCQCRAwIIBQJjVwRhcmdzAAUJAPQDAwgFAmNVCWJvZHlCeXRlcwkAkQMCCAUCY1UGcHJvb2ZzAAAIBQJjVQ9zZW5kZXJQdWJsaWNLZXkJAPQDAwgFAmNVCWJvZHlCeXRlcwkAkQMCCAUCY1UGcHJvb2ZzAAAIBQJjVQ9zZW5kZXJQdWJsaWNLZXlI+T6H", "height": 2503526, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3KuQPEvX3PEFBAezXhZ8ZaU6S1GegnTJAb9tGKrCBFj8 Next: Eaez7hop9aMFzvmZJcX2otbPfhjpo95csZ6G129nQZNa Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let VERSION = "1.1.10"
5-
64 func getStringByKey (key) = valueOrElse(getString(this, key), "")
75
86
6361 let userAllowed = "ALLOWED"
6462
6563 let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
66-
67-func getArtworkRoyalties (key) = valueOrElse(getInteger(this, key), 1000)
68-
6964
7065 func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signDapp, ((("data_fc_" + signID) + "_") + Owner)) {
7166 case a: String =>
406401 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
407402
408403
409-func buyMint (i,artId,issuer,bidId,bidOwner) = {
410- let $t01297713036 = idCallerDate(i)
411- let id = $t01297713036._1
412- let caller = $t01297713036._2
413- let date = $t01297713036._3
404+func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
405+ let $t01303913128 = idCallerDateSponsored(i, pubKey)
406+ let id = $t01303913128._1
407+ let caller = $t01303913128._2
408+ let date = $t01303913128._3
409+ let isSponsored = $t01303913128._4
414410 let isBid = if (if (if ((caller == issuer))
415411 then (bidOwner != "")
416412 else false)
466462 then throw(checkUser)
467463 else {
468464 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
469- let $t01455514747 = if (isBid)
465+ let $t01464714839 = if (isBid)
470466 then getPriceAssetIdFromBid(bidDataKey)
471467 else validatePriceAssetId(i, priceAssetId, artworkPrice)
472- let amount = $t01455514747._1
473- let assetId = $t01455514747._2
468+ let amount = $t01464714839._1
469+ let assetId = $t01464714839._2
474470 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
475471 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
476472 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
537533 let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
538534 then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
539535 else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
540- 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)
536+ let txToCaller = if (isSponsored)
537+ then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
538+ else nil
539+ 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)
541540 if (isBid)
542541 then [soldData, bidUpdate, bidDelOld] :: buyRes
543542 else soldData :: buyRes
571570
572571 @Callable(i)
573572 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
574- let $t01980219875 = idCallerDateSponsored(i, pubKey)
575- let artId = $t01980219875._1
576- let caller = $t01980219875._2
577- let date = $t01980219875._3
578- let isSponsored = $t01980219875._4
573+ let $t02001520088 = idCallerDateSponsored(i, pubKey)
574+ let artId = $t02001520088._1
575+ let caller = $t02001520088._2
576+ let date = $t02001520088._3
577+ let isSponsored = $t02001520088._4
579578 if (!(validateHash(sha256Hash)))
580579 then throw("Hash should be 64 characters maximum")
581580 else {
582- let $t01997620045 = setLIcence(cidLicence, sha256Licence)
583- let licenceCID = $t01997620045._1
584- let licenceHash = $t01997620045._2
581+ let $t02018920258 = setLIcence(cidLicence, sha256Licence)
582+ let licenceCID = $t02018920258._1
583+ let licenceHash = $t02018920258._2
585584 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
586585 if ((validateArtwork != ""))
587586 then throw("Something went wrong!")
588587 else {
589588 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
590- let $t02034420428 = if (whitelisted_drop)
589+ let $t02055720641 = if (whitelisted_drop)
591590 then $Tuple2(0, signID)
592591 else validatePayment(i)
593- let amount = $t02034420428._1
594- let assetId = $t02034420428._2
592+ let amount = $t02055720641._1
593+ let assetId = $t02055720641._2
595594 if (!(isDefined(amount)))
596595 then throw("Something went wrong")
597596 else {
632631 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
633632 then throw(maintenanceMSG)
634633 else {
635- let $t02346223532 = idCallerDateSponsored(i, pubKey)
636- let id = $t02346223532._1
637- let caller = $t02346223532._2
638- let date = $t02346223532._3
639- let isSponsored = $t02346223532._4
640- let $t02354223611 = setLIcence(cidLicence, sha256Licence)
641- let licenceCID = $t02354223611._1
642- let licenceHash = $t02354223611._2
634+ let $t02367523745 = idCallerDateSponsored(i, pubKey)
635+ let id = $t02367523745._1
636+ let caller = $t02367523745._2
637+ let date = $t02367523745._3
638+ let isSponsored = $t02367523745._4
639+ let $t02375523824 = setLIcence(cidLicence, sha256Licence)
640+ let licenceCID = $t02375523824._1
641+ let licenceHash = $t02375523824._2
643642 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
644643 if ((validateArtwork != ""))
645644 then throw("Something went wrong!")
667666
668667 @Callable(i)
669668 func flagArtwork (artId,addr,flag,note) = {
670- let $t02523825272 = idCallerDate(i)
671- let id = $t02523825272._1
672- let caller = $t02523825272._2
669+ let $t02545125485 = idCallerDate(i)
670+ let id = $t02545125485._1
671+ let caller = $t02545125485._2
673672 if (containsElement([chris, toString(this)], caller))
674673 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
675674 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
681680
682681 @Callable(i)
683682 func deleteArtwork (artId,addr) = {
684- let $t02570825742 = idCallerDate(i)
685- let id = $t02570825742._1
686- let caller = $t02570825742._2
683+ let $t02592125955 = idCallerDate(i)
684+ let id = $t02592125955._1
685+ let caller = $t02592125955._2
687686 let addrToUse = if (containsElement([chris, toString(this)], caller))
688687 then addr
689688 else caller
716715
717716 @Callable(i)
718717 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
719- let $t02857828648 = idCallerDateSponsored(i, pubKey)
720- let id = $t02857828648._1
721- let caller = $t02857828648._2
722- let date = $t02857828648._3
723- let isSponsored = $t02857828648._4
718+ let $t02879128861 = idCallerDateSponsored(i, pubKey)
719+ let id = $t02879128861._1
720+ let caller = $t02879128861._2
721+ let date = $t02879128861._3
722+ let isSponsored = $t02879128861._4
724723 let artworkName = getStringByKey(keyName(caller, artId))
725724 if ((artworkName == ""))
726725 then throw("This art doesn't match your account")
788787
789788
790789 @Callable(i)
791-func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "")
790+func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", "")
792791
793792
794793
795794 @Callable(i)
796795 func setBid (artId,issuer) = {
797- let $t03102631066 = idCallerDate(i)
798- let id = $t03102631066._1
799- let caller = $t03102631066._2
800- let date = $t03102631066._3
801- let $t03107131107 = isPayment(i)
802- let payment = $t03107131107._1
803- let amount = $t03107131107._2
796+ let $t03124331283 = idCallerDate(i)
797+ let id = $t03124331283._1
798+ let caller = $t03124331283._2
799+ let date = $t03124331283._3
800+ let $t03128831324 = isPayment(i)
801+ let payment = $t03128831324._1
802+ let amount = $t03128831324._2
804803 let assetId = if (!(isDefined(payment.assetId)))
805804 then "WAVES"
806805 else toBase58String(value(payment.assetId))
830829
831830
832831 @Callable(i)
833-func acceptBid (artId,issuer,bidId,bidOwner) = {
834- let $t03226532305 = idCallerDate(i)
835- let id = $t03226532305._1
836- let caller = $t03226532305._2
837- let date = $t03226532305._3
832+func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = {
833+ let $t03254432614 = idCallerDateSponsored(i, pubKey)
834+ let id = $t03254432614._1
835+ let caller = $t03254432614._2
836+ let date = $t03254432614._3
837+ let isSponsored = $t03254432614._4
838838 if ((caller != issuer))
839839 then throw("You cannot do this action")
840- else buyMint(i, artId, issuer, bidId, bidOwner)
840+ else buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
841841 }
842842
843843
844844
845845 @Callable(i)
846846 func cancelBid (artId,issuer,bidId,bidOwner) = {
847- let $t03253132592 = idCallerDate(i)
848- let id = $t03253132592._1
849- let caller = $t03253132592._2
850- let date = $t03253132592._3
847+ let $t03284832909 = idCallerDate(i)
848+ let id = $t03284832909._1
849+ let caller = $t03284832909._2
850+ let date = $t03284832909._3
851851 if (if ((caller != bidOwner))
852852 then (caller != issuer)
853853 else false)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let VERSION = "1.1.10"
5-
64 func getStringByKey (key) = valueOrElse(getString(this, key), "")
75
86
97 let unitTest = false
108
119 let oracleFee = value(addressFromString(getStringByKey("conf_oracle_fee")))
1210
1311 let signDapp = value(addressFromString(getStringByKey("conf_signweb_dapp")))
1412
1513 let feeReceiver = getStringByKey("conf_fee_receiver")
1614
1715 let userDapp = if (unitTest)
1816 then value(addressFromString("3Mt4RGMEyjSWYAocTPqd55wdHQQB3PU2UCm"))
1917 else value(addressFromString(getStringByKey("conf_users_dapp")))
2018
2119 let whitelistDapp = value(addressFromString(getStringByKey("conf_whitelist_dapp")))
2220
2321 let signAssetId = fromBase58String(getStringByKey("conf_accepted_asset_SIGN"))
2422
2523 let usdnAssetId = fromBase58String(getStringByKey("conf_accepted_asset_USDN"))
2624
2725 let usdtAssetId = fromBase58String(getStringByKey("conf_accepted_asset_USDT"))
2826
2927 let wavesAssetId = base58''
3028
3129 let chris = getStringByKey("conf_admin_1")
3230
3331 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
3432
3533
3634 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
3735
3836
3937 func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
4038
4139
4240 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
4341
4442
4543 let signCut = 7
4644
4745 let usdnWaveCut = 10
4846
4947 let defaultLicence = getStringByKey("conf_default_licence")
5048
5149 let defaultHashLicence = getStringByKey("conf_default_licence_hash")
5250
5351 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
5452
5553 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
5654
5755 let userSuspended = "SUSPENDED"
5856
5957 let userRemoved = "REMOVED"
6058
6159 let userUnregistered = "UNREGISTERED"
6260
6361 let userAllowed = "ALLOWED"
6462
6563 let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
66-
67-func getArtworkRoyalties (key) = valueOrElse(getInteger(this, key), 1000)
68-
6964
7065 func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signDapp, ((("data_fc_" + signID) + "_") + Owner)) {
7166 case a: String =>
7267 if (contains(a, sha256Hash))
7368 then true
7469 else false
7570 case _ =>
7671 false
7772 }
7873
7974
8075 func validateCID (cid) = if (contains(cid, "/"))
8176 then if (if ((76 > size(cid)))
8277 then (size(split(cid, "/")[0]) == 59)
8378 else false)
8479 then (16 > size(split(cid, "/")[1]))
8580 else false
8681 else false
8782
8883
8984 func validateHash (hash) = (size(hash) == 64)
9085
9186
9287 func keyUserStatus (caller) = ("user_status_" + caller)
9388
9489
9590 func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
9691
9792
9893 func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
9994
10095
10196 func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
10297
10398
10499 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
105100
106101
107102 func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
108103
109104
110105 func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
111106
112107
113108 func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
114109
115110
116111 func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
117112
118113
119114 func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
120115
121116
122117 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
123118
124119
125120 func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
126121
127122
128123 func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
129124
130125
131126 func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
132127
133128
134129 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
135130
136131
137132 func keyNote (caller,artId) = ((("art_note_" + artId) + "_") + caller)
138133
139134
140135 func keyCrawler (caller,artId) = ((("art_crawler_cid_" + artId) + "_") + caller)
141136
142137
143138 func keyRoyalties (caller,artId) = ((("art_royalties_" + artId) + "_") + caller)
144139
145140
146141 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
147142
148143
149144 func keyEndSale (caller,artId) = ((("art_endsale_" + artId) + "_") + caller)
150145
151146
152147 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
153148
154149
155150 func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
156151
157152
158153 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
159154
160155
161156 func keyPrimaryShareAgent (artistAddr) = ("artist_agent_primary_" + artistAddr)
162157
163158
164159 func keyArtistPublicAgentAddr (artistAddr) = ("artist_public_agent_" + artistAddr)
165160
166161
167162 func keyPrimarySharePublicAgent (artistAddr) = ("artist_public_agent_primary_" + artistAddr)
168163
169164
170165 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
171166
172167
173168 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
174169
175170
176171 func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
177172
178173
179174 func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
180175
181176
182177 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
183178 then throw("Wrong Display CID")
184179 else if (!(validateCID(cidExport)))
185180 then throw("Wrong Export CID")
186181 else if (if ((cidLicence != ""))
187182 then !(validateCID(cidLicence))
188183 else false)
189184 then throw("Wrong Licence CID")
190185 else true
191186
192187
193188 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
194189 then throw("Export Hash 64 char. max")
195190 else if (!(validateHash(sha256Licence)))
196191 then throw("Licence Hash 64 char. max")
197192 else true
198193
199194
200195 func validateString (str,max) = if ((size(str) == 0))
201196 then throw("Field cannot be is empty")
202197 else if ((size(str) > max))
203198 then throw((str + " is too long"))
204199 else true
205200
206201
207202 func validateUser (caller) = {
208203 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
209204 if (if ((userStatus == userUnregistered))
210205 then true
211206 else (userStatus == userAllowed))
212207 then "Register this account first with \"Account\" tab"
213208 else if ((userStatus == userSuspended))
214209 then "Account suspended"
215210 else if ((userStatus == userRemoved))
216211 then "Account removed"
217212 else ""
218213 }
219214
220215
221216 func setLIcence (cidLicence,sha256Licence) = {
222217 let cid = if ((size(cidLicence) == 0))
223218 then defaultLicence
224219 else cidLicence
225220 let hash = if ((size(sha256Licence) == 0))
226221 then defaultHashLicence
227222 else sha256Licence
228223 $Tuple2(cid, hash)
229224 }
230225
231226
232227 func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,royalties) = {
233228 let checkUser = validateUser(caller)
234229 if ((checkUser != ""))
235230 then throw(checkUser)
236231 else if ((size(cidDisplay) == 0))
237232 then throw("Display CID cannot be empty")
238233 else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
239234 then throw("Problem with CID")
240235 else if (!(validateAllHash(sha256Export, licenceHash)))
241236 then throw("Problem with Hashes")
242237 else if (!(validateString(name, 100)))
243238 then throw("100 Char. max name")
244239 else if (!(validateString(description, 1000)))
245240 then throw("1000 Char. max description")
246241 else if (if ((0 > royalties))
247242 then true
248243 else (royalties > 1000))
249244 then throw("Royalties cannot be less than 0% or higher than 10%")
250245 else if ((size(split(tags, ",")) > 5))
251246 then throw("5 tags max.")
252247 else ""
253248 }
254249
255250
256251 func isPayment (i) = if ((size(i.payments) == 0))
257252 then throw("No payment attached")
258253 else {
259254 let payment = value(i.payments[0])
260255 let amount = value(payment.amount)
261256 $Tuple2(payment, amount)
262257 }
263258
264259
265260 func validatePayment (i) = {
266261 let $t091809216 = isPayment(i)
267262 let payment = $t091809216._1
268263 let amount = $t091809216._2
269264 let assetId = if (if (isDefined(payment.assetId))
270265 then (payment.assetId == signAssetId)
271266 else false)
272267 then payment.assetId
273268 else throw("Only SIGN token accepted as transaction fee")
274269 if ((amount != currentCertificationPrice))
275270 then throw(("Payment amount should be " + toString(currentCertificationPrice)))
276271 else $Tuple2(amount, assetId)
277272 }
278273
279274
280275 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
281276 case b: Int =>
282277 if ((b != 0))
283278 then true
284279 else false
285280 case _ =>
286281 false
287282 }
288283
289284
290285 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
291286 let $t098049840 = isPayment(i)
292287 let payment = $t098049840._1
293288 let amount = $t098049840._2
294289 let assetId = if (!(isDefined(payment.assetId)))
295290 then unit
296291 else if (if ((size(priceAssetId) > 0))
297292 then (toBase58String(value(payment.assetId)) == priceAssetId)
298293 else false)
299294 then payment.assetId
300295 else throw("Wrong asset id")
301296 if (if ((assetId == unit))
302297 then (priceAssetId != "")
303298 else false)
304299 then throw("Wrong asset id")
305300 else if ((artworkPrice != amount))
306301 then throw("Payment don't match")
307302 else $Tuple2(amount, assetId)
308303 }
309304
310305
311306 func acceptedAssetIds (assetId) = if (if (if (if (if ((assetId != toBase58String(signAssetId)))
312307 then (assetId != toBase58String(wavesAssetId))
313308 else false)
314309 then (assetId != "WAVES")
315310 else false)
316311 then (assetId != toBase58String(usdnAssetId))
317312 else false)
318313 then (assetId != toBase58String(usdtAssetId))
319314 else false)
320315 then throw("Only SIGN, USDN,USDT or WAVES accepted")
321316 else true
322317
323318
324319 func validateMinSell (assetId,price) = {
325320 let minSellWaves = if (unitTest)
326321 then 10
327322 else getIntegerByKeyFromOracle("waves_min_sell")
328323 let minSellUsdn = 1000000
329324 let minSellSign = if (unitTest)
330325 then 1
331326 else (currentCertificationPrice * 2)
332327 if (if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
333328 then (minSellUsdn > price)
334329 else false)
335330 then (price != 0)
336331 else false)
337332 then true
338333 else if (if ((assetId == toBase58String(usdtAssetId)))
339334 then (minSellUsdn > price)
340335 else false)
341336 then (price != 0)
342337 else false)
343338 then true
344339 else if (if ((assetId == toBase58String(signAssetId)))
345340 then (minSellSign > price)
346341 else false)
347342 then (price != 0)
348343 else false)
349344 then true
350345 else if (if (if ((assetId == toBase58String(wavesAssetId)))
351346 then true
352347 else (assetId == "WAVES"))
353348 then (minSellWaves > price)
354349 else false)
355350 then (price != 0)
356351 else false)
357352 then throw("Wrong minimum sell price")
358353 else true
359354 }
360355
361356
362357 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
363358 then unit
364359 else fromBase58String(assetId)
365360
366361
367362 func getPriceAssetIdFromBid (bidDataKey) = {
368363 let bidData = getStringByKey((bidDataKey + "_OPEN"))
369364 if ((bidData == ""))
370365 then throw("Bid not found")
371366 else {
372367 let bidDataArr = split(bidData, "_")
373368 let bidAmount = parseIntValue(bidDataArr[1])
374369 let bidAssetId = getBidAssetId(bidDataArr[0])
375370 if ((0 >= bidAmount))
376371 then throw("Wrong amount")
377372 else $Tuple2(bidAmount, bidAssetId)
378373 }
379374 }
380375
381376
382377 func idCallerDateSponsored (i,pubKey) = if (!(dappRunning))
383378 then throw(maintenanceMSG)
384379 else {
385380 let isSponsored = if ((pubKey != ""))
386381 then valueOrElse(checkWhitelist((toString(addressFromPublicKey(fromBase58String(pubKey))) + "_free_txs")), 0)
387382 else 0
388383 let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
389384 then (isSponsored > 0)
390385 else false)
391386 then toString(addressFromPublicKey(fromBase58String(pubKey)))
392387 else toBase58String(i.caller.bytes)
393388 let get_sponsored_waves = if (if ((pubKey != ""))
394389 then (isSponsored > 0)
395390 else false)
396391 then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
397392 else unit
398393 if ((get_sponsored_waves == get_sponsored_waves))
399394 then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
400395 else throw("Strict value is not equal to itself.")
401396 }
402397
403398
404399 func idCallerDate (i) = if (!(dappRunning))
405400 then throw(maintenanceMSG)
406401 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
407402
408403
409-func buyMint (i,artId,issuer,bidId,bidOwner) = {
410- let $t01297713036 = idCallerDate(i)
411- let id = $t01297713036._1
412- let caller = $t01297713036._2
413- let date = $t01297713036._3
404+func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
405+ let $t01303913128 = idCallerDateSponsored(i, pubKey)
406+ let id = $t01303913128._1
407+ let caller = $t01303913128._2
408+ let date = $t01303913128._3
409+ let isSponsored = $t01303913128._4
414410 let isBid = if (if (if ((caller == issuer))
415411 then (bidOwner != "")
416412 else false)
417413 then (bidId != "")
418414 else false)
419415 then true
420416 else false
421417 let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
422418 if (if (if ((blockEnd != 0))
423419 then (height >= blockEnd)
424420 else false)
425421 then !(isBid)
426422 else false)
427423 then throw("Sale ended.")
428424 else {
429425 let callerIsIssuer = (caller == issuer)
430426 let totalNFT = getIntegerByKey("total_nft_issued")
431427 let signID = getStringByKey(keySignID(issuer, artId))
432428 let artworkName = getStringByKey(keyName(issuer, artId))
433429 if ((artworkName == ""))
434430 then throw("Art doesn't exist")
435431 else {
436432 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
437433 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
438434 let artworkPrice = if (callerIsIssuer)
439435 then (currentCertificationPrice * 2)
440436 else getIntegerByKey(keyPrice(issuer, artId))
441437 let priceAssetId = if (callerIsIssuer)
442438 then toBase58String(signAssetId)
443439 else getStringByKey(keyAssetIdAccepted(issuer, artId))
444440 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
445441 if (if (if (!(isBid))
446442 then !(callerIsIssuer)
447443 else false)
448444 then if (if ((0 >= artworkPrice))
449445 then true
450446 else !(isOnSale))
451447 then true
452448 else (0 >= maxCanSell)
453449 else false)
454450 then throw("Art not for sale")
455451 else if (if (if (!(isBid))
456452 then callerIsIssuer
457453 else false)
458454 then (0 >= maxCanSell)
459455 else false)
460456 then throw("Max issuable not set")
461457 else {
462458 let checkUser = validateUser(issuer)
463459 if (if (isBid)
464460 then (checkUser != "")
465461 else false)
466462 then throw(checkUser)
467463 else {
468464 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
469- let $t01455514747 = if (isBid)
465+ let $t01464714839 = if (isBid)
470466 then getPriceAssetIdFromBid(bidDataKey)
471467 else validatePriceAssetId(i, priceAssetId, artworkPrice)
472- let amount = $t01455514747._1
473- let assetId = $t01455514747._2
468+ let amount = $t01464714839._1
469+ let assetId = $t01464714839._2
474470 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
475471 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
476472 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
477473 let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
478474 let isWhitelisted = checkWhitelist(issuer)
479475 let cut = if ((isWhitelisted > height))
480476 then 0
481477 else if ((assetId == signAssetId))
482478 then signCut
483479 else usdnWaveCut
484480 let amountForSign = fraction(amount, cut, 100)
485481 let amountForAgent = if (if (if ((agent != feeReceiver))
486482 then (agentShare > 0)
487483 else false)
488484 then (height > isWhitelisted)
489485 else false)
490486 then fraction(amount, agentShare, 10000)
491487 else 0
492488 let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
493489 then (publicAgentShare > 0)
494490 else false)
495491 then (height > isWhitelisted)
496492 else false)
497493 then fraction(amount, publicAgentShare, 10000)
498494 else 0
499495 let amountForCreator = (amount - amountForSign)
500496 if ((amountSold == maxCanSell))
501497 then throw("Art sold out")
502498 else {
503499 let newAmountSold = (amountSold + 1)
504500 let issueMeta = ((((((((((("Creator: " + issuer) + ",
505501 ArtID: ") + artId) + ",
506502 SignID: ") + signID) + ",
507503 Artwork name: ") + artworkName) + ",
508504 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
509505 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
510506 let idNFT = calculateAssetId(issueNFT)
511507 let sellStatus = if (if ((newAmountSold == maxCanSell))
512508 then true
513509 else !(isOnSale))
514510 then false
515511 else true
516512 let receiveNFT = if (if (if ((caller == issuer))
517513 then (bidOwner != "")
518514 else false)
519515 then (bidId != "")
520516 else false)
521517 then addressFromStringValue(bidOwner)
522518 else i.caller
523519 let assetIdBid = if (!(isDefined(assetId)))
524520 then "WAVES"
525521 else toBase58String(value(assetId))
526522 let bidData = getStringByKey((bidDataKey + "_OPEN"))
527523 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
528524 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
529525 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
530526 let soldValue = if (!(isBid))
531527 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
532528 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
533529 let soldData = StringEntry(soldKey, soldValue)
534530 let commissionsWithAgent = if ((amountForAgent != 0))
535531 then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
536532 else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
537533 let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
538534 then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
539535 else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
540- 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)
536+ let txToCaller = if (isSponsored)
537+ then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
538+ else nil
539+ 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)
541540 if (isBid)
542541 then [soldData, bidUpdate, bidDelOld] :: buyRes
543542 else soldData :: buyRes
544543 }
545544 }
546545 }
547546 }
548547 }
549548 }
550549
551550
552551 func asString (bv) = match bv {
553552 case bv0: String =>
554553 bv0
555554 case _ =>
556555 throw("Sponsored Public Key String expected")
557556 }
558557
559558
560559 @Callable(invoke)
561560 func setConf (key,val) = {
562561 let caller = toString(invoke.caller)
563562 if (containsElement([chris, toString(this)], caller))
564563 then if (contains(key, "conf_"))
565564 then [StringEntry(key, val)]
566565 else throw("Entries starting with conf_ only")
567566 else throw("You are not allowed to change this")
568567 }
569568
570569
571570
572571 @Callable(i)
573572 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
574- let $t01980219875 = idCallerDateSponsored(i, pubKey)
575- let artId = $t01980219875._1
576- let caller = $t01980219875._2
577- let date = $t01980219875._3
578- let isSponsored = $t01980219875._4
573+ let $t02001520088 = idCallerDateSponsored(i, pubKey)
574+ let artId = $t02001520088._1
575+ let caller = $t02001520088._2
576+ let date = $t02001520088._3
577+ let isSponsored = $t02001520088._4
579578 if (!(validateHash(sha256Hash)))
580579 then throw("Hash should be 64 characters maximum")
581580 else {
582- let $t01997620045 = setLIcence(cidLicence, sha256Licence)
583- let licenceCID = $t01997620045._1
584- let licenceHash = $t01997620045._2
581+ let $t02018920258 = setLIcence(cidLicence, sha256Licence)
582+ let licenceCID = $t02018920258._1
583+ let licenceHash = $t02018920258._2
585584 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
586585 if ((validateArtwork != ""))
587586 then throw("Something went wrong!")
588587 else {
589588 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
590- let $t02034420428 = if (whitelisted_drop)
589+ let $t02055720641 = if (whitelisted_drop)
591590 then $Tuple2(0, signID)
592591 else validatePayment(i)
593- let amount = $t02034420428._1
594- let assetId = $t02034420428._2
592+ let amount = $t02055720641._1
593+ let assetId = $t02055720641._2
595594 if (!(isDefined(amount)))
596595 then throw("Something went wrong")
597596 else {
598597 let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
599598 if ((entryExist != ""))
600599 then throw("You already added it")
601600 else {
602601 let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
603602 if ((hashExist != ""))
604603 then throw("Hash already registered")
605604 else {
606605 let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
607606 if (!(isSignCertified))
608607 then throw("Sign Certificate not found for this address.")
609608 else {
610609 let decrease_whitelist_drop = if (whitelisted_drop)
611610 then invoke(whitelistDapp, "useFreeDrop", [caller], nil)
612611 else unit
613612 if ((decrease_whitelist_drop == decrease_whitelist_drop))
614613 then {
615614 let txToCaller = if (isSponsored)
616615 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
617616 else nil
618617 ([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)
619618 }
620619 else throw("Strict value is not equal to itself.")
621620 }
622621 }
623622 }
624623 }
625624 }
626625 }
627626 }
628627
629628
630629
631630 @Callable(i)
632631 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
633632 then throw(maintenanceMSG)
634633 else {
635- let $t02346223532 = idCallerDateSponsored(i, pubKey)
636- let id = $t02346223532._1
637- let caller = $t02346223532._2
638- let date = $t02346223532._3
639- let isSponsored = $t02346223532._4
640- let $t02354223611 = setLIcence(cidLicence, sha256Licence)
641- let licenceCID = $t02354223611._1
642- let licenceHash = $t02354223611._2
634+ let $t02367523745 = idCallerDateSponsored(i, pubKey)
635+ let id = $t02367523745._1
636+ let caller = $t02367523745._2
637+ let date = $t02367523745._3
638+ let isSponsored = $t02367523745._4
639+ let $t02375523824 = setLIcence(cidLicence, sha256Licence)
640+ let licenceCID = $t02375523824._1
641+ let licenceHash = $t02375523824._2
643642 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
644643 if ((validateArtwork != ""))
645644 then throw("Something went wrong!")
646645 else {
647646 let entryExist = getStringByKey(keyName(caller, txid))
648647 if ((entryExist == ""))
649648 then throw("Entry not found")
650649 else {
651650 let flag = getStringByKey(keyFlag(caller, txid))
652651 if ((flag == "ILLEGAL"))
653652 then throw("Cannot update ILLEGAL artwork")
654653 else if (!(isArtMinted(caller, txid)))
655654 then {
656655 let txToCaller = if (isSponsored)
657656 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
658657 else nil
659658 ([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)
660659 }
661660 else throw("Already minted")
662661 }
663662 }
664663 }
665664
666665
667666
668667 @Callable(i)
669668 func flagArtwork (artId,addr,flag,note) = {
670- let $t02523825272 = idCallerDate(i)
671- let id = $t02523825272._1
672- let caller = $t02523825272._2
669+ let $t02545125485 = idCallerDate(i)
670+ let id = $t02545125485._1
671+ let caller = $t02545125485._2
673672 if (containsElement([chris, toString(this)], caller))
674673 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
675674 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
676675 else throw(("Unknow status " + flag))
677676 else throw("You are not allowed")
678677 }
679678
680679
681680
682681 @Callable(i)
683682 func deleteArtwork (artId,addr) = {
684- let $t02570825742 = idCallerDate(i)
685- let id = $t02570825742._1
686- let caller = $t02570825742._2
683+ let $t02592125955 = idCallerDate(i)
684+ let id = $t02592125955._1
685+ let caller = $t02592125955._2
687686 let addrToUse = if (containsElement([chris, toString(this)], caller))
688687 then addr
689688 else caller
690689 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
691690 if ((entryExist == ""))
692691 then throw("No art matching for this address")
693692 else {
694693 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
695694 if ((sha256Hash == ""))
696695 then throw("No art hash matching for this address")
697696 else {
698697 let signID = getStringByKey(keySignID(addrToUse, artId))
699698 if ((signID == ""))
700699 then throw("No SIGN ID matching")
701700 else {
702701 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))]
703702 if (!(isArtMinted(addrToUse, artId)))
704703 then if (!(dappRunning))
705704 then throw(maintenanceMSG)
706705 else dataToDelete
707706 else if (containsElement([chris, toString(this)], caller))
708707 then dataToDelete
709708 else throw("Art already minted, you cannot delete it")
710709 }
711710 }
712711 }
713712 }
714713
715714
716715
717716 @Callable(i)
718717 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
719- let $t02857828648 = idCallerDateSponsored(i, pubKey)
720- let id = $t02857828648._1
721- let caller = $t02857828648._2
722- let date = $t02857828648._3
723- let isSponsored = $t02857828648._4
718+ let $t02879128861 = idCallerDateSponsored(i, pubKey)
719+ let id = $t02879128861._1
720+ let caller = $t02879128861._2
721+ let date = $t02879128861._3
722+ let isSponsored = $t02879128861._4
724723 let artworkName = getStringByKey(keyName(caller, artId))
725724 if ((artworkName == ""))
726725 then throw("This art doesn't match your account")
727726 else {
728727 let flag = getStringByKey(keyFlag(caller, artId))
729728 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
730729 then throw("Flagged artwork")
731730 else {
732731 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
733732 if ((0 > blockEnd))
734733 then throw("Negative end")
735734 else if (if ((blockEnd > 0))
736735 then if ((maxMint != 1))
737736 then true
738737 else (price != 0)
739738 else false)
740739 then throw("Timed offer only allowed for unique edition and offer only")
741740 else {
742741 let baseHeight = if ((blockEnd == 0))
743742 then 0
744743 else height
745744 if (!(acceptedAssetIds(assetId)))
746745 then throw("Something went wrong!")
747746 else if (!(validateMinSell(assetId, price)))
748747 then throw("Something went wrong!")
749748 else {
750749 let checkUser = validateUser(caller)
751750 if ((checkUser != ""))
752751 then throw(checkUser)
753752 else {
754753 let amountSold = getIntegerByKey(keyIssued(caller, artId))
755754 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
756755 if ((maxMint > 100))
757756 then throw("100 editions max per artwork")
758757 else if (if ((amountSold != 0))
759758 then (amountSold == maxCanSell)
760759 else false)
761760 then throw("Max edition reached.")
762761 else if (if ((amountSold > 0))
763762 then (maxCanSell != maxMint)
764763 else false)
765764 then throw("Cannot change maximum issuable anymore")
766765 else if (if ((bidNbr > 0))
767766 then (maxCanSell != maxMint)
768767 else false)
769768 then throw("Cannot change maximum issuable with active orders")
770769 else {
771770 let sellStatus = if (if ((price > 0))
772771 then (maxMint > 0)
773772 else false)
774773 then true
775774 else false
776775 let txToCaller = if (isSponsored)
777776 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
778777 else nil
779778 ([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)
780779 }
781780 }
782781 }
783782 }
784783 }
785784 }
786785 }
787786
788787
789788
790789 @Callable(i)
791-func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "")
790+func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", "")
792791
793792
794793
795794 @Callable(i)
796795 func setBid (artId,issuer) = {
797- let $t03102631066 = idCallerDate(i)
798- let id = $t03102631066._1
799- let caller = $t03102631066._2
800- let date = $t03102631066._3
801- let $t03107131107 = isPayment(i)
802- let payment = $t03107131107._1
803- let amount = $t03107131107._2
796+ let $t03124331283 = idCallerDate(i)
797+ let id = $t03124331283._1
798+ let caller = $t03124331283._2
799+ let date = $t03124331283._3
800+ let $t03128831324 = isPayment(i)
801+ let payment = $t03128831324._1
802+ let amount = $t03128831324._2
804803 let assetId = if (!(isDefined(payment.assetId)))
805804 then "WAVES"
806805 else toBase58String(value(payment.assetId))
807806 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
808807 if (if ((blockEnd != 0))
809808 then (height >= blockEnd)
810809 else false)
811810 then throw("Sale ended.")
812811 else {
813812 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
814813 if (!(acceptedAssetIds(assetId)))
815814 then throw("asset not accepted")
816815 else if (!(validateMinSell(assetId, amount)))
817816 then throw("Wrong min sell")
818817 else {
819818 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
820819 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
821820 if ((0 >= maxCanSell))
822821 then throw("No max edition set for this artwork")
823822 else if ((amountSold >= maxCanSell))
824823 then throw("Sold out, you cannot bid")
825824 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
826825 }
827826 }
828827 }
829828
830829
831830
832831 @Callable(i)
833-func acceptBid (artId,issuer,bidId,bidOwner) = {
834- let $t03226532305 = idCallerDate(i)
835- let id = $t03226532305._1
836- let caller = $t03226532305._2
837- let date = $t03226532305._3
832+func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = {
833+ let $t03254432614 = idCallerDateSponsored(i, pubKey)
834+ let id = $t03254432614._1
835+ let caller = $t03254432614._2
836+ let date = $t03254432614._3
837+ let isSponsored = $t03254432614._4
838838 if ((caller != issuer))
839839 then throw("You cannot do this action")
840- else buyMint(i, artId, issuer, bidId, bidOwner)
840+ else buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
841841 }
842842
843843
844844
845845 @Callable(i)
846846 func cancelBid (artId,issuer,bidId,bidOwner) = {
847- let $t03253132592 = idCallerDate(i)
848- let id = $t03253132592._1
849- let caller = $t03253132592._2
850- let date = $t03253132592._3
847+ let $t03284832909 = idCallerDate(i)
848+ let id = $t03284832909._1
849+ let caller = $t03284832909._2
850+ let date = $t03284832909._3
851851 if (if ((caller != bidOwner))
852852 then (caller != issuer)
853853 else false)
854854 then throw("You cannot do this action")
855855 else {
856856 let returnMoneyTo = if ((caller == issuer))
857857 then bidOwner
858858 else caller
859859 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
860860 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
861861 let bidData = getStringByKey((bidDataKey + "_OPEN"))
862862 if ((bidData == ""))
863863 then throw("Bid not found")
864864 else {
865865 let bidDataArr = split(bidData, "_")
866866 let assetId = getBidAssetId(bidDataArr[0])
867867 let bidStatus = "CANCELED"
868868 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
869869 }
870870 }
871871 }
872872
873873
874874 @Verifier(tx)
875875 func verifier () = match tx {
876876 case inv: InvokeScriptTransaction =>
877877 if (if (if (if ((inv.function == "addArtwork"))
878878 then (inv.dApp == this)
879879 else false)
880880 then (inv.fee == 500000)
881881 else false)
882882 then (inv.feeAssetId == unit)
883883 else false)
884884 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[13])))
885885 else if (if (if (if ((inv.function == "updateArtwork"))
886886 then (inv.dApp == this)
887887 else false)
888888 then (inv.fee == 500000)
889889 else false)
890890 then (inv.feeAssetId == unit)
891891 else false)
892892 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
893893 else if (if (if (if ((inv.function == "sellArtwork"))
894894 then (inv.dApp == this)
895895 else false)
896896 then (inv.fee == 500000)
897897 else false)
898898 then (inv.feeAssetId == unit)
899899 else false)
900900 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
901901 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
902902 case _ =>
903903 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
904904 }
905905

github/deemru/w8io/169f3d6 
112.41 ms