tx · 66pcj3acSVMXNHPw3LZpmT4RJSnAraBUawryhSkn4vjh

3MtA8ddCQT44GtMfUj9XgzPeZvzY52kofKK:  -0.01400000 Waves

2021.08.15 04:53 [1658843] smart account 3MtA8ddCQT44GtMfUj9XgzPeZvzY52kofKK > SELF 0.00000000 Waves

{ "type": 13, "id": "66pcj3acSVMXNHPw3LZpmT4RJSnAraBUawryhSkn4vjh", "fee": 1400000, "feeAssetId": null, "timestamp": 1628992397200, "version": 2, "chainId": 84, "sender": "3MtA8ddCQT44GtMfUj9XgzPeZvzY52kofKK", "senderPublicKey": "FHpHpSeEJhz3pVGgYuLDVj7fesP8NNRAMtG9Kh8EQevE", "proofs": [ "4J1QbTeABduXcUVyzzTHcigvWmKsxL5wVHA1nD9QsQms1E8hQf161ZPG8fFUhdD9JDL3t4KehrQRqVYqqc228aHz" ], "script": "base64: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Y2hhc2UCAAAAB19hbW91bnQBAAAAF2dldEtleVB1cmNoYXNlVGltZXN0YW1wAAAAAQAAAAhwdXJjaGFzZQkAASwAAAACBQAAAAhwdXJjaGFzZQIAAAAKX3RpbWVzdGFtcAEAAAAVZ2V0S2V5UHVyY2hhc2VBc3NldElkAAAAAQAAAAhwdXJjaGFzZQkAASwAAAACBQAAAAhwdXJjaGFzZQIAAAAIX2Fzc2V0SWQBAAAAFmdldEtleVB1cmNoYXNlRnVuZFBhaWQAAAABAAAACHB1cmNoYXNlCQABLAAAAAIFAAAACHB1cmNoYXNlAgAAAAlfZnVuZHBhaWQBAAAAFGdldEtleUNvdXBvblB1cmNoYXNlAAAAAQAAAAdhc3NldElkCQABLAAAAAIJAAEsAAAAAgIAAAAHY291cG9uXwUAAAAHYXNzZXRJZAIAAAAJX3B1cmNoYXNlAQAAABBnZXRLZXlDb3Vwb25JdGVtAAAAAQAAAAdhc3NldElkCQABLAAAAAIJAAEsAAAAAgIAAAAHY291cG9uXwUAAAAHYXNzZXRJZAIAAAAFX2l0ZW0BAAAAF2dldFZhbHVlU3VwcGxpZXJCYWxhbmNlAAAAAQAAAAhzdXBwbGllcgkBAAAAD2dldEludGVnZXJCeUtleQAAAAEJAQAAABVnZXRLZXlTdXBwbGllckJhbGFuY2UAAAABBQAAAAhzdXBwbGllcgEAAAAXZ2V0VmFsdWVVc2VySXRlbUNvdW50ZXIAAAACAAAABHVzZXIAAAAEaXRlbQkBAAAAD2dldEludGVnZXJCeUtleQAAAAEJAQAAABVnZXRLZXlVc2VySXRlbUNvdW50ZXIAAAACBQAAAAR1c2VyBQAAAARpdGVtAQAAABZnZXRWYWx1ZVB1cmNoYXNlU3RhdHVzAAAAAQAAAAhwdXJjaGFzZQkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAFGdldEtleVB1cmNoYXNlU3RhdHVzAAAAAQUAAAAIcHVyY2hhc2UBAAAAFGdldFZhbHVlUHVyY2hhc2VJdGVtAAAAAQAAAAhwdXJjaGFzZQkBAAAAEUBleHRyTmF0aXZlKDEwNTMpAAAAAgUAAAAEdGhpcwkBAAAAEmdldEtleVB1cmNoYXNlSXRlbQAAAAEFAAAACHB1cmNoYXNlAQAAABhnZXRWYWx1ZVB1cmNoYXNlU3VwcGxpZXIAAAABAAAACHB1cmNoYXNlCQEAAAARQGV4dHJOYXRpdmUoMTA1MykAAAACBQAAAAR0aGlzCQEAAAAWZ2V0S2V5UHVyY2hhc2VTdXBwbGllcgAAAAEFAAAACHB1cmNoYXNlAQAAABRnZXRWYWx1ZVB1cmNoYXNlVXNlcgAAAAEAAAAIcHVyY2hhc2UJAQAAABFAZXh0ck5hdGl2ZSgxMDUzKQAAAAIFAAAABHRoaXMJAQAAABJnZXRLZXlQdXJjaGFzZVVzZXIAAAABBQAAAAhwdXJjaGFzZQEAAAAWZ2V0VmFsdWVQdXJjaGFzZUFtb3VudAAAAAEAAAAIcHVyY2hhc2UJAQAAABFAZXh0ck5hdGl2ZSgxMDUwKQAAAAIFAAAABHRoaXMJAQAAABRnZXRLZXlQdXJjaGFzZUFtb3VudAAAAAEFAAAACHB1cmNoYXNlAQAAABlnZXRWYWx1ZVB1cmNoYXNlVGltZXN0YW1wAAAAAQAAAAhwdXJjaGFzZQkBAAAAD2dldEludGVnZXJCeUtleQAAAAEJAQAAABdnZXRLZXlQdXJjaGFzZVRpbWVzdGFtcAAAAAEFAAAACHB1cmNoYXNlAQAAABdnZXRWYWx1ZVB1cmNoYXNlQXNzZXRJZAAAAAEAAAAIcHVyY2hhc2UJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABVnZXRLZXlQdXJjaGFzZUFzc2V0SWQAAAABBQAAAAhwdXJjaGFzZQEAAAAYZ2V0VmFsdWVQdXJjaGFzZUZ1bmRQYWlkAAAAAQAAAAhwdXJjaGFzZQkBAAAAD2dldEJvb2xlYW5CeUtleQAAAAEJAQAAABZnZXRLZXlQdXJjaGFzZUZ1bmRQYWlkAAAAAQUAAAAIcHVyY2hhc2UBAAAAEWdldFZhbHVlSXRlbVByaWNlAAAAAQAAAARpdGVtCQEAAAARQGV4dHJOYXRpdmUoMTA1MCkAAAACBQAAAAR0aGlzCQEAAAAPZ2V0S2V5SXRlbVByaWNlAAAAAQUAAAAEaXRlbQEAAAAUZ2V0VmFsdWVJdGVtU3VwcGxpZXIAAAABAAAABGl0ZW0JAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAABJnZXRLZXlJdGVtU3VwcGxpZXIAAAABBQAAAARpdGVtAQAAABZnZXRWYWx1ZUl0ZW1FeHBpcmVUaW1lAAAAAQAAAARpdGVtCQEAAAAPZ2V0SW50ZWdlckJ5S2V5AAAAAQkBAAAAFGdldEtleUl0ZW1FeHBpcmVEYXRlAAAAAQUAAAAEaXRlbQEAAAARZ2V0VmFsdWVJdGVtVGl0bGUAAAABAAAABGl0ZW0JAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAA9nZXRLZXlJdGVtVGl0bGUAAAABBQAAAARpdGVtAQAAABdnZXRWYWx1ZUl0ZW1Tb2xkQ291bnRlcgAAAAEAAAAEaXRlbQkBAAAAD2dldEludGVnZXJCeUtleQAAAAEJAQAAABVnZXRLZXlJdGVtU29sZENvdW50ZXIAAAABBQAAAARpdGVtAQAAABNnZXRWYWx1ZUl0ZW1SZW1vdmVkAAAAAQAAAARpdGVtCQEAAAAPZ2V0Qm9vbGVhbkJ5S2V5AAAAAQkBAAAAEWdldEtleUl0ZW1SZW1vdmVkAAAAAQUAAAAEaXRlbQEAAAAWZ2V0VmFsdWVDb3Vwb25QdXJjaGFzZQAAAAEAAAAHYXNzZXRJZAkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAAFGdldEtleUNvdXBvblB1cmNoYXNlAAAAAQUAAAAHYXNzZXRJZAEAAAAOZ2V0VmFsdWVDb21taXQAAAACAAAABGl0ZW0AAAAEdXNlcgkBAAAADmdldFN0cmluZ0J5S2V5AAAAAQkBAAAADGdldEtleUNvbW1pdAAAAAIFAAAABGl0ZW0FAAAABHVzZXIBAAAAFGdldFZhbHVlQ29tbWl0c0NvdW50AAAAAQAAAARpdGVtCQEAAAAPZ2V0SW50ZWdlckJ5S2V5AAAAAQkBAAAAEmdldEtleUNvbW1pdHNDb3VudAAAAAEFAAAABGl0ZW0BAAAADmdldFZhbHVlUmV2ZWFsAAAAAgAAAARpdGVtAAAABHVzZXIJAQAAAA5nZXRTdHJpbmdCeUtleQAAAAEJAQAAAAxnZXRLZXlSZXZlYWwAAAACBQAAAARpdGVtBQAAAAR1c2VyAQAAABZnZXRWYWx1ZUl0ZW1Wb3RlU3RhdHVzAAAAAQAAAARpdGVtCQEAAAAOZ2V0U3RyaW5nQnlLZXkAAAABCQEAAAAUZ2V0S2V5SXRlbVZvdGVTdGF0dXMAAAABBQAAAARpdGVtAQAAABRnZXRWYWx1ZUl0ZW1GZWF0dXJlZAAAAAEAAAAEaXRlbQkBAAAAD2dldEJvb2xlYW5CeUtleQAAAAEJAQAAABJnZXRLZXlJdGVtRmVhdHVyZWQAAAABBQAAAARpdGVtAQAAABJnZXRWYWx1ZVZvdGVzQ291bnQAAAACAAAABGl0ZW0AAAAEdm90ZQkBAAAAD2dldEludGVnZXJCeUtleQAAAAEJAQAAABBnZXRLZXlWb3Rlc0NvdW50AAAAAgUAAAAEaXRlbQUAAAAEdm90ZQAAAAsAAAABaQEAAAAQcmVnaXN0ZXJTdXBwbGllcgAAAAEAAAAEZGF0YQQAAAAIc3VwcGxpZXIJAAJYAAAAAQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwQAAAAHYWNjb3VudAkBAAAAEmdldFN1cHBsaWVyQWNjb3VudAAAAAEFAAAACHN1cHBsaWVyAwkBAAAAAiE9AAAAAgUAAAAHYWNjb3VudAUAAAAETk9ORQkAAAIAAAABAgAAAC5UaGlzIGFkZHJlc3MgaGFzIGFscmVhZHkgcmVnaXN0cmVkIGFzIHN1cHBsaWVyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABVnZXRLZXlTdXBwbGllckFjY291bnQAAAABBQAAAAhzdXBwbGllcgUAAAAEZGF0YQUAAAADbmlsAAAAAWkBAAAAB2FkZEl0ZW0AAAAEAAAABXRpdGxlAAAABXByaWNlAAAABGRhdGEAAAAGZXhwaXJlBAAAAAhzdXBwbGllcgkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAAdhY2NvdW50CQEAAAASZ2V0U3VwcGxpZXJBY2NvdW50AAAAAQUAAAAIc3VwcGxpZXIEAAAABGl0ZW0JAQAAAApnZXRLZXlJdGVtAAAAAgUAAAAIc3VwcGxpZXIFAAAABXRpdGxlAwkAAAAAAAACBQAAAAdhY2NvdW50BQAAAAROT05FCQAAAgAAAAECAAAALllvdSBzaG91bGQgcmVnaXN0ZXIgYXMgc3VwcGxpZXIgdG8gYWRkIGFuIGl0ZW0DCQAAZwAAAAIAAAAAAAAAAAAFAAAABXByaWNlCQAAAgAAAAECAAAALlB1cmNoYXNlIGFtb3VudCBjYW5ub3QgYmUgbGVzcyB0aGFuIGl0ZW0gcHJpY2UDCQEAAAACIT0AAAACCQEAAAAUZ2V0VmFsdWVJdGVtU3VwcGxpZXIAAAABBQAAAARpdGVtBQAAAAROT05FCQAAAgAAAAECAAAAFkFuIGl0ZW0gYWxyZWFkeSBleGlzdHMJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEmdldEtleUl0ZW1TdXBwbGllcgAAAAEFAAAABGl0ZW0FAAAACHN1cHBsaWVyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA9nZXRLZXlJdGVtVGl0bGUAAAABBQAAAARpdGVtBQAAAAV0aXRsZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAD2dldEtleUl0ZW1QcmljZQAAAAEFAAAABGl0ZW0FAAAABXByaWNlCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAA5nZXRLZXlJdGVtRGF0YQAAAAEFAAAABGl0ZW0FAAAABGRhdGEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABRnZXRLZXlJdGVtRXhwaXJlRGF0ZQAAAAEFAAAABGl0ZW0FAAAABmV4cGlyZQkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgkBAAAAEmdldEtleUl0ZW1GZWF0dXJlZAAAAAEFAAAABGl0ZW0GBQAAAANuaWwAAAABaQEAAAAKdXBkYXRlSXRlbQAAAAUAAAAEaXRlbQAAAAV0aXRsZQAAAAVwcmljZQAAAARkYXRhAAAABmV4cGlyZQQAAAAIc3VwcGxpZXIJAAJYAAAAAQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwQAAAAHYWNjb3VudAkBAAAAEmdldFN1cHBsaWVyQWNjb3VudAAAAAEFAAAACHN1cHBsaWVyBAAAAAxpdGVtU3VwcGxpZXIJAQAAABRnZXRWYWx1ZUl0ZW1TdXBwbGllcgAAAAEFAAAABGl0ZW0EAAAACG5vdEZvdW5kAwkAAAAAAAACCQEAAAARZ2V0VmFsdWVJdGVtVGl0bGUAAAABBQAAAARpdGVtBQAAAAROT05FBgkAAAAAAAACCQEAAAATZ2V0VmFsdWVJdGVtUmVtb3ZlZAAAAAEFAAAABGl0ZW0GAwkAAAAAAAACBQAAAAdhY2NvdW50BQAAAAROT05FCQAAAgAAAAECAAAAMVlvdSBzaG91bGQgcmVnaXN0ZXIgYXMgc3VwcGxpZXIgdG8gcmVtb3ZlIGFuIGl0ZW0DBQAAAAhub3RGb3VuZAkAAAIAAAABCQABLAAAAAICAAAAKUl0ZW0gZG9lcyBub3QgZXhpc3RzIG9yIGhhcyBiZWVuIHJlbW92ZWQgBQAAAARpdGVtAwkBAAAAAiE9AAAAAgUAAAAIc3VwcGxpZXIFAAAADGl0ZW1TdXBwbGllcgkAAAIAAAABCQABLAAAAAICAAAAFVlvdSBkb24ndCBvd25lZCBpdGVtIAUAAAAEaXRlbQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAPZ2V0S2V5SXRlbVRpdGxlAAAAAQUAAAAEaXRlbQUAAAAFdGl0bGUJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAA9nZXRLZXlJdGVtUHJpY2UAAAABBQAAAARpdGVtBQAAAAVwcmljZQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAOZ2V0S2V5SXRlbURhdGEAAAABBQAAAARpdGVtBQAAAARkYXRhCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAUZ2V0S2V5SXRlbUV4cGlyZURhdGUAAAABBQAAAARpdGVtBQAAAAZleHBpcmUFAAAAA25pbAAAAAFpAQAAAApyZW1vdmVJdGVtAAAAAQAAAARpdGVtBAAAAAhzdXBwbGllcgkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAAdhY2NvdW50CQEAAAASZ2V0U3VwcGxpZXJBY2NvdW50AAAAAQUAAAAIc3VwcGxpZXIEAAAADGl0ZW1TdXBwbGllcgkBAAAAFGdldFZhbHVlSXRlbVN1cHBsaWVyAAAAAQUAAAAEaXRlbQQAAAAIbm90Rm91bmQDCQAAAAAAAAIJAQAAABFnZXRWYWx1ZUl0ZW1UaXRsZQAAAAEFAAAABGl0ZW0FAAAABE5PTkUGCQAAAAAAAAIJAQAAABNnZXRWYWx1ZUl0ZW1SZW1vdmVkAAAAAQUAAAAEaXRlbQYDCQAAAAAAAAIFAAAAB2FjY291bnQFAAAABE5PTkUJAAACAAAAAQIAAAAxWW91IHNob3VsZCByZWdpc3RlciBhcyBzdXBwbGllciB0byByZW1vdmUgYW4gaXRlbQMFAAAACG5vdEZvdW5kCQAAAgAAAAEJAAEsAAAAAgIAAAApSXRlbSBkb2VzIG5vdCBleGlzdHMgb3IgaGFzIGJlZW4gcmVtb3ZlZCAFAAAABGl0ZW0DCQEAAAACIT0AAAACBQAAAAhzdXBwbGllcgUAAAAMaXRlbVN1cHBsaWVyCQAAAgAAAAEJAAEsAAAAAgIAAAAVWW91IGRvbid0IG93bmVkIGl0ZW0gBQAAAARpdGVtBAAAAAtzb2xkQ291bnRlcgkBAAAAF2dldFZhbHVlSXRlbVNvbGRDb3VudGVyAAAAAQUAAAAEaXRlbQMJAAAAAAAAAgUAAAALc29sZENvdW50ZXIAAAAAAAAAAAAJAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAEmdldEtleUl0ZW1TdXBwbGllcgAAAAEFAAAABGl0ZW0JAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAD2dldEtleUl0ZW1UaXRsZQAAAAEFAAAABGl0ZW0JAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAD2dldEtleUl0ZW1QcmljZQAAAAEFAAAABGl0ZW0JAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAADmdldEtleUl0ZW1EYXRhAAAAAQUAAAAEaXRlbQkABEwAAAACCQEAAAALRGVsZXRlRW50cnkAAAABCQEAAAAUZ2V0S2V5SXRlbUV4cGlyZURhdGUAAAABBQAAAARpdGVtCQAETAAAAAIJAQAAAAtEZWxldGVFbnRyeQAAAAEJAQAAABRnZXRLZXlJdGVtVm90ZVN0YXR1cwAAAAEFAAAABGl0ZW0JAARMAAAAAgkBAAAAC0RlbGV0ZUVudHJ5AAAAAQkBAAAAEmdldEtleUl0ZW1GZWF0dXJlZAAAAAEFAAAABGl0ZW0FAAAAA25pbAkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgkBAAAAEWdldEtleUl0ZW1SZW1vdmVkAAAAAQUAAAAEaXRlbQYFAAAAA25pbAAAAAFpAQAAAAhwdXJjaGFzZQAAAAEAAAAEaXRlbQQAAAADcG10CQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAABAAAAAhub3RGb3VuZAMJAAAAAAAAAgkBAAAAEWdldFZhbHVlSXRlbVRpdGxlAAAAAQUAAAAEaXRlbQUAAAAETk9ORQYJAAAAAAAAAgkBAAAAE2dldFZhbHVlSXRlbVJlbW92ZWQAAAABBQAAAARpdGVtBgMFAAAACG5vdEZvdW5kCQAAAgAAAAEJAAEsAAAAAgIAAAApSXRlbSBkb2VzIG5vdCBleGlzdHMgb3IgaGFzIGJlZW4gcmVtb3ZlZCAFAAAABGl0ZW0DCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAAA3BtdAAAAAdhc3NldElkCQAAAgAAAAECAAAAKVlvdSBjYW4gYnV5IHRva2VucyBvbmx5IHdpdGggV2F2ZXMgdG9rZW5zBAAAAAR1c2VyCQACWAAAAAEICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMEAAAABXByaWNlCQEAAAARZ2V0VmFsdWVJdGVtUHJpY2UAAAABBQAAAARpdGVtBAAAAAhzdXBwbGllcgkBAAAAFGdldFZhbHVlSXRlbVN1cHBsaWVyAAAAAQUAAAAEaXRlbQQAAAAGZXhwaXJlCQEAAAAWZ2V0VmFsdWVJdGVtRXhwaXJlVGltZQAAAAEFAAAABGl0ZW0DAwkAAGYAAAACBQAAAAZleHBpcmUAAAAAAAAAAAAJAABnAAAAAggFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAFAAAABmV4cGlyZQcJAAACAAAAAQIAAAAOQ291cG9uIGV4cGlyZWQDCQAAZgAAAAIFAAAABXByaWNlCAUAAAADcG10AAAABmFtb3VudAkAAAIAAAABAgAAAC5QdXJjaGFzZSBhbW91bnQgY2Fubm90IGJlIGxlc3MgdGhhbiBpdGVtIHByaWNlAwkAAGYAAAACCAUAAAADcG10AAAABmFtb3VudAUAAAAFcHJpY2UJAAACAAAAAQIAAAAwUHVyY2hhc2UgYW1vdW50IGNhbm5vdCBiZSBoaWdoZXIgdGhhbiBpdGVtIHByaWNlAwkAAAAAAAACBQAAAAhzdXBwbGllcgUAAAAETk9ORQkAAAIAAAABAgAAABhTdXBwbGllciBkb2VzIG5vdCBleGlzdHMEAAAAEmtleVVzZXJJdGVtQ291bnRlcgkBAAAAFWdldEtleVVzZXJJdGVtQ291bnRlcgAAAAIFAAAABHVzZXIFAAAABGl0ZW0EAAAAD3VzZXJJdGVtQ291bnRlcgkAAGQAAAACCQEAAAAXZ2V0VmFsdWVVc2VySXRlbUNvdW50ZXIAAAACBQAAAAR1c2VyBQAAAARpdGVtAAAAAAAAAAABBAAAAAhwdXJjaGFzZQkBAAAADmdlblB1cmNoYXNlS2V5AAAABAUAAAAIc3VwcGxpZXIFAAAABGl0ZW0FAAAABHVzZXIFAAAAD3VzZXJJdGVtQ291bnRlcgQAAAARa2V5UHVyY2hhc2VTdGF0dXMJAQAAABRnZXRLZXlQdXJjaGFzZVN0YXR1cwAAAAEFAAAACHB1cmNoYXNlBAAAAA9rZXlQdXJjaGFzZUl0ZW0JAQAAABJnZXRLZXlQdXJjaGFzZUl0ZW0AAAABBQAAAAhwdXJjaGFzZQQAAAATa2V5UHVyY2hhc2VTdXBwbGllcgkBAAAAFmdldEtleVB1cmNoYXNlU3VwcGxpZXIAAAABBQAAAAhwdXJjaGFzZQQAAAAPa2V5UHVyY2hhc2VVc2VyCQEAAAASZ2V0S2V5UHVyY2hhc2VVc2VyAAAAAQUAAAAIcHVyY2hhc2UEAAAAEWtleVB1cmNoYXNlQW1vdW50CQEAAAAUZ2V0S2V5UHVyY2hhc2VBbW91bnQAAAABBQAAAAhwdXJjaGFzZQQAAAAUa2V5UHVyY2hhc2VUaW1lc3RhbXAJAQAAABdnZXRLZXlQdXJjaGFzZVRpbWVzdGFtcAAAAAEFAAAACHB1cmNoYXNlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABJrZXlVc2VySXRlbUNvdW50ZXIFAAAAD3VzZXJJdGVtQ291bnRlcgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAABFrZXlQdXJjaGFzZVN0YXR1cwUAAAAIQVBQUk9WQUwJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAPa2V5UHVyY2hhc2VJdGVtBQAAAARpdGVtCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAE2tleVB1cmNoYXNlU3VwcGxpZXIFAAAACHN1cHBsaWVyCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIFAAAAD2tleVB1cmNoYXNlVXNlcgUAAAAEdXNlcgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAARa2V5UHVyY2hhc2VBbW91bnQIBQAAAANwbXQAAAAGYW1vdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABRrZXlQdXJjaGFzZVRpbWVzdGFtcAgFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAFAAAAA25pbAAAAAFpAQAAAA5yZWplY3RQdXJjaGFzZQAAAAEAAAAIcHVyY2hhc2UEAAAABmNhbGxlcgkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAAZzdGF0dXMJAQAAABZnZXRWYWx1ZVB1cmNoYXNlU3RhdHVzAAAAAQUAAAAIcHVyY2hhc2UEAAAACHN1cHBsaWVyCQEAAAAYZ2V0VmFsdWVQdXJjaGFzZVN1cHBsaWVyAAAAAQUAAAAIcHVyY2hhc2UEAAAABGl0ZW0JAQAAABRnZXRWYWx1ZVB1cmNoYXNlSXRlbQAAAAEFAAAACHB1cmNoYXNlBAAAAAhub3RGb3VuZAkAAAAAAAACBQAAAARpdGVtBQAAAAROT05FAwUAAAAIbm90Rm91bmQJAAACAAAAAQkAASwAAAACAgAAABNQdXJjaGFzZSBub3QgZm91bmQgBQAAAAhwdXJjaGFzZQMDCQAAAAAAAAIFAAAACHN1cHBsaWVyBQAAAAROT05FBgkBAAAAAiE9AAAAAgUAAAAGY2FsbGVyBQAAAAhzdXBwbGllcgkAAAIAAAABAgAAACNZb3VyIGFyZSBub3QgdGhlIG93bmVyIG9mIHRoaXMgaXRlbQMJAQAAAAIhPQAAAAIFAAAABnN0YXR1cwUAAAAIQVBQUk9WQUwJAAACAAAAAQIAAAAgWW91IGNhbm5vdCByZWplY3QgdGhpcyBwdXJjaGFzZWQEAAAAEWtleVB1cmNoYXNlU3RhdHVzCQEAAAAUZ2V0S2V5UHVyY2hhc2VTdGF0dXMAAAABBQAAAAhwdXJjaGFzZQQAAAARa2V5UHVyY2hhc2VBbW91bnQJAQAAABRnZXRLZXlQdXJjaGFzZUFtb3VudAAAAAEFAAAACHB1cmNoYXNlBAAAABJrZXlJdGVtU29sZENvdW50ZXIJAQAAABVnZXRLZXlJdGVtU29sZENvdW50ZXIAAAABBQAAAARpdGVtBAAAAAR1c2VyCQEAAAAUZ2V0VmFsdWVQdXJjaGFzZVVzZXIAAAABBQAAAAhwdXJjaGFzZQQAAAAGYW1vdW50CQEAAAAWZ2V0VmFsdWVQdXJjaGFzZUFtb3VudAAAAAEFAAAACHB1cmNoYXNlBAAAAA9zdXBwbGllckJhbGFuY2UJAABlAAAAAgkBAAAAF2dldFZhbHVlU3VwcGxpZXJCYWxhbmNlAAAAAQUAAAAIc3VwcGxpZXIFAAAABmFtb3VudAQAAAAPaXRlbVNvbGRDb3VudGVyCQAAZQAAAAIJAQAAABdnZXRWYWx1ZUl0ZW1Tb2xkQ291bnRlcgAAAAEFAAAABGl0ZW0AAAAAAAAAAAEEAAAAB2FkZHJlc3MJAQAAABFAZXh0ck5hdGl2ZSgxMDYyKQAAAAEFAAAABHVzZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAARa2V5UHVyY2hhc2VTdGF0dXMFAAAACFJFSkVDVEVECQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABFrZXlQdXJjaGFzZUFtb3VudAAAAAAAAAAAAAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAAdhZGRyZXNzBQAAAAZhbW91bnQFAAAABHVuaXQFAAAAA25pbAAAAAFpAQAAAA5hY2NlcHRQdXJjaGFzZQAAAAIAAAAIcHVyY2hhc2UAAAAHYXNzZXRJZAQAAAAGY2FsbGVyCQACWAAAAAEICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMEAAAABnN0YXR1cwkBAAAAFmdldFZhbHVlUHVyY2hhc2VTdGF0dXMAAAABBQAAAAhwdXJjaGFzZQQAAAAIc3VwcGxpZXIJAQAAABhnZXRWYWx1ZVB1cmNoYXNlU3VwcGxpZXIAAAABBQAAAAhwdXJjaGFzZQQAAAAEaXRlbQkBAAAAFGdldFZhbHVlUHVyY2hhc2VJdGVtAAAAAQUAAAAIcHVyY2hhc2UEAAAABmV4cGlyZQkBAAAAFmdldFZhbHVlSXRlbUV4cGlyZVRpbWUAAAABBQAAAARpdGVtBAAAAAhub3RGb3VuZAkAAAAAAAACBQAAAARpdGVtBQAAAAROT05FAwUAAAAIbm90Rm91bmQJAAACAAAAAQkAASwAAAACAgAAABNQdXJjaGFzZSBub3QgZm91bmQgBQAAAAhwdXJjaGFzZQMDCQAAAAAAAAIFAAAACHN1cHBsaWVyBQAAAAROT05FBgkBAAAAAiE9AAAAAgUAAAAGY2FsbGVyBQAAAAhzdXBwbGllcgkAAAIAAAABAgAAACNZb3VyIGFyZSBub3QgdGhlIG93bmVyIG9mIHRoaXMgaXRlbQMJAQAAAAIhPQAAAAIFAAAABnN0YXR1cwUAAAAIQVBQUk9WQUwJAAACAAAAAQIAAAAgWW91IGNhbm5vdCByZWplY3QgdGhpcyBwdXJjaGFzZWQDAwkAAGYAAAACBQAAAAZleHBpcmUAAAAAAAAAAAAJAABnAAAAAggFAAAACWxhc3RCbG9jawAAAAl0aW1lc3RhbXAFAAAABmV4cGlyZQcJAAACAAAAAQIAAAAOQ291cG9uIGV4cGlyZWQEAAAAEWtleVB1cmNoYXNlU3RhdHVzCQEAAAAUZ2V0S2V5UHVyY2hhc2VTdGF0dXMAAAABBQAAAAhwdXJjaGFzZQQAAAASa2V5UHVyY2hhc2VBc3NldElkCQEAAAAVZ2V0S2V5UHVyY2hhc2VBc3NldElkAAAAAQUAAAAIcHVyY2hhc2UEAAAAEmtleVN1cHBsaWVyQmFsYW5jZQkBAAAAFWdldEtleVN1cHBsaWVyQmFsYW5jZQAAAAEFAAAACHN1cHBsaWVyBAAAABJrZXlJdGVtU29sZENvdW50ZXIJAQAAABVnZXRLZXlJdGVtU29sZENvdW50ZXIAAAABBQAAAARpdGVtBAAAABFrZXlDb3Vwb25QdXJjaGFzZQkBAAAAFGdldEtleUNvdXBvblB1cmNoYXNlAAAAAQUAAAAHYXNzZXRJZAQAAAANa2V5Q291cG9uSXRlbQkBAAAAEGdldEtleUNvdXBvbkl0ZW0AAAABBQAAAAdhc3NldElkBAAAAAZhbW91bnQJAQAAABZnZXRWYWx1ZVB1cmNoYXNlQW1vdW50AAAAAQUAAAAIcHVyY2hhc2UE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AQAAABVnZXRLZXlTdXBwbGllckJhbGFuY2UAAAABBQAAAAhzdXBwbGllcgQAAAARa2V5Q291cG9uRnVuZFBhaWQJAQAAABZnZXRLZXlQdXJjaGFzZUZ1bmRQYWlkAAAAAQUAAAAIcHVyY2hhc2UJAARMAAAAAgkBAAAABEJ1cm4AAAACBQAAAAVhc3NldAAAAAAAAAAAAQkABEwAAAACCQEAAAAMQm9vbGVhbkVudHJ5AAAAAgUAAAARa2V5Q291cG9uRnVuZFBhaWQGCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABJrZXlTdXBwbGllckJhbGFuY2UFAAAACm5ld0JhbGFuY2UJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyBQAAAAt3aXRoZHJhd0FtdAUAAAAEdW5pdAUAAAADbmlsAAAAAWkBAAAACHdpdGhkcmF3AAAAAQAAAAdhc3NldElkBAAAAAZjYWxsZXIJAAJYAAAAAQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwQAAAAHYWNjb3VudAkBAAAAEmdldFN1cHBsaWVyQWNjb3VudAAAAAEFAAAABmNhbGxlcgMJAAAAAAAAAgUAAAAHYWNjb3VudAUAAAAETk9ORQkAAAIAAAABAgAAACFZb3UgYXJlIG5vdCByZWdpc3RyZWQgYXMgc3VwcGxpZXIEAAAACHB1cmNoYXNlCQEAAAAWZ2V0VmFsdWVDb3Vwb25QdXJjaGFzZQAAAAEFAAAAB2Fzc2V0SWQEAAAACHN1cHBsaWVyCQEAAAAYZ2V0VmFsdWVQdXJjaGFzZVN1cHBsaWVyAAAAAQUAAAAIcHVyY2hhc2UEAAAACmlzZnVuZFBhaWQJAQAAABhnZXRWYWx1ZVB1cmNoYXNlRnVuZFBhaWQAAAABBQAAAAhwdXJjaGFzZQMJAQAAAAIhPQAAAAIFAAAABmNhbGxlcgUAAAAIc3VwcGxpZXIJAAACAAAAAQIAAAApWW91ciBhcmUgbm90IHRoZSBzdXBwbGllciBmb3IgdGhpcyBjb3Vwb24DBQAAAAppc2Z1bmRQYWlkCQAAAgAAAAECAAAAGkZ1bmQgaGFzIGFscmVhZHkgYmVlbiBwYWlkBAAAAARpdGVtCQEAAAAUZ2V0VmFsdWVQdXJjaGFzZUl0ZW0AAAABBQAAAAhwdXJjaGFzZQQAAAAGZXhwaXJlCQEAAAAWZ2V0VmFsdWVJdGVtRXhwaXJlVGltZQAAAAEFAAAABGl0ZW0EAAAABGluZm8EAAAAByRtYXRjaDAJAAPsAAAAAQkAAlkAAAABBQAAAAdhc3NldElkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAVBc3NldAQAAAABYQUAAAAHJG1hdGNoMAUAAAABYQkAAAIAAAABAgAAABZDYW5ub3QgZmluZCBhc3NldCBpbmZvBAAAAAtjYW5XaXRoZHJhdwMDCQAAZgAAAAIFAAAABmV4cGlyZQAAAAAAAAAAAAkAAGcAAAACCAUAAAAJbGFzdEJsb2NrAAAACXRpbWVzdGFtcAUAAAAGZXhwaXJlBwYDCQAAAAAAAAIIBQAAAARpbmZvAAAACHF1YW50aXR5AAAAAAAAAAAABgcDCQEAAAABIQAAAAEFAAAAC2NhbldpdGhkcmF3CQAAAgAAAAECAAAAHFRoaXMgY291cG9uIGNhbm5vdCBiZSBmdW5kZWQEAAAAB2JhbGFuY2UJAQAAABdnZXRWYWx1ZVN1cHBsaWVyQmFsYW5jZQAAAAEFAAAACHN1cHBsaWVyBAAAAAZhbW91bnQJAQAAABZnZXRWYWx1ZVB1cmNoYXNlQW1vdW50AAAAAQUAAAAIcHVyY2hhc2UEAAAAC3dpdGhkcmF3QW10AwkAAGcAAAACAAAAAAAAAAAACQAAZQAAAAIFAAAAB2JhbGFuY2UFAAAABmFtb3VudAUAAAAHYmFsYW5jZQUAAAAGYW1vdW50BAAAAApuZXdCYWxhbmNlCQAAZQAAAAIFAAAAB2JhbGFuY2UFAAAAC3dpdGhkcmF3QW10AwkAAGYAAAACAAAAAAAAAAAABQAAAApuZXdCYWxhbmNlCQAAAgAAAAECAAAAHE5vdCBlbm91Z2ggZnVuZHMgdG8gd2l0aGRyYXcEAAAAEmtleVN1cHBsaWVyQmFsYW5jZQkBAAAAFWdldEtleVN1cHBsaWVyQmFsYW5jZQAAAAEFAAAACHN1cHBsaWVyBAAAABFrZXlDb3Vwb25GdW5kUGFpZAkBAAAAFmdldEtleVB1cmNoYXNlRnVuZFBhaWQAAAABBQAAAAhwdXJjaGFzZQkABEwA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", "height": 1658843, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 5jK4dufuVnWu2wM7ckf2VStFCxcW2YgHhUZhnfduamMZ Next: 4K1he3JSjGCCmZsCmFTn1eH8oBs9XmDmVbgYGhqrTQNm Diff:
OldNewDifferences
8787 func getKeyReveal (item,user) = (((item + "_") + user) + "_reveal")
8888
8989
90-func getKeyItemStatus (item) = (item + "_status")
90+func getKeyItemVoteStatus (item) = (item + "_status")
91+
92+
93+func getKeyItemFeatured (item) = (item + "_featured")
9194
9295
9396 func getKeyVotesCount (item,vote) = ((item + "_res:") + vote)
192195 func getValueReveal (item,user) = getStringByKey(getKeyReveal(item, user))
193196
194197
195-func getValueItemStatus (item) = getStringByKey(getKeyItemStatus(item))
198+func getValueItemVoteStatus (item) = getStringByKey(getKeyItemVoteStatus(item))
199+
200+
201+func getValueItemFeatured (item) = getBooleanByKey(getKeyItemFeatured(item))
196202
197203
198204 func getValueVotesCount (item,vote) = getIntegerByKey(getKeyVotesCount(item, vote))
220226 then throw("Purchase amount cannot be less than item price")
221227 else if ((getValueItemSupplier(item) != NONE))
222228 then throw("An item already exists")
223- else [StringEntry(getKeyItemSupplier(item), supplier), StringEntry(getKeyItemTitle(item), title), IntegerEntry(getKeyItemPrice(item), price), StringEntry(getKeyItemData(item), data), IntegerEntry(getKeyItemExpireDate(item), expire)]
229+ else [StringEntry(getKeyItemSupplier(item), supplier), StringEntry(getKeyItemTitle(item), title), IntegerEntry(getKeyItemPrice(item), price), StringEntry(getKeyItemData(item), data), IntegerEntry(getKeyItemExpireDate(item), expire), BooleanEntry(getKeyItemFeatured(item), true)]
224230 }
225231
226232
261267 else {
262268 let soldCounter = getValueItemSoldCounter(item)
263269 if ((soldCounter == 0))
264- then [DeleteEntry(getKeyItemSupplier(item)), DeleteEntry(getKeyItemTitle(item)), DeleteEntry(getKeyItemPrice(item)), DeleteEntry(getKeyItemData(item)), DeleteEntry(getKeyItemExpireDate(item))]
270+ then [DeleteEntry(getKeyItemSupplier(item)), DeleteEntry(getKeyItemTitle(item)), DeleteEntry(getKeyItemPrice(item)), DeleteEntry(getKeyItemData(item)), DeleteEntry(getKeyItemExpireDate(item)), DeleteEntry(getKeyItemVoteStatus(item)), DeleteEntry(getKeyItemFeatured(item))]
265271 else [BooleanEntry(getKeyItemRemoved(item), true)]
266272 }
267273 }
478484 func voteCommit (item,hash) = {
479485 let user = toBase58String(i.caller.bytes)
480486 let commitsCount = getValueCommitsCount(item)
481- let status = getValueItemStatus(item)
487+ let status = getValueItemVoteStatus(item)
482488 if ((commitsCount >= VOTERS))
483489 then throw("Reached max number of voters")
484490 else if ((getValueCommit(item, user) != NONE))
493499 let newStatus = if ((commitsCount == VOTERS))
494500 then REVEAL
495501 else VOTING
496-[StringEntry(getKeyCommit(item, user), hash), IntegerEntry(getKeyCommitsCount(item), (commitsCount + 1)), StringEntry(getKeyItemStatus(item), newStatus)]
502+[StringEntry(getKeyCommit(item, user), hash), IntegerEntry(getKeyCommitsCount(item), (commitsCount + 1)), StringEntry(getKeyItemVoteStatus(item), newStatus)]
497503 }
498504 }
499505
502508 @Callable(i)
503509 func voteReveal (item,vote,salt) = {
504510 let user = toBase58String(i.caller.bytes)
505- let status = getValueItemStatus(item)
511+ let status = getValueItemVoteStatus(item)
506512 let newVotesCount = (getValueVotesCount(item, vote) + 1)
507513 let saltedVote = toBase58String(sha256(toBytes(((item + vote) + salt))))
508514 if ((saltedVote != getValueCommit(item, user)))
519525 then (vote != DELISTED)
520526 else false)
521527 then throw("Provided voting option is incorrect")
522- else {
523- let newStatus = if ((newVotesCount >= QUORUM))
524- then vote
525- else REVEAL
526-[StringEntry(getKeyReveal(item, user), vote), IntegerEntry(getKeyVotesCount(item, user), newVotesCount), StringEntry(getKeyItemStatus(item), newStatus)]
527- }
528+ else if ((newVotesCount >= QUORUM))
529+ then {
530+ let featured = if ((vote == FEATURED))
531+ then true
532+ else false
533+[StringEntry(getKeyReveal(item, user), vote), IntegerEntry(getKeyVotesCount(item, vote), newVotesCount), BooleanEntry(getKeyItemFeatured(item), featured), DeleteEntry(getKeyItemVoteStatus(item))]
534+ }
535+ else [StringEntry(getKeyReveal(item, user), vote), IntegerEntry(getKeyVotesCount(item, vote), newVotesCount), StringEntry(getKeyItemVoteStatus(item), REVEAL)]
528536 }
529537
530538
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let NONE = "NONE"
55
66 let VOTERS = 3
77
88 let QUORUM = 2
99
1010 let FEATURED = "featured"
1111
1212 let DELISTED = "delisted"
1313
1414 let VOTING = "voting"
1515
1616 let REVEAL = "reveal"
1717
1818 let APPROVAL = "approval"
1919
2020 let REJECTED = "rejected"
2121
2222 let ACCEPTED = "accepted"
2323
2424 func getStringByKey (key) = match getString(this, key) {
2525 case a: String =>
2626 a
2727 case _ =>
2828 NONE
2929 }
3030
3131
3232 func getIntegerByKey (key) = match getInteger(this, key) {
3333 case a: Int =>
3434 a
3535 case _ =>
3636 0
3737 }
3838
3939
4040 func getBooleanByKey (key) = match getBoolean(this, key) {
4141 case a: Boolean =>
4242 a
4343 case _ =>
4444 false
4545 }
4646
4747
4848 func getKeySupplierAccount (account) = (account + "_account")
4949
5050
5151 func getSupplierAccount (account) = getStringByKey(getKeySupplierAccount(account))
5252
5353
5454 func getKeyItem (supplier,title) = {
5555 let supplierTitle = (supplier + title)
5656 ("item_" + toBase58String(sha256(toBytes(supplierTitle))))
5757 }
5858
5959
6060 func getKeyItemSupplier (item) = (item + "_owner")
6161
6262
6363 func getKeyItemTitle (item) = (item + "_title")
6464
6565
6666 func getKeyItemPrice (item) = (item + "_price")
6767
6868
6969 func getKeyItemData (item) = (item + "_data")
7070
7171
7272 func getKeyItemExpireDate (item) = (item + "_expiredate")
7373
7474
7575 func getKeyItemSoldCounter (item) = (item + "_sold")
7676
7777
7878 func getKeyItemRemoved (item) = (item + "_removed")
7979
8080
8181 func getKeyCommit (item,user) = (((item + "_") + user) + "_commit")
8282
8383
8484 func getKeyCommitsCount (item) = (item + "_cmtcnt")
8585
8686
8787 func getKeyReveal (item,user) = (((item + "_") + user) + "_reveal")
8888
8989
90-func getKeyItemStatus (item) = (item + "_status")
90+func getKeyItemVoteStatus (item) = (item + "_status")
91+
92+
93+func getKeyItemFeatured (item) = (item + "_featured")
9194
9295
9396 func getKeyVotesCount (item,vote) = ((item + "_res:") + vote)
9497
9598
9699 func getKeySupplierBalance (supplier) = (supplier + "_balance")
97100
98101
99102 func getKeyUserItemCounter (user,item) = (((user + "_") + item) + "_counter")
100103
101104
102105 func genPurchaseKey (supplier,item,user,counter) = ("purchase_" + toBase58String(sha256(toBytes(((((((supplier + "_") + item) + "_") + user) + "_") + toString(counter))))))
103106
104107
105108 func getKeyPurchaseStatus (purchase) = (purchase + "_status")
106109
107110
108111 func getKeyPurchaseItem (purchase) = (purchase + "_item")
109112
110113
111114 func getKeyPurchaseSupplier (purchase) = (purchase + "_supplier")
112115
113116
114117 func getKeyPurchaseUser (purchase) = (purchase + "_user")
115118
116119
117120 func getKeyPurchaseAmount (purchase) = (purchase + "_amount")
118121
119122
120123 func getKeyPurchaseTimestamp (purchase) = (purchase + "_timestamp")
121124
122125
123126 func getKeyPurchaseAssetId (purchase) = (purchase + "_assetId")
124127
125128
126129 func getKeyPurchaseFundPaid (purchase) = (purchase + "_fundpaid")
127130
128131
129132 func getKeyCouponPurchase (assetId) = (("coupon_" + assetId) + "_purchase")
130133
131134
132135 func getKeyCouponItem (assetId) = (("coupon_" + assetId) + "_item")
133136
134137
135138 func getValueSupplierBalance (supplier) = getIntegerByKey(getKeySupplierBalance(supplier))
136139
137140
138141 func getValueUserItemCounter (user,item) = getIntegerByKey(getKeyUserItemCounter(user, item))
139142
140143
141144 func getValuePurchaseStatus (purchase) = getStringByKey(getKeyPurchaseStatus(purchase))
142145
143146
144147 func getValuePurchaseItem (purchase) = getStringValue(this, getKeyPurchaseItem(purchase))
145148
146149
147150 func getValuePurchaseSupplier (purchase) = getStringValue(this, getKeyPurchaseSupplier(purchase))
148151
149152
150153 func getValuePurchaseUser (purchase) = getStringValue(this, getKeyPurchaseUser(purchase))
151154
152155
153156 func getValuePurchaseAmount (purchase) = getIntegerValue(this, getKeyPurchaseAmount(purchase))
154157
155158
156159 func getValuePurchaseTimestamp (purchase) = getIntegerByKey(getKeyPurchaseTimestamp(purchase))
157160
158161
159162 func getValuePurchaseAssetId (purchase) = getStringByKey(getKeyPurchaseAssetId(purchase))
160163
161164
162165 func getValuePurchaseFundPaid (purchase) = getBooleanByKey(getKeyPurchaseFundPaid(purchase))
163166
164167
165168 func getValueItemPrice (item) = getIntegerValue(this, getKeyItemPrice(item))
166169
167170
168171 func getValueItemSupplier (item) = getStringByKey(getKeyItemSupplier(item))
169172
170173
171174 func getValueItemExpireTime (item) = getIntegerByKey(getKeyItemExpireDate(item))
172175
173176
174177 func getValueItemTitle (item) = getStringByKey(getKeyItemTitle(item))
175178
176179
177180 func getValueItemSoldCounter (item) = getIntegerByKey(getKeyItemSoldCounter(item))
178181
179182
180183 func getValueItemRemoved (item) = getBooleanByKey(getKeyItemRemoved(item))
181184
182185
183186 func getValueCouponPurchase (assetId) = getStringByKey(getKeyCouponPurchase(assetId))
184187
185188
186189 func getValueCommit (item,user) = getStringByKey(getKeyCommit(item, user))
187190
188191
189192 func getValueCommitsCount (item) = getIntegerByKey(getKeyCommitsCount(item))
190193
191194
192195 func getValueReveal (item,user) = getStringByKey(getKeyReveal(item, user))
193196
194197
195-func getValueItemStatus (item) = getStringByKey(getKeyItemStatus(item))
198+func getValueItemVoteStatus (item) = getStringByKey(getKeyItemVoteStatus(item))
199+
200+
201+func getValueItemFeatured (item) = getBooleanByKey(getKeyItemFeatured(item))
196202
197203
198204 func getValueVotesCount (item,vote) = getIntegerByKey(getKeyVotesCount(item, vote))
199205
200206
201207 @Callable(i)
202208 func registerSupplier (data) = {
203209 let supplier = toBase58String(i.caller.bytes)
204210 let account = getSupplierAccount(supplier)
205211 if ((account != NONE))
206212 then throw("This address has already registred as supplier")
207213 else [StringEntry(getKeySupplierAccount(supplier), data)]
208214 }
209215
210216
211217
212218 @Callable(i)
213219 func addItem (title,price,data,expire) = {
214220 let supplier = toBase58String(i.caller.bytes)
215221 let account = getSupplierAccount(supplier)
216222 let item = getKeyItem(supplier, title)
217223 if ((account == NONE))
218224 then throw("You should register as supplier to add an item")
219225 else if ((0 >= price))
220226 then throw("Purchase amount cannot be less than item price")
221227 else if ((getValueItemSupplier(item) != NONE))
222228 then throw("An item already exists")
223- else [StringEntry(getKeyItemSupplier(item), supplier), StringEntry(getKeyItemTitle(item), title), IntegerEntry(getKeyItemPrice(item), price), StringEntry(getKeyItemData(item), data), IntegerEntry(getKeyItemExpireDate(item), expire)]
229+ else [StringEntry(getKeyItemSupplier(item), supplier), StringEntry(getKeyItemTitle(item), title), IntegerEntry(getKeyItemPrice(item), price), StringEntry(getKeyItemData(item), data), IntegerEntry(getKeyItemExpireDate(item), expire), BooleanEntry(getKeyItemFeatured(item), true)]
224230 }
225231
226232
227233
228234 @Callable(i)
229235 func updateItem (item,title,price,data,expire) = {
230236 let supplier = toBase58String(i.caller.bytes)
231237 let account = getSupplierAccount(supplier)
232238 let itemSupplier = getValueItemSupplier(item)
233239 let notFound = if ((getValueItemTitle(item) == NONE))
234240 then true
235241 else (getValueItemRemoved(item) == true)
236242 if ((account == NONE))
237243 then throw("You should register as supplier to remove an item")
238244 else if (notFound)
239245 then throw(("Item does not exists or has been removed " + item))
240246 else if ((supplier != itemSupplier))
241247 then throw(("You don't owned item " + item))
242248 else [StringEntry(getKeyItemTitle(item), title), IntegerEntry(getKeyItemPrice(item), price), StringEntry(getKeyItemData(item), data), IntegerEntry(getKeyItemExpireDate(item), expire)]
243249 }
244250
245251
246252
247253 @Callable(i)
248254 func removeItem (item) = {
249255 let supplier = toBase58String(i.caller.bytes)
250256 let account = getSupplierAccount(supplier)
251257 let itemSupplier = getValueItemSupplier(item)
252258 let notFound = if ((getValueItemTitle(item) == NONE))
253259 then true
254260 else (getValueItemRemoved(item) == true)
255261 if ((account == NONE))
256262 then throw("You should register as supplier to remove an item")
257263 else if (notFound)
258264 then throw(("Item does not exists or has been removed " + item))
259265 else if ((supplier != itemSupplier))
260266 then throw(("You don't owned item " + item))
261267 else {
262268 let soldCounter = getValueItemSoldCounter(item)
263269 if ((soldCounter == 0))
264- then [DeleteEntry(getKeyItemSupplier(item)), DeleteEntry(getKeyItemTitle(item)), DeleteEntry(getKeyItemPrice(item)), DeleteEntry(getKeyItemData(item)), DeleteEntry(getKeyItemExpireDate(item))]
270+ then [DeleteEntry(getKeyItemSupplier(item)), DeleteEntry(getKeyItemTitle(item)), DeleteEntry(getKeyItemPrice(item)), DeleteEntry(getKeyItemData(item)), DeleteEntry(getKeyItemExpireDate(item)), DeleteEntry(getKeyItemVoteStatus(item)), DeleteEntry(getKeyItemFeatured(item))]
265271 else [BooleanEntry(getKeyItemRemoved(item), true)]
266272 }
267273 }
268274
269275
270276
271277 @Callable(i)
272278 func purchase (item) = {
273279 let pmt = i.payments[0]
274280 let notFound = if ((getValueItemTitle(item) == NONE))
275281 then true
276282 else (getValueItemRemoved(item) == true)
277283 if (notFound)
278284 then throw(("Item does not exists or has been removed " + item))
279285 else if (isDefined(pmt.assetId))
280286 then throw("You can buy tokens only with Waves tokens")
281287 else {
282288 let user = toBase58String(i.caller.bytes)
283289 let price = getValueItemPrice(item)
284290 let supplier = getValueItemSupplier(item)
285291 let expire = getValueItemExpireTime(item)
286292 if (if ((expire > 0))
287293 then (lastBlock.timestamp >= expire)
288294 else false)
289295 then throw("Coupon expired")
290296 else if ((price > pmt.amount))
291297 then throw("Purchase amount cannot be less than item price")
292298 else if ((pmt.amount > price))
293299 then throw("Purchase amount cannot be higher than item price")
294300 else if ((supplier == NONE))
295301 then throw("Supplier does not exists")
296302 else {
297303 let keyUserItemCounter = getKeyUserItemCounter(user, item)
298304 let userItemCounter = (getValueUserItemCounter(user, item) + 1)
299305 let purchase = genPurchaseKey(supplier, item, user, userItemCounter)
300306 let keyPurchaseStatus = getKeyPurchaseStatus(purchase)
301307 let keyPurchaseItem = getKeyPurchaseItem(purchase)
302308 let keyPurchaseSupplier = getKeyPurchaseSupplier(purchase)
303309 let keyPurchaseUser = getKeyPurchaseUser(purchase)
304310 let keyPurchaseAmount = getKeyPurchaseAmount(purchase)
305311 let keyPurchaseTimestamp = getKeyPurchaseTimestamp(purchase)
306312 [IntegerEntry(keyUserItemCounter, userItemCounter), StringEntry(keyPurchaseStatus, APPROVAL), StringEntry(keyPurchaseItem, item), StringEntry(keyPurchaseSupplier, supplier), StringEntry(keyPurchaseUser, user), IntegerEntry(keyPurchaseAmount, pmt.amount), IntegerEntry(keyPurchaseTimestamp, lastBlock.timestamp)]
307313 }
308314 }
309315 }
310316
311317
312318
313319 @Callable(i)
314320 func rejectPurchase (purchase) = {
315321 let caller = toBase58String(i.caller.bytes)
316322 let status = getValuePurchaseStatus(purchase)
317323 let supplier = getValuePurchaseSupplier(purchase)
318324 let item = getValuePurchaseItem(purchase)
319325 let notFound = (item == NONE)
320326 if (notFound)
321327 then throw(("Purchase not found " + purchase))
322328 else if (if ((supplier == NONE))
323329 then true
324330 else (caller != supplier))
325331 then throw("Your are not the owner of this item")
326332 else if ((status != APPROVAL))
327333 then throw("You cannot reject this purchased")
328334 else {
329335 let keyPurchaseStatus = getKeyPurchaseStatus(purchase)
330336 let keyPurchaseAmount = getKeyPurchaseAmount(purchase)
331337 let keyItemSoldCounter = getKeyItemSoldCounter(item)
332338 let user = getValuePurchaseUser(purchase)
333339 let amount = getValuePurchaseAmount(purchase)
334340 let supplierBalance = (getValueSupplierBalance(supplier) - amount)
335341 let itemSoldCounter = (getValueItemSoldCounter(item) - 1)
336342 let address = addressFromStringValue(user)
337343 [StringEntry(keyPurchaseStatus, REJECTED), IntegerEntry(keyPurchaseAmount, 0), ScriptTransfer(address, amount, unit)]
338344 }
339345 }
340346
341347
342348
343349 @Callable(i)
344350 func acceptPurchase (purchase,assetId) = {
345351 let caller = toBase58String(i.caller.bytes)
346352 let status = getValuePurchaseStatus(purchase)
347353 let supplier = getValuePurchaseSupplier(purchase)
348354 let item = getValuePurchaseItem(purchase)
349355 let expire = getValueItemExpireTime(item)
350356 let notFound = (item == NONE)
351357 if (notFound)
352358 then throw(("Purchase not found " + purchase))
353359 else if (if ((supplier == NONE))
354360 then true
355361 else (caller != supplier))
356362 then throw("Your are not the owner of this item")
357363 else if ((status != APPROVAL))
358364 then throw("You cannot reject this purchased")
359365 else if (if ((expire > 0))
360366 then (lastBlock.timestamp >= expire)
361367 else false)
362368 then throw("Coupon expired")
363369 else {
364370 let keyPurchaseStatus = getKeyPurchaseStatus(purchase)
365371 let keyPurchaseAssetId = getKeyPurchaseAssetId(purchase)
366372 let keySupplierBalance = getKeySupplierBalance(supplier)
367373 let keyItemSoldCounter = getKeyItemSoldCounter(item)
368374 let keyCouponPurchase = getKeyCouponPurchase(assetId)
369375 let keyCouponItem = getKeyCouponItem(assetId)
370376 let amount = getValuePurchaseAmount(purchase)
371377 let newBalance = (getValueSupplierBalance(supplier) + amount)
372378 let itemSoldCounter = (getValueItemSoldCounter(item) + 1)
373379 let user = getValuePurchaseUser(purchase)
374380 let address = addressFromStringValue(user)
375381 [StringEntry(keyPurchaseStatus, ACCEPTED), StringEntry(keyCouponPurchase, purchase), StringEntry(keyCouponItem, item), StringEntry(keyPurchaseAssetId, assetId), IntegerEntry(keySupplierBalance, newBalance), IntegerEntry(keyItemSoldCounter, itemSoldCounter)]
376382 }
377383 }
378384
379385
380386
381387 @Callable(i)
382388 func burn () = {
383389 let caller = toBase58String(i.caller.bytes)
384390 let pmt = if ((size(i.payments) == 1))
385391 then i.payments[0]
386392 else throw("An attached coupon is required as payment[0]")
387393 if ((isDefined(pmt.assetId) == false))
388394 then throw("Need a coupon to burn")
389395 else {
390396 let asset = match pmt.assetId {
391397 case e: ByteVector =>
392398 e
393399 case _ =>
394400 throw("Need a coupon to burn")
395401 }
396402 let assetId = toBase58String(asset)
397403 let purchase = getValueCouponPurchase(assetId)
398404 let supplier = getValuePurchaseSupplier(purchase)
399405 let isfundPaid = getValuePurchaseFundPaid(purchase)
400406 if ((caller != supplier))
401407 then throw("Your are not the supplier for this coupon")
402408 else if (isfundPaid)
403409 then [Burn(asset, 1)]
404410 else {
405411 let balance = getValueSupplierBalance(supplier)
406412 let amount = getValuePurchaseAmount(purchase)
407413 let withdrawAmt = if ((0 >= (balance - amount)))
408414 then balance
409415 else amount
410416 let newBalance = (balance - withdrawAmt)
411417 if ((0 > newBalance))
412418 then throw("Not enough funds to withdraw")
413419 else {
414420 let keySupplierBalance = getKeySupplierBalance(supplier)
415421 let keyCouponFundPaid = getKeyPurchaseFundPaid(purchase)
416422 [Burn(asset, 1), BooleanEntry(keyCouponFundPaid, true), IntegerEntry(keySupplierBalance, newBalance), ScriptTransfer(i.caller, withdrawAmt, unit)]
417423 }
418424 }
419425 }
420426 }
421427
422428
423429
424430 @Callable(i)
425431 func withdraw (assetId) = {
426432 let caller = toBase58String(i.caller.bytes)
427433 let account = getSupplierAccount(caller)
428434 if ((account == NONE))
429435 then throw("You are not registred as supplier")
430436 else {
431437 let purchase = getValueCouponPurchase(assetId)
432438 let supplier = getValuePurchaseSupplier(purchase)
433439 let isfundPaid = getValuePurchaseFundPaid(purchase)
434440 if ((caller != supplier))
435441 then throw("Your are not the supplier for this coupon")
436442 else if (isfundPaid)
437443 then throw("Fund has already been paid")
438444 else {
439445 let item = getValuePurchaseItem(purchase)
440446 let expire = getValueItemExpireTime(item)
441447 let info = match assetInfo(fromBase58String(assetId)) {
442448 case a: Asset =>
443449 a
444450 case _ =>
445451 throw("Cannot find asset info")
446452 }
447453 let canWithdraw = if (if ((expire > 0))
448454 then (lastBlock.timestamp >= expire)
449455 else false)
450456 then true
451457 else if ((info.quantity == 0))
452458 then true
453459 else false
454460 if (!(canWithdraw))
455461 then throw("This coupon cannot be funded")
456462 else {
457463 let balance = getValueSupplierBalance(supplier)
458464 let amount = getValuePurchaseAmount(purchase)
459465 let withdrawAmt = if ((0 >= (balance - amount)))
460466 then balance
461467 else amount
462468 let newBalance = (balance - withdrawAmt)
463469 if ((0 > newBalance))
464470 then throw("Not enough funds to withdraw")
465471 else {
466472 let keySupplierBalance = getKeySupplierBalance(supplier)
467473 let keyCouponFundPaid = getKeyPurchaseFundPaid(purchase)
468474 [BooleanEntry(keyCouponFundPaid, true), IntegerEntry(keySupplierBalance, newBalance), ScriptTransfer(i.caller, withdrawAmt, unit)]
469475 }
470476 }
471477 }
472478 }
473479 }
474480
475481
476482
477483 @Callable(i)
478484 func voteCommit (item,hash) = {
479485 let user = toBase58String(i.caller.bytes)
480486 let commitsCount = getValueCommitsCount(item)
481- let status = getValueItemStatus(item)
487+ let status = getValueItemVoteStatus(item)
482488 if ((commitsCount >= VOTERS))
483489 then throw("Reached max number of voters")
484490 else if ((getValueCommit(item, user) != NONE))
485491 then throw("You voted already")
486492 else if ((getKeyItemSupplier(item) == NONE))
487493 then throw("Item does not exists")
488494 else if (if ((status != NONE))
489495 then (status != VOTING)
490496 else false)
491497 then throw("Voting is not active for this item now")
492498 else {
493499 let newStatus = if ((commitsCount == VOTERS))
494500 then REVEAL
495501 else VOTING
496-[StringEntry(getKeyCommit(item, user), hash), IntegerEntry(getKeyCommitsCount(item), (commitsCount + 1)), StringEntry(getKeyItemStatus(item), newStatus)]
502+[StringEntry(getKeyCommit(item, user), hash), IntegerEntry(getKeyCommitsCount(item), (commitsCount + 1)), StringEntry(getKeyItemVoteStatus(item), newStatus)]
497503 }
498504 }
499505
500506
501507
502508 @Callable(i)
503509 func voteReveal (item,vote,salt) = {
504510 let user = toBase58String(i.caller.bytes)
505- let status = getValueItemStatus(item)
511+ let status = getValueItemVoteStatus(item)
506512 let newVotesCount = (getValueVotesCount(item, vote) + 1)
507513 let saltedVote = toBase58String(sha256(toBytes(((item + vote) + salt))))
508514 if ((saltedVote != getValueCommit(item, user)))
509515 then throw("Reveal data is not valid")
510516 else if ((VOTERS > getValueCommitsCount(item)))
511517 then throw("Max number of voters not reached")
512518 else if ((getValueReveal(item, user) != NONE))
513519 then throw("You voted already")
514520 else if (if ((status != VOTING))
515521 then (status != REVEAL)
516522 else false)
517523 then throw("Voting is not active for this item now")
518524 else if (if ((vote != FEATURED))
519525 then (vote != DELISTED)
520526 else false)
521527 then throw("Provided voting option is incorrect")
522- else {
523- let newStatus = if ((newVotesCount >= QUORUM))
524- then vote
525- else REVEAL
526-[StringEntry(getKeyReveal(item, user), vote), IntegerEntry(getKeyVotesCount(item, user), newVotesCount), StringEntry(getKeyItemStatus(item), newStatus)]
527- }
528+ else if ((newVotesCount >= QUORUM))
529+ then {
530+ let featured = if ((vote == FEATURED))
531+ then true
532+ else false
533+[StringEntry(getKeyReveal(item, user), vote), IntegerEntry(getKeyVotesCount(item, vote), newVotesCount), BooleanEntry(getKeyItemFeatured(item), featured), DeleteEntry(getKeyItemVoteStatus(item))]
534+ }
535+ else [StringEntry(getKeyReveal(item, user), vote), IntegerEntry(getKeyVotesCount(item, vote), newVotesCount), StringEntry(getKeyItemVoteStatus(item), REVEAL)]
528536 }
529537
530538
531539 @Verifier(tx)
532540 func verify () = match tx {
533541 case t: SetScriptTransaction =>
534542 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
535543 case t: IssueTransaction =>
536544 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
537545 case t: TransferTransaction =>
538546 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
539547 case _ =>
540548 false
541549 }
542550

github/deemru/w8io/873ac7e 
68.51 ms