tx · 2mFEyMVbvC1WJvi4f5V7USxJcULDZZAK6DjDFFtacPUY

3MyRsssByY6ZDZxzXEFK7sgFYbtXAxajmJp:  -0.01000000 Waves

2021.11.09 18:22 [1783649] smart account 3MyRsssByY6ZDZxzXEFK7sgFYbtXAxajmJp > SELF 0.00000000 Waves

{ "type": 13, "id": "2mFEyMVbvC1WJvi4f5V7USxJcULDZZAK6DjDFFtacPUY", "fee": 1000000, "feeAssetId": null, "timestamp": 1636471360183, "version": 2, "chainId": 84, "sender": "3MyRsssByY6ZDZxzXEFK7sgFYbtXAxajmJp", "senderPublicKey": "7mNS5bKoVK7u5db7PvrcUj25wxK6NvkMjqkMHjBKcpVb", "proofs": [ "26SYSUy7CUtcoQwmnUvAofX29i4cvuLpFB4FoVaqr6W459pTQaUtuz64LQrRGTcXohojMTA8sNiMxnDaHmcVMruZ" ], "script": "base64:AAIFAAAAAAAAAEcIAhIFCgMBCAgSCgoICAgICAgICAgSCQoHCAEBCAgBARIECgIICBIFCgMICAgSAwoBCBIECgIICBIGCgQICAgIEgUKAwgICAAAAFMAAAAACHVuaXRUZXN0BwAAAAAJb3JhY2xlRmVlCQEAAAAFdmFsdWUAAAABCQAEJgAAAAECAAAAIzNNcFpRanpHb2dtaWZjRUtlOG1EZDZyaWJMN254VDlBQ3llAAAAAAtmZWVSZWNlaXZlcgIAAAAjM042NXhMcThKY0NlYUVpUjFUSlE3ZEJxWEJ2RXk2RTQ4V3oAAAAACGNlcnREYXBwAgAAACMzTXhjWHJOYk1aS1lhU3JoY2ZlTW0yaFpuQmVDdTN5UldzdwAAAAAIdXNlckRhcHAJAQAAAAV2YWx1ZQAAAAEJAAQmAAAAAQIAAAAjM045Y1FnWkZQSEhWdTh3cXNuMkRrUUZlaGczaDhDTmlvb0EAAAAADXdoaXRlbGlzdERhcHAJAQAAAAV2YWx1ZQAAAAEJAAQmAAAAAQIAAAAjM045eFpZR3B6TUZEWHZYdWN0bVU2elY4cVN6bTJaZkYzMWYAAAAAC1VTRE5Bc3NldElkAQAAACAAhSlM6RMuqheYbG/N0SV5hAUPIuUNy6okaxuy71mKvAAAAAAGb3duZXJzCQAETAAAAAIJAAQdAAAAAgUAAAAJb3JhY2xlRmVlAgAAAAZvd25lcjEJAARMAAAAAgkABB0AAAACBQAAAAlvcmFjbGVGZWUCAAAABm93bmVyMgUAAAADbmlsAAAAAAV0eXBlcwkABEwAAAACAgAAAAVJTUFHRQkABEwAAAACAgAAAANQREYJAARMAAAAAgIAAAAFVklERU8FAAAAA25pbAAAAAAMUHJldmlld3R5cGVzCQAETAAAAAICAAAAA1BERgUAAAADbmlsAAAAABBVU0RORmlyc3RTZWxsQ3V0AAAAAAAAAACWAAAAAAtkYXBwUnVubmluZwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBsAAAACBQAAAAh1c2VyRGFwcAIAAAAUY29uZl9kYXBwX2lzX3J1bm5pbmcGAAAAAA5tYWludGVuYW5jZU1TRwkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAh1c2VyRGFwcAIAAAAUY29uZl9tYWludGVuYW5jZV9tc2cCAAAAAAAAAAANdXNlclN1c3BlbmRlZAIAAAAJU1VTUEVOREVEAAAAAAt1c2VyUmVtb3ZlZAIAAAAHUkVNT1ZFRAAAAAAQdXNlclVucmVnaXN0ZXJlZAIAAAAMVU5SRUdJU1RFUkVEAAAAAAt1c2VyQWxsb3dlZAIAAAAHQUxMT1dFRAAAAAAMYXVjdGlvblR5cGUxAgAAAAdCSURUWVBFAAAAAAxhdWN0aW9uVHlwZTICAAAAC1RSQURJVElPTkFMAAAAAAxhdWN0aW9uVHlwZTMCAAAABkRJUkVDVAEAAAAXZ2V0U3RyaW5nQnlLZXlGcm9tVXNlcnMAAAABAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAh1c2VyRGFwcAUAAAADa2V5AgAAAAABAAAADmdldFN0cmluZ0J5S2V5AAAAAQAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAADa2V5AgAAAAABAAAAFWdldFN0cmluZ0J5S2V5T3JFcnJvcgAAAAIAAAADa2V5AAAABWVycm9yCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQdAAAAAgUAAAAEdGhpcwUAAAADa2V5BQAAAAVlcnJvcgEAAAAZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQAAAAEAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAJb3JhY2xlRmVlBQAAAANrZXkCAAAAH0ludGVnZXIgdW5kZWZpbmUgb3IgMCBpbiBvcmFjbGUBAAAAD2dldEludGVnZXJCeUtleQAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQAAAAAAAAAAAAEAAAAOY2hlY2tXaGl0ZWxpc3QAAAABAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAA13aGl0ZWxpc3REYXBwBQAAAANrZXkAAAAAAAAAAAABAAAAD2dldEJvb2xlYW5CeUtleQAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGwAAAAIFAAAABHRoaXMF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PQAAAAIFAAAABWJpZElkAgAAAAAHBgcBAAAACmdldEFydERhdGEAAAAEAAAAAWkAAAAGaXNzdWVyAAAABWFydElkAAAABWlzQmlkBAAAAA5jYWxsZXJJc0lzc3VlcgkAAAAAAAACCQACWAAAAAEICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMFAAAABmlzc3VlcgQAAAAIdG90YWxORlQJAQAAAA9nZXRJbnRlZ2VyQnlLZXkAAAABAgAAABB0b3RhbF9uZnRfaXNzdWVkBAAAAAthcnR3b3JrTmFtZQkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAB2tleU5hbWUAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkAwkAAAAAAAACBQAAAAthcnR3b3JrTmFtZQIAAAAACQAAAgAAAAECAAAAEUFydCBkb2Vzbid0IGV4aXN0BAAAAAhpc09uU2FsZQkBAAAAD2dldEJvb2xlYW5CeUtleQAAAAEJAQAAAAlrZXlPblNhbGUAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAAphbW91bnRTb2xkCQEAAAAPZ2V0SW50ZWdlckJ5S2V5AAAAAQkBAAAACWtleUlzc3VlZAAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQEAAAADGFydHdvcmtQcmljZQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkBAAAAD2dldEludGVnZXJCeUtleQAAAAEJAQAAAAhrZXlQcmljZQAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQJAABoAAAAAgUAAAAZY3VycmVudENlcnRpZmljYXRpb25QcmljZQAAAAAAAAAAAgQAAAAMcHJpY2VBc3NldElkAwUAAAAOY2FsbGVySXNJc3N1ZXIJAAJYAAAAAQUAAAALVVNETkFzc2V0SWQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABJrZXlBc3NldElkQWNjZXB0ZWQAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAAptYXhDYW5TZWxsCQEAAAAPZ2V0SW50ZWdlckJ5S2V5AAAAAQkBAAAACmtleU1heE1pbnQAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkAwMDCQEAAAABIQAAAAEFAAAABWlzQmlkCQEAAAABIQAAAAEFAAAADmNhbGxlcklzSXNzdWVyBwMDCQAAZwAAAAIAAAAAAAAAAAAFAAAADGFydHdvcmtQcmljZQYJAQAAAAEhAAAAAQUAAAAIaXNPblNhbGUGCQAAZwAAAAIAAAAAAAAAAAAFAAAACm1heENhblNlbGwHCQAAAgAAAAECAAAAEEFydCBub3QgZm9yIHNhbGUDAwMJAQAAAAEhAAAAAQUAAAAFaXNCaWQFAAAADmNhbGxlcklzSXNzdWVyBwkAAGcAAAACAAAAAAAAAAAABQAAAAptYXhDYW5TZWxsBwkAAAIAAAABAgAAABRNYXggaXNzdWFibGUgbm90IHNldAkABRkAAAAHBQAAAAh0b3RhbE5GVAUAAAALYXJ0d29ya05hbWUFAAAACmFtb3VudFNvbGQFAAAADGFydHdvcmtQcmljZQUAAAAMcHJpY2VBc3NldElkBQAAAAptYXhDYW5TZWxsBQAAAAhpc09uU2FsZQEAAAAKZ2V0QmlkRGF0YQAAAAkAAAABaQAAAAZjYWxsZXIAAAAGaXNzdWVyAAAABWFydElkAAAACGJpZE93bmVyAAAABWJpZElkAAAADHByaWNlQXNzZXRJZAAAAAxhcnR3b3JrUHJpY2UAAAAFaXNCaWQEAAAACWNoZWNrVXNlcgkBAAAADHZhbGlkYXRlVXNlcgAAAAEFAAAABmlzc3VlcgMDBQAAAAVpc0JpZAkBAAAAAiE9AAAAAgUAAAAJY2hlY2tVc2VyAgAAAAAHCQAAAgAAAAEFAAAACWNoZWNrVXNlcgQAAAAKYmlkRGF0YUtleQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAARiaWRfBQAAAAVhcnRJZAIAAAABXwUAAAAGaXNzdWVyAgAAAAFfBQAAAAhiaWRPd25lcgIAAAABXwUAAAAFYmlkSWQEAAAADHQwMTM1MTkxMzY0OAMFAAAABWlzQmlkCQEAAAAWZ2V0UHJpY2VBc3NldElkRnJvbUJpZAAAAAEFAAAACmJpZERhdGFLZXkJAQAAABR2YWxpZGF0ZVByaWNlQXNzZXRJZAAAAAMFAAAAAWkFAAAADHByaWNlQXNzZXRJZAUAAAAMYXJ0d29ya1ByaWNlBAAAAAZhbW91bnQIBQAAAAx0MDEzNTE5MTM2NDgAAAACXzEEAAAAB2Fzc2V0SWQIBQAAAAx0MDEzNTE5MTM2NDgAAAACXzIJAAUVAAAAAwUAAAAKYmlkRGF0YUtleQUAAAAGYW1vdW50BQAAAAdhc3NldElkAQAAABFnZXRDb21taXNzaW9uRGF0YQAAAAUAAAAGaXNzdWVyAAAAB2Fzc2V0SWQAAAAGYW1vdW50AAAACmFtb3VudFNvbGQAAAAKbWF4Q2FuU2VsbAQAAAANaXNXaGl0ZWxpc3RlZAkBAAAADmNoZWNrV2hpdGVsaXN0AAAAAQUAAAAGaXNzdWVyBAAAAANjdXQDCQAAZgAAAAIFAAAADWlzV2hpdGVsaXN0ZWQFAAAABmhlaWdodAAAAAAAAAAAAAMJAAAAAAAAAgUAAAAHYXNzZXRJZAUAAAALVVNETkFzc2V0SWQFAAAAEFVTRE5GaXJzdFNlbGxDdXQJAAACAAAAAQIAAAAWT25seSBVU0ROIGlzIGFjY2VwdGVkIQQAAAAPYW1vdW50Rm9yU2NvbmV4CQAAawAAAAMFAAAABmFtb3VudAUAAAADY3V0AAAAAAAAAAPoBAAAABBhbW91bnRGb3JDcmVhdG9yCQAAZQAAAAIFAAAABmFtb3VudAUAAAAPYW1vdW50Rm9yU2NvbmV4AwkAAAAAAAACBQAAAAphbW91bnRTb2xkBQAAAAptYXhDYW5TZWxsCQAAAgAAAAECAAAADEFydCBzb2xkIG91dAQAAAANbmV3QW1vdW50U29sZAkAAGQAAAACBQAAAAphbW91bnRTb2xkAAAAAAAAAAABCQAFFQAAAAMFAAAAD2Ftb3VudEZvclNjb25leAUAAAAQYW1vdW50Rm9yQ3JlYXRvcgUAAAANbmV3QW1vdW50U29sZAEAAAAMZ2V0SXNzdWVEYXRhAAAACwAAAAZpc3N1ZXIAAAAFYXJ0SWQAAAALYXJ0d29ya05hbWUAAAANbmV3QW1vdW50U29sZAAAAAptYXhDYW5TZWxsAAAACHRvdGFsTkZUAAAABmNhbGxlcgAAAAhiaWRPd25lcgAAAAViaWRJZAAAAAFpAAAACGlzT25TYWxlBAAAAAlpc3N1ZU1ldGEJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAA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AAACXzMEAAAADWNvbW1pc2lvbkRhdGEJAQAAABFnZXRDb21taXNzaW9uRGF0YQAAAAUFAAAABmlzc3VlcgkBAAAABXZhbHVlAAAAAQUAAAAHYXNzZXRJZAUAAAAGYW1vdW50BQAAAAphbW91bnRTb2xkBQAAAAptYXhDYW5TZWxsBAAAAA9hbW91bnRGb3JTY29uZXgIBQAAAA1jb21taXNpb25EYXRhAAAAAl8xBAAAABBhbW91bnRGb3JDcmVhdG9yCAUAAAANY29tbWlzaW9uRGF0YQAAAAJfMgQAAAANbmV3QW1vdW50U29sZAgFAAAADWNvbW1pc2lvbkRhdGEAAAACXzMEAAAACmlzc3VlckRhdGEJAQAAAAxnZXRJc3N1ZURhdGEAAAALBQAAAAZpc3N1ZXIFAAAABWFydElkBQAAAAthcnR3b3JrTmFtZQUAAAANbmV3QW1vdW50U29sZAUAAAAKbWF4Q2FuU2VsbAUAAAAIdG90YWxORlQFAAAABmNhbGxlcgUAAAAIYmlkT3duZXIFAAAABWJpZElkBQAAAAFpBQAAAAhpc09uU2FsZQQAAAAKc2VsbFN0YXR1cwgFAAAACmlzc3VlckRhdGEAAAACXzEEAAAACnJlY2VpdmVORlQIBQAAAAppc3N1ZXJEYXRhAAAAAl8yBAAAAAlpc3N1ZU1ldGEIBQAAAAppc3N1ZXJEYXRhAAAAAl8zBAAAAAtpZE5GVEludm9rZQkAA/wAAAAEBQAAAAR0aGlzAgAAAAdtaW50TmZ0CQAETAAAAAIFAAAACHRvdGFsTkZUCQAETAAAAAIFAAAACWlzc3VlTWV0YQkABEwAAAACCQAEJQAAAAEFAAAACnJlY2VpdmVORlQFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAAtpZE5GVEludm9rZQUAAAALaWRORlRJbnZva2UEAAAABWlkTkZUBAAAAAckbWF0Y2gwBQAAAAtpZE5GVEludm9rZQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFyBQAAAAckbWF0Y2gwBQAAAAFyCQAAAgAAAAECAAAAF0luY29ycmVjdCBpbnZva2UgcmVzdWx0BAAAAAtiaWRLZXlWYWx1ZQkBAAAADGdldEJpZEtleVZhbAAAAAMFAAAAB2Fzc2V0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BAAAAAllbmRIZWlnaHQJAQAAAA9nZXRJbnRlZ2VyQnlLZXkAAAABCQEAAAAMa2V5RW5kSGVpZ2h0AAAAAgUAAAAGaXNzdWVyBQAAAAVhcnRJZAQAAAAKaGlnaGVzdEJpZAkBAAAAGmdldEFtb3VudEhpZ2hlc3RCaWRCeUFydElkAAAAAQUAAAAFYXJ0SWQDCQAAZgAAAAIFAAAABmhlaWdodAUAAAAJZW5kSGVpZ2h0CQAAAgAAAAECAAAAIVRoaXMgYXVjdGlvbiBpcyBmaW5pc2hlZCBhbHJlYWR5IQQAAAALY2FsbGRlckRhdGEJAQAAAAxpZENhbGxlckRhdGUAAAABBQAAAAFpBAAAAAJpZAgFAAAAC2NhbGxkZXJEYXRhAAAAAl8xBAAAAAZjYWxsZXIIBQAAAAtjYWxsZGVyRGF0YQAAAAJfMgQAAAAEZGF0ZQgFAAAAC2NhbGxkZXJEYXRhAAAAAl8zBAAAAAxpc1BheW1lbnRWYXIJAQAAAAlpc1BheW1lbnQAAAABBQAAAAFpBAAAAAdwYXltZW50CAUAAAAMaXNQYXltZW50VmFyAAAAAl8xBAAAAAZhbW91bnQIBQAAAAxpc1BheW1lbnRWYXIAAAACXzIDCQAAZwAAAAIFAAAACmhpZ2hlc3RCaWQFAAAABmFtb3VudAkAAAIAAAABCQABLAAAAAICAAAAIFBsZWFzZSBwbGFjZSBhIGJpZCBoaWdoZXIgdGhhbjogCQABpAAAAAEFAAAACmhpZ2hlc3RCaWQEAAAAB2Fzc2V0SWQDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABCAUAAAAHcGF5bWVudAAAAAdhc3NldElkCQAAAgAAAAECAAAAFk9ubHkgVVNETiBpcyBhY2NlcHRlZCEJAAJYAAAAAQkBAAAABXZhbHVlAAAAAQgFAAAAB3BheW1lbnQAAAAHYXNzZXRJZAQAAAAGYmlkTmJyCQEAAAAPZ2V0SW50ZWdlckJ5S2V5AAAAAQkAASwAAAACAgAAABJjdXJyZW50X2JpZGFtb3VudF8FAAAABWFydElkBAAAAA9taW5BcnR3b3JrUHJpY2UJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAQAAAA9nZXRJbnRlZ2VyQnlLZXkAAAABCQEAAAAIa2V5UHJpY2UAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkCQAAaAAAAAIFAAAAGWN1cnJlbnRDZXJ0aWZpY2F0aW9uUHJpY2UAAAAAAAAAAAIDCQEAAAABIQAAAAEJAQAAABBhY2NlcHRlZEFzc2V0SWRzAAAAAQUAAAAHYXNzZXRJZAkAAAIAAAABAgAAABJhc3NldCBub3QgYWNjZXB0ZWQDCQAAZgAAAAIFAAAAD21pbkFydHdvcmtQcmljZQUAAAAGYW1vdW50CQAAAgAAAAECAAAAF0JpZCBpcyBiZWxvdyBtaW4gcHJpY2UhBAAAAAphbW91bnRTb2xkCQEAAAAPZ2V0SW50ZWdlckJ5S2V5AAAAAQkBAAAACWtleUlzc3VlZAAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQEAAAACm1heENhblNlbGwJAQAAAA9nZXRJbnRlZ2VyQnlLZXkAAAABCQEAAAAKa2V5TWF4TWludAAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQDCQAAZwAAAAIAAAAAAAAAAAAFAAAACm1heENhblNlbGwJAAACAAAAAQIAAAAjTm8gbWF4IGVkaXRpb24gc2V0IGZvciB0aGlzIGFydHdvcmsDCQAAZwAAAAIFAAAACmFtb3VudFNvbGQFAAAACm1heENhblNlbGwJAAACAAAAAQIAAAAYU29sZCBvdXQsIHlvdSBjYW5ub3QgYmlkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAARiaWRfBQAAAAVhcnRJZAIAAAABXwUAAAAGaXNzdWVyAgAAAAFfBQAAAAZjYWxsZXICAAAAAV8FAAAAAmlkAgAAAAVfT1BFTgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAAdhc3NldElkAgAAAAFfCQABpAAAAAEFAAAABmFtb3VudAIAAAABXwkAAaQAAAABBQAAAARkYXRlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQABLAAAAAICAAAAEmN1cnJlbnRfYmlkYW1vdW50XwUAAAAFYXJ0SWQJAABkAAAAAgUAAAAGYmlkTmJyAAAAAAAAAAABCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABJrZXlIaWdoZXN0QmlkQmlkSWQAAAABBQAAAAVhcnRJZAkAAlgAAAABCAUAAAABaQAAAA10cmFuc2FjdGlvbklkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAIa2V5QmlkSWQAAAABCQACWAAAAAEIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQFAAAABmFtb3VudAUAAAADbmlsAQAAABdhY2NlcHRCaWROb25UcmFkaXRpb25hbAAAAAUAAAABaQAAAAVhcnRJZAAAAAZpc3N1ZXIAAAAFYmlkSWQAAAAIYmlkT3duZXIEAAAABmNhbGxlcgkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzAwkBAAAAAiE9AAAAAgUAAAAGY2FsbGVyBQAAAAZpc3N1ZXIJAAACAAAAAQIAAAAZWW91IGNhbm5vdCBkbyB0aGlzIGFjdGlvbgkBAAAAB2J1eU1pbnQAAAAGBQAAAAFpBQAAAAVhcnRJZAUAAAAGaXNzdWVyBQAAAAViaWRJZAUAAAAIYmlkT3duZXIGAQAAAA5yZXN0YXJ0QXVjdGlvbgAAAAIAAAAFYXJ0SWQAAAAGaXNzdWVyBAAAAAphbW91bnRTb2xkCQEAAAAPZ2V0SW50ZWdlckJ5S2V5AAAAAQkBAAAACWtleUlzc3VlZAAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQEAAAACm1heENhblNlbGwJAQAAAA9nZXRJbnRlZ2VyQnlLZXkAAAABCQEAAAAKa2V5TWF4TWludAAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQEAAAADG9sZEVuZEhlaWdodAkBAAAAD2dldEludGVnZXJCeUtleQAAAAEJAQAAAAxrZXlFbmRIZWlnaHQAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAAhkdXJhdGlvbgkBAAAAD2dldEludGVnZXJCeUtleQAAAAEJAQAAAAtrZXlEdXJhdGlvbgAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQEAAAACWVuZEhlaWdodAkAAGQAAAACBQAAAAhkdXJhdGlvbgUAAAAGaGVpZ2h0AwkAAGYAAAACBQAAAAZoZWlnaHQFAAAADG9sZEVuZEhlaWdodAMJAAAAAAAAAgUAAAAKYW1vdW50U29sZAUAAAAKbWF4Q2FuU2VsbAkAAAIAAAABAgAAACZDYW4ndCByZXN0YXJ0IGF1Y3Rpb24sIG1heCBhbW91bnQgc29sZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADGtleUVuZEhlaWdodAAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQFAAAACWVuZEhlaWdodAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAASa2V5SGlnaGVzdEJpZEJpZElkAAAAAQUAAAAFYXJ0SWQFAAAAA25pbAkAAAIAAAABAgAAACRQcmV2aW91cyBhdWN0aW9uIGlzbid0IGNvbXBsZXRlZCB5ZXQBAAAAFGFjY2VwdEJpZFRyYWRpdGlvbmFsAAAABQAAAAFpAAAABWFydElkAAAABmlzc3VlcgAAAAViaWRJZAAAAAhiaWRPd25lcgQAAAAJZW5kSGVpZ2h0CQEAAAAPZ2V0SW50ZWdlckJ5S2V5AAAAAQkBAAAADGtleUVuZEhlaWdodAAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQEAAAADGhpZ2hlc3RCaWRJZAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAEmtleUhpZ2hlc3RCaWRCaWRJZAAAAAEFAAAABWFydElkAwkAAGYAAAACBQAAAAZoZWlnaHQFAAAACWVuZEhlaWdodAMJAAAAAAAAAgUAAAAFYmlkSWQFAAAADGhpZ2hlc3RCaWRJZAQAAAALYnV5TWludERhdGEJAQAAAAdidXlNaW50AAAABgUAAAABaQUAAAAFYXJ0SWQFAAAABmlzc3VlcgUAAAAFYmlkSWQFAAAACGJpZE93bmVyBgQAAAAScmVzdGFydEF1Y3Rpb25EYXRhCQEAAAAOcmVzdGFydEF1Y3Rpb24AAAACBQAAAAVhcnRJZAUAAAAGaXNzdWVyCQAETgAAAAIFAAAAEnJlc3RhcnRBdWN0aW9uRGF0YQUAAAALYnV5TWludERhdGEJAAACAAAAAQIAAAAcVGhpcyBpcyBub3QgdGhlIHdpbm5pbmcgYmlkIQkAAAIAAAABAgAAACFUaGlzIGF1Y3Rpb24gaXMgbm90IHlldCBmaW5p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AAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA5yZWNlaXZlTkZUQWRkeQAAAAAAAAAAAQUAAAAFaWRORlQFAAAAA25pbAkAAlgAAAABBQAAAAVpZE5GVAkAAAIAAAABAgAAABxPbmx5IHRoZSBkQXBwIGNhbiBtaW50IE5GVCdzAAAAAWkBAAAACmFkZEFydHdvcmsAAAAIAAAACnNoYTI1Nkhhc2gAAAAEbmFtZQAAAAtkZXNjcmlwdGlvbgAAAAR0YWdzAAAABHR5cGUAAAAKY2lkRGlzcGxheQAAAAtlbnRpdGxlbWVudAAAAAdwcmV2aWV3BAAAAAx0MDE3NzQwMTc3ODEJAQAAAAxpZENhbGxlckRhdGUAAAABBQAAAAFpBAAAAAVhcnRJZAgFAAAADHQwMTc3NDAxNzc4MQAAAAJfMQQAAAAGY2FsbGVyCAUAAAAMdDAxNzc0MDE3NzgxAAAAAl8yBAAAAARkYXRlCAUAAAAMdDAxNzc0MDE3NzgxAAAAAl8zAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAABXR5cGVzBQAAAAR0eXBlBAAAAA92YWxpZGF0ZUFydHdvcmsJAQAAABN2YWxpZGF0ZUFydHdvcmtEYXRhAAAABQUAAAAGY2FsbGVyBQAAAApjaWREaXNwbGF5BQAAAARuYW1lBQAAAAtkZXNjcmlwdGlvbgUAAAAEdGFncwMJAQAAAAIhPQAAAAIFAAAAD3ZhbGlkYXRlQXJ0d29yawIAAAAACQAAAgAAAAECAAAAFVNvbWV0aGluZyB3ZW50IHdyb25nIQQAAAAMdDAxODE3MDE4MjEyCQEAAAAPdmFsaWRhdGVQYXltZW50AAAAAQUAAAABaQQAAAAGYW1vdW50CAUAAAAMdDAxODE3MDE4MjEyAAAAAl8xBAAAAAdhc3NldElkCAUAAAAMdDAxODE3MDE4MjEyAAAAAl8yAwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQUAAAAGYW1vdW50CQAAAgAAAAECAAAAFFNvbWV0aGluZyB3ZW50IHdyb25nBAAAAAtwcmV2aWV3RGF0YQMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAxQcmV2aWV3dHlwZXMFAAAABHR5cGUJAARMAAAAAgkBAAAAC1N0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TWF4TWludAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAAB21heE1pbnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAtrZXlEdXJhdGlvbgAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAACGR1cmF0aW9uCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAMa2V5RW5kSGVpZ2h0AAAAAgUAAAAGY2FsbGVyBQAAAAVhcnRJZAUAAAAJZW5kSGVpZ2h0CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABJrZXlBc3NldElkQWNjZXB0ZWQAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAdhc3NldElkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA5rZXlBdWN0aW9uVHlwZQAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAAC2F1Y3Rpb25UeXBlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAKa2V5Um95YWx0eQAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAAB3JveWFsdHkFAAAAA25pbAAAAAFpAQAAAApidXlBcnR3b3JrAAAAAgAAAAVhcnRJZAAAAAZpc3N1ZXIEAAAAC2F1Y3Rpb25UeXBlCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAOa2V5QXVjdGlvblR5cGUAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkAwkAAAAAAAACBQAAAAthdWN0aW9uVHlwZQUAAAAMYXVjdGlvblR5cGUzCQEAAAAHYnV5TWludAAAAAYFAAAAAWkFAAAABWFydElkBQAAAAZpc3N1ZXICAAAAAAIAAAAABwkAAAIAAAABAgAAADREaXJlY3QgYnV5IG9ubHkgYWxsb3dlZCB3aGVuIG5vIGF1Y3Rpb24gdHlwZSBpcyBzZXQhAAAAAWkBAAAACnVwZGF0ZVRhZ3MAAAADAAAABmFydGlzdAAAAAVhcnRJZAAAAAR0YWdzBAAAAAZjYWxsZXIJAAQlAAAAAQkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5AwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIFAAAABm93bmVycwUAAAAGY2FsbGVyAwkAAGYAAAACCQABkAAAAAEJAAS1AAAAAgUAAAAEdGFncwIAAAABLAAAAAAAAAAABQkAAAIAAAABAgAAAAs1IHRhZ3MgbWF4LgQAAAAHdGFnc09sZAkBAAAAFWdldFN0cmluZ0J5S2V5T3JFcnJvcgAAAAIJAQAAAAdrZXlUYWdzAAAAAgUAAAAGYXJ0aXN0BQAAAAVhcnRJZAIAAAAvTm8gdGFncyBjcmVhdGVkIHdpdGggdGhpcyBrZXksIHNvIGNhbid0IHVwZGF0ZSEDCQAAAAAAAAIFAAAABHRhZ3MFAAAAB3RhZ3NPbGQJAAACAAAAAQIAAAAeVGFncyBhcmUgdGhlIHNhbWUgYXMgb2xkIHRhZ3MhCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAdrZXlUYWdzAAAAAgUAAAAGYXJ0aXN0BQAAAAVhcnRJZAUAAAAEdGFncwUAAAADbmlsCQAAAgAAAAECAAAAAm5vAAAAAWkBAAAAC2RlbGV0ZUVudHJ5AAAAAQAAAAVlbnRyeQQAAAAGY2FsbGVyCQAEJQAAAAEJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACBQAAAAZvd25lcnMFAAAABmNhbGxlcgkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABBQAAAAVlbnRyeQUAAAADbmlsCQAAAgAAAAECAAAAAm5vAAAAAWkBAAAABnNldEJpZAAAAAIAAAAFYXJ0SWQAAAAGaXNzdWVyBAAAAAthdWN0aW9uVHlwZQkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAADmtleUF1Y3Rpb25UeXBlAAAAAgUAAAAGaXNzdWVyBQAAAAVhcnRJZAMJAAAAAAAAAgUAAAALYXVjdGlvblR5cGUFAAAADGF1Y3Rpb25UeXBlMQkBAAAAFHNldEJpZE5vblRyYWRpdGlvbmFsAAAAAwUAAAABaQUAAAAFYXJ0SWQFAAAABmlzc3VlcgMJAAAAAAAAAgUAAAALYXVjdGlvblR5cGUFAAAADGF1Y3Rpb25UeXBlMgkBAAAAEXNldEJpZFRyYWRpdGlvbmFsAAAAAwUAAAABaQUAAAAFYXJ0SWQFAAAABmlzc3VlcgkAAAIAAAABCQABLAAAAAIJAAEsAAAAAgIAAAAWVW5rbm93biBhdWN0aW9uIHR5cGUgOgUAAAALYXVjdGlvblR5cGUCAAAAGywgcGxlYXNlIGNvbnRhY3QgdGhlIGFkbWlucwAAAAFpAQAAAAlhY2NlcHRCaWQAAAAEAAAABWFydElkAAAABmlzc3VlcgAAAAViaWRJZAAAAAhiaWRPd25lcgQAAAALYXVjdGlvblR5cGUJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAA5rZXlBdWN0aW9uVHlwZQAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQDCQAAAAAAAAIFAAAAC2F1Y3Rpb25UeXBlBQAAAAxhdWN0aW9uVHlwZTEJAQAAABdhY2NlcHRCaWROb25UcmFkaXRpb25hbAAAAAUFAAAAAWkFAAAABWFydElkBQAAAAZpc3N1ZXIFAAAABWJpZElkBQAAAAhiaWRPd25lcgMJAAAAAAAAAgUAAAALYXVjdGlvblR5cGUFAAAADGF1Y3Rpb25UeXBlMgkBAAAAFGFjY2VwdEJpZFRyYWRpdGlvbmFsAAAABQUAAAABaQUAAAAFYXJ0SWQFAAAABmlzc3VlcgUAAAAFYmlkSWQFAAAACGJpZE93bmVyCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAABZVbmtub3duIGF1Y3Rpb24gdHlwZSA6BQAAAAthdWN0aW9uVHlwZQIAAAAbLCBwbGVhc2UgY29udGFjdCB0aGUgYWRtaW5zAAAAAWkBAAAACWNhbmNlbEJpZAAAAAMAAAAFYXJ0SWQAAAAGaXNzdWVyAAAABWJpZElkBAAAAAthdWN0aW9uVHlwZQkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAADmtleUF1Y3Rpb25UeXBlAAAAAgUAAAAGaXNzdWVyBQAAAAVhcnRJZAMJAAAAAAAAAgUAAAALYXVjdGlvblR5cGUFAAAADGF1Y3Rpb25UeXBlMQkBAAAADWNhbmNlbEJpZEltcGwAAAAEBQAAAAFpBQAAAAVhcnRJZAUAAAAGaXNzdWVyBQAAAAViaWRJZAkBAAAAGGNhbmNlbEJpZEltcGxUcmFkaXRpb25hbAAAAAQFAAAAAWkFAAAABWFydElkBQAAAAZpc3N1ZXIFAAAABWJpZElkAAAAAIM0fE8=", "height": 1783649, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 4d5f7c2sSBSbq9LAwRoqoZzYHQCZBBFcLADPcMwQs813 Next: DTqcGow4be637qkBA1YszrJ8YQx5VxVq2eA9tQ4A9kJN Diff:
OldNewDifferences
1717
1818 let owners = [getString(oracleFee, "owner1"), getString(oracleFee, "owner2")]
1919
20+let types = ["IMAGE", "PDF", "VIDEO"]
21+
22+let Previewtypes = ["PDF"]
23+
2024 let USDNFirstSellCut = 150
21-
22-let USDNSecondSellCut = 30
23-
24-let originalCreatorCut = 70
2525
2626 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
2727
3838 let auctionType1 = "BIDTYPE"
3939
4040 let auctionType2 = "TRADITIONAL"
41+
42+let auctionType3 = "DIRECT"
4143
4244 func getStringByKeyFromUsers (key) = valueOrElse(getString(userDapp, key), "")
4345
7880 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
7981
8082
81-func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
83+func keyPreviewCid (caller,artId) = ((("art_preview_cid_" + artId) + "_") + caller)
8284
8385
84-func keyMinPrice (caller,artId) = ((("art_minprice_" + artId) + "_") + caller)
86+func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
8587
8688
8789 func keyHighestBidBidId (artId) = ("art_highestBidBidId_" + artId)
103105
104106
105107 func KeyNftIssuer (nftId) = ("nft_issued_" + nftId)
108+
109+
110+func KeyNftArtId (nftId) = ("nft_artId_" + nftId)
111+
112+
113+func keyRoyalty (caller,artId) = ((("art_royalty_" + artId) + "_") + caller)
106114
107115
108116 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
441449 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + idNFT)
442450 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + idNFT)
443451 let soldData = StringEntry(soldKey, soldValue)
444- let buyRes = [IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + idNFT), soldKey), StringEntry(("nft_rarity_" + idNFT), rarity), IntegerEntry("total_nft_issued", (totalNFT + 1)), BooleanEntry(keyOnSale(issuer, artId), sellStatus), ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSconex, assetId), StringEntry(KeyNftIssuer(idNFT), issuer)]
452+ let buyRes = [IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + idNFT), soldKey), StringEntry(("nft_rarity_" + idNFT), rarity), IntegerEntry("total_nft_issued", (totalNFT + 1)), BooleanEntry(keyOnSale(issuer, artId), sellStatus), ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSconex, assetId), StringEntry(KeyNftIssuer(idNFT), issuer), StringEntry(KeyNftArtId(idNFT), artId)]
445453 let res = invoke(addressFromStringValue(certDapp), "createCert", [toString(receiveNFT), idNFT, issuer], nil)
446454 if ((res == res))
447455 then if (isBid)
465473 then throw("Only USDN is accepted!")
466474 else toBase58String(value(payment.assetId))
467475 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
476+ let minArtworkPrice = valueOrElse(getIntegerByKey(keyPrice(issuer, artId)), (currentCertificationPrice * 2))
468477 if (!(acceptedAssetIds(assetId)))
469478 then throw("asset not accepted")
470- else if (!(validateMinSell(assetId, amount)))
471- then throw("Wrong min sell")
479+ else if ((minArtworkPrice > amount))
480+ then throw("Bid is below min price!")
472481 else {
473482 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
474483 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
501510 then throw("Only USDN is accepted!")
502511 else toBase58String(value(payment.assetId))
503512 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
513+ let minArtworkPrice = valueOrElse(getIntegerByKey(keyPrice(issuer, artId)), (currentCertificationPrice * 2))
504514 if (!(acceptedAssetIds(assetId)))
505515 then throw("asset not accepted")
506- else if (!(validateMinSell(assetId, amount)))
507- then throw("Wrong min sell")
516+ else if ((minArtworkPrice > amount))
517+ then throw("Bid is below min price!")
508518 else {
509519 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
510520 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
603613
604614
605615 @Callable(i)
606-func addArtwork (sha256Hash,name,description,tags,type,cidDisplay,entitlement) = {
616+func addArtwork (sha256Hash,name,description,tags,type,cidDisplay,entitlement,preview) = {
607617 let t01774017781 = idCallerDate(i)
608618 let artId = t01774017781._1
609619 let caller = t01774017781._2
610620 let date = t01774017781._3
611- let validateArtwork = validateArtworkData(caller, cidDisplay, name, description, tags)
612- if ((validateArtwork != ""))
613- then throw("Something went wrong!")
614- else {
615- let t01817018212 = validatePayment(i)
616- let amount = t01817018212._1
617- let assetId = t01817018212._2
618- if (!(isDefined(amount)))
619- then throw("Something went wrong")
621+ if (containsElement(types, type))
622+ then {
623+ let validateArtwork = validateArtworkData(caller, cidDisplay, name, description, tags)
624+ if ((validateArtwork != ""))
625+ then throw("Something went wrong!")
620626 else {
621- let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
622- if ((entryExist != ""))
623- then throw("You already added it")
627+ let t01817018212 = validatePayment(i)
628+ let amount = t01817018212._1
629+ let assetId = t01817018212._2
630+ if (!(isDefined(amount)))
631+ then throw("Something went wrong")
624632 else {
625- let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
626- if ((hashExist != ""))
627- then throw("This hash is already registered")
628- 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(keyType(caller, artId), type), StringEntry(keyTags(caller, artId), tags), IntegerEntry(keyMaxMint(caller, artId), 0), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyHashByTxidAddr(caller, artId), sha256Hash), StringEntry(keyEntitlement(caller, artId), entitlement), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, assetId)]
633+ let previewData = if (containsElement(Previewtypes, type))
634+ then [StringEntry(keyPreviewCid(caller, artId), preview)]
635+ else nil
636+ let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
637+ if ((entryExist != ""))
638+ then throw("You already added it")
639+ else {
640+ let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
641+ if ((hashExist != ""))
642+ then throw("This hash is already registered")
643+ else (previewData ++ [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(keyType(caller, artId), type), StringEntry(keyTags(caller, artId), tags), IntegerEntry(keyMaxMint(caller, artId), 0), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyHashByTxidAddr(caller, artId), sha256Hash), StringEntry(keyEntitlement(caller, artId), entitlement), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, assetId)])
644+ }
629645 }
630646 }
631647 }
648+ else throw("Unknown type")
632649 }
633650
634651
635652
636653 @Callable(i)
637-func sellArtwork (artId,price,maxMint,assetId,auctionType,minBid,duration) = {
654+func sellArtwork (artId,price,maxMint,assetId,auctionType,duration,royalty) = {
638655 let t02571425747 = idCallerDate(i)
639656 let id = t02571425747._1
640657 let caller = t02571425747._2
641658 let artworkName = getStringByKey(keyName(caller, artId))
642- if (!(containsElement([auctionType1, auctionType2], auctionType)))
643- then throw("We don't know this auction type")
644- else if ((artworkName == ""))
645- then throw("This art doesn't match your account")
646- else {
647- let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
648- if (!(acceptedAssetIds(assetId)))
649- then throw("Something went wrong!")
650- else if (!(validateMinSell(assetId, price)))
651- then throw("Something went wrong!")
652- else {
653- let checkUser = validateUser(caller)
654- if ((checkUser != ""))
655- then throw(checkUser)
659+ if ((0 > royalty))
660+ then throw("Royalty percentage should be above 0")
661+ else if ((royalty > 85))
662+ then throw("Royalty percentage should be below 85")
663+ else if (!(containsElement([auctionType1, auctionType2, auctionType3], auctionType)))
664+ then throw("We don't know this auction type")
665+ else if ((artworkName == ""))
666+ then throw("This art doesn't match your account")
667+ else {
668+ let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
669+ if (!(acceptedAssetIds(assetId)))
670+ then throw("Something went wrong!")
671+ else if (!(validateMinSell(assetId, price)))
672+ then throw("Something went wrong!")
656673 else {
657- let amountSold = getIntegerByKey(keyIssued(caller, artId))
658- let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
659- if ((maxMint > 101))
660- then throw("101 editions max per artwork")
661- else if (if ((amountSold != 0))
662- then (amountSold == maxCanSell)
663- else false)
664- then throw("Max edition reached.")
665- else if (if ((amountSold > 0))
666- then (maxCanSell != maxMint)
667- else false)
668- then throw("Cannot change maximum issuable anymore")
669- else if (if ((bidNbr > 0))
670- then (maxCanSell != maxMint)
674+ let checkUser = validateUser(caller)
675+ if ((checkUser != ""))
676+ then throw(checkUser)
677+ else {
678+ let amountSold = getIntegerByKey(keyIssued(caller, artId))
679+ let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
680+ if ((maxMint > 10000))
681+ then throw("10000 editions max per artwork")
682+ else if (if ((amountSold != 0))
683+ then (amountSold == maxCanSell)
671684 else false)
672- then throw("Cannot change maximum issuable with active orders")
673- else {
674- let sellStatus = if (if ((price > 0))
675- then (maxMint > 0)
685+ then throw("Max edition reached.")
686+ else if (if ((amountSold > 0))
687+ then (maxCanSell != maxMint)
688+ else false)
689+ then throw("Cannot change maximum issuable anymore")
690+ else if (if ((bidNbr > 0))
691+ then (maxCanSell != maxMint)
676692 else false)
677- then true
678- else false
679- let endHeight = (duration + height)
680-[BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), IntegerEntry(keyMinPrice(caller, artId), minBid), IntegerEntry(keyDuration(caller, artId), duration), IntegerEntry(keyEndHeight(caller, artId), endHeight), StringEntry(keyAssetIdAccepted(caller, artId), assetId), StringEntry(keyAuctionType(caller, artId), auctionType)]
681- }
693+ then throw("Cannot change maximum issuable with active orders")
694+ else {
695+ let sellStatus = if (if ((price > 0))
696+ then (maxMint > 0)
697+ else false)
698+ then true
699+ else false
700+ let endHeight = (duration + height)
701+[BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), IntegerEntry(keyDuration(caller, artId), duration), IntegerEntry(keyEndHeight(caller, artId), endHeight), StringEntry(keyAssetIdAccepted(caller, artId), assetId), StringEntry(keyAuctionType(caller, artId), auctionType), IntegerEntry(keyRoyalty(caller, artId), royalty)]
702+ }
703+ }
682704 }
683- }
684- }
705+ }
685706 }
686707
687708
688709
689710 @Callable(i)
690-func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", false)
711+func buyArtwork (artId,issuer) = {
712+ let auctionType = getStringByKey(keyAuctionType(issuer, artId))
713+ if ((auctionType == auctionType3))
714+ then buyMint(i, artId, issuer, "", "", false)
715+ else throw("Direct buy only allowed when no auction type is set!")
716+ }
717+
718+
719+
720+@Callable(i)
721+func updateTags (artist,artId,tags) = {
722+ let caller = toString(addressFromPublicKey(i.callerPublicKey))
723+ if (containsElement(owners, caller))
724+ then if ((size(split(tags, ",")) > 5))
725+ then throw("5 tags max.")
726+ else {
727+ let tagsOld = getStringByKeyOrError(keyTags(artist, artId), "No tags created with this key, so can't update!")
728+ if ((tags == tagsOld))
729+ then throw("Tags are the same as old tags!")
730+ else [StringEntry(keyTags(artist, artId), tags)]
731+ }
732+ else throw("no")
733+ }
691734
692735
693736
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let unitTest = false
55
66 let oracleFee = value(addressFromString("3MpZQjzGogmifcEKe8mDd6ribL7nxT9ACye"))
77
88 let feeReceiver = "3N65xLq8JcCeaEiR1TJQ7dBqXBvEy6E48Wz"
99
1010 let certDapp = "3MxcXrNbMZKYaSrhcfeMm2hZnBeCu3yRWsw"
1111
1212 let userDapp = value(addressFromString("3N9cQgZFPHHVu8wqsn2DkQFehg3h8CNiooA"))
1313
1414 let whitelistDapp = value(addressFromString("3N9xZYGpzMFDXvXuctmU6zV8qSzm2ZfF31f"))
1515
1616 let USDNAssetId = base58'132maRL3uF35tc2bpRih9D6MYq5DR6H28zkop786dKyu'
1717
1818 let owners = [getString(oracleFee, "owner1"), getString(oracleFee, "owner2")]
1919
20+let types = ["IMAGE", "PDF", "VIDEO"]
21+
22+let Previewtypes = ["PDF"]
23+
2024 let USDNFirstSellCut = 150
21-
22-let USDNSecondSellCut = 30
23-
24-let originalCreatorCut = 70
2525
2626 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
2727
2828 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
2929
3030 let userSuspended = "SUSPENDED"
3131
3232 let userRemoved = "REMOVED"
3333
3434 let userUnregistered = "UNREGISTERED"
3535
3636 let userAllowed = "ALLOWED"
3737
3838 let auctionType1 = "BIDTYPE"
3939
4040 let auctionType2 = "TRADITIONAL"
41+
42+let auctionType3 = "DIRECT"
4143
4244 func getStringByKeyFromUsers (key) = valueOrElse(getString(userDapp, key), "")
4345
4446
4547 func getStringByKey (key) = valueOrElse(getString(this, key), "")
4648
4749
4850 func getStringByKeyOrError (key,error) = valueOrErrorMessage(getString(this, key), error)
4951
5052
5153 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
5254
5355
5456 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
5557
5658
5759 func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
5860
5961
6062 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
6163
6264
6365 func validateHash (hash) = (size(hash) == 64)
6466
6567
6668 func keyUserStatus (caller) = ("user_status_" + caller)
6769
6870
6971 func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
7072
7173
7274 func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
7375
7476
7577 func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
7678
7779
7880 func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
7981
8082
81-func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
83+func keyPreviewCid (caller,artId) = ((("art_preview_cid_" + artId) + "_") + caller)
8284
8385
84-func keyMinPrice (caller,artId) = ((("art_minprice_" + artId) + "_") + caller)
86+func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
8587
8688
8789 func keyHighestBidBidId (artId) = ("art_highestBidBidId_" + artId)
8890
8991
9092 func keyBidId (bidId) = ("bid_" + bidId)
9193
9294
9395 func keyDuration (caller,artId) = ((("art_duration_" + artId) + "_") + caller)
9496
9597
9698 func keyEndHeight (caller,artId) = ((("art_endheight_" + artId) + "_") + caller)
9799
98100
99101 func keyAuctionType (caller,artId) = ((("art_auctiontype_" + artId) + "_") + caller)
100102
101103
102104 func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
103105
104106
105107 func KeyNftIssuer (nftId) = ("nft_issued_" + nftId)
108+
109+
110+func KeyNftArtId (nftId) = ("nft_artId_" + nftId)
111+
112+
113+func keyRoyalty (caller,artId) = ((("art_royalty_" + artId) + "_") + caller)
106114
107115
108116 func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
109117
110118
111119 func keyEntitlement (caller,artId) = ((("art_entitlement_" + artId) + "_") + caller)
112120
113121
114122 func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
115123
116124
117125 func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
118126
119127
120128 func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
121129
122130
123131 func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
124132
125133
126134 func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
127135
128136
129137 func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
130138
131139
132140 func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
133141
134142
135143 let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(USDNAssetId)))
136144
137145 func getAmountByBidId (bidId) = valueOrElse(getIntegerByKey(keyBidId(bidId)), 0)
138146
139147
140148 func getAmountHighestBidByArtId (artId) = {
141149 let bidId = getStringByKey(keyHighestBidBidId(artId))
142150 if ((bidId == ""))
143151 then 0
144152 else getAmountByBidId(bidId)
145153 }
146154
147155
148156 func validateString (str,max) = if ((size(str) == 0))
149157 then throw("Field cannot be is empty")
150158 else if ((size(str) > max))
151159 then throw((str + " is too long"))
152160 else true
153161
154162
155163 func validateUser (caller) = {
156164 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
157165 if (if ((userStatus == userUnregistered))
158166 then true
159167 else (userStatus == userAllowed))
160168 then "Register this account first with 'Account' tab"
161169 else if ((userStatus == userSuspended))
162170 then "Account suspended"
163171 else if ((userStatus == userRemoved))
164172 then "Account removed"
165173 else ""
166174 }
167175
168176
169177 func validateArtworkData (caller,cidDisplay,name,description,tags) = {
170178 let checkUser = validateUser(caller)
171179 if ((checkUser != ""))
172180 then throw(checkUser)
173181 else if ((size(cidDisplay) == 0))
174182 then throw("Display CID cannot be empty")
175183 else if ((size(cidDisplay) != 46))
176184 then throw("This doesn't seem a valid CID!")
177185 else if (!(validateString(name, 100)))
178186 then throw("100 Char. max name")
179187 else if (!(validateString(description, 1000)))
180188 then throw("1000 Char. max description")
181189 else if ((size(split(tags, ",")) > 5))
182190 then throw("5 tags max.")
183191 else ""
184192 }
185193
186194
187195 func isPayment (i) = if ((size(i.payments) == 0))
188196 then throw("No payment attached")
189197 else {
190198 let payment = value(i.payments[0])
191199 let amount = value(payment.amount)
192200 $Tuple2(payment, amount)
193201 }
194202
195203
196204 func validatePayment (i) = {
197205 let t089829018 = isPayment(i)
198206 let payment = t089829018._1
199207 let amount = t089829018._2
200208 let assetId = if (if (isDefined(payment.assetId))
201209 then (payment.assetId == USDNAssetId)
202210 else false)
203211 then payment.assetId
204212 else throw("Only USDN token accepted as transaction fee")
205213 if ((amount != currentCertificationPrice))
206214 then throw(((("Payment amount should be " + toString(currentCertificationPrice)) + " but is: ") + toString(amount)))
207215 else $Tuple2(amount, assetId)
208216 }
209217
210218
211219 func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
212220 case b: Int =>
213221 if ((b != 0))
214222 then true
215223 else false
216224 case _ =>
217225 false
218226 }
219227
220228
221229 func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
222230 let t096119647 = isPayment(i)
223231 let payment = t096119647._1
224232 let amount = t096119647._2
225233 let assetId = if (!(isDefined(payment.assetId)))
226234 then throw("Wrong asset id")
227235 else if (if ((size(priceAssetId) > 0))
228236 then (toBase58String(value(payment.assetId)) == priceAssetId)
229237 else false)
230238 then payment.assetId
231239 else throw("Wrong asset id")
232240 if (if ((assetId == unit))
233241 then (priceAssetId != "")
234242 else false)
235243 then throw("Wrong asset id")
236244 else if ((artworkPrice != amount))
237245 then throw(((("Payment don't match " + toString(artworkPrice)) + " ") + toString(amount)))
238246 else $Tuple2(amount, assetId)
239247 }
240248
241249
242250 func acceptedAssetIds (assetId) = if ((assetId != toBase58String(USDNAssetId)))
243251 then throw("Only USDN accepted")
244252 else true
245253
246254
247255 func validateMinSell (assetId,price) = {
248256 let minSellSconex = if (unitTest)
249257 then 1
250258 else (currentCertificationPrice * 2)
251259 if (if (if ((assetId == toBase58String(USDNAssetId)))
252260 then (minSellSconex > price)
253261 else false)
254262 then (price != 0)
255263 else false)
256264 then throw(("Wrong minimum sell price " + toString(minSellSconex)))
257265 else true
258266 }
259267
260268
261269 func getBidAssetId (assetId) = if ((assetId == "WAVES"))
262270 then throw("Only USDN is accepted!")
263271 else fromBase58String(assetId)
264272
265273
266274 func getPriceAssetIdFromBid (bidDataKey) = {
267275 let bidData = getStringByKey((bidDataKey + "_OPEN"))
268276 if ((bidData == ""))
269277 then throw("Bid not found")
270278 else {
271279 let bidDataArr = split(bidData, "_")
272280 let bidAmount = parseIntValue(bidDataArr[1])
273281 let bidAssetId = getBidAssetId(bidDataArr[0])
274282 if ((0 >= bidAmount))
275283 then throw("Wrong amount")
276284 else $Tuple2(bidAmount, bidAssetId)
277285 }
278286 }
279287
280288
281289 func idCallerDate (i) = if (!(dappRunning))
282290 then throw(maintenanceMSG)
283291 else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
284292
285293
286294 func isBidCheck (i,issuer,bidOwner,bidId) = if (if (if ((toBase58String(i.caller.bytes) == issuer))
287295 then (bidOwner != "")
288296 else false)
289297 then (bidId != "")
290298 else false)
291299 then true
292300 else false
293301
294302
295303 func getArtData (i,issuer,artId,isBid) = {
296304 let callerIsIssuer = (toBase58String(i.caller.bytes) == issuer)
297305 let totalNFT = getIntegerByKey("total_nft_issued")
298306 let artworkName = getStringByKey(keyName(issuer, artId))
299307 if ((artworkName == ""))
300308 then throw("Art doesn't exist")
301309 else {
302310 let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
303311 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
304312 let artworkPrice = valueOrElse(getIntegerByKey(keyPrice(issuer, artId)), (currentCertificationPrice * 2))
305313 let priceAssetId = if (callerIsIssuer)
306314 then toBase58String(USDNAssetId)
307315 else getStringByKey(keyAssetIdAccepted(issuer, artId))
308316 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
309317 if (if (if (!(isBid))
310318 then !(callerIsIssuer)
311319 else false)
312320 then if (if ((0 >= artworkPrice))
313321 then true
314322 else !(isOnSale))
315323 then true
316324 else (0 >= maxCanSell)
317325 else false)
318326 then throw("Art not for sale")
319327 else if (if (if (!(isBid))
320328 then callerIsIssuer
321329 else false)
322330 then (0 >= maxCanSell)
323331 else false)
324332 then throw("Max issuable not set")
325333 else $Tuple7(totalNFT, artworkName, amountSold, artworkPrice, priceAssetId, maxCanSell, isOnSale)
326334 }
327335 }
328336
329337
330338 func getBidData (i,caller,issuer,artId,bidOwner,bidId,priceAssetId,artworkPrice,isBid) = {
331339 let checkUser = validateUser(issuer)
332340 if (if (isBid)
333341 then (checkUser != "")
334342 else false)
335343 then throw(checkUser)
336344 else {
337345 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
338346 let t01351913648 = if (isBid)
339347 then getPriceAssetIdFromBid(bidDataKey)
340348 else validatePriceAssetId(i, priceAssetId, artworkPrice)
341349 let amount = t01351913648._1
342350 let assetId = t01351913648._2
343351 $Tuple3(bidDataKey, amount, assetId)
344352 }
345353 }
346354
347355
348356 func getCommissionData (issuer,assetId,amount,amountSold,maxCanSell) = {
349357 let isWhitelisted = checkWhitelist(issuer)
350358 let cut = if ((isWhitelisted > height))
351359 then 0
352360 else if ((assetId == USDNAssetId))
353361 then USDNFirstSellCut
354362 else throw("Only USDN is accepted!")
355363 let amountForSconex = fraction(amount, cut, 1000)
356364 let amountForCreator = (amount - amountForSconex)
357365 if ((amountSold == maxCanSell))
358366 then throw("Art sold out")
359367 else {
360368 let newAmountSold = (amountSold + 1)
361369 $Tuple3(amountForSconex, amountForCreator, newAmountSold)
362370 }
363371 }
364372
365373
366374 func getIssueData (issuer,artId,artworkName,newAmountSold,maxCanSell,totalNFT,caller,bidOwner,bidId,i,isOnSale) = {
367375 let issueMeta = ((((((((("Creator: " + issuer) + ",ArtID: ") + artId) + ",Artwork name: ") + artworkName) + ",Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
368376 let sellStatus = if (if ((newAmountSold == maxCanSell))
369377 then true
370378 else !(isOnSale))
371379 then false
372380 else true
373381 let receiveNFT = if ((bidOwner != ""))
374382 then addressFromStringValue(bidOwner)
375383 else i.caller
376384 $Tuple3(sellStatus, receiveNFT, issueMeta)
377385 }
378386
379387
380388 func calculateRarity (mintIndex) = if ((4 > mintIndex))
381389 then "SSR"
382390 else if ((11 > mintIndex))
383391 then "SR"
384392 else if ((101 > mintIndex))
385393 then "R"
386394 else "N"
387395
388396
389397 func getBidKeyVal (assetId,bidDataKey,date) = {
390398 let assetIdBid = if (!(isDefined(assetId)))
391399 then throw("Only USDN is accepted")
392400 else toBase58String(value(assetId))
393401 let bidData = getStringByKey((bidDataKey + "_OPEN"))
394402 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
395403 let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
396404 $Tuple3(assetIdBid, bidDelOld, bidUpdate)
397405 }
398406
399407
400408 func buyMint (i,artId,issuer,bidId,bidOwner,isBid) = {
401409 let callerData = idCallerDate(i)
402410 let id = callerData._1
403411 let caller = callerData._2
404412 let date = callerData._3
405413 let artData = getArtData(i, issuer, artId, isBid)
406414 let totalNFT = artData._1
407415 let artworkName = artData._2
408416 let amountSold = artData._3
409417 let artworkPrice = artData._4
410418 let priceAssetId = artData._5
411419 let maxCanSell = artData._6
412420 let isOnSale = artData._7
413421 let bidData = getBidData(i, caller, issuer, artId, bidOwner, bidId, priceAssetId, artworkPrice, isBid)
414422 let bidDataKey = bidData._1
415423 let amount = bidData._2
416424 let assetId = bidData._3
417425 let commisionData = getCommissionData(issuer, value(assetId), amount, amountSold, maxCanSell)
418426 let amountForSconex = commisionData._1
419427 let amountForCreator = commisionData._2
420428 let newAmountSold = commisionData._3
421429 let issuerData = getIssueData(issuer, artId, artworkName, newAmountSold, maxCanSell, totalNFT, caller, bidOwner, bidId, i, isOnSale)
422430 let sellStatus = issuerData._1
423431 let receiveNFT = issuerData._2
424432 let issueMeta = issuerData._3
425433 let idNFTInvoke = invoke(this, "mintNft", [totalNFT, issueMeta, toString(receiveNFT)], nil)
426434 if ((idNFTInvoke == idNFTInvoke))
427435 then {
428436 let idNFT = match idNFTInvoke {
429437 case r: String =>
430438 r
431439 case _ =>
432440 throw("Incorrect invoke result")
433441 }
434442 let bidKeyValue = getBidKeyVal(assetId, bidDataKey, date)
435443 let assetIdBid = bidKeyValue._1
436444 let bidDelOld = bidKeyValue._2
437445 let bidUpdate = bidKeyValue._3
438446 let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
439447 let rarity = calculateRarity(newAmountSold)
440448 let soldValue = if (!(isBid))
441449 then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + idNFT)
442450 else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + idNFT)
443451 let soldData = StringEntry(soldKey, soldValue)
444- let buyRes = [IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + idNFT), soldKey), StringEntry(("nft_rarity_" + idNFT), rarity), IntegerEntry("total_nft_issued", (totalNFT + 1)), BooleanEntry(keyOnSale(issuer, artId), sellStatus), ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSconex, assetId), StringEntry(KeyNftIssuer(idNFT), issuer)]
452+ let buyRes = [IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + idNFT), soldKey), StringEntry(("nft_rarity_" + idNFT), rarity), IntegerEntry("total_nft_issued", (totalNFT + 1)), BooleanEntry(keyOnSale(issuer, artId), sellStatus), ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSconex, assetId), StringEntry(KeyNftIssuer(idNFT), issuer), StringEntry(KeyNftArtId(idNFT), artId)]
445453 let res = invoke(addressFromStringValue(certDapp), "createCert", [toString(receiveNFT), idNFT, issuer], nil)
446454 if ((res == res))
447455 then if (isBid)
448456 then (((buyRes :+ soldData) :+ bidUpdate) :+ bidDelOld)
449457 else soldData :: buyRes
450458 else throw("Strict value is not equal to itself.")
451459 }
452460 else throw("Strict value is not equal to itself.")
453461 }
454462
455463
456464 func setBidNonTraditional (i,artId,issuer) = {
457465 let t02770927747 = idCallerDate(i)
458466 let id = t02770927747._1
459467 let caller = t02770927747._2
460468 let date = t02770927747._3
461469 let t02775227788 = isPayment(i)
462470 let payment = t02775227788._1
463471 let amount = t02775227788._2
464472 let assetId = if (!(isDefined(payment.assetId)))
465473 then throw("Only USDN is accepted!")
466474 else toBase58String(value(payment.assetId))
467475 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
476+ let minArtworkPrice = valueOrElse(getIntegerByKey(keyPrice(issuer, artId)), (currentCertificationPrice * 2))
468477 if (!(acceptedAssetIds(assetId)))
469478 then throw("asset not accepted")
470- else if (!(validateMinSell(assetId, amount)))
471- then throw("Wrong min sell")
479+ else if ((minArtworkPrice > amount))
480+ then throw("Bid is below min price!")
472481 else {
473482 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
474483 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
475484 if ((0 >= maxCanSell))
476485 then throw("No max edition set for this artwork")
477486 else if ((amountSold >= maxCanSell))
478487 then throw("Sold out, you cannot bid")
479488 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1))]
480489 }
481490 }
482491
483492
484493 func setBidTraditional (i,artId,issuer) = {
485494 let endHeight = getIntegerByKey(keyEndHeight(issuer, artId))
486495 let highestBid = getAmountHighestBidByArtId(artId)
487496 if ((height > endHeight))
488497 then throw("This auction is finished already!")
489498 else {
490499 let callderData = idCallerDate(i)
491500 let id = callderData._1
492501 let caller = callderData._2
493502 let date = callderData._3
494503 let isPaymentVar = isPayment(i)
495504 let payment = isPaymentVar._1
496505 let amount = isPaymentVar._2
497506 if ((highestBid >= amount))
498507 then throw(("Please place a bid higher than: " + toString(highestBid)))
499508 else {
500509 let assetId = if (!(isDefined(payment.assetId)))
501510 then throw("Only USDN is accepted!")
502511 else toBase58String(value(payment.assetId))
503512 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
513+ let minArtworkPrice = valueOrElse(getIntegerByKey(keyPrice(issuer, artId)), (currentCertificationPrice * 2))
504514 if (!(acceptedAssetIds(assetId)))
505515 then throw("asset not accepted")
506- else if (!(validateMinSell(assetId, amount)))
507- then throw("Wrong min sell")
516+ else if ((minArtworkPrice > amount))
517+ then throw("Bid is below min price!")
508518 else {
509519 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
510520 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
511521 if ((0 >= maxCanSell))
512522 then throw("No max edition set for this artwork")
513523 else if ((amountSold >= maxCanSell))
514524 then throw("Sold out, you cannot bid")
515525 else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr + 1)), StringEntry(keyHighestBidBidId(artId), toBase58String(i.transactionId)), IntegerEntry(keyBidId(toBase58String(i.transactionId)), amount)]
516526 }
517527 }
518528 }
519529 }
520530
521531
522532 func acceptBidNonTraditional (i,artId,issuer,bidId,bidOwner) = {
523533 let caller = toBase58String(i.caller.bytes)
524534 if ((caller != issuer))
525535 then throw("You cannot do this action")
526536 else buyMint(i, artId, issuer, bidId, bidOwner, true)
527537 }
528538
529539
530540 func restartAuction (artId,issuer) = {
531541 let amountSold = getIntegerByKey(keyIssued(issuer, artId))
532542 let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
533543 let oldEndHeight = getIntegerByKey(keyEndHeight(issuer, artId))
534544 let duration = getIntegerByKey(keyDuration(issuer, artId))
535545 let endHeight = (duration + height)
536546 if ((height > oldEndHeight))
537547 then if ((amountSold == maxCanSell))
538548 then throw("Can't restart auction, max amount sold")
539549 else [IntegerEntry(keyEndHeight(issuer, artId), endHeight), DeleteEntry(keyHighestBidBidId(artId))]
540550 else throw("Previous auction isn't completed yet")
541551 }
542552
543553
544554 func acceptBidTraditional (i,artId,issuer,bidId,bidOwner) = {
545555 let endHeight = getIntegerByKey(keyEndHeight(issuer, artId))
546556 let highestBidId = getStringByKey(keyHighestBidBidId(artId))
547557 if ((height > endHeight))
548558 then if ((bidId == highestBidId))
549559 then {
550560 let buyMintData = buyMint(i, artId, issuer, bidId, bidOwner, true)
551561 let restartAuctionData = restartAuction(artId, issuer)
552562 (restartAuctionData ++ buyMintData)
553563 }
554564 else throw("This is not the winning bid!")
555565 else throw("This auction is not yet finished!")
556566 }
557567
558568
559569 func cancelBidImpl (i,artId,issuer,bidId) = {
560570 let t02894229094 = idCallerDate(i)
561571 let id = t02894229094._1
562572 let caller = t02894229094._2
563573 let date = t02894229094._3
564574 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
565575 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + bidId)
566576 let bidData = getStringByKeyOrError((bidDataKey + "_OPEN"), "Bid not found")
567577 let bidDataArr = split(bidData, "_")
568578 let assetId = getBidAssetId(bidDataArr[0])
569579 let bidStatus = "CANCELED"
570580 [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(caller)), parseIntValue(bidDataArr[1]), assetId)]
571581 }
572582
573583
574584 func cancelBidImplTraditional (i,artId,issuer,bidId) = {
575585 let t02894229094 = idCallerDate(i)
576586 let id = t02894229094._1
577587 let caller = t02894229094._2
578588 let date = t02894229094._3
579589 let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
580590 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + bidId)
581591 let bidData = getStringByKeyOrError((bidDataKey + "_OPEN"), "Bid not found")
582592 let bidDataArr = split(bidData, "_")
583593 let assetId = getBidAssetId(bidDataArr[0])
584594 let bidStatus = "CANCELED"
585595 let bidAmount = parseIntValue(bidDataArr[1])
586596 let highestBidId = getStringByKey(keyHighestBidBidId(artId))
587597 if ((bidId == highestBidId))
588598 then throw("You can't cancel the highest bid!")
589599 else [DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), IntegerEntry(("current_bidamount_" + artId), (bidNbr - 1)), ScriptTransfer(Address(fromBase58String(caller)), bidAmount, assetId)]
590600 }
591601
592602
593603 @Callable(i)
594604 func mintNft (totalNFT,issueMeta,receiveNFT) = if ((i.caller == this))
595605 then {
596606 let receiveNFTAddy = Address(fromBase58String(receiveNFT))
597607 let issueNFT = Issue(("SCONEX_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
598608 let idNFT = calculateAssetId(issueNFT)
599609 $Tuple2([issueNFT, ScriptTransfer(receiveNFTAddy, 1, idNFT)], toBase58String(idNFT))
600610 }
601611 else throw("Only the dApp can mint NFT's")
602612
603613
604614
605615 @Callable(i)
606-func addArtwork (sha256Hash,name,description,tags,type,cidDisplay,entitlement) = {
616+func addArtwork (sha256Hash,name,description,tags,type,cidDisplay,entitlement,preview) = {
607617 let t01774017781 = idCallerDate(i)
608618 let artId = t01774017781._1
609619 let caller = t01774017781._2
610620 let date = t01774017781._3
611- let validateArtwork = validateArtworkData(caller, cidDisplay, name, description, tags)
612- if ((validateArtwork != ""))
613- then throw("Something went wrong!")
614- else {
615- let t01817018212 = validatePayment(i)
616- let amount = t01817018212._1
617- let assetId = t01817018212._2
618- if (!(isDefined(amount)))
619- then throw("Something went wrong")
621+ if (containsElement(types, type))
622+ then {
623+ let validateArtwork = validateArtworkData(caller, cidDisplay, name, description, tags)
624+ if ((validateArtwork != ""))
625+ then throw("Something went wrong!")
620626 else {
621- let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
622- if ((entryExist != ""))
623- then throw("You already added it")
627+ let t01817018212 = validatePayment(i)
628+ let amount = t01817018212._1
629+ let assetId = t01817018212._2
630+ if (!(isDefined(amount)))
631+ then throw("Something went wrong")
624632 else {
625- let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
626- if ((hashExist != ""))
627- then throw("This hash is already registered")
628- 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(keyType(caller, artId), type), StringEntry(keyTags(caller, artId), tags), IntegerEntry(keyMaxMint(caller, artId), 0), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyHashByTxidAddr(caller, artId), sha256Hash), StringEntry(keyEntitlement(caller, artId), entitlement), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, assetId)]
633+ let previewData = if (containsElement(Previewtypes, type))
634+ then [StringEntry(keyPreviewCid(caller, artId), preview)]
635+ else nil
636+ let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
637+ if ((entryExist != ""))
638+ then throw("You already added it")
639+ else {
640+ let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
641+ if ((hashExist != ""))
642+ then throw("This hash is already registered")
643+ else (previewData ++ [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(keyType(caller, artId), type), StringEntry(keyTags(caller, artId), tags), IntegerEntry(keyMaxMint(caller, artId), 0), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyHashByTxidAddr(caller, artId), sha256Hash), StringEntry(keyEntitlement(caller, artId), entitlement), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, assetId)])
644+ }
629645 }
630646 }
631647 }
648+ else throw("Unknown type")
632649 }
633650
634651
635652
636653 @Callable(i)
637-func sellArtwork (artId,price,maxMint,assetId,auctionType,minBid,duration) = {
654+func sellArtwork (artId,price,maxMint,assetId,auctionType,duration,royalty) = {
638655 let t02571425747 = idCallerDate(i)
639656 let id = t02571425747._1
640657 let caller = t02571425747._2
641658 let artworkName = getStringByKey(keyName(caller, artId))
642- if (!(containsElement([auctionType1, auctionType2], auctionType)))
643- then throw("We don't know this auction type")
644- else if ((artworkName == ""))
645- then throw("This art doesn't match your account")
646- else {
647- let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
648- if (!(acceptedAssetIds(assetId)))
649- then throw("Something went wrong!")
650- else if (!(validateMinSell(assetId, price)))
651- then throw("Something went wrong!")
652- else {
653- let checkUser = validateUser(caller)
654- if ((checkUser != ""))
655- then throw(checkUser)
659+ if ((0 > royalty))
660+ then throw("Royalty percentage should be above 0")
661+ else if ((royalty > 85))
662+ then throw("Royalty percentage should be below 85")
663+ else if (!(containsElement([auctionType1, auctionType2, auctionType3], auctionType)))
664+ then throw("We don't know this auction type")
665+ else if ((artworkName == ""))
666+ then throw("This art doesn't match your account")
667+ else {
668+ let bidNbr = getIntegerByKey(("current_bidamount_" + artId))
669+ if (!(acceptedAssetIds(assetId)))
670+ then throw("Something went wrong!")
671+ else if (!(validateMinSell(assetId, price)))
672+ then throw("Something went wrong!")
656673 else {
657- let amountSold = getIntegerByKey(keyIssued(caller, artId))
658- let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
659- if ((maxMint > 101))
660- then throw("101 editions max per artwork")
661- else if (if ((amountSold != 0))
662- then (amountSold == maxCanSell)
663- else false)
664- then throw("Max edition reached.")
665- else if (if ((amountSold > 0))
666- then (maxCanSell != maxMint)
667- else false)
668- then throw("Cannot change maximum issuable anymore")
669- else if (if ((bidNbr > 0))
670- then (maxCanSell != maxMint)
674+ let checkUser = validateUser(caller)
675+ if ((checkUser != ""))
676+ then throw(checkUser)
677+ else {
678+ let amountSold = getIntegerByKey(keyIssued(caller, artId))
679+ let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
680+ if ((maxMint > 10000))
681+ then throw("10000 editions max per artwork")
682+ else if (if ((amountSold != 0))
683+ then (amountSold == maxCanSell)
671684 else false)
672- then throw("Cannot change maximum issuable with active orders")
673- else {
674- let sellStatus = if (if ((price > 0))
675- then (maxMint > 0)
685+ then throw("Max edition reached.")
686+ else if (if ((amountSold > 0))
687+ then (maxCanSell != maxMint)
688+ else false)
689+ then throw("Cannot change maximum issuable anymore")
690+ else if (if ((bidNbr > 0))
691+ then (maxCanSell != maxMint)
676692 else false)
677- then true
678- else false
679- let endHeight = (duration + height)
680-[BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), IntegerEntry(keyMinPrice(caller, artId), minBid), IntegerEntry(keyDuration(caller, artId), duration), IntegerEntry(keyEndHeight(caller, artId), endHeight), StringEntry(keyAssetIdAccepted(caller, artId), assetId), StringEntry(keyAuctionType(caller, artId), auctionType)]
681- }
693+ then throw("Cannot change maximum issuable with active orders")
694+ else {
695+ let sellStatus = if (if ((price > 0))
696+ then (maxMint > 0)
697+ else false)
698+ then true
699+ else false
700+ let endHeight = (duration + height)
701+[BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), IntegerEntry(keyDuration(caller, artId), duration), IntegerEntry(keyEndHeight(caller, artId), endHeight), StringEntry(keyAssetIdAccepted(caller, artId), assetId), StringEntry(keyAuctionType(caller, artId), auctionType), IntegerEntry(keyRoyalty(caller, artId), royalty)]
702+ }
703+ }
682704 }
683- }
684- }
705+ }
685706 }
686707
687708
688709
689710 @Callable(i)
690-func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "", false)
711+func buyArtwork (artId,issuer) = {
712+ let auctionType = getStringByKey(keyAuctionType(issuer, artId))
713+ if ((auctionType == auctionType3))
714+ then buyMint(i, artId, issuer, "", "", false)
715+ else throw("Direct buy only allowed when no auction type is set!")
716+ }
717+
718+
719+
720+@Callable(i)
721+func updateTags (artist,artId,tags) = {
722+ let caller = toString(addressFromPublicKey(i.callerPublicKey))
723+ if (containsElement(owners, caller))
724+ then if ((size(split(tags, ",")) > 5))
725+ then throw("5 tags max.")
726+ else {
727+ let tagsOld = getStringByKeyOrError(keyTags(artist, artId), "No tags created with this key, so can't update!")
728+ if ((tags == tagsOld))
729+ then throw("Tags are the same as old tags!")
730+ else [StringEntry(keyTags(artist, artId), tags)]
731+ }
732+ else throw("no")
733+ }
691734
692735
693736
694737 @Callable(i)
695738 func deleteEntry (entry) = {
696739 let caller = toString(addressFromPublicKey(i.callerPublicKey))
697740 if (containsElement(owners, caller))
698741 then [DeleteEntry(entry)]
699742 else throw("no")
700743 }
701744
702745
703746
704747 @Callable(i)
705748 func setBid (artId,issuer) = {
706749 let auctionType = getStringByKey(keyAuctionType(issuer, artId))
707750 if ((auctionType == auctionType1))
708751 then setBidNonTraditional(i, artId, issuer)
709752 else if ((auctionType == auctionType2))
710753 then setBidTraditional(i, artId, issuer)
711754 else throw((("Unknown auction type :" + auctionType) + ", please contact the admins"))
712755 }
713756
714757
715758
716759 @Callable(i)
717760 func acceptBid (artId,issuer,bidId,bidOwner) = {
718761 let auctionType = getStringByKey(keyAuctionType(issuer, artId))
719762 if ((auctionType == auctionType1))
720763 then acceptBidNonTraditional(i, artId, issuer, bidId, bidOwner)
721764 else if ((auctionType == auctionType2))
722765 then acceptBidTraditional(i, artId, issuer, bidId, bidOwner)
723766 else throw((("Unknown auction type :" + auctionType) + ", please contact the admins"))
724767 }
725768
726769
727770
728771 @Callable(i)
729772 func cancelBid (artId,issuer,bidId) = {
730773 let auctionType = getStringByKey(keyAuctionType(issuer, artId))
731774 if ((auctionType == auctionType1))
732775 then cancelBidImpl(i, artId, issuer, bidId)
733776 else cancelBidImplTraditional(i, artId, issuer, bidId)
734777 }
735778
736779

github/deemru/w8io/026f985 
90.93 ms