tx · AJy3WoVPhPodeF8TsZGEnTtMS9yvD2LzLMFLRwQxz1nh

3MrfW5HU9H1r5yAGY5Gzcr1A7ACNPLKsDcC:  -0.01500000 Waves

2019.07.17 10:07 [589518] smart account 3MrfW5HU9H1r5yAGY5Gzcr1A7ACNPLKsDcC > SELF 0.00000000 Waves

{ "type": 13, "id": "AJy3WoVPhPodeF8TsZGEnTtMS9yvD2LzLMFLRwQxz1nh", "fee": 1500000, "feeAssetId": null, "timestamp": 1563347236862, "version": 1, "sender": "3MrfW5HU9H1r5yAGY5Gzcr1A7ACNPLKsDcC", "senderPublicKey": "BDtnN9kD7UvV7LaFXb4HFhUc4ijcMMsbUJ7JU8ZUGv3t", "proofs": [ "3YH49oU18MusFbjxaf7qZimbCLrhtJReJ5V1RtovPjo46xSoZL9bvgWgaqM4tf7mHtd6VBFeGXCymsxQ7YpBAizr" ], "script": "base64:AAIDAAAAAAAAAAAAAABBAAAAAAlSU0FQVUJMSUMJAAJbAAAAAQIAAAGPYmFzZTY0Ok1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBbXB1WGNJL280cElCNXl3djlET09HYXBUQlV3UlZsTS82K0g2aEZlbE9YdGtyd1kvWUl0bVB4RURwejdyQWVyUVBRZTl0RFBFYUF2L0dubEV6dHliT0ZYZ3U5RHpEZThZb01SRDF2YWtnb0Fjb2dtYlk1OFFENktNajVIa29Wai95VE5JYzlzemo1cWhJbHJBZG1iM0tMTDZoUVU3eTgrSmo2OUJXVlBzYVFna3NwU2RlWXRiMXRIUWM3dDk1bjdPWjU2cjJBN0czK2JRZjZuU01rUGtBaElyRXBiQ201OG9pR0JjemRUZC9McUZTVm90WnNiTDdZaDZTSExmbkhlRCtRZ2NmSnJuYW04T0hNR0pFSlRSWGpJTGVIR2psUkNQOG9WcGlvSHJ5MVMyeFB4NXNWekltMk1NK0N6WWVuQUdsbzBqMjZhdEJoaVVMb1R1bHdEM3BRSURBUUFCAAAAAAZTRVJWRVIJAQAAABxAZXh0clVzZXIoYWRkcmVzc0Zyb21TdHJpbmcpAAAAAQIAAAAjM05DaUcyOExtV3lUaWdXRzEzRTVRbnZkSEJzWkZZWFNTMmoAAAAAE1JBTkRPUkFDTEVUSU1FRlJBTUUAAAAAAAAAEOAAAAAAB1dBVkVMRVQJAABoAAAAAgkAAGgAAAACAAAAAAAAAABkAAAAAAAAAAPoAAAAAAAAAAPoAAAAAApDT01NSVNTSU9OCQAAaQAAAAIJAABoAAAAAgAAAAAAAAAABQUAAAAHV0FWRUxFVAAAAAAAAAAD6AAAAAAGQkVUTUlOCQAAaQAAAAIJAABoAAAAAgAAAAAAAAAAAQUAAAAHV0FWRUxFVAAAAAAAAAAAAgAAAAAGQkVUTUFYCQAAaAAAAAIAAAAAAAAAAAYFAAAAB1dBVkVMRVQAAAAAB0JFVFNURVAJAABpAAAAAgkAAGgAAAACAAAAAAAAAAABBQAAAAdXQVZFTEVUAAAAAAAAAAAKAAAAAAlQUkVDSVNJT04AAAAAAAAAJxAAAAAABVIxTUFYAAAAAAAAAABgAAAAAAVSMU1JTgAAAAAAAAAAXgAAAAADUjFLAAAAAAAAACaEAAAAAAVSMk1BWAAAAAAAAAAAXQAAAAAFUjJNSU4AAAAAAAAAAFcAAAAAA1IySwAAAAAAAAAmSAAAAAAFUjNNQVgAAAAAAAAAAFYAAAAABVIzTUlOAAAAAAAAAABWAAAAAANSM0sAAAAAAAAAJhYAAAAABVI0TUFYAAAAAAAAAABVAAAAAAVSNE1JTgAAAAAAAAAAVAAAAAADUjRLAAAAAAAAACXGAAAAAAVSNU1BWAAAAAAAAAAAUwAAAAAFUjVNSU4AAAAAAAAAAFMAAAAAA1I1SwAAAAAAAAAlngAAAAAFUjZNQVgAAAAAAAAAAFIAAAAABVI2TUlOAAAAAAAAAABDAAAAAANSNksAAAAAAAAAJYoAAAAABVI3TUFYAAAAAAAAAABCAAAAAAVSN01JTgAAAAAAAAAAOAAAAAADUjdLAAAAAAAAACVYAAAAAAVSOE1BWAAAAAAAAAAANwAAAAAFUjhNSU4AAAAAAAAAACYAAAAAA1I4SwAAAAAAAAAlHAAAAAAFUjlNQVgAAAAAAAAAACUAAAAABVI5TUlOAAAAAAAAAAADAAAAAANSOUsAAAAAAAAAJEoAAAAABlIxME1BWAAAAAAAAAAAAgAAAAAGUjEwTUlOAAAAAAAAAAABAAAAAARSMTBLAAAAAAAAACaEAAAAAAxJZHhHYW1lU3RhdGUAAAAAAAAAAAAAAAAAD0lkeFBsYXllckNob2ljZQAAAAAAAAAAAQAAAAARSWR4UGxheWVyUHViS2V5NTgAAAAAAAAAAAIAAAAAEElkeFN0YXJ0ZWRIZWlnaHQAAAAAAAAAAAMAAAAACUlkeFdpbkFtdAAAAAAAAAAABAAAAAAOSWR4UmFuZE9yRW1wdHkAAAAAAAAAAAUAAAAADlJFU0VSVkFUSU9OS0VZAgAAABAkUkVTRVJWRURfQU1PVU5UAAAAAA9HQU1FU0NPVU5URVJLRVkCAAAACSRHQU1FX05VTQAAAAAOU1RBVEVTVUJNSVRURUQCAAAACVNVQk1JVFRFRAAAAAAIU1RBVEVXT04CAAAAA1dPTgAAAAAJU1RBVEVMT1NUAgAAAARMT1NUAQAAABBJbmNyZW1lbnRHYW1lTnVtAAAAAAQAAAAHZ2FtZU51bQQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAR0aGlzBQAAAA9HQU1FU0NPVU5URVJLRVkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAADbnVtBQAAAAckbWF0Y2gwBQAAAANudW0AAAAAAAAAAAAJAABkAAAAAgUAAAAHZ2FtZU51bQAAAAAAAAAAAQEAAAASRXh0cmFjdFJlc2VydmVkQW10AAAAAAQAAAAHJG1hdGNoMAkABBoAAAACBQAAAAR0aGlzBQAAAA5SRVNFUlZBVElPTktFWQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAAAAAAAAAAAAAQAAAB5WYWxpZGF0ZUFuZEluY3JlYXNlUmVzZXJ2ZWRBbXQAAAABAAAABndpbkFtdAQAAAARbmV3UmVzZXJ2ZWRBbW91bnQJAABkAAAAAgkBAAAAEkV4dHJhY3RSZXNlcnZlZEFtdAAAAAAFAAAABndpbkFtdAQAAAAHYmFsYW5jZQkBAAAADHdhdmVzQmFsYW5jZQAAAAEFAAAABHRoaXMDCQAAZgAAAAIFAAAAEW5ld1Jlc2VydmVkQW1vdW50BQAAAAdiYWxhbmNlCQAAAgAAAAECAAAAVEluc3VmZmljaWVudCBmdW5kcyBvbiBXYXZlcyBSaWRlciBhY2NvdW50LiBUcmFuc2FjdGlvbiB3YXMgcmVqZWN0ZWQgZm9yIHlvdXIgc2FmZXR5LgUAAAARbmV3UmVzZXJ2ZWRBbW91bnQBAAAAE0RlY3JlYXNlUmVzZXJ2ZWRBbXQAAAACAAAABmdhbWVJZAAAAAZ3aW5BbXQEAAAAEW5ld1Jlc2VydmVkQW1vdW50CQAAZQAAAAIJAQAAABJFeHRyYWN0UmVzZXJ2ZWRBbXQAAAAABQAAAAZ3aW5BbXQDCQAAZgAAAAIAAAAAAAAAAAAFAAAAEW5ld1Jlc2VydmVkQW1vdW50CQAAAgAAAAECAAAAQkludmFsaWQgRGljZSBSb2xsZXIgYWNjb3VudCBzdGF0ZSAtIHJlc2VydmVkIGFtb3VudCBpcyBsZXNzIHRoYW4gMAkBAAAACURhdGFFbnRyeQAAAAIFAAAADlJFU0VSVkFUSU9OS0VZBQAAABFuZXdSZXNlcnZlZEFtb3VudAEAAAAaVmFsaWRhdGVCZXRBbmREZWZpbmVXaW5BbXQAAAAC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AAAAByRtYXRjaDACAAAABlN0cmluZwQAAAADc3RyBQAAAAckbWF0Y2gwBQAAAANzdHIJAAACAAAAAQkAASwAAAACAgAAABZDb3VsZG4ndCBmaW5kIGdhbWUgYnkgBQAAAAZnYW1lSWQJAQAAABNQYXJzZUdhbWVSYXdEYXRhU3RyAAAAAQUAAAAKcmF3RGF0YVN0cgEAAAAMV2luU2NyaXB0U2V0AAAABgAAAAZnYW1lSWQAAAANcGxheWVyQWRkcmVzcwAAAAZ3aW5BbXQAAAAObmV3R2FtZURhdGFTdHIAAAAMd2luQnlUaW1lb3V0AAAAEWRlY3JlYXNlZFJlc2VydmVzBAAAAA53U2V0Q29tbW9uRGF0YQkABEwAAAACBQAAABFkZWNyZWFzZWRSZXNlcnZlcwUAAAADbmlsBAAAAA50U2V0Q29tbW9uRGF0YQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADBQAAAA1wbGF5ZXJBZGRyZXNzBQAAAAZ3aW5BbXQFAAAABHVuaXQFAAAAA25pbAMFAAAADHdpbkJ5VGltZW91dAQAAAAWbmV3R2FtZURhdGFTdHJBZGp1c3RlZAkAASwAAAACCQABLAAAAAIFAAAADm5ld0dhbWVEYXRhU3RyAgAAAAFfCQEAAAATRm9ybWF0R2FtZURhdGFQYXJhbQAAAAECAAAAB1RJTUVPVVQEAAAACGdhbWVEYXRhCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAGZ2FtZUlkBQAAABZuZXdHYW1lRGF0YVN0ckFkanVzdGVkCQEAAAAMU2NyaXB0UmVzdWx0AAAAAgkBAAAACFdyaXRlU2V0AAAAAQkABEwAAAACBQAAAAhnYW1lRGF0YQUAAAAOd1NldENvbW1vbkRhdGEJAQAAAAtUcmFuc2ZlclNldAAAAAEFAAAADnRTZXRDb21tb25EYXRhBAAAAAhnYW1lRGF0YQkBAAAACURhdGFFbnRyeQAAAAIFAAAABmdhbWVJZAUAAAAObmV3R2FtZURhdGFTdHIJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIFAAAACGdhbWVEYXRhBQAAAA53U2V0Q29tbW9uRGF0YQkBAAAAC1RyYW5zZmVyU2V0AAAAAQUAAAAOdFNldENvbW1vbkRhdGEAAAACAAAAAWkBAAAAA2JldAAAAAEAAAAMcGxheWVyQ2hvaWNlBAAAAApuZXdHYW1lTnVtCQEAAAAQSW5jcmVtZW50R2FtZU51bQAAAAAEAAAABmdhbWVJZAkAAlgAAAABCAUAAAABaQAAAA10cmFuc2FjdGlvbklkBAAAAANwbXQJAQAAAAdleHRyYWN0AAAAAQgFAAAAAWkAAAAHcGF5bWVudAQAAAANYmV0Tm90SW5XYXZlcwkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAANwbXQAAAAHYXNzZXRJZAQAAAANZmVlTm90SW5XYXZlcwkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAANwbXQAAAAHYXNzZXRJZAQAAAAGd2luQW10CQEAAAAaVmFsaWRhdGVCZXRBbmREZWZpbmVXaW5BbXQAAAACCAUAAAADcG10AAAABmFtb3VudAUAAAAMcGxheWVyQ2hvaWNlBAAAAAh0eElkVXNlZAkBAAAACWlzRGVmaW5lZAAAAAEJAAQdAAAAAgUAAAAEdGhpcwUAAAAGZ2FtZUlkAwUAAAANYmV0Tm90SW5XYXZlcwkAAAIAAAABAgAAABtCZXQgYW1vdW50IG11c3QgYmUgaW4gV2F2ZXMDBQAAAA1mZWVOb3RJbldhdmVzCQAAAgAAAAECAAAAIlRyYW5zYWN0aW9uJ3MgZmVlIG11c3QgYmUgaW4gV2F2ZXMDBQAAAAh0eElkVXNlZAkAAAIAAAABAgAAAC9QYXNzZWQgdHhJZCBoYWQgYmVlbiB1c2VkIGJlZm9yZS4gR2FtZSBhYm9ydGVkLgQAAAAOcGxheWVyUHViS2V5NTgJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAAtnYW1lRGF0YVN0cgkBAAAAEUZvcm1hdEdhbWVEYXRhU3RyAAAABgUAAAAOU1RBVEVTVUJNSVRURUQFAAAADHBsYXllckNob2ljZQUAAAAOcGxheWVyUHViS2V5NTgFAAAABmhlaWdodAUAAAAGd2luQW10AgAAAAAJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAA5SRVNFUlZBVElPTktFWQkBAAAAHlZhbGlkYXRlQW5kSW5jcmVhc2VSZXNlcnZlZEFtdAAAAAEFAAAABndpbkFtdAkABEwAAAACCQEAAAAJRGF0YUVudHJ5AAAAAgUAAAAPR0FNRVNDT1VOVEVSS0VZBQAAAApuZXdHYW1lTnVtCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAZnYW1lSWQFAAAAC2dhbWVEYXRhU3RyBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAGU0VSVkVSBQAAAApDT01NSVNTSU9OBQAAAAR1bml0BQAAAANuaWwAAAABaQEAAAAId2l0aGRyYXcAAAACAAAABmdhbWVJZAAAAAdyc2FTaWduBAAAAAxnYW1lRGF0YUxpc3QJAQAAABNFeHRyYWN0R2FtZURhdGFMaXN0AAAAAQUAAAAGZ2FtZUlkBAAAAAlnYW1lU3RhdGUJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAAAxJZHhHYW1lU3RhdGUEAAAADHBsYXllckNob2ljZQkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAAD0lkeFBsYXllckNob2ljZQQAAAANc3RhcnRlZEhlaWdodAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADGdhbWVEYXRhTGlzdAUAAAAQSWR4U3RhcnRlZEhlaWdodAQAAAAGd2luQW10CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAAAlJZHhXaW5BbXQEAAAADnBsYXllclB1YktleTU4CQABkQAAAAIFAAAADGdhbWVEYXRhTGlzdAUAAAARSWR4UGxheWVyUHViS2V5NTgEAAAADXBsYXllckFkZHJlc3MJAQAAABRhZGRyZXNzRnJvbVB1YmxpY0tleQAAAAEJAAJZAAAAAQUAAAAOcGxheWVyUHViS2V5NTgEAAAADHdpbkJ5VGltZW91dAkAAGYAAAACCQAAZQAAAAIFAAAABmhlaWdodAUAAAANc3RhcnRlZEhlaWdodAUAAAATUkFORE9SQUNMRVRJTUVGUkFNRQQAAAARZGVjcmVhc2VkUmVzZXJ2ZXMJAQAAABNEZWNyZWFzZVJlc2VydmVkQW10AAAAAgUAAAAGZ2FtZUlkBQAAAAZ3aW5BbXQDCQEAAAACIT0AAAACBQAAAAlnYW1lU3RhdGUFAAAADlNUQVRFU1VCTUlUVEVECQAAAgAAAAECAAAAJEludmFsaWQgZ2FtZSBzdGF0ZSBmb3IgcGFzc2VkIGdhbWVJZAMFAAAADHdpbkJ5VGltZW91dAQAAAAHcmFuZFN0cgUAAAAMcGxheWVyQ2hvaWNlBAAAAA5uZXdHYW1lRGF0YVN0cgkBAAAAEUZvcm1hdEdhbWVEYXRhU3RyAAAABgUAAAAIU1RBVEVXT04FAAAADHBsYXllckNob2ljZQUAAAAOcGxheWVyUHViS2V5NTgFAAAADXN0YXJ0ZWRIZWlnaHQFAAAABndpbkFtdAUAAAAHcmFuZFN0cgkBAAAADFdpblNjcmlwdFNldAAAAAYFAAAABmdhbWVJZAUAAAANcGxheWVyQWRkcmVzcwUAAAAGd2luQW10BQAAAA5uZXdHYW1lRGF0YVN0cgUAAAAMd2luQnlUaW1lb3V0BQAAABFkZWNyZWFzZWRSZXNlcnZlcwQAAAAEcmFuZAkBAAAAD0dlbmVyYXRlUmFuZEludAAAAAIFAAAABmdhbWVJZAUAAAAHcnNhU2lnbgQAAAAHcmFuZFN0cgkBAAAACVJhbmRUb1N0cgAAAAEFAAAABHJhbmQDCQEAAAALSXNQbGF5ZXJXaW4AAAACBQAAAAxwbGF5ZXJDaG9pY2UFAAAABHJhbmQEAAAADm5ld0dhbWVEYXRhU3RyCQEAAAARRm9ybWF0R2FtZURhdGFTdHIAAAAGBQAAAAhTVEFURVdPTgUAAAAMcGxheWVyQ2hvaWNlBQAAAA5wbGF5ZXJQdWJLZXk1OAUAAAANc3RhcnRlZEhlaWdodAUAAAAGd2luQW10BQAAAAdyYW5kU3RyCQEAAAAMV2luU2NyaXB0U2V0AAAABgUAAAAGZ2FtZUlkBQAAAA1wbGF5ZXJBZGRyZXNzBQAAAAZ3aW5BbXQFAAAADm5ld0dhbWVEYXRhU3RyBQAAAAx3aW5CeVRpbWVvdXQFAAAAEWRlY3JlYXNlZFJlc2VydmVzBAAAAA5uZXdHYW1lRGF0YVN0cgkBAAAAEUZvcm1hdEdhbWVEYXRhU3RyAAAABgUAAAAJU1RBVEVMT1NUBQAAAAxwbGF5ZXJDaG9pY2UFAAAADnBsYXllclB1YktleTU4BQAAAA1zdGFydGVkSGVpZ2h0BQAAAAZ3aW5BbXQFAAAAB3JhbmRTdHIJAQAAAAhXcml0ZVNldAAAAAEJAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAABmdhbWVJZAUAAAAObmV3R2FtZURhdGFTdHIJAARMAAAAAgUAAAARZGVjcmVhc2VkUmVzZXJ2ZXMFAAAAA25pbAAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAADCQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAgFAAAAAnR4AAAAD3NlbmRlclB1YmxpY0tleQQAAAAHJG1hdGNoMAUAAAACdHgDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAE1RyYW5zZmVyVHJhbnNhY3Rpb24EAAAAA3R0eAUAAAAHJG1hdGNoMAkAAGcAAAACCQAAZQAAAAIJAQAAAAx3YXZlc0JhbGFuY2UAAAABBQAAAAR0aGlzCAUAAAADdHR4AAAABmFtb3VudAkBAAAAEkV4dHJhY3RSZXNlcnZlZEFtdAAAAAADCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAFFNldFNjcmlwdFRyYW5zYWN0aW9uBAAAAANzdHgFAAAAByRtYXRjaDAGBwfr9HtM", "chainId": 84, "height": 589518, "spentComplexity": 0 } View: original | compacted Prev: GppTPMRM1xD1vwAmv7ZUY39HwNGZ57WhsVm1yoeyrESz Next: none Diff:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let RSAPUBLIC = fromBase64String("base64:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqlAiANSmBpDHYKP9sKgeN/l1bAb28g/tGlgDkwT5FiMN4X3pwdvdxE7mvSR8/41dU9rx4jG+6tZpb1ULVDPs431tR2IRaTXw5Cj+Ac2vhL+5JamCerGD1UW+bh/EGQtxo8W3YLDrofXB5QHJx4Pkz2Kgf+oS/C8hHuB/U4krO76U0507GTjZPP9kRQ0uLSMeqQXt8wXS+nMp5wajqxPpDLMaSREgsKwv/AEkP4dzpTYbikLBYl4qtdJsD84HLFSkiwd3BhcOrPjoIYmLxQuBD5TIMKTKD3sdZgaY9rsyqx3A00innyxD6zp3b4gFpUOX8JxKZdEC2myEqleNgg7GzwIDAQAB")
4+let RSAPUBLIC = fromBase64String("base64:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmpuXcI/o4pIB5ywv9DOOGapTBUwRVlM/6+H6hFelOXtkrwY/YItmPxEDpz7rAerQPQe9tDPEaAv/GnlEztybOFXgu9DzDe8YoMRD1vakgoAcogmbY58QD6KMj5HkoVj/yTNIc9szj5qhIlrAdmb3KLL6hQU7y8+Jj69BWVPsaQgkspSdeYtb1tHQc7t95n7OZ56r2A7G3+bQf6nSMkPkAhIrEpbCm58oiGBczdTd/LqFSVotZsbL7Yh6SHLfnHeD+QgcfJrnam8OHMGJEJTRXjILeHGjlRCP8oVpioHry1S2xPx5sVzIm2MM+CzYenAGlo0j26atBhiULoTulwD3pQIDAQAB")
55
6-let SERVER = addressFromStringValue("3N4Aib5iubWiGMzdTh6wWiVDVbo32oeVUmH")
6+let SERVER = addressFromStringValue("3NCiG28LmWyTigWG13E5QnvdHBsZFYXSS2j")
77
8-let RANDORACLETIMEFRAME = 2880
8+let RANDORACLETIMEFRAME = 4320
99
1010 let WAVELET = ((100 * 1000) * 1000)
1111
1212 let COMMISSION = ((5 * WAVELET) / 1000)
1313
14-let BET1 = (1 * WAVELET)
14+let BETMIN = ((1 * WAVELET) / 2)
1515
16-let BET2 = (2 * WAVELET)
16+let BETMAX = (6 * WAVELET)
1717
18-let BET4 = (4 * WAVELET)
18+let BETSTEP = ((1 * WAVELET) / 10)
1919
20-let BET8 = (8 * WAVELET)
20+let PRECISION = 10000
2121
22-let BET14 = (14 * WAVELET)
22+let R1MAX = 96
2323
24-let RATEMULT = 10000
24+let R1MIN = 94
2525
26-let RATE = 19000
26+let R1K = 9860
27+
28+let R2MAX = 93
29+
30+let R2MIN = 87
31+
32+let R2K = 9800
33+
34+let R3MAX = 86
35+
36+let R3MIN = 86
37+
38+let R3K = 9750
39+
40+let R4MAX = 85
41+
42+let R4MIN = 84
43+
44+let R4K = 9670
45+
46+let R5MAX = 83
47+
48+let R5MIN = 83
49+
50+let R5K = 9630
51+
52+let R6MAX = 82
53+
54+let R6MIN = 67
55+
56+let R6K = 9610
57+
58+let R7MAX = 66
59+
60+let R7MIN = 56
61+
62+let R7K = 9560
63+
64+let R8MAX = 55
65+
66+let R8MIN = 38
67+
68+let R8K = 9500
69+
70+let R9MAX = 37
71+
72+let R9MIN = 3
73+
74+let R9K = 9290
75+
76+let R10MAX = 2
77+
78+let R10MIN = 1
79+
80+let R10K = 9860
2781
2882 let IdxGameState = 0
2983
70124 let newReservedAmount = (ExtractReservedAmt() + winAmt)
71125 let balance = wavesBalance(this)
72126 if ((newReservedAmount > balance))
73- then throw("Insufficient funds on Dice Roller account. Transaction was rejected for your safety.")
127+ then throw("Insufficient funds on Waves Rider account. Transaction was rejected for your safety.")
74128 else newReservedAmount
75129 }
76130
84138
85139
86140 func ValidateBetAndDefineWinAmt (betAmt,playerChoice) = {
87- let betAmtValid = if (if (if (if ((betAmt == (BET1 + COMMISSION)))
88- then true
89- else (betAmt == (BET2 + COMMISSION)))
90- then true
91- else (betAmt == (BET4 + COMMISSION)))
92- then true
93- else (betAmt == (BET8 + COMMISSION)))
94- then true
95- else (betAmt == (BET14 + COMMISSION))
141+ let bet = (betAmt - COMMISSION)
142+ let betAmtValid = if (if ((bet >= BETMIN))
143+ then (BETMAX >= bet)
144+ else false)
145+ then ((bet % BETSTEP) == 0)
146+ else false
96147 if (betAmtValid)
97148 then {
98- let choiceSize = size(playerChoice)
99- let bet = (betAmt - COMMISSION)
100- if ((choiceSize == 1))
101- then ((bet * RATE) / RATEMULT)
102- else throw("Invalid player's choice format")
149+ let playerChoiceInt = parseIntValue(playerChoice)
150+ if (if ((playerChoiceInt >= 1))
151+ then (96 >= playerChoiceInt)
152+ else false)
153+ then {
154+ let RKxPrecision = if (if ((R1MAX >= playerChoiceInt))
155+ then (playerChoiceInt >= R1MIN)
156+ else false)
157+ then R1K
158+ else if (if ((R2MAX >= playerChoiceInt))
159+ then (playerChoiceInt >= R2MIN)
160+ else false)
161+ then R2K
162+ else if (if ((R3MAX >= playerChoiceInt))
163+ then (playerChoiceInt >= R3MIN)
164+ else false)
165+ then R3K
166+ else if (if ((R4MAX >= playerChoiceInt))
167+ then (playerChoiceInt >= R4MIN)
168+ else false)
169+ then R4K
170+ else if (if ((R5MAX >= playerChoiceInt))
171+ then (playerChoiceInt >= R5MIN)
172+ else false)
173+ then R5K
174+ else if (if ((R6MAX >= playerChoiceInt))
175+ then (playerChoiceInt >= R6MIN)
176+ else false)
177+ then R6K
178+ else if (if ((R7MAX >= playerChoiceInt))
179+ then (playerChoiceInt >= R7MIN)
180+ else false)
181+ then R7K
182+ else if (if ((R8MAX >= playerChoiceInt))
183+ then (playerChoiceInt >= R8MIN)
184+ else false)
185+ then R8K
186+ else if (if ((R9MAX >= playerChoiceInt))
187+ then (playerChoiceInt >= R9MIN)
188+ else false)
189+ then R9K
190+ else if (if ((R10MAX >= playerChoiceInt))
191+ then (playerChoiceInt >= R10MIN)
192+ else false)
193+ then R10K
194+ else throw(("Couldn't define range: playerChoice=" + playerChoice))
195+ ((((100 * RKxPrecision) / playerChoiceInt) * bet) / PRECISION)
196+ }
197+ else throw("Player choice is out of the condition below: 1 <= choice <= 96")
103198 }
104- else throw("Bet amount is not in range")
199+ else throw(((((("Bet amount is not in range: minBet=" + toString(BETMIN)) + " maxBet=") + toString(BETMAX)) + " betStep=") + toString(BETSTEP)))
105200 }
106201
107202
108-func RandToStr (r) = if ((r == 0))
109- then "0"
110- else if ((r == 1))
111- then "1"
112- else throw(("Unsupported r parameter passed: expected=[0,...,1] actual=" + toString(r)))
203+func RandToStr (r) = if (if ((r >= 1))
204+ then (100 >= r)
205+ else false)
206+ then toString(r)
207+ else throw(("Unsupported r parameter passed: expected=[1,...,100] actual=" + toString(r)))
113208
114209
115210 func GenerateRandInt (gameId,rsaSign) = {
116211 let rsaSigValid = rsaVerify(SHA256, toBytes(gameId), rsaSign, RSAPUBLIC)
117212 if (rsaSigValid)
118213 then {
119- let rand = (toInt(sha256(rsaSign)) % 2)
214+ let rand = (toInt(sha256(rsaSign)) % 100)
120215 if ((0 > rand))
121- then (-1 * rand)
122- else rand
216+ then ((-1 * rand) + 1)
217+ else (rand + 1)
123218 }
124219 else throw("Invalid RSA signature")
125220 }
126221
127222
128-func IsPlayerWin (playerChoice,randStr) = {
129- let s = size(playerChoice)
130- if ((s == 1))
131- then (playerChoice == randStr)
132- else false
223+func IsPlayerWin (playerChoice,rand) = {
224+ let playerChoiceInt = parseIntValue(playerChoice)
225+ (playerChoiceInt >= rand)
133226 }
134227
135228
210303
211304
212305 @Callable(i)
306+func bet (playerChoice) = {
307+ let newGameNum = IncrementGameNum()
308+ let gameId = toBase58String(i.transactionId)
309+ let pmt = extract(i.payment)
310+ let betNotInWaves = isDefined(pmt.assetId)
311+ let feeNotInWaves = isDefined(pmt.assetId)
312+ let winAmt = ValidateBetAndDefineWinAmt(pmt.amount, playerChoice)
313+ let txIdUsed = isDefined(getString(this, gameId))
314+ if (betNotInWaves)
315+ then throw("Bet amount must be in Waves")
316+ else if (feeNotInWaves)
317+ then throw("Transaction's fee must be in Waves")
318+ else if (txIdUsed)
319+ then throw("Passed txId had been used before. Game aborted.")
320+ else {
321+ let playerPubKey58 = toBase58String(i.callerPublicKey)
322+ let gameDataStr = FormatGameDataStr(STATESUBMITTED, playerChoice, playerPubKey58, height, winAmt, "")
323+ ScriptResult(WriteSet([DataEntry(RESERVATIONKEY, ValidateAndIncreaseReservedAmt(winAmt)), DataEntry(GAMESCOUNTERKEY, newGameNum), DataEntry(gameId, gameDataStr)]), TransferSet([ScriptTransfer(SERVER, COMMISSION, unit)]))
324+ }
325+ }
326+
327+
328+
329+@Callable(i)
213330 func withdraw (gameId,rsaSign) = {
214331 let gameDataList = ExtractGameDataList(gameId)
215332 let gameState = gameDataList[IdxGameState]
224341 then throw("Invalid game state for passed gameId")
225342 else if (winByTimeout)
226343 then {
227- let randStr = take(playerChoice, 1)
344+ let randStr = playerChoice
228345 let newGameDataStr = FormatGameDataStr(STATEWON, playerChoice, playerPubKey58, startedHeight, winAmt, randStr)
229346 WinScriptSet(gameId, playerAddress, winAmt, newGameDataStr, winByTimeout, decreasedReserves)
230347 }
231348 else {
232- let randStr = RandToStr(GenerateRandInt(gameId, rsaSign))
233- if (IsPlayerWin(playerChoice, randStr))
349+ let rand = GenerateRandInt(gameId, rsaSign)
350+ let randStr = RandToStr(rand)
351+ if (IsPlayerWin(playerChoice, rand))
234352 then {
235353 let newGameDataStr = FormatGameDataStr(STATEWON, playerChoice, playerPubKey58, startedHeight, winAmt, randStr)
236354 WinScriptSet(gameId, playerAddress, winAmt, newGameDataStr, winByTimeout, decreasedReserves)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
4-let RSAPUBLIC = fromBase64String("base64:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqlAiANSmBpDHYKP9sKgeN/l1bAb28g/tGlgDkwT5FiMN4X3pwdvdxE7mvSR8/41dU9rx4jG+6tZpb1ULVDPs431tR2IRaTXw5Cj+Ac2vhL+5JamCerGD1UW+bh/EGQtxo8W3YLDrofXB5QHJx4Pkz2Kgf+oS/C8hHuB/U4krO76U0507GTjZPP9kRQ0uLSMeqQXt8wXS+nMp5wajqxPpDLMaSREgsKwv/AEkP4dzpTYbikLBYl4qtdJsD84HLFSkiwd3BhcOrPjoIYmLxQuBD5TIMKTKD3sdZgaY9rsyqx3A00innyxD6zp3b4gFpUOX8JxKZdEC2myEqleNgg7GzwIDAQAB")
4+let RSAPUBLIC = fromBase64String("base64:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmpuXcI/o4pIB5ywv9DOOGapTBUwRVlM/6+H6hFelOXtkrwY/YItmPxEDpz7rAerQPQe9tDPEaAv/GnlEztybOFXgu9DzDe8YoMRD1vakgoAcogmbY58QD6KMj5HkoVj/yTNIc9szj5qhIlrAdmb3KLL6hQU7y8+Jj69BWVPsaQgkspSdeYtb1tHQc7t95n7OZ56r2A7G3+bQf6nSMkPkAhIrEpbCm58oiGBczdTd/LqFSVotZsbL7Yh6SHLfnHeD+QgcfJrnam8OHMGJEJTRXjILeHGjlRCP8oVpioHry1S2xPx5sVzIm2MM+CzYenAGlo0j26atBhiULoTulwD3pQIDAQAB")
55
6-let SERVER = addressFromStringValue("3N4Aib5iubWiGMzdTh6wWiVDVbo32oeVUmH")
6+let SERVER = addressFromStringValue("3NCiG28LmWyTigWG13E5QnvdHBsZFYXSS2j")
77
8-let RANDORACLETIMEFRAME = 2880
8+let RANDORACLETIMEFRAME = 4320
99
1010 let WAVELET = ((100 * 1000) * 1000)
1111
1212 let COMMISSION = ((5 * WAVELET) / 1000)
1313
14-let BET1 = (1 * WAVELET)
14+let BETMIN = ((1 * WAVELET) / 2)
1515
16-let BET2 = (2 * WAVELET)
16+let BETMAX = (6 * WAVELET)
1717
18-let BET4 = (4 * WAVELET)
18+let BETSTEP = ((1 * WAVELET) / 10)
1919
20-let BET8 = (8 * WAVELET)
20+let PRECISION = 10000
2121
22-let BET14 = (14 * WAVELET)
22+let R1MAX = 96
2323
24-let RATEMULT = 10000
24+let R1MIN = 94
2525
26-let RATE = 19000
26+let R1K = 9860
27+
28+let R2MAX = 93
29+
30+let R2MIN = 87
31+
32+let R2K = 9800
33+
34+let R3MAX = 86
35+
36+let R3MIN = 86
37+
38+let R3K = 9750
39+
40+let R4MAX = 85
41+
42+let R4MIN = 84
43+
44+let R4K = 9670
45+
46+let R5MAX = 83
47+
48+let R5MIN = 83
49+
50+let R5K = 9630
51+
52+let R6MAX = 82
53+
54+let R6MIN = 67
55+
56+let R6K = 9610
57+
58+let R7MAX = 66
59+
60+let R7MIN = 56
61+
62+let R7K = 9560
63+
64+let R8MAX = 55
65+
66+let R8MIN = 38
67+
68+let R8K = 9500
69+
70+let R9MAX = 37
71+
72+let R9MIN = 3
73+
74+let R9K = 9290
75+
76+let R10MAX = 2
77+
78+let R10MIN = 1
79+
80+let R10K = 9860
2781
2882 let IdxGameState = 0
2983
3084 let IdxPlayerChoice = 1
3185
3286 let IdxPlayerPubKey58 = 2
3387
3488 let IdxStartedHeight = 3
3589
3690 let IdxWinAmt = 4
3791
3892 let IdxRandOrEmpty = 5
3993
4094 let RESERVATIONKEY = "$RESERVED_AMOUNT"
4195
4296 let GAMESCOUNTERKEY = "$GAME_NUM"
4397
4498 let STATESUBMITTED = "SUBMITTED"
4599
46100 let STATEWON = "WON"
47101
48102 let STATELOST = "LOST"
49103
50104 func IncrementGameNum () = {
51105 let gameNum = match getInteger(this, GAMESCOUNTERKEY) {
52106 case num: Int =>
53107 num
54108 case _ =>
55109 0
56110 }
57111 (gameNum + 1)
58112 }
59113
60114
61115 func ExtractReservedAmt () = match getInteger(this, RESERVATIONKEY) {
62116 case a: Int =>
63117 a
64118 case _ =>
65119 0
66120 }
67121
68122
69123 func ValidateAndIncreaseReservedAmt (winAmt) = {
70124 let newReservedAmount = (ExtractReservedAmt() + winAmt)
71125 let balance = wavesBalance(this)
72126 if ((newReservedAmount > balance))
73- then throw("Insufficient funds on Dice Roller account. Transaction was rejected for your safety.")
127+ then throw("Insufficient funds on Waves Rider account. Transaction was rejected for your safety.")
74128 else newReservedAmount
75129 }
76130
77131
78132 func DecreaseReservedAmt (gameId,winAmt) = {
79133 let newReservedAmount = (ExtractReservedAmt() - winAmt)
80134 if ((0 > newReservedAmount))
81135 then throw("Invalid Dice Roller account state - reserved amount is less than 0")
82136 else DataEntry(RESERVATIONKEY, newReservedAmount)
83137 }
84138
85139
86140 func ValidateBetAndDefineWinAmt (betAmt,playerChoice) = {
87- let betAmtValid = if (if (if (if ((betAmt == (BET1 + COMMISSION)))
88- then true
89- else (betAmt == (BET2 + COMMISSION)))
90- then true
91- else (betAmt == (BET4 + COMMISSION)))
92- then true
93- else (betAmt == (BET8 + COMMISSION)))
94- then true
95- else (betAmt == (BET14 + COMMISSION))
141+ let bet = (betAmt - COMMISSION)
142+ let betAmtValid = if (if ((bet >= BETMIN))
143+ then (BETMAX >= bet)
144+ else false)
145+ then ((bet % BETSTEP) == 0)
146+ else false
96147 if (betAmtValid)
97148 then {
98- let choiceSize = size(playerChoice)
99- let bet = (betAmt - COMMISSION)
100- if ((choiceSize == 1))
101- then ((bet * RATE) / RATEMULT)
102- else throw("Invalid player's choice format")
149+ let playerChoiceInt = parseIntValue(playerChoice)
150+ if (if ((playerChoiceInt >= 1))
151+ then (96 >= playerChoiceInt)
152+ else false)
153+ then {
154+ let RKxPrecision = if (if ((R1MAX >= playerChoiceInt))
155+ then (playerChoiceInt >= R1MIN)
156+ else false)
157+ then R1K
158+ else if (if ((R2MAX >= playerChoiceInt))
159+ then (playerChoiceInt >= R2MIN)
160+ else false)
161+ then R2K
162+ else if (if ((R3MAX >= playerChoiceInt))
163+ then (playerChoiceInt >= R3MIN)
164+ else false)
165+ then R3K
166+ else if (if ((R4MAX >= playerChoiceInt))
167+ then (playerChoiceInt >= R4MIN)
168+ else false)
169+ then R4K
170+ else if (if ((R5MAX >= playerChoiceInt))
171+ then (playerChoiceInt >= R5MIN)
172+ else false)
173+ then R5K
174+ else if (if ((R6MAX >= playerChoiceInt))
175+ then (playerChoiceInt >= R6MIN)
176+ else false)
177+ then R6K
178+ else if (if ((R7MAX >= playerChoiceInt))
179+ then (playerChoiceInt >= R7MIN)
180+ else false)
181+ then R7K
182+ else if (if ((R8MAX >= playerChoiceInt))
183+ then (playerChoiceInt >= R8MIN)
184+ else false)
185+ then R8K
186+ else if (if ((R9MAX >= playerChoiceInt))
187+ then (playerChoiceInt >= R9MIN)
188+ else false)
189+ then R9K
190+ else if (if ((R10MAX >= playerChoiceInt))
191+ then (playerChoiceInt >= R10MIN)
192+ else false)
193+ then R10K
194+ else throw(("Couldn't define range: playerChoice=" + playerChoice))
195+ ((((100 * RKxPrecision) / playerChoiceInt) * bet) / PRECISION)
196+ }
197+ else throw("Player choice is out of the condition below: 1 <= choice <= 96")
103198 }
104- else throw("Bet amount is not in range")
199+ else throw(((((("Bet amount is not in range: minBet=" + toString(BETMIN)) + " maxBet=") + toString(BETMAX)) + " betStep=") + toString(BETSTEP)))
105200 }
106201
107202
108-func RandToStr (r) = if ((r == 0))
109- then "0"
110- else if ((r == 1))
111- then "1"
112- else throw(("Unsupported r parameter passed: expected=[0,...,1] actual=" + toString(r)))
203+func RandToStr (r) = if (if ((r >= 1))
204+ then (100 >= r)
205+ else false)
206+ then toString(r)
207+ else throw(("Unsupported r parameter passed: expected=[1,...,100] actual=" + toString(r)))
113208
114209
115210 func GenerateRandInt (gameId,rsaSign) = {
116211 let rsaSigValid = rsaVerify(SHA256, toBytes(gameId), rsaSign, RSAPUBLIC)
117212 if (rsaSigValid)
118213 then {
119- let rand = (toInt(sha256(rsaSign)) % 2)
214+ let rand = (toInt(sha256(rsaSign)) % 100)
120215 if ((0 > rand))
121- then (-1 * rand)
122- else rand
216+ then ((-1 * rand) + 1)
217+ else (rand + 1)
123218 }
124219 else throw("Invalid RSA signature")
125220 }
126221
127222
128-func IsPlayerWin (playerChoice,randStr) = {
129- let s = size(playerChoice)
130- if ((s == 1))
131- then (playerChoice == randStr)
132- else false
223+func IsPlayerWin (playerChoice,rand) = {
224+ let playerChoiceInt = parseIntValue(playerChoice)
225+ (playerChoiceInt >= rand)
133226 }
134227
135228
136229 func FormatGameDataParam (p) = {
137230 let s = size(p)
138231 if ((s == 0))
139232 then throw("Parameter size must be greater then 0")
140233 else if ((s > 99))
141234 then throw("Parameter size must be less then 100")
142235 else if ((10 > s))
143236 then (("0" + toString(s)) + p)
144237 else (toString(s) + p)
145238 }
146239
147240
148241 func FormatGameDataStr (gameState,playerChoice,playerPubKey58,startedHeight,winAmt,randOrEmpty) = {
149242 let fullStateStr = ((((((((FormatGameDataParam(gameState) + "_") + FormatGameDataParam(playerChoice)) + "_") + FormatGameDataParam(playerPubKey58)) + "_") + FormatGameDataParam(toString(startedHeight))) + "_") + FormatGameDataParam(toString(winAmt)))
150243 if ((randOrEmpty == ""))
151244 then fullStateStr
152245 else ((fullStateStr + "_") + FormatGameDataParam(randOrEmpty))
153246 }
154247
155248
156249 func RemoveUnderscoreIfPresent (remaining) = if ((size(remaining) > 0))
157250 then drop(remaining, 1)
158251 else remaining
159252
160253
161254 func ParseNextAttribute (remaining) = {
162255 let s = size(remaining)
163256 if ((s > 0))
164257 then {
165258 let nn = parseIntValue(take(remaining, 2))
166259 let v = take(drop(remaining, 2), nn)
167260 let tmpRemaining = drop(remaining, (nn + 2))
168261 let remainingState = RemoveUnderscoreIfPresent(tmpRemaining)
169262 [v, remainingState]
170263 }
171264 else throw("Empty string was passed into parseNextAttribute func")
172265 }
173266
174267
175268 func ParseGameRawDataStr (rawStateStr) = {
176269 let gameState = ParseNextAttribute(rawStateStr)
177270 let playerChoice = ParseNextAttribute(gameState[1])
178271 let playerPubKey58 = ParseNextAttribute(playerChoice[1])
179272 let startedHeight = ParseNextAttribute(playerPubKey58[1])
180273 let winAmt = ParseNextAttribute(startedHeight[1])
181274 [gameState[0], playerChoice[0], playerPubKey58[0], startedHeight[0], winAmt[0]]
182275 }
183276
184277
185278 func ExtractGameDataList (gameId) = {
186279 let rawDataStr = match getString(this, gameId) {
187280 case str: String =>
188281 str
189282 case _ =>
190283 throw(("Couldn't find game by " + gameId))
191284 }
192285 ParseGameRawDataStr(rawDataStr)
193286 }
194287
195288
196289 func WinScriptSet (gameId,playerAddress,winAmt,newGameDataStr,winByTimeout,decreasedReserves) = {
197290 let wSetCommonData = [decreasedReserves]
198291 let tSetCommonData = [ScriptTransfer(playerAddress, winAmt, unit)]
199292 if (winByTimeout)
200293 then {
201294 let newGameDataStrAdjusted = ((newGameDataStr + "_") + FormatGameDataParam("TIMEOUT"))
202295 let gameData = DataEntry(gameId, newGameDataStrAdjusted)
203296 ScriptResult(WriteSet(gameData :: wSetCommonData), TransferSet(tSetCommonData))
204297 }
205298 else {
206299 let gameData = DataEntry(gameId, newGameDataStr)
207300 ScriptResult(WriteSet(gameData :: wSetCommonData), TransferSet(tSetCommonData))
208301 }
209302 }
210303
211304
212305 @Callable(i)
306+func bet (playerChoice) = {
307+ let newGameNum = IncrementGameNum()
308+ let gameId = toBase58String(i.transactionId)
309+ let pmt = extract(i.payment)
310+ let betNotInWaves = isDefined(pmt.assetId)
311+ let feeNotInWaves = isDefined(pmt.assetId)
312+ let winAmt = ValidateBetAndDefineWinAmt(pmt.amount, playerChoice)
313+ let txIdUsed = isDefined(getString(this, gameId))
314+ if (betNotInWaves)
315+ then throw("Bet amount must be in Waves")
316+ else if (feeNotInWaves)
317+ then throw("Transaction's fee must be in Waves")
318+ else if (txIdUsed)
319+ then throw("Passed txId had been used before. Game aborted.")
320+ else {
321+ let playerPubKey58 = toBase58String(i.callerPublicKey)
322+ let gameDataStr = FormatGameDataStr(STATESUBMITTED, playerChoice, playerPubKey58, height, winAmt, "")
323+ ScriptResult(WriteSet([DataEntry(RESERVATIONKEY, ValidateAndIncreaseReservedAmt(winAmt)), DataEntry(GAMESCOUNTERKEY, newGameNum), DataEntry(gameId, gameDataStr)]), TransferSet([ScriptTransfer(SERVER, COMMISSION, unit)]))
324+ }
325+ }
326+
327+
328+
329+@Callable(i)
213330 func withdraw (gameId,rsaSign) = {
214331 let gameDataList = ExtractGameDataList(gameId)
215332 let gameState = gameDataList[IdxGameState]
216333 let playerChoice = gameDataList[IdxPlayerChoice]
217334 let startedHeight = parseIntValue(gameDataList[IdxStartedHeight])
218335 let winAmt = parseIntValue(gameDataList[IdxWinAmt])
219336 let playerPubKey58 = gameDataList[IdxPlayerPubKey58]
220337 let playerAddress = addressFromPublicKey(fromBase58String(playerPubKey58))
221338 let winByTimeout = ((height - startedHeight) > RANDORACLETIMEFRAME)
222339 let decreasedReserves = DecreaseReservedAmt(gameId, winAmt)
223340 if ((gameState != STATESUBMITTED))
224341 then throw("Invalid game state for passed gameId")
225342 else if (winByTimeout)
226343 then {
227- let randStr = take(playerChoice, 1)
344+ let randStr = playerChoice
228345 let newGameDataStr = FormatGameDataStr(STATEWON, playerChoice, playerPubKey58, startedHeight, winAmt, randStr)
229346 WinScriptSet(gameId, playerAddress, winAmt, newGameDataStr, winByTimeout, decreasedReserves)
230347 }
231348 else {
232- let randStr = RandToStr(GenerateRandInt(gameId, rsaSign))
233- if (IsPlayerWin(playerChoice, randStr))
349+ let rand = GenerateRandInt(gameId, rsaSign)
350+ let randStr = RandToStr(rand)
351+ if (IsPlayerWin(playerChoice, rand))
234352 then {
235353 let newGameDataStr = FormatGameDataStr(STATEWON, playerChoice, playerPubKey58, startedHeight, winAmt, randStr)
236354 WinScriptSet(gameId, playerAddress, winAmt, newGameDataStr, winByTimeout, decreasedReserves)
237355 }
238356 else {
239357 let newGameDataStr = FormatGameDataStr(STATELOST, playerChoice, playerPubKey58, startedHeight, winAmt, randStr)
240358 WriteSet([DataEntry(gameId, newGameDataStr), decreasedReserves])
241359 }
242360 }
243361 }
244362
245363
246364 @Verifier(tx)
247365 func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
248366 then match tx {
249367 case ttx: TransferTransaction =>
250368 ((wavesBalance(this) - ttx.amount) >= ExtractReservedAmt())
251369 case stx: SetScriptTransaction =>
252370 true
253371 case _ =>
254372 false
255373 }
256374 else false
257375

github/deemru/w8io/3ef1775 
68.13 ms