tx · 8A55QnKc8T26dqvS56mu1n45iPV2i91yNgg1iPUNK5CE

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.19000000 Waves

2023.03.24 07:00 [2503580] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "8A55QnKc8T26dqvS56mu1n45iPV2i91yNgg1iPUNK5CE", "fee": 19000000, "feeAssetId": null, "timestamp": 1679630432846, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "44hVgKsBVT9DQZMbCLS66RTjNAz4bnRPFhkgW8tLg355pTocGmWVHP6adoyvFvvHTy4n7DWDC4S8x3yqoMX1hwoC" ], "script": "base64:BgKKFQgCEgQKAggIEhAKDggICAgICAgICAgICAEIEg8KDQgICAgICAgICAgIAQgSBgoECAgICBIECgIICBIICgYIAQEIAQgSBAoCCAgSBAoCCAgSBwoFCAgICAgSBgoECAgICCIOZ2V0U3RyaW5nQnlLZXkiA2tleSIIdW5pdFRlc3QiCW9yYWNsZUZlZSIIc2lnbkRhcHAiC2ZlZVJlY2VpdmVyIgh1c2VyRGFwcCINd2hpdGVsaXN0RGFwcCILc2lnbkFzc2V0SWQiC3VzZG5Bc3NldElkIgt1c2R0QXNzZXRJZCIMd2F2ZXNBc3NldElkIgVjaHJpcyIZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZSIPZ2V0SW50ZWdlckJ5S2V5Ig5jaGVja1doaXRlbGlzdCIPZ2V0Qm9vbGVhbkJ5S2V5IgdzaWduQ3V0Igt1c2RuV2F2ZUN1dCIOZGVmYXVsdExpY2VuY2UiEmRlZmF1bHRIYXNoTGljZW5jZSILZGFwcFJ1bm5pbmciDm1haW50ZW5hbmNlTVNHIg11c2VyU3VzcGVuZGVkIgt1c2VyUmVtb3ZlZCIQdXNlclVucmVnaXN0ZXJlZCILdXNlckFsbG93ZWQiGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UiFGNoZWNrU2lnbkNlcnRpZmljYXRlIgZzaWduSUQiBU93bmVyIgpzaGEyNTZIYXNoIgckbWF0Y2gwIgFhIgt2YWxpZGF0ZUNJRCIDY2lkIgx2YWxpZGF0ZUhhc2giBGhhc2giDWtleVVzZXJTdGF0dXMiBmNhbGxlciIHa2V5RGF0ZSIFYXJ0SWQiB2tleU5hbWUiB2tleURlc2MiDWtleURpc3BsYXlDaWQiDWtleUV4cG9ydEhhc2giDGtleUV4cG9ydENpZCIKa2V5TWF4TWludCIJa2V5U2lnbklEIglrZXlJc3N1ZWQiCWtleU9uU2FsZSIOa2V5TGljZW5jZUhhc2giDWtleUxpY2VuY2VDaWQiB2tleVRhZ3MiB2tleVR5cGUiB2tleU5vdGUiCmtleUNyYXdsZXIiDGtleVJveWFsdGllcyIIa2V5UHJpY2UiCmtleUVuZFNhbGUiEmtleUFzc2V0SWRBY2NlcHRlZCIHa2V5RmxhZyISa2V5QXJ0aXN0QWdlbnRBZGRyIgphcnRpc3RBZGRyIhRrZXlQcmltYXJ5U2hhcmVBZ2VudCIYa2V5QXJ0aXN0UHVibGljQWdlbnRBZGRyIhprZXlQcmltYXJ5U2hhcmVQdWJsaWNBZ2VudCIRa2V5SGFzaEJ5VHhpZEFkZHIiBHR4aWQiDmtleU93bmVyQnlIYXNoIg1rZXlpZEJ5U2lnbmlkIgZzaWduSWQiEmtleVR4aWRCeUhhc2hPd25lciIOdmFsaWRhdGVBbGxDSUQiCmNpZERpc3BsYXkiCWNpZEV4cG9ydCIKY2lkTGljZW5jZSIPdmFsaWRhdGVBbGxIYXNoIgxzaGEyNTZFeHBvcnQiDXNoYTI1NkxpY2VuY2UiDnZhbGlkYXRlU3RyaW5nIgNzdHIiA21heCIMdmFsaWRhdGVVc2VyIgp1c2VyU3RhdHVzIgpzZXRMSWNlbmNlIhN2YWxpZGF0ZUFydHdvcmtEYXRhIgpsaWNlbmNlQ0lEIgtsaWNlbmNlSGFzaCIEbmFtZSILZGVzY3JpcHRpb24iBHRhZ3MiCXJveWFsdGllcyIJY2hlY2tVc2VyIglpc1BheW1lbnQiAWkiB3BheW1lbnQiBmFtb3VudCIPdmFsaWRhdGVQYXltZW50IgskdDA5MTgwOTIxNiIHYXNzZXRJZCILaXNBcnRNaW50ZWQiCWFkZHJUb1VzZSIBYiIUdmFsaWRhdGVQcmljZUFzc2V0SWQiDHByaWNlQXNzZXRJZCIMYXJ0d29ya1ByaWNlIgskdDA5ODA0OTg0MCIQYWNjZXB0ZWRBc3NldElkcyIPdmFsaWRhdGVNaW5TZWxsIgVwcmljZSIMbWluU2VsbFdhdmVzIgttaW5TZWxsVXNkbiILbWluU2VsbFNpZ24iDWdldEJpZEFzc2V0SWQiFmdldFByaWNlQXNzZXRJZEZyb21CaWQiCmJpZERhdGFLZXkiB2JpZERhdGEiCmJpZERhdGFBcnIiCWJpZEFtb3VudCIKYmlkQXNzZXRJZCIVaWRDYWxsZXJEYXRlU3BvbnNvcmVkIgZwdWJLZXkiC2lzU3BvbnNvcmVkIhNnZXRfc3BvbnNvcmVkX3dhdmVzIgxpZENhbGxlckRhdGUiB2J1eU1pbnQiBmlzc3VlciIFYmlkSWQiCGJpZE93bmVyIg0kdDAxMzAzNDEzMTA0IgJpZCIEZGF0ZSIKbmV3X2NhbGxlciIFaXNCaWQiCGJsb2NrRW5kIg5jYWxsZXJJc0lzc3VlciIIdG90YWxORlQiC2FydHdvcmtOYW1lIghpc09uU2FsZSIKYW1vdW50U29sZCIKbWF4Q2FuU2VsbCINJHQwMTQ5MjgxNTEyMCIFYWdlbnQiCmFnZW50U2hhcmUiC3B1YmxpY0FnZW50IhBwdWJsaWNBZ2VudFNoYXJlIg1pc1doaXRlbGlzdGVkIgNjdXQiDWFtb3VudEZvclNpZ24iDmFtb3VudEZvckFnZW50IhRhbW91bnRGb3JQdWJsaWNBZ2VudCIQYW1vdW50Rm9yQ3JlYXRvciINbmV3QW1vdW50U29sZCIJaXNzdWVNZXRhIghpc3N1ZU5GVCIFaWRORlQiCnNlbGxTdGF0dXMiCnJlY2VpdmVORlQiCmFzc2V0SWRCaWQiCWJpZERlbE9sZCIJYmlkVXBkYXRlIgdzb2xkS2V5Iglzb2xkVmFsdWUiCHNvbGREYXRhIhRjb21taXNzaW9uc1dpdGhBZ2VudCIaY29tbWlzc2lvbnNXaXRoUHVibGljQWdlbnQiCnR4VG9DYWxsZXIiBmJ1eVJlcyIIYXNTdHJpbmciAmJ2IgNidjAiBmludm9rZSIDdmFsIgR0eXBlIgdjcmF3bGVyIg0kdDAyMDMwMDIwMzczIg0kdDAyMDQ3NDIwNTQzIg92YWxpZGF0ZUFydHdvcmsiEHdoaXRlbGlzdGVkX2Ryb3AiDSR0MDIwODQyMjA5MjYiCmVudHJ5RXhpc3QiCWhhc2hFeGlzdCIPaXNTaWduQ2VydGlmaWVkIhdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcCINJHQwMjM5NjQyNDAzNCINJHQwMjQwNDQyNDExMyIEZmxhZyIEYWRkciIEbm90ZSINJHQwMjU3NDQyNTc3OCINJHQwMjYyMTQyNjI0OCIMZGF0YVRvRGVsZXRlIgdtYXhNaW50Ig0kdDAyOTA4NDI5MTU0IgZiaWROYnIiCmJhc2VIZWlnaHQiDSR0MDMxNTQwMzE1ODAiDSR0MDMxNTg1MzE2MjEiDSR0MDMyODQxMzI5MTIiB2NhbGxlcjEiDSR0MDMzMTQ3MzMyMDgiDXJldHVybk1vbmV5VG8iCWJpZFN0YXR1cyICdHgiCHZlcmlmaWVyIgNpbnZOAQFhAQFiCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFAWICAAABYwcAAWQJAQV2YWx1ZQEJAKYIAQkBAWEBAg9jb25mX29yYWNsZV9mZWUAAWUJAQV2YWx1ZQEJAKYIAQkBAWEBAhFjb25mX3NpZ253ZWJfZGFwcAABZgkBAWEBAhFjb25mX2ZlZV9yZWNlaXZlcgABZwMFAWMJAQV2YWx1ZQEJAKYIAQIjM010NFJHTUV5alNXWUFvY1RQcWQ1NXdkSFFRQjNQVTJVQ20JAQV2YWx1ZQEJAKYIAQkBAWEBAg9jb25mX3VzZXJzX2RhcHAAAWgJAQV2YWx1ZQEJAKYIAQkBAWEBAhNjb25mX3doaXRlbGlzdF9kYXBwAAFpCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9TSUdOAAFqCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9VU0ROAAFrCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9VU0RUAAFsAQAAAW0JAQFhAQIMY29uZl9hZG1pbl8xAQFuAQFiCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUBZAUBYgIfSW50ZWdlciB1bmRlZmluZSBvciAwIGluIG9yYWNsZQEBbwEBYgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFiAAABAXABAWIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUBaAUBYgAAAQFxAQFiCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFAWIHAAFyAAcAAXMACgABdAkBAWEBAhRjb25mX2RlZmF1bHRfbGljZW5jZQABdQkBAWEBAhljb25mX2RlZmF1bHRfbGljZW5jZV9oYXNoAAF2CQELdmFsdWVPckVsc2UCCQCbCAIFAWcCFGNvbmZfZGFwcF9pc19ydW5uaW5nBgABdwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQFnAhRjb25mX21haW50ZW5hbmNlX21zZwIAAAF4AglTVVNQRU5ERUQAAXkCB1JFTU9WRUQAAXoCDFVOUkVHSVNURVJFRAABQQIHQUxMT1dFRAABQgkBAW4BCQCsAgICEmNlcnRpZmljYXRpb25fZmVlXwkA2AQBBQFpAQFDAwFEAUUBRgQBRwkAnQgCBQFlCQCsAgIJAKwCAgkArAICAghkYXRhX2ZjXwUBRAIBXwUBRQMJAAECBQFHAgZTdHJpbmcEAUgFAUcDCQEIY29udGFpbnMCBQFIBQFGBgcHAQFJAQFKAwkBCGNvbnRhaW5zAgUBSgIBLwMDCQBmAgBMCQCxAgEFAUoJAAACCQCxAgEJAJEDAgkAtQkCBQFKAgEvAAAAOwcJAGYCABAJALECAQkAkQMCCQC1CQIFAUoCAS8AAQcHAQFLAQFMCQAAAgkAsQIBBQFMAEABAU0BAU4JAKwCAgIMdXNlcl9zdGF0dXNfBQFOAQFPAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF9kYXRlXwUBUAIBXwUBTgEBUQIBTgFQCQCsAgIJAKwCAgkArAICAglhcnRfbmFtZV8FAVACAV8FAU4BAVICAU4BUAkArAICCQCsAgIJAKwCAgIJYXJ0X2Rlc2NfBQFQAgFfBQFOAQFTAgFOAVAJAKwCAgkArAICCQCsAgICEGFydF9kaXNwbGF5X2NpZF8FAVACAV8FAU4BAVQCAU4BUAkArAICCQCsAgIJAKwCAgIQYXJ0X2V4cG9ydF9oYXNoXwUBUAIBXwUBTgEBVQIBTgFQCQCsAgIJAKwCAgkArAICAg9hcnRfZXhwb3J0X2NpZF8FAVACAV8FAU4BAVYCAU4BUAkArAICCQCsAgIJAKwCAgIMYXJ0X21heG1pbnRfBQFQAgFfBQFOAQFXAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9zaWduaWRfBQFQAgFfBQFOAQFYAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9pc3N1ZWRfBQFQAgFfBQFOAQFZAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9vbnNhbGVfBQFQAgFfBQFOAQFaAgFOAVAJAKwCAgkArAICCQCsAgICEWFydF9saWNlbmNlX2hhc2hfBQFQAgFfBQFOAQJhYQIBTgFQCQCsAgIJAKwCAgkArAICAhBhcnRfbGljZW5jZV9jaWRfBQFQAgFfBQFOAQJhYgIBTgFQCQCsAgIJAKwCAgkArAICAglhcnRfdGFnc18FAVACAV8FAU4BAmFjAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF90eXBlXwUBUAIBXwUBTgECYWQCAU4BUAkArAICCQCsAgIJAKwCAgIJYXJ0X25vdGVfBQFQAgFfBQFOAQJhZQIBTgFQCQCsAgIJAKwCAgkArAICAhBhcnRfY3Jhd2xlcl9jaWRfBQFQAgFfBQFOAQJhZgIBTgFQCQCsAgIJAKwCAgkArAICAg5hcnRfcm95YWx0aWVzXwUBUAIBXwUBTgECYWcCAU4BUAkArAICCQCsAgIJAKwCAgIKYXJ0X3ByaWNlXwUBUAIBXwUBTgECYWgCAU4BUAkArAICCQCsAgIJAKwCAgIMYXJ0X2VuZHNhbGVfBQFQAgFfBQFOAQJhaQIBTgFQCQCsAgIJAKwCAgkArAICAhJhcnRfYXNzZXRBY2NlcHRlZF8FAVACAV8FAU4BAmFqAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF9mbGFnXwUBUAIBXwUBTgECYWsBAmFsCQCsAgICDWFydGlzdF9hZ2VudF8FAmFsAQJhbQECYWwJAKwCAgIVYXJ0aXN0X2FnZW50X3ByaW1hcnlfBQJhbAECYW4BAmFsCQCsAgICFGFydGlzdF9wdWJsaWNfYWdlbnRfBQJhbAECYW8BAmFsCQCsAgICHGFydGlzdF9wdWJsaWNfYWdlbnRfcHJpbWFyeV8FAmFsAQJhcAIBTgJhcQkArAICCQCsAgIJAKwCAgITZ2V0X2hhc2hieXR4aWRhZGRyXwUCYXECAV8FAU4BAmFyAQFGCQCsAgICEmdldF9vd25lcl9ieV9oYXNoXwUBRgECYXMCAU4CYXQJAKwCAgkArAICCQCsAgICEmdldF9hcnRpZGJ5c2lnbmlkXwUCYXQCAV8FAU4BAmF1AgFGAU4JAKwCAgIXZ2V0X3R4aWRfYnlfaGFzaF9vd25lcl8JANgEAQkA1BYBCQCbAwEJAKwCAgUBRgUBTgECYXYDAmF3AmF4AmF5AwkBASEBCQEBSQEFAmF3CQACAQIRV3JvbmcgRGlzcGxheSBDSUQDCQEBIQEJAQFJAQUCYXgJAAIBAhBXcm9uZyBFeHBvcnQgQ0lEAwMJAQIhPQIFAmF5AgAJAQEhAQkBAUkBBQJheQcJAAIBAhFXcm9uZyBMaWNlbmNlIENJRAYBAmF6AgJhQQJhQgMJAQEhAQkBAUsBBQJhQQkAAgECGEV4cG9ydCBIYXNoIDY0IGNoYXIuIG1heAMJAQEhAQkBAUsBBQJhQgkAAgECGUxpY2VuY2UgSGFzaCA2NCBjaGFyLiBtYXgGAQJhQwICYUQCYUUDCQAAAgkAsQIBBQJhRAAACQACAQIYRmllbGQgY2Fubm90IGJlIGlzIGVtcHR5AwkAZgIJALECAQUCYUQFAmFFCQACAQkArAICBQJhRAIMIGlzIHRvbyBsb25nBgECYUYBAU4EAmFHCQELdmFsdWVPckVsc2UCCQCdCAIFAWcJAQFNAQUBTgUBegMDCQAAAgUCYUcFAXoGCQAAAgUCYUcFAUECLlJlZ2lzdGVyIHRoaXMgYWNjb3VudCBmaXJzdCB3aXRoICJBY2NvdW50IiB0YWIDCQAAAgUCYUcFAXgCEUFjY291bnQgc3VzcGVuZGVkAwkAAAIFAmFHBQF5Ag9BY2NvdW50IHJlbW92ZWQCAAECYUgCAmF5AmFCBAFKAwkAAAIJALECAQUCYXkAAAUBdAUCYXkEAUwDCQAAAgkAsQIBBQJhQgAABQF1BQJhQgkAlAoCBQFKBQFMAQJhSQoBTgJhdwJheAJhSgJhQQJhSwJhTAJhTQJhTgJhTwQCYVAJAQJhRgEFAU4DCQECIT0CBQJhUAIACQACAQUCYVADCQAAAgkAsQIBBQJhdwAACQACAQIbRGlzcGxheSBDSUQgY2Fubm90IGJlIGVtcHR5AwkBASEBCQECYXYDBQJhdwUCYXgFAmFKCQACAQIQUHJvYmxlbSB3aXRoIENJRAMJAQEhAQkBAmF6AgUCYUEFAmFLCQACAQITUHJvYmxlbSB3aXRoIEhhc2hlcwMJAQEhAQkBAmFDAgUCYUwAZAkAAgECEjEwMCBDaGFyLiBtYXggbmFtZQMJAQEhAQkBAmFDAgUCYU0A6AcJAAIBAhoxMDAwIENoYXIuIG1heCBkZXNjcmlwdGlvbgMDCQBmAgAABQJhTwYJAGYCBQJhTwDoBwkAAgECM1JveWFsdGllcyBjYW5ub3QgYmUgbGVzcyB0aGFuIDAlIG9yIGhpZ2hlciB0aGFuIDEwJQMJAGYCCQCQAwEJALUJAgUCYU4CASwABQkAAgECCzUgdGFncyBtYXguAgABAmFRAQJhUgMJAAACCQCQAwEIBQJhUghwYXltZW50cwAACQACAQITTm8gcGF5bWVudCBhdHRhY2hlZAQCYVMJAQV2YWx1ZQEJAJEDAggFAmFSCHBheW1lbnRzAAAEAmFUCQEFdmFsdWUBCAUCYVMGYW1vdW50CQCUCgIFAmFTBQJhVAECYVUBAmFSBAJhVgkBAmFRAQUCYVIEAmFTCAUCYVYCXzEEAmFUCAUCYVYCXzIEAmFXAwMJAQlpc0RlZmluZWQBCAUCYVMHYXNzZXRJZAkAAAIIBQJhUwdhc3NldElkBQFpBwgFAmFTB2Fzc2V0SWQJAAIBAitPbmx5IFNJR04gdG9rZW4gYWNjZXB0ZWQgYXMgdHJhbnNhY3Rpb24gZmVlAwkBAiE9AgUCYVQFAUIJAAIBCQCsAgICGVBheW1lbnQgYW1vdW50IHNob3VsZCBiZSAJAKQDAQUBQgkAlAoCBQJhVAUCYVcBAmFYAgJhWQFQBAFHCQCaCAIFBHRoaXMJAQFYAgUCYVkFAVADCQABAgUBRwIDSW50BAJhWgUBRwMJAQIhPQIFAmFaAAAGBwcBAmJhAwJhUgJiYgJiYwQCYmQJAQJhUQEFAmFSBAJhUwgFAmJkAl8xBAJhVAgFAmJkAl8yBAJhVwMJAQEhAQkBCWlzRGVmaW5lZAEIBQJhUwdhc3NldElkBQR1bml0AwMJAGYCCQCxAgEFAmJiAAAJAAACCQDYBAEJAQV2YWx1ZQEIBQJhUwdhc3NldElkBQJiYgcIBQJhUwdhc3NldElkCQACAQIOV3JvbmcgYXNzZXQgaWQDAwkAAAIFAmFXBQR1bml0CQECIT0CBQJiYgIABwkAAgECDldyb25nIGFzc2V0IGlkAwkBAiE9AgUCYmMFAmFUCQACAQITUGF5bWVudCBkb24ndCBtYXRjaAkAlAoCBQJhVAUCYVcBAmJlAQJhVwMDAwMDCQECIT0CBQJhVwkA2AQBBQFpCQECIT0CBQJhVwkA2AQBBQFsBwkBAiE9AgUCYVcCBVdBVkVTBwkBAiE9AgUCYVcJANgEAQUBagcJAQIhPQIFAmFXCQDYBAEFAWsHCQACAQImT25seSBTSUdOLCBVU0ROLFVTRFQgb3IgV0FWRVMgYWNjZXB0ZWQGAQJiZgICYVcCYmcEAmJoAwUBYwAKCQEBbgECDndhdmVzX21pbl9zZWxsBAJiaQDAhD0EAmJqAwUBYwABCQBoAgUBQgACAwMDAwMDCQAAAgUCYVcJANgEAQUBagkAZgIFAmJpBQJiZwcJAQIhPQIFAmJnAAAHBgMDCQAAAgUCYVcJANgEAQUBawkAZgIFAmJpBQJiZwcJAQIhPQIFAmJnAAAHBgMDCQAAAgUCYVcJANgEAQUBaQkAZgIFAmJqBQJiZwcJAQIhPQIFAmJnAAAHBgMDAwkAAAIFAmFXCQDYBAEFAWwGCQAAAgUCYVcCBVdBVkVTCQBmAgUCYmgFAmJnBwkBAiE9AgUCYmcAAAcJAAIBAhhXcm9uZyBtaW5pbXVtIHNlbGwgcHJpY2UGAQJiawECYVcDCQAAAgUCYVcCBVdBVkVTBQR1bml0CQDZBAEFAmFXAQJibAECYm0EAmJuCQEBYQEJAKwCAgUCYm0CBV9PUEVOAwkAAAIFAmJuAgAJAAIBAg1CaWQgbm90IGZvdW5kBAJibwkAtQkCBQJibgIBXwQCYnAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJibwABBAJicQkBAmJrAQkAkQMCBQJibwAAAwkAZwIAAAUCYnAJAAIBAgxXcm9uZyBhbW91bnQJAJQKAgUCYnAFAmJxAQJicgICYVICYnMDCQEBIQEFAXYJAAIBBQF3BAJidAMJAQIhPQIFAmJzAgAJAQt2YWx1ZU9yRWxzZQIJAQFwAQkArAICCQClCAEJAKcIAQkA2QQBBQJicwIJX2ZyZWVfdHhzAAAAAAQBTgMDCQAAAgkA2AQBCAgFAmFSBmNhbGxlcgVieXRlcwkApQgBBQR0aGlzCQBmAgUCYnQAAAcJAKUIAQkApwgBCQDZBAEFAmJzCQDYBAEICAUCYVIGY2FsbGVyBWJ5dGVzBAJidQMDCQECIT0CBQJicwIACQBmAgUCYnQAAAcJAPwHBAUBaAIJdXNlRnJlZVR4CQDMCAIJAKUIAQkApwgBCQDZBAEFAmJzBQNuaWwFA25pbAUEdW5pdAkAlgoECQDYBAEIBQJhUg10cmFuc2FjdGlvbklkBQFOCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUCYnQBAmJ2AQJhUgMJAQEhAQUBdgkAAgEFAXcJAJUKAwkA2AQBCAUCYVINdHJhbnNhY3Rpb25JZAkA2AQBCAgFAmFSBmNhbGxlcgVieXRlcwgFCWxhc3RCbG9jawl0aW1lc3RhbXABAmJ3BgJhUgFQAmJ4AmJ5AmJ6AmJzBAJiQQkBAmJyAgUCYVIFAmJzBAJiQggFAmJBAl8xBAFOCAUCYkECXzIEAmJDCAUCYkECXzMEAmJ0CAUCYkECXzQEAmJEAwMJAAACCQDYBAEICAUCYVIGY2FsbGVyBWJ5dGVzCQClCAEFBHRoaXMJAGYCBQJidAAABwkApQgBCQCnCAEJANkEAQUCYnMJANgEAQgIBQJhUgZjYWxsZXIFYnl0ZXMDBgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFAmJEAgMgLyAFAmJ4AgMgLyAFAmJ6AgMgLyAFAmJzBAJiRQMDAwkAAAIFAU4FAmJ4CQECIT0CBQJiegIABwkBAiE9AgUCYnkCAAcGBwQCYkYJAQFvAQkBAmFoAgUBTgUBUAMDAwkBAiE9AgUCYkYAAAkAZwIFBmhlaWdodAUCYkYHCQEBIQEFAmJFBwkAAgECC1NhbGUgZW5kZWQuBAJiRwkAAAIFAU4FAmJ4BAJiSAkBAW8BAhB0b3RhbF9uZnRfaXNzdWVkBAFECQEBYQEJAQFXAgUCYngFAVAEAmJJCQEBYQEJAQFRAgUCYngFAVADCQAAAgUCYkkCAAkAAgECEUFydCBkb2Vzbid0IGV4aXN0BAJiSgkBAXEBCQEBWQIFAmJ4BQFQBAJiSwkBAW8BCQEBWAIFAmJ4BQFQBAJiYwMFAmJHCQBoAgUBQgACCQEBbwEJAQJhZwIFAmJ4BQFQBAJiYgMFAmJHCQDYBAEFAWkJAQFhAQkBAmFpAgUCYngFAVAEAmJMCQEBbwEJAQFWAgUCYngFAVADAwMJAQEhAQUCYkUJAQEhAQUCYkcHAwMJAGcCAAAFAmJjBgkBASEBBQJiSgYJAGcCAAAFAmJMBwkAAgECEEFydCBub3QgZm9yIHNhbGUDAwMJAQEhAQUCYkUFAmJHBwkAZwIAAAUCYkwHCQACAQIUTWF4IGlzc3VhYmxlIG5vdCBzZXQEAmFQCQECYUYBBQJieAMDBQJiRQkBAiE9AgUCYVACAAcJAAIBBQJhUAQCYm0JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUBUAIBXwUCYngCAV8FAmJ6AgFfBQJieQQCYk0DBQJiRQkBAmJsAQUCYm0JAQJiYQMFAmFSBQJiYgUCYmMEAmFUCAUCYk0CXzEEAmFXCAUCYk0CXzIEAmJOCQELdmFsdWVPckVsc2UCCQCdCAIFAWcJAQJhawEFAmJ4BQFmBAJiTwkBC3ZhbHVlT3JFbHNlAgkAmggCBQFnCQECYW0BBQJieAAABAJiUAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQFnCQECYW4BBQJieAUBZgQCYlEJAQt2YWx1ZU9yRWxzZQIJAJoIAgUBZwkBAmFvAQUCYngAAAQCYlIJAQFwAQUCYngEAmJTAwkAZgIFAmJSBQZoZWlnaHQAAAMJAAACBQJhVwUBaQUBcgUBcwQCYlQJAGsDBQJhVAUCYlMAZAQCYlUDAwMJAQIhPQIFAmJOBQFmCQBmAgUCYk8AAAcJAGYCBQZoZWlnaHQFAmJSBwkAawMFAmFUBQJiTwCQTgAABAJiVgMDAwkBAiE9AgUCYlAFAWYJAGYCBQJiUQAABwkAZgIFBmhlaWdodAUCYlIHCQBrAwUCYVQFAmJRAJBOAAAEAmJXCQBlAgUCYVQFAmJUAwkAAAIFAmJLBQJiTAkAAgECDEFydCBzb2xkIG91dAQCYlgJAGQCBQJiSwABBAJiWQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCUNyZWF0b3I6IAUCYngCCiwKIEFydElEOiAFAVACCywKIFNpZ25JRDogBQFEAhEsCiBBcnR3b3JrIG5hbWU6IAUCYkkCCiwKIElzc3VlOiAJAKQDAQUCYlgCAS8JAKQDAQUCYkwEAmJaCQDCCAUJAKwCAgIDU0FfCQCkAwEJAGQCBQJiSAABBQJiWQABAAAHBAJjYQkAuAgBBQJiWgQCY2IDAwkAAAIFAmJYBQJiTAYJAQEhAQUCYkoHBgQCY2MDAwMJAAACBQFOBQJieAkBAiE9AgUCYnoCAAcJAQIhPQIFAmJ5AgAHCQERQGV4dHJOYXRpdmUoMTA2MikBBQJieggFAmFSBmNhbGxlcgQCY2QDCQEBIQEJAQlpc0RlZmluZWQBBQJhVwIFV0FWRVMJANgEAQkBBXZhbHVlAQUCYVcEAmJuCQEBYQEJAKwCAgUCYm0CBV9PUEVOBAJjZQkBC0RlbGV0ZUVudHJ5AQkArAICBQJibQIFX09QRU4EAmNmCQELU3RyaW5nRW50cnkCCQCsAgIFAmJtAgdfQ0xPU0VECQCsAgIJAKwCAgUCYm4CAV8JAKQDAQUCYkMEAmNnCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCWFydF9zb2xkXwkApAMBBQJiWAIEX29mXwkApAMBBQJiTAIBXwUBUAIBXwUCYngEAmNoAwkBASEBBQJiRQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQFOAgFfCQCkAwEFAmJDAgFfBQJiQgIBXwkApAMBBQJiYwIBXwUCYmICAV8JANgEAQUCY2EJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBBQJjYwIBXwkApAMBBQJiQwIBXwUCYkICAV8JAKQDAQUCYVQCAV8FAmNkAgFfCQDYBAEFAmNhBAJjaQkBC1N0cmluZ0VudHJ5AgUCY2cFAmNoBAJjagMJAQIhPQIFAmJVAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAWYJAGUCBQJiVAUCYlUFAmFXCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQJiTgUCYlUFAmFXBQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAWYFAmJUBQJhVwUDbmlsBAJjawMJAQIhPQIFAmJWAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAmJQBQJiVgUCYVcJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAmJ4CQBlAgUCYlcFAmJWBQJhVwUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQJieAUCYlcFAmFXBQNuaWwEAmNsAwkAZgIFAmJ0AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAU4AAAUEdW5pdAUDbmlsBQNuaWwEAmNtCQDOCAIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBWAIFAmJ4BQFQBQJiWAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgICBG5mdF8JANgEAQUCY2EFAmNnCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhB0b3RhbF9uZnRfaXNzdWVkCQBkAgUCYkgAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFoAgUCYngFAVAAAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAVkCBQJieAUBUAUCY2IJAMwIAgUCYloJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCY2MAAQUCY2EFA25pbAUCY2oFAmNrBQJjbAMFAmJFCQDMCAIFAmNpCQDMCAIFAmNmCQDMCAIFAmNlBQJjbQkAzAgCBQJjaQUCY20BAmNuAQJjbwQBRwUCY28DCQABAgUBRwIGU3RyaW5nBAJjcAUBRwUCY3AJAAIBAiRTcG9uc29yZWQgUHVibGljIEtleSBTdHJpbmcgZXhwZWN0ZWQKAmNxAQdzZXRDb25mAgFiAmNyBAFOCQClCAEIBQJjcQZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQFtCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQFOAwkBCGNvbnRhaW5zAgUBYgIFY29uZl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUBYgUCY3IFA25pbAkAAgECIEVudHJpZXMgc3RhcnRpbmcgd2l0aCBjb25mXyBvbmx5CQACAQIiWW91IGFyZSBub3QgYWxsb3dlZCB0byBjaGFuZ2UgdGhpcwJhUgEKYWRkQXJ0d29yaw4BRgFEAmFMAmFNAmFOAmNzAmF3AmFBAmF4AmFCAmF5AmN0AmFPAmJzBAJjdQkBAmJyAgUCYVIFAmJzBAFQCAUCY3UCXzEEAU4IBQJjdQJfMgQCYkMIBQJjdQJfMwQCYnQIBQJjdQJfNAMJAQEhAQkBAUsBBQFGCQACAQIkSGFzaCBzaG91bGQgYmUgNjQgY2hhcmFjdGVycyBtYXhpbXVtBAJjdgkBAmFIAgUCYXkFAmFCBAJhSggFAmN2Al8xBAJhSwgFAmN2Al8yBAJjdwkBAmFJCgUBTgUCYXcFAmF4BQJhSgUCYUEFAmFLBQJhTAUCYU0FAmFOBQJhTwMJAQIhPQIFAmN3AgAJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEEAmN4CQBmAgkBAXABCQCsAgIFAU4CC19mcmVlX2Ryb3BzAAAEAmN5AwUCY3gJAJQKAgAABQFECQECYVUBBQJhUgQCYVQIBQJjeQJfMQQCYVcIBQJjeQJfMgMJAQEhAQkBCWlzRGVmaW5lZAEFAmFUCQACAQIUU29tZXRoaW5nIHdlbnQgd3JvbmcEAmN6CQEBYQEJAQJhdQIFAUYFAU4DCQECIT0CBQJjegIACQACAQIUWW91IGFscmVhZHkgYWRkZWQgaXQEAmNBCQEBYQEJAQJhcgEFAUYDCQECIT0CBQJjQQIACQACAQIXSGFzaCBhbHJlYWR5IHJlZ2lzdGVyZWQEAmNCCQEBQwMFAUQFAU4FAUYDCQEBIQEFAmNCCQACAQIsU2lnbiBDZXJ0aWZpY2F0ZSBub3QgZm91bmQgZm9yIHRoaXMgYWRkcmVzcy4EAmNDAwUCY3gJAPwHBAUBaAILdXNlRnJlZURyb3AJAMwIAgUBTgUDbmlsBQNuaWwFBHVuaXQDCQAAAgUCY0MFAmNDBAJjbAMJAGYCBQJidAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQFOAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFyAQUBRgUBTgkAzAgCCQELU3RyaW5nRW50cnkCCQECYXUCBQFGBQFOBQFQCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBTwIFAU4FAVAFAmJDCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFRAgUBTgUBUAUCYUwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVICBQFOBQFQBQJhTQkAzAgCCQELU3RyaW5nRW50cnkCCQEBUwIFAU4FAVAFAmF3CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFVAgUBTgUBUAUCYXgJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVQCBQFOBQFQBQJhQQkAzAgCCQELU3RyaW5nRW50cnkCCQEBWgIFAU4FAVAFAmFLCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYQIFAU4FAVAFAmFKCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYwIFAU4FAVAFAmNzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYgIFAU4FAVAFAmFOCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVgIFAU4FAVAAAAkAzAgCCQELU3RyaW5nRW50cnkCCQEBVwIFAU4FAVAFAUQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFYAgUBTgUBUAAACQDMCAIJAQxCb29sZWFuRW50cnkCCQEBWQIFAU4FAVAHCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhcwIFAU4FAUQFAVAJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFwAgUBTgUBUAUBRgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWUCBQFOBQFQBQJjdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFmAgUBTgUBUAUCYU8JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAWYFAmFUBQFpBQNuaWwFAmNsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFSAQ11cGRhdGVBcnR3b3JrDQJhcQJhTAJhTQJhTgJjcwJhdwJhQQJheAJhQgJheQJjdAJhTwJicwMJAQEhAQUBdgkAAgEFAXcEAmNECQECYnICBQJhUgUCYnMEAmJCCAUCY0QCXzEEAU4IBQJjRAJfMgQCYkMIBQJjRAJfMwQCYnQIBQJjRAJfNAQCY0UJAQJhSAIFAmF5BQJhQgQCYUoIBQJjRQJfMQQCYUsIBQJjRQJfMgQCY3cJAQJhSQoFAU4FAmF3BQJheAUCYUoFAmFBBQJhSwUCYUwFAmFNBQJhTgUCYU8DCQECIT0CBQJjdwIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAJjegkBAWEBCQEBUQIFAU4FAmFxAwkAAAIFAmN6AgAJAAIBAg9FbnRyeSBub3QgZm91bmQEAmNGCQEBYQEJAQJhagIFAU4FAmFxAwkAAAIFAmNGAgdJTExFR0FMCQACAQIdQ2Fubm90IHVwZGF0ZSBJTExFR0FMIGFydHdvcmsDCQEBIQEJAQJhWAIFAU4FAmFxBAJjbAMJAGYCBQJidAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQFOAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVECBQFOBQJhcQUCYUwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVICBQFOBQJhcQUCYU0JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVMCBQFOBQJhcQUCYXcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVUCBQFOBQJhcQUCYXgJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVQCBQFOBQJhcQUCYUEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFhAgUBTgUCYXEFAmFKCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFaAgUBTgUCYXEFAmFLCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYgIFAU4FAmFxBQJhTgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWMCBQFOBQJhcQUCY3MJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFlAgUBTgUCYXEFAmN0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWYCBQFOBQJhcQUCYU8FA25pbAUCY2wJAAIBAg5BbHJlYWR5IG1pbnRlZAJhUgELZmxhZ0FydHdvcmsEAVACY0cCY0YCY0gEAmNJCQECYnYBBQJhUgQCYkIIBQJjSQJfMQQBTggFAmNJAl8yAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUBbQkAzAgCCQClCAEFBHRoaXMFA25pbAUBTgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAICB0NPTlNFTlQJAMwIAgIACQDMCAICD0NIQU5HRV9SRVFVSVJFRAkAzAgCAgdGTEFHR0VECQDMCAICB0lMTEVHQUwFA25pbAUCY0YJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFqAgUCY0cFAVAFAmNGCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhZAIFAmNHBQFQBQJjSAUDbmlsCQACAQkArAICAg5Vbmtub3cgc3RhdHVzIAUCY0YJAAIBAhNZb3UgYXJlIG5vdCBhbGxvd2VkAmFSAQ1kZWxldGVBcnR3b3JrAgFQAmNHBAJjSgkBAmJ2AQUCYVIEAmJCCAUCY0oCXzEEAU4IBQJjSgJfMgQCYVkDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQFtCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQFOBQJjRwUBTgQCY3oJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBAWEBCQEBUQIFAmFZBQFQAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwMJAAACBQJjegIACQACAQIgTm8gYXJ0IG1hdGNoaW5nIGZvciB0aGlzIGFkZHJlc3MEAUYJAQFhAQkBAmFwAgUCYVkFAVADCQAAAgUBRgIACQACAQIlTm8gYXJ0IGhhc2ggbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwQBRAkBAWEBCQEBVwIFAmFZBQFQAwkAAAIFAUQCAAkAAgECE05vIFNJR04gSUQgbWF0Y2hpbmcEAmNLCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFPAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVECBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBUgIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFTAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVUCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBVAIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFaAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFhAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFjAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFiAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVYCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBVwIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFYAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVkCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWoCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWcCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWkCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYXIBBQFGCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhcwIFAmFZBQFECQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhdQIFAUYFAmFZCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhaAIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhZAIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhZQIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhZgIFAmFZBQFQBQNuaWwDCQEBIQEJAQJhWAIFAmFZBQFQAwkBASEBBQF2CQACAQUBdwUCY0sDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQFtCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQFOBQJjSwkAAgECKEFydCBhbHJlYWR5IG1pbnRlZCwgeW91IGNhbm5vdCBkZWxldGUgaXQCYVIBC3NlbGxBcnR3b3JrBgFQAmJnAmNMAmFXAmJGAmJzBAJjTQkBAmJyAgUCYVIFAmJzBAJiQggFAmNNAl8xBAFOCAUCY00CXzIEAmJDCAUCY00CXzMEAmJ0CAUCY00CXzQEAmJJCQEBYQEJAQFRAgUBTgUBUAMJAAACBQJiSQIACQACAQIjVGhpcyBhcnQgZG9lc24ndCBtYXRjaCB5b3VyIGFjY291bnQEAmNGCQEBYQEJAQJhagIFAU4FAVADCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAg9DSEFOR0VfUkVRVUlSRUQJAMwIAgIHRkxBR0dFRAkAzAgCAgdJTExFR0FMBQNuaWwFAmNGCQACAQIPRmxhZ2dlZCBhcnR3b3JrBAJjTgkBAW8BCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUBUAMJAGYCAAAFAmJGCQACAQIMTmVnYXRpdmUgZW5kAwMJAGYCBQJiRgAAAwkBAiE9AgUCY0wAAQYJAQIhPQIFAmJnAAAHCQACAQI6VGltZWQgb2ZmZXIgb25seSBhbGxvd2VkIGZvciB1bmlxdWUgZWRpdGlvbiBhbmQgb2ZmZXIgb25seQQCY08DCQAAAgUCYkYAAAAABQZoZWlnaHQDCQEBIQEJAQJiZQEFAmFXCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchAwkBASEBCQECYmYCBQJhVwUCYmcJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEEAmFQCQECYUYBBQFOAwkBAiE9AgUCYVACAAkAAgEFAmFQBAJiSwkBAW8BCQEBWAIFAU4FAVAEAmJMCQEBbwEJAQFWAgUBTgUBUAMJAGYCBQJjTABkCQACAQIcMTAwIGVkaXRpb25zIG1heCBwZXIgYXJ0d29yawMDCQECIT0CBQJiSwAACQAAAgUCYksFAmJMBwkAAgECFE1heCBlZGl0aW9uIHJlYWNoZWQuAwMJAGYCBQJiSwAACQECIT0CBQJiTAUCY0wHCQACAQImQ2Fubm90IGNoYW5nZSBtYXhpbXVtIGlzc3VhYmxlIGFueW1vcmUDAwkAZgIFAmNOAAAJAQIhPQIFAmJMBQJjTAcJAAIBAjFDYW5ub3QgY2hhbmdlIG1heGltdW0gaXNzdWFibGUgd2l0aCBhY3RpdmUgb3JkZXJzBAJjYgMDCQBmAgUCYmcAAAkAZgIFAmNMAAAHBgcEAmNsAwkAZgIFAmJ0AAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAU4AAAUEdW5pdAUDbmlsBQNuaWwJAM4IAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAVkCBQFOBQFQBQJjYgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFnAgUBTgUBUAUCYmcJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFWAgUBTgUBUAUCY0wJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFpAgUBTgUBUAUCYVcJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhaAIFAU4FAVAJAGQCBQJjTwUCYkYFA25pbAUCY2wCYVIBCmJ1eUFydHdvcmsCAVACYngJAQJidwYFAmFSBQFQBQJieAIAAgACAAJhUgEGc2V0QmlkAgFQAmJ4BAJjUAkBAmJ2AQUCYVIEAmJCCAUCY1ACXzEEAU4IBQJjUAJfMgQCYkMIBQJjUAJfMwQCY1EJAQJhUQEFAmFSBAJhUwgFAmNRAl8xBAJhVAgFAmNRAl8yBAJhVwMJAQEhAQkBCWlzRGVmaW5lZAEIBQJhUwdhc3NldElkAgVXQVZFUwkA2AQBCQEFdmFsdWUBCAUCYVMHYXNzZXRJZAQCYkYJAQFvAQkBAmFoAgUCYngFAVADAwkBAiE9AgUCYkYAAAkAZwIFBmhlaWdodAUCYkYHCQACAQILU2FsZSBlbmRlZC4EAmNOCQEBbwEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQFQAwkBASEBCQECYmUBBQJhVwkAAgECEmFzc2V0IG5vdCBhY2NlcHRlZAMJAQEhAQkBAmJmAgUCYVcFAmFUCQACAQIOV3JvbmcgbWluIHNlbGwEAmJLCQEBbwEJAQFYAgUCYngFAVAEAmJMCQEBbwEJAQFWAgUCYngFAVADCQBnAgAABQJiTAkAAgECI05vIG1heCBlZGl0aW9uIHNldCBmb3IgdGhpcyBhcnR3b3JrAwkAZwIFAmJLBQJiTAkAAgECGFNvbGQgb3V0LCB5b3UgY2Fubm90IGJpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUBUAIBXwUCYngCAV8FAU4CAV8FAmJCAgVfT1BFTgkArAICCQCsAgIJAKwCAgkArAICBQJhVwIBXwkApAMBBQJhVAIBXwkApAMBBQJiQwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FAVAJAGQCBQJjTgABBQNuaWwCYVIBCWFjY2VwdEJpZAUBUAJieAJieQJiegJicwQCY1IJAQJicgIFAmFSBQJicwQCYkIIBQJjUgJfMQQCY1MIBQJjUgJfMgQCYkMIBQJjUgJfMwQCYnQIBQJjUgJfNAMJAQIhPQIFAmNTBQJieAkAAgECGVlvdSBjYW5ub3QgZG8gdGhpcyBhY3Rpb24JAQJidwYFAmFSBQFQBQJieAUCYnkFAmJ6BQJicwJhUgEJY2FuY2VsQmlkBAFQAmJ4AmJ5AmJ6BAJjVAkBAmJ2AQUCYVIEAmJCCAUCY1QCXzEEAU4IBQJjVAJfMgQCYkMIBQJjVAJfMwMDCQECIT0CBQFOBQJiegkBAiE9AgUBTgUCYngHCQACAQIZWW91IGNhbm5vdCBkbyB0aGlzIGFjdGlvbgQCY1UDCQAAAgUBTgUCYngFAmJ6BQFOBAJjTgkBAW8BCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUBUAQCYm0JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUBUAIBXwUCYngCAV8FAmJ6AgFfBQJieQQCYm4JAQFhAQkArAICBQJibQIFX09QRU4DCQAAAgUCYm4CAAkAAgECDUJpZCBub3QgZm91bmQEAmJvCQC1CQIFAmJuAgFfBAJhVwkBAmJrAQkAkQMCBQJibwAABAJjVgIIQ0FOQ0VMRUQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQJibQIFX09QRU4JAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIFAmJtAgFfBQJjVgkArAICCQCsAgIFAmJuAgFfCQCkAwEFAmJDCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUBUAkAZQIFAmNOAAEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAmNVCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCYm8AAQUCYVcFA25pbAECY1cBAmNYAAQBRwUCY1cDCQABAgUBRwIXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EAmNZBQFHAwMDAwkAAAIIBQJjWQhmdW5jdGlvbgIKYWRkQXJ0d29yawkAAAIIBQJjWQRkQXBwBQR0aGlzBwkAAAIIBQJjWQNmZWUAoMIeBwkAAAIIBQJjWQpmZWVBc3NldElkBQR1bml0BwkA9AMDCAUCY1cJYm9keUJ5dGVzCQCRAwIIBQJjVwZwcm9vZnMAAAkA2QQBCQECY24BCQCRAwIIBQJjWQRhcmdzAA0DAwMDCQAAAggFAmNZCGZ1bmN0aW9uAg11cGRhdGVBcnR3b3JrCQAAAggFAmNZBGRBcHAFBHRoaXMHCQAAAggFAmNZA2ZlZQCgwh4HCQAAAggFAmNZCmZlZUFzc2V0SWQFBHVuaXQHCQD0AwMIBQJjVwlib2R5Qnl0ZXMJAJEDAggFAmNXBnByb29mcwAACQDZBAEJAQJjbgEJAJEDAggFAmNZBGFyZ3MADAMDAwMJAAACCAUCY1kIZnVuY3Rpb24CC3NlbGxBcnR3b3JrCQAAAggFAmNZBGRBcHAFBHRoaXMHCQAAAggFAmNZA2ZlZQCgwh4HCQAAAggFAmNZCmZlZUFzc2V0SWQFBHVuaXQHCQD0AwMIBQJjVwlib2R5Qnl0ZXMJAJEDAggFAmNXBnByb29mcwAACQDZBAEJAQJjbgEJAJEDAggFAmNZBGFyZ3MABQMDAwMJAAACCAUCY1kIZnVuY3Rpb24CCWFjY2VwdEJpZAkAAAIIBQJjWQRkQXBwBQR0aGlzBwkAAAIIBQJjWQNmZWUAoMIeBwkAAAIIBQJjWQpmZWVBc3NldElkBQR1bml0BwkAyBMDCAUCY1cJYm9keUJ5dGVzCQCRAwIIBQJjVwZwcm9vZnMAAAkA2QQBCQECY24BCQCRAwIIBQJjWQRhcmdzAAQJAPQDAwgFAmNXCWJvZHlCeXRlcwkAkQMCCAUCY1cGcHJvb2ZzAAAIBQJjVw9zZW5kZXJQdWJsaWNLZXkJAPQDAwgFAmNXCWJvZHlCeXRlcwkAkQMCCAUCY1cGcHJvb2ZzAAAIBQJjVw9zZW5kZXJQdWJsaWNLZXkzuyac", "height": 2503580, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BUWmPvsmKTKiion78DmS9xZrAgfxnnbvdQAyyGR6M7SA Next: F4ePAvJhj9mAsWMcfc8YpYFFiTVRfKRuVPDexPShyUwQ Diff:
OldNewDifferences
405405 let caller = $t01303413104._2
406406 let date = $t01303413104._3
407407 let isSponsored = $t01303413104._4
408+ let new_caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
409+ then (isSponsored > 0)
410+ else false)
411+ then toString(addressFromPublicKey(fromBase58String(pubKey)))
412+ else toBase58String(i.caller.bytes)
408413 if (true)
409- then throw(toString(isSponsored))
414+ then throw(((((((new_caller + " / ") + issuer) + " / ") + bidOwner) + " / ") + pubKey))
410415 else {
411- let new_caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
412- then (isSponsored > 0)
416+ let isBid = if (if (if ((caller == issuer))
417+ then (bidOwner != "")
413418 else false)
414- then toString(addressFromPublicKey(fromBase58String(pubKey)))
415- else toBase58String(i.caller.bytes)
416- if (true)
417- then throw(((((((new_caller + " / ") + issuer) + " / ") + bidOwner) + " / ") + pubKey))
419+ then (bidId != "")
420+ else false)
421+ then true
422+ else false
423+ let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
424+ if (if (if ((blockEnd != 0))
425+ then (height >= blockEnd)
426+ else false)
427+ then !(isBid)
428+ else false)
429+ then throw("Sale ended.")
418430 else {
419- let isBid = if (if (if ((caller == issuer))
420- then (bidOwner != "")
421- else false)
422- then (bidId != "")
423- else false)
424- then true
425- else false
426- let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
427- if (if (if ((blockEnd != 0))
428- then (height >= blockEnd)
429- else false)
430- then !(isBid)
431- else false)
432- then throw("Sale ended.")
431+ let callerIsIssuer = (caller == issuer)
432+ let totalNFT = getIntegerByKey("total_nft_issued")
433+ let signID = getStringByKey(keySignID(issuer, artId))
434+ let artworkName = getStringByKey(keyName(issuer, artId))
435+ if ((artworkName == ""))
436+ then throw("Art doesn't exist")
433437 else {
434- let callerIsIssuer = (caller == issuer)
435- let totalNFT = getIntegerByKey("total_nft_issued")
436- let signID = getStringByKey(keySignID(issuer, artId))
437- let artworkName = getStringByKey(keyName(issuer, artId))
438- if ((artworkName == ""))
439- then throw("Art doesn't exist")
440- else {
441- let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
442- let amountSold = getIntegerByKey(keyIssued(issuer, artId))
443- let artworkPrice = if (callerIsIssuer)
444- then (currentCertificationPrice * 2)
445- else getIntegerByKey(keyPrice(issuer, artId))
446- let priceAssetId = if (callerIsIssuer)
447- then toBase58String(signAssetId)
448- else getStringByKey(keyAssetIdAccepted(issuer, artId))
449- let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
450- if (if (if (!(isBid))
451- then !(callerIsIssuer)
452- else false)
453- then if (if ((0 >= artworkPrice))
454- then true
455- else !(isOnSale))
456- then true
457- else (0 >= maxCanSell)
458- else false)
459- then throw("Art not for sale")
460- else if (if (if (!(isBid))
461- then callerIsIssuer
438+ let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
439+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
440+ let artworkPrice = if (callerIsIssuer)
441+ then (currentCertificationPrice * 2)
442+ else getIntegerByKey(keyPrice(issuer, artId))
443+ let priceAssetId = if (callerIsIssuer)
444+ then toBase58String(signAssetId)
445+ else getStringByKey(keyAssetIdAccepted(issuer, artId))
446+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
447+ if (if (if (!(isBid))
448+ then !(callerIsIssuer)
449+ else false)
450+ then if (if ((0 >= artworkPrice))
451+ then true
452+ else !(isOnSale))
453+ then true
454+ else (0 >= maxCanSell)
455+ else false)
456+ then throw("Art not for sale")
457+ else if (if (if (!(isBid))
458+ then callerIsIssuer
459+ else false)
460+ then (0 >= maxCanSell)
461+ else false)
462+ then throw("Max issuable not set")
463+ else {
464+ let checkUser = validateUser(issuer)
465+ if (if (isBid)
466+ then (checkUser != "")
462467 else false)
463- then (0 >= maxCanSell)
464- else false)
465- then throw("Max issuable not set")
468+ then throw(checkUser)
466469 else {
467- let checkUser = validateUser(issuer)
468- if (if (isBid)
469- then (checkUser != "")
470+ let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
471+ let $t01492815120 = if (isBid)
472+ then getPriceAssetIdFromBid(bidDataKey)
473+ else validatePriceAssetId(i, priceAssetId, artworkPrice)
474+ let amount = $t01492815120._1
475+ let assetId = $t01492815120._2
476+ let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
477+ let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
478+ let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
479+ let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
480+ let isWhitelisted = checkWhitelist(issuer)
481+ let cut = if ((isWhitelisted > height))
482+ then 0
483+ else if ((assetId == signAssetId))
484+ then signCut
485+ else usdnWaveCut
486+ let amountForSign = fraction(amount, cut, 100)
487+ let amountForAgent = if (if (if ((agent != feeReceiver))
488+ then (agentShare > 0)
470489 else false)
471- then throw(checkUser)
490+ then (height > isWhitelisted)
491+ else false)
492+ then fraction(amount, agentShare, 10000)
493+ else 0
494+ let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
495+ then (publicAgentShare > 0)
496+ else false)
497+ then (height > isWhitelisted)
498+ else false)
499+ then fraction(amount, publicAgentShare, 10000)
500+ else 0
501+ let amountForCreator = (amount - amountForSign)
502+ if ((amountSold == maxCanSell))
503+ then throw("Art sold out")
472504 else {
473- let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
474- let $t01498015172 = if (isBid)
475- then getPriceAssetIdFromBid(bidDataKey)
476- else validatePriceAssetId(i, priceAssetId, artworkPrice)
477- let amount = $t01498015172._1
478- let assetId = $t01498015172._2
479- let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
480- let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
481- let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
482- let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
483- let isWhitelisted = checkWhitelist(issuer)
484- let cut = if ((isWhitelisted > height))
485- then 0
486- else if ((assetId == signAssetId))
487- then signCut
488- else usdnWaveCut
489- let amountForSign = fraction(amount, cut, 100)
490- let amountForAgent = if (if (if ((agent != feeReceiver))
491- then (agentShare > 0)
492- else false)
493- then (height > isWhitelisted)
494- else false)
495- then fraction(amount, agentShare, 10000)
496- else 0
497- let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
498- then (publicAgentShare > 0)
499- else false)
500- then (height > isWhitelisted)
501- else false)
502- then fraction(amount, publicAgentShare, 10000)
503- else 0
504- let amountForCreator = (amount - amountForSign)
505- if ((amountSold == maxCanSell))
506- then throw("Art sold out")
507- else {
508- let newAmountSold = (amountSold + 1)
509- let issueMeta = ((((((((((("Creator: " + issuer) + ",
505+ let newAmountSold = (amountSold + 1)
506+ let issueMeta = ((((((((((("Creator: " + issuer) + ",
510507 ArtID: ") + artId) + ",
511508 SignID: ") + signID) + ",
512509 Artwork name: ") + artworkName) + ",
513510 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
514- let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
515- let idNFT = calculateAssetId(issueNFT)
516- let sellStatus = if (if ((newAmountSold == maxCanSell))
517- then true
518- else !(isOnSale))
519- then false
520- else true
521- let receiveNFT = if (if (if ((caller == issuer))
522- then (bidOwner != "")
523- else false)
524- then (bidId != "")
525- else false)
526- then addressFromStringValue(bidOwner)
527- else i.caller
528- let assetIdBid = if (!(isDefined(assetId)))
529- then "WAVES"
530- else toBase58String(value(assetId))
531- let bidData = getStringByKey((bidDataKey + "_OPEN"))
532- let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
533- let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
534- let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
535- let soldValue = if (!(isBid))
536- then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
537- else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
538- let soldData = StringEntry(soldKey, soldValue)
539- let commissionsWithAgent = if ((amountForAgent != 0))
540- then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
541- else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
542- let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
543- then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
544- else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
545- let txToCaller = if ((isSponsored > 0))
546- then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
547- else nil
548- 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)
549- if (isBid)
550- then [soldData, bidUpdate, bidDelOld] :: buyRes
551- else soldData :: buyRes
552- }
511+ let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
512+ let idNFT = calculateAssetId(issueNFT)
513+ let sellStatus = if (if ((newAmountSold == maxCanSell))
514+ then true
515+ else !(isOnSale))
516+ then false
517+ else true
518+ let receiveNFT = if (if (if ((caller == issuer))
519+ then (bidOwner != "")
520+ else false)
521+ then (bidId != "")
522+ else false)
523+ then addressFromStringValue(bidOwner)
524+ else i.caller
525+ let assetIdBid = if (!(isDefined(assetId)))
526+ then "WAVES"
527+ else toBase58String(value(assetId))
528+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
529+ let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
530+ let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
531+ let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
532+ let soldValue = if (!(isBid))
533+ then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
534+ else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
535+ let soldData = StringEntry(soldKey, soldValue)
536+ let commissionsWithAgent = if ((amountForAgent != 0))
537+ then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
538+ else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
539+ let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
540+ then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
541+ else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
542+ let txToCaller = if ((isSponsored > 0))
543+ then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
544+ else nil
545+ 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)
546+ if (isBid)
547+ then [soldData, bidUpdate, bidDelOld] :: buyRes
548+ else soldData :: buyRes
553549 }
554550 }
555- }
551+ }
556552 }
557553 }
558554 }
581577
582578 @Callable(i)
583579 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
584- let $t02035220425 = idCallerDateSponsored(i, pubKey)
585- let artId = $t02035220425._1
586- let caller = $t02035220425._2
587- let date = $t02035220425._3
588- let isSponsored = $t02035220425._4
580+ let $t02030020373 = idCallerDateSponsored(i, pubKey)
581+ let artId = $t02030020373._1
582+ let caller = $t02030020373._2
583+ let date = $t02030020373._3
584+ let isSponsored = $t02030020373._4
589585 if (!(validateHash(sha256Hash)))
590586 then throw("Hash should be 64 characters maximum")
591587 else {
592- let $t02052620595 = setLIcence(cidLicence, sha256Licence)
593- let licenceCID = $t02052620595._1
594- let licenceHash = $t02052620595._2
588+ let $t02047420543 = setLIcence(cidLicence, sha256Licence)
589+ let licenceCID = $t02047420543._1
590+ let licenceHash = $t02047420543._2
595591 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
596592 if ((validateArtwork != ""))
597593 then throw("Something went wrong!")
598594 else {
599595 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
600- let $t02089420978 = if (whitelisted_drop)
596+ let $t02084220926 = if (whitelisted_drop)
601597 then $Tuple2(0, signID)
602598 else validatePayment(i)
603- let amount = $t02089420978._1
604- let assetId = $t02089420978._2
599+ let amount = $t02084220926._1
600+ let assetId = $t02084220926._2
605601 if (!(isDefined(amount)))
606602 then throw("Something went wrong")
607603 else {
642638 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
643639 then throw(maintenanceMSG)
644640 else {
645- let $t02401624086 = idCallerDateSponsored(i, pubKey)
646- let id = $t02401624086._1
647- let caller = $t02401624086._2
648- let date = $t02401624086._3
649- let isSponsored = $t02401624086._4
650- let $t02409624165 = setLIcence(cidLicence, sha256Licence)
651- let licenceCID = $t02409624165._1
652- let licenceHash = $t02409624165._2
641+ let $t02396424034 = idCallerDateSponsored(i, pubKey)
642+ let id = $t02396424034._1
643+ let caller = $t02396424034._2
644+ let date = $t02396424034._3
645+ let isSponsored = $t02396424034._4
646+ let $t02404424113 = setLIcence(cidLicence, sha256Licence)
647+ let licenceCID = $t02404424113._1
648+ let licenceHash = $t02404424113._2
653649 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
654650 if ((validateArtwork != ""))
655651 then throw("Something went wrong!")
677673
678674 @Callable(i)
679675 func flagArtwork (artId,addr,flag,note) = {
680- let $t02579625830 = idCallerDate(i)
681- let id = $t02579625830._1
682- let caller = $t02579625830._2
676+ let $t02574425778 = idCallerDate(i)
677+ let id = $t02574425778._1
678+ let caller = $t02574425778._2
683679 if (containsElement([chris, toString(this)], caller))
684680 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
685681 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
691687
692688 @Callable(i)
693689 func deleteArtwork (artId,addr) = {
694- let $t02626626300 = idCallerDate(i)
695- let id = $t02626626300._1
696- let caller = $t02626626300._2
690+ let $t02621426248 = idCallerDate(i)
691+ let id = $t02621426248._1
692+ let caller = $t02621426248._2
697693 let addrToUse = if (containsElement([chris, toString(this)], caller))
698694 then addr
699695 else caller
726722
727723 @Callable(i)
728724 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
729- let $t02913629206 = idCallerDateSponsored(i, pubKey)
730- let id = $t02913629206._1
731- let caller = $t02913629206._2
732- let date = $t02913629206._3
733- let isSponsored = $t02913629206._4
725+ let $t02908429154 = idCallerDateSponsored(i, pubKey)
726+ let id = $t02908429154._1
727+ let caller = $t02908429154._2
728+ let date = $t02908429154._3
729+ let isSponsored = $t02908429154._4
734730 let artworkName = getStringByKey(keyName(caller, artId))
735731 if ((artworkName == ""))
736732 then throw("This art doesn't match your account")
804800
805801 @Callable(i)
806802 func setBid (artId,issuer) = {
807- let $t03159231632 = idCallerDate(i)
808- let id = $t03159231632._1
809- let caller = $t03159231632._2
810- let date = $t03159231632._3
811- let $t03163731673 = isPayment(i)
812- let payment = $t03163731673._1
813- let amount = $t03163731673._2
803+ let $t03154031580 = idCallerDate(i)
804+ let id = $t03154031580._1
805+ let caller = $t03154031580._2
806+ let date = $t03154031580._3
807+ let $t03158531621 = isPayment(i)
808+ let payment = $t03158531621._1
809+ let amount = $t03158531621._2
814810 let assetId = if (!(isDefined(payment.assetId)))
815811 then "WAVES"
816812 else toBase58String(value(payment.assetId))
841837
842838 @Callable(i)
843839 func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = {
844- let $t03289332964 = idCallerDateSponsored(i, pubKey)
845- let id = $t03289332964._1
846- let caller1 = $t03289332964._2
847- let date = $t03289332964._3
848- let isSponsored = $t03289332964._4
840+ let $t03284132912 = idCallerDateSponsored(i, pubKey)
841+ let id = $t03284132912._1
842+ let caller1 = $t03284132912._2
843+ let date = $t03284132912._3
844+ let isSponsored = $t03284132912._4
849845 if ((caller1 != issuer))
850846 then throw("You cannot do this action")
851847 else buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
855851
856852 @Callable(i)
857853 func cancelBid (artId,issuer,bidId,bidOwner) = {
858- let $t03319933260 = idCallerDate(i)
859- let id = $t03319933260._1
860- let caller = $t03319933260._2
861- let date = $t03319933260._3
854+ let $t03314733208 = idCallerDate(i)
855+ let id = $t03314733208._1
856+ let caller = $t03314733208._2
857+ let date = $t03314733208._3
862858 if (if ((caller != bidOwner))
863859 then (caller != issuer)
864860 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 $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, isSponsored)
394394 }
395395
396396
397397 func idCallerDate (i) = if (!(dappRunning))
398398 then throw(maintenanceMSG)
399399 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
400400
401401
402402 func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
403403 let $t01303413104 = idCallerDateSponsored(i, pubKey)
404404 let id = $t01303413104._1
405405 let caller = $t01303413104._2
406406 let date = $t01303413104._3
407407 let isSponsored = $t01303413104._4
408+ let new_caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
409+ then (isSponsored > 0)
410+ else false)
411+ then toString(addressFromPublicKey(fromBase58String(pubKey)))
412+ else toBase58String(i.caller.bytes)
408413 if (true)
409- then throw(toString(isSponsored))
414+ then throw(((((((new_caller + " / ") + issuer) + " / ") + bidOwner) + " / ") + pubKey))
410415 else {
411- let new_caller = if (if ((toBase58String(i.caller.bytes) == toString(this)))
412- then (isSponsored > 0)
416+ let isBid = if (if (if ((caller == issuer))
417+ then (bidOwner != "")
413418 else false)
414- then toString(addressFromPublicKey(fromBase58String(pubKey)))
415- else toBase58String(i.caller.bytes)
416- if (true)
417- then throw(((((((new_caller + " / ") + issuer) + " / ") + bidOwner) + " / ") + pubKey))
419+ then (bidId != "")
420+ else false)
421+ then true
422+ else false
423+ let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
424+ if (if (if ((blockEnd != 0))
425+ then (height >= blockEnd)
426+ else false)
427+ then !(isBid)
428+ else false)
429+ then throw("Sale ended.")
418430 else {
419- let isBid = if (if (if ((caller == issuer))
420- then (bidOwner != "")
421- else false)
422- then (bidId != "")
423- else false)
424- then true
425- else false
426- let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
427- if (if (if ((blockEnd != 0))
428- then (height >= blockEnd)
429- else false)
430- then !(isBid)
431- else false)
432- then throw("Sale ended.")
431+ let callerIsIssuer = (caller == issuer)
432+ let totalNFT = getIntegerByKey("total_nft_issued")
433+ let signID = getStringByKey(keySignID(issuer, artId))
434+ let artworkName = getStringByKey(keyName(issuer, artId))
435+ if ((artworkName == ""))
436+ then throw("Art doesn't exist")
433437 else {
434- let callerIsIssuer = (caller == issuer)
435- let totalNFT = getIntegerByKey("total_nft_issued")
436- let signID = getStringByKey(keySignID(issuer, artId))
437- let artworkName = getStringByKey(keyName(issuer, artId))
438- if ((artworkName == ""))
439- then throw("Art doesn't exist")
440- else {
441- let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
442- let amountSold = getIntegerByKey(keyIssued(issuer, artId))
443- let artworkPrice = if (callerIsIssuer)
444- then (currentCertificationPrice * 2)
445- else getIntegerByKey(keyPrice(issuer, artId))
446- let priceAssetId = if (callerIsIssuer)
447- then toBase58String(signAssetId)
448- else getStringByKey(keyAssetIdAccepted(issuer, artId))
449- let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
450- if (if (if (!(isBid))
451- then !(callerIsIssuer)
452- else false)
453- then if (if ((0 >= artworkPrice))
454- then true
455- else !(isOnSale))
456- then true
457- else (0 >= maxCanSell)
458- else false)
459- then throw("Art not for sale")
460- else if (if (if (!(isBid))
461- then callerIsIssuer
438+ let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
439+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
440+ let artworkPrice = if (callerIsIssuer)
441+ then (currentCertificationPrice * 2)
442+ else getIntegerByKey(keyPrice(issuer, artId))
443+ let priceAssetId = if (callerIsIssuer)
444+ then toBase58String(signAssetId)
445+ else getStringByKey(keyAssetIdAccepted(issuer, artId))
446+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
447+ if (if (if (!(isBid))
448+ then !(callerIsIssuer)
449+ else false)
450+ then if (if ((0 >= artworkPrice))
451+ then true
452+ else !(isOnSale))
453+ then true
454+ else (0 >= maxCanSell)
455+ else false)
456+ then throw("Art not for sale")
457+ else if (if (if (!(isBid))
458+ then callerIsIssuer
459+ else false)
460+ then (0 >= maxCanSell)
461+ else false)
462+ then throw("Max issuable not set")
463+ else {
464+ let checkUser = validateUser(issuer)
465+ if (if (isBid)
466+ then (checkUser != "")
462467 else false)
463- then (0 >= maxCanSell)
464- else false)
465- then throw("Max issuable not set")
468+ then throw(checkUser)
466469 else {
467- let checkUser = validateUser(issuer)
468- if (if (isBid)
469- then (checkUser != "")
470+ let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
471+ let $t01492815120 = if (isBid)
472+ then getPriceAssetIdFromBid(bidDataKey)
473+ else validatePriceAssetId(i, priceAssetId, artworkPrice)
474+ let amount = $t01492815120._1
475+ let assetId = $t01492815120._2
476+ let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
477+ let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
478+ let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
479+ let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
480+ let isWhitelisted = checkWhitelist(issuer)
481+ let cut = if ((isWhitelisted > height))
482+ then 0
483+ else if ((assetId == signAssetId))
484+ then signCut
485+ else usdnWaveCut
486+ let amountForSign = fraction(amount, cut, 100)
487+ let amountForAgent = if (if (if ((agent != feeReceiver))
488+ then (agentShare > 0)
470489 else false)
471- then throw(checkUser)
490+ then (height > isWhitelisted)
491+ else false)
492+ then fraction(amount, agentShare, 10000)
493+ else 0
494+ let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
495+ then (publicAgentShare > 0)
496+ else false)
497+ then (height > isWhitelisted)
498+ else false)
499+ then fraction(amount, publicAgentShare, 10000)
500+ else 0
501+ let amountForCreator = (amount - amountForSign)
502+ if ((amountSold == maxCanSell))
503+ then throw("Art sold out")
472504 else {
473- let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
474- let $t01498015172 = if (isBid)
475- then getPriceAssetIdFromBid(bidDataKey)
476- else validatePriceAssetId(i, priceAssetId, artworkPrice)
477- let amount = $t01498015172._1
478- let assetId = $t01498015172._2
479- let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
480- let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
481- let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
482- let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
483- let isWhitelisted = checkWhitelist(issuer)
484- let cut = if ((isWhitelisted > height))
485- then 0
486- else if ((assetId == signAssetId))
487- then signCut
488- else usdnWaveCut
489- let amountForSign = fraction(amount, cut, 100)
490- let amountForAgent = if (if (if ((agent != feeReceiver))
491- then (agentShare > 0)
492- else false)
493- then (height > isWhitelisted)
494- else false)
495- then fraction(amount, agentShare, 10000)
496- else 0
497- let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
498- then (publicAgentShare > 0)
499- else false)
500- then (height > isWhitelisted)
501- else false)
502- then fraction(amount, publicAgentShare, 10000)
503- else 0
504- let amountForCreator = (amount - amountForSign)
505- if ((amountSold == maxCanSell))
506- then throw("Art sold out")
507- else {
508- let newAmountSold = (amountSold + 1)
509- let issueMeta = ((((((((((("Creator: " + issuer) + ",
505+ let newAmountSold = (amountSold + 1)
506+ let issueMeta = ((((((((((("Creator: " + issuer) + ",
510507 ArtID: ") + artId) + ",
511508 SignID: ") + signID) + ",
512509 Artwork name: ") + artworkName) + ",
513510 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
514- let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
515- let idNFT = calculateAssetId(issueNFT)
516- let sellStatus = if (if ((newAmountSold == maxCanSell))
517- then true
518- else !(isOnSale))
519- then false
520- else true
521- let receiveNFT = if (if (if ((caller == issuer))
522- then (bidOwner != "")
523- else false)
524- then (bidId != "")
525- else false)
526- then addressFromStringValue(bidOwner)
527- else i.caller
528- let assetIdBid = if (!(isDefined(assetId)))
529- then "WAVES"
530- else toBase58String(value(assetId))
531- let bidData = getStringByKey((bidDataKey + "_OPEN"))
532- let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
533- let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
534- let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
535- let soldValue = if (!(isBid))
536- then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
537- else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
538- let soldData = StringEntry(soldKey, soldValue)
539- let commissionsWithAgent = if ((amountForAgent != 0))
540- then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
541- else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
542- let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
543- then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
544- else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
545- let txToCaller = if ((isSponsored > 0))
546- then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
547- else nil
548- 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)
549- if (isBid)
550- then [soldData, bidUpdate, bidDelOld] :: buyRes
551- else soldData :: buyRes
552- }
511+ let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
512+ let idNFT = calculateAssetId(issueNFT)
513+ let sellStatus = if (if ((newAmountSold == maxCanSell))
514+ then true
515+ else !(isOnSale))
516+ then false
517+ else true
518+ let receiveNFT = if (if (if ((caller == issuer))
519+ then (bidOwner != "")
520+ else false)
521+ then (bidId != "")
522+ else false)
523+ then addressFromStringValue(bidOwner)
524+ else i.caller
525+ let assetIdBid = if (!(isDefined(assetId)))
526+ then "WAVES"
527+ else toBase58String(value(assetId))
528+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
529+ let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
530+ let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
531+ let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
532+ let soldValue = if (!(isBid))
533+ then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
534+ else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
535+ let soldData = StringEntry(soldKey, soldValue)
536+ let commissionsWithAgent = if ((amountForAgent != 0))
537+ then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
538+ else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
539+ let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
540+ then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
541+ else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
542+ let txToCaller = if ((isSponsored > 0))
543+ then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
544+ else nil
545+ 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)
546+ if (isBid)
547+ then [soldData, bidUpdate, bidDelOld] :: buyRes
548+ else soldData :: buyRes
553549 }
554550 }
555- }
551+ }
556552 }
557553 }
558554 }
559555 }
560556
561557
562558 func asString (bv) = match bv {
563559 case bv0: String =>
564560 bv0
565561 case _ =>
566562 throw("Sponsored Public Key String expected")
567563 }
568564
569565
570566 @Callable(invoke)
571567 func setConf (key,val) = {
572568 let caller = toString(invoke.caller)
573569 if (containsElement([chris, toString(this)], caller))
574570 then if (contains(key, "conf_"))
575571 then [StringEntry(key, val)]
576572 else throw("Entries starting with conf_ only")
577573 else throw("You are not allowed to change this")
578574 }
579575
580576
581577
582578 @Callable(i)
583579 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
584- let $t02035220425 = idCallerDateSponsored(i, pubKey)
585- let artId = $t02035220425._1
586- let caller = $t02035220425._2
587- let date = $t02035220425._3
588- let isSponsored = $t02035220425._4
580+ let $t02030020373 = idCallerDateSponsored(i, pubKey)
581+ let artId = $t02030020373._1
582+ let caller = $t02030020373._2
583+ let date = $t02030020373._3
584+ let isSponsored = $t02030020373._4
589585 if (!(validateHash(sha256Hash)))
590586 then throw("Hash should be 64 characters maximum")
591587 else {
592- let $t02052620595 = setLIcence(cidLicence, sha256Licence)
593- let licenceCID = $t02052620595._1
594- let licenceHash = $t02052620595._2
588+ let $t02047420543 = setLIcence(cidLicence, sha256Licence)
589+ let licenceCID = $t02047420543._1
590+ let licenceHash = $t02047420543._2
595591 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
596592 if ((validateArtwork != ""))
597593 then throw("Something went wrong!")
598594 else {
599595 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
600- let $t02089420978 = if (whitelisted_drop)
596+ let $t02084220926 = if (whitelisted_drop)
601597 then $Tuple2(0, signID)
602598 else validatePayment(i)
603- let amount = $t02089420978._1
604- let assetId = $t02089420978._2
599+ let amount = $t02084220926._1
600+ let assetId = $t02084220926._2
605601 if (!(isDefined(amount)))
606602 then throw("Something went wrong")
607603 else {
608604 let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
609605 if ((entryExist != ""))
610606 then throw("You already added it")
611607 else {
612608 let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
613609 if ((hashExist != ""))
614610 then throw("Hash already registered")
615611 else {
616612 let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
617613 if (!(isSignCertified))
618614 then throw("Sign Certificate not found for this address.")
619615 else {
620616 let decrease_whitelist_drop = if (whitelisted_drop)
621617 then invoke(whitelistDapp, "useFreeDrop", [caller], nil)
622618 else unit
623619 if ((decrease_whitelist_drop == decrease_whitelist_drop))
624620 then {
625621 let txToCaller = if ((isSponsored > 0))
626622 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
627623 else nil
628624 ([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)
629625 }
630626 else throw("Strict value is not equal to itself.")
631627 }
632628 }
633629 }
634630 }
635631 }
636632 }
637633 }
638634
639635
640636
641637 @Callable(i)
642638 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
643639 then throw(maintenanceMSG)
644640 else {
645- let $t02401624086 = idCallerDateSponsored(i, pubKey)
646- let id = $t02401624086._1
647- let caller = $t02401624086._2
648- let date = $t02401624086._3
649- let isSponsored = $t02401624086._4
650- let $t02409624165 = setLIcence(cidLicence, sha256Licence)
651- let licenceCID = $t02409624165._1
652- let licenceHash = $t02409624165._2
641+ let $t02396424034 = idCallerDateSponsored(i, pubKey)
642+ let id = $t02396424034._1
643+ let caller = $t02396424034._2
644+ let date = $t02396424034._3
645+ let isSponsored = $t02396424034._4
646+ let $t02404424113 = setLIcence(cidLicence, sha256Licence)
647+ let licenceCID = $t02404424113._1
648+ let licenceHash = $t02404424113._2
653649 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
654650 if ((validateArtwork != ""))
655651 then throw("Something went wrong!")
656652 else {
657653 let entryExist = getStringByKey(keyName(caller, txid))
658654 if ((entryExist == ""))
659655 then throw("Entry not found")
660656 else {
661657 let flag = getStringByKey(keyFlag(caller, txid))
662658 if ((flag == "ILLEGAL"))
663659 then throw("Cannot update ILLEGAL artwork")
664660 else if (!(isArtMinted(caller, txid)))
665661 then {
666662 let txToCaller = if ((isSponsored > 0))
667663 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
668664 else nil
669665 ([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)
670666 }
671667 else throw("Already minted")
672668 }
673669 }
674670 }
675671
676672
677673
678674 @Callable(i)
679675 func flagArtwork (artId,addr,flag,note) = {
680- let $t02579625830 = idCallerDate(i)
681- let id = $t02579625830._1
682- let caller = $t02579625830._2
676+ let $t02574425778 = idCallerDate(i)
677+ let id = $t02574425778._1
678+ let caller = $t02574425778._2
683679 if (containsElement([chris, toString(this)], caller))
684680 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
685681 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
686682 else throw(("Unknow status " + flag))
687683 else throw("You are not allowed")
688684 }
689685
690686
691687
692688 @Callable(i)
693689 func deleteArtwork (artId,addr) = {
694- let $t02626626300 = idCallerDate(i)
695- let id = $t02626626300._1
696- let caller = $t02626626300._2
690+ let $t02621426248 = idCallerDate(i)
691+ let id = $t02621426248._1
692+ let caller = $t02621426248._2
697693 let addrToUse = if (containsElement([chris, toString(this)], caller))
698694 then addr
699695 else caller
700696 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
701697 if ((entryExist == ""))
702698 then throw("No art matching for this address")
703699 else {
704700 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
705701 if ((sha256Hash == ""))
706702 then throw("No art hash matching for this address")
707703 else {
708704 let signID = getStringByKey(keySignID(addrToUse, artId))
709705 if ((signID == ""))
710706 then throw("No SIGN ID matching")
711707 else {
712708 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))]
713709 if (!(isArtMinted(addrToUse, artId)))
714710 then if (!(dappRunning))
715711 then throw(maintenanceMSG)
716712 else dataToDelete
717713 else if (containsElement([chris, toString(this)], caller))
718714 then dataToDelete
719715 else throw("Art already minted, you cannot delete it")
720716 }
721717 }
722718 }
723719 }
724720
725721
726722
727723 @Callable(i)
728724 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
729- let $t02913629206 = idCallerDateSponsored(i, pubKey)
730- let id = $t02913629206._1
731- let caller = $t02913629206._2
732- let date = $t02913629206._3
733- let isSponsored = $t02913629206._4
725+ let $t02908429154 = idCallerDateSponsored(i, pubKey)
726+ let id = $t02908429154._1
727+ let caller = $t02908429154._2
728+ let date = $t02908429154._3
729+ let isSponsored = $t02908429154._4
734730 let artworkName = getStringByKey(keyName(caller, artId))
735731 if ((artworkName == ""))
736732 then throw("This art doesn't match your account")
737733 else {
738734 let flag = getStringByKey(keyFlag(caller, artId))
739735 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
740736 then throw("Flagged artwork")
741737 else {
742738 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
743739 if ((0 > blockEnd))
744740 then throw("Negative end")
745741 else if (if ((blockEnd > 0))
746742 then if ((maxMint != 1))
747743 then true
748744 else (price != 0)
749745 else false)
750746 then throw("Timed offer only allowed for unique edition and offer only")
751747 else {
752748 let baseHeight = if ((blockEnd == 0))
753749 then 0
754750 else height
755751 if (!(acceptedAssetIds(assetId)))
756752 then throw("Something went wrong!")
757753 else if (!(validateMinSell(assetId, price)))
758754 then throw("Something went wrong!")
759755 else {
760756 let checkUser = validateUser(caller)
761757 if ((checkUser != ""))
762758 then throw(checkUser)
763759 else {
764760 let amountSold = getIntegerByKey(keyIssued(caller, artId))
765761 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
766762 if ((maxMint > 100))
767763 then throw("100 editions max per artwork")
768764 else if (if ((amountSold != 0))
769765 then (amountSold == maxCanSell)
770766 else false)
771767 then throw("Max edition reached.")
772768 else if (if ((amountSold > 0))
773769 then (maxCanSell != maxMint)
774770 else false)
775771 then throw("Cannot change maximum issuable anymore")
776772 else if (if ((bidNbr > 0))
777773 then (maxCanSell != maxMint)
778774 else false)
779775 then throw("Cannot change maximum issuable with active orders")
780776 else {
781777 let sellStatus = if (if ((price > 0))
782778 then (maxMint > 0)
783779 else false)
784780 then true
785781 else false
786782 let txToCaller = if ((isSponsored > 0))
787783 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
788784 else nil
789785 ([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)
790786 }
791787 }
792788 }
793789 }
794790 }
795791 }
796792 }
797793
798794
799795
800796 @Callable(i)
801797 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", "")
802798
803799
804800
805801 @Callable(i)
806802 func setBid (artId,issuer) = {
807- let $t03159231632 = idCallerDate(i)
808- let id = $t03159231632._1
809- let caller = $t03159231632._2
810- let date = $t03159231632._3
811- let $t03163731673 = isPayment(i)
812- let payment = $t03163731673._1
813- let amount = $t03163731673._2
803+ let $t03154031580 = idCallerDate(i)
804+ let id = $t03154031580._1
805+ let caller = $t03154031580._2
806+ let date = $t03154031580._3
807+ let $t03158531621 = isPayment(i)
808+ let payment = $t03158531621._1
809+ let amount = $t03158531621._2
814810 let assetId = if (!(isDefined(payment.assetId)))
815811 then "WAVES"
816812 else toBase58String(value(payment.assetId))
817813 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
818814 if (if ((blockEnd != 0))
819815 then (height >= blockEnd)
820816 else false)
821817 then throw("Sale ended.")
822818 else {
823819 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
824820 if (!(acceptedAssetIds(assetId)))
825821 then throw("asset not accepted")
826822 else if (!(validateMinSell(assetId, amount)))
827823 then throw("Wrong min sell")
828824 else {
829825 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
830826 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
831827 if ((0 >= maxCanSell))
832828 then throw("No max edition set for this artwork")
833829 else if ((amountSold >= maxCanSell))
834830 then throw("Sold out, you cannot bid")
835831 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
836832 }
837833 }
838834 }
839835
840836
841837
842838 @Callable(i)
843839 func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = {
844- let $t03289332964 = idCallerDateSponsored(i, pubKey)
845- let id = $t03289332964._1
846- let caller1 = $t03289332964._2
847- let date = $t03289332964._3
848- let isSponsored = $t03289332964._4
840+ let $t03284132912 = idCallerDateSponsored(i, pubKey)
841+ let id = $t03284132912._1
842+ let caller1 = $t03284132912._2
843+ let date = $t03284132912._3
844+ let isSponsored = $t03284132912._4
849845 if ((caller1 != issuer))
850846 then throw("You cannot do this action")
851847 else buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
852848 }
853849
854850
855851
856852 @Callable(i)
857853 func cancelBid (artId,issuer,bidId,bidOwner) = {
858- let $t03319933260 = idCallerDate(i)
859- let id = $t03319933260._1
860- let caller = $t03319933260._2
861- let date = $t03319933260._3
854+ let $t03314733208 = idCallerDate(i)
855+ let id = $t03314733208._1
856+ let caller = $t03314733208._2
857+ let date = $t03314733208._3
862858 if (if ((caller != bidOwner))
863859 then (caller != issuer)
864860 else false)
865861 then throw("You cannot do this action")
866862 else {
867863 let returnMoneyTo = if ((caller == issuer))
868864 then bidOwner
869865 else caller
870866 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
871867 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
872868 let bidData = getStringByKey((bidDataKey + "_OPEN"))
873869 if ((bidData == ""))
874870 then throw("Bid not found")
875871 else {
876872 let bidDataArr = split(bidData, "_")
877873 let assetId = getBidAssetId(bidDataArr[0])
878874 let bidStatus = "CANCELED"
879875 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
880876 }
881877 }
882878 }
883879
884880
885881 @Verifier(tx)
886882 func verifier () = match tx {
887883 case inv: InvokeScriptTransaction =>
888884 if (if (if (if ((inv.function == "addArtwork"))
889885 then (inv.dApp == this)
890886 else false)
891887 then (inv.fee == 500000)
892888 else false)
893889 then (inv.feeAssetId == unit)
894890 else false)
895891 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[13])))
896892 else if (if (if (if ((inv.function == "updateArtwork"))
897893 then (inv.dApp == this)
898894 else false)
899895 then (inv.fee == 500000)
900896 else false)
901897 then (inv.feeAssetId == unit)
902898 else false)
903899 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
904900 else if (if (if (if ((inv.function == "sellArtwork"))
905901 then (inv.dApp == this)
906902 else false)
907903 then (inv.fee == 500000)
908904 else false)
909905 then (inv.feeAssetId == unit)
910906 else false)
911907 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
912908 else if (if (if (if ((inv.function == "acceptBid"))
913909 then (inv.dApp == this)
914910 else false)
915911 then (inv.fee == 500000)
916912 else false)
917913 then (inv.feeAssetId == unit)
918914 else false)
919915 then sigVerify_128Kb(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[4])))
920916 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
921917 case _ =>
922918 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
923919 }
924920

github/deemru/w8io/873ac7e 
105.76 ms