tx · FZrPqpPbS6bGhqZEy7cBkXRkRjx3Mt44C8eEhF8Wc4mt

3NBquYd5fTq8HRDkagrtNLQ3HmWd7wcZoeL:  -0.01400000 Waves

2021.01.23 07:50 [1365711] smart account 3NBquYd5fTq8HRDkagrtNLQ3HmWd7wcZoeL > SELF 0.00000000 Waves

{ "type": 13, "id": "FZrPqpPbS6bGhqZEy7cBkXRkRjx3Mt44C8eEhF8Wc4mt", "fee": 1400000, "feeAssetId": null, "timestamp": 1611377506508, "version": 2, "chainId": 84, "sender": "3NBquYd5fTq8HRDkagrtNLQ3HmWd7wcZoeL", "senderPublicKey": "7irc2VpK5czoyVdwrCuQqr2JU9ZaZnEZn8RPChnfi3yL", "proofs": [ "srimbxn85YgWdpTEsjqrxxEmhMhyBMYSG8P3KMe8s4UfuhFzPaHAtjhXMgoMx2DyFQwLpi8HNVbsP3JXLqJSXt4" ], "script": "base64:AAIEAAAAAAAAAFcIAhIOCgwICAgICAgBCAgICAgSDQoLCAgICAgBCAgICAgSBQoDCAgIEgQKAggIEgYKBAgBAQgSBAoCCAgSBAoCCAgSBgoECAgICBIGCgQICAgIEgMKAQgAAABDAAAAAAh1bml0VGVzdAcAAAAACW9yYWNsZUZlZQkBAAAABXZhbHVlAAAAAQkABCYAAAABAgAAACMzTjJzNVJ0YUhQQmVuQ3N4MkVDY29GUmJZSHgzbm9aaFhXMQAAAAAIc2lnbkRhcHAJAQAAAAV2YWx1ZQAAAAEJAAQmAAAAAQIAAAAjM05DMjhoU2l2cm1zVFVYYVlEMXg2TDM2Mko0WnBVbm9UZEIAAAAAC2ZlZVJlY2VpdmVyAgAAACMzTjFFNnRYZGRSb1ZhUmZROWRRM3ZnNUxhVzJmc2Q4SEt1YgAAAAAIdXNlckRhcHADBQAAAAh1bml0VGVzdAkBAAAABXZhbHVlAAAAAQkABCYAAAABAgAAACMzTXQ0UkdNRXlqU1dZQW9jVFBxZDU1d2RIUVFCM1BVMlVDbQkBAAAABXZhbHVlAAAAAQkABCYAAAABAgAAACMzTXdEWmFnb1lFaU5mUUxjMzFjR3BZb2FFNTRNR013b0ZyWgAAAAANd2hpdGVsaXN0RGFwcAkBAAAABXZhbHVlAAAAAQkABCYAAAABAgAAACMzTjZCYVYxZENCNHpnNDNnb05OSGFDdHZSMTNCY3lKNUdzcQAAAAALc2lnbkFzc2V0SWQBAAAAIOilarzKd0LycGEyNUpPRYO5uR7lmWcXw3Hq2QuhBK3rAAAAAAt1c2RuQXNzZXRJZAEAAAAgD/IcEqzkxDya7EYaqyWosOy6BytGzG2IcvC14pJJAbQAAAAADHdhdmVzQXNzZXRJZAEAAAAAAAAAAAVjaHJpcwIAAAAjM01zRzZqUE5DclZKVXRZQjdYSkJ4Uzd1dFdzWEFmNG45VnAAAAAABGpvZXACAAAAIzNNem00Vkx3c045dVp3YlRNelBqM1h1eFY2a0VmQVI4VUROAAAAAAdzaWduQ3V0AAAAAAAAAAAHAAAAAAt1c2RuV2F2ZUN1dAAAAAAAAAAACgAAAAAOZGVmYXVsdExpY2VuY2UCAAAAR2JhZnliZWlmdXlvNHBxdTU0aXNtcWd0YjZlNGg2a2t2Z3g3emc0dTN6aWJoMnI3eTZtYjY0aTdienphL2xpY2VuY2UucGRmAAAAABJkZWZhdWx0SGFzaExpY2VuY2UCAAAAQGE4Nzc1OGMzNTRlMzBhOWU3OGZiODRmYTNhMDAxMGE1MDkwYWIyMGRmMGJlMTFhZDQ1YjU3MjBjYzE4N2U2MzkAAAAAC2RhcHBSdW5uaW5nCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGwAAAAIFAAAACHVzZXJEYXBwAgAAABRjb25mX2RhcHBfaXNfcnVubmluZwYAAAAADm1haW50ZW5hbmNlTVNHCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAACHVzZXJEYXBwAgAAABRjb25mX21haW50ZW5hbmNlX21zZwIAAAAAAAAAAA11c2VyU3VzcGVuZGVkAgAAAAlTVVNQRU5ERUQAAAAAC3VzZXJSZW1vdmVkAgAAAAdSRU1PVkVEAAAAABB1c2VyVW5yZWdpc3RlcmVkAgAAAAxVTlJFR0lTVEVSRUQAAAAAC3VzZXJBbGxvd2VkAgAAAAdBTExPV0VEAQAAABdnZXRTdHJpbmdCeUtleUZyb21Vc2VycwAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAACHVzZXJEYXBwBQAAAANrZXkCAAAAAAEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAANrZXkCAAAAAAEAAAAZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQAAAAEAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAJb3JhY2xlRmVlBQAAAANrZXkCAAAAH0ludGVnZXIgdW5kZWZpbmUgb3IgMCBpbiBvcmFjbGUBAAAAD2dldEludGVnZXJCeUtleQAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQAAAAAAAAAAAAEAAAAOY2hlY2tXaGl0ZWxpc3QAAAABAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAA13aGl0ZWxpc3REYXBwBQAAAANrZXkAAAAAAAAAAAABAAAAD2dldEJvb2xlYW5CeUtleQAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGwAAAAIFAAAABHRoaXMFAAAAA2tleQcBAAAAFGNoZWNrU2lnbkNlcnRpZmljYXRlAAAAAwAAAAZzaWduSUQAAAAFT3duZXIAAAAKc2hhMjU2SGFzaAQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAhzaWduRGFwcAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIZGF0YV9mY18FAAAABnNpZ25JRAIAAAABXwUAAAAFT3duZXIDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAMJAQAAAAhjb250YWlucwAAAAIFAAAAAWEFAAAACnNoYTI1Nkhhc2gGBwcBAAAAC3ZhbGlkYXRlQ0lEAAAAAQAAAANjaWQDCQEAAAAIY29udGFpbnMAAAACBQAAAANjaWQCAAAAAS8DAwkAAGYAAAACAAAAAAAAAABMCQABMQAAAAEFAAAAA2NpZAkAAAAAAAACCQABMQAAAAEJAAGRAAAAAgkABLUAAAACBQAAAANjaWQCAAAAAS8AAAAAAAAAAAAAAAAAAAAAADsHCQAAZgAAAAIAAAAAAAAAABAJAAExAAAAAQkAAZEAAAACCQAEtQAAAAIFAAAAA2NpZAIAAAABLwAAAAAAAAAAAQcHAQAAAAx2YWxpZGF0ZUhhc2gAAAABAAAABGhhc2gJAAAAAAAAAgkAATEAAAABBQAAAARoYXNoAAAAAAAAAABAAQAAAA1rZXlVc2VyU3RhdHVzAAAAAQAAAAZjYWxsZXIJAAEsAAAAAgIAAAAMdXNlcl9zdGF0dXNfBQAAAAZjYWxsZXIBAAAAB2tleURhdGUAAAACAAAABmNhbGxlcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAJYXJ0X2RhdGVfBQAAAAVhcnRJZAIAAAABXwUAAAAGY2FsbGVyAQAAAAdrZXlOYW1lAAAAAgAAAAZjYWxsZXIAAAAFYXJ0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACWFydF9uYW1lXwUAAAAFYXJ0SWQCAAAAAV8FAAAABmNhbGxlcgEAAAAHa2V5RGVzYwAAAAIAAAAGY2FsbGVyAAAABWFydElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAlhcnRfZGVzY18FAAAABWFydElkAgAAAAFfBQAAAAZjYWxsZXIBAAAADWtleURpc3BsYXlDaWQAAAACAAAABmNhbGxlcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAQYXJ0X2Rpc3BsYXlfY2lkXwUAAAAFYXJ0SWQCAAAAAV8FAAAABmNhbGxlcgEAAAANa2V5RXhwb3J0SGFzaAAAAAIAAAAGY2FsbGVyAAAABWFydElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABBhcnRfZXhwb3J0X2hhc2hfBQAAAAVhcnRJZAIAAAABXwUAAAAGY2FsbGVyAQAAAAxrZXlFeHBvcnRDaWQAAAACAAAABmNhbGxlcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAPYXJ0X2V4cG9ydF9jaWRfBQAAAAVhcnRJZAIAAAABXwUAAAAGY2FsbGVyAQAAAAprZXlNYXhNaW50AAAAAgAAAAZjYWxsZXIAAAAFYXJ0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAADGFydF9tYXhtaW50XwUAAAAFYXJ0SWQCAAAAAV8FAAAABmNhbGxlcgEAAAAJa2V5U2lnbklEAAAAAgAAAAZjYWxsZXIAAAAFYXJ0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAC2FydF9zaWduaWRfBQAAAAVhcnRJZAIAAAABXwUAAAAGY2FsbGVyAQAAAAlrZXlJc3N1ZWQAAAACAAAABmNhbGxlcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAALYXJ0X2lzc3VlZF8FAAAABWFydElkAgAAAAFfBQAAAAZjYWxsZXIBAAAACWtleU9uU2FsZQAAAAIAAAAGY2FsbGVyAAAABWFydElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAthcnRfb25zYWxlXwUAAAAFYXJ0SWQCAAAAAV8FAAAABmNhbGxlcgEAAAAOa2V5TGljZW5jZUhhc2gAAAACAAAABmNhbGxlcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAARYXJ0X2xpY2VuY2VfaGFzaF8FAAAABWFydElkAgAAAAFfBQAAAAZjYWxsZXIBAAAADWtleUxpY2VuY2VDaWQAAAACAAAABmNhbGxlcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAQYXJ0X2xpY2VuY2VfY2lkXwUAAAAFYXJ0SWQCAAAAAV8FAAAABmNhbGxlcgEAAAAHa2V5VGFncwAAAAIAAAAGY2FsbGVyAAAABWFydElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAlhcnRfdGFnc18FAAAABWFydElkAgAAAAFfBQAAAAZjYWxsZXIBAAAAB2tleVR5cGUAAAACAAAABmNhbGxlcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAJYXJ0X3R5cGVfBQAAAAVhcnRJZAIAAAABXwUAAAAGY2FsbGVyAQAAAAhrZXlQcmljZQAAAAIAAAAGY2FsbGVyAAAABWFydElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAphcnRfcHJpY2VfBQAAAAVhcnRJZAIAAAABXwUAAAAGY2FsbGVyAQAAABJrZXlBc3NldElkQWNjZXB0ZWQAAAACAAAABmNhbGxlcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAASYXJ0X2Fzc2V0QWNjZXB0ZWRfBQAAAAVhcnRJZAIAAAABXwUAAAAGY2FsbGVyAQAAAAdrZXlGbGFnAAAAAgAAAAZjYWxsZXIAAAAFYXJ0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACWFydF9mbGFnXwUAAAAFYXJ0SWQCAAAAAV8FAAAABmNhbGxlcgEAAAARa2V5SGFzaEJ5VHhpZEFkZHIAAAACAAAABmNhbGxlcgAAAAR0eGlkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABNnZXRfaGFzaGJ5dHhpZGFkZHJfBQAAAAR0eGlkAgAAAAFfBQAAAAZjYWxsZXIBAAAADmtleU93bmVyQnlIYXNoAAAAAQAAAApzaGEyNTZIYXNoCQABLAAAAAICAAAAEmdldF9vd25lcl9ieV9oYXNoXwUAAAAKc2hhMjU2SGFzaAEAAAANa2V5aWRCeVNpZ25pZAAAAAIAAAAGY2FsbGVyAAAABnNpZ25JZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAASZ2V0X2FydGlkYnlzaWduaWRfBQAAAAZzaWduSWQCAAAAAV8FAAAABmNhbGxlcgEAAAASa2V5VHhpZEJ5SGFzaE93bmVyAAAAAgAAAApzaGEyNTZIYXNoAAAABmNhbGxlcgkAASwAAAACAgAAABdnZXRfdHhpZF9ieV9oYXNoX293bmVyXwkAAlgAAAABCQALVAAAAAEJAAGbAAAAAQkAASwAAAACBQAAAApzaGEyNTZIYXNoBQAAAAZjYWxsZXIBAAAADnZhbGlkYXRlQWxsQ0lEAAAAAwAAAApjaWREaXNwbGF5AAAACWNpZEV4cG9ydAAAAApjaWRMaWNlbmNlAwkBAAAAASEAAAABCQEAAAALdmFsaWRhdGVDSUQAAAABBQAAAApjaWREaXNwbGF5CQAAAgAAAAECAAAAEVdyb25nIERpc3BsYXkgQ0lEAwkBAAAAASEAAAABCQEAAAALdmFsaWRhdGVDSUQAAAABBQAAAAljaWRFeHBvcnQJAAACAAAAAQIAAAAQV3JvbmcgRXhwb3J0IENJRAMDCQEAAAACIT0AAAACBQAAAApjaWRMaWNlbmNlAgAAAAAJAQAAAAEhAAAAAQkBAAAAC3ZhbGlkYXRlQ0lEAAAAAQUAAAAKY2lkTGljZW5jZQcJAAACAAAAAQIAAAARV3JvbmcgTGljZW5jZSBDSUQGAQAAAA92YWxpZGF0ZUFsbEhhc2gAAAACAAAADHNoYTI1NkV4cG9ydAAAAA1zaGEyNTZMaWNlbmNlAwkBAAAAASEAAAABCQEAAAAMdmFsaWRhdGVIYXNoAAAAAQUAAAAMc2hhMjU2RXhwb3J0CQAAAgAAAAECAAAAGEV4cG9ydCBIYXNoIDY0IGNoYXIuIG1heAMJAQAAAAEhAAAAAQkBAAAADHZhbGlkYXRlSGFzaAAAAAEFAAAADXNoYTI1NkxpY2VuY2UJAAACAAAAAQIAAAAZTGljZW5jZSBIYXNoIDY0IGNoYXIuIG1heAYBAAAADnZhbGlkYXRlU3RyaW5nAAAAAgAAAANzdHIAAAADbWF4AwkAAAAAAAACCQABMQAAAAEFAAAAA3N0cgAAAAAAAAAAAAkAAAIAAAABAgAAABhGaWVsZCBjYW5ub3QgYmUgaXMgZW1wdHkDCQAAZgAAAAIJAAExAAAAAQUAAAADc3RyBQAAAANtYXgJAAACAAAAAQkAASwAAAACBQAAAANzdHICAAAADCBpcyB0b28gbG9uZwYBAAAADHZhbGlkYXRlVXNlcgAAAAEAAAAGY2FsbGVyBAAAAAp1c2VyU3RhdHVzCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAACHVzZXJEYXBwCQEAAAANa2V5VXNlclN0YXR1cwAAAAEFAAAABmNhbGxlcgUAAAAQdXNlclVucmVnaXN0ZXJlZAMDCQAAAAAAAAIFAAAACnVzZXJTdGF0dXMFAAAAEHVzZXJVbnJlZ2lzdGVyZWQGCQAAAAAAAAIFAAAACnVzZXJTdGF0dXMFAAAAC3VzZXJBbGxvd2VkAgAAAC5SZWdpc3RlciB0aGlzIGFjY291bnQgZmlyc3Qgd2l0aCAiQWNjb3VudCIgdGFiAwkAAAAAAAACBQAAAAp1c2VyU3RhdHVzBQAAAA11c2VyU3VzcGVuZGVkAgAAABFBY2NvdW50IHN1c3BlbmRlZAMJAAAAAAAAAgUAAAAKdXNlclN0YXR1cwUAAAALdXNlclJlbW92ZWQCAAAAD0FjY291bnQgcmVtb3ZlZAIAAAAAAQAAAApzZXRMSWNlbmNlAAAAAgAAAApjaWRMaWNlbmNlAAAADXNoYTI1NkxpY2VuY2UEAAAAA2NpZAMJAAAAAAAAAgkAATEAAAABBQAAAApjaWRMaWNlbmNlAAAAAAAAAAAABQAAAA5kZWZhdWx0TGljZW5jZQUAAAAKY2lkTGljZW5jZQQAAAAEaGFzaAMJAAAAAAAAAgkAATEAAAABBQAAAA1zaGEyNTZMaWNlbmNlAAAAAAAAAAAABQAAABJkZWZhdWx0SGFzaExpY2VuY2UFAAAADXNoYTI1NkxpY2VuY2UJAAUUAAAAAgUAAAADY2lkBQAAAARoYXNoAQAAABN2YWxpZGF0ZUFydHdvcmtEYXRhAAAACgAAAAZjYWxsZXIAAAAKY2lkRGlzcGxheQAAAAljaWRFeHBvcnQAAAAKbGljZW5jZUNJRAAAAAxzaGEyNTZFeHBvcnQAAAALbGljZW5jZUhhc2gAAAAEbmFtZQAAAAtk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SUQIBQAAAA0kdDAxNTkzNjE2MDA1AAAAAl8xBAAAAAtsaWNlbmNlSGFzaAgFAAAADSR0MDE1OTM2MTYwMDUAAAACXzIEAAAAD3ZhbGlkYXRlQXJ0d29yawkBAAAAE3ZhbGlkYXRlQXJ0d29ya0RhdGEAAAAKBQAAAAZjYWxsZXIFAAAACmNpZERpc3BsYXkFAAAACWNpZEV4cG9ydAUAAAAKbGljZW5jZUNJRAUAAAAMc2hhMjU2RXhwb3J0BQAAAAtsaWNlbmNlSGFzaAUAAAAEbmFtZQUAAAALZGVzY3JpcHRpb24FAAAABHRhZ3MFAAAAB21heG1pbnQDCQEAAAACIT0AAAACBQAAAA92YWxpZGF0ZUFydHdvcmsCAAAAAAkAAAIAAAABAgAAABVTb21ldGhpbmcgd2VudCB3cm9uZyEEAAAADSR0MDE2MjMzMTYyNzUJAQAAAA92YWxpZGF0ZVBheW1lbnQAAAABBQAAAAFpBAAAAAZhbW91bnQIBQAAAA0kdDAxNjIzMzE2Mjc1AAAAAl8xBAAAAAdhc3NldElkCAUAAAANJHQwMTYyMzMxNjI3NQAAAAJfMgMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEFAAAABmFtb3VudAkAAAIAAAABAgAAABRTb21ldGhpbmcgd2VudCB3cm9uZwQAAAAKZW50cnlFeGlzdAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAEmtleVR4aWRCeUhhc2hPd25lcgAAAAIFAAAACnNoYTI1Nkhhc2gFAAAABmNhbGxlcgMJAQAAAAIhPQAAAAIFAAAACmVudHJ5RXhpc3QCAAAAAAkAAAIAAAABAgAAABRZb3UgYWxyZWFkeSBhZGRlZCBpdAQAAAAJaGFzaEV4aXN0CQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAOa2V5T3duZXJCeUhhc2gAAAABBQAAAApzaGEyNTZIYXNoAwkBAAAAAiE9AAAAAgUAAAAJaGFzaEV4aXN0AgAAAAAJAAACAAAAAQIAAAAXSGFzaCBhbHJlYWR5IHJlZ2lzdGVyZWQEAAAAD2lzU2lnbkNlcnRpZmllZAkBAAAAFGNoZWNrU2lnbkNlcnRpZmljYXRlAAAAAwUAAAAGc2lnbklEBQAAAAZjYWxsZXIFAAAA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YTI1NkV4cG9ydAAAAAljaWRFeHBvcnQAAAANc2hhMjU2TGljZW5jZQAAAApjaWRMaWNlbmNlAwkBAAAAASEAAAABBQAAAAtkYXBwUnVubmluZwkAAAIAAAABBQAAAA5tYWludGVuYW5jZU1TRwQAAAAGY2FsbGVyCQACWAAAAAEICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMEAAAADSR0MDE4OTk2MTkwNjUJAQAAAApzZXRMSWNlbmNlAAAAAgUAAAAKY2lkTGljZW5jZQUAAAANc2hhMjU2TGljZW5jZQQAAAAKbGljZW5jZUNJRAgFAAAADSR0MDE4OTk2MTkwNjUAAAACXzEEAAAAC2xpY2VuY2VIYXNoCAUAAAANJHQwMTg5OTYxOTA2NQAAAAJfMgQAAAAPdmFsaWRhdGVBcnR3b3JrCQEAAAATdmFsaWRhdGVBcnR3b3JrRGF0YQAAAAoFAAAABmNhbGxlcgUAAAAKY2lkRGlzcGxheQUAAAAJY2lkRXhwb3J0BQAAAApsaWNlbmNlQ0lEBQAAAAxzaGEyNTZFeHBvcnQFAAAAC2xpY2VuY2VIYXNoBQAAAARuYW1lBQAAAAtkZXNjcmlwdGlvbgUAAAAEdGFncwUAAAAHbWF4bWludAMJAQAAAAIhPQAAAAIFAAAAD3ZhbGlkYXRlQXJ0d29yawIAAAAACQAAAgAAAAECAAAAFVNvbWV0aGluZyB3ZW50IHdyb25nIQQAAAAKZW50cnlFeGlzdAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAB2tleU5hbWUAAAACBQAAAAZjYWxsZXIFAAAABHR4aWQDCQAAAAAAAAIFAAAACmVudHJ5RXhpc3QCAAAAAAkAAAIAAAABAgAAAA9FbnRyeSBub3QgZm91bmQEAAAABGZsYWcJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAAdrZXlGbGFnAAAAAgUAAAAGY2FsbGVyBQAAAAR0eGlkAwkAAAAAAAACBQAAAARmbGFnAgAAAAdJTExFR0FMCQAAAgAAAAECAAAAHUNhbm5vdCB1cGRhdGUgSUxMRUdBTCBhcnR3b3JrAwkBAAAAASEAAAABCQEAAAALaXNBcnRNaW50ZWQAAAACBQAAAAZjYWxsZXIFAAAABHR4aWQJAARMAAAAAgkB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", "height": 1365711, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: BE178mNRfBW1KcafUULrLaR1BWR5KMfyAiwjH4KAtRrn Next: 29wJxFYtqMHQ8PCwGB5WhFMc4NTJAN7G3JeJQPsG9nPE Diff:
OldNewDifferences
8888 func keyUserStatus (caller) = ("user_status_" + caller)
8989
9090
91-func keyArtDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
91+func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
9292
9393
94-func keyArtName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
94+func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
9595
9696
97-func keyArtDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
97+func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
9898
9999
100-func keyArtDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
100+func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
101101
102102
103-func keyArtExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
103+func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
104104
105105
106-func keyArtExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
106+func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
107107
108108
109-func keyArtMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
109+func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
110110
111111
112-func keyArtSignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
112+func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
113113
114114
115-func keyArtIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
115+func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
116116
117117
118-func keyArtOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
118+func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
119119
120120
121-func keyArtLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
121+func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
122122
123123
124-func keyArtLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
124+func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
125125
126126
127-func keyArtTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
127+func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
128128
129129
130-func keyArtType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
130+func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
131131
132132
133-func keyArtPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
133+func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
134134
135135
136-func keyArtAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
136+func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
137137
138138
139-func keyArtFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
139+func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
140140
141141
142-func keyArtHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
142+func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
143143
144144
145-func keyArtOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
145+func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
146146
147147
148-func keyArtArtidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
148+func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
149149
150150
151-func keyArtTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
151+func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
152152
153153
154154 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
223223 }
224224
225225
226-func validatePayment (invoke) = if ((size(invoke.payments) == 0))
226+func isPayment (i) = if ((size(i.payments) == 0))
227227 then throw("No payment attached")
228228 else {
229- let payment = value(invoke.payments[0])
229+ let payment = value(i.payments[0])
230230 let amount = value(payment.amount)
231- let assetId = if (if (isDefined(payment.assetId))
232- then (payment.assetId == signAssetId)
233- else false)
234- then payment.assetId
235- else throw("Only SIGN token accepted as transaction fee")
236- let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
237- if ((amount != currentCertificationPrice))
238- then throw(("Payment amount should be " + toString(currentCertificationPrice)))
239- else $Tuple2(amount, assetId)
231+ $Tuple2(payment, amount)
240232 }
241233
242234
243-func isArtMinted (addressToUse,artId) = match getInteger(this, keyArtIssued(addressToUse, artId)) {
235+func validatePayment (i) = {
236+ let $t089038939 = isPayment(i)
237+ let payment = $t089038939._1
238+ let amount = $t089038939._2
239+ let assetId = if (if (isDefined(payment.assetId))
240+ then (payment.assetId == signAssetId)
241+ else false)
242+ then payment.assetId
243+ else throw("Only SIGN token accepted as transaction fee")
244+ let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
245+ if ((amount != currentCertificationPrice))
246+ then throw(("Payment amount should be " + toString(currentCertificationPrice)))
247+ else $Tuple2(amount, assetId)
248+ }
249+
250+
251+func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
244252 case b: Int =>
245253 if ((b != 0))
246254 then true
250258 }
251259
252260
253-func validatePriceAssetId (invoke,priceAssetId,artworkPrice) = {
254- let payment = value(invoke.payments[0])
255- let amount = value(payment.amount)
261+func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
262+ let $t096399675 = isPayment(i)
263+ let payment = $t096399675._1
264+ let amount = $t096399675._2
256265 let assetId = if (!(isDefined(payment.assetId)))
257266 then unit
258267 else if (if ((size(priceAssetId) > 0))
326335 }
327336
328337
329-func buyMint (invoke,artId,issuer,bidId,bidOwner) = {
330- let id = toBase58String(invoke.transactionId)
331- let caller = toBase58String(invoke.caller.bytes)
338+func idCallerDate (i) = if (!(dappRunning))
339+ then throw(maintenanceMSG)
340+ else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
341+
342+
343+func buyMint (i,artId,issuer,bidId,bidOwner) = {
344+ let $t01175411792 = idCallerDate(i)
345+ let id = $t01175411792._1
346+ let caller = $t01175411792._2
347+ let date = $t01175411792._3
332348 let totalNFT = getIntegerByKey("total_nft_issued")
333- let signID = getStringByKey(keyArtSignID(issuer, artId))
334- let artworkName = getStringByKey(keyArtName(issuer, artId))
349+ let signID = getStringByKey(keySignID(issuer, artId))
350+ let artworkName = getStringByKey(keyName(issuer, artId))
335351 if ((artworkName == ""))
336352 then throw("Art doesn't exist")
337353 else {
338- let displayCID = getStringByKey(keyArtDisplayCid(issuer, artId))
339- let exportCID = getStringByKey(keyArtExportCid(issuer, artId))
340- let exportHash = getStringByKey(keyArtExportHash(issuer, artId))
341- let licenceCID = getStringByKey(keyArtLicenceCid(issuer, artId))
342- let licenceHash = getStringByKey(keyArtLicenceHash(issuer, artId))
343- let description = take(getStringByKey(keyArtDesc(issuer, artId)), 50)
344- let isOnSale = getBooleanByKey(keyArtOnSale(issuer, artId))
345- let amountSold = getIntegerByKey(keyArtIssued(issuer, artId))
346- let artworkPrice = getIntegerByKey(keyArtPrice(issuer, artId))
347- let priceAssetId = getStringByKey(keyArtAssetIdAccepted(issuer, artId))
348- let sourceHash = getStringByKey(keyArtHashByTxidAddr(issuer, artId))
349- let maxCanSell = getIntegerByKey(keyArtMaxMint(issuer, artId))
354+ let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
355+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
356+ let artworkPrice = getIntegerByKey(keyPrice(issuer, artId))
357+ let priceAssetId = getStringByKey(keyAssetIdAccepted(issuer, artId))
358+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
350359 let isBid = if (if (if ((caller == issuer))
351360 then (bidOwner != "")
352361 else false)
362371 else (0 >= maxCanSell))
363372 then throw("Art not for sale")
364373 else {
365- let $t01307313207 = if (isBid)
374+ let $t01263912768 = if (isBid)
366375 then getPriceAssetIdFromBid(bidDataKey)
367- else validatePriceAssetId(invoke, priceAssetId, artworkPrice)
368- let amount = $t01307313207._1
369- let assetId = $t01307313207._2
376+ else validatePriceAssetId(i, priceAssetId, artworkPrice)
377+ let amount = $t01263912768._1
378+ let assetId = $t01263912768._2
370379 let isWhitelisted = checkWhitelist(issuer)
371380 let cut = if ((isWhitelisted > height))
372381 then 0
379388 then throw("Art sold out")
380389 else {
381390 let newAmountSold = (amountSold + 1)
382- let entryDate = toString(lastBlock.timestamp)
383- let issueMeta = ((((((((((((((((((((((((((("Creator: " + issuer) + ",
391+ let issueMeta = ((((((((((("Creator: " + issuer) + ",
384392 ArtID: ") + artId) + ",
385393 SignID: ") + signID) + ",
386394 Artwork name: ") + artworkName) + ",
387- Artwork description: ") + description) + ",
388- Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell)) + ",
389- Max issuable: ") + toString(maxCanSell)) + ",
390- Source hash: ") + sourceHash) + ",
391- Display cid: ") + displayCID) + ",
392- Export cid: ") + exportCID) + ",
393- Export hash: ") + exportHash) + ",
394- Licence cid: ") + licenceCID) + ",
395- Licence hash: ") + licenceHash)
395+ Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
396396 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
397397 let idNFT = calculateAssetId(issueNFT)
398398 let sellStatus = if ((newAmountSold == maxCanSell))
404404 then (bidId != "")
405405 else false)
406406 then addressFromStringValue(bidOwner)
407- else invoke.caller
408- let buyRes = [IntegerEntry(keyArtIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)), 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(receiveNFT, 1, idNFT)]
407+ else i.caller
408+ let buyRes = [IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)), 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)]
409409 let assetIdBid = if (!(isDefined(assetId)))
410410 then "WAVES"
411411 else toBase58String(value(assetId))
412412 let getBidData = getStringByKey((bidDataKey + "_OPEN"))
413413 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
414- let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((getBidData + "_") + entryDate))
414+ let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((getBidData + "_") + toString(date)))
415415 let soldValue = if (!(isBid))
416- then ((((((((((caller + "_") + entryDate) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
417- else ((((((((((toString(receiveNFT) + "_") + entryDate) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
416+ then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
417+ else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
418418 let soldData = StringEntry(((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer), soldValue)
419419 if (isBid)
420420 then [soldData, bidUpdate, bidDelOld] :: buyRes
425425 }
426426
427427
428-@Callable(invoke)
429-func addArtwork (sha256Hash,signID,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
430- then throw(maintenanceMSG)
431- else {
432- let artId = toBase58String(invoke.transactionId)
433- let timestamp = lastBlock.timestamp
434- let caller = toBase58String(invoke.caller.bytes)
435- if (!(validateHash(sha256Hash)))
436- then throw("Hash should be 64 characters maximum")
437- else {
438- let $t01707417143 = setLIcence(cidLicence, sha256Licence)
439- let licenceCID = $t01707417143._1
440- let licenceHash = $t01707417143._2
441- let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
442- if ((validateArtwork != ""))
443- then throw("Something went wrong!")
444- else {
445- let $t01737117418 = validatePayment(invoke)
446- let amount = $t01737117418._1
447- let assetId = $t01737117418._2
448- if (!(isDefined(amount)))
449- then throw("Something went wrong")
450- else {
451- let entryExist = getStringByKey(keyArtTxidByHashOwner(sha256Hash, caller))
452- if ((entryExist != ""))
453- then throw("You already added it")
454- else {
455- let hashExist = getStringByKey(keyArtOwnerByHash(sha256Hash))
456- if ((hashExist != ""))
457- then throw("Hash already registered")
458- else {
459- let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
460- if (!(isSignCertified))
461- then throw("Sign Certificate not found for this address.")
462- 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)]
463- }
464- }
465- }
466- }
467- }
468- }
428+@Callable(i)
429+func addArtwork (sha256Hash,signID,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = {
430+ let $t01579415835 = idCallerDate(i)
431+ let artId = $t01579415835._1
432+ let caller = $t01579415835._2
433+ let date = $t01579415835._3
434+ if (!(validateHash(sha256Hash)))
435+ then throw("Hash should be 64 characters maximum")
436+ else {
437+ let $t01593616005 = setLIcence(cidLicence, sha256Licence)
438+ let licenceCID = $t01593616005._1
439+ let licenceHash = $t01593616005._2
440+ let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
441+ if ((validateArtwork != ""))
442+ then throw("Something went wrong!")
443+ else {
444+ let $t01623316275 = validatePayment(i)
445+ let amount = $t01623316275._1
446+ let assetId = $t01623316275._2
447+ if (!(isDefined(amount)))
448+ then throw("Something went wrong")
449+ else {
450+ let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
451+ if ((entryExist != ""))
452+ then throw("You already added it")
453+ else {
454+ let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
455+ if ((hashExist != ""))
456+ then throw("Hash already registered")
457+ else {
458+ let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
459+ if (!(isSignCertified))
460+ then throw("Sign Certificate not found for this address.")
461+ 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)]
462+ }
463+ }
464+ }
465+ }
466+ }
467+ }
469468
470469
471470
472-@Callable(invoke)
471+@Callable(i)
473472 func updateArtwork (txid,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
474473 then throw(maintenanceMSG)
475474 else {
476- let updateId = toBase58String(invoke.transactionId)
477- let caller = toBase58String(invoke.caller.bytes)
478- let $t02027320342 = setLIcence(cidLicence, sha256Licence)
479- let licenceCID = $t02027320342._1
480- let licenceHash = $t02027320342._2
475+ let caller = toBase58String(i.caller.bytes)
476+ let $t01899619065 = setLIcence(cidLicence, sha256Licence)
477+ let licenceCID = $t01899619065._1
478+ let licenceHash = $t01899619065._2
481479 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
482480 if ((validateArtwork != ""))
483481 then throw("Something went wrong!")
484482 else {
485- let entryExist = getStringByKey(keyArtName(caller, txid))
483+ let entryExist = getStringByKey(keyName(caller, txid))
486484 if ((entryExist == ""))
487485 then throw("Entry not found")
488486 else {
489- let flag = getStringByKey(keyArtFlag(caller, txid))
487+ let flag = getStringByKey(keyFlag(caller, txid))
490488 if ((flag == "ILLEGAL"))
491489 then throw("Cannot update ILLEGAL artwork")
492490 else if (!(isArtMinted(caller, txid)))
493- 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)]
491+ 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)]
494492 else throw("Already minted")
495493 }
496494 }
498496
499497
500498
501-@Callable(invoke)
499+@Callable(i)
502500 func flagArtwork (artId,addr,flag) = {
503- let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
504- let id = toBase58String(invoke.transactionId)
501+ let $t02053820571 = idCallerDate(i)
502+ let id = $t02053820571._1
503+ let caller = $t02053820571._2
505504 if (containsElement([chris, joep, toString(this)], caller))
506505 then if ((flag == "CONSENT"))
507- then [StringEntry(keyArtFlag(addr, artId), flag)]
506+ then [StringEntry(keyFlag(addr, artId), flag)]
508507 else if ((flag == ""))
509- then [StringEntry(keyArtFlag(addr, artId), flag)]
508+ then [StringEntry(keyFlag(addr, artId), flag)]
510509 else if ((flag == "ILLEGAL"))
511- 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), "")]
510+ 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), "")]
512511 else throw(("Unknow status " + flag))
513512 else throw("You are not allowed")
514513 }
515514
516515
517516
518-@Callable(invoke)
517+@Callable(i)
519518 func deleteArtwork (artId,addr) = {
520- let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
521- let id = toBase58String(invoke.transactionId)
522- let addressToUse = if (containsElement([chris, joep, toString(this)], caller))
519+ let $t02141921452 = idCallerDate(i)
520+ let id = $t02141921452._1
521+ let caller = $t02141921452._2
522+ let addrToUse = if (containsElement([chris, joep, toString(this)], caller))
523523 then addr
524524 else caller
525- let entryExist = getStringByKey(keyArtName(addressToUse, artId))
525+ let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
526526 if ((entryExist == ""))
527527 then throw("No art matching for this address")
528528 else {
529- let sha256Hash = getStringByKey(keyArtHashByTxidAddr(addressToUse, artId))
529+ let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
530530 if ((sha256Hash == ""))
531531 then throw("No art hash matching for this address")
532532 else {
533- let signID = getStringByKey(keyArtSignID(addressToUse, artId))
533+ let signID = getStringByKey(keySignID(addrToUse, artId))
534534 if ((signID == ""))
535535 then throw("No SIGN ID matching")
536536 else {
537- 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))]
538- if (!(isArtMinted(addressToUse, artId)))
537+ 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))]
538+ if (!(isArtMinted(addrToUse, artId)))
539539 then if (!(dappRunning))
540540 then throw(maintenanceMSG)
541541 else dataToDelete
549549
550550
551551
552-@Callable(invoke)
553-func sellArtwork (artId,price,maxMint,assetId) = if (!(dappRunning))
554- then throw(maintenanceMSG)
555- else {
556- let id = toBase58String(invoke.transactionId)
557- let caller = toBase58String(invoke.caller.bytes)
558- let sellDate = lastBlock.timestamp
559- let artworkName = getStringByKey(keyArtName(caller, artId))
560- if ((artworkName == ""))
561- then throw("This art doesn't match match your account")
562- else {
563- let exportCID = getStringByKey(keyArtExportCid(caller, artId))
564- if ((size(split(exportCID, "/")[0]) != 59))
565- then throw("You cannot sell art with no export file")
566- else {
567- let exportHash = getStringByKey(keyArtExportHash(caller, artId))
568- if ((size(exportHash) != 64))
569- then throw("You cannot sell art with no export hash")
570- else if (!(acceptedAssetIds(assetId)))
571- then throw("Something went wrong!")
572- else if (!(validateMinSell(assetId, price)))
573- then throw("Something went wrong!")
574- else {
575- let checkUser = validateUser(caller)
576- if ((checkUser != ""))
577- then throw(checkUser)
578- else {
579- let amountSold = getIntegerByKey(keyArtIssued(caller, artId))
580- let maxCanSell = getIntegerByKey(keyArtMaxMint(caller, artId))
581- if ((maxMint > 10))
582- then throw("10 editions max per artwork")
583- else if (if ((amountSold != 0))
584- then (amountSold == maxCanSell)
552+@Callable(i)
553+func sellArtwork (artId,price,maxMint,assetId) = {
554+ let $t02381823851 = idCallerDate(i)
555+ let id = $t02381823851._1
556+ let caller = $t02381823851._2
557+ let artworkName = getStringByKey(keyName(caller, artId))
558+ if ((artworkName == ""))
559+ then throw("This art doesn't match your account")
560+ else {
561+ let exportCID = getStringByKey(keyExportCid(caller, artId))
562+ if ((size(split(exportCID, "/")[0]) != 59))
563+ then throw("You cannot sell art with no export file")
564+ else if (!(acceptedAssetIds(assetId)))
565+ then throw("Something went wrong!")
566+ else if (!(validateMinSell(assetId, price)))
567+ then throw("Something went wrong!")
568+ else {
569+ let checkUser = validateUser(caller)
570+ if ((checkUser != ""))
571+ then throw(checkUser)
572+ else {
573+ let amountSold = getIntegerByKey(keyIssued(caller, artId))
574+ let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
575+ if ((maxMint > 10))
576+ then throw("10 editions max per artwork")
577+ else if (if ((amountSold != 0))
578+ then (amountSold == maxCanSell)
579+ else false)
580+ then throw("Max edition reached.")
581+ else if (if ((amountSold > 0))
582+ then (maxCanSell != maxMint)
583+ else false)
584+ then throw("Cannot change maximum issuable anymore")
585+ else {
586+ let sellStatus = if (if ((price > 0))
587+ then (maxMint > 0)
585588 else false)
586- then throw("Max edition reached.")
587- else if (if ((amountSold > 0))
588- then (maxCanSell != maxMint)
589- else false)
590- then throw("Cannot change maximum issuable anymore")
591- else {
592- let sellStatus = if (if ((price > 0))
593- then (maxMint > 0)
594- else false)
595- then true
596- else false
597-[BooleanEntry(keyArtOnSale(caller, artId), sellStatus), IntegerEntry(keyArtPrice(caller, artId), price), IntegerEntry(keyArtMaxMint(caller, artId), maxMint), StringEntry(keyArtAssetIdAccepted(caller, artId), assetId)]
598- }
599- }
600- }
601- }
602- }
603- }
589+ then true
590+ else false
591+[BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), StringEntry(keyAssetIdAccepted(caller, artId), assetId)]
592+ }
593+ }
594+ }
595+ }
596+ }
604597
605598
606599
607-@Callable(invoke)
608-func buyArtwork (artId,issuer) = if (!(dappRunning))
609- then throw(maintenanceMSG)
610- else buyMint(invoke, artId, issuer, "", "")
600+@Callable(i)
601+func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "")
611602
612603
613604
614-@Callable(invoke)
615-func setBid (artId,issuer) = if (!(dappRunning))
616- then throw(maintenanceMSG)
617- else {
618- let id = toBase58String(invoke.transactionId)
619- let caller = toBase58String(invoke.caller.bytes)
620- let timestamp = lastBlock.timestamp
621- if ((size(invoke.payments) == 0))
622- then throw("No payment attached")
605+@Callable(i)
606+func setBid (artId,issuer) = {
607+ let $t02564725685 = idCallerDate(i)
608+ let id = $t02564725685._1
609+ let caller = $t02564725685._2
610+ let date = $t02564725685._3
611+ let $t02569025726 = isPayment(i)
612+ let payment = $t02569025726._1
613+ let amount = $t02569025726._2
614+ let assetId = if (!(isDefined(payment.assetId)))
615+ then "WAVES"
616+ else toBase58String(value(payment.assetId))
617+ if (!(acceptedAssetIds(assetId)))
618+ then throw("Something went wrong!")
619+ else if (!(validateMinSell(assetId, amount)))
620+ then throw("Something went wrong!")
623621 else {
624- let payment = value(invoke.payments[0])
625- let amount = value(payment.amount)
626- let assetId = if (!(isDefined(payment.assetId)))
627- then "WAVES"
628- else toBase58String(value(payment.assetId))
629- let amountSold = getIntegerByKey(keyArtIssued(issuer, artId))
630- let maxCanSell = getIntegerByKey(keyArtMaxMint(issuer, artId))
622+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
623+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
631624 if ((amountSold >= maxCanSell))
632625 then throw("Sold out, you cannot bid")
633- else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(timestamp)))]
626+ else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date)))]
634627 }
635- }
628+ }
636629
637630
638631
639-@Callable(invoke)
640-func acceptBid (artId,issuer,bidId,bidOwner) = if (!(dappRunning))
641- then throw(maintenanceMSG)
642- else {
643- let caller = toBase58String(invoke.caller.bytes)
644- if ((caller != issuer))
645- then throw("You cannot do this action")
646- else buyMint(invoke, artId, issuer, bidId, bidOwner)
647- }
632+@Callable(i)
633+func acceptBid (artId,issuer,bidId,bidOwner) = {
634+ let caller = toBase58String(i.caller.bytes)
635+ if ((caller != issuer))
636+ then throw("You cannot do this action")
637+ else buyMint(i, artId, issuer, bidId, bidOwner)
638+ }
648639
649640
650641
651-@Callable(invoke)
642+@Callable(i)
652643 func cancelBid (artId,issuer,bidId,bidOwner) = {
653- let id = toBase58String(invoke.transactionId)
654- let caller = toBase58String(invoke.caller.bytes)
655- let date = toString(lastBlock.timestamp)
644+ let $t02680926847 = idCallerDate(i)
645+ let id = $t02680926847._1
646+ let caller = $t02680926847._2
647+ let date = $t02680926847._3
656648 if ((caller != bidOwner))
657649 then throw("You cannot do this action")
658650 else {
665657 let assetId = if ((bidDataArr[0] == "WAVES"))
666658 then unit
667659 else fromBase58String(bidDataArr[0])
668-[DeleteEntry((bidDataKey + "_OPEN")), StringEntry((bidDataKey + "_CANCELED"), ((bidData + "_") + date)), ScriptTransfer(Address(fromBase58String(caller)), parseIntValue(bidDataArr[1]), assetId)]
660+[DeleteEntry((bidDataKey + "_OPEN")), StringEntry((bidDataKey + "_CANCELED"), ((bidData + "_") + toString(date))), ScriptTransfer(Address(fromBase58String(caller)), parseIntValue(bidDataArr[1]), assetId)]
669661 }
670662 }
671663 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let unitTest = false
55
66 let oracleFee = value(addressFromString("3N2s5RtaHPBenCsx2ECcoFRbYHx3noZhXW1"))
77
88 let signDapp = value(addressFromString("3NC28hSivrmsTUXaYD1x6L362J4ZpUnoTdB"))
99
1010 let feeReceiver = "3N1E6tXddRoVaRfQ9dQ3vg5LaW2fsd8HKub"
1111
1212 let userDapp = if (unitTest)
1313 then value(addressFromString("3Mt4RGMEyjSWYAocTPqd55wdHQQB3PU2UCm"))
1414 else value(addressFromString("3MwDZagoYEiNfQLc31cGpYoaE54MGMwoFrZ"))
1515
1616 let whitelistDapp = value(addressFromString("3N6BaV1dCB4zg43goNNHaCtvR13BcyJ5Gsq"))
1717
1818 let signAssetId = base58'Gf9t8FA4H3ssoZPCwrg3KwUFCci8zuUFP9ssRsUY3s6a'
1919
2020 let usdnAssetId = base58'25FEqEjRkqK6yCkiT7Lz6SAYz7gUFCtxfCChnrVFD5AT'
2121
2222 let wavesAssetId = base58''
2323
2424 let chris = "3MsG6jPNCrVJUtYB7XJBxS7utWsXAf4n9Vp"
2525
2626 let joep = "3Mzm4VLwsN9uZwbTMzPj3XuxV6kEfAR8UDN"
2727
2828 let signCut = 7
2929
3030 let usdnWaveCut = 10
3131
3232 let defaultLicence = "bafybeifuyo4pqu54ismqgtb6e4h6kkvgx7zg4u3zibh2r7y6mb64i7bzza/licence.pdf"
3333
3434 let defaultHashLicence = "a87758c354e30a9e78fb84fa3a0010a5090ab20df0be11ad45b5720cc187e639"
3535
3636 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
3737
3838 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
3939
4040 let userSuspended = "SUSPENDED"
4141
4242 let userRemoved = "REMOVED"
4343
4444 let userUnregistered = "UNREGISTERED"
4545
4646 let userAllowed = "ALLOWED"
4747
4848 func getStringByKeyFromUsers (key) = valueOrElse(getString(userDapp, key), "")
4949
5050
5151 func getStringByKey (key) = valueOrElse(getString(this, key), "")
5252
5353
5454 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
5555
5656
5757 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
5858
5959
6060 func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
6161
6262
6363 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
6464
6565
6666 func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signDapp, ((("data_fc_" + signID) + "_") + Owner)) {
6767 case a: String =>
6868 if (contains(a, sha256Hash))
6969 then true
7070 else false
7171 case _ =>
7272 false
7373 }
7474
7575
7676 func validateCID (cid) = if (contains(cid, "/"))
7777 then if (if ((76 > size(cid)))
7878 then (size(split(cid, "/")[0]) == 59)
7979 else false)
8080 then (16 > size(split(cid, "/")[1]))
8181 else false
8282 else false
8383
8484
8585 func validateHash (hash) = (size(hash) == 64)
8686
8787
8888 func keyUserStatus (caller) = ("user_status_" + caller)
8989
9090
91-func keyArtDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
91+func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
9292
9393
94-func keyArtName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
94+func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
9595
9696
97-func keyArtDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
97+func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
9898
9999
100-func keyArtDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
100+func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
101101
102102
103-func keyArtExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
103+func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
104104
105105
106-func keyArtExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
106+func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
107107
108108
109-func keyArtMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
109+func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
110110
111111
112-func keyArtSignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
112+func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
113113
114114
115-func keyArtIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
115+func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
116116
117117
118-func keyArtOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
118+func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
119119
120120
121-func keyArtLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
121+func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
122122
123123
124-func keyArtLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
124+func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
125125
126126
127-func keyArtTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
127+func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
128128
129129
130-func keyArtType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
130+func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
131131
132132
133-func keyArtPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
133+func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
134134
135135
136-func keyArtAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
136+func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
137137
138138
139-func keyArtFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
139+func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
140140
141141
142-func keyArtHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
142+func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
143143
144144
145-func keyArtOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
145+func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
146146
147147
148-func keyArtArtidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
148+func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
149149
150150
151-func keyArtTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
151+func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
152152
153153
154154 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
155155 then throw("Wrong Display CID")
156156 else if (!(validateCID(cidExport)))
157157 then throw("Wrong Export CID")
158158 else if (if ((cidLicence != ""))
159159 then !(validateCID(cidLicence))
160160 else false)
161161 then throw("Wrong Licence CID")
162162 else true
163163
164164
165165 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
166166 then throw("Export Hash 64 char. max")
167167 else if (!(validateHash(sha256Licence)))
168168 then throw("Licence Hash 64 char. max")
169169 else true
170170
171171
172172 func validateString (str,max) = if ((size(str) == 0))
173173 then throw("Field cannot be is empty")
174174 else if ((size(str) > max))
175175 then throw((str + " is too long"))
176176 else true
177177
178178
179179 func validateUser (caller) = {
180180 let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
181181 if (if ((userStatus == userUnregistered))
182182 then true
183183 else (userStatus == userAllowed))
184184 then "Register this account first with \"Account\" tab"
185185 else if ((userStatus == userSuspended))
186186 then "Account suspended"
187187 else if ((userStatus == userRemoved))
188188 then "Account removed"
189189 else ""
190190 }
191191
192192
193193 func setLIcence (cidLicence,sha256Licence) = {
194194 let cid = if ((size(cidLicence) == 0))
195195 then defaultLicence
196196 else cidLicence
197197 let hash = if ((size(sha256Licence) == 0))
198198 then defaultHashLicence
199199 else sha256Licence
200200 $Tuple2(cid, hash)
201201 }
202202
203203
204204 func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,maxmint) = {
205205 let checkUser = validateUser(caller)
206206 if ((checkUser != ""))
207207 then throw(checkUser)
208208 else if ((size(cidDisplay) == 0))
209209 then throw("Display CID cannot be empty")
210210 else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
211211 then throw("Problem with CID")
212212 else if (!(validateAllHash(sha256Export, licenceHash)))
213213 then throw("Problem with Hashes")
214214 else if (!(validateString(name, 100)))
215215 then throw("100 Char. max name")
216216 else if (!(validateString(description, 1000)))
217217 then throw("1000 Char. max description")
218218 else if ((size(split(tags, ",")) > 5))
219219 then throw("5 tags max.")
220220 else if ((maxmint > 10))
221221 then throw("10 editions max per artwork")
222222 else ""
223223 }
224224
225225
226-func validatePayment (invoke) = if ((size(invoke.payments) == 0))
226+func isPayment (i) = if ((size(i.payments) == 0))
227227 then throw("No payment attached")
228228 else {
229- let payment = value(invoke.payments[0])
229+ let payment = value(i.payments[0])
230230 let amount = value(payment.amount)
231- let assetId = if (if (isDefined(payment.assetId))
232- then (payment.assetId == signAssetId)
233- else false)
234- then payment.assetId
235- else throw("Only SIGN token accepted as transaction fee")
236- let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
237- if ((amount != currentCertificationPrice))
238- then throw(("Payment amount should be " + toString(currentCertificationPrice)))
239- else $Tuple2(amount, assetId)
231+ $Tuple2(payment, amount)
240232 }
241233
242234
243-func isArtMinted (addressToUse,artId) = match getInteger(this, keyArtIssued(addressToUse, artId)) {
235+func validatePayment (i) = {
236+ let $t089038939 = isPayment(i)
237+ let payment = $t089038939._1
238+ let amount = $t089038939._2
239+ let assetId = if (if (isDefined(payment.assetId))
240+ then (payment.assetId == signAssetId)
241+ else false)
242+ then payment.assetId
243+ else throw("Only SIGN token accepted as transaction fee")
244+ let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
245+ if ((amount != currentCertificationPrice))
246+ then throw(("Payment amount should be " + toString(currentCertificationPrice)))
247+ else $Tuple2(amount, assetId)
248+ }
249+
250+
251+func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
244252 case b: Int =>
245253 if ((b != 0))
246254 then true
247255 else false
248256 case _ =>
249257 false
250258 }
251259
252260
253-func validatePriceAssetId (invoke,priceAssetId,artworkPrice) = {
254- let payment = value(invoke.payments[0])
255- let amount = value(payment.amount)
261+func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
262+ let $t096399675 = isPayment(i)
263+ let payment = $t096399675._1
264+ let amount = $t096399675._2
256265 let assetId = if (!(isDefined(payment.assetId)))
257266 then unit
258267 else if (if ((size(priceAssetId) > 0))
259268 then (toBase58String(value(payment.assetId)) == priceAssetId)
260269 else false)
261270 then payment.assetId
262271 else throw("Wrong asset id")
263272 if (if ((assetId == unit))
264273 then (priceAssetId != "")
265274 else false)
266275 then throw("Wrong asset id")
267276 else if ((artworkPrice != amount))
268277 then throw("Payment don't match")
269278 else $Tuple2(amount, assetId)
270279 }
271280
272281
273282 func acceptedAssetIds (assetId) = if (if (if ((assetId != toBase58String(signAssetId)))
274283 then (assetId != toBase58String(wavesAssetId))
275284 else false)
276285 then (assetId != toBase58String(usdnAssetId))
277286 else false)
278287 then throw("Only SIGN, USDN or WAVES accepted")
279288 else true
280289
281290
282291 func validateMinSell (assetId,price) = {
283292 let minSellWaves = if (unitTest)
284293 then 1
285294 else getIntegerByKeyFromOracle("waves_min_sell")
286295 let minSellUsdn = 1000000
287296 let minSellSign = if (unitTest)
288297 then 1
289298 else (getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId))) * 2)
290299 if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
291300 then (minSellUsdn > price)
292301 else false)
293302 then (price != 0)
294303 else false)
295304 then true
296305 else if (if ((assetId == toBase58String(signAssetId)))
297306 then (minSellSign > price)
298307 else false)
299308 then (price != 0)
300309 else false)
301310 then true
302311 else if (if ((assetId == toBase58String(wavesAssetId)))
303312 then (minSellWaves > price)
304313 else false)
305314 then (price != 0)
306315 else false)
307316 then throw("Wrong minimum sell price")
308317 else true
309318 }
310319
311320
312321 func getPriceAssetIdFromBid (bidDataKey) = {
313322 let bidData = getStringByKey((bidDataKey + "_OPEN"))
314323 if ((bidData == ""))
315324 then throw("Bid not found")
316325 else {
317326 let bidDataArr = split(bidData, "_")
318327 let bidAmount = parseIntValue(bidDataArr[1])
319328 let bidAssetId = if ((bidDataArr[0] == "WAVES"))
320329 then unit
321330 else fromBase58String(bidDataArr[0])
322331 if ((0 >= bidAmount))
323332 then throw("Wrong amount")
324333 else $Tuple2(bidAmount, bidAssetId)
325334 }
326335 }
327336
328337
329-func buyMint (invoke,artId,issuer,bidId,bidOwner) = {
330- let id = toBase58String(invoke.transactionId)
331- let caller = toBase58String(invoke.caller.bytes)
338+func idCallerDate (i) = if (!(dappRunning))
339+ then throw(maintenanceMSG)
340+ else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
341+
342+
343+func buyMint (i,artId,issuer,bidId,bidOwner) = {
344+ let $t01175411792 = idCallerDate(i)
345+ let id = $t01175411792._1
346+ let caller = $t01175411792._2
347+ let date = $t01175411792._3
332348 let totalNFT = getIntegerByKey("total_nft_issued")
333- let signID = getStringByKey(keyArtSignID(issuer, artId))
334- let artworkName = getStringByKey(keyArtName(issuer, artId))
349+ let signID = getStringByKey(keySignID(issuer, artId))
350+ let artworkName = getStringByKey(keyName(issuer, artId))
335351 if ((artworkName == ""))
336352 then throw("Art doesn't exist")
337353 else {
338- let displayCID = getStringByKey(keyArtDisplayCid(issuer, artId))
339- let exportCID = getStringByKey(keyArtExportCid(issuer, artId))
340- let exportHash = getStringByKey(keyArtExportHash(issuer, artId))
341- let licenceCID = getStringByKey(keyArtLicenceCid(issuer, artId))
342- let licenceHash = getStringByKey(keyArtLicenceHash(issuer, artId))
343- let description = take(getStringByKey(keyArtDesc(issuer, artId)), 50)
344- let isOnSale = getBooleanByKey(keyArtOnSale(issuer, artId))
345- let amountSold = getIntegerByKey(keyArtIssued(issuer, artId))
346- let artworkPrice = getIntegerByKey(keyArtPrice(issuer, artId))
347- let priceAssetId = getStringByKey(keyArtAssetIdAccepted(issuer, artId))
348- let sourceHash = getStringByKey(keyArtHashByTxidAddr(issuer, artId))
349- let maxCanSell = getIntegerByKey(keyArtMaxMint(issuer, artId))
354+ let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
355+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
356+ let artworkPrice = getIntegerByKey(keyPrice(issuer, artId))
357+ let priceAssetId = getStringByKey(keyAssetIdAccepted(issuer, artId))
358+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
350359 let isBid = if (if (if ((caller == issuer))
351360 then (bidOwner != "")
352361 else false)
353362 then (bidId != "")
354363 else false)
355364 then true
356365 else false
357366 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
358367 if (if (if ((0 >= artworkPrice))
359368 then true
360369 else !(isOnSale))
361370 then true
362371 else (0 >= maxCanSell))
363372 then throw("Art not for sale")
364373 else {
365- let $t01307313207 = if (isBid)
374+ let $t01263912768 = if (isBid)
366375 then getPriceAssetIdFromBid(bidDataKey)
367- else validatePriceAssetId(invoke, priceAssetId, artworkPrice)
368- let amount = $t01307313207._1
369- let assetId = $t01307313207._2
376+ else validatePriceAssetId(i, priceAssetId, artworkPrice)
377+ let amount = $t01263912768._1
378+ let assetId = $t01263912768._2
370379 let isWhitelisted = checkWhitelist(issuer)
371380 let cut = if ((isWhitelisted > height))
372381 then 0
373382 else if ((priceAssetId == toBase58String(signAssetId)))
374383 then signCut
375384 else usdnWaveCut
376385 let amountForSign = fraction(amount, cut, 100)
377386 let amountForCreator = (amount - amountForSign)
378387 if ((amountSold == maxCanSell))
379388 then throw("Art sold out")
380389 else {
381390 let newAmountSold = (amountSold + 1)
382- let entryDate = toString(lastBlock.timestamp)
383- let issueMeta = ((((((((((((((((((((((((((("Creator: " + issuer) + ",
391+ let issueMeta = ((((((((((("Creator: " + issuer) + ",
384392 ArtID: ") + artId) + ",
385393 SignID: ") + signID) + ",
386394 Artwork name: ") + artworkName) + ",
387- Artwork description: ") + description) + ",
388- Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell)) + ",
389- Max issuable: ") + toString(maxCanSell)) + ",
390- Source hash: ") + sourceHash) + ",
391- Display cid: ") + displayCID) + ",
392- Export cid: ") + exportCID) + ",
393- Export hash: ") + exportHash) + ",
394- Licence cid: ") + licenceCID) + ",
395- Licence hash: ") + licenceHash)
395+ Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
396396 let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
397397 let idNFT = calculateAssetId(issueNFT)
398398 let sellStatus = if ((newAmountSold == maxCanSell))
399399 then false
400400 else true
401401 let receiveNFT = if (if (if ((caller == issuer))
402402 then (bidOwner != "")
403403 else false)
404404 then (bidId != "")
405405 else false)
406406 then addressFromStringValue(bidOwner)
407- else invoke.caller
408- let buyRes = [IntegerEntry(keyArtIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)), 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(receiveNFT, 1, idNFT)]
407+ else i.caller
408+ let buyRes = [IntegerEntry(keyIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)), 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)]
409409 let assetIdBid = if (!(isDefined(assetId)))
410410 then "WAVES"
411411 else toBase58String(value(assetId))
412412 let getBidData = getStringByKey((bidDataKey + "_OPEN"))
413413 let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
414- let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((getBidData + "_") + entryDate))
414+ let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((getBidData + "_") + toString(date)))
415415 let soldValue = if (!(isBid))
416- then ((((((((((caller + "_") + entryDate) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
417- else ((((((((((toString(receiveNFT) + "_") + entryDate) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
416+ then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
417+ else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
418418 let soldData = StringEntry(((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer), soldValue)
419419 if (isBid)
420420 then [soldData, bidUpdate, bidDelOld] :: buyRes
421421 else soldData :: buyRes
422422 }
423423 }
424424 }
425425 }
426426
427427
428-@Callable(invoke)
429-func addArtwork (sha256Hash,signID,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
430- then throw(maintenanceMSG)
431- else {
432- let artId = toBase58String(invoke.transactionId)
433- let timestamp = lastBlock.timestamp
434- let caller = toBase58String(invoke.caller.bytes)
435- if (!(validateHash(sha256Hash)))
436- then throw("Hash should be 64 characters maximum")
437- else {
438- let $t01707417143 = setLIcence(cidLicence, sha256Licence)
439- let licenceCID = $t01707417143._1
440- let licenceHash = $t01707417143._2
441- let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
442- if ((validateArtwork != ""))
443- then throw("Something went wrong!")
444- else {
445- let $t01737117418 = validatePayment(invoke)
446- let amount = $t01737117418._1
447- let assetId = $t01737117418._2
448- if (!(isDefined(amount)))
449- then throw("Something went wrong")
450- else {
451- let entryExist = getStringByKey(keyArtTxidByHashOwner(sha256Hash, caller))
452- if ((entryExist != ""))
453- then throw("You already added it")
454- else {
455- let hashExist = getStringByKey(keyArtOwnerByHash(sha256Hash))
456- if ((hashExist != ""))
457- then throw("Hash already registered")
458- else {
459- let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
460- if (!(isSignCertified))
461- then throw("Sign Certificate not found for this address.")
462- 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)]
463- }
464- }
465- }
466- }
467- }
468- }
428+@Callable(i)
429+func addArtwork (sha256Hash,signID,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = {
430+ let $t01579415835 = idCallerDate(i)
431+ let artId = $t01579415835._1
432+ let caller = $t01579415835._2
433+ let date = $t01579415835._3
434+ if (!(validateHash(sha256Hash)))
435+ then throw("Hash should be 64 characters maximum")
436+ else {
437+ let $t01593616005 = setLIcence(cidLicence, sha256Licence)
438+ let licenceCID = $t01593616005._1
439+ let licenceHash = $t01593616005._2
440+ let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
441+ if ((validateArtwork != ""))
442+ then throw("Something went wrong!")
443+ else {
444+ let $t01623316275 = validatePayment(i)
445+ let amount = $t01623316275._1
446+ let assetId = $t01623316275._2
447+ if (!(isDefined(amount)))
448+ then throw("Something went wrong")
449+ else {
450+ let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
451+ if ((entryExist != ""))
452+ then throw("You already added it")
453+ else {
454+ let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
455+ if ((hashExist != ""))
456+ then throw("Hash already registered")
457+ else {
458+ let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
459+ if (!(isSignCertified))
460+ then throw("Sign Certificate not found for this address.")
461+ 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)]
462+ }
463+ }
464+ }
465+ }
466+ }
467+ }
469468
470469
471470
472-@Callable(invoke)
471+@Callable(i)
473472 func updateArtwork (txid,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
474473 then throw(maintenanceMSG)
475474 else {
476- let updateId = toBase58String(invoke.transactionId)
477- let caller = toBase58String(invoke.caller.bytes)
478- let $t02027320342 = setLIcence(cidLicence, sha256Licence)
479- let licenceCID = $t02027320342._1
480- let licenceHash = $t02027320342._2
475+ let caller = toBase58String(i.caller.bytes)
476+ let $t01899619065 = setLIcence(cidLicence, sha256Licence)
477+ let licenceCID = $t01899619065._1
478+ let licenceHash = $t01899619065._2
481479 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
482480 if ((validateArtwork != ""))
483481 then throw("Something went wrong!")
484482 else {
485- let entryExist = getStringByKey(keyArtName(caller, txid))
483+ let entryExist = getStringByKey(keyName(caller, txid))
486484 if ((entryExist == ""))
487485 then throw("Entry not found")
488486 else {
489- let flag = getStringByKey(keyArtFlag(caller, txid))
487+ let flag = getStringByKey(keyFlag(caller, txid))
490488 if ((flag == "ILLEGAL"))
491489 then throw("Cannot update ILLEGAL artwork")
492490 else if (!(isArtMinted(caller, txid)))
493- 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)]
491+ 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)]
494492 else throw("Already minted")
495493 }
496494 }
497495 }
498496
499497
500498
501-@Callable(invoke)
499+@Callable(i)
502500 func flagArtwork (artId,addr,flag) = {
503- let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
504- let id = toBase58String(invoke.transactionId)
501+ let $t02053820571 = idCallerDate(i)
502+ let id = $t02053820571._1
503+ let caller = $t02053820571._2
505504 if (containsElement([chris, joep, toString(this)], caller))
506505 then if ((flag == "CONSENT"))
507- then [StringEntry(keyArtFlag(addr, artId), flag)]
506+ then [StringEntry(keyFlag(addr, artId), flag)]
508507 else if ((flag == ""))
509- then [StringEntry(keyArtFlag(addr, artId), flag)]
508+ then [StringEntry(keyFlag(addr, artId), flag)]
510509 else if ((flag == "ILLEGAL"))
511- 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), "")]
510+ 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), "")]
512511 else throw(("Unknow status " + flag))
513512 else throw("You are not allowed")
514513 }
515514
516515
517516
518-@Callable(invoke)
517+@Callable(i)
519518 func deleteArtwork (artId,addr) = {
520- let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
521- let id = toBase58String(invoke.transactionId)
522- let addressToUse = if (containsElement([chris, joep, toString(this)], caller))
519+ let $t02141921452 = idCallerDate(i)
520+ let id = $t02141921452._1
521+ let caller = $t02141921452._2
522+ let addrToUse = if (containsElement([chris, joep, toString(this)], caller))
523523 then addr
524524 else caller
525- let entryExist = getStringByKey(keyArtName(addressToUse, artId))
525+ let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
526526 if ((entryExist == ""))
527527 then throw("No art matching for this address")
528528 else {
529- let sha256Hash = getStringByKey(keyArtHashByTxidAddr(addressToUse, artId))
529+ let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
530530 if ((sha256Hash == ""))
531531 then throw("No art hash matching for this address")
532532 else {
533- let signID = getStringByKey(keyArtSignID(addressToUse, artId))
533+ let signID = getStringByKey(keySignID(addrToUse, artId))
534534 if ((signID == ""))
535535 then throw("No SIGN ID matching")
536536 else {
537- 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))]
538- if (!(isArtMinted(addressToUse, artId)))
537+ 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))]
538+ if (!(isArtMinted(addrToUse, artId)))
539539 then if (!(dappRunning))
540540 then throw(maintenanceMSG)
541541 else dataToDelete
542542 else if (containsElement([chris, toString(this)], caller))
543543 then dataToDelete
544544 else throw("Art already minted, you cannot delete it")
545545 }
546546 }
547547 }
548548 }
549549
550550
551551
552-@Callable(invoke)
553-func sellArtwork (artId,price,maxMint,assetId) = if (!(dappRunning))
554- then throw(maintenanceMSG)
555- else {
556- let id = toBase58String(invoke.transactionId)
557- let caller = toBase58String(invoke.caller.bytes)
558- let sellDate = lastBlock.timestamp
559- let artworkName = getStringByKey(keyArtName(caller, artId))
560- if ((artworkName == ""))
561- then throw("This art doesn't match match your account")
562- else {
563- let exportCID = getStringByKey(keyArtExportCid(caller, artId))
564- if ((size(split(exportCID, "/")[0]) != 59))
565- then throw("You cannot sell art with no export file")
566- else {
567- let exportHash = getStringByKey(keyArtExportHash(caller, artId))
568- if ((size(exportHash) != 64))
569- then throw("You cannot sell art with no export hash")
570- else if (!(acceptedAssetIds(assetId)))
571- then throw("Something went wrong!")
572- else if (!(validateMinSell(assetId, price)))
573- then throw("Something went wrong!")
574- else {
575- let checkUser = validateUser(caller)
576- if ((checkUser != ""))
577- then throw(checkUser)
578- else {
579- let amountSold = getIntegerByKey(keyArtIssued(caller, artId))
580- let maxCanSell = getIntegerByKey(keyArtMaxMint(caller, artId))
581- if ((maxMint > 10))
582- then throw("10 editions max per artwork")
583- else if (if ((amountSold != 0))
584- then (amountSold == maxCanSell)
552+@Callable(i)
553+func sellArtwork (artId,price,maxMint,assetId) = {
554+ let $t02381823851 = idCallerDate(i)
555+ let id = $t02381823851._1
556+ let caller = $t02381823851._2
557+ let artworkName = getStringByKey(keyName(caller, artId))
558+ if ((artworkName == ""))
559+ then throw("This art doesn't match your account")
560+ else {
561+ let exportCID = getStringByKey(keyExportCid(caller, artId))
562+ if ((size(split(exportCID, "/")[0]) != 59))
563+ then throw("You cannot sell art with no export file")
564+ else if (!(acceptedAssetIds(assetId)))
565+ then throw("Something went wrong!")
566+ else if (!(validateMinSell(assetId, price)))
567+ then throw("Something went wrong!")
568+ else {
569+ let checkUser = validateUser(caller)
570+ if ((checkUser != ""))
571+ then throw(checkUser)
572+ else {
573+ let amountSold = getIntegerByKey(keyIssued(caller, artId))
574+ let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
575+ if ((maxMint > 10))
576+ then throw("10 editions max per artwork")
577+ else if (if ((amountSold != 0))
578+ then (amountSold == maxCanSell)
579+ else false)
580+ then throw("Max edition reached.")
581+ else if (if ((amountSold > 0))
582+ then (maxCanSell != maxMint)
583+ else false)
584+ then throw("Cannot change maximum issuable anymore")
585+ else {
586+ let sellStatus = if (if ((price > 0))
587+ then (maxMint > 0)
585588 else false)
586- then throw("Max edition reached.")
587- else if (if ((amountSold > 0))
588- then (maxCanSell != maxMint)
589- else false)
590- then throw("Cannot change maximum issuable anymore")
591- else {
592- let sellStatus = if (if ((price > 0))
593- then (maxMint > 0)
594- else false)
595- then true
596- else false
597-[BooleanEntry(keyArtOnSale(caller, artId), sellStatus), IntegerEntry(keyArtPrice(caller, artId), price), IntegerEntry(keyArtMaxMint(caller, artId), maxMint), StringEntry(keyArtAssetIdAccepted(caller, artId), assetId)]
598- }
599- }
600- }
601- }
602- }
603- }
589+ then true
590+ else false
591+[BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), StringEntry(keyAssetIdAccepted(caller, artId), assetId)]
592+ }
593+ }
594+ }
595+ }
596+ }
604597
605598
606599
607-@Callable(invoke)
608-func buyArtwork (artId,issuer) = if (!(dappRunning))
609- then throw(maintenanceMSG)
610- else buyMint(invoke, artId, issuer, "", "")
600+@Callable(i)
601+func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "")
611602
612603
613604
614-@Callable(invoke)
615-func setBid (artId,issuer) = if (!(dappRunning))
616- then throw(maintenanceMSG)
617- else {
618- let id = toBase58String(invoke.transactionId)
619- let caller = toBase58String(invoke.caller.bytes)
620- let timestamp = lastBlock.timestamp
621- if ((size(invoke.payments) == 0))
622- then throw("No payment attached")
605+@Callable(i)
606+func setBid (artId,issuer) = {
607+ let $t02564725685 = idCallerDate(i)
608+ let id = $t02564725685._1
609+ let caller = $t02564725685._2
610+ let date = $t02564725685._3
611+ let $t02569025726 = isPayment(i)
612+ let payment = $t02569025726._1
613+ let amount = $t02569025726._2
614+ let assetId = if (!(isDefined(payment.assetId)))
615+ then "WAVES"
616+ else toBase58String(value(payment.assetId))
617+ if (!(acceptedAssetIds(assetId)))
618+ then throw("Something went wrong!")
619+ else if (!(validateMinSell(assetId, amount)))
620+ then throw("Something went wrong!")
623621 else {
624- let payment = value(invoke.payments[0])
625- let amount = value(payment.amount)
626- let assetId = if (!(isDefined(payment.assetId)))
627- then "WAVES"
628- else toBase58String(value(payment.assetId))
629- let amountSold = getIntegerByKey(keyArtIssued(issuer, artId))
630- let maxCanSell = getIntegerByKey(keyArtMaxMint(issuer, artId))
622+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
623+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
631624 if ((amountSold >= maxCanSell))
632625 then throw("Sold out, you cannot bid")
633- else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(timestamp)))]
626+ else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date)))]
634627 }
635- }
628+ }
636629
637630
638631
639-@Callable(invoke)
640-func acceptBid (artId,issuer,bidId,bidOwner) = if (!(dappRunning))
641- then throw(maintenanceMSG)
642- else {
643- let caller = toBase58String(invoke.caller.bytes)
644- if ((caller != issuer))
645- then throw("You cannot do this action")
646- else buyMint(invoke, artId, issuer, bidId, bidOwner)
647- }
632+@Callable(i)
633+func acceptBid (artId,issuer,bidId,bidOwner) = {
634+ let caller = toBase58String(i.caller.bytes)
635+ if ((caller != issuer))
636+ then throw("You cannot do this action")
637+ else buyMint(i, artId, issuer, bidId, bidOwner)
638+ }
648639
649640
650641
651-@Callable(invoke)
642+@Callable(i)
652643 func cancelBid (artId,issuer,bidId,bidOwner) = {
653- let id = toBase58String(invoke.transactionId)
654- let caller = toBase58String(invoke.caller.bytes)
655- let date = toString(lastBlock.timestamp)
644+ let $t02680926847 = idCallerDate(i)
645+ let id = $t02680926847._1
646+ let caller = $t02680926847._2
647+ let date = $t02680926847._3
656648 if ((caller != bidOwner))
657649 then throw("You cannot do this action")
658650 else {
659651 let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
660652 let bidData = getStringByKey((bidDataKey + "_OPEN"))
661653 if ((bidData == ""))
662654 then throw("Bid not found")
663655 else {
664656 let bidDataArr = split(bidData, "_")
665657 let assetId = if ((bidDataArr[0] == "WAVES"))
666658 then unit
667659 else fromBase58String(bidDataArr[0])
668-[DeleteEntry((bidDataKey + "_OPEN")), StringEntry((bidDataKey + "_CANCELED"), ((bidData + "_") + date)), ScriptTransfer(Address(fromBase58String(caller)), parseIntValue(bidDataArr[1]), assetId)]
660+[DeleteEntry((bidDataKey + "_OPEN")), StringEntry((bidDataKey + "_CANCELED"), ((bidData + "_") + toString(date))), ScriptTransfer(Address(fromBase58String(caller)), parseIntValue(bidDataArr[1]), assetId)]
669661 }
670662 }
671663 }
672664
673665
674666
675667 @Callable(i)
676668 func deleteEntry (entry) = {
677669 let caller = toString(addressFromPublicKey(i.callerPublicKey))
678670 if ((caller == chris))
679671 then [DeleteEntry(entry)]
680672 else throw("no")
681673 }
682674
683675

github/deemru/w8io/3ef1775 
530.16 ms