tx · GTBCkBJ9jXzYY6HHXFd9bvE3Cf2rhC46Z6ZHorHK2Fgt

3MzSNsJLeYj6Eh6u2QzJrbByPCySgFoCbWC:  -0.05000000 Waves

2020.01.09 09:05 [845991] smart account 3MzSNsJLeYj6Eh6u2QzJrbByPCySgFoCbWC > SELF 0.00000000 Waves

{ "type": 13, "id": "GTBCkBJ9jXzYY6HHXFd9bvE3Cf2rhC46Z6ZHorHK2Fgt", "fee": 5000000, "feeAssetId": null, "timestamp": 1578546203479, "version": 1, "sender": "3MzSNsJLeYj6Eh6u2QzJrbByPCySgFoCbWC", "senderPublicKey": "99sSPZk2SumsopYRh2PAvWL8BHjDhYsY5NspsFGXLnAm", "proofs": [ "4bj9W5GzWXDwBg42TAmbNFBEm1xmvfmtiSjKrFR6DmgGdSSmc8Hp5RoU2uZgjV71ZVhjYkYXEgAh6oif6KxyEEZ6" ], "script": "base64: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dFN0ckJ5S2V5AAAAAQkBAAAAEGdldEtleVRhc2tBdXRob3IAAAABBQAAAAR0YXNrAQAAAA9nZXRLZXlUYXNrQmxvY2sAAAABAAAABHRhc2sJAAEsAAAAAgIAAAAGYmxvY2tfBQAAAAR0YXNrAQAAABFnZXRWYWx1ZVRhc2tCbG9jawAAAAEAAAAEdGFzawkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAD2dldEtleVRhc2tCbG9jawAAAAEFAAAABHRhc2sBAAAADmdldEtleVRhc2tCYW5rAAAAAQAAAAR0YXNrCQABLAAAAAICAAAABWJhbmtfBQAAAAR0YXNrAQAAABBnZXRWYWx1ZVRhc2tCYW5rAAAAAQAAAAR0YXNrCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAOZ2V0S2V5VGFza0JhbmsAAAABBQAAAAR0YXNrAQAAABRnZXRLZXlUYXNrRnJlZWxhbmNlcgAAAAEAAAAEdGFzawkAASwAAAACAgAAAAtmcmVlbGFuY2VyXwUAAAAEdGFzawEAAAAWZ2V0VmFsdWVUYXNrRnJlZWxhbmNlcgAAAAEAAAAEdGFzawkBAAAAC2dldFN0ckJ5S2V5AAAAAQkBAAAAFGdldEtleVRhc2tGcmVlbGFuY2VyAAAAAQUAAAAEdGFzawEAAAAQZ2V0S2V5VGFza1N0YXR1cwAAAAEAAAAEdGFzawkAASwAAAACAgAAAAdzdGF0dXNfBQAAAAR0YXNrAQAAABJnZXRWYWx1ZVRhc2tTdGF0dXMAAAABAAAABHRhc2sJAQAAAAtnZXRTdHJCeUtleQAAAAEJAQAAABBnZXRLZXlUYXNrU3RhdHVzAAAAAQUAAAAEdGFzawEAAAAUZ2V0S2V5VGFza0V4cGlyYXRpb24AAAABAAAABHRhc2sJAAEsAAAAAgIAAAARZXhwaXJhdGlvbl9ibG9ja18FAAAABHRhc2sBAAAAFmdldFZhbHVlVGFza0V4cGlyYXRpb24AAAABAAAABHRhc2sJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABRnZXRLZXlUYXNrRXhwaXJhdGlvbgAAAAEFAAAABHRhc2sBAAAADWdldEtleVVzZXJCaW8AAAABAAAAB2FjY291bnQJAAEsAAAAAgIAAAAJdXNlcl9iaW9fBQAAAAdhY2NvdW50AQAAAA9nZXRWYWx1ZVVzZXJCaW8AAAABAAAAB2FjY291bnQJAQAAAAtnZXRTdHJCeUtleQAAAAEJAQAAAA1nZXRLZXlVc2VyQmlvAAAAAQUAAAAHYWNjb3VudAEAAAAQZ2V0S2V5VXNlclN0YXR1cwAAAAEAAAAHYWNjb3VudAkAASwAAAACAgAAAAl1c2VyX3N0c18FAAAAB2FjY291bnQBAAAAEmdldFZhbHVlVXNlclN0YXR1cwAAAAEAAAAHYWNjb3VudAkBAAAAC2dldFN0ckJ5S2V5AAAAAQkBAAAAEGdldEtleVVzZXJTdGF0dXMAAAABBQAAAAdhY2NvdW50AQAAAA9nZXRLZXlVc2VyQmxvY2sAAAABAAAAB2FjY291bnQJAAEsAAAAAgIAAAAJdXNlcl9ibGtfBQAAAAdhY2NvdW50AQAAABhnZXRLZXlUYXNrUmVwb3J0Q29tcGxldGUAAAADAAAACmZyZWVsYW5jZXIAAAAEdGFzawAAAAVzdGFnZQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAA3JjXwUAAAAEdGFzawIAAAABXwUAAAAKZnJlZWxhbmNlcgIAAAAHX3N0YWdlOgUAAAAFc3RhZ2UBAAAAGmdldFZhbHVlVGFza1JlcG9ydENvbXBsZXRlAAAAAwAAAApmcmVlbGFuY2VyAAAABHRhc2sAAAAFc3RhZ2UJAQAAAAtnZXRTdHJCeUtleQAAAAEJAQAAABhnZXRLZXlUYXNrUmVwb3J0Q29tcGxldGUAAAADBQAAAApmcmVlbGFuY2VyBQAAAAR0YXNrBQAAAAVzdGFnZQEAAAAbZ2V0S2V5VGFza1JlcG9ydENvbXBsZXRlQ250AAAAAgAAAAR0YXNrAAAACmZyZWVsYW5jZXIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAB3JjX2NudF8FAAAABHRhc2sCAAAAAV8FAAAACmZyZWVsYW5jZXIBAAAAHWdldFZhbHVlVGFza1JlcG9ydENvbXBsZXRlQ250AAAAAgAAAAR0YXNrAAAACmZyZWVsYW5jZXIJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABtnZXRLZXlUYXNrUmVwb3J0Q29tcGxldGVDbnQAAAACBQAAAAR0YXNrBQAAAApmcmVlbGFuY2VyAQAAABRnZXRLZXlEZWNyeWJlQmFsYW5jZQAAAAACAAAAD2RlY3J5YmVfYmFsYW5jZQEAAAAWZ2V0VmFsdWVEZWNyeWJlQmFsYW5jZQAAAAAJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABRnZXRLZXlEZWNyeWJlQmFsYW5jZQAAAAABAAAAEGdldEtleVRhc2tSYXRpbmcAAAABAAAABHRhc2sJAAEsAAAAAgIAAAAMdGFza19yYXRpbmdfBQAAAAR0YXNrAQAAABJnZXRWYWx1ZVRhc2tSYXRpbmcAAAABAAAABHRhc2sJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABBnZXRLZXlUYXNrUmF0aW5nAAAAAQUAAAAEdGFzawEAAAAYZ2V0S2V5VGFza1VzZXJWb3RlUmF0aW5nAAAAAgAAAAR0YXNrAAAABHVzZXIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACnRhc2tfdm90ZV8FAAAABHRhc2sCAAAAAV8FAAAABHVzZXIBAAAAGmdldFZhbHVlVGFza1VzZXJWb3RlUmF0aW5nAAAAAgAAAAR0YXNrAAAABHVzZXIJAQAAAAtnZXRTdHJCeUtleQAAAAEJAQAAABhnZXRLZXlUYXNrVXNlclZvdGVSYXRpbmcAAAACBQAAAAR0YXNrBQAAAAR1c2VyAQAAABBnZXRLZXlVc2VyUmF0aW5nAAAAAQAAAAR1c2VyCQABLAAAAAICAAAADHVzZXJfcmF0aW5nXwUAAAAEdXNlcgEAAAASZ2V0VmFsdWVVc2VyUmF0aW5nAAAAAQAAAAR1c2VyCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAQZ2V0S2V5VXNlclJhdGluZwAAAAEFAAAABHVzZXIBAAAAFGdldEtleVVzZXJSYXRpbmdWb3RlAAAAAgAAAAR1c2VyAAAABnZvdGluZwkAASwAAAACCQABLAAAAAICAAAACnVzZXJfdm90ZV8FAAAABHVzZXIFAAAABnZvdGluZwEAAAAWZ2V0VmFsdWVVc2VyUmF0aW5nVm90ZQAAAAIAAAAEdXNlcgAAAAZ2b3RpbmcJAQAAAAtnZXRTdHJCeUtleQAAAAEJAQAAABRnZXRLZXlVc2VyUmF0aW5nVm90ZQAAAAIFAAAABHVzZXIFAAAABnZvdGluZwEAAAARZ2V0S2V5VGFza0Rpc3B1dGUAAAABAAAABHRhc2sJAAEsAAAAAgIAAAANdGFza19kaXNwdXRlXwUAAAAEdGFzawEAAAATZ2V0VmFsdWVUYXNrRGlzcHV0ZQAAAAEAAAAEdGFzawkBAAAAC2dldFN0ckJ5S2V5AAAAAQkBAAAAEWdldEtleVRhc2tEaXNwdXRlAAAAAQUAAAAEdGFzawEAAAAdZ2V0S2V5VGFza0Rpc3B1dGVWb3RlQ3VzdG9tZXIAAAABAAAABHRhc2sJAAEsAAAAAgIAAAASdGFza19kaXNwdm90ZV9jc3RfBQAAAAR0YXNrAQAAAB9nZXRWYWx1ZVRhc2tEaXNwdXRlVm90ZUN1c3RvbWVyAAAAAQAAAAR0YXNrCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAdZ2V0S2V5VGFza0Rpc3B1dGVWb3RlQ3VzdG9tZXIAAAABBQAAAAR0YXNrAQAAAB9nZXRLZXlUYXNrRGlzcHV0ZVZvdGVGcmVlbGFuY2VyAAAAAQAAAAR0YXNrCQABLAAAAAICAAAAEnRhc2tfZGlzcHZvdGVfZmxyXwUAAAAEdGFzawEAAAAhZ2V0VmFsdWVUYXNrRGlzcHV0ZVZvdGVGcmVlbGFuY2VyAAAAAQAAAAR0YXNrCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAfZ2V0S2V5VGFza0Rpc3B1dGVWb3RlRnJlZWxhbmNlcgAAAAEFAAAABHRhc2sBAAAAGGdldEtleVRhc2tEaXNwdXRlTWVzc2FnZQAAAAMAAAAEdGFzawAAAAZzZW5kZXIAAAACaWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAA10YXNrX2Rpc3Btc2dfBQAAAAR0YXNrAgAAAAFfBQAAAAZzZW5kZXICAAAABF9pZDoFAAAAAmlkAQAAABpnZXRWYWx1ZVRhc2tEaXNwdXRlTWVzc2FnZQAAAAMAAAAEdGFzawAAAAZzZW5kZXIAAAACaWQJAQAAAAtnZXRTdHJCeUtleQAAAAEJAQAAABhnZXRLZXlUYXNrRGlzcHV0ZU1lc3NhZ2UAAAADBQAAAAR0YXNrBQAAAAZzZW5kZXIFAAAAAmlkAQAAAB1nZXRLZXlUYXNrRGlzcHV0ZU1lc3NhZ2VCbG9jawAAAAMAAAAEdGFzawAAAAZzZW5kZXIAAAACaWQJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAABF0YXNrX2Rpc3Btc2dfYmxrXwUAAAAEdGFzawIAAAABXwUAAAAGc2VuZGVyAgAAAARfaWQ6BQAAAAJpZAEAAAAfZ2V0VmFsdWVUYXNrRGlzcHV0ZU1lc3NhZ2VCbG9jawAAAAMAAAAEdGFzawAAAAZzZW5kZXIAAAACaWQJAQAAAAtnZXRTdHJCeUtleQAAAAEJAQAAAB1nZXRLZXlUYXNrRGlzcHV0ZU1lc3NhZ2VCbG9jawAAAAMFAAAABHRhc2sFAAAABnNlbmRlcgUAAAACaWQBAAAAHGdldEtleVRhc2tEaXNwdXRlTWVzc2FnZXNDbnQAAAACAAAABHRhc2sAAAAEdXNlcgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAARdGFza19kaXNwbXNnX2NudF8FAAAABHRhc2sCAAAAAV8FAAAABHVzZXIBAAAAHmdldFZhbHVlVGFza0Rpc3B1dGVNZXNzYWdlc0NudAAAAAIAAAAEdGFzawAAAAR1c2VyCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAcZ2V0S2V5VGFza0Rpc3B1dGVNZXNzYWdlc0NudAAAAAIFAAAABHRhc2sFAAAABHVzZXIBAAAAGGdldEtleVRhc2tEaXNwdXRlQ29tbWVudAAAAAIAAAAEdGFzawAAAAZzZW5kZXIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAADXRhc2tfZGlzcGNvbV8FAAAABHRhc2sCAAAAAV8FAAAABnNlbmRlcgEAAAAaZ2V0VmFsdWVUYXNrRGlzcHV0ZUNvbW1lbnQAAAACAAAABHRhc2sAAAAGc2VuZGVyCQEAAAALZ2V0U3RyQnlLZXkAAAABCQEAAAAYZ2V0S2V5VGFza0Rpc3B1dGVDb21tZW50AAAAAgUAAAAEdGFzawUAAAAGc2VuZGVyAQAAAB1nZXRLZXlUYXNrRGlzcHV0ZUNvbW1lbnRCbG9jawAAAAIAAAAEdGFzawAAAAZzZW5kZXIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAEXRhc2tfZGlzcGNvbV9ibGtfBQAAAAR0YXNrAgAAAAFfBQAAAAZzZW5kZXIBAAAAH2dldFZhbHVlVGFza0Rpc3B1dGVDb21tZW50QmxvY2sAAAACAAAABHRhc2sAAAAGc2VuZGVyCQEAAAALZ2V0U3RyQnlLZXkAAAABCQEAAAAdZ2V0S2V5VGFza0Rpc3B1dGVDb21tZW50QmxvY2sAAAACBQAAAAR0YXNrBQAAAAZzZW5kZXIBAAAAHGdldEtleVRhc2tEaXNwdXRlVm90ZVZhcmlhbnQAAAACAAAABHRhc2sAAAAEdXNlcgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAANdGFza19kaXNwdmFyXwUAAAAEdGFzawIAAAABXwUAAAAEdXNlcgEAAAAeZ2V0VmFsdWVUYXNrRGlzcHV0ZVZvdGVWYXJpYW50AAAAAgAAAAR0YXNrAAAABHVzZXIJAQAAAAtnZXRTdHJCeUtleQAAAAEJAQAAABxnZXRLZXlUYXNrRGlzcHV0ZVZvdGVWYXJpYW50AAAAAgUAAAAEdGFzawUAAAAEdXNlcgEAAAAQZ2V0S2V5VXNlclJldmlldwAAAAIAAAAFdXNlcjEAAAAFdXNlcjIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAB3Jldmlld18FAAAABXVzZXIxAgAAAAFfBQAAAAV1c2VyMgEAAAASZ2V0VmFsdWVVc2VyUmV2aWV3AAAAAgAAAAV1c2VyMQAAAAV1c2VyMgkBAAAAC2dldFN0ckJ5S2V5AAAAAQkBAAAAEGdldEtleVVzZXJSZXZpZXcAAAACBQAAAAV1c2VyMQUAAAAFdXNlcjIAAAASAAAAAWkBAAAAFndpdGhkcmF3RGVjcnliZUJhbGFuY2UAAAABAAAABmFtb3VudAQAAAAHYWNjb3VudAkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAAdiYWxhbmNlCQEAAAAWZ2V0VmFsdWVEZWNyeWJlQmFsYW5jZQAAAAADCQAAAAAAAAIFAAAAB2FjY291bnQFAAAAB0NSRUFUT1IDCQAAZwAAAAIFAAAAB2JhbGFuY2UFAAAABmFtb3VudAkBAAAAC1RyYW5zZmVyU2V0AAAA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AARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAAA1nZXRLZXlVc2VyQmlvAAAAAQUAAAAHYWNjb3VudAUAAAAEZGF0YQUAAAADbmlsAAAAAWkBAAAAEnJlcG9ydENvbXBsZXRlVGFzawAAAAEAAAAEdGFzawQAAAAHYWNjb3VudAkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAAVzdGFnZQkAAGQAAAACCQEAAAAdZ2V0VmFsdWVUYXNrUmVwb3J0Q29tcGxldGVDbnQAAAACBQAAAAR0YXNrBQAAAAdhY2NvdW50AAAAAAAAAAABBAAAAAt0YXNrQ3JlYXRvcgkBAAAAEmdldFZhbHVlVGFza0F1dGhvcgAAAAEFAAAABHRhc2sEAAAABnN0YXR1cwkBAAAAEmdldFZhbHVlVGFza1N0YXR1cwAAAAEFAAAABHRhc2sEAAAAFWZyZWVsYW5jZXJNZXNzYWdlc0NudAkBAAAAF2dldFZhbHVlVXNlck1lc3NhZ2VzQ250AAAAAgUAAAAHYWNjb3VudAUAAAALdGFza0NyZWF0b3IEAAAAFWxhc3RGcmVlbGFuY2VyTWVzc2FnZQkBAAAAE2dldFZhbHVlVXNlck1lc3NhZ2UAAAADBQAAAAdhY2NvdW50BQAAAAt0YXNrQ3JlYXRvcgkAAaQAAAABBQAAABVmcmVlbGFuY2VyTWVzc2FnZXNDbnQDCQAAAAAAAAIJAQAAAA9nZXRWYWx1ZVVzZXJCaW8AAAABBQAAAAdhY2NvdW50BQAAAAROT05FCQAAAgAAAAECAAAAD1VzZXIgbm90IHNpZ251cAMJAAAAAAAAAgkBAAAAEmdldFZhbHVlVGFza0F1dGhvcgAAAAEFAAAABHRhc2sFAAAAB2FjY291bnQJAAACAAAAAQIAAAAOWW91IGFyZSBhdXRob3IDCQEAAAACIT0AAAACCQEAAAAWZ2V0VmFsdWVUYXNrRnJlZWxhbmNlcgAAAAEFAAAABHRhc2sFAAAAB2FjY291bnQJAAACAAAAAQIAAAAWWW91IGFyZSBub3QgZnJlZWxhbmNlcgMJAQAAAAIhPQAAAAIFAAAABnN0YXR1cwUAAAAKSU5QUk9HUkVTUwkAAAIAAAABCQABLAAAAAICAAAAIVN0YXR1cyBtdXN0IGJlIGluIHByb2dyZXNzLCBub3c6IAUAAAAGc3RhdHVzAwkAAAAAAAACCQEAAAAWZ2V0VmFsdWVUYXNrRnJlZWxhbmNlcgAAAAEFAAAABHRhc2sFAAAABE5PTkUJAAACAAAAAQIAAAAcVGFzayBmcmVlbGFuY2VyIGRvZXNudCBleGlzdAkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAGGdldEtleVRhc2tSZXBvcnRDb21wbGV0ZQAAAAMFAAAAB2FjY291bnQFAAAABHRhc2sJAAGkAAAAAQUAAAAFc3RhZ2UFAAAAFWZyZWVsYW5jZXJNZXNzYWdlc0NudAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAEGdldEtleVRhc2tTdGF0dXMAAAABBQAAAAR0YXNrBQAAAAdQRU5ESU5HBQAAAANuaWwAAAABaQEAAAAKYWNjZXB0V29yawAAAAIAAAAEdGFzawAAAAhjb21wbGV0ZQQAAAAHYWNjb3VudAkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAAdjcmVhdG9yCQEAAAASZ2V0VmFsdWVUYXNrQXV0aG9yAAAAAQUAAAAEdGFzawQAAAAKZnJlZWxhbmNlcgkBAAAAFmdldFZhbHVlVGFza0ZyZWVsYW5jZXIAAAABBQAAAAR0YXNrBAAAAAVzdGFnZQkBAAAAHWdldFZhbHVlVGFza1JlcG9ydENvbXBsZXRlQ250AAAAAgUAAAAEdGFzawUAAAAKZnJlZWxhbmNlcgQAAAAGc3RhdHVzCQEAAAASZ2V0VmFsdWVUYXNrU3RhdHVzAAAAAQUAAAAEdGFzawQAAAAEYmFuawkBAAAAEGdldFZhbHVlVGFza0JhbmsAAAABBQAAAAR0YXNrAwkAAAAAAAACCQEAAAAPZ2V0VmFsdWVVc2VyQmlvAAAAAQUAAAAHYWNjb3VudAUAAAAETk9ORQkAAAIAAAABAgAAABFTZW5kZXIgbm90IHNpZ251cAMJAAAAAAAAAgkBAAAAEGdldFZhbHVlVGFza0RhdGEAAAABBQAAAAR0YXNrBQAAAAROT05FCQAAAgAAAAECAAAAEVRhc2sgZG9lc250IGV4aXN0AwkBAAAAAiE9AAAAAgUA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AgkBAAAACURhdGFFbnRyeQAAAAIJAQAAAB1nZXRLZXlUYXNrRGlzcHV0ZVZvdGVDdXN0b21lcgAAAAEFAAAABHRhc2sJAABkAAAAAgkBAAAAH2dldFZhbHVlVGFza0Rpc3B1dGVWb3RlQ3VzdG9tZXIAAAABBQAAAAR0YXNrAAAAAAAAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAcZ2V0S2V5VGFza0Rpc3B1dGVWb3RlVmFyaWFudAAAAAIFAAAABHRhc2sFAAAAB2FjY291bnQCAAAACGN1c3RvbWVyCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAYZ2V0S2V5VGFza0Rpc3B1dGVDb21tZW50AAAAAgUAAAAEdGFzawUAAAAHYWNjb3VudAUAAAAHbWVzc2FnZQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAHWdldEtleVRhc2tEaXNwdXRlQ29tbWVudEJsb2NrAAAAAgUAAAAEdGFzawUAAAAHYWNjb3VudAUAAAAGaGVpZ2h0BQAAAANuaWwDCQAAAAAAAAIFAAAAB3ZhcmlhbnQCAAAACmZyZWVsYW5jZXIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAAB9nZXRLZXlUYXNrRGlzcHV0ZVZvdGVGcmVlbGFuY2VyAAAAAQUAAAAEdGFzawkAAGQAAAACCQEAAAAhZ2V0VmFsdWVUYXNrRGlzcHV0ZVZvdGVGcmVlbGFuY2VyAAAAAQUAAAAEdGFzawAAAAAAAAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAHGdldEtleVRhc2tEaXNwdXRlVm90ZVZhcmlhbnQAAAACBQAAAAR0YXNrBQAAAAdhY2NvdW50AgAAAApmcmVlbGFuY2VyCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAYZ2V0S2V5VGFza0Rpc3B1dGVDb21tZW50AAAAAgUAAAAEdGFzawUAAAAHYWNjb3VudAUAAAAHbWVzc2FnZQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAHWdldEtleVRhc2tEaXNwdXRlQ29tbWVudEJsb2NrAAAAAgUAAAAE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aGUgdGFzayBub3cJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAQZ2V0S2V5VGFza1N0YXR1cwAAAAEFAAAABHRhc2sFAAAACENBTkNFTEVEBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwkBAAAAHEBleHRyVXNlcihhZGRyZXNzRnJvbVN0cmluZykAAAABBQAAAAdjcmVhdG9yBQAAAARiYW5rBQAAAAR1bml0BQAAAANuaWwAAAABaQEAAAATZGVmaW5lRGlzcHV0ZVdpbm5lcgAAAAEAAAAEdGFzawQAAAAHYWNjb3VudAkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAAhjdXN0b21lcgkBAAAAEmdldFZhbHVlVGFza0F1dGhvcgAAAAEFAAAABHRhc2sEAAAACmZyZWVsYW5jZXIJAQAAABZnZXRWYWx1ZVRhc2tGcmVlbGFuY2VyAAAAAQUAAAAEdGFzawQAAAAEYmFuawkBAAAAEGdldFZhbHVlVGFza0JhbmsAAAABBQAAAAR0YXNrBAAAABB2b3Rlc0ZvckN1c3RvbWVyCQEAAAAfZ2V0VmFsdWVUYXNrRGlzcHV0ZVZvdGVDdXN0b21lcgAAAAEFAAAABHRhc2sEAAAAEnZvdGVzRm9yRnJlZWxhbmNlcgkBAAAAIWdldFZhbHVlVGFza0Rpc3B1dGVWb3RlRnJlZWxhbmNlcgAAAAEFAAAABHRhc2sEAAAACnRvdGFsVm90ZXMJAABkAAAAAgUAAAAQdm90ZXNGb3JDdXN0b21lcgUAAAASdm90ZXNGb3JGcmVlbGFuY2VyAwkAAAAAAAACCQEAAAAPZ2V0VmFsdWVVc2VyQmlvAAAAAQUAAAAHYWNjb3VudAUAAAAETk9ORQkAAAIAAAABAgAAAA5Zb3Ugbm90IHNpZ251cAMJAQAAAAIhPQAAAAIJAQAAABJnZXRWYWx1ZVRhc2tTdGF0dXMAAAABBQAAAAR0YXNrBQAAAAlJTkRJU1BVVEUJAAACAAAAAQIAAAAhVGhlIGRpc3B1dGUgaXMgY2xvc2VkIG9yIG5v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", "chainId": 84, "height": 845991, "spentComplexity": 0 } View: original | compacted Prev: GDjbcZUXAnVTYtG4NXTTWevwQwxr2MVHBYGfnML68PvF Next: GvLfib1gv2VXhEXwRp92zzBGxvdY9vtJkE9rsRYCHzAs Diff:
OldNewDifferences
220220
221221
222222 func getValueTaskDisputeVoteVariant (task,user) = getStrByKey(getKeyTaskDisputeVoteVariant(task, user))
223+
224+
225+func getKeyUserReview (user1,user2) = ((("review_" + user1) + "_") + user2)
226+
227+
228+func getValueUserReview (user1,user2) = getStrByKey(getKeyUserReview(user1, user2))
223229
224230
225231 @Callable(i)
550556 }
551557
552558
559+
560+@Callable(i)
561+func leaveUserReview (user,task,review) = {
562+ let account = toBase58String(i.caller.bytes)
563+ let customer = getValueTaskAuthor(task)
564+ let freelancer = getValueTaskFreelancer(task)
565+ if ((getValueUserBio(account) == NONE))
566+ then throw("You not signup")
567+ else if (if (if (if ((user != customer))
568+ then (user != freelancer)
569+ else false)
570+ then (account != customer)
571+ else false)
572+ then (account != freelancer)
573+ else false)
574+ then throw("You have not worked with this user")
575+ else if ((getValueTaskStatus(task) != COMPLETED))
576+ then throw("You can't leave feedback until the task is completed")
577+ else if ((getValueUserReview(account, user) != NONE))
578+ then throw("have you already left a review for this user")
579+ else WriteSet([DataEntry(getKeyUserReview(account, user), review)])
580+ }
581+
582+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let NONE = "none"
55
66 let FEATURED = "featured"
77
88 let DAPP = ""
99
1010 let MOD = "mod"
1111
1212 let REGISTERED = "registered"
1313
1414 let CREATOR = "3MsTLizEg4vqNgD7ZVjhkPaZgsrN11JqzLJ"
1515
1616 let INPROGRESS = "in progress"
1717
1818 let COMPLETED = "completed"
1919
2020 let PENDING = "pending"
2121
2222 let INDISPUTE = "in dispute"
2323
2424 let REVISION = "revision"
2525
2626 let CANCELED = "canceled"
2727
2828 let DECRYBEFEE = (2 / 100)
2929
3030 let WAVESLET = 100000000
3131
3232 func getStrByKey (key) = {
3333 let str = match getString(this, key) {
3434 case a: String =>
3535 a
3636 case _ =>
3737 NONE
3838 }
3939 str
4040 }
4141
4242
4343 func getNumberByKey (key) = {
4444 let num = match getInteger(this, key) {
4545 case a: Int =>
4646 a
4747 case _ =>
4848 0
4949 }
5050 num
5151 }
5252
5353
5454 func getKeyUserMessagesCnt (from,to) = ((("msg_cnt_" + from) + "_") + to)
5555
5656
5757 func getValueUserMessagesCnt (from,to) = getNumberByKey(getKeyUserMessagesCnt(from, to))
5858
5959
6060 func getKeyUserMessage (from,to,id) = ((((("msg_" + from) + "_") + to) + "_id:") + id)
6161
6262
6363 func getValueUserMessage (from,to,cnt) = getStrByKey(getKeyUserMessage(from, to, cnt))
6464
6565
6666 func getKeyUserMessageBlock (from,to,cnt) = ((((("block_msg_" + from) + "_") + to) + "_id:") + cnt)
6767
6868
6969 func getValueUserMessageBlock (from,to,cnt) = getStrByKey(getKeyUserMessageBlock(from, to, cnt))
7070
7171
7272 func getKeyTaskData (task) = ("datajson_" + task)
7373
7474
7575 func getValueTaskData (task) = getStrByKey(getKeyTaskData(task))
7676
7777
7878 func getKeyTaskAuthor (task) = ("author_" + task)
7979
8080
8181 func getValueTaskAuthor (task) = getStrByKey(getKeyTaskAuthor(task))
8282
8383
8484 func getKeyTaskBlock (task) = ("block_" + task)
8585
8686
8787 func getValueTaskBlock (task) = getNumberByKey(getKeyTaskBlock(task))
8888
8989
9090 func getKeyTaskBank (task) = ("bank_" + task)
9191
9292
9393 func getValueTaskBank (task) = getNumberByKey(getKeyTaskBank(task))
9494
9595
9696 func getKeyTaskFreelancer (task) = ("freelancer_" + task)
9797
9898
9999 func getValueTaskFreelancer (task) = getStrByKey(getKeyTaskFreelancer(task))
100100
101101
102102 func getKeyTaskStatus (task) = ("status_" + task)
103103
104104
105105 func getValueTaskStatus (task) = getStrByKey(getKeyTaskStatus(task))
106106
107107
108108 func getKeyTaskExpiration (task) = ("expiration_block_" + task)
109109
110110
111111 func getValueTaskExpiration (task) = getNumberByKey(getKeyTaskExpiration(task))
112112
113113
114114 func getKeyUserBio (account) = ("user_bio_" + account)
115115
116116
117117 func getValueUserBio (account) = getStrByKey(getKeyUserBio(account))
118118
119119
120120 func getKeyUserStatus (account) = ("user_sts_" + account)
121121
122122
123123 func getValueUserStatus (account) = getStrByKey(getKeyUserStatus(account))
124124
125125
126126 func getKeyUserBlock (account) = ("user_blk_" + account)
127127
128128
129129 func getKeyTaskReportComplete (freelancer,task,stage) = ((((("rc_" + task) + "_") + freelancer) + "_stage:") + stage)
130130
131131
132132 func getValueTaskReportComplete (freelancer,task,stage) = getStrByKey(getKeyTaskReportComplete(freelancer, task, stage))
133133
134134
135135 func getKeyTaskReportCompleteCnt (task,freelancer) = ((("rc_cnt_" + task) + "_") + freelancer)
136136
137137
138138 func getValueTaskReportCompleteCnt (task,freelancer) = getNumberByKey(getKeyTaskReportCompleteCnt(task, freelancer))
139139
140140
141141 func getKeyDecrybeBalance () = "decrybe_balance"
142142
143143
144144 func getValueDecrybeBalance () = getNumberByKey(getKeyDecrybeBalance())
145145
146146
147147 func getKeyTaskRating (task) = ("task_rating_" + task)
148148
149149
150150 func getValueTaskRating (task) = getNumberByKey(getKeyTaskRating(task))
151151
152152
153153 func getKeyTaskUserVoteRating (task,user) = ((("task_vote_" + task) + "_") + user)
154154
155155
156156 func getValueTaskUserVoteRating (task,user) = getStrByKey(getKeyTaskUserVoteRating(task, user))
157157
158158
159159 func getKeyUserRating (user) = ("user_rating_" + user)
160160
161161
162162 func getValueUserRating (user) = getNumberByKey(getKeyUserRating(user))
163163
164164
165165 func getKeyUserRatingVote (user,voting) = (("user_vote_" + user) + voting)
166166
167167
168168 func getValueUserRatingVote (user,voting) = getStrByKey(getKeyUserRatingVote(user, voting))
169169
170170
171171 func getKeyTaskDispute (task) = ("task_dispute_" + task)
172172
173173
174174 func getValueTaskDispute (task) = getStrByKey(getKeyTaskDispute(task))
175175
176176
177177 func getKeyTaskDisputeVoteCustomer (task) = ("task_dispvote_cst_" + task)
178178
179179
180180 func getValueTaskDisputeVoteCustomer (task) = getNumberByKey(getKeyTaskDisputeVoteCustomer(task))
181181
182182
183183 func getKeyTaskDisputeVoteFreelancer (task) = ("task_dispvote_flr_" + task)
184184
185185
186186 func getValueTaskDisputeVoteFreelancer (task) = getNumberByKey(getKeyTaskDisputeVoteFreelancer(task))
187187
188188
189189 func getKeyTaskDisputeMessage (task,sender,id) = ((((("task_dispmsg_" + task) + "_") + sender) + "_id:") + id)
190190
191191
192192 func getValueTaskDisputeMessage (task,sender,id) = getStrByKey(getKeyTaskDisputeMessage(task, sender, id))
193193
194194
195195 func getKeyTaskDisputeMessageBlock (task,sender,id) = ((((("task_dispmsg_blk_" + task) + "_") + sender) + "_id:") + id)
196196
197197
198198 func getValueTaskDisputeMessageBlock (task,sender,id) = getStrByKey(getKeyTaskDisputeMessageBlock(task, sender, id))
199199
200200
201201 func getKeyTaskDisputeMessagesCnt (task,user) = ((("task_dispmsg_cnt_" + task) + "_") + user)
202202
203203
204204 func getValueTaskDisputeMessagesCnt (task,user) = getNumberByKey(getKeyTaskDisputeMessagesCnt(task, user))
205205
206206
207207 func getKeyTaskDisputeComment (task,sender) = ((("task_dispcom_" + task) + "_") + sender)
208208
209209
210210 func getValueTaskDisputeComment (task,sender) = getStrByKey(getKeyTaskDisputeComment(task, sender))
211211
212212
213213 func getKeyTaskDisputeCommentBlock (task,sender) = ((("task_dispcom_blk_" + task) + "_") + sender)
214214
215215
216216 func getValueTaskDisputeCommentBlock (task,sender) = getStrByKey(getKeyTaskDisputeCommentBlock(task, sender))
217217
218218
219219 func getKeyTaskDisputeVoteVariant (task,user) = ((("task_dispvar_" + task) + "_") + user)
220220
221221
222222 func getValueTaskDisputeVoteVariant (task,user) = getStrByKey(getKeyTaskDisputeVoteVariant(task, user))
223+
224+
225+func getKeyUserReview (user1,user2) = ((("review_" + user1) + "_") + user2)
226+
227+
228+func getValueUserReview (user1,user2) = getStrByKey(getKeyUserReview(user1, user2))
223229
224230
225231 @Callable(i)
226232 func withdrawDecrybeBalance (amount) = {
227233 let account = toBase58String(i.caller.bytes)
228234 let balance = getValueDecrybeBalance()
229235 if ((account == CREATOR))
230236 then if ((balance >= amount))
231237 then TransferSet([ScriptTransfer(addressFromStringValue(account), amount, unit)])
232238 else throw(("You cannot withdraw an amount greater than " + toString(balance)))
233239 else throw("You can't do that")
234240 }
235241
236242
237243
238244 @Callable(i)
239245 func createTask (task,expiration,data) = {
240246 let account = toBase58String(i.caller.bytes)
241247 let pmt = extract(i.payment)
242248 let pmtAmount = pmt.amount
243249 let payment = ((pmtAmount / ((1 * WAVESLET) + DECRYBEFEE)) * WAVESLET)
244250 let commission = (pmtAmount - payment)
245251 if (isDefined(pmt.assetId))
246252 then throw("Can use waves only at the moment")
247253 else if ((pmtAmount == 0))
248254 then throw("Amount must be higher then 0")
249255 else if ((getValueTaskAuthor(task) != NONE))
250256 then throw("Task already exist")
251257 else if ((getValueUserBio(account) == NONE))
252258 then throw("User not signup")
253259 else WriteSet([DataEntry(getKeyTaskAuthor(task), account), DataEntry(getKeyTaskBlock(task), height), DataEntry(getKeyTaskExpiration(task), (height + expiration)), DataEntry(getKeyTaskBank(task), payment), DataEntry(getKeyTaskStatus(task), FEATURED), DataEntry(getKeyTaskData(task), data), DataEntry(getKeyDecrybeBalance(), (getValueDecrybeBalance() + commission)), DataEntry(getKeyTaskRating(task), 0)])
254260 }
255261
256262
257263
258264 @Callable(i)
259265 func signUp (data) = {
260266 let account = toBase58String(i.caller.bytes)
261267 if ((getValueUserBio(account) != NONE))
262268 then throw("User already exist")
263269 else WriteSet([DataEntry(getKeyUserBio(account), data), DataEntry(getKeyUserBlock(account), height), DataEntry(getKeyUserStatus(account), REGISTERED)])
264270 }
265271
266272
267273
268274 @Callable(i)
269275 func hireFreelancer (task,freelancer) = {
270276 let account = toBase58String(i.caller.bytes)
271277 if ((getValueTaskData(task) == NONE))
272278 then throw("Task doesnt exist")
273279 else if ((getValueUserBio(account) == NONE))
274280 then throw("Customer not signup")
275281 else if ((getValueUserBio(freelancer) == NONE))
276282 then throw("Freelancer not signup")
277283 else if ((getValueTaskAuthor(task) != account))
278284 then throw("You're not author")
279285 else if ((getValueTaskStatus(task) != FEATURED))
280286 then throw("Freelancer is no longer required")
281287 else if ((freelancer == account))
282288 then throw("You can't hire yourself")
283289 else if ((getValueUserMessage(freelancer, account, "1") == NONE))
284290 then throw("The freelancer was not attached to the task")
285291 else WriteSet([DataEntry(getKeyTaskFreelancer(task), freelancer), DataEntry(getKeyTaskStatus(task), INPROGRESS)])
286292 }
287293
288294
289295
290296 @Callable(i)
291297 func sendMessage (task,to,message) = {
292298 let account = toBase58String(i.caller.bytes)
293299 let cnt = (getValueUserMessagesCnt(account, to) + 1)
294300 if ((getValueTaskData(task) == NONE))
295301 then throw("Task doesnt exist")
296302 else if ((account == to))
297303 then throw("You can't send messages to yourself")
298304 else if ((getValueUserBio(account) == NONE))
299305 then throw("Sender not signup")
300306 else if ((getValueUserBio(to) == NONE))
301307 then throw("Recipient not singup")
302308 else WriteSet([DataEntry(getKeyUserMessagesCnt(account, to), cnt), DataEntry(getKeyUserMessage(account, to, toString(cnt)), message), DataEntry(getKeyUserMessageBlock(account, to, toString(cnt)), height)])
303309 }
304310
305311
306312
307313 @Callable(i)
308314 func taskUpdate (task,data) = {
309315 let account = toBase58String(i.caller.bytes)
310316 if ((getValueUserBio(account) == NONE))
311317 then throw("User not signup")
312318 else if ((getValueTaskData(task) == NONE))
313319 then throw("Task doesnt exist")
314320 else if ((getValueTaskAuthor(task) != account))
315321 then throw("You're not author")
316322 else if ((getValueTaskStatus(task) != FEATURED))
317323 then throw("Editing tasks is not available after hiring a freelancer")
318324 else WriteSet([DataEntry(getKeyTaskData(task), data)])
319325 }
320326
321327
322328
323329 @Callable(i)
324330 func userUpdate (data) = {
325331 let account = toBase58String(i.caller.bytes)
326332 if ((getValueUserBio(account) == NONE))
327333 then throw("User not signup")
328334 else WriteSet([DataEntry(getKeyUserBio(account), data)])
329335 }
330336
331337
332338
333339 @Callable(i)
334340 func reportCompleteTask (task) = {
335341 let account = toBase58String(i.caller.bytes)
336342 let stage = (getValueTaskReportCompleteCnt(task, account) + 1)
337343 let taskCreator = getValueTaskAuthor(task)
338344 let status = getValueTaskStatus(task)
339345 let freelancerMessagesCnt = getValueUserMessagesCnt(account, taskCreator)
340346 let lastFreelancerMessage = getValueUserMessage(account, taskCreator, toString(freelancerMessagesCnt))
341347 if ((getValueUserBio(account) == NONE))
342348 then throw("User not signup")
343349 else if ((getValueTaskAuthor(task) == account))
344350 then throw("You are author")
345351 else if ((getValueTaskFreelancer(task) != account))
346352 then throw("You are not freelancer")
347353 else if ((status != INPROGRESS))
348354 then throw(("Status must be in progress, now: " + status))
349355 else if ((getValueTaskFreelancer(task) == NONE))
350356 then throw("Task freelancer doesnt exist")
351357 else WriteSet([DataEntry(getKeyTaskReportComplete(account, task, toString(stage)), freelancerMessagesCnt), DataEntry(getKeyTaskStatus(task), PENDING)])
352358 }
353359
354360
355361
356362 @Callable(i)
357363 func acceptWork (task,complete) = {
358364 let account = toBase58String(i.caller.bytes)
359365 let creator = getValueTaskAuthor(task)
360366 let freelancer = getValueTaskFreelancer(task)
361367 let stage = getValueTaskReportCompleteCnt(task, freelancer)
362368 let status = getValueTaskStatus(task)
363369 let bank = getValueTaskBank(task)
364370 if ((getValueUserBio(account) == NONE))
365371 then throw("Sender not signup")
366372 else if ((getValueTaskData(task) == NONE))
367373 then throw("Task doesnt exist")
368374 else if ((account != creator))
369375 then throw("You are not author")
370376 else if ((status != PENDING))
371377 then throw("Freelancer doesnt complete the task")
372378 else if (complete)
373379 then ScriptResult(WriteSet([DataEntry(getKeyTaskStatus(task), COMPLETED), DataEntry(getKeyUserRating(freelancer), (getValueUserRating(freelancer) + 1)), DataEntry(getKeyUserRatingVote(account, freelancer), "positive"), DataEntry(getKeyTaskBank(task), "0")]), TransferSet([ScriptTransfer(addressFromStringValue(freelancer), bank, unit)]))
374380 else WriteSet([DataEntry(getKeyTaskStatus(task), INPROGRESS)])
375381 }
376382
377383
378384
379385 @Callable(i)
380386 func moveDeadline (task,deadline) = {
381387 let account = toBase58String(i.caller.bytes)
382388 let creator = getValueTaskAuthor(task)
383389 let expiration = getValueTaskExpiration(task)
384390 let status = getValueTaskStatus(task)
385391 if ((status == COMPLETED))
386392 then throw("The task is completed")
387393 else if ((status == INDISPUTE))
388394 then throw("You can't change the deadline at this time")
389395 else if ((account != creator))
390396 then throw("You are not author of the task")
391397 else if ((height > deadline))
392398 then throw("The deadline must be > the current block")
393399 else if ((expiration > deadline))
394400 then throw("The deadline can only be moved forward")
395401 else WriteSet([DataEntry(getKeyTaskExpiration(task), deadline)])
396402 }
397403
398404
399405
400406 @Callable(i)
401407 func voteTask (task,vote) = {
402408 let account = toBase58String(i.caller.bytes)
403409 if ((getValueUserBio(account) == NONE))
404410 then throw("User not signup")
405411 else if ((getValueTaskAuthor(task) == account))
406412 then throw("You cannot change the rating of a task")
407413 else if ((getValueTaskData(task) == NONE))
408414 then throw("Task doesnt exist")
409415 else if ((getValueTaskStatus(task) != FEATURED))
410416 then throw("Now you can’t lower the task rating")
411417 else if ((getValueTaskUserVoteRating(task, account) != NONE))
412418 then throw("You have already voted")
413419 else if ((vote == "positive"))
414420 then WriteSet([DataEntry(getKeyTaskRating(task), (getValueTaskRating(task) + 1)), DataEntry(getKeyTaskUserVoteRating(task, account), "positive")])
415421 else if ((vote == "negative"))
416422 then WriteSet([DataEntry(getKeyTaskRating(task), (getValueTaskRating(task) - 1)), DataEntry(getKeyTaskUserVoteRating(task, account), "negative")])
417423 else throw("Use positive/negative only")
418424 }
419425
420426
421427
422428 @Callable(i)
423429 func reportUser (user) = {
424430 let account = toBase58String(i.caller.bytes)
425431 if ((getValueUserBio(account) == NONE))
426432 then throw("You not signup")
427433 else if ((getValueUserBio(user) == NONE))
428434 then throw("User not signup")
429435 else if ((user == account))
430436 then throw("You can't complain about yourself")
431437 else if ((getValueUserRatingVote(account, user) != NONE))
432438 then throw("You have already voted")
433439 else WriteSet([DataEntry(getKeyUserRating(user), (getValueUserRating(user) - 1)), DataEntry(getKeyUserRatingVote(account, user), "negative")])
434440 }
435441
436442
437443
438444 @Callable(i)
439445 func openTaskDispute (task,message) = {
440446 let account = toBase58String(i.caller.bytes)
441447 let creator = getValueTaskAuthor(task)
442448 let freelancer = getValueTaskFreelancer(task)
443449 let status = getValueTaskStatus(task)
444450 if ((getValueUserBio(account) == NONE))
445451 then throw("You not signup")
446452 else if ((getValueTaskData(task) == NONE))
447453 then throw("Task doesnt exist")
448454 else if (if ((account != creator))
449455 then (account != freelancer)
450456 else false)
451457 then throw((((("You must be a freelancer (" + freelancer) + ") or a customer (") + creator) + ") of this task"))
452458 else if ((status == INDISPUTE))
453459 then throw("Dispute already open")
454460 else if (if ((status != INPROGRESS))
455461 then (status != PENDING)
456462 else false)
457463 then throw("You can't create a dispute right now")
458464 else WriteSet([DataEntry(getKeyTaskDispute(task), account), DataEntry(getKeyTaskDisputeMessage(task, account, "0"), message), DataEntry(getKeyTaskDisputeMessageBlock(task, account, "0"), height), DataEntry(getKeyTaskStatus(task), INDISPUTE)])
459465 }
460466
461467
462468
463469 @Callable(i)
464470 func voteTaskDispute (task,variant,message) = {
465471 let account = toBase58String(i.caller.bytes)
466472 let creator = getValueTaskAuthor(task)
467473 let freelancer = getValueTaskFreelancer(task)
468474 if ((getValueUserBio(account) == NONE))
469475 then throw("You not signup")
470476 else if ((getValueTaskData(task) == NONE))
471477 then throw("Task doesnt exist")
472478 else if ((getValueTaskDispute(task) == NONE))
473479 then throw("Dispute doesnt exist")
474480 else if ((account == creator))
475481 then throw("The creator of the task can not vote")
476482 else if ((account == freelancer))
477483 then throw("The freelancer of the task can not vote")
478484 else if ((getValueTaskDisputeVoteVariant(task, account) != NONE))
479485 then throw("You have already voted")
480486 else if ((variant == "customer"))
481487 then WriteSet([DataEntry(getKeyTaskDisputeVoteCustomer(task), (getValueTaskDisputeVoteCustomer(task) + 1)), DataEntry(getKeyTaskDisputeVoteVariant(task, account), "customer"), DataEntry(getKeyTaskDisputeComment(task, account), message), DataEntry(getKeyTaskDisputeCommentBlock(task, account), height)])
482488 else if ((variant == "freelancer"))
483489 then WriteSet([DataEntry(getKeyTaskDisputeVoteFreelancer(task), (getValueTaskDisputeVoteFreelancer(task) + 1)), DataEntry(getKeyTaskDisputeVoteVariant(task, account), "freelancer"), DataEntry(getKeyTaskDisputeComment(task, account), message), DataEntry(getKeyTaskDisputeCommentBlock(task, account), height)])
484490 else throw("Select one of the sides")
485491 }
486492
487493
488494
489495 @Callable(i)
490496 func taskDisputeMessage (task,message) = {
491497 let account = toBase58String(i.caller.bytes)
492498 let creator = getValueTaskAuthor(task)
493499 let freelancer = getValueTaskFreelancer(task)
494500 let cnt = (getValueTaskDisputeMessagesCnt(task, account) + 1)
495501 if ((getValueUserBio(account) == NONE))
496502 then throw("You not signup")
497503 else if ((getValueTaskData(task) == NONE))
498504 then throw("Task doesnt exist")
499505 else if ((getValueTaskDispute(task) == NONE))
500506 then throw("Dispute doesnt exist")
501507 else if (if ((account != creator))
502508 then (account != freelancer)
503509 else false)
504510 then throw((((("You must be a freelancer (" + freelancer) + ") or a customer (") + creator) + ") of this task"))
505511 else if ((getValueTaskStatus(task) != INDISPUTE))
506512 then throw("You cannot send messages at this time")
507513 else WriteSet([DataEntry(getKeyTaskDisputeMessage(task, account, toString(cnt)), message), DataEntry(getKeyTaskDisputeMessageBlock(task, account, toString(cnt)), height), DataEntry(getKeyTaskDisputeMessagesCnt(task, account), cnt)])
508514 }
509515
510516
511517
512518 @Callable(i)
513519 func cancelTask (task) = {
514520 let account = toBase58String(i.caller.bytes)
515521 let creator = getValueTaskAuthor(task)
516522 let bank = getValueTaskBank(task)
517523 if ((getValueUserBio(account) == NONE))
518524 then throw("You not signup")
519525 else if ((getValueTaskData(task) == NONE))
520526 then throw("Task doesnt exist")
521527 else if ((account != creator))
522528 then throw("You are not author of the task")
523529 else if ((getValueTaskStatus(task) != FEATURED))
524530 then throw("You can't cancel the task now")
525531 else ScriptResult(WriteSet([DataEntry(getKeyTaskStatus(task), CANCELED)]), TransferSet([ScriptTransfer(addressFromStringValue(creator), bank, unit)]))
526532 }
527533
528534
529535
530536 @Callable(i)
531537 func defineDisputeWinner (task) = {
532538 let account = toBase58String(i.caller.bytes)
533539 let customer = getValueTaskAuthor(task)
534540 let freelancer = getValueTaskFreelancer(task)
535541 let bank = getValueTaskBank(task)
536542 let votesForCustomer = getValueTaskDisputeVoteCustomer(task)
537543 let votesForFreelancer = getValueTaskDisputeVoteFreelancer(task)
538544 let totalVotes = (votesForCustomer + votesForFreelancer)
539545 if ((getValueUserBio(account) == NONE))
540546 then throw("You not signup")
541547 else if ((getValueTaskStatus(task) != INDISPUTE))
542548 then throw("The dispute is closed or not open")
543549 else if ((3 > totalVotes))
544550 then throw(("Need minimum 3 votes. Now: " + toString(totalVotes)))
545551 else if ((votesForCustomer > votesForFreelancer))
546552 then ScriptResult(WriteSet([DataEntry(getKeyTaskStatus(task), COMPLETED)]), TransferSet([ScriptTransfer(addressFromStringValue(customer), bank, unit)]))
547553 else if ((votesForFreelancer > votesForCustomer))
548554 then ScriptResult(WriteSet([DataEntry(getKeyTaskStatus(task), COMPLETED)]), TransferSet([ScriptTransfer(addressFromStringValue(freelancer), bank, unit)]))
549555 else ScriptResult(WriteSet([DataEntry(getKeyTaskStatus(task), COMPLETED)]), TransferSet([ScriptTransfer(addressFromStringValue(freelancer), (bank / 2), unit), ScriptTransfer(addressFromStringValue(customer), (bank / 2), unit)]))
550556 }
551557
552558
559+
560+@Callable(i)
561+func leaveUserReview (user,task,review) = {
562+ let account = toBase58String(i.caller.bytes)
563+ let customer = getValueTaskAuthor(task)
564+ let freelancer = getValueTaskFreelancer(task)
565+ if ((getValueUserBio(account) == NONE))
566+ then throw("You not signup")
567+ else if (if (if (if ((user != customer))
568+ then (user != freelancer)
569+ else false)
570+ then (account != customer)
571+ else false)
572+ then (account != freelancer)
573+ else false)
574+ then throw("You have not worked with this user")
575+ else if ((getValueTaskStatus(task) != COMPLETED))
576+ then throw("You can't leave feedback until the task is completed")
577+ else if ((getValueUserReview(account, user) != NONE))
578+ then throw("have you already left a review for this user")
579+ else WriteSet([DataEntry(getKeyUserReview(account, user), review)])
580+ }
581+
582+

github/deemru/w8io/6500d08 
177.37 ms