tx · 4sMqMuxBS2WBiSH1vwNrhXDJ5E4WakhhZdxfg98oEmwY

3N5V44AAww1zE6Eb9TnJ3LBbJp9XzNkxB4a:  -0.01900000 Waves

2022.11.07 12:27 [2306539] smart account 3N5V44AAww1zE6Eb9TnJ3LBbJp9XzNkxB4a > SELF 0.00000000 Waves

{ "type": 13, "id": "4sMqMuxBS2WBiSH1vwNrhXDJ5E4WakhhZdxfg98oEmwY", "fee": 1900000, "feeAssetId": null, "timestamp": 1667813252970, "version": 2, "chainId": 84, "sender": "3N5V44AAww1zE6Eb9TnJ3LBbJp9XzNkxB4a", "senderPublicKey": "FdBAJSP4WaWUkAzitoyP9FLTP1CP4GNeToRb7L8DcZq", "proofs": [ "2Cn4VZ89vs9NdhX8xTmSowokvN4ZW8oLt5ge4Z4FvjJXqbwew6YDQjUcNN8T7x5gHrLiw1eWZ5PzkhqTxx8HKqwW" ], "script": "base64:BgJiCAISBAoCCAgSCAoGCAgICAgIEgkKBwgICAgICAgSAwoBCBIECgIICBIGCgQICAgIEgkKBwgICAEBAQESCgoICAgICAEBAQESBQoDCAgEEgQKAggIEgUKAwgICBIAEgMKAQg1AAdWRVJTSU9OAgUxLjAuMAEOZ2V0U3RyaW5nQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQNrZXkCAAAIdXNlckRhcHAJAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQIPY29uZl91c2Vyc19kYXBwAAtmZWVSZWNlaXZlcgkBDmdldFN0cmluZ0J5S2V5AQIRY29uZl9mZWVfcmVjZWl2ZXIAC3NpZ25Bc3NldElkCQDZBAEJAQ5nZXRTdHJpbmdCeUtleQECGGNvbmZfYWNjZXB0ZWRfYXNzZXRfU0lHTgAFY2hyaXMJAQ5nZXRTdHJpbmdCeUtleQECDGNvbmZfYWRtaW5fMQEPZ2V0SW50ZWdlckJ5S2V5AQNrZXkJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUDa2V5AAABD2dldEJvb2xlYW5CeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMFA2tleQcAC2RhcHBSdW5uaW5nCQELdmFsdWVPckVsc2UCCQCbCAIFCHVzZXJEYXBwAhRjb25mX2RhcHBfaXNfcnVubmluZwYADm1haW50ZW5hbmNlTVNHCQELdmFsdWVPckVsc2UCCQCdCAIFCHVzZXJEYXBwAhRjb25mX21haW50ZW5hbmNlX21zZwIAAA11c2VyU3VzcGVuZGVkAglTVVNQRU5ERUQAEHVzZXJVbnJlZ2lzdGVyZWQCDFVOUkVHSVNURVJFRAELdmFsaWRhdGVDSUQBA2NpZAMJAQhjb250YWlucwIFA2NpZAIBLwMDCQBmAgBMCQCxAgEFA2NpZAkAAAIJALECAQkAkQMCCQC1CQIFA2NpZAIBLwAAADsHCQBmAgAQCQCxAgEJAJEDAgkAtQkCBQNjaWQCAS8AAQcHAAdzaWduQ3V0AAIBDWtleVVzZXJTdGF0dXMBBmNhbGxlcgkArAICAgx1c2VyX3N0YXR1c18FBmNhbGxlcgEWa2V5RXZlbnRPd25lckJ5RXZlbnRJZAEHZXZlbnRJZAkArAICAhBnZXRfZXZlbnRfb3duZXJfBQdldmVudElkARFrZXlFdmVudEFkZGVkRGF0ZQIGY2FsbGVyB2V2ZW50SWQJAKwCAgkArAICCQCsAgICEGV2ZW50X2FkZGVkRGF0ZV8FB2V2ZW50SWQCAV8FBmNhbGxlcgEMa2V5RXZlbnREYXRlAgZjYWxsZXIHZXZlbnRJZAkArAICCQCsAgIJAKwCAgILZXZlbnRfZGF0ZV8FB2V2ZW50SWQCAV8FBmNhbGxlcgEMa2V5RXZlbnROYW1lAgZjYWxsZXIHZXZlbnRJZAkArAICCQCsAgIJAKwCAgILZXZlbnRfbmFtZV8FB2V2ZW50SWQCAV8FBmNhbGxlcgEMa2V5RXZlbnREZXNjAgZjYWxsZXIHZXZlbnRJZAkArAICCQCsAgIJAKwCAgILZXZlbnRfZGVzY18FB2V2ZW50SWQCAV8FBmNhbGxlcgESa2V5RXZlbnREaXNwbGF5Q2lkAgZjYWxsZXIHZXZlbnRJZAkArAICCQCsAgIJAKwCAgIRZXZlbnRfZGlzcGxheUNpZF8FB2V2ZW50SWQCAV8FBmNhbGxlcgEMa2V5RXZlbnRUYWdzAgZjYWxsZXIHZXZlbnRJZAkArAICCQCsAgIJAKwCAgILZXZlbnRfdGFnc18FB2V2ZW50SWQCAV8FBmNhbGxlcgEMa2V5RXZlbnRGbGFnAgZjYWxsZXIHZXZlbnRJZAkArAICCQCsAgIJAKwCAgILZXZlbnRfZmxhZ18FB2V2ZW50SWQCAV8FBmNhbGxlcgEMa2V5RXZlbnROb3RlAgZjYWxsZXIHZXZlbnRJZAkArAICCQCsAgIJAKwCAgILZXZlbnRfbm90ZV8FB2V2ZW50SWQCAV8FBmNhbGxlcgEPa2V5RXZlbnRDcmF3bGVyAgZjYWxsZXIHZXZlbnRJZAkArAICCQCsAgIJAKwCAgIRZXZlbnRfY3Jhd2xlckNpZF8FB2V2ZW50SWQCAV8FBmNhbGxlcgEYa2V5RXZlbnRUb3RhbFRpY2tldFR5cGVzAgZjYWxsZXIHZXZlbnRJZAkArAICCQCsAgIJAKwCAgIXZXZlbnRfdG90YWxUaWNrZXRUeXBlc18FB2V2ZW50SWQCAV8FBmNhbGxlcgEaa2V5RXZlbnRUb3RhbFRpY2tldHNJc3N1ZWQCBmNhbGxlcgdldmVudElkCQCsAgIJAKwCAgkArAICAhJldmVudF90b3RhbElzc3VlZF8FB2V2ZW50SWQCAV8FBmNhbGxlcgEQa2V5RXZlbnRDYW5jZWxlZAIGY2FsbGVyB2V2ZW50SWQJAKwCAgkArAICCQCsAgICD2V2ZW50X2NhbmNlbGVkXwUHZXZlbnRJZAIBXwUGY2FsbGVyARZrZXlFdmVudENhbmNlbGVkUmVhc29uAgZjYWxsZXIHZXZlbnRJZAkArAICCQCsAgIJAKwCAgIVZXZlbnRfY2FuY2VsZWRSZWFzb25fBQdldmVudElkAgFfBQZjYWxsZXIBFWtleUV2ZW50U3RhcnRpbmdQcmljZQIGY2FsbGVyB2V2ZW50SWQJAKwCAgkArAICCQCsAgICFGV2ZW50X3N0YXJ0aW5nUHJpY2VfBQdldmVudElkAgFfBQZjYWxsZXIBDWtleVRpY2tldE5hbWUDBmNhbGxlcgdldmVudElkCHRpY2tldElkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIMdGlja2V0X25hbWVfBQdldmVudElkAgFfBQZjYWxsZXICAV8FCHRpY2tldElkAQ1rZXlUaWNrZXREZXNjAwZjYWxsZXIHZXZlbnRJZAh0aWNrZXRJZAkArAICCQCsAgIJAKwCAgkArAICCQCsAgICDHRpY2tldF9kZXNjXwUHZXZlbnRJZAIBXwUGY2FsbGVyAgFfBQh0aWNrZXRJZAEOa2V5VGlja2V0UHJpY2UDBmNhbGxlcgdldmVudElkCHRpY2tldElkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgINdGlja2V0X3ByaWNlXwUHZXZlbnRJZAIBXwUGY2FsbGVyAgFfBQh0aWNrZXRJZAENa2V5VGlja2V0RGF0ZQMGY2FsbGVyB2V2ZW50SWQIdGlja2V0SWQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgx0aWNrZXRfZGF0ZV8FB2V2ZW50SWQCAV8FBmNhbGxlcgIBXwUIdGlja2V0SWQBFWtleVRpY2tldE1heEF2YWlsYWJsZQMGY2FsbGVyB2V2ZW50SWQIdGlja2V0SWQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhR0aWNrZXRfbWF4QXZhaWxhYmxlXwUHZXZlbnRJZAIBXwUGY2FsbGVyAgFfBQh0aWNrZXRJZAEPa2V5VGlja2V0T25TYWxlAwZjYWxsZXIHZXZlbnRJZAh0aWNrZXRJZAkArAICCQCsAgIJAKwCAgkArAICCQCsAgICDnRpY2tldF9vblNhbGVfBQdldmVudElkAgFfBQZjYWxsZXICAV8FCHRpY2tldElkARNrZXlUaWNrZXRBbW91bnRVc2VkBAZjYWxsZXIHZXZlbnRJZAh0aWNrZXRJZAVuZnRJZAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhJ0aWNrZXRfYW1vdW50VXNlZF8FB2V2ZW50SWQCAV8FBmNhbGxlcgIBXwUIdGlja2V0SWQCAV8FBW5mdElkARRrZXlUaWNrZXRIaXN0b3J5VXNlZAUGY2FsbGVyB2V2ZW50SWQIdGlja2V0SWQFbmZ0SWQKdXNhZ2VJbmRleAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgITdGlja2V0X2hpc3RvcnlVc2VkXwUHZXZlbnRJZAIBXwUGY2FsbGVyAgFfBQh0aWNrZXRJZAIBXwUFbmZ0SWQCAV8FCnVzYWdlSW5kZXgBD2tleVRpY2tldE1heFVzZQMGY2FsbGVyB2V2ZW50SWQIdGlja2V0SWQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAg50aWNrZXRfbWF4VXNlXwUHZXZlbnRJZAIBXwUGY2FsbGVyAgFfBQh0aWNrZXRJZAEUa2V5VGlja2V0VG90YWxJc3N1ZWQDBmNhbGxlcgdldmVudElkCHRpY2tldElkCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgITdGlja2V0X3RvdGFsSXNzdWVkXwUHZXZlbnRJZAIBXwUGY2FsbGVyAgFfBQh0aWNrZXRJZAEQa2V5VGlja2V0Um95YWx0eQMGY2FsbGVyB2V2ZW50SWQIdGlja2V0SWQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhF0aWNrZXRfcm95YWx0aWVzXwUHZXZlbnRJZAIBXwUGY2FsbGVyAgFfBQh0aWNrZXRJZAEOdmFsaWRhdGVTdHJpbmcCA3N0cgNtYXgDCQAAAgkAsQIBBQNzdHIAAAkAAgECGEZpZWxkIGNhbm5vdCBiZSBpcyBlbXB0eQMJAGYCCQCxAgEFA3N0cgUDbWF4CQACAQkArAICBQNzdHICDCBpcyB0b28gbG9uZwYBC3ZhbGlkYXRlSW50AQNudW0JAGYCAAAFA251bQEWZ2V0RXZlbnRPd25lckJ5RXZlbnRJZAEHZXZlbnRJZAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzCQEWa2V5RXZlbnRPd25lckJ5RXZlbnRJZAEFB2V2ZW50SWQCAAEMdmFsaWRhdGVVc2VyAQZjYWxsZXIECnVzZXJTdGF0dXMJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUIdXNlckRhcHAJAQ1rZXlVc2VyU3RhdHVzAQUGY2FsbGVyBRB1c2VyVW5yZWdpc3RlcmVkAwkAAAIFCnVzZXJTdGF0dXMFEHVzZXJVbnJlZ2lzdGVyZWQCLlJlZ2lzdGVyIHRoaXMgYWNjb3VudCBmaXJzdCB3aXRoICJBY2NvdW50IiB0YWIDCQAAAgUKdXNlclN0YXR1cwUNdXNlclN1c3BlbmRlZAIRQWNjb3VudCBzdXNwZW5kZWQCAAERdmFsaWRhdGVFdmVudERhdGEGBmNhbGxlcgpjaWREaXNwbGF5BG5hbWULZGVzY3JpcHRpb24EdGFncwRkYXRlBAljaGVja1VzZXIJAQx2YWxpZGF0ZVVzZXIBBQZjYWxsZXIDCQECIT0CBQljaGVja1VzZXICAAkAAgEFCWNoZWNrVXNlcgMJAAACCQCxAgEFCmNpZERpc3BsYXkAAAkAAgECG0Rpc3BsYXkgQ0lEIGNhbm5vdCBiZSBlbXB0eQMJAQEhAQkBC3ZhbGlkYXRlQ0lEAQUKY2lkRGlzcGxheQkAAgECEFByb2JsZW0gd2l0aCBDSUQDCQEBIQEJAQ52YWxpZGF0ZVN0cmluZwIFBG5hbWUArAIJAAIBAhIzMDAgQ2hhci4gbWF4IG5hbWUDCQEBIQEJAQ52YWxpZGF0ZVN0cmluZwIFC2Rlc2NyaXB0aW9uALgXCQACAQIaMzAwMCBDaGFyLiBtYXggZGVzY3JpcHRpb24DCQEBIQEJAQ52YWxpZGF0ZVN0cmluZwIFBGRhdGUA6AcJAAIBAhMxMDAwIENoYXIuIG1heCBkYXRlAwkAZgIJAJADAQkAtQkCBQR0YWdzAgEsAAUJAAIBAgs1IHRhZ3MgbWF4LgIAARJ2YWxpZGF0ZVRpY2tldERhdGEHB2V2ZW50SWQGY2FsbGVyBG5hbWULZGVzY3JpcHRpb24FcHJpY2UMbWF4QXZhaWxhYmxlBm1heFVzZQQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIDCQEBIQEJAQ52YWxpZGF0ZVN0cmluZwIFBG5hbWUAyAEJAAIBAhIxMDAgQ2hhci4gbWF4IG5hbWUDCQEBIQEJAQ52YWxpZGF0ZVN0cmluZwIFC2Rlc2NyaXB0aW9uAOgHCQACAQIaMTAwMCBDaGFyLiBtYXggZGVzY3JpcHRpb24DAwMJAQt2YWxpZGF0ZUludAEFBXByaWNlBgkBC3ZhbGlkYXRlSW50AQUGbWF4VXNlBgkBC3ZhbGlkYXRlSW50AQUMbWF4QXZhaWxhYmxlCQACAQIUUG9zaXRpdmUgYW1vdW50IG9ubHkDCQEBIQEJAQ52YWxpZGF0ZVN0cmluZwIFC2Rlc2NyaXB0aW9uAOgHCQACAQIaMTAwMCBDaGFyLiBtYXggZGVzY3JpcHRpb24CAAEMaWRDYWxsZXJEYXRlAQFpAwkBASEBBQtkYXBwUnVubmluZwkAAgEFDm1haW50ZW5hbmNlTVNHCQCVCgMJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAEJaXNQYXltZW50AQFpAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECE05vIHBheW1lbnQgYXR0YWNoZWQEB3BheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQGYW1vdW50CQEFdmFsdWUBCAUHcGF5bWVudAZhbW91bnQJAJQKAgUHcGF5bWVudAUGYW1vdW50ARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMBaQxwcmljZUFzc2V0SWQMYXJ0d29ya1ByaWNlBAskdDA2ODEyNjg0OAkBCWlzUGF5bWVudAEFAWkEB3BheW1lbnQIBQskdDA2ODEyNjg0OAJfMQQGYW1vdW50CAULJHQwNjgxMjY4NDgCXzIDCQEBIQEJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkCQACAQIUV3JvbmcgYXNzZXQgYXR0YWNoZWQEB2Fzc2V0SWQDAwkAZgIJALECAQUMcHJpY2VBc3NldElkAAAJAAACCQDYBAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQFDHByaWNlQXNzZXRJZAcIBQdwYXltZW50B2Fzc2V0SWQJAAIBAhRXcm9uZyBhc3NldCBhdHRhY2hlZAMJAQIhPQIFDGFydHdvcmtQcmljZQUGYW1vdW50CQACAQIaUGF5bWVudCBhbW91bnQgZG9uJ3QgbWF0Y2gJAJQKAgUGYW1vdW50BQdhc3NldElkAQxpc0V2ZW50T3duZXICB2V2ZW50SWQGY2FsbGVyBApldmVudE93bmVyCQEWZ2V0RXZlbnRPd25lckJ5RXZlbnRJZAEFB2V2ZW50SWQDCQAAAgUKZXZlbnRPd25lcgIACQACAQIPRXZlbnQgbm90IGZvdW5kCQAAAgUKZXZlbnRPd25lcgUGY2FsbGVyAQt0aWNrZXRFeGlzdAMGY2FsbGVyB2V2ZW50SWQIdGlja2V0SWQEBnRpY2tldAkBDmdldFN0cmluZ0J5S2V5AQkBDWtleVRpY2tldE5hbWUDBQZjYWxsZXIFB2V2ZW50SWQFCHRpY2tldElkCQECIT0CCQCxAgEFBnRpY2tldAAAAQ9ldmVudElzQ2FuY2VsZWQCBmlzc3VlcgdldmVudElkCQEPZ2V0Qm9vbGVhbkJ5S2V5AQkBEGtleUV2ZW50Q2FuY2VsZWQCBQZpc3N1ZXIFB2V2ZW50SWQNBmludm9rZQEHc2V0Q29uZgIDa2V5A3ZhbAQGY2FsbGVyCQClCAEIBQZpbnZva2UGY2FsbGVyAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgMJAQhjb250YWlucwIFA2tleQIFY29uZl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUDa2V5BQN2YWwFA25pbAkAAgECIEVudHJpZXMgc3RhcnRpbmcgd2l0aCBjb25mXyBvbmx5CQACAQIiWW91IGFyZSBub3QgYWxsb3dlZCB0byBjaGFuZ2UgdGhpcwFpAQhhZGRFdmVudAYEbmFtZQtkZXNjcmlwdGlvbgR0YWdzCmNpZERpc3BsYXkHY3Jhd2xlcgRkYXRlBAskdDA4MTc3ODIyNgkBDGlkQ2FsbGVyRGF0ZQEFAWkEB2V2ZW50SWQIBQskdDA4MTc3ODIyNgJfMQQGY2FsbGVyCAULJHQwODE3NzgyMjYCXzIECWFkZGVkRGF0ZQgFCyR0MDgxNzc4MjI2Al8zBAljaGVja1VzZXIJAQx2YWxpZGF0ZVVzZXIBBQZjYWxsZXIDCQECIT0CBQljaGVja1VzZXICAAkAAgEFCWNoZWNrVXNlcgQNdmFsaWRhdGVFdmVudAkBEXZhbGlkYXRlRXZlbnREYXRhBgUGY2FsbGVyBQpjaWREaXNwbGF5BQRuYW1lBQtkZXNjcmlwdGlvbgUEdGFncwUEZGF0ZQMJAQIhPQIFDXZhbGlkYXRlRXZlbnQCAAkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEWtleUV2ZW50QWRkZWREYXRlAgUGY2FsbGVyBQdldmVudElkBQlhZGRlZERhdGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleUV2ZW50RGF0ZQIFBmNhbGxlcgUHZXZlbnRJZAUEZGF0ZQkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXZlbnROYW1lAgUGY2FsbGVyBQdldmVudElkBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlFdmVudERlc2MCBQZjYWxsZXIFB2V2ZW50SWQFC2Rlc2NyaXB0aW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIJARJrZXlFdmVudERpc3BsYXlDaWQCBQZjYWxsZXIFB2V2ZW50SWQFCmNpZERpc3BsYXkJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleUV2ZW50VGFncwIFBmNhbGxlcgUHZXZlbnRJZAUEdGFncwkAzAgCCQELU3RyaW5nRW50cnkCCQEPa2V5RXZlbnRDcmF3bGVyAgUGY2FsbGVyBQdldmVudElkBQdjcmF3bGVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEaa2V5RXZlbnRUb3RhbFRpY2tldHNJc3N1ZWQCBQZjYWxsZXIFB2V2ZW50SWQAAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBEGtleUV2ZW50Q2FuY2VsZWQCBQZjYWxsZXIFB2V2ZW50SWQHCQDMCAIJAQtTdHJpbmdFbnRyeQIJARZrZXlFdmVudE93bmVyQnlFdmVudElkAQUHZXZlbnRJZAUGY2FsbGVyBQNuaWwBaQEJZWRpdEV2ZW50BwdldmVudElkBG5hbWULZGVzY3JpcHRpb24EdGFncwpjaWREaXNwbGF5B2NyYXdsZXIEZGF0ZQMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwQGY2FsbGVyCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmNhbGxlcgMJAQIhPQIFCWNoZWNrVXNlcgIACQACAQUJY2hlY2tVc2VyBA12YWxpZGF0ZUV2ZW50CQERdmFsaWRhdGVFdmVudERhdGEGBQZjYWxsZXIFCmNpZERpc3BsYXkFBG5hbWUFC2Rlc2NyaXB0aW9uBQR0YWdzBQRkYXRlAwkBAiE9AgUNdmFsaWRhdGVFdmVudAIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAplbnRyeUV4aXN0CQEOZ2V0U3RyaW5nQnlLZXkBCQEMa2V5RXZlbnROYW1lAgUGY2FsbGVyBQdldmVudElkAwkAAAIFCmVudHJ5RXhpc3QCAAkAAgECD0VudHJ5IG5vdCBmb3VuZAQEZmxhZwkBDmdldFN0cmluZ0J5S2V5AQkBDGtleUV2ZW50RmxhZwIFBmNhbGxlcgUHZXZlbnRJZAMJAAACBQRmbGFnAgdJTExFR0FMCQACAQIbQ2Fubm90IHVwZGF0ZSBJTExFR0FMIEV2ZW50CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQxrZXlFdmVudE5hbWUCBQZjYWxsZXIFB2V2ZW50SWQFBG5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDGtleUV2ZW50RGF0ZQIFBmNhbGxlcgUHZXZlbnRJZAUEZGF0ZQkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXZlbnREZXNjAgUGY2FsbGVyBQdldmVudElkBQtkZXNjcmlwdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXZlbnRUYWdzAgUGY2FsbGVyBQdldmVudElkBQR0YWdzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9rZXlFdmVudENyYXdsZXICBQZjYWxsZXIFB2V2ZW50SWQFB2NyYXdsZXIFA25pbAFpAQtkZWxldGVFdmVudAEHZXZlbnRJZAQNJHQwMTA0NDYxMDQ5MAkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMTA0NDYxMDQ5MAJfMQQGY2FsbGVyCAUNJHQwMTA0NDYxMDQ5MAJfMgQJYWRkZWREYXRlCAUNJHQwMTA0NDYxMDQ5MAJfMwQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIDCQEBIQEJAQxpc0V2ZW50T3duZXICBQdldmVudElkBQZjYWxsZXIJAAIBAiNZb3UgYXJlIG5vdCB0aGUgb3duZXIgb2YgdGhpcyBldmVudAQNZXZlbnRUb3RhbE5GVAkBD2dldEludGVnZXJCeUtleQEJARprZXlFdmVudFRvdGFsVGlja2V0c0lzc3VlZAIFBmNhbGxlcgUHZXZlbnRJZAMJAQIhPQIFDWV2ZW50VG90YWxORlQAAAkAAgECLUNhbm5vdCBkZWxldGUgZXZlbnQgd2l0aCBhbHJlYWR5IHNvbGQgdGlja2V0cwQXdG90YWxUaWNrZXRUeXBlRm9yRXZlbnQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEYa2V5RXZlbnRUb3RhbFRpY2tldFR5cGVzAgUGY2FsbGVyBQdldmVudElkAwkAZgIFF3RvdGFsVGlja2V0VHlwZUZvckV2ZW50AAAJAAIBAhhEZWxldGUgYWxsIHRpY2tldHMgZmlyc3QJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEWtleUV2ZW50QWRkZWREYXRlAgUGY2FsbGVyBQdldmVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQxrZXlFdmVudERhdGUCBQZjYWxsZXIFB2V2ZW50SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDGtleUV2ZW50TmFtZQIFBmNhbGxlcgUHZXZlbnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEMa2V5RXZlbnREZXNjAgUGY2FsbGVyBQdldmVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARJrZXlFdmVudERpc3BsYXlDaWQCBQZjYWxsZXIFB2V2ZW50SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDGtleUV2ZW50VGFncwIFBmNhbGxlcgUHZXZlbnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEPa2V5RXZlbnRDcmF3bGVyAgUGY2FsbGVyBQdldmVudElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARprZXlFdmVudFRvdGFsVGlja2V0c0lzc3VlZAIFBmNhbGxlcgUHZXZlbnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEQa2V5RXZlbnRDYW5jZWxlZAIFBmNhbGxlcgUHZXZlbnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEWa2V5RXZlbnRPd25lckJ5RXZlbnRJZAEFB2V2ZW50SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBGGtleUV2ZW50VG90YWxUaWNrZXRUeXBlcwIFBmNhbGxlcgUHZXZlbnRJZAUDbmlsAWkBC2NhbmNlbEV2ZW50AgdldmVudElkBnJlYXNvbgQNJHQwMTE4MzExMTg3NQkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMTE4MzExMTg3NQJfMQQGY2FsbGVyCAUNJHQwMTE4MzExMTg3NQJfMgQJYWRkZWREYXRlCAUNJHQwMTE4MzExMTg3NQJfMwQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIDCQEBIQEJAQxpc0V2ZW50T3duZXICBQdldmVudElkBQZjYWxsZXIJAAIBAiNZb3UgYXJlIG5vdCB0aGUgb3duZXIgb2YgdGhpcyBldmVudAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBEGtleUV2ZW50Q2FuY2VsZWQCBQZjYWxsZXIFB2V2ZW50SWQGCQDMCAIJAQtTdHJpbmdFbnRyeQIJARZrZXlFdmVudENhbmNlbGVkUmVhc29uAgUGY2FsbGVyBQdldmVudElkBQZyZWFzb24FA25pbAFpAQlmbGFnRXZlbnQEB2V2ZW50SWQEYWRkcgRmbGFnBG5vdGUEDSR0MDEyMzEwMTIzNDMJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDEyMzEwMTIzNDMCXzEEBmNhbGxlcggFDSR0MDEyMzEwMTIzNDMCXzIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgIACQDMCAICD0NIQU5HRV9SRVFVSVJFRAkAzAgCAgdGTEFHR0VECQDMCAICB0lMTEVHQUwFA25pbAUEZmxhZwkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXZlbnRGbGFnAgUEYWRkcgUHZXZlbnRJZAUEZmxhZwkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXZlbnROb3RlAgUEYWRkcgUHZXZlbnRJZAUEbm90ZQUDbmlsCQACAQkArAICAg5Vbmtub3cgc3RhdHVzIAUEZmxhZwkAAgECE1lvdSBhcmUgbm90IGFsbG93ZWQBaQEJYWRkVGlja2V0BwdldmVudElkBG5hbWULZGVzY3JpcHRpb24FcHJpY2UMbWF4QXZhaWxhYmxlBk1heFVzZQlSb3lhbHRpZXMEDSR0MDEyODYwMTI5MDAJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDEyODYwMTI5MDACXzEEBmNhbGxlcggFDSR0MDEyODYwMTI5MDACXzIEBGRhdGUIBQ0kdDAxMjg2MDEyOTAwAl8zBAljaGVja1VzZXIJAQx2YWxpZGF0ZVVzZXIBBQZjYWxsZXIDCQECIT0CBQljaGVja1VzZXICAAkAAgEFCWNoZWNrVXNlcgMJAQ9ldmVudElzQ2FuY2VsZWQCBQZjYWxsZXIFB2V2ZW50SWQJAAIBAhhFdmVudCBoYXZlIGJlZW4gY2FuY2VsZWQDCQEBIQEJAQxpc0V2ZW50T3duZXICBQdldmVudElkBQZjYWxsZXIJAAIBAiNZb3UgYXJlIG5vdCB0aGUgb3duZXIgb2YgdGhpcyBldmVudAQOdmFsaWRhdGVUaWNrZXQJARJ2YWxpZGF0ZVRpY2tldERhdGEHBQdldmVudElkBQZjYWxsZXIFBG5hbWUFC2Rlc2NyaXB0aW9uBQVwcmljZQUMbWF4QXZhaWxhYmxlBQZNYXhVc2UDCQECIT0CBQ52YWxpZGF0ZVRpY2tldAIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBBd0b3RhbFRpY2tldFR5cGVGb3JFdmVudAkBD2dldEludGVnZXJCeUtleQEJARhrZXlFdmVudFRvdGFsVGlja2V0VHlwZXMCBQZjYWxsZXIFB2V2ZW50SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleVRpY2tldE5hbWUDBQZjYWxsZXIFB2V2ZW50SWQFAmlkBQRuYW1lCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQENa2V5VGlja2V0RGF0ZQMFBmNhbGxlcgUHZXZlbnRJZAUCaWQFBGRhdGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleVRpY2tldERlc2MDBQZjYWxsZXIFB2V2ZW50SWQFAmlkBQtkZXNjcmlwdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDmtleVRpY2tldFByaWNlAwUGY2FsbGVyBQdldmVudElkBQJpZAUFcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARVrZXlUaWNrZXRNYXhBdmFpbGFibGUDBQZjYWxsZXIFB2V2ZW50SWQFAmlkBQxtYXhBdmFpbGFibGUJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAQ9rZXlUaWNrZXRPblNhbGUDBQZjYWxsZXIFB2V2ZW50SWQFAmlkBgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBD2tleVRpY2tldE1heFVzZQMFBmNhbGxlcgUHZXZlbnRJZAUCaWQFBk1heFVzZQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleVRpY2tldFRvdGFsSXNzdWVkAwUGY2FsbGVyBQdldmVudElkBQJpZAAACQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEYa2V5RXZlbnRUb3RhbFRpY2tldFR5cGVzAgUGY2FsbGVyBQdldmVudElkCQBkAgUXdG90YWxUaWNrZXRUeXBlRm9yRXZlbnQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBEGtleVRpY2tldFJveWFsdHkDBQZjYWxsZXIFB2V2ZW50SWQFAmlkBQlSb3lhbHRpZXMFA25pbAFpAQplZGl0VGlja2V0CAh0aWNrZXRJZAdldmVudElkBG5hbWULZGVzY3JpcHRpb24FcHJpY2UMbWF4QXZhaWxhYmxlBm1heFVzZQlSb3lhbHRpZXMEDSR0MDE0NDk3MTQ1MzcJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDE0NDk3MTQ1MzcCXzEEBmNhbGxlcggFDSR0MDE0NDk3MTQ1MzcCXzIEBGRhdGUIBQ0kdDAxNDQ5NzE0NTM3Al8zBAljaGVja1VzZXIJAQx2YWxpZGF0ZVVzZXIBBQZjYWxsZXIDCQECIT0CBQljaGVja1VzZXICAAkAAgEFCWNoZWNrVXNlcgMJAQEhAQkBDGlzRXZlbnRPd25lcgIFB2V2ZW50SWQFBmNhbGxlcgkAAgECI1lvdSBhcmUgbm90IHRoZSBvd25lciBvZiB0aGlzIGV2ZW50AwkBASEBCQELdGlja2V0RXhpc3QDBQZjYWxsZXIFB2V2ZW50SWQFCHRpY2tldElkCQACAQIQVGlja2V0IG5vdCBmb3VuZAQOdmFsaWRhdGVUaWNrZXQJARJ2YWxpZGF0ZVRpY2tldERhdGEHBQdldmVudElkBQZjYWxsZXIFBG5hbWUFC2Rlc2NyaXB0aW9uBQVwcmljZQUMbWF4QXZhaWxhYmxlBQZtYXhVc2UDCQECIT0CBQ52YWxpZGF0ZVRpY2tldAIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAp0aWNrZXRTb2xkCQELdmFsdWVPckVsc2UCCQCfCAEJARRrZXlUaWNrZXRUb3RhbElzc3VlZAMFBmNhbGxlcgUHZXZlbnRJZAUIdGlja2V0SWQAAAMJAGYCBQp0aWNrZXRTb2xkBQxtYXhBdmFpbGFibGUJAAIBAj5NYXggdGlja2V0cyBhdmFpbGFibGUgY2Fubm90IGJlIGxvd2VyIHRoYW4gYW1vdW50IGFscmVhZHkgc29sZAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5VGlja2V0TmFtZQMFBmNhbGxlcgUHZXZlbnRJZAUIdGlja2V0SWQFBG5hbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleVRpY2tldERlc2MDBQZjYWxsZXIFB2V2ZW50SWQFCHRpY2tldElkBQtkZXNjcmlwdGlvbgkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDmtleVRpY2tldFByaWNlAwUGY2FsbGVyBQdldmVudElkBQh0aWNrZXRJZAUFcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARVrZXlUaWNrZXRNYXhBdmFpbGFibGUDBQZjYWxsZXIFB2V2ZW50SWQFCHRpY2tldElkBQxtYXhBdmFpbGFibGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ9rZXlUaWNrZXRNYXhVc2UDBQZjYWxsZXIFB2V2ZW50SWQFCHRpY2tldElkBQZtYXhVc2UJAMwIAgkBDEludGVnZXJFbnRyeQIJARBrZXlUaWNrZXRSb3lhbHR5AwUGY2FsbGVyBQdldmVudElkBQh0aWNrZXRJZAUJUm95YWx0aWVzBQNuaWwBaQEPcGF1c2VUaWNrZXRTYWxlAwdldmVudElkCHRpY2tldElkBnN0YXR1cwQNJHQwMTU3NTgxNTc5OAkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMTU3NTgxNTc5OAJfMQQGY2FsbGVyCAUNJHQwMTU3NTgxNTc5OAJfMgQEZGF0ZQgFDSR0MDE1NzU4MTU3OTgCXzMECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmNhbGxlcgMJAQIhPQIFCWNoZWNrVXNlcgIACQACAQUJY2hlY2tVc2VyAwkBASEBCQEMaXNFdmVudE93bmVyAgUHZXZlbnRJZAUGY2FsbGVyCQACAQIjWW91IGFyZSBub3QgdGhlIG93bmVyIG9mIHRoaXMgZXZlbnQDCQEBIQEJAQt0aWNrZXRFeGlzdAMFBmNhbGxlcgUHZXZlbnRJZAUIdGlja2V0SWQJAAIBAhBUaWNrZXQgbm90IGZvdW5kCQDMCAIJAQxCb29sZWFuRW50cnkCCQEPa2V5VGlja2V0T25TYWxlAwUGY2FsbGVyBQdldmVudElkBQh0aWNrZXRJZAUGc3RhdHVzBQNuaWwBaQEMZGVsZXRlVGlja2V0Agh0aWNrZXRJZAdldmVudElkBA0kdDAxNjI2MTE2MzAxCQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAxNjI2MTE2MzAxAl8xBAZjYWxsZXIIBQ0kdDAxNjI2MTE2MzAxAl8yBARkYXRlCAUNJHQwMTYyNjExNjMwMQJfMwQJY2hlY2tVc2VyCQEMdmFsaWRhdGVVc2VyAQUGY2FsbGVyAwkBAiE9AgUJY2hlY2tVc2VyAgAJAAIBBQljaGVja1VzZXIDCQEBIQEJAQxpc0V2ZW50T3duZXICBQdldmVudElkBQZjYWxsZXIJAAIBAiNZb3UgYXJlIG5vdCB0aGUgb3duZXIgb2YgdGhpcyBldmVudAMJAQEhAQkBC3RpY2tldEV4aXN0AwUGY2FsbGVyBQdldmVudElkBQh0aWNrZXRJZAkAAgECEFRpY2tldCBub3QgZm91bmQECmFtb3VudFNvbGQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEUa2V5VGlja2V0VG90YWxJc3N1ZWQDBQZjYWxsZXIFB2V2ZW50SWQFCHRpY2tldElkAwkBAiE9AgUKYW1vdW50U29sZAAACQACAQImQ2Fubm90IGRlbGV0ZSB0aWNrZXQgdGhhdCBzb2xkIGFscmVhZHkEF3RvdGFsVGlja2V0VHlwZUZvckV2ZW50CQEPZ2V0SW50ZWdlckJ5S2V5AQkBGGtleUV2ZW50VG90YWxUaWNrZXRUeXBlcwIFBmNhbGxlcgUHZXZlbnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5VGlja2V0TmFtZQMFBmNhbGxlcgUHZXZlbnRJZAUIdGlja2V0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleVRpY2tldERhdGUDBQZjYWxsZXIFB2V2ZW50SWQFCHRpY2tldElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ1rZXlUaWNrZXREZXNjAwUGY2FsbGVyBQdldmVudElkBQh0aWNrZXRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEOa2V5VGlja2V0UHJpY2UDBQZjYWxsZXIFB2V2ZW50SWQFCHRpY2tldElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARVrZXlUaWNrZXRNYXhBdmFpbGFibGUDBQZjYWxsZXIFB2V2ZW50SWQFCHRpY2tldElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ9rZXlUaWNrZXRPblNhbGUDBQZjYWxsZXIFB2V2ZW50SWQFCHRpY2tldElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ9rZXlUaWNrZXRNYXhVc2UDBQZjYWxsZXIFB2V2ZW50SWQFCHRpY2tldElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARRrZXlUaWNrZXRUb3RhbElzc3VlZAMFBmNhbGxlcgUHZXZlbnRJZAUIdGlja2V0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBEGtleVRpY2tldFJveWFsdHkDBQZjYWxsZXIFB2V2ZW50SWQFCHRpY2tldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEYa2V5RXZlbnRUb3RhbFRpY2tldFR5cGVzAgUGY2FsbGVyBQdldmVudElkCQBlAgUXdG90YWxUaWNrZXRUeXBlRm9yRXZlbnQAAQUDbmlsAWkBCWJ1eVRpY2tldAMIdGlja2V0SWQHZXZlbnRJZAZpc3N1ZXIEDSR0MDE3NjAyMTc2NDAJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDE3NjAyMTc2NDACXzEEBmNhbGxlcggFDSR0MDE3NjAyMTc2NDACXzIEBGRhdGUIBQ0kdDAxNzYwMjE3NjQwAl8zBAh0b3RhbE5GVAkBC3ZhbHVlT3JFbHNlAgkBD2dldEludGVnZXJCeUtleQECFHRvdGFsX3RpY2tldHNfaXNzdWVkAAADCQEBIQEJAQxpc0V2ZW50T3duZXICBQdldmVudElkBQZpc3N1ZXIJAAIBAh9FdmVudCBJRCBhbmQgSXNzdWVyIGRvbid0IG1hdGNoAwkBASEBCQELdGlja2V0RXhpc3QDBQZpc3N1ZXIFB2V2ZW50SWQFCHRpY2tldElkCQACAQIQVGlja2V0IG5vdCBmb3VuZAQJZXZlbnROYW1lCQEOZ2V0U3RyaW5nQnlLZXkBCQEMa2V5RXZlbnROYW1lAgUGaXNzdWVyBQdldmVudElkAwkAAAIFCWV2ZW50TmFtZQIACQACAQIRQXJ0IGRvZXNuJ3QgZXhpc3QDCQEPZXZlbnRJc0NhbmNlbGVkAgUGaXNzdWVyBQdldmVudElkCQACAQIYRXZlbnQgaGF2ZSBiZWVuIGNhbmNlbGVkBAhpc09uU2FsZQkBD2dldEJvb2xlYW5CeUtleQEJAQ9rZXlUaWNrZXRPblNhbGUDBQZpc3N1ZXIFB2V2ZW50SWQFCHRpY2tldElkAwkBASEBBQhpc09uU2FsZQkAAgECFFRpY2tldHMgbm90IGZvciBzYWxlBAphbW91bnRTb2xkCQEPZ2V0SW50ZWdlckJ5S2V5AQkBFGtleVRpY2tldFRvdGFsSXNzdWVkAwUGaXNzdWVyBQdldmVudElkBQh0aWNrZXRJZAQLdGlja2V0UHJpY2UJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEOa2V5VGlja2V0UHJpY2UDBQZpc3N1ZXIFB2V2ZW50SWQFCHRpY2tldElkBAxwcmljZUFzc2V0SWQJANgEAQULc2lnbkFzc2V0SWQEDSR0MDE4NDkzMTg1NjcJARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMFAWkFDHByaWNlQXNzZXRJZAULdGlja2V0UHJpY2UEBmFtb3VudAgFDSR0MDE4NDkzMTg1NjcCXzEEB2Fzc2V0SWQIBQ0kdDAxODQ5MzE4NTY3Al8yBAptYXhDYW5TZWxsCQEPZ2V0SW50ZWdlckJ5S2V5AQkBFWtleVRpY2tldE1heEF2YWlsYWJsZQMFBmlzc3VlcgUHZXZlbnRJZAUIdGlja2V0SWQEDWFtb3VudEZvclNpZ24JAGsDBQZhbW91bnQFB3NpZ25DdXQAZAQSYW1vdW50Rm9yT3JnYW5pemVyCQBlAgUGYW1vdW50BQ1hbW91bnRGb3JTaWduAwkAAAIFCmFtb3VudFNvbGQFCm1heENhblNlbGwJAAIBAgxBcnQgc29sZCBvdXQEDW5ld0Ftb3VudFNvbGQJAGQCBQphbW91bnRTb2xkAAEECWlzc3VlTWV0YQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICC09yZ2FuaXplcjogBQZpc3N1ZXICDCwKIEV2ZW50SUQ6IAUHZXZlbnRJZAINLAogVGlja2V0SUQ6IAUIdGlja2V0SWQCDiwKIEV2ZW50TmFtZTogBQlldmVudE5hbWUCCiwKIElzc3VlOiAJAKQDAQUNbmV3QW1vdW50U29sZAIBLwkApAMBBQptYXhDYW5TZWxsBAhpc3N1ZU5GVAkAwggFCQCsAgICA1NUXwkApAMBCQBkAgUIdG90YWxORlQAAQUJaXNzdWVNZXRhAAEAAAcEBWlkTkZUCQC4CAEFCGlzc3VlTkZUBApzZWxsU3RhdHVzAwkAAAIFDW5ld0Ftb3VudFNvbGQFCm1heENhblNlbGwHBgQKcmVjZWl2ZU5GVAgFAWkGY2FsbGVyBAdzb2xkS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIMdGlja2V0X3NvbGRfCQCkAwEFDW5ld0Ftb3VudFNvbGQCBF9vZl8JAKQDAQUKbWF4Q2FuU2VsbAIBXwUIdGlja2V0SWQCAV8FB2V2ZW50SWQCAV8FBmlzc3VlcgIBXwkA2AQBBQVpZE5GVAQJc29sZFZhbHVlCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApQgBBQpyZWNlaXZlTkZUAgFfCQCkAwEFBGRhdGUCAV8FAmlkAgFfCQCkAwEFBmFtb3VudAIBXwkA2AQBBQVpZE5GVAQIc29sZERhdGEJAQtTdHJpbmdFbnRyeQIFB3NvbGRLZXkFCXNvbGRWYWx1ZQQNZXZlbnRUb3RhbE5GVAkBD2dldEludGVnZXJCeUtleQEJARprZXlFdmVudFRvdGFsVGlja2V0c0lzc3VlZAIFBmlzc3VlcgUHZXZlbnRJZAQOdGlja2V0VG90YWxORlQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEUa2V5VGlja2V0VG90YWxJc3N1ZWQDBQZpc3N1ZXIFB2V2ZW50SWQFCHRpY2tldElkBAZidXlSZXMJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICAgRuZnRfCQDYBAEFBWlkTkZUBQdzb2xkS2V5CQDMCAIJAQxJbnRlZ2VyRW50cnkCAhR0b3RhbF90aWNrZXRzX2lzc3VlZAkAZAIFCHRvdGFsTkZUAAEJAMwIAgkBDEludGVnZXJFbnRyeQIJARprZXlFdmVudFRvdGFsVGlja2V0c0lzc3VlZAIFBmlzc3VlcgUHZXZlbnRJZAkAZAIFDWV2ZW50VG90YWxORlQAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgkBFGtleVRpY2tldFRvdGFsSXNzdWVkAwUGaXNzdWVyBQdldmVudElkBQh0aWNrZXRJZAUNbmV3QW1vdW50U29sZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIDU1RfCQCkAwEJAGQCBQh0b3RhbE5GVAABAghfYXNzZXRJZAkArAICCQCsAgIFCHRpY2tldElkAgFfCQDYBAEFBWlkTkZUCQDMCAIJAQxCb29sZWFuRW50cnkCCQEPa2V5VGlja2V0T25TYWxlAwUGaXNzdWVyBQdldmVudElkBQh0aWNrZXRJZAUKc2VsbFN0YXR1cwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBE2tleVRpY2tldEFtb3VudFVzZWQEBQZpc3N1ZXIFB2V2ZW50SWQFCHRpY2tldElkCQDYBAEFBWlkTkZUAAAJAMwIAgUIaXNzdWVORlQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmlzc3VlcgUSYW1vdW50Rm9yT3JnYW5pemVyBQdhc3NldElkCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCnJlY2VpdmVORlQAAQUFaWRORlQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC2ZlZVJlY2VpdmVyBQ1hbW91bnRGb3JTaWduBQdhc3NldElkBQNuaWwJAMwIAgUIc29sZERhdGEFBmJ1eVJlcwFpAQl1c2VUaWNrZXQABA0kdDAyMDcyNzIwNzY1CQEMaWRDYWxsZXJEYXRlAQUBaQQCaWQIBQ0kdDAyMDcyNzIwNzY1Al8xBAZjYWxsZXIIBQ0kdDAyMDcyNzIwNzY1Al8yBARkYXRlCAUNJHQwMjA3MjcyMDc2NQJfMwQNJHQwMjA3NzEyMDgwNwkBCWlzUGF5bWVudAEFAWkEB3BheW1lbnQIBQ0kdDAyMDc3MTIwODA3Al8xBAZhbW91bnQIBQ0kdDAyMDc3MTIwODA3Al8yAwkBASEBCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAkAAgECFFdyb25nIGFzc2V0IGF0dGFjaGVkBAlldmVudERhdGEJAQ5nZXRTdHJpbmdCeUtleQEJAKwCAgIEbmZ0XwkA2AQBCQEFdmFsdWUBCAUHcGF5bWVudAdhc3NldElkAwkAAAIJALECAQUJZXZlbnREYXRhAAAJAAIBAhRTb21ldGhpbmcgd2VudCB3cm9uZwQMZXZlbnREYXRhQXJyCQC1CQIFCWV2ZW50RGF0YQIBXwQGaXNzdWVyCQCRAwIFDGV2ZW50RGF0YUFycgAGBAdldmVudElkCQCRAwIFDGV2ZW50RGF0YUFycgAFBAh0aWNrZXRJZAkAkQMCBQxldmVudERhdGFBcnIABwMJAQEhAQkBC3RpY2tldEV4aXN0AwUGaXNzdWVyBQdldmVudElkBQh0aWNrZXRJZAkAAgECEFRpY2tldCBub3QgZm91bmQECmFtb3VudFVzZWQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQETa2V5VGlja2V0QW1vdW50VXNlZAQFBmlzc3VlcgUHZXZlbnRJZAUIdGlja2V0SWQJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAQMbWF4VXNpbmdUaW1lCQEPZ2V0SW50ZWdlckJ5S2V5AQkBD2tleVRpY2tldE1heFVzZQMFBmlzc3VlcgUHZXZlbnRJZAUIdGlja2V0SWQDCQAAAgUMbWF4VXNpbmdUaW1lBQphbW91bnRVc2VkCQACAQkArAICCQCsAgICDFRpY2tldCB1c2VkIAkApAMBBQphbW91bnRVc2VkAg4gdGltZXMgYWxyZWFkeQQLaW5pdFVzZURhdGEJAQ5nZXRTdHJpbmdCeUtleQEJARRrZXlUaWNrZXRIaXN0b3J5VXNlZAUFBmlzc3VlcgUHZXZlbnRJZAUIdGlja2V0SWQJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAIBMQQMZmlyc3RVc2VBZGRyAwMDCQBmAgUMbWF4VXNpbmdUaW1lAAEJAGcCBQphbW91bnRVc2VkAAEHCQECIT0CBQtpbml0VXNlRGF0YQIABwkAkQMCCQC1CQIFC2luaXRVc2VEYXRhAgFfAAEFBmNhbGxlcgMJAQIhPQIFDGZpcnN0VXNlQWRkcgUGY2FsbGVyCQACAQItWW91IGFyZSBub3QgdGhlIGluaXRpYWwgdXNlciBvZiB0aGlzIHRpY2tldC4gCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQETa2V5VGlja2V0QW1vdW50VXNlZAQFBmlzc3VlcgUHZXZlbnRJZAUIdGlja2V0SWQJANgEAQkBBXZhbHVlAQgFB3BheW1lbnQHYXNzZXRJZAkAZAIFCmFtb3VudFVzZWQAAQkAzAgCCQELU3RyaW5nRW50cnkCCQEUa2V5VGlja2V0SGlzdG9yeVVzZWQFBQZpc3N1ZXIFB2V2ZW50SWQFCHRpY2tldElkCQDYBAEJAQV2YWx1ZQEIBQdwYXltZW50B2Fzc2V0SWQJAKQDAQkAZAIFCmFtb3VudFVzZWQAAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUCaWQCAV8FBmNhbGxlcgIBXwkApAMBBQRkYXRlAgFfCQCkAwEJAGQCBQphbW91bnRVc2VkAAEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmNhbGxlcgABCAUHcGF5bWVudAdhc3NldElkBQNuaWwBaQELZGVsZXRlRW50cnkBBWVudHJ5BAZjYWxsZXIJAKUIAQgFAWkGY2FsbGVyAwkAAAIFBmNhbGxlcgUFY2hyaXMJAMwIAgkBC0RlbGV0ZUVudHJ5AQUFZW50cnkFA25pbAkAAgECAm5vAJGgf/c=", "height": 2306539, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DisqMyKBvz6QnzsR7Hjp2F4vrNrE7TB1RNm9KTjansmD Next: 8aLJx5ZwZpSvtNmjK5BH9AYFibUKt2bCiYwFweSX5X6a Diff:
OldNewDifferences
8282
8383
8484 func keyEventCanceledReason (caller,eventId) = ((("event_canceledReason_" + eventId) + "_") + caller)
85+
86+
87+func keyEventStartingPrice (caller,eventId) = ((("event_startingPrice_" + eventId) + "_") + caller)
8588
8689
8790 func keyTicketName (caller,eventId,ticketId) = ((((("ticket_name_" + eventId) + "_") + caller) + "_") + ticketId)
195198
196199
197200 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
198- let $t067086744 = isPayment(i)
199- let payment = $t067086744._1
200- let amount = $t067086744._2
201+ let $t068126848 = isPayment(i)
202+ let payment = $t068126848._1
203+ let amount = $t068126848._2
201204 if (!(isDefined(payment.assetId)))
202205 then throw("Wrong asset attached")
203206 else {
244247
245248 @Callable(i)
246249 func addEvent (name,description,tags,cidDisplay,crawler,date) = {
247- let $t080738122 = idCallerDate(i)
248- let eventId = $t080738122._1
249- let caller = $t080738122._2
250- let addedDate = $t080738122._3
250+ let $t081778226 = idCallerDate(i)
251+ let eventId = $t081778226._1
252+ let caller = $t081778226._2
253+ let addedDate = $t081778226._3
251254 let checkUser = validateUser(caller)
252255 if ((checkUser != ""))
253256 then throw(checkUser)
291294
292295 @Callable(i)
293296 func deleteEvent (eventId) = {
294- let $t01034210386 = idCallerDate(i)
295- let id = $t01034210386._1
296- let caller = $t01034210386._2
297- let addedDate = $t01034210386._3
297+ let $t01044610490 = idCallerDate(i)
298+ let id = $t01044610490._1
299+ let caller = $t01044610490._2
300+ let addedDate = $t01044610490._3
298301 let checkUser = validateUser(caller)
299302 if ((checkUser != ""))
300303 then throw(checkUser)
317320
318321 @Callable(i)
319322 func cancelEvent (eventId,reason) = {
320- let $t01172711771 = idCallerDate(i)
321- let id = $t01172711771._1
322- let caller = $t01172711771._2
323- let addedDate = $t01172711771._3
323+ let $t01183111875 = idCallerDate(i)
324+ let id = $t01183111875._1
325+ let caller = $t01183111875._2
326+ let addedDate = $t01183111875._3
324327 let checkUser = validateUser(caller)
325328 if ((checkUser != ""))
326329 then throw(checkUser)
333336
334337 @Callable(i)
335338 func flagEvent (eventId,addr,flag,note) = {
336- let $t01220612239 = idCallerDate(i)
337- let id = $t01220612239._1
338- let caller = $t01220612239._2
339+ let $t01231012343 = idCallerDate(i)
340+ let id = $t01231012343._1
341+ let caller = $t01231012343._2
339342 if (containsElement([chris, toString(this)], caller))
340343 then if (containsElement(["", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
341344 then [StringEntry(keyEventFlag(addr, eventId), flag), StringEntry(keyEventNote(addr, eventId), note)]
347350
348351 @Callable(i)
349352 func addTicket (eventId,name,description,price,maxAvailable,MaxUse,Royalties) = {
350- let $t01275612796 = idCallerDate(i)
351- let id = $t01275612796._1
352- let caller = $t01275612796._2
353- let date = $t01275612796._3
353+ let $t01286012900 = idCallerDate(i)
354+ let id = $t01286012900._1
355+ let caller = $t01286012900._2
356+ let date = $t01286012900._3
354357 let checkUser = validateUser(caller)
355358 if ((checkUser != ""))
356359 then throw(checkUser)
373376
374377 @Callable(i)
375378 func editTicket (ticketId,eventId,name,description,price,maxAvailable,maxUse,Royalties) = {
376- let $t01439414434 = idCallerDate(i)
377- let id = $t01439414434._1
378- let caller = $t01439414434._2
379- let date = $t01439414434._3
379+ let $t01449714537 = idCallerDate(i)
380+ let id = $t01449714537._1
381+ let caller = $t01449714537._2
382+ let date = $t01449714537._3
380383 let checkUser = validateUser(caller)
381384 if ((checkUser != ""))
382385 then throw(checkUser)
392395 let ticketSold = valueOrElse(getInteger(keyTicketTotalIssued(caller, eventId, ticketId)), 0)
393396 if ((ticketSold > maxAvailable))
394397 then throw("Max tickets available cannot be lower than amount already sold")
395- else [StringEntry(keyTicketName(caller, eventId, ticketId), name), StringEntry(keyTicketDesc(caller, eventId, ticketId), description), IntegerEntry(keyTicketPrice(caller, eventId, ticketId), price), IntegerEntry(keyTicketMaxAvailable(caller, eventId, ticketId), maxAvailable), IntegerEntry(keyTicketMaxUse(caller, eventId, ticketId), maxUse), IntegerEntry(keyTicketRoyalty(caller, eventId, id), Royalties)]
398+ else [StringEntry(keyTicketName(caller, eventId, ticketId), name), StringEntry(keyTicketDesc(caller, eventId, ticketId), description), IntegerEntry(keyTicketPrice(caller, eventId, ticketId), price), IntegerEntry(keyTicketMaxAvailable(caller, eventId, ticketId), maxAvailable), IntegerEntry(keyTicketMaxUse(caller, eventId, ticketId), maxUse), IntegerEntry(keyTicketRoyalty(caller, eventId, ticketId), Royalties)]
396399 }
397400 }
398401 }
401404
402405 @Callable(i)
403406 func pauseTicketSale (eventId,ticketId,status) = {
404- let $t01564915689 = idCallerDate(i)
405- let id = $t01564915689._1
406- let caller = $t01564915689._2
407- let date = $t01564915689._3
407+ let $t01575815798 = idCallerDate(i)
408+ let id = $t01575815798._1
409+ let caller = $t01575815798._2
410+ let date = $t01575815798._3
408411 let checkUser = validateUser(caller)
409412 if ((checkUser != ""))
410413 then throw(checkUser)
419422
420423 @Callable(i)
421424 func deleteTicket (ticketId,eventId) = {
422- let $t01615216192 = idCallerDate(i)
423- let id = $t01615216192._1
424- let caller = $t01615216192._2
425- let date = $t01615216192._3
425+ let $t01626116301 = idCallerDate(i)
426+ let id = $t01626116301._1
427+ let caller = $t01626116301._2
428+ let date = $t01626116301._3
426429 let checkUser = validateUser(caller)
427430 if ((checkUser != ""))
428431 then throw(checkUser)
445448
446449 @Callable(i)
447450 func buyTicket (ticketId,eventId,issuer) = {
448- let $t01749317531 = idCallerDate(i)
449- let id = $t01749317531._1
450- let caller = $t01749317531._2
451- let date = $t01749317531._3
451+ let $t01760217640 = idCallerDate(i)
452+ let id = $t01760217640._1
453+ let caller = $t01760217640._2
454+ let date = $t01760217640._3
452455 let totalNFT = valueOrElse(getIntegerByKey("total_tickets_issued"), 0)
453456 if (!(isEventOwner(eventId, issuer)))
454457 then throw("Event ID and Issuer don't match")
468471 let amountSold = getIntegerByKey(keyTicketTotalIssued(issuer, eventId, ticketId))
469472 let ticketPrice = getIntegerByKey(keyTicketPrice(issuer, eventId, ticketId))
470473 let priceAssetId = toBase58String(signAssetId)
471- let $t01838418458 = validatePriceAssetId(i, priceAssetId, ticketPrice)
472- let amount = $t01838418458._1
473- let assetId = $t01838418458._2
474+ let $t01849318567 = validatePriceAssetId(i, priceAssetId, ticketPrice)
475+ let amount = $t01849318567._1
476+ let assetId = $t01849318567._2
474477 let maxCanSell = getIntegerByKey(keyTicketMaxAvailable(issuer, eventId, ticketId))
475478 let amountForSign = fraction(amount, signCut, 100)
476479 let amountForOrganizer = (amount - amountForSign)
506509
507510 @Callable(i)
508511 func useTicket () = {
509- let $t02061820656 = idCallerDate(i)
510- let id = $t02061820656._1
511- let caller = $t02061820656._2
512- let date = $t02061820656._3
513- let $t02066220698 = isPayment(i)
514- let payment = $t02066220698._1
515- let amount = $t02066220698._2
512+ let $t02072720765 = idCallerDate(i)
513+ let id = $t02072720765._1
514+ let caller = $t02072720765._2
515+ let date = $t02072720765._3
516+ let $t02077120807 = isPayment(i)
517+ let payment = $t02077120807._1
518+ let amount = $t02077120807._2
516519 if (!(isDefined(payment.assetId)))
517520 then throw("Wrong asset attached")
518521 else {
531534 let maxUsingTime = getIntegerByKey(keyTicketMaxUse(issuer, eventId, ticketId))
532535 if ((maxUsingTime == amountUsed))
533536 then throw((("Ticket used " + toString(amountUsed)) + " times already"))
534- else [IntegerEntry(keyTicketAmountUsed(issuer, eventId, ticketId, toBase58String(value(payment.assetId))), (amountUsed + 1)), StringEntry(keyTicketHistoryUsed(issuer, eventId, ticketId, toBase58String(value(payment.assetId)), toString((amountUsed + 1))), ((((((id + "_") + caller) + "_") + toString(date)) + "_") + toString((amountUsed + 1)))), ScriptTransfer(Address(fromBase58String(caller)), 1, payment.assetId)]
537+ else {
538+ let initUseData = getStringByKey(keyTicketHistoryUsed(issuer, eventId, ticketId, toBase58String(value(payment.assetId)), "1"))
539+ let firstUseAddr = if (if (if ((maxUsingTime > 1))
540+ then (amountUsed >= 1)
541+ else false)
542+ then (initUseData != "")
543+ else false)
544+ then split(initUseData, "_")[1]
545+ else caller
546+ if ((firstUseAddr != caller))
547+ then throw("You are not the initial user of this ticket. ")
548+ else [IntegerEntry(keyTicketAmountUsed(issuer, eventId, ticketId, toBase58String(value(payment.assetId))), (amountUsed + 1)), StringEntry(keyTicketHistoryUsed(issuer, eventId, ticketId, toBase58String(value(payment.assetId)), toString((amountUsed + 1))), ((((((id + "_") + caller) + "_") + toString(date)) + "_") + toString((amountUsed + 1)))), ScriptTransfer(Address(fromBase58String(caller)), 1, payment.assetId)]
549+ }
535550 }
536551 }
537552 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let VERSION = "1.0.0"
55
66 func getStringByKey (key) = valueOrElse(getString(this, key), "")
77
88
99 let userDapp = value(addressFromString(getStringByKey("conf_users_dapp")))
1010
1111 let feeReceiver = getStringByKey("conf_fee_receiver")
1212
1313 let signAssetId = fromBase58String(getStringByKey("conf_accepted_asset_SIGN"))
1414
1515 let chris = getStringByKey("conf_admin_1")
1616
1717 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
1818
1919
2020 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
2121
2222
2323 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
2424
2525 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
2626
2727 let userSuspended = "SUSPENDED"
2828
2929 let userUnregistered = "UNREGISTERED"
3030
3131 func validateCID (cid) = if (contains(cid, "/"))
3232 then if (if ((76 > size(cid)))
3333 then (size(split(cid, "/")[0]) == 59)
3434 else false)
3535 then (16 > size(split(cid, "/")[1]))
3636 else false
3737 else false
3838
3939
4040 let signCut = 2
4141
4242 func keyUserStatus (caller) = ("user_status_" + caller)
4343
4444
4545 func keyEventOwnerByEventId (eventId) = ("get_event_owner_" + eventId)
4646
4747
4848 func keyEventAddedDate (caller,eventId) = ((("event_addedDate_" + eventId) + "_") + caller)
4949
5050
5151 func keyEventDate (caller,eventId) = ((("event_date_" + eventId) + "_") + caller)
5252
5353
5454 func keyEventName (caller,eventId) = ((("event_name_" + eventId) + "_") + caller)
5555
5656
5757 func keyEventDesc (caller,eventId) = ((("event_desc_" + eventId) + "_") + caller)
5858
5959
6060 func keyEventDisplayCid (caller,eventId) = ((("event_displayCid_" + eventId) + "_") + caller)
6161
6262
6363 func keyEventTags (caller,eventId) = ((("event_tags_" + eventId) + "_") + caller)
6464
6565
6666 func keyEventFlag (caller,eventId) = ((("event_flag_" + eventId) + "_") + caller)
6767
6868
6969 func keyEventNote (caller,eventId) = ((("event_note_" + eventId) + "_") + caller)
7070
7171
7272 func keyEventCrawler (caller,eventId) = ((("event_crawlerCid_" + eventId) + "_") + caller)
7373
7474
7575 func keyEventTotalTicketTypes (caller,eventId) = ((("event_totalTicketTypes_" + eventId) + "_") + caller)
7676
7777
7878 func keyEventTotalTicketsIssued (caller,eventId) = ((("event_totalIssued_" + eventId) + "_") + caller)
7979
8080
8181 func keyEventCanceled (caller,eventId) = ((("event_canceled_" + eventId) + "_") + caller)
8282
8383
8484 func keyEventCanceledReason (caller,eventId) = ((("event_canceledReason_" + eventId) + "_") + caller)
85+
86+
87+func keyEventStartingPrice (caller,eventId) = ((("event_startingPrice_" + eventId) + "_") + caller)
8588
8689
8790 func keyTicketName (caller,eventId,ticketId) = ((((("ticket_name_" + eventId) + "_") + caller) + "_") + ticketId)
8891
8992
9093 func keyTicketDesc (caller,eventId,ticketId) = ((((("ticket_desc_" + eventId) + "_") + caller) + "_") + ticketId)
9194
9295
9396 func keyTicketPrice (caller,eventId,ticketId) = ((((("ticket_price_" + eventId) + "_") + caller) + "_") + ticketId)
9497
9598
9699 func keyTicketDate (caller,eventId,ticketId) = ((((("ticket_date_" + eventId) + "_") + caller) + "_") + ticketId)
97100
98101
99102 func keyTicketMaxAvailable (caller,eventId,ticketId) = ((((("ticket_maxAvailable_" + eventId) + "_") + caller) + "_") + ticketId)
100103
101104
102105 func keyTicketOnSale (caller,eventId,ticketId) = ((((("ticket_onSale_" + eventId) + "_") + caller) + "_") + ticketId)
103106
104107
105108 func keyTicketAmountUsed (caller,eventId,ticketId,nftId) = ((((((("ticket_amountUsed_" + eventId) + "_") + caller) + "_") + ticketId) + "_") + nftId)
106109
107110
108111 func keyTicketHistoryUsed (caller,eventId,ticketId,nftId,usageIndex) = ((((((((("ticket_historyUsed_" + eventId) + "_") + caller) + "_") + ticketId) + "_") + nftId) + "_") + usageIndex)
109112
110113
111114 func keyTicketMaxUse (caller,eventId,ticketId) = ((((("ticket_maxUse_" + eventId) + "_") + caller) + "_") + ticketId)
112115
113116
114117 func keyTicketTotalIssued (caller,eventId,ticketId) = ((((("ticket_totalIssued_" + eventId) + "_") + caller) + "_") + ticketId)
115118
116119
117120 func keyTicketRoyalty (caller,eventId,ticketId) = ((((("ticket_royalties_" + eventId) + "_") + caller) + "_") + ticketId)
118121
119122
120123 func validateString (str,max) = if ((size(str) == 0))
121124 then throw("Field cannot be is empty")
122125 else if ((size(str) > max))
123126 then throw((str + " is too long"))
124127 else true
125128
126129
127130 func validateInt (num) = (0 > num)
128131
129132
130133 func getEventOwnerByEventId (eventId) = valueOrElse(getString(this, keyEventOwnerByEventId(eventId)), "")
131134
132135
133136 func validateUser (caller) = {
134137 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
135138 if ((userStatus == userUnregistered))
136139 then "Register this account first with \"Account\" tab"
137140 else if ((userStatus == userSuspended))
138141 then "Account suspended"
139142 else ""
140143 }
141144
142145
143146 func validateEventData (caller,cidDisplay,name,description,tags,date) = {
144147 let checkUser = validateUser(caller)
145148 if ((checkUser != ""))
146149 then throw(checkUser)
147150 else if ((size(cidDisplay) == 0))
148151 then throw("Display CID cannot be empty")
149152 else if (!(validateCID(cidDisplay)))
150153 then throw("Problem with CID")
151154 else if (!(validateString(name, 300)))
152155 then throw("300 Char. max name")
153156 else if (!(validateString(description, 3000)))
154157 then throw("3000 Char. max description")
155158 else if (!(validateString(date, 1000)))
156159 then throw("1000 Char. max date")
157160 else if ((size(split(tags, ",")) > 5))
158161 then throw("5 tags max.")
159162 else ""
160163 }
161164
162165
163166 func validateTicketData (eventId,caller,name,description,price,maxAvailable,maxUse) = {
164167 let checkUser = validateUser(caller)
165168 if ((checkUser != ""))
166169 then throw(checkUser)
167170 else if (!(validateString(name, 200)))
168171 then throw("100 Char. max name")
169172 else if (!(validateString(description, 1000)))
170173 then throw("1000 Char. max description")
171174 else if (if (if (validateInt(price))
172175 then true
173176 else validateInt(maxUse))
174177 then true
175178 else validateInt(maxAvailable))
176179 then throw("Positive amount only")
177180 else if (!(validateString(description, 1000)))
178181 then throw("1000 Char. max description")
179182 else ""
180183 }
181184
182185
183186 func idCallerDate (i) = if (!(dappRunning))
184187 then throw(maintenanceMSG)
185188 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
186189
187190
188191 func isPayment (i) = if ((size(i.payments) == 0))
189192 then throw("No payment attached")
190193 else {
191194 let payment = value(i.payments[0])
192195 let amount = value(payment.amount)
193196 $Tuple2(payment, amount)
194197 }
195198
196199
197200 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
198- let $t067086744 = isPayment(i)
199- let payment = $t067086744._1
200- let amount = $t067086744._2
201+ let $t068126848 = isPayment(i)
202+ let payment = $t068126848._1
203+ let amount = $t068126848._2
201204 if (!(isDefined(payment.assetId)))
202205 then throw("Wrong asset attached")
203206 else {
204207 let assetId = if (if ((size(priceAssetId) > 0))
205208 then (toBase58String(value(payment.assetId)) == priceAssetId)
206209 else false)
207210 then payment.assetId
208211 else throw("Wrong asset attached")
209212 if ((artworkPrice != amount))
210213 then throw("Payment amount don't match")
211214 else $Tuple2(amount, assetId)
212215 }
213216 }
214217
215218
216219 func isEventOwner (eventId,caller) = {
217220 let eventOwner = getEventOwnerByEventId(eventId)
218221 if ((eventOwner == ""))
219222 then throw("Event not found")
220223 else (eventOwner == caller)
221224 }
222225
223226
224227 func ticketExist (caller,eventId,ticketId) = {
225228 let ticket = getStringByKey(keyTicketName(caller, eventId, ticketId))
226229 (size(ticket) != 0)
227230 }
228231
229232
230233 func eventIsCanceled (issuer,eventId) = getBooleanByKey(keyEventCanceled(issuer, eventId))
231234
232235
233236 @Callable(invoke)
234237 func setConf (key,val) = {
235238 let caller = toString(invoke.caller)
236239 if (containsElement([chris, toString(this)], caller))
237240 then if (contains(key, "conf_"))
238241 then [StringEntry(key, val)]
239242 else throw("Entries starting with conf_ only")
240243 else throw("You are not allowed to change this")
241244 }
242245
243246
244247
245248 @Callable(i)
246249 func addEvent (name,description,tags,cidDisplay,crawler,date) = {
247- let $t080738122 = idCallerDate(i)
248- let eventId = $t080738122._1
249- let caller = $t080738122._2
250- let addedDate = $t080738122._3
250+ let $t081778226 = idCallerDate(i)
251+ let eventId = $t081778226._1
252+ let caller = $t081778226._2
253+ let addedDate = $t081778226._3
251254 let checkUser = validateUser(caller)
252255 if ((checkUser != ""))
253256 then throw(checkUser)
254257 else {
255258 let validateEvent = validateEventData(caller, cidDisplay, name, description, tags, date)
256259 if ((validateEvent != ""))
257260 then throw("Something went wrong!")
258261 else [IntegerEntry(keyEventAddedDate(caller, eventId), addedDate), StringEntry(keyEventDate(caller, eventId), date), StringEntry(keyEventName(caller, eventId), name), StringEntry(keyEventDesc(caller, eventId), description), StringEntry(keyEventDisplayCid(caller, eventId), cidDisplay), StringEntry(keyEventTags(caller, eventId), tags), StringEntry(keyEventCrawler(caller, eventId), crawler), IntegerEntry(keyEventTotalTicketsIssued(caller, eventId), 0), BooleanEntry(keyEventCanceled(caller, eventId), false), StringEntry(keyEventOwnerByEventId(eventId), caller)]
259262 }
260263 }
261264
262265
263266
264267 @Callable(i)
265268 func editEvent (eventId,name,description,tags,cidDisplay,crawler,date) = if (!(dappRunning))
266269 then throw(maintenanceMSG)
267270 else {
268271 let caller = toBase58String(i.caller.bytes)
269272 let checkUser = validateUser(caller)
270273 if ((checkUser != ""))
271274 then throw(checkUser)
272275 else {
273276 let validateEvent = validateEventData(caller, cidDisplay, name, description, tags, date)
274277 if ((validateEvent != ""))
275278 then throw("Something went wrong!")
276279 else {
277280 let entryExist = getStringByKey(keyEventName(caller, eventId))
278281 if ((entryExist == ""))
279282 then throw("Entry not found")
280283 else {
281284 let flag = getStringByKey(keyEventFlag(caller, eventId))
282285 if ((flag == "ILLEGAL"))
283286 then throw("Cannot update ILLEGAL Event")
284287 else [StringEntry(keyEventName(caller, eventId), name), StringEntry(keyEventDate(caller, eventId), date), StringEntry(keyEventDesc(caller, eventId), description), StringEntry(keyEventTags(caller, eventId), tags), StringEntry(keyEventCrawler(caller, eventId), crawler)]
285288 }
286289 }
287290 }
288291 }
289292
290293
291294
292295 @Callable(i)
293296 func deleteEvent (eventId) = {
294- let $t01034210386 = idCallerDate(i)
295- let id = $t01034210386._1
296- let caller = $t01034210386._2
297- let addedDate = $t01034210386._3
297+ let $t01044610490 = idCallerDate(i)
298+ let id = $t01044610490._1
299+ let caller = $t01044610490._2
300+ let addedDate = $t01044610490._3
298301 let checkUser = validateUser(caller)
299302 if ((checkUser != ""))
300303 then throw(checkUser)
301304 else if (!(isEventOwner(eventId, caller)))
302305 then throw("You are not the owner of this event")
303306 else {
304307 let eventTotalNFT = getIntegerByKey(keyEventTotalTicketsIssued(caller, eventId))
305308 if ((eventTotalNFT != 0))
306309 then throw("Cannot delete event with already sold tickets")
307310 else {
308311 let totalTicketTypeForEvent = getIntegerByKey(keyEventTotalTicketTypes(caller, eventId))
309312 if ((totalTicketTypeForEvent > 0))
310313 then throw("Delete all tickets first")
311314 else [DeleteEntry(keyEventAddedDate(caller, eventId)), DeleteEntry(keyEventDate(caller, eventId)), DeleteEntry(keyEventName(caller, eventId)), DeleteEntry(keyEventDesc(caller, eventId)), DeleteEntry(keyEventDisplayCid(caller, eventId)), DeleteEntry(keyEventTags(caller, eventId)), DeleteEntry(keyEventCrawler(caller, eventId)), DeleteEntry(keyEventTotalTicketsIssued(caller, eventId)), DeleteEntry(keyEventCanceled(caller, eventId)), DeleteEntry(keyEventOwnerByEventId(eventId)), DeleteEntry(keyEventTotalTicketTypes(caller, eventId))]
312315 }
313316 }
314317 }
315318
316319
317320
318321 @Callable(i)
319322 func cancelEvent (eventId,reason) = {
320- let $t01172711771 = idCallerDate(i)
321- let id = $t01172711771._1
322- let caller = $t01172711771._2
323- let addedDate = $t01172711771._3
323+ let $t01183111875 = idCallerDate(i)
324+ let id = $t01183111875._1
325+ let caller = $t01183111875._2
326+ let addedDate = $t01183111875._3
324327 let checkUser = validateUser(caller)
325328 if ((checkUser != ""))
326329 then throw(checkUser)
327330 else if (!(isEventOwner(eventId, caller)))
328331 then throw("You are not the owner of this event")
329332 else [BooleanEntry(keyEventCanceled(caller, eventId), true), StringEntry(keyEventCanceledReason(caller, eventId), reason)]
330333 }
331334
332335
333336
334337 @Callable(i)
335338 func flagEvent (eventId,addr,flag,note) = {
336- let $t01220612239 = idCallerDate(i)
337- let id = $t01220612239._1
338- let caller = $t01220612239._2
339+ let $t01231012343 = idCallerDate(i)
340+ let id = $t01231012343._1
341+ let caller = $t01231012343._2
339342 if (containsElement([chris, toString(this)], caller))
340343 then if (containsElement(["", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
341344 then [StringEntry(keyEventFlag(addr, eventId), flag), StringEntry(keyEventNote(addr, eventId), note)]
342345 else throw(("Unknow status " + flag))
343346 else throw("You are not allowed")
344347 }
345348
346349
347350
348351 @Callable(i)
349352 func addTicket (eventId,name,description,price,maxAvailable,MaxUse,Royalties) = {
350- let $t01275612796 = idCallerDate(i)
351- let id = $t01275612796._1
352- let caller = $t01275612796._2
353- let date = $t01275612796._3
353+ let $t01286012900 = idCallerDate(i)
354+ let id = $t01286012900._1
355+ let caller = $t01286012900._2
356+ let date = $t01286012900._3
354357 let checkUser = validateUser(caller)
355358 if ((checkUser != ""))
356359 then throw(checkUser)
357360 else if (eventIsCanceled(caller, eventId))
358361 then throw("Event have been canceled")
359362 else if (!(isEventOwner(eventId, caller)))
360363 then throw("You are not the owner of this event")
361364 else {
362365 let validateTicket = validateTicketData(eventId, caller, name, description, price, maxAvailable, MaxUse)
363366 if ((validateTicket != ""))
364367 then throw("Something went wrong!")
365368 else {
366369 let totalTicketTypeForEvent = getIntegerByKey(keyEventTotalTicketTypes(caller, eventId))
367370 [StringEntry(keyTicketName(caller, eventId, id), name), IntegerEntry(keyTicketDate(caller, eventId, id), date), StringEntry(keyTicketDesc(caller, eventId, id), description), IntegerEntry(keyTicketPrice(caller, eventId, id), price), IntegerEntry(keyTicketMaxAvailable(caller, eventId, id), maxAvailable), BooleanEntry(keyTicketOnSale(caller, eventId, id), true), IntegerEntry(keyTicketMaxUse(caller, eventId, id), MaxUse), IntegerEntry(keyTicketTotalIssued(caller, eventId, id), 0), IntegerEntry(keyEventTotalTicketTypes(caller, eventId), (totalTicketTypeForEvent + 1)), IntegerEntry(keyTicketRoyalty(caller, eventId, id), Royalties)]
368371 }
369372 }
370373 }
371374
372375
373376
374377 @Callable(i)
375378 func editTicket (ticketId,eventId,name,description,price,maxAvailable,maxUse,Royalties) = {
376- let $t01439414434 = idCallerDate(i)
377- let id = $t01439414434._1
378- let caller = $t01439414434._2
379- let date = $t01439414434._3
379+ let $t01449714537 = idCallerDate(i)
380+ let id = $t01449714537._1
381+ let caller = $t01449714537._2
382+ let date = $t01449714537._3
380383 let checkUser = validateUser(caller)
381384 if ((checkUser != ""))
382385 then throw(checkUser)
383386 else if (!(isEventOwner(eventId, caller)))
384387 then throw("You are not the owner of this event")
385388 else if (!(ticketExist(caller, eventId, ticketId)))
386389 then throw("Ticket not found")
387390 else {
388391 let validateTicket = validateTicketData(eventId, caller, name, description, price, maxAvailable, maxUse)
389392 if ((validateTicket != ""))
390393 then throw("Something went wrong!")
391394 else {
392395 let ticketSold = valueOrElse(getInteger(keyTicketTotalIssued(caller, eventId, ticketId)), 0)
393396 if ((ticketSold > maxAvailable))
394397 then throw("Max tickets available cannot be lower than amount already sold")
395- else [StringEntry(keyTicketName(caller, eventId, ticketId), name), StringEntry(keyTicketDesc(caller, eventId, ticketId), description), IntegerEntry(keyTicketPrice(caller, eventId, ticketId), price), IntegerEntry(keyTicketMaxAvailable(caller, eventId, ticketId), maxAvailable), IntegerEntry(keyTicketMaxUse(caller, eventId, ticketId), maxUse), IntegerEntry(keyTicketRoyalty(caller, eventId, id), Royalties)]
398+ else [StringEntry(keyTicketName(caller, eventId, ticketId), name), StringEntry(keyTicketDesc(caller, eventId, ticketId), description), IntegerEntry(keyTicketPrice(caller, eventId, ticketId), price), IntegerEntry(keyTicketMaxAvailable(caller, eventId, ticketId), maxAvailable), IntegerEntry(keyTicketMaxUse(caller, eventId, ticketId), maxUse), IntegerEntry(keyTicketRoyalty(caller, eventId, ticketId), Royalties)]
396399 }
397400 }
398401 }
399402
400403
401404
402405 @Callable(i)
403406 func pauseTicketSale (eventId,ticketId,status) = {
404- let $t01564915689 = idCallerDate(i)
405- let id = $t01564915689._1
406- let caller = $t01564915689._2
407- let date = $t01564915689._3
407+ let $t01575815798 = idCallerDate(i)
408+ let id = $t01575815798._1
409+ let caller = $t01575815798._2
410+ let date = $t01575815798._3
408411 let checkUser = validateUser(caller)
409412 if ((checkUser != ""))
410413 then throw(checkUser)
411414 else if (!(isEventOwner(eventId, caller)))
412415 then throw("You are not the owner of this event")
413416 else if (!(ticketExist(caller, eventId, ticketId)))
414417 then throw("Ticket not found")
415418 else [BooleanEntry(keyTicketOnSale(caller, eventId, ticketId), status)]
416419 }
417420
418421
419422
420423 @Callable(i)
421424 func deleteTicket (ticketId,eventId) = {
422- let $t01615216192 = idCallerDate(i)
423- let id = $t01615216192._1
424- let caller = $t01615216192._2
425- let date = $t01615216192._3
425+ let $t01626116301 = idCallerDate(i)
426+ let id = $t01626116301._1
427+ let caller = $t01626116301._2
428+ let date = $t01626116301._3
426429 let checkUser = validateUser(caller)
427430 if ((checkUser != ""))
428431 then throw(checkUser)
429432 else if (!(isEventOwner(eventId, caller)))
430433 then throw("You are not the owner of this event")
431434 else if (!(ticketExist(caller, eventId, ticketId)))
432435 then throw("Ticket not found")
433436 else {
434437 let amountSold = getIntegerByKey(keyTicketTotalIssued(caller, eventId, ticketId))
435438 if ((amountSold != 0))
436439 then throw("Cannot delete ticket that sold already")
437440 else {
438441 let totalTicketTypeForEvent = getIntegerByKey(keyEventTotalTicketTypes(caller, eventId))
439442 [DeleteEntry(keyTicketName(caller, eventId, ticketId)), DeleteEntry(keyTicketDate(caller, eventId, ticketId)), DeleteEntry(keyTicketDesc(caller, eventId, ticketId)), DeleteEntry(keyTicketPrice(caller, eventId, ticketId)), DeleteEntry(keyTicketMaxAvailable(caller, eventId, ticketId)), DeleteEntry(keyTicketOnSale(caller, eventId, ticketId)), DeleteEntry(keyTicketMaxUse(caller, eventId, ticketId)), DeleteEntry(keyTicketTotalIssued(caller, eventId, ticketId)), DeleteEntry(keyTicketRoyalty(caller, eventId, ticketId)), IntegerEntry(keyEventTotalTicketTypes(caller, eventId), (totalTicketTypeForEvent - 1))]
440443 }
441444 }
442445 }
443446
444447
445448
446449 @Callable(i)
447450 func buyTicket (ticketId,eventId,issuer) = {
448- let $t01749317531 = idCallerDate(i)
449- let id = $t01749317531._1
450- let caller = $t01749317531._2
451- let date = $t01749317531._3
451+ let $t01760217640 = idCallerDate(i)
452+ let id = $t01760217640._1
453+ let caller = $t01760217640._2
454+ let date = $t01760217640._3
452455 let totalNFT = valueOrElse(getIntegerByKey("total_tickets_issued"), 0)
453456 if (!(isEventOwner(eventId, issuer)))
454457 then throw("Event ID and Issuer don't match")
455458 else if (!(ticketExist(issuer, eventId, ticketId)))
456459 then throw("Ticket not found")
457460 else {
458461 let eventName = getStringByKey(keyEventName(issuer, eventId))
459462 if ((eventName == ""))
460463 then throw("Art doesn't exist")
461464 else if (eventIsCanceled(issuer, eventId))
462465 then throw("Event have been canceled")
463466 else {
464467 let isOnSale = getBooleanByKey(keyTicketOnSale(issuer, eventId, ticketId))
465468 if (!(isOnSale))
466469 then throw("Tickets not for sale")
467470 else {
468471 let amountSold = getIntegerByKey(keyTicketTotalIssued(issuer, eventId, ticketId))
469472 let ticketPrice = getIntegerByKey(keyTicketPrice(issuer, eventId, ticketId))
470473 let priceAssetId = toBase58String(signAssetId)
471- let $t01838418458 = validatePriceAssetId(i, priceAssetId, ticketPrice)
472- let amount = $t01838418458._1
473- let assetId = $t01838418458._2
474+ let $t01849318567 = validatePriceAssetId(i, priceAssetId, ticketPrice)
475+ let amount = $t01849318567._1
476+ let assetId = $t01849318567._2
474477 let maxCanSell = getIntegerByKey(keyTicketMaxAvailable(issuer, eventId, ticketId))
475478 let amountForSign = fraction(amount, signCut, 100)
476479 let amountForOrganizer = (amount - amountForSign)
477480 if ((amountSold == maxCanSell))
478481 then throw("Art sold out")
479482 else {
480483 let newAmountSold = (amountSold + 1)
481484 let issueMeta = ((((((((((("Organizer: " + issuer) + ",
482485 EventID: ") + eventId) + ",
483486 TicketID: ") + ticketId) + ",
484487 EventName: ") + eventName) + ",
485488 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
486489 let issueNFT = Issue(("ST_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
487490 let idNFT = calculateAssetId(issueNFT)
488491 let sellStatus = if ((newAmountSold == maxCanSell))
489492 then false
490493 else true
491494 let receiveNFT = i.caller
492495 let soldKey = ((((((((((("ticket_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + ticketId) + "_") + eventId) + "_") + issuer) + "_") + toBase58String(idNFT))
493496 let soldValue = ((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + toBase58String(idNFT))
494497 let soldData = StringEntry(soldKey, soldValue)
495498 let eventTotalNFT = getIntegerByKey(keyEventTotalTicketsIssued(issuer, eventId))
496499 let ticketTotalNFT = getIntegerByKey(keyTicketTotalIssued(issuer, eventId, ticketId))
497500 let buyRes = [StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_tickets_issued", (totalNFT + 1)), IntegerEntry(keyEventTotalTicketsIssued(issuer, eventId), (eventTotalNFT + 1)), IntegerEntry(keyTicketTotalIssued(issuer, eventId, ticketId), newAmountSold), StringEntry((("ST_" + toString((totalNFT + 1))) + "_assetId"), ((ticketId + "_") + toBase58String(idNFT))), BooleanEntry(keyTicketOnSale(issuer, eventId, ticketId), sellStatus), IntegerEntry(keyTicketAmountUsed(issuer, eventId, ticketId, toBase58String(idNFT)), 0), issueNFT, ScriptTransfer(Address(fromBase58String(issuer)), amountForOrganizer, assetId), ScriptTransfer(receiveNFT, 1, idNFT), ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
498501 soldData :: buyRes
499502 }
500503 }
501504 }
502505 }
503506 }
504507
505508
506509
507510 @Callable(i)
508511 func useTicket () = {
509- let $t02061820656 = idCallerDate(i)
510- let id = $t02061820656._1
511- let caller = $t02061820656._2
512- let date = $t02061820656._3
513- let $t02066220698 = isPayment(i)
514- let payment = $t02066220698._1
515- let amount = $t02066220698._2
512+ let $t02072720765 = idCallerDate(i)
513+ let id = $t02072720765._1
514+ let caller = $t02072720765._2
515+ let date = $t02072720765._3
516+ let $t02077120807 = isPayment(i)
517+ let payment = $t02077120807._1
518+ let amount = $t02077120807._2
516519 if (!(isDefined(payment.assetId)))
517520 then throw("Wrong asset attached")
518521 else {
519522 let eventData = getStringByKey(("nft_" + toBase58String(value(payment.assetId))))
520523 if ((size(eventData) == 0))
521524 then throw("Something went wrong")
522525 else {
523526 let eventDataArr = split(eventData, "_")
524527 let issuer = eventDataArr[6]
525528 let eventId = eventDataArr[5]
526529 let ticketId = eventDataArr[7]
527530 if (!(ticketExist(issuer, eventId, ticketId)))
528531 then throw("Ticket not found")
529532 else {
530533 let amountUsed = getIntegerByKey(keyTicketAmountUsed(issuer, eventId, ticketId, toBase58String(value(payment.assetId))))
531534 let maxUsingTime = getIntegerByKey(keyTicketMaxUse(issuer, eventId, ticketId))
532535 if ((maxUsingTime == amountUsed))
533536 then throw((("Ticket used " + toString(amountUsed)) + " times already"))
534- else [IntegerEntry(keyTicketAmountUsed(issuer, eventId, ticketId, toBase58String(value(payment.assetId))), (amountUsed + 1)), StringEntry(keyTicketHistoryUsed(issuer, eventId, ticketId, toBase58String(value(payment.assetId)), toString((amountUsed + 1))), ((((((id + "_") + caller) + "_") + toString(date)) + "_") + toString((amountUsed + 1)))), ScriptTransfer(Address(fromBase58String(caller)), 1, payment.assetId)]
537+ else {
538+ let initUseData = getStringByKey(keyTicketHistoryUsed(issuer, eventId, ticketId, toBase58String(value(payment.assetId)), "1"))
539+ let firstUseAddr = if (if (if ((maxUsingTime > 1))
540+ then (amountUsed >= 1)
541+ else false)
542+ then (initUseData != "")
543+ else false)
544+ then split(initUseData, "_")[1]
545+ else caller
546+ if ((firstUseAddr != caller))
547+ then throw("You are not the initial user of this ticket. ")
548+ else [IntegerEntry(keyTicketAmountUsed(issuer, eventId, ticketId, toBase58String(value(payment.assetId))), (amountUsed + 1)), StringEntry(keyTicketHistoryUsed(issuer, eventId, ticketId, toBase58String(value(payment.assetId)), toString((amountUsed + 1))), ((((((id + "_") + caller) + "_") + toString(date)) + "_") + toString((amountUsed + 1)))), ScriptTransfer(Address(fromBase58String(caller)), 1, payment.assetId)]
549+ }
535550 }
536551 }
537552 }
538553 }
539554
540555
541556
542557 @Callable(i)
543558 func deleteEntry (entry) = {
544559 let caller = toString(i.caller)
545560 if ((caller == chris))
546561 then [DeleteEntry(entry)]
547562 else throw("no")
548563 }
549564
550565

github/deemru/w8io/c3f4982 
78.29 ms