tx · y7M51j4x6jCigSSUbsTWRQYBsfqaeqbuw345rUvMFaM

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.01900000 Waves

2023.03.24 06:32 [2503551] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "y7M51j4x6jCigSSUbsTWRQYBsfqaeqbuw345rUvMFaM", "fee": 1900000, "feeAssetId": null, "timestamp": 1679628733555, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "5eApY9H5Vi1UeBy73UGpRegjBknQ2cXhMG8V9nnuKpytSZcJCfraWGgqi1wrP4mszeXr9E3YETNsxvvoUMMjorQX" ], "script": "base64:BgL1FAgCEgQKAggIEhAKDggICAgICAgICAgICAEIEg8KDQgICAgICAgICAgIAQgSBgoECAgICBIECgIICBIICgYIAQEIAQgSBAoCCAgSBAoCCAgSBwoFCAgICAgSBgoECAgICCIOZ2V0U3RyaW5nQnlLZXkiA2tleSIIdW5pdFRlc3QiCW9yYWNsZUZlZSIIc2lnbkRhcHAiC2ZlZVJlY2VpdmVyIgh1c2VyRGFwcCINd2hpdGVsaXN0RGFwcCILc2lnbkFzc2V0SWQiC3VzZG5Bc3NldElkIgt1c2R0QXNzZXRJZCIMd2F2ZXNBc3NldElkIgVjaHJpcyIZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZSIPZ2V0SW50ZWdlckJ5S2V5Ig5jaGVja1doaXRlbGlzdCIPZ2V0Qm9vbGVhbkJ5S2V5IgdzaWduQ3V0Igt1c2RuV2F2ZUN1dCIOZGVmYXVsdExpY2VuY2UiEmRlZmF1bHRIYXNoTGljZW5jZSILZGFwcFJ1bm5pbmciDm1haW50ZW5hbmNlTVNHIg11c2VyU3VzcGVuZGVkIgt1c2VyUmVtb3ZlZCIQdXNlclVucmVnaXN0ZXJlZCILdXNlckFsbG93ZWQiGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UiFGNoZWNrU2lnbkNlcnRpZmljYXRlIgZzaWduSUQiBU93bmVyIgpzaGEyNTZIYXNoIgckbWF0Y2gwIgFhIgt2YWxpZGF0ZUNJRCIDY2lkIgx2YWxpZGF0ZUhhc2giBGhhc2giDWtleVVzZXJTdGF0dXMiBmNhbGxlciIHa2V5RGF0ZSIFYXJ0SWQiB2tleU5hbWUiB2tleURlc2MiDWtleURpc3BsYXlDaWQiDWtleUV4cG9ydEhhc2giDGtleUV4cG9ydENpZCIKa2V5TWF4TWludCIJa2V5U2lnbklEIglrZXlJc3N1ZWQiCWtleU9uU2FsZSIOa2V5TGljZW5jZUhhc2giDWtleUxpY2VuY2VDaWQiB2tleVRhZ3MiB2tleVR5cGUiB2tleU5vdGUiCmtleUNyYXdsZXIiDGtleVJveWFsdGllcyIIa2V5UHJpY2UiCmtleUVuZFNhbGUiEmtleUFzc2V0SWRBY2NlcHRlZCIHa2V5RmxhZyISa2V5QXJ0aXN0QWdlbnRBZGRyIgphcnRpc3RBZGRyIhRrZXlQcmltYXJ5U2hhcmVBZ2VudCIYa2V5QXJ0aXN0UHVibGljQWdlbnRBZGRyIhprZXlQcmltYXJ5U2hhcmVQdWJsaWNBZ2VudCIRa2V5SGFzaEJ5VHhpZEFkZHIiBHR4aWQiDmtleU93bmVyQnlIYXNoIg1rZXlpZEJ5U2lnbmlkIgZzaWduSWQiEmtleVR4aWRCeUhhc2hPd25lciIOdmFsaWRhdGVBbGxDSUQiCmNpZERpc3BsYXkiCWNpZEV4cG9ydCIKY2lkTGljZW5jZSIPdmFsaWRhdGVBbGxIYXNoIgxzaGEyNTZFeHBvcnQiDXNoYTI1NkxpY2VuY2UiDnZhbGlkYXRlU3RyaW5nIgNzdHIiA21heCIMdmFsaWRhdGVVc2VyIgp1c2VyU3RhdHVzIgpzZXRMSWNlbmNlIhN2YWxpZGF0ZUFydHdvcmtEYXRhIgpsaWNlbmNlQ0lEIgtsaWNlbmNlSGFzaCIEbmFtZSILZGVzY3JpcHRpb24iBHRhZ3MiCXJveWFsdGllcyIJY2hlY2tVc2VyIglpc1BheW1lbnQiAWkiB3BheW1lbnQiBmFtb3VudCIPdmFsaWRhdGVQYXltZW50IgskdDA5MTgwOTIxNiIHYXNzZXRJZCILaXNBcnRNaW50ZWQiCWFkZHJUb1VzZSIBYiIUdmFsaWRhdGVQcmljZUFzc2V0SWQiDHByaWNlQXNzZXRJZCIMYXJ0d29ya1ByaWNlIgskdDA5ODA0OTg0MCIQYWNjZXB0ZWRBc3NldElkcyIPdmFsaWRhdGVNaW5TZWxsIgVwcmljZSIMbWluU2VsbFdhdmVzIgttaW5TZWxsVXNkbiILbWluU2VsbFNpZ24iDWdldEJpZEFzc2V0SWQiFmdldFByaWNlQXNzZXRJZEZyb21CaWQiCmJpZERhdGFLZXkiB2JpZERhdGEiCmJpZERhdGFBcnIiCWJpZEFtb3VudCIKYmlkQXNzZXRJZCIVaWRDYWxsZXJEYXRlU3BvbnNvcmVkIgZwdWJLZXkiC2lzU3BvbnNvcmVkIhNnZXRfc3BvbnNvcmVkX3dhdmVzIgxpZENhbGxlckRhdGUiB2J1eU1pbnQiBmlzc3VlciIFYmlkSWQiCGJpZE93bmVyIg0kdDAxMzA4MTEzMTcwIgJpZCIEZGF0ZSIFaXNCaWQiCGJsb2NrRW5kIg5jYWxsZXJJc0lzc3VlciIIdG90YWxORlQiC2FydHdvcmtOYW1lIghpc09uU2FsZSIKYW1vdW50U29sZCIKbWF4Q2FuU2VsbCINJHQwMTQ3NzMxNDk2NSIFYWdlbnQiCmFnZW50U2hhcmUiC3B1YmxpY0FnZW50IhBwdWJsaWNBZ2VudFNoYXJlIg1pc1doaXRlbGlzdGVkIgNjdXQiDWFtb3VudEZvclNpZ24iDmFtb3VudEZvckFnZW50IhRhbW91bnRGb3JQdWJsaWNBZ2VudCIQYW1vdW50Rm9yQ3JlYXRvciINbmV3QW1vdW50U29sZCIJaXNzdWVNZXRhIghpc3N1ZU5GVCIFaWRORlQiCnNlbGxTdGF0dXMiCnJlY2VpdmVORlQiCmFzc2V0SWRCaWQiCWJpZERlbE9sZCIJYmlkVXBkYXRlIgdzb2xkS2V5Iglzb2xkVmFsdWUiCHNvbGREYXRhIhRjb21taXNzaW9uc1dpdGhBZ2VudCIaY29tbWlzc2lvbnNXaXRoUHVibGljQWdlbnQiCnR4VG9DYWxsZXIiBmJ1eVJlcyIIYXNTdHJpbmciAmJ2IgNidjAiBmludm9rZSIDdmFsIgR0eXBlIgdjcmF3bGVyIg0kdDAyMDE0MTIwMjE0Ig0kdDAyMDMxNTIwMzg0Ig92YWxpZGF0ZUFydHdvcmsiEHdoaXRlbGlzdGVkX2Ryb3AiDSR0MDIwNjgzMjA3NjciCmVudHJ5RXhpc3QiCWhhc2hFeGlzdCIPaXNTaWduQ2VydGlmaWVkIhdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcCINJHQwMjM4MDEyMzg3MSINJHQwMjM4ODEyMzk1MCIEZmxhZyIEYWRkciIEbm90ZSINJHQwMjU1NzcyNTYxMSINJHQwMjYwNDcyNjA4MSIMZGF0YVRvRGVsZXRlIgdtYXhNaW50Ig0kdDAyODkxNzI4OTg3IgZiaWROYnIiCmJhc2VIZWlnaHQiDSR0MDMxMzY5MzE0MDkiDSR0MDMxNDE0MzE0NTAiDSR0MDMyNjcwMzI3NDAiDSR0MDMyOTc0MzMwMzUiDXJldHVybk1vbmV5VG8iCWJpZFN0YXR1cyICdHgiCHZlcmlmaWVyIgNpbnZOAQFhAQFiCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFAWICAAABYwcAAWQJAQV2YWx1ZQEJAKYIAQkBAWEBAg9jb25mX29yYWNsZV9mZWUAAWUJAQV2YWx1ZQEJAKYIAQkBAWEBAhFjb25mX3NpZ253ZWJfZGFwcAABZgkBAWEBAhFjb25mX2ZlZV9yZWNlaXZlcgABZwMFAWMJAQV2YWx1ZQEJAKYIAQIjM010NFJHTUV5alNXWUFvY1RQcWQ1NXdkSFFRQjNQVTJVQ20JAQV2YWx1ZQEJAKYIAQkBAWEBAg9jb25mX3VzZXJzX2RhcHAAAWgJAQV2YWx1ZQEJAKYIAQkBAWEBAhNjb25mX3doaXRlbGlzdF9kYXBwAAFpCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9TSUdOAAFqCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9VU0ROAAFrCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9VU0RUAAFsAQAAAW0JAQFhAQIMY29uZl9hZG1pbl8xAQFuAQFiCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUBZAUBYgIfSW50ZWdlciB1bmRlZmluZSBvciAwIGluIG9yYWNsZQEBbwEBYgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFiAAABAXABAWIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUBaAUBYgAAAQFxAQFiCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFAWIHAAFyAAcAAXMACgABdAkBAWEBAhRjb25mX2RlZmF1bHRfbGljZW5jZQABdQkBAWEBAhljb25mX2RlZmF1bHRfbGljZW5jZV9oYXNoAAF2CQELdmFsdWVPckVsc2UCCQCbCAIFAWcCFGNvbmZfZGFwcF9pc19ydW5uaW5nBgABdwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQFnAhRjb25mX21haW50ZW5hbmNlX21zZwIAAAF4AglTVVNQRU5ERUQAAXkCB1JFTU9WRUQAAXoCDFVOUkVHSVNURVJFRAABQQIHQUxMT1dFRAABQgkBAW4BCQCsAgICEmNlcnRpZmljYXRpb25fZmVlXwkA2AQBBQFpAQFDAwFEAUUBRgQBRwkAnQgCBQFlCQCsAgIJAKwCAgkArAICAghkYXRhX2ZjXwUBRAIBXwUBRQMJAAECBQFHAgZTdHJpbmcEAUgFAUcDCQEIY29udGFpbnMCBQFIBQFGBgcHAQFJAQFKAwkBCGNvbnRhaW5zAgUBSgIBLwMDCQBmAgBMCQCxAgEFAUoJAAACCQCxAgEJAJEDAgkAtQkCBQFKAgEvAAAAOwcJAGYCABAJALECAQkAkQMCCQC1CQIFAUoCAS8AAQcHAQFLAQFMCQAAAgkAsQIBBQFMAEABAU0BAU4JAKwCAgIMdXNlcl9zdGF0dXNfBQFOAQFPAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF9kYXRlXwUBUAIBXwUBTgEBUQIBTgFQCQCsAgIJAKwCAgkArAICAglhcnRfbmFtZV8FAVACAV8FAU4BAVICAU4BUAkArAICCQCsAgIJAKwCAgIJYXJ0X2Rlc2NfBQFQAgFfBQFOAQFTAgFOAVAJAKwCAgkArAICCQCsAgICEGFydF9kaXNwbGF5X2NpZF8FAVACAV8FAU4BAVQCAU4BUAkArAICCQCsAgIJAKwCAgIQYXJ0X2V4cG9ydF9oYXNoXwUBUAIBXwUBTgEBVQIBTgFQCQCsAgIJAKwCAgkArAICAg9hcnRfZXhwb3J0X2NpZF8FAVACAV8FAU4BAVYCAU4BUAkArAICCQCsAgIJAKwCAgIMYXJ0X21heG1pbnRfBQFQAgFfBQFOAQFXAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9zaWduaWRfBQFQAgFfBQFOAQFYAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9pc3N1ZWRfBQFQAgFfBQFOAQFZAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9vbnNhbGVfBQFQAgFfBQFOAQFaAgFOAVAJAKwCAgkArAICCQCsAgICEWFydF9saWNlbmNlX2hhc2hfBQFQAgFfBQFOAQJhYQIBTgFQCQCsAgIJAKwCAgkArAICAhBhcnRfbGljZW5jZV9jaWRfBQFQAgFfBQFOAQJhYgIBTgFQCQCsAgIJAKwCAgkArAICAglhcnRfdGFnc18FAVACAV8FAU4BAmFjAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF90eXBlXwUBUAIBXwUBTgECYWQCAU4BUAkArAICCQCsAgIJAKwCAgIJYXJ0X25vdGVfBQFQAgFfBQFOAQJhZQIBTgFQCQCsAgIJAKwCAgkArAICAhBhcnRfY3Jhd2xlcl9jaWRfBQFQAgFfBQFOAQJhZgIBTgFQCQCsAgIJAKwCAgkArAICAg5hcnRfcm95YWx0aWVzXwUBUAIBXwUBTgECYWcCAU4BUAkArAICCQCsAgIJAKwCAgIKYXJ0X3ByaWNlXwUBUAIBXwUBTgECYWgCAU4BUAkArAICCQCsAgIJAKwCAgIMYXJ0X2VuZHNhbGVfBQFQAgFfBQFOAQJhaQIBTgFQCQCsAgIJAKwCAgkArAICAhJhcnRfYXNzZXRBY2NlcHRlZF8FAVACAV8FAU4BAmFqAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF9mbGFnXwUBUAIBXwUBTgECYWsBAmFsCQCsAgICDWFydGlzdF9hZ2VudF8FAmFsAQJhbQECYWwJAKwCAgIVYXJ0aXN0X2FnZW50X3ByaW1hcnlfBQJhbAECYW4BAmFsCQCsAgICFGFydGlzdF9wdWJsaWNfYWdlbnRfBQJhbAECYW8BAmFsCQCsAgICHGFydGlzdF9wdWJsaWNfYWdlbnRfcHJpbWFyeV8FAmFsAQJhcAIBTgJhcQkArAICCQCsAgIJAKwCAgITZ2V0X2hhc2hieXR4aWRhZGRyXwUCYXECAV8FAU4BAmFyAQFGCQCsAgICEmdldF9vd25lcl9ieV9oYXNoXwUBRgECYXMCAU4CYXQJAKwCAgkArAICCQCsAgICEmdldF9hcnRpZGJ5c2lnbmlkXwUCYXQCAV8FAU4BAmF1AgFGAU4JAKwCAgIXZ2V0X3R4aWRfYnlfaGFzaF9vd25lcl8JANgEAQkA1BYBCQCbAwEJAKwCAgUBRgUBTgECYXYDAmF3AmF4AmF5AwkBASEBCQEBSQEFAmF3CQACAQIRV3JvbmcgRGlzcGxheSBDSUQDCQEBIQEJAQFJAQUCYXgJAAIBAhBXcm9uZyBFeHBvcnQgQ0lEAwMJAQIhPQIFAmF5AgAJAQEhAQkBAUkBBQJheQcJAAIBAhFXcm9uZyBMaWNlbmNlIENJRAYBAmF6AgJhQQJhQgMJAQEhAQkBAUsBBQJhQQkAAgECGEV4cG9ydCBIYXNoIDY0IGNoYXIuIG1heAMJAQEhAQkBAUsBBQJhQgkAAgECGUxpY2VuY2UgSGFzaCA2NCBjaGFyLiBtYXgGAQJhQwICYUQCYUUDCQAAAgkAsQIBBQJhRAAACQACAQIYRmllbGQgY2Fubm90IGJlIGlzIGVtcHR5AwkAZgIJALECAQUCYUQFAmFFCQACAQkArAICBQJhRAIMIGlzIHRvbyBsb25nBgECYUYBAU4EAmFHCQELdmFsdWVPckVsc2UCCQCdCAIFAWcJAQFNAQUBTgUBegMDCQAAAgUCYUcFAXoGCQAAAgUCYUcFAUECLlJlZ2lzdGVyIHRoaXMgYWNjb3VudCBmaXJzdCB3aXRoICJBY2NvdW50IiB0YWIDCQAAAgUCYUcFAXgCEUFjY291bnQgc3VzcGVuZGVkAwkAAAIFAmFHBQF5Ag9BY2NvdW50IHJlbW92ZWQCAAECYUgCAmF5AmFCBAFKAwkAAAIJALECAQUCYXkAAAUBdAUCYXkEAUwDCQAAAgkAsQIBBQJhQgAABQF1BQJhQgkAlAoCBQFKBQFMAQJhSQoBTgJhdwJheAJhSgJhQQJhSwJhTAJhTQJhTgJhTwQCYVAJAQJhRgEFAU4DCQECIT0CBQJhUAIACQACAQUCYVADCQAAAgkAsQIBBQJhdwAACQACAQIbRGlzcGxheSBDSUQgY2Fubm90IGJlIGVtcHR5AwkBASEBCQECYXYDBQJhdwUCYXgFAmFKCQACAQIQUHJvYmxlbSB3aXRoIENJRAMJAQEhAQkBAmF6AgUCYUEFAmFLCQACAQITUHJvYmxlbSB3aXRoIEhhc2hlcwMJAQEhAQkBAmFDAgUCYUwAZAkAAgECEjEwMCBDaGFyLiBtYXggbmFtZQMJAQEhAQkBAmFDAgUCYU0A6AcJAAIBAhoxMDAwIENoYXIuIG1heCBkZXNjcmlwdGlvbgMDCQBmAgAABQJhTwYJAGYCBQJhTwDoBwkAAgECM1JveWFsdGllcyBjYW5ub3QgYmUgbGVzcyB0aGFuIDAlIG9yIGhpZ2hlciB0aGFuIDEwJQMJAGYCCQCQAwEJALUJAgUCYU4CASwABQkAAgECCzUgdGFncyBtYXguAgABAmFRAQJhUgMJAAACCQCQAwEIBQJhUghwYXltZW50cwAACQACAQITTm8gcGF5bWVudCBhdHRhY2hlZAQCYVMJAQV2YWx1ZQEJAJEDAggFAmFSCHBheW1lbnRzAAAEAmFUCQEFdmFsdWUBCAUCYVMGYW1vdW50CQCUCgIFAmFTBQJhVAECYVUBAmFSBAJhVgkBAmFRAQUCYVIEAmFTCAUCYVYCXzEEAmFUCAUCYVYCXzIEAmFXAwMJAQlpc0RlZmluZWQBCAUCYVMHYXNzZXRJZAkAAAIIBQJhUwdhc3NldElkBQFpBwgFAmFTB2Fzc2V0SWQJAAIBAitPbmx5IFNJR04gdG9rZW4gYWNjZXB0ZWQgYXMgdHJhbnNhY3Rpb24gZmVlAwkBAiE9AgUCYVQFAUIJAAIBCQCsAgICGVBheW1lbnQgYW1vdW50IHNob3VsZCBiZSAJAKQDAQUBQgkAlAoCBQJhVAUCYVcBAmFYAgJhWQFQBAFHCQCaCAIFBHRoaXMJAQFYAgUCYVkFAVADCQABAgUBRwIDSW50BAJhWgUBRwMJAQIhPQIFAmFaAAAGBwcBAmJhAwJhUgJiYgJiYwQCYmQJAQJhUQEFAmFSBAJhUwgFAmJkAl8xBAJhVAgFAmJkAl8yBAJhVwMJAQEhAQkBCWlzRGVmaW5lZAEIBQJhUwdhc3NldElkBQR1bml0AwMJAGYCCQCxAgEFAmJiAAAJAAACCQDYBAEJAQV2YWx1ZQEIBQJhUwdhc3NldElkBQJiYgcIBQJhUwdhc3NldElkCQACAQIOV3JvbmcgYXNzZXQgaWQDAwkAAAIFAmFXBQR1bml0CQECIT0CBQJiYgIABwkAAgECDldyb25nIGFzc2V0IGlkAwkBAiE9AgUCYmMFAmFUCQACAQITUGF5bWVudCBkb24ndCBtYXRjaAkAlAoCBQJhVAUCYVcBAmJlAQJhVwMDAwMDCQECIT0CBQJhVwkA2AQBBQFpCQECIT0CBQJhVwkA2AQBBQFsBwkBAiE9AgUCYVcCBVdBVkVTBwkBAiE9AgUCYVcJANgEAQUBagcJAQIhPQIFAmFXCQDYBAEFAWsHCQACAQImT25seSBTSUdOLCBVU0ROLFVTRFQgb3IgV0FWRVMgYWNjZXB0ZWQGAQJiZgICYVcCYmcEAmJoAwUBYwAKCQEBbgECDndhdmVzX21pbl9zZWxsBAJiaQDAhD0EAmJqAwUBYwABCQBoAgUBQgACAwMDAwMDCQAAAgUCYVcJANgEAQUBagkAZgIFAmJpBQJiZwcJAQIhPQIFAmJnAAAHBgMDCQAAAgUCYVcJANgEAQUBawkAZgIFAmJpBQJiZwcJAQIhPQIFAmJnAAAHBgMDCQAAAgUCYVcJANgEAQUBaQkAZgIFAmJqBQJiZwcJAQIhPQIFAmJnAAAHBgMDAwkAAAIFAmFXCQDYBAEFAWwGCQAAAgUCYVcCBVdBVkVTCQBmAgUCYmgFAmJnBwkBAiE9AgUCYmcAAAcJAAIBAhhXcm9uZyBtaW5pbXVtIHNlbGwgcHJpY2UGAQJiawECYVcDCQAAAgUCYVcCBVdBVkVTBQR1bml0CQDZBAEFAmFXAQJibAECYm0EAmJuCQEBYQEJAKwCAgUCYm0CBV9PUEVOAwkAAAIFAmJuAgAJAAIBAg1CaWQgbm90IGZvdW5kBAJibwkAtQkCBQJibgIBXwQCYnAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJibwABBAJicQkBAmJrAQkAkQMCBQJibwAAAwkAZwIAAAUCYnAJAAIBAgxXcm9uZyBhbW91bnQJAJQKAgUCYnAFAmJxAQJicgICYVICYnMDCQEBIQEFAXYJAAIBBQF3BAJidAMJAQIhPQIFAmJzAgAJAQt2YWx1ZU9yRWxzZQIJAQFwAQkArAICCQClCAEJAKcIAQkA2QQBBQJicwIJX2ZyZWVfdHhzAAAAAAQBTgMDCQAAAgkA2AQBCAgFAmFSBmNhbGxlcgVieXRlcwkApQgBBQR0aGlzCQBmAgUCYnQAAAcJAKUIAQkApwgBCQDZBAEFAmJzCQDYBAEICAUCYVIGY2FsbGVyBWJ5dGVzBAJidQMDCQECIT0CBQJicwIACQBmAgUCYnQAAAcJAPwHBAUBaAIJdXNlRnJlZVR4CQDMCAIJAKUIAQkApwgBCQDZBAEFAmJzBQNuaWwFA25pbAUEdW5pdAMJAAACBQJidQUCYnUDBgkAAgEFAU4JAJYKBAkA2AQBCAUCYVINdHJhbnNhY3Rpb25JZAUBTggFCWxhc3RCbG9jawl0aW1lc3RhbXAJAGYCBQJidAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJidgECYVIDCQEBIQEFAXYJAAIBBQF3CQCVCgMJANgEAQgFAmFSDXRyYW5zYWN0aW9uSWQJANgEAQgIBQJhUgZjYWxsZXIFYnl0ZXMIBQlsYXN0QmxvY2sJdGltZXN0YW1wAQJidwYCYVIBUAJieAJieQJiegJicwQCYkEJAQJicgIFAmFSBQJicwQCYkIIBQJiQQJfMQQBTggFAmJBAl8yBAJiQwgFAmJBAl8zBAJidAgFAmJBAl80AwYJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQFOAgMgLyAFAmJ4AgMgLyAFAmJ6AgMgLyAFAmJzBAJiRAMDAwkAAAIFAU4FAmJ4CQECIT0CBQJiegIABwkBAiE9AgUCYnkCAAcGBwQCYkUJAQFvAQkBAmFoAgUBTgUBUAMDAwkBAiE9AgUCYkUAAAkAZwIFBmhlaWdodAUCYkUHCQEBIQEFAmJEBwkAAgECC1NhbGUgZW5kZWQuBAJiRgkAAAIFAU4FAmJ4BAJiRwkBAW8BAhB0b3RhbF9uZnRfaXNzdWVkBAFECQEBYQEJAQFXAgUCYngFAVAEAmJICQEBYQEJAQFRAgUCYngFAVADCQAAAgUCYkgCAAkAAgECEUFydCBkb2Vzbid0IGV4aXN0BAJiSQkBAXEBCQEBWQIFAmJ4BQFQBAJiSgkBAW8BCQEBWAIFAmJ4BQFQBAJiYwMFAmJGCQBoAgUBQgACCQEBbwEJAQJhZwIFAmJ4BQFQBAJiYgMFAmJGCQDYBAEFAWkJAQFhAQkBAmFpAgUCYngFAVAEAmJLCQEBbwEJAQFWAgUCYngFAVADAwMJAQEhAQUCYkQJAQEhAQUCYkYHAwMJAGcCAAAFAmJjBgkBASEBBQJiSQYJAGcCAAAFAmJLBwkAAgECEEFydCBub3QgZm9yIHNhbGUDAwMJAQEhAQUCYkQFAmJGBwkAZwIAAAUCYksHCQACAQIUTWF4IGlzc3VhYmxlIG5vdCBzZXQEAmFQCQECYUYBBQJieAMDBQJiRAkBAiE9AgUCYVACAAcJAAIBBQJhUAQCYm0JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUBUAIBXwUCYngCAV8FAmJ6AgFfBQJieQQCYkwDBQJiRAkBAmJsAQUCYm0JAQJiYQMFAmFSBQJiYgUCYmMEAmFUCAUCYkwCXzEEAmFXCAUCYkwCXzIEAmJNCQELdmFsdWVPckVsc2UCCQCdCAIFAWcJAQJhawEFAmJ4BQFmBAJiTgkBC3ZhbHVlT3JFbHNlAgkAmggCBQFnCQECYW0BBQJieAAABAJiTwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQFnCQECYW4BBQJieAUBZgQCYlAJAQt2YWx1ZU9yRWxzZQIJAJoIAgUBZwkBAmFvAQUCYngAAAQCYlEJAQFwAQUCYngEAmJSAwkAZgIFAmJRBQZoZWlnaHQAAAMJAAACBQJhVwUBaQUBcgUBcwQCYlMJAGsDBQJhVAUCYlIAZAQCYlQDAwMJAQIhPQIFAmJNBQFmCQBmAgUCYk4AAAcJAGYCBQZoZWlnaHQFAmJRBwkAawMFAmFUBQJiTgCQTgAABAJiVQMDAwkBAiE9AgUCYk8FAWYJAGYCBQJiUAAABwkAZgIFBmhlaWdodAUCYlEHCQBrAwUCYVQFAmJQAJBOAAAEAmJWCQBlAgUCYVQFAmJTAwkAAAIFAmJKBQJiSwkAAgECDEFydCBzb2xkIG91dAQCYlcJAGQCBQJiSgABBAJiWAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCUNyZWF0b3I6IAUCYngCCiwKIEFydElEOiAFAVACCywKIFNpZ25JRDogBQFEAhEsCiBBcnR3b3JrIG5hbWU6IAUCYkgCCiwKIElzc3VlOiAJAKQDAQUCYlcCAS8JAKQDAQUCYksEAmJZCQDCCAUJAKwCAgIDU0FfCQCkAwEJAGQCBQJiRwABBQJiWAABAAAHBAJiWgkAuAgBBQJiWQQCY2EDAwkAAAIFAmJXBQJiSwYJAQEhAQUCYkkHBgQCY2IDAwMJAAACBQFOBQJieAkBAiE9AgUCYnoCAAcJAQIhPQIFAmJ5AgAHCQERQGV4dHJOYXRpdmUoMTA2MikBBQJieggFAmFSBmNhbGxlcgQCY2MDCQEBIQEJAQlpc0RlZmluZWQBBQJhVwIFV0FWRVMJANgEAQkBBXZhbHVlAQUCYVcEAmJuCQEBYQEJAKwCAgUCYm0CBV9PUEVOBAJjZAkBC0RlbGV0ZUVudHJ5AQkArAICBQJibQIFX09QRU4EAmNlCQELU3RyaW5nRW50cnkCCQCsAgIFAmJtAgdfQ0xPU0VECQCsAgIJAKwCAgUCYm4CAV8JAKQDAQUCYkMEAmNmCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCWFydF9zb2xkXwkApAMBBQJiVwIEX29mXwkApAMBBQJiSwIBXwUBUAIBXwUCYngEAmNnAwkBASEBBQJiRAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQFOAgFfCQCkAwEFAmJDAgFfBQJiQgIBXwkApAMBBQJiYwIBXwUCYmICAV8JANgEAQUCYloJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBBQJjYgIBXwkApAMBBQJiQwIBXwUCYkICAV8JAKQDAQUCYVQCAV8FAmNjAgFfCQDYBAEFAmJaBAJjaAkBC1N0cmluZ0VudHJ5AgUCY2YFAmNnBAJjaQMJAQIhPQIFAmJUAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAWYJAGUCBQJiUwUCYlQFAmFXCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQJiTQUCYlQFAmFXBQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAWYFAmJTBQJhVwUDbmlsBAJjagMJAQIhPQIFAmJVAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAmJPBQJiVQUCYVcJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAmJ4CQBlAgUCYlYFAmJVBQJhVwUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQJieAUCYlYFAmFXBQNuaWwEAmNrAwUCYnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAU4AAAUEdW5pdAUDbmlsBQNuaWwEAmNsCQDOCAIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBWAIFAmJ4BQFQBQJiVwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgICBG5mdF8JANgEAQUCYloFAmNmCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhB0b3RhbF9uZnRfaXNzdWVkCQBkAgUCYkcAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFoAgUCYngFAVAAAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAVkCBQJieAUBUAUCY2EJAMwIAgUCYlkJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCY2IAAQUCYloFA25pbAUCY2kFAmNqBQJjawMFAmJECQDMCAIFAmNoCQDMCAIFAmNlCQDMCAIFAmNkBQJjbAkAzAgCBQJjaAUCY2wBAmNtAQJjbgQBRwUCY24DCQABAgUBRwIGU3RyaW5nBAJjbwUBRwUCY28JAAIBAiRTcG9uc29yZWQgUHVibGljIEtleSBTdHJpbmcgZXhwZWN0ZWQKAmNwAQdzZXRDb25mAgFiAmNxBAFOCQClCAEIBQJjcAZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQFtCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQFOAwkBCGNvbnRhaW5zAgUBYgIFY29uZl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUBYgUCY3EFA25pbAkAAgECIEVudHJpZXMgc3RhcnRpbmcgd2l0aCBjb25mXyBvbmx5CQACAQIiWW91IGFyZSBub3QgYWxsb3dlZCB0byBjaGFuZ2UgdGhpcwJhUgEKYWRkQXJ0d29yaw4BRgFEAmFMAmFNAmFOAmNyAmF3AmFBAmF4AmFCAmF5AmNzAmFPAmJzBAJjdAkBAmJyAgUCYVIFAmJzBAFQCAUCY3QCXzEEAU4IBQJjdAJfMgQCYkMIBQJjdAJfMwQCYnQIBQJjdAJfNAMJAQEhAQkBAUsBBQFGCQACAQIkSGFzaCBzaG91bGQgYmUgNjQgY2hhcmFjdGVycyBtYXhpbXVtBAJjdQkBAmFIAgUCYXkFAmFCBAJhSggFAmN1Al8xBAJhSwgFAmN1Al8yBAJjdgkBAmFJCgUBTgUCYXcFAmF4BQJhSgUCYUEFAmFLBQJhTAUCYU0FAmFOBQJhTwMJAQIhPQIFAmN2AgAJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEEAmN3CQBmAgkBAXABCQCsAgIFAU4CC19mcmVlX2Ryb3BzAAAEAmN4AwUCY3cJAJQKAgAABQFECQECYVUBBQJhUgQCYVQIBQJjeAJfMQQCYVcIBQJjeAJfMgMJAQEhAQkBCWlzRGVmaW5lZAEFAmFUCQACAQIUU29tZXRoaW5nIHdlbnQgd3JvbmcEAmN5CQEBYQEJAQJhdQIFAUYFAU4DCQECIT0CBQJjeQIACQACAQIUWW91IGFscmVhZHkgYWRkZWQgaXQEAmN6CQEBYQEJAQJhcgEFAUYDCQECIT0CBQJjegIACQACAQIXSGFzaCBhbHJlYWR5IHJlZ2lzdGVyZWQEAmNBCQEBQwMFAUQFAU4FAUYDCQEBIQEFAmNBCQACAQIsU2lnbiBDZXJ0aWZpY2F0ZSBub3QgZm91bmQgZm9yIHRoaXMgYWRkcmVzcy4EAmNCAwUCY3cJAPwHBAUBaAILdXNlRnJlZURyb3AJAMwIAgUBTgUDbmlsBQNuaWwFBHVuaXQDCQAAAgUCY0IFAmNCBAJjawMFAmJ0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQFOAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFyAQUBRgUBTgkAzAgCCQELU3RyaW5nRW50cnkCCQECYXUCBQFGBQFOBQFQCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBTwIFAU4FAVAFAmJDCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFRAgUBTgUBUAUCYUwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVICBQFOBQFQBQJhTQkAzAgCCQELU3RyaW5nRW50cnkCCQEBUwIFAU4FAVAFAmF3CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFVAgUBTgUBUAUCYXgJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVQCBQFOBQFQBQJhQQkAzAgCCQELU3RyaW5nRW50cnkCCQEBWgIFAU4FAVAFAmFLCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYQIFAU4FAVAFAmFKCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYwIFAU4FAVAFAmNyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYgIFAU4FAVAFAmFOCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVgIFAU4FAVAAAAkAzAgCCQELU3RyaW5nRW50cnkCCQEBVwIFAU4FAVAFAUQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFYAgUBTgUBUAAACQDMCAIJAQxCb29sZWFuRW50cnkCCQEBWQIFAU4FAVAHCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhcwIFAU4FAUQFAVAJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFwAgUBTgUBUAUBRgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWUCBQFOBQFQBQJjcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFmAgUBTgUBUAUCYU8JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAWYFAmFUBQFpBQNuaWwFAmNrCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFSAQ11cGRhdGVBcnR3b3JrDQJhcQJhTAJhTQJhTgJjcgJhdwJhQQJheAJhQgJheQJjcwJhTwJicwMJAQEhAQUBdgkAAgEFAXcEAmNDCQECYnICBQJhUgUCYnMEAmJCCAUCY0MCXzEEAU4IBQJjQwJfMgQCYkMIBQJjQwJfMwQCYnQIBQJjQwJfNAQCY0QJAQJhSAIFAmF5BQJhQgQCYUoIBQJjRAJfMQQCYUsIBQJjRAJfMgQCY3YJAQJhSQoFAU4FAmF3BQJheAUCYUoFAmFBBQJhSwUCYUwFAmFNBQJhTgUCYU8DCQECIT0CBQJjdgIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAJjeQkBAWEBCQEBUQIFAU4FAmFxAwkAAAIFAmN5AgAJAAIBAg9FbnRyeSBub3QgZm91bmQEAmNFCQEBYQEJAQJhagIFAU4FAmFxAwkAAAIFAmNFAgdJTExFR0FMCQACAQIdQ2Fubm90IHVwZGF0ZSBJTExFR0FMIGFydHdvcmsDCQEBIQEJAQJhWAIFAU4FAmFxBAJjawMFAmJ0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQFOAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVECBQFOBQJhcQUCYUwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVICBQFOBQJhcQUCYU0JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVMCBQFOBQJhcQUCYXcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVUCBQFOBQJhcQUCYXgJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVQCBQFOBQJhcQUCYUEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFhAgUBTgUCYXEFAmFKCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFaAgUBTgUCYXEFAmFLCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYgIFAU4FAmFxBQJhTgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWMCBQFOBQJhcQUCY3IJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFlAgUBTgUCYXEFAmNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWYCBQFOBQJhcQUCYU8FA25pbAUCY2sJAAIBAg5BbHJlYWR5IG1pbnRlZAJhUgELZmxhZ0FydHdvcmsEAVACY0YCY0UCY0cEAmNICQECYnYBBQJhUgQCYkIIBQJjSAJfMQQBTggFAmNIAl8yAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUBbQkAzAgCCQClCAEFBHRoaXMFA25pbAUBTgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAICB0NPTlNFTlQJAMwIAgIACQDMCAICD0NIQU5HRV9SRVFVSVJFRAkAzAgCAgdGTEFHR0VECQDMCAICB0lMTEVHQUwFA25pbAUCY0UJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFqAgUCY0YFAVAFAmNFCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhZAIFAmNGBQFQBQJjRwUDbmlsCQACAQkArAICAg5Vbmtub3cgc3RhdHVzIAUCY0UJAAIBAhNZb3UgYXJlIG5vdCBhbGxvd2VkAmFSAQ1kZWxldGVBcnR3b3JrAgFQAmNGBAJjSQkBAmJ2AQUCYVIEAmJCCAUCY0kCXzEEAU4IBQJjSQJfMgQCYVkDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQFtCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQFOBQJjRgUBTgQCY3kJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBAWEBCQEBUQIFAmFZBQFQAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwMJAAACBQJjeQIACQACAQIgTm8gYXJ0IG1hdGNoaW5nIGZvciB0aGlzIGFkZHJlc3MEAUYJAQFhAQkBAmFwAgUCYVkFAVADCQAAAgUBRgIACQACAQIlTm8gYXJ0IGhhc2ggbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwQBRAkBAWEBCQEBVwIFAmFZBQFQAwkAAAIFAUQCAAkAAgECE05vIFNJR04gSUQgbWF0Y2hpbmcEAmNKCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFPAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVECBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBUgIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFTAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVUCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBVAIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFaAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFhAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFjAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFiAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVYCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBVwIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFYAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVkCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWoCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWcCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWkCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYXIBBQFGCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhcwIFAmFZBQFECQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhdQIFAUYFAmFZCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhaAIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhZAIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhZQIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhZgIFAmFZBQFQBQNuaWwDCQEBIQEJAQJhWAIFAmFZBQFQAwkBASEBBQF2CQACAQUBdwUCY0oDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQFtCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQFOBQJjSgkAAgECKEFydCBhbHJlYWR5IG1pbnRlZCwgeW91IGNhbm5vdCBkZWxldGUgaXQCYVIBC3NlbGxBcnR3b3JrBgFQAmJnAmNLAmFXAmJFAmJzBAJjTAkBAmJyAgUCYVIFAmJzBAJiQggFAmNMAl8xBAFOCAUCY0wCXzIEAmJDCAUCY0wCXzMEAmJ0CAUCY0wCXzQEAmJICQEBYQEJAQFRAgUBTgUBUAMJAAACBQJiSAIACQACAQIjVGhpcyBhcnQgZG9lc24ndCBtYXRjaCB5b3VyIGFjY291bnQEAmNFCQEBYQEJAQJhagIFAU4FAVADCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAg9DSEFOR0VfUkVRVUlSRUQJAMwIAgIHRkxBR0dFRAkAzAgCAgdJTExFR0FMBQNuaWwFAmNFCQACAQIPRmxhZ2dlZCBhcnR3b3JrBAJjTQkBAW8BCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUBUAMJAGYCAAAFAmJFCQACAQIMTmVnYXRpdmUgZW5kAwMJAGYCBQJiRQAAAwkBAiE9AgUCY0sAAQYJAQIhPQIFAmJnAAAHCQACAQI6VGltZWQgb2ZmZXIgb25seSBhbGxvd2VkIGZvciB1bmlxdWUgZWRpdGlvbiBhbmQgb2ZmZXIgb25seQQCY04DCQAAAgUCYkUAAAAABQZoZWlnaHQDCQEBIQEJAQJiZQEFAmFXCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchAwkBASEBCQECYmYCBQJhVwUCYmcJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEEAmFQCQECYUYBBQFOAwkBAiE9AgUCYVACAAkAAgEFAmFQBAJiSgkBAW8BCQEBWAIFAU4FAVAEAmJLCQEBbwEJAQFWAgUBTgUBUAMJAGYCBQJjSwBkCQACAQIcMTAwIGVkaXRpb25zIG1heCBwZXIgYXJ0d29yawMDCQECIT0CBQJiSgAACQAAAgUCYkoFAmJLBwkAAgECFE1heCBlZGl0aW9uIHJlYWNoZWQuAwMJAGYCBQJiSgAACQECIT0CBQJiSwUCY0sHCQACAQImQ2Fubm90IGNoYW5nZSBtYXhpbXVtIGlzc3VhYmxlIGFueW1vcmUDAwkAZgIFAmNNAAAJAQIhPQIFAmJLBQJjSwcJAAIBAjFDYW5ub3QgY2hhbmdlIG1heGltdW0gaXNzdWFibGUgd2l0aCBhY3RpdmUgb3JkZXJzBAJjYQMDCQBmAgUCYmcAAAkAZgIFAmNLAAAHBgcEAmNrAwUCYnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAU4AAAUEdW5pdAUDbmlsBQNuaWwJAM4IAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAVkCBQFOBQFQBQJjYQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFnAgUBTgUBUAUCYmcJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFWAgUBTgUBUAUCY0sJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFpAgUBTgUBUAUCYVcJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhaAIFAU4FAVAJAGQCBQJjTgUCYkUFA25pbAUCY2sCYVIBCmJ1eUFydHdvcmsCAVACYngJAQJidwYFAmFSBQFQBQJieAIAAgACAAJhUgEGc2V0QmlkAgFQAmJ4BAJjTwkBAmJ2AQUCYVIEAmJCCAUCY08CXzEEAU4IBQJjTwJfMgQCYkMIBQJjTwJfMwQCY1AJAQJhUQEFAmFSBAJhUwgFAmNQAl8xBAJhVAgFAmNQAl8yBAJhVwMJAQEhAQkBCWlzRGVmaW5lZAEIBQJhUwdhc3NldElkAgVXQVZFUwkA2AQBCQEFdmFsdWUBCAUCYVMHYXNzZXRJZAQCYkUJAQFvAQkBAmFoAgUCYngFAVADAwkBAiE9AgUCYkUAAAkAZwIFBmhlaWdodAUCYkUHCQACAQILU2FsZSBlbmRlZC4EAmNNCQEBbwEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQFQAwkBASEBCQECYmUBBQJhVwkAAgECEmFzc2V0IG5vdCBhY2NlcHRlZAMJAQEhAQkBAmJmAgUCYVcFAmFUCQACAQIOV3JvbmcgbWluIHNlbGwEAmJKCQEBbwEJAQFYAgUCYngFAVAEAmJLCQEBbwEJAQFWAgUCYngFAVADCQBnAgAABQJiSwkAAgECI05vIG1heCBlZGl0aW9uIHNldCBmb3IgdGhpcyBhcnR3b3JrAwkAZwIFAmJKBQJiSwkAAgECGFNvbGQgb3V0LCB5b3UgY2Fubm90IGJpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUBUAIBXwUCYngCAV8FAU4CAV8FAmJCAgVfT1BFTgkArAICCQCsAgIJAKwCAgkArAICBQJhVwIBXwkApAMBBQJhVAIBXwkApAMBBQJiQwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FAVAJAGQCBQJjTQABBQNuaWwCYVIBCWFjY2VwdEJpZAUBUAJieAJieQJiegJicwQCY1EJAQJicgIFAmFSBQJicwQCYkIIBQJjUQJfMQQBTggFAmNRAl8yBAJiQwgFAmNRAl8zBAJidAgFAmNRAl80AwkBAiE9AgUBTgUCYngJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uCQECYncGBQJhUgUBUAUCYngFAmJ5BQJiegUCYnMCYVIBCWNhbmNlbEJpZAQBUAJieAJieQJiegQCY1IJAQJidgEFAmFSBAJiQggFAmNSAl8xBAFOCAUCY1ICXzIEAmJDCAUCY1ICXzMDAwkBAiE9AgUBTgUCYnoJAQIhPQIFAU4FAmJ4BwkAAgECGVlvdSBjYW5ub3QgZG8gdGhpcyBhY3Rpb24EAmNTAwkAAAIFAU4FAmJ4BQJiegUBTgQCY00JAQFvAQkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FAVAEAmJtCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FAVACAV8FAmJ4AgFfBQJiegIBXwUCYnkEAmJuCQEBYQEJAKwCAgUCYm0CBV9PUEVOAwkAAAIFAmJuAgAJAAIBAg1CaWQgbm90IGZvdW5kBAJibwkAtQkCBQJibgIBXwQCYVcJAQJiawEJAJEDAgUCYm8AAAQCY1QCCENBTkNFTEVECQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUCYm0CBV9PUEVOCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICBQJibQIBXwUCY1QJAKwCAgkArAICBQJibgIBXwkApAMBBQJiQwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FAVAJAGUCBQJjTQABCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQJjUwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmJvAAEFAmFXBQNuaWwBAmNVAQJjVgAEAUcFAmNVAwkAAQIFAUcCF0ludm9rZVNjcmlwdFRyYW5zYWN0aW9uBAJjVwUBRwMDAwMJAAACCAUCY1cIZnVuY3Rpb24CCmFkZEFydHdvcmsJAAACCAUCY1cEZEFwcAUEdGhpcwcJAAACCAUCY1cDZmVlAKDCHgcJAAACCAUCY1cKZmVlQXNzZXRJZAUEdW5pdAcJAPQDAwgFAmNVCWJvZHlCeXRlcwkAkQMCCAUCY1UGcHJvb2ZzAAAJANkEAQkBAmNtAQkAkQMCCAUCY1cEYXJncwANAwMDAwkAAAIIBQJjVwhmdW5jdGlvbgINdXBkYXRlQXJ0d29yawkAAAIIBQJjVwRkQXBwBQR0aGlzBwkAAAIIBQJjVwNmZWUAoMIeBwkAAAIIBQJjVwpmZWVBc3NldElkBQR1bml0BwkA9AMDCAUCY1UJYm9keUJ5dGVzCQCRAwIIBQJjVQZwcm9vZnMAAAkA2QQBCQECY20BCQCRAwIIBQJjVwRhcmdzAAwDAwMDCQAAAggFAmNXCGZ1bmN0aW9uAgtzZWxsQXJ0d29yawkAAAIIBQJjVwRkQXBwBQR0aGlzBwkAAAIIBQJjVwNmZWUAoMIeBwkAAAIIBQJjVwpmZWVBc3NldElkBQR1bml0BwkA9AMDCAUCY1UJYm9keUJ5dGVzCQCRAwIIBQJjVQZwcm9vZnMAAAkA2QQBCQECY20BCQCRAwIIBQJjVwRhcmdzAAUDAwMDCQAAAggFAmNXCGZ1bmN0aW9uAglhY2NlcHRCaWQJAAACCAUCY1cEZEFwcAUEdGhpcwcJAAACCAUCY1cDZmVlAKDCHgcJAAACCAUCY1cKZmVlQXNzZXRJZAUEdW5pdAcJAMgTAwgFAmNVCWJvZHlCeXRlcwkAkQMCCAUCY1UGcHJvb2ZzAAAJANkEAQkBAmNtAQkAkQMCCAUCY1cEYXJncwAECQD0AwMIBQJjVQlib2R5Qnl0ZXMJAJEDAggFAmNVBnByb29mcwAACAUCY1UPc2VuZGVyUHVibGljS2V5CQD0AwMIBQJjVQlib2R5Qnl0ZXMJAJEDAggFAmNVBnByb29mcwAACAUCY1UPc2VuZGVyUHVibGljS2V5gFuQWA==", "height": 2503551, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EHxU475ATs1h4vS3zrgBNuypCZtPUEn243Hne1irszuo Next: HdzCh7p6MMMtjpUoAdXxF5t1mAwDedJcGYXEMETW26x3 Diff:
OldNewDifferences
391391 then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
392392 else unit
393393 if ((get_sponsored_waves == get_sponsored_waves))
394- then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
394+ then if (true)
395+ then throw(caller)
396+ else $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
395397 else throw("Strict value is not equal to itself.")
396398 }
397399
402404
403405
404406 func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
405- let $t01304413133 = idCallerDateSponsored(i, pubKey)
406- let id = $t01304413133._1
407- let caller = $t01304413133._2
408- let date = $t01304413133._3
409- let isSponsored = $t01304413133._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
410412 if (true)
411413 then throw(((((((caller + " / ") + issuer) + " / ") + bidOwner) + " / ") + pubKey))
412414 else {
465467 then throw(checkUser)
466468 else {
467469 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
468- let $t01473614928 = if (isBid)
470+ let $t01477314965 = if (isBid)
469471 then getPriceAssetIdFromBid(bidDataKey)
470472 else validatePriceAssetId(i, priceAssetId, artworkPrice)
471- let amount = $t01473614928._1
472- let assetId = $t01473614928._2
473+ let amount = $t01477314965._1
474+ let assetId = $t01477314965._2
473475 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
474476 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
475477 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
574576
575577 @Callable(i)
576578 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
577- let $t02010420177 = idCallerDateSponsored(i, pubKey)
578- let artId = $t02010420177._1
579- let caller = $t02010420177._2
580- let date = $t02010420177._3
581- let isSponsored = $t02010420177._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
582584 if (!(validateHash(sha256Hash)))
583585 then throw("Hash should be 64 characters maximum")
584586 else {
585- let $t02027820347 = setLIcence(cidLicence, sha256Licence)
586- let licenceCID = $t02027820347._1
587- let licenceHash = $t02027820347._2
587+ let $t02031520384 = setLIcence(cidLicence, sha256Licence)
588+ let licenceCID = $t02031520384._1
589+ let licenceHash = $t02031520384._2
588590 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
589591 if ((validateArtwork != ""))
590592 then throw("Something went wrong!")
591593 else {
592594 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
593- let $t02064620730 = if (whitelisted_drop)
595+ let $t02068320767 = if (whitelisted_drop)
594596 then $Tuple2(0, signID)
595597 else validatePayment(i)
596- let amount = $t02064620730._1
597- let assetId = $t02064620730._2
598+ let amount = $t02068320767._1
599+ let assetId = $t02068320767._2
598600 if (!(isDefined(amount)))
599601 then throw("Something went wrong")
600602 else {
635637 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
636638 then throw(maintenanceMSG)
637639 else {
638- let $t02376423834 = idCallerDateSponsored(i, pubKey)
639- let id = $t02376423834._1
640- let caller = $t02376423834._2
641- let date = $t02376423834._3
642- let isSponsored = $t02376423834._4
643- let $t02384423913 = setLIcence(cidLicence, sha256Licence)
644- let licenceCID = $t02384423913._1
645- let licenceHash = $t02384423913._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
646648 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
647649 if ((validateArtwork != ""))
648650 then throw("Something went wrong!")
670672
671673 @Callable(i)
672674 func flagArtwork (artId,addr,flag,note) = {
673- let $t02554025574 = idCallerDate(i)
674- let id = $t02554025574._1
675- let caller = $t02554025574._2
675+ let $t02557725611 = idCallerDate(i)
676+ let id = $t02557725611._1
677+ let caller = $t02557725611._2
676678 if (containsElement([chris, toString(this)], caller))
677679 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
678680 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
684686
685687 @Callable(i)
686688 func deleteArtwork (artId,addr) = {
687- let $t02601026044 = idCallerDate(i)
688- let id = $t02601026044._1
689- let caller = $t02601026044._2
689+ let $t02604726081 = idCallerDate(i)
690+ let id = $t02604726081._1
691+ let caller = $t02604726081._2
690692 let addrToUse = if (containsElement([chris, toString(this)], caller))
691693 then addr
692694 else caller
719721
720722 @Callable(i)
721723 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
722- let $t02888028950 = idCallerDateSponsored(i, pubKey)
723- let id = $t02888028950._1
724- let caller = $t02888028950._2
725- let date = $t02888028950._3
726- let isSponsored = $t02888028950._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
727729 let artworkName = getStringByKey(keyName(caller, artId))
728730 if ((artworkName == ""))
729731 then throw("This art doesn't match your account")
797799
798800 @Callable(i)
799801 func setBid (artId,issuer) = {
800- let $t03133231372 = idCallerDate(i)
801- let id = $t03133231372._1
802- let caller = $t03133231372._2
803- let date = $t03133231372._3
804- let $t03137731413 = isPayment(i)
805- let payment = $t03137731413._1
806- let amount = $t03137731413._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
807809 let assetId = if (!(isDefined(payment.assetId)))
808810 then "WAVES"
809811 else toBase58String(value(payment.assetId))
834836
835837 @Callable(i)
836838 func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = {
837- let $t03263332703 = idCallerDateSponsored(i, pubKey)
838- let id = $t03263332703._1
839- let caller = $t03263332703._2
840- let date = $t03263332703._3
841- let isSponsored = $t03263332703._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
842844 if ((caller != issuer))
843845 then throw("You cannot do this action")
844846 else buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
848850
849851 @Callable(i)
850852 func cancelBid (artId,issuer,bidId,bidOwner) = {
851- let $t03293732998 = idCallerDate(i)
852- let id = $t03293732998._1
853- let caller = $t03293732998._2
854- let date = $t03293732998._3
853+ let $t03297433035 = idCallerDate(i)
854+ let id = $t03297433035._1
855+ let caller = $t03297433035._2
856+ let date = $t03297433035._3
855857 if (if ((caller != bidOwner))
856858 then (caller != issuer)
857859 else false)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func getStringByKey (key) = valueOrElse(getString(this, key), "")
55
66
77 let unitTest = false
88
99 let oracleFee = value(addressFromString(getStringByKey("conf_oracle_fee")))
1010
1111 let signDapp = value(addressFromString(getStringByKey("conf_signweb_dapp")))
1212
1313 let feeReceiver = getStringByKey("conf_fee_receiver")
1414
1515 let userDapp = if (unitTest)
1616 then value(addressFromString("3Mt4RGMEyjSWYAocTPqd55wdHQQB3PU2UCm"))
1717 else value(addressFromString(getStringByKey("conf_users_dapp")))
1818
1919 let whitelistDapp = value(addressFromString(getStringByKey("conf_whitelist_dapp")))
2020
2121 let signAssetId = fromBase58String(getStringByKey("conf_accepted_asset_SIGN"))
2222
2323 let usdnAssetId = fromBase58String(getStringByKey("conf_accepted_asset_USDN"))
2424
2525 let usdtAssetId = fromBase58String(getStringByKey("conf_accepted_asset_USDT"))
2626
2727 let wavesAssetId = base58''
2828
2929 let chris = getStringByKey("conf_admin_1")
3030
3131 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
3232
3333
3434 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
3535
3636
3737 func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
3838
3939
4040 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
4141
4242
4343 let signCut = 7
4444
4545 let usdnWaveCut = 10
4646
4747 let defaultLicence = getStringByKey("conf_default_licence")
4848
4949 let defaultHashLicence = getStringByKey("conf_default_licence_hash")
5050
5151 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
5252
5353 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
5454
5555 let userSuspended = "SUSPENDED"
5656
5757 let userRemoved = "REMOVED"
5858
5959 let userUnregistered = "UNREGISTERED"
6060
6161 let userAllowed = "ALLOWED"
6262
6363 let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
6464
6565 func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signDapp, ((("data_fc_" + signID) + "_") + Owner)) {
6666 case a: String =>
6767 if (contains(a, sha256Hash))
6868 then true
6969 else false
7070 case _ =>
7171 false
7272 }
7373
7474
7575 func validateCID (cid) = if (contains(cid, "/"))
7676 then if (if ((76 > size(cid)))
7777 then (size(split(cid, "/")[0]) == 59)
7878 else false)
7979 then (16 > size(split(cid, "/")[1]))
8080 else false
8181 else false
8282
8383
8484 func validateHash (hash) = (size(hash) == 64)
8585
8686
8787 func keyUserStatus (caller) = ("user_status_" + caller)
8888
8989
9090 func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
9191
9292
9393 func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
9494
9595
9696 func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
9797
9898
9999 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
100100
101101
102102 func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
103103
104104
105105 func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
106106
107107
108108 func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
109109
110110
111111 func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
112112
113113
114114 func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
115115
116116
117117 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
118118
119119
120120 func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
121121
122122
123123 func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
124124
125125
126126 func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
127127
128128
129129 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
130130
131131
132132 func keyNote (caller,artId) = ((("art_note_" + artId) + "_") + caller)
133133
134134
135135 func keyCrawler (caller,artId) = ((("art_crawler_cid_" + artId) + "_") + caller)
136136
137137
138138 func keyRoyalties (caller,artId) = ((("art_royalties_" + artId) + "_") + caller)
139139
140140
141141 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
142142
143143
144144 func keyEndSale (caller,artId) = ((("art_endsale_" + artId) + "_") + caller)
145145
146146
147147 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
148148
149149
150150 func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
151151
152152
153153 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
154154
155155
156156 func keyPrimaryShareAgent (artistAddr) = ("artist_agent_primary_" + artistAddr)
157157
158158
159159 func keyArtistPublicAgentAddr (artistAddr) = ("artist_public_agent_" + artistAddr)
160160
161161
162162 func keyPrimarySharePublicAgent (artistAddr) = ("artist_public_agent_primary_" + artistAddr)
163163
164164
165165 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
166166
167167
168168 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
169169
170170
171171 func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
172172
173173
174174 func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
175175
176176
177177 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
178178 then throw("Wrong Display CID")
179179 else if (!(validateCID(cidExport)))
180180 then throw("Wrong Export CID")
181181 else if (if ((cidLicence != ""))
182182 then !(validateCID(cidLicence))
183183 else false)
184184 then throw("Wrong Licence CID")
185185 else true
186186
187187
188188 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
189189 then throw("Export Hash 64 char. max")
190190 else if (!(validateHash(sha256Licence)))
191191 then throw("Licence Hash 64 char. max")
192192 else true
193193
194194
195195 func validateString (str,max) = if ((size(str) == 0))
196196 then throw("Field cannot be is empty")
197197 else if ((size(str) > max))
198198 then throw((str + " is too long"))
199199 else true
200200
201201
202202 func validateUser (caller) = {
203203 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
204204 if (if ((userStatus == userUnregistered))
205205 then true
206206 else (userStatus == userAllowed))
207207 then "Register this account first with \"Account\" tab"
208208 else if ((userStatus == userSuspended))
209209 then "Account suspended"
210210 else if ((userStatus == userRemoved))
211211 then "Account removed"
212212 else ""
213213 }
214214
215215
216216 func setLIcence (cidLicence,sha256Licence) = {
217217 let cid = if ((size(cidLicence) == 0))
218218 then defaultLicence
219219 else cidLicence
220220 let hash = if ((size(sha256Licence) == 0))
221221 then defaultHashLicence
222222 else sha256Licence
223223 $Tuple2(cid, hash)
224224 }
225225
226226
227227 func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,royalties) = {
228228 let checkUser = validateUser(caller)
229229 if ((checkUser != ""))
230230 then throw(checkUser)
231231 else if ((size(cidDisplay) == 0))
232232 then throw("Display CID cannot be empty")
233233 else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
234234 then throw("Problem with CID")
235235 else if (!(validateAllHash(sha256Export, licenceHash)))
236236 then throw("Problem with Hashes")
237237 else if (!(validateString(name, 100)))
238238 then throw("100 Char. max name")
239239 else if (!(validateString(description, 1000)))
240240 then throw("1000 Char. max description")
241241 else if (if ((0 > royalties))
242242 then true
243243 else (royalties > 1000))
244244 then throw("Royalties cannot be less than 0% or higher than 10%")
245245 else if ((size(split(tags, ",")) > 5))
246246 then throw("5 tags max.")
247247 else ""
248248 }
249249
250250
251251 func isPayment (i) = if ((size(i.payments) == 0))
252252 then throw("No payment attached")
253253 else {
254254 let payment = value(i.payments[0])
255255 let amount = value(payment.amount)
256256 $Tuple2(payment, amount)
257257 }
258258
259259
260260 func validatePayment (i) = {
261261 let $t091809216 = isPayment(i)
262262 let payment = $t091809216._1
263263 let amount = $t091809216._2
264264 let assetId = if (if (isDefined(payment.assetId))
265265 then (payment.assetId == signAssetId)
266266 else false)
267267 then payment.assetId
268268 else throw("Only SIGN token accepted as transaction fee")
269269 if ((amount != currentCertificationPrice))
270270 then throw(("Payment amount should be " + toString(currentCertificationPrice)))
271271 else $Tuple2(amount, assetId)
272272 }
273273
274274
275275 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
276276 case b: Int =>
277277 if ((b != 0))
278278 then true
279279 else false
280280 case _ =>
281281 false
282282 }
283283
284284
285285 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
286286 let $t098049840 = isPayment(i)
287287 let payment = $t098049840._1
288288 let amount = $t098049840._2
289289 let assetId = if (!(isDefined(payment.assetId)))
290290 then unit
291291 else if (if ((size(priceAssetId) > 0))
292292 then (toBase58String(value(payment.assetId)) == priceAssetId)
293293 else false)
294294 then payment.assetId
295295 else throw("Wrong asset id")
296296 if (if ((assetId == unit))
297297 then (priceAssetId != "")
298298 else false)
299299 then throw("Wrong asset id")
300300 else if ((artworkPrice != amount))
301301 then throw("Payment don't match")
302302 else $Tuple2(amount, assetId)
303303 }
304304
305305
306306 func acceptedAssetIds (assetId) = if (if (if (if (if ((assetId != toBase58String(signAssetId)))
307307 then (assetId != toBase58String(wavesAssetId))
308308 else false)
309309 then (assetId != "WAVES")
310310 else false)
311311 then (assetId != toBase58String(usdnAssetId))
312312 else false)
313313 then (assetId != toBase58String(usdtAssetId))
314314 else false)
315315 then throw("Only SIGN, USDN,USDT or WAVES accepted")
316316 else true
317317
318318
319319 func validateMinSell (assetId,price) = {
320320 let minSellWaves = if (unitTest)
321321 then 10
322322 else getIntegerByKeyFromOracle("waves_min_sell")
323323 let minSellUsdn = 1000000
324324 let minSellSign = if (unitTest)
325325 then 1
326326 else (currentCertificationPrice * 2)
327327 if (if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
328328 then (minSellUsdn > price)
329329 else false)
330330 then (price != 0)
331331 else false)
332332 then true
333333 else if (if ((assetId == toBase58String(usdtAssetId)))
334334 then (minSellUsdn > price)
335335 else false)
336336 then (price != 0)
337337 else false)
338338 then true
339339 else if (if ((assetId == toBase58String(signAssetId)))
340340 then (minSellSign > price)
341341 else false)
342342 then (price != 0)
343343 else false)
344344 then true
345345 else if (if (if ((assetId == toBase58String(wavesAssetId)))
346346 then true
347347 else (assetId == "WAVES"))
348348 then (minSellWaves > price)
349349 else false)
350350 then (price != 0)
351351 else false)
352352 then throw("Wrong minimum sell price")
353353 else true
354354 }
355355
356356
357357 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
358358 then unit
359359 else fromBase58String(assetId)
360360
361361
362362 func getPriceAssetIdFromBid (bidDataKey) = {
363363 let bidData = getStringByKey((bidDataKey + "_OPEN"))
364364 if ((bidData == ""))
365365 then throw("Bid not found")
366366 else {
367367 let bidDataArr = split(bidData, "_")
368368 let bidAmount = parseIntValue(bidDataArr[1])
369369 let bidAssetId = getBidAssetId(bidDataArr[0])
370370 if ((0 >= bidAmount))
371371 then throw("Wrong amount")
372372 else $Tuple2(bidAmount, bidAssetId)
373373 }
374374 }
375375
376376
377377 func idCallerDateSponsored (i,pubKey) = if (!(dappRunning))
378378 then throw(maintenanceMSG)
379379 else {
380380 let isSponsored = if ((pubKey != ""))
381381 then valueOrElse(checkWhitelist((toString(addressFromPublicKey(fromBase58String(pubKey))) + "_free_txs")), 0)
382382 else 0
383383 let caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
384384 then (isSponsored > 0)
385385 else false)
386386 then toString(addressFromPublicKey(fromBase58String(pubKey)))
387387 else toBase58String(i.caller.bytes)
388388 let get_sponsored_waves = if (if ((pubKey != ""))
389389 then (isSponsored > 0)
390390 else false)
391391 then invoke(whitelistDapp, "useFreeTx", [toString(addressFromPublicKey(fromBase58String(pubKey)))], nil)
392392 else unit
393393 if ((get_sponsored_waves == get_sponsored_waves))
394- then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
394+ then if (true)
395+ then throw(caller)
396+ else $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
395397 else throw("Strict value is not equal to itself.")
396398 }
397399
398400
399401 func idCallerDate (i) = if (!(dappRunning))
400402 then throw(maintenanceMSG)
401403 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
402404
403405
404406 func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
405- let $t01304413133 = idCallerDateSponsored(i, pubKey)
406- let id = $t01304413133._1
407- let caller = $t01304413133._2
408- let date = $t01304413133._3
409- let isSponsored = $t01304413133._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
410412 if (true)
411413 then throw(((((((caller + " / ") + issuer) + " / ") + bidOwner) + " / ") + pubKey))
412414 else {
413415 let isBid = if (if (if ((caller == issuer))
414416 then (bidOwner != "")
415417 else false)
416418 then (bidId != "")
417419 else false)
418420 then true
419421 else false
420422 let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
421423 if (if (if ((blockEnd != 0))
422424 then (height >= blockEnd)
423425 else false)
424426 then !(isBid)
425427 else false)
426428 then throw("Sale ended.")
427429 else {
428430 let callerIsIssuer = (caller == issuer)
429431 let totalNFT = getIntegerByKey("total_nft_issued")
430432 let signID = getStringByKey(keySignID(issuer, artId))
431433 let artworkName = getStringByKey(keyName(issuer, artId))
432434 if ((artworkName == ""))
433435 then throw("Art doesn't exist")
434436 else {
435437 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
436438 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
437439 let artworkPrice = if (callerIsIssuer)
438440 then (currentCertificationPrice * 2)
439441 else getIntegerByKey(keyPrice(issuer, artId))
440442 let priceAssetId = if (callerIsIssuer)
441443 then toBase58String(signAssetId)
442444 else getStringByKey(keyAssetIdAccepted(issuer, artId))
443445 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
444446 if (if (if (!(isBid))
445447 then !(callerIsIssuer)
446448 else false)
447449 then if (if ((0 >= artworkPrice))
448450 then true
449451 else !(isOnSale))
450452 then true
451453 else (0 >= maxCanSell)
452454 else false)
453455 then throw("Art not for sale")
454456 else if (if (if (!(isBid))
455457 then callerIsIssuer
456458 else false)
457459 then (0 >= maxCanSell)
458460 else false)
459461 then throw("Max issuable not set")
460462 else {
461463 let checkUser = validateUser(issuer)
462464 if (if (isBid)
463465 then (checkUser != "")
464466 else false)
465467 then throw(checkUser)
466468 else {
467469 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
468- let $t01473614928 = if (isBid)
470+ let $t01477314965 = if (isBid)
469471 then getPriceAssetIdFromBid(bidDataKey)
470472 else validatePriceAssetId(i, priceAssetId, artworkPrice)
471- let amount = $t01473614928._1
472- let assetId = $t01473614928._2
473+ let amount = $t01477314965._1
474+ let assetId = $t01477314965._2
473475 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
474476 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
475477 let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
476478 let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
477479 let isWhitelisted = checkWhitelist(issuer)
478480 let cut = if ((isWhitelisted > height))
479481 then 0
480482 else if ((assetId == signAssetId))
481483 then signCut
482484 else usdnWaveCut
483485 let amountForSign = fraction(amount, cut, 100)
484486 let amountForAgent = if (if (if ((agent != feeReceiver))
485487 then (agentShare > 0)
486488 else false)
487489 then (height > isWhitelisted)
488490 else false)
489491 then fraction(amount, agentShare, 10000)
490492 else 0
491493 let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
492494 then (publicAgentShare > 0)
493495 else false)
494496 then (height > isWhitelisted)
495497 else false)
496498 then fraction(amount, publicAgentShare, 10000)
497499 else 0
498500 let amountForCreator = (amount - amountForSign)
499501 if ((amountSold == maxCanSell))
500502 then throw("Art sold out")
501503 else {
502504 let newAmountSold = (amountSold + 1)
503505 let issueMeta = ((((((((((("Creator: " + issuer) + ",
504506 ArtID: ") + artId) + ",
505507 SignID: ") + signID) + ",
506508 Artwork name: ") + artworkName) + ",
507509 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
508510 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
509511 let idNFT = calculateAssetId(issueNFT)
510512 let sellStatus = if (if ((newAmountSold == maxCanSell))
511513 then true
512514 else !(isOnSale))
513515 then false
514516 else true
515517 let receiveNFT = if (if (if ((caller == issuer))
516518 then (bidOwner != "")
517519 else false)
518520 then (bidId != "")
519521 else false)
520522 then addressFromStringValue(bidOwner)
521523 else i.caller
522524 let assetIdBid = if (!(isDefined(assetId)))
523525 then "WAVES"
524526 else toBase58String(value(assetId))
525527 let bidData = getStringByKey((bidDataKey + "_OPEN"))
526528 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
527529 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
528530 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
529531 let soldValue = if (!(isBid))
530532 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
531533 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
532534 let soldData = StringEntry(soldKey, soldValue)
533535 let commissionsWithAgent = if ((amountForAgent != 0))
534536 then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
535537 else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
536538 let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
537539 then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
538540 else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
539541 let txToCaller = if (isSponsored)
540542 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
541543 else nil
542544 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)
543545 if (isBid)
544546 then [soldData, bidUpdate, bidDelOld] :: buyRes
545547 else soldData :: buyRes
546548 }
547549 }
548550 }
549551 }
550552 }
551553 }
552554 }
553555
554556
555557 func asString (bv) = match bv {
556558 case bv0: String =>
557559 bv0
558560 case _ =>
559561 throw("Sponsored Public Key String expected")
560562 }
561563
562564
563565 @Callable(invoke)
564566 func setConf (key,val) = {
565567 let caller = toString(invoke.caller)
566568 if (containsElement([chris, toString(this)], caller))
567569 then if (contains(key, "conf_"))
568570 then [StringEntry(key, val)]
569571 else throw("Entries starting with conf_ only")
570572 else throw("You are not allowed to change this")
571573 }
572574
573575
574576
575577 @Callable(i)
576578 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
577- let $t02010420177 = idCallerDateSponsored(i, pubKey)
578- let artId = $t02010420177._1
579- let caller = $t02010420177._2
580- let date = $t02010420177._3
581- let isSponsored = $t02010420177._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
582584 if (!(validateHash(sha256Hash)))
583585 then throw("Hash should be 64 characters maximum")
584586 else {
585- let $t02027820347 = setLIcence(cidLicence, sha256Licence)
586- let licenceCID = $t02027820347._1
587- let licenceHash = $t02027820347._2
587+ let $t02031520384 = setLIcence(cidLicence, sha256Licence)
588+ let licenceCID = $t02031520384._1
589+ let licenceHash = $t02031520384._2
588590 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
589591 if ((validateArtwork != ""))
590592 then throw("Something went wrong!")
591593 else {
592594 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
593- let $t02064620730 = if (whitelisted_drop)
595+ let $t02068320767 = if (whitelisted_drop)
594596 then $Tuple2(0, signID)
595597 else validatePayment(i)
596- let amount = $t02064620730._1
597- let assetId = $t02064620730._2
598+ let amount = $t02068320767._1
599+ let assetId = $t02068320767._2
598600 if (!(isDefined(amount)))
599601 then throw("Something went wrong")
600602 else {
601603 let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
602604 if ((entryExist != ""))
603605 then throw("You already added it")
604606 else {
605607 let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
606608 if ((hashExist != ""))
607609 then throw("Hash already registered")
608610 else {
609611 let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
610612 if (!(isSignCertified))
611613 then throw("Sign Certificate not found for this address.")
612614 else {
613615 let decrease_whitelist_drop = if (whitelisted_drop)
614616 then invoke(whitelistDapp, "useFreeDrop", [caller], nil)
615617 else unit
616618 if ((decrease_whitelist_drop == decrease_whitelist_drop))
617619 then {
618620 let txToCaller = if (isSponsored)
619621 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
620622 else nil
621623 ([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)
622624 }
623625 else throw("Strict value is not equal to itself.")
624626 }
625627 }
626628 }
627629 }
628630 }
629631 }
630632 }
631633
632634
633635
634636 @Callable(i)
635637 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
636638 then throw(maintenanceMSG)
637639 else {
638- let $t02376423834 = idCallerDateSponsored(i, pubKey)
639- let id = $t02376423834._1
640- let caller = $t02376423834._2
641- let date = $t02376423834._3
642- let isSponsored = $t02376423834._4
643- let $t02384423913 = setLIcence(cidLicence, sha256Licence)
644- let licenceCID = $t02384423913._1
645- let licenceHash = $t02384423913._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
646648 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
647649 if ((validateArtwork != ""))
648650 then throw("Something went wrong!")
649651 else {
650652 let entryExist = getStringByKey(keyName(caller, txid))
651653 if ((entryExist == ""))
652654 then throw("Entry not found")
653655 else {
654656 let flag = getStringByKey(keyFlag(caller, txid))
655657 if ((flag == "ILLEGAL"))
656658 then throw("Cannot update ILLEGAL artwork")
657659 else if (!(isArtMinted(caller, txid)))
658660 then {
659661 let txToCaller = if (isSponsored)
660662 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
661663 else nil
662664 ([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)
663665 }
664666 else throw("Already minted")
665667 }
666668 }
667669 }
668670
669671
670672
671673 @Callable(i)
672674 func flagArtwork (artId,addr,flag,note) = {
673- let $t02554025574 = idCallerDate(i)
674- let id = $t02554025574._1
675- let caller = $t02554025574._2
675+ let $t02557725611 = idCallerDate(i)
676+ let id = $t02557725611._1
677+ let caller = $t02557725611._2
676678 if (containsElement([chris, toString(this)], caller))
677679 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
678680 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
679681 else throw(("Unknow status " + flag))
680682 else throw("You are not allowed")
681683 }
682684
683685
684686
685687 @Callable(i)
686688 func deleteArtwork (artId,addr) = {
687- let $t02601026044 = idCallerDate(i)
688- let id = $t02601026044._1
689- let caller = $t02601026044._2
689+ let $t02604726081 = idCallerDate(i)
690+ let id = $t02604726081._1
691+ let caller = $t02604726081._2
690692 let addrToUse = if (containsElement([chris, toString(this)], caller))
691693 then addr
692694 else caller
693695 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
694696 if ((entryExist == ""))
695697 then throw("No art matching for this address")
696698 else {
697699 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
698700 if ((sha256Hash == ""))
699701 then throw("No art hash matching for this address")
700702 else {
701703 let signID = getStringByKey(keySignID(addrToUse, artId))
702704 if ((signID == ""))
703705 then throw("No SIGN ID matching")
704706 else {
705707 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))]
706708 if (!(isArtMinted(addrToUse, artId)))
707709 then if (!(dappRunning))
708710 then throw(maintenanceMSG)
709711 else dataToDelete
710712 else if (containsElement([chris, toString(this)], caller))
711713 then dataToDelete
712714 else throw("Art already minted, you cannot delete it")
713715 }
714716 }
715717 }
716718 }
717719
718720
719721
720722 @Callable(i)
721723 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
722- let $t02888028950 = idCallerDateSponsored(i, pubKey)
723- let id = $t02888028950._1
724- let caller = $t02888028950._2
725- let date = $t02888028950._3
726- let isSponsored = $t02888028950._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
727729 let artworkName = getStringByKey(keyName(caller, artId))
728730 if ((artworkName == ""))
729731 then throw("This art doesn't match your account")
730732 else {
731733 let flag = getStringByKey(keyFlag(caller, artId))
732734 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
733735 then throw("Flagged artwork")
734736 else {
735737 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
736738 if ((0 > blockEnd))
737739 then throw("Negative end")
738740 else if (if ((blockEnd > 0))
739741 then if ((maxMint != 1))
740742 then true
741743 else (price != 0)
742744 else false)
743745 then throw("Timed offer only allowed for unique edition and offer only")
744746 else {
745747 let baseHeight = if ((blockEnd == 0))
746748 then 0
747749 else height
748750 if (!(acceptedAssetIds(assetId)))
749751 then throw("Something went wrong!")
750752 else if (!(validateMinSell(assetId, price)))
751753 then throw("Something went wrong!")
752754 else {
753755 let checkUser = validateUser(caller)
754756 if ((checkUser != ""))
755757 then throw(checkUser)
756758 else {
757759 let amountSold = getIntegerByKey(keyIssued(caller, artId))
758760 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
759761 if ((maxMint > 100))
760762 then throw("100 editions max per artwork")
761763 else if (if ((amountSold != 0))
762764 then (amountSold == maxCanSell)
763765 else false)
764766 then throw("Max edition reached.")
765767 else if (if ((amountSold > 0))
766768 then (maxCanSell != maxMint)
767769 else false)
768770 then throw("Cannot change maximum issuable anymore")
769771 else if (if ((bidNbr > 0))
770772 then (maxCanSell != maxMint)
771773 else false)
772774 then throw("Cannot change maximum issuable with active orders")
773775 else {
774776 let sellStatus = if (if ((price > 0))
775777 then (maxMint > 0)
776778 else false)
777779 then true
778780 else false
779781 let txToCaller = if (isSponsored)
780782 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
781783 else nil
782784 ([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)
783785 }
784786 }
785787 }
786788 }
787789 }
788790 }
789791 }
790792
791793
792794
793795 @Callable(i)
794796 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", "")
795797
796798
797799
798800 @Callable(i)
799801 func setBid (artId,issuer) = {
800- let $t03133231372 = idCallerDate(i)
801- let id = $t03133231372._1
802- let caller = $t03133231372._2
803- let date = $t03133231372._3
804- let $t03137731413 = isPayment(i)
805- let payment = $t03137731413._1
806- let amount = $t03137731413._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
807809 let assetId = if (!(isDefined(payment.assetId)))
808810 then "WAVES"
809811 else toBase58String(value(payment.assetId))
810812 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
811813 if (if ((blockEnd != 0))
812814 then (height >= blockEnd)
813815 else false)
814816 then throw("Sale ended.")
815817 else {
816818 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
817819 if (!(acceptedAssetIds(assetId)))
818820 then throw("asset not accepted")
819821 else if (!(validateMinSell(assetId, amount)))
820822 then throw("Wrong min sell")
821823 else {
822824 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
823825 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
824826 if ((0 >= maxCanSell))
825827 then throw("No max edition set for this artwork")
826828 else if ((amountSold >= maxCanSell))
827829 then throw("Sold out, you cannot bid")
828830 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
829831 }
830832 }
831833 }
832834
833835
834836
835837 @Callable(i)
836838 func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = {
837- let $t03263332703 = idCallerDateSponsored(i, pubKey)
838- let id = $t03263332703._1
839- let caller = $t03263332703._2
840- let date = $t03263332703._3
841- let isSponsored = $t03263332703._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
842844 if ((caller != issuer))
843845 then throw("You cannot do this action")
844846 else buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
845847 }
846848
847849
848850
849851 @Callable(i)
850852 func cancelBid (artId,issuer,bidId,bidOwner) = {
851- let $t03293732998 = idCallerDate(i)
852- let id = $t03293732998._1
853- let caller = $t03293732998._2
854- let date = $t03293732998._3
853+ let $t03297433035 = idCallerDate(i)
854+ let id = $t03297433035._1
855+ let caller = $t03297433035._2
856+ let date = $t03297433035._3
855857 if (if ((caller != bidOwner))
856858 then (caller != issuer)
857859 else false)
858860 then throw("You cannot do this action")
859861 else {
860862 let returnMoneyTo = if ((caller == issuer))
861863 then bidOwner
862864 else caller
863865 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
864866 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
865867 let bidData = getStringByKey((bidDataKey + "_OPEN"))
866868 if ((bidData == ""))
867869 then throw("Bid not found")
868870 else {
869871 let bidDataArr = split(bidData, "_")
870872 let assetId = getBidAssetId(bidDataArr[0])
871873 let bidStatus = "CANCELED"
872874 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
873875 }
874876 }
875877 }
876878
877879
878880 @Verifier(tx)
879881 func verifier () = match tx {
880882 case inv: InvokeScriptTransaction =>
881883 if (if (if (if ((inv.function == "addArtwork"))
882884 then (inv.dApp == this)
883885 else false)
884886 then (inv.fee == 500000)
885887 else false)
886888 then (inv.feeAssetId == unit)
887889 else false)
888890 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[13])))
889891 else if (if (if (if ((inv.function == "updateArtwork"))
890892 then (inv.dApp == this)
891893 else false)
892894 then (inv.fee == 500000)
893895 else false)
894896 then (inv.feeAssetId == unit)
895897 else false)
896898 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
897899 else if (if (if (if ((inv.function == "sellArtwork"))
898900 then (inv.dApp == this)
899901 else false)
900902 then (inv.fee == 500000)
901903 else false)
902904 then (inv.feeAssetId == unit)
903905 else false)
904906 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
905907 else if (if (if (if ((inv.function == "acceptBid"))
906908 then (inv.dApp == this)
907909 else false)
908910 then (inv.fee == 500000)
909911 else false)
910912 then (inv.feeAssetId == unit)
911913 else false)
912914 then sigVerify_128Kb(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[4])))
913915 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
914916 case _ =>
915917 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
916918 }
917919

github/deemru/w8io/03bedc9 
111.47 ms