tx · 7fKG7vgPsYDfKNmWV8BVAzzrUFzJXvZUif2G6jT5JFZY

3NBquYd5fTq8HRDkagrtNLQ3HmWd7wcZoeL:  -0.01400000 Waves

2021.01.27 14:15 [1371837] smart account 3NBquYd5fTq8HRDkagrtNLQ3HmWd7wcZoeL > SELF 0.00000000 Waves

{ "type": 13, "id": "7fKG7vgPsYDfKNmWV8BVAzzrUFzJXvZUif2G6jT5JFZY", "fee": 1400000, "feeAssetId": null, "timestamp": 1611746149660, "version": 2, "chainId": 84, "sender": "3NBquYd5fTq8HRDkagrtNLQ3HmWd7wcZoeL", "senderPublicKey": "7irc2VpK5czoyVdwrCuQqr2JU9ZaZnEZn8RPChnfi3yL", "proofs": [ "K1tcSwXF9EtN84u2XcD4PYaPubynwh1jBvkDHmHpDze67w8LMLTN5ubeke2uMekkHHNTvDHF6fHQYqTDCHcPaVf" ], "script": "base64:AAIEAAAAAAAAAFcIAhIOCgwICAgICAgBCAgICAgSDQoLCAgICAgBCAgICAgSBQoDCAgIEgQKAggIEgYKBAgBAQgSBAoCCAgSBAoCCAgSBgoECAgICBIGCgQICAgIEgMKAQgAAABDAAAAAAh1bml0VGVzdAYAAAAACW9yYWNsZUZlZQkBAAAABXZhbHVlAAAAAQkABCYAAAABAgAAACMzTjJzNVJ0YUhQQmVuQ3N4MkVDY29GUmJZSHgzbm9aaFhXMQAAAAAIc2lnbkRhcHAJAQAAAAV2YWx1ZQAAAAEJAAQmAAAAAQIAAAAjM05DMjhoU2l2cm1zVFVYYVlEMXg2TDM2Mko0WnBVbm9UZEIAAAAAC2ZlZVJlY2VpdmVyAgAAACMzTjFFNnRYZGRSb1ZhUmZROWRRM3ZnNUxhVzJmc2Q4SEt1YgAAAAAIdXNlckRhcHADBQAAAAh1bml0VGVzdAkBAAAABXZhbHVlAAAAAQkABCYAAAABAgAAACMzTXQ0UkdNRXlqU1dZQW9jVFBxZDU1d2RIUVFCM1BVMlVDbQkBAAAABXZhbHVlAAAAAQkABCYAAAABAgAAACMzTXdEWmFnb1lFaU5mUUxjMzFjR3BZb2FFNTRNR013b0ZyWgAAAAANd2hpdGVsaXN0RGFwcAkBAAAABXZhbHVlAAAAAQkABCYAAAABAgAAACMzTjZCYVYxZENCNHpnNDNnb05OSGFDdHZSMTNCY3lKNUdzcQAAAAALc2lnbkFzc2V0SWQBAAAAIOilarzKd0LycGEyNUpPRYO5uR7lmWcXw3Hq2QuhBK3rAAAAAAt1c2RuQXNzZXRJZAEAAAAgD/IcEqzkxDya7EYaqyWosOy6BytGzG2IcvC14pJJAbQAAAAADHdhdmVzQXNzZXRJZAEAAAAAAAAAAAVjaHJpcwIAAAAjM01zRzZqUE5DclZKVXRZQjdYSkJ4Uzd1dFdzWEFmNG45VnAAAAAABGpvZXACAAAAIzNNem00Vkx3c045dVp3YlRNelBqM1h1eFY2a0VmQVI4VUROAAAAAAdzaWduQ3V0AAAAAAAAAAAHAAAAAAt1c2RuV2F2ZUN1dAAAAAAAAAAACgAAAAAOZGVmYXVsdExpY2VuY2UCAAAAR2JhZnliZWlmdXlvNHBxdTU0aXNtcWd0YjZlNGg2a2t2Z3g3emc0dTN6aWJoMnI3eTZtYjY0aTdienphL2xpY2VuY2UucGRmAAAAABJkZWZhdWx0SGFzaExpY2VuY2UCAAAAQGE4Nzc1OGMzNTRlMzBhOWU3OGZiODRmYTNhMDAxMGE1MDkwYWIyMGRmMGJlMTFhZDQ1YjU3MjBjYzE4N2U2MzkAAAAAC2RhcHBSdW5uaW5nCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGwAAAAIFAAAACHVzZXJEYXBwAgAAABRjb25mX2RhcHBfaXNfcnVubmluZwYAAAAADm1haW50ZW5hbmNlTVNHCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAACHVzZXJEYXBwAgAAABRjb25mX21haW50ZW5hbmNlX21zZwIAAAAAAAAAAA11c2VyU3VzcGVuZGVkAgAAAAlTVVNQRU5ERUQAAAAAC3VzZXJSZW1vdmVkAgAAAAdSRU1PVkVEAAAAABB1c2VyVW5yZWdpc3RlcmVkAgAAAAxVTlJFR0lTVEVSRUQAAAAAC3VzZXJBbGxvd2VkAgAAAAdBTExPV0VEAQAAABdnZXRTdHJpbmdCeUtleUZyb21Vc2VycwAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAACHVzZXJEYXBwBQAAAANrZXkCAAAAAAEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAANrZXkCAAAAAAEAAAAZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQAAAAEAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAJb3JhY2xlRmVlBQAAAANrZXkCAAAAH0ludGVnZXIgdW5kZWZpbmUgb3IgMCBpbiBvcmFjbGUBAAAAD2dldEludGVnZXJCeUtleQAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQAAAAAAAAAAAAEAAAAOY2hlY2tXaGl0ZWxpc3QAAAABAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAA13aGl0ZWxpc3REYXBwBQAAAANrZXkAAAAAAAAAAAABAAAAD2dldEJvb2xlYW5CeUtleQAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGwAAAAIFAAAABHRoaXMFAAAAA2tleQcBAAAAFGNoZWNrU2lnbkNlcnRpZmljYXRlAAAAAwAAAAZzaWduSUQAAAAFT3duZXIAAAAKc2hhMjU2SGFzaAQAAAAHJG1hdGNoMAkABB0AAAACBQAAAAhzaWduRGFwcAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIZGF0YV9mY18FAAAABnNpZ25JRAIAAAABXwUAAAAFT3duZXIDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABlN0cmluZwQAAAABYQUAAAAHJG1hdGNoMAMJAQAAAAhjb250YWlucwAAAAIFAAAAAWEFAAAACnNoYTI1Nkhhc2gGBwcBAAAAC3ZhbGlkYXRlQ0lEAAAAAQAAAANjaWQDCQEAAAAIY29udGFpbnMAAAACBQAAAANjaWQCAAAAAS8DAwkAAGYAAAACAAAAAAAAAABMCQABMQAAAAEFAAAAA2NpZAkAAAAAAAACCQABMQAAAAEJAAGRAAAAAgkABLUAAAACBQAAAANjaWQCAAAAAS8AAAAAAAAAAAAAAAAAAAAAADsHCQAAZgAAAAIAAAAAAAAAABAJAAExAAAAAQkAAZEAAAACCQAEtQAAAAIFAAAAA2NpZAIAAAABLwAAAAAAAAAAAQcHAQAAAAx2YWxpZGF0ZUhhc2gAAAABAAAABGhhc2gJAAAAAAAAAgkAATEAAAABBQAAAARoYXNoAAAAAAAAAABAAQAAAA1rZXlVc2VyU3RhdHVzAAAAAQAAAAZjYWxsZXIJAAEsAAAAAgIAAAAMdXNlcl9zdGF0dXNfBQAAAAZjYWxsZXIBAAAAB2tleURhdGUAAAACAAAABmNhbGxlcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAJYXJ0X2RhdGVfBQAAAAVhcnRJZAIAAAABXwUAAAAGY2FsbGVyAQAAAAdrZXlOYW1lAAAAAgAAAAZjYWxsZXIAAAAFYXJ0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACWFydF9uYW1lXwUAAAAFYXJ0SWQCAAAAAV8FAAAABmNhbGxlcgEAAAAHa2V5RGVzYwAAAAIAAAAGY2FsbGVyAAAABWFydElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAlhcnRfZGVzY18FAAAABWFydElkAgAAAAFfBQAAAAZjYWxsZXIBAAAADWtleURpc3BsYXlDaWQAAAACAAAABmNhbGxlcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAQYXJ0X2Rpc3BsYXlfY2lkXwUAAAAFYXJ0SWQCAAAAAV8FAAAABmNhbGxlcgEAAAANa2V5RXhwb3J0SGFzaAAAAAIAAAAGY2FsbGVyAAAABWFydElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABBhcnRfZXhwb3J0X2hhc2hfBQAAAAVhcnRJZAIAAAABXwUAAAAGY2FsbGVyAQAAAAxrZXlFeHBvcnRDaWQAAAACAAAABmNhbGxlcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAPYXJ0X2V4cG9ydF9jaWRfBQAAAAVhcnRJZAIAAAABXwUAAAAGY2FsbGVyAQAAAAprZXlNYXhNaW50AAAAAgAAAAZjYWxsZXIAAAAFYXJ0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAADGFydF9tYXhtaW50XwUAAAAFYXJ0SWQCAAAAAV8FAAAABmNhbGxlcgEAAAAJa2V5U2lnbklEAAAAAgAAAAZjYWxsZXIAAAAFYXJ0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAC2FydF9zaWduaWRfBQAAAAVhcnRJZAIAAAABXwUAAAAGY2FsbGVyAQAAAAlrZXlJc3N1ZWQAAAACAAAABmNhbGxlcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAALYXJ0X2lzc3VlZF8FAAAABWFydElkAgAAAAFfBQAAAAZjYWxsZXIBAAAACWtleU9uU2FsZQAAAAIAAAAGY2FsbGVyAAAABWFydElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAthcnRfb25zYWxlXwUAAAAFYXJ0SWQCAAAAAV8FAAAABmNhbGxlcgEAAAAOa2V5TGljZW5jZUhhc2gAAAACAAAABmNhbGxlcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAARYXJ0X2xpY2VuY2VfaGFzaF8FAAAABWFydElkAgAAAAFfBQAAAAZjYWxsZXIBAAAADWtleUxpY2VuY2VDaWQAAAACAAAABmNhbGxlcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAQYXJ0X2xpY2VuY2VfY2lkXwUAAAAFYXJ0SWQCAAAAAV8FAAAABmNhbGxlcgEAAAAHa2V5VGFncwAAAAIAAAAGY2FsbGVyAAAABWFydElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAlhcnRfdGFnc18FAAAABWFydElkAgAAAAFfBQAAAAZjYWxsZXIBAAAAB2tleVR5cGUAAAACAAAABmNhbGxlcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAJYXJ0X3R5cGVfBQAAAAVhcnRJZAIAAAABXwUAAAAGY2FsbGVyAQAAAAhrZXlQcmljZQAAAAIAAAAGY2FsbGVyAAAABWFydElkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAphcnRfcHJpY2VfBQAAAAVhcnRJZAIAAAABXwUAAAAGY2FsbGVyAQAAABJrZXlBc3NldElkQWNjZXB0ZWQAAAACAAAABmNhbGxlcgAAAAVhcnRJZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAASYXJ0X2Fzc2V0QWNjZXB0ZWRfBQAAAAVhcnRJZAIAAAABXwUAAAAGY2FsbGVyAQAAAAdrZXlGbGFnAAAAAgAAAAZjYWxsZXIAAAAFYXJ0SWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACWFydF9mbGFnXwUAAAAFYXJ0SWQCAAAAAV8FAAAABmNhbGxlcgEAAAARa2V5SGFzaEJ5VHhpZEFkZHIAAAACAAAABmNhbGxlcgAAAAR0eGlkCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABNnZXRfaGFzaGJ5dHhpZGFkZHJfBQAAAAR0eGlkAgAAAAFfBQAAAAZjYWxsZXIBAAAADmtleU93bmVyQnlIYXNoAAAAAQAAAApzaGEyNTZIYXNoCQABLAAAAAICAAAAEmdldF9vd25lcl9ieV9oYXNoXwUAAAAKc2hhMjU2SGFzaAEAAAANa2V5aWRCeVNpZ25pZAAAAAIAAAAGY2FsbGVyAAAABnNpZ25JZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAASZ2V0X2FydGlkYnlzaWduaWRfBQAAAAZzaWduSWQCAAAAAV8FAAAABmNhbGxlcgEAAAASa2V5VHhpZEJ5SGFzaE93bmVyAAAAAgAAAApzaGEyNTZIYXNoAAAABmNhbGxlcgkAASwAAAACAgAAABdnZXRfdHhpZF9ieV9oYXNoX293bmVyXwkAAlgAAAABCQALVAAAAAEJAAGbAAAAAQkAASwAAAACBQAAAApzaGEyNTZIYXNoBQAAAAZjYWxsZXIBAAAADnZhbGlkYXRlQWxsQ0lEAAAAAwAAAApjaWREaXNwbGF5AAAACWNpZEV4cG9ydAAAAApjaWRMaWNlbmNlAwkBAAAAASEAAAABCQEAAAALdmFsaWRhdGVDSUQAAAABBQAAAApjaWREaXNwbGF5CQAAAgAAAAECAAAAEVdyb25nIERpc3BsYXkgQ0lEAwkBAAAAASEAAAABCQEAAAALdmFsaWRhdGVDSUQAAAABBQAAAAljaWRFeHBvcnQJAAACAAAAAQIAAAAQV3JvbmcgRXhwb3J0IENJRAMDCQEAAAACIT0AAAACBQAAAApjaWRMaWNlbmNlAgAAAAAJAQAAAAEhAAAAAQkBAAAAC3ZhbGlkYXRlQ0lEAAAAAQUAAAAKY2lkTGljZW5jZQcJAAACAAAAAQIAAAARV3JvbmcgTGljZW5jZSBDSUQGAQAAAA92YWxpZGF0ZUFsbEhhc2gAAAACAAAADHNoYTI1NkV4cG9ydAAAAA1zaGEyNTZMaWNlbmNlAwkBAAAAASEAAAABCQEAAAAMdmFsaWRhdGVIYXNoAAAAAQUAAAAMc2hhMjU2RXhwb3J0CQAAAgAAAAECAAAAGEV4cG9ydCBIYXNoIDY0IGNoYXIuIG1heAMJAQAAAAEhAAAAAQkBAAAADHZhbGlkYXRlSGFzaAAAAAEFAAAADXNoYTI1NkxpY2VuY2UJAAACAAAAAQIAAAAZTGljZW5jZSBIYXNoIDY0IGNoYXIuIG1heAYBAAAADnZhbGlkYXRlU3RyaW5nAAAAAgAAAANzdHIAAAADbWF4AwkAAAAAAAACCQABMQAAAAEFAAAAA3N0cgAAAAAAAAAAAAkAAAIAAAABAgAAABhGaWVsZCBjYW5ub3QgYmUgaXMgZW1wdHkDCQAAZgAAAAIJAAExAAAAAQUAAAADc3RyBQAAAANtYXgJAAACAAAAAQkAASwAAAACBQAAAANzdHICAAAADCBpcyB0b28gbG9uZwYBAAAADHZhbGlkYXRlVXNlcgAAAAEAAAAGY2FsbGVyBAAAAAp1c2VyU3RhdHVzCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAACHVzZXJEYXBwCQEAAAANa2V5VXNlclN0YXR1cwAAAAEFAAAABmNhbGxlcgUAAAAQdXNlclVucmVnaXN0ZXJlZAMDCQAAAAAAAAIFAAAACnVzZXJTdGF0dXMFAAAAEHVzZXJVbnJlZ2lzdGVyZWQGCQAAAAAAAAIFAAAACnVzZXJTdGF0dXMFAAAAC3VzZXJBbGxvd2VkAgAAAC5SZWdpc3RlciB0aGlzIGFjY291bnQgZmlyc3Qgd2l0aCAiQWNjb3VudCIgdGFiAwkAAAAAAAACBQAAAAp1c2VyU3RhdHVzBQAAAA11c2VyU3VzcGVuZGVkAgAAABFBY2NvdW50IHN1c3BlbmRlZAMJAAAAAAAAAgUAAAAKdXNlclN0YXR1cwUAAAALdXNlclJlbW92ZWQCAAAAD0FjY291bnQgcmVtb3ZlZAIAAAAAAQAAAApzZXRMSWNlbmNlAAAAAgAAAApjaWRMaWNlbmNlAAAADXNoYTI1NkxpY2VuY2UEAAAAA2NpZAMJAAAAAAAAAgkAATEAAAABBQAAAApjaWRMaWNlbmNlAAAAAAAAAAAABQAAAA5kZWZhdWx0TGljZW5jZQUAAAAKY2lkTGljZW5jZQQAAAAEaGFzaAMJAAAAAAAAAgkAATEAAAABBQAAAA1zaGEyNTZMaWNlbmNlAAAAAAAAAAAABQAAABJkZWZhdWx0SGFzaExpY2VuY2UFAAAADXNoYTI1NkxpY2VuY2UJAAUUAAAAAgUAAAADY2lkBQAAAARoYXNoAQAAABN2YWxpZGF0ZUFydHdvcmtEYXRhAAAACgAAAAZjYWxsZXIAAAAKY2lkRGlzcGxheQAAAAljaWRFeHBvcnQAAAAKbGljZW5jZUNJRAAAAAxzaGEyNTZFeHBvcnQAAAALbGljZW5jZUhhc2gAAAAEbmFtZQAAAAtk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Y2VuY2UFAAAADXNoYTI1NkxpY2VuY2UEAAAACmxpY2VuY2VDSUQIBQAAAA0kdDAxNTk1NzE2MDI2AAAAAl8xBAAAAAtsaWNlbmNlSGFzaAgFAAAADSR0MDE1OTU3MTYwMjYAAAACXzIEAAAAD3ZhbGlkYXRlQXJ0d29yawkBAAAAE3ZhbGlkYXRlQXJ0d29ya0RhdGEAAAAKBQAAAAZjYWxsZXIFAAAACmNpZERpc3BsYXkFAAAACWNpZEV4cG9ydAUAAAAKbGljZW5jZUNJRAUAAAAMc2hhMjU2RXhwb3J0BQAAAAtsaWNlbmNlSGFzaAUAAAAEbmFtZQUAAAALZGVzY3JpcHRpb24FAAAABHRhZ3MFAAAAB21heG1pbnQDCQEAAAACIT0AAAACBQAAAA92YWxpZGF0ZUFydHdvcmsCAAAAAAkAAAIAAAABAgAAABVTb21ldGhpbmcgd2VudCB3cm9uZyEEAAAADSR0MDE2MjU0MTYyOTYJAQAAAA92YWxpZGF0ZVBheW1lbnQAAAABBQAAAAFpBAAAAAZhbW91bnQIBQAAAA0kdDAxNjI1NDE2Mjk2AAAAAl8xBAAAAAdhc3NldElkCAUAAAANJHQwMTYyNTQxNjI5NgAAAAJfMgMJAQAAAAEhAAAAAQkBAAAACWlzRGVmaW5lZAAAAAEFAAAABmFtb3VudAkAAAIAAAABAgAAABRTb21ldGhpbmcgd2VudCB3cm9uZwQAAAAKZW50cnlFeGlzdAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAEmtleVR4aWRCeUhhc2hPd25lcgAAAAIFAAAACnNoYTI1Nkhhc2gFAAAABmNhbGxlcgMJAQAAAAIhPQAAAAIFAAAACmVudHJ5RXhpc3QCAAAAAAkAAAIAAAABAgAAABRZb3UgYWxyZWFkeSBhZGRlZCBpdAQAAAAJaGFzaEV4aXN0CQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAOa2V5T3duZXJCeUhhc2gAAAABBQAAAApzaGEyNTZIYXNoAwkBAAAAAiE9AAAAAgUAAAAJaGFzaEV4aXN0AgAAAAAJAAACAAAAAQIAAAAXSGFzaCBhbHJlYWR5IHJlZ2lzdGVyZWQEAAAAD2lzU2lnbkNlcnRpZmllZAkBAAAAFGNoZWNrU2lnbkNlcnRpZmljYXRlAAAAAwUAAAAGc2lnbklEBQAAAAZjYWxsZXIFAAAACnNoYTI1Nkhhc2gDCQEAAAABIQAAAAEFAAAAD2lzU2lnbkNlcnRpZmllZAkAAAIAAAABAgAAACxTaWduIENlcnRpZmljYXRlIG5vdCBmb3VuZCBmb3IgdGhpcyBhZGRyZXNzLgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAOa2V5T3duZXJCeUhhc2gAAAABBQAAAApzaGEyNTZIYXNoBQAAAAZjYWxsZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEmtleVR4aWRCeUhhc2hPd25lcgAAAAIFAAAACnNoYTI1Nkhhc2gFAAAABmNhbGxlcgUAAAAFYXJ0SWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAdrZXlEYXRlAAAAAgUAAAAGY2FsbGVyBQAAAAVhcnRJZAUAAAAEZGF0ZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAHa2V5TmFtZQAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAABG5hbWUJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAB2tleURlc2MAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAtkZXNjcmlwdGlvbgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAANa2V5RGlzcGxheUNpZAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAACmNpZERpc3BsYXkJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAADGtleUV4cG9ydENpZAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAACWNpZEV4cG9ydAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAANa2V5RXhwb3J0SGFzaAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAADHNoYTI1NkV4cG9ydAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAOa2V5TGljZW5jZUhhc2gAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAtsaWNlbmNlSGFzaAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAANa2V5TGljZW5jZUNpZAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAACmxpY2VuY2VDSUQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAB2tleVR5cGUAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAR0eXBlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAdrZXlUYWdzAAAAAgUAAAAGY2FsbGVyBQAAAAVhcnRJZAUAAAAEdGFncwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAACmtleU1heE1pbnQAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAdtYXhtaW50CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAlrZXlTaWduSUQAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAZzaWduSUQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAlrZXlJc3N1ZWQAAAACBQAAAAZjYWxsZXIFAAAABWFydElkAAAAAAAAAAAACQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACCQEAAAAJa2V5T25TYWxlAAAAAgUAAAAGY2FsbGVyBQAAAAVhcnRJZAcJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAADWtleWlkQnlTaWduaWQAAAACBQAAAAZjYWxsZXIFAAAABnNpZ25JRAUAAAAFYXJ0SWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEWtleUhhc2hCeVR4aWRBZGRyAAAAAgUAAAAGY2FsbGVyBQAAAAVhcnRJZAUAAAAKc2hhMjU2SGFzaAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQUAAAALZmVlUmVjZWl2ZXIFAAAABmFtb3VudAUAAAAHYXNzZXRJZAUAAAADbmlsAAAAAWkBAAAADXVwZGF0ZUFydHdvcmsAAAALAAAABHR4aWQAAAAEbmFtZQAAAAtkZXNjcmlwdGlvbgAAAAR0YWdzAAAABHR5cGUAAAAHbWF4bWludAAAAApjaWREaXNwbGF5AAAADHNoYTI1NkV4cG9ydAAAAAljaWRFeHBvcnQAAAANc2hhMjU2TGljZW5jZQAAAApjaWRMaWNlbmNlAwkBAAAAASEAAAABBQAAAAtkYXBwUnVubmluZwkAAAIAAAABBQAAAA5tYWludGVuYW5jZU1TRwQAAAAGY2FsbGVyCQACWAAAAAEICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMEAAAADSR0MDE5MDE3MTkwODYJAQAAAApzZXRMSWNlbmNlAAAAAgUAAAAKY2lkTGljZW5jZQUAAAANc2hhMjU2TGljZW5jZQQAAAAKbGljZW5jZUNJRAgFAAAADSR0MDE5MDE3MTkwODYAAAACXzEEAAAAC2xpY2VuY2VIYXNoCAUAAAANJHQwMTkwMTcxOTA4NgAAAAJfMgQAAAAPdmFsaWRhdGVBcnR3b3JrCQEAAAATdmFsaWRhdGVBcnR3b3JrRGF0YQAAAAoFAAAABmNhbGxlcgUAAAAKY2lkRGlzcGxheQUAAAAJY2lkRXhwb3J0BQAAAApsaWNlbmNlQ0lEBQAAAAxzaGEyNTZFeHBvcnQFAAAAC2xpY2VuY2VIYXNoBQAAAARuYW1lBQAAAAtkZXNjcmlwdGlvbgUAAAAEdGFncwUAAAAHbWF4bWludAMJAQAAAAIhPQAAAAIFAAAAD3ZhbGlkYXRlQXJ0d29yawIAAAAACQAAAgAAAAECAAAAFVNvbWV0aGluZyB3ZW50IHdyb25nIQQAAAAKZW50cnlFeGlzdAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAB2tleU5hbWUAAAACBQAAAAZjYWxsZXIFAAAABHR4aWQDCQAAAAAAAAIFAAAACmVudHJ5RXhpc3QCAAAAAAkAAAIAAAABAgAAAA9FbnRyeSBub3QgZm91bmQEAAAABGZsYWcJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAAdrZXlGbGFnAAAAAgUAAAAGY2FsbGVyBQAAAAR0eGlkAwkAAAAAAAACBQAAAARmbGFnAgAAAAdJTExFR0FMCQAAAgAAAAECAAAAHUNhbm5vdCB1cGRhdGUgSUxMRUdBTCBhcnR3b3JrAwkBAAAAASEAAAABCQEAAAALaXNBcnRNaW50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", "height": 1371837, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: HuArHuEcWy6Mim6Jn1QLWNPEr6HFVyWQHNsqookFduKX Next: FLQeUW8kFqVPCgBrZGG1NgNW69q9G4vL5ibtWLxYWQgn Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let unitTest = false
4+let unitTest = true
55
66 let oracleFee = value(addressFromString("3N2s5RtaHPBenCsx2ECcoFRbYHx3noZhXW1"))
77
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 $t089028938 = isPayment(i)
237+ let payment = $t089028938._1
238+ let amount = $t089028938._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 $t096389674 = isPayment(i)
263+ let payment = $t096389674._1
264+ let amount = $t096389674._2
256265 let assetId = if (!(isDefined(payment.assetId)))
257266 then unit
258267 else if (if ((size(priceAssetId) > 0))
270279 }
271280
272281
273-func acceptedAssetIds (assetId) = if (if (if ((assetId != toBase58String(signAssetId)))
282+func acceptedAssetIds (assetId) = if (if (if (if ((assetId != toBase58String(signAssetId)))
274283 then (assetId != toBase58String(wavesAssetId))
284+ else false)
285+ then (assetId != "WAVES")
275286 else false)
276287 then (assetId != toBase58String(usdnAssetId))
277288 else false)
309320 }
310321
311322
312-@Callable(invoke)
313-func addArtwork (sha256Hash,signID,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
323+func getPriceAssetIdFromBid (bidDataKey) = {
324+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
325+ if ((bidData == ""))
326+ then throw("Bid not found")
327+ else {
328+ let bidDataArr = split(bidData, "_")
329+ let bidAmount = parseIntValue(bidDataArr[1])
330+ let bidAssetId = if ((bidDataArr[0] == "WAVES"))
331+ then unit
332+ else fromBase58String(bidDataArr[0])
333+ if ((0 >= bidAmount))
334+ then throw("Wrong amount")
335+ else $Tuple2(bidAmount, bidAssetId)
336+ }
337+ }
338+
339+
340+func idCallerDate (i) = if (!(dappRunning))
314341 then throw(maintenanceMSG)
315- else {
316- let artId = toBase58String(invoke.transactionId)
317- let timestamp = lastBlock.timestamp
318- let caller = toBase58String(invoke.caller.bytes)
319- if (!(validateHash(sha256Hash)))
320- then throw("Hash should be 64 characters maximum")
321- else {
322- let $t01151411583 = setLIcence(cidLicence, sha256Licence)
323- let licenceCID = $t01151411583._1
324- let licenceHash = $t01151411583._2
325- let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
326- if ((validateArtwork != ""))
327- then throw("Something went wrong!")
328- else {
329- let $t01181111858 = validatePayment(invoke)
330- let amount = $t01181111858._1
331- let assetId = $t01181111858._2
332- if (!(isDefined(amount)))
333- then throw("Something went wrong")
334- else {
335- let entryExist = getStringByKey(keyArtTxidByHashOwner(sha256Hash, caller))
336- if ((entryExist != ""))
337- then throw("You already added it")
338- else {
339- let hashExist = getStringByKey(keyArtOwnerByHash(sha256Hash))
340- if ((hashExist != ""))
341- then throw("Hash already registered")
342- else {
343- let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
344- if (!(isSignCertified))
345- then throw("Sign Certificate not found for this address.")
346- 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)]
347- }
348- }
349- }
350- }
351- }
352- }
342+ else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
343+
344+
345+func buyMint (i,artId,issuer,bidId,bidOwner) = {
346+ let $t01177511813 = idCallerDate(i)
347+ let id = $t01177511813._1
348+ let caller = $t01177511813._2
349+ let date = $t01177511813._3
350+ let totalNFT = getIntegerByKey("total_nft_issued")
351+ let signID = getStringByKey(keySignID(issuer, artId))
352+ let artworkName = getStringByKey(keyName(issuer, artId))
353+ if ((artworkName == ""))
354+ then throw("Art doesn't exist")
355+ else {
356+ let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
357+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
358+ let artworkPrice = getIntegerByKey(keyPrice(issuer, artId))
359+ let priceAssetId = getStringByKey(keyAssetIdAccepted(issuer, artId))
360+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
361+ let isBid = if (if (if ((caller == issuer))
362+ then (bidOwner != "")
363+ else false)
364+ then (bidId != "")
365+ else false)
366+ then true
367+ else false
368+ let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
369+ if (if (if ((0 >= artworkPrice))
370+ then true
371+ else !(isOnSale))
372+ then true
373+ else (0 >= maxCanSell))
374+ then throw("Art not for sale")
375+ else {
376+ let $t01266012789 = if (isBid)
377+ then getPriceAssetIdFromBid(bidDataKey)
378+ else validatePriceAssetId(i, priceAssetId, artworkPrice)
379+ let amount = $t01266012789._1
380+ let assetId = $t01266012789._2
381+ let isWhitelisted = checkWhitelist(issuer)
382+ let cut = if ((isWhitelisted > height))
383+ then 0
384+ else if ((priceAssetId == toBase58String(signAssetId)))
385+ then signCut
386+ else usdnWaveCut
387+ let amountForSign = fraction(amount, cut, 100)
388+ let amountForCreator = (amount - amountForSign)
389+ if ((amountSold == maxCanSell))
390+ then throw("Art sold out")
391+ else {
392+ let newAmountSold = (amountSold + 1)
393+ let issueMeta = ((((((((((("Creator: " + issuer) + ",
394+ ArtID: ") + artId) + ",
395+ SignID: ") + signID) + ",
396+ Artwork name: ") + artworkName) + ",
397+ Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
398+ let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
399+ let idNFT = calculateAssetId(issueNFT)
400+ let sellStatus = if ((newAmountSold == maxCanSell))
401+ then false
402+ else true
403+ let receiveNFT = if (if (if ((caller == issuer))
404+ then (bidOwner != "")
405+ else false)
406+ then (bidId != "")
407+ else false)
408+ then addressFromStringValue(bidOwner)
409+ else i.caller
410+ 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)]
411+ let assetIdBid = if (!(isDefined(assetId)))
412+ then "WAVES"
413+ else toBase58String(value(assetId))
414+ let getBidData = getStringByKey((bidDataKey + "_OPEN"))
415+ let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
416+ let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((getBidData + "_") + toString(date)))
417+ let soldValue = if (!(isBid))
418+ then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
419+ else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
420+ let soldData = StringEntry(((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer), soldValue)
421+ if (isBid)
422+ then [soldData, bidUpdate, bidDelOld] :: buyRes
423+ else soldData :: buyRes
424+ }
425+ }
426+ }
427+ }
428+
429+
430+@Callable(i)
431+func addArtwork (sha256Hash,signID,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = {
432+ let $t01581515856 = idCallerDate(i)
433+ let artId = $t01581515856._1
434+ let caller = $t01581515856._2
435+ let date = $t01581515856._3
436+ if (!(validateHash(sha256Hash)))
437+ then throw("Hash should be 64 characters maximum")
438+ else {
439+ let $t01595716026 = setLIcence(cidLicence, sha256Licence)
440+ let licenceCID = $t01595716026._1
441+ let licenceHash = $t01595716026._2
442+ let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
443+ if ((validateArtwork != ""))
444+ then throw("Something went wrong!")
445+ else {
446+ let $t01625416296 = validatePayment(i)
447+ let amount = $t01625416296._1
448+ let assetId = $t01625416296._2
449+ if (!(isDefined(amount)))
450+ then throw("Something went wrong")
451+ else {
452+ let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
453+ if ((entryExist != ""))
454+ then throw("You already added it")
455+ else {
456+ let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
457+ if ((hashExist != ""))
458+ then throw("Hash already registered")
459+ else {
460+ let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
461+ if (!(isSignCertified))
462+ then throw("Sign Certificate not found for this address.")
463+ 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)]
464+ }
465+ }
466+ }
467+ }
468+ }
469+ }
353470
354471
355472
356-@Callable(invoke)
473+@Callable(i)
357474 func updateArtwork (txid,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
358475 then throw(maintenanceMSG)
359476 else {
360- let updateId = toBase58String(invoke.transactionId)
361- let caller = toBase58String(invoke.caller.bytes)
362- let $t01471314782 = setLIcence(cidLicence, sha256Licence)
363- let licenceCID = $t01471314782._1
364- let licenceHash = $t01471314782._2
477+ let caller = toBase58String(i.caller.bytes)
478+ let $t01901719086 = setLIcence(cidLicence, sha256Licence)
479+ let licenceCID = $t01901719086._1
480+ let licenceHash = $t01901719086._2
365481 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
366482 if ((validateArtwork != ""))
367483 then throw("Something went wrong!")
368484 else {
369- let entryExist = getStringByKey(keyArtName(caller, txid))
485+ let entryExist = getStringByKey(keyName(caller, txid))
370486 if ((entryExist == ""))
371487 then throw("Entry not found")
372488 else {
373- let flag = getStringByKey(keyArtFlag(caller, txid))
489+ let flag = getStringByKey(keyFlag(caller, txid))
374490 if ((flag == "ILLEGAL"))
375491 then throw("Cannot update ILLEGAL artwork")
376492 else if (!(isArtMinted(caller, txid)))
377- 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)]
493+ 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)]
378494 else throw("Already minted")
379495 }
380496 }
382498
383499
384500
385-@Callable(invoke)
501+@Callable(i)
386502 func flagArtwork (artId,addr,flag) = {
387- let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
388- let id = toBase58String(invoke.transactionId)
503+ let $t02055920592 = idCallerDate(i)
504+ let id = $t02055920592._1
505+ let caller = $t02055920592._2
389506 if (containsElement([chris, joep, toString(this)], caller))
390507 then if ((flag == "CONSENT"))
391- then [StringEntry(keyArtFlag(addr, artId), flag)]
508+ then [StringEntry(keyFlag(addr, artId), flag)]
392509 else if ((flag == ""))
393- then [StringEntry(keyArtFlag(addr, artId), flag)]
510+ then [StringEntry(keyFlag(addr, artId), flag)]
394511 else if ((flag == "CHANGE_REQUIRED"))
395- then [StringEntry(keyArtFlag(addr, artId), flag)]
396- else if ((flag == "ILLEGAL"))
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), "")]
512+ then [StringEntry(keyFlag(addr, artId), flag)]
513+ else if (if ((flag == "ILLEGAL"))
514+ then containsElement([chris, toString(this)], caller)
515+ else false)
516+ 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), "")]
398517 else throw(("Unknow status " + flag))
399518 else throw("You are not allowed")
400519 }
401520
402521
403522
404-@Callable(invoke)
523+@Callable(i)
405524 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))
525+ let $t02161121644 = idCallerDate(i)
526+ let id = $t02161121644._1
527+ let caller = $t02161121644._2
528+ let addrToUse = if (containsElement([chris, joep, toString(this)], caller))
409529 then addr
410530 else caller
411- let entryExist = getStringByKey(keyArtName(addressToUse, artId))
531+ let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
412532 if ((entryExist == ""))
413533 then throw("No art matching for this address")
414534 else {
415- let sha256Hash = getStringByKey(keyArtHashByTxidAddr(addressToUse, artId))
535+ let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
416536 if ((sha256Hash == ""))
417537 then throw("No art hash matching for this address")
418538 else {
419- let signID = getStringByKey(keyArtSignID(addressToUse, artId))
539+ let signID = getStringByKey(keySignID(addrToUse, artId))
420540 if ((signID == ""))
421541 then throw("No SIGN ID matching")
422542 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)))
543+ 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))]
544+ if (!(isArtMinted(addrToUse, artId)))
425545 then if (!(dappRunning))
426546 then throw(maintenanceMSG)
427547 else dataToDelete
435555
436556
437557
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)
558+@Callable(i)
559+func sellArtwork (artId,price,maxMint,assetId) = {
560+ let $t02401024043 = idCallerDate(i)
561+ let id = $t02401024043._1
562+ let caller = $t02401024043._2
563+ let artworkName = getStringByKey(keyName(caller, artId))
564+ if ((artworkName == ""))
565+ then throw("This art doesn't match your account")
566+ else {
567+ let exportCID = getStringByKey(keyExportCid(caller, artId))
568+ if ((size(split(exportCID, "/")[0]) != 59))
569+ then throw("You cannot sell art with no export file")
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(keyIssued(caller, artId))
580+ let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
581+ if ((maxMint > 10))
582+ then throw("10 editions max per artwork")
583+ else if (if ((amountSold != 0))
584+ then (amountSold == maxCanSell)
585+ 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)
471594 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- }
595+ then true
596+ else false
597+[BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), StringEntry(keyAssetIdAccepted(caller, artId), assetId)]
598+ }
599+ }
600+ }
601+ }
602+ }
490603
491604
492605
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")
606+@Callable(i)
607+func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "")
608+
609+
610+
611+@Callable(i)
612+func setBid (artId,issuer) = {
613+ let $t02583925877 = idCallerDate(i)
614+ let id = $t02583925877._1
615+ let caller = $t02583925877._2
616+ let date = $t02583925877._3
617+ let $t02588225918 = isPayment(i)
618+ let payment = $t02588225918._1
619+ let amount = $t02588225918._2
620+ let assetId = if (!(isDefined(payment.assetId)))
621+ then "WAVES"
622+ else toBase58String(value(payment.assetId))
623+ if (!(acceptedAssetIds(assetId)))
624+ then throw("Something went wrong!")
625+ else if (!(validateMinSell(assetId, amount)))
626+ then throw("Something went wrong!")
504627 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 $t02317523255 = validatePriceAssetId(invoke, priceAssetId, artworkPrice)
525- let amount = $t02317523255._1
526- let assetId = $t02317523255._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- }
628+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
629+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
630+ if ((amountSold >= maxCanSell))
631+ then throw("Sold out, you cannot bid")
632+ else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date)))]
561633 }
562- }
634+ }
635+
636+
637+
638+@Callable(i)
639+func acceptBid (artId,issuer,bidId,bidOwner) = {
640+ let caller = toBase58String(i.caller.bytes)
641+ if ((caller != issuer))
642+ then throw("You cannot do this action")
643+ else buyMint(i, artId, issuer, bidId, bidOwner)
644+ }
645+
646+
647+
648+@Callable(i)
649+func cancelBid (artId,issuer,bidId,bidOwner) = {
650+ let $t02689926937 = idCallerDate(i)
651+ let id = $t02689926937._1
652+ let caller = $t02689926937._2
653+ let date = $t02689926937._3
654+ if (if ((caller != bidOwner))
655+ then (caller != issuer)
656+ else false)
657+ then throw("You cannot do this action")
658+ else {
659+ let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
660+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
661+ if ((bidData == ""))
662+ then throw("Bid not found")
663+ else {
664+ let bidDataArr = split(bidData, "_")
665+ let assetId = if ((bidDataArr[0] == "WAVES"))
666+ then unit
667+ else fromBase58String(bidDataArr[0])
668+ let bidStatus = if ((caller == bidOwner))
669+ then "CANCELED"
670+ else "REJECTED"
671+[DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), ScriptTransfer(Address(fromBase58String(bidOwner)), parseIntValue(bidDataArr[1]), assetId)]
672+ }
673+ }
674+ }
563675
564676
565677
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let unitTest = false
4+let unitTest = true
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 $t089028938 = isPayment(i)
237+ let payment = $t089028938._1
238+ let amount = $t089028938._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 $t096389674 = isPayment(i)
263+ let payment = $t096389674._1
264+ let amount = $t096389674._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
273-func acceptedAssetIds (assetId) = if (if (if ((assetId != toBase58String(signAssetId)))
282+func acceptedAssetIds (assetId) = if (if (if (if ((assetId != toBase58String(signAssetId)))
274283 then (assetId != toBase58String(wavesAssetId))
284+ else false)
285+ then (assetId != "WAVES")
275286 else false)
276287 then (assetId != toBase58String(usdnAssetId))
277288 else false)
278289 then throw("Only SIGN, USDN or WAVES accepted")
279290 else true
280291
281292
282293 func validateMinSell (assetId,price) = {
283294 let minSellWaves = if (unitTest)
284295 then 1
285296 else getIntegerByKeyFromOracle("waves_min_sell")
286297 let minSellUsdn = 1000000
287298 let minSellSign = if (unitTest)
288299 then 1
289300 else (getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId))) * 2)
290301 if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
291302 then (minSellUsdn > price)
292303 else false)
293304 then (price != 0)
294305 else false)
295306 then true
296307 else if (if ((assetId == toBase58String(signAssetId)))
297308 then (minSellSign > price)
298309 else false)
299310 then (price != 0)
300311 else false)
301312 then true
302313 else if (if ((assetId == toBase58String(wavesAssetId)))
303314 then (minSellWaves > price)
304315 else false)
305316 then (price != 0)
306317 else false)
307318 then throw("Wrong minimum sell price")
308319 else true
309320 }
310321
311322
312-@Callable(invoke)
313-func addArtwork (sha256Hash,signID,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
323+func getPriceAssetIdFromBid (bidDataKey) = {
324+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
325+ if ((bidData == ""))
326+ then throw("Bid not found")
327+ else {
328+ let bidDataArr = split(bidData, "_")
329+ let bidAmount = parseIntValue(bidDataArr[1])
330+ let bidAssetId = if ((bidDataArr[0] == "WAVES"))
331+ then unit
332+ else fromBase58String(bidDataArr[0])
333+ if ((0 >= bidAmount))
334+ then throw("Wrong amount")
335+ else $Tuple2(bidAmount, bidAssetId)
336+ }
337+ }
338+
339+
340+func idCallerDate (i) = if (!(dappRunning))
314341 then throw(maintenanceMSG)
315- else {
316- let artId = toBase58String(invoke.transactionId)
317- let timestamp = lastBlock.timestamp
318- let caller = toBase58String(invoke.caller.bytes)
319- if (!(validateHash(sha256Hash)))
320- then throw("Hash should be 64 characters maximum")
321- else {
322- let $t01151411583 = setLIcence(cidLicence, sha256Licence)
323- let licenceCID = $t01151411583._1
324- let licenceHash = $t01151411583._2
325- let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
326- if ((validateArtwork != ""))
327- then throw("Something went wrong!")
328- else {
329- let $t01181111858 = validatePayment(invoke)
330- let amount = $t01181111858._1
331- let assetId = $t01181111858._2
332- if (!(isDefined(amount)))
333- then throw("Something went wrong")
334- else {
335- let entryExist = getStringByKey(keyArtTxidByHashOwner(sha256Hash, caller))
336- if ((entryExist != ""))
337- then throw("You already added it")
338- else {
339- let hashExist = getStringByKey(keyArtOwnerByHash(sha256Hash))
340- if ((hashExist != ""))
341- then throw("Hash already registered")
342- else {
343- let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
344- if (!(isSignCertified))
345- then throw("Sign Certificate not found for this address.")
346- 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)]
347- }
348- }
349- }
350- }
351- }
352- }
342+ else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
343+
344+
345+func buyMint (i,artId,issuer,bidId,bidOwner) = {
346+ let $t01177511813 = idCallerDate(i)
347+ let id = $t01177511813._1
348+ let caller = $t01177511813._2
349+ let date = $t01177511813._3
350+ let totalNFT = getIntegerByKey("total_nft_issued")
351+ let signID = getStringByKey(keySignID(issuer, artId))
352+ let artworkName = getStringByKey(keyName(issuer, artId))
353+ if ((artworkName == ""))
354+ then throw("Art doesn't exist")
355+ else {
356+ let isOnSale = getBooleanByKey(keyOnSale(issuer, artId))
357+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
358+ let artworkPrice = getIntegerByKey(keyPrice(issuer, artId))
359+ let priceAssetId = getStringByKey(keyAssetIdAccepted(issuer, artId))
360+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
361+ let isBid = if (if (if ((caller == issuer))
362+ then (bidOwner != "")
363+ else false)
364+ then (bidId != "")
365+ else false)
366+ then true
367+ else false
368+ let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
369+ if (if (if ((0 >= artworkPrice))
370+ then true
371+ else !(isOnSale))
372+ then true
373+ else (0 >= maxCanSell))
374+ then throw("Art not for sale")
375+ else {
376+ let $t01266012789 = if (isBid)
377+ then getPriceAssetIdFromBid(bidDataKey)
378+ else validatePriceAssetId(i, priceAssetId, artworkPrice)
379+ let amount = $t01266012789._1
380+ let assetId = $t01266012789._2
381+ let isWhitelisted = checkWhitelist(issuer)
382+ let cut = if ((isWhitelisted > height))
383+ then 0
384+ else if ((priceAssetId == toBase58String(signAssetId)))
385+ then signCut
386+ else usdnWaveCut
387+ let amountForSign = fraction(amount, cut, 100)
388+ let amountForCreator = (amount - amountForSign)
389+ if ((amountSold == maxCanSell))
390+ then throw("Art sold out")
391+ else {
392+ let newAmountSold = (amountSold + 1)
393+ let issueMeta = ((((((((((("Creator: " + issuer) + ",
394+ ArtID: ") + artId) + ",
395+ SignID: ") + signID) + ",
396+ Artwork name: ") + artworkName) + ",
397+ Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell))
398+ let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
399+ let idNFT = calculateAssetId(issueNFT)
400+ let sellStatus = if ((newAmountSold == maxCanSell))
401+ then false
402+ else true
403+ let receiveNFT = if (if (if ((caller == issuer))
404+ then (bidOwner != "")
405+ else false)
406+ then (bidId != "")
407+ else false)
408+ then addressFromStringValue(bidOwner)
409+ else i.caller
410+ 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)]
411+ let assetIdBid = if (!(isDefined(assetId)))
412+ then "WAVES"
413+ else toBase58String(value(assetId))
414+ let getBidData = getStringByKey((bidDataKey + "_OPEN"))
415+ let bidDelOld = DeleteEntry((bidDataKey + "_OPEN"))
416+ let bidUpdate = StringEntry((bidDataKey + "_CLOSED"), ((getBidData + "_") + toString(date)))
417+ let soldValue = if (!(isBid))
418+ then ((((((((((caller + "_") + toString(date)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))
419+ else ((((((((((toString(receiveNFT) + "_") + toString(date)) + "_") + id) + "_") + toString(amount)) + "_") + assetIdBid) + "_") + toBase58String(idNFT))
420+ let soldData = StringEntry(((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer), soldValue)
421+ if (isBid)
422+ then [soldData, bidUpdate, bidDelOld] :: buyRes
423+ else soldData :: buyRes
424+ }
425+ }
426+ }
427+ }
428+
429+
430+@Callable(i)
431+func addArtwork (sha256Hash,signID,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = {
432+ let $t01581515856 = idCallerDate(i)
433+ let artId = $t01581515856._1
434+ let caller = $t01581515856._2
435+ let date = $t01581515856._3
436+ if (!(validateHash(sha256Hash)))
437+ then throw("Hash should be 64 characters maximum")
438+ else {
439+ let $t01595716026 = setLIcence(cidLicence, sha256Licence)
440+ let licenceCID = $t01595716026._1
441+ let licenceHash = $t01595716026._2
442+ let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
443+ if ((validateArtwork != ""))
444+ then throw("Something went wrong!")
445+ else {
446+ let $t01625416296 = validatePayment(i)
447+ let amount = $t01625416296._1
448+ let assetId = $t01625416296._2
449+ if (!(isDefined(amount)))
450+ then throw("Something went wrong")
451+ else {
452+ let entryExist = getStringByKey(keyTxidByHashOwner(sha256Hash, caller))
453+ if ((entryExist != ""))
454+ then throw("You already added it")
455+ else {
456+ let hashExist = getStringByKey(keyOwnerByHash(sha256Hash))
457+ if ((hashExist != ""))
458+ then throw("Hash already registered")
459+ else {
460+ let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
461+ if (!(isSignCertified))
462+ then throw("Sign Certificate not found for this address.")
463+ 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)]
464+ }
465+ }
466+ }
467+ }
468+ }
469+ }
353470
354471
355472
356-@Callable(invoke)
473+@Callable(i)
357474 func updateArtwork (txid,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
358475 then throw(maintenanceMSG)
359476 else {
360- let updateId = toBase58String(invoke.transactionId)
361- let caller = toBase58String(invoke.caller.bytes)
362- let $t01471314782 = setLIcence(cidLicence, sha256Licence)
363- let licenceCID = $t01471314782._1
364- let licenceHash = $t01471314782._2
477+ let caller = toBase58String(i.caller.bytes)
478+ let $t01901719086 = setLIcence(cidLicence, sha256Licence)
479+ let licenceCID = $t01901719086._1
480+ let licenceHash = $t01901719086._2
365481 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
366482 if ((validateArtwork != ""))
367483 then throw("Something went wrong!")
368484 else {
369- let entryExist = getStringByKey(keyArtName(caller, txid))
485+ let entryExist = getStringByKey(keyName(caller, txid))
370486 if ((entryExist == ""))
371487 then throw("Entry not found")
372488 else {
373- let flag = getStringByKey(keyArtFlag(caller, txid))
489+ let flag = getStringByKey(keyFlag(caller, txid))
374490 if ((flag == "ILLEGAL"))
375491 then throw("Cannot update ILLEGAL artwork")
376492 else if (!(isArtMinted(caller, txid)))
377- 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)]
493+ 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)]
378494 else throw("Already minted")
379495 }
380496 }
381497 }
382498
383499
384500
385-@Callable(invoke)
501+@Callable(i)
386502 func flagArtwork (artId,addr,flag) = {
387- let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
388- let id = toBase58String(invoke.transactionId)
503+ let $t02055920592 = idCallerDate(i)
504+ let id = $t02055920592._1
505+ let caller = $t02055920592._2
389506 if (containsElement([chris, joep, toString(this)], caller))
390507 then if ((flag == "CONSENT"))
391- then [StringEntry(keyArtFlag(addr, artId), flag)]
508+ then [StringEntry(keyFlag(addr, artId), flag)]
392509 else if ((flag == ""))
393- then [StringEntry(keyArtFlag(addr, artId), flag)]
510+ then [StringEntry(keyFlag(addr, artId), flag)]
394511 else if ((flag == "CHANGE_REQUIRED"))
395- then [StringEntry(keyArtFlag(addr, artId), flag)]
396- else if ((flag == "ILLEGAL"))
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), "")]
512+ then [StringEntry(keyFlag(addr, artId), flag)]
513+ else if (if ((flag == "ILLEGAL"))
514+ then containsElement([chris, toString(this)], caller)
515+ else false)
516+ 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), "")]
398517 else throw(("Unknow status " + flag))
399518 else throw("You are not allowed")
400519 }
401520
402521
403522
404-@Callable(invoke)
523+@Callable(i)
405524 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))
525+ let $t02161121644 = idCallerDate(i)
526+ let id = $t02161121644._1
527+ let caller = $t02161121644._2
528+ let addrToUse = if (containsElement([chris, joep, toString(this)], caller))
409529 then addr
410530 else caller
411- let entryExist = getStringByKey(keyArtName(addressToUse, artId))
531+ let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
412532 if ((entryExist == ""))
413533 then throw("No art matching for this address")
414534 else {
415- let sha256Hash = getStringByKey(keyArtHashByTxidAddr(addressToUse, artId))
535+ let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
416536 if ((sha256Hash == ""))
417537 then throw("No art hash matching for this address")
418538 else {
419- let signID = getStringByKey(keyArtSignID(addressToUse, artId))
539+ let signID = getStringByKey(keySignID(addrToUse, artId))
420540 if ((signID == ""))
421541 then throw("No SIGN ID matching")
422542 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)))
543+ 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))]
544+ if (!(isArtMinted(addrToUse, artId)))
425545 then if (!(dappRunning))
426546 then throw(maintenanceMSG)
427547 else dataToDelete
428548 else if (containsElement([chris, toString(this)], caller))
429549 then dataToDelete
430550 else throw("Art already minted, you cannot delete it")
431551 }
432552 }
433553 }
434554 }
435555
436556
437557
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)
558+@Callable(i)
559+func sellArtwork (artId,price,maxMint,assetId) = {
560+ let $t02401024043 = idCallerDate(i)
561+ let id = $t02401024043._1
562+ let caller = $t02401024043._2
563+ let artworkName = getStringByKey(keyName(caller, artId))
564+ if ((artworkName == ""))
565+ then throw("This art doesn't match your account")
566+ else {
567+ let exportCID = getStringByKey(keyExportCid(caller, artId))
568+ if ((size(split(exportCID, "/")[0]) != 59))
569+ then throw("You cannot sell art with no export file")
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(keyIssued(caller, artId))
580+ let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
581+ if ((maxMint > 10))
582+ then throw("10 editions max per artwork")
583+ else if (if ((amountSold != 0))
584+ then (amountSold == maxCanSell)
585+ 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)
471594 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- }
595+ then true
596+ else false
597+[BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), StringEntry(keyAssetIdAccepted(caller, artId), assetId)]
598+ }
599+ }
600+ }
601+ }
602+ }
490603
491604
492605
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")
606+@Callable(i)
607+func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "")
608+
609+
610+
611+@Callable(i)
612+func setBid (artId,issuer) = {
613+ let $t02583925877 = idCallerDate(i)
614+ let id = $t02583925877._1
615+ let caller = $t02583925877._2
616+ let date = $t02583925877._3
617+ let $t02588225918 = isPayment(i)
618+ let payment = $t02588225918._1
619+ let amount = $t02588225918._2
620+ let assetId = if (!(isDefined(payment.assetId)))
621+ then "WAVES"
622+ else toBase58String(value(payment.assetId))
623+ if (!(acceptedAssetIds(assetId)))
624+ then throw("Something went wrong!")
625+ else if (!(validateMinSell(assetId, amount)))
626+ then throw("Something went wrong!")
504627 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 $t02317523255 = validatePriceAssetId(invoke, priceAssetId, artworkPrice)
525- let amount = $t02317523255._1
526- let assetId = $t02317523255._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- }
628+ let amountSold = getIntegerByKey(keyIssued(issuer, artId))
629+ let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
630+ if ((amountSold >= maxCanSell))
631+ then throw("Sold out, you cannot bid")
632+ else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date)))]
561633 }
562- }
634+ }
635+
636+
637+
638+@Callable(i)
639+func acceptBid (artId,issuer,bidId,bidOwner) = {
640+ let caller = toBase58String(i.caller.bytes)
641+ if ((caller != issuer))
642+ then throw("You cannot do this action")
643+ else buyMint(i, artId, issuer, bidId, bidOwner)
644+ }
645+
646+
647+
648+@Callable(i)
649+func cancelBid (artId,issuer,bidId,bidOwner) = {
650+ let $t02689926937 = idCallerDate(i)
651+ let id = $t02689926937._1
652+ let caller = $t02689926937._2
653+ let date = $t02689926937._3
654+ if (if ((caller != bidOwner))
655+ then (caller != issuer)
656+ else false)
657+ then throw("You cannot do this action")
658+ else {
659+ let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
660+ let bidData = getStringByKey((bidDataKey + "_OPEN"))
661+ if ((bidData == ""))
662+ then throw("Bid not found")
663+ else {
664+ let bidDataArr = split(bidData, "_")
665+ let assetId = if ((bidDataArr[0] == "WAVES"))
666+ then unit
667+ else fromBase58String(bidDataArr[0])
668+ let bidStatus = if ((caller == bidOwner))
669+ then "CANCELED"
670+ else "REJECTED"
671+[DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), ScriptTransfer(Address(fromBase58String(bidOwner)), parseIntValue(bidDataArr[1]), assetId)]
672+ }
673+ }
674+ }
563675
564676
565677
566678 @Callable(i)
567679 func deleteEntry (entry) = {
568680 let caller = toString(addressFromPublicKey(i.callerPublicKey))
569681 if ((caller == chris))
570682 then [DeleteEntry(entry)]
571683 else throw("no")
572684 }
573685
574686

github/deemru/w8io/3ef1775 
184.74 ms