2021.01.09 08:40 [2409272] smart account 3PDBLdsUrcsiPxNbt8g2gQVoefKgzt3kJzV > SELF 0.00000000 Waves

{ "type": 13, "id": "9R5ao2M99RbWpBKFvWx41R8SEgJUK1Qb5QhQhQNAgPRA", "fee": 1400000, "feeAssetId": null, "timestamp": 1610170846433, "version": 2, "chainId": 87, "sender": "3PDBLdsUrcsiPxNbt8g2gQVoefKgzt3kJzV", "senderPublicKey": "FJN1qxUehh3hhFX9NAXWBFbSKT2sTzc2pjTJ1JxjQdBh", "proofs": [ "wLiL8adJBRyduak3GSLoo8MD81NcUUXgyB2jWpbaA2NPATTw4ypXfvhYhkg1EzTsSsz7jWqKDQyeav31b11ZCoN" ], "script": "base64:AAIEAAAAAAAAADwIAhIOCgwICAgICAgBCAgICAgSDQoLCAgICAgBCAgICAgSBQoDCAgIEgQKAggIEgYKBAgBAQgSBAoCCAgAAAA/AAAAAAh1bml0VGVzdAcAAAAACW9yYWNsZUZlZQkBAAAABXZhbHVlAAAAAQkABCYAAAABAgAAACMzUEFqclRxWUxnRkcyNGtSd2l5VTM0bm91bXo0cHoya1hQSwAAAAAIc2lnbkRhcHAJAQAAAAV2YWx1ZQAAAAEJAAQmAAAAAQIAAAAjM1A5Zk5ON3dUNnUyQnBLSjN0MkVkUWkycFk5b3BVRTZldHQAAAAAC2ZlZVJlY2VpdmVyAgAAACMzUEZhY3N2dVU5c24yWnN0YUxDV0tXbjQ4eVQxdmZBUlJSVQAAAAAIdXNlckRhcHAJAQAAAAV2YWx1ZQAAAAEJAAQmAAAAAQIAAAAjM1BHU1dEZ2FkNFJ0Y2VRWVhCcHEyeDczbVhMUkpZTFJxUlAAAAAADXdoaXRlbGlzdERhcHAJAQAAAAV2YWx1ZQAAAAEJAAQmAAAAAQIAAAAjM1BSRlRQbTRoYlVoeGhqUWRFOGNHYVhHQWZ6R0xxNHZhOEgAAAAAC3NpZ25Bc3NldElkAQAAACCDx5KvuFSvDgI1y5lvl1slpMZLfkCDV27XrzwDq+oRHQAAAAALdXNkbkFzc2V0SWQBAAAAILYmKcME9c5TkaQOS3UkL2SMUbH6369UKb1I0h0qsqrRAAAAAAx3YXZlc0Fzc2V0SWQBAAAAAAAAAAAFY2hyaXMCAAAAIzNQNEp1dEJLVzZwQURtOTFGeE1mR0wzRVl4S0p0V1lzV2ZYAAAAAARqb2VwAgAAACMzUExLWFBKaWdaSjRhVnFwTUd4NWFqeVBZbUE0WmNyeTlUYgAAAAAHc2lnbkN1dAAAAAAAAAAABwAAAAALdXNkbldhdmVDdXQAAAAAAAAAAAoAAAAADmRlZmF1bHRMaWNlbmNlAgAAAEdiYWZ5YmVpZ2lzZnF0eW8ycWRmc2NlaDVmcGNwN2VleW1ycGVnbHA2ZWRhbzJibXloaWpiYXl2YXVzeS9saWNlbmNlLnBkZgAAAAASZGVmYXVsdEhhc2hMaWNlbmNlAgAAAEAzZGY3OWQzNGFiYmNhOTkzMDhlNzljYjk0NDYxYzE4OTM1ODI2MDRkNjgzMjlhNDFmZDRiZWMxODg1ZTZhZGI0AAAAAAtkYXBwUnVubmluZwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBsAAAACBQAAAAh1c2VyRGFwcAIAAAAUY29uZl9kYXBwX2lzX3J1bm5pbmcGAAAAAA5tYWludGVuYW5jZU1TRwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAh1c2VyRGFwcAIAAAAUY29uZl9tYWludGVuYW5jZV9tc2cCAAAAAAAAAAANdXNlclN1c3BlbmRlZAIAAAAJU1VTUEVOREVEAAAAAAt1c2VyUmVtb3ZlZAIAAAAHUkVNT1ZFRAAAAAAQdXNlclVucmVnaXN0ZXJlZAIAAAAMVU5SRUdJU1RFUkVEAAAAAAt1c2VyQWxsb3dlZAIAAAAHQUxMT1dFRAEAAAAXZ2V0U3RyaW5nQnlLZXlGcm9tVXNlcnMAAAABAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAh1c2VyRGFwcAUAAAADa2V5AgAAAAABAAAADmdldFN0cmluZ0J5S2V5AAAAAQAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAADa2V5AgAAAAABAAAAGWdldEludGVnZXJCeUtleUZyb21PcmFjbGUAAAABAAAAA2tleQkBAAAAE3ZhbHVlT3JFcnJvck1lc3NhZ2UAAAACCQAEGgAAAAIFAAAACW9yYWNsZUZlZQUAAAADa2V5AgAAAB9JbnRlZ2VyIHVuZGVmaW5lIG9yIDAgaW4gb3JhY2xlAQAAAA9nZXRJbnRlZ2VyQnlLZXkAAAABAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAAR0aGlzBQAAAANrZXkAAAAAAAAAAAABAAAADmNoZWNrV2hpdGVsaXN0AAAAAQAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAANd2hpdGVsaXN0RGFwcAUAAAADa2V5AAAAAAAAAAAAAQAAAA9nZXRCb29sZWFuQnlLZXkAAAABAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBsAAAACBQAAAAR0aGlzBQAAAANrZXkHAQAAABRjaGVja1NpZ25DZXJ0aWZpY2F0ZQAAAAMAAAAGc2lnbklEAAAABU93bmVyAAAACnNoYTI1Nkhhc2gEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAIc2lnbkRhcHAJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGRhdGFfZmNfBQAAAAZzaWduSUQCAAAAAV8FAAAABU93bmVyAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAAWEFAAAAByRtYXRjaDADCQEAAAAIY29udGFpbnMAAAACBQAAAAFhBQAAAApzaGEyNTZIYXNoBgcHAQAAAAt2YWxpZGF0ZUNJRAAAAAEAAAADY2lkAwkBAAAACGNvbnRhaW5zAAAAAgUAAAADY2lkAgAAAAEvAwMJAABmAAAAAgAAAAAAAAAATAkAATEAAAABBQAAAANjaWQJAAAAAAAAAgkAATEAAAABCQABkQAAAAIJAAS1AAAAAgUAAAADY2lkAgAAAAEvAAAAAAAAAAAAAAAAAAAAAAA7BwkAAGYAAAACAAAAAAAAAAAQCQABMQAAAAEJAAGRAAAAAgkABLUAAAACBQAAAANjaWQCAAAAAS8AAAAAAAAAAAEHBwEAAAAMdmFsaWRhdGVIYXNoAAAAAQAAAARoYXNoCQAAAAAAAAIJAAExAAAAAQUAAAAEaGFzaAAAAAAAAAAAQAEAAAANa2V5VXNlclN0YXR1cwAAAAEAAAAGY2FsbGVyCQABLAAAAAICAAAADHVzZXJfc3RhdHVzXwUAAAAGY2FsbGVyAQAAAAprZXlBcnREYXRlAAAAAgAAAAZjYWxsZXIAAAAFYXJ0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACWFydF9kYXRlXwUAAAAFYXJ0SWQCAAAAAV8FAAAABmNhbGxlcgEAAAAKa2V5QXJ0TmFtZQAAAAIAAAAGY2FsbGVyAAAABWFydElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAlhcnRfbmFtZV8FAAAABWFydElkAgAAAAFfBQAAAAZjYWxsZXIBAAAACmtleUFydERlc2MAAAACAAAABmNhbGxlcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAJYXJ0X2Rlc2NfBQAAAAVhcnRJZAIAAAABXwUAAAAGY2FsbGVyAQAAABBrZXlBcnREaXNwbGF5Q2lkAAAAAgAAAAZjYWxsZXIAAAAFYXJ0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAEGFydF9kaXNwbGF5X2NpZF8FAAAABWFydElkAgAAAAFfBQAAAAZjYWxsZXIBAAAAEGtleUFydEV4cG9ydEhhc2gAAAACAAAABmNhbGxlcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAQYXJ0X2V4cG9ydF9oYXNoXwUAAAAFYXJ0SWQCAAAAAV8FAAAABmNhbGxlcgEAAAAPa2V5QXJ0RXhwb3J0Q2lkAAAAAgAAAAZjYWxsZXIAAAAFYXJ0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAD2FydF9leHBvcnRfY2lkXwUAAAAFYXJ0SWQCAAAAAV8FAAAABmNhbGxlcgEAAAANa2V5QXJ0TWF4TWludAAAAAIAAAAGY2FsbGVyAAAABWFydElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAxhcnRfbWF4bWludF8FAAAABWFydElkAgAAAAFfBQAAAAZjYWxsZXIBAAAADGtleUFydFNpZ25JRAAAAAIAAAAGY2FsbGVyAAAABWFydElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAthcnRfc2lnbmlkXwUAAAAFYXJ0SWQCAAAAAV8FAAAABmNhbGxlcgEAAAAMa2V5QXJ0SXNzdWVkAAAAAgAAAAZjYWxsZXIAAAAFYXJ0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAC2FydF9pc3N1ZWRfBQAAAAVhcnRJZAIAAAABXwUAAAAGY2FsbGVyAQAAAAxrZXlBcnRPblNhbGUAAAACAAAABmNhbGxlcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAALYXJ0X29uc2FsZV8FAAAABWFydElkAgAAAAFfBQAAAAZjYWxsZXIBAAAAEWtleUFydExpY2VuY2VIYXNoAAAAAgAAAAZjYWxsZXIAAAAFYXJ0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAEWFydF9saWNlbmNlX2hhc2hfBQAAAAVhcnRJZAIAAAABXwUAAAAGY2FsbGVyAQAAABBrZXlBcnRMaWNlbmNlQ2lkAAAAAgAAAAZjYWxsZXIAAAAFYXJ0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAEGFydF9saWNlbmNlX2NpZF8FAAAABWFydElkAgAAAAFfBQAAAAZjYWxsZXIBAAAACmtleUFydFRhZ3MAAAACAAAABmNhbGxlcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAJYXJ0X3RhZ3NfBQAAAAVhcnRJZAIAAAABXwUAAAAGY2FsbGVyAQAAAAprZXlBcnRUeXBlAAAAAgAAAAZjYWxsZXIAAAAFYXJ0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACWFydF90eXBlXwUAAAAFYXJ0SWQCAAAAAV8FAAAABmNhbGxlcgEAAAALa2V5QXJ0UHJpY2UAAAACAAAABmNhbGxlcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAKYXJ0X3ByaWNlXwUAAAAFYXJ0SWQCAAAAAV8FAAAABmNhbGxlcgEAAAAVa2V5QXJ0QXNzZXRJZEFjY2VwdGVkAAAAAgAAAAZjYWxsZXIAAAAFYXJ0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAEmFydF9hc3NldEFjY2VwdGVkXwUAAAAFYXJ0SWQCAAAAAV8FAAAABmNhbGxlcgEAAAAKa2V5QXJ0RmxhZwAAAAIAAAAGY2FsbGVyAAAABWFydElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAlhcnRfZmxhZ18FAAAABWFydElkAgAAAAFfBQAAAAZjYWxsZXIBAAAAFGtleUFydEhhc2hCeVR4aWRBZGRyAAAAAgAAAAZjYWxsZXIAAAAEdHhpZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAATZ2V0X2hhc2hieXR4aWRhZGRyXwUAAAAEdHhpZAIAAAABXwUAAAAGY2FsbGVyAQAAABFrZXlBcnRPd25lckJ5SGFzaAAAAAEAAAAKc2hhMjU2SGFzaAkAASwAAAACAgAAABJnZXRfb3duZXJfYnlfaGFzaF8FAAAACnNoYTI1Nkhhc2gBAAAAE2tleUFydEFydGlkQnlTaWduaWQAAAACAAAABmNhbGxlcgAAAAZzaWduSWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAEmdldF9hcnRpZGJ5c2lnbmlkXwUAAAAGc2lnbklkAgAAAAFfBQAAAAZjYWxsZXIBAAAAFWtleUFydFR4aWRCeUhhc2hPd25lcgAAAAIAAAAKc2hhMjU2SGFzaAAAAAZjYWxsZXIJAAEsAAAAAgIAAAAXZ2V0X3R4aWRfYnlfaGFzaF9vd25lcl8JAAJYAAAAAQkAC1QAAAABCQABmwAAAAEJAAEsAAAAAgUAAAAKc2hhMjU2SGFzaAUAAAAGY2FsbGVyAQAAAA52YWxpZGF0ZUFsbENJRAAAAAMAAAAKY2lkRGlzcGxheQAAAAljaWRFeHBvcnQAAAAKY2lkTGljZW5jZQMJAQAAAAEhAAAAAQkBAAAAC3ZhbGlkYXRlQ0lEAAAAAQUAAAAKY2lkRGlzcGxheQkAAAIAAAABAgAAABFXcm9uZyBEaXNwbGF5IENJRAMJAQAAAAEhAAAAAQkBAAAAC3ZhbGlkYXRlQ0lEAAAAAQUAAAAJY2lkRXhwb3J0CQAAAgAAAAECAAAAEFdyb25nIEV4cG9ydCBDSUQDAwkBAAAAAiE9AAAAAgUAAAAKY2lkTGljZW5jZQIAAAAACQEAAAABIQAAAAEJAQAAAAt2YWxpZGF0ZUNJRAAAAAEFAAAACmNpZExpY2VuY2UHCQAAAgAAAAECAAAAEVdyb25nIExpY2VuY2UgQ0lEBgEAAAAPdmFsaWRhdGVBbGxIYXNoAAAAAgAAAAxzaGEyNTZFeHBvcnQAAAANc2hhMjU2TGljZW5jZQMJAQAAAAEhAAAAAQkBAAAADHZhbGlkYXRlSGFzaAAAAAEFAAAADHNoYTI1NkV4cG9ydAkAAAIAAAABAgAAABhFeHBvcnQgSGFzaCA2NCBjaGFyLiBtYXgDCQEAAAABIQAAAAEJAQAAAAx2YWxpZGF0ZUhhc2gAAAABBQAAAA1zaGEyNTZMaWNlbmNlCQAAAgAAAAECAAAAGUxpY2VuY2UgSGFzaCA2NCBjaGFyLiBtYXgGAQAAAA52YWxpZGF0ZVN0cmluZwAAAAIAAAADc3RyAAAAA21heAMJAAAAAAAAAgkAATEAAAABBQAAAANzdHIAAAAAAAAAAAAJAAACAAAAAQIAAAAYRmllbGQgY2Fubm90IGJlIGlzIGVtcHR5AwkAAGYAAAACCQABMQAAAAEFAAAAA3N0cgUAAAADbWF4CQAAAgAAAAEJAAEsAAAAAgUAAAADc3RyAgAAAAwgaXMgdG9vIGxvbmcGAQAAAAx2YWxpZGF0ZVVzZXIAAAABAAAABmNhbGxlcgQAAAAKdXNlclN0YXR1cwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAh1c2VyRGFwcAkBAAAADWtleVVzZXJTdGF0dXMAAAABBQAAAAZjYWxsZXIFAAAAEHVzZXJVbnJlZ2lzdGVyZWQDAwkAAAAAAAACBQAAAAp1c2VyU3RhdHVzBQAAABB1c2VyVW5yZWdpc3RlcmVkBgkAAAAAAAACBQAAAAp1c2VyU3RhdHVzBQAAAAt1c2VyQWxsb3dlZAIAAAAuUmVnaXN0ZXIgdGhpcyBhY2NvdW50IGZpcnN0IHdpdGggIkFjY291bnQiIHRhYgMJAAAAAAAAAgUAAAAKdXNlclN0YXR1cwUAAAANdXNlclN1c3BlbmRlZAIAAAARQWNjb3VudCBzdXNwZW5kZWQDCQAAAAAAAAIFAAAACnVzZXJTdGF0dXMFAAAAC3VzZXJSZW1vdmVkAgAAAA9BY2NvdW50IHJlbW92ZWQCAAAAAAEAAAAKc2V0TEljZW5jZQAAAAIAAAAKY2lkTGljZW5jZQAAAA1zaGEyNTZMaWNlbmNlBAAAAANjaWQDCQAAAAAAAAIJAAExAAAAAQUAAAAKY2lkTGljZW5jZQAAAAAAAAAAAAUAAAAOZGVmYXVsdExpY2VuY2UFAAAACmNpZExpY2VuY2UEAAAABGhhc2gDCQAAAAAAAAIJAAExAAAAAQUAAAANc2hhMjU2TGljZW5jZQAAAAAAAAAAAAUAAAASZGVmYXVsdEhhc2hMaWNlbmNlBQAAAA1zaGEyNTZMaWNlbmNlCQAFFAAAAAIFAAAAA2NpZAUAAAAEaGFzaAEAAAATdmFsaWRhdGVBcnR3b3JrRGF0YQAAAAoAAAAGY2FsbGVyAAAACmNpZERpc3BsYXkAAAAJY2lkRXhwb3J0AAAACmxpY2VuY2VDSUQAAAAMc2hhMjU2RXhwb3J0AAAAC2xpY2VuY2VIYXNoAAAABG5hbWUAAAALZGVzY3JpcHRpb24AAAAEdGFncwAAAAdtYXhtaW50BAAAAAljaGVja1VzZXIJAQAAAAx2YWxpZGF0ZVVzZXIAAAABBQAAAAZjYWxsZXIDCQEAAAACIT0AAAACBQAAAAljaGVja1VzZXICAAAAAAkAAAIAAAABBQAAAAljaGVja1VzZXIDCQAAAAAAAAIJAAExAAAAAQUAAAAKY2lkRGlzcGxheQAAAAAAAAAAAAkAAAIAAAABAgAAABtEaXNwbGF5IENJRCBjYW5ub3QgYmUgZW1wdHkDCQEAAAABIQAAAAEJAQAAAA52YWxpZGF0ZUFsbENJRAAAAAMFAAAACmNpZERpc3BsYXkFAAAACWNpZEV4cG9ydAUAAAAKbGljZW5jZUNJRAkAAAIAAAABAgAAABBQcm9ibGVtIHdpdGggQ0lEAwkBAAAAASEAAAABCQEAAAAPdmFsaWRhdGVBbGxIYXNoAAAAAgUAAAAMc2hhMjU2RXhwb3J0BQAAAAtsaWNlbmNlSGFzaAkAAAIAAAABAgAAABNQcm9ibGVtIHdpdGggSGFzaGVzAwkBAAAAASEAAAABCQEAAAAOdmFsaWRhdGVTdHJpbmcAAAACBQAAAARuYW1lAAAAAAAAAABkCQAAAgAAAAECAAAAEjEwMCBDaGFyLiBtYXggbmFtZQMJAQAAAAEhAAAAAQkBAAAADnZhbGlkYXRlU3RyaW5nAAAAAgUAAAALZGVzY3JpcHRpb24AAAAAAAAAA+gJAAACAAAAAQIAAAAaMTAwMCBDaGFyLiBtYXggZGVzY3JpcHRpb24DCQAAZgAAAAIJAAGQAAAAAQkABLUAAAACBQAAAAR0YWdzAgAAAAEsAAAAAAAAAAAFCQAAAgAAAAECAAAACzUgdGFncyBtYXguAwkAAGYAAAACBQAAAAdtYXhtaW50AAAAAAAAAAAKCQAAAgAAAAECAAAAGzEwIGVkaXRpb25zIG1heCBwZXIgYXJ0d29yawIAAAAAAQAAAA92YWxpZGF0ZVBheW1lbnQAAAABAAAABmludm9rZQMJAAAAAAAAAgkAAZAAAAABCAUAAAAGaW52b2tlAAAACHBheW1lbnRzAAAAAAAAAAAACQAAAgAAAAECAAAAE05vIHBheW1lbnQgYXR0YWNoZWQEAAAAB3BheW1lbnQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAABmludm9rZQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAGYW1vdW50CQEAAAAFdmFsdWUAAAABCAUAAAAHcGF5bWVudAAAAAZhbW91bnQEAAAAB2Fzc2V0SWQDAwkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQJAAAAAAAAAggFAAAAB3BheW1lbnQAAAAHYXNzZXRJZAUAAAALc2lnbkFzc2V0SWQHCAUAAAAHcGF5bWVudAAAAAdhc3NldElkCQAAAgAAAAECAAAAK09ubHkgU0lHTiB0b2tlbiBhY2NlcHRlZCBhcyB0cmFuc2FjdGlvbiBmZWUEAAAAGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UJAQAAABlnZXRJbnRlZ2VyQnlLZXlGcm9tT3JhY2xlAAAAAQkAASwAAAACAgAAABJjZXJ0aWZpY2F0aW9uX2ZlZV8JAAJYAAAAAQUAAAALc2lnbkFzc2V0SWQDCQEAAAACIT0AAAACBQAAAAZhbW91bnQFAAAAGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UJAAACAAAAAQkAASwAAAACAgAAABlQYXltZW50IGFtb3VudCBzaG91bGQgYmUgCQABpAAAAAEFAAAAGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UJAAUUAAAAAgUAAAAGYW1vdW50BQAAAAdhc3NldElkAQAAAAtpc0FydE1pbnRlZAAAAAIAAAAMYWRkcmVzc1RvVXNlAAAABWFydElkBAAAAAckbWF0Y2gwCQAEGgAAAAIFAAAABHRoaXMJAQAAAAxrZXlBcnRJc3N1ZWQAAAACBQAAAAxhZGRyZXNzVG9Vc2UFAAAABWFydElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWIFAAAAByRtYXRjaDADCQEAAAACIT0AAAACBQAAAAFiAAAAAAAAAAAABgcHAQAAABR2YWxpZGF0ZVByaWNlQXNzZXRJZAAAAAMAAAAGaW52b2tlAAAADHByaWNlQXNzZXRJZAAAAAxhcnR3b3JrUHJpY2UEAAAAB3BheW1lbnQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAABmludm9rZQAAAAhwYXltZW50cwAAAAAAAAAAAAQAAAAGYW1vdW50CQEAAAAFdmFsdWUAAAABCAUAAAAHcGF5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NTZIYXNoCQAAAgAAAAECAAAAJEhhc2ggc2hvdWxkIGJlIDY0IGNoYXJhY3RlcnMgbWF4aW11bQQAAAANJHQwMTA0NzkxMDU0OAkBAAAACnNldExJY2VuY2UAAAACBQAAAApjaWRMaWNlbmNlBQAAAA1zaGEyNTZMaWNlbmNlBAAAAApsaWNlbmNlQ0lECAUAAAANJHQwMTA0NzkxMDU0OAAAAAJfMQQAAAALbGljZW5jZUhhc2gIBQAAAA0kdDAxMDQ3OTEwNTQ4AAAAAl8yBAAAAA92YWxpZGF0ZUFydHdvcmsJAQAAABN2YWxpZGF0ZUFydHdvcmtEYXRhAAAACgUAAAAGY2FsbGVyBQAAAApjaWREaXNwbGF5BQAAAAljaWRFeHBvcnQFAAAACmxpY2VuY2VDSUQFAAAADHNoYTI1NkV4cG9ydAUAAAALbGljZW5jZUhhc2gFAAAABG5hbWUFAAAAC2Rlc2NyaXB0aW9uBQAAAAR0YWdzBQAAAAdtYXhtaW50AwkBAAAAAiE9AAAAAgUAAAAPdmFsaWRhdGVBcnR3b3JrAgAAAAAJAAACAAAAAQIAAAAVU29tZXRoaW5nIHdlbnQgd3JvbmchBAAAAA0kdDAxMDc3NjEwODIzCQEAAAAPdmFsaWRhdGVQYXltZW50AAAAAQUAAAAGaW52b2tlBAAAAAZhbW91bnQIBQAAAA0kdDAxMDc3NjEwODIzAAAAAl8xBAAAAAdhc3NldElkCAUAAAANJHQwMTA3NzYxMDgyMwAAAAJfMgMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEFAAAABmFtb3VudAkAAAIAAAABAgAAABRTb21ldGhpbmcgd2VudCB3cm9uZwQAAAAKZW50cnlFeGlzdAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAFWtleUFydFR4aWRCeUhhc2hPd25lcgAAAAIFAAAACnNoYTI1Nkhhc2gFAAAABmNhbGxlcgMJAQAAAAIhPQAAAAIFAAAACmVudHJ5RXhpc3QCAAAAAAkAAAIAAAABAgAAABRZb3UgYWxyZWFkeSBhZGRlZCBpdAQAAAAJaGFzaEV4aXN0CQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAARa2V5QXJ0T3duZXJCeUhhc2gAAAABBQAAAApzaGEyNTZIYXNoAwkBAAAAAiE9AAAAAgUAAAAJaGFzaEV4aXN0AgAAAAAJAAACAAAAAQIAAAAXSGFzaCBhbHJlYWR5IHJlZ2lzdGVyZWQEAAAAD2lzU2lnbkNlcnRpZmllZAkBAAAAFGNoZWNrU2lnbkNlcnRpZmljYXRlAAAAAwUAAAAGc2lnbklEBQAAAAZjYWxsZXIFAAAACnNoYTI1Nkhhc2gDCQEAAAABIQAAAAEFAAAAD2lzU2lnbkNlcnRpZmllZAkAAAIAAAABAgAAACxTaWduIENlcnRpZmljYXRlIG5vdCBmb3VuZCBmb3IgdGhpcyBhZGRyZXNzLgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAARa2V5QXJ0T3duZXJCeUhhc2gAAAABBQAAAApzaGEyNTZIYXNoBQAAAAZjYWxsZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAFWtleUFydFR4aWRCeUhhc2hPd25lcgAAAAIFAAAACnNoYTI1Nkhhc2gFAAAABmNhbGxlcgUAAAAFYXJ0SWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAprZXlBcnREYXRlAAAAAgUAAAAGY2FsbGVyBQAAAAVhcnRJZAUAAAAJdGltZXN0YW1wCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAprZXlBcnROYW1lAAAAAgUAAAAGY2FsbGVyBQAAAAVhcnRJZAUAAAAEbmFtZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAKa2V5QXJ0RGVzYwAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAAC2Rlc2NyaXB0aW9uCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBrZXlBcnREaXNwbGF5Q2lkAAAAAgUAAAAGY2FsbGVyBQAAAAVhcnRJZAUAAAAKY2lkRGlzcGxheQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAPa2V5QXJ0RXhwb3J0Q2lkAAAAAgUAAAAGY2FsbGVyBQAAAAVhcnRJZAUAAAAJY2lkRXhwb3J0CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBrZXlBcnRFeHBvcnRIYXNoAAAAAgUAAAAGY2FsbGVyBQAAAAVhcnRJZAUAAAAMc2hhMjU2RXhwb3J0CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABFrZXlBcnRMaWNlbmNlSGFzaAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAAC2xpY2VuY2VIYXNoCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBrZXlBcnRMaWNlbmNlQ2lkAAAAAgUAAAAGY2FsbGVyBQAAAAVhcnRJZAUAAAAKbGljZW5jZUNJRAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAKa2V5QXJ0VHlwZQAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAABHR5cGUJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAACmtleUFydFRhZ3MAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAR0YWdzCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAANa2V5QXJ0TWF4TWludAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAAB21heG1pbnQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAADGtleUFydFNpZ25JRAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAABnNpZ25JRAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADGtleUFydElzc3VlZAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQAAAAAAAAAAAAJAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIJAQAAAAxrZXlBcnRPblNhbGUAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAATa2V5QXJ0QXJ0aWRCeVNpZ25pZAAAAAIFAAAABmNhbGxlcgUAAAAGc2lnbklEBQAAAAVhcnRJZAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAUa2V5QXJ0SGFzaEJ5VHhpZEFkZHIAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAApzaGEyNTZIYXNoCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABBQAAAAtmZWVSZWNlaXZlcgUAAAAGYW1vdW50BQAAAAdhc3NldElkBQAAAANuaWwAAAAGaW52b2tlAQAAAA11cGRhdGVBcnR3b3JrAAAACwAAAAR0eGlkAAAABG5hbWUAAAALZGVzY3JpcHRpb24AAAAEdGFncwAAAAR0eXBlAAAAB21heG1pbnQAAAAKY2lkRGlzcGxheQAAAAxzaGEyNTZFeHBvcnQAAAAJY2lkRXhwb3J0AAAADXNoYTI1NkxpY2VuY2UAAAAKY2lkTGljZW5jZQMJAQAAAAEhAAAAAQUAAAALZGFwcFJ1bm5pbmcJAAACAAAAAQUAAAAObWFpbnRlbmFuY2VNU0cEAAAACHVwZGF0ZUlkCQACWAAAAAEIBQAAAAZpbnZva2UAAAANdHJhbnNhY3Rpb25JZAQAAAAGY2FsbGVyCQACWAAAAAEICAUAAAAGaW52b2tlAAAABmNhbGxlcgAAAAVieXRlcwQAAAANJHQwMTM2NzgxMzc0NwkBAAAACnNldExJY2VuY2UAAAACBQAAAApjaWRMaWNlbmNlBQAAAA1zaGEyNTZMaWNlbmNlBAAAAApsaWNlbmNlQ0lECAUAAAANJHQwMTM2NzgxMzc0NwAAAAJfMQQAAAALbGljZW5jZUhhc2gIBQAAAA0kdDAxMzY3ODEzNzQ3AAAAAl8yBAAAAA92YWxpZGF0ZUFydHdvcmsJAQAAABN2YWxpZGF0ZUFydHdvcmtEYXRhAAAACgUAAAAGY2FsbGVyBQAAAApjaWREaXNwbGF5BQAAAAljaWRFeHBvcnQFAAAACmxpY2VuY2VDSUQFAAAADHNoYTI1NkV4cG9ydAUAAAALbGljZW5jZUhhc2gFAAAABG5hbWUFAAAAC2Rlc2NyaXB0aW9uBQAAAAR0YWdzBQAAAAdtYXhtaW50AwkBAAAAAiE9AAAAAgUAAAAPdmFsaWRhdGVBcnR3b3JrAgAAAAAJAAACAAAAAQIAAAAVU29tZXRoaW5nIHdlbnQgd3JvbmchBAAAAAplbnRyeUV4aXN0CQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAKa2V5QXJ0TmFtZQAAAAIFAAAABmNh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AAACAAAAAQIAAAAgTm8gYXJ0IG1hdGNoaW5nIGZvciB0aGlzIGFkZHJlc3MEAAAACnNoYTI1Nkhhc2gJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABRrZXlBcnRIYXNoQnlUeGlkQWRkcgAAAAIFAAAADGFkZHJlc3NUb1VzZQUAAAAFYXJ0SWQDCQAAAAAAAAIFAAAACnNoYTI1Nkhhc2gCAAAAAAkAAAIAAAABAgAAACVObyBhcnQgaGFzaCBtYXRjaGluZyBmb3IgdGhpcyBhZGRyZXNzBAAAAAZzaWduSUQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAAxrZXlBcnRTaWduSUQAAAACBQAAAAxhZGRyZXNzVG9Vc2UFAAAABWFydElkAwkAAAAAAAACBQAAAAZzaWduSUQCAAAAAAkAAAIAAAABAgAAABNObyBTSUdOIElEIG1hdGNoaW5nBAAAAAxkYXRhVG9EZWxldGUJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAACmtleUFydERhdGUAAAACBQAAAAxhZGRyZXNzVG9Vc2UFAAAABWFydElkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAAAprZXlBcnROYW1lAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAKa2V5QXJ0RGVzYwAAAAIFAAAADGFkZHJlc3NUb1VzZQUAAAAFYXJ0SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAEGtleUFydERpc3BsYXlDaWQAAAACBQAAAAxhZGRyZXNzVG9Vc2UFAAAABWFydElkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAAA9rZXlBcnRFeHBvcnRDaWQAAAACBQAAAAxhZGRyZXNzVG9Vc2UFAAAABWFydElkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAABBrZXlBcnRFeHBvcnRIYXNoAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAARa2V5QXJ0TGljZW5jZUhhc2gAAAACBQAAAAxhZGRyZXNzVG9Vc2UFAAAABWFydElkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAABBrZXlBcnRMaWNlbmNlQ2lkAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAKa2V5QXJ0VHlwZQAAAAIFAAAADGFkZHJlc3NUb1VzZQUAAAAFYXJ0SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAACmtleUFydFRhZ3MAAAACBQAAAAxhZGRyZXNzVG9Vc2UFAAAABWFydElkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAAA1rZXlBcnRNYXhNaW50AAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAMa2V5QXJ0U2lnbklEAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAMa2V5QXJ0SXNzdWVkAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAMa2V5QXJ0T25TYWxlAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAKa2V5QXJ0RmxhZwAAAAIFAAAABGFkZHIFAAAABWFydElkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAABFrZXlBcnRPd25lckJ5SGFzaAAAAAEFAAAACnNoYTI1Nkhhc2gJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAE2tleUFydEFydGlkQnlTaWduaWQAAAACBQAAAAxhZGRyZXNzVG9Vc2UFAAAABnNpZ25JRAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAVa2V5QXJ0VHhpZEJ5SGFzaE93bmVyAAAAAgUAAAAKc2hhMjU2SGFzaAUAAAAMYWRkcmVzc1RvVXNlBQAA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AAAAB21heE1pbnQHCQAAAgAAAAECAAAAJkNhbm5vdCBjaGFuZ2UgbWF4aW11bSBpc3N1YWJsZSBhbnltb3JlBAAAAApzZWxsU3RhdHVzAwMJAABmAAAAAgUAAAAFcHJpY2UAAAAAAAAAAAAJAABmAAAAAgUAAAAHbWF4TWludAAAAAAAAAAAAAcGBwkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgkBAAAADGtleUFydE9uU2FsZQAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAACnNlbGxTdGF0dXMJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAtrZXlBcnRQcmljZQAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAABXByaWNlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAANa2V5QXJ0TWF4TWludAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAAB21heE1pbnQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAFWtleUFydEFzc2V0SWRBY2NlcHRlZAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAAB2Fzc2V0SWQFAAAAA25pbAAAAAZpbnZva2UBAAAACmJ1eUFydHdvcmsAAAACAAAABWFydElkAAAABmlzc3VlcgMJAQAAAAEhAAAAAQUAAAALZGFwcFJ1bm5pbmcJAAACAAAAAQUAAAAObWFpbnRlbmFuY2VNU0cEAAAAAmlkCQACWAAAAAEIBQAAAAZpbnZva2UAAAANdHJhbnNhY3Rpb25JZAQAAAAGY2FsbGVyCQACWAAAAAEICAUAAAAGaW52b2tlAAAABmNhbGxlcgAAAAVieXRlcwQAAAAIdG90YWxORlQJAQAAAA9nZXRJbnRlZ2VyQnlLZXkAAAABAgAAABB0b3RhbF9uZnRfaXNzdWVkBAAAAAZzaWduSUQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAAxrZXlBcnRTaWduSUQAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAAthcnR3b3JrTmFtZQkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAACmtleUFydE5hbWUAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkAwkAAAAAAAACBQAAAAthcnR3b3JrTmFtZQIAAAAACQAAAgAAAAECAAAAEUFydCBkb2Vzbid0IGV4aXN0BAAAAApkaXNwbGF5Q0lECQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAQa2V5QXJ0RGlzcGxheUNpZAAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQEAAAACWV4cG9ydENJRAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAD2tleUFydEV4cG9ydENpZAAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQEAAAACmV4cG9ydEhhc2gJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABBrZXlBcnRFeHBvcnRIYXNoAAAAAgUAAAAGaXNzdWVyBQAAAAVhcnRJZAQAAAAKbGljZW5jZUNJRAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAEGtleUFydExpY2VuY2VDaWQAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAAtsaWNlbmNlSGFzaAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAEWtleUFydExpY2VuY2VIYXNoAAAAAgUAAAAGaXNzdWVyBQAAAAVhcnRJZAQAAAALZGVzY3JpcHRpb24JAAEvAAAAAgkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAACmtleUFydERlc2MAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkAAAAAAAAAAAyBAAAAAhpc09uU2FsZQkBAAAAD2dldEJvb2xlYW5CeUtleQAAAAEJAQAAAAxrZXlBcnRPblNhbGUAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAAphbW91bnRTb2xkCQEAAAAPZ2V0SW50ZWdlckJ5S2V5AAAAAQkBAAAADGtleUFydElzc3VlZAAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQEAAAADGFydHdvcmtQcmljZQkBAAAAD2dldEludGVnZXJCeUtleQAAAAEJAQAAAAtrZXlBcnRQcmljZQAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQEAAAADHByaWNlQXNzZXRJZAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAFWtleUFydEFzc2V0SWRBY2NlcHRlZAAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQEAAAACnNvdXJjZUhhc2gJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABRrZXlBcnRIYXNoQnlUeGlkQWRkcgAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQEAAAACm1heENhblNlbGwJAQAAAA9nZXRJbnRlZ2VyQnlLZXkAAAABCQEAAAANa2V5QXJ0TWF4TWludAAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQDAwMJAABnAAAAAgAAAAAAAAAAAAUAAAAMYXJ0d29ya1ByaWNlBgkBAAAAASEAAAABBQAAAAhpc09uU2FsZQYJAABnAAAAAgAAAAAAAAAAAAUAAAAKbWF4Q2FuU2VsbAkAAAIAAAABAgAAABBBcnQgbm90IGZvciBzYWxlBAAAAA0kdDAyMTg3MTIxOTUxCQEAAAAUdmFsaWRhdGVQcmljZUFzc2V0SWQAAAADBQAAAAZpbnZva2UFAAAADHByaWNlQXNzZXRJZAUAAAAMYXJ0d29ya1ByaWNlBAAAAAZhbW91bnQIBQAAAA0kdDAyMTg3MTIxOTUxAAAAAl8xBAAAAAdhc3NldElkCAUAAAANJHQwMjE4NzEyMTk1MQAAAAJfMgQAAAANaXNXaGl0ZWxpc3RlZAkBAAAADmNoZWNrV2hpdGVsaXN0AAAAAQUAAAAGaXNzdWVyBAAAAANjdXQDCQAAZgAAAAIFAAAADWlzV2hpdGVsaXN0ZWQFAAAABmhlaWdodAAAAAAAAAAAAAMJAAAAAAAAAgUAAAAMcHJpY2VBc3NldElkCQACWAAAAAEFAAAAC3NpZ25Bc3NldElkBQAAAAdzaWduQ3V0BQAAAAt1c2RuV2F2ZUN1dAQAAAANYW1vdW50Rm9yU2lnbgkAAGsAAAADBQAAAAZhbW91bnQFAAAAA2N1dAAAAAAAAAAAZAQAAAAQYW1vdW50Rm9yQ3JlYXRvcgkAAGUAAAACBQAAAAZhbW91bnQFAAAADWFtb3VudEZvclNpZ24DCQAAAAAAAAIFAAAACmFtb3VudFNvbGQFAAAACm1heENhblNlbGwJAAACAAAAAQIAAAAMQXJ0IHNvbGQgb3V0BAAAAA1uZXdBbW91bnRTb2xkCQAAZAAAAAIFAAAACmFtb3VudFNvbGQAAAAAAAAAAAEEAAAACWVudHJ5RGF0ZQgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAEAAAACWlzc3VlTWV0YQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAJQ3JlYXRvcjogBQAAAAZpc3N1ZXICAAAACiwKIEFydElEOiAFAAAABWFydElkAgAAAAssCiBTaWduSUQ6IAUAAAAGc2lnbklEAgAAABEsCiBBcnR3b3JrIG5hbWU6IAUAAAALYXJ0d29ya05hbWUCAAAAGCwKIEFydHdvcmsgZGVzY3JpcHRpb246IAUAAAALZGVzY3JpcHRpb24CAAAACiwKIElzc3VlOiAJAAGkAAAAAQUAAAANbmV3QW1vdW50U29sZAIAAAABLwkAAaQAAAABBQAAAAptYXhDYW5TZWxsAgAAABEsCiBNYXggaXNzdWFibGU6IAkAAaQAAAABBQAAAAptYXhDYW5TZWxsAgAAABAsCiBTb3VyY2UgaGFzaDogBQAAAApzb3VyY2VIYXNoAgAAABAsCiBEaXNwbGF5IGNpZDogBQAAAApkaXNwbGF5Q0lEAgAAAA8sCiBFeHBvcnQgY2lkOiAFAAAACWV4cG9ydENJRAIAAAAQLAogRXhwb3J0IGhhc2g6IAUAAAAKZXhwb3J0SGFzaAIAAAAQLAogTGljZW5jZSBjaWQ6IAUAAAAKbGljZW5jZUNJRAIAAAARLAogTGljZW5jZSBoYXNoOiAFAAAAC2xpY2VuY2VIYXNoBAAAAAhpc3N1ZU5GVAkABEIAAAAFCQABLAAAAAICAAAAA1NBXwkAAaQAAAABCQAAZAAAAAIFAAAACHRvdGFsTkZUAAAAAAAAAAABBQAAAAlpc3N1ZU1ldGEAAAAAAAAAAAEAAAAAAAAAAAAHBAAAAAVpZE5GVAkABDgAAAABBQAAAAhpc3N1ZU5GVAQAAAAKc2VsbFN0YXR1cwMJAAAAAAAAAgUAAAANbmV3QW1vdW50U29sZAUAAAAKbWF4Q2FuU2VsbAcGCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAMa2V5QXJ0SXNzdWVkAAAAAgUAAAAGaXNzdWVyBQAAAAVhcnRJZAUAAAANbmV3QW1vdW50U29sZAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQABLAAAAAICAAAABG5mdF8JAAJYAAAAAQUAAAAFaWRORlQJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAJYXJ0X3NvbGRfCQABpAAAAAEFAAAADW5ld0Ftb3VudFNvbGQCAAAABF9vZl8JAAGkAAAAAQUAAAAKbWF4Q2FuU2VsbAIAAAABXwUAAAAFYXJ0SWQCAAAAAV8FAAAABmlzc3VlcgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACWFydF9zb2xkXwkAAaQAAAABBQAAAA1uZXdBbW91bnRTb2xkAgAAAARfb2ZfCQABpAAAAAEFAAAACm1heENhblNlbGwCAAAAAV8FAAAABWFydElkAgAAAAFfBQAAAAZpc3N1ZXIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAGY2FsbGVyAgAAAAFfCQABpAAAAAEFAAAACWVudHJ5RGF0ZQIAAAABXwUAAAACaWQCAAAAAV8JAAGkAAAAAQUAAAAMYXJ0d29ya1ByaWNlAgAAAAFfBQAAAAxwcmljZUFzc2V0SWQCAAAAAV8JAAJYAAAAAQUAAAAFaWRORlQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAICAAAAEHRvdGFsX25mdF9pc3N1ZWQJAABkAAAAAgUAAAAIdG90YWxORlQAAAAAAAAAAAEJAARMAAAAAgkBAAAADEJvb2xlYW5FbnRyeQAAAAIJAQAAAAxrZXlBcnRPblNhbGUAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBQAAAApzZWxsU3RhdHVzCQAETAAAAAIFAAAACGlzc3VlTkZUCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAAAdBZGRyZXNzAAAAAQkAAlkAAAABBQAAAAZpc3N1ZXIFAAAAEGFtb3VudEZvckNyZWF0b3IFAAAAB2Fzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAB0FkZHJlc3MAAAABCQACWQAAAAEFAAAAC2ZlZVJlY2VpdmVyBQAAAA1hbW91bnRGb3JTaWduBQAAAAdhc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAZpbnZva2UAAAAGY2FsbGVyAAAAAAAAAAABBQAAAAVpZE5GVAUAAAADbmlsAAAAAM/02o8=", "height": 2409272, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CfKKS7wYqZuvxxCGzw4uDqSJUoiNo5LKp5hrcuANcHGa Next: EnFkZu7xQvYi361MHhUwVeL8zKZgWJr5aeLGjzEY9cSk Diff:
OldNewDifferences
2525
2626 let signCut = 7
2727
28-let usdnCut = 10
29-
30-let wavesCut = 10
28+let usdnWaveCut = 10
3129
3230 let defaultLicence = "bafybeigisfqtyo2qdfsceh5fpcp7eeymrpeglp6edao2bmyhijbayvausy/licence.pdf"
3331
3432 let defaultHashLicence = "3df79d34abbca99308e79cb94461c1893582604d68329a41fd4bec1885e6adb4"
3533
36-let dappRunning = match getBoolean(userDapp, "conf_dapp_is_running") {
37- case a: Boolean =>
38- a
39- case _ =>
40- true
41-}
34+let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
4235
43-let maintenanceMSG = match getString(userDapp, "conf_maintenance_msg") {
44- case a: String =>
45- a
46- case _ =>
47- ""
48-}
36+let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
4937
5038 let userSuspended = "SUSPENDED"
5139
5543
5644 let userAllowed = "ALLOWED"
5745
58-func getStringByKeyFromUsers (key) = match getString(userDapp, key) {
59- case a: String =>
60- a
61- case _ =>
62- ""
63-}
46+func getStringByKeyFromUsers (key) = valueOrElse(getString(userDapp, key), "")
6447
6548
66-func getStringByKey (key) = match getString(this, key) {
67- case a: String =>
68- a
69- case _ =>
70- ""
71-}
49+func getStringByKey (key) = valueOrElse(getString(this, key), "")
7250
7351
74-func getIntegerByKeyFromOracle (key) = match getInteger(oracleFee, key) {
75- case a: Int =>
76- a
77- case _ =>
78- throw("Integer undefine or 0 in oracle")
79-}
52+func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
8053
8154
82-func getIntegerByKey (key) = match getInteger(this, key) {
83- case i: Int =>
84- i
85- case _ =>
86- 0
87-}
55+func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
8856
8957
90-func checkWhitelist (key) = match getInteger(whitelistDapp, key) {
91- case a: Int =>
92- if ((a >= height))
93- then 1
94- else 0
95- case _ =>
96- 0
97-}
58+func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
9859
9960
100-func getBooleanByKey (key) = match getBoolean(this, key) {
101- case i: Boolean =>
102- i
103- case _ =>
104- false
105-}
61+func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
10662
10763
10864 func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signDapp, ((("data_fc_" + signID) + "_") + Owner)) {
11672
11773
11874 func validateCID (cid) = if (contains(cid, "/"))
119- then if (if ((75 > size(cid)))
120- then (60 > size(split(cid, "/")[0]))
75+ then if (if ((76 > size(cid)))
76+ then (size(split(cid, "/")[0]) == 59)
12177 else false)
12278 then (16 > size(split(cid, "/")[1]))
12379 else false
12480 else false
12581
12682
127-func validateHash (hash) = (65 > size(hash))
83+func validateHash (hash) = (size(hash) == 64)
12884
12985
13086 func keyUserStatus (caller) = ("user_status_" + caller)
218174 else true
219175
220176
177+func validateUser (caller) = {
178+ let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
179+ if (if ((userStatus == userUnregistered))
180+ then true
181+ else (userStatus == userAllowed))
182+ then "Register this account first with \"Account\" tab"
183+ else if ((userStatus == userSuspended))
184+ then "Account suspended"
185+ else if ((userStatus == userRemoved))
186+ then "Account removed"
187+ else ""
188+ }
189+
190+
191+func setLIcence (cidLicence,sha256Licence) = {
192+ let cid = if ((size(cidLicence) == 0))
193+ then defaultLicence
194+ else cidLicence
195+ let hash = if ((size(sha256Licence) == 0))
196+ then defaultHashLicence
197+ else sha256Licence
198+ $Tuple2(cid, hash)
199+ }
200+
201+
202+func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,maxmint) = {
203+ let checkUser = validateUser(caller)
204+ if ((checkUser != ""))
205+ then throw(checkUser)
206+ else if ((size(cidDisplay) == 0))
207+ then throw("Display CID cannot be empty")
208+ else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
209+ then throw("Problem with CID")
210+ else if (!(validateAllHash(sha256Export, licenceHash)))
211+ then throw("Problem with Hashes")
212+ else if (!(validateString(name, 100)))
213+ then throw("100 Char. max name")
214+ else if (!(validateString(description, 1000)))
215+ then throw("1000 Char. max description")
216+ else if ((size(split(tags, ",")) > 5))
217+ then throw("5 tags max.")
218+ else if ((maxmint > 10))
219+ then throw("10 editions max per artwork")
220+ else ""
221+ }
222+
223+
224+func validatePayment (invoke) = if ((size(invoke.payments) == 0))
225+ then throw("No payment attached")
226+ else {
227+ let payment = value(invoke.payments[0])
228+ let amount = value(payment.amount)
229+ let assetId = if (if (isDefined(payment.assetId))
230+ then (payment.assetId == signAssetId)
231+ else false)
232+ then payment.assetId
233+ else throw("Only SIGN token accepted as transaction fee")
234+ let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
235+ if ((amount != currentCertificationPrice))
236+ then throw(("Payment amount should be " + toString(currentCertificationPrice)))
237+ else $Tuple2(amount, assetId)
238+ }
239+
240+
241+func isArtMinted (addressToUse,artId) = match getInteger(this, keyArtIssued(addressToUse, artId)) {
242+ case b: Int =>
243+ if ((b != 0))
244+ then true
245+ else false
246+ case _ =>
247+ false
248+}
249+
250+
251+func validatePriceAssetId (invoke,priceAssetId,artworkPrice) = {
252+ let payment = value(invoke.payments[0])
253+ let amount = value(payment.amount)
254+ let assetId = if (!(isDefined(payment.assetId)))
255+ then unit
256+ else if (if ((size(priceAssetId) > 0))
257+ then (toBase58String(value(payment.assetId)) == priceAssetId)
258+ else false)
259+ then payment.assetId
260+ else throw("Wrong asset id")
261+ if (if ((assetId == unit))
262+ then (priceAssetId != "")
263+ else false)
264+ then throw("Wrong asset id")
265+ else if ((artworkPrice != amount))
266+ then throw("Payment don't match")
267+ else $Tuple2(amount, assetId)
268+ }
269+
270+
271+func acceptedAssetIds (assetId) = if (if (if ((assetId != toBase58String(signAssetId)))
272+ then (assetId != toBase58String(wavesAssetId))
273+ else false)
274+ then (assetId != toBase58String(usdnAssetId))
275+ else false)
276+ then throw("Only SIGN, USDN or WAVES accepted")
277+ else true
278+
279+
280+func validateMinSell (assetId,price) = {
281+ let minSellWaves = if (unitTest)
282+ then 1
283+ else getIntegerByKeyFromOracle("waves_min_sell")
284+ let minSellUsdn = 1000000
285+ let minSellSign = if (unitTest)
286+ then 1
287+ else (getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId))) * 2)
288+ if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
289+ then (minSellUsdn > price)
290+ else false)
291+ then (price != 0)
292+ else false)
293+ then true
294+ else if (if ((assetId == toBase58String(signAssetId)))
295+ then (minSellSign > price)
296+ else false)
297+ then (price != 0)
298+ else false)
299+ then true
300+ else if (if ((assetId == toBase58String(wavesAssetId)))
301+ then (minSellWaves > price)
302+ else false)
303+ then (price != 0)
304+ else false)
305+ then throw("Wrong minimum sell price")
306+ else true
307+ }
308+
309+
221310 @Callable(invoke)
222311 func addArtwork (sha256Hash,signID,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
223312 then throw(maintenanceMSG)
224313 else {
225314 let artId = toBase58String(invoke.transactionId)
315+ let timestamp = lastBlock.timestamp
226316 let caller = toBase58String(invoke.caller.bytes)
227- let timestamp = lastBlock.timestamp
228- let licenceCID = if ((size(cidLicence) == 0))
229- then defaultLicence
230- else cidLicence
231- let licenceHash = if ((size(sha256Licence) == 0))
232- then defaultHashLicence
233- else sha256Licence
234- let userIsRegistered = match getString(userDapp, ("user_status_" + caller)) {
235- case s: String =>
236- s
237- case _ =>
238- userUnregistered
239- }
240- if (if (isDefined(userIsRegistered))
241- then if ((userIsRegistered == userUnregistered))
242- then true
243- else (userIsRegistered == userAllowed)
244- else false)
245- then throw("Register this account first with \"Account\" tab")
246- else if ((userIsRegistered == userSuspended))
247- then throw("Account suspended")
248- else if ((userIsRegistered == userRemoved))
249- then throw("Account removed")
250- else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
251- then throw("Problem with CID")
252- else if (!(validateHash(sha256Hash)))
253- then throw("Hash should be 64 characters maximum")
254- else if (!(validateAllHash(sha256Export, licenceHash)))
255- then throw("Problem with Hashes")
256- else if ((size(invoke.payments) == 0))
257- then throw("No payment attached")
317+ if (!(validateHash(sha256Hash)))
318+ then throw("Hash should be 64 characters maximum")
319+ else {
320+ let $t01047910548 = setLIcence(cidLicence, sha256Licence)
321+ let licenceCID = $t01047910548._1
322+ let licenceHash = $t01047910548._2
323+ let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
324+ if ((validateArtwork != ""))
325+ then throw("Something went wrong!")
326+ else {
327+ let $t01077610823 = validatePayment(invoke)
328+ let amount = $t01077610823._1
329+ let assetId = $t01077610823._2
330+ if (!(isDefined(amount)))
331+ then throw("Something went wrong")
332+ else {
333+ let entryExist = getStringByKey(keyArtTxidByHashOwner(sha256Hash, caller))
334+ if ((entryExist != ""))
335+ then throw("You already added it")
258336 else {
259- let payment = value(invoke.payments[0])
260- let amount = value(payment.amount)
261- let assetId = if (if (isDefined(payment.assetId))
262- then (payment.assetId == signAssetId)
263- else false)
264- then payment.assetId
265- else throw("Only SIGN token accepted")
266- let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
267- if ((amount != currentCertificationPrice))
268- then throw(("Payment amount should be " + toString(currentCertificationPrice)))
337+ let hashExist = getStringByKey(keyArtOwnerByHash(sha256Hash))
338+ if ((hashExist != ""))
339+ then throw("Hash already registered")
269340 else {
270- let entryExist = getStringByKey(keyArtTxidByHashOwner(sha256Hash, caller))
271- if ((entryExist != ""))
272- then throw("You already added it")
273- else {
274- let hashExist = getStringByKey(keyArtOwnerByHash(sha256Hash))
275- if ((hashExist != ""))
276- then throw("Hash already registered")
277- else {
278- let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
279- if (!(isSignCertified))
280- then throw("Sign Certificate not found for this address.")
281- else if ((size(cidDisplay) == 0))
282- then throw("Display CID cannot be empty")
283- else if (!(validateString(name, 100)))
284- then throw("100 Char. max name")
285- else if (!(validateString(description, 1000)))
286- then throw("1000 Char. max description")
287- else if ((size(split(tags, ",")) > 5))
288- then throw("5 tags max.")
289- else if ((maxmint > 10))
290- then throw("10 editions max")
291- else [StringEntry(keyArtOwnerByHash(sha256Hash), caller), StringEntry(keyArtTxidByHashOwner(sha256Hash, caller), artId), IntegerEntry(keyArtDate(caller, artId), timestamp), StringEntry(keyArtName(caller, artId), name), StringEntry(keyArtDesc(caller, artId), description), StringEntry(keyArtDisplayCid(caller, artId), cidDisplay), StringEntry(keyArtExportCid(caller, artId), cidExport), StringEntry(keyArtExportHash(caller, artId), sha256Export), StringEntry(keyArtLicenceHash(caller, artId), licenceHash), StringEntry(keyArtLicenceCid(caller, artId), licenceCID), StringEntry(keyArtType(caller, artId), type), StringEntry(keyArtTags(caller, artId), tags), IntegerEntry(keyArtMaxMint(caller, artId), maxmint), StringEntry(keyArtSignID(caller, artId), signID), IntegerEntry(keyArtIssued(caller, artId), 0), BooleanEntry(keyArtOnSale(caller, artId), false), StringEntry(keyArtArtidBySignid(caller, signID), artId), StringEntry(keyArtHashByTxidAddr(caller, artId), sha256Hash), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, assetId)]
292- }
293- }
341+ let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
342+ if (!(isSignCertified))
343+ then throw("Sign Certificate not found for this address.")
344+ else [StringEntry(keyArtOwnerByHash(sha256Hash), caller), StringEntry(keyArtTxidByHashOwner(sha256Hash, caller), artId), IntegerEntry(keyArtDate(caller, artId), timestamp), StringEntry(keyArtName(caller, artId), name), StringEntry(keyArtDesc(caller, artId), description), StringEntry(keyArtDisplayCid(caller, artId), cidDisplay), StringEntry(keyArtExportCid(caller, artId), cidExport), StringEntry(keyArtExportHash(caller, artId), sha256Export), StringEntry(keyArtLicenceHash(caller, artId), licenceHash), StringEntry(keyArtLicenceCid(caller, artId), licenceCID), StringEntry(keyArtType(caller, artId), type), StringEntry(keyArtTags(caller, artId), tags), IntegerEntry(keyArtMaxMint(caller, artId), maxmint), StringEntry(keyArtSignID(caller, artId), signID), IntegerEntry(keyArtIssued(caller, artId), 0), BooleanEntry(keyArtOnSale(caller, artId), false), StringEntry(keyArtArtidBySignid(caller, signID), artId), StringEntry(keyArtHashByTxidAddr(caller, artId), sha256Hash), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, assetId)]
294345 }
295346 }
347+ }
348+ }
349+ }
296350 }
297351
298352
303357 else {
304358 let updateId = toBase58String(invoke.transactionId)
305359 let caller = toBase58String(invoke.caller.bytes)
306- let licenceCID = if ((size(cidLicence) == 0))
307- then defaultLicence
308- else cidLicence
309- let licenceHash = if ((size(sha256Licence) == 0))
310- then defaultHashLicence
311- else sha256Licence
312- let userIsRegistered = getStringByKeyFromUsers(keyUserStatus(caller))
313- if (if ((userIsRegistered == ""))
314- then true
315- else (userIsRegistered == userAllowed))
316- then throw("Register first with \"User infos\"")
317- else if ((userIsRegistered == userSuspended))
318- then throw("Account suspended")
319- else if ((userIsRegistered == userRemoved))
320- then throw("Account removed")
321- else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
322- then throw("Problem with CID")
323- else if (!(validateAllHash(sha256Export, licenceHash)))
324- then throw("Problem with Hashes")
325- else {
326- let entryExist = getStringByKey(keyArtName(caller, txid))
327- if ((entryExist == ""))
328- then throw("Entry not found")
329- else if (!(validateString(name, 100)))
330- then throw("100 Char. max name")
331- else if (!(validateString(description, 1000)))
332- then throw("1000 Char. max description")
333- else {
334- let flag = getStringByKey(keyArtFlag(caller, txid))
335- if ((flag == "ILLEGAL"))
336- then throw("Cannot update ILLEGAL artwork")
337- else {
338- let artworkMinted = match getInteger(this, keyArtIssued(caller, txid)) {
339- case b: Int =>
340- if ((b == 0))
341- then false
342- else true
343- case _ =>
344- false
345- }
346- if ((size(split(tags, ",")) > 5))
347- then throw("5 tags max.")
348- else if ((maxmint > 10))
349- then throw("10 editions max per artwork")
350- else if (!(artworkMinted))
351- then [StringEntry(keyArtName(caller, txid), name), StringEntry(keyArtDesc(caller, txid), description), StringEntry(keyArtDisplayCid(caller, txid), cidDisplay), StringEntry(keyArtExportCid(caller, txid), cidExport), StringEntry(keyArtExportHash(caller, txid), sha256Export), StringEntry(keyArtLicenceCid(caller, txid), licenceCID), StringEntry(keyArtLicenceHash(caller, txid), licenceHash), IntegerEntry(keyArtMaxMint(caller, txid), maxmint), StringEntry(keyArtTags(caller, txid), tags), StringEntry(keyArtType(caller, txid), type)]
352- else throw("Already minted")
353- }
354- }
355- }
360+ let $t01367813747 = setLIcence(cidLicence, sha256Licence)
361+ let licenceCID = $t01367813747._1
362+ let licenceHash = $t01367813747._2
363+ let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
364+ if ((validateArtwork != ""))
365+ then throw("Something went wrong!")
366+ else {
367+ let entryExist = getStringByKey(keyArtName(caller, txid))
368+ if ((entryExist == ""))
369+ then throw("Entry not found")
370+ else {
371+ let flag = getStringByKey(keyArtFlag(caller, txid))
372+ if ((flag == "ILLEGAL"))
373+ then throw("Cannot update ILLEGAL artwork")
374+ else if (!(isArtMinted(caller, txid)))
375+ then [StringEntry(keyArtName(caller, txid), name), StringEntry(keyArtDesc(caller, txid), description), StringEntry(keyArtDisplayCid(caller, txid), cidDisplay), StringEntry(keyArtExportCid(caller, txid), cidExport), StringEntry(keyArtExportHash(caller, txid), sha256Export), StringEntry(keyArtLicenceCid(caller, txid), licenceCID), StringEntry(keyArtLicenceHash(caller, txid), licenceHash), IntegerEntry(keyArtMaxMint(caller, txid), maxmint), StringEntry(keyArtTags(caller, txid), tags), StringEntry(keyArtType(caller, txid), type)]
376+ else throw("Already minted")
377+ }
378+ }
356379 }
357380
358381
359382
360-@Callable(i)
383+@Callable(invoke)
361384 func flagArtwork (artId,addr,flag) = {
362- let caller = toString(addressFromPublicKey(i.callerPublicKey))
363- let id = toBase58String(i.transactionId)
385+ let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
386+ let id = toBase58String(invoke.transactionId)
364387 if (containsElement([chris, joep, toString(this)], caller))
365388 then if ((flag == "CONSENT"))
366389 then [StringEntry(keyArtFlag(addr, artId), flag)]
374397
375398
376399
377-@Callable(i)
400+@Callable(invoke)
378401 func deleteArtwork (artId,addr) = {
379- let caller = toString(addressFromPublicKey(i.callerPublicKey))
380- let id = toBase58String(i.transactionId)
402+ let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
403+ let id = toBase58String(invoke.transactionId)
381404 let addressToUse = if (containsElement([chris, joep, toString(this)], caller))
382405 then addr
383406 else caller
385408 if ((entryExist == ""))
386409 then throw("No art matching for this address")
387410 else {
388- let artworkMinted = match getInteger(this, keyArtIssued(addressToUse, artId)) {
389- case b: Int =>
390- if ((b != 0))
391- then true
392- else false
393- case _ =>
394- false
395- }
396- let maxMint = getIntegerByKey(keyArtMaxMint(addressToUse, artId))
397411 let sha256Hash = getStringByKey(keyArtHashByTxidAddr(addressToUse, artId))
398412 if ((sha256Hash == ""))
399413 then throw("No art hash matching for this address")
403417 then throw("No SIGN ID matching")
404418 else {
405419 let dataToDelete = [DeleteEntry(keyArtDate(addressToUse, artId)), DeleteEntry(keyArtName(addressToUse, artId)), DeleteEntry(keyArtDesc(addressToUse, artId)), DeleteEntry(keyArtDisplayCid(addressToUse, artId)), DeleteEntry(keyArtExportCid(addressToUse, artId)), DeleteEntry(keyArtExportHash(addressToUse, artId)), DeleteEntry(keyArtLicenceHash(addressToUse, artId)), DeleteEntry(keyArtLicenceCid(addressToUse, artId)), DeleteEntry(keyArtType(addressToUse, artId)), DeleteEntry(keyArtTags(addressToUse, artId)), DeleteEntry(keyArtMaxMint(addressToUse, artId)), DeleteEntry(keyArtSignID(addressToUse, artId)), DeleteEntry(keyArtIssued(addressToUse, artId)), DeleteEntry(keyArtOnSale(addressToUse, artId)), DeleteEntry(keyArtFlag(addr, artId)), DeleteEntry(keyArtOwnerByHash(sha256Hash)), DeleteEntry(keyArtArtidBySignid(addressToUse, signID)), DeleteEntry(keyArtTxidByHashOwner(sha256Hash, addressToUse))]
406- if (!(artworkMinted))
420+ if (!(isArtMinted(addressToUse, artId)))
407421 then if (!(dappRunning))
408422 then throw(maintenanceMSG)
409423 else dataToDelete
410- else if (containsElement([chris, joep, toString(this)], caller))
424+ else if (containsElement([chris, toString(this)], caller))
411425 then dataToDelete
412- else throw("Art already minted, cannot delete")
426+ else throw("Art already minted, you cannot delete it")
413427 }
414428 }
415429 }
417431
418432
419433
420-@Callable(i)
434+@Callable(invoke)
421435 func sellArtwork (artId,price,maxMint,assetId) = if (!(dappRunning))
422436 then throw(maintenanceMSG)
423437 else {
424- let id = toBase58String(i.transactionId)
425- let caller = toBase58String(i.caller.bytes)
438+ let id = toBase58String(invoke.transactionId)
439+ let caller = toBase58String(invoke.caller.bytes)
426440 let sellDate = lastBlock.timestamp
427441 let artworkName = getStringByKey(keyArtName(caller, artId))
428442 if ((artworkName == ""))
435449 let exportHash = getStringByKey(keyArtExportHash(caller, artId))
436450 if ((size(exportHash) != 64))
437451 then throw("You cannot sell art with no export hash")
438- else if (if (if ((assetId != toBase58String(signAssetId)))
439- then (assetId != toBase58String(wavesAssetId))
440- else false)
441- then (assetId != toBase58String(usdnAssetId))
442- else false)
443- then throw("Only SIGN, USDN or WAVES accepted")
444- else {
445- let minSellWaves = if (unitTest)
446- then 1
447- else getIntegerByKeyFromOracle("waves_min_sell")
448- let minSellUsdn = 1000000
449- let minSellSign = if (unitTest)
450- then 1
451- else (getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId))) * 2)
452- if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
453- then (minSellUsdn > price)
454- else false)
455- then (price != 0)
456- else false)
457- then true
458- else if (if ((assetId == toBase58String(signAssetId)))
459- then (minSellSign > price)
460- else false)
461- then (price != 0)
462- else false)
463- then true
464- else if (if ((assetId == toBase58String(wavesAssetId)))
465- then (minSellWaves > price)
466- else false)
467- then (price != 0)
468- else false)
469- then throw("Wrong minimum sell price")
470- else {
471- let userIsRegistered = getStringByKeyFromUsers(keyUserStatus(caller))
472- if (if ((userIsRegistered == ""))
473- then true
474- else (userIsRegistered == userAllowed))
475- then throw("Register this account first")
476- else if ((userIsRegistered == userSuspended))
477- then throw("Account suspended")
478- else if ((userIsRegistered == userRemoved))
479- then throw("Account deleted")
480- else {
481- let amountSold = getIntegerByKey(keyArtIssued(caller, artId))
482- let maxCanSell = getIntegerByKey(keyArtMaxMint(caller, artId))
483- if ((maxMint > 10))
484- then throw("10 editions max per artwork")
485- else if (if ((amountSold != 0))
486- then (amountSold == maxCanSell)
452+ else if (!(acceptedAssetIds(assetId)))
453+ then throw("Something wen wrong!")
454+ else if (!(validateMinSell(assetId, price)))
455+ then throw("Something wen wrong!")
456+ else {
457+ let checkUser = validateUser(caller)
458+ if ((checkUser != ""))
459+ then throw(checkUser)
460+ else {
461+ let amountSold = getIntegerByKey(keyArtIssued(caller, artId))
462+ let maxCanSell = getIntegerByKey(keyArtMaxMint(caller, artId))
463+ if ((maxMint > 10))
464+ then throw("10 editions max per artwork")
465+ else if (if ((amountSold != 0))
466+ then (amountSold == maxCanSell)
467+ else false)
468+ then throw("Max edition reached.")
469+ else if (if ((amountSold > 0))
470+ then (maxCanSell != maxMint)
471+ else false)
472+ then throw("Cannot change maximum issuable anymore")
473+ else {
474+ let sellStatus = if (if ((price > 0))
475+ then (maxMint > 0)
487476 else false)
488- then throw("Max edition reached.")
489- else if (if ((amountSold > 0))
490- then (maxCanSell != maxMint)
491- else false)
492- then throw("Cannot change maximum issuable anymore")
493- else {
494- let sellStatus = if (if ((price > 0))
495- then (maxMint > 0)
496- else false)
497- then true
498- else false
477+ then true
478+ else false
499479 [BooleanEntry(keyArtOnSale(caller, artId), sellStatus), IntegerEntry(keyArtPrice(caller, artId), price), IntegerEntry(keyArtMaxMint(caller, artId), maxMint), StringEntry(keyArtAssetIdAccepted(caller, artId), assetId)]
500- }
501- }
502- }
503- }
480+ }
481+ }
482+ }
504483 }
505484 }
506485 }
507486
508487
509488
510-@Callable(i)
489+@Callable(invoke)
511490 func buyArtwork (artId,issuer) = if (!(dappRunning))
512491 then throw(maintenanceMSG)
513492 else {
514- let id = toBase58String(i.transactionId)
515- let caller = toBase58String(i.caller.bytes)
493+ let id = toBase58String(invoke.transactionId)
494+ let caller = toBase58String(invoke.caller.bytes)
516495 let totalNFT = getIntegerByKey("total_nft_issued")
517496 let signID = getStringByKey(keyArtSignID(issuer, artId))
518497 let artworkName = getStringByKey(keyArtName(issuer, artId))
525504 let licenceCID = getStringByKey(keyArtLicenceCid(issuer, artId))
526505 let licenceHash = getStringByKey(keyArtLicenceHash(issuer, artId))
527506 let description = take(getStringByKey(keyArtDesc(issuer, artId)), 50)
507+ let isOnSale = getBooleanByKey(keyArtOnSale(issuer, artId))
528508 let amountSold = getIntegerByKey(keyArtIssued(issuer, artId))
529509 let artworkPrice = getIntegerByKey(keyArtPrice(issuer, artId))
530- let isOnSale = getBooleanByKey(keyArtOnSale(issuer, artId))
531510 let priceAssetId = getStringByKey(keyArtAssetIdAccepted(issuer, artId))
532511 let sourceHash = getStringByKey(keyArtHashByTxidAddr(issuer, artId))
533512 let maxCanSell = getIntegerByKey(keyArtMaxMint(issuer, artId))
538517 else (0 >= maxCanSell))
539518 then throw("Art not for sale")
540519 else {
541- let payment = value(i.payments[0])
542- let amount = value(payment.amount)
543- let assetId = if (!(isDefined(payment.assetId)))
544- then unit
545- else if (if ((size(priceAssetId) > 0))
546- then (toBase58String(value(payment.assetId)) == priceAssetId)
547- else false)
548- then payment.assetId
549- else throw("Wrong asset id")
550- if (if ((assetId == unit))
551- then (priceAssetId != "")
552- else false)
553- then throw("Wrong asset id")
520+ let $t02187121951 = validatePriceAssetId(invoke, priceAssetId, artworkPrice)
521+ let amount = $t02187121951._1
522+ let assetId = $t02187121951._2
523+ let isWhitelisted = checkWhitelist(issuer)
524+ let cut = if ((isWhitelisted > height))
525+ then 0
526+ else if ((priceAssetId == toBase58String(signAssetId)))
527+ then signCut
528+ else usdnWaveCut
529+ let amountForSign = fraction(amount, cut, 100)
530+ let amountForCreator = (amount - amountForSign)
531+ if ((amountSold == maxCanSell))
532+ then throw("Art sold out")
554533 else {
555- let isWhitelisted = checkWhitelist(issuer)
556- let cut = if ((isWhitelisted == 1))
557- then 0
558- else if ((priceAssetId == toBase58String(signAssetId)))
559- then 8
560- else 10
561- let amountForSign = fraction(amount, cut, 100)
562- let amountForCreator = (amount - amountForSign)
563- if ((amountSold == maxCanSell))
564- then throw("Art sold out")
565- else if ((artworkPrice != amount))
566- then throw("Payment don't match")
567- else {
568- let newAmountSold = (amountSold + 1)
569- let entryDate = lastBlock.timestamp
570- let issueMeta = ((((((((((((((((((((((((((("Creator: " + issuer) + ",
534+ let newAmountSold = (amountSold + 1)
535+ let entryDate = lastBlock.timestamp
536+ let issueMeta = ((((((((((((((((((((((((((("Creator: " + issuer) + ",
571537 ArtID: ") + artId) + ",
572538 SignID: ") + signID) + ",
573539 Artwork name: ") + artworkName) + ",
580546 Export hash: ") + exportHash) + ",
581547 Licence cid: ") + licenceCID) + ",
582548 Licence hash: ") + licenceHash)
583- let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
584- let idNFT = calculateAssetId(issueNFT)
585- let sellStatus = if ((newAmountSold == maxCanSell))
586- then false
587- else true
588-[IntegerEntry(keyArtIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)), StringEntry(((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer), ((((((((((caller + "_") + toString(entryDate)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))), IntegerEntry("total_nft_issued", (totalNFT + 1)), BooleanEntry(keyArtOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId), ScriptTransfer(i.caller, 1, idNFT)]
589- }
549+ let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
550+ let idNFT = calculateAssetId(issueNFT)
551+ let sellStatus = if ((newAmountSold == maxCanSell))
552+ then false
553+ else true
554+[IntegerEntry(keyArtIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)), StringEntry(((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer), ((((((((((caller + "_") + toString(entryDate)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))), IntegerEntry("total_nft_issued", (totalNFT + 1)), BooleanEntry(keyArtOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId), ScriptTransfer(invoke.caller, 1, idNFT)]
590555 }
591556 }
592557 }
593558 }
594559
595560
596-
597-@Callable(i)
598-func deleteEntry (entry) = {
599- let caller = toString(addressFromPublicKey(i.callerPublicKey))
600- if ((caller == chris))
601- then [DeleteEntry(entry)]
602- else throw("no")
603- }
604-
605-
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let unitTest = false
55
66 let oracleFee = value(addressFromString("3PAjrTqYLgFG24kRwiyU34noumz4pz2kXPK"))
77
88 let signDapp = value(addressFromString("3P9fNN7wT6u2BpKJ3t2EdQi2pY9opUE6ett"))
99
1010 let feeReceiver = "3PFacsvuU9sn2ZstaLCWKWn48yT1vfARRRU"
1111
1212 let userDapp = value(addressFromString("3PGSWDgad4RtceQYXBpq2x73mXLRJYLRqRP"))
1313
1414 let whitelistDapp = value(addressFromString("3PRFTPm4hbUhxhjQdE8cGaXGAfzGLq4va8H"))
1515
1616 let signAssetId = base58'9sQutD5HnRvjM1uui5cVC4w9xkMPAfYEV8ymug3Mon2Y'
1717
1818 let usdnAssetId = base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
1919
2020 let wavesAssetId = base58''
2121
2222 let chris = "3P4JutBKW6pADm91FxMfGL3EYxKJtWYsWfX"
2323
2424 let joep = "3PLKXPJigZJ4aVqpMGx5ajyPYmA4Zcry9Tb"
2525
2626 let signCut = 7
2727
28-let usdnCut = 10
29-
30-let wavesCut = 10
28+let usdnWaveCut = 10
3129
3230 let defaultLicence = "bafybeigisfqtyo2qdfsceh5fpcp7eeymrpeglp6edao2bmyhijbayvausy/licence.pdf"
3331
3432 let defaultHashLicence = "3df79d34abbca99308e79cb94461c1893582604d68329a41fd4bec1885e6adb4"
3533
36-let dappRunning = match getBoolean(userDapp, "conf_dapp_is_running") {
37- case a: Boolean =>
38- a
39- case _ =>
40- true
41-}
34+let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
4235
43-let maintenanceMSG = match getString(userDapp, "conf_maintenance_msg") {
44- case a: String =>
45- a
46- case _ =>
47- ""
48-}
36+let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
4937
5038 let userSuspended = "SUSPENDED"
5139
5240 let userRemoved = "REMOVED"
5341
5442 let userUnregistered = "UNREGISTERED"
5543
5644 let userAllowed = "ALLOWED"
5745
58-func getStringByKeyFromUsers (key) = match getString(userDapp, key) {
59- case a: String =>
60- a
61- case _ =>
62- ""
63-}
46+func getStringByKeyFromUsers (key) = valueOrElse(getString(userDapp, key), "")
6447
6548
66-func getStringByKey (key) = match getString(this, key) {
67- case a: String =>
68- a
69- case _ =>
70- ""
71-}
49+func getStringByKey (key) = valueOrElse(getString(this, key), "")
7250
7351
74-func getIntegerByKeyFromOracle (key) = match getInteger(oracleFee, key) {
75- case a: Int =>
76- a
77- case _ =>
78- throw("Integer undefine or 0 in oracle")
79-}
52+func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
8053
8154
82-func getIntegerByKey (key) = match getInteger(this, key) {
83- case i: Int =>
84- i
85- case _ =>
86- 0
87-}
55+func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
8856
8957
90-func checkWhitelist (key) = match getInteger(whitelistDapp, key) {
91- case a: Int =>
92- if ((a >= height))
93- then 1
94- else 0
95- case _ =>
96- 0
97-}
58+func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
9859
9960
100-func getBooleanByKey (key) = match getBoolean(this, key) {
101- case i: Boolean =>
102- i
103- case _ =>
104- false
105-}
61+func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
10662
10763
10864 func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signDapp, ((("data_fc_" + signID) + "_") + Owner)) {
10965 case a: String =>
11066 if (contains(a, sha256Hash))
11167 then true
11268 else false
11369 case _ =>
11470 false
11571 }
11672
11773
11874 func validateCID (cid) = if (contains(cid, "/"))
119- then if (if ((75 > size(cid)))
120- then (60 > size(split(cid, "/")[0]))
75+ then if (if ((76 > size(cid)))
76+ then (size(split(cid, "/")[0]) == 59)
12177 else false)
12278 then (16 > size(split(cid, "/")[1]))
12379 else false
12480 else false
12581
12682
127-func validateHash (hash) = (65 > size(hash))
83+func validateHash (hash) = (size(hash) == 64)
12884
12985
13086 func keyUserStatus (caller) = ("user_status_" + caller)
13187
13288
13389 func keyArtDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
13490
13591
13692 func keyArtName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
13793
13894
13995 func keyArtDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
14096
14197
14298 func keyArtDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
14399
144100
145101 func keyArtExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
146102
147103
148104 func keyArtExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
149105
150106
151107 func keyArtMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
152108
153109
154110 func keyArtSignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
155111
156112
157113 func keyArtIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
158114
159115
160116 func keyArtOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
161117
162118
163119 func keyArtLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
164120
165121
166122 func keyArtLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
167123
168124
169125 func keyArtTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
170126
171127
172128 func keyArtType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
173129
174130
175131 func keyArtPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
176132
177133
178134 func keyArtAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
179135
180136
181137 func keyArtFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
182138
183139
184140 func keyArtHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
185141
186142
187143 func keyArtOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
188144
189145
190146 func keyArtArtidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
191147
192148
193149 func keyArtTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
194150
195151
196152 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
197153 then throw("Wrong Display CID")
198154 else if (!(validateCID(cidExport)))
199155 then throw("Wrong Export CID")
200156 else if (if ((cidLicence != ""))
201157 then !(validateCID(cidLicence))
202158 else false)
203159 then throw("Wrong Licence CID")
204160 else true
205161
206162
207163 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
208164 then throw("Export Hash 64 char. max")
209165 else if (!(validateHash(sha256Licence)))
210166 then throw("Licence Hash 64 char. max")
211167 else true
212168
213169
214170 func validateString (str,max) = if ((size(str) == 0))
215171 then throw("Field cannot be is empty")
216172 else if ((size(str) > max))
217173 then throw((str + " is too long"))
218174 else true
219175
220176
177+func validateUser (caller) = {
178+ let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
179+ if (if ((userStatus == userUnregistered))
180+ then true
181+ else (userStatus == userAllowed))
182+ then "Register this account first with \"Account\" tab"
183+ else if ((userStatus == userSuspended))
184+ then "Account suspended"
185+ else if ((userStatus == userRemoved))
186+ then "Account removed"
187+ else ""
188+ }
189+
190+
191+func setLIcence (cidLicence,sha256Licence) = {
192+ let cid = if ((size(cidLicence) == 0))
193+ then defaultLicence
194+ else cidLicence
195+ let hash = if ((size(sha256Licence) == 0))
196+ then defaultHashLicence
197+ else sha256Licence
198+ $Tuple2(cid, hash)
199+ }
200+
201+
202+func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,maxmint) = {
203+ let checkUser = validateUser(caller)
204+ if ((checkUser != ""))
205+ then throw(checkUser)
206+ else if ((size(cidDisplay) == 0))
207+ then throw("Display CID cannot be empty")
208+ else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
209+ then throw("Problem with CID")
210+ else if (!(validateAllHash(sha256Export, licenceHash)))
211+ then throw("Problem with Hashes")
212+ else if (!(validateString(name, 100)))
213+ then throw("100 Char. max name")
214+ else if (!(validateString(description, 1000)))
215+ then throw("1000 Char. max description")
216+ else if ((size(split(tags, ",")) > 5))
217+ then throw("5 tags max.")
218+ else if ((maxmint > 10))
219+ then throw("10 editions max per artwork")
220+ else ""
221+ }
222+
223+
224+func validatePayment (invoke) = if ((size(invoke.payments) == 0))
225+ then throw("No payment attached")
226+ else {
227+ let payment = value(invoke.payments[0])
228+ let amount = value(payment.amount)
229+ let assetId = if (if (isDefined(payment.assetId))
230+ then (payment.assetId == signAssetId)
231+ else false)
232+ then payment.assetId
233+ else throw("Only SIGN token accepted as transaction fee")
234+ let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
235+ if ((amount != currentCertificationPrice))
236+ then throw(("Payment amount should be " + toString(currentCertificationPrice)))
237+ else $Tuple2(amount, assetId)
238+ }
239+
240+
241+func isArtMinted (addressToUse,artId) = match getInteger(this, keyArtIssued(addressToUse, artId)) {
242+ case b: Int =>
243+ if ((b != 0))
244+ then true
245+ else false
246+ case _ =>
247+ false
248+}
249+
250+
251+func validatePriceAssetId (invoke,priceAssetId,artworkPrice) = {
252+ let payment = value(invoke.payments[0])
253+ let amount = value(payment.amount)
254+ let assetId = if (!(isDefined(payment.assetId)))
255+ then unit
256+ else if (if ((size(priceAssetId) > 0))
257+ then (toBase58String(value(payment.assetId)) == priceAssetId)
258+ else false)
259+ then payment.assetId
260+ else throw("Wrong asset id")
261+ if (if ((assetId == unit))
262+ then (priceAssetId != "")
263+ else false)
264+ then throw("Wrong asset id")
265+ else if ((artworkPrice != amount))
266+ then throw("Payment don't match")
267+ else $Tuple2(amount, assetId)
268+ }
269+
270+
271+func acceptedAssetIds (assetId) = if (if (if ((assetId != toBase58String(signAssetId)))
272+ then (assetId != toBase58String(wavesAssetId))
273+ else false)
274+ then (assetId != toBase58String(usdnAssetId))
275+ else false)
276+ then throw("Only SIGN, USDN or WAVES accepted")
277+ else true
278+
279+
280+func validateMinSell (assetId,price) = {
281+ let minSellWaves = if (unitTest)
282+ then 1
283+ else getIntegerByKeyFromOracle("waves_min_sell")
284+ let minSellUsdn = 1000000
285+ let minSellSign = if (unitTest)
286+ then 1
287+ else (getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId))) * 2)
288+ if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
289+ then (minSellUsdn > price)
290+ else false)
291+ then (price != 0)
292+ else false)
293+ then true
294+ else if (if ((assetId == toBase58String(signAssetId)))
295+ then (minSellSign > price)
296+ else false)
297+ then (price != 0)
298+ else false)
299+ then true
300+ else if (if ((assetId == toBase58String(wavesAssetId)))
301+ then (minSellWaves > price)
302+ else false)
303+ then (price != 0)
304+ else false)
305+ then throw("Wrong minimum sell price")
306+ else true
307+ }
308+
309+
221310 @Callable(invoke)
222311 func addArtwork (sha256Hash,signID,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
223312 then throw(maintenanceMSG)
224313 else {
225314 let artId = toBase58String(invoke.transactionId)
315+ let timestamp = lastBlock.timestamp
226316 let caller = toBase58String(invoke.caller.bytes)
227- let timestamp = lastBlock.timestamp
228- let licenceCID = if ((size(cidLicence) == 0))
229- then defaultLicence
230- else cidLicence
231- let licenceHash = if ((size(sha256Licence) == 0))
232- then defaultHashLicence
233- else sha256Licence
234- let userIsRegistered = match getString(userDapp, ("user_status_" + caller)) {
235- case s: String =>
236- s
237- case _ =>
238- userUnregistered
239- }
240- if (if (isDefined(userIsRegistered))
241- then if ((userIsRegistered == userUnregistered))
242- then true
243- else (userIsRegistered == userAllowed)
244- else false)
245- then throw("Register this account first with \"Account\" tab")
246- else if ((userIsRegistered == userSuspended))
247- then throw("Account suspended")
248- else if ((userIsRegistered == userRemoved))
249- then throw("Account removed")
250- else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
251- then throw("Problem with CID")
252- else if (!(validateHash(sha256Hash)))
253- then throw("Hash should be 64 characters maximum")
254- else if (!(validateAllHash(sha256Export, licenceHash)))
255- then throw("Problem with Hashes")
256- else if ((size(invoke.payments) == 0))
257- then throw("No payment attached")
317+ if (!(validateHash(sha256Hash)))
318+ then throw("Hash should be 64 characters maximum")
319+ else {
320+ let $t01047910548 = setLIcence(cidLicence, sha256Licence)
321+ let licenceCID = $t01047910548._1
322+ let licenceHash = $t01047910548._2
323+ let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
324+ if ((validateArtwork != ""))
325+ then throw("Something went wrong!")
326+ else {
327+ let $t01077610823 = validatePayment(invoke)
328+ let amount = $t01077610823._1
329+ let assetId = $t01077610823._2
330+ if (!(isDefined(amount)))
331+ then throw("Something went wrong")
332+ else {
333+ let entryExist = getStringByKey(keyArtTxidByHashOwner(sha256Hash, caller))
334+ if ((entryExist != ""))
335+ then throw("You already added it")
258336 else {
259- let payment = value(invoke.payments[0])
260- let amount = value(payment.amount)
261- let assetId = if (if (isDefined(payment.assetId))
262- then (payment.assetId == signAssetId)
263- else false)
264- then payment.assetId
265- else throw("Only SIGN token accepted")
266- let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
267- if ((amount != currentCertificationPrice))
268- then throw(("Payment amount should be " + toString(currentCertificationPrice)))
337+ let hashExist = getStringByKey(keyArtOwnerByHash(sha256Hash))
338+ if ((hashExist != ""))
339+ then throw("Hash already registered")
269340 else {
270- let entryExist = getStringByKey(keyArtTxidByHashOwner(sha256Hash, caller))
271- if ((entryExist != ""))
272- then throw("You already added it")
273- else {
274- let hashExist = getStringByKey(keyArtOwnerByHash(sha256Hash))
275- if ((hashExist != ""))
276- then throw("Hash already registered")
277- else {
278- let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
279- if (!(isSignCertified))
280- then throw("Sign Certificate not found for this address.")
281- else if ((size(cidDisplay) == 0))
282- then throw("Display CID cannot be empty")
283- else if (!(validateString(name, 100)))
284- then throw("100 Char. max name")
285- else if (!(validateString(description, 1000)))
286- then throw("1000 Char. max description")
287- else if ((size(split(tags, ",")) > 5))
288- then throw("5 tags max.")
289- else if ((maxmint > 10))
290- then throw("10 editions max")
291- else [StringEntry(keyArtOwnerByHash(sha256Hash), caller), StringEntry(keyArtTxidByHashOwner(sha256Hash, caller), artId), IntegerEntry(keyArtDate(caller, artId), timestamp), StringEntry(keyArtName(caller, artId), name), StringEntry(keyArtDesc(caller, artId), description), StringEntry(keyArtDisplayCid(caller, artId), cidDisplay), StringEntry(keyArtExportCid(caller, artId), cidExport), StringEntry(keyArtExportHash(caller, artId), sha256Export), StringEntry(keyArtLicenceHash(caller, artId), licenceHash), StringEntry(keyArtLicenceCid(caller, artId), licenceCID), StringEntry(keyArtType(caller, artId), type), StringEntry(keyArtTags(caller, artId), tags), IntegerEntry(keyArtMaxMint(caller, artId), maxmint), StringEntry(keyArtSignID(caller, artId), signID), IntegerEntry(keyArtIssued(caller, artId), 0), BooleanEntry(keyArtOnSale(caller, artId), false), StringEntry(keyArtArtidBySignid(caller, signID), artId), StringEntry(keyArtHashByTxidAddr(caller, artId), sha256Hash), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, assetId)]
292- }
293- }
341+ let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
342+ if (!(isSignCertified))
343+ then throw("Sign Certificate not found for this address.")
344+ else [StringEntry(keyArtOwnerByHash(sha256Hash), caller), StringEntry(keyArtTxidByHashOwner(sha256Hash, caller), artId), IntegerEntry(keyArtDate(caller, artId), timestamp), StringEntry(keyArtName(caller, artId), name), StringEntry(keyArtDesc(caller, artId), description), StringEntry(keyArtDisplayCid(caller, artId), cidDisplay), StringEntry(keyArtExportCid(caller, artId), cidExport), StringEntry(keyArtExportHash(caller, artId), sha256Export), StringEntry(keyArtLicenceHash(caller, artId), licenceHash), StringEntry(keyArtLicenceCid(caller, artId), licenceCID), StringEntry(keyArtType(caller, artId), type), StringEntry(keyArtTags(caller, artId), tags), IntegerEntry(keyArtMaxMint(caller, artId), maxmint), StringEntry(keyArtSignID(caller, artId), signID), IntegerEntry(keyArtIssued(caller, artId), 0), BooleanEntry(keyArtOnSale(caller, artId), false), StringEntry(keyArtArtidBySignid(caller, signID), artId), StringEntry(keyArtHashByTxidAddr(caller, artId), sha256Hash), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, assetId)]
294345 }
295346 }
347+ }
348+ }
349+ }
296350 }
297351
298352
299353
300354 @Callable(invoke)
301355 func updateArtwork (txid,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
302356 then throw(maintenanceMSG)
303357 else {
304358 let updateId = toBase58String(invoke.transactionId)
305359 let caller = toBase58String(invoke.caller.bytes)
306- let licenceCID = if ((size(cidLicence) == 0))
307- then defaultLicence
308- else cidLicence
309- let licenceHash = if ((size(sha256Licence) == 0))
310- then defaultHashLicence
311- else sha256Licence
312- let userIsRegistered = getStringByKeyFromUsers(keyUserStatus(caller))
313- if (if ((userIsRegistered == ""))
314- then true
315- else (userIsRegistered == userAllowed))
316- then throw("Register first with \"User infos\"")
317- else if ((userIsRegistered == userSuspended))
318- then throw("Account suspended")
319- else if ((userIsRegistered == userRemoved))
320- then throw("Account removed")
321- else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
322- then throw("Problem with CID")
323- else if (!(validateAllHash(sha256Export, licenceHash)))
324- then throw("Problem with Hashes")
325- else {
326- let entryExist = getStringByKey(keyArtName(caller, txid))
327- if ((entryExist == ""))
328- then throw("Entry not found")
329- else if (!(validateString(name, 100)))
330- then throw("100 Char. max name")
331- else if (!(validateString(description, 1000)))
332- then throw("1000 Char. max description")
333- else {
334- let flag = getStringByKey(keyArtFlag(caller, txid))
335- if ((flag == "ILLEGAL"))
336- then throw("Cannot update ILLEGAL artwork")
337- else {
338- let artworkMinted = match getInteger(this, keyArtIssued(caller, txid)) {
339- case b: Int =>
340- if ((b == 0))
341- then false
342- else true
343- case _ =>
344- false
345- }
346- if ((size(split(tags, ",")) > 5))
347- then throw("5 tags max.")
348- else if ((maxmint > 10))
349- then throw("10 editions max per artwork")
350- else if (!(artworkMinted))
351- then [StringEntry(keyArtName(caller, txid), name), StringEntry(keyArtDesc(caller, txid), description), StringEntry(keyArtDisplayCid(caller, txid), cidDisplay), StringEntry(keyArtExportCid(caller, txid), cidExport), StringEntry(keyArtExportHash(caller, txid), sha256Export), StringEntry(keyArtLicenceCid(caller, txid), licenceCID), StringEntry(keyArtLicenceHash(caller, txid), licenceHash), IntegerEntry(keyArtMaxMint(caller, txid), maxmint), StringEntry(keyArtTags(caller, txid), tags), StringEntry(keyArtType(caller, txid), type)]
352- else throw("Already minted")
353- }
354- }
355- }
360+ let $t01367813747 = setLIcence(cidLicence, sha256Licence)
361+ let licenceCID = $t01367813747._1
362+ let licenceHash = $t01367813747._2
363+ let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
364+ if ((validateArtwork != ""))
365+ then throw("Something went wrong!")
366+ else {
367+ let entryExist = getStringByKey(keyArtName(caller, txid))
368+ if ((entryExist == ""))
369+ then throw("Entry not found")
370+ else {
371+ let flag = getStringByKey(keyArtFlag(caller, txid))
372+ if ((flag == "ILLEGAL"))
373+ then throw("Cannot update ILLEGAL artwork")
374+ else if (!(isArtMinted(caller, txid)))
375+ then [StringEntry(keyArtName(caller, txid), name), StringEntry(keyArtDesc(caller, txid), description), StringEntry(keyArtDisplayCid(caller, txid), cidDisplay), StringEntry(keyArtExportCid(caller, txid), cidExport), StringEntry(keyArtExportHash(caller, txid), sha256Export), StringEntry(keyArtLicenceCid(caller, txid), licenceCID), StringEntry(keyArtLicenceHash(caller, txid), licenceHash), IntegerEntry(keyArtMaxMint(caller, txid), maxmint), StringEntry(keyArtTags(caller, txid), tags), StringEntry(keyArtType(caller, txid), type)]
376+ else throw("Already minted")
377+ }
378+ }
356379 }
357380
358381
359382
360-@Callable(i)
383+@Callable(invoke)
361384 func flagArtwork (artId,addr,flag) = {
362- let caller = toString(addressFromPublicKey(i.callerPublicKey))
363- let id = toBase58String(i.transactionId)
385+ let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
386+ let id = toBase58String(invoke.transactionId)
364387 if (containsElement([chris, joep, toString(this)], caller))
365388 then if ((flag == "CONSENT"))
366389 then [StringEntry(keyArtFlag(addr, artId), flag)]
367390 else if ((flag == ""))
368391 then [StringEntry(keyArtFlag(addr, artId), flag)]
369392 else if ((flag == "ILLEGAL"))
370393 then [StringEntry(keyArtFlag(addr, artId), flag), StringEntry(keyArtName(addr, artId), "ILLEGAL CONTENT"), StringEntry(keyArtDesc(addr, artId), "ILLEGAL CONTENT"), StringEntry(keyArtDisplayCid(addr, artId), ""), StringEntry(keyArtExportCid(addr, artId), ""), StringEntry(keyArtLicenceCid(addr, artId), "")]
371394 else throw(("Unknow status " + flag))
372395 else throw("You are not allowed")
373396 }
374397
375398
376399
377-@Callable(i)
400+@Callable(invoke)
378401 func deleteArtwork (artId,addr) = {
379- let caller = toString(addressFromPublicKey(i.callerPublicKey))
380- let id = toBase58String(i.transactionId)
402+ let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
403+ let id = toBase58String(invoke.transactionId)
381404 let addressToUse = if (containsElement([chris, joep, toString(this)], caller))
382405 then addr
383406 else caller
384407 let entryExist = getStringByKey(keyArtName(addressToUse, artId))
385408 if ((entryExist == ""))
386409 then throw("No art matching for this address")
387410 else {
388- let artworkMinted = match getInteger(this, keyArtIssued(addressToUse, artId)) {
389- case b: Int =>
390- if ((b != 0))
391- then true
392- else false
393- case _ =>
394- false
395- }
396- let maxMint = getIntegerByKey(keyArtMaxMint(addressToUse, artId))
397411 let sha256Hash = getStringByKey(keyArtHashByTxidAddr(addressToUse, artId))
398412 if ((sha256Hash == ""))
399413 then throw("No art hash matching for this address")
400414 else {
401415 let signID = getStringByKey(keyArtSignID(addressToUse, artId))
402416 if ((signID == ""))
403417 then throw("No SIGN ID matching")
404418 else {
405419 let dataToDelete = [DeleteEntry(keyArtDate(addressToUse, artId)), DeleteEntry(keyArtName(addressToUse, artId)), DeleteEntry(keyArtDesc(addressToUse, artId)), DeleteEntry(keyArtDisplayCid(addressToUse, artId)), DeleteEntry(keyArtExportCid(addressToUse, artId)), DeleteEntry(keyArtExportHash(addressToUse, artId)), DeleteEntry(keyArtLicenceHash(addressToUse, artId)), DeleteEntry(keyArtLicenceCid(addressToUse, artId)), DeleteEntry(keyArtType(addressToUse, artId)), DeleteEntry(keyArtTags(addressToUse, artId)), DeleteEntry(keyArtMaxMint(addressToUse, artId)), DeleteEntry(keyArtSignID(addressToUse, artId)), DeleteEntry(keyArtIssued(addressToUse, artId)), DeleteEntry(keyArtOnSale(addressToUse, artId)), DeleteEntry(keyArtFlag(addr, artId)), DeleteEntry(keyArtOwnerByHash(sha256Hash)), DeleteEntry(keyArtArtidBySignid(addressToUse, signID)), DeleteEntry(keyArtTxidByHashOwner(sha256Hash, addressToUse))]
406- if (!(artworkMinted))
420+ if (!(isArtMinted(addressToUse, artId)))
407421 then if (!(dappRunning))
408422 then throw(maintenanceMSG)
409423 else dataToDelete
410- else if (containsElement([chris, joep, toString(this)], caller))
424+ else if (containsElement([chris, toString(this)], caller))
411425 then dataToDelete
412- else throw("Art already minted, cannot delete")
426+ else throw("Art already minted, you cannot delete it")
413427 }
414428 }
415429 }
416430 }
417431
418432
419433
420-@Callable(i)
434+@Callable(invoke)
421435 func sellArtwork (artId,price,maxMint,assetId) = if (!(dappRunning))
422436 then throw(maintenanceMSG)
423437 else {
424- let id = toBase58String(i.transactionId)
425- let caller = toBase58String(i.caller.bytes)
438+ let id = toBase58String(invoke.transactionId)
439+ let caller = toBase58String(invoke.caller.bytes)
426440 let sellDate = lastBlock.timestamp
427441 let artworkName = getStringByKey(keyArtName(caller, artId))
428442 if ((artworkName == ""))
429443 then throw("This art doesn't match match your account")
430444 else {
431445 let exportCID = getStringByKey(keyArtExportCid(caller, artId))
432446 if ((size(split(exportCID, "/")[0]) != 59))
433447 then throw("You cannot sell art with no export file")
434448 else {
435449 let exportHash = getStringByKey(keyArtExportHash(caller, artId))
436450 if ((size(exportHash) != 64))
437451 then throw("You cannot sell art with no export hash")
438- else if (if (if ((assetId != toBase58String(signAssetId)))
439- then (assetId != toBase58String(wavesAssetId))
440- else false)
441- then (assetId != toBase58String(usdnAssetId))
442- else false)
443- then throw("Only SIGN, USDN or WAVES accepted")
444- else {
445- let minSellWaves = if (unitTest)
446- then 1
447- else getIntegerByKeyFromOracle("waves_min_sell")
448- let minSellUsdn = 1000000
449- let minSellSign = if (unitTest)
450- then 1
451- else (getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId))) * 2)
452- if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
453- then (minSellUsdn > price)
454- else false)
455- then (price != 0)
456- else false)
457- then true
458- else if (if ((assetId == toBase58String(signAssetId)))
459- then (minSellSign > price)
460- else false)
461- then (price != 0)
462- else false)
463- then true
464- else if (if ((assetId == toBase58String(wavesAssetId)))
465- then (minSellWaves > price)
466- else false)
467- then (price != 0)
468- else false)
469- then throw("Wrong minimum sell price")
470- else {
471- let userIsRegistered = getStringByKeyFromUsers(keyUserStatus(caller))
472- if (if ((userIsRegistered == ""))
473- then true
474- else (userIsRegistered == userAllowed))
475- then throw("Register this account first")
476- else if ((userIsRegistered == userSuspended))
477- then throw("Account suspended")
478- else if ((userIsRegistered == userRemoved))
479- then throw("Account deleted")
480- else {
481- let amountSold = getIntegerByKey(keyArtIssued(caller, artId))
482- let maxCanSell = getIntegerByKey(keyArtMaxMint(caller, artId))
483- if ((maxMint > 10))
484- then throw("10 editions max per artwork")
485- else if (if ((amountSold != 0))
486- then (amountSold == maxCanSell)
452+ else if (!(acceptedAssetIds(assetId)))
453+ then throw("Something wen wrong!")
454+ else if (!(validateMinSell(assetId, price)))
455+ then throw("Something wen wrong!")
456+ else {
457+ let checkUser = validateUser(caller)
458+ if ((checkUser != ""))
459+ then throw(checkUser)
460+ else {
461+ let amountSold = getIntegerByKey(keyArtIssued(caller, artId))
462+ let maxCanSell = getIntegerByKey(keyArtMaxMint(caller, artId))
463+ if ((maxMint > 10))
464+ then throw("10 editions max per artwork")
465+ else if (if ((amountSold != 0))
466+ then (amountSold == maxCanSell)
467+ else false)
468+ then throw("Max edition reached.")
469+ else if (if ((amountSold > 0))
470+ then (maxCanSell != maxMint)
471+ else false)
472+ then throw("Cannot change maximum issuable anymore")
473+ else {
474+ let sellStatus = if (if ((price > 0))
475+ then (maxMint > 0)
487476 else false)
488- then throw("Max edition reached.")
489- else if (if ((amountSold > 0))
490- then (maxCanSell != maxMint)
491- else false)
492- then throw("Cannot change maximum issuable anymore")
493- else {
494- let sellStatus = if (if ((price > 0))
495- then (maxMint > 0)
496- else false)
497- then true
498- else false
477+ then true
478+ else false
499479 [BooleanEntry(keyArtOnSale(caller, artId), sellStatus), IntegerEntry(keyArtPrice(caller, artId), price), IntegerEntry(keyArtMaxMint(caller, artId), maxMint), StringEntry(keyArtAssetIdAccepted(caller, artId), assetId)]
500- }
501- }
502- }
503- }
480+ }
481+ }
482+ }
504483 }
505484 }
506485 }
507486
508487
509488
510-@Callable(i)
489+@Callable(invoke)
511490 func buyArtwork (artId,issuer) = if (!(dappRunning))
512491 then throw(maintenanceMSG)
513492 else {
514- let id = toBase58String(i.transactionId)
515- let caller = toBase58String(i.caller.bytes)
493+ let id = toBase58String(invoke.transactionId)
494+ let caller = toBase58String(invoke.caller.bytes)
516495 let totalNFT = getIntegerByKey("total_nft_issued")
517496 let signID = getStringByKey(keyArtSignID(issuer, artId))
518497 let artworkName = getStringByKey(keyArtName(issuer, artId))
519498 if ((artworkName == ""))
520499 then throw("Art doesn't exist")
521500 else {
522501 let displayCID = getStringByKey(keyArtDisplayCid(issuer, artId))
523502 let exportCID = getStringByKey(keyArtExportCid(issuer, artId))
524503 let exportHash = getStringByKey(keyArtExportHash(issuer, artId))
525504 let licenceCID = getStringByKey(keyArtLicenceCid(issuer, artId))
526505 let licenceHash = getStringByKey(keyArtLicenceHash(issuer, artId))
527506 let description = take(getStringByKey(keyArtDesc(issuer, artId)), 50)
507+ let isOnSale = getBooleanByKey(keyArtOnSale(issuer, artId))
528508 let amountSold = getIntegerByKey(keyArtIssued(issuer, artId))
529509 let artworkPrice = getIntegerByKey(keyArtPrice(issuer, artId))
530- let isOnSale = getBooleanByKey(keyArtOnSale(issuer, artId))
531510 let priceAssetId = getStringByKey(keyArtAssetIdAccepted(issuer, artId))
532511 let sourceHash = getStringByKey(keyArtHashByTxidAddr(issuer, artId))
533512 let maxCanSell = getIntegerByKey(keyArtMaxMint(issuer, artId))
534513 if (if (if ((0 >= artworkPrice))
535514 then true
536515 else !(isOnSale))
537516 then true
538517 else (0 >= maxCanSell))
539518 then throw("Art not for sale")
540519 else {
541- let payment = value(i.payments[0])
542- let amount = value(payment.amount)
543- let assetId = if (!(isDefined(payment.assetId)))
544- then unit
545- else if (if ((size(priceAssetId) > 0))
546- then (toBase58String(value(payment.assetId)) == priceAssetId)
547- else false)
548- then payment.assetId
549- else throw("Wrong asset id")
550- if (if ((assetId == unit))
551- then (priceAssetId != "")
552- else false)
553- then throw("Wrong asset id")
520+ let $t02187121951 = validatePriceAssetId(invoke, priceAssetId, artworkPrice)
521+ let amount = $t02187121951._1
522+ let assetId = $t02187121951._2
523+ let isWhitelisted = checkWhitelist(issuer)
524+ let cut = if ((isWhitelisted > height))
525+ then 0
526+ else if ((priceAssetId == toBase58String(signAssetId)))
527+ then signCut
528+ else usdnWaveCut
529+ let amountForSign = fraction(amount, cut, 100)
530+ let amountForCreator = (amount - amountForSign)
531+ if ((amountSold == maxCanSell))
532+ then throw("Art sold out")
554533 else {
555- let isWhitelisted = checkWhitelist(issuer)
556- let cut = if ((isWhitelisted == 1))
557- then 0
558- else if ((priceAssetId == toBase58String(signAssetId)))
559- then 8
560- else 10
561- let amountForSign = fraction(amount, cut, 100)
562- let amountForCreator = (amount - amountForSign)
563- if ((amountSold == maxCanSell))
564- then throw("Art sold out")
565- else if ((artworkPrice != amount))
566- then throw("Payment don't match")
567- else {
568- let newAmountSold = (amountSold + 1)
569- let entryDate = lastBlock.timestamp
570- let issueMeta = ((((((((((((((((((((((((((("Creator: " + issuer) + ",
534+ let newAmountSold = (amountSold + 1)
535+ let entryDate = lastBlock.timestamp
536+ let issueMeta = ((((((((((((((((((((((((((("Creator: " + issuer) + ",
571537 ArtID: ") + artId) + ",
572538 SignID: ") + signID) + ",
573539 Artwork name: ") + artworkName) + ",
574540 Artwork description: ") + description) + ",
575541 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell)) + ",
576542 Max issuable: ") + toString(maxCanSell)) + ",
577543 Source hash: ") + sourceHash) + ",
578544 Display cid: ") + displayCID) + ",
579545 Export cid: ") + exportCID) + ",
580546 Export hash: ") + exportHash) + ",
581547 Licence cid: ") + licenceCID) + ",
582548 Licence hash: ") + licenceHash)
583- let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
584- let idNFT = calculateAssetId(issueNFT)
585- let sellStatus = if ((newAmountSold == maxCanSell))
586- then false
587- else true
588-[IntegerEntry(keyArtIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)), StringEntry(((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer), ((((((((((caller + "_") + toString(entryDate)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))), IntegerEntry("total_nft_issued", (totalNFT + 1)), BooleanEntry(keyArtOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId), ScriptTransfer(i.caller, 1, idNFT)]
589- }
549+ let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
550+ let idNFT = calculateAssetId(issueNFT)
551+ let sellStatus = if ((newAmountSold == maxCanSell))
552+ then false
553+ else true
554+[IntegerEntry(keyArtIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)), StringEntry(((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer), ((((((((((caller + "_") + toString(entryDate)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))), IntegerEntry("total_nft_issued", (totalNFT + 1)), BooleanEntry(keyArtOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId), ScriptTransfer(invoke.caller, 1, idNFT)]
590555 }
591556 }
592557 }
593558 }
594559
595560
596-
597-@Callable(i)
598-func deleteEntry (entry) = {
599- let caller = toString(addressFromPublicKey(i.callerPublicKey))
600- if ((caller == chris))
601- then [DeleteEntry(entry)]
602- else throw("no")
603- }
604-
605-

github/deemru/w8io/786bc32 
328.36 ms