tx · o3cfHxgswgsBQ44vr8YQrZZFyyMrsfApfrFcz8uP7im

3PDBLdsUrcsiPxNbt8g2gQVoefKgzt3kJzV:  -0.01900000 Waves

2023.03.24 07:50 [3569227] smart account 3PDBLdsUrcsiPxNbt8g2gQVoefKgzt3kJzV > SELF 0.00000000 Waves

{ "type": 13, "id": "o3cfHxgswgsBQ44vr8YQrZZFyyMrsfApfrFcz8uP7im", "fee": 1900000, "feeAssetId": null, "timestamp": 1679633432079, "version": 2, "chainId": 87, "sender": "3PDBLdsUrcsiPxNbt8g2gQVoefKgzt3kJzV", "senderPublicKey": "FJN1qxUehh3hhFX9NAXWBFbSKT2sTzc2pjTJ1JxjQdBh", "proofs": [ "2U9TtKaYhXSh13j87EqgWASRGju6RfGy6osDpCtPmuLjrLDvixgojYQJrSrSswX9dL5f3YskUhpNA92XvgpKWKaz" ], "script": "base64:BgLmFAgCEgQKAggIEhAKDggICAgICAgICAgICAEIEg8KDQgICAgICAgICAgIAQgSBgoECAgICBIECgIICBIICgYIAQEIAQgSBAoCCAgSBAoCCAgSBwoFCAgICAgSBgoECAgICCIOZ2V0U3RyaW5nQnlLZXkiA2tleSIIdW5pdFRlc3QiCW9yYWNsZUZlZSIIc2lnbkRhcHAiC2ZlZVJlY2VpdmVyIgh1c2VyRGFwcCINd2hpdGVsaXN0RGFwcCILc2lnbkFzc2V0SWQiC3VzZG5Bc3NldElkIgt1c2R0QXNzZXRJZCIMd2F2ZXNBc3NldElkIgVjaHJpcyIZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZSIPZ2V0SW50ZWdlckJ5S2V5Ig5jaGVja1doaXRlbGlzdCIPZ2V0Qm9vbGVhbkJ5S2V5IgdzaWduQ3V0Igt1c2RuV2F2ZUN1dCIOZGVmYXVsdExpY2VuY2UiEmRlZmF1bHRIYXNoTGljZW5jZSILZGFwcFJ1bm5pbmciDm1haW50ZW5hbmNlTVNHIg11c2VyU3VzcGVuZGVkIgt1c2VyUmVtb3ZlZCIQdXNlclVucmVnaXN0ZXJlZCILdXNlckFsbG93ZWQiGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UiFGNoZWNrU2lnbkNlcnRpZmljYXRlIgZzaWduSUQiBU93bmVyIgpzaGEyNTZIYXNoIgckbWF0Y2gwIgFhIgt2YWxpZGF0ZUNJRCIDY2lkIgx2YWxpZGF0ZUhhc2giBGhhc2giDWtleVVzZXJTdGF0dXMiBmNhbGxlciIHa2V5RGF0ZSIFYXJ0SWQiB2tleU5hbWUiB2tleURlc2MiDWtleURpc3BsYXlDaWQiDWtleUV4cG9ydEhhc2giDGtleUV4cG9ydENpZCIKa2V5TWF4TWludCIJa2V5U2lnbklEIglrZXlJc3N1ZWQiCWtleU9uU2FsZSIOa2V5TGljZW5jZUhhc2giDWtleUxpY2VuY2VDaWQiB2tleVRhZ3MiB2tleVR5cGUiB2tleU5vdGUiCmtleUNyYXdsZXIiDGtleVJveWFsdGllcyIIa2V5UHJpY2UiCmtleUVuZFNhbGUiEmtleUFzc2V0SWRBY2NlcHRlZCIHa2V5RmxhZyISa2V5QXJ0aXN0QWdlbnRBZGRyIgphcnRpc3RBZGRyIhRrZXlQcmltYXJ5U2hhcmVBZ2VudCIYa2V5QXJ0aXN0UHVibGljQWdlbnRBZGRyIhprZXlQcmltYXJ5U2hhcmVQdWJsaWNBZ2VudCIRa2V5SGFzaEJ5VHhpZEFkZHIiBHR4aWQiDmtleU93bmVyQnlIYXNoIg1rZXlpZEJ5U2lnbmlkIgZzaWduSWQiEmtleVR4aWRCeUhhc2hPd25lciIOdmFsaWRhdGVBbGxDSUQiCmNpZERpc3BsYXkiCWNpZEV4cG9ydCIKY2lkTGljZW5jZSIPdmFsaWRhdGVBbGxIYXNoIgxzaGEyNTZFeHBvcnQiDXNoYTI1NkxpY2VuY2UiDnZhbGlkYXRlU3RyaW5nIgNzdHIiA21heCIMdmFsaWRhdGVVc2VyIgp1c2VyU3RhdHVzIgpzZXRMSWNlbmNlIhN2YWxpZGF0ZUFydHdvcmtEYXRhIgpsaWNlbmNlQ0lEIgtsaWNlbmNlSGFzaCIEbmFtZSILZGVzY3JpcHRpb24iBHRhZ3MiCXJveWFsdGllcyIJY2hlY2tVc2VyIglpc1BheW1lbnQiAWkiB3BheW1lbnQiBmFtb3VudCIPdmFsaWRhdGVQYXltZW50IgskdDA5MTgwOTIxNiIHYXNzZXRJZCILaXNBcnRNaW50ZWQiCWFkZHJUb1VzZSIBYiIUdmFsaWRhdGVQcmljZUFzc2V0SWQiDHByaWNlQXNzZXRJZCIMYXJ0d29ya1ByaWNlIgskdDA5ODA0OTg0MCIQYWNjZXB0ZWRBc3NldElkcyIPdmFsaWRhdGVNaW5TZWxsIgVwcmljZSIMbWluU2VsbFdhdmVzIgttaW5TZWxsVXNkbiILbWluU2VsbFNpZ24iDWdldEJpZEFzc2V0SWQiFmdldFByaWNlQXNzZXRJZEZyb21CaWQiCmJpZERhdGFLZXkiB2JpZERhdGEiCmJpZERhdGFBcnIiCWJpZEFtb3VudCIKYmlkQXNzZXRJZCIVaWRDYWxsZXJEYXRlU3BvbnNvcmVkIgZwdWJLZXkiC2lzU3BvbnNvcmVkIhNnZXRfc3BvbnNvcmVkX3dhdmVzIgxpZENhbGxlckRhdGUiB2J1eU1pbnQiBmlzc3VlciIFYmlkSWQiCGJpZE93bmVyIg0kdDAxMzA0MTEzMTMwIgJpZCIEZGF0ZSIFaXNCaWQiCGJsb2NrRW5kIg5jYWxsZXJJc0lzc3VlciIIdG90YWxORlQiC2FydHdvcmtOYW1lIghpc09uU2FsZSIKYW1vdW50U29sZCIKbWF4Q2FuU2VsbCINJHQwMTQ3MjgxNDkyMCIFYWdlbnQiCmFnZW50U2hhcmUiC3B1YmxpY0FnZW50IhBwdWJsaWNBZ2VudFNoYXJlIg1pc1doaXRlbGlzdGVkIgNjdXQiDWFtb3VudEZvclNpZ24iDmFtb3VudEZvckFnZW50IhRhbW91bnRGb3JQdWJsaWNBZ2VudCIQYW1vdW50Rm9yQ3JlYXRvciINbmV3QW1vdW50U29sZCIJaXNzdWVNZXRhIghpc3N1ZU5GVCIFaWRORlQiCnNlbGxTdGF0dXMiCnJlY2VpdmVORlQiCmFzc2V0SWRCaWQiCWJpZERlbE9sZCIJYmlkVXBkYXRlIgdzb2xkS2V5Iglzb2xkVmFsdWUiCHNvbGREYXRhIhRjb21taXNzaW9uc1dpdGhBZ2VudCIaY29tbWlzc2lvbnNXaXRoUHVibGljQWdlbnQiCnR4VG9DYWxsZXIiBmJ1eVJlcyIIYXNTdHJpbmciAmJ2IgNidjAiBmludm9rZSIDdmFsIgR0eXBlIgdjcmF3bGVyIg0kdDAyMDA5NjIwMTY5Ig0kdDAyMDI3MDIwMzM5Ig92YWxpZGF0ZUFydHdvcmsiEHdoaXRlbGlzdGVkX2Ryb3AiDSR0MDIwNjM4MjA3MjIiCmVudHJ5RXhpc3QiCWhhc2hFeGlzdCIPaXNTaWduQ2VydGlmaWVkIhdkZWNyZWFzZV93aGl0ZWxpc3RfZHJvcCINJHQwMjM3NTYyMzgyNiINJHQwMjM4MzYyMzkwNSIEZmxhZyIEYWRkciIEbm90ZSINJHQwMjU1MzIyNTU2NiINJHQwMjYwMDIyNjAzNiIMZGF0YVRvRGVsZXRlIgdtYXhNaW50Ig0kdDAyODg3MjI4OTQyIgZiaWROYnIiCmJhc2VIZWlnaHQiDSR0MDMxMzI0MzEzNjQiDSR0MDMxMzY5MzE0MDUiDSR0MDMyNzM4MzI3OTkiDXJldHVybk1vbmV5VG8iCWJpZFN0YXR1cyICdHgiCHZlcmlmaWVyIgNpbnZOAQFhAQFiCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFAWICAAABYwcAAWQJAQV2YWx1ZQEJAKYIAQkBAWEBAg9jb25mX29yYWNsZV9mZWUAAWUJAQV2YWx1ZQEJAKYIAQkBAWEBAhFjb25mX3NpZ253ZWJfZGFwcAABZgkBAWEBAhFjb25mX2ZlZV9yZWNlaXZlcgABZwMFAWMJAQV2YWx1ZQEJAKYIAQIjM010NFJHTUV5alNXWUFvY1RQcWQ1NXdkSFFRQjNQVTJVQ20JAQV2YWx1ZQEJAKYIAQkBAWEBAg9jb25mX3VzZXJzX2RhcHAAAWgJAQV2YWx1ZQEJAKYIAQkBAWEBAhNjb25mX3doaXRlbGlzdF9kYXBwAAFpCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9TSUdOAAFqCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9VU0ROAAFrCQDZBAEJAQFhAQIYY29uZl9hY2NlcHRlZF9hc3NldF9VU0RUAAFsAQAAAW0JAQFhAQIMY29uZl9hZG1pbl8xAQFuAQFiCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUBZAUBYgIfSW50ZWdlciB1bmRlZmluZSBvciAwIGluIG9yYWNsZQEBbwEBYgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQFiAAABAXABAWIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUBaAUBYgAAAQFxAQFiCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFAWIHAAFyAAcAAXMACgABdAkBAWEBAhRjb25mX2RlZmF1bHRfbGljZW5jZQABdQkBAWEBAhljb25mX2RlZmF1bHRfbGljZW5jZV9oYXNoAAF2CQELdmFsdWVPckVsc2UCCQCbCAIFAWcCFGNvbmZfZGFwcF9pc19ydW5uaW5nBgABdwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQFnAhRjb25mX21haW50ZW5hbmNlX21zZwIAAAF4AglTVVNQRU5ERUQAAXkCB1JFTU9WRUQAAXoCDFVOUkVHSVNURVJFRAABQQIHQUxMT1dFRAABQgkBAW4BCQCsAgICEmNlcnRpZmljYXRpb25fZmVlXwkA2AQBBQFpAQFDAwFEAUUBRgQBRwkAnQgCBQFlCQCsAgIJAKwCAgkArAICAghkYXRhX2ZjXwUBRAIBXwUBRQMJAAECBQFHAgZTdHJpbmcEAUgFAUcDCQEIY29udGFpbnMCBQFIBQFGBgcHAQFJAQFKAwkBCGNvbnRhaW5zAgUBSgIBLwMDCQBmAgBMCQCxAgEFAUoJAAACCQCxAgEJAJEDAgkAtQkCBQFKAgEvAAAAOwcJAGYCABAJALECAQkAkQMCCQC1CQIFAUoCAS8AAQcHAQFLAQFMCQAAAgkAsQIBBQFMAEABAU0BAU4JAKwCAgIMdXNlcl9zdGF0dXNfBQFOAQFPAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF9kYXRlXwUBUAIBXwUBTgEBUQIBTgFQCQCsAgIJAKwCAgkArAICAglhcnRfbmFtZV8FAVACAV8FAU4BAVICAU4BUAkArAICCQCsAgIJAKwCAgIJYXJ0X2Rlc2NfBQFQAgFfBQFOAQFTAgFOAVAJAKwCAgkArAICCQCsAgICEGFydF9kaXNwbGF5X2NpZF8FAVACAV8FAU4BAVQCAU4BUAkArAICCQCsAgIJAKwCAgIQYXJ0X2V4cG9ydF9oYXNoXwUBUAIBXwUBTgEBVQIBTgFQCQCsAgIJAKwCAgkArAICAg9hcnRfZXhwb3J0X2NpZF8FAVACAV8FAU4BAVYCAU4BUAkArAICCQCsAgIJAKwCAgIMYXJ0X21heG1pbnRfBQFQAgFfBQFOAQFXAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9zaWduaWRfBQFQAgFfBQFOAQFYAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9pc3N1ZWRfBQFQAgFfBQFOAQFZAgFOAVAJAKwCAgkArAICCQCsAgICC2FydF9vbnNhbGVfBQFQAgFfBQFOAQFaAgFOAVAJAKwCAgkArAICCQCsAgICEWFydF9saWNlbmNlX2hhc2hfBQFQAgFfBQFOAQJhYQIBTgFQCQCsAgIJAKwCAgkArAICAhBhcnRfbGljZW5jZV9jaWRfBQFQAgFfBQFOAQJhYgIBTgFQCQCsAgIJAKwCAgkArAICAglhcnRfdGFnc18FAVACAV8FAU4BAmFjAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF90eXBlXwUBUAIBXwUBTgECYWQCAU4BUAkArAICCQCsAgIJAKwCAgIJYXJ0X25vdGVfBQFQAgFfBQFOAQJhZQIBTgFQCQCsAgIJAKwCAgkArAICAhBhcnRfY3Jhd2xlcl9jaWRfBQFQAgFfBQFOAQJhZgIBTgFQCQCsAgIJAKwCAgkArAICAg5hcnRfcm95YWx0aWVzXwUBUAIBXwUBTgECYWcCAU4BUAkArAICCQCsAgIJAKwCAgIKYXJ0X3ByaWNlXwUBUAIBXwUBTgECYWgCAU4BUAkArAICCQCsAgIJAKwCAgIMYXJ0X2VuZHNhbGVfBQFQAgFfBQFOAQJhaQIBTgFQCQCsAgIJAKwCAgkArAICAhJhcnRfYXNzZXRBY2NlcHRlZF8FAVACAV8FAU4BAmFqAgFOAVAJAKwCAgkArAICCQCsAgICCWFydF9mbGFnXwUBUAIBXwUBTgECYWsBAmFsCQCsAgICDWFydGlzdF9hZ2VudF8FAmFsAQJhbQECYWwJAKwCAgIVYXJ0aXN0X2FnZW50X3ByaW1hcnlfBQJhbAECYW4BAmFsCQCsAgICFGFydGlzdF9wdWJsaWNfYWdlbnRfBQJhbAECYW8BAmFsCQCsAgICHGFydGlzdF9wdWJsaWNfYWdlbnRfcHJpbWFyeV8FAmFsAQJhcAIBTgJhcQkArAICCQCsAgIJAKwCAgITZ2V0X2hhc2hieXR4aWRhZGRyXwUCYXECAV8FAU4BAmFyAQFGCQCsAgICEmdldF9vd25lcl9ieV9oYXNoXwUBRgECYXMCAU4CYXQJAKwCAgkArAICCQCsAgICEmdldF9hcnRpZGJ5c2lnbmlkXwUCYXQCAV8FAU4BAmF1AgFGAU4JAKwCAgIXZ2V0X3R4aWRfYnlfaGFzaF9vd25lcl8JANgEAQkA1BYBCQCbAwEJAKwCAgUBRgUBTgECYXYDAmF3AmF4AmF5AwkBASEBCQEBSQEFAmF3CQACAQIRV3JvbmcgRGlzcGxheSBDSUQDCQEBIQEJAQFJAQUCYXgJAAIBAhBXcm9uZyBFeHBvcnQgQ0lEAwMJAQIhPQIFAmF5AgAJAQEhAQkBAUkBBQJheQcJAAIBAhFXcm9uZyBMaWNlbmNlIENJRAYBAmF6AgJhQQJhQgMJAQEhAQkBAUsBBQJhQQkAAgECGEV4cG9ydCBIYXNoIDY0IGNoYXIuIG1heAMJAQEhAQkBAUsBBQJhQgkAAgECGUxpY2VuY2UgSGFzaCA2NCBjaGFyLiBtYXgGAQJhQwICYUQCYUUDCQAAAgkAsQIBBQJhRAAACQACAQIYRmllbGQgY2Fubm90IGJlIGlzIGVtcHR5AwkAZgIJALECAQUCYUQFAmFFCQACAQkArAICBQJhRAIMIGlzIHRvbyBsb25nBgECYUYBAU4EAmFHCQELdmFsdWVPckVsc2UCCQCdCAIFAWcJAQFNAQUBTgUBegMDCQAAAgUCYUcFAXoGCQAAAgUCYUcFAUECLlJlZ2lzdGVyIHRoaXMgYWNjb3VudCBmaXJzdCB3aXRoICJBY2NvdW50IiB0YWIDCQAAAgUCYUcFAXgCEUFjY291bnQgc3VzcGVuZGVkAwkAAAIFAmFHBQF5Ag9BY2NvdW50IHJlbW92ZWQCAAECYUgCAmF5AmFCBAFKAwkAAAIJALECAQUCYXkAAAUBdAUCYXkEAUwDCQAAAgkAsQIBBQJhQgAABQF1BQJhQgkAlAoCBQFKBQFMAQJhSQoBTgJhdwJheAJhSgJhQQJhSwJhTAJhTQJhTgJhTwQCYVAJAQJhRgEFAU4DCQECIT0CBQJhUAIACQACAQUCYVADCQAAAgkAsQIBBQJhdwAACQACAQIbRGlzcGxheSBDSUQgY2Fubm90IGJlIGVtcHR5AwkBASEBCQECYXYDBQJhdwUCYXgFAmFKCQACAQIQUHJvYmxlbSB3aXRoIENJRAMJAQEhAQkBAmF6AgUCYUEFAmFLCQACAQITUHJvYmxlbSB3aXRoIEhhc2hlcwMJAQEhAQkBAmFDAgUCYUwAZAkAAgECEjEwMCBDaGFyLiBtYXggbmFtZQMJAQEhAQkBAmFDAgUCYU0A6AcJAAIBAhoxMDAwIENoYXIuIG1heCBkZXNjcmlwdGlvbgMDCQBmAgAABQJhTwYJAGYCBQJhTwDoBwkAAgECM1JveWFsdGllcyBjYW5ub3QgYmUgbGVzcyB0aGFuIDAlIG9yIGhpZ2hlciB0aGFuIDEwJQMJAGYCCQCQAwEJALUJAgUCYU4CASwABQkAAgECCzUgdGFncyBtYXguAgABAmFRAQJhUgMJAAACCQCQAwEIBQJhUghwYXltZW50cwAACQACAQITTm8gcGF5bWVudCBhdHRhY2hlZAQCYVMJAQV2YWx1ZQEJAJEDAggFAmFSCHBheW1lbnRzAAAEAmFUCQEFdmFsdWUBCAUCYVMGYW1vdW50CQCUCgIFAmFTBQJhVAECYVUBAmFSBAJhVgkBAmFRAQUCYVIEAmFTCAUCYVYCXzEEAmFUCAUCYVYCXzIEAmFXAwMJAQlpc0RlZmluZWQBCAUCYVMHYXNzZXRJZAkAAAIIBQJhUwdhc3NldElkBQFpBwgFAmFTB2Fzc2V0SWQJAAIBAitPbmx5IFNJR04gdG9rZW4gYWNjZXB0ZWQgYXMgdHJhbnNhY3Rpb24gZmVlAwkBAiE9AgUCYVQFAUIJAAIBCQCsAgICGVBheW1lbnQgYW1vdW50IHNob3VsZCBiZSAJAKQDAQUBQgkAlAoCBQJhVAUCYVcBAmFYAgJhWQFQBAFHCQCaCAIFBHRoaXMJAQFYAgUCYVkFAVADCQABAgUBRwIDSW50BAJhWgUBRwMJAQIhPQIFAmFaAAAGBwcBAmJhAwJhUgJiYgJiYwQCYmQJAQJhUQEFAmFSBAJhUwgFAmJkAl8xBAJhVAgFAmJkAl8yBAJhVwMJAQEhAQkBCWlzRGVmaW5lZAEIBQJhUwdhc3NldElkBQR1bml0AwMJAGYCCQCxAgEFAmJiAAAJAAACCQDYBAEJAQV2YWx1ZQEIBQJhUwdhc3NldElkBQJiYgcIBQJhUwdhc3NldElkCQACAQIOV3JvbmcgYXNzZXQgaWQDAwkAAAIFAmFXBQR1bml0CQECIT0CBQJiYgIABwkAAgECDldyb25nIGFzc2V0IGlkAwkBAiE9AgUCYmMFAmFUCQACAQITUGF5bWVudCBkb24ndCBtYXRjaAkAlAoCBQJhVAUCYVcBAmJlAQJhVwMDAwMDCQECIT0CBQJhVwkA2AQBBQFpCQECIT0CBQJhVwkA2AQBBQFsBwkBAiE9AgUCYVcCBVdBVkVTBwkBAiE9AgUCYVcJANgEAQUBagcJAQIhPQIFAmFXCQDYBAEFAWsHCQACAQImT25seSBTSUdOLCBVU0ROLFVTRFQgb3IgV0FWRVMgYWNjZXB0ZWQGAQJiZgICYVcCYmcEAmJoAwUBYwAKCQEBbgECDndhdmVzX21pbl9zZWxsBAJiaQDAhD0EAmJqAwUBYwABCQBoAgUBQgACAwMDAwMDCQAAAgUCYVcJANgEAQUBagkAZgIFAmJpBQJiZwcJAQIhPQIFAmJnAAAHBgMDCQAAAgUCYVcJANgEAQUBawkAZgIFAmJpBQJiZwcJAQIhPQIFAmJnAAAHBgMDCQAAAgUCYVcJANgEAQUBaQkAZgIFAmJqBQJiZwcJAQIhPQIFAmJnAAAHBgMDAwkAAAIFAmFXCQDYBAEFAWwGCQAAAgUCYVcCBVdBVkVTCQBmAgUCYmgFAmJnBwkBAiE9AgUCYmcAAAcJAAIBAhhXcm9uZyBtaW5pbXVtIHNlbGwgcHJpY2UGAQJiawECYVcDCQAAAgUCYVcCBVdBVkVTBQR1bml0CQDZBAEFAmFXAQJibAECYm0EAmJuCQEBYQEJAKwCAgUCYm0CBV9PUEVOAwkAAAIFAmJuAgAJAAIBAg1CaWQgbm90IGZvdW5kBAJibwkAtQkCBQJibgIBXwQCYnAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJibwABBAJicQkBAmJrAQkAkQMCBQJibwAAAwkAZwIAAAUCYnAJAAIBAgxXcm9uZyBhbW91bnQJAJQKAgUCYnAFAmJxAQJicgICYVICYnMDCQEBIQEFAXYJAAIBBQF3BAJidAMJAQIhPQIFAmJzAgAJAQt2YWx1ZU9yRWxzZQIJAQFwAQkArAICCQClCAEJAKcIAQkA2QQBBQJicwIJX2ZyZWVfdHhzAAAAAAQBTgMDCQAAAgkA2AQBCAgFAmFSBmNhbGxlcgVieXRlcwkApQgBBQR0aGlzCQBmAgUCYnQAAAcJAKUIAQkApwgBCQDZBAEFAmJzCQDYBAEICAUCYVIGY2FsbGVyBWJ5dGVzBAJidQMDCQECIT0CBQJicwIACQBmAgUCYnQAAAcJAPwHBAUBaAIJdXNlRnJlZVR4CQDMCAIJAKUIAQkApwgBCQDZBAEFAmJzBQNuaWwFA25pbAUEdW5pdAMJAAACBQJidQUCYnUJAJYKBAkA2AQBCAUCYVINdHJhbnNhY3Rpb25JZAUBTggFCWxhc3RCbG9jawl0aW1lc3RhbXAJAGYCBQJidAAACQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJidgECYVIDCQEBIQEFAXYJAAIBBQF3CQCVCgMJANgEAQgFAmFSDXRyYW5zYWN0aW9uSWQJANgEAQgIBQJhUgZjYWxsZXIFYnl0ZXMIBQlsYXN0QmxvY2sJdGltZXN0YW1wAQJidwYCYVIBUAJieAJieQJiegJicwQCYkEJAQJicgIFAmFSBQJicwQCYkIIBQJiQQJfMQQBTggFAmJBAl8yBAJiQwgFAmJBAl8zBAJidAgFAmJBAl80BAJiRAMDAwkAAAIFAU4FAmJ4CQECIT0CBQJiegIABwkBAiE9AgUCYnkCAAcGBwMDBQJiRAkBAiE9AgUBTgUCYngHCQACAQIZWW91IGNhbm5vdCBkbyB0aGlzIGFjdGlvbgQCYkUJAQFvAQkBAmFoAgUBTgUBUAMDAwkBAiE9AgUCYkUAAAkAZwIFBmhlaWdodAUCYkUHCQEBIQEFAmJEBwkAAgECC1NhbGUgZW5kZWQuBAJiRgkAAAIFAU4FAmJ4BAJiRwkBAW8BAhB0b3RhbF9uZnRfaXNzdWVkBAFECQEBYQEJAQFXAgUCYngFAVAEAmJICQEBYQEJAQFRAgUCYngFAVADCQAAAgUCYkgCAAkAAgECEUFydCBkb2Vzbid0IGV4aXN0BAJiSQkBAXEBCQEBWQIFAmJ4BQFQBAJiSgkBAW8BCQEBWAIFAmJ4BQFQBAJiYwMFAmJGCQBoAgUBQgACCQEBbwEJAQJhZwIFAmJ4BQFQBAJiYgMFAmJGCQDYBAEFAWkJAQFhAQkBAmFpAgUCYngFAVAEAmJLCQEBbwEJAQFWAgUCYngFAVADAwMJAQEhAQUCYkQJAQEhAQUCYkYHAwMJAGcCAAAFAmJjBgkBASEBBQJiSQYJAGcCAAAFAmJLBwkAAgECEEFydCBub3QgZm9yIHNhbGUDAwMJAQEhAQUCYkQFAmJGBwkAZwIAAAUCYksHCQACAQIUTWF4IGlzc3VhYmxlIG5vdCBzZXQEAmFQCQECYUYBBQJieAMDBQJiRAkBAiE9AgUCYVACAAcJAAIBBQJhUAQCYm0JAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUBUAIBXwUCYngCAV8FAmJ6AgFfBQJieQQCYkwDBQJiRAkBAmJsAQUCYm0JAQJiYQMFAmFSBQJiYgUCYmMEAmFUCAUCYkwCXzEEAmFXCAUCYkwCXzIEAmJNCQELdmFsdWVPckVsc2UCCQCdCAIFAWcJAQJhawEFAmJ4BQFmBAJiTgkBC3ZhbHVlT3JFbHNlAgkAmggCBQFnCQECYW0BBQJieAAABAJiTwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQFnCQECYW4BBQJieAUBZgQCYlAJAQt2YWx1ZU9yRWxzZQIJAJoIAgUBZwkBAmFvAQUCYngAAAQCYlEJAQFwAQUCYngEAmJSAwkAZgIFAmJRBQZoZWlnaHQAAAMJAAACBQJhVwUBaQUBcgUBcwQCYlMJAGsDBQJhVAUCYlIAZAQCYlQDAwMJAQIhPQIFAmJNBQFmCQBmAgUCYk4AAAcJAGYCBQZoZWlnaHQFAmJRBwkAawMFAmFUBQJiTgCQTgAABAJiVQMDAwkBAiE9AgUCYk8FAWYJAGYCBQJiUAAABwkAZgIFBmhlaWdodAUCYlEHCQBrAwUCYVQFAmJQAJBOAAAEAmJWCQBlAgUCYVQFAmJTAwkAAAIFAmJKBQJiSwkAAgECDEFydCBzb2xkIG91dAQCYlcJAGQCBQJiSgABBAJiWAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCUNyZWF0b3I6IAUCYngCCiwKIEFydElEOiAFAVACCywKIFNpZ25JRDogBQFEAhEsCiBBcnR3b3JrIG5hbWU6IAUCYkgCCiwKIElzc3VlOiAJAKQDAQUCYlcCAS8JAKQDAQUCYksEAmJZCQDCCAUJAKwCAgIDU0FfCQCkAwEJAGQCBQJiRwABBQJiWAABAAAHBAJiWgkAuAgBBQJiWQQCY2EDAwkAAAIFAmJXBQJiSwYJAQEhAQUCYkkHBgQCY2IDAwMJAAACBQFOBQJieAkBAiE9AgUCYnoCAAcJAQIhPQIFAmJ5AgAHCQERQGV4dHJOYXRpdmUoMTA2MikBBQJieggFAmFSBmNhbGxlcgQCY2MDCQEBIQEJAQlpc0RlZmluZWQBBQJhVwIFV0FWRVMJANgEAQkBBXZhbHVlAQUCYVcEAmJuCQEBYQEJAKwCAgUCYm0CBV9PUEVOBAJjZAkBC0RlbGV0ZUVudHJ5AQkArAICBQJibQIFX09QRU4EAmNlCQELU3RyaW5nRW50cnkCCQCsAgIFAmJtAgdfQ0xPU0VECQCsAgIJAKwCAgUCYm4CAV8JAKQDAQUCYkMEAmNmCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCWFydF9zb2xkXwkApAMBBQJiVwIEX29mXwkApAMBBQJiSwIBXwUBUAIBXwUCYngEAmNnAwkBASEBBQJiRAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQFOAgFfCQCkAwEFAmJDAgFfBQJiQgIBXwkApAMBBQJiYwIBXwUCYmICAV8JANgEAQUCYloJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBBQJjYgIBXwkApAMBBQJiQwIBXwUCYkICAV8JAKQDAQUCYVQCAV8FAmNjAgFfCQDYBAEFAmJaBAJjaAkBC1N0cmluZ0VudHJ5AgUCY2YFAmNnBAJjaQMJAQIhPQIFAmJUAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAWYJAGUCBQJiUwUCYlQFAmFXCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQJiTQUCYlQFAmFXBQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAWYFAmJTBQJhVwUDbmlsBAJjagMJAQIhPQIFAmJVAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAmJPBQJiVQUCYVcJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAmJ4CQBlAgUCYlYFAmJVBQJhVwUDbmlsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQJieAUCYlYFAmFXBQNuaWwEAmNrAwUCYnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAU4AAAUEdW5pdAUDbmlsBQNuaWwEAmNsCQDOCAIJAM4IAgkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBWAIFAmJ4BQFQBQJiVwkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgICBG5mdF8JANgEAQUCYloFAmNmCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhB0b3RhbF9uZnRfaXNzdWVkCQBkAgUCYkcAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFoAgUCYngFAVAAAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAVkCBQJieAUBUAUCY2EJAMwIAgUCYlkJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUCY2IAAQUCYloFA25pbAUCY2kFAmNqBQJjawMFAmJECQDMCAIFAmNoCQDMCAIFAmNlCQDMCAIFAmNkBQJjbAkAzAgCBQJjaAUCY2wBAmNtAQJjbgQBRwUCY24DCQABAgUBRwIGU3RyaW5nBAJjbwUBRwUCY28JAAIBAiRTcG9uc29yZWQgUHVibGljIEtleSBTdHJpbmcgZXhwZWN0ZWQKAmNwAQdzZXRDb25mAgFiAmNxBAFOCQClCAEIBQJjcAZjYWxsZXIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQFtCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQFOAwkBCGNvbnRhaW5zAgUBYgIFY29uZl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUBYgUCY3EFA25pbAkAAgECIEVudHJpZXMgc3RhcnRpbmcgd2l0aCBjb25mXyBvbmx5CQACAQIiWW91IGFyZSBub3QgYWxsb3dlZCB0byBjaGFuZ2UgdGhpcwJhUgEKYWRkQXJ0d29yaw4BRgFEAmFMAmFNAmFOAmNyAmF3AmFBAmF4AmFCAmF5AmNzAmFPAmJzBAJjdAkBAmJyAgUCYVIFAmJzBAFQCAUCY3QCXzEEAU4IBQJjdAJfMgQCYkMIBQJjdAJfMwQCYnQIBQJjdAJfNAMJAQEhAQkBAUsBBQFGCQACAQIkSGFzaCBzaG91bGQgYmUgNjQgY2hhcmFjdGVycyBtYXhpbXVtBAJjdQkBAmFIAgUCYXkFAmFCBAJhSggFAmN1Al8xBAJhSwgFAmN1Al8yBAJjdgkBAmFJCgUBTgUCYXcFAmF4BQJhSgUCYUEFAmFLBQJhTAUCYU0FAmFOBQJhTwMJAQIhPQIFAmN2AgAJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEEAmN3CQBmAgkBAXABCQCsAgIFAU4CC19mcmVlX2Ryb3BzAAAEAmN4AwUCY3cJAJQKAgAABQFECQECYVUBBQJhUgQCYVQIBQJjeAJfMQQCYVcIBQJjeAJfMgMJAQEhAQkBCWlzRGVmaW5lZAEFAmFUCQACAQIUU29tZXRoaW5nIHdlbnQgd3JvbmcEAmN5CQEBYQEJAQJhdQIFAUYFAU4DCQECIT0CBQJjeQIACQACAQIUWW91IGFscmVhZHkgYWRkZWQgaXQEAmN6CQEBYQEJAQJhcgEFAUYDCQECIT0CBQJjegIACQACAQIXSGFzaCBhbHJlYWR5IHJlZ2lzdGVyZWQEAmNBCQEBQwMFAUQFAU4FAUYDCQEBIQEFAmNBCQACAQIsU2lnbiBDZXJ0aWZpY2F0ZSBub3QgZm91bmQgZm9yIHRoaXMgYWRkcmVzcy4EAmNCAwUCY3cJAPwHBAUBaAILdXNlRnJlZURyb3AJAMwIAgUBTgUDbmlsBQNuaWwFBHVuaXQDCQAAAgUCY0IFAmNCBAJjawMFAmJ0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQFOAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFyAQUBRgUBTgkAzAgCCQELU3RyaW5nRW50cnkCCQECYXUCBQFGBQFOBQFQCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBTwIFAU4FAVAFAmJDCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFRAgUBTgUBUAUCYUwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVICBQFOBQFQBQJhTQkAzAgCCQELU3RyaW5nRW50cnkCCQEBUwIFAU4FAVAFAmF3CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFVAgUBTgUBUAUCYXgJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVQCBQFOBQFQBQJhQQkAzAgCCQELU3RyaW5nRW50cnkCCQEBWgIFAU4FAVAFAmFLCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYQIFAU4FAVAFAmFKCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYwIFAU4FAVAFAmNyCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYgIFAU4FAVAFAmFOCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEBVgIFAU4FAVAAAAkAzAgCCQELU3RyaW5nRW50cnkCCQEBVwIFAU4FAVAFAUQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFYAgUBTgUBUAAACQDMCAIJAQxCb29sZWFuRW50cnkCCQEBWQIFAU4FAVAHCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhcwIFAU4FAUQFAVAJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFwAgUBTgUBUAUBRgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWUCBQFOBQFQBQJjcwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFmAgUBTgUBUAUCYU8JAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAWYFAmFUBQFpBQNuaWwFAmNrCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAmFSAQ11cGRhdGVBcnR3b3JrDQJhcQJhTAJhTQJhTgJjcgJhdwJhQQJheAJhQgJheQJjcwJhTwJicwMJAQEhAQUBdgkAAgEFAXcEAmNDCQECYnICBQJhUgUCYnMEAmJCCAUCY0MCXzEEAU4IBQJjQwJfMgQCYkMIBQJjQwJfMwQCYnQIBQJjQwJfNAQCY0QJAQJhSAIFAmF5BQJhQgQCYUoIBQJjRAJfMQQCYUsIBQJjRAJfMgQCY3YJAQJhSQoFAU4FAmF3BQJheAUCYUoFAmFBBQJhSwUCYUwFAmFNBQJhTgUCYU8DCQECIT0CBQJjdgIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAJjeQkBAWEBCQEBUQIFAU4FAmFxAwkAAAIFAmN5AgAJAAIBAg9FbnRyeSBub3QgZm91bmQEAmNFCQEBYQEJAQJhagIFAU4FAmFxAwkAAAIFAmNFAgdJTExFR0FMCQACAQIdQ2Fubm90IHVwZGF0ZSBJTExFR0FMIGFydHdvcmsDCQEBIQEJAQJhWAIFAU4FAmFxBAJjawMFAmJ0CQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQFOAAAFBHVuaXQFA25pbAUDbmlsCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVECBQFOBQJhcQUCYUwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVICBQFOBQJhcQUCYU0JAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVMCBQFOBQJhcQUCYXcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVUCBQFOBQJhcQUCYXgJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAVQCBQFOBQJhcQUCYUEJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFhAgUBTgUCYXEFAmFKCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQFaAgUBTgUCYXEFAmFLCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhYgIFAU4FAmFxBQJhTgkAzAgCCQELU3RyaW5nRW50cnkCCQECYWMCBQFOBQJhcQUCY3IJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFlAgUBTgUCYXEFAmNzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQECYWYCBQFOBQJhcQUCYU8FA25pbAUCY2sJAAIBAg5BbHJlYWR5IG1pbnRlZAJhUgELZmxhZ0FydHdvcmsEAVACY0YCY0UCY0cEAmNICQECYnYBBQJhUgQCYkIIBQJjSAJfMQQBTggFAmNIAl8yAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUBbQkAzAgCCQClCAEFBHRoaXMFA25pbAUBTgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAICB0NPTlNFTlQJAMwIAgIACQDMCAICD0NIQU5HRV9SRVFVSVJFRAkAzAgCAgdGTEFHR0VECQDMCAICB0lMTEVHQUwFA25pbAUCY0UJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFqAgUCY0YFAVAFAmNFCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQJhZAIFAmNGBQFQBQJjRwUDbmlsCQACAQkArAICAg5Vbmtub3cgc3RhdHVzIAUCY0UJAAIBAhNZb3UgYXJlIG5vdCBhbGxvd2VkAmFSAQ1kZWxldGVBcnR3b3JrAgFQAmNGBAJjSQkBAmJ2AQUCYVIEAmJCCAUCY0kCXzEEAU4IBQJjSQJfMgQCYVkDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQFtCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQFOBQJjRgUBTgQCY3kJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkBAWEBCQEBUQIFAmFZBQFQAiBObyBhcnQgbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwMJAAACBQJjeQIACQACAQIgTm8gYXJ0IG1hdGNoaW5nIGZvciB0aGlzIGFkZHJlc3MEAUYJAQFhAQkBAmFwAgUCYVkFAVADCQAAAgUBRgIACQACAQIlTm8gYXJ0IGhhc2ggbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwQBRAkBAWEBCQEBVwIFAmFZBQFQAwkAAAIFAUQCAAkAAgECE05vIFNJR04gSUQgbWF0Y2hpbmcEAmNKCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFPAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVECBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBUgIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFTAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVUCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBVAIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFaAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFhAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFjAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAmFiAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVYCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQEBVwIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQFYAgUCYVkFAVAJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBAVkCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWoCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWcCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYWkCBQJhWQUBUAkAzAgCCQELRGVsZXRlRW50cnkBCQECYXIBBQFGCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhcwIFAmFZBQFECQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhdQIFAUYFAmFZCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhaAIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhZAIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhZQIFAmFZBQFQCQDMCAIJAQtEZWxldGVFbnRyeQEJAQJhZgIFAmFZBQFQBQNuaWwDCQEBIQEJAQJhWAIFAmFZBQFQAwkBASEBBQF2CQACAQUBdwUCY0oDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQFtCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQFOBQJjSgkAAgECKEFydCBhbHJlYWR5IG1pbnRlZCwgeW91IGNhbm5vdCBkZWxldGUgaXQCYVIBC3NlbGxBcnR3b3JrBgFQAmJnAmNLAmFXAmJFAmJzBAJjTAkBAmJyAgUCYVIFAmJzBAJiQggFAmNMAl8xBAFOCAUCY0wCXzIEAmJDCAUCY0wCXzMEAmJ0CAUCY0wCXzQEAmJICQEBYQEJAQFRAgUBTgUBUAMJAAACBQJiSAIACQACAQIjVGhpcyBhcnQgZG9lc24ndCBtYXRjaCB5b3VyIGFjY291bnQEAmNFCQEBYQEJAQJhagIFAU4FAVADCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAg9DSEFOR0VfUkVRVUlSRUQJAMwIAgIHRkxBR0dFRAkAzAgCAgdJTExFR0FMBQNuaWwFAmNFCQACAQIPRmxhZ2dlZCBhcnR3b3JrBAJjTQkBAW8BCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUBUAMJAGYCAAAFAmJFCQACAQIMTmVnYXRpdmUgZW5kAwMJAGYCBQJiRQAAAwkBAiE9AgUCY0sAAQYJAQIhPQIFAmJnAAAHCQACAQI6VGltZWQgb2ZmZXIgb25seSBhbGxvd2VkIGZvciB1bmlxdWUgZWRpdGlvbiBhbmQgb2ZmZXIgb25seQQCY04DCQAAAgUCYkUAAAAABQZoZWlnaHQDCQEBIQEJAQJiZQEFAmFXCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchAwkBASEBCQECYmYCBQJhVwUCYmcJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEEAmFQCQECYUYBBQFOAwkBAiE9AgUCYVACAAkAAgEFAmFQBAJiSgkBAW8BCQEBWAIFAU4FAVAEAmJLCQEBbwEJAQFWAgUBTgUBUAMJAGYCBQJjSwBkCQACAQIcMTAwIGVkaXRpb25zIG1heCBwZXIgYXJ0d29yawMDCQECIT0CBQJiSgAACQAAAgUCYkoFAmJLBwkAAgECFE1heCBlZGl0aW9uIHJlYWNoZWQuAwMJAGYCBQJiSgAACQECIT0CBQJiSwUCY0sHCQACAQImQ2Fubm90IGNoYW5nZSBtYXhpbXVtIGlzc3VhYmxlIGFueW1vcmUDAwkAZgIFAmNNAAAJAQIhPQIFAmJLBQJjSwcJAAIBAjFDYW5ub3QgY2hhbmdlIG1heGltdW0gaXNzdWFibGUgd2l0aCBhY3RpdmUgb3JkZXJzBAJjYQMDCQBmAgUCYmcAAAkAZgIFAmNLAAAHBgcEAmNrAwUCYnQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFAU4AAAUEdW5pdAUDbmlsBQNuaWwJAM4IAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBAVkCBQFOBQFQBQJjYQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBAmFnAgUBTgUBUAUCYmcJAMwIAgkBDEludGVnZXJFbnRyeQIJAQFWAgUBTgUBUAUCY0sJAMwIAgkBC1N0cmluZ0VudHJ5AgkBAmFpAgUBTgUBUAUCYVcJAMwIAgkBDEludGVnZXJFbnRyeQIJAQJhaAIFAU4FAVAJAGQCBQJjTgUCYkUFA25pbAUCY2sCYVIBCmJ1eUFydHdvcmsCAVACYngJAQJidwYFAmFSBQFQBQJieAIAAgACAAJhUgEGc2V0QmlkAgFQAmJ4BAJjTwkBAmJ2AQUCYVIEAmJCCAUCY08CXzEEAU4IBQJjTwJfMgQCYkMIBQJjTwJfMwQCY1AJAQJhUQEFAmFSBAJhUwgFAmNQAl8xBAJhVAgFAmNQAl8yBAJhVwMJAQEhAQkBCWlzRGVmaW5lZAEIBQJhUwdhc3NldElkAgVXQVZFUwkA2AQBCQEFdmFsdWUBCAUCYVMHYXNzZXRJZAQCYkUJAQFvAQkBAmFoAgUCYngFAVADAwkBAiE9AgUCYkUAAAkAZwIFBmhlaWdodAUCYkUHCQACAQILU2FsZSBlbmRlZC4EAmNNCQEBbwEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQFQAwkBASEBCQECYmUBBQJhVwkAAgECEmFzc2V0IG5vdCBhY2NlcHRlZAMJAQEhAQkBAmJmAgUCYVcFAmFUCQACAQIOV3JvbmcgbWluIHNlbGwEAmJKCQEBbwEJAQFYAgUCYngFAVAEAmJLCQEBbwEJAQFWAgUCYngFAVADCQBnAgAABQJiSwkAAgECI05vIG1heCBlZGl0aW9uIHNldCBmb3IgdGhpcyBhcnR3b3JrAwkAZwIFAmJKBQJiSwkAAgECGFNvbGQgb3V0LCB5b3UgY2Fubm90IGJpZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIEYmlkXwUBUAIBXwUCYngCAV8FAU4CAV8FAmJCAgVfT1BFTgkArAICCQCsAgIJAKwCAgkArAICBQJhVwIBXwkApAMBBQJhVAIBXwkApAMBBQJiQwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FAVAJAGQCBQJjTQABBQNuaWwCYVIBCWFjY2VwdEJpZAUBUAJieAJieQJiegJicwkBAmJ3BgUCYVIFAVAFAmJ4BQJieQUCYnoFAmJzAmFSAQljYW5jZWxCaWQEAVACYngCYnkCYnoEAmNRCQECYnYBBQJhUgQCYkIIBQJjUQJfMQQBTggFAmNRAl8yBAJiQwgFAmNRAl8zAwMJAQIhPQIFAU4FAmJ6CQECIT0CBQFOBQJieAcJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uBAJjUgMJAAACBQFOBQJieAUCYnoFAU4EAmNNCQEBbwEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQFQBAJibQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQFQAgFfBQJieAIBXwUCYnoCAV8FAmJ5BAJibgkBAWEBCQCsAgIFAmJtAgVfT1BFTgMJAAACBQJibgIACQACAQINQmlkIG5vdCBmb3VuZAQCYm8JALUJAgUCYm4CAV8EAmFXCQECYmsBCQCRAwIFAmJvAAAEAmNTAghDQU5DRUxFRAkAzAgCCQELRGVsZXRlRW50cnkBCQCsAgIFAmJtAgVfT1BFTgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgUCYm0CAV8FAmNTCQCsAgIJAKwCAgUCYm4CAV8JAKQDAQUCYkMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQFQCQBlAgUCY00AAQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUCY1IJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJibwABBQJhVwUDbmlsAQJjVAECY1UABAFHBQJjVAMJAAECBQFHAhdJbnZva2VTY3JpcHRUcmFuc2FjdGlvbgQCY1YFAUcDAwMDCQAAAggFAmNWCGZ1bmN0aW9uAgphZGRBcnR3b3JrCQAAAggFAmNWBGRBcHAFBHRoaXMHCQAAAggFAmNWA2ZlZQCgwh4HCQAAAggFAmNWCmZlZUFzc2V0SWQFBHVuaXQHCQD0AwMIBQJjVAlib2R5Qnl0ZXMJAJEDAggFAmNUBnByb29mcwAACQDZBAEJAQJjbQEJAJEDAggFAmNWBGFyZ3MADQMDAwMJAAACCAUCY1YIZnVuY3Rpb24CDXVwZGF0ZUFydHdvcmsJAAACCAUCY1YEZEFwcAUEdGhpcwcJAAACCAUCY1YDZmVlAKDCHgcJAAACCAUCY1YKZmVlQXNzZXRJZAUEdW5pdAcJAPQDAwgFAmNUCWJvZHlCeXRlcwkAkQMCCAUCY1QGcHJvb2ZzAAAJANkEAQkBAmNtAQkAkQMCCAUCY1YEYXJncwAMAwMDAwkAAAIIBQJjVghmdW5jdGlvbgILc2VsbEFydHdvcmsJAAACCAUCY1YEZEFwcAUEdGhpcwcJAAACCAUCY1YDZmVlAKDCHgcJAAACCAUCY1YKZmVlQXNzZXRJZAUEdW5pdAcJAPQDAwgFAmNUCWJvZHlCeXRlcwkAkQMCCAUCY1QGcHJvb2ZzAAAJANkEAQkBAmNtAQkAkQMCCAUCY1YEYXJncwAFAwMDAwkAAAIIBQJjVghmdW5jdGlvbgIJYWNjZXB0QmlkCQAAAggFAmNWBGRBcHAFBHRoaXMHCQAAAggFAmNWA2ZlZQCgwh4HCQAAAggFAmNWCmZlZUFzc2V0SWQFBHVuaXQHCQDIEwMIBQJjVAlib2R5Qnl0ZXMJAJEDAggFAmNUBnByb29mcwAACQDZBAEJAQJjbQEJAJEDAggFAmNWBGFyZ3MABAkA9AMDCAUCY1QJYm9keUJ5dGVzCQCRAwIIBQJjVAZwcm9vZnMAAAgFAmNUD3NlbmRlclB1YmxpY0tleQkA9AMDCAUCY1QJYm9keUJ5dGVzCQCRAwIIBQJjVAZwcm9vZnMAAAgFAmNUD3NlbmRlclB1YmxpY0tleTMM6pM=", "height": 3569227, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8hJ1Zp3UyHgn6cH9LZM6Sh6XSwRohBYq3AM6XP4NeZ5d Next: 39mGmmSbKqjHgrRF3WX6Awvt712Hu61ce44Lmknpm2uE Diff:
OldNewDifferences
401401 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
402402
403403
404-func buyMint (i,artId,issuer,bidId,bidOwner) = {
405- let $t01297713036 = idCallerDate(i)
406- let id = $t01297713036._1
407- let caller = $t01297713036._2
408- let date = $t01297713036._3
404+func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
405+ let $t01304113130 = idCallerDateSponsored(i, pubKey)
406+ let id = $t01304113130._1
407+ let caller = $t01304113130._2
408+ let date = $t01304113130._3
409+ let isSponsored = $t01304113130._4
409410 let isBid = if (if (if ((caller == issuer))
410411 then (bidOwner != "")
411412 else false)
413414 else false)
414415 then true
415416 else false
416- let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
417- if (if (if ((blockEnd != 0))
418- then (height >= blockEnd)
417+ if (if (isBid)
418+ then (caller != issuer)
419419 else false)
420- then !(isBid)
421- else false)
422- then throw("Sale ended.")
420+ then throw("You cannot do this action")
423421 else {
424- let callerIsIssuer = (caller == issuer)
425- let totalNFT = getIntegerByKey("total_nft_issued")
426- let signID = getStringByKey(keySignID(issuer, artId))
427- let artworkName = getStringByKey(keyName(issuer, artId))
428- if ((artworkName == ""))
429- then throw("Art doesn't exist")
422+ let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
423+ if (if (if ((blockEnd != 0))
424+ then (height >= blockEnd)
425+ else false)
426+ then !(isBid)
427+ else false)
428+ then throw("Sale ended.")
430429 else {
431- let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
432- let amountSold = getIntegerByKey(keyIssued(issuer, artId))
433- let artworkPrice = if (callerIsIssuer)
434- then (currentCertificationPrice * 2)
435- else getIntegerByKey(keyPrice(issuer, artId))
436- let priceAssetId = if (callerIsIssuer)
437- then toBase58String(signAssetId)
438- else getStringByKey(keyAssetIdAccepted(issuer, artId))
439- let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
440- if (if (if (!(isBid))
441- then !(callerIsIssuer)
442- else false)
443- then if (if ((0 >= artworkPrice))
444- then true
445- else !(isOnSale))
446- then true
447- else (0 >= maxCanSell)
448- else false)
449- then throw("Art not for sale")
450- else if (if (if (!(isBid))
451- then callerIsIssuer
452- else false)
453- then (0 >= maxCanSell)
454- else false)
455- then throw("Max issuable not set")
456- else {
457- let checkUser = validateUser(issuer)
458- if (if (isBid)
459- then (checkUser != "")
430+ let callerIsIssuer = (caller == issuer)
431+ let totalNFT = getIntegerByKey("total_nft_issued")
432+ let signID = getStringByKey(keySignID(issuer, artId))
433+ let artworkName = getStringByKey(keyName(issuer, artId))
434+ if ((artworkName == ""))
435+ then throw("Art doesn't exist")
436+ else {
437+ let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
438+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
439+ let artworkPrice = if (callerIsIssuer)
440+ then (currentCertificationPrice * 2)
441+ else getIntegerByKey(keyPrice(issuer, artId))
442+ let priceAssetId = if (callerIsIssuer)
443+ then toBase58String(signAssetId)
444+ else getStringByKey(keyAssetIdAccepted(issuer, artId))
445+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
446+ if (if (if (!(isBid))
447+ then !(callerIsIssuer)
448+ else false)
449+ then if (if ((0 >= artworkPrice))
450+ then true
451+ else !(isOnSale))
452+ then true
453+ else (0 >= maxCanSell)
454+ else false)
455+ then throw("Art not for sale")
456+ else if (if (if (!(isBid))
457+ then callerIsIssuer
460458 else false)
461- then throw(checkUser)
459+ then (0 >= maxCanSell)
460+ else false)
461+ then throw("Max issuable not set")
462462 else {
463- let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
464- let $t01455514747 = if (isBid)
465- then getPriceAssetIdFromBid(bidDataKey)
466- else validatePriceAssetId(i, priceAssetId, artworkPrice)
467- let amount = $t01455514747._1
468- let assetId = $t01455514747._2
469- let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
470- let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
471- let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
472- let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
473- let isWhitelisted = checkWhitelist(issuer)
474- let cut = if ((isWhitelisted > height))
475- then 0
476- else if ((assetId == signAssetId))
477- then signCut
478- else usdnWaveCut
479- let amountForSign = fraction(amount, cut, 100)
480- let amountForAgent = if (if (if ((agent != feeReceiver))
481- then (agentShare > 0)
463+ let checkUser = validateUser(issuer)
464+ if (if (isBid)
465+ then (checkUser != "")
482466 else false)
483- then (height > isWhitelisted)
484- else false)
485- then fraction(amount, agentShare, 10000)
486- else 0
487- let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
488- then (publicAgentShare > 0)
489- else false)
490- then (height > isWhitelisted)
491- else false)
492- then fraction(amount, publicAgentShare, 10000)
493- else 0
494- let amountForCreator = (amount - amountForSign)
495- if ((amountSold == maxCanSell))
496- then throw("Art sold out")
467+ then throw(checkUser)
497468 else {
498- let newAmountSold = (amountSold + 1)
499- let issueMeta = ((((((((((("Creator: " + issuer) + ",
469+ let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
470+ let $t01472814920 = if (isBid)
471+ then getPriceAssetIdFromBid(bidDataKey)
472+ else validatePriceAssetId(i, priceAssetId, artworkPrice)
473+ let amount = $t01472814920._1
474+ let assetId = $t01472814920._2
475+ let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
476+ let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
477+ let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
478+ let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
479+ let isWhitelisted = checkWhitelist(issuer)
480+ let cut = if ((isWhitelisted > height))
481+ then 0
482+ else if ((assetId == signAssetId))
483+ then signCut
484+ else usdnWaveCut
485+ let amountForSign = fraction(amount, cut, 100)
486+ let amountForAgent = if (if (if ((agent != feeReceiver))
487+ then (agentShare > 0)
488+ else false)
489+ then (height > isWhitelisted)
490+ else false)
491+ then fraction(amount, agentShare, 10000)
492+ else 0
493+ let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
494+ then (publicAgentShare > 0)
495+ else false)
496+ then (height > isWhitelisted)
497+ else false)
498+ then fraction(amount, publicAgentShare, 10000)
499+ else 0
500+ let amountForCreator = (amount - amountForSign)
501+ if ((amountSold == maxCanSell))
502+ then throw("Art sold out")
503+ else {
504+ let newAmountSold = (amountSold + 1)
505+ let issueMeta = ((((((((((("Creator: " + issuer) + ",
500506 ArtID: ") + artId) + ",
501507 SignID: ") + signID) + ",
502508 Artwork name: ") + artworkName) + ",
503509 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
504- let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
505- let idNFT = calculateAssetId(issueNFT)
506- let sellStatus = if (if ((newAmountSold == maxCanSell))
507- then true
508- else !(isOnSale))
509- then false
510- else true
511- let receiveNFT = if (if (if ((caller == issuer))
512- then (bidOwner != "")
513- else false)
514- then (bidId != "")
515- else false)
516- then addressFromStringValue(bidOwner)
517- else i.caller
518- let assetIdBid = if (!(isDefined(assetId)))
519- then "WAVES"
520- else toBase58String(value(assetId))
521- let bidData = getStringByKey((bidDataKey + "_OPEN"))
522- let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
523- let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
524- let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
525- let soldValue = if (!(isBid))
526- then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
527- else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
528- let soldData = StringEntry(soldKey, soldValue)
529- let commissionsWithAgent = if ((amountForAgent != 0))
530- then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
531- else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
532- let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
533- then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
534- else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
535- let buyRes = (([IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissionsWithAgent) ++ commissionsWithPublicAgent)
536- if (isBid)
537- then [soldData, bidUpdate, bidDelOld] :: buyRes
538- else soldData :: buyRes
510+ let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
511+ let idNFT = calculateAssetId(issueNFT)
512+ let sellStatus = if (if ((newAmountSold == maxCanSell))
513+ then true
514+ else !(isOnSale))
515+ then false
516+ else true
517+ let receiveNFT = if (if (if ((caller == issuer))
518+ then (bidOwner != "")
519+ else false)
520+ then (bidId != "")
521+ else false)
522+ then addressFromStringValue(bidOwner)
523+ else i.caller
524+ let assetIdBid = if (!(isDefined(assetId)))
525+ then "WAVES"
526+ else toBase58String(value(assetId))
527+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
528+ let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
529+ let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
530+ let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
531+ let soldValue = if (!(isBid))
532+ then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
533+ else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
534+ let soldData = StringEntry(soldKey, soldValue)
535+ let commissionsWithAgent = if ((amountForAgent != 0))
536+ then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
537+ else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
538+ let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
539+ then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
540+ else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
541+ let txToCaller = if (isSponsored)
542+ then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
543+ else nil
544+ 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)
545+ if (isBid)
546+ then [soldData, bidUpdate, bidDelOld] :: buyRes
547+ else soldData :: buyRes
548+ }
539549 }
540550 }
541- }
551+ }
542552 }
543553 }
544554 }
566576
567577 @Callable(i)
568578 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
569- let $t01980219875 = idCallerDateSponsored(i, pubKey)
570- let artId = $t01980219875._1
571- let caller = $t01980219875._2
572- let date = $t01980219875._3
573- let isSponsored = $t01980219875._4
579+ let $t02009620169 = idCallerDateSponsored(i, pubKey)
580+ let artId = $t02009620169._1
581+ let caller = $t02009620169._2
582+ let date = $t02009620169._3
583+ let isSponsored = $t02009620169._4
574584 if (!(validateHash(sha256Hash)))
575585 then throw("Hash should be 64 characters maximum")
576586 else {
577- let $t01997620045 = setLIcence(cidLicence, sha256Licence)
578- let licenceCID = $t01997620045._1
579- let licenceHash = $t01997620045._2
587+ let $t02027020339 = setLIcence(cidLicence, sha256Licence)
588+ let licenceCID = $t02027020339._1
589+ let licenceHash = $t02027020339._2
580590 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
581591 if ((validateArtwork != ""))
582592 then throw("Something went wrong!")
583593 else {
584594 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
585- let $t02034420428 = if (whitelisted_drop)
595+ let $t02063820722 = if (whitelisted_drop)
586596 then $Tuple2(0, signID)
587597 else validatePayment(i)
588- let amount = $t02034420428._1
589- let assetId = $t02034420428._2
598+ let amount = $t02063820722._1
599+ let assetId = $t02063820722._2
590600 if (!(isDefined(amount)))
591601 then throw("Something went wrong")
592602 else {
627637 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
628638 then throw(maintenanceMSG)
629639 else {
630- let $t02346223532 = idCallerDateSponsored(i, pubKey)
631- let id = $t02346223532._1
632- let caller = $t02346223532._2
633- let date = $t02346223532._3
634- let isSponsored = $t02346223532._4
635- let $t02354223611 = setLIcence(cidLicence, sha256Licence)
636- let licenceCID = $t02354223611._1
637- let licenceHash = $t02354223611._2
640+ let $t02375623826 = idCallerDateSponsored(i, pubKey)
641+ let id = $t02375623826._1
642+ let caller = $t02375623826._2
643+ let date = $t02375623826._3
644+ let isSponsored = $t02375623826._4
645+ let $t02383623905 = setLIcence(cidLicence, sha256Licence)
646+ let licenceCID = $t02383623905._1
647+ let licenceHash = $t02383623905._2
638648 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
639649 if ((validateArtwork != ""))
640650 then throw("Something went wrong!")
662672
663673 @Callable(i)
664674 func flagArtwork (artId,addr,flag,note) = {
665- let $t02523825272 = idCallerDate(i)
666- let id = $t02523825272._1
667- let caller = $t02523825272._2
675+ let $t02553225566 = idCallerDate(i)
676+ let id = $t02553225566._1
677+ let caller = $t02553225566._2
668678 if (containsElement([chris, toString(this)], caller))
669679 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
670680 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
676686
677687 @Callable(i)
678688 func deleteArtwork (artId,addr) = {
679- let $t02570825742 = idCallerDate(i)
680- let id = $t02570825742._1
681- let caller = $t02570825742._2
689+ let $t02600226036 = idCallerDate(i)
690+ let id = $t02600226036._1
691+ let caller = $t02600226036._2
682692 let addrToUse = if (containsElement([chris, toString(this)], caller))
683693 then addr
684694 else caller
711721
712722 @Callable(i)
713723 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
714- let $t02857828648 = idCallerDateSponsored(i, pubKey)
715- let id = $t02857828648._1
716- let caller = $t02857828648._2
717- let date = $t02857828648._3
718- let isSponsored = $t02857828648._4
724+ let $t02887228942 = idCallerDateSponsored(i, pubKey)
725+ let id = $t02887228942._1
726+ let caller = $t02887228942._2
727+ let date = $t02887228942._3
728+ let isSponsored = $t02887228942._4
719729 let artworkName = getStringByKey(keyName(caller, artId))
720730 if ((artworkName == ""))
721731 then throw("This art doesn't match your account")
783793
784794
785795 @Callable(i)
786-func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "")
796+func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", "")
787797
788798
789799
790800 @Callable(i)
791801 func setBid (artId,issuer) = {
792- let $t03102631066 = idCallerDate(i)
793- let id = $t03102631066._1
794- let caller = $t03102631066._2
795- let date = $t03102631066._3
796- let $t03107131107 = isPayment(i)
797- let payment = $t03107131107._1
798- let amount = $t03107131107._2
802+ let $t03132431364 = idCallerDate(i)
803+ let id = $t03132431364._1
804+ let caller = $t03132431364._2
805+ let date = $t03132431364._3
806+ let $t03136931405 = isPayment(i)
807+ let payment = $t03136931405._1
808+ let amount = $t03136931405._2
799809 let assetId = if (!(isDefined(payment.assetId)))
800810 then "WAVES"
801811 else toBase58String(value(payment.assetId))
825835
826836
827837 @Callable(i)
828-func acceptBid (artId,issuer,bidId,bidOwner) = {
829- let $t03226532305 = idCallerDate(i)
830- let id = $t03226532305._1
831- let caller = $t03226532305._2
832- let date = $t03226532305._3
833- if ((caller != issuer))
834- then throw("You cannot do this action")
835- else buyMint(i, artId, issuer, bidId, bidOwner)
836- }
838+func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
837839
838840
839841
840842 @Callable(i)
841843 func cancelBid (artId,issuer,bidId,bidOwner) = {
842- let $t03253132592 = idCallerDate(i)
843- let id = $t03253132592._1
844- let caller = $t03253132592._2
845- let date = $t03253132592._3
844+ let $t03273832799 = idCallerDate(i)
845+ let id = $t03273832799._1
846+ let caller = $t03273832799._2
847+ let date = $t03273832799._3
846848 if (if ((caller != bidOwner))
847849 then (caller != issuer)
848850 else false)
893895 then (inv.feeAssetId == unit)
894896 else false)
895897 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
896- else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
898+ else if (if (if (if ((inv.function == "acceptBid"))
899+ then (inv.dApp == this)
900+ else false)
901+ then (inv.fee == 500000)
902+ else false)
903+ then (inv.feeAssetId == unit)
904+ else false)
905+ then sigVerify_128Kb(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[4])))
906+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
897907 case _ =>
898908 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
899909 }
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))
394394 then $Tuple4(toBase58String(i.transactionId), caller, lastBlock.timestamp, (isSponsored > 0))
395395 else throw("Strict value is not equal to itself.")
396396 }
397397
398398
399399 func idCallerDate (i) = if (!(dappRunning))
400400 then throw(maintenanceMSG)
401401 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
402402
403403
404-func buyMint (i,artId,issuer,bidId,bidOwner) = {
405- let $t01297713036 = idCallerDate(i)
406- let id = $t01297713036._1
407- let caller = $t01297713036._2
408- let date = $t01297713036._3
404+func buyMint (i,artId,issuer,bidId,bidOwner,pubKey) = {
405+ let $t01304113130 = idCallerDateSponsored(i, pubKey)
406+ let id = $t01304113130._1
407+ let caller = $t01304113130._2
408+ let date = $t01304113130._3
409+ let isSponsored = $t01304113130._4
409410 let isBid = if (if (if ((caller == issuer))
410411 then (bidOwner != "")
411412 else false)
412413 then (bidId != "")
413414 else false)
414415 then true
415416 else false
416- let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
417- if (if (if ((blockEnd != 0))
418- then (height >= blockEnd)
417+ if (if (isBid)
418+ then (caller != issuer)
419419 else false)
420- then !(isBid)
421- else false)
422- then throw("Sale ended.")
420+ then throw("You cannot do this action")
423421 else {
424- let callerIsIssuer = (caller == issuer)
425- let totalNFT = getIntegerByKey("total_nft_issued")
426- let signID = getStringByKey(keySignID(issuer, artId))
427- let artworkName = getStringByKey(keyName(issuer, artId))
428- if ((artworkName == ""))
429- then throw("Art doesn't exist")
422+ let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
423+ if (if (if ((blockEnd != 0))
424+ then (height >= blockEnd)
425+ else false)
426+ then !(isBid)
427+ else false)
428+ then throw("Sale ended.")
430429 else {
431- let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
432- let amountSold = getIntegerByKey(keyIssued(issuer, artId))
433- let artworkPrice = if (callerIsIssuer)
434- then (currentCertificationPrice * 2)
435- else getIntegerByKey(keyPrice(issuer, artId))
436- let priceAssetId = if (callerIsIssuer)
437- then toBase58String(signAssetId)
438- else getStringByKey(keyAssetIdAccepted(issuer, artId))
439- let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
440- if (if (if (!(isBid))
441- then !(callerIsIssuer)
442- else false)
443- then if (if ((0 >= artworkPrice))
444- then true
445- else !(isOnSale))
446- then true
447- else (0 >= maxCanSell)
448- else false)
449- then throw("Art not for sale")
450- else if (if (if (!(isBid))
451- then callerIsIssuer
452- else false)
453- then (0 >= maxCanSell)
454- else false)
455- then throw("Max issuable not set")
456- else {
457- let checkUser = validateUser(issuer)
458- if (if (isBid)
459- then (checkUser != "")
430+ let callerIsIssuer = (caller == issuer)
431+ let totalNFT = getIntegerByKey("total_nft_issued")
432+ let signID = getStringByKey(keySignID(issuer, artId))
433+ let artworkName = getStringByKey(keyName(issuer, artId))
434+ if ((artworkName == ""))
435+ then throw("Art doesn't exist")
436+ else {
437+ let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
438+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
439+ let artworkPrice = if (callerIsIssuer)
440+ then (currentCertificationPrice * 2)
441+ else getIntegerByKey(keyPrice(issuer, artId))
442+ let priceAssetId = if (callerIsIssuer)
443+ then toBase58String(signAssetId)
444+ else getStringByKey(keyAssetIdAccepted(issuer, artId))
445+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
446+ if (if (if (!(isBid))
447+ then !(callerIsIssuer)
448+ else false)
449+ then if (if ((0 >= artworkPrice))
450+ then true
451+ else !(isOnSale))
452+ then true
453+ else (0 >= maxCanSell)
454+ else false)
455+ then throw("Art not for sale")
456+ else if (if (if (!(isBid))
457+ then callerIsIssuer
460458 else false)
461- then throw(checkUser)
459+ then (0 >= maxCanSell)
460+ else false)
461+ then throw("Max issuable not set")
462462 else {
463- let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
464- let $t01455514747 = if (isBid)
465- then getPriceAssetIdFromBid(bidDataKey)
466- else validatePriceAssetId(i, priceAssetId, artworkPrice)
467- let amount = $t01455514747._1
468- let assetId = $t01455514747._2
469- let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
470- let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
471- let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
472- let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
473- let isWhitelisted = checkWhitelist(issuer)
474- let cut = if ((isWhitelisted > height))
475- then 0
476- else if ((assetId == signAssetId))
477- then signCut
478- else usdnWaveCut
479- let amountForSign = fraction(amount, cut, 100)
480- let amountForAgent = if (if (if ((agent != feeReceiver))
481- then (agentShare > 0)
463+ let checkUser = validateUser(issuer)
464+ if (if (isBid)
465+ then (checkUser != "")
482466 else false)
483- then (height > isWhitelisted)
484- else false)
485- then fraction(amount, agentShare, 10000)
486- else 0
487- let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
488- then (publicAgentShare > 0)
489- else false)
490- then (height > isWhitelisted)
491- else false)
492- then fraction(amount, publicAgentShare, 10000)
493- else 0
494- let amountForCreator = (amount - amountForSign)
495- if ((amountSold == maxCanSell))
496- then throw("Art sold out")
467+ then throw(checkUser)
497468 else {
498- let newAmountSold = (amountSold + 1)
499- let issueMeta = ((((((((((("Creator: " + issuer) + ",
469+ let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
470+ let $t01472814920 = if (isBid)
471+ then getPriceAssetIdFromBid(bidDataKey)
472+ else validatePriceAssetId(i, priceAssetId, artworkPrice)
473+ let amount = $t01472814920._1
474+ let assetId = $t01472814920._2
475+ let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
476+ let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShareAgent(issuer)), 0)
477+ let publicAgent = valueOrElse(getString(userDapp, keyArtistPublicAgentAddr(issuer)), feeReceiver)
478+ let publicAgentShare = valueOrElse(getInteger(userDapp, keyPrimarySharePublicAgent(issuer)), 0)
479+ let isWhitelisted = checkWhitelist(issuer)
480+ let cut = if ((isWhitelisted > height))
481+ then 0
482+ else if ((assetId == signAssetId))
483+ then signCut
484+ else usdnWaveCut
485+ let amountForSign = fraction(amount, cut, 100)
486+ let amountForAgent = if (if (if ((agent != feeReceiver))
487+ then (agentShare > 0)
488+ else false)
489+ then (height > isWhitelisted)
490+ else false)
491+ then fraction(amount, agentShare, 10000)
492+ else 0
493+ let amountForPublicAgent = if (if (if ((publicAgent != feeReceiver))
494+ then (publicAgentShare > 0)
495+ else false)
496+ then (height > isWhitelisted)
497+ else false)
498+ then fraction(amount, publicAgentShare, 10000)
499+ else 0
500+ let amountForCreator = (amount - amountForSign)
501+ if ((amountSold == maxCanSell))
502+ then throw("Art sold out")
503+ else {
504+ let newAmountSold = (amountSold + 1)
505+ let issueMeta = ((((((((((("Creator: " + issuer) + ",
500506 ArtID: ") + artId) + ",
501507 SignID: ") + signID) + ",
502508 Artwork name: ") + artworkName) + ",
503509 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
504- let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
505- let idNFT = calculateAssetId(issueNFT)
506- let sellStatus = if (if ((newAmountSold == maxCanSell))
507- then true
508- else !(isOnSale))
509- then false
510- else true
511- let receiveNFT = if (if (if ((caller == issuer))
512- then (bidOwner != "")
513- else false)
514- then (bidId != "")
515- else false)
516- then addressFromStringValue(bidOwner)
517- else i.caller
518- let assetIdBid = if (!(isDefined(assetId)))
519- then "WAVES"
520- else toBase58String(value(assetId))
521- let bidData = getStringByKey((bidDataKey + "_OPEN"))
522- let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
523- let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
524- let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
525- let soldValue = if (!(isBid))
526- then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
527- else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
528- let soldData = StringEntry(soldKey, soldValue)
529- let commissionsWithAgent = if ((amountForAgent != 0))
530- then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
531- else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
532- let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
533- then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
534- else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
535- let buyRes = (([IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissionsWithAgent) ++ commissionsWithPublicAgent)
536- if (isBid)
537- then [soldData, bidUpdate, bidDelOld] :: buyRes
538- else soldData :: buyRes
510+ let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
511+ let idNFT = calculateAssetId(issueNFT)
512+ let sellStatus = if (if ((newAmountSold == maxCanSell))
513+ then true
514+ else !(isOnSale))
515+ then false
516+ else true
517+ let receiveNFT = if (if (if ((caller == issuer))
518+ then (bidOwner != "")
519+ else false)
520+ then (bidId != "")
521+ else false)
522+ then addressFromStringValue(bidOwner)
523+ else i.caller
524+ let assetIdBid = if (!(isDefined(assetId)))
525+ then "WAVES"
526+ else toBase58String(value(assetId))
527+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
528+ let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
529+ let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
530+ let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
531+ let soldValue = if (!(isBid))
532+ then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
533+ else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
534+ let soldData = StringEntry(soldKey, soldValue)
535+ let commissionsWithAgent = if ((amountForAgent != 0))
536+ then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
537+ else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
538+ let commissionsWithPublicAgent = if ((amountForPublicAgent != 0))
539+ then [ScriptTransfer(Address(fromBase58String(publicAgent)), amountForPublicAgent, assetId), ScriptTransfer(Address(fromBase58String(issuer)), (amountForCreator - amountForPublicAgent), assetId)]
540+ else [ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId)]
541+ let txToCaller = if (isSponsored)
542+ then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
543+ else nil
544+ 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)
545+ if (isBid)
546+ then [soldData, bidUpdate, bidDelOld] :: buyRes
547+ else soldData :: buyRes
548+ }
539549 }
540550 }
541- }
551+ }
542552 }
543553 }
544554 }
545555
546556
547557 func asString (bv) = match bv {
548558 case bv0: String =>
549559 bv0
550560 case _ =>
551561 throw("Sponsored Public Key String expected")
552562 }
553563
554564
555565 @Callable(invoke)
556566 func setConf (key,val) = {
557567 let caller = toString(invoke.caller)
558568 if (containsElement([chris, toString(this)], caller))
559569 then if (contains(key, "conf_"))
560570 then [StringEntry(key, val)]
561571 else throw("Entries starting with conf_ only")
562572 else throw("You are not allowed to change this")
563573 }
564574
565575
566576
567577 @Callable(i)
568578 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = {
569- let $t01980219875 = idCallerDateSponsored(i, pubKey)
570- let artId = $t01980219875._1
571- let caller = $t01980219875._2
572- let date = $t01980219875._3
573- let isSponsored = $t01980219875._4
579+ let $t02009620169 = idCallerDateSponsored(i, pubKey)
580+ let artId = $t02009620169._1
581+ let caller = $t02009620169._2
582+ let date = $t02009620169._3
583+ let isSponsored = $t02009620169._4
574584 if (!(validateHash(sha256Hash)))
575585 then throw("Hash should be 64 characters maximum")
576586 else {
577- let $t01997620045 = setLIcence(cidLicence, sha256Licence)
578- let licenceCID = $t01997620045._1
579- let licenceHash = $t01997620045._2
587+ let $t02027020339 = setLIcence(cidLicence, sha256Licence)
588+ let licenceCID = $t02027020339._1
589+ let licenceHash = $t02027020339._2
580590 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
581591 if ((validateArtwork != ""))
582592 then throw("Something went wrong!")
583593 else {
584594 let whitelisted_drop = (checkWhitelist((caller + "_free_drops")) > 0)
585- let $t02034420428 = if (whitelisted_drop)
595+ let $t02063820722 = if (whitelisted_drop)
586596 then $Tuple2(0, signID)
587597 else validatePayment(i)
588- let amount = $t02034420428._1
589- let assetId = $t02034420428._2
598+ let amount = $t02063820722._1
599+ let assetId = $t02063820722._2
590600 if (!(isDefined(amount)))
591601 then throw("Something went wrong")
592602 else {
593603 let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
594604 if ((entryExist != ""))
595605 then throw("You already added it")
596606 else {
597607 let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
598608 if ((hashExist != ""))
599609 then throw("Hash already registered")
600610 else {
601611 let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
602612 if (!(isSignCertified))
603613 then throw("Sign Certificate not found for this address.")
604614 else {
605615 let decrease_whitelist_drop = if (whitelisted_drop)
606616 then invoke(whitelistDapp, "useFreeDrop", [caller], nil)
607617 else unit
608618 if ((decrease_whitelist_drop == decrease_whitelist_drop))
609619 then {
610620 let txToCaller = if (isSponsored)
611621 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
612622 else nil
613623 ([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)
614624 }
615625 else throw("Strict value is not equal to itself.")
616626 }
617627 }
618628 }
619629 }
620630 }
621631 }
622632 }
623633
624634
625635
626636 @Callable(i)
627637 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler,royalties,pubKey) = if (!(dappRunning))
628638 then throw(maintenanceMSG)
629639 else {
630- let $t02346223532 = idCallerDateSponsored(i, pubKey)
631- let id = $t02346223532._1
632- let caller = $t02346223532._2
633- let date = $t02346223532._3
634- let isSponsored = $t02346223532._4
635- let $t02354223611 = setLIcence(cidLicence, sha256Licence)
636- let licenceCID = $t02354223611._1
637- let licenceHash = $t02354223611._2
640+ let $t02375623826 = idCallerDateSponsored(i, pubKey)
641+ let id = $t02375623826._1
642+ let caller = $t02375623826._2
643+ let date = $t02375623826._3
644+ let isSponsored = $t02375623826._4
645+ let $t02383623905 = setLIcence(cidLicence, sha256Licence)
646+ let licenceCID = $t02383623905._1
647+ let licenceHash = $t02383623905._2
638648 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, royalties)
639649 if ((validateArtwork != ""))
640650 then throw("Something went wrong!")
641651 else {
642652 let entryExist = getStringByKey(keyName(caller, txid))
643653 if ((entryExist == ""))
644654 then throw("Entry not found")
645655 else {
646656 let flag = getStringByKey(keyFlag(caller, txid))
647657 if ((flag == "ILLEGAL"))
648658 then throw("Cannot update ILLEGAL artwork")
649659 else if (!(isArtMinted(caller, txid)))
650660 then {
651661 let txToCaller = if (isSponsored)
652662 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
653663 else nil
654664 ([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)
655665 }
656666 else throw("Already minted")
657667 }
658668 }
659669 }
660670
661671
662672
663673 @Callable(i)
664674 func flagArtwork (artId,addr,flag,note) = {
665- let $t02523825272 = idCallerDate(i)
666- let id = $t02523825272._1
667- let caller = $t02523825272._2
675+ let $t02553225566 = idCallerDate(i)
676+ let id = $t02553225566._1
677+ let caller = $t02553225566._2
668678 if (containsElement([chris, toString(this)], caller))
669679 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
670680 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
671681 else throw(("Unknow status " + flag))
672682 else throw("You are not allowed")
673683 }
674684
675685
676686
677687 @Callable(i)
678688 func deleteArtwork (artId,addr) = {
679- let $t02570825742 = idCallerDate(i)
680- let id = $t02570825742._1
681- let caller = $t02570825742._2
689+ let $t02600226036 = idCallerDate(i)
690+ let id = $t02600226036._1
691+ let caller = $t02600226036._2
682692 let addrToUse = if (containsElement([chris, toString(this)], caller))
683693 then addr
684694 else caller
685695 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
686696 if ((entryExist == ""))
687697 then throw("No art matching for this address")
688698 else {
689699 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
690700 if ((sha256Hash == ""))
691701 then throw("No art hash matching for this address")
692702 else {
693703 let signID = getStringByKey(keySignID(addrToUse, artId))
694704 if ((signID == ""))
695705 then throw("No SIGN ID matching")
696706 else {
697707 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))]
698708 if (!(isArtMinted(addrToUse, artId)))
699709 then if (!(dappRunning))
700710 then throw(maintenanceMSG)
701711 else dataToDelete
702712 else if (containsElement([chris, toString(this)], caller))
703713 then dataToDelete
704714 else throw("Art already minted, you cannot delete it")
705715 }
706716 }
707717 }
708718 }
709719
710720
711721
712722 @Callable(i)
713723 func sellArtwork (artId,price,maxMint,assetId,blockEnd,pubKey) = {
714- let $t02857828648 = idCallerDateSponsored(i, pubKey)
715- let id = $t02857828648._1
716- let caller = $t02857828648._2
717- let date = $t02857828648._3
718- let isSponsored = $t02857828648._4
724+ let $t02887228942 = idCallerDateSponsored(i, pubKey)
725+ let id = $t02887228942._1
726+ let caller = $t02887228942._2
727+ let date = $t02887228942._3
728+ let isSponsored = $t02887228942._4
719729 let artworkName = getStringByKey(keyName(caller, artId))
720730 if ((artworkName == ""))
721731 then throw("This art doesn't match your account")
722732 else {
723733 let flag = getStringByKey(keyFlag(caller, artId))
724734 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
725735 then throw("Flagged artwork")
726736 else {
727737 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
728738 if ((0 > blockEnd))
729739 then throw("Negative end")
730740 else if (if ((blockEnd > 0))
731741 then if ((maxMint != 1))
732742 then true
733743 else (price != 0)
734744 else false)
735745 then throw("Timed offer only allowed for unique edition and offer only")
736746 else {
737747 let baseHeight = if ((blockEnd == 0))
738748 then 0
739749 else height
740750 if (!(acceptedAssetIds(assetId)))
741751 then throw("Something went wrong!")
742752 else if (!(validateMinSell(assetId, price)))
743753 then throw("Something went wrong!")
744754 else {
745755 let checkUser = validateUser(caller)
746756 if ((checkUser != ""))
747757 then throw(checkUser)
748758 else {
749759 let amountSold = getIntegerByKey(keyIssued(caller, artId))
750760 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
751761 if ((maxMint > 100))
752762 then throw("100 editions max per artwork")
753763 else if (if ((amountSold != 0))
754764 then (amountSold == maxCanSell)
755765 else false)
756766 then throw("Max edition reached.")
757767 else if (if ((amountSold > 0))
758768 then (maxCanSell != maxMint)
759769 else false)
760770 then throw("Cannot change maximum issuable anymore")
761771 else if (if ((bidNbr > 0))
762772 then (maxCanSell != maxMint)
763773 else false)
764774 then throw("Cannot change maximum issuable with active orders")
765775 else {
766776 let sellStatus = if (if ((price > 0))
767777 then (maxMint > 0)
768778 else false)
769779 then true
770780 else false
771781 let txToCaller = if (isSponsored)
772782 then [ScriptTransfer(Address(fromBase58String(caller)), 0, unit)]
773783 else nil
774784 ([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)
775785 }
776786 }
777787 }
778788 }
779789 }
780790 }
781791 }
782792
783793
784794
785795 @Callable(i)
786-func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "")
796+func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", "")
787797
788798
789799
790800 @Callable(i)
791801 func setBid (artId,issuer) = {
792- let $t03102631066 = idCallerDate(i)
793- let id = $t03102631066._1
794- let caller = $t03102631066._2
795- let date = $t03102631066._3
796- let $t03107131107 = isPayment(i)
797- let payment = $t03107131107._1
798- let amount = $t03107131107._2
802+ let $t03132431364 = idCallerDate(i)
803+ let id = $t03132431364._1
804+ let caller = $t03132431364._2
805+ let date = $t03132431364._3
806+ let $t03136931405 = isPayment(i)
807+ let payment = $t03136931405._1
808+ let amount = $t03136931405._2
799809 let assetId = if (!(isDefined(payment.assetId)))
800810 then "WAVES"
801811 else toBase58String(value(payment.assetId))
802812 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
803813 if (if ((blockEnd != 0))
804814 then (height >= blockEnd)
805815 else false)
806816 then throw("Sale ended.")
807817 else {
808818 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
809819 if (!(acceptedAssetIds(assetId)))
810820 then throw("asset not accepted")
811821 else if (!(validateMinSell(assetId, amount)))
812822 then throw("Wrong min sell")
813823 else {
814824 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
815825 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
816826 if ((0 >= maxCanSell))
817827 then throw("No max edition set for this artwork")
818828 else if ((amountSold >= maxCanSell))
819829 then throw("Sold out, you cannot bid")
820830 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
821831 }
822832 }
823833 }
824834
825835
826836
827837 @Callable(i)
828-func acceptBid (artId,issuer,bidId,bidOwner) = {
829- let $t03226532305 = idCallerDate(i)
830- let id = $t03226532305._1
831- let caller = $t03226532305._2
832- let date = $t03226532305._3
833- if ((caller != issuer))
834- then throw("You cannot do this action")
835- else buyMint(i, artId, issuer, bidId, bidOwner)
836- }
838+func acceptBid (artId,issuer,bidId,bidOwner,pubKey) = buyMint(i, artId, issuer, bidId, bidOwner, pubKey)
837839
838840
839841
840842 @Callable(i)
841843 func cancelBid (artId,issuer,bidId,bidOwner) = {
842- let $t03253132592 = idCallerDate(i)
843- let id = $t03253132592._1
844- let caller = $t03253132592._2
845- let date = $t03253132592._3
844+ let $t03273832799 = idCallerDate(i)
845+ let id = $t03273832799._1
846+ let caller = $t03273832799._2
847+ let date = $t03273832799._3
846848 if (if ((caller != bidOwner))
847849 then (caller != issuer)
848850 else false)
849851 then throw("You cannot do this action")
850852 else {
851853 let returnMoneyTo = if ((caller == issuer))
852854 then bidOwner
853855 else caller
854856 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
855857 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
856858 let bidData = getStringByKey((bidDataKey + "_OPEN"))
857859 if ((bidData == ""))
858860 then throw("Bid not found")
859861 else {
860862 let bidDataArr = split(bidData, "_")
861863 let assetId = getBidAssetId(bidDataArr[0])
862864 let bidStatus = "CANCELED"
863865 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
864866 }
865867 }
866868 }
867869
868870
869871 @Verifier(tx)
870872 func verifier () = match tx {
871873 case inv: InvokeScriptTransaction =>
872874 if (if (if (if ((inv.function == "addArtwork"))
873875 then (inv.dApp == this)
874876 else false)
875877 then (inv.fee == 500000)
876878 else false)
877879 then (inv.feeAssetId == unit)
878880 else false)
879881 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[13])))
880882 else if (if (if (if ((inv.function == "updateArtwork"))
881883 then (inv.dApp == this)
882884 else false)
883885 then (inv.fee == 500000)
884886 else false)
885887 then (inv.feeAssetId == unit)
886888 else false)
887889 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[12])))
888890 else if (if (if (if ((inv.function == "sellArtwork"))
889891 then (inv.dApp == this)
890892 else false)
891893 then (inv.fee == 500000)
892894 else false)
893895 then (inv.feeAssetId == unit)
894896 else false)
895897 then sigVerify(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[5])))
896- else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
898+ else if (if (if (if ((inv.function == "acceptBid"))
899+ then (inv.dApp == this)
900+ else false)
901+ then (inv.fee == 500000)
902+ else false)
903+ then (inv.feeAssetId == unit)
904+ else false)
905+ then sigVerify_128Kb(tx.bodyBytes, tx.proofs[0], fromBase58String(asString(inv.args[4])))
906+ else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
897907 case _ =>
898908 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
899909 }
900910

github/deemru/w8io/6500d08 
107.36 ms