tx · CYLbhWCHrzcmRfRVXMg1kmjEn4CBSv2bYbo84iYwQgAB

3N5RZzJX5VLb937k1HkfCPj464fa6a916hj:  -0.02000000 Waves

2019.10.21 18:56 [730050] smart account 3N5RZzJX5VLb937k1HkfCPj464fa6a916hj > SELF 0.00000000 Waves

{ "type": 13, "id": "CYLbhWCHrzcmRfRVXMg1kmjEn4CBSv2bYbo84iYwQgAB", "fee": 2000000, "feeAssetId": null, "timestamp": 1571673490630, "version": 1, "sender": "3N5RZzJX5VLb937k1HkfCPj464fa6a916hj", "senderPublicKey": "DabN1B19F6fW9mT8w79uNApEku9kf5cVL1kBhoDGqvoN", "proofs": [ "4edqSuLZ3uHQq54Xo3HkLbQ9zvGiuyk5Eev1w8sWEuFoAxUmiGboPznbt4YgJcdsLqUWWZWdAsCChTi4kqbXDaXQ" ], "script": "base64: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YXJlZFN0YXRlU3RyAgAAAAAJAAS1AAAAAgUAAAAOc2hhcmVkU3RhdGVTdHICAAAAAV8JAARMAAAAAgIAAAAACQAETAAAAAICAAAAATAJAARMAAAAAgIAAAAABQAAAANuaWwBAAAAE3dyaXRlU2V0T2ZSb3VuZERhdGEAAAAHAAAABHR5cGUAAAAFcm91bmQAAAAMbmV3V2luSGVpZ2h0AAAAD25ld1dpblB1YktleVN0cgAAAAxuZXdXaW5QdWJLZXkAAAALbGVhc2luZ0lkNTgAAAAXbGVhc2VJZEV4cGlyYXRpb25IZWlnaHQEAAAAD25ld1dpbkhlaWdodFN0cgkAAaQAAAABBQAAAAxuZXdXaW5IZWlnaHQEAAAACXJvdW5kRGF0YQkBAAAACURhdGFFbnRyeQAAAAIJAQAAABVnZXRSb3VuZERhdGFLZXlPckZhaWwAAAABBQAAAAVyb3VuZAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAPbmV3V2luSGVpZ2h0U3RyAgAAAAFfBQAAAA9uZXdXaW5QdWJLZXlTdHICAAAAAV8FAAAAC2xlYXNpbmdJZDU4AgAAAAFfCQABpAAAAAEFAAAAF2xlYXNlSWRFeHBpcmF0aW9uSGVpZ2h0AwkAAAAAAAACBQAAAAR0eXBlAgAAAARNT1ZFBAAAABBuZXdXaW5BZGRyZXNzU3RyCQAEJQAAAAEJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEFAAAADG5ld1dpblB1YktleQQAAAANYWRkcmVzc0xlbmd0aAkAATEAAAABBQAAABBuZXdXaW5BZGRyZXNzU3RyBAAAAAtzaGFyZWRTdGF0ZQkBAAAAD3JlYWRTaGFyZWRTdGF0ZQAAAAAEAAAAFW5ld1RvdGFsR2FtZXNDb3VudFN0cgkAAaQAAAABCQAAZAAAAAIJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAtzaGFyZWRTdGF0ZQAAAAAAAAAAAQAAAAAAAAAAAQQAAAATY3Vyckxhc3RQbGF5ZXJzQWRkcgkAAZEAAAACBQAAAAtzaGFyZWRTdGF0ZQAAAAAAAAAAAgQAAAASbmV3TGFzdFBsYXllcnNBZGRyAwMJAQAAAAIhPQAAAAIFAAAAE2N1cnJMYXN0UGxheWVyc0FkZHICAAAAAAkAAGYAAAACCQABMQAAAAEFAAAAE2N1cnJMYXN0UGxheWVyc0FkZHIJAABoAAAAAgkAAGQAAAACBQAAAA1hZGRyZXNzTGVuZ3RoAAAAAAAAAAABAAAAAAAAAAAKBwkAASwAAAACCQABLAAAAAICAAAAAS0FAAAAEG5ld1dpbkFkZHJlc3NTdHIJAQAAAAlkcm9wUmlnaHQAAAACBQAAABNjdXJyTGFzdFBsYXllcnNBZGRyCQAAZAAAAAIFAAAADWFkZHJlc3NMZW5ndGgAAAAAAAAAAAEJAAEsAAAAAgkAASwAAAACAgAAAAEtBQAAABBuZXdXaW5BZGRyZXNzU3RyBQAAABNjdXJyTGFzdFBsYXllcnNBZGRyCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIFAAAACXJvdW5kRGF0YQkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgIAAAARUm91bmRzU2hhcmVkU3RhdGUJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAPbmV3V2luSGVpZ2h0U3RyAgAAAAFfBQAAABVuZXdUb3RhbEdhbWVzQ291bnRTdHICAAAAAV8FAAAAEm5ld0xhc3RQbGF5ZXJzQWRkcgUAAAADbmlsAwkAAAAAAAACBQAAAAR0eXBlAgAAAAdMRUFTSU5HCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIFAAAACXJvdW5kRGF0YQUAAAADbmlsCQAAAgAAAAEJAAEsAAAAAgIAAAAwVW5zdXBwb3J0ZWQgdHlwZSBpbiB3cml0ZVNldE9mUm91bmREYXRhIG1ldGhvZDogBQAAAAR0eXBlAAAAAAZvZmZzZXQJAABlAAAAAgUAAAAGaGVpZ2h0BQAAABFibG9ja3NPbkdhbWVTdGFydAAAAAAMY3VyclJvdW5kTnVtAwkAAGcAAAACBQAAAAZvZmZzZXQAAAAAAAAAAAAJAABpAAAAAgUAAAAGb2Zmc2V0BQAAAA5ibG9ja3NQZXJSb3VuZAkAAAIAAAABCQABLAAAAAICAAAALVBsZWFzZSBkbyBub3QgaHVycnkuIE1SVCBwYXJ0eSB3aWxsIHN0YXJ0IG9uIAkAAaQAAAABBQAAABFibG9ja3NPbkdhbWVTdGFydAAAAAAPY3VyclJvdW5kSGVpZ2h0CQAAagAAAAIFAAAABm9mZnNldAUAAAAOYmxvY2tzUGVyUm91bmQAAAAAFGN1cnJSb3VuZEhlaWdodFN0YXJ0CQAAZAAAAAIJAABoAAAAAgUAAAAMY3VyclJvdW5kTnVtBQAAAA5ibG9ja3NQZXJSb3VuZAUAAAARYmxvY2tzT25HYW1lU3RhcnQAAAAAF2N1cnJSb3VuZENvbXBldGl0aW9uRW5kCQAAZAAAAAIFAAAAFGN1cnJSb3VuZEhlaWdodFN0YXJ0BQAAABRibG9ja3NQZXJDb21wZXRpdGlvbgAAAAARY3VyclJvdW5kRGF0YUxpc3QJAQAAABdyZWFkUm91bmREYXRhTGlzdE9yRmFpbAAAAAEFAAAADGN1cnJSb3VuZE51bQAAAAANY3VycldpbkhlaWdodAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEWN1cnJSb3VuZERhdGFMaXN0BQAAAAxJZHhXaW5IZWlnaHQAAAAADWN1cnJNaW5QbXRBbXQFAAAAB3BtdFN0ZXABAAAADWlzV2luQnlIZWlnaHQAAAABAAAAAWgJAABnAAAAAgUAAAAGaGVpZ2h0BQAAAAFoAAAAABxhdExlYXN0T25lTW92ZUluUm91bmRQcmVzZW50CQAAZgAAAAIFAAAADWN1cnJXaW5IZWlnaHQFAAAAFGN1cnJSb3VuZEhlaWdodFN0YXJ0AAAAABZmaXJzdENvdW50ZG93bkZpbmlzaGVkAwkAAAAAAAACBQAAAA1jdXJyV2luSGVpZ2h0AAAAAAAAAAAACQEAAAANaXNXaW5CeUhlaWdodAAAAAEJAABkAAAAAgUAAAAUY3VyclJvdW5kSGVpZ2h0U3RhcnQFAAAACmhlaWdodFN0ZXAHAAAAAAxpc1BhdXNlQnlXaW4DCQEAAAANaXNXaW5CeUhlaWdodAAAAAEFAAAADWN1cnJXaW5IZWlnaHQFAAAAHGF0TGVhc3RPbmVNb3ZlSW5Sb3VuZFByZXNlbnQHAAAAAA1pc1BhdXNlQnlUaW1lAwkAAGYAAAACBQAAAA9jdXJyUm91bmRIZWlnaHQFAAAAFGJsb2Nrc1BlckNvbXBldGl0aW9uBgUAAAAWZmlyc3RDb3VudGRvd25GaW5pc2hlZAAAAAAHaXNQYXVzZQMFAAAADGlzUGF1c2VCeVdpbgYFAAAADWlzUGF1c2VCeVRpbWUAAAAADWlzQ29tcGV0aXRpb24JAQAAAAEhAAAAAQUAAAAHaXNQYXVzZQAAAAIAAAADaW52AQAAAARtb3ZlAAAAAAQAAAAWb3ZlcmZsb3dlZE5ld1dpbkhlaWdodAkAAGQAAAACBQAAAAZoZWlnaHQFAAAACmhlaWdodFN0ZXAEAAAADG5ld1dpbkhlaWdodAMJAABnAAAAAgUAAAAWb3ZlcmZsb3dlZE5ld1dpbkhlaWdodAUAAAAXY3VyclJvdW5kQ29tcGV0aXRpb25FbmQFAAAAF2N1cnJSb3VuZENvbXBldGl0aW9uRW5kBQAAABZvdmVyZmxvd2VkTmV3V2luSGVpZ2h0BAAAAAdwYXltZW50AwkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAANpbnYAAAAHcGF5bWVudAkBAAAAB2V4dHJhY3QAAAABCAUAAAADaW52AAAAB3BheW1lbnQJAAACAAAAAQIAAAA6UGxlYXNlIGF0dGFjaCBwYXltZW50IHdpdGggTVJUIHRvIHBhcnRpY2lwYXRlIGluIE1SVCBwYXJ0eQMJAABnAAAAAgUAAAAMY3VyclJvdW5kTnVtBQAAAAltYXhSb3VuZHMJAAACAAAAAQIAAAARTVJUIHBhcnR5IGlzIG92ZXIDBQAAAAdpc1BhdXNlCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAABFTb3JyeSBidXQgcm91bmQgIwkAAaQAAAABBQAAAAxjdXJyUm91bmROdW0CAAAADSBpcyBmaW5pc2hlZC4DCQEAAAACIT0AAAACCAUAAAAHcGF5bWVudAAAAAdhc3NldElkBQAAAANNUlQJAAACAAAAAQIAAAA9UGxlYXNlIHVzZSBNUlQgYXMgYSBwYXltZW50IGFzc2V0IHRvIHBhcnRpY2lwYXRlIGluIE1SVCBwYXJ0eQMJAABmAAAAAgUAAAANY3Vyck1pblBtdEFtdAgFAAAAB3BheW1lbnQAAAAGYW1vdW50CQAAAgAAAAEJAAEsAAAAAgIAAABFU29ycnkgbXkgZnJpZW5kIGJ1dCB5b3VyIHBheW1lbnQgaXMgdG8gc21hbGwuIEN1cnJlbnQgbWluIHBheW1lbnQgaXMgCQABpAAAAAEFAAAADWN1cnJNaW5QbXRBbXQJAQAAABN3cml0ZVNldE9mUm91bmREYXRhAAAABwIAAAAETU9WRQUAAAAMY3VyclJvdW5kTnVtBQAAAAxuZXdXaW5IZWlnaHQJAAJYAAAAAQgFAAAAA2ludgAAAA9jYWxsZXJQdWJsaWNLZXkIBQAAAANpbnYAAAAPY2FsbGVyUHVibGljS2V5AgAAAAE/AAAAAAAAAAAAAAAAA2ludgEAAAARcmVnaXN0ZXJMZWFzaW5nVHgAAAACAAAABXJvdW5kAAAAC2xlYXNpbmdJZDU4BAAAAAlsZWFzaW5nSWQJAAJZAAAAAQUAAAALbGVhc2luZ0lkNTgEAAAADXJvdW5kRGF0YUxpc3QJAQAAABdyZWFkUm91bmREYXRhTGlzdE9yRmFpbAAAAAEFAAAABXJvdW5kBAAAAAx3aW5uZXJQdWJLZXkJAAJZAAAAAQkAAZEAAAACBQAAAA1yb3VuZERhdGFMaXN0BQAAAAxJZHhXaW5QdWJLZXkEAAAAF2xlYXNlSWRFeHBpcmF0aW9uSGVpZ2h0CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAANcm91bmREYXRhTGlzdAUAAAAVSWR4TGVhc2luZ0lkVmFsaWRUaWxsAwkAAGYAAAACBQAAAAVyb3VuZAUAAAAMY3VyclJvdW5kTnVtCQAAAgAAAAECAAAAPkltcG9zc2libGUgdG8gcmVnaXN0ZXIgbGVhc2luZyB0cmFuc2FjdGlvbiBmb3Igcm91bmQgaW4gZnV0dXJlAwMJAAAAAAAAAgUAAAAFcm91bmQFAAAADGN1cnJSb3VuZE51bQUAAAANaXNDb21wZXRpdGlvbgcJAAACAAAAAQIAAABPSW1wb3NzaWJsZSB0byByZWdpc3RlciBsZWFzaW5nIHRyYW5zYWN0aW9uIC0gd2lubmVyIGhhcyBub3QgYmVlbiBkZXRlcm1pbmVkIHlldAMJAABmAAAAAgkAAMgAAAABCQACWQAAAAEFAAAAC2xlYXNpbmdJZDU4AAAAAAAAAABkCQAAAgAAAAECAAAAJUludmFsaWQgbGVhc2luZyB0cmFuc2FjdGlvbiBpZCBsZW5ndGgDCQAAZwAAAAIAAAAAAAAAAAAJAADIAAAAAQUAAAAJbGVhc2luZ0lkCQAAAgAAAAECAAAANkxlYXNpbmcgdHJhbnNhY3Rpb24gaWQgaXMgbm90IGVuY29kZWQgYXMgQmFzZTU4IGZvcm1hdAMJAQAAAAlpc0RlZmluZWQAAAABCQAD6QAAAAEFAAAACWxlYXNpbmdJZAkAAAIAAAABAgAAADJQYXNzZWQgbGVhc2luZ0lkIGhhcyBhbHJlYWR5IGV4aXN0ZWQgaW4gYmxvY2tjaGFpbgMDCQEAAAACIT0AAAACBQAAABdsZWFzZUlkRXhwaXJhdGlvbkhlaWdodAAAAAAAAAAAAAkAAGYAAAACBQAAABdsZWFzZUlkRXhwaXJhdGlvbkhlaWdodAUAAAAGaGVpZ2h0BwkAAAIAAAABCQABLAAAAAICAAAAKExlYXNpbmcgaWQgY2FuIGJlIHJlLXJlZ2lzdGVyZWQgb25seSBvbiAJAAGkAAAAAQUAAAAXbGVhc2VJZEV4cGlyYXRpb25IZWlnaHQDCQEAAAACIT0AAAACCAUAAAADaW52AAAAD2NhbGxlclB1YmxpY0tleQUAAAAMd2lubmVyUHViS2V5CQAAAgAAAAECAAAAMUxlYXNpbmcgdHggY2FuIGJlIHJlZ2lzdGVyZWQgYnkgcm91bmQgd2lubmVyIG9ubHkEAAAADnJvdW5kV2luSGVpZ2h0CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAANcm91bmREYXRhTGlzdAUAAAAMSWR4V2luSGVpZ2h0CQEAAAATd3JpdGVTZXRPZlJvdW5kRGF0YQAAAAcCAAAAB0xFQVNJTkcFAAAABXJvdW5kBQAAAA5yb3VuZFdpbkhlaWdodAkAAZEAAAACBQAAAA1yb3VuZERhdGFMaXN0BQAAAAxJZHhXaW5QdWJLZXkJAAGbAAAAAQIAAAAABQAAAAtsZWFzaW5nSWQ1OAkAAGQAAAACBQAAAAZoZWlnaHQFAAAAEWxlYXNpbmdJZExpZmV0aW1lAAAAAQAAAAJ0eAEAAAAGdmVyaWZ5AAAAAAQAAAASbGVhc2luZ1BlcmlvZEVuZGVkCQAAZgAAAAIFAAAABmhlaWdodAkAAGQAAAACCQAAZAAAAAIFAAAAEWJsb2Nrc09uR2FtZVN0YXJ0CQAAaAAAAAIFAAAACW1heFJvdW5kcwUAAAAOYmxvY2tzUGVyUm91bmQFAAAADWxlYXNpbmdQZXJpb2QEAAAAByRtYXRjaDAFAAAAAnR4AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABBMZWFzZVRyYW5zYWN0aW9uBAAAAANsdHgFAAAAByRtYXRjaDAEAAAAA3NpZwkAAZEAAAACCAUAAAADbHR4AAAABnByb29mcwAAAAAAAAAAAAQAAAAFcm91bmQJAQAAABN2YWx1ZU9yRXJyb3JNZXNzYWdlAAAAAgkABLYAAAABCQEAAAAKcHJvb2ZUb1N0cgAAAAEJAAGRAAAAAggFAAAAA2x0eAAAAAZwcm9vZnMAAAAAAAAAAAECAAAAPUVycm9yIGR1cmluZyBjb252ZXJ0aW5nIHJvdW5kIG51bSBpbnRvIGludGVnZXIgcmVwcmVzZW50YXRpb24EAAAADXJvdW5kRGF0YUxpc3QJAQAAABdyZWFkUm91bmREYXRhTGlzdE9yRmFpbAAAAAEFAAAABXJvdW5kBAAAAA5yb3VuZFdpblB1YktleQkAAlkAAAABCQABkQAAAAIFAAAADXJvdW5kRGF0YUxpc3QFAAAADElkeFdpblB1YktleQQAAAATcmVnaXN0ZXJlZExlYXNpbmdJZAkAAlkAAAABCQABkQAAAAIFAAAADXJvdW5kRGF0YUxpc3QFAAAADElkeExlYXNpbmdJZAQAAAAXbGVhc2VJZEV4cGlyYXRpb25IZWlnaHQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAA1yb3VuZERhdGFMaXN0BQAAABVJZHhMZWFzaW5nSWRWYWxpZFRpbGwDBQAAABJsZWFzaW5nUGVyaW9kRW5kZWQJAAACAAAAAQIAAAAnU29ycnkgYnV0IGxlYXNpbmcgcGVyaW9kIGhhcyBiZWVuIGVuZGVkAwkAAGYAAAACBQAAAAZoZWlnaHQJAABlAAAAAgUAAAAXbGVhc2VJZEV4cGlyYXRpb25IZWlnaHQFAAAAF2xlYXNpbmdJZERpZmZJbkxpZmV0aW1lCQAAAgAAAAECAAAAQlNvcnJ5IGJ1dCBsaWZldGltZSBvZiB5b3VyIGxlYXNpbmcgdHJhbnNhY3Rpb24gaWQgaGFzIGJlZW4gZXhwaXJlZAMJAQAAAAEhAAAAAQkAAfQAAAADCAUAAAADbHR4AAAACWJvZHlCeXRlcwUAAAADc2lnBQAAAA5yb3VuZFdpblB1YktleQkAAAIAAAABAgAAAEpJbnZhbGlkIGxlYXNpbmcgdHJhbnNhY3Rpb24gc2lnbmF0dXJlLiBMZWFzaW5nIGlzIGFsbG93ZWQgZm9yIHdpbm5lciBvbmx5LgMJAQAAAAIhPQAAAAIIBQAAAANsdHgAAAACaWQFAAAAE3JlZ2lzdGVyZWRMZWFzaW5nSWQJAAACAAAAAQIAAAA/TGVhc2luZyB0cmFuc2FjdGlvbiBpZCBkb2Vzbid0IG1hdGNoIHdpdGggcmVnaXN0ZXJlZCBsZWFzaW5nIGlkAwkBAAAAAiE9AAAAAggFAAAAA2x0eAAAAAZhbW91bnQFAAAACmxlYXNpbmdBbXQJAAACAAAAAQkAASwAAAACAgAAAClJbXBvc3NpYmxlIHRvIGxlYXNlIGxlc3Mgb3IgZ3JlYXRlciB0aGFuIAkAAaQAAAABBQAAAApsZWFzaW5nQW10AwkBAAAAAiE9AAAAAggFAAAAA2x0eAAAAANmZWUFAAAABk1pbkZFRQkAAAIAAAABCQABLAAAAAICAAAAMkltcG9zc2libGUgdG8gbGVhc2Ugd2l0aCBmZWUgbGVzcyBvciBncmVhdGVyIHRoYW4gCQABpAAAAAEFAAAABk1pbkZFRQYDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAFkxlYXNlQ2FuY2VsVHJhbnNhY3Rpb24EAAAABGNsdHgFAAAAByRtYXRjaDADCQEAAAABIQAAAAEFAAAAEmxlYXNpbmdQZXJpb2RFbmRlZAkAAAIAAAABAgAAAD5NUlQgcGFydHkgaGFzIG5vdCBmaW5pc2hlZCB5ZXQuIExlYXNpbmcgQ2FuY2VsIGlzIG5vdCBhbGxvd2VkLgMJAQAAAAEhAAAAAQkAAfQAAAADCAUAAAACdHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAAJ0eAAAAAZwcm9vZnMAAAAAAAAAAAAFAAAAEHBhcnR5T3duZXJQdWJLZXkJAAACAAAAAQIAAAAtTGVhc2luZyBDYW5jZWwgaXMgYWxsb3dlZCB0byBQYXJ0eSBPd25lciBvbmx5AwkBAAAAAiE9AAAAAggFAAAABGNsdHgAAAADZmVlBQAAAAZNaW5GRUUJAAACAAAAAQkAASwAAAACAgAAADtJbXBvc3NpYmxlIHRvIGNhbmNsZSBsZWFzaW5nIHdpdGggZmVlIGxlc3Mgb3IgZ3JlYXRlciB0aGFuIAkAAaQAAAABBQAAAAZNaW5GRUUGAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABNUcmFuc2ZlclRyYW5zYWN0aW9uBAAAAAN0dHgFAAAAByRtYXRjaDADCQEAAAABIQAAAAEFAAAAEmxlYXNpbmdQZXJpb2RFbmRlZAkAAAIAAAABAgAAADhNUlQgcGFydHkgaGFzIG5vdCBmaW5pc2hlZCB5ZXQuIFRyYW5zZmVyIGlzIG5vdCBhbGxvd2VkLgMJAQAAAAIhPQAAAAIICQAEJAAAAAEIBQAAAAN0dHgAAAAJcmVjaXBpZW50AAAABWJ5dGVzCAUAAAARcGFydHlPd25lckFkZHJlc3MAAAAFYnl0ZXMJAAACAAAAAQIAAAAvVHJhbnNmZXIgaXMgYWxsb3dlZCB0byBQYXJ0eSBPd25lciBhZGRyZXNzIG9ubHkDCQEAAAABIQAAAAEJAAH0AAAAAwgFAAAAA3R0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAA3R0eAAAAAZwcm9vZnMAAAAAAAAAAAAFAAAAEHBhcnR5T3duZXJQdWJLZXkJAAACAAAAAQIAAAApVHJhbnNmZXIgaXMgYWxsb3dlZCBmb3IgUGFydHkgT3duZXIgb25seS4GAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABRTZXRTY3JpcHRUcmFuc2FjdGlvbgQAAAADc3R4BQAAAAckbWF0Y2gwCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAgFAAAAAnR4AAAAD3NlbmRlclB1YmxpY0tleQfRQX+I", "chainId": 84, "height": 730050, "spentComplexity": 0 } View: original | compacted Prev: 3d2MqhrBi6PDcT6oxVRZTkb365JbwjmDNwDoot6LwvA8 Next: HDyJQMac5nkcrPLB3TwWRE1HX1NgS4mF8yqoW1KgzmHb Diff:
OldNewDifferences
226226 then (leaseIdExpirationHeight > height)
227227 else false)
228228 then throw(("Leasing id can be re-registered only on " + toString(leaseIdExpirationHeight)))
229- else if ((roundDataList[IdxLeasingId] != "?"))
230- then throw(("Leasing tx id has already registered for round " + toString(round)))
231- else if ((inv.callerPublicKey != winnerPubKey))
232- then throw("Leasing tx can be registered by round winner only")
233- else {
234- let roundWinHeight = parseIntValue(roundDataList[IdxWinHeight])
235- writeSetOfRoundData("LEASING", round, roundWinHeight, roundDataList[IdxWinPubKey], toBytes(""), leasingId58, (height + leasingIdLifetime))
236- }
229+ else if ((inv.callerPublicKey != winnerPubKey))
230+ then throw("Leasing tx can be registered by round winner only")
231+ else {
232+ let roundWinHeight = parseIntValue(roundDataList[IdxWinHeight])
233+ writeSetOfRoundData("LEASING", round, roundWinHeight, roundDataList[IdxWinPubKey], toBytes(""), leasingId58, (height + leasingIdLifetime))
234+ }
237235 }
238236
239237
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let WAVELET = ((100 * 1000) * 1000)
55
66 let MRTEC = 100
77
88 let maxRounds = 100000000
99
1010 let pmtStep = (10 * MRTEC)
1111
1212 let partyOwnerPubKey = fromBase58String("FCaP4jLhLawzEqbwAQGAVvPQBv2h3LdERCx7fckDvnzr")
1313
1414 let partyOwnerAddress = addressFromPublicKey(partyOwnerPubKey)
1515
1616 let leasingPeriod = 600000
1717
1818 let leasingIdLifetime = 150
1919
2020 let leasingIdDiffInLifetime = 10
2121
2222 let leasingAmt = (1 * WAVELET)
2323
2424 let heightStep = 2
2525
2626 let blocksOnGameStart = 729556
2727
2828 let blocksPerRound = 12
2929
3030 let blocksPerCompetition = 8
3131
3232 let MRT = fromBase58String("8b4jE7X1yCNcbF4YXZGBKc8T5xdit7b1gENxxx31daua")
3333
3434 let MinFEE = ((5 * WAVELET) / 1000)
3535
3636 let IdxWinHeight = 0
3737
3838 let IdxWinPubKey = 1
3939
4040 let IdxLeasingId = 2
4141
4242 let IdxLeasingIdValidTill = 3
4343
4444 func convertChar (char) = {
4545 let B0 = toBytes("0")
4646 let B1 = toBytes("1")
4747 let B2 = toBytes("2")
4848 let B3 = toBytes("3")
4949 let B4 = toBytes("4")
5050 let B5 = toBytes("5")
5151 let B6 = toBytes("6")
5252 let B7 = toBytes("7")
5353 let B8 = toBytes("8")
5454 let B9 = toBytes("9")
5555 if ((char == B0))
5656 then "0"
5757 else if ((char == B1))
5858 then "1"
5959 else if ((char == B2))
6060 then "2"
6161 else if ((char == B3))
6262 then "3"
6363 else if ((char == B4))
6464 then "4"
6565 else if ((char == B5))
6666 then "5"
6767 else if ((char == B6))
6868 then "6"
6969 else if ((char == B7))
7070 then "7"
7171 else if ((char == B8))
7272 then "8"
7373 else if ((char == B9))
7474 then "9"
7575 else throw("Unsupported char")
7676 }
7777
7878
7979 func proofToStr (roundNumProof) = {
8080 let s = size(roundNumProof)
8181 if ((s > 2))
8282 then throw("Invalid ecoded round - size couldn't be greater than 2")
8383 else if ((0 >= s))
8484 then throw("Invalid ecoded round - size couldn't be less than or equals 0")
8585 else if ((s == 1))
8686 then convertChar(take(roundNumProof, 1))
8787 else if ((s == 2))
8888 then (convertChar(take(roundNumProof, 1)) + convertChar(take(drop(roundNumProof, 1), 1)))
8989 else throw("Invalid encoded round")
9090 }
9191
9292
9393 func getRoundDataKeyOrFail (round) = if ((0 > round))
9494 then throw("Invalid round number")
9595 else ("round" + toString(round))
9696
9797
9898 func readRoundDataListOrFail (round) = {
9999 let roundDataOpt = getString(this, getRoundDataKeyOrFail(round))
100100 let roundDataStr = if (isDefined(roundDataOpt))
101101 then extract(roundDataOpt)
102102 else ""
103103 let partyOwnerAddressStr = toBase58String(partyOwnerAddress.bytes)
104104 if ((roundDataStr != ""))
105105 then split(roundDataStr, "_")
106106 else ["0", toString(pmtStep), partyOwnerAddressStr, "?", "0"]
107107 }
108108
109109
110110 func readSharedState () = {
111111 let sharedStateOpt = getString(this, "RoundsSharedState")
112112 let sharedStateStr = if (isDefined(sharedStateOpt))
113113 then extract(sharedStateOpt)
114114 else ""
115115 if ((sharedStateStr != ""))
116116 then split(sharedStateStr, "_")
117117 else ["", "0", ""]
118118 }
119119
120120
121121 func writeSetOfRoundData (type,round,newWinHeight,newWinPubKeyStr,newWinPubKey,leasingId58,leaseIdExpirationHeight) = {
122122 let newWinHeightStr = toString(newWinHeight)
123123 let roundData = DataEntry(getRoundDataKeyOrFail(round), ((((((newWinHeightStr + "_") + newWinPubKeyStr) + "_") + leasingId58) + "_") + toString(leaseIdExpirationHeight)))
124124 if ((type == "MOVE"))
125125 then {
126126 let newWinAddressStr = toString(addressFromPublicKey(newWinPubKey))
127127 let addressLength = size(newWinAddressStr)
128128 let sharedState = readSharedState()
129129 let newTotalGamesCountStr = toString((parseIntValue(sharedState[1]) + 1))
130130 let currLastPlayersAddr = sharedState[2]
131131 let newLastPlayersAddr = if (if ((currLastPlayersAddr != ""))
132132 then (size(currLastPlayersAddr) > ((addressLength + 1) * 10))
133133 else false)
134134 then (("-" + newWinAddressStr) + dropRight(currLastPlayersAddr, (addressLength + 1)))
135135 else (("-" + newWinAddressStr) + currLastPlayersAddr)
136136 WriteSet([roundData, DataEntry("RoundsSharedState", ((((newWinHeightStr + "_") + newTotalGamesCountStr) + "_") + newLastPlayersAddr))])
137137 }
138138 else if ((type == "LEASING"))
139139 then WriteSet([roundData])
140140 else throw(("Unsupported type in writeSetOfRoundData method: " + type))
141141 }
142142
143143
144144 let offset = (height - blocksOnGameStart)
145145
146146 let currRoundNum = if ((offset >= 0))
147147 then (offset / blocksPerRound)
148148 else throw(("Please do not hurry. MRT party will start on " + toString(blocksOnGameStart)))
149149
150150 let currRoundHeight = (offset % blocksPerRound)
151151
152152 let currRoundHeightStart = ((currRoundNum * blocksPerRound) + blocksOnGameStart)
153153
154154 let currRoundCompetitionEnd = (currRoundHeightStart + blocksPerCompetition)
155155
156156 let currRoundDataList = readRoundDataListOrFail(currRoundNum)
157157
158158 let currWinHeight = parseIntValue(currRoundDataList[IdxWinHeight])
159159
160160 let currMinPmtAmt = pmtStep
161161
162162 func isWinByHeight (h) = (height >= h)
163163
164164
165165 let atLeastOneMoveInRoundPresent = (currWinHeight > currRoundHeightStart)
166166
167167 let firstCountdownFinished = if ((currWinHeight == 0))
168168 then isWinByHeight((currRoundHeightStart + heightStep))
169169 else false
170170
171171 let isPauseByWin = if (isWinByHeight(currWinHeight))
172172 then atLeastOneMoveInRoundPresent
173173 else false
174174
175175 let isPauseByTime = if ((currRoundHeight > blocksPerCompetition))
176176 then true
177177 else firstCountdownFinished
178178
179179 let isPause = if (isPauseByWin)
180180 then true
181181 else isPauseByTime
182182
183183 let isCompetition = !(isPause)
184184
185185 @Callable(inv)
186186 func move () = {
187187 let overflowedNewWinHeight = (height + heightStep)
188188 let newWinHeight = if ((overflowedNewWinHeight >= currRoundCompetitionEnd))
189189 then currRoundCompetitionEnd
190190 else overflowedNewWinHeight
191191 let payment = if (isDefined(inv.payment))
192192 then extract(inv.payment)
193193 else throw("Please attach payment with MRT to participate in MRT party")
194194 if ((currRoundNum >= maxRounds))
195195 then throw("MRT party is over")
196196 else if (isPause)
197197 then throw((("Sorry but round #" + toString(currRoundNum)) + " is finished."))
198198 else if ((payment.assetId != MRT))
199199 then throw("Please use MRT as a payment asset to participate in MRT party")
200200 else if ((currMinPmtAmt > payment.amount))
201201 then throw(("Sorry my friend but your payment is to small. Current min payment is " + toString(currMinPmtAmt)))
202202 else writeSetOfRoundData("MOVE", currRoundNum, newWinHeight, toBase58String(inv.callerPublicKey), inv.callerPublicKey, "?", 0)
203203 }
204204
205205
206206
207207 @Callable(inv)
208208 func registerLeasingTx (round,leasingId58) = {
209209 let leasingId = fromBase58String(leasingId58)
210210 let roundDataList = readRoundDataListOrFail(round)
211211 let winnerPubKey = fromBase58String(roundDataList[IdxWinPubKey])
212212 let leaseIdExpirationHeight = parseIntValue(roundDataList[IdxLeasingIdValidTill])
213213 if ((round > currRoundNum))
214214 then throw("Impossible to register leasing transaction for round in future")
215215 else if (if ((round == currRoundNum))
216216 then isCompetition
217217 else false)
218218 then throw("Impossible to register leasing transaction - winner has not been determined yet")
219219 else if ((size(fromBase58String(leasingId58)) > 100))
220220 then throw("Invalid leasing transaction id length")
221221 else if ((0 >= size(leasingId)))
222222 then throw("Leasing transaction id is not encoded as Base58 format")
223223 else if (isDefined(transactionHeightById(leasingId)))
224224 then throw("Passed leasingId has already existed in blockchain")
225225 else if (if ((leaseIdExpirationHeight != 0))
226226 then (leaseIdExpirationHeight > height)
227227 else false)
228228 then throw(("Leasing id can be re-registered only on " + toString(leaseIdExpirationHeight)))
229- else if ((roundDataList[IdxLeasingId] != "?"))
230- then throw(("Leasing tx id has already registered for round " + toString(round)))
231- else if ((inv.callerPublicKey != winnerPubKey))
232- then throw("Leasing tx can be registered by round winner only")
233- else {
234- let roundWinHeight = parseIntValue(roundDataList[IdxWinHeight])
235- writeSetOfRoundData("LEASING", round, roundWinHeight, roundDataList[IdxWinPubKey], toBytes(""), leasingId58, (height + leasingIdLifetime))
236- }
229+ else if ((inv.callerPublicKey != winnerPubKey))
230+ then throw("Leasing tx can be registered by round winner only")
231+ else {
232+ let roundWinHeight = parseIntValue(roundDataList[IdxWinHeight])
233+ writeSetOfRoundData("LEASING", round, roundWinHeight, roundDataList[IdxWinPubKey], toBytes(""), leasingId58, (height + leasingIdLifetime))
234+ }
237235 }
238236
239237
240238 @Verifier(tx)
241239 func verify () = {
242240 let leasingPeriodEnded = (height > ((blocksOnGameStart + (maxRounds * blocksPerRound)) + leasingPeriod))
243241 match tx {
244242 case ltx: LeaseTransaction =>
245243 let sig = ltx.proofs[0]
246244 let round = valueOrErrorMessage(parseInt(proofToStr(ltx.proofs[1])), "Error during converting round num into integer representation")
247245 let roundDataList = readRoundDataListOrFail(round)
248246 let roundWinPubKey = fromBase58String(roundDataList[IdxWinPubKey])
249247 let registeredLeasingId = fromBase58String(roundDataList[IdxLeasingId])
250248 let leaseIdExpirationHeight = parseIntValue(roundDataList[IdxLeasingIdValidTill])
251249 if (leasingPeriodEnded)
252250 then throw("Sorry but leasing period has been ended")
253251 else if ((height > (leaseIdExpirationHeight - leasingIdDiffInLifetime)))
254252 then throw("Sorry but lifetime of your leasing transaction id has been expired")
255253 else if (!(sigVerify(ltx.bodyBytes, sig, roundWinPubKey)))
256254 then throw("Invalid leasing transaction signature. Leasing is allowed for winner only.")
257255 else if ((ltx.id != registeredLeasingId))
258256 then throw("Leasing transaction id doesn't match with registered leasing id")
259257 else if ((ltx.amount != leasingAmt))
260258 then throw(("Impossible to lease less or greater than " + toString(leasingAmt)))
261259 else if ((ltx.fee != MinFEE))
262260 then throw(("Impossible to lease with fee less or greater than " + toString(MinFEE)))
263261 else true
264262 case cltx: LeaseCancelTransaction =>
265263 if (!(leasingPeriodEnded))
266264 then throw("MRT party has not finished yet. Leasing Cancel is not allowed.")
267265 else if (!(sigVerify(tx.bodyBytes, tx.proofs[0], partyOwnerPubKey)))
268266 then throw("Leasing Cancel is allowed to Party Owner only")
269267 else if ((cltx.fee != MinFEE))
270268 then throw(("Impossible to cancle leasing with fee less or greater than " + toString(MinFEE)))
271269 else true
272270 case ttx: TransferTransaction =>
273271 if (!(leasingPeriodEnded))
274272 then throw("MRT party has not finished yet. Transfer is not allowed.")
275273 else if ((addressFromRecipient(ttx.recipient).bytes != partyOwnerAddress.bytes))
276274 then throw("Transfer is allowed to Party Owner address only")
277275 else if (!(sigVerify(ttx.bodyBytes, ttx.proofs[0], partyOwnerPubKey)))
278276 then throw("Transfer is allowed for Party Owner only.")
279277 else true
280278 case stx: SetScriptTransaction =>
281279 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
282280 case _ =>
283281 false
284282 }
285283 }
286284

github/deemru/w8io/169f3d6 
54.42 ms