tx · B4CodCUVKyjqr1qmM9dbnUzUVLwb8r6ZCquaCQvx3zTK

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.01900000 Waves

2023.03.24 06:35 [2503554] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

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

github/deemru/w8io/026f985 
101.38 ms