tx · 2CnVvZrkbVbr86DSSr2K8F3yP6xAgfCRGjX5B76qCw6L

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.02200000 Waves

2022.11.30 05:47 [2339264] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "2CnVvZrkbVbr86DSSr2K8F3yP6xAgfCRGjX5B76qCw6L", "fee": 2200000, "feeAssetId": null, "timestamp": 1669776438886, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "4Tao5HDbkcpMcACwuD4JY1UzYGGfAmuZssmZxNeMrZp74L5bBXq2f13Dvra7a3bghF7p42nJ4Mvm9DLVYxBxs8BB" ], "script": "base64:BgJaCAISBAoCCAgSDgoMCAgICAgICAgICAgIEg0KCwgICAgICAgICAgIEgYKBAgICAgSBAoCCAgSBwoFCAEBCAESBAoCCAgSBAoCCAgSBgoECAgICBIGCgQICAgISwEOZ2V0U3RyaW5nQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQNrZXkCAAAIdW5pdFRlc3QHAAlvcmFjbGVGZWUJAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQIPY29uZl9vcmFjbGVfZmVlAAhzaWduRGFwcAkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAhFjb25mX3NpZ253ZWJfZGFwcAALZmVlUmVjZWl2ZXIJAQ5nZXRTdHJpbmdCeUtleQECEWNvbmZfZmVlX3JlY2VpdmVyAAh1c2VyRGFwcAMFCHVuaXRUZXN0CQEFdmFsdWUBCQCmCAECIzNNdDRSR01FeWpTV1lBb2NUUHFkNTV3ZEhRUUIzUFUyVUNtCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECD2NvbmZfdXNlcnNfZGFwcAANd2hpdGVsaXN0RGFwcAkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAhNjb25mX3doaXRlbGlzdF9kYXBwAAtzaWduQXNzZXRJZAkA2QQBCQEOZ2V0U3RyaW5nQnlLZXkBAhhjb25mX2FjY2VwdGVkX2Fzc2V0X1NJR04AC3VzZG5Bc3NldElkCQDZBAEJAQ5nZXRTdHJpbmdCeUtleQECGGNvbmZfYWNjZXB0ZWRfYXNzZXRfVVNETgALdXNkdEFzc2V0SWQJANkEAQkBDmdldFN0cmluZ0J5S2V5AQIYY29uZl9hY2NlcHRlZF9hc3NldF9VU0RUAAx3YXZlc0Fzc2V0SWQBAAAFY2hyaXMJAQ5nZXRTdHJpbmdCeUtleQECDGNvbmZfYWRtaW5fMQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUJb3JhY2xlRmVlBQNrZXkCH0ludGVnZXIgdW5kZWZpbmUgb3IgMCBpbiBvcmFjbGUBD2dldEludGVnZXJCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAAAQ5jaGVja1doaXRlbGlzdAEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFDXdoaXRlbGlzdERhcHAFA2tleQAAAQ9nZXRCb29sZWFuQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQNrZXkHAAdzaWduQ3V0AAcAC3VzZG5XYXZlQ3V0AAoADmRlZmF1bHRMaWNlbmNlCQEOZ2V0U3RyaW5nQnlLZXkBAhRjb25mX2RlZmF1bHRfbGljZW5jZQASZGVmYXVsdEhhc2hMaWNlbmNlCQEOZ2V0U3RyaW5nQnlLZXkBAhljb25mX2RlZmF1bHRfbGljZW5jZV9oYXNoAAtkYXBwUnVubmluZwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQh1c2VyRGFwcAIUY29uZl9kYXBwX2lzX3J1bm5pbmcGAA5tYWludGVuYW5jZU1TRwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAIUY29uZl9tYWludGVuYW5jZV9tc2cCAAANdXNlclN1c3BlbmRlZAIJU1VTUEVOREVEAAt1c2VyUmVtb3ZlZAIHUkVNT1ZFRAAQdXNlclVucmVnaXN0ZXJlZAIMVU5SRUdJU1RFUkVEAAt1c2VyQWxsb3dlZAIHQUxMT1dFRAAZY3VycmVudENlcnRpZmljYXRpb25QcmljZQkBGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUBCQCsAgICEmNlcnRpZmljYXRpb25fZmVlXwkA2AQBBQtzaWduQXNzZXRJZAETZ2V0QXJ0d29ya1JveWFsdGllcwEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQDoBwEUY2hlY2tTaWduQ2VydGlmaWNhdGUDBnNpZ25JRAVPd25lcgpzaGEyNTZIYXNoBAckbWF0Y2gwCQCdCAIFCHNpZ25EYXBwCQCsAgIJAKwCAgkArAICAghkYXRhX2ZjXwUGc2lnbklEAgFfBQVPd25lcgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDADCQEIY29udGFpbnMCBQFhBQpzaGEyNTZIYXNoBgcHAQt2YWxpZGF0ZUNJRAEDY2lkAwkBCGNvbnRhaW5zAgUDY2lkAgEvAwMJAGYCAEwJALECAQUDY2lkCQAAAgkAsQIBCQCRAwIJALUJAgUDY2lkAgEvAAAAOwcJAGYCABAJALECAQkAkQMCCQC1CQIFA2NpZAIBLwABBwcBDHZhbGlkYXRlSGFzaAEEaGFzaAkAAAIJALECAQUEaGFzaABAAQ1rZXlVc2VyU3RhdHVzAQZjYWxsZXIJAKwCAgIMdXNlcl9zdGF0dXNfBQZjYWxsZXIBB2tleURhdGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X2RhdGVfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlOYW1lAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9uYW1lXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5RGVzYwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfZGVzY18FBWFydElkAgFfBQZjYWxsZXIBDWtleURpc3BsYXlDaWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2Rpc3BsYXlfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgENa2V5RXhwb3J0SGFzaAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfZXhwb3J0X2hhc2hfBQVhcnRJZAIBXwUGY2FsbGVyAQxrZXlFeHBvcnRDaWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIPYXJ0X2V4cG9ydF9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQprZXlNYXhNaW50AgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICDGFydF9tYXhtaW50XwUFYXJ0SWQCAV8FBmNhbGxlcgEJa2V5U2lnbklEAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICC2FydF9zaWduaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQlrZXlJc3N1ZWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILYXJ0X2lzc3VlZF8FBWFydElkAgFfBQZjYWxsZXIBCWtleU9uU2FsZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgthcnRfb25zYWxlXwUFYXJ0SWQCAV8FBmNhbGxlcgEOa2V5TGljZW5jZUhhc2gCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIRYXJ0X2xpY2VuY2VfaGFzaF8FBWFydElkAgFfBQZjYWxsZXIBDWtleUxpY2VuY2VDaWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2xpY2VuY2VfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5VGFncwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfdGFnc18FBWFydElkAgFfBQZjYWxsZXIBB2tleVR5cGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X3R5cGVfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlOb3RlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9ub3RlXwUFYXJ0SWQCAV8FBmNhbGxlcgEKa2V5Q3Jhd2xlcgIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfY3Jhd2xlcl9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQxrZXlSb3lhbHRpZXMCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIOYXJ0X3JveWFsdGllc18FBWFydElkAgFfBQZjYWxsZXIBCGtleVByaWNlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCmFydF9wcmljZV8FBWFydElkAgFfBQZjYWxsZXIBCmtleUVuZFNhbGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIMYXJ0X2VuZHNhbGVfBQVhcnRJZAIBXwUGY2FsbGVyARJrZXlBc3NldElkQWNjZXB0ZWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgISYXJ0X2Fzc2V0QWNjZXB0ZWRfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlGbGFnAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9mbGFnXwUFYXJ0SWQCAV8FBmNhbGxlcgESa2V5QXJ0aXN0QWdlbnRBZGRyAQphcnRpc3RBZGRyCQCsAgICDWFydGlzdF9hZ2VudF8FCmFydGlzdEFkZHIBD2tleVByaW1hcnlTaGFyZQEKYXJ0aXN0QWRkcgkArAICAhVhcnRpc3RfYWdlbnRfcHJpbWFyeV8FCmFydGlzdEFkZHIBEWtleUhhc2hCeVR4aWRBZGRyAgZjYWxsZXIEdHhpZAkArAICCQCsAgIJAKwCAgITZ2V0X2hhc2hieXR4aWRhZGRyXwUEdHhpZAIBXwUGY2FsbGVyAQ5rZXlPd25lckJ5SGFzaAEKc2hhMjU2SGFzaAkArAICAhJnZXRfb3duZXJfYnlfaGFzaF8FCnNoYTI1Nkhhc2gBDWtleWlkQnlTaWduaWQCBmNhbGxlcgZzaWduSWQJAKwCAgkArAICCQCsAgICEmdldF9hcnRpZGJ5c2lnbmlkXwUGc2lnbklkAgFfBQZjYWxsZXIBEmtleVR4aWRCeUhhc2hPd25lcgIKc2hhMjU2SGFzaAZjYWxsZXIJAKwCAgIXZ2V0X3R4aWRfYnlfaGFzaF9vd25lcl8JANgEAQkA1BYBCQCbAwEJAKwCAgUKc2hhMjU2SGFzaAUGY2FsbGVyAQ52YWxpZGF0ZUFsbENJRAMKY2lkRGlzcGxheQljaWRFeHBvcnQKY2lkTGljZW5jZQMJAQEhAQkBC3ZhbGlkYXRlQ0lEAQUKY2lkRGlzcGxheQkAAgECEVdyb25nIERpc3BsYXkgQ0lEAwkBASEBCQELdmFsaWRhdGVDSUQBBQljaWRFeHBvcnQJAAIBAhBXcm9uZyBFeHBvcnQgQ0lEAwMJAQIhPQIFCmNpZExpY2VuY2UCAAkBASEBCQELdmFsaWRhdGVDSUQBBQpjaWRMaWNlbmNlBwkAAgECEVdyb25nIExpY2VuY2UgQ0lEBgEPdmFsaWRhdGVBbGxIYXNoAgxzaGEyNTZFeHBvcnQNc2hhMjU2TGljZW5jZQMJAQEhAQkBDHZhbGlkYXRlSGFzaAEFDHNoYTI1NkV4cG9ydAkAAgECGEV4cG9ydCBIYXNoIDY0IGNoYXIuIG1heAMJAQEhAQkBDHZhbGlkYXRlSGFzaAEFDXNoYTI1NkxpY2VuY2UJAAIBAhlMaWNlbmNlIEhhc2ggNjQgY2hhci4gbWF4BgEOdmFsaWRhdGVTdHJpbmcCA3N0cgNtYXgDCQAAAgkAsQIBBQNzdHIAAAkAAgECGEZpZWxkIGNhbm5vdCBiZSBpcyBlbXB0eQMJAGYCCQCxAgEFA3N0cgUDbWF4CQACAQkArAICBQNzdHICDCBpcyB0b28gbG9uZwYBDHZhbGlkYXRlVXNlcgEGY2FsbGVyBAp1c2VyU3RhdHVzCQELdmFsdWVPckVsc2UCCQCdCAIFCHVzZXJEYXBwCQENa2V5VXNlclN0YXR1cwEFBmNhbGxlcgUQdXNlclVucmVnaXN0ZXJlZAMDCQAAAgUKdXNlclN0YXR1cwUQdXNlclVucmVnaXN0ZXJlZAYJAAACBQp1c2VyU3RhdHVzBQt1c2VyQWxsb3dlZAIuUmVnaXN0ZXIgdGhpcyBhY2NvdW50IGZpcnN0IHdpdGggIkFjY291bnQiIHRhYgMJAAACBQp1c2VyU3RhdHVzBQ11c2VyU3VzcGVuZGVkAhFBY2NvdW50IHN1c3BlbmRlZAMJAAACBQp1c2VyU3RhdHVzBQt1c2VyUmVtb3ZlZAIPQWNjb3VudCByZW1vdmVkAgABCnNldExJY2VuY2UCCmNpZExpY2VuY2UNc2hhMjU2TGljZW5jZQQDY2lkAwkAAAIJALECAQUKY2lkTGljZW5jZQAABQ5kZWZhdWx0TGljZW5jZQUKY2lkTGljZW5jZQQEaGFzaAMJAAACCQCxAgEFDXNoYTI1NkxpY2VuY2UAAAUSZGVmYXVsdEhhc2hMaWNlbmNlBQ1zaGEyNTZMaWNlbmNlCQCUCgIFA2NpZAUEaGFzaAETdmFsaWRhdGVBcnR3b3JrRGF0YQkGY2FsbGVyCmNpZERpc3BsYXkJY2lkRXhwb3J0CmxpY2VuY2VDSUQMc2hhMjU2RXhwb3J0C2xpY2VuY2VIYXNoBG5hbWULZGVzY3JpcHRpb24EdGFncwQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIDCQAAAgkAsQIBBQpjaWREaXNwbGF5AAAJAAIBAhtEaXNwbGF5IENJRCBjYW5ub3QgYmUgZW1wdHkDCQEBIQEJAQ52YWxpZGF0ZUFsbENJRAMFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAkAAgECEFByb2JsZW0gd2l0aCBDSUQDCQEBIQEJAQ92YWxpZGF0ZUFsbEhhc2gCBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoCQACAQITUHJvYmxlbSB3aXRoIEhhc2hlcwMJAQEhAQkBDnZhbGlkYXRlU3RyaW5nAgUEbmFtZQBkCQACAQISMTAwIENoYXIuIG1heCBuYW1lAwkBASEBCQEOdmFsaWRhdGVTdHJpbmcCBQtkZXNjcmlwdGlvbgDoBwkAAgECGjEwMDAgQ2hhci4gbWF4IGRlc2NyaXB0aW9uAwkAZgIJAJADAQkAtQkCBQR0YWdzAgEsAAUJAAIBAgs1IHRhZ3MgbWF4LgIAAQlpc1BheW1lbnQBAWkDCQAAAgkAkAMBCAUBaQhwYXltZW50cwAACQACAQITTm8gcGF5bWVudCBhdHRhY2hlZAQHcGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAZhbW91bnQJAQV2YWx1ZQEIBQdwYXltZW50BmFtb3VudAkAlAoCBQdwYXltZW50BQZhbW91bnQBD3ZhbGlkYXRlUGF5bWVudAEBaQQLJHQwODg4Njg5MjIJAQlpc1BheW1lbnQBBQFpBAdwYXltZW50CAULJHQwODg4Njg5MjICXzEEBmFtb3VudAgFCyR0MDg4ODY4OTIyAl8yBAdhc3NldElkAwMJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkCQAAAggFB3BheW1lbnQHYXNzZXRJZAULc2lnbkFzc2V0SWQHCAUHcGF5bWVudAdhc3NldElkCQACAQIrT25seSBTSUdOIHRva2VuIGFjY2VwdGVkIGFzIHRyYW5zYWN0aW9uIGZlZQMJAQIhPQIFBmFtb3VudAUZY3VycmVudENlcnRpZmljYXRpb25QcmljZQkAAgEJAKwCAgIZUGF5bWVudCBhbW91bnQgc2hvdWxkIGJlIAkApAMBBRljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlCQCUCgIFBmFtb3VudAUHYXNzZXRJZAELaXNBcnRNaW50ZWQCCWFkZHJUb1VzZQVhcnRJZAQHJG1hdGNoMAkAmggCBQR0aGlzCQEJa2V5SXNzdWVkAgUJYWRkclRvVXNlBQVhcnRJZAMJAAECBQckbWF0Y2gwAgNJbnQEAWIFByRtYXRjaDADCQECIT0CBQFiAAAGBwcBFHZhbGlkYXRlUHJpY2VBc3NldElkAwFpDHByaWNlQXNzZXRJZAxhcnR3b3JrUHJpY2UECyR0MDk1Mjk5NTY1CQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFCyR0MDk1Mjk5NTY1Al8xBAZhbW91bnQIBQskdDA5NTI5OTU2NQJfMgQHYXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEIBQdwYXltZW50B2Fzc2V0SWQFBHVuaXQDAwkAZgIJALECAQUMcHJpY2VBc3NldElkAAAJAAACCQDYBAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQFDHByaWNlQXNzZXRJZAcIBQdwYXltZW50B2Fzc2V0SWQJAAIBAg5Xcm9uZyBhc3NldCBpZAMDCQAAAgUHYXNzZXRJZAUEdW5pdAkBAiE9AgUMcHJpY2VBc3NldElkAgAHCQACAQIOV3JvbmcgYXNzZXQgaWQDCQECIT0CBQxhcnR3b3JrUHJpY2UFBmFtb3VudAkAAgECE1BheW1lbnQgZG9uJ3QgbWF0Y2gJAJQKAgUGYW1vdW50BQdhc3NldElkARBhY2NlcHRlZEFzc2V0SWRzAQdhc3NldElkAwMDAwMJAQIhPQIFB2Fzc2V0SWQJANgEAQULc2lnbkFzc2V0SWQJAQIhPQIFB2Fzc2V0SWQJANgEAQUMd2F2ZXNBc3NldElkBwkBAiE9AgUHYXNzZXRJZAIFV0FWRVMHCQECIT0CBQdhc3NldElkCQDYBAEFC3VzZG5Bc3NldElkBwkBAiE9AgUHYXNzZXRJZAkA2AQBBQt1c2R0QXNzZXRJZAcJAAIBAiZPbmx5IFNJR04sIFVTRE4sVVNEVCBvciBXQVZFUyBhY2NlcHRlZAYBD3ZhbGlkYXRlTWluU2VsbAIHYXNzZXRJZAVwcmljZQQMbWluU2VsbFdhdmVzAwUIdW5pdFRlc3QACgkBGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUBAg53YXZlc19taW5fc2VsbAQLbWluU2VsbFVzZG4AwIQ9BAttaW5TZWxsU2lnbgMFCHVuaXRUZXN0AAEJAGgCBRljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlAAIDAwMDAwMJAAACBQdhc3NldElkCQDYBAEFC3VzZG5Bc3NldElkCQBmAgULbWluU2VsbFVzZG4FBXByaWNlBwkBAiE9AgUFcHJpY2UAAAcGAwMJAAACBQdhc3NldElkCQDYBAEFC3VzZHRBc3NldElkCQBmAgULbWluU2VsbFVzZG4FBXByaWNlBwkBAiE9AgUFcHJpY2UAAAcGAwMJAAACBQdhc3NldElkCQDYBAEFC3NpZ25Bc3NldElkCQBmAgULbWluU2VsbFNpZ24FBXByaWNlBwkBAiE9AgUFcHJpY2UAAAcGAwMDCQAAAgUHYXNzZXRJZAkA2AQBBQx3YXZlc0Fzc2V0SWQGCQAAAgUHYXNzZXRJZAIFV0FWRVMJAGYCBQxtaW5TZWxsV2F2ZXMFBXByaWNlBwkBAiE9AgUFcHJpY2UAAAcJAAIBAhhXcm9uZyBtaW5pbXVtIHNlbGwgcHJpY2UGAQ1nZXRCaWRBc3NldElkAQdhc3NldElkAwkAAAIFB2Fzc2V0SWQCBVdBVkVTBQR1bml0CQDZBAEFB2Fzc2V0SWQBFmdldFByaWNlQXNzZXRJZEZyb21CaWQBCmJpZERhdGFLZXkEB2JpZERhdGEJAQ5nZXRTdHJpbmdCeUtleQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4DCQAAAgUHYmlkRGF0YQIACQACAQINQmlkIG5vdCBmb3VuZAQKYmlkRGF0YUFycgkAtQkCBQdiaWREYXRhAgFfBAliaWRBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpiaWREYXRhQXJyAAEECmJpZEFzc2V0SWQJAQ1nZXRCaWRBc3NldElkAQkAkQMCBQpiaWREYXRhQXJyAAADCQBnAgAABQliaWRBbW91bnQJAAIBAgxXcm9uZyBhbW91bnQJAJQKAgUJYmlkQW1vdW50BQpiaWRBc3NldElkAQxpZENhbGxlckRhdGUBAWkDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cJAJUKAwkA2AQBCAUBaQ10cmFuc2FjdGlvbklkCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMIBQlsYXN0QmxvY2sJdGltZXN0YW1wAQdidXlNaW50BQFpBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgQNJHQwMTIwMjcxMjA4OQkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMTIwMjcxMjA4OQJfMQQGY2FsbGVyCAUNJHQwMTIwMjcxMjA4OQJfMgQEZGF0ZQgFDSR0MDEyMDI3MTIwODkCXzMEBWlzQmlkAwMDCQAAAgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBQZpc3N1ZXIJAQIhPQIFCGJpZE93bmVyAgAHCQECIT0CBQViaWRJZAIABwYHBAhibG9ja0VuZAkBD2dldEludGVnZXJCeUtleQEJAQprZXlFbmRTYWxlAgUGY2FsbGVyBQVhcnRJZAMDAwkBAiE9AgUIYmxvY2tFbmQAAAkAZwIFBmhlaWdodAUIYmxvY2tFbmQHCQEBIQEFBWlzQmlkBwkAAgECC1NhbGUgZW5kZWQuBA5jYWxsZXJJc0lzc3VlcgkAAAIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwUGaXNzdWVyBAh0b3RhbE5GVAkBD2dldEludGVnZXJCeUtleQECEHRvdGFsX25mdF9pc3N1ZWQEBnNpZ25JRAkBDmdldFN0cmluZ0J5S2V5AQkBCWtleVNpZ25JRAIFBmlzc3VlcgUFYXJ0SWQEC2FydHdvcmtOYW1lCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmlzc3VlcgUFYXJ0SWQDCQAAAgULYXJ0d29ya05hbWUCAAkAAgECEUFydCBkb2Vzbid0IGV4aXN0BAhpc09uU2FsZQkBD2dldEJvb2xlYW5CeUtleQEJAQlrZXlPblNhbGUCBQZpc3N1ZXIFBWFydElkBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCWtleUlzc3VlZAIFBmlzc3VlcgUFYXJ0SWQEDGFydHdvcmtQcmljZQMFDmNhbGxlcklzSXNzdWVyCQBoAgUZY3VycmVudENlcnRpZmljYXRpb25QcmljZQACCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCGtleVByaWNlAgUGaXNzdWVyBQVhcnRJZAQMcHJpY2VBc3NldElkAwUOY2FsbGVySXNJc3N1ZXIJANgEAQULc2lnbkFzc2V0SWQJAQ5nZXRTdHJpbmdCeUtleQEJARJrZXlBc3NldElkQWNjZXB0ZWQCBQZpc3N1ZXIFBWFydElkBAptYXhDYW5TZWxsCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleU1heE1pbnQCBQZpc3N1ZXIFBWFydElkAwMDCQEBIQEFBWlzQmlkCQEBIQEFDmNhbGxlcklzSXNzdWVyBwMDCQBnAgAABQxhcnR3b3JrUHJpY2UGCQEBIQEFCGlzT25TYWxlBgkAZwIAAAUKbWF4Q2FuU2VsbAcJAAIBAhBBcnQgbm90IGZvciBzYWxlAwMDCQEBIQEFBWlzQmlkBQ5jYWxsZXJJc0lzc3VlcgcJAGcCAAAFCm1heENhblNlbGwHCQACAQIUTWF4IGlzc3VhYmxlIG5vdCBzZXQECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmlzc3VlcgMDBQVpc0JpZAkBAiE9AgUJY2hlY2tVc2VyAgAHCQACAQUJY2hlY2tVc2VyBApiaWREYXRhS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FCGJpZE93bmVyAgFfBQViaWRJZAQNJHQwMTM4NjgxNDAzOQMFBWlzQmlkCQEWZ2V0UHJpY2VBc3NldElkRnJvbUJpZAEFCmJpZERhdGFLZXkJARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMFAWkFDHByaWNlQXNzZXRJZAUMYXJ0d29ya1ByaWNlBAZhbW91bnQIBQ0kdDAxMzg2ODE0MDM5Al8xBAdhc3NldElkCAUNJHQwMTM4NjgxNDAzOQJfMgQFYWdlbnQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJARJrZXlBcnRpc3RBZ2VudEFkZHIBBQZpc3N1ZXIFC2ZlZVJlY2VpdmVyBAphZ2VudFNoYXJlCQELdmFsdWVPckVsc2UCCQCaCAIFCHVzZXJEYXBwCQEPa2V5UHJpbWFyeVNoYXJlAQUGaXNzdWVyAAAEDWlzV2hpdGVsaXN0ZWQJAQ5jaGVja1doaXRlbGlzdAEFBmlzc3VlcgQDY3V0AwkAZgIFDWlzV2hpdGVsaXN0ZWQFBmhlaWdodAAAAwkAAAIFB2Fzc2V0SWQFC3NpZ25Bc3NldElkBQdzaWduQ3V0BQt1c2RuV2F2ZUN1dAQNYW1vdW50Rm9yU2lnbgkAawMFBmFtb3VudAUDY3V0AGQEDmFtb3VudEZvckFnZW50AwMDCQECIT0CBQVhZ2VudAULZmVlUmVjZWl2ZXIJAGYCBQphZ2VudFNoYXJlAAAHCQBmAgUGaGVpZ2h0BQ1pc1doaXRlbGlzdGVkBwkAawMFBmFtb3VudAUKYWdlbnRTaGFyZQBkAAAEEGFtb3VudEZvckNyZWF0b3IJAGUCBQZhbW91bnQFDWFtb3VudEZvclNpZ24DCQAAAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAkAAgECDEFydCBzb2xkIG91dAQNbmV3QW1vdW50U29sZAkAZAIFCmFtb3VudFNvbGQAAQQJaXNzdWVNZXRhCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJQ3JlYXRvcjogBQZpc3N1ZXICCiwKIEFydElEOiAFBWFydElkAgssCiBTaWduSUQ6IAUGc2lnbklEAhEsCiBBcnR3b3JrIG5hbWU6IAULYXJ0d29ya05hbWUCCiwKIElzc3VlOiAJAKQDAQUNbmV3QW1vdW50U29sZAIBLwkApAMBBQptYXhDYW5TZWxsBAhpc3N1ZU5GVAkAwggFCQCsAgICA1NBXwkApAMBCQBkAgUIdG90YWxORlQAAQUJaXNzdWVNZXRhAAEAAAcEBWlkTkZUCQC4CAEFCGlzc3VlTkZUBApzZWxsU3RhdHVzAwMJAAACBQ1uZXdBbW91bnRTb2xkBQptYXhDYW5TZWxsBgkBASEBBQhpc09uU2FsZQcGBApyZWNlaXZlTkZUAwMDCQAAAgUGY2FsbGVyBQZpc3N1ZXIJAQIhPQIFCGJpZE93bmVyAgAHCQECIT0CBQViaWRJZAIABwkBEUBleHRyTmF0aXZlKDEwNjIpAQUIYmlkT3duZXIIBQFpBmNhbGxlcgQKYXNzZXRJZEJpZAMJAQEhAQkBCWlzRGVmaW5lZAEFB2Fzc2V0SWQCBVdBVkVTCQDYBAEJAQV2YWx1ZQEFB2Fzc2V0SWQEB2JpZERhdGEJAQ5nZXRTdHJpbmdCeUtleQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4ECWJpZERlbE9sZAkBC0RlbGV0ZUVudHJ5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgQJYmlkVXBkYXRlCQELU3RyaW5nRW50cnkCCQCsAgIFCmJpZERhdGFLZXkCB19DTE9TRUQJAKwCAgkArAICBQdiaWREYXRhAgFfCQCkAwEFBGRhdGUEB3NvbGRLZXkJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJYXJ0X3NvbGRfCQCkAwEFDW5ld0Ftb3VudFNvbGQCBF9vZl8JAKQDAQUKbWF4Q2FuU2VsbAIBXwUFYXJ0SWQCAV8FBmlzc3VlcgQJc29sZFZhbHVlAwkBASEBBQVpc0JpZAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICBQZjYWxsZXICAV8JAKQDAQUEZGF0ZQIBXwUCaWQCAV8JAKQDAQUMYXJ0d29ya1ByaWNlAgFfBQxwcmljZUFzc2V0SWQCAV8JANgEAQUFaWRORlQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBBQpyZWNlaXZlTkZUAgFfCQCkAwEFBGRhdGUCAV8FAmlkAgFfCQCkAwEFBmFtb3VudAIBXwUKYXNzZXRJZEJpZAIBXwkA2AQBBQVpZE5GVAQIc29sZERhdGEJAQtTdHJpbmdFbnRyeQIFB3NvbGRLZXkFCXNvbGRWYWx1ZQQLY29tbWlzc2lvbnMDCQECIT0CBQ5hbW91bnRGb3JBZ2VudAAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtmZWVSZWNlaXZlcgkAZQIFDWFtb3VudEZvclNpZ24FDmFtb3VudEZvckFnZW50BQdhc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQVhZ2VudAUOYW1vdW50Rm9yQWdlbnQFB2Fzc2V0SWQFA25pbAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULZmVlUmVjZWl2ZXIFDWFtb3VudEZvclNpZ24FB2Fzc2V0SWQFA25pbAQNbmZ0X3JveWFsdGllcwkBE2dldEFydHdvcmtSb3lhbHRpZXMBCQEMa2V5Um95YWx0aWVzAgUGaXNzdWVyBQVhcnRJZAQGYnV5UmVzCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIJAQlrZXlJc3N1ZWQCBQZpc3N1ZXIFBWFydElkBQ1uZXdBbW91bnRTb2xkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgIEbmZ0XwkA2AQBBQVpZE5GVAUHc29sZEtleQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAgpyb3lhbHRpZXNfCQDYBAEFBWlkTkZUBQ1uZnRfcm95YWx0aWVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCAhB0b3RhbF9uZnRfaXNzdWVkCQBkAgUIdG90YWxORlQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleUVuZFNhbGUCBQZpc3N1ZXIFBWFydElkAAAJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQlrZXlPblNhbGUCBQZpc3N1ZXIFBWFydElkBQpzZWxsU3RhdHVzCQDMCAIFCGlzc3VlTkZUCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQZpc3N1ZXIFEGFtb3VudEZvckNyZWF0b3IFB2Fzc2V0SWQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwUKcmVjZWl2ZU5GVAABBQVpZE5GVAUDbmlsBQtjb21taXNzaW9ucwMFBWlzQmlkCQDMCAIFCHNvbGREYXRhCQDMCAIFCWJpZFVwZGF0ZQkAzAgCBQliaWREZWxPbGQFBmJ1eVJlcwkAzAgCBQhzb2xkRGF0YQUGYnV5UmVzCgZpbnZva2UBB3NldENvbmYCA2tleQN2YWwEBmNhbGxlcgkApQgBCAUGaW52b2tlBmNhbGxlcgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIDCQEIY29udGFpbnMCBQNrZXkCBWNvbmZfCQDMCAIJAQtTdHJpbmdFbnRyeQIFA2tleQUDdmFsBQNuaWwJAAIBAiBFbnRyaWVzIHN0YXJ0aW5nIHdpdGggY29uZl8gb25seQkAAgECIllvdSBhcmUgbm90IGFsbG93ZWQgdG8gY2hhbmdlIHRoaXMBaQEKYWRkQXJ0d29yawwKc2hhMjU2SGFzaAZzaWduSUQEbmFtZQtkZXNjcmlwdGlvbgR0YWdzBHR5cGUKY2lkRGlzcGxheQxzaGEyNTZFeHBvcnQJY2lkRXhwb3J0DXNoYTI1NkxpY2VuY2UKY2lkTGljZW5jZQdjcmF3bGVyBA0kdDAxODA1OTE4MTAyCQEMaWRDYWxsZXJEYXRlAQUBaQQFYXJ0SWQIBQ0kdDAxODA1OTE4MTAyAl8xBAZjYWxsZXIIBQ0kdDAxODA1OTE4MTAyAl8yBARkYXRlCAUNJHQwMTgwNTkxODEwMgJfMwMJAQEhAQkBDHZhbGlkYXRlSGFzaAEFCnNoYTI1Nkhhc2gJAAIBAiRIYXNoIHNob3VsZCBiZSA2NCBjaGFyYWN0ZXJzIG1heGltdW0EDSR0MDE4MjA3MTgyNzYJAQpzZXRMSWNlbmNlAgUKY2lkTGljZW5jZQUNc2hhMjU2TGljZW5jZQQKbGljZW5jZUNJRAgFDSR0MDE4MjA3MTgyNzYCXzEEC2xpY2VuY2VIYXNoCAUNJHQwMTgyMDcxODI3NgJfMgQPdmFsaWRhdGVBcnR3b3JrCQETdmFsaWRhdGVBcnR3b3JrRGF0YQkFBmNhbGxlcgUKY2lkRGlzcGxheQUJY2lkRXhwb3J0BQpsaWNlbmNlQ0lEBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoBQRuYW1lBQtkZXNjcmlwdGlvbgUEdGFncwMJAQIhPQIFD3ZhbGlkYXRlQXJ0d29yawIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBA0kdDAxODUwMDE4NTQyCQEPdmFsaWRhdGVQYXltZW50AQUBaQQGYW1vdW50CAUNJHQwMTg1MDAxODU0MgJfMQQHYXNzZXRJZAgFDSR0MDE4NTAwMTg1NDICXzIDCQEBIQEJAQlpc0RlZmluZWQBBQZhbW91bnQJAAIBAhRTb21ldGhpbmcgd2VudCB3cm9uZwQKZW50cnlFeGlzdAkBDmdldFN0cmluZ0J5S2V5AQkBEmtleVR4aWRCeUhhc2hPd25lcgIFCnNoYTI1Nkhhc2gFBmNhbGxlcgMJAQIhPQIFCmVudHJ5RXhpc3QCAAkAAgECFFlvdSBhbHJlYWR5IGFkZGVkIGl0BAloYXNoRXhpc3QJAQ5nZXRTdHJpbmdCeUtleQEJAQ5rZXlPd25lckJ5SGFzaAEFCnNoYTI1Nkhhc2gDCQECIT0CBQloYXNoRXhpc3QCAAkAAgECF0hhc2ggYWxyZWFkeSByZWdpc3RlcmVkBA9pc1NpZ25DZXJ0aWZpZWQJARRjaGVja1NpZ25DZXJ0aWZpY2F0ZQMFBnNpZ25JRAUGY2FsbGVyBQpzaGEyNTZIYXNoAwkBASEBBQ9pc1NpZ25DZXJ0aWZpZWQJAAIBAixTaWduIENlcnRpZmljYXRlIG5vdCBmb3VuZCBmb3IgdGhpcyBhZGRyZXNzLgkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5T3duZXJCeUhhc2gBBQpzaGEyNTZIYXNoBQZjYWxsZXIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEmtleVR4aWRCeUhhc2hPd25lcgIFCnNoYTI1Nkhhc2gFBmNhbGxlcgUFYXJ0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQdrZXlEYXRlAgUGY2FsbGVyBQVhcnRJZAUEZGF0ZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5TmFtZQIFBmNhbGxlcgUFYXJ0SWQFBG5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleURlc2MCBQZjYWxsZXIFBWFydElkBQtkZXNjcmlwdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RGlzcGxheUNpZAIFBmNhbGxlcgUFYXJ0SWQFCmNpZERpc3BsYXkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleUV4cG9ydENpZAIFBmNhbGxlcgUFYXJ0SWQFCWNpZEV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RXhwb3J0SGFzaAIFBmNhbGxlcgUFYXJ0SWQFDHNoYTI1NkV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5TGljZW5jZUhhc2gCBQZjYWxsZXIFBWFydElkBQtsaWNlbmNlSGFzaAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5TGljZW5jZUNpZAIFBmNhbGxlcgUFYXJ0SWQFCmxpY2VuY2VDSUQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVR5cGUCBQZjYWxsZXIFBWFydElkBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUYWdzAgUGY2FsbGVyBQVhcnRJZAUEdGFncwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkAAAJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCWtleVNpZ25JRAIFBmNhbGxlcgUFYXJ0SWQFBnNpZ25JRAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCWtleUlzc3VlZAIFBmNhbGxlcgUFYXJ0SWQAAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCWtleU9uU2FsZQIFBmNhbGxlcgUFYXJ0SWQHCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlpZEJ5U2lnbmlkAgUGY2FsbGVyBQZzaWduSUQFBWFydElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJARFrZXlIYXNoQnlUeGlkQWRkcgIFBmNhbGxlcgUFYXJ0SWQFCnNoYTI1Nkhhc2gJAMwIAgkBC1N0cmluZ0VudHJ5AgkBCmtleUNyYXdsZXICBQZjYWxsZXIFBWFydElkBQdjcmF3bGVyCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJAQdBZGRyZXNzAQkA2QQBBQtmZWVSZWNlaXZlcgUGYW1vdW50BQdhc3NldElkBQNuaWwBaQENdXBkYXRlQXJ0d29yawsEdHhpZARuYW1lC2Rlc2NyaXB0aW9uBHRhZ3MEdHlwZQpjaWREaXNwbGF5DHNoYTI1NkV4cG9ydAljaWRFeHBvcnQNc2hhMjU2TGljZW5jZQpjaWRMaWNlbmNlB2NyYXdsZXIDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cEBmNhbGxlcgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzBA0kdDAyMTMyMjIxMzkxCQEKc2V0TEljZW5jZQIFCmNpZExpY2VuY2UFDXNoYTI1NkxpY2VuY2UECmxpY2VuY2VDSUQIBQ0kdDAyMTMyMjIxMzkxAl8xBAtsaWNlbmNlSGFzaAgFDSR0MDIxMzIyMjEzOTECXzIED3ZhbGlkYXRlQXJ0d29yawkBE3ZhbGlkYXRlQXJ0d29ya0RhdGEJBQZjYWxsZXIFCmNpZERpc3BsYXkFCWNpZEV4cG9ydAUKbGljZW5jZUNJRAUMc2hhMjU2RXhwb3J0BQtsaWNlbmNlSGFzaAUEbmFtZQULZGVzY3JpcHRpb24FBHRhZ3MDCQECIT0CBQ92YWxpZGF0ZUFydHdvcmsCAAkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQQKZW50cnlFeGlzdAkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQZjYWxsZXIFBHR4aWQDCQAAAgUKZW50cnlFeGlzdAIACQACAQIPRW50cnkgbm90IGZvdW5kBARmbGFnCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5RmxhZwIFBmNhbGxlcgUEdHhpZAMJAAACBQRmbGFnAgdJTExFR0FMCQACAQIdQ2Fubm90IHVwZGF0ZSBJTExFR0FMIGFydHdvcmsDCQEBIQEJAQtpc0FydE1pbnRlZAIFBmNhbGxlcgUEdHhpZAkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5TmFtZQIFBmNhbGxlcgUEdHhpZAUEbmFtZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5RGVzYwIFBmNhbGxlcgUEdHhpZAULZGVzY3JpcHRpb24JAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleURpc3BsYXlDaWQCBQZjYWxsZXIFBHR4aWQFCmNpZERpc3BsYXkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleUV4cG9ydENpZAIFBmNhbGxlcgUEdHhpZAUJY2lkRXhwb3J0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlFeHBvcnRIYXNoAgUGY2FsbGVyBQR0eGlkBQxzaGEyNTZFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUxpY2VuY2VDaWQCBQZjYWxsZXIFBHR4aWQFCmxpY2VuY2VDSUQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDmtleUxpY2VuY2VIYXNoAgUGY2FsbGVyBQR0eGlkBQtsaWNlbmNlSGFzaAkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5VGFncwIFBmNhbGxlcgUEdHhpZAUEdGFncwkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5VHlwZQIFBmNhbGxlcgUEdHhpZAUEdHlwZQkAzAgCCQELU3RyaW5nRW50cnkCCQEKa2V5Q3Jhd2xlcgIFBmNhbGxlcgUEdHhpZAUHY3Jhd2xlcgUDbmlsCQACAQIOQWxyZWFkeSBtaW50ZWQBaQELZmxhZ0FydHdvcmsEBWFydElkBGFkZHIEZmxhZwRub3RlBA0kdDAyMjg0NzIyODgxCQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAyMjg0NzIyODgxAl8xBAZjYWxsZXIIBQ0kdDAyMjg0NzIyODgxAl8yAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAICB0NPTlNFTlQJAMwIAgIACQDMCAICD0NIQU5HRV9SRVFVSVJFRAkAzAgCAgdGTEFHR0VECQDMCAICB0lMTEVHQUwFA25pbAUEZmxhZwkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5RmxhZwIFBGFkZHIFBWFydElkBQRmbGFnCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlOb3RlAgUEYWRkcgUFYXJ0SWQFBG5vdGUFA25pbAkAAgEJAKwCAgIOVW5rbm93IHN0YXR1cyAFBGZsYWcJAAIBAhNZb3UgYXJlIG5vdCBhbGxvd2VkAWkBDWRlbGV0ZUFydHdvcmsCBWFydElkBGFkZHIEDSR0MDIzMzMxMjMzNjUJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDIzMzMxMjMzNjUCXzEEBmNhbGxlcggFDSR0MDIzMzMxMjMzNjUCXzIECWFkZHJUb1VzZQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIFBGFkZHIFBmNhbGxlcgQKZW50cnlFeGlzdAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFCWFkZHJUb1VzZQUFYXJ0SWQCIE5vIGFydCBtYXRjaGluZyBmb3IgdGhpcyBhZGRyZXNzAwkAAAIFCmVudHJ5RXhpc3QCAAkAAgECIE5vIGFydCBtYXRjaGluZyBmb3IgdGhpcyBhZGRyZXNzBApzaGEyNTZIYXNoCQEOZ2V0U3RyaW5nQnlLZXkBCQERa2V5SGFzaEJ5VHhpZEFkZHICBQlhZGRyVG9Vc2UFBWFydElkAwkAAAIFCnNoYTI1Nkhhc2gCAAkAAgECJU5vIGFydCBoYXNoIG1hdGNoaW5nIGZvciB0aGlzIGFkZHJlc3MEBnNpZ25JRAkBDmdldFN0cmluZ0J5S2V5AQkBCWtleVNpZ25JRAIFCWFkZHJUb1VzZQUFYXJ0SWQDCQAAAgUGc2lnbklEAgAJAAIBAhNObyBTSUdOIElEIG1hdGNoaW5nBAxkYXRhVG9EZWxldGUJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleURhdGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlOYW1lAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5RGVzYwIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleURpc3BsYXlDaWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQxrZXlFeHBvcnRDaWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlFeHBvcnRIYXNoAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEOa2V5TGljZW5jZUhhc2gCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlMaWNlbmNlQ2lkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5VHlwZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleVRhZ3MCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQprZXlNYXhNaW50AgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEJa2V5U2lnbklEAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEJa2V5SXNzdWVkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEJa2V5T25TYWxlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5RmxhZwIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCGtleVByaWNlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQESa2V5QXNzZXRJZEFjY2VwdGVkAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEOa2V5T3duZXJCeUhhc2gBBQpzaGEyNTZIYXNoCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlpZEJ5U2lnbmlkAgUJYWRkclRvVXNlBQZzaWduSUQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEmtleVR4aWRCeUhhc2hPd25lcgIFCnNoYTI1Nkhhc2gFCWFkZHJUb1VzZQkAzAgCCQELRGVsZXRlRW50cnkBCQEKa2V5RW5kU2FsZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleU5vdGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQprZXlDcmF3bGVyAgUJYWRkclRvVXNlBQVhcnRJZAUDbmlsAwkBASEBCQELaXNBcnRNaW50ZWQCBQlhZGRyVG9Vc2UFBWFydElkAwkBASEBBQtkYXBwUnVubmluZwkAAgEFDm1haW50ZW5hbmNlTVNHBQxkYXRhVG9EZWxldGUDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyBQxkYXRhVG9EZWxldGUJAAIBAihBcnQgYWxyZWFkeSBtaW50ZWQsIHlvdSBjYW5ub3QgZGVsZXRlIGl0AWkBC3NlbGxBcnR3b3JrBQVhcnRJZAVwcmljZQdtYXhNaW50B2Fzc2V0SWQIYmxvY2tFbmQEDSR0MDI2MTg2MjYyMjAJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDI2MTg2MjYyMjACXzEEBmNhbGxlcggFDSR0MDI2MTg2MjYyMjACXzIEC2FydHdvcmtOYW1lCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmNhbGxlcgUFYXJ0SWQDCQAAAgULYXJ0d29ya05hbWUCAAkAAgECI1RoaXMgYXJ0IGRvZXNuJ3QgbWF0Y2ggeW91ciBhY2NvdW50BARmbGFnCQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5RmxhZwIFBmNhbGxlcgUFYXJ0SWQDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCAg9DSEFOR0VfUkVRVUlSRUQJAMwIAgIHRkxBR0dFRAkAzAgCAgdJTExFR0FMBQNuaWwFBGZsYWcJAAIBAg9GbGFnZ2VkIGFydHdvcmsEBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAMJAGYCAAAFCGJsb2NrRW5kCQACAQIMTmVnYXRpdmUgZW5kAwMJAGYCBQhibG9ja0VuZAAAAwkBAiE9AgUHbWF4TWludAABBgkBAiE9AgUFcHJpY2UAAAcJAAIBAjpUaW1lZCBvZmZlciBvbmx5IGFsbG93ZWQgZm9yIHVuaXF1ZSBlZGl0aW9uIGFuZCBvZmZlciBvbmx5BApiYXNlSGVpZ2h0AwkAAAIFCGJsb2NrRW5kAAAAAAUGaGVpZ2h0AwkBASEBCQEQYWNjZXB0ZWRBc3NldElkcwEFB2Fzc2V0SWQJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEDCQEBIQEJAQ92YWxpZGF0ZU1pblNlbGwCBQdhc3NldElkBQVwcmljZQkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEJa2V5SXNzdWVkAgUGY2FsbGVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGY2FsbGVyBQVhcnRJZAMJAGYCBQdtYXhNaW50AGQJAAIBAhwxMDAgZWRpdGlvbnMgbWF4IHBlciBhcnR3b3JrAwMJAQIhPQIFCmFtb3VudFNvbGQAAAkAAAIFCmFtb3VudFNvbGQFCm1heENhblNlbGwHCQACAQIUTWF4IGVkaXRpb24gcmVhY2hlZC4DAwkAZgIFCmFtb3VudFNvbGQAAAkBAiE9AgUKbWF4Q2FuU2VsbAUHbWF4TWludAcJAAIBAiZDYW5ub3QgY2hhbmdlIG1heGltdW0gaXNzdWFibGUgYW55bW9yZQMDCQBmAgUGYmlkTmJyAAAJAQIhPQIFCm1heENhblNlbGwFB21heE1pbnQHCQACAQIxQ2Fubm90IGNoYW5nZSBtYXhpbXVtIGlzc3VhYmxlIHdpdGggYWN0aXZlIG9yZGVycwQKc2VsbFN0YXR1cwMDCQBmAgUFcHJpY2UAAAkAZgIFB21heE1pbnQAAAcGBwkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCWtleU9uU2FsZQIFBmNhbGxlcgUFYXJ0SWQFCnNlbGxTdGF0dXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAQhrZXlQcmljZQIFBmNhbGxlcgUFYXJ0SWQFBXByaWNlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5TWF4TWludAIFBmNhbGxlcgUFYXJ0SWQFB21heE1pbnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEmtleUFzc2V0SWRBY2NlcHRlZAIFBmNhbGxlcgUFYXJ0SWQFB2Fzc2V0SWQJAMwIAgkBDEludGVnZXJFbnRyeQIJAQprZXlFbmRTYWxlAgUGY2FsbGVyBQVhcnRJZAkAZAIFCmJhc2VIZWlnaHQFCGJsb2NrRW5kBQNuaWwBaQEKYnV5QXJ0d29yawIFYXJ0SWQGaXNzdWVyCQEHYnV5TWludAUFAWkFBWFydElkBQZpc3N1ZXICAAIAAWkBBnNldEJpZAIFYXJ0SWQGaXNzdWVyBA0kdDAyODUzMDI4NTcwCQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAyODUzMDI4NTcwAl8xBAZjYWxsZXIIBQ0kdDAyODUzMDI4NTcwAl8yBARkYXRlCAUNJHQwMjg1MzAyODU3MAJfMwQNJHQwMjg1NzYyODYxMgkBCWlzUGF5bWVudAEFAWkEB3BheW1lbnQIBQ0kdDAyODU3NjI4NjEyAl8xBAZhbW91bnQIBQ0kdDAyODU3NjI4NjEyAl8yBAdhc3NldElkAwkBASEBCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAIFV0FWRVMJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAQIYmxvY2tFbmQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5RW5kU2FsZQIFBmlzc3VlcgUFYXJ0SWQDAwkBAiE9AgUIYmxvY2tFbmQAAAkAZwIFBmhlaWdodAUIYmxvY2tFbmQHCQACAQILU2FsZSBlbmRlZC4EBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAMJAQEhAQkBEGFjY2VwdGVkQXNzZXRJZHMBBQdhc3NldElkCQACAQISYXNzZXQgbm90IGFjY2VwdGVkAwkBASEBCQEPdmFsaWRhdGVNaW5TZWxsAgUHYXNzZXRJZAUGYW1vdW50CQACAQIOV3JvbmcgbWluIHNlbGwECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEJa2V5SXNzdWVkAgUGaXNzdWVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGaXNzdWVyBQVhcnRJZAMJAGcCAAAFCm1heENhblNlbGwJAAIBAiNObyBtYXggZWRpdGlvbiBzZXQgZm9yIHRoaXMgYXJ0d29yawMJAGcCBQphbW91bnRTb2xkBQptYXhDYW5TZWxsCQACAQIYU29sZCBvdXQsIHlvdSBjYW5ub3QgYmlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQVhcnRJZAIBXwUGaXNzdWVyAgFfBQZjYWxsZXICAV8FAmlkAgVfT1BFTgkArAICCQCsAgIJAKwCAgkArAICBQdhc3NldElkAgFfCQCkAwEFBmFtb3VudAIBXwkApAMBBQRkYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQJAGQCBQZiaWROYnIAAQUDbmlsAWkBCWFjY2VwdEJpZAQFYXJ0SWQGaXNzdWVyBWJpZElkCGJpZE93bmVyBAZjYWxsZXIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwMJAQIhPQIFBmNhbGxlcgUGaXNzdWVyCQACAQIZWW91IGNhbm5vdCBkbyB0aGlzIGFjdGlvbgkBB2J1eU1pbnQFBQFpBQVhcnRJZAUGaXNzdWVyBQViaWRJZAUIYmlkT3duZXIBaQEJY2FuY2VsQmlkBAVhcnRJZAZpc3N1ZXIFYmlkSWQIYmlkT3duZXIEDSR0MDMwMDcyMzAxMzQJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDMwMDcyMzAxMzQCXzEEBmNhbGxlcggFDSR0MDMwMDcyMzAxMzQCXzIEBGRhdGUIBQ0kdDAzMDA3MjMwMTM0Al8zAwMJAQIhPQIFBmNhbGxlcgUIYmlkT3duZXIJAQIhPQIFBmNhbGxlcgUGaXNzdWVyBwkAAgECGVlvdSBjYW5ub3QgZG8gdGhpcyBhY3Rpb24EDXJldHVybk1vbmV5VG8DCQAAAgUGY2FsbGVyBQZpc3N1ZXIFCGJpZE93bmVyBQZjYWxsZXIEBmJpZE5icgkBD2dldEludGVnZXJCeUtleQEJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAQKYmlkRGF0YUtleQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQVhcnRJZAIBXwUGaXNzdWVyAgFfBQhiaWRPd25lcgIBXwUFYmlkSWQEB2JpZERhdGEJAQ5nZXRTdHJpbmdCeUtleQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4DCQAAAgUHYmlkRGF0YQIACQACAQINQmlkIG5vdCBmb3VuZAQKYmlkRGF0YUFycgkAtQkCBQdiaWREYXRhAgFfBAdhc3NldElkCQENZ2V0QmlkQXNzZXRJZAEJAJEDAgUKYmlkRGF0YUFycgAABAliaWRTdGF0dXMCCENBTkNFTEVECQDMCAIJAQtEZWxldGVFbnRyeQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4JAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIFCmJpZERhdGFLZXkCAV8FCWJpZFN0YXR1cwkArAICCQCsAgIFB2JpZERhdGECAV8JAKQDAQUEZGF0ZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkCQBlAgUGYmlkTmJyAAEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFDXJldHVybk1vbmV5VG8JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQpiaWREYXRhQXJyAAEFB2Fzc2V0SWQFA25pbADk+4Hz", "height": 2339264, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EPvAJyYEXTj4EffmiSfT7qWQ6StGtdzQyb4tzTQ3W17f Next: 4Bip3vgWYfW6sYoP6r4SXJSeUwTpV7BNmvuiXTBecU2R Diff:
OldNewDifferences
6161 let userAllowed = "ALLOWED"
6262
6363 let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
64+
65+func getArtworkRoyalties (key) = valueOrElse(getInteger(this, key), 1000)
66+
6467
6568 func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signDapp, ((("data_fc_" + signID) + "_") + Owner)) {
6669 case a: String =>
133136
134137
135138 func keyCrawler (caller,artId) = ((("art_crawler_cid_" + artId) + "_") + caller)
139+
140+
141+func keyRoyalties (caller,artId) = ((("art_royalties_" + artId) + "_") + caller)
136142
137143
138144 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
245251
246252
247253 func validatePayment (i) = {
248- let $t086758711 = isPayment(i)
249- let payment = $t086758711._1
250- let amount = $t086758711._2
254+ let $t088868922 = isPayment(i)
255+ let payment = $t088868922._1
256+ let amount = $t088868922._2
251257 let assetId = if (if (isDefined(payment.assetId))
252258 then (payment.assetId == signAssetId)
253259 else false)
270276
271277
272278 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
273- let $t093189354 = isPayment(i)
274- let payment = $t093189354._1
275- let amount = $t093189354._2
279+ let $t095299565 = isPayment(i)
280+ let payment = $t095299565._1
281+ let amount = $t095299565._2
276282 let assetId = if (!(isDefined(payment.assetId)))
277283 then unit
278284 else if (if ((size(priceAssetId) > 0))
367373
368374
369375 func buyMint (i,artId,issuer,bidId,bidOwner) = {
370- let $t01181611878 = idCallerDate(i)
371- let id = $t01181611878._1
372- let caller = $t01181611878._2
373- let date = $t01181611878._3
376+ let $t01202712089 = idCallerDate(i)
377+ let id = $t01202712089._1
378+ let caller = $t01202712089._2
379+ let date = $t01202712089._3
374380 let isBid = if (if (if ((toBase58String(i.caller.bytes) == issuer))
375381 then (bidOwner != "")
376382 else false)
426432 then throw(checkUser)
427433 else {
428434 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
429- let $t01365713828 = if (isBid)
435+ let $t01386814039 = if (isBid)
430436 then getPriceAssetIdFromBid(bidDataKey)
431437 else validatePriceAssetId(i, priceAssetId, artworkPrice)
432- let amount = $t01365713828._1
433- let assetId = $t01365713828._2
438+ let amount = $t01386814039._1
439+ let assetId = $t01386814039._2
434440 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
435441 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShare(issuer)), 0)
436442 let isWhitelisted = checkWhitelist(issuer)
485491 let commissions = if ((amountForAgent != 0))
486492 then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
487493 else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
488- 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(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissions)
494+ let nft_royalties = getArtworkRoyalties(keyRoyalties(issuer, artId))
495+ let buyRes = ([IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry(("royalties_" + toBase58String(idNFT)), nft_royalties), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissions)
489496 if (isBid)
490497 then [soldData, bidUpdate, bidDelOld] :: buyRes
491498 else soldData :: buyRes
511518
512519 @Callable(i)
513520 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler) = {
514- let $t01769017733 = idCallerDate(i)
515- let artId = $t01769017733._1
516- let caller = $t01769017733._2
517- let date = $t01769017733._3
521+ let $t01805918102 = idCallerDate(i)
522+ let artId = $t01805918102._1
523+ let caller = $t01805918102._2
524+ let date = $t01805918102._3
518525 if (!(validateHash(sha256Hash)))
519526 then throw("Hash should be 64 characters maximum")
520527 else {
521- let $t01783817907 = setLIcence(cidLicence, sha256Licence)
522- let licenceCID = $t01783817907._1
523- let licenceHash = $t01783817907._2
528+ let $t01820718276 = setLIcence(cidLicence, sha256Licence)
529+ let licenceCID = $t01820718276._1
530+ let licenceHash = $t01820718276._2
524531 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags)
525532 if ((validateArtwork != ""))
526533 then throw("Something went wrong!")
527534 else {
528- let $t01813118173 = validatePayment(i)
529- let amount = $t01813118173._1
530- let assetId = $t01813118173._2
535+ let $t01850018542 = validatePayment(i)
536+ let amount = $t01850018542._1
537+ let assetId = $t01850018542._2
531538 if (!(isDefined(amount)))
532539 then throw("Something went wrong")
533540 else {
557564 then throw(maintenanceMSG)
558565 else {
559566 let caller = toBase58String(i.caller.bytes)
560- let $t02095321022 = setLIcence(cidLicence, sha256Licence)
561- let licenceCID = $t02095321022._1
562- let licenceHash = $t02095321022._2
567+ let $t02132221391 = setLIcence(cidLicence, sha256Licence)
568+ let licenceCID = $t02132221391._1
569+ let licenceHash = $t02132221391._2
563570 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags)
564571 if ((validateArtwork != ""))
565572 then throw("Something went wrong!")
582589
583590 @Callable(i)
584591 func flagArtwork (artId,addr,flag,note) = {
585- let $t02247822512 = idCallerDate(i)
586- let id = $t02247822512._1
587- let caller = $t02247822512._2
592+ let $t02284722881 = idCallerDate(i)
593+ let id = $t02284722881._1
594+ let caller = $t02284722881._2
588595 if (containsElement([chris, toString(this)], caller))
589596 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
590597 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
596603
597604 @Callable(i)
598605 func deleteArtwork (artId,addr) = {
599- let $t02296222996 = idCallerDate(i)
600- let id = $t02296222996._1
601- let caller = $t02296222996._2
606+ let $t02333123365 = idCallerDate(i)
607+ let id = $t02333123365._1
608+ let caller = $t02333123365._2
602609 let addrToUse = if (containsElement([chris, toString(this)], caller))
603610 then addr
604611 else caller
631638
632639 @Callable(i)
633640 func sellArtwork (artId,price,maxMint,assetId,blockEnd) = {
634- let $t02581725851 = idCallerDate(i)
635- let id = $t02581725851._1
636- let caller = $t02581725851._2
641+ let $t02618626220 = idCallerDate(i)
642+ let id = $t02618626220._1
643+ let caller = $t02618626220._2
637644 let artworkName = getStringByKey(keyName(caller, artId))
638645 if ((artworkName == ""))
639646 then throw("This art doesn't match your account")
704711
705712 @Callable(i)
706713 func setBid (artId,issuer) = {
707- let $t02816128201 = idCallerDate(i)
708- let id = $t02816128201._1
709- let caller = $t02816128201._2
710- let date = $t02816128201._3
711- let $t02820728243 = isPayment(i)
712- let payment = $t02820728243._1
713- let amount = $t02820728243._2
714+ let $t02853028570 = idCallerDate(i)
715+ let id = $t02853028570._1
716+ let caller = $t02853028570._2
717+ let date = $t02853028570._3
718+ let $t02857628612 = isPayment(i)
719+ let payment = $t02857628612._1
720+ let amount = $t02857628612._2
714721 let assetId = if (!(isDefined(payment.assetId)))
715722 then "WAVES"
716723 else toBase58String(value(payment.assetId))
751758
752759 @Callable(i)
753760 func cancelBid (artId,issuer,bidId,bidOwner) = {
754- let $t02970329765 = idCallerDate(i)
755- let id = $t02970329765._1
756- let caller = $t02970329765._2
757- let date = $t02970329765._3
761+ let $t03007230134 = idCallerDate(i)
762+ let id = $t03007230134._1
763+ let caller = $t03007230134._2
764+ let date = $t03007230134._3
758765 if (if ((caller != bidOwner))
759766 then (caller != issuer)
760767 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)))
64+
65+func getArtworkRoyalties (key) = valueOrElse(getInteger(this, key), 1000)
66+
6467
6568 func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signDapp, ((("data_fc_" + signID) + "_") + Owner)) {
6669 case a: String =>
6770 if (contains(a, sha256Hash))
6871 then true
6972 else false
7073 case _ =>
7174 false
7275 }
7376
7477
7578 func validateCID (cid) = if (contains(cid, "/"))
7679 then if (if ((76 > size(cid)))
7780 then (size(split(cid, "/")[0]) == 59)
7881 else false)
7982 then (16 > size(split(cid, "/")[1]))
8083 else false
8184 else false
8285
8386
8487 func validateHash (hash) = (size(hash) == 64)
8588
8689
8790 func keyUserStatus (caller) = ("user_status_" + caller)
8891
8992
9093 func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
9194
9295
9396 func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
9497
9598
9699 func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
97100
98101
99102 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
100103
101104
102105 func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
103106
104107
105108 func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
106109
107110
108111 func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
109112
110113
111114 func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
112115
113116
114117 func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
115118
116119
117120 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
118121
119122
120123 func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
121124
122125
123126 func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
124127
125128
126129 func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
127130
128131
129132 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
130133
131134
132135 func keyNote (caller,artId) = ((("art_note_" + artId) + "_") + caller)
133136
134137
135138 func keyCrawler (caller,artId) = ((("art_crawler_cid_" + artId) + "_") + caller)
139+
140+
141+func keyRoyalties (caller,artId) = ((("art_royalties_" + artId) + "_") + caller)
136142
137143
138144 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
139145
140146
141147 func keyEndSale (caller,artId) = ((("art_endsale_" + artId) + "_") + caller)
142148
143149
144150 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
145151
146152
147153 func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
148154
149155
150156 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
151157
152158
153159 func keyPrimaryShare (artistAddr) = ("artist_agent_primary_" + artistAddr)
154160
155161
156162 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
157163
158164
159165 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
160166
161167
162168 func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
163169
164170
165171 func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
166172
167173
168174 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
169175 then throw("Wrong Display CID")
170176 else if (!(validateCID(cidExport)))
171177 then throw("Wrong Export CID")
172178 else if (if ((cidLicence != ""))
173179 then !(validateCID(cidLicence))
174180 else false)
175181 then throw("Wrong Licence CID")
176182 else true
177183
178184
179185 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
180186 then throw("Export Hash 64 char. max")
181187 else if (!(validateHash(sha256Licence)))
182188 then throw("Licence Hash 64 char. max")
183189 else true
184190
185191
186192 func validateString (str,max) = if ((size(str) == 0))
187193 then throw("Field cannot be is empty")
188194 else if ((size(str) > max))
189195 then throw((str + " is too long"))
190196 else true
191197
192198
193199 func validateUser (caller) = {
194200 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
195201 if (if ((userStatus == userUnregistered))
196202 then true
197203 else (userStatus == userAllowed))
198204 then "Register this account first with \"Account\" tab"
199205 else if ((userStatus == userSuspended))
200206 then "Account suspended"
201207 else if ((userStatus == userRemoved))
202208 then "Account removed"
203209 else ""
204210 }
205211
206212
207213 func setLIcence (cidLicence,sha256Licence) = {
208214 let cid = if ((size(cidLicence) == 0))
209215 then defaultLicence
210216 else cidLicence
211217 let hash = if ((size(sha256Licence) == 0))
212218 then defaultHashLicence
213219 else sha256Licence
214220 $Tuple2(cid, hash)
215221 }
216222
217223
218224 func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags) = {
219225 let checkUser = validateUser(caller)
220226 if ((checkUser != ""))
221227 then throw(checkUser)
222228 else if ((size(cidDisplay) == 0))
223229 then throw("Display CID cannot be empty")
224230 else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
225231 then throw("Problem with CID")
226232 else if (!(validateAllHash(sha256Export, licenceHash)))
227233 then throw("Problem with Hashes")
228234 else if (!(validateString(name, 100)))
229235 then throw("100 Char. max name")
230236 else if (!(validateString(description, 1000)))
231237 then throw("1000 Char. max description")
232238 else if ((size(split(tags, ",")) > 5))
233239 then throw("5 tags max.")
234240 else ""
235241 }
236242
237243
238244 func isPayment (i) = if ((size(i.payments) == 0))
239245 then throw("No payment attached")
240246 else {
241247 let payment = value(i.payments[0])
242248 let amount = value(payment.amount)
243249 $Tuple2(payment, amount)
244250 }
245251
246252
247253 func validatePayment (i) = {
248- let $t086758711 = isPayment(i)
249- let payment = $t086758711._1
250- let amount = $t086758711._2
254+ let $t088868922 = isPayment(i)
255+ let payment = $t088868922._1
256+ let amount = $t088868922._2
251257 let assetId = if (if (isDefined(payment.assetId))
252258 then (payment.assetId == signAssetId)
253259 else false)
254260 then payment.assetId
255261 else throw("Only SIGN token accepted as transaction fee")
256262 if ((amount != currentCertificationPrice))
257263 then throw(("Payment amount should be " + toString(currentCertificationPrice)))
258264 else $Tuple2(amount, assetId)
259265 }
260266
261267
262268 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
263269 case b: Int =>
264270 if ((b != 0))
265271 then true
266272 else false
267273 case _ =>
268274 false
269275 }
270276
271277
272278 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
273- let $t093189354 = isPayment(i)
274- let payment = $t093189354._1
275- let amount = $t093189354._2
279+ let $t095299565 = isPayment(i)
280+ let payment = $t095299565._1
281+ let amount = $t095299565._2
276282 let assetId = if (!(isDefined(payment.assetId)))
277283 then unit
278284 else if (if ((size(priceAssetId) > 0))
279285 then (toBase58String(value(payment.assetId)) == priceAssetId)
280286 else false)
281287 then payment.assetId
282288 else throw("Wrong asset id")
283289 if (if ((assetId == unit))
284290 then (priceAssetId != "")
285291 else false)
286292 then throw("Wrong asset id")
287293 else if ((artworkPrice != amount))
288294 then throw("Payment don't match")
289295 else $Tuple2(amount, assetId)
290296 }
291297
292298
293299 func acceptedAssetIds (assetId) = if (if (if (if (if ((assetId != toBase58String(signAssetId)))
294300 then (assetId != toBase58String(wavesAssetId))
295301 else false)
296302 then (assetId != "WAVES")
297303 else false)
298304 then (assetId != toBase58String(usdnAssetId))
299305 else false)
300306 then (assetId != toBase58String(usdtAssetId))
301307 else false)
302308 then throw("Only SIGN, USDN,USDT or WAVES accepted")
303309 else true
304310
305311
306312 func validateMinSell (assetId,price) = {
307313 let minSellWaves = if (unitTest)
308314 then 10
309315 else getIntegerByKeyFromOracle("waves_min_sell")
310316 let minSellUsdn = 1000000
311317 let minSellSign = if (unitTest)
312318 then 1
313319 else (currentCertificationPrice * 2)
314320 if (if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
315321 then (minSellUsdn > price)
316322 else false)
317323 then (price != 0)
318324 else false)
319325 then true
320326 else if (if ((assetId == toBase58String(usdtAssetId)))
321327 then (minSellUsdn > price)
322328 else false)
323329 then (price != 0)
324330 else false)
325331 then true
326332 else if (if ((assetId == toBase58String(signAssetId)))
327333 then (minSellSign > price)
328334 else false)
329335 then (price != 0)
330336 else false)
331337 then true
332338 else if (if (if ((assetId == toBase58String(wavesAssetId)))
333339 then true
334340 else (assetId == "WAVES"))
335341 then (minSellWaves > price)
336342 else false)
337343 then (price != 0)
338344 else false)
339345 then throw("Wrong minimum sell price")
340346 else true
341347 }
342348
343349
344350 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
345351 then unit
346352 else fromBase58String(assetId)
347353
348354
349355 func getPriceAssetIdFromBid (bidDataKey) = {
350356 let bidData = getStringByKey((bidDataKey + "_OPEN"))
351357 if ((bidData == ""))
352358 then throw("Bid not found")
353359 else {
354360 let bidDataArr = split(bidData, "_")
355361 let bidAmount = parseIntValue(bidDataArr[1])
356362 let bidAssetId = getBidAssetId(bidDataArr[0])
357363 if ((0 >= bidAmount))
358364 then throw("Wrong amount")
359365 else $Tuple2(bidAmount, bidAssetId)
360366 }
361367 }
362368
363369
364370 func idCallerDate (i) = if (!(dappRunning))
365371 then throw(maintenanceMSG)
366372 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
367373
368374
369375 func buyMint (i,artId,issuer,bidId,bidOwner) = {
370- let $t01181611878 = idCallerDate(i)
371- let id = $t01181611878._1
372- let caller = $t01181611878._2
373- let date = $t01181611878._3
376+ let $t01202712089 = idCallerDate(i)
377+ let id = $t01202712089._1
378+ let caller = $t01202712089._2
379+ let date = $t01202712089._3
374380 let isBid = if (if (if ((toBase58String(i.caller.bytes) == issuer))
375381 then (bidOwner != "")
376382 else false)
377383 then (bidId != "")
378384 else false)
379385 then true
380386 else false
381387 let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
382388 if (if (if ((blockEnd != 0))
383389 then (height >= blockEnd)
384390 else false)
385391 then !(isBid)
386392 else false)
387393 then throw("Sale ended.")
388394 else {
389395 let callerIsIssuer = (toBase58String(i.caller.bytes) == issuer)
390396 let totalNFT = getIntegerByKey("total_nft_issued")
391397 let signID = getStringByKey(keySignID(issuer, artId))
392398 let artworkName = getStringByKey(keyName(issuer, artId))
393399 if ((artworkName == ""))
394400 then throw("Art doesn't exist")
395401 else {
396402 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
397403 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
398404 let artworkPrice = if (callerIsIssuer)
399405 then (currentCertificationPrice * 2)
400406 else getIntegerByKey(keyPrice(issuer, artId))
401407 let priceAssetId = if (callerIsIssuer)
402408 then toBase58String(signAssetId)
403409 else getStringByKey(keyAssetIdAccepted(issuer, artId))
404410 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
405411 if (if (if (!(isBid))
406412 then !(callerIsIssuer)
407413 else false)
408414 then if (if ((0 >= artworkPrice))
409415 then true
410416 else !(isOnSale))
411417 then true
412418 else (0 >= maxCanSell)
413419 else false)
414420 then throw("Art not for sale")
415421 else if (if (if (!(isBid))
416422 then callerIsIssuer
417423 else false)
418424 then (0 >= maxCanSell)
419425 else false)
420426 then throw("Max issuable not set")
421427 else {
422428 let checkUser = validateUser(issuer)
423429 if (if (isBid)
424430 then (checkUser != "")
425431 else false)
426432 then throw(checkUser)
427433 else {
428434 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
429- let $t01365713828 = if (isBid)
435+ let $t01386814039 = if (isBid)
430436 then getPriceAssetIdFromBid(bidDataKey)
431437 else validatePriceAssetId(i, priceAssetId, artworkPrice)
432- let amount = $t01365713828._1
433- let assetId = $t01365713828._2
438+ let amount = $t01386814039._1
439+ let assetId = $t01386814039._2
434440 let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
435441 let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShare(issuer)), 0)
436442 let isWhitelisted = checkWhitelist(issuer)
437443 let cut = if ((isWhitelisted > height))
438444 then 0
439445 else if ((assetId == signAssetId))
440446 then signCut
441447 else usdnWaveCut
442448 let amountForSign = fraction(amount, cut, 100)
443449 let amountForAgent = if (if (if ((agent != feeReceiver))
444450 then (agentShare > 0)
445451 else false)
446452 then (height > isWhitelisted)
447453 else false)
448454 then fraction(amount, agentShare, 100)
449455 else 0
450456 let amountForCreator = (amount - amountForSign)
451457 if ((amountSold == maxCanSell))
452458 then throw("Art sold out")
453459 else {
454460 let newAmountSold = (amountSold + 1)
455461 let issueMeta = ((((((((((("Creator: " + issuer) + ",
456462 ArtID: ") + artId) + ",
457463 SignID: ") + signID) + ",
458464 Artwork name: ") + artworkName) + ",
459465 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
460466 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
461467 let idNFT = calculateAssetId(issueNFT)
462468 let sellStatus = if (if ((newAmountSold == maxCanSell))
463469 then true
464470 else !(isOnSale))
465471 then false
466472 else true
467473 let receiveNFT = if (if (if ((caller == issuer))
468474 then (bidOwner != "")
469475 else false)
470476 then (bidId != "")
471477 else false)
472478 then addressFromStringValue(bidOwner)
473479 else i.caller
474480 let assetIdBid = if (!(isDefined(assetId)))
475481 then "WAVES"
476482 else toBase58String(value(assetId))
477483 let bidData = getStringByKey((bidDataKey + "_OPEN"))
478484 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
479485 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
480486 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
481487 let soldValue = if (!(isBid))
482488 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
483489 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
484490 let soldData = StringEntry(soldKey, soldValue)
485491 let commissions = if ((amountForAgent != 0))
486492 then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
487493 else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
488- 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(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissions)
494+ let nft_royalties = getArtworkRoyalties(keyRoyalties(issuer, artId))
495+ let buyRes = ([IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry(("royalties_" + toBase58String(idNFT)), nft_royalties), IntegerEntry("total_nft_issued", (totalNFT + 1)), IntegerEntry(keyEndSale(issuer, artId), 0), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(receiveNFT, 1, idNFT)] ++ commissions)
489496 if (isBid)
490497 then [soldData, bidUpdate, bidDelOld] :: buyRes
491498 else soldData :: buyRes
492499 }
493500 }
494501 }
495502 }
496503 }
497504 }
498505
499506
500507 @Callable(invoke)
501508 func setConf (key,val) = {
502509 let caller = toString(invoke.caller)
503510 if (containsElement([chris, toString(this)], caller))
504511 then if (contains(key, "conf_"))
505512 then [StringEntry(key, val)]
506513 else throw("Entries starting with conf_ only")
507514 else throw("You are not allowed to change this")
508515 }
509516
510517
511518
512519 @Callable(i)
513520 func addArtwork (sha256Hash,signID,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler) = {
514- let $t01769017733 = idCallerDate(i)
515- let artId = $t01769017733._1
516- let caller = $t01769017733._2
517- let date = $t01769017733._3
521+ let $t01805918102 = idCallerDate(i)
522+ let artId = $t01805918102._1
523+ let caller = $t01805918102._2
524+ let date = $t01805918102._3
518525 if (!(validateHash(sha256Hash)))
519526 then throw("Hash should be 64 characters maximum")
520527 else {
521- let $t01783817907 = setLIcence(cidLicence, sha256Licence)
522- let licenceCID = $t01783817907._1
523- let licenceHash = $t01783817907._2
528+ let $t01820718276 = setLIcence(cidLicence, sha256Licence)
529+ let licenceCID = $t01820718276._1
530+ let licenceHash = $t01820718276._2
524531 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags)
525532 if ((validateArtwork != ""))
526533 then throw("Something went wrong!")
527534 else {
528- let $t01813118173 = validatePayment(i)
529- let amount = $t01813118173._1
530- let assetId = $t01813118173._2
535+ let $t01850018542 = validatePayment(i)
536+ let amount = $t01850018542._1
537+ let assetId = $t01850018542._2
531538 if (!(isDefined(amount)))
532539 then throw("Something went wrong")
533540 else {
534541 let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
535542 if ((entryExist != ""))
536543 then throw("You already added it")
537544 else {
538545 let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
539546 if ((hashExist != ""))
540547 then throw("Hash already registered")
541548 else {
542549 let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
543550 if (!(isSignCertified))
544551 then throw("Sign Certificate not found for this address.")
545552 else [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), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, assetId)]
546553 }
547554 }
548555 }
549556 }
550557 }
551558 }
552559
553560
554561
555562 @Callable(i)
556563 func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler) = if (!(dappRunning))
557564 then throw(maintenanceMSG)
558565 else {
559566 let caller = toBase58String(i.caller.bytes)
560- let $t02095321022 = setLIcence(cidLicence, sha256Licence)
561- let licenceCID = $t02095321022._1
562- let licenceHash = $t02095321022._2
567+ let $t02132221391 = setLIcence(cidLicence, sha256Licence)
568+ let licenceCID = $t02132221391._1
569+ let licenceHash = $t02132221391._2
563570 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags)
564571 if ((validateArtwork != ""))
565572 then throw("Something went wrong!")
566573 else {
567574 let entryExist = getStringByKey(keyName(caller, txid))
568575 if ((entryExist == ""))
569576 then throw("Entry not found")
570577 else {
571578 let flag = getStringByKey(keyFlag(caller, txid))
572579 if ((flag == "ILLEGAL"))
573580 then throw("Cannot update ILLEGAL artwork")
574581 else if (!(isArtMinted(caller, txid)))
575582 then [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)]
576583 else throw("Already minted")
577584 }
578585 }
579586 }
580587
581588
582589
583590 @Callable(i)
584591 func flagArtwork (artId,addr,flag,note) = {
585- let $t02247822512 = idCallerDate(i)
586- let id = $t02247822512._1
587- let caller = $t02247822512._2
592+ let $t02284722881 = idCallerDate(i)
593+ let id = $t02284722881._1
594+ let caller = $t02284722881._2
588595 if (containsElement([chris, toString(this)], caller))
589596 then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
590597 then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
591598 else throw(("Unknow status " + flag))
592599 else throw("You are not allowed")
593600 }
594601
595602
596603
597604 @Callable(i)
598605 func deleteArtwork (artId,addr) = {
599- let $t02296222996 = idCallerDate(i)
600- let id = $t02296222996._1
601- let caller = $t02296222996._2
606+ let $t02333123365 = idCallerDate(i)
607+ let id = $t02333123365._1
608+ let caller = $t02333123365._2
602609 let addrToUse = if (containsElement([chris, toString(this)], caller))
603610 then addr
604611 else caller
605612 let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
606613 if ((entryExist == ""))
607614 then throw("No art matching for this address")
608615 else {
609616 let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
610617 if ((sha256Hash == ""))
611618 then throw("No art hash matching for this address")
612619 else {
613620 let signID = getStringByKey(keySignID(addrToUse, artId))
614621 if ((signID == ""))
615622 then throw("No SIGN ID matching")
616623 else {
617624 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))]
618625 if (!(isArtMinted(addrToUse, artId)))
619626 then if (!(dappRunning))
620627 then throw(maintenanceMSG)
621628 else dataToDelete
622629 else if (containsElement([chris, toString(this)], caller))
623630 then dataToDelete
624631 else throw("Art already minted, you cannot delete it")
625632 }
626633 }
627634 }
628635 }
629636
630637
631638
632639 @Callable(i)
633640 func sellArtwork (artId,price,maxMint,assetId,blockEnd) = {
634- let $t02581725851 = idCallerDate(i)
635- let id = $t02581725851._1
636- let caller = $t02581725851._2
641+ let $t02618626220 = idCallerDate(i)
642+ let id = $t02618626220._1
643+ let caller = $t02618626220._2
637644 let artworkName = getStringByKey(keyName(caller, artId))
638645 if ((artworkName == ""))
639646 then throw("This art doesn't match your account")
640647 else {
641648 let flag = getStringByKey(keyFlag(caller, artId))
642649 if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
643650 then throw("Flagged artwork")
644651 else {
645652 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
646653 if ((0 > blockEnd))
647654 then throw("Negative end")
648655 else if (if ((blockEnd > 0))
649656 then if ((maxMint != 1))
650657 then true
651658 else (price != 0)
652659 else false)
653660 then throw("Timed offer only allowed for unique edition and offer only")
654661 else {
655662 let baseHeight = if ((blockEnd == 0))
656663 then 0
657664 else height
658665 if (!(acceptedAssetIds(assetId)))
659666 then throw("Something went wrong!")
660667 else if (!(validateMinSell(assetId, price)))
661668 then throw("Something went wrong!")
662669 else {
663670 let checkUser = validateUser(caller)
664671 if ((checkUser != ""))
665672 then throw(checkUser)
666673 else {
667674 let amountSold = getIntegerByKey(keyIssued(caller, artId))
668675 let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
669676 if ((maxMint > 100))
670677 then throw("100 editions max per artwork")
671678 else if (if ((amountSold != 0))
672679 then (amountSold == maxCanSell)
673680 else false)
674681 then throw("Max edition reached.")
675682 else if (if ((amountSold > 0))
676683 then (maxCanSell != maxMint)
677684 else false)
678685 then throw("Cannot change maximum issuable anymore")
679686 else if (if ((bidNbr > 0))
680687 then (maxCanSell != maxMint)
681688 else false)
682689 then throw("Cannot change maximum issuable with active orders")
683690 else {
684691 let sellStatus = if (if ((price > 0))
685692 then (maxMint > 0)
686693 else false)
687694 then true
688695 else false
689696 [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))]
690697 }
691698 }
692699 }
693700 }
694701 }
695702 }
696703 }
697704
698705
699706
700707 @Callable(i)
701708 func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "")
702709
703710
704711
705712 @Callable(i)
706713 func setBid (artId,issuer) = {
707- let $t02816128201 = idCallerDate(i)
708- let id = $t02816128201._1
709- let caller = $t02816128201._2
710- let date = $t02816128201._3
711- let $t02820728243 = isPayment(i)
712- let payment = $t02820728243._1
713- let amount = $t02820728243._2
714+ let $t02853028570 = idCallerDate(i)
715+ let id = $t02853028570._1
716+ let caller = $t02853028570._2
717+ let date = $t02853028570._3
718+ let $t02857628612 = isPayment(i)
719+ let payment = $t02857628612._1
720+ let amount = $t02857628612._2
714721 let assetId = if (!(isDefined(payment.assetId)))
715722 then "WAVES"
716723 else toBase58String(value(payment.assetId))
717724 let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
718725 if (if ((blockEnd != 0))
719726 then (height >= blockEnd)
720727 else false)
721728 then throw("Sale ended.")
722729 else {
723730 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
724731 if (!(acceptedAssetIds(assetId)))
725732 then throw("asset not accepted")
726733 else if (!(validateMinSell(assetId, amount)))
727734 then throw("Wrong min sell")
728735 else {
729736 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
730737 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
731738 if ((0 >= maxCanSell))
732739 then throw("No max edition set for this artwork")
733740 else if ((amountSold >= maxCanSell))
734741 then throw("Sold out, you cannot bid")
735742 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
736743 }
737744 }
738745 }
739746
740747
741748
742749 @Callable(i)
743750 func acceptBid (artId,issuer,bidId,bidOwner) = {
744751 let caller = toBase58String(i.caller.bytes)
745752 if ((caller != issuer))
746753 then throw("You cannot do this action")
747754 else buyMint(i, artId, issuer, bidId, bidOwner)
748755 }
749756
750757
751758
752759 @Callable(i)
753760 func cancelBid (artId,issuer,bidId,bidOwner) = {
754- let $t02970329765 = idCallerDate(i)
755- let id = $t02970329765._1
756- let caller = $t02970329765._2
757- let date = $t02970329765._3
761+ let $t03007230134 = idCallerDate(i)
762+ let id = $t03007230134._1
763+ let caller = $t03007230134._2
764+ let date = $t03007230134._3
758765 if (if ((caller != bidOwner))
759766 then (caller != issuer)
760767 else false)
761768 then throw("You cannot do this action")
762769 else {
763770 let returnMoneyTo = if ((caller == issuer))
764771 then bidOwner
765772 else caller
766773 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
767774 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
768775 let bidData = getStringByKey((bidDataKey + "_OPEN"))
769776 if ((bidData == ""))
770777 then throw("Bid not found")
771778 else {
772779 let bidDataArr = split(bidData, "_")
773780 let assetId = getBidAssetId(bidDataArr[0])
774781 let bidStatus = "CANCELED"
775782 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
776783 }
777784 }
778785 }
779786
780787

github/deemru/w8io/169f3d6 
88.23 ms