tx · 8Dtj1c2HfzuwuQsZfj258WNz7z6av1UX4mwWGgY9jfXL

3NBB3iv7YDRsD8ZM2Pw2V5eTcsfqh3j2mvF:  -0.01400000 Waves

2019.10.27 13:33 [738419] smart account 3NBB3iv7YDRsD8ZM2Pw2V5eTcsfqh3j2mvF > SELF 0.00000000 Waves

{ "type": 13, "id": "8Dtj1c2HfzuwuQsZfj258WNz7z6av1UX4mwWGgY9jfXL", "fee": 1400000, "feeAssetId": null, "timestamp": 1572172477182, "version": 1, "sender": "3NBB3iv7YDRsD8ZM2Pw2V5eTcsfqh3j2mvF", "senderPublicKey": "9i5FpMUFCwhogG5euZDBZKV6NehQN4xX83qvNr8NWipE", "proofs": [ "31pcNJd9yYGMxGdZqEW5im33CcPiM8GS2JLRrpjeYdqNxEt5434YSZK9r62GXDKHSg4kM9ZkaH2ShF6987NFpZWX" ], "script": "base64:AAIDAAAAAAAAAG8IARIECgIICBIFCgMICAgSBAoCCAgSBAoCCAgSBAoCCAgSBAoCCAgSAwoBCBIICgYIAQEBCAgSBAoCCAgSBAoCCAgSAwoBCBIGCgQIAQgIEgMKAQgSBAoCCAgSBgoECAgICBIGCgQICAgIEgMKAQgAAABtAAAAAAROT05FAgAAAARub25lAQAAAA5nZXROdW1iZXJCeUtleQAAAAEAAAADa2V5BAAAAANudW0EAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAEdGhpcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWEFAAAAByRtYXRjaDAFAAAAAWEAAAAAAAAAAAAFAAAAA251bQEAAAALZ2V0U3RyQnlLZXkAAAABAAAAA2tleQQAAAADc3RyBAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhBQAAAAROT05FBQAAAANzdHIBAAAAE2NvbnRhaW5zSW5Kc29uQXJyYXkAAAACAAAABGl0ZW0AAAAFYXJyYXkEAAAAByRtYXRjaDAJAASzAAAAAgUAAAAFYXJyYXkFAAAABGl0ZW0DCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAABYQUAAAAHJG1hdGNoMAYDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAABFVuaXQEAAAAAWIFAAAAByRtYXRjaDAHCQEAAAAFdGhyb3cAAAAAAQAAAA5hZGRUb0pzb25BcnJheQAAAAIAAAAEaXRlbQAAAAVhcnJheQQAAAAUYXJyYXlXaXRob3V0QnJhY2tldHMJAQAAAAlkcm9wUmlnaHQAAAACCQABMAAAAAIFAAAABWFycmF5AAAAAAAAAAABAAAAAAAAAAABAwkAAAAAAAACBQAAABRhcnJheVdpdGhvdXRCcmFja2V0cwIAAAAACQABLAAAAAIJAAEsAAAAAgIAAAABWwUAAAAEaXRlbQIAAAABXQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAFbBQAAABRhcnJheVdpdGhvdXRCcmFja2V0cwIAAAABLAUAAAAEaXRlbQIAAAABXQEAAAASZ2V0S2V5V2hpdGVsaXN0UmVmAAAAAQAAAAdhY2NvdW50CQABLAAAAAICAAAAB3dsX3JlZl8FAAAAB2FjY291bnQBAAAAFWdldEtleVdoaXRlbGlzdFN0YXR1cwAAAAEAAAAHYWNjb3VudAkAASwAAAACAgAAAAd3bF9zdHNfBQAAAAdhY2NvdW50AQAAAA1nZXRLZXlCYWxhbmNlAAAAAQAAAAdhY2NvdW50CQABLAAAAAICAAAACGJhbGFuY2VfBQAAAAdhY2NvdW50AQAAABJnZXRLZXlXaGl0ZWxpc3RCaW8AAAABAAAAB2FjY291bnQJAAEsAAAAAgIAAAAHd2xfYmlvXwUAAAAHYWNjb3VudAEAAAAUZ2V0S2V5V2hpdGVsaXN0QmxvY2sAAAABAAAAB2FjY291bnQJAAEsAAAAAgIAAAAHd2xfYmxrXwUAAAAHYWNjb3VudAEAAAAQZ2V0S2V5SXRlbUF1dGhvcgAAAAEAAAAEaXRlbQkAASwAAAACAgAAAAdhdXRob3JfBQAAAARpdGVtAQAAAA9nZXRLZXlJdGVtQmxvY2sAAAABAAAABGl0ZW0JAAEsAAAAAgIAAAAGYmxvY2tfBQAAAARpdGVtAQAAABpnZXRLZXlJdGVtVm90aW5nRXhwaXJhdGlvbgAAAAEAAAAEaXRlbQkAASwAAAACAgAAABFleHBpcmF0aW9uX2Jsb2NrXwUAAAAEaXRlbQEAAAAOZ2V0S2V5SXRlbUJhbmsAAAABAAAABGl0ZW0JAAEsAAAAAgIAAAAFYmFua18FAAAABGl0ZW0BAAAAEGdldEtleUl0ZW1TdGF0dXMAAAABAAAABGl0ZW0JAAEsAAAAAgIAAAAHc3RhdHVzXwUAAAAEaXRlbQEAAAAOZ2V0S2V5SXRlbURhdGEAAAABAAAABGl0ZW0JAAEsAAAAAgIAAAAJZGF0YWpzb25fBQAAAARpdGVtAQAAABFnZXRLZXlDb250ZXN0RGF0YQAAAAEAAAAEaXRlbQkAASwAAAACAgAAABFjb250ZXN0X2RhdGFqc29uXwUAAAAEaXRlbQEAAAAZZ2V0S2V5SXRlbUNyb3dkRXhwaXJhdGlvbgAAAAEAAAAEaXRlbQkAASwAAAACAgAAAA9leHBpcmF0aW9uX29uZV8FAAAABGl0ZW0BAAAAGWdldEtleUl0ZW1XaGFsZUV4cGlyYXRpb24AAAABAAAABGl0ZW0JAAEsAAAAAgIAAAAPZXhwaXJhdGlvbl90d29fBQAAAARpdGVtAQAAABJnZXRLZXlJdGVtTkNvbW1pdHMAAAABAAAABGl0ZW0JAAEsAAAAAgIAAAAJbmNvbW1pdHNfBQAAAARpdGVtAQAAABdnZXRLZXlJdGVtQWNjUmVwb3J0RGF0YQAAAAIAAAAEaXRlbQAAAAdhY2NvdW50CQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAdyZXBvcnRfBQAAAARpdGVtAgAAAAFfBQAAAAdhY2NvdW50AQAAABNnZXRLZXlJdGVtQWNjQ29tbWl0AAAAAgAAAARpdGVtAAAAB2FjY291bnQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAB2NvbW1pdF8FAAAABGl0ZW0CAAAAAV8FAAAAB2FjY291bnQBAAAAE2dldEtleUl0ZW1BY2NSZXZlYWwAAAACAAAABGl0ZW0AAAAHYWNjb3VudAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAHcmV2ZWFsXwUAAAAEaXRlbQIAAAABXwUAAAAHYWNjb3VudAEAAAASZ2V0S2V5SXRlbVZvdGVzWWVzAAAAAQAAAARpdGVtCQABLAAAAAICAAAACGNudF95ZXNfBQAAAARpdGVtAQAAABFnZXRLZXlJdGVtVm90ZXNObwAAAAEAAAAEaXRlbQkAASwAAAACAgAAAAdjbnRfbm9fBQAAAARpdGVtAQAAABJnZXRLZXlJdGVtQWNjRmluYWwAAAACAAAABGl0ZW0AAAAHYWNjb3VudAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAGZmluYWxfBQAAAARpdGVtAgAAAAFfBQAAAAdhY2NvdW50AQAAABZnZXRLZXlJdGVtRnVuZFBvc2l0aXZlAAAAAQAAAARpdGVtCQABLAAAAAICAAAADnBvc2l0aXZlX2Z1bmRfBQAAAARpdGVtAQAAABZnZXRLZXlJdGVtRnVuZE5lZ2F0aXZlAAAAAQAAAARpdGVtCQABLAAAAAICAAAADm5lZ2F0aXZlX2Z1bmRfBQAAAARpdGVtAQAAABlnZXRLZXlJdGVtQWNjRnVuZFBvc2l0aXZlAAAAAgAAAARpdGVtAAAAB2FjY291bnQJAAEsAAAAAgkAASwAAAACCQEAAAAWZ2V0S2V5SXRlbUZ1bmRQb3NpdGl2ZQAAAAEFAAAABGl0ZW0CAAAAAV8FAAAAB2FjY291bnQBAAAAGWdldEtleUl0ZW1BY2NGdW5kTmVnYXRpdmUAAAACAAAABGl0ZW0AAAAHYWNjb3VudAkAASwAAAACCQABLAAAAAIJAQAAABZnZXRLZXlJdGVtRnVuZE5lZ2F0aXZlAAAAAQUAAAAEaXRlbQIAAAABXwUAAAAHYWNjb3VudAEAAAAXZ2V0S2V5SXRlbUFjY1Jldmlld3NDbnQAAAACAAAABGl0ZW0AAAAHYWNjb3VudAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAMcmV2aWV3c19jbnRfBQAAAARpdGVtAgAAAAFfBQAAAAdhY2NvdW50AQAAABNnZXRLZXlJdGVtQWNjUmV2aWV3AAAAAgAAAARpdGVtAAAAB2FjY291bnQJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAAB3Jldmlld18FAAAABGl0ZW0CAAAAAV8FAAAAB2FjY291bnQBAAAAEmdldEtleVRyYW5zZmVyTGluawAAAAEAAAAEaGFzaAkAASwAAAACAgAAAA50cmFuc2Zlcl9saW5rXwUAAAAEaGFzaAEAAAAXZ2V0S2V5SXRlbUFjY1Jldmlld1RleHQAAAADAAAABGl0ZW0AAAAHYWNjb3VudAAAAANjbnQJAAEsAAAAAgkAASwAAAACCQEAAAATZ2V0S2V5SXRlbUFjY1JldmlldwAAAAIFAAAABGl0ZW0FAAAAB2FjY291bnQCAAAACV90ZXh0X2lkOgUAAAADY250AQAAABdnZXRLZXlJdGVtQWNjUmV2aWV3TW9kZQAAAAMAAAAEaXRlbQAAAAdhY2NvdW50AAAAA2NudAkAASwAAAACCQABLAAAAAIJAQAAABNnZXRLZXlJdGVtQWNjUmV2aWV3AAAAAgUAAAAEaXRlbQUAAAAHYWNjb3VudAIAAAAJX21vZGVfaWQ6BQAAAANjbnQBAAAAF2dldEtleUl0ZW1BY2NSZXZpZXdUaWVyAAAAAwAAAARpdGVtAAAAB2FjY291bnQAAAADY250CQABLAAAAAIJAAEsAAAAAgkBAAAAE2dldEtleUl0ZW1BY2NSZXZpZXcAAAACBQAAAARpdGVtBQAAAAdhY2NvdW50AgAAAAlfdGllcl9pZDoFAAAAA2NudAEAAAAbZ2V0S2V5SXRlbUFjY1ZvdGVSZXZpZXdUZXh0AAAAAgAAAARpdGVtAAAAB2FjY291bnQJAAEsAAAAAgkBAAAAE2dldEtleUl0ZW1BY2NSZXZpZXcAAAACBQAAAARpdGVtBQAAAAdhY2NvdW50AgAAAAtfdm90ZXJldmlldwEAAAAcZ2V0S2V5SXRlbUFjY1doYWxlUmV2aWV3VGV4dAAAAAIAAAAEaXRlbQAAAAdhY2NvdW50CQABLAAAAAIJAQAAABNnZXRLZXlJdGVtQWNjUmV2aWV3AAAAAgUAAAAEaXRlbQUAAAAHYWNjb3VudAIAAAAMX3doYWxlcmV2aWV3AQAAABZnZXRLZXlJdGVtQnV5b3V0QW1vdW50AAAAAQAAAARpdGVtCQABLAAAAAICAAAADmJ1eW91dF9hbW91bnRfBQAAAARpdGVtAQAAABVnZXRLZXlJdGVtQWNjV2lubmluZ3MAAAACAAAABGl0ZW0AAAAHYWNjb3VudAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAJd2lubmluZ3NfBQAAAARpdGVtAgAAAAFfBQAAAAdhY2NvdW50AQAAAApnZXRLZXlQYWdlAAAAAQAAAAJpZAkAASwAAAACAgAAAARwYWdlBQAAAAJpZAEAAAAPZ2V0S2V5UGFnZU93bmVyAAAAAQAAAAJpZAkAASwAAAACCQEAAAAKZ2V0S2V5UGFnZQAAAAEFAAAAAmlkAgAAAAZfb3duZXIBAAAAEGdldEtleVBhZ2VBZG1pbnMAAAABAAAAAmlkCQABLAAAAAIJAQAAAApnZXRLZXlQYWdlAAAAAQUAAAACaWQCAAAAB19hZG1pbnMBAAAAEWdldEtleVBhZ2VNZW1iZXJzAAAAAQAAAAJpZAkAASwAAAACCQEAAAAKZ2V0S2V5UGFnZQAAAAEFAAAAAmlkAgAAAAhfbWVtYmVycwEAAAAPZ2V0S2V5UGFnZUl0ZW1zAAAAAQAAAAJpZAkAASwAAAACCQEAAAAKZ2V0S2V5UGFnZQAAAAEFAAAAAmlkAgAAAAZfaXRlbXMBAAAAFWdldEtleUZyZWVJbnZpdGVDb3VudAAAAAACAAAAEWZyZWVfaW52aXRlX2NvdW50AQAAABVnZXRLZXlGcmVlSW52aXRlQmxvY2sAAAAAAgAAABFmcmVlX2ludml0ZV9ibG9jawEAAAAUZ2V0VmFsdWVXaGl0ZWxpc3RSZWYAAAABAAAAB2FjY291bnQJAQAAAAtnZXRTdHJCeUtleQAAAAEJAQAAABJnZXRLZXlXaGl0ZWxpc3RSZWYAAAABBQAAAAdhY2NvdW50AQAAABdnZXRWYWx1ZVdoaXRlbGlzdFN0YXR1cwAAAAEAAAAHYWNjb3VudAkBAAAAC2dldFN0ckJ5S2V5AAAAAQkBAAAAFWdldEtleVdoaXRlbGlzdFN0YXR1cwAAAAEFAAAAB2FjY291bnQBAAAAD2dldFZhbHVlQmFsYW5jZQAAAAEAAAAHYWNjb3VudAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAADWdldEtleUJhbGFuY2UAAAABBQAAAAdhY2NvdW50AQAAABRnZXRWYWx1ZVdoaXRlbGlzdEJpbwAAAAEAAAAHYWNjb3VudAkBAAAAC2dldFN0ckJ5S2V5AAAAAQkBAAAAEmdldEtleVdoaXRlbGlzdEJpbwAAAAEFAAAAB2FjY291bnQBAAAAFmdldFZhbHVlV2hpdGVsaXN0QmxvY2sAAAABAAAAB2FjY291bnQJAQAAAAtnZXRTdHJCeUtleQAAAAEJAQAAABRnZXRLZXlXaGl0ZWxpc3RCbG9jawAAAAEFAAAAB2FjY291bnQBAAAAEmdldFZhbHVlSXRlbUF1dGhvcgAAAAEAAAAEaXRlbQkBAAAAC2dldFN0ckJ5S2V5AAAAAQkBAAAAEGdldEtleUl0ZW1BdXRob3IAAAABBQAAAARpdGVtAQAAABFnZXRWYWx1ZUl0ZW1CbG9jawAAAAEAAAAEaXRlbQkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAD2dldEtleUl0ZW1CbG9jawAAAAEFAAAABGl0ZW0BAAAAHGdldFZhbHVlSXRlbVZvdGluZ0V4cGlyYXRpb24AAAABAAAABGl0ZW0JAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABpnZXRLZXlJdGVtVm90aW5nRXhwaXJhdGlvbgAAAAEFAAAABGl0ZW0BAAAAEGdldFZhbHVlSXRlbUJhbmsAAAABAAAABGl0ZW0JAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAAA5nZXRLZXlJdGVtQmFuawAAAAEFAAAABGl0ZW0BAAAAEmdldFZhbHVlSXRlbVN0YXR1cwAAAAEAAAAEaXRlbQkBAAAAC2dldFN0ckJ5S2V5AAAAAQkBAAAAEGdldEtleUl0ZW1TdGF0dXMAAAABBQAAAARpdGVtAQAAABBnZXRWYWx1ZUl0ZW1EYXRhAAAAAQAAAARpdGVtCQEAAAALZ2V0U3RyQnlLZXkAAAABCQEAAAAOZ2V0S2V5SXRlbURhdGEAAAABBQAAAARpdGVtAQAAABtnZXRWYWx1ZUl0ZW1Dcm93ZEV4cGlyYXRpb24AAAABAAAABGl0ZW0JAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABlnZXRLZXlJdGVtQ3Jvd2RFeHBpcmF0aW9uAAAAAQUAAAAEaXRlbQEAAAAbZ2V0VmFsdWVJdGVtV2hhbGVFeHBpcmF0aW9uAAAAAQAAAARpdGVtCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAZZ2V0S2V5SXRlbVdoYWxlRXhwaXJhdGlvbgAAAAEFAAAABGl0ZW0BAAAAFGdldFZhbHVlSXRlbU5Db21taXRzAAAAAQAAAARpdGVtCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAASZ2V0S2V5SXRlbU5Db21taXRzAAAAAQUAAAAEaXRlbQEAAAAVZ2V0VmFsdWVJdGVtQWNjQ29tbWl0AAAAAgAAAARpdGVtAAAAB2FjY291bnQJAQAAAAtnZXRTdHJCeUtleQAAAAEJAQAAABNnZXRLZXlJdGVtQWNjQ29tbWl0AAAAAgUAAAAEaXRlbQUAAAAHYWNjb3VudAEAAAAVZ2V0VmFsdWVJdGVtQWNjUmV2ZWFsAAAAAgAAAARpdGVtAAAAB2FjY291bnQJAQAAAAtnZXRTdHJCeUtleQAAAAEJAQAAABNnZXRLZXlJdGVtQWNjUmV2ZWFsAAAAAgUAAAAEaXRlbQUAAAAHYWNjb3VudAEAAAAUZ2V0VmFsdWVJdGVtVm90ZXNZZXMAAAABAAAABGl0ZW0JAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABJnZXRLZXlJdGVtVm90ZXNZZXMAAAABBQAAAARpdGVtAQAAABNnZXRWYWx1ZUl0ZW1Wb3Rlc05vAAAAAQAAAARpdGVtCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAARZ2V0S2V5SXRlbVZvdGVzTm8AAAABBQAAAARpdGVtAQAAABRnZXRWYWx1ZUl0ZW1BY2NGaW5hbAAAAAIAAAAEaXRlbQAAAAdhY2NvdW50CQEAAAALZ2V0U3RyQnlLZXkAAAABCQEAAAASZ2V0S2V5SXRlbUFjY0ZpbmFsAAAAAgUAAAAEaXRlbQUAAAAHYWNjb3VudAEAAAAYZ2V0VmFsdWVJdGVtRnVuZFBvc2l0aXZlAAAAAQAAAARpdGVtCQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAWZ2V0S2V5SXRlbUZ1bmRQb3NpdGl2ZQAAAAEFAAAABGl0ZW0BAAAAGGdldFZhbHVlSXRlbUZ1bmROZWdhdGl2ZQAAAAEAAAAEaXRlbQkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAFmdldEtleUl0ZW1GdW5kTmVnYXRpdmUAAAABBQAAAARpdGVtAQAAABtnZXRWYWx1ZUl0ZW1BY2NGdW5kUG9zaXRpdmUAAAACAAAABGl0ZW0AAAAHYWNjb3VudAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAGWdldEtleUl0ZW1BY2NGdW5kUG9zaXRpdmUAAAACBQAAAARpdGVtBQAAAAdhY2NvdW50AQAAABtnZXRWYWx1ZUl0ZW1BY2NGdW5kTmVnYXRpdmUAAAACAAAABGl0ZW0AAAAHYWNjb3VudAkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAGWdldEtleUl0ZW1BY2NGdW5kTmVnYXRpdmUAAAACBQAAAARpdGVtBQAAAAdhY2NvdW50AQAAABlnZXRWYWx1ZUl0ZW1BY2NSZXZpZXdzQ250AAAAAgAAAARpdGVtAAAAB2FjY291bnQJAQAAAA5nZXROdW1iZXJCeUtleQAAAAEJAQAAABdnZXRLZXlJdGVtQWNjUmV2aWV3c0NudAAAAAIFAAAABGl0ZW0FAAAAB2FjY291bnQBAAAAGWdldFZhbHVlSXRlbUFjY1Jldmlld1RleHQAAAADAAAABGl0ZW0AAAAHYWNjb3VudAAAAANjbnQJAQAAAAtnZXRTdHJCeUtleQAAAAEJAQAAABdnZXRLZXlJdGVtQWNjUmV2aWV3VGV4dAAAAAMFAAAABGl0ZW0FAAAAB2FjY291bnQFAAAAA2NudAEAAAAZZ2V0VmFsdWVJdGVtQWNjUmV2aWV3TW9kZQAAAAMAAAAEaXRlbQAAAAdhY2NvdW50AAAAA2NudAkBAAAAC2dldFN0ckJ5S2V5AAAAAQkBAAAAF2dldEtleUl0ZW1BY2NSZXZpZXdNb2RlAAAAAwUAAAAEaXRlbQUAAAAHYWNjb3VudAUAAAADY250AQAAABlnZXRWYWx1ZUl0ZW1BY2NSZXZpZXdUaWVyAAAAAwAAAARpdGVtAAAAB2FjY291bnQAAAADY250CQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAXZ2V0S2V5SXRlbUFjY1Jldmlld1RpZXIAAAADBQAAAARpdGVtBQAAAAdhY2NvdW50BQAAAANjbnQBAAAAGGdldFZhbHVlSXRlbUJ1eW91dEFtb3VudAAAAAEAAAAEaXRlbQkBAAAADmdldE51bWJlckJ5S2V5AAAAAQkBAAAAFmdldEtleUl0ZW1CdXlvdXRBbW91bnQAAAABBQAAAARpdGVtAQAAABdnZXRWYWx1ZUl0ZW1BY2NXaW5uaW5ncwAAAAIAAAAEaXRlbQAAAAdhY2NvdW50CQEAAAAOZ2V0TnVtYmVyQnlLZXkAAAABCQEAAAAVZ2V0S2V5SXRlbUFjY1dpbm5pbmdzAAAAAgUAAAAEaXRlbQUAAAAHYWNjb3VudAEAAAAMZ2V0VmFsdWVQYWdlAAAAAQAAAAJpZAkBAAAAC2dldFN0ckJ5S2V5AAAAAQkBAAAACmdldEtleVBhZ2UAAAABBQAAAAJpZAEAAAARZ2V0VmFsdWVQYWdlT3duZXIAAAABAAAAAmlkCQEAAAALZ2V0U3RyQnlLZXkAAAABCQEAAAAPZ2V0S2V5UGFnZU93bmVyAAAAAQUAAAACaWQBAAAAEmdldFZhbHVlUGFnZUFkbWlucwAAAAEAAAACaWQJAQAAAAtnZXRTdHJCeUtleQAAAAEJAQAAABBnZXRLZXlQYWdlQWRtaW5zAAAAAQUAAAACaWQBAAAAE2dldFZhbHVlUGFnZU1lbWJlcnMAAAABAAAAAmlkCQEAAAALZ2V0U3RyQnlLZXkAAAABCQEA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YmUgd2hpdGVsaXN0ZWQuIHN0YXR1czogBQAAAApjdXJyc3RhdHVzCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAEmdldEtleVdoaXRlbGlzdFJlZgAAAAEFAAAACm5ld2FjY291bnQFAAAAB2FjY291bnQJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIJAQAAABJnZXRLZXlXaGl0ZWxpc3RCaW8AAAABBQAAAApuZXdhY2NvdW50BQAAAARkYXRhCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACCQEAAAAVZ2V0S2V5V2hpdGVsaXN0U3RhdHVzAAAAAQUAAAAKbmV3YWNjb3VudAUAAAAHSU5WSVRFRAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAFWdldEtleUZyZWVJbnZpdGVCbG9jawAAAAADCQAAZgAAAAIFAAAABmhlaWdodAUAAAAPZnJlZUludml0ZUJsb2NrCQAAZAAAAAIFAAAABmhlaWdodAUAAAALQkxPQ0tTSU5EQVkFAAAAD2ZyZWVJbnZpdGVCbG9jawkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgkBAAAAFWdldEtleUZyZWVJbnZpdGVDb3VudAAAAAADCQAAZgAAAAIFAAAABmhlaWdodAUAAAAPZnJlZUludml0ZUJsb2NrBQAAAA1NQVhGUkVFSU5WSVRFCQAAZQAAAAIFAAAAD2ZyZWVJbnZpdGVDb3VudAAAAAAAAAAAAQUAAAADbmlsCQEAAAALVHJhbnNmZXJTZXQAAAABCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQUAAAAHYWNjb3VudAMDCQAAAAAAAAIJAQAAAAx3YXZlc0JhbGFuY2UAAAABCQEAAAAcQGV4dHJVc2VyKGFkZHJlc3NGcm9tU3RyaW5nKQAAAAEFAAAAB2FjY291bnQAAAAAAAAAAAADCQAAZgAAAAIFAAAAD2ZyZWVJbnZpdGVDb3VudAAAAAAAAAAAAAYJAABmAAAAAgUAAAAGaGVpZ2h0BQAAAA9mcmVl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", "chainId": 84, "height": 738419, "spentComplexity": 0 } View: original | compacted Prev: HNg8hxQRWc1sgUEyEwNmKNPmkJvRe5sPhQ9zQh6yaWzw Next: none Diff:
OldNewDifferences
2222 NONE
2323 }
2424 str
25+ }
26+
27+
28+func containsInJsonArray (item,array) = match indexOf(array, item) {
29+ case a: Int =>
30+ true
31+ case b: Unit =>
32+ false
33+ case _ =>
34+ throw()
35+}
36+
37+
38+func addToJsonArray (item,array) = {
39+ let arrayWithoutBrackets = dropRight(drop(array, 1), 1)
40+ if ((arrayWithoutBrackets == ""))
41+ then (("[" + item) + "]")
42+ else (((("[" + arrayWithoutBrackets) + ",") + item) + "]")
2543 }
2644
2745
130148 func getKeyItemAccWinnings (item,account) = ((("winnings_" + item) + "_") + account)
131149
132150
151+func getKeyPage (id) = ("page" + id)
152+
153+
154+func getKeyPageOwner (id) = (getKeyPage(id) + "_owner")
155+
156+
157+func getKeyPageAdmins (id) = (getKeyPage(id) + "_admins")
158+
159+
160+func getKeyPageMembers (id) = (getKeyPage(id) + "_members")
161+
162+
163+func getKeyPageItems (id) = (getKeyPage(id) + "_items")
164+
165+
133166 func getKeyFreeInviteCount () = "free_invite_count"
134167
135168
223256 func getValueItemAccWinnings (item,account) = getNumberByKey(getKeyItemAccWinnings(item, account))
224257
225258
259+func getValuePage (id) = getStrByKey(getKeyPage(id))
260+
261+
262+func getValuePageOwner (id) = getStrByKey(getKeyPageOwner(id))
263+
264+
265+func getValuePageAdmins (id) = getStrByKey(getKeyPageAdmins(id))
266+
267+
268+func getValuePageMembers (id) = getStrByKey(getKeyPageMembers(id))
269+
270+
271+func getValuePageItems (id) = getStrByKey(getKeyPageItems(id))
272+
273+
226274 let WHITELISTED = "registered"
227275
228276 let INVITED = "invited"
263311
264312 let TIERS = [(3 * 100000000), (10 * 100000000), (100 * 100000000), (300 * 100000000), (1000 * 100000000)]
265313
266-let LISTINGFEE = (1 * 100000000)
267-
268314 let VOTEBET = (1 * 100000000)
269315
270316 let BLOCKSINDAY = 1440
271317
272318 let MULTIPLIER = 150
273319
274-let MAXFREEINVITE = 100
320+let MAXFREEINVITE = 1000
275321
276-let INVITEFEE = 500000
322+let INVITEFEE = 900000
323+
324+let ADDITEMFEE = 1000000
277325
278326 let freeInviteCount = getNumberByKey(getKeyFreeInviteCount())
279327
288336 then true
289337 else (newstatus == WHALE))
290338 then throw("User has already been registered")
291- else if (if (if ((currstatus != WHITELISTED))
292- then (account != GENESIS)
293- else false)
294- then (currstatus != WHALE)
295- else false)
296- then throw(("Your account should be whitelisted. status: " + currstatus))
297- else WriteSet([DataEntry(getKeyWhitelistRef(newaccount), account), DataEntry(getKeyWhitelistBio(newaccount), data), DataEntry(getKeyWhitelistStatus(newaccount), INVITED)])
339+ else if (isDefined(i.feeAssetId))
340+ then throw("invalid asset")
341+ else if ((i.fee > INVITEFEE))
342+ then throw("fee more max")
343+ else if (if (if ((currstatus != WHITELISTED))
344+ then (account != GENESIS)
345+ else false)
346+ then (currstatus != WHALE)
347+ else false)
348+ then throw(("Your account should be whitelisted. status: " + currstatus))
349+ else ScriptResult(WriteSet([DataEntry(getKeyWhitelistRef(newaccount), account), DataEntry(getKeyWhitelistBio(newaccount), data), DataEntry(getKeyWhitelistStatus(newaccount), INVITED), DataEntry(getKeyFreeInviteBlock(), if ((height > freeInviteBlock))
350+ then (height + BLOCKSINDAY)
351+ else freeInviteBlock), DataEntry(getKeyFreeInviteCount(), if ((height > freeInviteBlock))
352+ then MAXFREEINVITE
353+ else (freeInviteCount - 1))]), TransferSet([ScriptTransfer(addressFromStringValue(account), if (if ((wavesBalance(addressFromStringValue(account)) == 0))
354+ then if ((freeInviteCount > 0))
355+ then true
356+ else (height > freeInviteBlock)
357+ else false)
358+ then i.fee
359+ else 0, unit)]))
298360 }
299361
300362
305367 let status = getValueWhitelistStatus(hash)
306368 if ((status != INVITED))
307369 then throw(((((("Referral invite needed. Current status: " + status) + ", key:") + getKeyWhitelistStatus(hash)) + ", account:") + hash))
308- else ScriptResult(WriteSet([DataEntry(getKeyWhitelistBio(account), data), DataEntry(getKeyWhitelistBlock(account), height), DataEntry(getKeyWhitelistStatus(account), if ((type == WHALE))
309- then WHALE
310- else WHITELISTED), DataEntry(getKeyWhitelistStatus(hash), SPENDINVITE), DataEntry(getKeyWhitelistRef(account), getValueWhitelistRef(hash)), DataEntry(getKeyFreeInviteBlock(), if ((height > freeInviteBlock))
311- then (height + BLOCKSINDAY)
312- else freeInviteBlock), DataEntry(getKeyFreeInviteCount(), if ((height > freeInviteBlock))
313- then MAXFREEINVITE
314- else (freeInviteCount - 1))]), TransferSet([ScriptTransfer(addressFromStringValue(account), if (if ((wavesBalance(addressFromStringValue(account)) == 0))
315- then (freeInviteCount > 0)
316- else false)
317- then INVITEFEE
318- else 0, unit)]))
370+ else if (isDefined(i.feeAssetId))
371+ then throw("invalid asset")
372+ else if ((i.fee > INVITEFEE))
373+ then throw("fee more max")
374+ else ScriptResult(WriteSet([DataEntry(getKeyWhitelistBio(account), data), DataEntry(getKeyWhitelistBlock(account), height), DataEntry(getKeyWhitelistStatus(account), if ((type == WHALE))
375+ then WHALE
376+ else WHITELISTED), DataEntry(getKeyWhitelistRef(account), getValueWhitelistRef(hash)), DataEntry(getKeyFreeInviteBlock(), if ((height > freeInviteBlock))
377+ then (height + BLOCKSINDAY)
378+ else freeInviteBlock), DataEntry(getKeyFreeInviteCount(), if ((height > freeInviteBlock))
379+ then MAXFREEINVITE
380+ else (freeInviteCount - 1))]), TransferSet([ScriptTransfer(addressFromStringValue(account), if (if ((wavesBalance(addressFromStringValue(account)) == 0))
381+ then if ((freeInviteCount > 0))
382+ then true
383+ else (height > freeInviteBlock)
384+ else false)
385+ then i.fee
386+ else 0, unit)]))
319387 }
320388
321389
336404 @Callable(i)
337405 func userupdate (data,type) = {
338406 let account = toBase58String(i.caller.bytes)
339- if ((getKeyWhitelistBio(account) == NONE))
407+ let status = getValueWhitelistStatus(account)
408+ if ((status == NONE))
340409 then throw("user not signup")
341- else WriteSet([DataEntry(getKeyWhitelistBio(account), data), DataEntry(getKeyWhitelistStatus(account), if ((type == WHALE))
342- then WHALE
343- else WHITELISTED)])
410+ else if (isDefined(i.feeAssetId))
411+ then throw("invalid asset")
412+ else if ((i.fee > INVITEFEE))
413+ then throw("fee more max")
414+ else ScriptResult(WriteSet([DataEntry(getKeyWhitelistBio(account), data), DataEntry(getKeyWhitelistStatus(account), if ((type == WHALE))
415+ then WHALE
416+ else WHITELISTED), DataEntry(getKeyFreeInviteBlock(), if ((height > freeInviteBlock))
417+ then (height + BLOCKSINDAY)
418+ else freeInviteBlock), DataEntry(getKeyFreeInviteCount(), if ((height > freeInviteBlock))
419+ then MAXFREEINVITE
420+ else (freeInviteCount - 1))]), TransferSet([ScriptTransfer(addressFromStringValue(account), if (if ((wavesBalance(addressFromStringValue(account)) == 0))
421+ then if ((freeInviteCount > 0))
422+ then true
423+ else (height > freeInviteBlock)
424+ else false)
425+ then i.fee
426+ else 0, unit)]))
344427 }
345428
346429
350433 let account = toBase58String(i.caller.bytes)
351434 if ((getValueItemAuthor(item) != account))
352435 then throw("You're not author")
353- else WriteSet([DataEntry(getKeyItemData(item), data)])
436+ else if ((i.fee > INVITEFEE))
437+ then throw("fee more max")
438+ else ScriptResult(WriteSet([DataEntry(getKeyItemData(item), data), DataEntry(getKeyFreeInviteBlock(), if ((height > freeInviteBlock))
439+ then (height + BLOCKSINDAY)
440+ else freeInviteBlock), DataEntry(getKeyFreeInviteCount(), if ((height > freeInviteBlock))
441+ then MAXFREEINVITE
442+ else (freeInviteCount - 1))]), TransferSet([ScriptTransfer(addressFromStringValue(account), if (if ((wavesBalance(addressFromStringValue(account)) == 0))
443+ then if ((freeInviteCount > 0))
444+ then true
445+ else (height > freeInviteBlock)
446+ else false)
447+ then i.fee
448+ else 0, unit)]))
354449 }
355450
356451
376471
377472
378473 @Callable(i)
379-func additem (item,expVoting,expCrowd,expWhale,data) = {
474+func additem (item,expVoting,expCrowd,expWhale,data,pageId) = {
380475 let account = toBase58String(i.caller.bytes)
381476 let pmt = extract(i.payment)
477+ let isAllowed = if ((pageId == ""))
478+ then true
479+ else if (if (containsInJsonArray(account, getValuePageAdmins(pageId)))
480+ then true
481+ else containsInJsonArray(account, getValuePageMembers(pageId)))
482+ then true
483+ else (getValuePageOwner(pageId) == account)
382484 if (isDefined(pmt.assetId))
383485 then throw("can use waves only at the moment")
384- else if ((pmt.amount != LISTINGFEE))
385- then throw(((("Please pay exact amount for the listing: " + toString(LISTINGFEE)) + ", actual payment is: ") + toString(pmt.amount)))
386- else if (!(if (if ((expVoting > 2))
387- then (expCrowd > expVoting)
388- else false)
389- then (expWhale > expCrowd)
390- else false))
391- then throw("Incorrect time parameters")
392- else if ((getValueItemAuthor(item) != NONE))
393- then throw("Item already exist")
394- else WriteSet([DataEntry(getKeyItemAuthor(item), account), DataEntry(getKeyItemBlock(item), height), DataEntry(getKeyItemVotingExpiration(item), (height + expVoting)), DataEntry(getKeyItemBank(item), LISTINGFEE), DataEntry(getKeyItemStatus(item), FEATURED), DataEntry(getKeyItemData(item), data), DataEntry(getKeyItemCrowdExpiration(item), (height + expCrowd)), DataEntry(getKeyItemWhaleExpiration(item), (height + expWhale))])
486+ else if (!(isAllowed))
487+ then throw("permission denied")
488+ else if ((i.fee > INVITEFEE))
489+ then throw("fee more max")
490+ else if (!(if (if ((expVoting > 2))
491+ then (expCrowd > expVoting)
492+ else false)
493+ then (expWhale > expCrowd)
494+ else false))
495+ then throw("Incorrect time parameters")
496+ else if ((getValueItemAuthor(item) != NONE))
497+ then throw("Item already exist")
498+ else ScriptResult(WriteSet([DataEntry(getKeyItemAuthor(item), account), DataEntry(getKeyItemBlock(item), height), DataEntry(getKeyItemVotingExpiration(item), (height + expVoting)), DataEntry(getKeyItemStatus(item), FEATURED), DataEntry(getKeyItemData(item), data), DataEntry(getKeyItemCrowdExpiration(item), (height + expCrowd)), DataEntry(getKeyItemWhaleExpiration(item), (height + expWhale)), DataEntry(getKeyFreeInviteBlock(), if ((height > freeInviteBlock))
499+ then (height + BLOCKSINDAY)
500+ else freeInviteBlock), DataEntry(getKeyFreeInviteCount(), if ((height > freeInviteBlock))
501+ then MAXFREEINVITE
502+ else (freeInviteCount - 1)), DataEntry(getKeyPageItems(pageId), if ((pageId == ""))
503+ then ""
504+ else addToJsonArray(item, getValuePageItems(pageId)))]), TransferSet([ScriptTransfer(addressFromStringValue(account), if (if ((wavesBalance(addressFromStringValue(account)) == 0))
505+ then if ((freeInviteCount > 0))
506+ then true
507+ else (height > freeInviteBlock)
508+ else false)
509+ then i.fee
510+ else 0, unit)]))
395511 }
396512
397513
546662
547663
548664 @Callable(i)
665+func addPage (id,data,admins,members) = {
666+ let account = toString(i.caller)
667+ let pmt = extract(i.payment)
668+ if (isDefined(pmt.assetId))
669+ then throw("can use waves only at the moment")
670+ else if ((getValuePageOwner(id) != NONE))
671+ then throw("Page already exist")
672+ else WriteSet([DataEntry(getKeyPage(id), data), DataEntry(getKeyPageOwner(id), account), DataEntry(getKeyPageAdmins(id), admins), DataEntry(getKeyPageMembers(id), members)])
673+ }
674+
675+
676+
677+@Callable(i)
678+func updatePage (id,newData,newAdmins,newMembers) = {
679+ let account = toString(i.caller)
680+ let admins = getValuePageAdmins(id)
681+ let owner = getValuePageOwner(id)
682+ if (if (!(containsInJsonArray(account, admins)))
683+ then (owner != account)
684+ else false)
685+ then throw("permission denied")
686+ else if ((getValuePageOwner(id) == NONE))
687+ then throw("Page not exist")
688+ else WriteSet([DataEntry(getKeyPage(id), newData), DataEntry(getKeyPageAdmins(id), newAdmins), DataEntry(getKeyPageMembers(id), newMembers)])
689+ }
690+
691+
692+
693+@Callable(i)
549694 func transfer (account) = {
550695 let pmt = extract(i.payment)
551696 if (isDefined(pmt.assetId))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let NONE = "none"
55
66 func getNumberByKey (key) = {
77 let num = match getInteger(this, key) {
88 case a: Int =>
99 a
1010 case _ =>
1111 0
1212 }
1313 num
1414 }
1515
1616
1717 func getStrByKey (key) = {
1818 let str = match getString(this, key) {
1919 case a: String =>
2020 a
2121 case _ =>
2222 NONE
2323 }
2424 str
25+ }
26+
27+
28+func containsInJsonArray (item,array) = match indexOf(array, item) {
29+ case a: Int =>
30+ true
31+ case b: Unit =>
32+ false
33+ case _ =>
34+ throw()
35+}
36+
37+
38+func addToJsonArray (item,array) = {
39+ let arrayWithoutBrackets = dropRight(drop(array, 1), 1)
40+ if ((arrayWithoutBrackets == ""))
41+ then (("[" + item) + "]")
42+ else (((("[" + arrayWithoutBrackets) + ",") + item) + "]")
2543 }
2644
2745
2846 func getKeyWhitelistRef (account) = ("wl_ref_" + account)
2947
3048
3149 func getKeyWhitelistStatus (account) = ("wl_sts_" + account)
3250
3351
3452 func getKeyBalance (account) = ("balance_" + account)
3553
3654
3755 func getKeyWhitelistBio (account) = ("wl_bio_" + account)
3856
3957
4058 func getKeyWhitelistBlock (account) = ("wl_blk_" + account)
4159
4260
4361 func getKeyItemAuthor (item) = ("author_" + item)
4462
4563
4664 func getKeyItemBlock (item) = ("block_" + item)
4765
4866
4967 func getKeyItemVotingExpiration (item) = ("expiration_block_" + item)
5068
5169
5270 func getKeyItemBank (item) = ("bank_" + item)
5371
5472
5573 func getKeyItemStatus (item) = ("status_" + item)
5674
5775
5876 func getKeyItemData (item) = ("datajson_" + item)
5977
6078
6179 func getKeyContestData (item) = ("contest_datajson_" + item)
6280
6381
6482 func getKeyItemCrowdExpiration (item) = ("expiration_one_" + item)
6583
6684
6785 func getKeyItemWhaleExpiration (item) = ("expiration_two_" + item)
6886
6987
7088 func getKeyItemNCommits (item) = ("ncommits_" + item)
7189
7290
7391 func getKeyItemAccReportData (item,account) = ((("report_" + item) + "_") + account)
7492
7593
7694 func getKeyItemAccCommit (item,account) = ((("commit_" + item) + "_") + account)
7795
7896
7997 func getKeyItemAccReveal (item,account) = ((("reveal_" + item) + "_") + account)
8098
8199
82100 func getKeyItemVotesYes (item) = ("cnt_yes_" + item)
83101
84102
85103 func getKeyItemVotesNo (item) = ("cnt_no_" + item)
86104
87105
88106 func getKeyItemAccFinal (item,account) = ((("final_" + item) + "_") + account)
89107
90108
91109 func getKeyItemFundPositive (item) = ("positive_fund_" + item)
92110
93111
94112 func getKeyItemFundNegative (item) = ("negative_fund_" + item)
95113
96114
97115 func getKeyItemAccFundPositive (item,account) = ((getKeyItemFundPositive(item) + "_") + account)
98116
99117
100118 func getKeyItemAccFundNegative (item,account) = ((getKeyItemFundNegative(item) + "_") + account)
101119
102120
103121 func getKeyItemAccReviewsCnt (item,account) = ((("reviews_cnt_" + item) + "_") + account)
104122
105123
106124 func getKeyItemAccReview (item,account) = ((("review_" + item) + "_") + account)
107125
108126
109127 func getKeyTransferLink (hash) = ("transfer_link_" + hash)
110128
111129
112130 func getKeyItemAccReviewText (item,account,cnt) = ((getKeyItemAccReview(item, account) + "_text_id:") + cnt)
113131
114132
115133 func getKeyItemAccReviewMode (item,account,cnt) = ((getKeyItemAccReview(item, account) + "_mode_id:") + cnt)
116134
117135
118136 func getKeyItemAccReviewTier (item,account,cnt) = ((getKeyItemAccReview(item, account) + "_tier_id:") + cnt)
119137
120138
121139 func getKeyItemAccVoteReviewText (item,account) = (getKeyItemAccReview(item, account) + "_votereview")
122140
123141
124142 func getKeyItemAccWhaleReviewText (item,account) = (getKeyItemAccReview(item, account) + "_whalereview")
125143
126144
127145 func getKeyItemBuyoutAmount (item) = ("buyout_amount_" + item)
128146
129147
130148 func getKeyItemAccWinnings (item,account) = ((("winnings_" + item) + "_") + account)
131149
132150
151+func getKeyPage (id) = ("page" + id)
152+
153+
154+func getKeyPageOwner (id) = (getKeyPage(id) + "_owner")
155+
156+
157+func getKeyPageAdmins (id) = (getKeyPage(id) + "_admins")
158+
159+
160+func getKeyPageMembers (id) = (getKeyPage(id) + "_members")
161+
162+
163+func getKeyPageItems (id) = (getKeyPage(id) + "_items")
164+
165+
133166 func getKeyFreeInviteCount () = "free_invite_count"
134167
135168
136169 func getKeyFreeInviteBlock () = "free_invite_block"
137170
138171
139172 func getValueWhitelistRef (account) = getStrByKey(getKeyWhitelistRef(account))
140173
141174
142175 func getValueWhitelistStatus (account) = getStrByKey(getKeyWhitelistStatus(account))
143176
144177
145178 func getValueBalance (account) = getNumberByKey(getKeyBalance(account))
146179
147180
148181 func getValueWhitelistBio (account) = getStrByKey(getKeyWhitelistBio(account))
149182
150183
151184 func getValueWhitelistBlock (account) = getStrByKey(getKeyWhitelistBlock(account))
152185
153186
154187 func getValueItemAuthor (item) = getStrByKey(getKeyItemAuthor(item))
155188
156189
157190 func getValueItemBlock (item) = getNumberByKey(getKeyItemBlock(item))
158191
159192
160193 func getValueItemVotingExpiration (item) = getNumberByKey(getKeyItemVotingExpiration(item))
161194
162195
163196 func getValueItemBank (item) = getNumberByKey(getKeyItemBank(item))
164197
165198
166199 func getValueItemStatus (item) = getStrByKey(getKeyItemStatus(item))
167200
168201
169202 func getValueItemData (item) = getStrByKey(getKeyItemData(item))
170203
171204
172205 func getValueItemCrowdExpiration (item) = getNumberByKey(getKeyItemCrowdExpiration(item))
173206
174207
175208 func getValueItemWhaleExpiration (item) = getNumberByKey(getKeyItemWhaleExpiration(item))
176209
177210
178211 func getValueItemNCommits (item) = getNumberByKey(getKeyItemNCommits(item))
179212
180213
181214 func getValueItemAccCommit (item,account) = getStrByKey(getKeyItemAccCommit(item, account))
182215
183216
184217 func getValueItemAccReveal (item,account) = getStrByKey(getKeyItemAccReveal(item, account))
185218
186219
187220 func getValueItemVotesYes (item) = getNumberByKey(getKeyItemVotesYes(item))
188221
189222
190223 func getValueItemVotesNo (item) = getNumberByKey(getKeyItemVotesNo(item))
191224
192225
193226 func getValueItemAccFinal (item,account) = getStrByKey(getKeyItemAccFinal(item, account))
194227
195228
196229 func getValueItemFundPositive (item) = getNumberByKey(getKeyItemFundPositive(item))
197230
198231
199232 func getValueItemFundNegative (item) = getNumberByKey(getKeyItemFundNegative(item))
200233
201234
202235 func getValueItemAccFundPositive (item,account) = getNumberByKey(getKeyItemAccFundPositive(item, account))
203236
204237
205238 func getValueItemAccFundNegative (item,account) = getNumberByKey(getKeyItemAccFundNegative(item, account))
206239
207240
208241 func getValueItemAccReviewsCnt (item,account) = getNumberByKey(getKeyItemAccReviewsCnt(item, account))
209242
210243
211244 func getValueItemAccReviewText (item,account,cnt) = getStrByKey(getKeyItemAccReviewText(item, account, cnt))
212245
213246
214247 func getValueItemAccReviewMode (item,account,cnt) = getStrByKey(getKeyItemAccReviewMode(item, account, cnt))
215248
216249
217250 func getValueItemAccReviewTier (item,account,cnt) = getNumberByKey(getKeyItemAccReviewTier(item, account, cnt))
218251
219252
220253 func getValueItemBuyoutAmount (item) = getNumberByKey(getKeyItemBuyoutAmount(item))
221254
222255
223256 func getValueItemAccWinnings (item,account) = getNumberByKey(getKeyItemAccWinnings(item, account))
224257
225258
259+func getValuePage (id) = getStrByKey(getKeyPage(id))
260+
261+
262+func getValuePageOwner (id) = getStrByKey(getKeyPageOwner(id))
263+
264+
265+func getValuePageAdmins (id) = getStrByKey(getKeyPageAdmins(id))
266+
267+
268+func getValuePageMembers (id) = getStrByKey(getKeyPageMembers(id))
269+
270+
271+func getValuePageItems (id) = getStrByKey(getKeyPageItems(id))
272+
273+
226274 let WHITELISTED = "registered"
227275
228276 let INVITED = "invited"
229277
230278 let WHALE = "whale"
231279
232280 let SPENDINVITE = "spend_invite"
233281
234282 let COMMIT = "voting_commit"
235283
236284 let REVEAL = "voting_reveal"
237285
238286 let FEATURED = "featured"
239287
240288 let DELISTED = "delisted"
241289
242290 let CASHOUT = "cashout"
243291
244292 let BUYOUT = "buyout"
245293
246294 let FINISHED = "finished"
247295
248296 let CLAIMED = "claimed"
249297
250298 let POSITIVE = "positive"
251299
252300 let NEGATIVE = "negative"
253301
254302 let GENESIS = "3P8Fvy1yDwNHvVrabe4ek5b9dAwxFjDKV7R"
255303
256304 let ADMIN = "3P9NDxt9Y6ePfM9hkQysgSvbHJvihr56Z18"
257305
258306 let LABS = "3P3MUCvJjviJaxMUe743LVez3qThbL7U8uP"
259307
260308 let VOTERS = 3
261309
262310 let QUORUM = 2
263311
264312 let TIERS = [(3 * 100000000), (10 * 100000000), (100 * 100000000), (300 * 100000000), (1000 * 100000000)]
265313
266-let LISTINGFEE = (1 * 100000000)
267-
268314 let VOTEBET = (1 * 100000000)
269315
270316 let BLOCKSINDAY = 1440
271317
272318 let MULTIPLIER = 150
273319
274-let MAXFREEINVITE = 100
320+let MAXFREEINVITE = 1000
275321
276-let INVITEFEE = 500000
322+let INVITEFEE = 900000
323+
324+let ADDITEMFEE = 1000000
277325
278326 let freeInviteCount = getNumberByKey(getKeyFreeInviteCount())
279327
280328 let freeInviteBlock = getNumberByKey(getKeyFreeInviteBlock())
281329
282330 @Callable(i)
283331 func inviteuser (newaccount,data) = {
284332 let account = toBase58String(i.caller.bytes)
285333 let newstatus = getValueWhitelistStatus(newaccount)
286334 let currstatus = getValueWhitelistStatus(account)
287335 if (if ((newstatus == WHITELISTED))
288336 then true
289337 else (newstatus == WHALE))
290338 then throw("User has already been registered")
291- else if (if (if ((currstatus != WHITELISTED))
292- then (account != GENESIS)
293- else false)
294- then (currstatus != WHALE)
295- else false)
296- then throw(("Your account should be whitelisted. status: " + currstatus))
297- else WriteSet([DataEntry(getKeyWhitelistRef(newaccount), account), DataEntry(getKeyWhitelistBio(newaccount), data), DataEntry(getKeyWhitelistStatus(newaccount), INVITED)])
339+ else if (isDefined(i.feeAssetId))
340+ then throw("invalid asset")
341+ else if ((i.fee > INVITEFEE))
342+ then throw("fee more max")
343+ else if (if (if ((currstatus != WHITELISTED))
344+ then (account != GENESIS)
345+ else false)
346+ then (currstatus != WHALE)
347+ else false)
348+ then throw(("Your account should be whitelisted. status: " + currstatus))
349+ else ScriptResult(WriteSet([DataEntry(getKeyWhitelistRef(newaccount), account), DataEntry(getKeyWhitelistBio(newaccount), data), DataEntry(getKeyWhitelistStatus(newaccount), INVITED), DataEntry(getKeyFreeInviteBlock(), if ((height > freeInviteBlock))
350+ then (height + BLOCKSINDAY)
351+ else freeInviteBlock), DataEntry(getKeyFreeInviteCount(), if ((height > freeInviteBlock))
352+ then MAXFREEINVITE
353+ else (freeInviteCount - 1))]), TransferSet([ScriptTransfer(addressFromStringValue(account), if (if ((wavesBalance(addressFromStringValue(account)) == 0))
354+ then if ((freeInviteCount > 0))
355+ then true
356+ else (height > freeInviteBlock)
357+ else false)
358+ then i.fee
359+ else 0, unit)]))
298360 }
299361
300362
301363
302364 @Callable(i)
303365 func signupbylink (hash,data,type) = {
304366 let account = toBase58String(i.caller.bytes)
305367 let status = getValueWhitelistStatus(hash)
306368 if ((status != INVITED))
307369 then throw(((((("Referral invite needed. Current status: " + status) + ", key:") + getKeyWhitelistStatus(hash)) + ", account:") + hash))
308- else ScriptResult(WriteSet([DataEntry(getKeyWhitelistBio(account), data), DataEntry(getKeyWhitelistBlock(account), height), DataEntry(getKeyWhitelistStatus(account), if ((type == WHALE))
309- then WHALE
310- else WHITELISTED), DataEntry(getKeyWhitelistStatus(hash), SPENDINVITE), DataEntry(getKeyWhitelistRef(account), getValueWhitelistRef(hash)), DataEntry(getKeyFreeInviteBlock(), if ((height > freeInviteBlock))
311- then (height + BLOCKSINDAY)
312- else freeInviteBlock), DataEntry(getKeyFreeInviteCount(), if ((height > freeInviteBlock))
313- then MAXFREEINVITE
314- else (freeInviteCount - 1))]), TransferSet([ScriptTransfer(addressFromStringValue(account), if (if ((wavesBalance(addressFromStringValue(account)) == 0))
315- then (freeInviteCount > 0)
316- else false)
317- then INVITEFEE
318- else 0, unit)]))
370+ else if (isDefined(i.feeAssetId))
371+ then throw("invalid asset")
372+ else if ((i.fee > INVITEFEE))
373+ then throw("fee more max")
374+ else ScriptResult(WriteSet([DataEntry(getKeyWhitelistBio(account), data), DataEntry(getKeyWhitelistBlock(account), height), DataEntry(getKeyWhitelistStatus(account), if ((type == WHALE))
375+ then WHALE
376+ else WHITELISTED), DataEntry(getKeyWhitelistRef(account), getValueWhitelistRef(hash)), DataEntry(getKeyFreeInviteBlock(), if ((height > freeInviteBlock))
377+ then (height + BLOCKSINDAY)
378+ else freeInviteBlock), DataEntry(getKeyFreeInviteCount(), if ((height > freeInviteBlock))
379+ then MAXFREEINVITE
380+ else (freeInviteCount - 1))]), TransferSet([ScriptTransfer(addressFromStringValue(account), if (if ((wavesBalance(addressFromStringValue(account)) == 0))
381+ then if ((freeInviteCount > 0))
382+ then true
383+ else (height > freeInviteBlock)
384+ else false)
385+ then i.fee
386+ else 0, unit)]))
319387 }
320388
321389
322390
323391 @Callable(i)
324392 func signup (data,type) = {
325393 let account = toBase58String(i.caller.bytes)
326394 let status = getValueWhitelistStatus(account)
327395 if ((status == NONE))
328396 then throw(((((("Referral invite needed. Current status: " + status) + ", key:") + getKeyWhitelistStatus(account)) + ", account:") + account))
329397 else WriteSet([DataEntry(getKeyWhitelistBio(account), data), DataEntry(getKeyWhitelistBlock(account), height), DataEntry(getKeyWhitelistStatus(account), if ((type == WHALE))
330398 then WHALE
331399 else WHITELISTED)])
332400 }
333401
334402
335403
336404 @Callable(i)
337405 func userupdate (data,type) = {
338406 let account = toBase58String(i.caller.bytes)
339- if ((getKeyWhitelistBio(account) == NONE))
407+ let status = getValueWhitelistStatus(account)
408+ if ((status == NONE))
340409 then throw("user not signup")
341- else WriteSet([DataEntry(getKeyWhitelistBio(account), data), DataEntry(getKeyWhitelistStatus(account), if ((type == WHALE))
342- then WHALE
343- else WHITELISTED)])
410+ else if (isDefined(i.feeAssetId))
411+ then throw("invalid asset")
412+ else if ((i.fee > INVITEFEE))
413+ then throw("fee more max")
414+ else ScriptResult(WriteSet([DataEntry(getKeyWhitelistBio(account), data), DataEntry(getKeyWhitelistStatus(account), if ((type == WHALE))
415+ then WHALE
416+ else WHITELISTED), DataEntry(getKeyFreeInviteBlock(), if ((height > freeInviteBlock))
417+ then (height + BLOCKSINDAY)
418+ else freeInviteBlock), DataEntry(getKeyFreeInviteCount(), if ((height > freeInviteBlock))
419+ then MAXFREEINVITE
420+ else (freeInviteCount - 1))]), TransferSet([ScriptTransfer(addressFromStringValue(account), if (if ((wavesBalance(addressFromStringValue(account)) == 0))
421+ then if ((freeInviteCount > 0))
422+ then true
423+ else (height > freeInviteBlock)
424+ else false)
425+ then i.fee
426+ else 0, unit)]))
344427 }
345428
346429
347430
348431 @Callable(i)
349432 func projupdate (item,data) = {
350433 let account = toBase58String(i.caller.bytes)
351434 if ((getValueItemAuthor(item) != account))
352435 then throw("You're not author")
353- else WriteSet([DataEntry(getKeyItemData(item), data)])
436+ else if ((i.fee > INVITEFEE))
437+ then throw("fee more max")
438+ else ScriptResult(WriteSet([DataEntry(getKeyItemData(item), data), DataEntry(getKeyFreeInviteBlock(), if ((height > freeInviteBlock))
439+ then (height + BLOCKSINDAY)
440+ else freeInviteBlock), DataEntry(getKeyFreeInviteCount(), if ((height > freeInviteBlock))
441+ then MAXFREEINVITE
442+ else (freeInviteCount - 1))]), TransferSet([ScriptTransfer(addressFromStringValue(account), if (if ((wavesBalance(addressFromStringValue(account)) == 0))
443+ then if ((freeInviteCount > 0))
444+ then true
445+ else (height > freeInviteBlock)
446+ else false)
447+ then i.fee
448+ else 0, unit)]))
354449 }
355450
356451
357452
358453 @Callable(i)
359454 func contestAddOrUpdate (item,data) = {
360455 let account = toBase58String(i.caller.bytes)
361456 if ((account != ADMIN))
362457 then throw("You're not admin")
363458 else WriteSet([DataEntry(getKeyContestData(item), data)])
364459 }
365460
366461
367462
368463 @Callable(i)
369464 func withdraw (address) = {
370465 let amount = getValueBalance(address)
371466 if ((0 >= amount))
372467 then throw("Not enough balance")
373468 else ScriptResult(WriteSet([DataEntry(getKeyBalance(address), 0)]), TransferSet([ScriptTransfer(addressFromStringValue(address), amount, unit)]))
374469 }
375470
376471
377472
378473 @Callable(i)
379-func additem (item,expVoting,expCrowd,expWhale,data) = {
474+func additem (item,expVoting,expCrowd,expWhale,data,pageId) = {
380475 let account = toBase58String(i.caller.bytes)
381476 let pmt = extract(i.payment)
477+ let isAllowed = if ((pageId == ""))
478+ then true
479+ else if (if (containsInJsonArray(account, getValuePageAdmins(pageId)))
480+ then true
481+ else containsInJsonArray(account, getValuePageMembers(pageId)))
482+ then true
483+ else (getValuePageOwner(pageId) == account)
382484 if (isDefined(pmt.assetId))
383485 then throw("can use waves only at the moment")
384- else if ((pmt.amount != LISTINGFEE))
385- then throw(((("Please pay exact amount for the listing: " + toString(LISTINGFEE)) + ", actual payment is: ") + toString(pmt.amount)))
386- else if (!(if (if ((expVoting > 2))
387- then (expCrowd > expVoting)
388- else false)
389- then (expWhale > expCrowd)
390- else false))
391- then throw("Incorrect time parameters")
392- else if ((getValueItemAuthor(item) != NONE))
393- then throw("Item already exist")
394- else WriteSet([DataEntry(getKeyItemAuthor(item), account), DataEntry(getKeyItemBlock(item), height), DataEntry(getKeyItemVotingExpiration(item), (height + expVoting)), DataEntry(getKeyItemBank(item), LISTINGFEE), DataEntry(getKeyItemStatus(item), FEATURED), DataEntry(getKeyItemData(item), data), DataEntry(getKeyItemCrowdExpiration(item), (height + expCrowd)), DataEntry(getKeyItemWhaleExpiration(item), (height + expWhale))])
486+ else if (!(isAllowed))
487+ then throw("permission denied")
488+ else if ((i.fee > INVITEFEE))
489+ then throw("fee more max")
490+ else if (!(if (if ((expVoting > 2))
491+ then (expCrowd > expVoting)
492+ else false)
493+ then (expWhale > expCrowd)
494+ else false))
495+ then throw("Incorrect time parameters")
496+ else if ((getValueItemAuthor(item) != NONE))
497+ then throw("Item already exist")
498+ else ScriptResult(WriteSet([DataEntry(getKeyItemAuthor(item), account), DataEntry(getKeyItemBlock(item), height), DataEntry(getKeyItemVotingExpiration(item), (height + expVoting)), DataEntry(getKeyItemStatus(item), FEATURED), DataEntry(getKeyItemData(item), data), DataEntry(getKeyItemCrowdExpiration(item), (height + expCrowd)), DataEntry(getKeyItemWhaleExpiration(item), (height + expWhale)), DataEntry(getKeyFreeInviteBlock(), if ((height > freeInviteBlock))
499+ then (height + BLOCKSINDAY)
500+ else freeInviteBlock), DataEntry(getKeyFreeInviteCount(), if ((height > freeInviteBlock))
501+ then MAXFREEINVITE
502+ else (freeInviteCount - 1)), DataEntry(getKeyPageItems(pageId), if ((pageId == ""))
503+ then ""
504+ else addToJsonArray(item, getValuePageItems(pageId)))]), TransferSet([ScriptTransfer(addressFromStringValue(account), if (if ((wavesBalance(addressFromStringValue(account)) == 0))
505+ then if ((freeInviteCount > 0))
506+ then true
507+ else (height > freeInviteBlock)
508+ else false)
509+ then i.fee
510+ else 0, unit)]))
395511 }
396512
397513
398514
399515 @Callable(i)
400516 func reportProject (item,data) = {
401517 let account = toBase58String(i.caller.bytes)
402518 WriteSet([DataEntry(getKeyItemAccReportData(item, account), data)])
403519 }
404520
405521
406522
407523 @Callable(i)
408524 func labsdonate (item,review) = {
409525 let account = toBase58String(i.caller.bytes)
410526 let pmt = extract(i.payment)
411527 if (isDefined(pmt.assetId))
412528 then throw("can use waves only at the moment")
413529 else if ((account != LABS))
414530 then throw("labs donation is allowed only for waves labs")
415531 else if ((getValueItemStatus(item) != BUYOUT))
416532 then throw("Investement has already done")
417533 else {
418534 let cnt = (getValueItemAccReviewsCnt(item, account) + 1)
419535 let newpositivefund = (getValueItemFundPositive(item) + pmt.amount)
420536 WriteSet([DataEntry(getKeyItemAccReviewsCnt(item, account), cnt), DataEntry(getKeyItemAccFundPositive(item, account), (getValueItemAccFundPositive(item, account) + pmt.amount)), DataEntry(getKeyItemFundPositive(item), newpositivefund), DataEntry(getKeyItemAccReviewText(item, account, toString(cnt)), review), DataEntry(getKeyItemAccReviewMode(item, account, toString(cnt)), POSITIVE), DataEntry(getKeyItemAccReviewTier(item, account, toString(cnt)), 5), DataEntry(getKeyBalance(getValueItemAuthor(item)), (getValueBalance(getValueItemAuthor(item)) + pmt.amount)), DataEntry(getKeyItemStatus(item), CASHOUT)])
421537 }
422538 }
423539
424540
425541
426542 @Callable(i)
427543 func changeStatus (item) = {
428544 let account = toBase58String(i.caller.bytes)
429545 if ((account != LABS))
430546 then throw("labs change is allowed only for waves labs")
431547 else WriteSet([DataEntry(getKeyItemStatus(item), CASHOUT)])
432548 }
433549
434550
435551
436552 @Callable(i)
437553 func donate (item,tier,mode,review) = {
438554 let account = toBase58String(i.caller.bytes)
439555 let pmt = extract(i.payment)
440556 if (isDefined(pmt.assetId))
441557 then throw("can use waves only at the moment")
442558 else {
443559 let cnt = (getValueItemAccReviewsCnt(item, account) + 1)
444560 let newnegativefund = (getValueItemFundNegative(item) + ((if ((mode == NEGATIVE))
445561 then 1
446562 else 0) * pmt.amount))
447563 let newpositivefund = (getValueItemFundPositive(item) + ((if ((mode == POSITIVE))
448564 then 1
449565 else 0) * pmt.amount))
450566 if ((getValueItemStatus(item) != FEATURED))
451567 then throw("The project hasn't accepted by community")
452568 else if ((height >= getValueItemCrowdExpiration(item)))
453569 then throw("The time for crowdfunding has expired")
454570 else if ((newnegativefund >= newpositivefund))
455571 then throw("Negative fund can't be higher than positive fund")
456572 else if (if ((mode != POSITIVE))
457573 then (mode != NEGATIVE)
458574 else false)
459575 then throw("Wrong mode parameter")
460576 else if ((getValueItemAuthor(item) == account))
461577 then throw("Can't donate own project")
462578 else if ((pmt.amount != TIERS[(tier - 1)]))
463579 then throw(("The payment must be equal to tier amount: " + toString(TIERS[(tier - 1)])))
464580 else WriteSet([DataEntry(getKeyItemAccReviewsCnt(item, account), cnt), DataEntry(getKeyItemAccFundPositive(item, account), (getValueItemAccFundPositive(item, account) + ((if ((mode == POSITIVE))
465581 then 1
466582 else 0) * pmt.amount))), DataEntry(getKeyItemAccFundNegative(item, account), (getValueItemAccFundNegative(item, account) + ((if ((mode == NEGATIVE))
467583 then 1
468584 else 0) * pmt.amount))), DataEntry(getKeyItemFundPositive(item), newpositivefund), DataEntry(getKeyItemFundNegative(item), newnegativefund), DataEntry(getKeyItemAccReviewText(item, account, toString(cnt)), review), DataEntry(getKeyItemAccReviewMode(item, account, toString(cnt)), mode), DataEntry(getKeyItemAccReviewTier(item, account, toString(cnt)), tier)])
469585 }
470586 }
471587
472588
473589
474590 @Callable(i)
475591 func whale (item) = {
476592 let account = toBase58String(i.caller.bytes)
477593 let pmt = extract(i.payment)
478594 if (isDefined(pmt.assetId))
479595 then throw("can use waves only at the moment")
480596 else if ((account != LABS))
481597 then throw("labs donation is allowed only for waves labs")
482598 else if ((getValueItemStatus(item) != FEATURED))
483599 then throw("The project hasn't accepted by community")
484600 else if ((getValueItemCrowdExpiration(item) > height))
485601 then throw("The time for crowdfunding has not expired yet")
486602 else if ((height > getValueItemWhaleExpiration(item)))
487603 then throw("The time for grant has expired")
488604 else if ((getValueItemStatus(item) == BUYOUT))
489605 then throw("Investement has already done")
490606 else if ((pmt.amount != ((getValueItemFundPositive(item) * MULTIPLIER) / 100)))
491607 then throw((("Investement must be more than " + toString(MULTIPLIER)) + "% of supportes funds"))
492608 else WriteSet([DataEntry(getKeyItemStatus(item), BUYOUT), DataEntry(getKeyBalance(getValueItemAuthor(item)), (getValueBalance(getValueItemAuthor(item)) + getValueItemFundPositive(item))), DataEntry(getKeyItemBuyoutAmount(item), pmt.amount), DataEntry(getKeyItemAccFinal(item, getValueItemAuthor(item)), CLAIMED)])
493609 }
494610
495611
496612
497613 @Callable(i)
498614 func claimwinnings (item,account) = {
499615 let status = getValueItemStatus(item)
500616 let isbayout = if ((status == BUYOUT))
501617 then 1
502618 else 0
503619 let iscrowdf = if ((status != BUYOUT))
504620 then 1
505621 else 0
506622 let positivefund = (getValueItemFundPositive(item) - getValueItemAccFundPositive(item, LABS))
507623 let negativefund = getValueItemFundNegative(item)
508624 let share = (((isbayout * (getValueItemAccFundPositive(item, account) * 100)) / (if ((0 >= positivefund))
509625 then 1
510626 else positivefund)) + ((iscrowdf * (getValueItemAccFundNegative(item, account) * 100)) / (if ((0 >= negativefund))
511627 then 1
512628 else negativefund)))
513629 let tmpnegwin = ((negativefund * MULTIPLIER) / 100)
514630 let betprofit = ((isbayout * ((share * negativefund) / 100)) + (iscrowdf * ((share * (if ((positivefund > tmpnegwin))
515631 then tmpnegwin
516632 else positivefund)) / 100)))
517633 let roiprofit = (isbayout * ((getValueItemAccFundPositive(item, account) * MULTIPLIER) / 100))
518634 let authorprofit = ((iscrowdf * (if ((getValueItemAuthor(item) == account))
519635 then 1
520636 else 0)) * (if ((positivefund > tmpnegwin))
521637 then (positivefund - tmpnegwin)
522638 else 0))
523639 if ((toString(i.caller) != LABS))
524640 then throw("caller error")
525641 else if ((status == DELISTED))
526642 then throw("The project hasn't accepted by community")
527643 else if ((account == LABS))
528644 then throw("account error")
529645 else if ((getValueItemAccFinal(item, account) == CLAIMED))
530646 then throw("Status is claimed")
531647 else if (if (if ((roiprofit == 0))
532648 then (betprofit == 0)
533649 else false)
534650 then (authorprofit == 0)
535651 else false)
536652 then throw("The share equals zero")
537653 else if (if ((status != BUYOUT))
538654 then (getValueItemWhaleExpiration(item) >= height)
539655 else false)
540656 then throw("The time for grant has not expired yet")
541657 else if ((0 >= (positivefund + negativefund)))
542658 then throw("The campaign wasn't active")
543659 else WriteSet([DataEntry(getKeyBalance(account), (((getValueBalance(account) + betprofit) + roiprofit) + authorprofit)), DataEntry(getKeyItemAccFinal(item, account), CLAIMED)])
544660 }
545661
546662
547663
548664 @Callable(i)
665+func addPage (id,data,admins,members) = {
666+ let account = toString(i.caller)
667+ let pmt = extract(i.payment)
668+ if (isDefined(pmt.assetId))
669+ then throw("can use waves only at the moment")
670+ else if ((getValuePageOwner(id) != NONE))
671+ then throw("Page already exist")
672+ else WriteSet([DataEntry(getKeyPage(id), data), DataEntry(getKeyPageOwner(id), account), DataEntry(getKeyPageAdmins(id), admins), DataEntry(getKeyPageMembers(id), members)])
673+ }
674+
675+
676+
677+@Callable(i)
678+func updatePage (id,newData,newAdmins,newMembers) = {
679+ let account = toString(i.caller)
680+ let admins = getValuePageAdmins(id)
681+ let owner = getValuePageOwner(id)
682+ if (if (!(containsInJsonArray(account, admins)))
683+ then (owner != account)
684+ else false)
685+ then throw("permission denied")
686+ else if ((getValuePageOwner(id) == NONE))
687+ then throw("Page not exist")
688+ else WriteSet([DataEntry(getKeyPage(id), newData), DataEntry(getKeyPageAdmins(id), newAdmins), DataEntry(getKeyPageMembers(id), newMembers)])
689+ }
690+
691+
692+
693+@Callable(i)
549694 func transfer (account) = {
550695 let pmt = extract(i.payment)
551696 if (isDefined(pmt.assetId))
552697 then throw("can use waves only at the moment")
553698 else TransferSet([ScriptTransfer(addressFromStringValue(account), pmt.amount, unit)])
554699 }
555700
556701

github/deemru/w8io/6500d08 
305.89 ms