tx · EPvAJyYEXTj4EffmiSfT7qWQ6StGtdzQyb4tzTQ3W17f

3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY:  -0.02200000 Waves

2022.11.23 12:36 [2329569] smart account 3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY > SELF 0.00000000 Waves

{ "type": 13, "id": "EPvAJyYEXTj4EffmiSfT7qWQ6StGtdzQyb4tzTQ3W17f", "fee": 2200000, "feeAssetId": null, "timestamp": 1669196198526, "version": 2, "chainId": 84, "sender": "3NBynfbXC2KastUxhukcMUaE58K9cBdB9UY", "senderPublicKey": "J9DCtJJxJBWZdtDR12BA1U94Q3cZzMi4R6k5hYkAzmzC", "proofs": [ "2iX1yAqv7uusSU1gyLuYVnCjy4UjWwTcQ3W2AkAP576XEUeQSADJU8AZpdGHymJVkFsu2nmqX6RgYRTiKzw7kcza" ], "script": "base64:BgJaCAISBAoCCAgSDgoMCAgICAgICAgICAgIEg0KCwgICAgICAgICAgIEgYKBAgICAgSBAoCCAgSBwoFCAEBCAESBAoCCAgSBAoCCAgSBgoECAgICBIGCgQICAgISQEOZ2V0U3RyaW5nQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQNrZXkCAAAIdW5pdFRlc3QHAAlvcmFjbGVGZWUJAQV2YWx1ZQEJAKYIAQkBDmdldFN0cmluZ0J5S2V5AQIPY29uZl9vcmFjbGVfZmVlAAhzaWduRGFwcAkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAhFjb25mX3NpZ253ZWJfZGFwcAALZmVlUmVjZWl2ZXIJAQ5nZXRTdHJpbmdCeUtleQECEWNvbmZfZmVlX3JlY2VpdmVyAAh1c2VyRGFwcAMFCHVuaXRUZXN0CQEFdmFsdWUBCQCmCAECIzNNdDRSR01FeWpTV1lBb2NUUHFkNTV3ZEhRUUIzUFUyVUNtCQEFdmFsdWUBCQCmCAEJAQ5nZXRTdHJpbmdCeUtleQECD2NvbmZfdXNlcnNfZGFwcAANd2hpdGVsaXN0RGFwcAkBBXZhbHVlAQkApggBCQEOZ2V0U3RyaW5nQnlLZXkBAhNjb25mX3doaXRlbGlzdF9kYXBwAAtzaWduQXNzZXRJZAkA2QQBCQEOZ2V0U3RyaW5nQnlLZXkBAhhjb25mX2FjY2VwdGVkX2Fzc2V0X1NJR04AC3VzZG5Bc3NldElkCQDZBAEJAQ5nZXRTdHJpbmdCeUtleQECGGNvbmZfYWNjZXB0ZWRfYXNzZXRfVVNETgALdXNkdEFzc2V0SWQJANkEAQkBDmdldFN0cmluZ0J5S2V5AQIYY29uZl9hY2NlcHRlZF9hc3NldF9VU0RUAAx3YXZlc0Fzc2V0SWQBAAAFY2hyaXMJAQ5nZXRTdHJpbmdCeUtleQECDGNvbmZfYWRtaW5fMQEZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUJb3JhY2xlRmVlBQNrZXkCH0ludGVnZXIgdW5kZWZpbmUgb3IgMCBpbiBvcmFjbGUBD2dldEludGVnZXJCeUtleQEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFA2tleQAAAQ5jaGVja1doaXRlbGlzdAEDa2V5CQELdmFsdWVPckVsc2UCCQCaCAIFDXdoaXRlbGlzdERhcHAFA2tleQAAAQ9nZXRCb29sZWFuQnlLZXkBA2tleQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQNrZXkHAAdzaWduQ3V0AAcAC3VzZG5XYXZlQ3V0AAoADmRlZmF1bHRMaWNlbmNlCQEOZ2V0U3RyaW5nQnlLZXkBAhRjb25mX2RlZmF1bHRfbGljZW5jZQASZGVmYXVsdEhhc2hMaWNlbmNlCQEOZ2V0U3RyaW5nQnlLZXkBAhljb25mX2RlZmF1bHRfbGljZW5jZV9oYXNoAAtkYXBwUnVubmluZwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQh1c2VyRGFwcAIUY29uZl9kYXBwX2lzX3J1bm5pbmcGAA5tYWludGVuYW5jZU1TRwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAIUY29uZl9tYWludGVuYW5jZV9tc2cCAAANdXNlclN1c3BlbmRlZAIJU1VTUEVOREVEAAt1c2VyUmVtb3ZlZAIHUkVNT1ZFRAAQdXNlclVucmVnaXN0ZXJlZAIMVU5SRUdJU1RFUkVEAAt1c2VyQWxsb3dlZAIHQUxMT1dFRAAZY3VycmVudENlcnRpZmljYXRpb25QcmljZQkBGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUBCQCsAgICEmNlcnRpZmljYXRpb25fZmVlXwkA2AQBBQtzaWduQXNzZXRJZAEUY2hlY2tTaWduQ2VydGlmaWNhdGUDBnNpZ25JRAVPd25lcgpzaGEyNTZIYXNoBAckbWF0Y2gwCQCdCAIFCHNpZ25EYXBwCQCsAgIJAKwCAgkArAICAghkYXRhX2ZjXwUGc2lnbklEAgFfBQVPd25lcgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDADCQEIY29udGFpbnMCBQFhBQpzaGEyNTZIYXNoBgcHAQt2YWxpZGF0ZUNJRAEDY2lkAwkBCGNvbnRhaW5zAgUDY2lkAgEvAwMJAGYCAEwJALECAQUDY2lkCQAAAgkAsQIBCQCRAwIJALUJAgUDY2lkAgEvAAAAOwcJAGYCABAJALECAQkAkQMCCQC1CQIFA2NpZAIBLwABBwcBDHZhbGlkYXRlSGFzaAEEaGFzaAkAAAIJALECAQUEaGFzaABAAQ1rZXlVc2VyU3RhdHVzAQZjYWxsZXIJAKwCAgIMdXNlcl9zdGF0dXNfBQZjYWxsZXIBB2tleURhdGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X2RhdGVfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlOYW1lAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9uYW1lXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5RGVzYwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfZGVzY18FBWFydElkAgFfBQZjYWxsZXIBDWtleURpc3BsYXlDaWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2Rpc3BsYXlfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgENa2V5RXhwb3J0SGFzaAIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfZXhwb3J0X2hhc2hfBQVhcnRJZAIBXwUGY2FsbGVyAQxrZXlFeHBvcnRDaWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIPYXJ0X2V4cG9ydF9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQprZXlNYXhNaW50AgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICDGFydF9tYXhtaW50XwUFYXJ0SWQCAV8FBmNhbGxlcgEJa2V5U2lnbklEAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICC2FydF9zaWduaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQlrZXlJc3N1ZWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgILYXJ0X2lzc3VlZF8FBWFydElkAgFfBQZjYWxsZXIBCWtleU9uU2FsZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgthcnRfb25zYWxlXwUFYXJ0SWQCAV8FBmNhbGxlcgEOa2V5TGljZW5jZUhhc2gCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIRYXJ0X2xpY2VuY2VfaGFzaF8FBWFydElkAgFfBQZjYWxsZXIBDWtleUxpY2VuY2VDaWQCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIQYXJ0X2xpY2VuY2VfY2lkXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5VGFncwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfdGFnc18FBWFydElkAgFfBQZjYWxsZXIBB2tleVR5cGUCBmNhbGxlcgVhcnRJZAkArAICCQCsAgIJAKwCAgIJYXJ0X3R5cGVfBQVhcnRJZAIBXwUGY2FsbGVyAQdrZXlOb3RlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICCWFydF9ub3RlXwUFYXJ0SWQCAV8FBmNhbGxlcgEKa2V5Q3Jhd2xlcgIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAhBhcnRfY3Jhd2xlcl9jaWRfBQVhcnRJZAIBXwUGY2FsbGVyAQhrZXlQcmljZQIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAgphcnRfcHJpY2VfBQVhcnRJZAIBXwUGY2FsbGVyAQprZXlFbmRTYWxlAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICDGFydF9lbmRzYWxlXwUFYXJ0SWQCAV8FBmNhbGxlcgESa2V5QXNzZXRJZEFjY2VwdGVkAgZjYWxsZXIFYXJ0SWQJAKwCAgkArAICCQCsAgICEmFydF9hc3NldEFjY2VwdGVkXwUFYXJ0SWQCAV8FBmNhbGxlcgEHa2V5RmxhZwIGY2FsbGVyBWFydElkCQCsAgIJAKwCAgkArAICAglhcnRfZmxhZ18FBWFydElkAgFfBQZjYWxsZXIBEmtleUFydGlzdEFnZW50QWRkcgEKYXJ0aXN0QWRkcgkArAICAg1hcnRpc3RfYWdlbnRfBQphcnRpc3RBZGRyAQ9rZXlQcmltYXJ5U2hhcmUBCmFydGlzdEFkZHIJAKwCAgIVYXJ0aXN0X2FnZW50X3ByaW1hcnlfBQphcnRpc3RBZGRyARFrZXlIYXNoQnlUeGlkQWRkcgIGY2FsbGVyBHR4aWQJAKwCAgkArAICCQCsAgICE2dldF9oYXNoYnl0eGlkYWRkcl8FBHR4aWQCAV8FBmNhbGxlcgEOa2V5T3duZXJCeUhhc2gBCnNoYTI1Nkhhc2gJAKwCAgISZ2V0X293bmVyX2J5X2hhc2hfBQpzaGEyNTZIYXNoAQ1rZXlpZEJ5U2lnbmlkAgZjYWxsZXIGc2lnbklkCQCsAgIJAKwCAgkArAICAhJnZXRfYXJ0aWRieXNpZ25pZF8FBnNpZ25JZAIBXwUGY2FsbGVyARJrZXlUeGlkQnlIYXNoT3duZXICCnNoYTI1Nkhhc2gGY2FsbGVyCQCsAgICF2dldF90eGlkX2J5X2hhc2hfb3duZXJfCQDYBAEJANQWAQkAmwMBCQCsAgIFCnNoYTI1Nkhhc2gFBmNhbGxlcgEOdmFsaWRhdGVBbGxDSUQDCmNpZERpc3BsYXkJY2lkRXhwb3J0CmNpZExpY2VuY2UDCQEBIQEJAQt2YWxpZGF0ZUNJRAEFCmNpZERpc3BsYXkJAAIBAhFXcm9uZyBEaXNwbGF5IENJRAMJAQEhAQkBC3ZhbGlkYXRlQ0lEAQUJY2lkRXhwb3J0CQACAQIQV3JvbmcgRXhwb3J0IENJRAMDCQECIT0CBQpjaWRMaWNlbmNlAgAJAQEhAQkBC3ZhbGlkYXRlQ0lEAQUKY2lkTGljZW5jZQcJAAIBAhFXcm9uZyBMaWNlbmNlIENJRAYBD3ZhbGlkYXRlQWxsSGFzaAIMc2hhMjU2RXhwb3J0DXNoYTI1NkxpY2VuY2UDCQEBIQEJAQx2YWxpZGF0ZUhhc2gBBQxzaGEyNTZFeHBvcnQJAAIBAhhFeHBvcnQgSGFzaCA2NCBjaGFyLiBtYXgDCQEBIQEJAQx2YWxpZGF0ZUhhc2gBBQ1zaGEyNTZMaWNlbmNlCQACAQIZTGljZW5jZSBIYXNoIDY0IGNoYXIuIG1heAYBDnZhbGlkYXRlU3RyaW5nAgNzdHIDbWF4AwkAAAIJALECAQUDc3RyAAAJAAIBAhhGaWVsZCBjYW5ub3QgYmUgaXMgZW1wdHkDCQBmAgkAsQIBBQNzdHIFA21heAkAAgEJAKwCAgUDc3RyAgwgaXMgdG9vIGxvbmcGAQx2YWxpZGF0ZVVzZXIBBmNhbGxlcgQKdXNlclN0YXR1cwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQh1c2VyRGFwcAkBDWtleVVzZXJTdGF0dXMBBQZjYWxsZXIFEHVzZXJVbnJlZ2lzdGVyZWQDAwkAAAIFCnVzZXJTdGF0dXMFEHVzZXJVbnJlZ2lzdGVyZWQGCQAAAgUKdXNlclN0YXR1cwULdXNlckFsbG93ZWQCLlJlZ2lzdGVyIHRoaXMgYWNjb3VudCBmaXJzdCB3aXRoICJBY2NvdW50IiB0YWIDCQAAAgUKdXNlclN0YXR1cwUNdXNlclN1c3BlbmRlZAIRQWNjb3VudCBzdXNwZW5kZWQDCQAAAgUKdXNlclN0YXR1cwULdXNlclJlbW92ZWQCD0FjY291bnQgcmVtb3ZlZAIAAQpzZXRMSWNlbmNlAgpjaWRMaWNlbmNlDXNoYTI1NkxpY2VuY2UEA2NpZAMJAAACCQCxAgEFCmNpZExpY2VuY2UAAAUOZGVmYXVsdExpY2VuY2UFCmNpZExpY2VuY2UEBGhhc2gDCQAAAgkAsQIBBQ1zaGEyNTZMaWNlbmNlAAAFEmRlZmF1bHRIYXNoTGljZW5jZQUNc2hhMjU2TGljZW5jZQkAlAoCBQNjaWQFBGhhc2gBE3ZhbGlkYXRlQXJ0d29ya0RhdGEJBmNhbGxlcgpjaWREaXNwbGF5CWNpZEV4cG9ydApsaWNlbmNlQ0lEDHNoYTI1NkV4cG9ydAtsaWNlbmNlSGFzaARuYW1lC2Rlc2NyaXB0aW9uBHRhZ3MECWNoZWNrVXNlcgkBDHZhbGlkYXRlVXNlcgEFBmNhbGxlcgMJAQIhPQIFCWNoZWNrVXNlcgIACQACAQUJY2hlY2tVc2VyAwkAAAIJALECAQUKY2lkRGlzcGxheQAACQACAQIbRGlzcGxheSBDSUQgY2Fubm90IGJlIGVtcHR5AwkBASEBCQEOdmFsaWRhdGVBbGxDSUQDBQpjaWREaXNwbGF5BQljaWRFeHBvcnQFCmxpY2VuY2VDSUQJAAIBAhBQcm9ibGVtIHdpdGggQ0lEAwkBASEBCQEPdmFsaWRhdGVBbGxIYXNoAgUMc2hhMjU2RXhwb3J0BQtsaWNlbmNlSGFzaAkAAgECE1Byb2JsZW0gd2l0aCBIYXNoZXMDCQEBIQEJAQ52YWxpZGF0ZVN0cmluZwIFBG5hbWUAZAkAAgECEjEwMCBDaGFyLiBtYXggbmFtZQMJAQEhAQkBDnZhbGlkYXRlU3RyaW5nAgULZGVzY3JpcHRpb24A6AcJAAIBAhoxMDAwIENoYXIuIG1heCBkZXNjcmlwdGlvbgMJAGYCCQCQAwEJALUJAgUEdGFncwIBLAAFCQACAQILNSB0YWdzIG1heC4CAAEJaXNQYXltZW50AQFpAwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECE05vIHBheW1lbnQgYXR0YWNoZWQEB3BheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQGYW1vdW50CQEFdmFsdWUBCAUHcGF5bWVudAZhbW91bnQJAJQKAgUHcGF5bWVudAUGYW1vdW50AQ92YWxpZGF0ZVBheW1lbnQBAWkECyR0MDg2NzU4NzExCQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFCyR0MDg2NzU4NzExAl8xBAZhbW91bnQIBQskdDA4Njc1ODcxMQJfMgQHYXNzZXRJZAMDCQEJaXNEZWZpbmVkAQgFB3BheW1lbnQHYXNzZXRJZAkAAAIIBQdwYXltZW50B2Fzc2V0SWQFC3NpZ25Bc3NldElkBwgFB3BheW1lbnQHYXNzZXRJZAkAAgECK09ubHkgU0lHTiB0b2tlbiBhY2NlcHRlZCBhcyB0cmFuc2FjdGlvbiBmZWUDCQECIT0CBQZhbW91bnQFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UJAAIBCQCsAgICGVBheW1lbnQgYW1vdW50IHNob3VsZCBiZSAJAKQDAQUZY3VycmVudENlcnRpZmljYXRpb25QcmljZQkAlAoCBQZhbW91bnQFB2Fzc2V0SWQBC2lzQXJ0TWludGVkAglhZGRyVG9Vc2UFYXJ0SWQEByRtYXRjaDAJAJoIAgUEdGhpcwkBCWtleUlzc3VlZAIFCWFkZHJUb1VzZQUFYXJ0SWQDCQABAgUHJG1hdGNoMAIDSW50BAFiBQckbWF0Y2gwAwkBAiE9AgUBYgAABgcHARR2YWxpZGF0ZVByaWNlQXNzZXRJZAMBaQxwcmljZUFzc2V0SWQMYXJ0d29ya1ByaWNlBAskdDA5MzE4OTM1NAkBCWlzUGF5bWVudAEFAWkEB3BheW1lbnQIBQskdDA5MzE4OTM1NAJfMQQGYW1vdW50CAULJHQwOTMxODkzNTQCXzIEB2Fzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkBQR1bml0AwMJAGYCCQCxAgEFDHByaWNlQXNzZXRJZAAACQAAAgkA2AQBCQEFdmFsdWUBCAUHcGF5bWVudAdhc3NldElkBQxwcmljZUFzc2V0SWQHCAUHcGF5bWVudAdhc3NldElkCQACAQIOV3JvbmcgYXNzZXQgaWQDAwkAAAIFB2Fzc2V0SWQFBHVuaXQJAQIhPQIFDHByaWNlQXNzZXRJZAIABwkAAgECDldyb25nIGFzc2V0IGlkAwkBAiE9AgUMYXJ0d29ya1ByaWNlBQZhbW91bnQJAAIBAhNQYXltZW50IGRvbid0IG1hdGNoCQCUCgIFBmFtb3VudAUHYXNzZXRJZAEQYWNjZXB0ZWRBc3NldElkcwEHYXNzZXRJZAMDAwMDCQECIT0CBQdhc3NldElkCQDYBAEFC3NpZ25Bc3NldElkCQECIT0CBQdhc3NldElkCQDYBAEFDHdhdmVzQXNzZXRJZAcJAQIhPQIFB2Fzc2V0SWQCBVdBVkVTBwkBAiE9AgUHYXNzZXRJZAkA2AQBBQt1c2RuQXNzZXRJZAcJAQIhPQIFB2Fzc2V0SWQJANgEAQULdXNkdEFzc2V0SWQHCQACAQImT25seSBTSUdOLCBVU0ROLFVTRFQgb3IgV0FWRVMgYWNjZXB0ZWQGAQ92YWxpZGF0ZU1pblNlbGwCB2Fzc2V0SWQFcHJpY2UEDG1pblNlbGxXYXZlcwMFCHVuaXRUZXN0AAoJARlnZXRJbnRlZ2VyQnlLZXlGcm9tT3JhY2xlAQIOd2F2ZXNfbWluX3NlbGwEC21pblNlbGxVc2RuAMCEPQQLbWluU2VsbFNpZ24DBQh1bml0VGVzdAABCQBoAgUZY3VycmVudENlcnRpZmljYXRpb25QcmljZQACAwMDAwMDCQAAAgUHYXNzZXRJZAkA2AQBBQt1c2RuQXNzZXRJZAkAZgIFC21pblNlbGxVc2RuBQVwcmljZQcJAQIhPQIFBXByaWNlAAAHBgMDCQAAAgUHYXNzZXRJZAkA2AQBBQt1c2R0QXNzZXRJZAkAZgIFC21pblNlbGxVc2RuBQVwcmljZQcJAQIhPQIFBXByaWNlAAAHBgMDCQAAAgUHYXNzZXRJZAkA2AQBBQtzaWduQXNzZXRJZAkAZgIFC21pblNlbGxTaWduBQVwcmljZQcJAQIhPQIFBXByaWNlAAAHBgMDAwkAAAIFB2Fzc2V0SWQJANgEAQUMd2F2ZXNBc3NldElkBgkAAAIFB2Fzc2V0SWQCBVdBVkVTCQBmAgUMbWluU2VsbFdhdmVzBQVwcmljZQcJAQIhPQIFBXByaWNlAAAHCQACAQIYV3JvbmcgbWluaW11bSBzZWxsIHByaWNlBgENZ2V0QmlkQXNzZXRJZAEHYXNzZXRJZAMJAAACBQdhc3NldElkAgVXQVZFUwUEdW5pdAkA2QQBBQdhc3NldElkARZnZXRQcmljZUFzc2V0SWRGcm9tQmlkAQpiaWREYXRhS2V5BAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOAwkAAAIFB2JpZERhdGECAAkAAgECDUJpZCBub3QgZm91bmQECmJpZERhdGFBcnIJALUJAgUHYmlkRGF0YQIBXwQJYmlkQW1vdW50CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKYmlkRGF0YUFycgABBApiaWRBc3NldElkCQENZ2V0QmlkQXNzZXRJZAEJAJEDAgUKYmlkRGF0YUFycgAAAwkAZwIAAAUJYmlkQW1vdW50CQACAQIMV3JvbmcgYW1vdW50CQCUCgIFCWJpZEFtb3VudAUKYmlkQXNzZXRJZAEMaWRDYWxsZXJEYXRlAQFpAwkBASEBBQtkYXBwUnVubmluZwkAAgEFDm1haW50ZW5hbmNlTVNHCQCVCgMJANgEAQgFAWkNdHJhbnNhY3Rpb25JZAkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAEHYnV5TWludAUBaQVhcnRJZAZpc3N1ZXIFYmlkSWQIYmlkT3duZXIEDSR0MDExODE2MTE4NzgJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDExODE2MTE4NzgCXzEEBmNhbGxlcggFDSR0MDExODE2MTE4NzgCXzIEBGRhdGUIBQ0kdDAxMTgxNjExODc4Al8zBAVpc0JpZAMDAwkAAAIJANgEAQgIBQFpBmNhbGxlcgVieXRlcwUGaXNzdWVyCQECIT0CBQhiaWRPd25lcgIABwkBAiE9AgUFYmlkSWQCAAcGBwQIYmxvY2tFbmQJAQ9nZXRJbnRlZ2VyQnlLZXkBCQEKa2V5RW5kU2FsZQIFBmNhbGxlcgUFYXJ0SWQDAwMJAQIhPQIFCGJsb2NrRW5kAAAJAGcCBQZoZWlnaHQFCGJsb2NrRW5kBwkBASEBBQVpc0JpZAcJAAIBAgtTYWxlIGVuZGVkLgQOY2FsbGVySXNJc3N1ZXIJAAACCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMFBmlzc3VlcgQIdG90YWxORlQJAQ9nZXRJbnRlZ2VyQnlLZXkBAhB0b3RhbF9uZnRfaXNzdWVkBAZzaWduSUQJAQ5nZXRTdHJpbmdCeUtleQEJAQlrZXlTaWduSUQCBQZpc3N1ZXIFBWFydElkBAthcnR3b3JrTmFtZQkBDmdldFN0cmluZ0J5S2V5AQkBB2tleU5hbWUCBQZpc3N1ZXIFBWFydElkAwkAAAIFC2FydHdvcmtOYW1lAgAJAAIBAhFBcnQgZG9lc24ndCBleGlzdAQIaXNPblNhbGUJAQ9nZXRCb29sZWFuQnlLZXkBCQEJa2V5T25TYWxlAgUGaXNzdWVyBQVhcnRJZAQKYW1vdW50U29sZAkBD2dldEludGVnZXJCeUtleQEJAQlrZXlJc3N1ZWQCBQZpc3N1ZXIFBWFydElkBAxhcnR3b3JrUHJpY2UDBQ5jYWxsZXJJc0lzc3VlcgkAaAIFGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UAAgkBD2dldEludGVnZXJCeUtleQEJAQhrZXlQcmljZQIFBmlzc3VlcgUFYXJ0SWQEDHByaWNlQXNzZXRJZAMFDmNhbGxlcklzSXNzdWVyCQDYBAEFC3NpZ25Bc3NldElkCQEOZ2V0U3RyaW5nQnlLZXkBCQESa2V5QXNzZXRJZEFjY2VwdGVkAgUGaXNzdWVyBQVhcnRJZAQKbWF4Q2FuU2VsbAkBD2dldEludGVnZXJCeUtleQEJAQprZXlNYXhNaW50AgUGaXNzdWVyBQVhcnRJZAMDAwkBASEBBQVpc0JpZAkBASEBBQ5jYWxsZXJJc0lzc3VlcgcDAwkAZwIAAAUMYXJ0d29ya1ByaWNlBgkBASEBBQhpc09uU2FsZQYJAGcCAAAFCm1heENhblNlbGwHCQACAQIQQXJ0IG5vdCBmb3Igc2FsZQMDAwkBASEBBQVpc0JpZAUOY2FsbGVySXNJc3N1ZXIHCQBnAgAABQptYXhDYW5TZWxsBwkAAgECFE1heCBpc3N1YWJsZSBub3Qgc2V0BAljaGVja1VzZXIJAQx2YWxpZGF0ZVVzZXIBBQZpc3N1ZXIDAwUFaXNCaWQJAQIhPQIFCWNoZWNrVXNlcgIABwkAAgEFCWNoZWNrVXNlcgQKYmlkRGF0YUtleQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAgRiaWRfBQVhcnRJZAIBXwUGaXNzdWVyAgFfBQhiaWRPd25lcgIBXwUFYmlkSWQEDSR0MDEzNjU3MTM4MjgDBQVpc0JpZAkBFmdldFByaWNlQXNzZXRJZEZyb21CaWQBBQpiaWREYXRhS2V5CQEUdmFsaWRhdGVQcmljZUFzc2V0SWQDBQFpBQxwcmljZUFzc2V0SWQFDGFydHdvcmtQcmljZQQGYW1vdW50CAUNJHQwMTM2NTcxMzgyOAJfMQQHYXNzZXRJZAgFDSR0MDEzNjU3MTM4MjgCXzIEBWFnZW50CQELdmFsdWVPckVsc2UCCQCdCAIFCHVzZXJEYXBwCQESa2V5QXJ0aXN0QWdlbnRBZGRyAQUGaXNzdWVyBQtmZWVSZWNlaXZlcgQKYWdlbnRTaGFyZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQh1c2VyRGFwcAkBD2tleVByaW1hcnlTaGFyZQEFBmlzc3VlcgAABA1pc1doaXRlbGlzdGVkCQEOY2hlY2tXaGl0ZWxpc3QBBQZpc3N1ZXIEA2N1dAMJAGYCBQ1pc1doaXRlbGlzdGVkBQZoZWlnaHQAAAMJAAACBQdhc3NldElkBQtzaWduQXNzZXRJZAUHc2lnbkN1dAULdXNkbldhdmVDdXQEDWFtb3VudEZvclNpZ24JAGsDBQZhbW91bnQFA2N1dABkBA5hbW91bnRGb3JBZ2VudAMDAwkBAiE9AgUFYWdlbnQFC2ZlZVJlY2VpdmVyCQBmAgUKYWdlbnRTaGFyZQAABwkAZgIFBmhlaWdodAUNaXNXaGl0ZWxpc3RlZAcJAGsDBQZhbW91bnQFCmFnZW50U2hhcmUAZAAABBBhbW91bnRGb3JDcmVhdG9yCQBlAgUGYW1vdW50BQ1hbW91bnRGb3JTaWduAwkAAAIFCmFtb3VudFNvbGQFCm1heENhblNlbGwJAAIBAgxBcnQgc29sZCBvdXQEDW5ld0Ftb3VudFNvbGQJAGQCBQphbW91bnRTb2xkAAEECWlzc3VlTWV0YQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCUNyZWF0b3I6IAUGaXNzdWVyAgosCiBBcnRJRDogBQVhcnRJZAILLAogU2lnbklEOiAFBnNpZ25JRAIRLAogQXJ0d29yayBuYW1lOiAFC2FydHdvcmtOYW1lAgosCiBJc3N1ZTogCQCkAwEFDW5ld0Ftb3VudFNvbGQCAS8JAKQDAQUKbWF4Q2FuU2VsbAQIaXNzdWVORlQJAMIIBQkArAICAgNTQV8JAKQDAQkAZAIFCHRvdGFsTkZUAAEFCWlzc3VlTWV0YQABAAAHBAVpZE5GVAkAuAgBBQhpc3N1ZU5GVAQKc2VsbFN0YXR1cwMDCQAAAgUNbmV3QW1vdW50U29sZAUKbWF4Q2FuU2VsbAYJAQEhAQUIaXNPblNhbGUHBgQKcmVjZWl2ZU5GVAMDAwkAAAIFBmNhbGxlcgUGaXNzdWVyCQECIT0CBQhiaWRPd25lcgIABwkBAiE9AgUFYmlkSWQCAAcJARFAZXh0ck5hdGl2ZSgxMDYyKQEFCGJpZE93bmVyCAUBaQZjYWxsZXIECmFzc2V0SWRCaWQDCQEBIQEJAQlpc0RlZmluZWQBBQdhc3NldElkAgVXQVZFUwkA2AQBCQEFdmFsdWUBBQdhc3NldElkBAdiaWREYXRhCQEOZ2V0U3RyaW5nQnlLZXkBCQCsAgIFCmJpZERhdGFLZXkCBV9PUEVOBAliaWREZWxPbGQJAQtEZWxldGVFbnRyeQEJAKwCAgUKYmlkRGF0YUtleQIFX09QRU4ECWJpZFVwZGF0ZQkBC1N0cmluZ0VudHJ5AgkArAICBQpiaWREYXRhS2V5AgdfQ0xPU0VECQCsAgIJAKwCAgUHYmlkRGF0YQIBXwkApAMBBQRkYXRlBAdzb2xkS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCWFydF9zb2xkXwkApAMBBQ1uZXdBbW91bnRTb2xkAgRfb2ZfCQCkAwEFCm1heENhblNlbGwCAV8FBWFydElkAgFfBQZpc3N1ZXIECXNvbGRWYWx1ZQMJAQEhAQUFaXNCaWQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUGY2FsbGVyAgFfCQCkAwEFBGRhdGUCAV8FAmlkAgFfCQCkAwEFDGFydHdvcmtQcmljZQIBXwUMcHJpY2VBc3NldElkAgFfCQDYBAEFBWlkTkZUCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKUIAQUKcmVjZWl2ZU5GVAIBXwkApAMBBQRkYXRlAgFfBQJpZAIBXwkApAMBBQZhbW91bnQCAV8FCmFzc2V0SWRCaWQCAV8JANgEAQUFaWRORlQECHNvbGREYXRhCQELU3RyaW5nRW50cnkCBQdzb2xkS2V5BQlzb2xkVmFsdWUEC2NvbW1pc3Npb25zAwkBAiE9AgUOYW1vdW50Rm9yQWdlbnQAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQULZmVlUmVjZWl2ZXIJAGUCBQ1hbW91bnRGb3JTaWduBQ5hbW91bnRGb3JBZ2VudAUHYXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUFYWdlbnQFDmFtb3VudEZvckFnZW50BQdhc3NldElkBQNuaWwJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC2ZlZVJlY2VpdmVyBQ1hbW91bnRGb3JTaWduBQdhc3NldElkBQNuaWwEBmJ1eVJlcwkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEJa2V5SXNzdWVkAgUGaXNzdWVyBQVhcnRJZAUNbmV3QW1vdW50U29sZAkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgICBG5mdF8JANgEAQUFaWRORlQFB3NvbGRLZXkJAMwIAgkBDEludGVnZXJFbnRyeQICEHRvdGFsX25mdF9pc3N1ZWQJAGQCBQh0b3RhbE5GVAABCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5RW5kU2FsZQIFBmlzc3VlcgUFYXJ0SWQAAAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBCWtleU9uU2FsZQIFBmlzc3VlcgUFYXJ0SWQFCnNlbGxTdGF0dXMJAMwIAgUIaXNzdWVORlQJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFBmlzc3VlcgUQYW1vdW50Rm9yQ3JlYXRvcgUHYXNzZXRJZAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQpyZWNlaXZlTkZUAAEFBWlkTkZUBQNuaWwFC2NvbW1pc3Npb25zAwUFaXNCaWQJAMwIAgUIc29sZERhdGEJAMwIAgUJYmlkVXBkYXRlCQDMCAIFCWJpZERlbE9sZAUGYnV5UmVzCQDMCAIFCHNvbGREYXRhBQZidXlSZXMKBmludm9rZQEHc2V0Q29uZgIDa2V5A3ZhbAQGY2FsbGVyCQClCAEIBQZpbnZva2UGY2FsbGVyAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgMJAQhjb250YWlucwIFA2tleQIFY29uZl8JAMwIAgkBC1N0cmluZ0VudHJ5AgUDa2V5BQN2YWwFA25pbAkAAgECIEVudHJpZXMgc3RhcnRpbmcgd2l0aCBjb25mXyBvbmx5CQACAQIiWW91IGFyZSBub3QgYWxsb3dlZCB0byBjaGFuZ2UgdGhpcwFpAQphZGRBcnR3b3JrDApzaGEyNTZIYXNoBnNpZ25JRARuYW1lC2Rlc2NyaXB0aW9uBHRhZ3MEdHlwZQpjaWREaXNwbGF5DHNoYTI1NkV4cG9ydAljaWRFeHBvcnQNc2hhMjU2TGljZW5jZQpjaWRMaWNlbmNlB2NyYXdsZXIEDSR0MDE3NjkwMTc3MzMJAQxpZENhbGxlckRhdGUBBQFpBAVhcnRJZAgFDSR0MDE3NjkwMTc3MzMCXzEEBmNhbGxlcggFDSR0MDE3NjkwMTc3MzMCXzIEBGRhdGUIBQ0kdDAxNzY5MDE3NzMzAl8zAwkBASEBCQEMdmFsaWRhdGVIYXNoAQUKc2hhMjU2SGFzaAkAAgECJEhhc2ggc2hvdWxkIGJlIDY0IGNoYXJhY3RlcnMgbWF4aW11bQQNJHQwMTc4MzgxNzkwNwkBCnNldExJY2VuY2UCBQpjaWRMaWNlbmNlBQ1zaGEyNTZMaWNlbmNlBApsaWNlbmNlQ0lECAUNJHQwMTc4MzgxNzkwNwJfMQQLbGljZW5jZUhhc2gIBQ0kdDAxNzgzODE3OTA3Al8yBA92YWxpZGF0ZUFydHdvcmsJARN2YWxpZGF0ZUFydHdvcmtEYXRhCQUGY2FsbGVyBQpjaWREaXNwbGF5BQljaWRFeHBvcnQFCmxpY2VuY2VDSUQFDHNoYTI1NkV4cG9ydAULbGljZW5jZUhhc2gFBG5hbWUFC2Rlc2NyaXB0aW9uBQR0YWdzAwkBAiE9AgUPdmFsaWRhdGVBcnR3b3JrAgAJAAIBAhVTb21ldGhpbmcgd2VudCB3cm9uZyEEDSR0MDE4MTMxMTgxNzMJAQ92YWxpZGF0ZVBheW1lbnQBBQFpBAZhbW91bnQIBQ0kdDAxODEzMTE4MTczAl8xBAdhc3NldElkCAUNJHQwMTgxMzExODE3MwJfMgMJAQEhAQkBCWlzRGVmaW5lZAEFBmFtb3VudAkAAgECFFNvbWV0aGluZyB3ZW50IHdyb25nBAplbnRyeUV4aXN0CQEOZ2V0U3RyaW5nQnlLZXkBCQESa2V5VHhpZEJ5SGFzaE93bmVyAgUKc2hhMjU2SGFzaAUGY2FsbGVyAwkBAiE9AgUKZW50cnlFeGlzdAIACQACAQIUWW91IGFscmVhZHkgYWRkZWQgaXQECWhhc2hFeGlzdAkBDmdldFN0cmluZ0J5S2V5AQkBDmtleU93bmVyQnlIYXNoAQUKc2hhMjU2SGFzaAMJAQIhPQIFCWhhc2hFeGlzdAIACQACAQIXSGFzaCBhbHJlYWR5IHJlZ2lzdGVyZWQED2lzU2lnbkNlcnRpZmllZAkBFGNoZWNrU2lnbkNlcnRpZmljYXRlAwUGc2lnbklEBQZjYWxsZXIFCnNoYTI1Nkhhc2gDCQEBIQEFD2lzU2lnbkNlcnRpZmllZAkAAgECLFNpZ24gQ2VydGlmaWNhdGUgbm90IGZvdW5kIGZvciB0aGlzIGFkZHJlc3MuCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlPd25lckJ5SGFzaAEFCnNoYTI1Nkhhc2gFBmNhbGxlcgkAzAgCCQELU3RyaW5nRW50cnkCCQESa2V5VHhpZEJ5SGFzaE93bmVyAgUKc2hhMjU2SGFzaAUGY2FsbGVyBQVhcnRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBB2tleURhdGUCBQZjYWxsZXIFBWFydElkBQRkYXRlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlOYW1lAgUGY2FsbGVyBQVhcnRJZAUEbmFtZQkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5RGVzYwIFBmNhbGxlcgUFYXJ0SWQFC2Rlc2NyaXB0aW9uCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlEaXNwbGF5Q2lkAgUGY2FsbGVyBQVhcnRJZAUKY2lkRGlzcGxheQkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXhwb3J0Q2lkAgUGY2FsbGVyBQVhcnRJZAUJY2lkRXhwb3J0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlFeHBvcnRIYXNoAgUGY2FsbGVyBQVhcnRJZAUMc2hhMjU2RXhwb3J0CQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ5rZXlMaWNlbmNlSGFzaAIFBmNhbGxlcgUFYXJ0SWQFC2xpY2VuY2VIYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ1rZXlMaWNlbmNlQ2lkAgUGY2FsbGVyBQVhcnRJZAUKbGljZW5jZUNJRAkAzAgCCQELU3RyaW5nRW50cnkCCQEHa2V5VHlwZQIFBmNhbGxlcgUFYXJ0SWQFBHR5cGUJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleVRhZ3MCBQZjYWxsZXIFBWFydElkBQR0YWdzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEKa2V5TWF4TWludAIFBmNhbGxlcgUFYXJ0SWQAAAkAzAgCCQELU3RyaW5nRW50cnkCCQEJa2V5U2lnbklEAgUGY2FsbGVyBQVhcnRJZAUGc2lnbklECQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEJa2V5SXNzdWVkAgUGY2FsbGVyBQVhcnRJZAAACQDMCAIJAQxCb29sZWFuRW50cnkCCQEJa2V5T25TYWxlAgUGY2FsbGVyBQVhcnRJZAcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleWlkQnlTaWduaWQCBQZjYWxsZXIFBnNpZ25JRAUFYXJ0SWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWtleUhhc2hCeVR4aWRBZGRyAgUGY2FsbGVyBQVhcnRJZAUKc2hhMjU2SGFzaAkAzAgCCQELU3RyaW5nRW50cnkCCQEKa2V5Q3Jhd2xlcgIFBmNhbGxlcgUFYXJ0SWQFB2NyYXdsZXIJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwkBB0FkZHJlc3MBCQDZBAEFC2ZlZVJlY2VpdmVyBQZhbW91bnQFB2Fzc2V0SWQFA25pbAFpAQ11cGRhdGVBcnR3b3JrCwR0eGlkBG5hbWULZGVzY3JpcHRpb24EdGFncwR0eXBlCmNpZERpc3BsYXkMc2hhMjU2RXhwb3J0CWNpZEV4cG9ydA1zaGEyNTZMaWNlbmNlCmNpZExpY2VuY2UHY3Jhd2xlcgMJAQEhAQULZGFwcFJ1bm5pbmcJAAIBBQ5tYWludGVuYW5jZU1TRwQGY2FsbGVyCQDYBAEICAUBaQZjYWxsZXIFYnl0ZXMEDSR0MDIwOTUzMjEwMjIJAQpzZXRMSWNlbmNlAgUKY2lkTGljZW5jZQUNc2hhMjU2TGljZW5jZQQKbGljZW5jZUNJRAgFDSR0MDIwOTUzMjEwMjICXzEEC2xpY2VuY2VIYXNoCAUNJHQwMjA5NTMyMTAyMgJfMgQPdmFsaWRhdGVBcnR3b3JrCQETdmFsaWRhdGVBcnR3b3JrRGF0YQkFBmNhbGxlcgUKY2lkRGlzcGxheQUJY2lkRXhwb3J0BQpsaWNlbmNlQ0lEBQxzaGEyNTZFeHBvcnQFC2xpY2VuY2VIYXNoBQRuYW1lBQtkZXNjcmlwdGlvbgUEdGFncwMJAQIhPQIFD3ZhbGlkYXRlQXJ0d29yawIACQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAplbnRyeUV4aXN0CQEOZ2V0U3RyaW5nQnlLZXkBCQEHa2V5TmFtZQIFBmNhbGxlcgUEdHhpZAMJAAACBQplbnRyeUV4aXN0AgAJAAIBAg9FbnRyeSBub3QgZm91bmQEBGZsYWcJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlGbGFnAgUGY2FsbGVyBQR0eGlkAwkAAAIFBGZsYWcCB0lMTEVHQUwJAAIBAh1DYW5ub3QgdXBkYXRlIElMTEVHQUwgYXJ0d29yawMJAQEhAQkBC2lzQXJ0TWludGVkAgUGY2FsbGVyBQR0eGlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlOYW1lAgUGY2FsbGVyBQR0eGlkBQRuYW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlEZXNjAgUGY2FsbGVyBQR0eGlkBQtkZXNjcmlwdGlvbgkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5RGlzcGxheUNpZAIFBmNhbGxlcgUEdHhpZAUKY2lkRGlzcGxheQkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RXhwb3J0Q2lkAgUGY2FsbGVyBQR0eGlkBQljaWRFeHBvcnQJAMwIAgkBC1N0cmluZ0VudHJ5AgkBDWtleUV4cG9ydEhhc2gCBQZjYWxsZXIFBHR4aWQFDHNoYTI1NkV4cG9ydAkAzAgCCQELU3RyaW5nRW50cnkCCQENa2V5TGljZW5jZUNpZAIFBmNhbGxlcgUEdHhpZAUKbGljZW5jZUNJRAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5TGljZW5jZUhhc2gCBQZjYWxsZXIFBHR4aWQFC2xpY2VuY2VIYXNoCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUYWdzAgUGY2FsbGVyBQR0eGlkBQR0YWdzCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlUeXBlAgUGY2FsbGVyBQR0eGlkBQR0eXBlCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQprZXlDcmF3bGVyAgUGY2FsbGVyBQR0eGlkBQdjcmF3bGVyBQNuaWwJAAIBAg5BbHJlYWR5IG1pbnRlZAFpAQtmbGFnQXJ0d29yawQFYXJ0SWQEYWRkcgRmbGFnBG5vdGUEDSR0MDIyNDc4MjI1MTIJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDIyNDc4MjI1MTICXzEEBmNhbGxlcggFDSR0MDIyNDc4MjI1MTICXzIDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQVjaHJpcwkAzAgCCQClCAEFBHRoaXMFA25pbAUGY2FsbGVyAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgIHQ09OU0VOVAkAzAgCAgAJAMwIAgIPQ0hBTkdFX1JFUVVJUkVECQDMCAICB0ZMQUdHRUQJAMwIAgIHSUxMRUdBTAUDbmlsBQRmbGFnCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQdrZXlGbGFnAgUEYWRkcgUFYXJ0SWQFBGZsYWcJAMwIAgkBC1N0cmluZ0VudHJ5AgkBB2tleU5vdGUCBQRhZGRyBQVhcnRJZAUEbm90ZQUDbmlsCQACAQkArAICAg5Vbmtub3cgc3RhdHVzIAUEZmxhZwkAAgECE1lvdSBhcmUgbm90IGFsbG93ZWQBaQENZGVsZXRlQXJ0d29yawIFYXJ0SWQEYWRkcgQNJHQwMjI5NjIyMjk5NgkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMjI5NjIyMjk5NgJfMQQGY2FsbGVyCAUNJHQwMjI5NjIyMjk5NgJfMgQJYWRkclRvVXNlAwkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUFY2hyaXMJAMwIAgkApQgBBQR0aGlzBQNuaWwFBmNhbGxlcgUEYWRkcgUGY2FsbGVyBAplbnRyeUV4aXN0CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlOYW1lAgUJYWRkclRvVXNlBQVhcnRJZAIgTm8gYXJ0IG1hdGNoaW5nIGZvciB0aGlzIGFkZHJlc3MDCQAAAgUKZW50cnlFeGlzdAIACQACAQIgTm8gYXJ0IG1hdGNoaW5nIGZvciB0aGlzIGFkZHJlc3MECnNoYTI1Nkhhc2gJAQ5nZXRTdHJpbmdCeUtleQEJARFrZXlIYXNoQnlUeGlkQWRkcgIFCWFkZHJUb1VzZQUFYXJ0SWQDCQAAAgUKc2hhMjU2SGFzaAIACQACAQIlTm8gYXJ0IGhhc2ggbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwQGc2lnbklECQEOZ2V0U3RyaW5nQnlLZXkBCQEJa2V5U2lnbklEAgUJYWRkclRvVXNlBQVhcnRJZAMJAAACBQZzaWduSUQCAAkAAgECE05vIFNJR04gSUQgbWF0Y2hpbmcEDGRhdGFUb0RlbGV0ZQkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5RGF0ZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBB2tleU5hbWUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlEZXNjAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQENa2V5RGlzcGxheUNpZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDGtleUV4cG9ydENpZAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleUV4cG9ydEhhc2gCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ5rZXlMaWNlbmNlSGFzaAIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleUxpY2VuY2VDaWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlUeXBlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5VGFncwIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCmtleU1heE1pbnQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQlrZXlTaWduSUQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQlrZXlJc3N1ZWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQlrZXlPblNhbGUCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQdrZXlGbGFnAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEIa2V5UHJpY2UCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARJrZXlBc3NldElkQWNjZXB0ZWQCBQlhZGRyVG9Vc2UFBWFydElkCQDMCAIJAQtEZWxldGVFbnRyeQEJAQ5rZXlPd25lckJ5SGFzaAEFCnNoYTI1Nkhhc2gJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBDWtleWlkQnlTaWduaWQCBQlhZGRyVG9Vc2UFBnNpZ25JRAkAzAgCCQELRGVsZXRlRW50cnkBCQESa2V5VHhpZEJ5SGFzaE93bmVyAgUKc2hhMjU2SGFzaAUJYWRkclRvVXNlCQDMCAIJAQtEZWxldGVFbnRyeQEJAQprZXlFbmRTYWxlAgUJYWRkclRvVXNlBQVhcnRJZAkAzAgCCQELRGVsZXRlRW50cnkBCQEHa2V5Tm90ZQIFCWFkZHJUb1VzZQUFYXJ0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBCmtleUNyYXdsZXICBQlhZGRyVG9Vc2UFBWFydElkBQNuaWwDCQEBIQEJAQtpc0FydE1pbnRlZAIFCWFkZHJUb1VzZQUFYXJ0SWQDCQEBIQEFC2RhcHBSdW5uaW5nCQACAQUObWFpbnRlbmFuY2VNU0cFDGRhdGFUb0RlbGV0ZQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFBWNocmlzCQDMCAIJAKUIAQUEdGhpcwUDbmlsBQZjYWxsZXIFDGRhdGFUb0RlbGV0ZQkAAgECKEFydCBhbHJlYWR5IG1pbnRlZCwgeW91IGNhbm5vdCBkZWxldGUgaXQBaQELc2VsbEFydHdvcmsFBWFydElkBXByaWNlB21heE1pbnQHYXNzZXRJZAhibG9ja0VuZAQNJHQwMjU4MTcyNTg1MQkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMjU4MTcyNTg1MQJfMQQGY2FsbGVyCAUNJHQwMjU4MTcyNTg1MQJfMgQLYXJ0d29ya05hbWUJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlOYW1lAgUGY2FsbGVyBQVhcnRJZAMJAAACBQthcnR3b3JrTmFtZQIACQACAQIjVGhpcyBhcnQgZG9lc24ndCBtYXRjaCB5b3VyIGFjY291bnQEBGZsYWcJAQ5nZXRTdHJpbmdCeUtleQEJAQdrZXlGbGFnAgUGY2FsbGVyBQVhcnRJZAMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAICD0NIQU5HRV9SRVFVSVJFRAkAzAgCAgdGTEFHR0VECQDMCAICB0lMTEVHQUwFA25pbAUEZmxhZwkAAgECD0ZsYWdnZWQgYXJ0d29yawQGYmlkTmJyCQEPZ2V0SW50ZWdlckJ5S2V5AQkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkAwkAZgIAAAUIYmxvY2tFbmQJAAIBAgxOZWdhdGl2ZSBlbmQDAwkAZgIFCGJsb2NrRW5kAAADCQECIT0CBQdtYXhNaW50AAEGCQECIT0CBQVwcmljZQAABwkAAgECOlRpbWVkIG9mZmVyIG9ubHkgYWxsb3dlZCBmb3IgdW5pcXVlIGVkaXRpb24gYW5kIG9mZmVyIG9ubHkECmJhc2VIZWlnaHQDCQAAAgUIYmxvY2tFbmQAAAAABQZoZWlnaHQDCQEBIQEJARBhY2NlcHRlZEFzc2V0SWRzAQUHYXNzZXRJZAkAAgECFVNvbWV0aGluZyB3ZW50IHdyb25nIQMJAQEhAQkBD3ZhbGlkYXRlTWluU2VsbAIFB2Fzc2V0SWQFBXByaWNlCQACAQIVU29tZXRoaW5nIHdlbnQgd3JvbmchBAljaGVja1VzZXIJAQx2YWxpZGF0ZVVzZXIBBQZjYWxsZXIDCQECIT0CBQljaGVja1VzZXICAAkAAgEFCWNoZWNrVXNlcgQKYW1vdW50U29sZAkBD2dldEludGVnZXJCeUtleQEJAQlrZXlJc3N1ZWQCBQZjYWxsZXIFBWFydElkBAptYXhDYW5TZWxsCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleU1heE1pbnQCBQZjYWxsZXIFBWFydElkAwkAZgIFB21heE1pbnQAZAkAAgECHDEwMCBlZGl0aW9ucyBtYXggcGVyIGFydHdvcmsDAwkBAiE9AgUKYW1vdW50U29sZAAACQAAAgUKYW1vdW50U29sZAUKbWF4Q2FuU2VsbAcJAAIBAhRNYXggZWRpdGlvbiByZWFjaGVkLgMDCQBmAgUKYW1vdW50U29sZAAACQECIT0CBQptYXhDYW5TZWxsBQdtYXhNaW50BwkAAgECJkNhbm5vdCBjaGFuZ2UgbWF4aW11bSBpc3N1YWJsZSBhbnltb3JlAwMJAGYCBQZiaWROYnIAAAkBAiE9AgUKbWF4Q2FuU2VsbAUHbWF4TWludAcJAAIBAjFDYW5ub3QgY2hhbmdlIG1heGltdW0gaXNzdWFibGUgd2l0aCBhY3RpdmUgb3JkZXJzBApzZWxsU3RhdHVzAwMJAGYCBQVwcmljZQAACQBmAgUHbWF4TWludAAABwYHCQDMCAIJAQxCb29sZWFuRW50cnkCCQEJa2V5T25TYWxlAgUGY2FsbGVyBQVhcnRJZAUKc2VsbFN0YXR1cwkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCGtleVByaWNlAgUGY2FsbGVyBQVhcnRJZAUFcHJpY2UJAMwIAgkBDEludGVnZXJFbnRyeQIJAQprZXlNYXhNaW50AgUGY2FsbGVyBQVhcnRJZAUHbWF4TWludAkAzAgCCQELU3RyaW5nRW50cnkCCQESa2V5QXNzZXRJZEFjY2VwdGVkAgUGY2FsbGVyBQVhcnRJZAUHYXNzZXRJZAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBCmtleUVuZFNhbGUCBQZjYWxsZXIFBWFydElkCQBkAgUKYmFzZUhlaWdodAUIYmxvY2tFbmQFA25pbAFpAQpidXlBcnR3b3JrAgVhcnRJZAZpc3N1ZXIJAQdidXlNaW50BQUBaQUFYXJ0SWQFBmlzc3VlcgIAAgABaQEGc2V0QmlkAgVhcnRJZAZpc3N1ZXIEDSR0MDI4MTYxMjgyMDEJAQxpZENhbGxlckRhdGUBBQFpBAJpZAgFDSR0MDI4MTYxMjgyMDECXzEEBmNhbGxlcggFDSR0MDI4MTYxMjgyMDECXzIEBGRhdGUIBQ0kdDAyODE2MTI4MjAxAl8zBA0kdDAyODIwNzI4MjQzCQEJaXNQYXltZW50AQUBaQQHcGF5bWVudAgFDSR0MDI4MjA3MjgyNDMCXzEEBmFtb3VudAgFDSR0MDI4MjA3MjgyNDMCXzIEB2Fzc2V0SWQDCQEBIQEJAQlpc0RlZmluZWQBCAUHcGF5bWVudAdhc3NldElkAgVXQVZFUwkA2AQBCQEFdmFsdWUBCAUHcGF5bWVudAdhc3NldElkBAhibG9ja0VuZAkBD2dldEludGVnZXJCeUtleQEJAQprZXlFbmRTYWxlAgUGaXNzdWVyBQVhcnRJZAMDCQECIT0CBQhibG9ja0VuZAAACQBnAgUGaGVpZ2h0BQhibG9ja0VuZAcJAAIBAgtTYWxlIGVuZGVkLgQGYmlkTmJyCQEPZ2V0SW50ZWdlckJ5S2V5AQkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkAwkBASEBCQEQYWNjZXB0ZWRBc3NldElkcwEFB2Fzc2V0SWQJAAIBAhJhc3NldCBub3QgYWNjZXB0ZWQDCQEBIQEJAQ92YWxpZGF0ZU1pblNlbGwCBQdhc3NldElkBQZhbW91bnQJAAIBAg5Xcm9uZyBtaW4gc2VsbAQKYW1vdW50U29sZAkBD2dldEludGVnZXJCeUtleQEJAQlrZXlJc3N1ZWQCBQZpc3N1ZXIFBWFydElkBAptYXhDYW5TZWxsCQEPZ2V0SW50ZWdlckJ5S2V5AQkBCmtleU1heE1pbnQCBQZpc3N1ZXIFBWFydElkAwkAZwIAAAUKbWF4Q2FuU2VsbAkAAgECI05vIG1heCBlZGl0aW9uIHNldCBmb3IgdGhpcyBhcnR3b3JrAwkAZwIFCmFtb3VudFNvbGQFCm1heENhblNlbGwJAAIBAhhTb2xkIG91dCwgeW91IGNhbm5vdCBiaWQJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FBmNhbGxlcgIBXwUCaWQCBV9PUEVOCQCsAgIJAKwCAgkArAICCQCsAgIFB2Fzc2V0SWQCAV8JAKQDAQUGYW1vdW50AgFfCQCkAwEFBGRhdGUJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgISY3VycmVudF9iaWRhbW91bnRfBQVhcnRJZAkAZAIFBmJpZE5icgABBQNuaWwBaQEJYWNjZXB0QmlkBAVhcnRJZAZpc3N1ZXIFYmlkSWQIYmlkT3duZXIEBmNhbGxlcgkA2AQBCAgFAWkGY2FsbGVyBWJ5dGVzAwkBAiE9AgUGY2FsbGVyBQZpc3N1ZXIJAAIBAhlZb3UgY2Fubm90IGRvIHRoaXMgYWN0aW9uCQEHYnV5TWludAUFAWkFBWFydElkBQZpc3N1ZXIFBWJpZElkBQhiaWRPd25lcgFpAQljYW5jZWxCaWQEBWFydElkBmlzc3VlcgViaWRJZAhiaWRPd25lcgQNJHQwMjk3MDMyOTc2NQkBDGlkQ2FsbGVyRGF0ZQEFAWkEAmlkCAUNJHQwMjk3MDMyOTc2NQJfMQQGY2FsbGVyCAUNJHQwMjk3MDMyOTc2NQJfMgQEZGF0ZQgFDSR0MDI5NzAzMjk3NjUCXzMDAwkBAiE9AgUGY2FsbGVyBQhiaWRPd25lcgkBAiE9AgUGY2FsbGVyBQZpc3N1ZXIHCQACAQIZWW91IGNhbm5vdCBkbyB0aGlzIGFjdGlvbgQNcmV0dXJuTW9uZXlUbwMJAAACBQZjYWxsZXIFBmlzc3VlcgUIYmlkT3duZXIFBmNhbGxlcgQGYmlkTmJyCQEPZ2V0SW50ZWdlckJ5S2V5AQkArAICAhJjdXJyZW50X2JpZGFtb3VudF8FBWFydElkBApiaWREYXRhS2V5CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICBGJpZF8FBWFydElkAgFfBQZpc3N1ZXICAV8FCGJpZE93bmVyAgFfBQViaWRJZAQHYmlkRGF0YQkBDmdldFN0cmluZ0J5S2V5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgMJAAACBQdiaWREYXRhAgAJAAIBAg1CaWQgbm90IGZvdW5kBApiaWREYXRhQXJyCQC1CQIFB2JpZERhdGECAV8EB2Fzc2V0SWQJAQ1nZXRCaWRBc3NldElkAQkAkQMCBQpiaWREYXRhQXJyAAAECWJpZFN0YXR1cwIIQ0FOQ0VMRUQJAMwIAgkBC0RlbGV0ZUVudHJ5AQkArAICBQpiaWREYXRhS2V5AgVfT1BFTgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgUKYmlkRGF0YUtleQIBXwUJYmlkU3RhdHVzCQCsAgIJAKwCAgUHYmlkRGF0YQIBXwkApAMBBQRkYXRlCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgICEmN1cnJlbnRfYmlkYW1vdW50XwUFYXJ0SWQJAGUCBQZiaWROYnIAAQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUNcmV0dXJuTW9uZXlUbwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmJpZERhdGFBcnIAAQUHYXNzZXRJZAUDbmlsAGZog1E=", "height": 2329569, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FjnN55bz5doW48zioqNkrWYxoKU4bo1HVK38xbMzv7vH Next: 2CnVvZrkbVbr86DSSr2K8F3yP6xAgfCRGjX5B76qCw6L Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-func getStrByK (key) = valueOrElse(getString(this, key), "")
4+func getStringByKey (key) = valueOrElse(getString(this, key), "")
55
66
77 let unitTest = false
88
9-let oracleFee = value(addressFromString(getStrByK("conf_oracle_fee")))
9+let oracleFee = value(addressFromString(getStringByKey("conf_oracle_fee")))
1010
11-let feeReceiver = getStrByK("conf_fee_receiver")
11+let signDapp = value(addressFromString(getStringByKey("conf_signweb_dapp")))
1212
13-let artworksDapp = value(addressFromString(getStrByK("conf_artworks_dapp")))
13+let feeReceiver = getStringByKey("conf_fee_receiver")
1414
1515 let userDapp = if (unitTest)
1616 then value(addressFromString("3Mt4RGMEyjSWYAocTPqd55wdHQQB3PU2UCm"))
17- else value(addressFromString(getStrByK("conf_users_dapp")))
17+ else value(addressFromString(getStringByKey("conf_users_dapp")))
1818
19-let signAssetId = fromBase58String(getStrByK("conf_accepted_asset_SIGN"))
19+let whitelistDapp = value(addressFromString(getStringByKey("conf_whitelist_dapp")))
2020
21-let usdnAssetId = fromBase58String(getStrByK("conf_accepted_asset_USDN"))
21+let signAssetId = fromBase58String(getStringByKey("conf_accepted_asset_SIGN"))
2222
23-let usdtAssetId = fromBase58String(getStrByK("conf_accepted_asset_USDT"))
23+let usdnAssetId = fromBase58String(getStringByKey("conf_accepted_asset_USDN"))
24+
25+let usdtAssetId = fromBase58String(getStringByKey("conf_accepted_asset_USDT"))
2426
2527 let wavesAssetId = base58''
2628
27-let chris = getStrByK("conf_admin_1")
29+let chris = getStringByKey("conf_admin_1")
2830
29-let signCut = 3
31+func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
3032
31-let creatorCut = 10
33+
34+func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
35+
36+
37+func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
38+
39+
40+func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
41+
42+
43+let signCut = 7
44+
45+let usdnWaveCut = 10
46+
47+let defaultLicence = getStringByKey("conf_default_licence")
48+
49+let defaultHashLicence = getStringByKey("conf_default_licence_hash")
50+
51+let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
52+
53+let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
3254
3355 let userSuspended = "SUSPENDED"
3456
3557 let userRemoved = "REMOVED"
3658
37-let artIllegal = "ILLEGAL"
59+let userUnregistered = "UNREGISTERED"
3860
39-let artSuspended = "SUSPENDED"
61+let userAllowed = "ALLOWED"
4062
41-let dappRunningKey = "conf_dapp_is_running"
63+let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
4264
43-let maintenanceMSGKey = "conf_maintenance_msg"
44-
45-let dappRunning = valueOrElse(getBoolean(this, dappRunningKey), true)
46-
47-let maintenanceMSG = valueOrElse(getString(this, maintenanceMSGKey), "")
48-
49-let numSalesK = "num_sales"
50-
51-func getUserStrByK (key) = valueOrElse(getString(userDapp, key), "Error")
65+func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signDapp, ((("data_fc_" + signID) + "_") + Owner)) {
66+ case a: String =>
67+ if (contains(a, sha256Hash))
68+ then true
69+ else false
70+ case _ =>
71+ false
72+}
5273
5374
54-func getArtStrByK (key) = valueOrElse(getString(artworksDapp, key), "")
75+func validateCID (cid) = if (contains(cid, "/"))
76+ then if (if ((76 > size(cid)))
77+ then (size(split(cid, "/")[0]) == 59)
78+ else false)
79+ then (16 > size(split(cid, "/")[1]))
80+ else false
81+ else false
5582
5683
57-func getIntByK (key) = valueOrElse(getInteger(this, key), 0)
84+func validateHash (hash) = (size(hash) == 64)
5885
5986
60-func keyUserStatus (addr) = ("user_status_" + addr)
87+func keyUserStatus (caller) = ("user_status_" + caller)
6188
6289
63-func keySignID (artistAddr,artId) = ((("art_signid_" + artId) + "_") + artistAddr)
90+func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
6491
6592
66-func keyFlag (artistAddr,artId) = ((("art_flag_" + artId) + "_") + artistAddr)
93+func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
6794
6895
69-func keyNFTData (id) = ("nft_" + id)
96+func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
7097
7198
72-func getSaleKey (caller,nftId,artId,creatorAddr) = ((((((("sale2nd_info_" + caller) + "_") + nftId) + "_") + artId) + "_") + creatorAddr)
99+func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
73100
74101
75-func getBidKey (offerOwner,nftId,saleOwner,offerId) = ((((((("offer2nd_" + offerOwner) + "_") + nftId) + "_") + saleOwner) + "_") + offerId)
102+func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
76103
77104
78-func getIntByKFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
105+func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
79106
80107
81-let currentCertificationPrice = getIntByKFromOracle(("certification_fee_" + toBase58String(signAssetId)))
108+func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
109+
110+
111+func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
112+
113+
114+func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
115+
116+
117+func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
118+
119+
120+func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
121+
122+
123+func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
124+
125+
126+func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
127+
128+
129+func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
130+
131+
132+func keyNote (caller,artId) = ((("art_note_" + artId) + "_") + caller)
133+
134+
135+func keyCrawler (caller,artId) = ((("art_crawler_cid_" + artId) + "_") + caller)
136+
137+
138+func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
139+
140+
141+func keyEndSale (caller,artId) = ((("art_endsale_" + artId) + "_") + caller)
142+
143+
144+func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
145+
146+
147+func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
148+
82149
83150 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
84151
85152
86-func keySecondaryShare (artistAddr) = ("artist_agent_secondary_" + artistAddr)
153+func keyPrimaryShare (artistAddr) = ("artist_agent_primary_" + artistAddr)
87154
88155
89-func idCallerDate (i) = if (!(dappRunning))
90- then throw(maintenanceMSG)
91- else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
156+func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
157+
158+
159+func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
160+
161+
162+func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
163+
164+
165+func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
166+
167+
168+func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
169+ then throw("Wrong Display CID")
170+ else if (!(validateCID(cidExport)))
171+ then throw("Wrong Export CID")
172+ else if (if ((cidLicence != ""))
173+ then !(validateCID(cidLicence))
174+ else false)
175+ then throw("Wrong Licence CID")
176+ else true
177+
178+
179+func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
180+ then throw("Export Hash 64 char. max")
181+ else if (!(validateHash(sha256Licence)))
182+ then throw("Licence Hash 64 char. max")
183+ else true
184+
185+
186+func validateString (str,max) = if ((size(str) == 0))
187+ then throw("Field cannot be is empty")
188+ else if ((size(str) > max))
189+ then throw((str + " is too long"))
190+ else true
191+
192+
193+func validateUser (caller) = {
194+ let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
195+ if (if ((userStatus == userUnregistered))
196+ then true
197+ else (userStatus == userAllowed))
198+ then "Register this account first with \"Account\" tab"
199+ else if ((userStatus == userSuspended))
200+ then "Account suspended"
201+ else if ((userStatus == userRemoved))
202+ then "Account removed"
203+ else ""
204+ }
205+
206+
207+func setLIcence (cidLicence,sha256Licence) = {
208+ let cid = if ((size(cidLicence) == 0))
209+ then defaultLicence
210+ else cidLicence
211+ let hash = if ((size(sha256Licence) == 0))
212+ then defaultHashLicence
213+ else sha256Licence
214+ $Tuple2(cid, hash)
215+ }
216+
217+
218+func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags) = {
219+ let checkUser = validateUser(caller)
220+ if ((checkUser != ""))
221+ then throw(checkUser)
222+ else if ((size(cidDisplay) == 0))
223+ then throw("Display CID cannot be empty")
224+ else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
225+ then throw("Problem with CID")
226+ else if (!(validateAllHash(sha256Export, licenceHash)))
227+ then throw("Problem with Hashes")
228+ else if (!(validateString(name, 100)))
229+ then throw("100 Char. max name")
230+ else if (!(validateString(description, 1000)))
231+ then throw("1000 Char. max description")
232+ else if ((size(split(tags, ",")) > 5))
233+ then throw("5 tags max.")
234+ else ""
235+ }
92236
93237
94238 func isPayment (i) = if ((size(i.payments) == 0))
100244 }
101245
102246
103-func assetIsValid (assetDetails) = if (if (if ((assetDetails.quantity == 1))
104- then (assetDetails.decimals == 0)
105- else false)
106- then (assetDetails.reissuable == false)
107- else false)
108- then (assetDetails.issuer == artworksDapp)
109- else false
247+func validatePayment (i) = {
248+ let $t086758711 = isPayment(i)
249+ let payment = $t086758711._1
250+ let amount = $t086758711._2
251+ let assetId = if (if (isDefined(payment.assetId))
252+ then (payment.assetId == signAssetId)
253+ else false)
254+ then payment.assetId
255+ else throw("Only SIGN token accepted as transaction fee")
256+ if ((amount != currentCertificationPrice))
257+ then throw(("Payment amount should be " + toString(currentCertificationPrice)))
258+ else $Tuple2(amount, assetId)
259+ }
110260
111261
112-func isSignArtNFT (id) = {
113- let assetDetails = value(assetInfo(id))
114- assetIsValid(assetDetails)
262+func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
263+ case b: Int =>
264+ if ((b != 0))
265+ then true
266+ else false
267+ case _ =>
268+ false
269+}
270+
271+
272+func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
273+ let $t093189354 = isPayment(i)
274+ let payment = $t093189354._1
275+ let amount = $t093189354._2
276+ let assetId = if (!(isDefined(payment.assetId)))
277+ then unit
278+ else if (if ((size(priceAssetId) > 0))
279+ then (toBase58String(value(payment.assetId)) == priceAssetId)
280+ else false)
281+ then payment.assetId
282+ else throw("Wrong asset id")
283+ if (if ((assetId == unit))
284+ then (priceAssetId != "")
285+ else false)
286+ then throw("Wrong asset id")
287+ else if ((artworkPrice != amount))
288+ then throw("Payment don't match")
289+ else $Tuple2(amount, assetId)
115290 }
116291
117292
124299 else false)
125300 then (assetId != toBase58String(usdtAssetId))
126301 else false)
127- then false
302+ then throw("Only SIGN, USDN,USDT or WAVES accepted")
128303 else true
129-
130-
131-func getBidAssetId (assetId) = if ((assetId == "WAVES"))
132- then unit
133- else fromBase58String(assetId)
134-
135-
136-func getSaleOwnerAndStatus (nftid) = {
137- let saleOwner = getStrByK(("current_owner_on_dapp_" + nftid))
138- if ((size(saleOwner) == 0))
139- then throw("NFT not found")
140- else {
141- let saleStatus = getStrByK(((("sale2nd_status_" + saleOwner) + "_") + nftid))
142- if ((saleStatus != "OPEN"))
143- then throw("NFT not for sale")
144- else saleOwner
145- }
146- }
147-
148-
149-func getBidData (key) = {
150- let bidData = getStrByK((key + "_OPEN"))
151- if ((bidData == ""))
152- then throw("Offer not found")
153- else {
154- let bidDataArr = split(bidData, "_")
155- let assetId = getBidAssetId(bidDataArr[2])
156- $Tuple3(bidDataArr, assetId, bidData)
157- }
158- }
159-
160-
161-func artIsValid (artStatus) = if ((artStatus != artIllegal))
162- then (artStatus != artSuspended)
163- else false
164-
165-
166-func checkArtStatus (addr,id) = {
167- let artStatus = getArtStrByK(keyFlag(addr, id))
168- if (artIsValid(artStatus))
169- then true
170- else throw(("Original Artwork flagged as " + artStatus))
171- }
172-
173-
174-func checkArtistStatus (addr) = {
175- let artistStatus = getUserStrByK(keyUserStatus(addr))
176- if (containsElement([userSuspended, userRemoved], artistStatus))
177- then throw(("Original Artist " + artistStatus))
178- else true
179- }
180-
181-
182-func checkNFTInfo (assetId) = {
183- let nftData = split(getArtStrByK(keyNFTData(assetId)), "_")
184- let artSignID = getArtStrByK(keySignID(nftData[6], nftData[5]))
185- if (if (!(checkArtStatus(nftData[6], nftData[5])))
186- then !(checkArtistStatus(nftData[6]))
187- else false)
188- then $Tuple4(false, nftData[5], nftData[6], artSignID)
189- else $Tuple4(true, nftData[5], nftData[6], artSignID)
190- }
191-
192-
193-func setTransfers (amount,assetId,nftid,creatorAddr,saleOwner,caller) = {
194- let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(creatorAddr)), feeReceiver)
195- let agentShare = valueOrElse(getInteger(userDapp, keySecondaryShare(creatorAddr)), 0)
196- let amountForSign = fraction(amount, signCut, 100)
197- let amountForCreator = fraction(amount, creatorCut, 100)
198- let amountForOwner = (amount - (amountForSign + amountForCreator))
199- let amountForAgent = if (if ((agent != feeReceiver))
200- then (agentShare > 0)
201- else false)
202- then fraction(amount, agentShare, 100)
203- else 0
204- let commissions = if ((amountForAgent != 0))
205- then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
206- else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
207- let creatorFee = ScriptTransfer(Address(fromBase58String(creatorAddr)), amountForCreator, assetId)
208- let ownerFee = ScriptTransfer(Address(fromBase58String(saleOwner)), amountForOwner, assetId)
209- let collectorNFT = ScriptTransfer(Address(fromBase58String(caller)), 1, fromBase58String(nftid))
210- $Tuple4(commissions, creatorFee, ownerFee, collectorNFT)
211- }
212304
213305
214306 func validateMinSell (assetId,price) = {
215307 let minSellWaves = if (unitTest)
216308 then 10
217- else getIntByKFromOracle("waves_min_sell")
309+ else getIntegerByKeyFromOracle("waves_min_sell")
218310 let minSellUsdn = 1000000
219311 let minSellSign = if (unitTest)
220312 then 1
244336 else false)
245337 then (price != 0)
246338 else false)
247- then false
339+ then throw("Wrong minimum sell price")
248340 else true
249341 }
250342
251343
252-func provideBaseData (i,nftId) = {
253- let $t093049344 = idCallerDate(i)
254- let id = $t093049344._1
255- let caller = $t093049344._2
256- let date = $t093049344._3
257- let $t093489417 = checkNFTInfo(nftId)
258- let isValidNFT = $t093489417._1
259- let artId = $t093489417._2
260- let creatorAddr = $t093489417._3
261- let artSignID = $t093489417._4
262- $Tuple7(id, caller, date, isValidNFT, artId, creatorAddr, artSignID)
344+func getBidAssetId (assetId) = if ((assetId == "WAVES"))
345+ then unit
346+ else fromBase58String(assetId)
347+
348+
349+func getPriceAssetIdFromBid (bidDataKey) = {
350+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
351+ if ((bidData == ""))
352+ then throw("Bid not found")
353+ else {
354+ let bidDataArr = split(bidData, "_")
355+ let bidAmount = parseIntValue(bidDataArr[1])
356+ let bidAssetId = getBidAssetId(bidDataArr[0])
357+ if ((0 >= bidAmount))
358+ then throw("Wrong amount")
359+ else $Tuple2(bidAmount, bidAssetId)
360+ }
263361 }
264362
265363
266-func updateNumSales () = {
267- let numSales = getIntByK(numSalesK)
268- IntegerEntry(numSalesK, (numSales + 1))
364+func idCallerDate (i) = if (!(dappRunning))
365+ then throw(maintenanceMSG)
366+ else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
367+
368+
369+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
374+ let isBid = if (if (if ((toBase58String(i.caller.bytes) == issuer))
375+ then (bidOwner != "")
376+ else false)
377+ then (bidId != "")
378+ else false)
379+ then true
380+ else false
381+ let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
382+ if (if (if ((blockEnd != 0))
383+ then (height >= blockEnd)
384+ else false)
385+ then !(isBid)
386+ else false)
387+ then throw("Sale ended.")
388+ else {
389+ let callerIsIssuer = (toBase58String(i.caller.bytes) == issuer)
390+ let totalNFT = getIntegerByKey("total_nft_issued")
391+ let signID = getStringByKey(keySignID(issuer, artId))
392+ let artworkName = getStringByKey(keyName(issuer, artId))
393+ if ((artworkName == ""))
394+ then throw("Art doesn't exist")
395+ else {
396+ let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
397+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
398+ let artworkPrice = if (callerIsIssuer)
399+ then (currentCertificationPrice * 2)
400+ else getIntegerByKey(keyPrice(issuer, artId))
401+ let priceAssetId = if (callerIsIssuer)
402+ then toBase58String(signAssetId)
403+ else getStringByKey(keyAssetIdAccepted(issuer, artId))
404+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
405+ if (if (if (!(isBid))
406+ then !(callerIsIssuer)
407+ else false)
408+ then if (if ((0 >= artworkPrice))
409+ then true
410+ else !(isOnSale))
411+ then true
412+ else (0 >= maxCanSell)
413+ else false)
414+ then throw("Art not for sale")
415+ else if (if (if (!(isBid))
416+ then callerIsIssuer
417+ else false)
418+ then (0 >= maxCanSell)
419+ else false)
420+ then throw("Max issuable not set")
421+ else {
422+ let checkUser = validateUser(issuer)
423+ if (if (isBid)
424+ then (checkUser != "")
425+ else false)
426+ then throw(checkUser)
427+ else {
428+ let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
429+ let $t01365713828 = if (isBid)
430+ then getPriceAssetIdFromBid(bidDataKey)
431+ else validatePriceAssetId(i, priceAssetId, artworkPrice)
432+ let amount = $t01365713828._1
433+ let assetId = $t01365713828._2
434+ let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
435+ let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShare(issuer)), 0)
436+ let isWhitelisted = checkWhitelist(issuer)
437+ let cut = if ((isWhitelisted > height))
438+ then 0
439+ else if ((assetId == signAssetId))
440+ then signCut
441+ else usdnWaveCut
442+ let amountForSign = fraction(amount, cut, 100)
443+ let amountForAgent = if (if (if ((agent != feeReceiver))
444+ then (agentShare > 0)
445+ else false)
446+ then (height > isWhitelisted)
447+ else false)
448+ then fraction(amount, agentShare, 100)
449+ else 0
450+ let amountForCreator = (amount - amountForSign)
451+ if ((amountSold == maxCanSell))
452+ then throw("Art sold out")
453+ else {
454+ let newAmountSold = (amountSold + 1)
455+ let issueMeta = ((((((((((("Creator: " + issuer) + ",
456+ ArtID: ") + artId) + ",
457+ SignID: ") + signID) + ",
458+ Artwork name: ") + artworkName) + ",
459+ Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
460+ let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
461+ let idNFT = calculateAssetId(issueNFT)
462+ let sellStatus = if (if ((newAmountSold == maxCanSell))
463+ then true
464+ else !(isOnSale))
465+ then false
466+ else true
467+ let receiveNFT = if (if (if ((caller == issuer))
468+ then (bidOwner != "")
469+ else false)
470+ then (bidId != "")
471+ else false)
472+ then addressFromStringValue(bidOwner)
473+ else i.caller
474+ let assetIdBid = if (!(isDefined(assetId)))
475+ then "WAVES"
476+ else toBase58String(value(assetId))
477+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
478+ let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
479+ let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
480+ let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
481+ let soldValue = if (!(isBid))
482+ then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
483+ else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
484+ let soldData = StringEntry(soldKey, soldValue)
485+ let commissions = if ((amountForAgent != 0))
486+ then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
487+ 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)
489+ if (isBid)
490+ then [soldData, bidUpdate, bidDelOld] :: buyRes
491+ else soldData :: buyRes
492+ }
493+ }
494+ }
495+ }
496+ }
269497 }
270498
271499
281509
282510
283511
284-@Callable(invoke)
285-func appRunning (isLive,message) = {
286- let caller = toString(invoke.caller)
287- let id = toBase58String(invoke.transactionId)
288- if (containsElement([chris, toString(this)], caller))
289- then [BooleanEntry(dappRunningKey, isLive), StringEntry(maintenanceMSGKey, message)]
290- else throw("You are not allowed to change this")
291- }
292-
293-
294-
295512 @Callable(i)
296-func sellNFT (price,asset) = {
297- let $t01052210558 = isPayment(i)
298- let payment = $t01052210558._1
299- let amount = $t01052210558._2
300- if ((amount != 1))
301- then throw("No NFT attached")
513+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
518+ if (!(validateHash(sha256Hash)))
519+ then throw("Hash should be 64 characters maximum")
302520 else {
303- let nftId = if (if (isDefined(payment.assetId))
304- then isSignArtNFT(value(payment.assetId))
305- else false)
306- then toBase58String(value(payment.assetId))
307- else throw("Only SIGN Art NFT accepted.")
308- let $t01079610889 = provideBaseData(i, nftId)
309- let id = $t01079610889._1
310- let caller = $t01079610889._2
311- let date = $t01079610889._3
312- let isValidNFT = $t01079610889._4
313- let artId = $t01079610889._5
314- let creatorAddr = $t01079610889._6
315- let artSignID = $t01079610889._7
316- if ((size(artSignID) == 0))
317- then throw("Artwork not found on SIGN Art")
318- else if (!(isValidNFT))
319- then throw("Not a valid nft")
320- else if (!(acceptedAssetIds(asset)))
321- then throw("Only SIGN, USDN, USDT or WAVES accepted")
322- else if (!(validateMinSell(asset, price)))
323- then throw("Wrong minimum sell price")
324- else [StringEntry((getSaleKey(caller, nftId, artId, creatorAddr) + "_OPEN"), ((((((((((((toString(date) + "_") + toString(price)) + "_") + asset) + "_") + nftId) + "_") + artId) + "_") + creatorAddr) + "_") + id)), StringEntry(((("sale2nd_status_" + caller) + "_") + nftId), "OPEN"), StringEntry(("current_owner_on_dapp_" + nftId), caller)]
325- }
326- }
327-
328-
329-
330-@Callable(i)
331-func updateSalePrice (nftId,price,asset) = {
332- let $t01179311886 = provideBaseData(i, nftId)
333- let id = $t01179311886._1
334- let caller = $t01179311886._2
335- let date = $t01179311886._3
336- let isValidNFT = $t01179311886._4
337- let artId = $t01179311886._5
338- let creatorAddr = $t01179311886._6
339- let artSignID = $t01179311886._7
340- if ((size(artSignID) == 0))
341- then throw("Artwork not found on SIGN Art, cancel your sale.")
342- else if (!(isValidNFT))
343- then throw("Not a valid nft")
344- else {
345- let saleOwner = getStrByK(("current_owner_on_dapp_" + nftId))
346- if ((saleOwner != caller))
347- then throw("You don't own this NFT")
348- else {
349- let saleStatus = getStrByK(((("sale2nd_status_" + caller) + "_") + nftId))
350- if ((saleStatus != "OPEN"))
351- then throw("Sale not active")
352- else if (!(acceptedAssetIds(asset)))
353- then throw("Only SIGN, USDN, USDT or WAVES accepted")
354- else if (!(validateMinSell(asset, price)))
355- then throw("Wrong minimum sell price")
356- else {
357- let saleKey = getSaleKey(caller, nftId, artId, creatorAddr)
358- let saleInfo = split(getStrByK((saleKey + "_OPEN")), "_")
359-[StringEntry((saleKey + "_OPEN"), ((((((((((((saleInfo[0] + "_") + toString(price)) + "_") + asset) + "_") + saleInfo[3]) + "_") + saleInfo[4]) + "_") + saleInfo[5]) + "_") + saleInfo[6]))]
360- }
361- }
362- }
363- }
364-
365-
366-
367-@Callable(i)
368-func cancelSale (nftId) = {
369- let $t01306313307 = provideBaseData(i, nftId)
370- let id = $t01306313307._1
371- let caller = $t01306313307._2
372- let date = $t01306313307._3
373- let isValidNFT = $t01306313307._4
374- let artId = $t01306313307._5
375- let creatorAddr = $t01306313307._6
376- let artSignID = $t01306313307._7
377- let saleOwner = getStrByK(("current_owner_on_dapp_" + nftId))
378- if ((saleOwner != caller))
379- then throw("You don't own this NFT")
380- else {
381- let saleStatus = getStrByK(((("sale2nd_status_" + caller) + "_") + nftId))
382- if ((saleStatus != "OPEN"))
383- then throw("Sale not active")
521+ let $t01783817907 = setLIcence(cidLicence, sha256Licence)
522+ let licenceCID = $t01783817907._1
523+ let licenceHash = $t01783817907._2
524+ let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags)
525+ if ((validateArtwork != ""))
526+ then throw("Something went wrong!")
384527 else {
385- let saleKey = getSaleKey(caller, nftId, artId, creatorAddr)
386- let saleInfo = getStrByK((saleKey + "_OPEN"))
387-[DeleteEntry((saleKey + "_OPEN")), DeleteEntry(((("sale2nd_status_" + caller) + "_") + nftId)), DeleteEntry(("current_owner_on_dapp_" + nftId)), StringEntry((((saleKey + "_") + id) + "_CANCELLED"), ((((saleInfo + "_CANCELLED_") + toString(date)) + "_") + id)), ScriptTransfer(Address(fromBase58String(caller)), 1, fromBase58String(nftId))]
388- }
389- }
390- }
391-
392-
393-
394-@Callable(i)
395-func buyNFT (nftId) = {
396- let $t01416114254 = provideBaseData(i, nftId)
397- let id = $t01416114254._1
398- let caller = $t01416114254._2
399- let date = $t01416114254._3
400- let isValidNFT = $t01416114254._4
401- let artId = $t01416114254._5
402- let creatorAddr = $t01416114254._6
403- let artSignID = $t01416114254._7
404- if ((size(artSignID) == 0))
405- then throw("Artwork not found on SIGN Art, cancel your sale.")
406- else if (!(isValidNFT))
407- then throw("Not a valid nft")
408- else {
409- let saleOwner = getSaleOwnerAndStatus(nftId)
410- let saleKey = getSaleKey(saleOwner, nftId, artId, creatorAddr)
411- let saleInfo = getStrByK((saleKey + "_OPEN"))
412- if ((size(saleInfo) == 0))
413- then throw("Sale Not found!")
414- else {
415- let saleInfoArray = split(saleInfo, "_")
416- if ((parseInt(saleInfoArray[1]) == 0))
417- then throw("Offer only")
418- else {
419- let $t01476314799 = isPayment(i)
420- let payment = $t01476314799._1
421- let amount = $t01476314799._2
422- let paymentAssetStr = if (isDefined(payment.assetId))
423- then toBase58String(value(payment.assetId))
424- else ""
425- if (if ((saleInfoArray[1] != toString(amount)))
426- then true
427- else (saleInfoArray[2] != paymentAssetStr))
428- then throw("Payment infos don't match.")
429- else {
430- let $t01531315445 = setTransfers(amount, payment.assetId, nftId, creatorAddr, saleOwner, caller)
431- let commissions = $t01531315445._1
432- let creatorFee = $t01531315445._2
433- let ownerFee = $t01531315445._3
434- let collectorNFT = $t01531315445._4
435- ([DeleteEntry((saleKey + "_OPEN")), DeleteEntry(((("sale2nd_status_" + saleOwner) + "_") + nftId)), DeleteEntry(("current_owner_on_dapp_" + nftId)), StringEntry((((saleKey + "_") + id) + "_CLOSED"), ((((((saleInfo + "_CLOSED_") + toString(date)) + "_") + id) + "_") + caller)), updateNumSales(), creatorFee, ownerFee, collectorNFT] ++ commissions)
436- }
437- }
438- }
439- }
440- }
441-
442-
443-
444-@Callable(i)
445-func setOffer (nftId) = {
446- let $t01587315970 = provideBaseData(i, nftId)
447- let id = $t01587315970._1
448- let offerOwner = $t01587315970._2
449- let date = $t01587315970._3
450- let isValidNFT = $t01587315970._4
451- let artId = $t01587315970._5
452- let creatorAddr = $t01587315970._6
453- let artSignID = $t01587315970._7
454- if (!(isValidNFT))
455- then throw("Not a valid nft")
456- else {
457- let $t01603416070 = isPayment(i)
458- let payment = $t01603416070._1
459- let amount = $t01603416070._2
460- let assetId = if (!(isDefined(payment.assetId)))
461- then "WAVES"
462- else toBase58String(value(payment.assetId))
463- if (!(acceptedAssetIds(assetId)))
464- then throw("asset not accepted")
465- else if ((amount == 0))
466- then throw("Offer of 0 not allowed")
467- else if (!(validateMinSell(assetId, amount)))
468- then throw("Wrong minimum sell price")
528+ let $t01813118173 = validatePayment(i)
529+ let amount = $t01813118173._1
530+ let assetId = $t01813118173._2
531+ if (!(isDefined(amount)))
532+ then throw("Something went wrong")
469533 else {
470- let saleOwner = getSaleOwnerAndStatus(nftId)
471-[StringEntry((getBidKey(offerOwner, nftId, saleOwner, id) + "_OPEN"), ((((((((((((((toString(date) + "_") + toString(amount)) + "_") + assetId) + "_") + nftId) + "_") + artId) + "_") + creatorAddr) + "_") + offerOwner) + "_") + id))]
472- }
473- }
474- }
475-
476-
477-
478-@Callable(i)
479-func acceptOffer (nftId,offerId,offerOwner) = {
480- let $t01689116984 = provideBaseData(i, nftId)
481- let id = $t01689116984._1
482- let caller = $t01689116984._2
483- let date = $t01689116984._3
484- let isValidNFT = $t01689116984._4
485- let artId = $t01689116984._5
486- let creatorAddr = $t01689116984._6
487- let artSignID = $t01689116984._7
488- if (!(isValidNFT))
489- then throw("Not a valid nft")
490- else {
491- let saleOwner = getSaleOwnerAndStatus(nftId)
492- if ((caller != saleOwner))
493- then throw("Only sale owner can accept offer")
494- else {
495- let bidKey = getBidKey(offerOwner, nftId, saleOwner, offerId)
496- let $t01724517300 = getBidData(bidKey)
497- let bidDataArr = $t01724517300._1
498- let assetId = $t01724517300._2
499- let bidData = $t01724517300._3
500- let saleKey = getSaleKey(saleOwner, nftId, artId, creatorAddr)
501- let saleInfo = getStrByK((saleKey + "_OPEN"))
502- if ((size(saleInfo) == 0))
503- then throw("Sale Not found!")
504- else {
505- let amount = value(parseInt(bidDataArr[1]))
506- let $t01754317674 = setTransfers(amount, assetId, nftId, creatorAddr, saleOwner, bidDataArr[6])
507- let commissions = $t01754317674._1
508- let creatorFee = $t01754317674._2
509- let ownerFee = $t01754317674._3
510- let collectorNFT = $t01754317674._4
511- let assetIdStr = if (isDefined(assetId))
512- then toBase58String(value(assetId))
513- else "WAVES"
514- ([DeleteEntry((saleKey + "_OPEN")), DeleteEntry((bidKey + "_OPEN")), DeleteEntry(((("sale2nd_status_" + saleOwner) + "_") + nftId)), DeleteEntry(("current_owner_on_dapp_" + nftId)), StringEntry((bidKey + "_CLOSED"), ((((bidData + "_CLOSED_") + toString(date)) + "_") + id)), StringEntry((((saleKey + "_") + id) + "_CLOSED"), ((((((((((saleInfo + "_CLOSED-OFFER_") + toString(date)) + "_") + id) + "_") + offerOwner) + "_") + toString(amount)) + "_") + assetIdStr)), updateNumSales(), creatorFee, ownerFee, collectorNFT] ++ commissions)
534+ let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
535+ if ((entryExist != ""))
536+ then throw("You already added it")
537+ else {
538+ let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
539+ if ((hashExist != ""))
540+ then throw("Hash already registered")
541+ else {
542+ let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
543+ if (!(isSignCertified))
544+ then throw("Sign Certificate not found for this address.")
545+ 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)]
546+ }
547+ }
515548 }
516549 }
517550 }
520553
521554
522555 @Callable(i)
523-func cancelOffer (nftId,offerId,offerOwner,saleOwner) = {
524- let $t01849418569 = idCallerDate(i)
525- let id = $t01849418569._1
526- let caller = $t01849418569._2
527- let date = $t01849418569._3
528- if (if ((caller != offerOwner))
529- then (caller != saleOwner)
556+func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler) = if (!(dappRunning))
557+ then throw(maintenanceMSG)
558+ else {
559+ let caller = toBase58String(i.caller.bytes)
560+ let $t02095321022 = setLIcence(cidLicence, sha256Licence)
561+ let licenceCID = $t02095321022._1
562+ let licenceHash = $t02095321022._2
563+ let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags)
564+ if ((validateArtwork != ""))
565+ then throw("Something went wrong!")
566+ else {
567+ let entryExist = getStringByKey(keyName(caller, txid))
568+ if ((entryExist == ""))
569+ then throw("Entry not found")
570+ else {
571+ let flag = getStringByKey(keyFlag(caller, txid))
572+ if ((flag == "ILLEGAL"))
573+ then throw("Cannot update ILLEGAL artwork")
574+ else if (!(isArtMinted(caller, txid)))
575+ 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)]
576+ else throw("Already minted")
577+ }
578+ }
579+ }
580+
581+
582+
583+@Callable(i)
584+func flagArtwork (artId,addr,flag,note) = {
585+ let $t02247822512 = idCallerDate(i)
586+ let id = $t02247822512._1
587+ let caller = $t02247822512._2
588+ if (containsElement([chris, toString(this)], caller))
589+ then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
590+ then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
591+ else throw(("Unknow status " + flag))
592+ else throw("You are not allowed")
593+ }
594+
595+
596+
597+@Callable(i)
598+func deleteArtwork (artId,addr) = {
599+ let $t02296222996 = idCallerDate(i)
600+ let id = $t02296222996._1
601+ let caller = $t02296222996._2
602+ let addrToUse = if (containsElement([chris, toString(this)], caller))
603+ then addr
604+ else caller
605+ let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
606+ if ((entryExist == ""))
607+ then throw("No art matching for this address")
608+ else {
609+ let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
610+ if ((sha256Hash == ""))
611+ then throw("No art hash matching for this address")
612+ else {
613+ let signID = getStringByKey(keySignID(addrToUse, artId))
614+ if ((signID == ""))
615+ then throw("No SIGN ID matching")
616+ else {
617+ 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))]
618+ if (!(isArtMinted(addrToUse, artId)))
619+ then if (!(dappRunning))
620+ then throw(maintenanceMSG)
621+ else dataToDelete
622+ else if (containsElement([chris, toString(this)], caller))
623+ then dataToDelete
624+ else throw("Art already minted, you cannot delete it")
625+ }
626+ }
627+ }
628+ }
629+
630+
631+
632+@Callable(i)
633+func sellArtwork (artId,price,maxMint,assetId,blockEnd) = {
634+ let $t02581725851 = idCallerDate(i)
635+ let id = $t02581725851._1
636+ let caller = $t02581725851._2
637+ let artworkName = getStringByKey(keyName(caller, artId))
638+ if ((artworkName == ""))
639+ then throw("This art doesn't match your account")
640+ else {
641+ let flag = getStringByKey(keyFlag(caller, artId))
642+ if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
643+ then throw("Flagged artwork")
644+ else {
645+ let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
646+ if ((0 > blockEnd))
647+ then throw("Negative end")
648+ else if (if ((blockEnd > 0))
649+ then if ((maxMint != 1))
650+ then true
651+ else (price != 0)
652+ else false)
653+ then throw("Timed offer only allowed for unique edition and offer only")
654+ else {
655+ let baseHeight = if ((blockEnd == 0))
656+ then 0
657+ else height
658+ if (!(acceptedAssetIds(assetId)))
659+ then throw("Something went wrong!")
660+ else if (!(validateMinSell(assetId, price)))
661+ then throw("Something went wrong!")
662+ else {
663+ let checkUser = validateUser(caller)
664+ if ((checkUser != ""))
665+ then throw(checkUser)
666+ else {
667+ let amountSold = getIntegerByKey(keyIssued(caller, artId))
668+ let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
669+ if ((maxMint > 100))
670+ then throw("100 editions max per artwork")
671+ else if (if ((amountSold != 0))
672+ then (amountSold == maxCanSell)
673+ else false)
674+ then throw("Max edition reached.")
675+ else if (if ((amountSold > 0))
676+ then (maxCanSell != maxMint)
677+ else false)
678+ then throw("Cannot change maximum issuable anymore")
679+ else if (if ((bidNbr > 0))
680+ then (maxCanSell != maxMint)
681+ else false)
682+ then throw("Cannot change maximum issuable with active orders")
683+ else {
684+ let sellStatus = if (if ((price > 0))
685+ then (maxMint > 0)
686+ else false)
687+ then true
688+ else false
689+[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))]
690+ }
691+ }
692+ }
693+ }
694+ }
695+ }
696+ }
697+
698+
699+
700+@Callable(i)
701+func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "")
702+
703+
704+
705+@Callable(i)
706+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 assetId = if (!(isDefined(payment.assetId)))
715+ then "WAVES"
716+ else toBase58String(value(payment.assetId))
717+ let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
718+ if (if ((blockEnd != 0))
719+ then (height >= blockEnd)
530720 else false)
531- then throw("You cannot cancel this offer.")
721+ then throw("Sale ended.")
532722 else {
533- let bidKey = getBidKey(offerOwner, nftId, saleOwner, offerId)
534- let $t01874318798 = getBidData(bidKey)
535- let bidDataArr = $t01874318798._1
536- let assetId = $t01874318798._2
537- let bidData = $t01874318798._3
538-[DeleteEntry((bidKey + "_OPEN")), StringEntry((bidKey + "_CANCELLED"), ((((bidData + "_CANCELLED_") + toString(date)) + "_") + id)), ScriptTransfer(Address(fromBase58String(caller)), parseIntValue(bidDataArr[1]), assetId)]
723+ let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
724+ if (!(acceptedAssetIds(assetId)))
725+ then throw("asset not accepted")
726+ else if (!(validateMinSell(assetId, amount)))
727+ then throw("Wrong min sell")
728+ else {
729+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
730+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
731+ if ((0 >= maxCanSell))
732+ then throw("No max edition set for this artwork")
733+ else if ((amountSold >= maxCanSell))
734+ then throw("Sold out, you cannot bid")
735+ else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
736+ }
737+ }
738+ }
739+
740+
741+
742+@Callable(i)
743+func acceptBid (artId,issuer,bidId,bidOwner) = {
744+ let caller = toBase58String(i.caller.bytes)
745+ if ((caller != issuer))
746+ then throw("You cannot do this action")
747+ else buyMint(i, artId, issuer, bidId, bidOwner)
748+ }
749+
750+
751+
752+@Callable(i)
753+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
758+ if (if ((caller != bidOwner))
759+ then (caller != issuer)
760+ else false)
761+ then throw("You cannot do this action")
762+ else {
763+ let returnMoneyTo = if ((caller == issuer))
764+ then bidOwner
765+ else caller
766+ let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
767+ let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
768+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
769+ if ((bidData == ""))
770+ then throw("Bid not found")
771+ else {
772+ let bidDataArr = split(bidData, "_")
773+ let assetId = getBidAssetId(bidDataArr[0])
774+ let bidStatus = "CANCELED"
775+[DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
776+ }
539777 }
540778 }
541779
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-func getStrByK (key) = valueOrElse(getString(this, key), "")
4+func getStringByKey (key) = valueOrElse(getString(this, key), "")
55
66
77 let unitTest = false
88
9-let oracleFee = value(addressFromString(getStrByK("conf_oracle_fee")))
9+let oracleFee = value(addressFromString(getStringByKey("conf_oracle_fee")))
1010
11-let feeReceiver = getStrByK("conf_fee_receiver")
11+let signDapp = value(addressFromString(getStringByKey("conf_signweb_dapp")))
1212
13-let artworksDapp = value(addressFromString(getStrByK("conf_artworks_dapp")))
13+let feeReceiver = getStringByKey("conf_fee_receiver")
1414
1515 let userDapp = if (unitTest)
1616 then value(addressFromString("3Mt4RGMEyjSWYAocTPqd55wdHQQB3PU2UCm"))
17- else value(addressFromString(getStrByK("conf_users_dapp")))
17+ else value(addressFromString(getStringByKey("conf_users_dapp")))
1818
19-let signAssetId = fromBase58String(getStrByK("conf_accepted_asset_SIGN"))
19+let whitelistDapp = value(addressFromString(getStringByKey("conf_whitelist_dapp")))
2020
21-let usdnAssetId = fromBase58String(getStrByK("conf_accepted_asset_USDN"))
21+let signAssetId = fromBase58String(getStringByKey("conf_accepted_asset_SIGN"))
2222
23-let usdtAssetId = fromBase58String(getStrByK("conf_accepted_asset_USDT"))
23+let usdnAssetId = fromBase58String(getStringByKey("conf_accepted_asset_USDN"))
24+
25+let usdtAssetId = fromBase58String(getStringByKey("conf_accepted_asset_USDT"))
2426
2527 let wavesAssetId = base58''
2628
27-let chris = getStrByK("conf_admin_1")
29+let chris = getStringByKey("conf_admin_1")
2830
29-let signCut = 3
31+func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
3032
31-let creatorCut = 10
33+
34+func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
35+
36+
37+func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
38+
39+
40+func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
41+
42+
43+let signCut = 7
44+
45+let usdnWaveCut = 10
46+
47+let defaultLicence = getStringByKey("conf_default_licence")
48+
49+let defaultHashLicence = getStringByKey("conf_default_licence_hash")
50+
51+let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
52+
53+let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
3254
3355 let userSuspended = "SUSPENDED"
3456
3557 let userRemoved = "REMOVED"
3658
37-let artIllegal = "ILLEGAL"
59+let userUnregistered = "UNREGISTERED"
3860
39-let artSuspended = "SUSPENDED"
61+let userAllowed = "ALLOWED"
4062
41-let dappRunningKey = "conf_dapp_is_running"
63+let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
4264
43-let maintenanceMSGKey = "conf_maintenance_msg"
44-
45-let dappRunning = valueOrElse(getBoolean(this, dappRunningKey), true)
46-
47-let maintenanceMSG = valueOrElse(getString(this, maintenanceMSGKey), "")
48-
49-let numSalesK = "num_sales"
50-
51-func getUserStrByK (key) = valueOrElse(getString(userDapp, key), "Error")
65+func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signDapp, ((("data_fc_" + signID) + "_") + Owner)) {
66+ case a: String =>
67+ if (contains(a, sha256Hash))
68+ then true
69+ else false
70+ case _ =>
71+ false
72+}
5273
5374
54-func getArtStrByK (key) = valueOrElse(getString(artworksDapp, key), "")
75+func validateCID (cid) = if (contains(cid, "/"))
76+ then if (if ((76 > size(cid)))
77+ then (size(split(cid, "/")[0]) == 59)
78+ else false)
79+ then (16 > size(split(cid, "/")[1]))
80+ else false
81+ else false
5582
5683
57-func getIntByK (key) = valueOrElse(getInteger(this, key), 0)
84+func validateHash (hash) = (size(hash) == 64)
5885
5986
60-func keyUserStatus (addr) = ("user_status_" + addr)
87+func keyUserStatus (caller) = ("user_status_" + caller)
6188
6289
63-func keySignID (artistAddr,artId) = ((("art_signid_" + artId) + "_") + artistAddr)
90+func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
6491
6592
66-func keyFlag (artistAddr,artId) = ((("art_flag_" + artId) + "_") + artistAddr)
93+func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
6794
6895
69-func keyNFTData (id) = ("nft_" + id)
96+func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
7097
7198
72-func getSaleKey (caller,nftId,artId,creatorAddr) = ((((((("sale2nd_info_" + caller) + "_") + nftId) + "_") + artId) + "_") + creatorAddr)
99+func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
73100
74101
75-func getBidKey (offerOwner,nftId,saleOwner,offerId) = ((((((("offer2nd_" + offerOwner) + "_") + nftId) + "_") + saleOwner) + "_") + offerId)
102+func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
76103
77104
78-func getIntByKFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
105+func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
79106
80107
81-let currentCertificationPrice = getIntByKFromOracle(("certification_fee_" + toBase58String(signAssetId)))
108+func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
109+
110+
111+func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
112+
113+
114+func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
115+
116+
117+func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
118+
119+
120+func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
121+
122+
123+func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
124+
125+
126+func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
127+
128+
129+func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
130+
131+
132+func keyNote (caller,artId) = ((("art_note_" + artId) + "_") + caller)
133+
134+
135+func keyCrawler (caller,artId) = ((("art_crawler_cid_" + artId) + "_") + caller)
136+
137+
138+func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
139+
140+
141+func keyEndSale (caller,artId) = ((("art_endsale_" + artId) + "_") + caller)
142+
143+
144+func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
145+
146+
147+func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
148+
82149
83150 func keyArtistAgentAddr (artistAddr) = ("artist_agent_" + artistAddr)
84151
85152
86-func keySecondaryShare (artistAddr) = ("artist_agent_secondary_" + artistAddr)
153+func keyPrimaryShare (artistAddr) = ("artist_agent_primary_" + artistAddr)
87154
88155
89-func idCallerDate (i) = if (!(dappRunning))
90- then throw(maintenanceMSG)
91- else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
156+func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
157+
158+
159+func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
160+
161+
162+func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
163+
164+
165+func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
166+
167+
168+func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
169+ then throw("Wrong Display CID")
170+ else if (!(validateCID(cidExport)))
171+ then throw("Wrong Export CID")
172+ else if (if ((cidLicence != ""))
173+ then !(validateCID(cidLicence))
174+ else false)
175+ then throw("Wrong Licence CID")
176+ else true
177+
178+
179+func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
180+ then throw("Export Hash 64 char. max")
181+ else if (!(validateHash(sha256Licence)))
182+ then throw("Licence Hash 64 char. max")
183+ else true
184+
185+
186+func validateString (str,max) = if ((size(str) == 0))
187+ then throw("Field cannot be is empty")
188+ else if ((size(str) > max))
189+ then throw((str + " is too long"))
190+ else true
191+
192+
193+func validateUser (caller) = {
194+ let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
195+ if (if ((userStatus == userUnregistered))
196+ then true
197+ else (userStatus == userAllowed))
198+ then "Register this account first with \"Account\" tab"
199+ else if ((userStatus == userSuspended))
200+ then "Account suspended"
201+ else if ((userStatus == userRemoved))
202+ then "Account removed"
203+ else ""
204+ }
205+
206+
207+func setLIcence (cidLicence,sha256Licence) = {
208+ let cid = if ((size(cidLicence) == 0))
209+ then defaultLicence
210+ else cidLicence
211+ let hash = if ((size(sha256Licence) == 0))
212+ then defaultHashLicence
213+ else sha256Licence
214+ $Tuple2(cid, hash)
215+ }
216+
217+
218+func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags) = {
219+ let checkUser = validateUser(caller)
220+ if ((checkUser != ""))
221+ then throw(checkUser)
222+ else if ((size(cidDisplay) == 0))
223+ then throw("Display CID cannot be empty")
224+ else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
225+ then throw("Problem with CID")
226+ else if (!(validateAllHash(sha256Export, licenceHash)))
227+ then throw("Problem with Hashes")
228+ else if (!(validateString(name, 100)))
229+ then throw("100 Char. max name")
230+ else if (!(validateString(description, 1000)))
231+ then throw("1000 Char. max description")
232+ else if ((size(split(tags, ",")) > 5))
233+ then throw("5 tags max.")
234+ else ""
235+ }
92236
93237
94238 func isPayment (i) = if ((size(i.payments) == 0))
95239 then throw("No payment attached")
96240 else {
97241 let payment = value(i.payments[0])
98242 let amount = value(payment.amount)
99243 $Tuple2(payment, amount)
100244 }
101245
102246
103-func assetIsValid (assetDetails) = if (if (if ((assetDetails.quantity == 1))
104- then (assetDetails.decimals == 0)
105- else false)
106- then (assetDetails.reissuable == false)
107- else false)
108- then (assetDetails.issuer == artworksDapp)
109- else false
247+func validatePayment (i) = {
248+ let $t086758711 = isPayment(i)
249+ let payment = $t086758711._1
250+ let amount = $t086758711._2
251+ let assetId = if (if (isDefined(payment.assetId))
252+ then (payment.assetId == signAssetId)
253+ else false)
254+ then payment.assetId
255+ else throw("Only SIGN token accepted as transaction fee")
256+ if ((amount != currentCertificationPrice))
257+ then throw(("Payment amount should be " + toString(currentCertificationPrice)))
258+ else $Tuple2(amount, assetId)
259+ }
110260
111261
112-func isSignArtNFT (id) = {
113- let assetDetails = value(assetInfo(id))
114- assetIsValid(assetDetails)
262+func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
263+ case b: Int =>
264+ if ((b != 0))
265+ then true
266+ else false
267+ case _ =>
268+ false
269+}
270+
271+
272+func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
273+ let $t093189354 = isPayment(i)
274+ let payment = $t093189354._1
275+ let amount = $t093189354._2
276+ let assetId = if (!(isDefined(payment.assetId)))
277+ then unit
278+ else if (if ((size(priceAssetId) > 0))
279+ then (toBase58String(value(payment.assetId)) == priceAssetId)
280+ else false)
281+ then payment.assetId
282+ else throw("Wrong asset id")
283+ if (if ((assetId == unit))
284+ then (priceAssetId != "")
285+ else false)
286+ then throw("Wrong asset id")
287+ else if ((artworkPrice != amount))
288+ then throw("Payment don't match")
289+ else $Tuple2(amount, assetId)
115290 }
116291
117292
118293 func acceptedAssetIds (assetId) = if (if (if (if (if ((assetId != toBase58String(signAssetId)))
119294 then (assetId != toBase58String(wavesAssetId))
120295 else false)
121296 then (assetId != "WAVES")
122297 else false)
123298 then (assetId != toBase58String(usdnAssetId))
124299 else false)
125300 then (assetId != toBase58String(usdtAssetId))
126301 else false)
127- then false
302+ then throw("Only SIGN, USDN,USDT or WAVES accepted")
128303 else true
129-
130-
131-func getBidAssetId (assetId) = if ((assetId == "WAVES"))
132- then unit
133- else fromBase58String(assetId)
134-
135-
136-func getSaleOwnerAndStatus (nftid) = {
137- let saleOwner = getStrByK(("current_owner_on_dapp_" + nftid))
138- if ((size(saleOwner) == 0))
139- then throw("NFT not found")
140- else {
141- let saleStatus = getStrByK(((("sale2nd_status_" + saleOwner) + "_") + nftid))
142- if ((saleStatus != "OPEN"))
143- then throw("NFT not for sale")
144- else saleOwner
145- }
146- }
147-
148-
149-func getBidData (key) = {
150- let bidData = getStrByK((key + "_OPEN"))
151- if ((bidData == ""))
152- then throw("Offer not found")
153- else {
154- let bidDataArr = split(bidData, "_")
155- let assetId = getBidAssetId(bidDataArr[2])
156- $Tuple3(bidDataArr, assetId, bidData)
157- }
158- }
159-
160-
161-func artIsValid (artStatus) = if ((artStatus != artIllegal))
162- then (artStatus != artSuspended)
163- else false
164-
165-
166-func checkArtStatus (addr,id) = {
167- let artStatus = getArtStrByK(keyFlag(addr, id))
168- if (artIsValid(artStatus))
169- then true
170- else throw(("Original Artwork flagged as " + artStatus))
171- }
172-
173-
174-func checkArtistStatus (addr) = {
175- let artistStatus = getUserStrByK(keyUserStatus(addr))
176- if (containsElement([userSuspended, userRemoved], artistStatus))
177- then throw(("Original Artist " + artistStatus))
178- else true
179- }
180-
181-
182-func checkNFTInfo (assetId) = {
183- let nftData = split(getArtStrByK(keyNFTData(assetId)), "_")
184- let artSignID = getArtStrByK(keySignID(nftData[6], nftData[5]))
185- if (if (!(checkArtStatus(nftData[6], nftData[5])))
186- then !(checkArtistStatus(nftData[6]))
187- else false)
188- then $Tuple4(false, nftData[5], nftData[6], artSignID)
189- else $Tuple4(true, nftData[5], nftData[6], artSignID)
190- }
191-
192-
193-func setTransfers (amount,assetId,nftid,creatorAddr,saleOwner,caller) = {
194- let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(creatorAddr)), feeReceiver)
195- let agentShare = valueOrElse(getInteger(userDapp, keySecondaryShare(creatorAddr)), 0)
196- let amountForSign = fraction(amount, signCut, 100)
197- let amountForCreator = fraction(amount, creatorCut, 100)
198- let amountForOwner = (amount - (amountForSign + amountForCreator))
199- let amountForAgent = if (if ((agent != feeReceiver))
200- then (agentShare > 0)
201- else false)
202- then fraction(amount, agentShare, 100)
203- else 0
204- let commissions = if ((amountForAgent != 0))
205- then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
206- else [ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId)]
207- let creatorFee = ScriptTransfer(Address(fromBase58String(creatorAddr)), amountForCreator, assetId)
208- let ownerFee = ScriptTransfer(Address(fromBase58String(saleOwner)), amountForOwner, assetId)
209- let collectorNFT = ScriptTransfer(Address(fromBase58String(caller)), 1, fromBase58String(nftid))
210- $Tuple4(commissions, creatorFee, ownerFee, collectorNFT)
211- }
212304
213305
214306 func validateMinSell (assetId,price) = {
215307 let minSellWaves = if (unitTest)
216308 then 10
217- else getIntByKFromOracle("waves_min_sell")
309+ else getIntegerByKeyFromOracle("waves_min_sell")
218310 let minSellUsdn = 1000000
219311 let minSellSign = if (unitTest)
220312 then 1
221313 else (currentCertificationPrice * 2)
222314 if (if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
223315 then (minSellUsdn > price)
224316 else false)
225317 then (price != 0)
226318 else false)
227319 then true
228320 else if (if ((assetId == toBase58String(usdtAssetId)))
229321 then (minSellUsdn > price)
230322 else false)
231323 then (price != 0)
232324 else false)
233325 then true
234326 else if (if ((assetId == toBase58String(signAssetId)))
235327 then (minSellSign > price)
236328 else false)
237329 then (price != 0)
238330 else false)
239331 then true
240332 else if (if (if ((assetId == toBase58String(wavesAssetId)))
241333 then true
242334 else (assetId == "WAVES"))
243335 then (minSellWaves > price)
244336 else false)
245337 then (price != 0)
246338 else false)
247- then false
339+ then throw("Wrong minimum sell price")
248340 else true
249341 }
250342
251343
252-func provideBaseData (i,nftId) = {
253- let $t093049344 = idCallerDate(i)
254- let id = $t093049344._1
255- let caller = $t093049344._2
256- let date = $t093049344._3
257- let $t093489417 = checkNFTInfo(nftId)
258- let isValidNFT = $t093489417._1
259- let artId = $t093489417._2
260- let creatorAddr = $t093489417._3
261- let artSignID = $t093489417._4
262- $Tuple7(id, caller, date, isValidNFT, artId, creatorAddr, artSignID)
344+func getBidAssetId (assetId) = if ((assetId == "WAVES"))
345+ then unit
346+ else fromBase58String(assetId)
347+
348+
349+func getPriceAssetIdFromBid (bidDataKey) = {
350+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
351+ if ((bidData == ""))
352+ then throw("Bid not found")
353+ else {
354+ let bidDataArr = split(bidData, "_")
355+ let bidAmount = parseIntValue(bidDataArr[1])
356+ let bidAssetId = getBidAssetId(bidDataArr[0])
357+ if ((0 >= bidAmount))
358+ then throw("Wrong amount")
359+ else $Tuple2(bidAmount, bidAssetId)
360+ }
263361 }
264362
265363
266-func updateNumSales () = {
267- let numSales = getIntByK(numSalesK)
268- IntegerEntry(numSalesK, (numSales + 1))
364+func idCallerDate (i) = if (!(dappRunning))
365+ then throw(maintenanceMSG)
366+ else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
367+
368+
369+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
374+ let isBid = if (if (if ((toBase58String(i.caller.bytes) == issuer))
375+ then (bidOwner != "")
376+ else false)
377+ then (bidId != "")
378+ else false)
379+ then true
380+ else false
381+ let blockEnd = getIntegerByKey(keyEndSale(caller, artId))
382+ if (if (if ((blockEnd != 0))
383+ then (height >= blockEnd)
384+ else false)
385+ then !(isBid)
386+ else false)
387+ then throw("Sale ended.")
388+ else {
389+ let callerIsIssuer = (toBase58String(i.caller.bytes) == issuer)
390+ let totalNFT = getIntegerByKey("total_nft_issued")
391+ let signID = getStringByKey(keySignID(issuer, artId))
392+ let artworkName = getStringByKey(keyName(issuer, artId))
393+ if ((artworkName == ""))
394+ then throw("Art doesn't exist")
395+ else {
396+ let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
397+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
398+ let artworkPrice = if (callerIsIssuer)
399+ then (currentCertificationPrice * 2)
400+ else getIntegerByKey(keyPrice(issuer, artId))
401+ let priceAssetId = if (callerIsIssuer)
402+ then toBase58String(signAssetId)
403+ else getStringByKey(keyAssetIdAccepted(issuer, artId))
404+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
405+ if (if (if (!(isBid))
406+ then !(callerIsIssuer)
407+ else false)
408+ then if (if ((0 >= artworkPrice))
409+ then true
410+ else !(isOnSale))
411+ then true
412+ else (0 >= maxCanSell)
413+ else false)
414+ then throw("Art not for sale")
415+ else if (if (if (!(isBid))
416+ then callerIsIssuer
417+ else false)
418+ then (0 >= maxCanSell)
419+ else false)
420+ then throw("Max issuable not set")
421+ else {
422+ let checkUser = validateUser(issuer)
423+ if (if (isBid)
424+ then (checkUser != "")
425+ else false)
426+ then throw(checkUser)
427+ else {
428+ let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
429+ let $t01365713828 = if (isBid)
430+ then getPriceAssetIdFromBid(bidDataKey)
431+ else validatePriceAssetId(i, priceAssetId, artworkPrice)
432+ let amount = $t01365713828._1
433+ let assetId = $t01365713828._2
434+ let agent = valueOrElse(getString(userDapp, keyArtistAgentAddr(issuer)), feeReceiver)
435+ let agentShare = valueOrElse(getInteger(userDapp, keyPrimaryShare(issuer)), 0)
436+ let isWhitelisted = checkWhitelist(issuer)
437+ let cut = if ((isWhitelisted > height))
438+ then 0
439+ else if ((assetId == signAssetId))
440+ then signCut
441+ else usdnWaveCut
442+ let amountForSign = fraction(amount, cut, 100)
443+ let amountForAgent = if (if (if ((agent != feeReceiver))
444+ then (agentShare > 0)
445+ else false)
446+ then (height > isWhitelisted)
447+ else false)
448+ then fraction(amount, agentShare, 100)
449+ else 0
450+ let amountForCreator = (amount - amountForSign)
451+ if ((amountSold == maxCanSell))
452+ then throw("Art sold out")
453+ else {
454+ let newAmountSold = (amountSold + 1)
455+ let issueMeta = ((((((((((("Creator: " + issuer) + ",
456+ ArtID: ") + artId) + ",
457+ SignID: ") + signID) + ",
458+ Artwork name: ") + artworkName) + ",
459+ Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
460+ let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
461+ let idNFT = calculateAssetId(issueNFT)
462+ let sellStatus = if (if ((newAmountSold == maxCanSell))
463+ then true
464+ else !(isOnSale))
465+ then false
466+ else true
467+ let receiveNFT = if (if (if ((caller == issuer))
468+ then (bidOwner != "")
469+ else false)
470+ then (bidId != "")
471+ else false)
472+ then addressFromStringValue(bidOwner)
473+ else i.caller
474+ let assetIdBid = if (!(isDefined(assetId)))
475+ then "WAVES"
476+ else toBase58String(value(assetId))
477+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
478+ let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
479+ let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
480+ let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
481+ let soldValue = if (!(isBid))
482+ then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
483+ else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
484+ let soldData = StringEntry(soldKey, soldValue)
485+ let commissions = if ((amountForAgent != 0))
486+ then [ScriptTransfer(Address(fromBase58String(feeReceiver)), (amountForSign - amountForAgent), assetId), ScriptTransfer(Address(fromBase58String(agent)), amountForAgent, assetId)]
487+ 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)
489+ if (isBid)
490+ then [soldData, bidUpdate, bidDelOld] :: buyRes
491+ else soldData :: buyRes
492+ }
493+ }
494+ }
495+ }
496+ }
269497 }
270498
271499
272500 @Callable(invoke)
273501 func setConf (key,val) = {
274502 let caller = toString(invoke.caller)
275503 if (containsElement([chris, toString(this)], caller))
276504 then if (contains(key, "conf_"))
277505 then [StringEntry(key, val)]
278506 else throw("Entries starting with conf_ only")
279507 else throw("You are not allowed to change this")
280508 }
281509
282510
283511
284-@Callable(invoke)
285-func appRunning (isLive,message) = {
286- let caller = toString(invoke.caller)
287- let id = toBase58String(invoke.transactionId)
288- if (containsElement([chris, toString(this)], caller))
289- then [BooleanEntry(dappRunningKey, isLive), StringEntry(maintenanceMSGKey, message)]
290- else throw("You are not allowed to change this")
291- }
292-
293-
294-
295512 @Callable(i)
296-func sellNFT (price,asset) = {
297- let $t01052210558 = isPayment(i)
298- let payment = $t01052210558._1
299- let amount = $t01052210558._2
300- if ((amount != 1))
301- then throw("No NFT attached")
513+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
518+ if (!(validateHash(sha256Hash)))
519+ then throw("Hash should be 64 characters maximum")
302520 else {
303- let nftId = if (if (isDefined(payment.assetId))
304- then isSignArtNFT(value(payment.assetId))
305- else false)
306- then toBase58String(value(payment.assetId))
307- else throw("Only SIGN Art NFT accepted.")
308- let $t01079610889 = provideBaseData(i, nftId)
309- let id = $t01079610889._1
310- let caller = $t01079610889._2
311- let date = $t01079610889._3
312- let isValidNFT = $t01079610889._4
313- let artId = $t01079610889._5
314- let creatorAddr = $t01079610889._6
315- let artSignID = $t01079610889._7
316- if ((size(artSignID) == 0))
317- then throw("Artwork not found on SIGN Art")
318- else if (!(isValidNFT))
319- then throw("Not a valid nft")
320- else if (!(acceptedAssetIds(asset)))
321- then throw("Only SIGN, USDN, USDT or WAVES accepted")
322- else if (!(validateMinSell(asset, price)))
323- then throw("Wrong minimum sell price")
324- else [StringEntry((getSaleKey(caller, nftId, artId, creatorAddr) + "_OPEN"), ((((((((((((toString(date) + "_") + toString(price)) + "_") + asset) + "_") + nftId) + "_") + artId) + "_") + creatorAddr) + "_") + id)), StringEntry(((("sale2nd_status_" + caller) + "_") + nftId), "OPEN"), StringEntry(("current_owner_on_dapp_" + nftId), caller)]
325- }
326- }
327-
328-
329-
330-@Callable(i)
331-func updateSalePrice (nftId,price,asset) = {
332- let $t01179311886 = provideBaseData(i, nftId)
333- let id = $t01179311886._1
334- let caller = $t01179311886._2
335- let date = $t01179311886._3
336- let isValidNFT = $t01179311886._4
337- let artId = $t01179311886._5
338- let creatorAddr = $t01179311886._6
339- let artSignID = $t01179311886._7
340- if ((size(artSignID) == 0))
341- then throw("Artwork not found on SIGN Art, cancel your sale.")
342- else if (!(isValidNFT))
343- then throw("Not a valid nft")
344- else {
345- let saleOwner = getStrByK(("current_owner_on_dapp_" + nftId))
346- if ((saleOwner != caller))
347- then throw("You don't own this NFT")
348- else {
349- let saleStatus = getStrByK(((("sale2nd_status_" + caller) + "_") + nftId))
350- if ((saleStatus != "OPEN"))
351- then throw("Sale not active")
352- else if (!(acceptedAssetIds(asset)))
353- then throw("Only SIGN, USDN, USDT or WAVES accepted")
354- else if (!(validateMinSell(asset, price)))
355- then throw("Wrong minimum sell price")
356- else {
357- let saleKey = getSaleKey(caller, nftId, artId, creatorAddr)
358- let saleInfo = split(getStrByK((saleKey + "_OPEN")), "_")
359-[StringEntry((saleKey + "_OPEN"), ((((((((((((saleInfo[0] + "_") + toString(price)) + "_") + asset) + "_") + saleInfo[3]) + "_") + saleInfo[4]) + "_") + saleInfo[5]) + "_") + saleInfo[6]))]
360- }
361- }
362- }
363- }
364-
365-
366-
367-@Callable(i)
368-func cancelSale (nftId) = {
369- let $t01306313307 = provideBaseData(i, nftId)
370- let id = $t01306313307._1
371- let caller = $t01306313307._2
372- let date = $t01306313307._3
373- let isValidNFT = $t01306313307._4
374- let artId = $t01306313307._5
375- let creatorAddr = $t01306313307._6
376- let artSignID = $t01306313307._7
377- let saleOwner = getStrByK(("current_owner_on_dapp_" + nftId))
378- if ((saleOwner != caller))
379- then throw("You don't own this NFT")
380- else {
381- let saleStatus = getStrByK(((("sale2nd_status_" + caller) + "_") + nftId))
382- if ((saleStatus != "OPEN"))
383- then throw("Sale not active")
521+ let $t01783817907 = setLIcence(cidLicence, sha256Licence)
522+ let licenceCID = $t01783817907._1
523+ let licenceHash = $t01783817907._2
524+ let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags)
525+ if ((validateArtwork != ""))
526+ then throw("Something went wrong!")
384527 else {
385- let saleKey = getSaleKey(caller, nftId, artId, creatorAddr)
386- let saleInfo = getStrByK((saleKey + "_OPEN"))
387-[DeleteEntry((saleKey + "_OPEN")), DeleteEntry(((("sale2nd_status_" + caller) + "_") + nftId)), DeleteEntry(("current_owner_on_dapp_" + nftId)), StringEntry((((saleKey + "_") + id) + "_CANCELLED"), ((((saleInfo + "_CANCELLED_") + toString(date)) + "_") + id)), ScriptTransfer(Address(fromBase58String(caller)), 1, fromBase58String(nftId))]
388- }
389- }
390- }
391-
392-
393-
394-@Callable(i)
395-func buyNFT (nftId) = {
396- let $t01416114254 = provideBaseData(i, nftId)
397- let id = $t01416114254._1
398- let caller = $t01416114254._2
399- let date = $t01416114254._3
400- let isValidNFT = $t01416114254._4
401- let artId = $t01416114254._5
402- let creatorAddr = $t01416114254._6
403- let artSignID = $t01416114254._7
404- if ((size(artSignID) == 0))
405- then throw("Artwork not found on SIGN Art, cancel your sale.")
406- else if (!(isValidNFT))
407- then throw("Not a valid nft")
408- else {
409- let saleOwner = getSaleOwnerAndStatus(nftId)
410- let saleKey = getSaleKey(saleOwner, nftId, artId, creatorAddr)
411- let saleInfo = getStrByK((saleKey + "_OPEN"))
412- if ((size(saleInfo) == 0))
413- then throw("Sale Not found!")
414- else {
415- let saleInfoArray = split(saleInfo, "_")
416- if ((parseInt(saleInfoArray[1]) == 0))
417- then throw("Offer only")
418- else {
419- let $t01476314799 = isPayment(i)
420- let payment = $t01476314799._1
421- let amount = $t01476314799._2
422- let paymentAssetStr = if (isDefined(payment.assetId))
423- then toBase58String(value(payment.assetId))
424- else ""
425- if (if ((saleInfoArray[1] != toString(amount)))
426- then true
427- else (saleInfoArray[2] != paymentAssetStr))
428- then throw("Payment infos don't match.")
429- else {
430- let $t01531315445 = setTransfers(amount, payment.assetId, nftId, creatorAddr, saleOwner, caller)
431- let commissions = $t01531315445._1
432- let creatorFee = $t01531315445._2
433- let ownerFee = $t01531315445._3
434- let collectorNFT = $t01531315445._4
435- ([DeleteEntry((saleKey + "_OPEN")), DeleteEntry(((("sale2nd_status_" + saleOwner) + "_") + nftId)), DeleteEntry(("current_owner_on_dapp_" + nftId)), StringEntry((((saleKey + "_") + id) + "_CLOSED"), ((((((saleInfo + "_CLOSED_") + toString(date)) + "_") + id) + "_") + caller)), updateNumSales(), creatorFee, ownerFee, collectorNFT] ++ commissions)
436- }
437- }
438- }
439- }
440- }
441-
442-
443-
444-@Callable(i)
445-func setOffer (nftId) = {
446- let $t01587315970 = provideBaseData(i, nftId)
447- let id = $t01587315970._1
448- let offerOwner = $t01587315970._2
449- let date = $t01587315970._3
450- let isValidNFT = $t01587315970._4
451- let artId = $t01587315970._5
452- let creatorAddr = $t01587315970._6
453- let artSignID = $t01587315970._7
454- if (!(isValidNFT))
455- then throw("Not a valid nft")
456- else {
457- let $t01603416070 = isPayment(i)
458- let payment = $t01603416070._1
459- let amount = $t01603416070._2
460- let assetId = if (!(isDefined(payment.assetId)))
461- then "WAVES"
462- else toBase58String(value(payment.assetId))
463- if (!(acceptedAssetIds(assetId)))
464- then throw("asset not accepted")
465- else if ((amount == 0))
466- then throw("Offer of 0 not allowed")
467- else if (!(validateMinSell(assetId, amount)))
468- then throw("Wrong minimum sell price")
528+ let $t01813118173 = validatePayment(i)
529+ let amount = $t01813118173._1
530+ let assetId = $t01813118173._2
531+ if (!(isDefined(amount)))
532+ then throw("Something went wrong")
469533 else {
470- let saleOwner = getSaleOwnerAndStatus(nftId)
471-[StringEntry((getBidKey(offerOwner, nftId, saleOwner, id) + "_OPEN"), ((((((((((((((toString(date) + "_") + toString(amount)) + "_") + assetId) + "_") + nftId) + "_") + artId) + "_") + creatorAddr) + "_") + offerOwner) + "_") + id))]
472- }
473- }
474- }
475-
476-
477-
478-@Callable(i)
479-func acceptOffer (nftId,offerId,offerOwner) = {
480- let $t01689116984 = provideBaseData(i, nftId)
481- let id = $t01689116984._1
482- let caller = $t01689116984._2
483- let date = $t01689116984._3
484- let isValidNFT = $t01689116984._4
485- let artId = $t01689116984._5
486- let creatorAddr = $t01689116984._6
487- let artSignID = $t01689116984._7
488- if (!(isValidNFT))
489- then throw("Not a valid nft")
490- else {
491- let saleOwner = getSaleOwnerAndStatus(nftId)
492- if ((caller != saleOwner))
493- then throw("Only sale owner can accept offer")
494- else {
495- let bidKey = getBidKey(offerOwner, nftId, saleOwner, offerId)
496- let $t01724517300 = getBidData(bidKey)
497- let bidDataArr = $t01724517300._1
498- let assetId = $t01724517300._2
499- let bidData = $t01724517300._3
500- let saleKey = getSaleKey(saleOwner, nftId, artId, creatorAddr)
501- let saleInfo = getStrByK((saleKey + "_OPEN"))
502- if ((size(saleInfo) == 0))
503- then throw("Sale Not found!")
504- else {
505- let amount = value(parseInt(bidDataArr[1]))
506- let $t01754317674 = setTransfers(amount, assetId, nftId, creatorAddr, saleOwner, bidDataArr[6])
507- let commissions = $t01754317674._1
508- let creatorFee = $t01754317674._2
509- let ownerFee = $t01754317674._3
510- let collectorNFT = $t01754317674._4
511- let assetIdStr = if (isDefined(assetId))
512- then toBase58String(value(assetId))
513- else "WAVES"
514- ([DeleteEntry((saleKey + "_OPEN")), DeleteEntry((bidKey + "_OPEN")), DeleteEntry(((("sale2nd_status_" + saleOwner) + "_") + nftId)), DeleteEntry(("current_owner_on_dapp_" + nftId)), StringEntry((bidKey + "_CLOSED"), ((((bidData + "_CLOSED_") + toString(date)) + "_") + id)), StringEntry((((saleKey + "_") + id) + "_CLOSED"), ((((((((((saleInfo + "_CLOSED-OFFER_") + toString(date)) + "_") + id) + "_") + offerOwner) + "_") + toString(amount)) + "_") + assetIdStr)), updateNumSales(), creatorFee, ownerFee, collectorNFT] ++ commissions)
534+ let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
535+ if ((entryExist != ""))
536+ then throw("You already added it")
537+ else {
538+ let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
539+ if ((hashExist != ""))
540+ then throw("Hash already registered")
541+ else {
542+ let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
543+ if (!(isSignCertified))
544+ then throw("Sign Certificate not found for this address.")
545+ 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)]
546+ }
547+ }
515548 }
516549 }
517550 }
518551 }
519552
520553
521554
522555 @Callable(i)
523-func cancelOffer (nftId,offerId,offerOwner,saleOwner) = {
524- let $t01849418569 = idCallerDate(i)
525- let id = $t01849418569._1
526- let caller = $t01849418569._2
527- let date = $t01849418569._3
528- if (if ((caller != offerOwner))
529- then (caller != saleOwner)
556+func updateArtwork (txid,name,description,tags,type,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence,crawler) = if (!(dappRunning))
557+ then throw(maintenanceMSG)
558+ else {
559+ let caller = toBase58String(i.caller.bytes)
560+ let $t02095321022 = setLIcence(cidLicence, sha256Licence)
561+ let licenceCID = $t02095321022._1
562+ let licenceHash = $t02095321022._2
563+ let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags)
564+ if ((validateArtwork != ""))
565+ then throw("Something went wrong!")
566+ else {
567+ let entryExist = getStringByKey(keyName(caller, txid))
568+ if ((entryExist == ""))
569+ then throw("Entry not found")
570+ else {
571+ let flag = getStringByKey(keyFlag(caller, txid))
572+ if ((flag == "ILLEGAL"))
573+ then throw("Cannot update ILLEGAL artwork")
574+ else if (!(isArtMinted(caller, txid)))
575+ 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)]
576+ else throw("Already minted")
577+ }
578+ }
579+ }
580+
581+
582+
583+@Callable(i)
584+func flagArtwork (artId,addr,flag,note) = {
585+ let $t02247822512 = idCallerDate(i)
586+ let id = $t02247822512._1
587+ let caller = $t02247822512._2
588+ if (containsElement([chris, toString(this)], caller))
589+ then if (containsElement(["CONSENT", "", "CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
590+ then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyNote(addr, artId), note)]
591+ else throw(("Unknow status " + flag))
592+ else throw("You are not allowed")
593+ }
594+
595+
596+
597+@Callable(i)
598+func deleteArtwork (artId,addr) = {
599+ let $t02296222996 = idCallerDate(i)
600+ let id = $t02296222996._1
601+ let caller = $t02296222996._2
602+ let addrToUse = if (containsElement([chris, toString(this)], caller))
603+ then addr
604+ else caller
605+ let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
606+ if ((entryExist == ""))
607+ then throw("No art matching for this address")
608+ else {
609+ let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
610+ if ((sha256Hash == ""))
611+ then throw("No art hash matching for this address")
612+ else {
613+ let signID = getStringByKey(keySignID(addrToUse, artId))
614+ if ((signID == ""))
615+ then throw("No SIGN ID matching")
616+ else {
617+ 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))]
618+ if (!(isArtMinted(addrToUse, artId)))
619+ then if (!(dappRunning))
620+ then throw(maintenanceMSG)
621+ else dataToDelete
622+ else if (containsElement([chris, toString(this)], caller))
623+ then dataToDelete
624+ else throw("Art already minted, you cannot delete it")
625+ }
626+ }
627+ }
628+ }
629+
630+
631+
632+@Callable(i)
633+func sellArtwork (artId,price,maxMint,assetId,blockEnd) = {
634+ let $t02581725851 = idCallerDate(i)
635+ let id = $t02581725851._1
636+ let caller = $t02581725851._2
637+ let artworkName = getStringByKey(keyName(caller, artId))
638+ if ((artworkName == ""))
639+ then throw("This art doesn't match your account")
640+ else {
641+ let flag = getStringByKey(keyFlag(caller, artId))
642+ if (containsElement(["CHANGE_REQUIRED", "FLAGGED", "ILLEGAL"], flag))
643+ then throw("Flagged artwork")
644+ else {
645+ let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
646+ if ((0 > blockEnd))
647+ then throw("Negative end")
648+ else if (if ((blockEnd > 0))
649+ then if ((maxMint != 1))
650+ then true
651+ else (price != 0)
652+ else false)
653+ then throw("Timed offer only allowed for unique edition and offer only")
654+ else {
655+ let baseHeight = if ((blockEnd == 0))
656+ then 0
657+ else height
658+ if (!(acceptedAssetIds(assetId)))
659+ then throw("Something went wrong!")
660+ else if (!(validateMinSell(assetId, price)))
661+ then throw("Something went wrong!")
662+ else {
663+ let checkUser = validateUser(caller)
664+ if ((checkUser != ""))
665+ then throw(checkUser)
666+ else {
667+ let amountSold = getIntegerByKey(keyIssued(caller, artId))
668+ let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
669+ if ((maxMint > 100))
670+ then throw("100 editions max per artwork")
671+ else if (if ((amountSold != 0))
672+ then (amountSold == maxCanSell)
673+ else false)
674+ then throw("Max edition reached.")
675+ else if (if ((amountSold > 0))
676+ then (maxCanSell != maxMint)
677+ else false)
678+ then throw("Cannot change maximum issuable anymore")
679+ else if (if ((bidNbr > 0))
680+ then (maxCanSell != maxMint)
681+ else false)
682+ then throw("Cannot change maximum issuable with active orders")
683+ else {
684+ let sellStatus = if (if ((price > 0))
685+ then (maxMint > 0)
686+ else false)
687+ then true
688+ else false
689+[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))]
690+ }
691+ }
692+ }
693+ }
694+ }
695+ }
696+ }
697+
698+
699+
700+@Callable(i)
701+func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "")
702+
703+
704+
705+@Callable(i)
706+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 assetId = if (!(isDefined(payment.assetId)))
715+ then "WAVES"
716+ else toBase58String(value(payment.assetId))
717+ let blockEnd = getIntegerByKey(keyEndSale(issuer, artId))
718+ if (if ((blockEnd != 0))
719+ then (height >= blockEnd)
530720 else false)
531- then throw("You cannot cancel this offer.")
721+ then throw("Sale ended.")
532722 else {
533- let bidKey = getBidKey(offerOwner, nftId, saleOwner, offerId)
534- let $t01874318798 = getBidData(bidKey)
535- let bidDataArr = $t01874318798._1
536- let assetId = $t01874318798._2
537- let bidData = $t01874318798._3
538-[DeleteEntry((bidKey + "_OPEN")), StringEntry((bidKey + "_CANCELLED"), ((((bidData + "_CANCELLED_") + toString(date)) + "_") + id)), ScriptTransfer(Address(fromBase58String(caller)), parseIntValue(bidDataArr[1]), assetId)]
723+ let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
724+ if (!(acceptedAssetIds(assetId)))
725+ then throw("asset not accepted")
726+ else if (!(validateMinSell(assetId, amount)))
727+ then throw("Wrong min sell")
728+ else {
729+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
730+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
731+ if ((0 >= maxCanSell))
732+ then throw("No max edition set for this artwork")
733+ else if ((amountSold >= maxCanSell))
734+ then throw("Sold out, you cannot bid")
735+ else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
736+ }
737+ }
738+ }
739+
740+
741+
742+@Callable(i)
743+func acceptBid (artId,issuer,bidId,bidOwner) = {
744+ let caller = toBase58String(i.caller.bytes)
745+ if ((caller != issuer))
746+ then throw("You cannot do this action")
747+ else buyMint(i, artId, issuer, bidId, bidOwner)
748+ }
749+
750+
751+
752+@Callable(i)
753+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
758+ if (if ((caller != bidOwner))
759+ then (caller != issuer)
760+ else false)
761+ then throw("You cannot do this action")
762+ else {
763+ let returnMoneyTo = if ((caller == issuer))
764+ then bidOwner
765+ else caller
766+ let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
767+ let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
768+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
769+ if ((bidData == ""))
770+ then throw("Bid not found")
771+ else {
772+ let bidDataArr = split(bidData, "_")
773+ let assetId = getBidAssetId(bidDataArr[0])
774+ let bidStatus = "CANCELED"
775+[DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(returnMoneyTo)), parseIntValue(bidDataArr[1]), assetId)]
776+ }
539777 }
540778 }
541779
542780

github/deemru/w8io/169f3d6 
116.07 ms