tx · HuArHuEcWy6Mim6Jn1QLWNPEr6HFVyWQHNsqookFduKX

3NBquYd5fTq8HRDkagrtNLQ3HmWd7wcZoeL:  -0.01400000 Waves

2021.01.27 13:24 [1371790] smart account 3NBquYd5fTq8HRDkagrtNLQ3HmWd7wcZoeL > SELF 0.00000000 Waves

{ "type": 13, "id": "HuArHuEcWy6Mim6Jn1QLWNPEr6HFVyWQHNsqookFduKX", "fee": 1400000, "feeAssetId": null, "timestamp": 1611743068815, "version": 2, "chainId": 84, "sender": "3NBquYd5fTq8HRDkagrtNLQ3HmWd7wcZoeL", "senderPublicKey": "7irc2VpK5czoyVdwrCuQqr2JU9ZaZnEZn8RPChnfi3yL", "proofs": [ "2dAAcbMGC33An9Eben9DRnTLwMSgE86Gav3SsasdaP1mopzL3zt54NgDVSKYqoHc4b22hFAgw2jjri4RMfmpu6pQ" ], "script": "base64:AAIEAAAAAAAAAEEIAhIOCgwICAgICAgBCAgICAgSDQoLCAgICAgBCAgICAgSBQoDCAgIEgQKAggIEgYKBAgBAQgSBAoCCAgSAwoBCAAAAD8AAAAACHVuaXRUZXN0BwAAAAAJb3JhY2xlRmVlCQEAAAAFdmFsdWUAAAABCQAEJgAAAAECAAAAIzNOMnM1UnRhSFBCZW5Dc3gyRUNjb0ZSYllIeDNub1poWFcxAAAAAAhzaWduRGFwcAkBAAAABXZhbHVlAAAAAQkABCYAAAABAgAAACMzTkMyOGhTaXZybXNUVVhhWUQxeDZMMzYySjRacFVub1RkQgAAAAALZmVlUmVjZWl2ZXICAAAAIzNOMUU2dFhkZFJvVmFSZlE5ZFEzdmc1TGFXMmZzZDhIS3ViAAAAAAh1c2VyRGFwcAMFAAAACHVuaXRUZXN0CQEAAAAFdmFsdWUAAAABCQAEJgAAAAECAAAAIzNNdDRSR01FeWpTV1lBb2NUUHFkNTV3ZEhRUUIzUFUyVUNtCQEAAAAFdmFsdWUAAAABCQAEJgAAAAECAAAAIzNNd0RaYWdvWUVpTmZRTGMzMWNHcFlvYUU1NE1HTXdvRnJaAAAAAA13aGl0ZWxpc3REYXBwCQEAAAAFdmFsdWUAAAABCQAEJgAAAAECAAAAIzNONkJhVjFkQ0I0emc0M2dvTk5IYUN0dlIxM0JjeUo1R3NxAAAAAAtzaWduQXNzZXRJZAEAAAAg6KVqvMp3QvJwYTI1Sk9Fg7m5HuWZZxfDcerZC6EEresAAAAAC3VzZG5Bc3NldElkAQAAACAP8hwSrOTEPJrsRhqrJaiw7LoHK0bMbYhy8LXikkkBtAAAAAAMd2F2ZXNBc3NldElkAQAAAAAAAAAABWNocmlzAgAAACMzTXNHNmpQTkNyVkpVdFlCN1hKQnhTN3V0V3NYQWY0bjlWcAAAAAAEam9lcAIAAAAjM016bTRWTHdzTjl1WndiVE16UGozWHV4VjZrRWZBUjhVRE4AAAAAB3NpZ25DdXQAAAAAAAAAAAcAAAAAC3VzZG5XYXZlQ3V0AAAAAAAAAAAKAAAAAA5kZWZhdWx0TGljZW5jZQIAAABHYmFmeWJlaWZ1eW80cHF1NTRpc21xZ3RiNmU0aDZra3ZneDd6ZzR1M3ppYmgycjd5Nm1iNjRpN2J6emEvbGljZW5jZS5wZGYAAAAAEmRlZmF1bHRIYXNoTGljZW5jZQIAAABAYTg3NzU4YzM1NGUzMGE5ZTc4ZmI4NGZhM2EwMDEwYTUwOTBhYjIwZGYwYmUxMWFkNDViNTcyMGNjMTg3ZTYzOQAAAAALZGFwcFJ1bm5pbmcJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQbAAAAAgUAAAAIdXNlckRhcHACAAAAFGNvbmZfZGFwcF9pc19ydW5uaW5nBgAAAAAObWFpbnRlbmFuY2VNU0cJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAIdXNlckRhcHACAAAAFGNvbmZfbWFpbnRlbmFuY2VfbXNnAgAAAAAAAAAADXVzZXJTdXNwZW5kZWQCAAAACVNVU1BFTkRFRAAAAAALdXNlclJlbW92ZWQCAAAAB1JFTU9WRUQAAAAAEHVzZXJVbnJlZ2lzdGVyZWQCAAAADFVOUkVHSVNURVJFRAAAAAALdXNlckFsbG93ZWQCAAAAB0FMTE9XRUQBAAAAF2dldFN0cmluZ0J5S2V5RnJvbVVzZXJzAAAAAQAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQdAAAAAgUAAAAIdXNlckRhcHAFAAAAA2tleQIAAAAAAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQIAAAAAAQAAABlnZXRJbnRlZ2VyQnlLZXlGcm9tT3JhY2xlAAAAAQAAAANrZXkJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABBoAAAACBQAAAAlvcmFjbGVGZWUFAAAAA2tleQIAAAAfSW50ZWdlciB1bmRlZmluZSBvciAwIGluIG9yYWNsZQEAAAAPZ2V0SW50ZWdlckJ5S2V5AAAAAQAAAANrZXkJAQAAAAt2YWx1ZU9yRWxzZQAAAAIJAAQaAAAAAgUAAAAEdGhpcwUAAAADa2V5AAAAAAAAAAAAAQAAAA5jaGVja1doaXRlbGlzdAAAAAEAAAADa2V5CQEAAAALdmFsdWVPckVsc2UAAAACCQAEGgAAAAIFAAAADXdoaXRlbGlzdERhcHAFAAAAA2tleQAAAAAAAAAAAAEAAAAPZ2V0Qm9v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YXltZW50IGF0dGFjaGVkBAAAAAdwYXltZW50CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAZpbnZva2UAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAABmFtb3VudAkBAAAABXZhbHVlAAAAAQgFAAAAB3BheW1lbnQAAAAGYW1vdW50BAAAAAdhc3NldElkAwMJAQAAAAlpc0RlZmluZWQAAAABCAUAAAAHcGF5bWVudAAAAAdhc3NldElkCQAAAAAAAAIIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQFAAAAC3NpZ25Bc3NldElkBwgFAAAAB3BheW1lbnQAAAAHYXNzZXRJZAkAAAIAAAABAgAAACtPbmx5IFNJR04gdG9rZW4gYWNjZXB0ZWQgYXMgdHJhbnNhY3Rpb24gZmVlBAAAABljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlCQEAAAAZZ2V0SW50ZWdlckJ5S2V5RnJvbU9yYWNsZQAAAAEJAAEsAAAAAgIAAAASY2VydGlmaWNhdGlvbl9mZWVfCQACWAAAAAEFAAAAC3NpZ25Bc3NldElkAwkBAAAAAiE9AAAAAgUAAAAGYW1vdW50BQAAABljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlCQAAAgAAAAEJAAEsAAAAAgIAAAAZUGF5bWVudCBhbW91bnQgc2hvdWxkIGJlIAkAAaQAAAABBQAAABljdXJyZW50Q2VydGlmaWNhdGlvblByaWNlCQAFFAAAAAIFAAAABmFtb3VudAUAAAAHYXNzZXRJZAEAAAALaXNBcnRNaW50ZWQAAAACAAAADGFkZHJlc3NUb1VzZQAAAAVhcnRJZAQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAR0aGlzCQEAAAAMa2V5QXJ0SXNzdWVkAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFiBQAAAAckbWF0Y2gwAwkBAAAAAiE9AAAAAgUAAAABYgAAAAAAAAAAAAYHBwEAAAAUdmFsaWRhdGVQcmljZUFzc2V0SWQAAAADAAAABmludm9rZQAAAAxwcmljZUFzc2V0SWQAAAAMYXJ0d29ya1ByaWNlBAAAAAdwYXltZW50CQEAAAAFdmFs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AAJYAAAAAQgIBQAAAAZpbnZva2UAAAAGY2FsbGVyAAAABWJ5dGVzAwkBAAAAASEAAAABCQEAAAAMdmFsaWRhdGVIYXNoAAAAAQUAAAAKc2hhMjU2SGFzaAkAAAIAAAABAgAAACRIYXNoIHNob3VsZCBiZSA2NCBjaGFyYWN0ZXJzIG1heGltdW0EAAAADSR0MDExNTE0MTE1ODMJAQAAAApzZXRMSWNlbmNlAAAAAgUAAAAKY2lkTGljZW5jZQUAAAANc2hhMjU2TGljZW5jZQQAAAAKbGljZW5jZUNJRAgFAAAADSR0MDExNTE0MTE1ODMAAAACXzEEAAAAC2xpY2VuY2VIYXNoCAUAAAANJHQwMTE1MTQxMTU4MwAAAAJfMgQAAAAPdmFsaWRhdGVBcnR3b3JrCQEAAAATdmFsaWRhdGVBcnR3b3JrRGF0YQAAAAoFAAAABmNhbGxlcgUAAAAKY2lkRGlzcGxheQUAAAAJY2lkRXhwb3J0BQAAAApsaWNlbmNlQ0lEBQAAAAxzaGEyNTZFeHBvcnQFAAAAC2xpY2VuY2VIYXNoBQAAAARuYW1lBQAAAAtkZXNjcmlwdGlvbgUAAAAEdGFncwUAAAAHbWF4bWludAMJAQAAAAIhPQAAAAIFAAAAD3ZhbGlkYXRlQXJ0d29yawIAAAAACQAAAgAAAAECAAAAFVNvbWV0aGluZyB3ZW50IHdyb25nIQQAAAANJHQwMTE4MTExMTg1OAkBAAAAD3ZhbGlkYXRlUGF5bWVudAAAAAEFAAAABmludm9rZQQAAAAGYW1vdW50CAUAAAANJHQwMTE4MTExMTg1OAAAAAJfMQQAAAAHYXNzZXRJZAgFAAAADSR0MDExODExMTE4NTgAAAACXzIDCQEAAAABIQAAAAEJAQAAAAlpc0RlZmluZWQAAAABBQAAAAZhbW91bnQJAAACAAAAAQIAAAAUU29tZXRoaW5nIHdlbnQgd3JvbmcEAAAACmVudHJ5RXhpc3QJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABVrZXlBcnRUeGlkQnlIYXNoT3duZXIAAAACBQAAAApzaGEyNTZIYXNoBQAAAAZjYWxsZXIDCQEAAAACIT0AAAACBQAAAAplbnRyeUV4aXN0AgAAAAAJAAACAAAAAQIAAAAUWW91IGFscmVhZHkgYWRkZWQgaXQEAAAACWhhc2hFeGlzdAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAEWtleUFydE93bmVyQnlIYXNoAAAAAQUAAAAKc2hhMjU2SGFzaAMJAQAAAAIhPQAAAAIFAAAACWhhc2hFeGlzdAIAAAAACQAAAgAAAAECAAAAF0hhc2ggYWxyZWFkeSByZWdpc3RlcmVkBAAAAA9pc1NpZ25DZXJ0aWZpZWQJAQAAABRjaGVja1NpZ25DZXJ0aWZpY2F0ZQAAAAMFAAAABnNpZ25JRAUAAAAGY2FsbGVyBQAAAApzaGEyNTZIYXNoAwkBAAAAASEAAAABBQAAAA9pc1NpZ25DZXJ0aWZpZWQJAAACAAAAAQIAAAAsU2lnbiBDZXJ0aWZpY2F0ZSBub3QgZm91bmQgZm9yIHRoaXMgYWRkcmVzcy4JAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEWtleUFydE93bmVyQnlIYXNoAAAAAQUAAAAKc2hhMjU2SGFzaAUAAAAGY2FsbGVyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABVrZXlBcnRUeGlkQnlIYXNoT3duZXIAAAACBQAAAApzaGEyNTZIYXNoBQAAAAZjYWxsZXIFAAAABWFydElkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAKa2V5QXJ0RGF0ZQAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAACXRpbWVzdGFtcAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAKa2V5QXJ0TmFtZQAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAABG5hbWUJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAACmtleUFydERlc2MAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAtkZXNjcmlwdGlvbgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAQa2V5QXJ0RGlzcGxheUNpZAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAACmNpZERpc3BsYXkJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAD2tleUFydEV4cG9ydENpZAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAACWNpZEV4cG9ydAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAQa2V5QXJ0RXhwb3J0SGFzaAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAADHNoYTI1NkV4cG9ydAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAARa2V5QXJ0TGljZW5jZUhhc2gAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAtsaWNlbmNlSGFzaAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAQa2V5QXJ0TGljZW5jZUNpZAAAAAIFAAAABmNhbGxlcgUAAAAFYXJ0SWQFAAAACmxpY2VuY2VDSUQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAACmtleUFydFR5cGUAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAR0eXBlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAprZXlBcnRUYWdzAAAAAgUAAAAGY2FsbGVyBQAAAAVhcnRJZAUAAAAEdGFncwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADWtleUFydE1heE1pbnQAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAdtYXhtaW50CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAxrZXlBcnRTaWduSUQAAAACBQAAAAZjYWxsZXIFAAAABWFydElkBQAAAAZzaWduSUQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAxrZXlBcnRJc3N1ZWQAAAACBQAAAAZjYWxsZXIFAAAABWFydElkAAAAAAAAAAAACQAETAAAAAIJAQAAAAxCb29sZWFuRW50cnkAAAACCQEAAAAMa2V5QXJ0T25TYWxlAAAAAgUAAAAGY2FsbGVyBQAAAAVhcnRJZAcJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAE2tleUFydEFydGlkQnlTaWduaWQAAAACBQAAAAZjYWxsZXIFAAAABnNpZ25JRAUAAAAFYXJ0SWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAFGtleUFydEhhc2hCeVR4aWRBZGRyAAAAAgUAAAAGY2FsbGVyBQAAAAVhcnRJZAUAAAAKc2hhMjU2SGFzaAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQUAAAALZmVlUmVjZWl2ZXIFAAAABmFtb3VudAUAAAAHYXNzZXRJZAUAAAADbmlsAAAABmludm9rZQEAAAANdXBkYXRlQXJ0d29yawAAAAsAAAAEdHhpZAAAAARuYW1lAAAAC2Rlc2NyaXB0aW9uAAAABHRhZ3MAAAAEdHlwZQAAAAdtYXhtaW50AAAACmNpZERpc3BsYXkAAAAMc2hhMjU2RXhwb3J0AAAACWNpZEV4cG9ydAAAAA1zaGEyNTZMaWNlbmNlAAAACmNpZExpY2VuY2UDCQEAAAABIQAAAAEFAAAAC2RhcHBSdW5uaW5nCQAAAgAAAAEFAAAADm1haW50ZW5hbmNlTVNHBAAAAAh1cGRhdGVJZAkAAlgAAAABCAUAAAAGaW52b2tlAAAADXRyYW5zYWN0aW9uSWQEAAAABmNhbGxlcgkAAlgAAAABCAgFAAAABmludm9rZQAAAAZjYWxsZXIAAAAFYnl0ZXMEAAAADSR0MDE0NzEzMTQ3ODIJAQAAAApzZXRMSWNlbmNlAAAAAgUAAAAKY2lkTGljZW5jZQUAAAANc2hhMjU2TGljZW5jZQQAAAAKbGljZW5jZUNJRAgFAAAADSR0MDE0NzEzMTQ3ODIAAAACXzEEAAAAC2xpY2VuY2VIYXNoCAUAAAANJHQwMTQ3MTMxNDc4MgAAAAJfMgQAAAAPdmFsaWRhdGVBcnR3b3JrCQEAAAATdmFsaWRhdGVBcnR3b3JrRGF0YQAAAAoFAAAABmNhbGxlcgUAAAAKY2lkRGlzcGxheQUAAAAJY2lkRXhwb3J0BQAAAApsaWNlbmNlQ0lEBQAAAAxzaGEyNTZFeHBvcnQFAAAAC2xpY2VuY2VIYXNoBQAAAARuYW1lBQAAAAtkZXNjcmlwdGlvbgUAAAAEdGFncwUAAAAHbWF4bWludAMJAQAAAAIhPQAAAAIFAAAAD3ZhbGlkYXRlQXJ0d29yawIAAAAACQAAAgAAAAECAAAAFVNvbWV0aGluZyB3ZW50IHdyb25nIQQAAAAKZW50cnlFeGlzdAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAACmtleUFydE5hbWUAAAACBQAAAAZjYWxsZXIFAAAABHR4aWQDCQAAAAAAAAIFAAAACmVudHJ5RXhpc3QCAAAAAAkAAAIAAAABAgAAAA9FbnRyeSBub3QgZm91bmQEAAAABGZsYWcJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAAprZXlBcnRGbGFnAAAAAgUAAAAGY2FsbGVyBQAAAAR0eGlkAwkAAAAAAAACBQAAAARmbGFnAgAAAAdJTExFR0FMCQAAAgAAAAECAAAAHUNhbm5vdCB1cGRhdGUgSUxMRUdBTCBhcnR3b3JrAwkBAAAAASEAAAABCQEAAAALaXNBcnRNaW50ZWQAAAACBQAAAAZjYWxsZXIFAAAABHR4aWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAACmtleUFydE5hbWUAAAACBQAAAAZjYWxsZXIFAAAABHR4aWQFAAAABG5hbWUJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAACmtleUFydERlc2MAAAACBQAAAAZjYWxsZXIFAAAABHR4aWQFAAAAC2Rlc2NyaXB0aW9uCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBrZXlBcnREaXNwbGF5Q2lkAAAAAgUAAAAGY2FsbGVyBQAAAAR0eGlkBQAAAApjaWREaXNwbGF5CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA9rZXlBcnRFeHBvcnRDaWQAAAACBQAAAAZjYWxsZXIFAAAABHR4aWQFAAAACWNpZEV4cG9ydAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAQa2V5QXJ0RXhwb3J0SGFzaAAAAAIFAAAABmNhbGxlcgUAAAAEdHhpZAUAAAAMc2hhMjU2RXhwb3J0CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBrZXlBcnRMaWNlbmNlQ2lkAAAAAgUAAAAGY2FsbGVyBQAAAAR0eGlkBQAAAApsaWNlbmNlQ0lECQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABFrZXlBcnRMaWNlbmNlSGFzaAAAAAIFAAAABmNhbGxlcgUAAAAEdHhpZAUAAAALbGljZW5jZUhhc2gJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAA1rZXlBcnRNYXhNaW50AAAAAgUAAAAGY2FsbGVyBQAAAAR0eGlkBQAAAAdtYXhtaW50CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAprZXlBcnRUYWdzAAAAAgUAAAAGY2FsbGVyBQAAAAR0eGlkBQAAAAR0YWdzCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAprZXlBcnRUeXBlAAAAAgUAAAAGY2FsbGVyBQAAAAR0eGlkBQAAAAR0eXBlBQAAAANuaWwJAAACAAAAAQIAAAAOQWxyZWFkeSBtaW50ZWQAAAAGaW52b2tlAQAAAAtmbGFnQXJ0d29yawAAAAMAAAAFYXJ0SWQAAAAEYWRkcgAAAARmbGFnBAAAAAZjYWxsZXIJAAQlAAAAAQkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQgFAAAABmludm9rZQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAAAmlkCQACWAAAAAEIBQAAAAZpbnZva2UAAAANdHJhbnNhY3Rpb25JZAMJAQAAAA9jb250YWluc0VsZW1lbnQAAAACCQAETAAAAAIFAAAABWNocmlzCQAETAAAAAIFAAAABGpvZXAJAARMAAAAAgkABCUAAAABBQAAAAR0aGlzBQAAAANuaWwFAAAABmNhbGxlcgMJAAAAAAAAAgUAAAAEZmxhZwIAAAAHQ09OU0VOVAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAKa2V5QXJ0RmxhZwAAAAIFAAAABGFkZHIFAAAABWFydElkBQAAAARmbGFnBQAAAANuaWwDCQAAAAAAAAIFAAAABGZsYWcCAAAAAAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAKa2V5QXJ0RmxhZwAAAAIFAAAABGFkZHIFAAAABWFydElkBQAAAARmbGFnBQAAAANuaWwDCQAAAAAAAAIFAAAABGZsYWcCAAAAD0NIQU5HRV9SRVFVSVJFRAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAKa2V5QXJ0RmxhZwAAAAIFAAAABGFkZHIFAAAABWFydElkBQAAAARmbGFnBQAAAANuaWwDCQAAAAAAAAIFAAAABGZsYWcCAAAAB0lMTEVHQUwJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAACmtleUFydEZsYWcAAAACBQAAAARhZGRyBQAAAAVhcnRJZAUAAAAEZmxhZwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAKa2V5QXJ0TmFtZQAAAAIFAAAABGFkZHIFAAAABWFydElkAgAAAA9JTExFR0FMIENPTlRFTlQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAACmtleUFydERlc2MAAAACBQAAAARhZGRyBQAAAAVhcnRJZAIAAAAPSUxMRUdBTCBDT05URU5UCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBrZXlBcnREaXNwbGF5Q2lkAAAAAgUAAAAEYWRkcgUAAAAFYXJ0SWQCAAAAAAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAPa2V5QXJ0RXhwb3J0Q2lkAAAAAgUAAAAEYWRkcgUAAAAFYXJ0SWQCAAAAAAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAQa2V5QXJ0TGljZW5jZUNpZAAAAAIFAAAABGFkZHIFAAAABWFydElkAgAAAAAFAAAAA25pbAkAAAIAAAABCQABLAAAAAICAAAADlVua25vdyBzdGF0dXMgBQAAAARmbGFnCQAAAgAAAAECAAAAE1lvdSBhcmUgbm90IGFsbG93ZWQAAAAGaW52b2tlAQAAAA1kZWxldGVBcnR3b3JrAAAAAgAAAAVhcnRJZAAAAARhZGRyBAAAAAZjYWxsZXIJAAQlAAAAAQkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQgFAAAABmludm9rZQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAAAmlkCQACWAAAAAEIBQAAAAZpbnZva2UAAAANdHJhbnNhY3Rpb25JZAQAAAAMYWRkcmVzc1RvVXNlAwkBAAAAD2NvbnRhaW5zRWxlbWVudAAAAAIJAARMAAAAAgUAAAAFY2hyaXMJAARMAAAAAgUAAAAEam9lcAkABEwAAAACCQAEJQAAAAEFAAAABHRoaXMFAAAAA25pbAUAAAAGY2FsbGVyBQAAAARhZGRyBQAAAAZjYWxsZXIEAAAACmVudHJ5RXhpc3QJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAAprZXlBcnROYW1lAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAMJAAAAAAAAAgUAAAAKZW50cnlFeGlzdAIAAAAACQAAAgAAAAECAAAAIE5vIGFydCBtYXRjaGluZyBmb3IgdGhpcyBhZGRyZXNzBAAAAApzaGEyNTZIYXNoCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAUa2V5QXJ0SGFzaEJ5VHhpZEFkZHIAAAACBQAAAAxhZGRyZXNzVG9Vc2UFAAAABWFydElkAwkAAAAAAAACBQAAAApzaGEyNTZIYXNoAgAAAAAJAAACAAAAAQIAAAAlTm8gYXJ0IGhhc2ggbWF0Y2hpbmcgZm9yIHRoaXMgYWRkcmVzcwQAAAAGc2lnbklECQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAMa2V5QXJ0U2lnbklEAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAMJAAAAAAAAAgUAAAAGc2lnbklEAgAAAAAJAAACAAAAAQIAAAATTm8gU0lHTiBJRCBtYXRjaGluZwQAAAAMZGF0YVRvRGVsZXRlCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAAAprZXlBcnREYXRlAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAKa2V5QXJ0TmFtZQAAAAIFAAAADGFkZHJlc3NUb1VzZQUAAAAFYXJ0SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAACmtleUFydERlc2MAAAACBQAAAAxhZGRyZXNzVG9Vc2UFAAAABWFydElkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAABBrZXlBcnREaXNwbGF5Q2lkAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAPa2V5QXJ0RXhwb3J0Q2lkAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAQa2V5QXJ0RXhwb3J0SGFzaAAAAAIFAAAADGFkZHJlc3NUb1VzZQUAAAAFYXJ0SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAEWtleUFydExpY2VuY2VIYXNoAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAQa2V5QXJ0TGljZW5jZUNpZAAAAAIFAAAADGFkZHJlc3NUb1VzZQUAAAAFYXJ0SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAACmtleUFydFR5cGUAAAACBQAAAAxhZGRyZXNzVG9Vc2UFAAAABWFydElkCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAAAprZXlBcnRUYWdzAAAAAgUAAAAMYWRkcmVzc1RvVXNlBQAAAAVhcnRJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAANa2V5QXJ0TWF4TWludAAAAAIFAAAADGFkZHJlc3NUb1VzZQUAAAAFYXJ0SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAADGtleUFydFNpZ25JRAAAAAIFAAAADGFkZHJlc3NUb1VzZQUAAAAFYXJ0SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAADGtleUFydElzc3VlZAAAAAIFAAAADGFkZHJlc3NUb1VzZQUAAAAFYXJ0SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAADGtleUFydE9uU2FsZQAAAAIFAAAADGFkZHJlc3NUb1VzZQUAAAAFYXJ0SWQJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAACmtleUFydEZsYWcAAAACBQAAAARhZGRyBQAAAAVhcnRJZAkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAALa2V5QXJ0UHJpY2UA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CQEAAAABIQAAAAEFAAAAC2RhcHBSdW5uaW5nCQAAAgAAAAEFAAAADm1haW50ZW5hbmNlTVNHBAAAAAJpZAkAAlgAAAABCAUAAAAGaW52b2tlAAAADXRyYW5zYWN0aW9uSWQEAAAABmNhbGxlcgkAAlgAAAABCAgFAAAABmludm9rZQAAAAZjYWxsZXIAAAAFYnl0ZXMEAAAACHRvdGFsTkZUCQEAAAAPZ2V0SW50ZWdlckJ5S2V5AAAAAQIAAAAQdG90YWxfbmZ0X2lzc3VlZAQAAAAGc2lnbklECQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAMa2V5QXJ0U2lnbklEAAAAAgUAAAAGaXNzdWVyBQAAAAVhcnRJZAQAAAALYXJ0d29ya05hbWUJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAAprZXlBcnROYW1lAAAAAgUAAAAGaXNzdWVyBQAAAAVhcnRJZAMJAAAAAAAAAgUAAAALYXJ0d29ya05hbWUCAAAAAAkAAAIAAAABAgAAABFBcnQgZG9lc24ndCBleGlzdAQAAAAKZGlzcGxheUNJRAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAEGtleUFydERpc3BsYXlDaWQAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAAlleHBvcnRDSUQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAA9rZXlBcnRFeHBvcnRDaWQAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAApleHBvcnRIYXNoCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAQa2V5QXJ0RXhwb3J0SGFzaAAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQEAAAACmxpY2VuY2VDSUQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABBrZXlBcnRMaWNlbmNlQ2lkAAAAAgUAAAAGaXNzdWVyBQAAAAVhcnRJZAQAAAALbGljZW5jZUhhc2gJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABFrZXlBcnRMaWNlbmNlSGFzaAAAAAIFAAAABmlzc3VlcgUAAAAFYXJ0SWQEAAAAC2Rlc2NyaXB0aW9uCQABLwAAAAIJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAAprZXlBcnREZXNjAAAAAgUAAAAGaXNzdWVyBQAAAAVhcnRJZAAAAAAAAAAAMgQAAAAIaXNPblNhbGUJAQAAAA9nZXRCb29sZWFuQnlLZXkAAAABCQEAAAAMa2V5QXJ0T25TYWxlAAAAAgUAAAAGaXNzdWVyBQAAAAVhcnRJZAQAAAAKYW1vdW50U29sZAkBAAAAD2dldEludGVnZXJCeUtleQAAAAEJAQAAAAxrZXlBcnRJc3N1ZWQAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAAxhcnR3b3JrUHJpY2UJAQAAAA9nZXRJbnRlZ2VyQnlLZXkAAAABCQEAAAALa2V5QXJ0UHJpY2UAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAAxwcmljZUFzc2V0SWQJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABVrZXlBcnRBc3NldElkQWNjZXB0ZWQAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAApzb3VyY2VIYXNoCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAUa2V5QXJ0SGFzaEJ5VHhpZEFkZHIAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkBAAAAAptYXhDYW5TZWxsCQEAAAAPZ2V0SW50ZWdlckJ5S2V5AAAAAQkBAAAADWtleUFydE1heE1pbnQAAAACBQAAAAZpc3N1ZXIFAAAABWFydElkAwMDCQAAZwAAAAIAAAAAAAAAAAAFAAAADGFydHdvcmtQcmljZQYJAQAAAAEhAAAAAQUAAAAIaXNPblNhbGUGCQAAZwAAAAIAAAAAAAAAAAAFAAAACm1heENhblNlbGwJAAACAAAAAQIAAAAQQXJ0IG5vdCBmb3Igc2FsZQQAAAANJHQwMjMxNzUyMzI1NQkBAAAAFHZhbGlkYXRlUHJpY2VBc3NldElkAAAAAwUAAAAGaW52b2tlBQAAAAxwcmljZUFzc2V0SWQFAAAADGFydHdvcmtQcmljZQQAAAAGYW1vdW50CAUAAAANJHQwMjMxNzUyMzI1NQAAAAJfMQQAAAAHYXNzZXRJZAgFAAAADSR0MDIzMTc1MjMyNTUAAAACXzIEAAAADWlzV2hpdGVsaXN0ZWQJAQAAAA5jaGVja1doaXRlbGlzdAAA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", "height": 1371790, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 2tuuSoS9eFHCMqh9zhj9k9YpcLknNx7FcWHLSPQSAWfk Next: 7fKG7vgPsYDfKNmWV8BVAzzrUFzJXvZUif2G6jT5JFZY Diff:
OldNewDifferences
8888 func keyUserStatus (caller) = ("user_status_" + caller)
8989
9090
91-func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
91+func keyArtDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
9292
9393
94-func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
94+func keyArtName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
9595
9696
97-func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
97+func keyArtDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
9898
9999
100-func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
100+func keyArtDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
101101
102102
103-func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
103+func keyArtExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
104104
105105
106-func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
106+func keyArtExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
107107
108108
109-func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
109+func keyArtMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
110110
111111
112-func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
112+func keyArtSignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
113113
114114
115-func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
115+func keyArtIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
116116
117117
118-func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
118+func keyArtOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
119119
120120
121-func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
121+func keyArtLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
122122
123123
124-func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
124+func keyArtLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
125125
126126
127-func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
127+func keyArtTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
128128
129129
130-func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
130+func keyArtType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
131131
132132
133-func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
133+func keyArtPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
134134
135135
136-func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
136+func keyArtAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
137137
138138
139-func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
139+func keyArtFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
140140
141141
142-func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
142+func keyArtHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
143143
144144
145-func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
145+func keyArtOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
146146
147147
148-func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
148+func keyArtArtidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
149149
150150
151-func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
151+func keyArtTxidByHashOwner (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 isPayment (i) = if ((size(i.payments) == 0))
226+func validatePayment (invoke) = if ((size(invoke.payments) == 0))
227227 then throw("No payment attached")
228228 else {
229- let payment = value(i.payments[0])
229+ let payment = value(invoke.payments[0])
230230 let amount = value(payment.amount)
231- $Tuple2(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)
232240 }
233241
234242
235-func validatePayment (i) = {
236- let $t089038939 = isPayment(i)
237- let payment = $t089038939._1
238- let amount = $t089038939._2
239- let assetId = if (if (isDefined(payment.assetId))
240- then (payment.assetId == signAssetId)
241- else false)
242- then payment.assetId
243- else throw("Only SIGN token accepted as transaction fee")
244- let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
245- if ((amount != currentCertificationPrice))
246- then throw(("Payment amount should be " + toString(currentCertificationPrice)))
247- else $Tuple2(amount, assetId)
248- }
249-
250-
251-func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
243+func isArtMinted (addressToUse,artId) = match getInteger(this, keyArtIssued(addressToUse, artId)) {
252244 case b: Int =>
253245 if ((b != 0))
254246 then true
258250 }
259251
260252
261-func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
262- let $t096399675 = isPayment(i)
263- let payment = $t096399675._1
264- let amount = $t096399675._2
253+func validatePriceAssetId (invoke,priceAssetId,artworkPrice) = {
254+ let payment = value(invoke.payments[0])
255+ let amount = value(payment.amount)
265256 let assetId = if (!(isDefined(payment.assetId)))
266257 then unit
267258 else if (if ((size(priceAssetId) > 0))
279270 }
280271
281272
282-func acceptedAssetIds (assetId) = if (if (if (if ((assetId != toBase58String(signAssetId)))
273+func acceptedAssetIds (assetId) = if (if (if ((assetId != toBase58String(signAssetId)))
283274 then (assetId != toBase58String(wavesAssetId))
284- else false)
285- then (assetId != "WAVES")
286275 else false)
287276 then (assetId != toBase58String(usdnAssetId))
288277 else false)
320309 }
321310
322311
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))
312+@Callable(invoke)
313+func addArtwork (sha256Hash,signID,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
341314 then throw(maintenanceMSG)
342- else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
343-
344-
345-func buyMint (i,artId,issuer,bidId,bidOwner) = {
346- let $t01177611814 = idCallerDate(i)
347- let id = $t01177611814._1
348- let caller = $t01177611814._2
349- let date = $t01177611814._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 $t01266112790 = if (isBid)
377- then getPriceAssetIdFromBid(bidDataKey)
378- else validatePriceAssetId(i, priceAssetId, artworkPrice)
379- let amount = $t01266112790._1
380- let assetId = $t01266112790._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 $t01581615857 = idCallerDate(i)
433- let artId = $t01581615857._1
434- let caller = $t01581615857._2
435- let date = $t01581615857._3
436- if (!(validateHash(sha256Hash)))
437- then throw("Hash should be 64 characters maximum")
438- else {
439- let $t01595816027 = setLIcence(cidLicence, sha256Licence)
440- let licenceCID = $t01595816027._1
441- let licenceHash = $t01595816027._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 $t01625516297 = validatePayment(i)
447- let amount = $t01625516297._1
448- let assetId = $t01625516297._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- }
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+ }
470353
471354
472355
473-@Callable(i)
356+@Callable(invoke)
474357 func updateArtwork (txid,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
475358 then throw(maintenanceMSG)
476359 else {
477- let caller = toBase58String(i.caller.bytes)
478- let $t01901819087 = setLIcence(cidLicence, sha256Licence)
479- let licenceCID = $t01901819087._1
480- let licenceHash = $t01901819087._2
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
481365 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
482366 if ((validateArtwork != ""))
483367 then throw("Something went wrong!")
484368 else {
485- let entryExist = getStringByKey(keyName(caller, txid))
369+ let entryExist = getStringByKey(keyArtName(caller, txid))
486370 if ((entryExist == ""))
487371 then throw("Entry not found")
488372 else {
489- let flag = getStringByKey(keyFlag(caller, txid))
373+ let flag = getStringByKey(keyArtFlag(caller, txid))
490374 if ((flag == "ILLEGAL"))
491375 then throw("Cannot update ILLEGAL artwork")
492376 else if (!(isArtMinted(caller, txid)))
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)]
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)]
494378 else throw("Already minted")
495379 }
496380 }
498382
499383
500384
501-@Callable(i)
385+@Callable(invoke)
502386 func flagArtwork (artId,addr,flag) = {
503- let $t02056020593 = idCallerDate(i)
504- let id = $t02056020593._1
505- let caller = $t02056020593._2
387+ let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
388+ let id = toBase58String(invoke.transactionId)
506389 if (containsElement([chris, joep, toString(this)], caller))
507390 then if ((flag == "CONSENT"))
508- then [StringEntry(keyFlag(addr, artId), flag)]
391+ then [StringEntry(keyArtFlag(addr, artId), flag)]
509392 else if ((flag == ""))
510- then [StringEntry(keyFlag(addr, artId), flag)]
511- else if ((flag == "ILLEGAL"))
512- 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), "")]
513- else throw(("Unknow status " + flag))
393+ then [StringEntry(keyArtFlag(addr, artId), flag)]
394+ 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), "")]
398+ else throw(("Unknow status " + flag))
514399 else throw("You are not allowed")
515400 }
516401
517402
518403
519-@Callable(i)
404+@Callable(invoke)
520405 func deleteArtwork (artId,addr) = {
521- let $t02144121474 = idCallerDate(i)
522- let id = $t02144121474._1
523- let caller = $t02144121474._2
524- let addrToUse = if (containsElement([chris, joep, toString(this)], caller))
406+ let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
407+ let id = toBase58String(invoke.transactionId)
408+ let addressToUse = if (containsElement([chris, joep, toString(this)], caller))
525409 then addr
526410 else caller
527- let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
411+ let entryExist = getStringByKey(keyArtName(addressToUse, artId))
528412 if ((entryExist == ""))
529413 then throw("No art matching for this address")
530414 else {
531- let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
415+ let sha256Hash = getStringByKey(keyArtHashByTxidAddr(addressToUse, artId))
532416 if ((sha256Hash == ""))
533417 then throw("No art hash matching for this address")
534418 else {
535- let signID = getStringByKey(keySignID(addrToUse, artId))
419+ let signID = getStringByKey(keyArtSignID(addressToUse, artId))
536420 if ((signID == ""))
537421 then throw("No SIGN ID matching")
538422 else {
539- 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))]
540- if (!(isArtMinted(addrToUse, artId)))
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)))
541425 then if (!(dappRunning))
542426 then throw(maintenanceMSG)
543427 else dataToDelete
551435
552436
553437
554-@Callable(i)
555-func sellArtwork (artId,price,maxMint,assetId) = {
556- let $t02384023873 = idCallerDate(i)
557- let id = $t02384023873._1
558- let caller = $t02384023873._2
559- let artworkName = getStringByKey(keyName(caller, artId))
560- if ((artworkName == ""))
561- then throw("This art doesn't match your account")
562- else {
563- let exportCID = getStringByKey(keyExportCid(caller, artId))
564- if ((size(split(exportCID, "/")[0]) != 59))
565- then throw("You cannot sell art with no export file")
566- else if (!(acceptedAssetIds(assetId)))
567- then throw("Something went wrong!")
568- else if (!(validateMinSell(assetId, price)))
569- then throw("Something went wrong!")
570- else {
571- let checkUser = validateUser(caller)
572- if ((checkUser != ""))
573- then throw(checkUser)
574- else {
575- let amountSold = getIntegerByKey(keyIssued(caller, artId))
576- let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
577- if ((maxMint > 10))
578- then throw("10 editions max per artwork")
579- else if (if ((amountSold != 0))
580- then (amountSold == maxCanSell)
581- else false)
582- then throw("Max edition reached.")
583- else if (if ((amountSold > 0))
584- then (maxCanSell != maxMint)
585- else false)
586- then throw("Cannot change maximum issuable anymore")
587- else {
588- let sellStatus = if (if ((price > 0))
589- then (maxMint > 0)
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)
590471 else false)
591- then true
592- else false
593-[BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), StringEntry(keyAssetIdAccepted(caller, artId), assetId)]
594- }
595- }
596- }
597- }
598- }
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+ }
599490
600491
601492
602-@Callable(i)
603-func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "")
604-
605-
606-
607-@Callable(i)
608-func setBid (artId,issuer) = {
609- let $t02566925707 = idCallerDate(i)
610- let id = $t02566925707._1
611- let caller = $t02566925707._2
612- let date = $t02566925707._3
613- let $t02571225748 = isPayment(i)
614- let payment = $t02571225748._1
615- let amount = $t02571225748._2
616- let assetId = if (!(isDefined(payment.assetId)))
617- then "WAVES"
618- else toBase58String(value(payment.assetId))
619- if (!(acceptedAssetIds(assetId)))
620- then throw("Something went wrong!")
621- else if (!(validateMinSell(assetId, amount)))
622- then throw("Something went wrong!")
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")
623504 else {
624- let amountSold = getIntegerByKey(keyIssued(issuer, artId))
625- let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
626- if ((amountSold >= maxCanSell))
627- then throw("Sold out, you cannot bid")
628- else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date)))]
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+ }
629561 }
630- }
631-
632-
633-
634-@Callable(i)
635-func acceptBid (artId,issuer,bidId,bidOwner) = {
636- let caller = toBase58String(i.caller.bytes)
637- if ((caller != issuer))
638- then throw("You cannot do this action")
639- else buyMint(i, artId, issuer, bidId, bidOwner)
640- }
641-
642-
643-
644-@Callable(i)
645-func cancelBid (artId,issuer,bidId,bidOwner) = {
646- let $t02683126869 = idCallerDate(i)
647- let id = $t02683126869._1
648- let caller = $t02683126869._2
649- let date = $t02683126869._3
650- if (if ((caller != bidOwner))
651- then (caller != issuer)
652- else false)
653- then throw("You cannot do this action")
654- else {
655- let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
656- let bidData = getStringByKey((bidDataKey + "_OPEN"))
657- if ((bidData == ""))
658- then throw("Bid not found")
659- else {
660- let bidDataArr = split(bidData, "_")
661- let assetId = if ((bidDataArr[0] == "WAVES"))
662- then unit
663- else fromBase58String(bidDataArr[0])
664- let bidStatus = if ((caller == bidOwner))
665- then "CANCELED"
666- else "REJECTED"
667-[DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), ScriptTransfer(Address(fromBase58String(bidOwner)), parseIntValue(bidDataArr[1]), assetId)]
668- }
669- }
670- }
562+ }
671563
672564
673565
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let unitTest = false
55
66 let oracleFee = value(addressFromString("3N2s5RtaHPBenCsx2ECcoFRbYHx3noZhXW1"))
77
88 let signDapp = value(addressFromString("3NC28hSivrmsTUXaYD1x6L362J4ZpUnoTdB"))
99
1010 let feeReceiver = "3N1E6tXddRoVaRfQ9dQ3vg5LaW2fsd8HKub"
1111
1212 let userDapp = if (unitTest)
1313 then value(addressFromString("3Mt4RGMEyjSWYAocTPqd55wdHQQB3PU2UCm"))
1414 else value(addressFromString("3MwDZagoYEiNfQLc31cGpYoaE54MGMwoFrZ"))
1515
1616 let whitelistDapp = value(addressFromString("3N6BaV1dCB4zg43goNNHaCtvR13BcyJ5Gsq"))
1717
1818 let signAssetId = base58'Gf9t8FA4H3ssoZPCwrg3KwUFCci8zuUFP9ssRsUY3s6a'
1919
2020 let usdnAssetId = base58'25FEqEjRkqK6yCkiT7Lz6SAYz7gUFCtxfCChnrVFD5AT'
2121
2222 let wavesAssetId = base58''
2323
2424 let chris = "3MsG6jPNCrVJUtYB7XJBxS7utWsXAf4n9Vp"
2525
2626 let joep = "3Mzm4VLwsN9uZwbTMzPj3XuxV6kEfAR8UDN"
2727
2828 let signCut = 7
2929
3030 let usdnWaveCut = 10
3131
3232 let defaultLicence = "bafybeifuyo4pqu54ismqgtb6e4h6kkvgx7zg4u3zibh2r7y6mb64i7bzza/licence.pdf"
3333
3434 let defaultHashLicence = "a87758c354e30a9e78fb84fa3a0010a5090ab20df0be11ad45b5720cc187e639"
3535
3636 let dappRunning = valueOrElse(getBoolean(userDapp, "conf_dapp_is_running"), true)
3737
3838 let maintenanceMSG = valueOrElse(getString(userDapp, "conf_maintenance_msg"), "")
3939
4040 let userSuspended = "SUSPENDED"
4141
4242 let userRemoved = "REMOVED"
4343
4444 let userUnregistered = "UNREGISTERED"
4545
4646 let userAllowed = "ALLOWED"
4747
4848 func getStringByKeyFromUsers (key) = valueOrElse(getString(userDapp, key), "")
4949
5050
5151 func getStringByKey (key) = valueOrElse(getString(this, key), "")
5252
5353
5454 func getIntegerByKeyFromOracle (key) = valueOrErrorMessage(getInteger(oracleFee, key), "Integer undefine or 0 in oracle")
5555
5656
5757 func getIntegerByKey (key) = valueOrElse(getInteger(this, key), 0)
5858
5959
6060 func checkWhitelist (key) = valueOrElse(getInteger(whitelistDapp, key), 0)
6161
6262
6363 func getBooleanByKey (key) = valueOrElse(getBoolean(this, key), false)
6464
6565
6666 func checkSignCertificate (signID,Owner,sha256Hash) = match getString(signDapp, ((("data_fc_" + signID) + "_") + Owner)) {
6767 case a: String =>
6868 if (contains(a, sha256Hash))
6969 then true
7070 else false
7171 case _ =>
7272 false
7373 }
7474
7575
7676 func validateCID (cid) = if (contains(cid, "/"))
7777 then if (if ((76 > size(cid)))
7878 then (size(split(cid, "/")[0]) == 59)
7979 else false)
8080 then (16 > size(split(cid, "/")[1]))
8181 else false
8282 else false
8383
8484
8585 func validateHash (hash) = (size(hash) == 64)
8686
8787
8888 func keyUserStatus (caller) = ("user_status_" + caller)
8989
9090
91-func keyDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
91+func keyArtDate (caller,artId) = ((("art_date_" + artId) + "_") + caller)
9292
9393
94-func keyName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
94+func keyArtName (caller,artId) = ((("art_name_" + artId) + "_") + caller)
9595
9696
97-func keyDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
97+func keyArtDesc (caller,artId) = ((("art_desc_" + artId) + "_") + caller)
9898
9999
100-func keyDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
100+func keyArtDisplayCid (caller,artId) = ((("art_display_cid_" + artId) + "_") + caller)
101101
102102
103-func keyExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
103+func keyArtExportHash (caller,artId) = ((("art_export_hash_" + artId) + "_") + caller)
104104
105105
106-func keyExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
106+func keyArtExportCid (caller,artId) = ((("art_export_cid_" + artId) + "_") + caller)
107107
108108
109-func keyMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
109+func keyArtMaxMint (caller,artId) = ((("art_maxmint_" + artId) + "_") + caller)
110110
111111
112-func keySignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
112+func keyArtSignID (caller,artId) = ((("art_signid_" + artId) + "_") + caller)
113113
114114
115-func keyIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
115+func keyArtIssued (caller,artId) = ((("art_issued_" + artId) + "_") + caller)
116116
117117
118-func keyOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
118+func keyArtOnSale (caller,artId) = ((("art_onsale_" + artId) + "_") + caller)
119119
120120
121-func keyLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
121+func keyArtLicenceHash (caller,artId) = ((("art_licence_hash_" + artId) + "_") + caller)
122122
123123
124-func keyLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
124+func keyArtLicenceCid (caller,artId) = ((("art_licence_cid_" + artId) + "_") + caller)
125125
126126
127-func keyTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
127+func keyArtTags (caller,artId) = ((("art_tags_" + artId) + "_") + caller)
128128
129129
130-func keyType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
130+func keyArtType (caller,artId) = ((("art_type_" + artId) + "_") + caller)
131131
132132
133-func keyPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
133+func keyArtPrice (caller,artId) = ((("art_price_" + artId) + "_") + caller)
134134
135135
136-func keyAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
136+func keyArtAssetIdAccepted (caller,artId) = ((("art_assetAccepted_" + artId) + "_") + caller)
137137
138138
139-func keyFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
139+func keyArtFlag (caller,artId) = ((("art_flag_" + artId) + "_") + caller)
140140
141141
142-func keyHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
142+func keyArtHashByTxidAddr (caller,txid) = ((("get_hashbytxidaddr_" + txid) + "_") + caller)
143143
144144
145-func keyOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
145+func keyArtOwnerByHash (sha256Hash) = ("get_owner_by_hash_" + sha256Hash)
146146
147147
148-func keyidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
148+func keyArtArtidBySignid (caller,signId) = ((("get_artidbysignid_" + signId) + "_") + caller)
149149
150150
151-func keyTxidByHashOwner (sha256Hash,caller) = ("get_txid_by_hash_owner_" + toBase58String(sha256_16Kb(toBytes((sha256Hash + caller)))))
151+func keyArtTxidByHashOwner (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 isPayment (i) = if ((size(i.payments) == 0))
226+func validatePayment (invoke) = if ((size(invoke.payments) == 0))
227227 then throw("No payment attached")
228228 else {
229- let payment = value(i.payments[0])
229+ let payment = value(invoke.payments[0])
230230 let amount = value(payment.amount)
231- $Tuple2(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)
232240 }
233241
234242
235-func validatePayment (i) = {
236- let $t089038939 = isPayment(i)
237- let payment = $t089038939._1
238- let amount = $t089038939._2
239- let assetId = if (if (isDefined(payment.assetId))
240- then (payment.assetId == signAssetId)
241- else false)
242- then payment.assetId
243- else throw("Only SIGN token accepted as transaction fee")
244- let currentCertificationPrice = getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId)))
245- if ((amount != currentCertificationPrice))
246- then throw(("Payment amount should be " + toString(currentCertificationPrice)))
247- else $Tuple2(amount, assetId)
248- }
249-
250-
251-func isArtMinted (addrToUse,artId) = match getInteger(this, keyIssued(addrToUse, artId)) {
243+func isArtMinted (addressToUse,artId) = match getInteger(this, keyArtIssued(addressToUse, artId)) {
252244 case b: Int =>
253245 if ((b != 0))
254246 then true
255247 else false
256248 case _ =>
257249 false
258250 }
259251
260252
261-func validatePriceAssetId (i,priceAssetId,artworkPrice) = {
262- let $t096399675 = isPayment(i)
263- let payment = $t096399675._1
264- let amount = $t096399675._2
253+func validatePriceAssetId (invoke,priceAssetId,artworkPrice) = {
254+ let payment = value(invoke.payments[0])
255+ let amount = value(payment.amount)
265256 let assetId = if (!(isDefined(payment.assetId)))
266257 then unit
267258 else if (if ((size(priceAssetId) > 0))
268259 then (toBase58String(value(payment.assetId)) == priceAssetId)
269260 else false)
270261 then payment.assetId
271262 else throw("Wrong asset id")
272263 if (if ((assetId == unit))
273264 then (priceAssetId != "")
274265 else false)
275266 then throw("Wrong asset id")
276267 else if ((artworkPrice != amount))
277268 then throw("Payment don't match")
278269 else $Tuple2(amount, assetId)
279270 }
280271
281272
282-func acceptedAssetIds (assetId) = if (if (if (if ((assetId != toBase58String(signAssetId)))
273+func acceptedAssetIds (assetId) = if (if (if ((assetId != toBase58String(signAssetId)))
283274 then (assetId != toBase58String(wavesAssetId))
284- else false)
285- then (assetId != "WAVES")
286275 else false)
287276 then (assetId != toBase58String(usdnAssetId))
288277 else false)
289278 then throw("Only SIGN, USDN or WAVES accepted")
290279 else true
291280
292281
293282 func validateMinSell (assetId,price) = {
294283 let minSellWaves = if (unitTest)
295284 then 1
296285 else getIntegerByKeyFromOracle("waves_min_sell")
297286 let minSellUsdn = 1000000
298287 let minSellSign = if (unitTest)
299288 then 1
300289 else (getIntegerByKeyFromOracle(("certification_fee_" + toBase58String(signAssetId))) * 2)
301290 if (if (if (if (if ((assetId == toBase58String(usdnAssetId)))
302291 then (minSellUsdn > price)
303292 else false)
304293 then (price != 0)
305294 else false)
306295 then true
307296 else if (if ((assetId == toBase58String(signAssetId)))
308297 then (minSellSign > price)
309298 else false)
310299 then (price != 0)
311300 else false)
312301 then true
313302 else if (if ((assetId == toBase58String(wavesAssetId)))
314303 then (minSellWaves > price)
315304 else false)
316305 then (price != 0)
317306 else false)
318307 then throw("Wrong minimum sell price")
319308 else true
320309 }
321310
322311
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))
312+@Callable(invoke)
313+func addArtwork (sha256Hash,signID,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
341314 then throw(maintenanceMSG)
342- else $Tuple3(toBase58String(i.transactionId), toBase58String(i.caller.bytes), lastBlock.timestamp)
343-
344-
345-func buyMint (i,artId,issuer,bidId,bidOwner) = {
346- let $t01177611814 = idCallerDate(i)
347- let id = $t01177611814._1
348- let caller = $t01177611814._2
349- let date = $t01177611814._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 $t01266112790 = if (isBid)
377- then getPriceAssetIdFromBid(bidDataKey)
378- else validatePriceAssetId(i, priceAssetId, artworkPrice)
379- let amount = $t01266112790._1
380- let assetId = $t01266112790._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 $t01581615857 = idCallerDate(i)
433- let artId = $t01581615857._1
434- let caller = $t01581615857._2
435- let date = $t01581615857._3
436- if (!(validateHash(sha256Hash)))
437- then throw("Hash should be 64 characters maximum")
438- else {
439- let $t01595816027 = setLIcence(cidLicence, sha256Licence)
440- let licenceCID = $t01595816027._1
441- let licenceHash = $t01595816027._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 $t01625516297 = validatePayment(i)
447- let amount = $t01625516297._1
448- let assetId = $t01625516297._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- }
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+ }
470353
471354
472355
473-@Callable(i)
356+@Callable(invoke)
474357 func updateArtwork (txid,name,description,tags,type,maxmint,cidDisplay,sha256Export,cidExport,sha256Licence,cidLicence) = if (!(dappRunning))
475358 then throw(maintenanceMSG)
476359 else {
477- let caller = toBase58String(i.caller.bytes)
478- let $t01901819087 = setLIcence(cidLicence, sha256Licence)
479- let licenceCID = $t01901819087._1
480- let licenceHash = $t01901819087._2
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
481365 let validateArtwork = validateArtworkData(caller, cidDisplay, cidExport, licenceCID, sha256Export, licenceHash, name, description, tags, maxmint)
482366 if ((validateArtwork != ""))
483367 then throw("Something went wrong!")
484368 else {
485- let entryExist = getStringByKey(keyName(caller, txid))
369+ let entryExist = getStringByKey(keyArtName(caller, txid))
486370 if ((entryExist == ""))
487371 then throw("Entry not found")
488372 else {
489- let flag = getStringByKey(keyFlag(caller, txid))
373+ let flag = getStringByKey(keyArtFlag(caller, txid))
490374 if ((flag == "ILLEGAL"))
491375 then throw("Cannot update ILLEGAL artwork")
492376 else if (!(isArtMinted(caller, txid)))
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)]
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)]
494378 else throw("Already minted")
495379 }
496380 }
497381 }
498382
499383
500384
501-@Callable(i)
385+@Callable(invoke)
502386 func flagArtwork (artId,addr,flag) = {
503- let $t02056020593 = idCallerDate(i)
504- let id = $t02056020593._1
505- let caller = $t02056020593._2
387+ let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
388+ let id = toBase58String(invoke.transactionId)
506389 if (containsElement([chris, joep, toString(this)], caller))
507390 then if ((flag == "CONSENT"))
508- then [StringEntry(keyFlag(addr, artId), flag)]
391+ then [StringEntry(keyArtFlag(addr, artId), flag)]
509392 else if ((flag == ""))
510- then [StringEntry(keyFlag(addr, artId), flag)]
511- else if ((flag == "ILLEGAL"))
512- 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), "")]
513- else throw(("Unknow status " + flag))
393+ then [StringEntry(keyArtFlag(addr, artId), flag)]
394+ 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), "")]
398+ else throw(("Unknow status " + flag))
514399 else throw("You are not allowed")
515400 }
516401
517402
518403
519-@Callable(i)
404+@Callable(invoke)
520405 func deleteArtwork (artId,addr) = {
521- let $t02144121474 = idCallerDate(i)
522- let id = $t02144121474._1
523- let caller = $t02144121474._2
524- let addrToUse = if (containsElement([chris, joep, toString(this)], caller))
406+ let caller = toString(addressFromPublicKey(invoke.callerPublicKey))
407+ let id = toBase58String(invoke.transactionId)
408+ let addressToUse = if (containsElement([chris, joep, toString(this)], caller))
525409 then addr
526410 else caller
527- let entryExist = valueOrErrorMessage(getStringByKey(keyName(addrToUse, artId)), "No art matching for this address")
411+ let entryExist = getStringByKey(keyArtName(addressToUse, artId))
528412 if ((entryExist == ""))
529413 then throw("No art matching for this address")
530414 else {
531- let sha256Hash = getStringByKey(keyHashByTxidAddr(addrToUse, artId))
415+ let sha256Hash = getStringByKey(keyArtHashByTxidAddr(addressToUse, artId))
532416 if ((sha256Hash == ""))
533417 then throw("No art hash matching for this address")
534418 else {
535- let signID = getStringByKey(keySignID(addrToUse, artId))
419+ let signID = getStringByKey(keyArtSignID(addressToUse, artId))
536420 if ((signID == ""))
537421 then throw("No SIGN ID matching")
538422 else {
539- 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))]
540- if (!(isArtMinted(addrToUse, artId)))
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)))
541425 then if (!(dappRunning))
542426 then throw(maintenanceMSG)
543427 else dataToDelete
544428 else if (containsElement([chris, toString(this)], caller))
545429 then dataToDelete
546430 else throw("Art already minted, you cannot delete it")
547431 }
548432 }
549433 }
550434 }
551435
552436
553437
554-@Callable(i)
555-func sellArtwork (artId,price,maxMint,assetId) = {
556- let $t02384023873 = idCallerDate(i)
557- let id = $t02384023873._1
558- let caller = $t02384023873._2
559- let artworkName = getStringByKey(keyName(caller, artId))
560- if ((artworkName == ""))
561- then throw("This art doesn't match your account")
562- else {
563- let exportCID = getStringByKey(keyExportCid(caller, artId))
564- if ((size(split(exportCID, "/")[0]) != 59))
565- then throw("You cannot sell art with no export file")
566- else if (!(acceptedAssetIds(assetId)))
567- then throw("Something went wrong!")
568- else if (!(validateMinSell(assetId, price)))
569- then throw("Something went wrong!")
570- else {
571- let checkUser = validateUser(caller)
572- if ((checkUser != ""))
573- then throw(checkUser)
574- else {
575- let amountSold = getIntegerByKey(keyIssued(caller, artId))
576- let maxCanSell = getIntegerByKey(keyMaxMint(caller, artId))
577- if ((maxMint > 10))
578- then throw("10 editions max per artwork")
579- else if (if ((amountSold != 0))
580- then (amountSold == maxCanSell)
581- else false)
582- then throw("Max edition reached.")
583- else if (if ((amountSold > 0))
584- then (maxCanSell != maxMint)
585- else false)
586- then throw("Cannot change maximum issuable anymore")
587- else {
588- let sellStatus = if (if ((price > 0))
589- then (maxMint > 0)
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)
590471 else false)
591- then true
592- else false
593-[BooleanEntry(keyOnSale(caller, artId), sellStatus), IntegerEntry(keyPrice(caller, artId), price), IntegerEntry(keyMaxMint(caller, artId), maxMint), StringEntry(keyAssetIdAccepted(caller, artId), assetId)]
594- }
595- }
596- }
597- }
598- }
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+ }
599490
600491
601492
602-@Callable(i)
603-func buyArtwork (artId,issuer) = buyMint(i, artId, issuer, "", "")
604-
605-
606-
607-@Callable(i)
608-func setBid (artId,issuer) = {
609- let $t02566925707 = idCallerDate(i)
610- let id = $t02566925707._1
611- let caller = $t02566925707._2
612- let date = $t02566925707._3
613- let $t02571225748 = isPayment(i)
614- let payment = $t02571225748._1
615- let amount = $t02571225748._2
616- let assetId = if (!(isDefined(payment.assetId)))
617- then "WAVES"
618- else toBase58String(value(payment.assetId))
619- if (!(acceptedAssetIds(assetId)))
620- then throw("Something went wrong!")
621- else if (!(validateMinSell(assetId, amount)))
622- then throw("Something went wrong!")
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")
623504 else {
624- let amountSold = getIntegerByKey(keyIssued(issuer, artId))
625- let maxCanSell = getIntegerByKey(keyMaxMint(issuer, artId))
626- if ((amountSold >= maxCanSell))
627- then throw("Sold out, you cannot bid")
628- else [StringEntry((((((((("bid_" + artId) + "_") + issuer) + "_") + caller) + "_") + id) + "_OPEN"), ((((assetId + "_") + toString(amount)) + "_") + toString(date)))]
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+ }
629561 }
630- }
631-
632-
633-
634-@Callable(i)
635-func acceptBid (artId,issuer,bidId,bidOwner) = {
636- let caller = toBase58String(i.caller.bytes)
637- if ((caller != issuer))
638- then throw("You cannot do this action")
639- else buyMint(i, artId, issuer, bidId, bidOwner)
640- }
641-
642-
643-
644-@Callable(i)
645-func cancelBid (artId,issuer,bidId,bidOwner) = {
646- let $t02683126869 = idCallerDate(i)
647- let id = $t02683126869._1
648- let caller = $t02683126869._2
649- let date = $t02683126869._3
650- if (if ((caller != bidOwner))
651- then (caller != issuer)
652- else false)
653- then throw("You cannot do this action")
654- else {
655- let bidDataKey = ((((((("bid_" + artId) + "_") + issuer) + "_") + bidOwner) + "_") + bidId)
656- let bidData = getStringByKey((bidDataKey + "_OPEN"))
657- if ((bidData == ""))
658- then throw("Bid not found")
659- else {
660- let bidDataArr = split(bidData, "_")
661- let assetId = if ((bidDataArr[0] == "WAVES"))
662- then unit
663- else fromBase58String(bidDataArr[0])
664- let bidStatus = if ((caller == bidOwner))
665- then "CANCELED"
666- else "REJECTED"
667-[DeleteEntry((bidDataKey + "_OPEN")), StringEntry(((bidDataKey + "_") + bidStatus), ((bidData + "_") + toString(date))), ScriptTransfer(Address(fromBase58String(bidOwner)), parseIntValue(bidDataArr[1]), assetId)]
668- }
669- }
670- }
562+ }
671563
672564
673565
674566 @Callable(i)
675567 func deleteEntry (entry) = {
676568 let caller = toString(addressFromPublicKey(i.callerPublicKey))
677569 if ((caller == chris))
678570 then [DeleteEntry(entry)]
679571 else throw("no")
680572 }
681573
682574

github/deemru/w8io/3ef1775 
306.94 ms