tx · 4cub36p8u6dk9caYio1rkYt4GeACg3XYj274U8JuxvYV

3PDBLdsUrcsiPxNbt8g2gQVoefKgzt3kJzV:  -0.01400000 Waves

2021.02.22 12:05 [2472954] smart account 3PDBLdsUrcsiPxNbt8g2gQVoefKgzt3kJzV > SELF 0.00000000 Waves

{ "type": 13, "id": "4cub36p8u6dk9caYio1rkYt4GeACg3XYj274U8JuxvYV", "fee": 1400000, "feeAssetId": null, "timestamp": 1613984726989, "version": 2, "chainId": 87, "sender": "3PDBLdsUrcsiPxNbt8g2gQVoefKgzt3kJzV", "senderPublicKey": "FJN1qxUehh3hhFX9NAXWBFbSKT2sTzc2pjTJ1JxjQdBh", "proofs": [ "4mkdquiYUJLWjLijsf6aPX2bpNzkRuDMLjjaAYLvBvVTox5g2Dhd7u2so5Lkinsb9L67y3CBr3QxrKwLcwYkuM3R" ], "script": "base64:AAIEAAAAAAAAAFYIAhIOCgwICAgICAgBCAgICAgSDQoLCAgICAgBCAgICAgSBQoDCAgIEgQKAggIEgYKBAgBAQgSBAoCCAgSBAoCCAgSBgoECAgICBIFCgMICAgSAwoBCAAAAEoAAAAACHVuaXRUZXN0BwAAAAAJb3JhY2xlRmVlCQEAAAAFdmFsdWUAAAABCQAEJgAAAAECAAAAIzNQQWpyVHFZTGdGRzI0a1J3aXlVMzRub3VtejRwejJrWFBLAAAAAAhzaWduRGFwcAkBAAAABXZhbHVlAAAAAQkABCYAAAABAgAAACMzUDlmTk43d1Q2dTJCcEtKM3QyRWRRaTJwWTlvcFVFNmV0dAAAAAALZmVlUmVjZWl2ZXICAAAAIzNQRmFjc3Z1VTlzbjJac3RhTENXS1duNDh5VDF2ZkFSUlJVAAAAAAh1c2VyRGFwcAkBAAAABXZhbHVlAAAAAQkABCYAAAABAgAAACMzUEdTV0RnYWQ0UnRjZVFZWEJwcTJ4NzNtWExSSllMUnFSUAAAAAANd2hpdGVsaXN0RGFwcAkBAAAABXZhbHVlAAAAAQkABCYAAAABAgAAACMzUFJGVFBtNGhiVWh4aGpRZEU4Y0dhWEdBZnpHTHE0dmE4SAAAAAALc2lnbkFzc2V0SWQBAAAAIIPHkq+4VK8OAjXLmW+XWyWkxkt+QINXbtevPAOr6hEdAAAAAAt1c2RuQXNzZXRJZAEAAAAgtiYpwwT1zlORpA5LdSQvZIxRsfrfr1QpvUjSHSqyqtEAAAAADHdhdmVzQXNzZXRJZAEAAAAAAAAAAAVjaHJpcwIAAAAjM1A0SnV0QktXNnBBRG05MUZ4TWZHTDNFWXhLSnRXWXNXZlgAAAAABGpvZXACAAAAIzNQTEtYUEppZ1pKNGFWcXBNR3g1YWp5UFltQTRaY3J5OVRiAAAAAAdzaWduQ3V0AAAAAAAAAAAHAAAAAAt1c2RuV2F2ZUN1dAAAAAAAAAAACgAAAAAOZGVmYXVsdExpY2VuY2UCAAAAR2JhZnliZWlmdXlvNHBxdTU0aXNtcWd0YjZlNGg2a2t2Z3g3emc0dTN6aWJoMnI3eTZtYjY0aTdienphL2xpY2VuY2UucGRmAAAAABJkZWZhdWx0SGFzaExpY2VuY2UCAAAAQGE4Nzc1OGMzNTRlMzBhOWU3OGZiODRmYTNhMDAxMGE1MDkwYWIyMGRmMGJlMTFhZDQ1YjU3MjBjYzE4N2U2MzkAAAAAC2RhcHBSdW5uaW5nCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGwAAAAIFAAAACHVzZXJEYXBwAgAAABRjb25mX2RhcHBfaXNfcnVubmluZwYAAAAADm1haW50ZW5hbmNlTVNHCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAACHVzZXJEYXBwAgAAABRjb25mX21haW50ZW5hbmNlX21zZwIAAAAAAAAAAA11c2VyU3VzcGVuZGVkAgAAAAlTVVNQRU5ERUQAAAAAC3VzZXJSZW1vdmVkAgAAAAdSRU1PVkVEAAAAABB1c2VyVW5yZWdpc3RlcmVkAgAAAAxVTlJFR0lTVEVSRUQAAAAAC3VzZXJBbGxvd2VkAgAAAAdBTExPV0VEAQAAABdnZXRTdHJpbmdCeUtleUZyb21Vc2VycwAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAACHVzZXJEYXBwBQAAAANrZXkCAAAAAAEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAANrZXkCAAAAAAEAAAAZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQAAAAEAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAJb3JhY2xlRmVlBQAAAANrZXkCAAAAH0ludGVnZXIgdW5kZWZpbmUgb3IgMCBpbiBvcmFjbGUBAAAAD2dldEludGVnZXJCeUtleQAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQAAAAAAAAAAAAEAAAAOY2hlY2tXaGl0ZWxpc3QAAAABAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAA13aGl0ZWxpc3REYXBwBQAAAANrZXkAAAAAAAAAAAABAAAAD2dldEJvb2xlYW5CeUtleQAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGwAAAAIFAAAABHRo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AAAAAQkAASwAAAACBQAAAANzdHICAAAADCBpcyB0b28gbG9uZwYBAAAADHZhbGlkYXRlVXNlcgAAAAEAAAAGY2FsbGVyBAAAAAp1c2VyU3RhdHVzCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAACHVzZXJEYXBwCQEAAAANa2V5VXNlclN0YXR1cwAAAAEFAAAABmNhbGxlcgUAAAAQdXNlclVucmVnaXN0ZXJlZAMDCQAAAAAAAAIFAAAACnVzZXJTdGF0dXMFAAAAEHVzZXJVbnJlZ2lzdGVyZWQGCQAAAAAAAAIFAAAACnVzZXJTdGF0dXMFAAAAC3VzZXJBbGxvd2VkAgAAAC5SZWdpc3RlciB0aGlzIGFjY291bnQgZmlyc3Qgd2l0aCAiQWNjb3VudCIgdGFiAwkAAAAAAAACBQAAAAp1c2VyU3RhdHVzBQAAAA11c2VyU3VzcGVuZGVkAgAAABFBY2NvdW50IHN1c3BlbmRlZAMJAAAAAAAAAgUAAAAKdXNlclN0YXR1cwUAAAALdXNlclJlbW92ZWQCAAAAD0FjY291bnQgcmVtb3ZlZAIAAAAAAQAAAApzZXRMSWNlbmNlAAAAAgAAAApjaWRMaWNlbmNlAAAADXNoYTI1NkxpY2VuY2UEAAAAA2NpZAMJAAAAAAAAAgkAATEAAAABBQAAAApjaWRMaWNlbmNlAAAAAAAAAAAABQAAAA5kZWZhdWx0TGljZW5jZQUAAAAKY2lkTGljZW5jZQQAAAAEaGFzaAMJAAAAAAAAAgkAATEAAAABBQAAAA1zaGEyNTZMaWNlbmNlAAAAAAAAAAAABQAAABJkZWZhdWx0SGFzaExpY2VuY2UFAAAADXNoYTI1NkxpY2VuY2UJAAUUAAAAAgUAAAADY2lkBQAAAARoYXNoAQAAABN2YWxpZGF0ZUFydHdvcmtEYXRhAAAACgAAAAZjYWxsZXIAAAAKY2lkRGlzcGxheQAAAAljaWRFeHBvcnQAAAAKbGljZW5jZUNJRAAAAAxzaGEyNTZFeHBvcnQAAAALbGljZW5jZUhhc2gAAAAEbmFtZQAAAAtkZXNjcmlwdGlvbgAAAAR0YWdzAAAAB21heG1pbnQEAAAACWNoZWNrVXNlcgkBAAAADHZhbGlkYXRlVXNlcgAAAAEFAAAABmNhbGxlcgMJAQAAAAIhPQAAAAIFAAAACWNoZWNrVXNlcgIAAAAACQAAAgAAAAEFAAAACWNoZWNrVXNlcgMJAAAAAAAAAgkAATEAAAABBQAAAApjaWREaXNwbGF5AAAAAAAAAAAACQAAAgAAAAECAAAAG0Rpc3BsYXkgQ0lEIGNhbm5vdCBiZSBlbXB0eQMJAQAAAAEhAAAAAQkBAAAADnZhbGlkYXRlQWxsQ0lEAAAAAwUAAAAKY2lkRGlzcGxheQUAAAAJY2lkRXhwb3J0BQAAAApsaWNlbmNlQ0lECQAAAgAAAAECAAAAEFByb2JsZW0gd2l0aCBDSUQDCQEAAAABIQAAAAEJAQAAAA92YWxpZGF0ZUFsbEhhc2gAAAACBQAAAAxzaGEyNTZFeHBvcnQFAAAAC2xpY2VuY2VIYXNoCQAAAgAAAAECAAAAE1Byb2JsZW0gd2l0aCBIYXNoZXMDCQEAAAABIQAAAAEJAQAAAA52YWxpZGF0ZVN0cmluZwAAAAIFAAAABG5hbWUAAAAAAAAAAGQJAAACAAAAAQIAAAASMTAwIENoYXIuIG1heCBuYW1lAwkBAAAAASEAAAABCQEAAAAOdmFsaWRhdGVTdHJpbmcAAAACBQAAAAtkZXNjcmlwdGlvbgAAAAAAAAAD6AkAAAIAAAABAgAAABoxMDAwIENoYXIuIG1heCBkZXNjcmlwdGlvbgMJAABmAAAAAgkAAZAAAAABCQAEtQAAAAIFAAAABHRhZ3MCAAAAASwAAAAAAAAAAAUJAAACAAAAAQIAAAALNSB0YWdzIG1heC4DCQAAZgAAAAIFAAAAB21heG1pbnQAAAAAAAAAAAoJAAACAAAAAQIAAAAbMTAgZWRpdGlvbnMgbWF4IHBlciBhcnR3b3JrAgAAAAABAAAACWlzUGF5bWVudAAAAAEAAAABaQMJAAAAAAAAAgkAAZAAAAABCAUAAAABaQAAAAhwYXltZW50cwAAAAAAAAAAAAkAAAIAAAABAgAAABNObyBwYXltZW50IGF0dGFjaGVkBAAAAAdwYXltZW50CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAAZhbW91bnQJAQAAAAV2YWx1ZQAAAAEIBQAAAAdwYXltZW50AAAABmFtb3VudAkABRQAAAACBQAAAAdwYXltZW50BQAAAAZhbW91bnQBAAAAD3ZhbGlkYXRlUGF5bWVudAAAAAEAAAABaQQAAAALJHQwODkwOTg5NDUJAQAAAAlpc1BheW1lbnQAAAABBQAAAAFpBAAAAAdwYXltZW50CAUAAAALJHQwODkwOTg5NDUAAAACXzEEAAAABmFtb3VudAgFAAAACyR0MDg5MDk4OTQ1AAAAAl8yBAAAAAdhc3NldElkAwMJAQAAAAlpc0RlZmluZWQAAAABCAUAAAAHcGF5bWVudAAAAAdhc3NldElkCQAAAAAAAAIIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQFAAAAC3NpZ25Bc3NldElkBwgFAAAAB3BheW1lbnQAAAAHYXNzZXRJZAkAAAIAAAABAgAAACtPbmx5IFNJR04gdG9rZW4gYWNjZXB0ZWQgYXMgdHJhbnNhY3Rpb24gZmVlBAAAABljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlCQEAAAAZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQAAAAEJAAEsAAAAAgIAAAASY2VydGlmaWNhdGlvbl9mZWVfCQACWAAAAAEFAAAAC3NpZ25Bc3NldElkAwkBAAAAAiE9AAAAAgUAAAAGYW1vdW50BQAAABljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlCQAAAgAAAAEJAAEsAAAAAgIAAAAZUGF5bWVudCBhbW91bnQgc2hvdWxkIGJlIAkAAaQAAAABBQAAABljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlCQAFFAAAAAIFAAAABmFtb3VudAUAAAAHYXNzZXRJZAEAAAALaXNBcnRNaW50ZWQAAAACAAAACWFkZHJUb1VzZQAAAAVhcnRJZAQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAR0aGlzCQEAAAAJa2V5SXNzdWVkAAAAAgUAAAAJYWRkclRvVXNlBQAAAAVhcnRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFiBQAAAAckbWF0Y2gwAwkBAAAAAiE9AAAAAgUAAAABYgAAAAAAAAAAAAYHBwEAAAAUdmFsaWRhdGVQcmljZUFzc2V0SWQAAAADAAAAAWkAAAAMcHJpY2VBc3NldElkAAAADGFydHdvcmtQcmljZQQAAAALJHQwOTY0NTk2ODEJAQAAAAlpc1BheW1lbnQAAAABBQAAAAFpBAAAAAdwYXltZW50CAUAAAALJHQwOTY0NTk2ODEAAAACXzEEAAAABmFtb3VudAgFAAAACyR0MDk2NDU5NjgxAAAAAl8yBAAAAAdhc3NldElkAwkBAAAAASEAAAABCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAAB3BheW1lbnQAAAAHYXNzZXRJZAUAAAAEdW5pdAMDCQAAZgAAAAIJAAExAAAAAQUAAAAMcHJpY2VBc3NldElkAAAAAAAAAAAACQAAAAAAAAIJAAJYAAAAAQkBAAAABXZhbHVlAAAAAQgFAAAAB3BheW1lbnQAAAAHYXNzZXRJZAUAAAAMcHJpY2VBc3NldElkBwgFAAAAB3BheW1lbnQAAAAHYXNzZXRJZAkAAAIAAAABAgAAAA5Xcm9uZyBhc3NldCBpZAMDCQAAAAAAAAIFAAAAB2Fzc2V0SWQFAAAABHVuaXQJAQAAAAIhPQAAAAIFAAAADHByaWNlQXNzZXRJZAIAAAAABwkAAAIAAAABAgAAAA5Xcm9uZyBhc3NldCBpZAMJAQAAAAIhPQAAAAIFAAAADGFydHdvcmtQcmljZQUAAAAGYW1vdW50CQAAAgAAAAECAAAAE1BheW1lbnQgZG9uJ3QgbWF0Y2gJAAUUAAAAAgUAAAAGYW1vdW50BQAAAAdhc3NldElkAQAAABBhY2NlcHRlZEFzc2V0SWRzAAAAAQAAAAdhc3NldElkAwMDAwkBAAAAAiE9AAAAAgUAAAAHYXNzZXRJZAkAAlgAAAABBQAAAAtzaWduQXNzZXRJZAkBAAAAAiE9AAAAAgUAAAAHYXNzZXRJZAkAAlgAAAABBQAAAAx3YXZlc0Fzc2V0SWQHCQEAAAACIT0AAAACBQAAAAdhc3NldElkAgAAAAVXQVZFUwcJAQAAAAIhPQAAAAIFAAAAB2Fzc2V0SWQJAAJYAAAAAQUAAAALdXNkbkFzc2V0SWQHCQAAAgAAAAECAAAAIU9ubHkgU0lHTiwgVVNETiBvciBXQVZFUyBhY2NlcHRlZAYBAAAAD3ZhbGlkYXRlTWluU2VsbAAAAAIAAAAHYXNzZXRJZAAAAAVwcmljZQQAAAAMbWluU2VsbFdhdmVzAwUAAAAIdW5pdFRlc3QAAAAAAAAAAAoJAQAAABlnZXRJbnRlZ2VyQnlLZXlGcm9tT3JhY2xlAAAAAQIAAAAOd2F2ZXNfbWluX3NlbGwEAAAAC21pblNlbGxVc2RuAAAAAAAAD0JABAAAAAttaW5TZWxsU2lnbgMFAAAACHVuaXRUZXN0AAAAAAAAAAABCQAAaAAAAAIJAQAAABlnZXRJbnRlZ2VyQnlLZXlGcm9tT3JhY2xlAAAAAQkAASwAAAACAgAAABJjZXJ0aWZpY2F0aW9uX2ZlZV8JAAJYAAAAAQUAAAALc2lnbkFzc2V0SWQAAAAAAAAAAAIDAwMDAwkAAAAAAAACBQAAAAdhc3NldElkCQACWAAAAAEFAAAAC3VzZG5Bc3NldElkCQAAZgAAAAIFAAAAC21pblNlbGxVc2RuBQAAAAVwcmljZQcJAQAAAAIhPQAAAAIFAAAABXByaWNlAAAAAAAAAAAABwYDAwkAAAAAAAACBQAAAAdhc3NldElkCQACWAAAAAEFAAAAC3NpZ25Bc3NldElkCQAAZgAAAAIFAAAAC21pblNlbGxTaWduBQAAAAVwcmljZQcJAQAAAAIhPQAAAAIFAAAABXByaWNlAAAAAAAAAAAABwYDAwMJAAAAAAAAAgUAAAAHYXNzZXRJZAkAAlgAAAABBQAAAAx3YXZlc0Fzc2V0SWQGCQAAAAAAAAIFAAAAB2Fzc2V0SWQCAAAABVdBVkVTCQAAZgAAAAIFAAAADG1pblNlbGxXYXZlcwUAAAAFcHJpY2UHCQEAAAACIT0AAAACBQAAAAVwcmljZQAAAAAAAAAAAAcJAAACAAAAAQIAAAAYV3JvbmcgbWluaW11bSBzZWxsIHByaWNlBgEAAAANZ2V0QmlkQXNzZXRJZAAAAAEAAAAHYXNzZXRJZAMJAAAAAAAAAgUAAAAHYXNzZXRJZAIAAAAFV0FWRVMFAAAABHVuaXQJAAJZAAAAAQUAAAAHYXNzZXRJZAEAAAAWZ2V0UHJpY2VBc3NldElkRnJvbUJpZAAAAAEAAAAKYmlkRGF0YUtleQQAAAAHYmlkRGF0YQkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkAASwAAAACBQAAAApiaWREYXRhS2V5AgAAAAVfT1BFTgMJAAAAAAAAAgUAAAAHYmlkRGF0YQIAAAAACQAAAgAAAAECAAAADUJpZCBub3QgZm91bmQEAAAACmJpZERhdGFBcnIJAAS1AAAAAgUAAAAHYmlkRGF0YQIAAAABXwQAAAAJYmlkQW1vdW50CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAKYmlkRGF0YUFycgAAAAAAAAAAAQQAAAAKYmlkQXNzZXRJZAkBAAAADWdldEJpZEFzc2V0SWQAAAABCQABkQAAAAIFAAAACmJpZERhdGFBcnIAAAAAAAAAAAADCQAAZwAAAAIAAAAAAAAAAAAFAAAACWJpZEFtb3VudAkAAAIAAAABAgAAAAxXcm9uZyBhbW91bnQJAAUUAAAAAgUAAAAJYmlkQW1vdW50BQAAAApiaWRBc3NldElkAQAAAAxpZENhbGxlckRhdGUAAAABAAAAAWkDCQEAAAABIQAAAAEFAAAAC2RhcHBSdW5uaW5nCQAAAgAAAAEFAAAADm1haW50ZW5hbmNlTVNHCQAFFQAAAAMJAAJYAAAAAQgFAAAAAWkAAAANdHJhbnNhY3Rpb25JZAkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzCAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAEAAAAKaXNCaWRDaGVjawAAAAQAAAABaQAAAAZpc3N1ZXIAAAAIYmlkT3duZXIAAAAFYmlkSWQDAwMJAAAAAAAAAgkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBQAAAAZpc3N1ZXIJAQAAAAIhPQAAAAIFAAAACGJpZE93bmVyAgAAAAAHCQEAAAACIT0AAAACBQAAAAViaWRJZAIAAAAABwYHAQAAAApnZXRBcnREYXRhAAAAAwAAAAZpc3N1ZXIAAAAFYXJ0SWQAAAAFaXNCaWQEAAAACHRvdGFsTkZUCQEAAAAPZ2V0SW50ZWdlckJ5S2V5AAAAAQIAAAAQdG90YWxfbmZ0X2lzc3VlZAQAAAAGc2lnbklECQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAJa2V5U2lnbklEAAAAAgUAAAAGaXNzdWVyBQAAAAVhcnRJZAQAAAALYXJ0d29ya05hbWUJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAAdrZXlOYW1lAAAAAgUAAAAGaXNzdWVyBQAAAAVhcnRJZAMJAAAAAAAAAgUAAAALYXJ0d29ya05hbWUCAAAAAAkAAAIAAAABAgAAABFBcnQgZG9lc24ndCBleGlzdAQAAAAIaXNPblNhbGUJAQAAAA9nZXRCb29sZWFuQnlLZXkAAAABCQEAAAAJa2V5T25TYWxlAAAAAgUAAAAGaXNzdWVyBQAAAAVhcnRJZAQAAAAKYW1vdW50U29sZAkBAAAAD2dldEludGVnZXJCeUtleQAAAAEJAQAAAAlrZXlJc3N1ZWQAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAAxhcnR3b3JrUHJpY2UJAQAAAA9nZXRJbnRlZ2VyQnlLZXkAAAABCQEAAAAIa2V5UHJpY2UAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAAxwcmljZUFzc2V0SWQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABJrZXlBc3NldElkQWNjZXB0ZWQAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAAptYXhDYW5TZWxsCQEAAAAPZ2V0SW50ZWdlckJ5S2V5AAAAAQkBAAAACmtleU1heE1pbnQAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkAwMDAwkBAAAAASEAAAABBQAAAAVpc0JpZAkAAGcAAAACAAAAAAAAAAAABQAAAAxhcnR3b3JrUHJpY2UHBgkBAAAAASEAAAABBQAAAAhpc09uU2FsZQYJAABnAAAAAgAAAAAAAAAAAAUAAAAKbWF4Q2FuU2VsbAkAAAIAAAABAgAAABBBcnQgbm90IGZvciBzYWxlAwMFAAAABWlzQmlkCQAAZwAAAAIAAAAAAAAAAAAFAAAACm1heENhblNlbGwHCQAAAgAAAAECAAAAFkFydCBub3Qgb3BlbiBmb3IgT2ZmZXIJAAUZAAAABwUAAAAIdG90YWxORlQFAAAABnNpZ25JRAUAAAALYXJ0d29ya05hbWUFAAAACmFtb3VudFNvbGQFAAAADGFydHdvcmtQcmljZQUAAAAMcHJpY2VBc3NldElkBQAAAAptYXhDYW5TZWxsAQAAAApnZXRCaWREYXRhAAAACQAAAAFpAAAABmNhbGxlcgAAAAZpc3N1ZXIAAAAFYXJ0SWQAAAAIYmlkT3duZXIAAAAFYmlkSWQAAAAMcHJpY2VBc3NldElkAAAADGFydHdvcmtQcmlj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DSR0MDE1NDY1MTU2MDMJAQAAAApnZXRBcnREYXRhAAAAAwUAAAAGaXNzdWVyBQAAAAVhcnRJZAUAAAAFaXNCaWQEAAAACHRvdGFsTkZUCAUAAAANJHQwMTU0NjUxNTYwMwAAAAJfMQQAAAAGc2lnbklECAUAAAANJHQwMTU0NjUxNTYwMwAAAAJfMgQAAAALYXJ0d29ya05hbWUIBQAAAA0kdDAxNTQ2NTE1NjAzAAAAAl8zBAAAAAphbW91bnRTb2xkCAUAAAANJHQwMTU0NjUxNTYwMwAAAAJfNAQAAAAMYXJ0d29ya1ByaWNlCAUAAAANJHQwMTU0NjUxNTYwMwAAAAJfNQQAAAAMcHJpY2VBc3NldElkCAUAAAANJHQwMTU0NjUxNTYwMwAAAAJfNgQAAAAKbWF4Q2FuU2VsbAgFAAAADSR0MDE1NDY1MTU2MDMAAAACXzcEAAAADSR0MDE1NjA4MTU3NTQJAQAAAApnZXRCaWREYXRhAAAACQUAAAABaQUAAAAGY2FsbGVyBQAAAAZpc3N1ZXIFAAAABWFydElkBQAAAAhiaWRPd25lcgUAAAAFYmlkSWQFAAAADHByaWNlQXNzZXRJZAUAAAAMYXJ0d29ya1ByaWNlBQAAAAVpc0JpZAQAAAAKYmlkRGF0YUtleQgFAAAADSR0MDE1NjA4MTU3NTQAAAACXzEEAAAABmFtb3VudAgFAAAADSR0MDE1NjA4MTU3NTQAAAACXzIEAAAAB2Fzc2V0SWQIBQAAAA0kdDAxNTYwODE1NzU0AAAAAl8zBAAAAA0kdDAxNTc1OTE1OTA2CQEAAAARZ2V0Q29tbWlzc2lvbkRhdGEAAAAFBQAAAAZpc3N1ZXIFAAAADHByaWNlQXNzZXRJZAUAAAAGYW1vdW50BQAAAAphbW91bnRTb2xkBQAAAAptYXhDYW5TZWxsBAAAAA1hbW91bnRGb3JTaWduCAUAAAANJHQwMTU3NTkxNTkwNgAAAAJfMQQAAAAQYW1vdW50Rm9yQ3JlYXRvcggFAAAADSR0MDE1NzU5MTU5MDYAAAACXzIEAAAADW5ld0Ftb3VudFNvbGQIBQAAAA0kdDAxNTc1OTE1OTA2AAAAAl8zBAAAAA0kdDAxNTkxMTE2MDkxCQEAAAAMZ2V0SXNzdWVEYXRhAAAACwUAAAAGaXNzdWVyBQAA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ZAkABEwAAAACBQAAAAhzb2xkRGF0YQkABEwAAAACBQAAAAliaWRVcGRhdGUJAARMAAAAAgUAAAAJYmlkRGVsT2xkBQAAAAZidXlSZXMJAARMAAAAAgUAAAAIc29sZERhdGEFAAAABmJ1eVJlcwAAAAoAAAABaQEAAAAKYWRkQXJ0d29yawAAAAwAAAAKc2hhMjU2SGFzaAAAAAZzaWduSUQAAAAEbmFtZQAAAAtkZXNjcmlwdGlvbgAAAAR0YWdzAAAABHR5cGUAAAAHbWF4bWludAAAAApjaWREaXNwbGF5AAAADHNoYTI1NkV4cG9ydAAAAAljaWRFeHBvcnQAAAANc2hhMjU2TGljZW5jZQAAAApjaWRMaWNlbmNlBAAAAA0kdDAxNzU1NTE3NTk2CQEAAAAMaWRDYWxsZXJEYXRlAAAAAQUAAAABaQQAAAAFYXJ0SWQIBQAAAA0kdDAxNzU1NTE3NTk2AAAAAl8xBAAAAAZjYWxsZXIIBQAAAA0kdDAxNzU1NTE3NTk2AAAAAl8yBAAAAARkYXRlCAUAAAANJHQwMTc1NTUxNzU5NgAAAAJfMwMJAQAAAAEhAAAAAQkBAAAADHZhbGlkYXRlSGFzaAAAAAEFAAAACnNoYTI1Nkhhc2gJAAACAAAAAQIAAAAkSGFzaCBzaG91bGQgYmUgNjQgY2hhcmFjdGVycyBtYXhpbXVtBAAAAA0kdDAxNzY5NzE3NzY2CQEAAAAKc2V0TEljZW5jZQAAAAIFAAAACmNpZExpY2VuY2UFAAAADXNoYTI1NkxpY2VuY2UEAAAACmxpY2VuY2VDSUQIBQAAAA0kdDAxNzY5NzE3NzY2AAAAAl8xBAAAAAtsaWNlbmNlSGFzaAgFAAAADSR0MDE3Njk3MTc3NjYAAAACXzIEAAAAD3ZhbGlkYXRlQXJ0d29yawkBAAAAE3ZhbGlkYXRlQXJ0d29ya0RhdGEAAAAKBQAAAAZjYWxsZXIFAAAACmNpZERpc3BsYXkFAAAACWNpZEV4cG9ydAUAAAAKbGljZW5jZUNJRAUAAAAMc2hhMjU2RXhwb3J0BQAAAAtsaWNlbmNlSGFzaAUAAAAEbmFtZQUAAAALZGVzY3JpcHRpb24FAAAABHRhZ3MFAAAAB21heG1pbnQDCQEAAAACIT0AAAACBQAAAA92YWxpZGF0ZUFydHdvcmsCAAAAAAkAAAIAAAABAgAAABVTb21ldGhpbmcgd2VudCB3cm9uZyEEAAAADSR0MDE3OTk0MTgwMzYJAQAAAA92YWxpZGF0ZVBheW1lbnQAAAABBQAAAAFpBAAAAAZhbW91bnQIBQAAAA0kdDAxNzk5NDE4MDM2AAAAAl8xBAAAAAdhc3NldElkCAUAAAANJHQwMTc5OTQxODAzNgAAAAJfMgMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEFAAAABmFtb3VudAkAAAIAAAABAgAAABRTb21ldGhpbmcgd2VudCB3cm9uZwQAAAAKZW50cnlFeGlzdAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAEmtleVR4aWRCeUhhc2hPd25lcgAAAAIFAAAACnNoYTI1Nkhhc2gFAAAABmNhbGxlcgMJAQAAAAIhPQAAAAIFAAAACmVudHJ5RXhpc3QCAAAAAAkAAAIAAAABAgAAABRZb3UgYWxyZWFkeSBhZGRlZCBpdAQAAAAJaGFzaEV4aXN0CQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAOa2V5T3duZXJCeUhhc2gAAAABBQAAAApzaGEyNTZIYXNoAwkBAAAAAiE9AAAAAgUAAAAJaGFzaEV4aXN0AgAAAAAJAAACAAAAAQIAAAAXSGFzaCBhbHJlYWR5IHJlZ2lzdGVyZWQEAAAAD2lzU2lnbkNlcnRpZmllZAkBAAAAFGNoZWNrU2lnbkNlcnRpZmljYXRlAAAAAwUAAAAGc2lnbklEBQAAAAZjYWxsZXIFAAAACnNoYTI1Nkhhc2gDCQEAAAABIQAAAAEFAAAAD2lzU2lnbkNlcnRpZmllZAkAAAIAAAABAgAAACxTaWduIENlcnRpZmljYXRlIG5vdCBmb3VuZCBmb3IgdGhpcyBhZGRyZXNzLgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAOa2V5T3duZXJCeUhhc2gAAAABBQAAAApzaGEyNTZIYXNoBQAAAAZjYWxsZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEmtleVR4aWRCeUhhc2hPd25lcgAAAAIFAAAACnNoYTI1Nkhhc2gFAAAABmNhbGxlcgUAAAAFYXJ0SWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAdrZXlEYXRlAAAAAgUAAAAGY2FsbGVyBQAAAAVhcnRJZAUAAAAEZGF0ZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAHa2V5TmFtZQAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAABG5hbWUJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAB2tleURlc2MAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAtkZXNjcmlwdGlvbgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAANa2V5RGlzcGxheUNpZAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAACmNpZERpc3BsYXkJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAADGtleUV4cG9ydENpZAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAACWNpZEV4cG9ydAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAANa2V5RXhwb3J0SGFzaAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAADHNoYTI1NkV4cG9ydAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAOa2V5TGljZW5jZUhhc2gAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAtsaWNlbmNlSGFzaAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAANa2V5TGljZW5jZUNpZAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAACmxpY2VuY2VDSUQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAB2tleVR5cGUAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAR0eXBlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAdrZXlUYWdzAAAAAgUAAAAGY2FsbGVyBQAAAAVhcnRJZAUAAAAEdGFncwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAACmtleU1heE1pbnQAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAdtYXhtaW50CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAlrZXlTaWduSUQAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAZzaWduSUQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAlrZXlJc3N1ZWQAAAACBQAAAAZjYWxsZXIFAAAABWFydElkAAAAAAAAAAAACQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACCQEAAAAJa2V5T25TYWxlAAAAAgUAAAAGY2FsbGVyBQAAAAVhcnRJZAcJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAADWtleWlkQnlTaWduaWQAAAACBQAAAAZjYWxsZXIFAAAABnNpZ25JRAUAAAAFYXJ0SWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEWtleUhhc2hCeVR4aWRBZGRyAAAAAgUAAAAGY2FsbGVyBQAAAAVhcnRJZAUAAAAKc2hhMjU2SGFzaAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQUAAAALZmVlUmVjZWl2ZXIFAAAABmFtb3VudAUAAAAHYXNzZXRJZAUAAAADbmlsAAAAAWkBAAAADXVwZGF0ZUFydHdvcmsAAAALAAAABHR4aWQAAAAEbmFtZQAAAAtkZXNjcmlwdGlvbgAAAAR0YWdzAAAABHR5cGUAAAAHbWF4bWludAAAAApjaWREaXNwbGF5AAAADHNoYTI1NkV4cG9ydAAAAAljaWRFeHBvcnQAAAANc2hhMjU2TGljZW5jZQAAAApjaWRMaWNlbmNlAwkBAAAAASEAAAABBQAAAAtkYXBwUnVubmluZwkAAAIAAAABBQAAAA5tYWludGVuYW5jZU1TRwQAAAAGY2FsbGVyCQACWAAAAAEICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMEAAAADSR0MDIwNzU3MjA4MjYJAQAAAApzZXRMSWNlbmNlAAAAAgUAAAAKY2lkTGljZW5jZQUAAAANc2hhMjU2TGljZW5jZQQAAAAKbGljZW5jZUNJRAgFAAAADSR0MDIwNzU3MjA4MjYAAAACXzEEAAAAC2xpY2VuY2VIYXNoCAUAAAANJHQwMjA3NTcyMDgyNgAAAAJfMgQAAAAPdmFsaWRhdGVBcnR3b3JrCQEAAAATdmFsaWRhdGVBcnR3b3JrRGF0YQAAAAoFAAAABmNhbGxlcgUAAAAKY2lkRGlzcGxheQUAAAAJY2lkRXhwb3J0BQAAAApsaWNlbmNlQ0lEBQAAAAxzaGEyNTZFeHBvcnQFAAAAC2xpY2VuY2VIYXNoBQAAAARuYW1lBQAAAAtkZXNjcmlwdGlvbgUAAAAEdGFncwUAAAAHbWF4bWludAMJAQAAAAIhPQAAAAIFAAAAD3ZhbGlkYXRlQXJ0d29yawIAAAAACQAAAgAAAAECAAAAFVNvbWV0aGluZyB3ZW50IHdyb25nIQQAAAAKZW50cnlFeGlzdAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAB2tleU5hbWUAAAACBQAAAAZjYWxsZXIFAAAABHR4aWQDCQAAAAAAAAIFAAAACmVudHJ5RXhpc3QCAAAAAAkAAAIAAAABAgAAAA9FbnRyeSBub3QgZm91bmQEAAAABGZsYWcJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAAdrZXlGbGFnAAAAAgUAAAAGY2FsbGVyBQAAAAR0eGlkAwkAAAAAAAACBQAAAARmbGFnAgAAAAdJTExFR0FMCQAAAgAAAAECAAAAHUNhbm5vdCB1cGRhdGUgSUxMRUdBTCBhcnR3b3JrAwkBAAAAASEAAAABCQEAAAALaXNBcnRNaW50ZWQAAAACBQAAAAZjYWxsZXIFAAAABHR4aWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAB2tleU5hbWUAAAACBQAAAAZjYWxsZXIFAAAABHR4aWQFAAAABG5hbWUJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAB2tleURlc2MAAAACBQAAAAZjYWxsZXIFAAAABHR4aWQFAAAAC2Rlc2NyaXB0aW9uCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA1rZXlEaXNwbGF5Q2lkAAAAAgUAAAAGY2FsbGVyBQAAAAR0eGlkBQAAAApjaWREaXNwbGF5CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAxrZXlFeHBvcnRDaWQA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", "height": 2472954, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: LbJtfo9H46T5dxY35TTeZY9yjADWAypx35VMZZx1umz Next: CrSStV4RGdaobc3U2xRjXTXaF8ZvKCq9hNynm2TBcGiA Diff:
OldNewDifferences
8686 func keyUserStatus (caller) = ("user_status_" + caller)
8787
8888
89-func keyArtDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
89+func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
9090
9191
92-func keyArtName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
92+func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
9393
9494
95-func keyArtDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
95+func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
9696
9797
98-func keyArtDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
98+func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
9999
100100
101-func keyArtExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
101+func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
102102
103103
104-func keyArtExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
104+func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
105105
106106
107-func keyArtMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
107+func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
108108
109109
110-func keyArtSignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
110+func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
111111
112112
113-func keyArtIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
113+func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
114114
115115
116-func keyArtOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
116+func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
117117
118118
119-func keyArtLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
119+func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
120120
121121
122-func keyArtLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
122+func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
123123
124124
125-func keyArtTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
125+func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
126126
127127
128-func keyArtType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
128+func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
129129
130130
131-func keyArtPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
131+func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
132132
133133
134-func keyArtAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
134+func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
135135
136136
137-func keyArtFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
137+func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
138138
139139
140-func keyArtHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
140+func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
141141
142142
143-func keyArtOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
143+func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
144144
145145
146-func keyArtArtidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
146+func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
147147
148148
149-func keyArtTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
149+func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
150150
151151
152152 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
221221 }
222222
223223
224-func validatePayment (invoke) = if ((size(invoke.payments) == 0))
224+func isPayment (i) = if ((size(i.payments) == 0))
225225 then throw("No payment attached")
226226 else {
227- let payment = value(invoke.payments[0])
227+ let payment = value(i.payments[0])
228228 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)
229+ $Tuple2(payment, amount)
238230 }
239231
240232
241-func isArtMinted (addressToUse,artId) = match getInteger(this, keyArtIssued(addressToUse, artId)) {
233+func validatePayment (i) = {
234+ let $t089098945 = isPayment(i)
235+ let payment = $t089098945._1
236+ let amount = $t089098945._2
237+ let assetId = if (if (isDefined(payment.assetId))
238+ then (payment.assetId == signAssetId)
239+ else false)
240+ then payment.assetId
241+ else throw("Only SIGN token accepted as transaction fee")
242+ let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
243+ if ((amount != currentCertificationPrice))
244+ then throw(("Payment amount should be " + toString(currentCertificationPrice)))
245+ else $Tuple2(amount, assetId)
246+ }
247+
248+
249+func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
242250 case b: Int =>
243251 if ((b != 0))
244252 then true
248256 }
249257
250258
251-func validatePriceAssetId (invoke,priceAssetId,artworkPrice) = {
252- let payment = value(invoke.payments[0])
253- let amount = value(payment.amount)
259+func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
260+ let $t096459681 = isPayment(i)
261+ let payment = $t096459681._1
262+ let amount = $t096459681._2
254263 let assetId = if (!(isDefined(payment.assetId)))
255264 then unit
256265 else if (if ((size(priceAssetId) > 0))
268277 }
269278
270279
271-func acceptedAssetIds (assetId) = if (if (if ((assetId != toBase58String(signAssetId)))
280+func acceptedAssetIds (assetId) = if (if (if (if ((assetId != toBase58String(signAssetId)))
272281 then (assetId != toBase58String(wavesAssetId))
282+ else false)
283+ then (assetId != "WAVES")
273284 else false)
274285 then (assetId != toBase58String(usdnAssetId))
275286 else false)
279290
280291 func validateMinSell (assetId,price) = {
281292 let minSellWaves = if (unitTest)
282- then 1
293+ then 10
283294 else getIntegerByKeyFromOracle("waves_min_sell")
284295 let minSellUsdn = 1000000
285296 let minSellSign = if (unitTest)
297308 then (price != 0)
298309 else false)
299310 then true
300- else if (if ((assetId == toBase58String(wavesAssetId)))
311+ else if (if (if ((assetId == toBase58String(wavesAssetId)))
312+ then true
313+ else (assetId == "WAVES"))
301314 then (minSellWaves > price)
302315 else false)
303316 then (price != 0)
307320 }
308321
309322
310-@Callable(invoke)
311-func addArtwork (sha256Hash,signID,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
323+func getBidAssetId (assetId) = if ((assetId == "WAVES"))
324+ then unit
325+ else fromBase58String(assetId)
326+
327+
328+func getPriceAssetIdFromBid (bidDataKey) = {
329+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
330+ if ((bidData == ""))
331+ then throw("Bid not found")
332+ else {
333+ let bidDataArr = split(bidData, "_")
334+ let bidAmount = parseIntValue(bidDataArr[1])
335+ let bidAssetId = getBidAssetId(bidDataArr[0])
336+ if ((0 >= bidAmount))
337+ then throw("Wrong amount")
338+ else $Tuple2(bidAmount, bidAssetId)
339+ }
340+ }
341+
342+
343+func idCallerDate (i) = if (!(dappRunning))
312344 then throw(maintenanceMSG)
313- else {
314- let artId = toBase58String(invoke.transactionId)
315- let timestamp = lastBlock.timestamp
316- let caller = toBase58String(invoke.caller.bytes)
317- if (!(validateHash(sha256Hash)))
318- then throw("Hash should be 64 characters maximum")
319- else {
320- let $t01152411593 = setLIcence(cidLicence, sha256Licence)
321- let licenceCID = $t01152411593._1
322- let licenceHash = $t01152411593._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 $t01182111868 = validatePayment(invoke)
328- let amount = $t01182111868._1
329- let assetId = $t01182111868._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")
336- else {
337- let hashExist = getStringByKey(keyArtOwnerByHash(sha256Hash))
338- if ((hashExist != ""))
339- then throw("Hash already registered")
340- else {
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)]
345- }
346- }
347- }
348- }
349- }
350- }
345+ else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
346+
347+
348+func isBidCheck (i,issuer,bidOwner,bidId) = if (if (if ((toBase58String(i.caller.bytes) == issuer))
349+ then (bidOwner != "")
350+ else false)
351+ then (bidId != "")
352+ else false)
353+ then true
354+ else false
355+
356+
357+func getArtData (issuer,artId,isBid) = {
358+ let totalNFT = getIntegerByKey("total_nft_issued")
359+ let signID = getStringByKey(keySignID(issuer, artId))
360+ let artworkName = getStringByKey(keyName(issuer, artId))
361+ if ((artworkName == ""))
362+ then throw("Art doesn't exist")
363+ else {
364+ let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
365+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
366+ let artworkPrice = getIntegerByKey(keyPrice(issuer, artId))
367+ let priceAssetId = getStringByKey(keyAssetIdAccepted(issuer, artId))
368+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
369+ if (if (if (if (!(isBid))
370+ then (0 >= artworkPrice)
371+ else false)
372+ then true
373+ else !(isOnSale))
374+ then true
375+ else (0 >= maxCanSell))
376+ then throw("Art not for sale")
377+ else if (if (isBid)
378+ then (0 >= maxCanSell)
379+ else false)
380+ then throw("Art not open for Offer")
381+ else $Tuple7(totalNFT, signID, artworkName, amountSold, artworkPrice, priceAssetId, maxCanSell)
382+ }
383+ }
384+
385+
386+func getBidData (i,caller,issuer,artId,bidOwner,bidId,priceAssetId,artworkPrice,isBid) = {
387+ let checkUser = validateUser(issuer)
388+ if (if (isBid)
389+ then (checkUser != "")
390+ else false)
391+ then throw(checkUser)
392+ else {
393+ let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
394+ let $t01335313482 = if (isBid)
395+ then getPriceAssetIdFromBid(bidDataKey)
396+ else validatePriceAssetId(i, priceAssetId, artworkPrice)
397+ let amount = $t01335313482._1
398+ let assetId = $t01335313482._2
399+ $Tuple3(bidDataKey, amount, assetId)
400+ }
401+ }
402+
403+
404+func getCommissionData (issuer,priceAssetId,amount,amountSold,maxCanSell) = {
405+ let isWhitelisted = checkWhitelist(issuer)
406+ let cut = if ((isWhitelisted > height))
407+ then 0
408+ else if ((priceAssetId == toBase58String(signAssetId)))
409+ then signCut
410+ else usdnWaveCut
411+ let amountForSign = fraction(amount, cut, 100)
412+ let amountForCreator = (amount - amountForSign)
413+ if ((amountSold == maxCanSell))
414+ then throw("Art sold out")
415+ else {
416+ let newAmountSold = (amountSold + 1)
417+ $Tuple3(amountForSign, amountForCreator, newAmountSold)
418+ }
419+ }
420+
421+
422+func getIssueData (issuer,artId,signID,artworkName,newAmountSold,maxCanSell,totalNFT,caller,bidOwner,bidId,i) = {
423+ let issueMeta = ((((((((((("Creator: " + issuer) + ",
424+ ArtID: ") + artId) + ",
425+ SignID: ") + signID) + ",
426+ Artwork name: ") + artworkName) + ",
427+ Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
428+ let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
429+ let idNFT = calculateAssetId(issueNFT)
430+ let sellStatus = if ((newAmountSold == maxCanSell))
431+ then false
432+ else true
433+ let receiveNFT = if (if (if ((caller == issuer))
434+ then (bidOwner != "")
435+ else false)
436+ then (bidId != "")
437+ else false)
438+ then addressFromStringValue(bidOwner)
439+ else i.caller
440+ $Tuple4(issueNFT, idNFT, sellStatus, receiveNFT)
441+ }
442+
443+
444+func getBidKeyVal (assetId,bidDataKey,date) = {
445+ let assetIdBid = if (!(isDefined(assetId)))
446+ then "WAVES"
447+ else toBase58String(value(assetId))
448+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
449+ let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
450+ let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
451+ $Tuple3(assetIdBid, bidDelOld, bidUpdate)
452+ }
453+
454+
455+func buyMint (i,artId,issuer,bidId,bidOwner) = {
456+ let $t01533515385 = idCallerDate(i)
457+ let id = $t01533515385._1
458+ let caller = $t01533515385._2
459+ let date = $t01533515385._3
460+ let isBid = isBidCheck(i, issuer, bidOwner, bidId)
461+ let $t01546515603 = getArtData(issuer, artId, isBid)
462+ let totalNFT = $t01546515603._1
463+ let signID = $t01546515603._2
464+ let artworkName = $t01546515603._3
465+ let amountSold = $t01546515603._4
466+ let artworkPrice = $t01546515603._5
467+ let priceAssetId = $t01546515603._6
468+ let maxCanSell = $t01546515603._7
469+ let $t01560815754 = getBidData(i, caller, issuer, artId, bidOwner, bidId, priceAssetId, artworkPrice, isBid)
470+ let bidDataKey = $t01560815754._1
471+ let amount = $t01560815754._2
472+ let assetId = $t01560815754._3
473+ let $t01575915906 = getCommissionData(issuer, priceAssetId, amount, amountSold, maxCanSell)
474+ let amountForSign = $t01575915906._1
475+ let amountForCreator = $t01575915906._2
476+ let newAmountSold = $t01575915906._3
477+ let $t01591116091 = getIssueData(issuer, artId, signID, artworkName, newAmountSold, maxCanSell, totalNFT, caller, bidOwner, bidId, i)
478+ let issueNFT = $t01591116091._1
479+ let idNFT = $t01591116091._2
480+ let sellStatus = $t01591116091._3
481+ let receiveNFT = $t01591116091._4
482+ let $t01609616195 = getBidKeyVal(assetId, bidDataKey, date)
483+ let assetIdBid = $t01609616195._1
484+ let bidDelOld = $t01609616195._2
485+ let bidUpdate = $t01609616195._3
486+ let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
487+ let soldValue = if (!(isBid))
488+ then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
489+ else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
490+ let soldData = StringEntry(soldKey, soldValue)
491+ let buyRes = [IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId), ScriptTransfer(receiveNFT, 1, idNFT)]
492+ if (isBid)
493+ then [soldData, bidUpdate, bidDelOld] :: buyRes
494+ else soldData :: buyRes
495+ }
496+
497+
498+@Callable(i)
499+func addArtwork (sha256Hash,signID,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = {
500+ let $t01755517596 = idCallerDate(i)
501+ let artId = $t01755517596._1
502+ let caller = $t01755517596._2
503+ let date = $t01755517596._3
504+ if (!(validateHash(sha256Hash)))
505+ then throw("Hash should be 64 characters maximum")
506+ else {
507+ let $t01769717766 = setLIcence(cidLicence, sha256Licence)
508+ let licenceCID = $t01769717766._1
509+ let licenceHash = $t01769717766._2
510+ let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
511+ if ((validateArtwork != ""))
512+ then throw("Something went wrong!")
513+ else {
514+ let $t01799418036 = validatePayment(i)
515+ let amount = $t01799418036._1
516+ let assetId = $t01799418036._2
517+ if (!(isDefined(amount)))
518+ then throw("Something went wrong")
519+ else {
520+ let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
521+ if ((entryExist != ""))
522+ then throw("You already added it")
523+ else {
524+ let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
525+ if ((hashExist != ""))
526+ then throw("Hash already registered")
527+ else {
528+ let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
529+ if (!(isSignCertified))
530+ then throw("Sign Certificate not found for this address.")
531+ else [StringEntry(keyOwnerByHash(sha256Hash), caller), StringEntry(keyTxidByHashOwner(sha256Hash, caller), artId), IntegerEntry(keyDate(caller, artId), date), StringEntry(keyName(caller, artId), name), StringEntry(keyDesc(caller, artId), description), StringEntry(keyDisplayCid(caller, artId), cidDisplay), StringEntry(keyExportCid(caller, artId), cidExport), StringEntry(keyExportHash(caller, artId), sha256Export), StringEntry(keyLicenceHash(caller, artId), licenceHash), StringEntry(keyLicenceCid(caller, artId), licenceCID), StringEntry(keyType(caller, artId), type), StringEntry(keyTags(caller, artId), tags), IntegerEntry(keyMaxMint(caller, artId), maxmint), StringEntry(keySignID(caller, artId), signID), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyidBySignid(caller, signID), artId), StringEntry(keyHashByTxidAddr(caller, artId), sha256Hash), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, assetId)]
532+ }
533+ }
534+ }
535+ }
536+ }
537+ }
351538
352539
353540
354-@Callable(invoke)
541+@Callable(i)
355542 func updateArtwork (txid,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
356543 then throw(maintenanceMSG)
357544 else {
358- let updateId = toBase58String(invoke.transactionId)
359- let caller = toBase58String(invoke.caller.bytes)
360- let $t01472314792 = setLIcence(cidLicence, sha256Licence)
361- let licenceCID = $t01472314792._1
362- let licenceHash = $t01472314792._2
545+ let caller = toBase58String(i.caller.bytes)
546+ let $t02075720826 = setLIcence(cidLicence, sha256Licence)
547+ let licenceCID = $t02075720826._1
548+ let licenceHash = $t02075720826._2
363549 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
364550 if ((validateArtwork != ""))
365551 then throw("Something went wrong!")
366552 else {
367- let entryExist = getStringByKey(keyArtName(caller, txid))
553+ let entryExist = getStringByKey(keyName(caller, txid))
368554 if ((entryExist == ""))
369555 then throw("Entry not found")
370556 else {
371- let flag = getStringByKey(keyArtFlag(caller, txid))
557+ let flag = getStringByKey(keyFlag(caller, txid))
372558 if ((flag == "ILLEGAL"))
373559 then throw("Cannot update ILLEGAL artwork")
374560 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)]
561+ then [StringEntry(keyName(caller, txid), name), StringEntry(keyDesc(caller, txid), description), StringEntry(keyDisplayCid(caller, txid), cidDisplay), StringEntry(keyExportCid(caller, txid), cidExport), StringEntry(keyExportHash(caller, txid), sha256Export), StringEntry(keyLicenceCid(caller, txid), licenceCID), StringEntry(keyLicenceHash(caller, txid), licenceHash), IntegerEntry(keyMaxMint(caller, txid), maxmint), StringEntry(keyTags(caller, txid), tags), StringEntry(keyType(caller, txid), type)]
376562 else throw("Already minted")
377563 }
378564 }
380566
381567
382568
383-@Callable(invoke)
569+@Callable(i)
384570 func flagArtwork (artId,addr,flag) = {
385- let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
386- let id = toBase58String(invoke.transactionId)
571+ let $t02229922332 = idCallerDate(i)
572+ let id = $t02229922332._1
573+ let caller = $t02229922332._2
387574 if (containsElement([chris, joep, toString(this)], caller))
388575 then if ((flag == "CONSENT"))
389- then [StringEntry(keyArtFlag(addr, artId), flag)]
576+ then [StringEntry(keyFlag(addr, artId), flag)]
390577 else if ((flag == ""))
391- then [StringEntry(keyArtFlag(addr, artId), flag)]
578+ then [StringEntry(keyFlag(addr, artId), flag)]
392579 else if ((flag == "CHANGE_REQUIRED"))
393- then [StringEntry(keyArtFlag(addr, artId), flag)]
580+ then [StringEntry(keyFlag(addr, artId), flag)]
394581 else if (if ((flag == "ILLEGAL"))
395582 then containsElement([chris, toString(this)], caller)
396583 else false)
397- 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), "")]
584+ then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyName(addr, artId), "ILLEGAL CONTENT"), StringEntry(keyDesc(addr, artId), "ILLEGAL CONTENT"), StringEntry(keyDisplayCid(addr, artId), ""), StringEntry(keyExportCid(addr, artId), ""), StringEntry(keyLicenceCid(addr, artId), "")]
398585 else throw(("Unknow status " + flag))
399586 else throw("You are not allowed")
400587 }
401588
402589
403590
404-@Callable(invoke)
591+@Callable(i)
405592 func deleteArtwork (artId,addr) = {
406- let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
407- let id = toBase58String(invoke.transactionId)
408- let addressToUse = if (containsElement([chris, joep, toString(this)], caller))
593+ let $t02335123384 = idCallerDate(i)
594+ let id = $t02335123384._1
595+ let caller = $t02335123384._2
596+ let addrToUse = if (containsElement([chris, joep, toString(this)], caller))
409597 then addr
410598 else caller
411- let entryExist = getStringByKey(keyArtName(addressToUse, artId))
599+ let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
412600 if ((entryExist == ""))
413601 then throw("No art matching for this address")
414602 else {
415- let sha256Hash = getStringByKey(keyArtHashByTxidAddr(addressToUse, artId))
603+ let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
416604 if ((sha256Hash == ""))
417605 then throw("No art hash matching for this address")
418606 else {
419- let signID = getStringByKey(keyArtSignID(addressToUse, artId))
607+ let signID = getStringByKey(keySignID(addrToUse, artId))
420608 if ((signID == ""))
421609 then throw("No SIGN ID matching")
422610 else {
423- 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(keyArtPrice(addr, artId)), DeleteEntry(keyArtAssetIdAccepted(addr, artId)), DeleteEntry(keyArtOwnerByHash(sha256Hash)), DeleteEntry(keyArtArtidBySignid(addressToUse, signID)), DeleteEntry(keyArtTxidByHashOwner(sha256Hash, addressToUse))]
424- if (!(isArtMinted(addressToUse, artId)))
611+ let dataToDelete = [DeleteEntry(keyDate(addrToUse, artId)), DeleteEntry(keyName(addrToUse, artId)), DeleteEntry(keyDesc(addrToUse, artId)), DeleteEntry(keyDisplayCid(addrToUse, artId)), DeleteEntry(keyExportCid(addrToUse, artId)), DeleteEntry(keyExportHash(addrToUse, artId)), DeleteEntry(keyLicenceHash(addrToUse, artId)), DeleteEntry(keyLicenceCid(addrToUse, artId)), DeleteEntry(keyType(addrToUse, artId)), DeleteEntry(keyTags(addrToUse, artId)), DeleteEntry(keyMaxMint(addrToUse, artId)), DeleteEntry(keySignID(addrToUse, artId)), DeleteEntry(keyIssued(addrToUse, artId)), DeleteEntry(keyOnSale(addrToUse, artId)), DeleteEntry(keyFlag(addr, artId)), DeleteEntry(keyPrice(addr, artId)), DeleteEntry(keyAssetIdAccepted(addr, artId)), DeleteEntry(keyOwnerByHash(sha256Hash)), DeleteEntry(keyidBySignid(addrToUse, signID)), DeleteEntry(keyTxidByHashOwner(sha256Hash, addrToUse))]
612+ if (!(isArtMinted(addrToUse, artId)))
425613 then if (!(dappRunning))
426614 then throw(maintenanceMSG)
427615 else dataToDelete
435623
436624
437625
438-@Callable(invoke)
439-func sellArtwork (artId,price,maxMint,assetId) = if (!(dappRunning))
440- then throw(maintenanceMSG)
441- else {
442- let id = toBase58String(invoke.transactionId)
443- let caller = toBase58String(invoke.caller.bytes)
444- let sellDate = lastBlock.timestamp
445- let artworkName = getStringByKey(keyArtName(caller, artId))
446- if ((artworkName == ""))
447- then throw("This art doesn't match match your account")
448- else {
449- let exportCID = getStringByKey(keyArtExportCid(caller, artId))
450- if ((size(split(exportCID, "/")[0]) != 59))
451- then throw("You cannot sell art with no export file")
452- else {
453- let exportHash = getStringByKey(keyArtExportHash(caller, artId))
454- if ((size(exportHash) != 64))
455- then throw("You cannot sell art with no export hash")
456- else if (!(acceptedAssetIds(assetId)))
457- then throw("Something went wrong!")
458- else if (!(validateMinSell(assetId, price)))
459- then throw("Something went wrong!")
460- else {
461- let checkUser = validateUser(caller)
462- if ((checkUser != ""))
463- then throw(checkUser)
464- else {
465- let amountSold = getIntegerByKey(keyArtIssued(caller, artId))
466- let maxCanSell = getIntegerByKey(keyArtMaxMint(caller, artId))
467- if ((maxMint > 10))
468- then throw("10 editions max per artwork")
469- else if (if ((amountSold != 0))
470- then (amountSold == maxCanSell)
626+@Callable(i)
627+func sellArtwork (artId,price,maxMint,assetId) = {
628+ let $t02575025783 = idCallerDate(i)
629+ let id = $t02575025783._1
630+ let caller = $t02575025783._2
631+ let artworkName = getStringByKey(keyName(caller, artId))
632+ if ((artworkName == ""))
633+ then throw("This art doesn't match your account")
634+ else {
635+ let exportCID = getStringByKey(keyExportCid(caller, artId))
636+ if ((size(split(exportCID, "/")[0]) != 59))
637+ then throw("You cannot sell art with no export file")
638+ else if (!(acceptedAssetIds(assetId)))
639+ then throw("Something went wrong!")
640+ else if (!(validateMinSell(assetId, price)))
641+ then throw("Something went wrong!")
642+ else {
643+ let checkUser = validateUser(caller)
644+ if ((checkUser != ""))
645+ then throw(checkUser)
646+ else {
647+ let amountSold = getIntegerByKey(keyIssued(caller, artId))
648+ let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
649+ if ((maxMint > 10))
650+ then throw("10 editions max per artwork")
651+ else if (if ((amountSold != 0))
652+ then (amountSold == maxCanSell)
653+ else false)
654+ then throw("Max edition reached.")
655+ else if (if ((amountSold > 0))
656+ then (maxCanSell != maxMint)
657+ else false)
658+ then throw("Cannot change maximum issuable anymore")
659+ else {
660+ let sellStatus = if (if ((price > 0))
661+ then (maxMint > 0)
471662 else false)
472- then throw("Max edition reached.")
473- else if (if ((amountSold > 0))
474- then (maxCanSell != maxMint)
475- else false)
476- then throw("Cannot change maximum issuable anymore")
477- else {
478- let sellStatus = if (if ((price > 0))
479- then (maxMint > 0)
480- else false)
481- then true
482- else false
483-[BooleanEntry(keyArtOnSale(caller, artId), sellStatus), IntegerEntry(keyArtPrice(caller, artId), price), IntegerEntry(keyArtMaxMint(caller, artId), maxMint), StringEntry(keyArtAssetIdAccepted(caller, artId), assetId)]
484- }
485- }
486- }
487- }
488- }
489- }
663+ then true
664+ else false
665+[BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), StringEntry(keyAssetIdAccepted(caller, artId), assetId)]
666+ }
667+ }
668+ }
669+ }
670+ }
490671
491672
492673
493-@Callable(invoke)
494-func buyArtwork (artId,issuer) = if (!(dappRunning))
495- then throw(maintenanceMSG)
496- else {
497- let id = toBase58String(invoke.transactionId)
498- let caller = toBase58String(invoke.caller.bytes)
499- let totalNFT = getIntegerByKey("total_nft_issued")
500- let signID = getStringByKey(keyArtSignID(issuer, artId))
501- let artworkName = getStringByKey(keyArtName(issuer, artId))
502- if ((artworkName == ""))
503- then throw("Art doesn't exist")
674+@Callable(i)
675+func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "")
676+
677+
678+
679+@Callable(i)
680+func setBid (artId,issuer) = {
681+ let $t02757927617 = idCallerDate(i)
682+ let id = $t02757927617._1
683+ let caller = $t02757927617._2
684+ let date = $t02757927617._3
685+ let $t02762227658 = isPayment(i)
686+ let payment = $t02762227658._1
687+ let amount = $t02762227658._2
688+ let assetId = if (!(isDefined(payment.assetId)))
689+ then "WAVES"
690+ else toBase58String(value(payment.assetId))
691+ if (!(acceptedAssetIds(assetId)))
692+ then throw("asset not accepted")
693+ else if (!(validateMinSell(assetId, amount)))
694+ then throw("Wrong min sell")
504695 else {
505- let displayCID = getStringByKey(keyArtDisplayCid(issuer, artId))
506- let exportCID = getStringByKey(keyArtExportCid(issuer, artId))
507- let exportHash = getStringByKey(keyArtExportHash(issuer, artId))
508- let licenceCID = getStringByKey(keyArtLicenceCid(issuer, artId))
509- let licenceHash = getStringByKey(keyArtLicenceHash(issuer, artId))
510- let description = take(getStringByKey(keyArtDesc(issuer, artId)), 50)
511- let isOnSale = getBooleanByKey(keyArtOnSale(issuer, artId))
512- let amountSold = getIntegerByKey(keyArtIssued(issuer, artId))
513- let artworkPrice = getIntegerByKey(keyArtPrice(issuer, artId))
514- let priceAssetId = getStringByKey(keyArtAssetIdAccepted(issuer, artId))
515- let sourceHash = getStringByKey(keyArtHashByTxidAddr(issuer, artId))
516- let maxCanSell = getIntegerByKey(keyArtMaxMint(issuer, artId))
517- if (if (if ((0 >= artworkPrice))
518- then true
519- else !(isOnSale))
520- then true
521- else (0 >= maxCanSell))
522- then throw("Art not for sale")
523- else {
524- let $t02323623316 = validatePriceAssetId(invoke, priceAssetId, artworkPrice)
525- let amount = $t02323623316._1
526- let assetId = $t02323623316._2
527- let isWhitelisted = checkWhitelist(issuer)
528- let cut = if ((isWhitelisted > height))
529- then 0
530- else if ((priceAssetId == toBase58String(signAssetId)))
531- then signCut
532- else usdnWaveCut
533- let amountForSign = fraction(amount, cut, 100)
534- let amountForCreator = (amount - amountForSign)
535- if ((amountSold == maxCanSell))
536- then throw("Art sold out")
537- else {
538- let newAmountSold = (amountSold + 1)
539- let entryDate = lastBlock.timestamp
540- let issueMeta = ((((((((((((((((((((((((((("Creator: " + issuer) + ",
541- ArtID: ") + artId) + ",
542- SignID: ") + signID) + ",
543- Artwork name: ") + artworkName) + ",
544- Artwork description: ") + description) + ",
545- Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell)) + ",
546- Max issuable: ") + toString(maxCanSell)) + ",
547- Source hash: ") + sourceHash) + ",
548- Display cid: ") + displayCID) + ",
549- Export cid: ") + exportCID) + ",
550- Export hash: ") + exportHash) + ",
551- Licence cid: ") + licenceCID) + ",
552- Licence hash: ") + licenceHash)
553- let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
554- let idNFT = calculateAssetId(issueNFT)
555- let sellStatus = if ((newAmountSold == maxCanSell))
556- then false
557- else true
558-[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)]
559- }
560- }
696+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
697+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
698+ if ((0 >= maxCanSell))
699+ then throw("No max edition set for this artwork")
700+ else if ((amountSold >= maxCanSell))
701+ then throw("Sold out, you cannot bid")
702+ else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date)))]
561703 }
562- }
704+ }
705+
706+
707+
708+@Callable(i)
709+func acceptBid (artId,issuer,bidId,bidOwner) = {
710+ let caller = toBase58String(i.caller.bytes)
711+ if ((caller != issuer))
712+ then throw("You cannot do this action")
713+ else buyMint(i, artId, issuer, bidId, bidOwner)
714+ }
715+
716+
717+
718+@Callable(i)
719+func cancelBid (artId,issuer,bidId) = {
720+ let $t02869028842 = idCallerDate(i)
721+ let id = $t02869028842._1
722+ let caller = $t02869028842._2
723+ let date = $t02869028842._3
724+ let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + bidId)
725+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
726+ if ((bidData == ""))
727+ then throw("Bid not found")
728+ else {
729+ let bidDataArr = split(bidData, "_")
730+ let assetId = getBidAssetId(bidDataArr[0])
731+ let bidStatus = "CANCELED"
732+[DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), ScriptTransfer(Address(fromBase58String(caller)), parseIntValue(bidDataArr[1]), assetId)]
733+ }
734+ }
563735
564736
565737
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
2828 let usdnWaveCut = 10
2929
3030 let defaultLicence = "bafybeifuyo4pqu54ismqgtb6e4h6kkvgx7zg4u3zibh2r7y6mb64i7bzza/licence.pdf"
3131
3232 let defaultHashLicence = "a87758c354e30a9e78fb84fa3a0010a5090ab20df0be11ad45b5720cc187e639"
3333
3434 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
3535
3636 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
3737
3838 let userSuspended = "SUSPENDED"
3939
4040 let userRemoved = "REMOVED"
4141
4242 let userUnregistered = "UNREGISTERED"
4343
4444 let userAllowed = "ALLOWED"
4545
4646 func getStringByKeyFromUsers (key) = valueOrElse(getString(userDapp, key), "")
4747
4848
4949 func getStringByKey (key) = valueOrElse(getString(this, key), "")
5050
5151
5252 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
5353
5454
5555 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
5656
5757
5858 func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
5959
6060
6161 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
6262
6363
6464 func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signDapp, ((("data_fc_" + signID) + "_") + Owner)) {
6565 case a: String =>
6666 if (contains(a, sha256Hash))
6767 then true
6868 else false
6969 case _ =>
7070 false
7171 }
7272
7373
7474 func validateCID (cid) = if (contains(cid, "/"))
7575 then if (if ((76 > size(cid)))
7676 then (size(split(cid, "/")[0]) == 59)
7777 else false)
7878 then (16 > size(split(cid, "/")[1]))
7979 else false
8080 else false
8181
8282
8383 func validateHash (hash) = (size(hash) == 64)
8484
8585
8686 func keyUserStatus (caller) = ("user_status_" + caller)
8787
8888
89-func keyArtDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
89+func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
9090
9191
92-func keyArtName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
92+func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
9393
9494
95-func keyArtDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
95+func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
9696
9797
98-func keyArtDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
98+func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
9999
100100
101-func keyArtExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
101+func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
102102
103103
104-func keyArtExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
104+func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
105105
106106
107-func keyArtMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
107+func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
108108
109109
110-func keyArtSignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
110+func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
111111
112112
113-func keyArtIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
113+func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
114114
115115
116-func keyArtOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
116+func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
117117
118118
119-func keyArtLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
119+func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
120120
121121
122-func keyArtLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
122+func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
123123
124124
125-func keyArtTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
125+func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
126126
127127
128-func keyArtType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
128+func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
129129
130130
131-func keyArtPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
131+func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
132132
133133
134-func keyArtAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
134+func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
135135
136136
137-func keyArtFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
137+func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
138138
139139
140-func keyArtHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
140+func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
141141
142142
143-func keyArtOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
143+func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
144144
145145
146-func keyArtArtidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
146+func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
147147
148148
149-func keyArtTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
149+func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
150150
151151
152152 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
153153 then throw("Wrong Display CID")
154154 else if (!(validateCID(cidExport)))
155155 then throw("Wrong Export CID")
156156 else if (if ((cidLicence != ""))
157157 then !(validateCID(cidLicence))
158158 else false)
159159 then throw("Wrong Licence CID")
160160 else true
161161
162162
163163 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
164164 then throw("Export Hash 64 char. max")
165165 else if (!(validateHash(sha256Licence)))
166166 then throw("Licence Hash 64 char. max")
167167 else true
168168
169169
170170 func validateString (str,max) = if ((size(str) == 0))
171171 then throw("Field cannot be is empty")
172172 else if ((size(str) > max))
173173 then throw((str + " is too long"))
174174 else true
175175
176176
177177 func validateUser (caller) = {
178178 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
179179 if (if ((userStatus == userUnregistered))
180180 then true
181181 else (userStatus == userAllowed))
182182 then "Register this account first with \"Account\" tab"
183183 else if ((userStatus == userSuspended))
184184 then "Account suspended"
185185 else if ((userStatus == userRemoved))
186186 then "Account removed"
187187 else ""
188188 }
189189
190190
191191 func setLIcence (cidLicence,sha256Licence) = {
192192 let cid = if ((size(cidLicence) == 0))
193193 then defaultLicence
194194 else cidLicence
195195 let hash = if ((size(sha256Licence) == 0))
196196 then defaultHashLicence
197197 else sha256Licence
198198 $Tuple2(cid, hash)
199199 }
200200
201201
202202 func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,maxmint) = {
203203 let checkUser = validateUser(caller)
204204 if ((checkUser != ""))
205205 then throw(checkUser)
206206 else if ((size(cidDisplay) == 0))
207207 then throw("Display CID cannot be empty")
208208 else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
209209 then throw("Problem with CID")
210210 else if (!(validateAllHash(sha256Export, licenceHash)))
211211 then throw("Problem with Hashes")
212212 else if (!(validateString(name, 100)))
213213 then throw("100 Char. max name")
214214 else if (!(validateString(description, 1000)))
215215 then throw("1000 Char. max description")
216216 else if ((size(split(tags, ",")) > 5))
217217 then throw("5 tags max.")
218218 else if ((maxmint > 10))
219219 then throw("10 editions max per artwork")
220220 else ""
221221 }
222222
223223
224-func validatePayment (invoke) = if ((size(invoke.payments) == 0))
224+func isPayment (i) = if ((size(i.payments) == 0))
225225 then throw("No payment attached")
226226 else {
227- let payment = value(invoke.payments[0])
227+ let payment = value(i.payments[0])
228228 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)
229+ $Tuple2(payment, amount)
238230 }
239231
240232
241-func isArtMinted (addressToUse,artId) = match getInteger(this, keyArtIssued(addressToUse, artId)) {
233+func validatePayment (i) = {
234+ let $t089098945 = isPayment(i)
235+ let payment = $t089098945._1
236+ let amount = $t089098945._2
237+ let assetId = if (if (isDefined(payment.assetId))
238+ then (payment.assetId == signAssetId)
239+ else false)
240+ then payment.assetId
241+ else throw("Only SIGN token accepted as transaction fee")
242+ let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
243+ if ((amount != currentCertificationPrice))
244+ then throw(("Payment amount should be " + toString(currentCertificationPrice)))
245+ else $Tuple2(amount, assetId)
246+ }
247+
248+
249+func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
242250 case b: Int =>
243251 if ((b != 0))
244252 then true
245253 else false
246254 case _ =>
247255 false
248256 }
249257
250258
251-func validatePriceAssetId (invoke,priceAssetId,artworkPrice) = {
252- let payment = value(invoke.payments[0])
253- let amount = value(payment.amount)
259+func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
260+ let $t096459681 = isPayment(i)
261+ let payment = $t096459681._1
262+ let amount = $t096459681._2
254263 let assetId = if (!(isDefined(payment.assetId)))
255264 then unit
256265 else if (if ((size(priceAssetId) > 0))
257266 then (toBase58String(value(payment.assetId)) == priceAssetId)
258267 else false)
259268 then payment.assetId
260269 else throw("Wrong asset id")
261270 if (if ((assetId == unit))
262271 then (priceAssetId != "")
263272 else false)
264273 then throw("Wrong asset id")
265274 else if ((artworkPrice != amount))
266275 then throw("Payment don't match")
267276 else $Tuple2(amount, assetId)
268277 }
269278
270279
271-func acceptedAssetIds (assetId) = if (if (if ((assetId != toBase58String(signAssetId)))
280+func acceptedAssetIds (assetId) = if (if (if (if ((assetId != toBase58String(signAssetId)))
272281 then (assetId != toBase58String(wavesAssetId))
282+ else false)
283+ then (assetId != "WAVES")
273284 else false)
274285 then (assetId != toBase58String(usdnAssetId))
275286 else false)
276287 then throw("Only SIGN, USDN or WAVES accepted")
277288 else true
278289
279290
280291 func validateMinSell (assetId,price) = {
281292 let minSellWaves = if (unitTest)
282- then 1
293+ then 10
283294 else getIntegerByKeyFromOracle("waves_min_sell")
284295 let minSellUsdn = 1000000
285296 let minSellSign = if (unitTest)
286297 then 1
287298 else (getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId))) * 2)
288299 if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
289300 then (minSellUsdn > price)
290301 else false)
291302 then (price != 0)
292303 else false)
293304 then true
294305 else if (if ((assetId == toBase58String(signAssetId)))
295306 then (minSellSign > price)
296307 else false)
297308 then (price != 0)
298309 else false)
299310 then true
300- else if (if ((assetId == toBase58String(wavesAssetId)))
311+ else if (if (if ((assetId == toBase58String(wavesAssetId)))
312+ then true
313+ else (assetId == "WAVES"))
301314 then (minSellWaves > price)
302315 else false)
303316 then (price != 0)
304317 else false)
305318 then throw("Wrong minimum sell price")
306319 else true
307320 }
308321
309322
310-@Callable(invoke)
311-func addArtwork (sha256Hash,signID,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
323+func getBidAssetId (assetId) = if ((assetId == "WAVES"))
324+ then unit
325+ else fromBase58String(assetId)
326+
327+
328+func getPriceAssetIdFromBid (bidDataKey) = {
329+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
330+ if ((bidData == ""))
331+ then throw("Bid not found")
332+ else {
333+ let bidDataArr = split(bidData, "_")
334+ let bidAmount = parseIntValue(bidDataArr[1])
335+ let bidAssetId = getBidAssetId(bidDataArr[0])
336+ if ((0 >= bidAmount))
337+ then throw("Wrong amount")
338+ else $Tuple2(bidAmount, bidAssetId)
339+ }
340+ }
341+
342+
343+func idCallerDate (i) = if (!(dappRunning))
312344 then throw(maintenanceMSG)
313- else {
314- let artId = toBase58String(invoke.transactionId)
315- let timestamp = lastBlock.timestamp
316- let caller = toBase58String(invoke.caller.bytes)
317- if (!(validateHash(sha256Hash)))
318- then throw("Hash should be 64 characters maximum")
319- else {
320- let $t01152411593 = setLIcence(cidLicence, sha256Licence)
321- let licenceCID = $t01152411593._1
322- let licenceHash = $t01152411593._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 $t01182111868 = validatePayment(invoke)
328- let amount = $t01182111868._1
329- let assetId = $t01182111868._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")
336- else {
337- let hashExist = getStringByKey(keyArtOwnerByHash(sha256Hash))
338- if ((hashExist != ""))
339- then throw("Hash already registered")
340- else {
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)]
345- }
346- }
347- }
348- }
349- }
350- }
345+ else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
346+
347+
348+func isBidCheck (i,issuer,bidOwner,bidId) = if (if (if ((toBase58String(i.caller.bytes) == issuer))
349+ then (bidOwner != "")
350+ else false)
351+ then (bidId != "")
352+ else false)
353+ then true
354+ else false
355+
356+
357+func getArtData (issuer,artId,isBid) = {
358+ let totalNFT = getIntegerByKey("total_nft_issued")
359+ let signID = getStringByKey(keySignID(issuer, artId))
360+ let artworkName = getStringByKey(keyName(issuer, artId))
361+ if ((artworkName == ""))
362+ then throw("Art doesn't exist")
363+ else {
364+ let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
365+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
366+ let artworkPrice = getIntegerByKey(keyPrice(issuer, artId))
367+ let priceAssetId = getStringByKey(keyAssetIdAccepted(issuer, artId))
368+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
369+ if (if (if (if (!(isBid))
370+ then (0 >= artworkPrice)
371+ else false)
372+ then true
373+ else !(isOnSale))
374+ then true
375+ else (0 >= maxCanSell))
376+ then throw("Art not for sale")
377+ else if (if (isBid)
378+ then (0 >= maxCanSell)
379+ else false)
380+ then throw("Art not open for Offer")
381+ else $Tuple7(totalNFT, signID, artworkName, amountSold, artworkPrice, priceAssetId, maxCanSell)
382+ }
383+ }
384+
385+
386+func getBidData (i,caller,issuer,artId,bidOwner,bidId,priceAssetId,artworkPrice,isBid) = {
387+ let checkUser = validateUser(issuer)
388+ if (if (isBid)
389+ then (checkUser != "")
390+ else false)
391+ then throw(checkUser)
392+ else {
393+ let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
394+ let $t01335313482 = if (isBid)
395+ then getPriceAssetIdFromBid(bidDataKey)
396+ else validatePriceAssetId(i, priceAssetId, artworkPrice)
397+ let amount = $t01335313482._1
398+ let assetId = $t01335313482._2
399+ $Tuple3(bidDataKey, amount, assetId)
400+ }
401+ }
402+
403+
404+func getCommissionData (issuer,priceAssetId,amount,amountSold,maxCanSell) = {
405+ let isWhitelisted = checkWhitelist(issuer)
406+ let cut = if ((isWhitelisted > height))
407+ then 0
408+ else if ((priceAssetId == toBase58String(signAssetId)))
409+ then signCut
410+ else usdnWaveCut
411+ let amountForSign = fraction(amount, cut, 100)
412+ let amountForCreator = (amount - amountForSign)
413+ if ((amountSold == maxCanSell))
414+ then throw("Art sold out")
415+ else {
416+ let newAmountSold = (amountSold + 1)
417+ $Tuple3(amountForSign, amountForCreator, newAmountSold)
418+ }
419+ }
420+
421+
422+func getIssueData (issuer,artId,signID,artworkName,newAmountSold,maxCanSell,totalNFT,caller,bidOwner,bidId,i) = {
423+ let issueMeta = ((((((((((("Creator: " + issuer) + ",
424+ ArtID: ") + artId) + ",
425+ SignID: ") + signID) + ",
426+ Artwork name: ") + artworkName) + ",
427+ Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
428+ let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
429+ let idNFT = calculateAssetId(issueNFT)
430+ let sellStatus = if ((newAmountSold == maxCanSell))
431+ then false
432+ else true
433+ let receiveNFT = if (if (if ((caller == issuer))
434+ then (bidOwner != "")
435+ else false)
436+ then (bidId != "")
437+ else false)
438+ then addressFromStringValue(bidOwner)
439+ else i.caller
440+ $Tuple4(issueNFT, idNFT, sellStatus, receiveNFT)
441+ }
442+
443+
444+func getBidKeyVal (assetId,bidDataKey,date) = {
445+ let assetIdBid = if (!(isDefined(assetId)))
446+ then "WAVES"
447+ else toBase58String(value(assetId))
448+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
449+ let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
450+ let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((bidData + "_") + toString(date)))
451+ $Tuple3(assetIdBid, bidDelOld, bidUpdate)
452+ }
453+
454+
455+func buyMint (i,artId,issuer,bidId,bidOwner) = {
456+ let $t01533515385 = idCallerDate(i)
457+ let id = $t01533515385._1
458+ let caller = $t01533515385._2
459+ let date = $t01533515385._3
460+ let isBid = isBidCheck(i, issuer, bidOwner, bidId)
461+ let $t01546515603 = getArtData(issuer, artId, isBid)
462+ let totalNFT = $t01546515603._1
463+ let signID = $t01546515603._2
464+ let artworkName = $t01546515603._3
465+ let amountSold = $t01546515603._4
466+ let artworkPrice = $t01546515603._5
467+ let priceAssetId = $t01546515603._6
468+ let maxCanSell = $t01546515603._7
469+ let $t01560815754 = getBidData(i, caller, issuer, artId, bidOwner, bidId, priceAssetId, artworkPrice, isBid)
470+ let bidDataKey = $t01560815754._1
471+ let amount = $t01560815754._2
472+ let assetId = $t01560815754._3
473+ let $t01575915906 = getCommissionData(issuer, priceAssetId, amount, amountSold, maxCanSell)
474+ let amountForSign = $t01575915906._1
475+ let amountForCreator = $t01575915906._2
476+ let newAmountSold = $t01575915906._3
477+ let $t01591116091 = getIssueData(issuer, artId, signID, artworkName, newAmountSold, maxCanSell, totalNFT, caller, bidOwner, bidId, i)
478+ let issueNFT = $t01591116091._1
479+ let idNFT = $t01591116091._2
480+ let sellStatus = $t01591116091._3
481+ let receiveNFT = $t01591116091._4
482+ let $t01609616195 = getBidKeyVal(assetId, bidDataKey, date)
483+ let assetIdBid = $t01609616195._1
484+ let bidDelOld = $t01609616195._2
485+ let bidUpdate = $t01609616195._3
486+ let soldKey = ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)
487+ let soldValue = if (!(isBid))
488+ then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
489+ else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
490+ let soldData = StringEntry(soldKey, soldValue)
491+ let buyRes = [IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), soldKey), IntegerEntry("total_nft_issued", (totalNFT + 1)), BooleanEntry(keyOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId), ScriptTransfer(receiveNFT, 1, idNFT)]
492+ if (isBid)
493+ then [soldData, bidUpdate, bidDelOld] :: buyRes
494+ else soldData :: buyRes
495+ }
496+
497+
498+@Callable(i)
499+func addArtwork (sha256Hash,signID,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = {
500+ let $t01755517596 = idCallerDate(i)
501+ let artId = $t01755517596._1
502+ let caller = $t01755517596._2
503+ let date = $t01755517596._3
504+ if (!(validateHash(sha256Hash)))
505+ then throw("Hash should be 64 characters maximum")
506+ else {
507+ let $t01769717766 = setLIcence(cidLicence, sha256Licence)
508+ let licenceCID = $t01769717766._1
509+ let licenceHash = $t01769717766._2
510+ let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
511+ if ((validateArtwork != ""))
512+ then throw("Something went wrong!")
513+ else {
514+ let $t01799418036 = validatePayment(i)
515+ let amount = $t01799418036._1
516+ let assetId = $t01799418036._2
517+ if (!(isDefined(amount)))
518+ then throw("Something went wrong")
519+ else {
520+ let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
521+ if ((entryExist != ""))
522+ then throw("You already added it")
523+ else {
524+ let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
525+ if ((hashExist != ""))
526+ then throw("Hash already registered")
527+ else {
528+ let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
529+ if (!(isSignCertified))
530+ then throw("Sign Certificate not found for this address.")
531+ else [StringEntry(keyOwnerByHash(sha256Hash), caller), StringEntry(keyTxidByHashOwner(sha256Hash, caller), artId), IntegerEntry(keyDate(caller, artId), date), StringEntry(keyName(caller, artId), name), StringEntry(keyDesc(caller, artId), description), StringEntry(keyDisplayCid(caller, artId), cidDisplay), StringEntry(keyExportCid(caller, artId), cidExport), StringEntry(keyExportHash(caller, artId), sha256Export), StringEntry(keyLicenceHash(caller, artId), licenceHash), StringEntry(keyLicenceCid(caller, artId), licenceCID), StringEntry(keyType(caller, artId), type), StringEntry(keyTags(caller, artId), tags), IntegerEntry(keyMaxMint(caller, artId), maxmint), StringEntry(keySignID(caller, artId), signID), IntegerEntry(keyIssued(caller, artId), 0), BooleanEntry(keyOnSale(caller, artId), false), StringEntry(keyidBySignid(caller, signID), artId), StringEntry(keyHashByTxidAddr(caller, artId), sha256Hash), ScriptTransfer(Address(fromBase58String(feeReceiver)), amount, assetId)]
532+ }
533+ }
534+ }
535+ }
536+ }
537+ }
351538
352539
353540
354-@Callable(invoke)
541+@Callable(i)
355542 func updateArtwork (txid,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
356543 then throw(maintenanceMSG)
357544 else {
358- let updateId = toBase58String(invoke.transactionId)
359- let caller = toBase58String(invoke.caller.bytes)
360- let $t01472314792 = setLIcence(cidLicence, sha256Licence)
361- let licenceCID = $t01472314792._1
362- let licenceHash = $t01472314792._2
545+ let caller = toBase58String(i.caller.bytes)
546+ let $t02075720826 = setLIcence(cidLicence, sha256Licence)
547+ let licenceCID = $t02075720826._1
548+ let licenceHash = $t02075720826._2
363549 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
364550 if ((validateArtwork != ""))
365551 then throw("Something went wrong!")
366552 else {
367- let entryExist = getStringByKey(keyArtName(caller, txid))
553+ let entryExist = getStringByKey(keyName(caller, txid))
368554 if ((entryExist == ""))
369555 then throw("Entry not found")
370556 else {
371- let flag = getStringByKey(keyArtFlag(caller, txid))
557+ let flag = getStringByKey(keyFlag(caller, txid))
372558 if ((flag == "ILLEGAL"))
373559 then throw("Cannot update ILLEGAL artwork")
374560 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)]
561+ then [StringEntry(keyName(caller, txid), name), StringEntry(keyDesc(caller, txid), description), StringEntry(keyDisplayCid(caller, txid), cidDisplay), StringEntry(keyExportCid(caller, txid), cidExport), StringEntry(keyExportHash(caller, txid), sha256Export), StringEntry(keyLicenceCid(caller, txid), licenceCID), StringEntry(keyLicenceHash(caller, txid), licenceHash), IntegerEntry(keyMaxMint(caller, txid), maxmint), StringEntry(keyTags(caller, txid), tags), StringEntry(keyType(caller, txid), type)]
376562 else throw("Already minted")
377563 }
378564 }
379565 }
380566
381567
382568
383-@Callable(invoke)
569+@Callable(i)
384570 func flagArtwork (artId,addr,flag) = {
385- let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
386- let id = toBase58String(invoke.transactionId)
571+ let $t02229922332 = idCallerDate(i)
572+ let id = $t02229922332._1
573+ let caller = $t02229922332._2
387574 if (containsElement([chris, joep, toString(this)], caller))
388575 then if ((flag == "CONSENT"))
389- then [StringEntry(keyArtFlag(addr, artId), flag)]
576+ then [StringEntry(keyFlag(addr, artId), flag)]
390577 else if ((flag == ""))
391- then [StringEntry(keyArtFlag(addr, artId), flag)]
578+ then [StringEntry(keyFlag(addr, artId), flag)]
392579 else if ((flag == "CHANGE_REQUIRED"))
393- then [StringEntry(keyArtFlag(addr, artId), flag)]
580+ then [StringEntry(keyFlag(addr, artId), flag)]
394581 else if (if ((flag == "ILLEGAL"))
395582 then containsElement([chris, toString(this)], caller)
396583 else false)
397- 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), "")]
584+ then [StringEntry(keyFlag(addr, artId), flag), StringEntry(keyName(addr, artId), "ILLEGAL CONTENT"), StringEntry(keyDesc(addr, artId), "ILLEGAL CONTENT"), StringEntry(keyDisplayCid(addr, artId), ""), StringEntry(keyExportCid(addr, artId), ""), StringEntry(keyLicenceCid(addr, artId), "")]
398585 else throw(("Unknow status " + flag))
399586 else throw("You are not allowed")
400587 }
401588
402589
403590
404-@Callable(invoke)
591+@Callable(i)
405592 func deleteArtwork (artId,addr) = {
406- let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
407- let id = toBase58String(invoke.transactionId)
408- let addressToUse = if (containsElement([chris, joep, toString(this)], caller))
593+ let $t02335123384 = idCallerDate(i)
594+ let id = $t02335123384._1
595+ let caller = $t02335123384._2
596+ let addrToUse = if (containsElement([chris, joep, toString(this)], caller))
409597 then addr
410598 else caller
411- let entryExist = getStringByKey(keyArtName(addressToUse, artId))
599+ let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
412600 if ((entryExist == ""))
413601 then throw("No art matching for this address")
414602 else {
415- let sha256Hash = getStringByKey(keyArtHashByTxidAddr(addressToUse, artId))
603+ let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
416604 if ((sha256Hash == ""))
417605 then throw("No art hash matching for this address")
418606 else {
419- let signID = getStringByKey(keyArtSignID(addressToUse, artId))
607+ let signID = getStringByKey(keySignID(addrToUse, artId))
420608 if ((signID == ""))
421609 then throw("No SIGN ID matching")
422610 else {
423- 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(keyArtPrice(addr, artId)), DeleteEntry(keyArtAssetIdAccepted(addr, artId)), DeleteEntry(keyArtOwnerByHash(sha256Hash)), DeleteEntry(keyArtArtidBySignid(addressToUse, signID)), DeleteEntry(keyArtTxidByHashOwner(sha256Hash, addressToUse))]
424- if (!(isArtMinted(addressToUse, artId)))
611+ let dataToDelete = [DeleteEntry(keyDate(addrToUse, artId)), DeleteEntry(keyName(addrToUse, artId)), DeleteEntry(keyDesc(addrToUse, artId)), DeleteEntry(keyDisplayCid(addrToUse, artId)), DeleteEntry(keyExportCid(addrToUse, artId)), DeleteEntry(keyExportHash(addrToUse, artId)), DeleteEntry(keyLicenceHash(addrToUse, artId)), DeleteEntry(keyLicenceCid(addrToUse, artId)), DeleteEntry(keyType(addrToUse, artId)), DeleteEntry(keyTags(addrToUse, artId)), DeleteEntry(keyMaxMint(addrToUse, artId)), DeleteEntry(keySignID(addrToUse, artId)), DeleteEntry(keyIssued(addrToUse, artId)), DeleteEntry(keyOnSale(addrToUse, artId)), DeleteEntry(keyFlag(addr, artId)), DeleteEntry(keyPrice(addr, artId)), DeleteEntry(keyAssetIdAccepted(addr, artId)), DeleteEntry(keyOwnerByHash(sha256Hash)), DeleteEntry(keyidBySignid(addrToUse, signID)), DeleteEntry(keyTxidByHashOwner(sha256Hash, addrToUse))]
612+ if (!(isArtMinted(addrToUse, artId)))
425613 then if (!(dappRunning))
426614 then throw(maintenanceMSG)
427615 else dataToDelete
428616 else if (containsElement([chris, toString(this)], caller))
429617 then dataToDelete
430618 else throw("Art already minted, you cannot delete it")
431619 }
432620 }
433621 }
434622 }
435623
436624
437625
438-@Callable(invoke)
439-func sellArtwork (artId,price,maxMint,assetId) = if (!(dappRunning))
440- then throw(maintenanceMSG)
441- else {
442- let id = toBase58String(invoke.transactionId)
443- let caller = toBase58String(invoke.caller.bytes)
444- let sellDate = lastBlock.timestamp
445- let artworkName = getStringByKey(keyArtName(caller, artId))
446- if ((artworkName == ""))
447- then throw("This art doesn't match match your account")
448- else {
449- let exportCID = getStringByKey(keyArtExportCid(caller, artId))
450- if ((size(split(exportCID, "/")[0]) != 59))
451- then throw("You cannot sell art with no export file")
452- else {
453- let exportHash = getStringByKey(keyArtExportHash(caller, artId))
454- if ((size(exportHash) != 64))
455- then throw("You cannot sell art with no export hash")
456- else if (!(acceptedAssetIds(assetId)))
457- then throw("Something went wrong!")
458- else if (!(validateMinSell(assetId, price)))
459- then throw("Something went wrong!")
460- else {
461- let checkUser = validateUser(caller)
462- if ((checkUser != ""))
463- then throw(checkUser)
464- else {
465- let amountSold = getIntegerByKey(keyArtIssued(caller, artId))
466- let maxCanSell = getIntegerByKey(keyArtMaxMint(caller, artId))
467- if ((maxMint > 10))
468- then throw("10 editions max per artwork")
469- else if (if ((amountSold != 0))
470- then (amountSold == maxCanSell)
626+@Callable(i)
627+func sellArtwork (artId,price,maxMint,assetId) = {
628+ let $t02575025783 = idCallerDate(i)
629+ let id = $t02575025783._1
630+ let caller = $t02575025783._2
631+ let artworkName = getStringByKey(keyName(caller, artId))
632+ if ((artworkName == ""))
633+ then throw("This art doesn't match your account")
634+ else {
635+ let exportCID = getStringByKey(keyExportCid(caller, artId))
636+ if ((size(split(exportCID, "/")[0]) != 59))
637+ then throw("You cannot sell art with no export file")
638+ else if (!(acceptedAssetIds(assetId)))
639+ then throw("Something went wrong!")
640+ else if (!(validateMinSell(assetId, price)))
641+ then throw("Something went wrong!")
642+ else {
643+ let checkUser = validateUser(caller)
644+ if ((checkUser != ""))
645+ then throw(checkUser)
646+ else {
647+ let amountSold = getIntegerByKey(keyIssued(caller, artId))
648+ let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
649+ if ((maxMint > 10))
650+ then throw("10 editions max per artwork")
651+ else if (if ((amountSold != 0))
652+ then (amountSold == maxCanSell)
653+ else false)
654+ then throw("Max edition reached.")
655+ else if (if ((amountSold > 0))
656+ then (maxCanSell != maxMint)
657+ else false)
658+ then throw("Cannot change maximum issuable anymore")
659+ else {
660+ let sellStatus = if (if ((price > 0))
661+ then (maxMint > 0)
471662 else false)
472- then throw("Max edition reached.")
473- else if (if ((amountSold > 0))
474- then (maxCanSell != maxMint)
475- else false)
476- then throw("Cannot change maximum issuable anymore")
477- else {
478- let sellStatus = if (if ((price > 0))
479- then (maxMint > 0)
480- else false)
481- then true
482- else false
483-[BooleanEntry(keyArtOnSale(caller, artId), sellStatus), IntegerEntry(keyArtPrice(caller, artId), price), IntegerEntry(keyArtMaxMint(caller, artId), maxMint), StringEntry(keyArtAssetIdAccepted(caller, artId), assetId)]
484- }
485- }
486- }
487- }
488- }
489- }
663+ then true
664+ else false
665+[BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), StringEntry(keyAssetIdAccepted(caller, artId), assetId)]
666+ }
667+ }
668+ }
669+ }
670+ }
490671
491672
492673
493-@Callable(invoke)
494-func buyArtwork (artId,issuer) = if (!(dappRunning))
495- then throw(maintenanceMSG)
496- else {
497- let id = toBase58String(invoke.transactionId)
498- let caller = toBase58String(invoke.caller.bytes)
499- let totalNFT = getIntegerByKey("total_nft_issued")
500- let signID = getStringByKey(keyArtSignID(issuer, artId))
501- let artworkName = getStringByKey(keyArtName(issuer, artId))
502- if ((artworkName == ""))
503- then throw("Art doesn't exist")
674+@Callable(i)
675+func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "")
676+
677+
678+
679+@Callable(i)
680+func setBid (artId,issuer) = {
681+ let $t02757927617 = idCallerDate(i)
682+ let id = $t02757927617._1
683+ let caller = $t02757927617._2
684+ let date = $t02757927617._3
685+ let $t02762227658 = isPayment(i)
686+ let payment = $t02762227658._1
687+ let amount = $t02762227658._2
688+ let assetId = if (!(isDefined(payment.assetId)))
689+ then "WAVES"
690+ else toBase58String(value(payment.assetId))
691+ if (!(acceptedAssetIds(assetId)))
692+ then throw("asset not accepted")
693+ else if (!(validateMinSell(assetId, amount)))
694+ then throw("Wrong min sell")
504695 else {
505- let displayCID = getStringByKey(keyArtDisplayCid(issuer, artId))
506- let exportCID = getStringByKey(keyArtExportCid(issuer, artId))
507- let exportHash = getStringByKey(keyArtExportHash(issuer, artId))
508- let licenceCID = getStringByKey(keyArtLicenceCid(issuer, artId))
509- let licenceHash = getStringByKey(keyArtLicenceHash(issuer, artId))
510- let description = take(getStringByKey(keyArtDesc(issuer, artId)), 50)
511- let isOnSale = getBooleanByKey(keyArtOnSale(issuer, artId))
512- let amountSold = getIntegerByKey(keyArtIssued(issuer, artId))
513- let artworkPrice = getIntegerByKey(keyArtPrice(issuer, artId))
514- let priceAssetId = getStringByKey(keyArtAssetIdAccepted(issuer, artId))
515- let sourceHash = getStringByKey(keyArtHashByTxidAddr(issuer, artId))
516- let maxCanSell = getIntegerByKey(keyArtMaxMint(issuer, artId))
517- if (if (if ((0 >= artworkPrice))
518- then true
519- else !(isOnSale))
520- then true
521- else (0 >= maxCanSell))
522- then throw("Art not for sale")
523- else {
524- let $t02323623316 = validatePriceAssetId(invoke, priceAssetId, artworkPrice)
525- let amount = $t02323623316._1
526- let assetId = $t02323623316._2
527- let isWhitelisted = checkWhitelist(issuer)
528- let cut = if ((isWhitelisted > height))
529- then 0
530- else if ((priceAssetId == toBase58String(signAssetId)))
531- then signCut
532- else usdnWaveCut
533- let amountForSign = fraction(amount, cut, 100)
534- let amountForCreator = (amount - amountForSign)
535- if ((amountSold == maxCanSell))
536- then throw("Art sold out")
537- else {
538- let newAmountSold = (amountSold + 1)
539- let entryDate = lastBlock.timestamp
540- let issueMeta = ((((((((((((((((((((((((((("Creator: " + issuer) + ",
541- ArtID: ") + artId) + ",
542- SignID: ") + signID) + ",
543- Artwork name: ") + artworkName) + ",
544- Artwork description: ") + description) + ",
545- Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell)) + ",
546- Max issuable: ") + toString(maxCanSell)) + ",
547- Source hash: ") + sourceHash) + ",
548- Display cid: ") + displayCID) + ",
549- Export cid: ") + exportCID) + ",
550- Export hash: ") + exportHash) + ",
551- Licence cid: ") + licenceCID) + ",
552- Licence hash: ") + licenceHash)
553- let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
554- let idNFT = calculateAssetId(issueNFT)
555- let sellStatus = if ((newAmountSold == maxCanSell))
556- then false
557- else true
558-[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)]
559- }
560- }
696+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
697+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
698+ if ((0 >= maxCanSell))
699+ then throw("No max edition set for this artwork")
700+ else if ((amountSold >= maxCanSell))
701+ then throw("Sold out, you cannot bid")
702+ else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date)))]
561703 }
562- }
704+ }
705+
706+
707+
708+@Callable(i)
709+func acceptBid (artId,issuer,bidId,bidOwner) = {
710+ let caller = toBase58String(i.caller.bytes)
711+ if ((caller != issuer))
712+ then throw("You cannot do this action")
713+ else buyMint(i, artId, issuer, bidId, bidOwner)
714+ }
715+
716+
717+
718+@Callable(i)
719+func cancelBid (artId,issuer,bidId) = {
720+ let $t02869028842 = idCallerDate(i)
721+ let id = $t02869028842._1
722+ let caller = $t02869028842._2
723+ let date = $t02869028842._3
724+ let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + bidId)
725+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
726+ if ((bidData == ""))
727+ then throw("Bid not found")
728+ else {
729+ let bidDataArr = split(bidData, "_")
730+ let assetId = getBidAssetId(bidDataArr[0])
731+ let bidStatus = "CANCELED"
732+[DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), ScriptTransfer(Address(fromBase58String(caller)), parseIntValue(bidDataArr[1]), assetId)]
733+ }
734+ }
563735
564736
565737
566738 @Callable(i)
567739 func deleteEntry (entry) = {
568740 let caller = toString(addressFromPublicKey(i.callerPublicKey))
569741 if ((caller == chris))
570742 then [DeleteEntry(entry)]
571743 else throw("no")
572744 }
573745
574746

github/deemru/w8io/6500d08 
158.69 ms