tx · HM8FCLojvoP8XzLNo4w3FuMCGUFfgGgrBXug1yqj8K8P

3N1CYgyJqi5s7uHqiAuGnb86PxXAPBEJ2hg:  -0.01400000 Waves

2021.01.05 14:21 [1340024] smart account 3N1CYgyJqi5s7uHqiAuGnb86PxXAPBEJ2hg > SELF 0.00000000 Waves

{ "type": 13, "id": "HM8FCLojvoP8XzLNo4w3FuMCGUFfgGgrBXug1yqj8K8P", "fee": 1400000, "feeAssetId": null, "timestamp": 1609845742823, "version": 2, "chainId": 84, "sender": "3N1CYgyJqi5s7uHqiAuGnb86PxXAPBEJ2hg", "senderPublicKey": "75wzrSTzcF5qMYeuwuLWeziy4CgffobpM7wFcCFcCTkU", "proofs": [ "4mebYLNk7xZx6v7MkDXrr5LyhR4zDjzyef9kY525ACYRiqbyK4ghMhGr7aapiyNpk87NuoDGr5nPUK5Rr6LbBrwJ" ], "script": "base64:AAIEAAAAAAAAADwIAhIOCgwICAgICAgBCAgICAgSDQoLCAgICAgBCAgICAgSBQoDCAgIEgQKAggIEgYKBAgBAQgSBAoCCAgAAABBAAAAAAh1bml0VGVzdAcAAAAACW9yYWNsZUZlZQkBAAAABXZhbHVlAAAAAQkABCYAAAABAgAAACMzTjJzNVJ0YUhQQmVuQ3N4MkVDY29GUmJZSHgzbm9aaFhXMQAAAAAIc2lnbkRhcHAJAQAAAAV2YWx1ZQAAAAEJAAQmAAAAAQIAAAAjM05DMjhoU2l2cm1zVFVYYVlEMXg2TDM2Mko0WnBVbm9UZEIAAAAAC2ZlZVJlY2VpdmVyAgAAACMzTjFFNnRYZGRSb1ZhUmZROWRRM3ZnNUxhVzJmc2Q4SEt1YgAAAAAIdXNlckRhcHADBQAAAAh1bml0VGVzdAkBAAAABXZhbHVlAAAAAQkABCYAAAABAgAAACMzTXQ0UkdNRXlqU1dZQW9jVFBxZDU1d2RIUVFCM1BVMlVDbQkBAAAABXZhbHVlAAAAAQkABCYAAAABAgAAACMzTXg5S1UycVdBZ0hmcDFoM2l5VnNkaUhpejN1dVpGYkJVRwAAAAANd2hpdGVsaXN0RGFwcAkBAAAABXZhbHVlAAAAAQkABCYAAAABAgAAACMzTXVpZGl6QWNLVUtWelU2QXNERmZxY1pRQzdua1RFTW05NQAAAAALc2lnbkFzc2V0SWQBAAAAIOilarzKd0LycGEyNUpPRYO5uR7lmWcXw3Hq2QuhBK3rAAAAAAt1c2RuQXNzZXRJZAEAAAAgD/IcEqzkxDya7EYaqyWosOy6BytGzG2IcvC14pJJAbQAAAAADHdhdmVzQXNzZXRJZAEAAAAAAAAAAAVjaHJpcwIAAAAjM01zRzZqUE5DclZKVXRZQjdYSkJ4Uzd1dFdzWEFmNG45VnAAAAAABGpvZXACAAAAIzNNem00Vkx3c045dVp3YlRNelBqM1h1eFY2a0VmQVI4VUROAAAAAAdzaWduQ3V0AAAAAAAAAAAHAAAAAAt1c2RuV2F2ZUN1dAAAAAAAAAAACgAAAAAOZGVmYXVsdExpY2VuY2UCAAAAR2JhZnliZWlnaXNmcXR5bzJxZGZzY2VoNWZwY3A3ZWV5bXJwZWdscDZlZGFvMmJteWhpamJheXZhdXN5L2xpY2VuY2UucGRmAAAAABJkZWZhdWx0SGFzaExpY2VuY2UCAAAAQDNkZjc5ZDM0YWJiY2E5OTMwOGU3OWNiOTQ0NjFjMTg5MzU4MjYwNGQ2ODMyOWE0MWZkNGJlYzE4ODVlNmFkYjQAAAAAC2RhcHBSdW5uaW5nCQEAAAALdmFsdWVPckVsc2UAAAACCQAEGwAAAAIFAAAACHVzZXJEYXBwAgAAABRjb25mX2RhcHBfaXNfcnVubmluZwYAAAAADm1haW50ZW5hbmNlTVNHCQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAACHVzZXJEYXBwAgAAABRjb25mX21haW50ZW5hbmNlX21zZwIAAAAAAAAAAA11c2VyU3VzcGVuZGVkAgAAAAlTVVNQRU5ERUQAAAAAC3VzZXJSZW1vdmVkAgAAAAdSRU1PVkVEAAAAABB1c2VyVW5yZWdpc3RlcmVkAgAAAAxVTlJFR0lTVEVSRUQAAAAAC3VzZXJBbGxvd2VkAgAAAAdBTExPV0VEAQAAABdnZXRTdHJpbmdCeUtleUZyb21Vc2VycwAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAACHVzZXJEYXBwBQAAAANrZXkCAAAAAAEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABB0AAAACBQAAAAR0aGlzBQAAAANrZXkCAAAAAAEAAAAZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQAAAAEAAAADa2V5CQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAQaAAAAAgUAAAAJb3JhY2xlRmVlBQAAAANrZXkCAAAAH0ludGVnZXIgdW5kZWZpbmUgb3IgMCBpbiBvcmFjbGUBAAAAD2dldEludGVnZXJCeUtleQAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAABHRoaXMFAAAAA2tleQAAAAAAAAAAAAEAAAAOY2hlY2tXaGl0ZWxpc3QAAAABAAAAA2tleQkBAAAAC3ZhbHVlT3JFbHNlAAAAAgkABBoAAAACBQAAAA13aGl0ZWxpc3REYXBwBQAAAANrZXkAAAAAAAAAAAABAAAAD2dldEJvb2xlYW5C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dAAAAApjaWREaXNwbGF5AAAADHNoYTI1NkV4cG9ydAAAAAljaWRFeHBvcnQAAAANc2hhMjU2TGljZW5jZQAAAApjaWRMaWNlbmNlAwkBAAAAASEAAAABBQAAAAtkYXBwUnVubmluZwkAAAIAAAABBQAAAA5tYWludGVuYW5jZU1TRwQAAAAFYXJ0SWQJAAJYAAAAAQgFAAAABmludm9rZQAAAA10cmFuc2FjdGlvbklkBAAAAAl0aW1lc3RhbXAIBQAAAAlsYXN0QmxvY2sAAAAJdGltZXN0YW1wBAAAAAZjYWxsZXIJAAJYAAAAAQgIBQAAAAZpbnZva2UAAAAGY2FsbGVyAAAABWJ5dGVzAwkBAAAAASEAAAABCQEAAAAMdmFsaWRhdGVIYXNoAAAAAQUAAAAKc2hhMjU2SGFzaAkAAAIAAAABAgAAACRIYXNoIHNob3VsZCBiZSA2NCBjaGFyYWN0ZXJzIG1heGltdW0EAAAADSR0MDExNzI3MTE3OTYJAQAAAApzZXRMSWNlbmNlAAAAAgUAAAAKY2lkTGljZW5jZQUAAAANc2hhMjU2TGljZW5jZQQAAAAKbGljZW5jZUNJRAgFAAAADSR0MDExNzI3MTE3OTYAAAACXzEEAAAAC2xpY2VuY2VIYXNoCAUAAAANJHQwMTE3MjcxMTc5NgAAAAJfMgQAAAAPdmFsaWRhdGVBcnR3b3JrCQEAAAATdmFsaWRhdGVBcnR3b3JrRGF0YQAAAAoFAAAABmNhbGxlcgUAAAAKY2lkRGlzcGxheQUAAAAJY2lkRXhwb3J0BQAAAApsaWNlbmNlQ0lEBQAAAAxzaGEyNTZFeHBvcnQFAAAAC2xpY2VuY2VIYXNoBQAAAARuYW1lBQAAAAtkZXNjcmlwdGlvbgUAAAAEdGFncwUAAAAHbWF4bWludAMJAQAAAAIhPQAAAAIFAAAAD3ZhbGlkYXRlQXJ0d29yawIAAAAACQAAAgAAAAECAAAAFVNvbWV0aGluZyB3ZW50IHdyb25nIQQAAAANJHQwMTIwMjQxMjA3MQkBAAAAD3ZhbGlkYXRlUGF5bWVudAAAAAEFAAAABmludm9rZQQAAAAGYW1vdW50CAUAAAANJHQwMTIwMjQxMjA3MQAAAAJfMQQAAAAHYXNzZXRJZAgFAAAADSR0MDEyMDI0MTIwNzEAAAACXzIDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABBQAAAAZhbW91bnQJAAACAAAAAQIAAAAUU29tZXRoaW5nIHdlbnQgd3JvbmcEAAAACmVudHJ5RXhpc3QJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABVrZXlBcnRUeGlkQnlIYXNoT3duZXIAAAACBQAAAApzaGEyNTZIYXNoBQAAAAZjYWxsZXIDCQEAAAACIT0AAAACBQAAAAplbnRyeUV4aXN0AgAAAAAJAAACAAAAAQIAAAAUWW91IGFscmVhZHkgYWRkZWQgaXQEAAAACWhhc2hFeGlzdAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAEWtleUFydE93bmVyQnlIYXNoAAAAAQUAAAAKc2hhMjU2SGFzaAMJAQAAAAIhPQAAAAIFAAAACWhhc2hFeGlzdAIAAAAACQAAAgAAAAECAAAAF0hhc2ggYWxyZWFkeSByZWdpc3RlcmVkBAAAAA9pc1NpZ25DZXJ0aWZpZWQJAQAAABRjaGVja1NpZ25DZXJ0aWZpY2F0ZQAAAAMFAAAABnNpZ25JRAUAAAAGY2FsbGVyBQAAAApzaGEyNTZIYXNoAwkBAAAAASEAAAABBQAAAA9pc1NpZ25DZXJ0aWZpZWQJAAACAAAAAQIAAAAsU2lnbiBDZXJ0aWZpY2F0ZSBub3QgZm91bmQgZm9yIHRoaXMgYWRkcmVzcy4JAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEWtleUFydE93bmVyQnlIYXNoAAAAAQUAAAAKc2hhMjU2SGFzaAUAAAAGY2FsbGVyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABVrZXlBcnRUeGlkQnlIYXNoT3duZXIAAAACBQAAAApzaGEyNTZIYXNoBQAAAAZjYWxsZXIFAAAABWFydElkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAKa2V5QXJ0RGF0ZQAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAACXRpbWVzdGFtcAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAKa2V5QXJ0TmFtZQAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAABG5hbWUJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAACmtleUFydERlc2MAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAtkZXNjcmlwdGlvbgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAQa2V5QXJ0RGlzcGxheUNpZAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAACmNpZERpc3BsYXkJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2tleUFydEV4cG9ydENpZAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAACWNpZEV4cG9ydAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAQa2V5QXJ0RXhwb3J0SGFzaAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAADHNoYTI1NkV4cG9ydAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAARa2V5QXJ0TGljZW5jZUhhc2gAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAtsaWNlbmNlSGFzaAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAQa2V5QXJ0TGljZW5jZUNpZAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAACmxpY2VuY2VDSUQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAACmtleUFydFR5cGUAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAR0eXBlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAprZXlBcnRUYWdzAAAAAgUAAAAGY2FsbGVyBQAAAAVhcnRJZAUAAAAEdGFncwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADWtleUFydE1heE1pbnQAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAdtYXhtaW50CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAxrZXlBcnRTaWduSUQAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAZzaWduSUQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAxrZXlBcnRJc3N1ZWQAAAACBQAAAAZjYWxsZXIFAAAABWFydElkAAAAAAAAAAAACQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACCQEAAAAMa2V5QXJ0T25TYWxlAAAAAgUAAAAGY2FsbGVyBQAAAAVhcnRJZAcJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAE2tleUFydEFydGlkQnlTaWduaWQAAAACBQAAAAZjYWxsZXIFAAAABnNpZ25JRAUAAAAFYXJ0SWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAFGtleUFydEhhc2hCeVR4aWRBZGRyAAAAAgUAAAAGY2FsbGVyBQAAAAVhcnRJZAUAAAAKc2hhMjU2SGFzaAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQUAAAALZmVlUmVjZWl2ZXIFAAAABmFtb3VudAUAAAAHYXNzZXRJZAUAAAADbmlsAAAABmludm9rZQEAAAANdXBkYXRlQXJ0d29yawAAAAsAAAAEdHhpZAAAAARuYW1lAAAAC2Rlc2NyaXB0aW9uAAAABHRhZ3MAAAAEdHlwZQAAAAdtYXhtaW50AAAACmNpZERpc3BsYXkAAAAMc2hhMjU2RXhwb3J0AAAACWNpZEV4cG9ydAAAAA1zaGEyNTZMaWNlbmNlAAAACmNpZExpY2VuY2UDCQEAAAABIQAAAAEFAAAAC2RhcHBSdW5uaW5nCQAAAgAAAAEFAAAADm1haW50ZW5hbmNlTVNHBAAAAAh1cGRhdGVJZAkAAlgAAAABCAUAAAAGaW52b2tlAAAADXRyYW5zYWN0aW9uSWQEAAAABmNhbGxlcgkAAlgAAAABCAgFAAAABmludm9rZQAAAAZjYWxsZXIAAAAFYnl0ZXMEAAAADSR0MDE0OTI2MTQ5OTUJAQAAAApzZXRMSWNlbmNlAAAAAgUAAAAKY2lkTGljZW5jZQUAAAANc2hhMjU2TGljZW5jZQQAAAAKbGljZW5jZUNJRAgFAAAADSR0MDE0OTI2MTQ5OTUAAAACXzEEAAAAC2xpY2VuY2VIYXNoCAUAAAANJHQwMTQ5MjYxNDk5NQAAAAJfMgQAAAAPdmFsaWRhdGVBcnR3b3JrCQEAAAATdmFsaWRhdGVBcnR3b3JrRGF0YQAAAAoFAAAABmNhbGxlcgUAAAAKY2lkRGlzcGxheQUAAAAJY2lkRXhwb3J0BQAAAApsaWNlbmNlQ0lEBQAAAAxzaGEyNTZFeHBvcnQFAAAAC2xpY2VuY2VIYXNoBQAAAARuYW1lBQAAAAtkZXNjcmlwdGlvbgUAAAAEdGFncwUAAAAHbWF4bWludAMJAQAAAAIhPQAAAAIFAAAAD3ZhbGlkYXRlQXJ0d29yawIAAAAACQAAAgAAAAECAAAAFVNvbWV0aGluZyB3ZW50IHdyb25nIQQAAAAKZW50cnlFeGlzdAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAACmtleUFydE5hbWUAAAACBQAAAAZjYWxsZXIFAAAABHR4aWQDCQAAAAAAAAIFAAAACmVudHJ5RXhpc3QCAAAAAAkAAAIAAAABAgAAAA9FbnRyeSBub3QgZm91bmQEAAAABGZsYWcJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAAprZXlBcnRGbGFnAAAAAgUAAAAGY2FsbGVyBQAAAAR0eGlkAwkAAAAAAAACBQAAAARmbGFnAgAAAAdJTExFR0FMCQAAAgAAAAECAAAAHUNhbm5vdCB1cGRhdGUgSUxMRUdBTCBhcnR3b3JrAwkBAAAAASEAAAABCQEAAAALaXNBcnRNaW50ZWQAAAACBQAAAAZjYWxsZXIFAAAABHR4aWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAACmtleUFydE5hbWUAAAACBQAAAAZjYWxsZXIFAAAABHR4aWQFAAAABG5hbWUJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAACmtleUFydERlc2MAAAACBQAAAAZjYWxsZXIFAAAABHR4aWQFAAAAC2Rlc2NyaXB0aW9uCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBrZXlBcnREaXNwbGF5Q2lkAAAAAgUAAAAGY2FsbGVyBQAAAAR0eGlkBQAAAApjaWREaXNwbGF5CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA9rZXlBcnRFeHBvcnRDaWQAAAACBQAAAAZjYWxsZXIF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ZXNzVG9Vc2UFAAAABWFydElkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAABBrZXlBcnREaXNwbGF5Q2lkAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAPa2V5QXJ0RXhwb3J0Q2lkAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAQa2V5QXJ0RXhwb3J0SGFzaAAAAAIFAAAADGFkZHJlc3NUb1VzZQUAAAAFYXJ0SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAEWtleUFydExpY2VuY2VIYXNoAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAQa2V5QXJ0TGljZW5jZUNpZAAAAAIFAAAADGFkZHJlc3NUb1VzZQUAAAAFYXJ0SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAACmtleUFydFR5cGUAAAACBQAAAAxhZGRyZXNzVG9Vc2UFAAAABWFydElkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAAAprZXlBcnRUYWdzAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAANa2V5QXJ0TWF4TWludAAAAAIFAAAADGFkZHJlc3NUb1VzZQUAAAAFYXJ0SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAADGtleUFydFNpZ25JRAAAAAIFAAAADGFkZHJlc3NUb1VzZQUAAAAFYXJ0SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAADGtleUFydElzc3VlZAAAAAIFAAAADGFkZHJlc3NUb1VzZQUAAAAFYXJ0SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAADGtleUFydE9uU2FsZQAAAAIFAAAADGFkZHJlc3NUb1VzZQUAAAAFYXJ0SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAACmtleUFydEZsYWcAAAACBQAAAARhZGRyBQAAAAVhcnRJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAARa2V5QXJ0T3duZXJCeUhhc2gAAAABBQAAAApzaGEyNTZIYXNoCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAABNrZXlBcnRBcnRpZEJ5U2lnbmlkAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAZzaWduSUQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAFWtleUFydFR4aWRCeUhhc2hPd25lcgAAAAIFAAAACnNoYTI1Nkhhc2gFAAAADGFkZHJlc3NUb1VzZQUAAAADbmlsAwkBAAAAASEAAAABCQEAAAALaXNBcnRNaW50ZWQAAAACBQAAAAxhZGRyZXNzVG9Vc2UFAAAABWFydElkAwkBAAAAASEAAAABBQAAAAtkYXBwUnVubmluZwkAAAIAAAABBQAAAA5tYWludGVuYW5jZU1TRwUAAAAMZGF0YVRvRGVsZXRlAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIJAARMAAAAAgUAAAAFY2hyaXMJAARMAAAAAgkABCUAAAABBQAAAAR0aGlzBQAAAANuaWwFAAAABmNhbGxlcgUAAAAMZGF0YVRvRGVsZXRlCQAAAgAAAAECAAAAKEFydCBhbHJlYWR5IG1pbnRlZCwgeW91IGNhbm5vdCBkZWxldGUgaXQAAAAGaW52b2tlAQAAAAtzZWxsQXJ0d29yawAAAAQAAAAFYXJ0SWQAAAAFcHJpY2UAAAAHbWF4TWludAAAAAdhc3NldElkAwkBAAAAASEAAAABBQAAAAtkYXBwUnVubmluZwkAAAIAAAABBQAAAA5tYWludGVuYW5jZU1TRwQAAAACaWQJAAJYAAAAAQgFAAAABmludm9rZQAAAA10cmFuc2FjdGlvbklkBAAAAAZjYWxsZXIJAAJYAAAAAQgIBQAAAAZpbnZva2UAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAAhzZWxsRGF0ZQgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAEAAAAC2FydHdvcmtOYW1lCQEAAAAOZ2V0U3RyaW5n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aW50ZW5hbmNlTVNHBAAAAAJpZAkAAlgAAAABCAUAAAAGaW52b2tlAAAADXRyYW5zYWN0aW9uSWQEAAAABmNhbGxlcgkAAlgAAAABCAgFAAAABmludm9rZQAAAAZjYWxsZXIAAAAFYnl0ZXMEAAAACHRvdGFsTkZUCQEAAAAPZ2V0SW50ZWdlckJ5S2V5AAAAAQIAAAAQdG90YWxfbmZ0X2lzc3VlZAQAAAAGc2lnbklECQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAMa2V5QXJ0U2lnbklEAAAAAgUAAAAGaXNzdWVyBQAAAAVhcnRJZAQAAAALYXJ0d29ya05hbWUJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAAprZXlBcnROYW1lAAAAAgUAAAAGaXNzdWVyBQAAAAVhcnRJZAMJAAAAAAAAAgUAAAALYXJ0d29ya05hbWUCAAAAAAkAAAIAAAABAgAAABFBcnQgZG9lc24ndCBleGlzdAQAAAAKZGlzcGxheUNJRAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAEGtleUFydERpc3BsYXlDaWQAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAAlleHBvcnRDSUQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAA9rZXlBcnRFeHBvcnRDaWQAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAApleHBvcnRIYXNoCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAQa2V5QXJ0RXhwb3J0SGFzaAAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQEAAAACmxpY2VuY2VDSUQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABBrZXlBcnRMaWNlbmNlQ2lkAAAAAgUAAAAGaXNzdWVyBQAAAAVhcnRJZAQAAAALbGljZW5jZUhhc2gJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABFrZXlBcnRMaWNlbmNlSGFzaAAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQEAAAAC2Rlc2NyaXB0aW9uCQABLwAAAAIJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAAprZXlBcnREZXNjAAAAAgUAAAAGaXNzdWVyBQAAAAVhcnRJZAAAAAAAAAAAMgQAAAAIaXNPblNhbGUJAQAAAA9nZXRCb29sZWFuQnlLZXkAAAABCQEAAAAMa2V5QXJ0T25TYWxlAAAAAgUAAAAGaXNzdWVyBQAAAAVhcnRJZAQAAAAKYW1vdW50U29sZAkBAAAAD2dldEludGVnZXJCeUtleQAAAAEJAQAAAAxrZXlBcnRJc3N1ZWQAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAAxhcnR3b3JrUHJpY2UJAQAAAA9nZXRJbnRlZ2VyQnlLZXkAAAABCQEAAAALa2V5QXJ0UHJpY2UAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAAxwcmljZUFzc2V0SWQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABVrZXlBcnRBc3NldElkQWNjZXB0ZWQAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAApzb3VyY2VIYXNoCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAUa2V5QXJ0SGFzaEJ5VHhpZEFkZHIAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAAptYXhDYW5TZWxsCQEAAAAPZ2V0SW50ZWdlckJ5S2V5AAAAAQkBAAAADWtleUFydE1heE1pbnQAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkAwMDCQAAZwAAAAIAAAAAAAAAAAAFAAAADGFydHdvcmtQcmljZQYJAQAAAAEhAAAAAQUAAAAIaXNPblNhbGUGCQAAZwAAAAIAAAAAAAAAAAAFAAAACm1heENhblNlbGwJAAACAAAAAQIAAAAQQXJ0IG5vdCBmb3Igc2FsZQQAAAANJHQwMjMxMTkyMzE5OQkBAAAAFHZhbGlkYXRlUHJpY2VBc3NldElkAAAAAwUAAAAGaW52b2tlBQAAAAxwcmljZUFzc2V0SWQFAAAADGFydHdvcmtQcmljZQQAAAAGYW1vdW50CAUAAAANJHQwMjMxMTkyMzE5OQAAAAJfMQQAAAAHYXNzZXRJZAgFAAAADSR0MDIzMTE5MjMxOTkAAAACXzIEAAAADWlzV2hpdGVsaXN0ZWQJAQAAAA5jaGVja1doaXRlbGlzdAAAAAEFAAAABmlzc3VlcgQAAAADY3V0AwkAAAAAAAACBQAAAA1pc1doaXRl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", "height": 1340024, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: LeAs6EkKcbnkVbEXbQ2oEJU4yZwr5RWcRSaDAC6UdUf Next: none Diff:
OldNewDifferences
1111
1212 let userDapp = if (unitTest)
1313 then value(addressFromString("3Mt4RGMEyjSWYAocTPqd55wdHQQB3PU2UCm"))
14- else value(addressFromString("3N8xXaYjE27Aa79d5hHrhHu9HaFoTBmhDEj"))
14+ else value(addressFromString("3Mx9KU2qWAgHfp1h3iyVsdiHiz3uuZFbBUG"))
1515
16-let whitelistDapp = value(addressFromString("3Mt6jj1WUYqd7DT7dHEubs9jETLUXMcAB8k"))
16+let whitelistDapp = value(addressFromString("3MuidizAcKUKVzU6AsDFfqcZQC7nkTEMm95"))
1717
1818 let signAssetId = base58'Gf9t8FA4H3ssoZPCwrg3KwUFCci8zuUFP9ssRsUY3s6a'
1919
2727
2828 let signCut = 7
2929
30-let usdnCut = 10
31-
32-let wavesCut = 10
30+let usdnWaveCut = 10
3331
3432 let defaultLicence = "bafybeigisfqtyo2qdfsceh5fpcp7eeymrpeglp6edao2bmyhijbayvausy/licence.pdf"
3533
3634 let defaultHashLicence = "3df79d34abbca99308e79cb94461c1893582604d68329a41fd4bec1885e6adb4"
3735
38-let dappRunning = match getBoolean(userDapp, "conf_dapp_is_running") {
39- case a: Boolean =>
40- a
41- case _ =>
42- true
43-}
36+let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
4437
45-let maintenanceMSG = match getString(userDapp, "conf_maintenance_msg") {
46- case a: String =>
47- a
48- case _ =>
49- ""
50-}
38+let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
5139
5240 let userSuspended = "SUSPENDED"
5341
5745
5846 let userAllowed = "ALLOWED"
5947
60-func getStringByKeyFromUsers (key) = match getString(userDapp, key) {
61- case a: String =>
62- a
63- case _ =>
64- ""
65-}
48+func getStringByKeyFromUsers (key) = valueOrElse(getString(userDapp, key), "")
6649
6750
68-func getStringByKey (key) = match getString(this, key) {
69- case a: String =>
70- a
71- case _ =>
72- ""
73-}
51+func getStringByKey (key) = valueOrElse(getString(this, key), "")
7452
7553
76-func getIntegerByKeyFromOracle (key) = match getInteger(oracleFee, key) {
77- case a: Int =>
78- a
79- case _ =>
80- throw("Integer undefine or 0 in oracle")
81-}
54+func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
8255
8356
84-func getIntegerByKey (key) = match getInteger(this, key) {
85- case i: Int =>
86- i
87- case _ =>
88- 0
89-}
57+func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
9058
9159
92-func checkWhitelist (key) = match getInteger(whitelistDapp, key) {
93- case a: Int =>
94- if ((a >= height))
95- then 1
96- else 0
97- case _ =>
98- 0
99-}
60+func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
10061
10162
102-func getBooleanByKey (key) = match getBoolean(this, key) {
103- case i: Boolean =>
104- i
105- case _ =>
106- false
107-}
63+func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
10864
10965
11066 func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signDapp, ((("data_fc_" + signID) + "_") + Owner)) {
11874
11975
12076 func validateCID (cid) = if (contains(cid, "/"))
121- then if (if ((75 > size(cid)))
122- then (60 > size(split(cid, "/")[0]))
77+ then if (if ((76 > size(cid)))
78+ then (size(split(cid, "/")[0]) == 59)
12379 else false)
12480 then (16 > size(split(cid, "/")[1]))
12581 else false
12682 else false
12783
12884
129-func validateHash (hash) = (65 > size(hash))
85+func validateHash (hash) = (size(hash) == 64)
13086
13187
13288 func keyUserStatus (caller) = ("user_status_" + caller)
220176 else true
221177
222178
179+func validateUser (caller) = {
180+ let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
181+ if (if ((userStatus == userUnregistered))
182+ then true
183+ else (userStatus == userAllowed))
184+ then "Register this account first with \"Account\" tab"
185+ else if ((userStatus == userSuspended))
186+ then "Account suspended"
187+ else if ((userStatus == userRemoved))
188+ then "Account removed"
189+ else ""
190+ }
191+
192+
193+func setLIcence (cidLicence,sha256Licence) = {
194+ let cid = if ((size(cidLicence) == 0))
195+ then defaultLicence
196+ else cidLicence
197+ let hash = if ((size(sha256Licence) == 0))
198+ then defaultHashLicence
199+ else sha256Licence
200+ $Tuple2(cid, hash)
201+ }
202+
203+
204+func setLIcenceCID (cidLicence) = if ((size(cidLicence) == 0))
205+ then defaultLicence
206+ else cidLicence
207+
208+
209+func setLIcenceHash (sha256Licence) = if ((size(sha256Licence) == 0))
210+ then defaultHashLicence
211+ else sha256Licence
212+
213+
214+func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,maxmint) = {
215+ let checkUser = validateUser(caller)
216+ if ((checkUser != ""))
217+ then throw(checkUser)
218+ else if ((size(cidDisplay) == 0))
219+ then throw("Display CID cannot be empty")
220+ else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
221+ then throw("Problem with CID")
222+ else if (!(validateAllHash(sha256Export, licenceHash)))
223+ then throw("Problem with Hashes")
224+ else if (!(validateString(name, 100)))
225+ then throw("100 Char. max name")
226+ else if (!(validateString(description, 1000)))
227+ then throw("1000 Char. max description")
228+ else if ((size(split(tags, ",")) > 5))
229+ then throw("5 tags max.")
230+ else if ((maxmint > 10))
231+ then throw("10 editions max per artwork")
232+ else ""
233+ }
234+
235+
236+func validatePayment (invoke) = if ((size(invoke.payments) == 0))
237+ then throw("No payment attached")
238+ else {
239+ let payment = value(invoke.payments[0])
240+ let amount = value(payment.amount)
241+ let assetId = if (if (isDefined(payment.assetId))
242+ then (payment.assetId == signAssetId)
243+ else false)
244+ then payment.assetId
245+ else throw("Only SIGN token accepted as transaction fee")
246+ let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
247+ if ((amount != currentCertificationPrice))
248+ then throw(("Payment amount should be " + toString(currentCertificationPrice)))
249+ else $Tuple2(amount, assetId)
250+ }
251+
252+
253+func isArtMinted (addressToUse,artId) = match getInteger(this, keyArtIssued(addressToUse, artId)) {
254+ case b: Int =>
255+ if ((b != 0))
256+ then true
257+ else false
258+ case _ =>
259+ false
260+}
261+
262+
263+func validatePriceAssetId (invoke,priceAssetId,artworkPrice) = {
264+ let payment = value(invoke.payments[0])
265+ let amount = value(payment.amount)
266+ let assetId = if (!(isDefined(payment.assetId)))
267+ then unit
268+ else if (if ((size(priceAssetId) > 0))
269+ then (toBase58String(value(payment.assetId)) == priceAssetId)
270+ else false)
271+ then payment.assetId
272+ else throw("Wrong asset id")
273+ if (if ((assetId == unit))
274+ then (priceAssetId != "")
275+ else false)
276+ then throw("Wrong asset id")
277+ else if ((artworkPrice != amount))
278+ then throw("Payment don't match")
279+ else $Tuple2(amount, assetId)
280+ }
281+
282+
283+func acceptedAssetIds (assetId) = if (if (if ((assetId != toBase58String(signAssetId)))
284+ then (assetId != toBase58String(wavesAssetId))
285+ else false)
286+ then (assetId != toBase58String(usdnAssetId))
287+ else false)
288+ then throw("Only SIGN, USDN or WAVES accepted")
289+ else true
290+
291+
292+func validateMinSell (assetId,price) = {
293+ let minSellWaves = if (unitTest)
294+ then 1
295+ else getIntegerByKeyFromOracle("waves_min_sell")
296+ let minSellUsdn = 1000000
297+ let minSellSign = if (unitTest)
298+ then 1
299+ else (getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId))) * 2)
300+ if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
301+ then (minSellUsdn > price)
302+ else false)
303+ then (price != 0)
304+ else false)
305+ then true
306+ else if (if ((assetId == toBase58String(signAssetId)))
307+ then (minSellSign > price)
308+ else false)
309+ then (price != 0)
310+ else false)
311+ then true
312+ else if (if ((assetId == toBase58String(wavesAssetId)))
313+ then (minSellWaves > price)
314+ else false)
315+ then (price != 0)
316+ else false)
317+ then throw("Wrong minimum sell price")
318+ else true
319+ }
320+
321+
223322 @Callable(invoke)
224323 func addArtwork (sha256Hash,signID,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
225324 then throw(maintenanceMSG)
226325 else {
227326 let artId = toBase58String(invoke.transactionId)
327+ let timestamp = lastBlock.timestamp
228328 let caller = toBase58String(invoke.caller.bytes)
229- let timestamp = lastBlock.timestamp
230- let licenceCID = if ((size(cidLicence) == 0))
231- then defaultLicence
232- else cidLicence
233- let licenceHash = if ((size(sha256Licence) == 0))
234- then defaultHashLicence
235- else sha256Licence
236- let userIsRegistered = match getString(userDapp, ("user_status_" + caller)) {
237- case s: String =>
238- s
239- case _ =>
240- userUnregistered
241- }
242- if (if (isDefined(userIsRegistered))
243- then if ((userIsRegistered == userUnregistered))
244- then true
245- else (userIsRegistered == userAllowed)
246- else false)
247- then throw("Register this account first with \"Account\" tab")
248- else if ((userIsRegistered == userSuspended))
249- then throw("Account suspended")
250- else if ((userIsRegistered == userRemoved))
251- then throw("Account removed")
252- else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
253- then throw("Problem with CID")
254- else if (!(validateHash(sha256Hash)))
255- then throw("Hash should be 64 characters maximum")
256- else if (!(validateAllHash(sha256Export, licenceHash)))
257- then throw("Problem with Hashes")
258- else if ((size(invoke.payments) == 0))
259- then throw("No payment attached")
329+ if (!(validateHash(sha256Hash)))
330+ then throw("Hash should be 64 characters maximum")
331+ else {
332+ let $t01172711796 = setLIcence(cidLicence, sha256Licence)
333+ let licenceCID = $t01172711796._1
334+ let licenceHash = $t01172711796._2
335+ let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
336+ if ((validateArtwork != ""))
337+ then throw("Something went wrong!")
338+ else {
339+ let $t01202412071 = validatePayment(invoke)
340+ let amount = $t01202412071._1
341+ let assetId = $t01202412071._2
342+ if (!(isDefined(amount)))
343+ then throw("Something went wrong")
344+ else {
345+ let entryExist = getStringByKey(keyArtTxidByHashOwner(sha256Hash, caller))
346+ if ((entryExist != ""))
347+ then throw("You already added it")
260348 else {
261- let payment = value(invoke.payments[0])
262- let amount = value(payment.amount)
263- let assetId = if (if (isDefined(payment.assetId))
264- then (payment.assetId == signAssetId)
265- else false)
266- then payment.assetId
267- else throw("Only SIGN token accepted")
268- let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
269- if ((amount != currentCertificationPrice))
270- then throw(("Payment amount should be " + toString(currentCertificationPrice)))
349+ let hashExist = getStringByKey(keyArtOwnerByHash(sha256Hash))
350+ if ((hashExist != ""))
351+ then throw("Hash already registered")
271352 else {
272- let entryExist = getStringByKey(keyArtTxidByHashOwner(sha256Hash, caller))
273- if ((entryExist != ""))
274- then throw("You already added it")
275- else {
276- let hashExist = getStringByKey(keyArtOwnerByHash(sha256Hash))
277- if ((hashExist != ""))
278- then throw("Hash already registered")
279- else {
280- let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
281- if (!(isSignCertified))
282- then throw("Sign Certificate not found for this address.")
283- else if ((size(cidDisplay) == 0))
284- then throw("Display CID cannot be empty")
285- else if (!(validateString(name, 100)))
286- then throw("100 Char. max name")
287- else if (!(validateString(description, 1000)))
288- then throw("1000 Char. max description")
289- else if ((size(split(tags, ",")) > 5))
290- then throw("5 tags max.")
291- else if ((maxmint > 10))
292- then throw("10 editions max")
293- 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)]
294- }
295- }
353+ let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
354+ if (!(isSignCertified))
355+ then throw("Sign Certificate not found for this address.")
356+ 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)]
296357 }
297358 }
359+ }
360+ }
361+ }
298362 }
299363
300364
305369 else {
306370 let updateId = toBase58String(invoke.transactionId)
307371 let caller = toBase58String(invoke.caller.bytes)
308- let licenceCID = if ((size(cidLicence) == 0))
309- then defaultLicence
310- else cidLicence
311- let licenceHash = if ((size(sha256Licence) == 0))
312- then defaultHashLicence
313- else sha256Licence
314- let userIsRegistered = getStringByKeyFromUsers(keyUserStatus(caller))
315- if (if ((userIsRegistered == ""))
316- then true
317- else (userIsRegistered == userAllowed))
318- then throw("Register first with \"User infos\"")
319- else if ((userIsRegistered == userSuspended))
320- then throw("Account suspended")
321- else if ((userIsRegistered == userRemoved))
322- then throw("Account removed")
323- else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
324- then throw("Problem with CID")
325- else if (!(validateAllHash(sha256Export, licenceHash)))
326- then throw("Problem with Hashes")
327- else {
328- let entryExist = getStringByKey(keyArtName(caller, txid))
329- if ((entryExist == ""))
330- then throw("Entry not found")
331- else if (!(validateString(name, 100)))
332- then throw("100 Char. max name")
333- else if (!(validateString(description, 1000)))
334- then throw("1000 Char. max description")
335- else {
336- let flag = getStringByKey(keyArtFlag(caller, txid))
337- if ((flag == "ILLEGAL"))
338- then throw("Cannot update ILLEGAL artwork")
339- else {
340- let artworkMinted = match getInteger(this, keyArtIssued(caller, txid)) {
341- case b: Int =>
342- if ((b == 0))
343- then false
344- else true
345- case _ =>
346- false
347- }
348- if ((size(split(tags, ",")) > 5))
349- then throw("5 tags max.")
350- else if ((maxmint > 10))
351- then throw("10 editions max per artwork")
352- else if (!(artworkMinted))
353- 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)]
354- else throw("Already minted")
355- }
356- }
357- }
372+ let $t01492614995 = setLIcence(cidLicence, sha256Licence)
373+ let licenceCID = $t01492614995._1
374+ let licenceHash = $t01492614995._2
375+ let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
376+ if ((validateArtwork != ""))
377+ then throw("Something went wrong!")
378+ else {
379+ let entryExist = getStringByKey(keyArtName(caller, txid))
380+ if ((entryExist == ""))
381+ then throw("Entry not found")
382+ else {
383+ let flag = getStringByKey(keyArtFlag(caller, txid))
384+ if ((flag == "ILLEGAL"))
385+ then throw("Cannot update ILLEGAL artwork")
386+ else if (!(isArtMinted(caller, txid)))
387+ 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)]
388+ else throw("Already minted")
389+ }
390+ }
358391 }
359392
360393
361394
362-@Callable(i)
395+@Callable(invoke)
363396 func flagArtwork (artId,addr,flag) = {
364- let caller = toString(addressFromPublicKey(i.callerPublicKey))
365- let id = toBase58String(i.transactionId)
397+ let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
398+ let id = toBase58String(invoke.transactionId)
366399 if (containsElement([chris, joep, toString(this)], caller))
367400 then if ((flag == "CONSENT"))
368401 then [StringEntry(keyArtFlag(addr, artId), flag)]
376409
377410
378411
379-@Callable(i)
412+@Callable(invoke)
380413 func deleteArtwork (artId,addr) = {
381- let caller = toString(addressFromPublicKey(i.callerPublicKey))
382- let id = toBase58String(i.transactionId)
414+ let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
415+ let id = toBase58String(invoke.transactionId)
383416 let addressToUse = if (containsElement([chris, joep, toString(this)], caller))
384417 then addr
385418 else caller
387420 if ((entryExist == ""))
388421 then throw("No art matching for this address")
389422 else {
390- let artworkMinted = match getInteger(this, keyArtIssued(addressToUse, artId)) {
391- case b: Int =>
392- if ((b != 0))
393- then true
394- else false
395- case _ =>
396- false
397- }
398- let maxMint = getIntegerByKey(keyArtMaxMint(addressToUse, artId))
399423 let sha256Hash = getStringByKey(keyArtHashByTxidAddr(addressToUse, artId))
400424 if ((sha256Hash == ""))
401425 then throw("No art hash matching for this address")
405429 then throw("No SIGN ID matching")
406430 else {
407431 let dataToDelete = [DeleteEntry(keyArtDate(addressToUse, artId)), DeleteEntry(keyArtName(addressToUse, artId)), DeleteEntry(keyArtDesc(addressToUse, artId)), DeleteEntry(keyArtDisplayCid(addressToUse, artId)), DeleteEntry(keyArtExportCid(addressToUse, artId)), DeleteEntry(keyArtExportHash(addressToUse, artId)), DeleteEntry(keyArtLicenceHash(addressToUse, artId)), DeleteEntry(keyArtLicenceCid(addressToUse, artId)), DeleteEntry(keyArtType(addressToUse, artId)), DeleteEntry(keyArtTags(addressToUse, artId)), DeleteEntry(keyArtMaxMint(addressToUse, artId)), DeleteEntry(keyArtSignID(addressToUse, artId)), DeleteEntry(keyArtIssued(addressToUse, artId)), DeleteEntry(keyArtOnSale(addressToUse, artId)), DeleteEntry(keyArtFlag(addr, artId)), DeleteEntry(keyArtOwnerByHash(sha256Hash)), DeleteEntry(keyArtArtidBySignid(addressToUse, signID)), DeleteEntry(keyArtTxidByHashOwner(sha256Hash, addressToUse))]
408- if (!(artworkMinted))
432+ if (!(isArtMinted(addressToUse, artId)))
409433 then if (!(dappRunning))
410434 then throw(maintenanceMSG)
411435 else dataToDelete
412436 else if (containsElement([chris, toString(this)], caller))
413437 then dataToDelete
414- else throw("Art already minted, cannot delete")
438+ else throw("Art already minted, you cannot delete it")
415439 }
416440 }
417441 }
419443
420444
421445
422-@Callable(i)
446+@Callable(invoke)
423447 func sellArtwork (artId,price,maxMint,assetId) = if (!(dappRunning))
424448 then throw(maintenanceMSG)
425449 else {
426- let id = toBase58String(i.transactionId)
427- let caller = toBase58String(i.caller.bytes)
450+ let id = toBase58String(invoke.transactionId)
451+ let caller = toBase58String(invoke.caller.bytes)
428452 let sellDate = lastBlock.timestamp
429453 let artworkName = getStringByKey(keyArtName(caller, artId))
430454 if ((artworkName == ""))
437461 let exportHash = getStringByKey(keyArtExportHash(caller, artId))
438462 if ((size(exportHash) != 64))
439463 then throw("You cannot sell art with no export hash")
440- else if (if (if ((assetId != toBase58String(signAssetId)))
441- then (assetId != toBase58String(wavesAssetId))
442- else false)
443- then (assetId != toBase58String(usdnAssetId))
444- else false)
445- then throw("Only SIGN, USDN or WAVES accepted")
446- else {
447- let minSellWaves = if (unitTest)
448- then 1
449- else getIntegerByKeyFromOracle("waves_min_sell")
450- let minSellUsdn = 1000000
451- let minSellSign = if (unitTest)
452- then 1
453- else (getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId))) * 2)
454- if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
455- then (minSellUsdn > price)
456- else false)
457- then (price != 0)
458- else false)
459- then true
460- else if (if ((assetId == toBase58String(signAssetId)))
461- then (minSellSign > price)
462- else false)
463- then (price != 0)
464- else false)
465- then true
466- else if (if ((assetId == toBase58String(wavesAssetId)))
467- then (minSellWaves > price)
468- else false)
469- then (price != 0)
470- else false)
471- then throw("Wrong minimum sell price")
472- else {
473- let userIsRegistered = getStringByKeyFromUsers(keyUserStatus(caller))
474- if (if ((userIsRegistered == ""))
475- then true
476- else (userIsRegistered == userAllowed))
477- then throw("Register this account first")
478- else if ((userIsRegistered == userSuspended))
479- then throw("Account suspended")
480- else if ((userIsRegistered == userRemoved))
481- then throw("Account deleted")
482- else {
483- let amountSold = getIntegerByKey(keyArtIssued(caller, artId))
484- let maxCanSell = getIntegerByKey(keyArtMaxMint(caller, artId))
485- if ((maxMint > 10))
486- then throw("10 editions max per artwork")
487- else if (if ((amountSold != 0))
488- then (amountSold == maxCanSell)
464+ else if (!(acceptedAssetIds(assetId)))
465+ then throw("Something wen wrong!")
466+ else if (!(validateMinSell(assetId, price)))
467+ then throw("Something wen wrong!")
468+ else {
469+ let checkUser = validateUser(caller)
470+ if ((checkUser != ""))
471+ then throw(checkUser)
472+ else {
473+ let amountSold = getIntegerByKey(keyArtIssued(caller, artId))
474+ let maxCanSell = getIntegerByKey(keyArtMaxMint(caller, artId))
475+ if ((maxMint > 10))
476+ then throw("10 editions max per artwork")
477+ else if (if ((amountSold != 0))
478+ then (amountSold == maxCanSell)
479+ else false)
480+ then throw("Max edition reached.")
481+ else if (if ((amountSold > 0))
482+ then (maxCanSell != maxMint)
483+ else false)
484+ then throw("Cannot change maximum issuable anymore")
485+ else {
486+ let sellStatus = if (if ((price > 0))
487+ then (maxMint > 0)
489488 else false)
490- then throw("Max edition reached.")
491- else if (if ((amountSold > 0))
492- then (maxCanSell != maxMint)
493- else false)
494- then throw("Cannot change maximum issuable anymore")
495- else {
496- let sellStatus = if (if ((price > 0))
497- then (maxMint > 0)
498- else false)
499- then true
500- else false
489+ then true
490+ else false
501491 [BooleanEntry(keyArtOnSale(caller, artId), sellStatus), IntegerEntry(keyArtPrice(caller, artId), price), IntegerEntry(keyArtMaxMint(caller, artId), maxMint), StringEntry(keyArtAssetIdAccepted(caller, artId), assetId)]
502- }
503- }
504- }
505- }
492+ }
493+ }
494+ }
506495 }
507496 }
508497 }
509498
510499
511500
512-@Callable(i)
501+@Callable(invoke)
513502 func buyArtwork (artId,issuer) = if (!(dappRunning))
514503 then throw(maintenanceMSG)
515504 else {
516- let id = toBase58String(i.transactionId)
517- let caller = toBase58String(i.caller.bytes)
505+ let id = toBase58String(invoke.transactionId)
506+ let caller = toBase58String(invoke.caller.bytes)
518507 let totalNFT = getIntegerByKey("total_nft_issued")
519508 let signID = getStringByKey(keyArtSignID(issuer, artId))
520509 let artworkName = getStringByKey(keyArtName(issuer, artId))
527516 let licenceCID = getStringByKey(keyArtLicenceCid(issuer, artId))
528517 let licenceHash = getStringByKey(keyArtLicenceHash(issuer, artId))
529518 let description = take(getStringByKey(keyArtDesc(issuer, artId)), 50)
519+ let isOnSale = getBooleanByKey(keyArtOnSale(issuer, artId))
530520 let amountSold = getIntegerByKey(keyArtIssued(issuer, artId))
531521 let artworkPrice = getIntegerByKey(keyArtPrice(issuer, artId))
532- let isOnSale = getBooleanByKey(keyArtOnSale(issuer, artId))
533522 let priceAssetId = getStringByKey(keyArtAssetIdAccepted(issuer, artId))
534523 let sourceHash = getStringByKey(keyArtHashByTxidAddr(issuer, artId))
535524 let maxCanSell = getIntegerByKey(keyArtMaxMint(issuer, artId))
540529 else (0 >= maxCanSell))
541530 then throw("Art not for sale")
542531 else {
543- let payment = value(i.payments[0])
544- let amount = value(payment.amount)
545- let assetId = if (!(isDefined(payment.assetId)))
546- then unit
547- else if (if ((size(priceAssetId) > 0))
548- then (toBase58String(value(payment.assetId)) == priceAssetId)
549- else false)
550- then payment.assetId
551- else throw("Wrong asset id")
552- if (if ((assetId == unit))
553- then (priceAssetId != "")
554- else false)
555- then throw("Wrong asset id")
532+ let $t02311923199 = validatePriceAssetId(invoke, priceAssetId, artworkPrice)
533+ let amount = $t02311923199._1
534+ let assetId = $t02311923199._2
535+ let isWhitelisted = checkWhitelist(issuer)
536+ let cut = if ((isWhitelisted == 1))
537+ then 0
538+ else if ((priceAssetId == toBase58String(signAssetId)))
539+ then signCut
540+ else usdnWaveCut
541+ let amountForSign = fraction(amount, cut, 100)
542+ let amountForCreator = (amount - amountForSign)
543+ if ((amountSold == maxCanSell))
544+ then throw("Art sold out")
556545 else {
557- let isWhitelisted = checkWhitelist(issuer)
558- let cut = if ((isWhitelisted == 1))
559- then 0
560- else if ((priceAssetId == toBase58String(signAssetId)))
561- then 8
562- else 10
563- let amountForSign = fraction(amount, cut, 100)
564- let amountForCreator = (amount - amountForSign)
565- if ((amountSold == maxCanSell))
566- then throw("Art sold out")
567- else if ((artworkPrice != amount))
568- then throw("Payment don't match")
569- else {
570- let newAmountSold = (amountSold + 1)
571- let entryDate = lastBlock.timestamp
572- let issueMeta = ((((((((((((((((((((((((((("Creator: " + issuer) + ",
546+ let newAmountSold = (amountSold + 1)
547+ let entryDate = lastBlock.timestamp
548+ let issueMeta = ((((((((((((((((((((((((((("Creator: " + issuer) + ",
573549 ArtID: ") + artId) + ",
574550 SignID: ") + signID) + ",
575551 Artwork name: ") + artworkName) + ",
582558 Export hash: ") + exportHash) + ",
583559 Licence cid: ") + licenceCID) + ",
584560 Licence hash: ") + licenceHash)
585- let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
586- let idNFT = calculateAssetId(issueNFT)
587- let sellStatus = if ((newAmountSold == maxCanSell))
588- then false
589- else true
590-[IntegerEntry(keyArtIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)), StringEntry(((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer), ((((((((((caller + "_") + toString(entryDate)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))), IntegerEntry("total_nft_issued", (totalNFT + 1)), BooleanEntry(keyArtOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId), ScriptTransfer(i.caller, 1, idNFT)]
591- }
561+ let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
562+ let idNFT = calculateAssetId(issueNFT)
563+ let sellStatus = if ((newAmountSold == maxCanSell))
564+ then false
565+ else true
566+[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)]
592567 }
593568 }
594569 }
595570 }
596571
597572
598-
599-@Callable(i)
600-func deleteEntry (entry) = {
601- let caller = toString(addressFromPublicKey(i.callerPublicKey))
602- if ((caller == chris))
603- then [DeleteEntry(entry)]
604- else throw("no")
605- }
606-
607-
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"))
14- else value(addressFromString("3N8xXaYjE27Aa79d5hHrhHu9HaFoTBmhDEj"))
14+ else value(addressFromString("3Mx9KU2qWAgHfp1h3iyVsdiHiz3uuZFbBUG"))
1515
16-let whitelistDapp = value(addressFromString("3Mt6jj1WUYqd7DT7dHEubs9jETLUXMcAB8k"))
16+let whitelistDapp = value(addressFromString("3MuidizAcKUKVzU6AsDFfqcZQC7nkTEMm95"))
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
30-let usdnCut = 10
31-
32-let wavesCut = 10
30+let usdnWaveCut = 10
3331
3432 let defaultLicence = "bafybeigisfqtyo2qdfsceh5fpcp7eeymrpeglp6edao2bmyhijbayvausy/licence.pdf"
3533
3634 let defaultHashLicence = "3df79d34abbca99308e79cb94461c1893582604d68329a41fd4bec1885e6adb4"
3735
38-let dappRunning = match getBoolean(userDapp, "conf_dapp_is_running") {
39- case a: Boolean =>
40- a
41- case _ =>
42- true
43-}
36+let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
4437
45-let maintenanceMSG = match getString(userDapp, "conf_maintenance_msg") {
46- case a: String =>
47- a
48- case _ =>
49- ""
50-}
38+let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
5139
5240 let userSuspended = "SUSPENDED"
5341
5442 let userRemoved = "REMOVED"
5543
5644 let userUnregistered = "UNREGISTERED"
5745
5846 let userAllowed = "ALLOWED"
5947
60-func getStringByKeyFromUsers (key) = match getString(userDapp, key) {
61- case a: String =>
62- a
63- case _ =>
64- ""
65-}
48+func getStringByKeyFromUsers (key) = valueOrElse(getString(userDapp, key), "")
6649
6750
68-func getStringByKey (key) = match getString(this, key) {
69- case a: String =>
70- a
71- case _ =>
72- ""
73-}
51+func getStringByKey (key) = valueOrElse(getString(this, key), "")
7452
7553
76-func getIntegerByKeyFromOracle (key) = match getInteger(oracleFee, key) {
77- case a: Int =>
78- a
79- case _ =>
80- throw("Integer undefine or 0 in oracle")
81-}
54+func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
8255
8356
84-func getIntegerByKey (key) = match getInteger(this, key) {
85- case i: Int =>
86- i
87- case _ =>
88- 0
89-}
57+func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
9058
9159
92-func checkWhitelist (key) = match getInteger(whitelistDapp, key) {
93- case a: Int =>
94- if ((a >= height))
95- then 1
96- else 0
97- case _ =>
98- 0
99-}
60+func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
10061
10162
102-func getBooleanByKey (key) = match getBoolean(this, key) {
103- case i: Boolean =>
104- i
105- case _ =>
106- false
107-}
63+func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
10864
10965
11066 func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signDapp, ((("data_fc_" + signID) + "_") + Owner)) {
11167 case a: String =>
11268 if (contains(a, sha256Hash))
11369 then true
11470 else false
11571 case _ =>
11672 false
11773 }
11874
11975
12076 func validateCID (cid) = if (contains(cid, "/"))
121- then if (if ((75 > size(cid)))
122- then (60 > size(split(cid, "/")[0]))
77+ then if (if ((76 > size(cid)))
78+ then (size(split(cid, "/")[0]) == 59)
12379 else false)
12480 then (16 > size(split(cid, "/")[1]))
12581 else false
12682 else false
12783
12884
129-func validateHash (hash) = (65 > size(hash))
85+func validateHash (hash) = (size(hash) == 64)
13086
13187
13288 func keyUserStatus (caller) = ("user_status_" + caller)
13389
13490
13591 func keyArtDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
13692
13793
13894 func keyArtName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
13995
14096
14197 func keyArtDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
14298
14399
144100 func keyArtDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
145101
146102
147103 func keyArtExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
148104
149105
150106 func keyArtExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
151107
152108
153109 func keyArtMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
154110
155111
156112 func keyArtSignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
157113
158114
159115 func keyArtIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
160116
161117
162118 func keyArtOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
163119
164120
165121 func keyArtLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
166122
167123
168124 func keyArtLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
169125
170126
171127 func keyArtTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
172128
173129
174130 func keyArtType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
175131
176132
177133 func keyArtPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
178134
179135
180136 func keyArtAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
181137
182138
183139 func keyArtFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
184140
185141
186142 func keyArtHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
187143
188144
189145 func keyArtOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
190146
191147
192148 func keyArtArtidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
193149
194150
195151 func keyArtTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
196152
197153
198154 func validateAllCID (cidDisplay,cidExport,cidLicence) = if (!(validateCID(cidDisplay)))
199155 then throw("Wrong Display CID")
200156 else if (!(validateCID(cidExport)))
201157 then throw("Wrong Export CID")
202158 else if (if ((cidLicence != ""))
203159 then !(validateCID(cidLicence))
204160 else false)
205161 then throw("Wrong Licence CID")
206162 else true
207163
208164
209165 func validateAllHash (sha256Export,sha256Licence) = if (!(validateHash(sha256Export)))
210166 then throw("Export Hash 64 char. max")
211167 else if (!(validateHash(sha256Licence)))
212168 then throw("Licence Hash 64 char. max")
213169 else true
214170
215171
216172 func validateString (str,max) = if ((size(str) == 0))
217173 then throw("Field cannot be is empty")
218174 else if ((size(str) > max))
219175 then throw((str + " is too long"))
220176 else true
221177
222178
179+func validateUser (caller) = {
180+ let userStatus = valueOrElse(getString(userDapp, keyUserStatus(caller)), userUnregistered)
181+ if (if ((userStatus == userUnregistered))
182+ then true
183+ else (userStatus == userAllowed))
184+ then "Register this account first with \"Account\" tab"
185+ else if ((userStatus == userSuspended))
186+ then "Account suspended"
187+ else if ((userStatus == userRemoved))
188+ then "Account removed"
189+ else ""
190+ }
191+
192+
193+func setLIcence (cidLicence,sha256Licence) = {
194+ let cid = if ((size(cidLicence) == 0))
195+ then defaultLicence
196+ else cidLicence
197+ let hash = if ((size(sha256Licence) == 0))
198+ then defaultHashLicence
199+ else sha256Licence
200+ $Tuple2(cid, hash)
201+ }
202+
203+
204+func setLIcenceCID (cidLicence) = if ((size(cidLicence) == 0))
205+ then defaultLicence
206+ else cidLicence
207+
208+
209+func setLIcenceHash (sha256Licence) = if ((size(sha256Licence) == 0))
210+ then defaultHashLicence
211+ else sha256Licence
212+
213+
214+func validateArtworkData (caller,cidDisplay,cidExport,licenceCID,sha256Export,licenceHash,name,description,tags,maxmint) = {
215+ let checkUser = validateUser(caller)
216+ if ((checkUser != ""))
217+ then throw(checkUser)
218+ else if ((size(cidDisplay) == 0))
219+ then throw("Display CID cannot be empty")
220+ else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
221+ then throw("Problem with CID")
222+ else if (!(validateAllHash(sha256Export, licenceHash)))
223+ then throw("Problem with Hashes")
224+ else if (!(validateString(name, 100)))
225+ then throw("100 Char. max name")
226+ else if (!(validateString(description, 1000)))
227+ then throw("1000 Char. max description")
228+ else if ((size(split(tags, ",")) > 5))
229+ then throw("5 tags max.")
230+ else if ((maxmint > 10))
231+ then throw("10 editions max per artwork")
232+ else ""
233+ }
234+
235+
236+func validatePayment (invoke) = if ((size(invoke.payments) == 0))
237+ then throw("No payment attached")
238+ else {
239+ let payment = value(invoke.payments[0])
240+ let amount = value(payment.amount)
241+ let assetId = if (if (isDefined(payment.assetId))
242+ then (payment.assetId == signAssetId)
243+ else false)
244+ then payment.assetId
245+ else throw("Only SIGN token accepted as transaction fee")
246+ let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
247+ if ((amount != currentCertificationPrice))
248+ then throw(("Payment amount should be " + toString(currentCertificationPrice)))
249+ else $Tuple2(amount, assetId)
250+ }
251+
252+
253+func isArtMinted (addressToUse,artId) = match getInteger(this, keyArtIssued(addressToUse, artId)) {
254+ case b: Int =>
255+ if ((b != 0))
256+ then true
257+ else false
258+ case _ =>
259+ false
260+}
261+
262+
263+func validatePriceAssetId (invoke,priceAssetId,artworkPrice) = {
264+ let payment = value(invoke.payments[0])
265+ let amount = value(payment.amount)
266+ let assetId = if (!(isDefined(payment.assetId)))
267+ then unit
268+ else if (if ((size(priceAssetId) > 0))
269+ then (toBase58String(value(payment.assetId)) == priceAssetId)
270+ else false)
271+ then payment.assetId
272+ else throw("Wrong asset id")
273+ if (if ((assetId == unit))
274+ then (priceAssetId != "")
275+ else false)
276+ then throw("Wrong asset id")
277+ else if ((artworkPrice != amount))
278+ then throw("Payment don't match")
279+ else $Tuple2(amount, assetId)
280+ }
281+
282+
283+func acceptedAssetIds (assetId) = if (if (if ((assetId != toBase58String(signAssetId)))
284+ then (assetId != toBase58String(wavesAssetId))
285+ else false)
286+ then (assetId != toBase58String(usdnAssetId))
287+ else false)
288+ then throw("Only SIGN, USDN or WAVES accepted")
289+ else true
290+
291+
292+func validateMinSell (assetId,price) = {
293+ let minSellWaves = if (unitTest)
294+ then 1
295+ else getIntegerByKeyFromOracle("waves_min_sell")
296+ let minSellUsdn = 1000000
297+ let minSellSign = if (unitTest)
298+ then 1
299+ else (getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId))) * 2)
300+ if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
301+ then (minSellUsdn > price)
302+ else false)
303+ then (price != 0)
304+ else false)
305+ then true
306+ else if (if ((assetId == toBase58String(signAssetId)))
307+ then (minSellSign > price)
308+ else false)
309+ then (price != 0)
310+ else false)
311+ then true
312+ else if (if ((assetId == toBase58String(wavesAssetId)))
313+ then (minSellWaves > price)
314+ else false)
315+ then (price != 0)
316+ else false)
317+ then throw("Wrong minimum sell price")
318+ else true
319+ }
320+
321+
223322 @Callable(invoke)
224323 func addArtwork (sha256Hash,signID,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
225324 then throw(maintenanceMSG)
226325 else {
227326 let artId = toBase58String(invoke.transactionId)
327+ let timestamp = lastBlock.timestamp
228328 let caller = toBase58String(invoke.caller.bytes)
229- let timestamp = lastBlock.timestamp
230- let licenceCID = if ((size(cidLicence) == 0))
231- then defaultLicence
232- else cidLicence
233- let licenceHash = if ((size(sha256Licence) == 0))
234- then defaultHashLicence
235- else sha256Licence
236- let userIsRegistered = match getString(userDapp, ("user_status_" + caller)) {
237- case s: String =>
238- s
239- case _ =>
240- userUnregistered
241- }
242- if (if (isDefined(userIsRegistered))
243- then if ((userIsRegistered == userUnregistered))
244- then true
245- else (userIsRegistered == userAllowed)
246- else false)
247- then throw("Register this account first with \"Account\" tab")
248- else if ((userIsRegistered == userSuspended))
249- then throw("Account suspended")
250- else if ((userIsRegistered == userRemoved))
251- then throw("Account removed")
252- else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
253- then throw("Problem with CID")
254- else if (!(validateHash(sha256Hash)))
255- then throw("Hash should be 64 characters maximum")
256- else if (!(validateAllHash(sha256Export, licenceHash)))
257- then throw("Problem with Hashes")
258- else if ((size(invoke.payments) == 0))
259- then throw("No payment attached")
329+ if (!(validateHash(sha256Hash)))
330+ then throw("Hash should be 64 characters maximum")
331+ else {
332+ let $t01172711796 = setLIcence(cidLicence, sha256Licence)
333+ let licenceCID = $t01172711796._1
334+ let licenceHash = $t01172711796._2
335+ let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
336+ if ((validateArtwork != ""))
337+ then throw("Something went wrong!")
338+ else {
339+ let $t01202412071 = validatePayment(invoke)
340+ let amount = $t01202412071._1
341+ let assetId = $t01202412071._2
342+ if (!(isDefined(amount)))
343+ then throw("Something went wrong")
344+ else {
345+ let entryExist = getStringByKey(keyArtTxidByHashOwner(sha256Hash, caller))
346+ if ((entryExist != ""))
347+ then throw("You already added it")
260348 else {
261- let payment = value(invoke.payments[0])
262- let amount = value(payment.amount)
263- let assetId = if (if (isDefined(payment.assetId))
264- then (payment.assetId == signAssetId)
265- else false)
266- then payment.assetId
267- else throw("Only SIGN token accepted")
268- let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
269- if ((amount != currentCertificationPrice))
270- then throw(("Payment amount should be " + toString(currentCertificationPrice)))
349+ let hashExist = getStringByKey(keyArtOwnerByHash(sha256Hash))
350+ if ((hashExist != ""))
351+ then throw("Hash already registered")
271352 else {
272- let entryExist = getStringByKey(keyArtTxidByHashOwner(sha256Hash, caller))
273- if ((entryExist != ""))
274- then throw("You already added it")
275- else {
276- let hashExist = getStringByKey(keyArtOwnerByHash(sha256Hash))
277- if ((hashExist != ""))
278- then throw("Hash already registered")
279- else {
280- let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
281- if (!(isSignCertified))
282- then throw("Sign Certificate not found for this address.")
283- else if ((size(cidDisplay) == 0))
284- then throw("Display CID cannot be empty")
285- else if (!(validateString(name, 100)))
286- then throw("100 Char. max name")
287- else if (!(validateString(description, 1000)))
288- then throw("1000 Char. max description")
289- else if ((size(split(tags, ",")) > 5))
290- then throw("5 tags max.")
291- else if ((maxmint > 10))
292- then throw("10 editions max")
293- 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)]
294- }
295- }
353+ let isSignCertified = checkSignCertificate(signID, caller, sha256Hash)
354+ if (!(isSignCertified))
355+ then throw("Sign Certificate not found for this address.")
356+ 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)]
296357 }
297358 }
359+ }
360+ }
361+ }
298362 }
299363
300364
301365
302366 @Callable(invoke)
303367 func updateArtwork (txid,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
304368 then throw(maintenanceMSG)
305369 else {
306370 let updateId = toBase58String(invoke.transactionId)
307371 let caller = toBase58String(invoke.caller.bytes)
308- let licenceCID = if ((size(cidLicence) == 0))
309- then defaultLicence
310- else cidLicence
311- let licenceHash = if ((size(sha256Licence) == 0))
312- then defaultHashLicence
313- else sha256Licence
314- let userIsRegistered = getStringByKeyFromUsers(keyUserStatus(caller))
315- if (if ((userIsRegistered == ""))
316- then true
317- else (userIsRegistered == userAllowed))
318- then throw("Register first with \"User infos\"")
319- else if ((userIsRegistered == userSuspended))
320- then throw("Account suspended")
321- else if ((userIsRegistered == userRemoved))
322- then throw("Account removed")
323- else if (!(validateAllCID(cidDisplay, cidExport, licenceCID)))
324- then throw("Problem with CID")
325- else if (!(validateAllHash(sha256Export, licenceHash)))
326- then throw("Problem with Hashes")
327- else {
328- let entryExist = getStringByKey(keyArtName(caller, txid))
329- if ((entryExist == ""))
330- then throw("Entry not found")
331- else if (!(validateString(name, 100)))
332- then throw("100 Char. max name")
333- else if (!(validateString(description, 1000)))
334- then throw("1000 Char. max description")
335- else {
336- let flag = getStringByKey(keyArtFlag(caller, txid))
337- if ((flag == "ILLEGAL"))
338- then throw("Cannot update ILLEGAL artwork")
339- else {
340- let artworkMinted = match getInteger(this, keyArtIssued(caller, txid)) {
341- case b: Int =>
342- if ((b == 0))
343- then false
344- else true
345- case _ =>
346- false
347- }
348- if ((size(split(tags, ",")) > 5))
349- then throw("5 tags max.")
350- else if ((maxmint > 10))
351- then throw("10 editions max per artwork")
352- else if (!(artworkMinted))
353- 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)]
354- else throw("Already minted")
355- }
356- }
357- }
372+ let $t01492614995 = setLIcence(cidLicence, sha256Licence)
373+ let licenceCID = $t01492614995._1
374+ let licenceHash = $t01492614995._2
375+ let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
376+ if ((validateArtwork != ""))
377+ then throw("Something went wrong!")
378+ else {
379+ let entryExist = getStringByKey(keyArtName(caller, txid))
380+ if ((entryExist == ""))
381+ then throw("Entry not found")
382+ else {
383+ let flag = getStringByKey(keyArtFlag(caller, txid))
384+ if ((flag == "ILLEGAL"))
385+ then throw("Cannot update ILLEGAL artwork")
386+ else if (!(isArtMinted(caller, txid)))
387+ 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)]
388+ else throw("Already minted")
389+ }
390+ }
358391 }
359392
360393
361394
362-@Callable(i)
395+@Callable(invoke)
363396 func flagArtwork (artId,addr,flag) = {
364- let caller = toString(addressFromPublicKey(i.callerPublicKey))
365- let id = toBase58String(i.transactionId)
397+ let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
398+ let id = toBase58String(invoke.transactionId)
366399 if (containsElement([chris, joep, toString(this)], caller))
367400 then if ((flag == "CONSENT"))
368401 then [StringEntry(keyArtFlag(addr, artId), flag)]
369402 else if ((flag == ""))
370403 then [StringEntry(keyArtFlag(addr, artId), flag)]
371404 else if ((flag == "ILLEGAL"))
372405 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), "")]
373406 else throw(("Unknow status " + flag))
374407 else throw("You are not allowed")
375408 }
376409
377410
378411
379-@Callable(i)
412+@Callable(invoke)
380413 func deleteArtwork (artId,addr) = {
381- let caller = toString(addressFromPublicKey(i.callerPublicKey))
382- let id = toBase58String(i.transactionId)
414+ let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
415+ let id = toBase58String(invoke.transactionId)
383416 let addressToUse = if (containsElement([chris, joep, toString(this)], caller))
384417 then addr
385418 else caller
386419 let entryExist = getStringByKey(keyArtName(addressToUse, artId))
387420 if ((entryExist == ""))
388421 then throw("No art matching for this address")
389422 else {
390- let artworkMinted = match getInteger(this, keyArtIssued(addressToUse, artId)) {
391- case b: Int =>
392- if ((b != 0))
393- then true
394- else false
395- case _ =>
396- false
397- }
398- let maxMint = getIntegerByKey(keyArtMaxMint(addressToUse, artId))
399423 let sha256Hash = getStringByKey(keyArtHashByTxidAddr(addressToUse, artId))
400424 if ((sha256Hash == ""))
401425 then throw("No art hash matching for this address")
402426 else {
403427 let signID = getStringByKey(keyArtSignID(addressToUse, artId))
404428 if ((signID == ""))
405429 then throw("No SIGN ID matching")
406430 else {
407431 let dataToDelete = [DeleteEntry(keyArtDate(addressToUse, artId)), DeleteEntry(keyArtName(addressToUse, artId)), DeleteEntry(keyArtDesc(addressToUse, artId)), DeleteEntry(keyArtDisplayCid(addressToUse, artId)), DeleteEntry(keyArtExportCid(addressToUse, artId)), DeleteEntry(keyArtExportHash(addressToUse, artId)), DeleteEntry(keyArtLicenceHash(addressToUse, artId)), DeleteEntry(keyArtLicenceCid(addressToUse, artId)), DeleteEntry(keyArtType(addressToUse, artId)), DeleteEntry(keyArtTags(addressToUse, artId)), DeleteEntry(keyArtMaxMint(addressToUse, artId)), DeleteEntry(keyArtSignID(addressToUse, artId)), DeleteEntry(keyArtIssued(addressToUse, artId)), DeleteEntry(keyArtOnSale(addressToUse, artId)), DeleteEntry(keyArtFlag(addr, artId)), DeleteEntry(keyArtOwnerByHash(sha256Hash)), DeleteEntry(keyArtArtidBySignid(addressToUse, signID)), DeleteEntry(keyArtTxidByHashOwner(sha256Hash, addressToUse))]
408- if (!(artworkMinted))
432+ if (!(isArtMinted(addressToUse, artId)))
409433 then if (!(dappRunning))
410434 then throw(maintenanceMSG)
411435 else dataToDelete
412436 else if (containsElement([chris, toString(this)], caller))
413437 then dataToDelete
414- else throw("Art already minted, cannot delete")
438+ else throw("Art already minted, you cannot delete it")
415439 }
416440 }
417441 }
418442 }
419443
420444
421445
422-@Callable(i)
446+@Callable(invoke)
423447 func sellArtwork (artId,price,maxMint,assetId) = if (!(dappRunning))
424448 then throw(maintenanceMSG)
425449 else {
426- let id = toBase58String(i.transactionId)
427- let caller = toBase58String(i.caller.bytes)
450+ let id = toBase58String(invoke.transactionId)
451+ let caller = toBase58String(invoke.caller.bytes)
428452 let sellDate = lastBlock.timestamp
429453 let artworkName = getStringByKey(keyArtName(caller, artId))
430454 if ((artworkName == ""))
431455 then throw("This art doesn't match match your account")
432456 else {
433457 let exportCID = getStringByKey(keyArtExportCid(caller, artId))
434458 if ((size(split(exportCID, "/")[0]) != 59))
435459 then throw("You cannot sell art with no export file")
436460 else {
437461 let exportHash = getStringByKey(keyArtExportHash(caller, artId))
438462 if ((size(exportHash) != 64))
439463 then throw("You cannot sell art with no export hash")
440- else if (if (if ((assetId != toBase58String(signAssetId)))
441- then (assetId != toBase58String(wavesAssetId))
442- else false)
443- then (assetId != toBase58String(usdnAssetId))
444- else false)
445- then throw("Only SIGN, USDN or WAVES accepted")
446- else {
447- let minSellWaves = if (unitTest)
448- then 1
449- else getIntegerByKeyFromOracle("waves_min_sell")
450- let minSellUsdn = 1000000
451- let minSellSign = if (unitTest)
452- then 1
453- else (getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId))) * 2)
454- if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
455- then (minSellUsdn > price)
456- else false)
457- then (price != 0)
458- else false)
459- then true
460- else if (if ((assetId == toBase58String(signAssetId)))
461- then (minSellSign > price)
462- else false)
463- then (price != 0)
464- else false)
465- then true
466- else if (if ((assetId == toBase58String(wavesAssetId)))
467- then (minSellWaves > price)
468- else false)
469- then (price != 0)
470- else false)
471- then throw("Wrong minimum sell price")
472- else {
473- let userIsRegistered = getStringByKeyFromUsers(keyUserStatus(caller))
474- if (if ((userIsRegistered == ""))
475- then true
476- else (userIsRegistered == userAllowed))
477- then throw("Register this account first")
478- else if ((userIsRegistered == userSuspended))
479- then throw("Account suspended")
480- else if ((userIsRegistered == userRemoved))
481- then throw("Account deleted")
482- else {
483- let amountSold = getIntegerByKey(keyArtIssued(caller, artId))
484- let maxCanSell = getIntegerByKey(keyArtMaxMint(caller, artId))
485- if ((maxMint > 10))
486- then throw("10 editions max per artwork")
487- else if (if ((amountSold != 0))
488- then (amountSold == maxCanSell)
464+ else if (!(acceptedAssetIds(assetId)))
465+ then throw("Something wen wrong!")
466+ else if (!(validateMinSell(assetId, price)))
467+ then throw("Something wen wrong!")
468+ else {
469+ let checkUser = validateUser(caller)
470+ if ((checkUser != ""))
471+ then throw(checkUser)
472+ else {
473+ let amountSold = getIntegerByKey(keyArtIssued(caller, artId))
474+ let maxCanSell = getIntegerByKey(keyArtMaxMint(caller, artId))
475+ if ((maxMint > 10))
476+ then throw("10 editions max per artwork")
477+ else if (if ((amountSold != 0))
478+ then (amountSold == maxCanSell)
479+ else false)
480+ then throw("Max edition reached.")
481+ else if (if ((amountSold > 0))
482+ then (maxCanSell != maxMint)
483+ else false)
484+ then throw("Cannot change maximum issuable anymore")
485+ else {
486+ let sellStatus = if (if ((price > 0))
487+ then (maxMint > 0)
489488 else false)
490- then throw("Max edition reached.")
491- else if (if ((amountSold > 0))
492- then (maxCanSell != maxMint)
493- else false)
494- then throw("Cannot change maximum issuable anymore")
495- else {
496- let sellStatus = if (if ((price > 0))
497- then (maxMint > 0)
498- else false)
499- then true
500- else false
489+ then true
490+ else false
501491 [BooleanEntry(keyArtOnSale(caller, artId), sellStatus), IntegerEntry(keyArtPrice(caller, artId), price), IntegerEntry(keyArtMaxMint(caller, artId), maxMint), StringEntry(keyArtAssetIdAccepted(caller, artId), assetId)]
502- }
503- }
504- }
505- }
492+ }
493+ }
494+ }
506495 }
507496 }
508497 }
509498
510499
511500
512-@Callable(i)
501+@Callable(invoke)
513502 func buyArtwork (artId,issuer) = if (!(dappRunning))
514503 then throw(maintenanceMSG)
515504 else {
516- let id = toBase58String(i.transactionId)
517- let caller = toBase58String(i.caller.bytes)
505+ let id = toBase58String(invoke.transactionId)
506+ let caller = toBase58String(invoke.caller.bytes)
518507 let totalNFT = getIntegerByKey("total_nft_issued")
519508 let signID = getStringByKey(keyArtSignID(issuer, artId))
520509 let artworkName = getStringByKey(keyArtName(issuer, artId))
521510 if ((artworkName == ""))
522511 then throw("Art doesn't exist")
523512 else {
524513 let displayCID = getStringByKey(keyArtDisplayCid(issuer, artId))
525514 let exportCID = getStringByKey(keyArtExportCid(issuer, artId))
526515 let exportHash = getStringByKey(keyArtExportHash(issuer, artId))
527516 let licenceCID = getStringByKey(keyArtLicenceCid(issuer, artId))
528517 let licenceHash = getStringByKey(keyArtLicenceHash(issuer, artId))
529518 let description = take(getStringByKey(keyArtDesc(issuer, artId)), 50)
519+ let isOnSale = getBooleanByKey(keyArtOnSale(issuer, artId))
530520 let amountSold = getIntegerByKey(keyArtIssued(issuer, artId))
531521 let artworkPrice = getIntegerByKey(keyArtPrice(issuer, artId))
532- let isOnSale = getBooleanByKey(keyArtOnSale(issuer, artId))
533522 let priceAssetId = getStringByKey(keyArtAssetIdAccepted(issuer, artId))
534523 let sourceHash = getStringByKey(keyArtHashByTxidAddr(issuer, artId))
535524 let maxCanSell = getIntegerByKey(keyArtMaxMint(issuer, artId))
536525 if (if (if ((0 >= artworkPrice))
537526 then true
538527 else !(isOnSale))
539528 then true
540529 else (0 >= maxCanSell))
541530 then throw("Art not for sale")
542531 else {
543- let payment = value(i.payments[0])
544- let amount = value(payment.amount)
545- let assetId = if (!(isDefined(payment.assetId)))
546- then unit
547- else if (if ((size(priceAssetId) > 0))
548- then (toBase58String(value(payment.assetId)) == priceAssetId)
549- else false)
550- then payment.assetId
551- else throw("Wrong asset id")
552- if (if ((assetId == unit))
553- then (priceAssetId != "")
554- else false)
555- then throw("Wrong asset id")
532+ let $t02311923199 = validatePriceAssetId(invoke, priceAssetId, artworkPrice)
533+ let amount = $t02311923199._1
534+ let assetId = $t02311923199._2
535+ let isWhitelisted = checkWhitelist(issuer)
536+ let cut = if ((isWhitelisted == 1))
537+ then 0
538+ else if ((priceAssetId == toBase58String(signAssetId)))
539+ then signCut
540+ else usdnWaveCut
541+ let amountForSign = fraction(amount, cut, 100)
542+ let amountForCreator = (amount - amountForSign)
543+ if ((amountSold == maxCanSell))
544+ then throw("Art sold out")
556545 else {
557- let isWhitelisted = checkWhitelist(issuer)
558- let cut = if ((isWhitelisted == 1))
559- then 0
560- else if ((priceAssetId == toBase58String(signAssetId)))
561- then 8
562- else 10
563- let amountForSign = fraction(amount, cut, 100)
564- let amountForCreator = (amount - amountForSign)
565- if ((amountSold == maxCanSell))
566- then throw("Art sold out")
567- else if ((artworkPrice != amount))
568- then throw("Payment don't match")
569- else {
570- let newAmountSold = (amountSold + 1)
571- let entryDate = lastBlock.timestamp
572- let issueMeta = ((((((((((((((((((((((((((("Creator: " + issuer) + ",
546+ let newAmountSold = (amountSold + 1)
547+ let entryDate = lastBlock.timestamp
548+ let issueMeta = ((((((((((((((((((((((((((("Creator: " + issuer) + ",
573549 ArtID: ") + artId) + ",
574550 SignID: ") + signID) + ",
575551 Artwork name: ") + artworkName) + ",
576552 Artwork description: ") + description) + ",
577553 Issue: ") + toString(newAmountSold)) + "/") + toString(maxCanSell)) + ",
578554 Max issuable: ") + toString(maxCanSell)) + ",
579555 Source hash: ") + sourceHash) + ",
580556 Display cid: ") + displayCID) + ",
581557 Export cid: ") + exportCID) + ",
582558 Export hash: ") + exportHash) + ",
583559 Licence cid: ") + licenceCID) + ",
584560 Licence hash: ") + licenceHash)
585- let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
586- let idNFT = calculateAssetId(issueNFT)
587- let sellStatus = if ((newAmountSold == maxCanSell))
588- then false
589- else true
590-[IntegerEntry(keyArtIssued(issuer, artId), newAmountSold), StringEntry(("nft_" + toBase58String(idNFT)), ((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer)), StringEntry(((((((("art_sold_" + toString(newAmountSold)) + "_of_") + toString(maxCanSell)) + "_") + artId) + "_") + issuer), ((((((((((caller + "_") + toString(entryDate)) + "_") + id) + "_") + toString(artworkPrice)) + "_") + priceAssetId) + "_") + toBase58String(idNFT))), IntegerEntry("total_nft_issued", (totalNFT + 1)), BooleanEntry(keyArtOnSale(issuer, artId), sellStatus), issueNFT, ScriptTransfer(Address(fromBase58String(issuer)), amountForCreator, assetId), ScriptTransfer(Address(fromBase58String(feeReceiver)), amountForSign, assetId), ScriptTransfer(i.caller, 1, idNFT)]
591- }
561+ let issueNFT = Issue(("SA_" + toString((totalNFT + 1))), issueMeta, 1, 0, false)
562+ let idNFT = calculateAssetId(issueNFT)
563+ let sellStatus = if ((newAmountSold == maxCanSell))
564+ then false
565+ else true
566+[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)]
592567 }
593568 }
594569 }
595570 }
596571
597572
598-
599-@Callable(i)
600-func deleteEntry (entry) = {
601- let caller = toString(addressFromPublicKey(i.callerPublicKey))
602- if ((caller == chris))
603- then [DeleteEntry(entry)]
604- else throw("no")
605- }
606-
607-

github/deemru/w8io/3ef1775 
131.32 ms