tx · HMQRru8fYMCm2thR1zVc4YaFsSEn5TSnZBqAmYSszHnM

3MunKSDd9GiwGAL2vGHjbSpjTSbm2ethZVz:  -0.01000000 Waves

2019.10.31 12:41 [744169] smart account 3MunKSDd9GiwGAL2vGHjbSpjTSbm2ethZVz > SELF 0.00000000 Waves

{ "type": 13, "id": "HMQRru8fYMCm2thR1zVc4YaFsSEn5TSnZBqAmYSszHnM", "fee": 1000000, "feeAssetId": null, "timestamp": 1572514940258, "version": 1, "sender": "3MunKSDd9GiwGAL2vGHjbSpjTSbm2ethZVz", "senderPublicKey": "H5NZWEtpUHwnUzzBKAEQ4kScKKrpbpSrQScivTxj8qsm", "proofs": [ "5PF4uqvA4i9X3qKfFKa2fJ2H1QavYLawssYS5v6RgepnTuWoV4WMPE3vSjBLYNvwCj9vWUuK5TVGCZW4N8JMMpF6" ], "script": "base64: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ZEhlaWdodFN0YXJ0CQAAZAAAAAIJAABoAAAAAgUAAAAMY3VyclJvdW5kTnVtBQAAAA5ibG9ja3NQZXJSb3VuZAUAAAARYmxvY2tzT25HYW1lU3RhcnQAAAAAF2N1cnJSb3VuZENvbXBldGl0aW9uRW5kCQAAZAAAAAIFAAAAFGN1cnJSb3VuZEhlaWdodFN0YXJ0BQAAABRibG9ja3NQZXJDb21wZXRpdGlvbgAAAAARY3VyclJvdW5kRGF0YUxpc3QJAQAAABdyZWFkUm91bmREYXRhTGlzdE9yRmFpbAAAAAEFAAAADGN1cnJSb3VuZE51bQAAAAANY3VycldpbkhlaWdodAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAAEWN1cnJSb3VuZERhdGFMaXN0BQAAAAxJZHhXaW5IZWlnaHQAAAAADWN1cnJNaW5QbXRBbXQFAAAAB3BtdFN0ZXABAAAADWlzV2luQnlIZWlnaHQAAAABAAAAAWgJAABnAAAAAgUAAAAGaGVpZ2h0BQAAAAFoAAAAABxhdExlYXN0T25lTW92ZUluUm91bmRQcmVzZW50CQAAZgAAAAIFAAAADWN1cnJXaW5IZWlnaHQFAAAAFGN1cnJSb3VuZEhlaWdodFN0YXJ0AAAAABZmaXJzdENvdW50ZG93bkZpbmlzaGVkAwkAAAAAAAACBQAAAA1jdXJyV2luSGVpZ2h0AAAAAAAAAAAACQEAAAANaXNXaW5CeUhlaWdodAAAAAEJAABkAAAAAgUAAAAUY3VyclJvdW5kSGVpZ2h0U3RhcnQFAAAACmhlaWdodFN0ZXAHAAAAAAxpc1BhdXNlQnlXaW4DCQEAAAANaXNXaW5CeUhlaWdodAAAAAEFAAAADWN1cnJXaW5IZWlnaHQFAAAAHGF0TGVhc3RPbmVNb3ZlSW5Sb3VuZFByZXNlbnQHAAAAAA1pc1BhdXNlQnlUaW1lAwkAAGYAAAACBQAAAA9jdXJyUm91bmRIZWlnaHQFAAAAFGJsb2Nrc1BlckNvbXBldGl0aW9uBgUAAAAWZmlyc3RDb3VudGRvd25GaW5pc2hlZAAAAAAHaXNQYXVzZQMFAAAADGlzUGF1c2VCeVdpbgYFAAAADWlzUGF1c2VCeVRpbWUAAAAADWlzQ29tcGV0aXRpb24JAQAAAAEhAAAAAQUAAAAHaXNQYXVzZQAAAAIAAAADaW52AQAAAARtb3ZlAAAAAAQAAAAWb3ZlcmZsb3dlZE5ld1dpbkhlaWdodAkAAGQAAAACBQAAAAZoZWlnaHQFAAAACmhlaWdodFN0ZXAEAAAADG5ld1dpbkhlaWdodAMJAABnAAAAAgUAAAAWb3ZlcmZsb3dlZE5ld1dpbkhlaWdodAUAAAAXY3VyclJvdW5kQ29tcGV0aXRpb25FbmQFAAAAF2N1cnJSb3VuZENvbXBldGl0aW9uRW5kBQAAABZvdmVyZmxvd2VkTmV3V2luSGVpZ2h0BAAAAAdwYXltZW50AwkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAANpbnYAAAAHcGF5bWVudAkBAAAAB2V4dHJhY3QAAAABCAUAAAADaW52AAAAB3BheW1lbnQJAAACAAAAAQIAAAA6UGxlYXNlIGF0dGFjaCBwYXltZW50IHdpdGggTVJUIHRvIHBhcnRpY2lwYXRlIGluIE1SVCBwYXJ0eQMJAABnAAAAAgUAAAAMY3VyclJvdW5kTnVtBQAAAAltYXhSb3VuZHMJAAACAAAAAQIAAAARTVJUIHBhcnR5IGlzIG92ZXIDBQAAAAdpc1BhdXNlCQAAAgAAAAEJAAEsAAAAAgkAASwAAAACAgAAABFTb3JyeSBidXQgcm91bmQgIwkAAaQAAAABBQAAAAxjdXJyUm91bmROdW0CAAAADSBpcyBmaW5pc2hlZC4DCQEAAAACIT0AAAACCAUAAAAHcGF5bWVudAAAAAdhc3NldElkBQAAAANNUlQJAAACAAAAAQIAAAA9UGxlYXNlIHVzZSBNUlQgYXMgYSBwYXltZW50IGFzc2V0IHRvIHBhcnRpY2lwYXRlIGluIE1SVCBwYXJ0eQMJAABmAAAAAgUAAAANY3Vyck1pblBtdEFtdAgFAAAAB3BheW1lbnQAAAAGYW1vdW50CQAAAgAAAAEJAAEsAAAAAgIAAABGU29ycnkgbXkgZnJpZW5kIGJ1dCB5b3VyIHBheW1lbnQgaXMgdG9vIHNtYWxsLiBDdXJyZW50IG1pbiBwYXltZW50IGlzIAkAAaQAAAABBQAAAA1jdXJyTWluUG10QW10CQEAAAATd3JpdGVTZXRPZlJvdW5kRGF0YQAAAAcCAAAABE1PVkUFAAAADGN1cnJSb3VuZE51bQUAAAAMbmV3V2luSGVpZ2h0CQAEJQAAAAEJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEIBQAAAANpbnYAAAAPY2FsbGVyUHVibGljS2V5CQACWAAAAAEIBQAAAANpbnYAAAAPY2FsbGVyUHVibGljS2V5AgAAAAE/AAAAAAAAAAAAAAAAA2ludgEAAAARcmVnaXN0ZXJMZWFzaW5nVHgAAAACAAAABXJvdW5kAAAAC2xlYXNpbmdJZDU4BAAAAAlsZWFzaW5nSWQJAAJZAAAAAQUAAAALbGVhc2luZ0lkNTgEAAAADXJvdW5kRGF0YUxpc3QJAQAAABdyZWFkUm91bmREYXRhTGlzdE9yRmFpbAAAAAEFAAAABXJvdW5kBAAAAA9wcmV2TGVhc2luZ0lkNTgJAAGRAAAAAgUAAAANcm91bmREYXRhTGlzdAUAAAAMSWR4TGVhc2luZ0lkBAAAAA1wcmV2TGVhc2luZ0lkAwkAAAAAAAACBQAAAA9wcmV2TGVhc2luZ0lkNTgCAAAAAT8JAAJZAAAAAQIAAAAHZW1wdHlpZAkAAlkAAAABBQAAAA9wcmV2TGVhc2luZ0lkNTgEAAAADHdpbm5lclB1YktleQkAAlkAAAABCQABkQAAAAIFAAAADXJvdW5kRGF0YUxpc3QFAAAADElkeFdpblB1YktleQQAAAAXbGVhc2VJZEV4cGlyYXRpb25IZWlnaHQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAA1yb3VuZERhdGFMaXN0BQAAABVJZHhMZWFzaW5nSWRWYWxpZFRpbGwDCQAAZgAAAAIFAAAABXJvdW5kBQAAAAxjdXJyUm91bmROdW0JAAACAAAAAQIAAAA+SW1wb3NzaWJsZSB0byByZWdpc3RlciBsZWFzaW5nIHRyYW5zYWN0aW9uIGZvciByb3VuZCBpbiBmdXR1cmUDAwkAAAAAAAACBQAAAAVyb3VuZAUAAAAMY3VyclJvdW5kTnVtBQAAAA1pc0NvbXBldGl0aW9uBwkAAAIAAAABAgAAAE9JbXBvc3NpYmxlIHRvIHJlZ2lzdGVyIGxlYXNpbmcgdHJhbnNhY3Rpb24gLSB3aW5uZXIgaGFzIG5vdCBiZWVuIGRldGVybWluZWQgeWV0AwkAAGYAAAACCQAAyAAAAAEFAAAACWxlYXNpbmdJZAAAAAAAAAAAZAkAAAIAAAABAgAAACVJbnZhbGlkIGxlYXNpbmcgdHJhbnNhY3Rpb24gaWQgbGVuZ3RoAwkAAGcAAAACAAAAAAAAAAAACQAAyAAAAAEFAAAACWxlYXNpbmdJZAkAAAIAAAABAgAAADZMZWFzaW5nIHRyYW5zYWN0aW9uIGlkIGlzIG5vdCBlbmNvZGVkIGFzIEJhc2U1OCBmb3JtYXQDCQEAAAAJaXNEZWZpbmVkAAAAAQkAA+kAAAABBQAAAAlsZWFzaW5nSWQJAAACAAAAAQIAAAAyUGFzc2VkIGxlYXNpbmdJZCBoYXMgYWxyZWFkeSBleGlzdGVkIGluIGJsb2NrY2hhaW4DCQEAAAAJaXNEZWZpbmVkAAAAAQkAA+kAAAABBQAAAA1wcmV2TGVhc2luZ0lkCQAAAgAAAAECAAAAP1ByZXZpb3VzIHJlZ2lzdGVyZWQgbGVhc2luZ0lkIGhhcyBhbHJlYWR5IGV4aXN0ZWQgaW4gYmxvY2tjaGFpbgMDCQEAAAACIT0AAAACBQAAABdsZWFzZUlkRXhwaXJhdGlvbkhlaWdodAAAAAAAAAAAAAkAAGYAAAACBQAAABdsZWFzZUlkRXhwaXJhdGlvbkhlaWdodAUAAAAGaGVpZ2h0BwkAAAIAAAABCQABLAAAAAICAAAAKExlYXNpbmcgaWQgY2FuIGJlIHJlLXJlZ2lzdGVyZWQgb25seSBvbiAJAAGkAAAAAQUAAAAXbGVhc2VJZEV4cGlyYXRpb25IZWlnaHQDCQEAAAACIT0AAAACCAUAAAADaW52AAAAD2NhbGxlclB1YmxpY0tleQUAAAAMd2lubmVyUHViS2V5CQAAAgAAAAECAAAAMUxlYXNpbmcgdHggY2FuIGJlIHJlZ2lzdGVyZWQgYnkgcm91bmQgd2lubmVyIG9ubHkEAAAADnJvdW5kV2luSGVpZ2h0CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAANcm91bmREYXRhTGlzdAUAAAAMSWR4V2luSGVpZ2h0CQEAAAATd3JpdGVTZXRPZlJvdW5kRGF0YQAAAAcCAAAAB0xFQVNJTkcFAAAABXJvdW5kBQAAAA5yb3VuZFdpbkhlaWdodAkAAZEAAAACBQAAAA1yb3VuZERhdGFMaXN0BQAAAA1JZHhXaW5BZGRyZXNzCQABkQAAAAIFAAAADXJvdW5kRGF0YUxpc3QFAAAADElkeFdpblB1YktleQUAAAALbGVhc2luZ0lkNTgJAABkAAAAAgUAAAAGaGVpZ2h0BQAAABFsZWFzaW5nSWRMaWZldGltZQAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAEAAAAEmxlYXNpbmdQZXJpb2RFbmRlZAkAAGYAAAACBQAAAAZoZWlnaHQJAABkAAAAAgkAAGQAAAACBQAAABFibG9ja3NPbkdhbWVTdGFydAkAAGgAAAACBQAAAAltYXhSb3VuZHMFAAAADmJsb2Nrc1BlclJvdW5kBQAAAA1sZWFzaW5nUGVyaW9kBAAAAAckbWF0Y2gwBQAAAAJ0eAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAQTGVhc2VUcmFuc2FjdGlvbgQAAAADbHR4BQAAAAckbWF0Y2gwBAAAAANzaWcJAAGRAAAAAggFAAAAA2x0eAAAAAZwcm9vZnMAAAAAAAAAAAAEAAAADnJvdW5kQmFzZTU4U3RyCQACWAAAAAEJAAGRAAAAAggFAAAAA2x0eAAAAAZwcm9vZnMAAAAAAAAAAAEEAAAABXJvdW5kCQEAAAATdmFsdWVPckVycm9yTWVzc2FnZQAAAAIJAAS2AAAAAQkBAAAACnByb29mVG9TdHIAAAABBQAAAA5yb3VuZEJhc2U1OFN0cgIAAAA9RXJyb3IgZHVyaW5nIGNvbnZlcnRpbmcgcm91bmQgbnVtIGludG8gaW50ZWdlciByZXByZXNlbnRhdGlvbgQAAAANcm91bmREYXRhTGlzdAkBAAAAF3JlYWRSb3VuZERhdGFMaXN0T3JGYWlsAAAAAQUAAAAFcm91bmQEAAAADnJvdW5kV2luUHViS2V5CQACWQAAAAEJAAGRAAAAAgUAAAANcm91bmREYXRhTGlzdAUAAAAMSWR4V2luUHViS2V5BAAAABNyZWdpc3RlcmVkTGVhc2luZ0lkCQACWQAAAAEJAAGRAAAAAgUAAAANcm91bmREYXRhTGlzdAUAAAAMSWR4TGVhc2luZ0lkBAAAABdsZWFzZUlkRXhwaXJhdGlvbkhlaWdodAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADXJvdW5kRGF0YUxpc3QFAAAAFUlkeExlYXNpbmdJZFZhbGlkVGlsbAMFAAAAEmxlYXNpbmdQZXJpb2RFbmRlZAkAAAIAAAABAgAAACdTb3JyeSBidXQgbGVhc2luZyBwZXJpb2QgaGFzIGJlZW4gZW5kZWQDCQAAZgAAAAIFAAAABmhlaWdodAkAAGUAAAACBQAAABdsZWFzZUlkRXhwaXJhdGlvbkhlaWdodAUAAAAXbGVhc2luZ0lkRGlmZkluTGlmZXRpbWUJAAACAAAAAQIAAABCU29ycnkgYnV0IGxpZmV0aW1lIG9mIHlvdXIgbGVhc2luZyB0cmFuc2FjdGlvbiBpZCBoYXMgYmVlbiBleHBpcmVkAwkBAAAAASEAAAABCQAB9AAAAAMIBQAAAANsdHgAAAAJYm9keUJ5dGVzBQAAAANzaWcFAAAADnJvdW5kV2luUHViS2V5CQAAAgAAAAECAAAASkludmFsaWQgbGVhc2luZyB0cmFuc2FjdGlvbiBzaWduYXR1cmUuIExlYXNpbmcgaXMgYWxsb3dlZCBmb3Igd2lubmVyIG9ubHkuAwkBAAAAAiE9AAAAAggFAAAAA2x0eAAAAAJpZAUAAAATcmVnaXN0ZXJlZExlYXNpbmdJZAkAAAIAAAABAgAAAD9MZWFzaW5nIHRyYW5zYWN0aW9uIGlkIGRvZXNuJ3QgbWF0Y2ggd2l0aCByZWdpc3RlcmVkIGxlYXNpbmcgaWQDCQEAAAACIT0AAAACCAUAAAADbHR4AAAABmFtb3VudAUAAAAKbGVhc2luZ0FtdAkAAAIAAAABCQABLAAAAAICAAAAKUltcG9zc2libGUgdG8gbGVhc2UgbGVzcyBvciBncmVhdGVyIHRoYW4gCQABpAAAAAEFAAAACmxlYXNpbmdBbXQDCQEAAAACIT0AAAACCAUAAAADbHR4AAAAA2ZlZQUAAAAGTWluRkVFCQAAAgAAAAEJAAEsAAAAAgIAAAAySW1wb3NzaWJsZSB0byBsZWFzZSB3aXRoIGZlZSBsZXNzIG9yIGdyZWF0ZXIgdGhhbiAJAAGkAAAAAQUAAAAGTWluRkVFBgMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAWTGVhc2VDYW5jZWxUcmFuc2FjdGlvbgQAAAAEY2x0eAUAAAAHJG1hdGNoMAMJAQAAAAEhAAAAAQUAAAASbGVhc2luZ1BlcmlvZEVuZGVkCQAAAgAAAAECAAAAPk1SVCBwYXJ0eSBoYXMgbm90IGZpbmlzaGVkIHlldC4gTGVhc2luZyBDYW5jZWwgaXMgbm90IGFsbG93ZWQuAwkBAAAAASEAAAABCQAB9AAAAAMIBQAAAARjbHR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAAEY2x0eAAAAAZwcm9vZnMAAAAAAAAAAAAFAAAAEHBhcnR5T3duZXJQdWJLZXkJAAACAAAAAQIAAAAtTGVhc2luZyBDYW5jZWwgaXMgYWxsb3dlZCB0byBQYXJ0eSBPd25lciBvbmx5AwkBAAAAAiE9AAAAAggFAAAABGNsdHgAAAADZmVlBQAAAAZNaW5GRUUJAAACAAAAAQkAASwAAAACAgAAADtJbXBvc3NpYmxlIHRvIGNhbmNlbCBsZWFzaW5nIHdpdGggZmVlIGxlc3Mgb3IgZ3JlYXRlciB0aGFuIAkAAaQAAAABBQAAAAZNaW5GRUUGAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAABNUcmFuc2ZlclRyYW5zYWN0aW9uBAAAAAN0dHgFAAAAByRtYXRjaDADCQEAAAABIQAAAAEFAAAAEmxlYXNpbmdQZXJpb2RFbmRlZAkAAAIAAAABAgAAADhNUlQgcGFydHkgaGFzIG5vdCBmaW5pc2hlZCB5ZXQuIFRyYW5zZmVyIGlzIG5vdCBhbGxvd2VkLgMJAQAAAAEhAAAAAQkAAfQAAAADCAUAAAADdHR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAADdHR4AAAABnByb29mcwAAAAAAAAAAAAUAAAAQcGFydHlPd25lclB1YktleQkAAAIAAAABAgAAAClUcmFuc2ZlciBpcyBhbGxvd2VkIGZvciBQYXJ0eSBPd25lciBvbmx5LgMJAQAAAAIhPQAAAAIIBQAAAAN0dHgAAAADZmVlBQAAAAZNaW5GRUUJAAACAAAAAQkAASwAAAACAgAAADVJbXBvc3NpYmxlIHRvIHRyYW5zZmVyIHdpdGggZmVlIGxlc3Mgb3IgZ3JlYXRlciB0aGFuIAkAAaQAAAABBQAAAAZNaW5GRUUGAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAA9CdXJuVHJhbnNhY3Rpb24EAAAAA2J0eAUAAAAHJG1hdGNoMAMJAQAAAAEhAAAAAQUAAAASbGVhc2luZ1BlcmlvZEVuZGVkCQAAAgAAAAECAAAAOE1SVCBwYXJ0eSBoYXMgbm90IGZpbmlzaGVkIHlldC4gVHJhbnNmZXIgaXMgbm90IGFsbG93ZWQuAwkBAAAAASEAAAABCQAB9AAAAAMIBQAAAANidHgAAAAJYm9keUJ5dGVzCQABkQAAAAIIBQAAAANidHgAAAAGcHJvb2ZzAAAAAAAAAAAABQAAABBwYXJ0eU93bmVyUHViS2V5CQAAAgAAAAECAAAAKVRyYW5zZmVyIGlzIGFsbG93ZWQgZm9yIFBhcnR5IE93bmVyIG9ubHkuAwkBAAAAAiE9AAAAAggFAAAAA2J0eAAAAANmZWUFAAAABk1pbkZFRQkAAAIAAAABCQABLAAAAAICAAAAMUltcG9zc2libGUgdG8gYnVybiB3aXRoIGZlZSBsZXNzIG9yIGdyZWF0ZXIgdGhhbiAJAAGkAAAAAQUAAAAGTWluRkVFBgfrWjR7", "chainId": 84, "height": 744169, "spentComplexity": 0 } View: original | compacted Prev: none Next: none Full:
OldNewDifferences
1-# no script
1+{-# STDLIB_VERSION 3 #-}
2+{-# SCRIPT_TYPE ACCOUNT #-}
3+{-# CONTENT_TYPE DAPP #-}
4+let WAVELET = ((100 * 1000) * 1000)
5+
6+let MRTEC = 100
7+
8+let maxRounds = 1
9+
10+let pmtStep = (10 * MRTEC)
11+
12+let partyOwnerPubKey = fromBase58String("4f8jYJccCjarVgc8FHn5ms5YLkpi6PfHpxTnmjQZMkJk")
13+
14+let partyOwnerAddress = addressFromPublicKey(partyOwnerPubKey)
15+
16+let leasingPeriod = 5
17+
18+let leasingIdLifetime = 4
19+
20+let leasingIdDiffInLifetime = 2
21+
22+let leasingAmt = (1 * WAVELET)
23+
24+let heightStep = 3
25+
26+let blocksOnGameStart = 744170
27+
28+let blocksPerRound = 7
29+
30+let blocksPerCompetition = 4
31+
32+let MRT = fromBase58String("4kXefVgE5k7QMPGzsHozkiXeqJ1V25J4gyZiB24WLDqw")
33+
34+let MinFEE = ((5 * WAVELET) / 1000)
35+
36+let IdxWinHeight = 0
37+
38+let IdxWinAddress = 1
39+
40+let IdxWinPubKey = 2
41+
42+let IdxLeasingId = 3
43+
44+let IdxLeasingIdValidTill = 4
45+
46+func convertChar (charBase58) = {
47+ let B0 = "q"
48+ let B1 = "r"
49+ let B2 = "s"
50+ let B3 = "t"
51+ let B4 = "u"
52+ let B5 = "v"
53+ let B6 = "w"
54+ let B7 = "x"
55+ let B8 = "y"
56+ let B9 = "z"
57+ if ((charBase58 == B0))
58+ then "0"
59+ else if ((charBase58 == B1))
60+ then "1"
61+ else if ((charBase58 == B2))
62+ then "2"
63+ else if ((charBase58 == B3))
64+ then "3"
65+ else if ((charBase58 == B4))
66+ then "4"
67+ else if ((charBase58 == B5))
68+ then "5"
69+ else if ((charBase58 == B6))
70+ then "6"
71+ else if ((charBase58 == B7))
72+ then "7"
73+ else if ((charBase58 == B8))
74+ then "8"
75+ else if ((charBase58 == B9))
76+ then "9"
77+ else throw("Unsupported char")
78+ }
79+
80+
81+func proofToStr (roundNumProof) = {
82+ let s = size(roundNumProof)
83+ if ((s > 2))
84+ then throw("Invalid encoded round - size couldn't be greater than 2")
85+ else if ((0 >= s))
86+ then throw("Invalid encoded round - size couldn't be less than or equals 0")
87+ else if ((s == 1))
88+ then convertChar(take(roundNumProof, 1))
89+ else if ((s == 2))
90+ then (convertChar(take(roundNumProof, 1)) + convertChar(take(drop(roundNumProof, 1), 1)))
91+ else throw("Invalid encoded round")
92+ }
93+
94+
95+func getRoundDataKeyOrFail (round) = if ((0 > round))
96+ then throw("Invalid round number")
97+ else ("round" + toString(round))
98+
99+
100+func readRoundDataListOrFail (round) = {
101+ let roundDataOpt = getString(this, getRoundDataKeyOrFail(round))
102+ let roundDataStr = if (isDefined(roundDataOpt))
103+ then extract(roundDataOpt)
104+ else ""
105+ if ((roundDataStr != ""))
106+ then split(roundDataStr, "_")
107+ else ["0", toString(pmtStep), "?", "?", "?", "0"]
108+ }
109+
110+
111+func readSharedState () = {
112+ let sharedStateOpt = getString(this, "RoundsSharedState")
113+ let sharedStateStr = if (isDefined(sharedStateOpt))
114+ then extract(sharedStateOpt)
115+ else ""
116+ if ((sharedStateStr != ""))
117+ then split(sharedStateStr, "_")
118+ else ["", "0", ""]
119+ }
120+
121+
122+func writeSetOfRoundData (type,round,newWinHeight,newWinAddressStr,newWinPubKeyStr,leasingId58,leaseIdExpirationHeight) = {
123+ let newWinHeightStr = toString(newWinHeight)
124+ let roundData = DataEntry(getRoundDataKeyOrFail(round), ((((((((newWinHeightStr + "_") + newWinAddressStr) + "_") + newWinPubKeyStr) + "_") + leasingId58) + "_") + toString(leaseIdExpirationHeight)))
125+ if ((type == "MOVE"))
126+ then {
127+ let addressLength = size(newWinAddressStr)
128+ let sharedState = readSharedState()
129+ let newTotalGamesCountStr = toString((parseIntValue(sharedState[1]) + 1))
130+ let currLastPlayersAddr = sharedState[2]
131+ let newLastPlayersAddr = if (if ((currLastPlayersAddr != ""))
132+ then (size(currLastPlayersAddr) > ((addressLength + 1) * 10))
133+ else false)
134+ then (("-" + newWinAddressStr) + dropRight(currLastPlayersAddr, (addressLength + 1)))
135+ else (("-" + newWinAddressStr) + currLastPlayersAddr)
136+ WriteSet([roundData, DataEntry("RoundsSharedState", ((((newWinHeightStr + "_") + newTotalGamesCountStr) + "_") + newLastPlayersAddr))])
137+ }
138+ else if ((type == "LEASING"))
139+ then WriteSet([roundData])
140+ else throw(("Unsupported type in writeSetOfRoundData method: " + type))
141+ }
142+
143+
144+let offset = (height - blocksOnGameStart)
145+
146+let currRoundNum = if ((offset >= 0))
147+ then (offset / blocksPerRound)
148+ else throw(("Please do not hurry. MRT party will start on " + toString(blocksOnGameStart)))
149+
150+let currRoundHeight = (offset % blocksPerRound)
151+
152+let currRoundHeightStart = ((currRoundNum * blocksPerRound) + blocksOnGameStart)
153+
154+let currRoundCompetitionEnd = (currRoundHeightStart + blocksPerCompetition)
155+
156+let currRoundDataList = readRoundDataListOrFail(currRoundNum)
157+
158+let currWinHeight = parseIntValue(currRoundDataList[IdxWinHeight])
159+
160+let currMinPmtAmt = pmtStep
161+
162+func isWinByHeight (h) = (height >= h)
163+
164+
165+let atLeastOneMoveInRoundPresent = (currWinHeight > currRoundHeightStart)
166+
167+let firstCountdownFinished = if ((currWinHeight == 0))
168+ then isWinByHeight((currRoundHeightStart + heightStep))
169+ else false
170+
171+let isPauseByWin = if (isWinByHeight(currWinHeight))
172+ then atLeastOneMoveInRoundPresent
173+ else false
174+
175+let isPauseByTime = if ((currRoundHeight > blocksPerCompetition))
176+ then true
177+ else firstCountdownFinished
178+
179+let isPause = if (isPauseByWin)
180+ then true
181+ else isPauseByTime
182+
183+let isCompetition = !(isPause)
184+
185+@Callable(inv)
186+func move () = {
187+ let overflowedNewWinHeight = (height + heightStep)
188+ let newWinHeight = if ((overflowedNewWinHeight >= currRoundCompetitionEnd))
189+ then currRoundCompetitionEnd
190+ else overflowedNewWinHeight
191+ let payment = if (isDefined(inv.payment))
192+ then extract(inv.payment)
193+ else throw("Please attach payment with MRT to participate in MRT party")
194+ if ((currRoundNum >= maxRounds))
195+ then throw("MRT party is over")
196+ else if (isPause)
197+ then throw((("Sorry but round #" + toString(currRoundNum)) + " is finished."))
198+ else if ((payment.assetId != MRT))
199+ then throw("Please use MRT as a payment asset to participate in MRT party")
200+ else if ((currMinPmtAmt > payment.amount))
201+ then throw(("Sorry my friend but your payment is too small. Current min payment is " + toString(currMinPmtAmt)))
202+ else writeSetOfRoundData("MOVE", currRoundNum, newWinHeight, toString(addressFromPublicKey(inv.callerPublicKey)), toBase58String(inv.callerPublicKey), "?", 0)
203+ }
204+
205+
206+
207+@Callable(inv)
208+func registerLeasingTx (round,leasingId58) = {
209+ let leasingId = fromBase58String(leasingId58)
210+ let roundDataList = readRoundDataListOrFail(round)
211+ let prevLeasingId58 = roundDataList[IdxLeasingId]
212+ let prevLeasingId = if ((prevLeasingId58 == "?"))
213+ then fromBase58String("emptyid")
214+ else fromBase58String(prevLeasingId58)
215+ let winnerPubKey = fromBase58String(roundDataList[IdxWinPubKey])
216+ let leaseIdExpirationHeight = parseIntValue(roundDataList[IdxLeasingIdValidTill])
217+ if ((round > currRoundNum))
218+ then throw("Impossible to register leasing transaction for round in future")
219+ else if (if ((round == currRoundNum))
220+ then isCompetition
221+ else false)
222+ then throw("Impossible to register leasing transaction - winner has not been determined yet")
223+ else if ((size(leasingId) > 100))
224+ then throw("Invalid leasing transaction id length")
225+ else if ((0 >= size(leasingId)))
226+ then throw("Leasing transaction id is not encoded as Base58 format")
227+ else if (isDefined(transactionHeightById(leasingId)))
228+ then throw("Passed leasingId has already existed in blockchain")
229+ else if (isDefined(transactionHeightById(prevLeasingId)))
230+ then throw("Previous registered leasingId has already existed in blockchain")
231+ else if (if ((leaseIdExpirationHeight != 0))
232+ then (leaseIdExpirationHeight > height)
233+ else false)
234+ then throw(("Leasing id can be re-registered only on " + toString(leaseIdExpirationHeight)))
235+ else if ((inv.callerPublicKey != winnerPubKey))
236+ then throw("Leasing tx can be registered by round winner only")
237+ else {
238+ let roundWinHeight = parseIntValue(roundDataList[IdxWinHeight])
239+ writeSetOfRoundData("LEASING", round, roundWinHeight, roundDataList[IdxWinAddress], roundDataList[IdxWinPubKey], leasingId58, (height + leasingIdLifetime))
240+ }
241+ }
242+
243+
244+@Verifier(tx)
245+func verify () = {
246+ let leasingPeriodEnded = (height > ((blocksOnGameStart + (maxRounds * blocksPerRound)) + leasingPeriod))
247+ match tx {
248+ case ltx: LeaseTransaction =>
249+ let sig = ltx.proofs[0]
250+ let roundBase58Str = toBase58String(ltx.proofs[1])
251+ let round = valueOrErrorMessage(parseInt(proofToStr(roundBase58Str)), "Error during converting round num into integer representation")
252+ let roundDataList = readRoundDataListOrFail(round)
253+ let roundWinPubKey = fromBase58String(roundDataList[IdxWinPubKey])
254+ let registeredLeasingId = fromBase58String(roundDataList[IdxLeasingId])
255+ let leaseIdExpirationHeight = parseIntValue(roundDataList[IdxLeasingIdValidTill])
256+ if (leasingPeriodEnded)
257+ then throw("Sorry but leasing period has been ended")
258+ else if ((height > (leaseIdExpirationHeight - leasingIdDiffInLifetime)))
259+ then throw("Sorry but lifetime of your leasing transaction id has been expired")
260+ else if (!(sigVerify(ltx.bodyBytes, sig, roundWinPubKey)))
261+ then throw("Invalid leasing transaction signature. Leasing is allowed for winner only.")
262+ else if ((ltx.id != registeredLeasingId))
263+ then throw("Leasing transaction id doesn't match with registered leasing id")
264+ else if ((ltx.amount != leasingAmt))
265+ then throw(("Impossible to lease less or greater than " + toString(leasingAmt)))
266+ else if ((ltx.fee != MinFEE))
267+ then throw(("Impossible to lease with fee less or greater than " + toString(MinFEE)))
268+ else true
269+ case cltx: LeaseCancelTransaction =>
270+ if (!(leasingPeriodEnded))
271+ then throw("MRT party has not finished yet. Leasing Cancel is not allowed.")
272+ else if (!(sigVerify(cltx.bodyBytes, cltx.proofs[0], partyOwnerPubKey)))
273+ then throw("Leasing Cancel is allowed to Party Owner only")
274+ else if ((cltx.fee != MinFEE))
275+ then throw(("Impossible to cancel leasing with fee less or greater than " + toString(MinFEE)))
276+ else true
277+ case ttx: TransferTransaction =>
278+ if (!(leasingPeriodEnded))
279+ then throw("MRT party has not finished yet. Transfer is not allowed.")
280+ else if (!(sigVerify(ttx.bodyBytes, ttx.proofs[0], partyOwnerPubKey)))
281+ then throw("Transfer is allowed for Party Owner only.")
282+ else if ((ttx.fee != MinFEE))
283+ then throw(("Impossible to transfer with fee less or greater than " + toString(MinFEE)))
284+ else true
285+ case btx: BurnTransaction =>
286+ if (!(leasingPeriodEnded))
287+ then throw("MRT party has not finished yet. Transfer is not allowed.")
288+ else if (!(sigVerify(btx.bodyBytes, btx.proofs[0], partyOwnerPubKey)))
289+ then throw("Transfer is allowed for Party Owner only.")
290+ else if ((btx.fee != MinFEE))
291+ then throw(("Impossible to burn with fee less or greater than " + toString(MinFEE)))
292+ else true
293+ case _ =>
294+ false
295+ }
296+ }
297+

github/deemru/w8io/3ef1775 
36.87 ms