tx · EjWyTuQ1c4zPNjgSUa8dvAkRMQBCGkeUderSJDZQqniP

3NCFV4YSBFCEBXDYHwCuh6X5SqMeQXFgEaf:  -0.01500000 Waves

2021.06.03 16:46 [1554265] smart account 3NCFV4YSBFCEBXDYHwCuh6X5SqMeQXFgEaf > SELF 0.00000000 Waves

{ "type": 13, "id": "EjWyTuQ1c4zPNjgSUa8dvAkRMQBCGkeUderSJDZQqniP", "fee": 1500000, "feeAssetId": null, "timestamp": 1622728031259, "version": 2, "chainId": 84, "sender": "3NCFV4YSBFCEBXDYHwCuh6X5SqMeQXFgEaf", "senderPublicKey": "6zkdpCUGZybpbh7mrJvMphWq6fUvbGoyxafdsQjtwsWA", "proofs": [ "4U1BDpk6LNuekvBF51W7jgxBMZ8w4YQynYi8HW18xNWEhg11vrFdmzmDdtq4GVokME8FE3KSwen2pjsmo3SGPWVa" ], "script": "base64:AAIEAAAAAAAAAB4IAhIAEgASABIDCgEIEgMKAQgSBAoCCAESBAoCCAEAAABJAAAAABNnYW1lTWFzdGVyUHVibGljS2V5AQAAACCLHi1hJl8BxDXwXKLtpRVjbFBsmFHgcP8XgvTnW2biYwAAAAAKZGljZU51bWJlcgkABEwAAAACAAAAAAAAAAACCQAETAAAAAIAAAAAAAAAAAMJAARMAAAAAgAAAAAAAAAABAkABEwAAAACAAAAAAAAAAAFCQAETAAAAAIAAAAAAAAAAAYJAARMAAAAAgAAAAAAAAAABwkABEwAAAACAAAAAAAAAAAICQAETAAAAAIAAAAAAAAAAAkJAARMAAAAAgAAAAAAAAAACgkABEwAAAACAAAAAAAAAAALCQAETAAAAAIAAAAAAAAAAAwFAAAAA25pbAAAAAAJZ2FtZVRva2VuAQAAACCvQNOoGbkt3wVk9kpr+yD9dOUY7LBdGNCbLK5MVkSodQAAAAAJUlNBUFVCTElDCQACWwAAAAECAAABj2Jhc2U2NDpNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQWpudDJQZE4xUGRqN3JzWHpiYXBndWNuOWUxWGZmVXgxbzdnckFsdzhDNk5GdXYxUFBqN0tuUTZSdE45eGhuaUxGNHhLbGM3Ly9UWVhkMXVIV214OXZ1OWhqY2lZWDlVTVJKbmhsWk8ycTM0bXhQZGNnTERLaEpIRE43MjZLSTB3SHBGUTVkSE15em9NTGRXc2FoRmMxV3gvWHhyb0syS2MxeTJKQldOMmFrUmxreFNEY2x1cWJiVWNXTXlyd0c2aVd1VmxoZWo1eGZjdWVyZy9wc0szNVdHbjdTTEYyOXRXdVIyeCsyNG5NK0JKVXN1Ukc3eUJaVWhHcll6SmsyZ3ZwdWNSTGVhNkFGUnZvdzdSZHlNWUF3S0ZycjZtZ1EwVmNVdzJUNzUwZTFvR2FuWTBVZFUzTlBzS0lndlU0RnQ0dWliTWxNTUJKdmNyc0ViRFFIZkRsd0lEQVFBQgAAAAAJR0FNRVNUQVJUAAAAAAAAAAAAAAAAAA5HQU1FSU5QUk9HUkVTUwAAAAAAAAAAAQAAAAAMR0FNRUZJTklTSEVEAAAAAAAAAAACAAAAABZCTE9DS1RPUFJPQ0VTU0ZPUlRIUk9XAAAAAAAAAAABAAAAAAtQQVNTTElORUJFVAIAAAALUEFTU0xJTkVCRVQAAAAAD0RPTlRQQVNTTElORUJFVAIAAAAPRE9OVFBBU1NMSU5FQkVUAAAAAAdDT01FQkVUAgAAAAdDT01FQkVUAAAAAAtET05UQ09NRUJFVAIAAAALRE9OVENPTUVCRVQAAAAACEZJRUxEQkVUAgAAAAhGSUVMREJFVAAAAAAHT0REU0JFVAIAAAAHT0REU0JFVAAAAAAKQklHNk9SOEJFVAIAAAAKQklHNk9SOEJFVAAAAAALUExBQ0VCRVRCVVkCAAAAC1BMQUNFQkVUQlVZAAAAAAxQTEFDRUJFVExPU0UCAAAADFBMQUNFQkVUTE9TRQAAAAALUExBQ0VCRVRMQVkCAAAAC1BMQUNFQkVUTEFZAAAAAAtQTEFDRUJFVFdJTgIAAAALUExBQ0VCRVRXSU4AAAAAEGdhbWVDb3VudGVyTGFiZWwCAAAADUdfR0FNRUNPVU5URVIAAAAAEmdhbWVUb3RhbEJldHNMYWJlbAIAAAALR19UT1RBTEJFVFMAAAAAGWdhbWVUb3RhbFByb2NjZWRCZXRzTGFiZWwCAAAAD0dfUFJPQ0VTU0VEQkVUUwAAAAAXZ2FtZVRvdGFsRmllbGRCZXRzTGFiZWwCAAAAFkdfVE9UQUxGSUVMRF9PRERTX0JFVFMAAAAAJGdhbWVUb3RhbFByb2NjZWRGaWVsZE9yT2Rkc0JldHNMYWJlbAIAAAAZR19QUk9DRVNTRURGSUVMX09ERFNfQkVUUwEAAAAUZ2FtZVN0YXJ0SGVpZ2h0TGFiZWwAAAABAAAAC2dhbWVDb3VudGVyCQABLAAAAAIJAAEsAAAAAgIAAAACR18JAAGkAAAAAQUAAAALZ2FtZUNvdW50ZXICAAAADF9TVEFSVEhFSUdIVAEAAAASZ2FtZUVuZEhlaWdodExhYmVsAAAAAQAAAAtnYW1lQ291bnRlcgkAASwAAAACCQABLAAAAAICAAAAAkdfCQABpAAAAAEFAAAAC2dhbWVDb3VudGVyAgAAAApfRU5ESEVJR0hUAQAAAA5nZXRTdGFydEhlaWdodAAAAAEAAAALZ2FtZUNvdW50ZXIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAFGdhbWVTdGFydEhlaWdodExhYmVsAAAAAQUAAAALZ2FtZUNvdW50ZXIBAAAADGdldEVuZEhlaWdodAAAAAEAAAALZ2FtZUNvdW50ZXIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAEmdhbWVFbmRIZWlnaHRMYWJlbAAAAAEFAAAAC2dhbWVDb3VudGVyAQAAABBnYW1lQmV0TGluZUxhYmVsAAAAAQAAAAliZXROdW1iZXIJAAEsAAAAAgkAASwAAAACAgAAAAJCXwkAAaQAAAABBQAAAAliZXROdW1iZXICAAAAC19CRVRERVRBSUxTAQAAABtnYW1lRmllbGRPck9kZHNCZXRMaW5lTGFiZWwAAAABAAAACWJldE51bWJlcgkAASwAAAACCQABLAAAAAICAAAAAkJfCQABpAAAAAEFAAAACWJldE51bWJlcgIAAAAUX0JFVEZJRUxPRERTRERFVEFJTFMBAAAAE2dldEJldERldGFpbHNSZXN1bHQAAAABAAAACWJldE51bWJlcgkABB0AAAACBQAAAAR0aGlzCQEAAAAQZ2FtZUJldExpbmVMYWJlbAAAAAEFAAAACWJldE51bWJlcgEAAAAYZ2V0RmllbGRCZXREZXRhaWxzUmVzdWx0AAAAAQAAAAliZXROdW1iZXIJAAQdAAAAAgUAAAAEdGhpcwkBAAAAG2dhbWVGaWVsZE9yT2Rkc0JldExpbmVMYWJlbAAAAAEFAAAACWJldE51bWJlcgEAAAATYXV0aG9yaXplUGVybWlzc2lvbgAAAAEAAAAPY2FsbGVyUHVibGljS2V5CQEAAAACIT0AAAACBQAAAA9jYWxsZXJQdWJsaWNLZXkFAAAAE2dhbWVNYXN0ZXJQdWJsaWNLZXkBAAAAGWdhbWVDdXJyZW50UG9pbnREaWNlTGFiZWwAAAABAAAAC2dhbWVDb3VudGVyCQABLAAAAAIJAAEsAAAAAgIAAAACR18JAAGkAAAAAQUAAAALZ2FtZUNvdW50ZXICAAAACl9MQVNUUE9JTlQBAAAAF2dhbWVGaXJzdFBvaW50RGljZUxhYmVsAAAAAQAAAAtnYW1lQ291bnRlcgkAASwAAAACCQABLAAAAAICAAAAAkdfCQABpAAAAAEFAAAAC2dhbWVDb3VudGVyAgAAAAtfRklSU1RQT0lOVAEAAAAZZ2FtZVdpbm5pbmdOdW1iZXJCZXRMYWJlbAAAAAMAAAALZ2FtZUNvdW50ZXIAAAAJYmV0TnVtYmVyAAAAB2JldFR5cGUJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAACV18CAAAACUJFVF9UWVBFXwUAAAAHYmV0VHlwZQIAAAABXwkAAaQAAAABBQAAAAliZXROdW1iZXICAAAADV9XSU5OSU5HX0JFVF8JAAGkAAAAAQUAAAALZ2FtZUNvdW50ZXICAAAADF9HQU1FX05VTUJFUgEAAAAOZ2FtZVN0YXRlTGFiZWwAAAABAAAAC2dhbWVDb3VudGVyCQABLAAAAAIJAAEsAAAAAgIAAAACR18JAAGkAAAAAQUAAAALZ2FtZUNvdW50ZXICAAAABl9TVEFURQEAAAAPZ2FtZVN1bVNoYUxhYmVsAAAAAQAAAAtnYW1lQ291bnRlcgkAASwAAAACCQABLAAAAAICAAAAAkdfCQABpAAAAAEFAAAAC2dhbWVDb3VudGVyAgAAAAdfU1VNU0hBAQAAABNnYW1lUmFuZG9tSGFzaExhYmVsAAAAAQAAAAtnYW1lQ291bnRlcgkAASwAAAACCQABLAAAAAICAAAAAkdfCQABpAAAAAEFAAAAC2dhbWVDb3VudGVyAgAAAAtfUkFORE9NSEFTSAEAAAAQZ2V0R2FtZVRvdGFsQmV0cwAAAAAJAAQaAAAAAgUAAAAEdGhpcwUAAAASZ2FtZVRvdGFsQmV0c0xhYmVsAQAAABRnZXRHYW1lUHJvY2Vzc2VkQmV0cwAAAAAJAAQaAAAAAgUAAAAEdGhpcwUAAAAZZ2FtZVRvdGFsUHJvY2NlZEJldHNMYWJlbAEAAAAbZ2V0R2FtZVRvdGFsRmllbGRPck9kZHNCZXRzAAAAAAkABBoAAAACBQAAAAR0aGlzBQAAABdnYW1lVG90YWxGaWVsZEJldHNMYWJlbAEAAAAfZ2V0R2FtZVByb2Nlc3NlZEZpZWxkT3JPZGRzQmV0cwAAAAAJAAQaAAAAAgUAAAAEdGhpcwUAAAAkZ2FtZVRvdGFsUHJvY2NlZEZpZWxkT3JPZGRzQmV0c0xhYmVsAQAAAAxnZXRHYW1lU3RhdGUAAAABAAAAC2dhbWVDb3VudGVyCQAEGgAAAAIFAAAABHRoaXMJAQAAAA5nYW1lU3RhdGVMYWJlbAAAAAEFAAAAC2dhbWVDb3VudGVyAQAAAA1nZXRHYW1lU3VtU2hhAAAAAQAAAAtnYW1lQ291bnRlcgkABB0AAAACBQAAAAR0aGlzCQEAAAAPZ2FtZVN1bVNoYUxhYmVsAAAAAQUAAAALZ2FtZUNvdW50ZXIBAAAADWdldFJhbmRvbUhhc2gAAAABAAAAC2dhbWVDb3VudGVyCQAEHQAAAAIFAAAABHRoaXMJAQAAABNnYW1lUmFuZG9tSGFzaExhYmVsAAAAAQUAAAALZ2FtZUNvdW50ZXIBAAAAFmdhbWVSb2xsc0NvdW50QmV0TGFiZWwAAAABAAAAC2dhbWVDb3VudGVyCQABLAAAAAIJAAEsAAAAAgIAAAACR18JAAGkAAAAAQUAAAALZ2FtZUNvdW50ZXICAAAAC19ST0xMU0NPVU5UAQAAAB9nYW1lUm9sbERpY2VXaXRoR2FtZU51bWJlckxhYmVsAAAAAgAAAAtnYW1lQ291bnRlcgAAAAhyb2xsRGljZQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAAJHXwkAAaQAAAABBQAAAAtnYW1lQ291bnRlcgIAAAABXwkAAaQAAAABBQAAAAhyb2xsRGljZQIAAAAUX0dBTUVOVU1CRVJfUk9MTERJQ0UBAAAAI2dhbWVGaWVsZE9yT2Rkc0JldEZvck5leHRUaHJvd0xhYmVsAAAAAQAAAAliZXROdW1iZXIJAAEsAAAAAgkAASwAAAACAgAAAAJCXwkAAaQAAAABBQAAAAliZXROdW1iZXICAAAAGF9GSUVMRF9PRERTX0JFVF9ST0xMRElDRQEAAAARZ2V0R2FtZVJvbGxzQ291bnQAAAABAAAAC2dhbWVDb3VudGVyCQAEGgAAAAIFAAAABHRoaXMJAQAAABZnYW1lUm9sbHNDb3VudEJldExhYmVsAAAAAQUAAAALZ2FtZUNvdW50ZXIBAAAAHWdldEdhbWVSb2xsRGljZVdpdGhHYW1lTnVtYmVyAAAAAgAAAAtnYW1lQ291bnRlcgAAAAhyb2xsRGljZQkABBoAAAACBQAAAAR0aGlzCQEAAAAfZ2FtZVJvbGxEaWNlV2l0aEdhbWVOdW1iZXJMYWJlbAAAAAIFAAAAC2dhbWVDb3VudGVyBQAAAAhyb2xsRGljZQEAAAAaZ2V0RmllbGRPZGRzQmV0Rm9yTmV4dERpY2UAAAABAAAACWJldE51bWJlcgkABBoAAAACBQAAAAR0aGlzCQEAAAAjZ2FtZUZpZWxkT3JPZGRzQmV0Rm9yTmV4dFRocm93TGFiZWwAAAABBQAAAAliZXROdW1iZXIBAAAAE2dhbWVCZXRDb3VudGVyTGFiZWwAAAABAAAACmdhbWVOdW1iZXIJAAEsAAAAAgkAASwAAAACAgAAAAJCXwkAAaQAAAABBQAAAApnYW1lTnVtYmVyAgAAAA9fQkVUX0dBTUVOVU1CRVIBAAAAImdhbWVGaWVsZE9yT2Rkc0JldEdhbWVDb3VudGVyTGFiZWwAAAABAAAACmdhbWVOdW1iZXIJAAEsAAAAAgkAASwAAAACAgAAAAJCXwkAAaQAAAABBQAAAApnYW1lTnVtYmVyAgAAABpfRklFTERfT0REU19CRVRfR0FNRU5VTUJFUgEAAAARZ2V0R2FtZUJldENvdW50ZXIAAAABAAAACmdhbWVOdW1iZXIJAAQaAAAAAgUAAAAEdGhpcwkBAAAAE2dhbWVCZXRDb3VudGVyTGFiZWwAAAABBQAAAApnYW1lTnVtYmVyAQAAABxnZXRHYW1lRmllbGRPck9kZHNCZXRDb3VudGVyAAAAAQAAAApnYW1lTnVtYmVyCQAEGgAAAAIFAAAABHRoaXMJAQAAACJnYW1lRmllbGRPck9kZHNCZXRHYW1lQ291bnRlckxhYmVsAAAAAQUAAAAKZ2FtZU51bWJlcgEAAAAOZ2V0R2FtZUNvdW50ZXIAAAAACQAEGgAAAAIFAAAABHRoaXMFAAAAEGdhbWVDb3VudGVyTGFiZWwBAAAAEWdldEZpcnN0UG9pbnREaWNlAAAAAQAAAAtnYW1lQ291bnRlcgkABBoAAAACBQAAAAR0aGlzCQEAAAAXZ2FtZUZpcnN0UG9pbnREaWNlTGFiZWwAAAABBQAAAAtnYW1lQ291bnRlcgEAAAATZ2V0Q3VycmVudFBvaW50RGljZQAAAAEAAAALZ2FtZUNvdW50ZXIEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAEdGhpcwkBAAAAGWdhbWVDdXJyZW50UG9pbnREaWNlTGFiZWwAAAABBQAAAAtnYW1lQ291bnRlcgMJAAABAAAAAgUAAAAHJG1h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aDEJAQAAABFnZXRHYW1lUm9sbHNDb3VudAAAAAEFAAAAC2dhbWVDb3VudGVyAwkAAAEAAAACBQAAAAckbWF0Y2gxAgAAAANJbnQEAAAACXJvbGxDb3VudAUAAAAHJG1hdGNoMQQAAAAQbmV3VG90YWxCZXRDb3VudAkAAGQAAAACBQAAAAhiZXRDb3VudAAAAAAAAAAAAQQAAAATbmV3Um9sbENvdW50Rm9yR2FtZQkAAGQAAAACBQAAAAlyb2xsQ291bnQAAAAAAAAAAAEDAwkAAAAAAAACBQAAAAd0eXBlQmV0BQAAAAdDT01FQkVUBgkAAAAAAAACBQAAAAd0eXBlQmV0BQAAAAtET05UQ09NRUJFVAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAImdhbWVGaWVsZE9yT2Rkc0JldEdhbWVDb3VudGVyTGFiZWwAAAABBQAAABBuZXdUb3RhbEJldENvdW50BQAAAAtnYW1lQ291bnRlcgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAbZ2FtZUZpZWxkT3JPZGRzQmV0TGluZUxhYmVsAAAAAQUAAAAQbmV3VG90YWxCZXRDb3VudAkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAABmNhbGxlcgIAAAABXwUAAAAGYW1vdW50AgAAAAFfBQAAAAd0eXBlQmV0AgAAABBfYWN0aXZlX3BlbmRpbmdfCQABpAAAAAEFAAAAC2dhbWVDb3VudGVyAgAAAAFfCQABpAAAAAEFAAAAE25ld1JvbGxDb3VudEZvckdhbWUJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAF2dhbWVUb3RhbEZpZWxkQmV0c0xhYmVsBQAAABBuZXdUb3RhbEJldENvdW50CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAjZ2FtZUZpZWxkT3JPZGRzQmV0Rm9yTmV4dFRocm93TGFiZWwAAAABBQAAABBuZXdUb3RhbEJldENvdW50BQAAABNuZXdSb2xsQ291bnRGb3JHYW1lBQAAAANuaWwJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAACJnYW1lRmllbGRPck9kZHNCZXRHYW1lQ291bnRlckxhYmVsAAAAAQUAAAAQbmV3VG90YWxCZXRDb3VudAUAAAALZ2FtZUNvdW50ZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAG2dhbWVGaWVsZE9yT2Rkc0JldExpbmVMYWJlbAAAAAEFAAAAEG5ld1RvdGFsQmV0Q291bnQJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAABmNhbGxlcgIAAAABXwUAAAAGYW1vdW50AgAAAAFfBQAAAAd0eXBlQmV0AgAAABBfYWN0aXZlX3BlbmRpbmdfCQABpAAAAAEFAAAAA29kZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAXZ2FtZVRvdGFsRmllbGRCZXRzTGFiZWwFAAAAEG5ld1RvdGFsQmV0Q291bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAACNnYW1lRmllbGRPck9kZHNCZXRGb3JOZXh0VGhyb3dMYWJlbAAAAAEFAAAAEG5ld1RvdGFsQmV0Q291bnQFAAAAE25ld1JvbGxDb3VudEZvckdhbWUFAAAAA25pbAkAAAIAAAABAgAAABJHYW1lIGRvZXNuJ3QgZXhpc3QJAAACAAAAAQIAAAAcR2FtZSBoYXMgbm90IGJlZSBpbml0aWFsaXplZAEAAAAfcm9sbFBsYWNlQmV0SW50b0Fub3RoZXJSb3VuZEJldAAAAAgAAAAJdG90YWxCZXRzAAAAE2xhc3RGaWVsZFByb2Nlc3NCZXQAAAAJYmV0T25Sb2xsAAAAC2dhbWVDb3VudGVyAAAABmFtb3VudAAAAAd0eXBlQmV0AAAABmNhbGxlcgAAAANvZGQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAACJnYW1lRmllbGRPck9kZHNCZXRHYW1lQ291bnRlckxhYmVsAAAAAQUAAAAJdG90YWxCZXRzBQAAAAtnYW1lQ291bnRlcgkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAbZ2FtZUZpZWxkT3JPZGRzQmV0TGluZUxhYmVsAAAAAQUAAAAJdG90YWxCZXRzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAAZjYWxsZXICAAAAAV8FAAAABmFtb3VudAIAAAABXwUAAAAHdHlwZUJldAIAAAAQX2FjdGl2ZV9wZW5kaW5nXwkAAaQAAAABBQAAAANvZGQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAG2dhbWVGaWVsZE9yT2Rkc0JldExpbmVMYWJlbAAAAAEFAAAAE2xhc3RGaWVsZFByb2Nlc3NCZXQJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAABmNhbGxlcgIAAAABXwUAAAAGYW1vdW50AgAAAAFfBQAAAAd0eXBlQmV0AgAAABFfaW5hY3RpdmVfcm9sbGVkXwkAAaQAAAABBQAAAANvZGQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAJGdhbWVUb3RhbFByb2NjZWRGaWVsZE9yT2Rkc0JldHNMYWJlbAUAAAATbGFzdEZpZWxkUHJvY2Vzc0JldAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAXZ2FtZVRvdGFsRmllbGRCZXRzTGFiZWwFAAAACXRvdGFsQmV0cwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAI2dhbWVGaWVsZE9yT2Rkc0JldEZvck5leHRUaHJvd0xhYmVsAAAAAQUAAAAJdG90YWxCZXRzBQAAAAliZXRPblJvbGwFAAAAA25pbAEAAAANc3RvcmVOZXh0Um9sbAAAAAkAAAAJZ2FtZVN0YXRlAAAABmFtb3VudAAAAA50b3RhbEZpZWxkQmV0cwAAABNsYXN0RmllbGRQcm9jZXNzQmV0AAAACWJldE9uUm9sbAAAAApnYW1lTnVtYmVyAAAAB2JldFR5cGUAAAAJYmV0UGxhY2VyAAAAA29kZAMJAAAAAAAAAgUAAAAJZ2FtZVN0YXRlBQAAAAxHQU1FRklOSVNIRUQJAQAAAB9yb2xsUGxhY2VCZXRJbnRvQW5vdGhlclJvdW5kQmV0AAAACAkAAGQAAAACBQAAAA50b3RhbEZpZWxkQmV0cwAAAAAAAAAAAQkAAGQAAAACBQAAABNsYXN0RmllbGRQcm9jZXNzQmV0AAAAAAAAAAABAAAAAAAAAAABCQAAZAAAAAIFAAAACmdhbWVOdW1iZXIAAAAAAAAAAAEJAAGkAAAAAQUAAAAGYW1vdW50BQAAAAdiZXRUeXBlBQAAAAliZXRQbGFjZXIFAAAAA29kZAkBAAAAH3JvbGxQbGFjZUJldEludG9Bbm90aGVyUm91bmRCZXQAAAAICQAAZAAAAAIFAAAADnRvdGFsRmllbGRCZXRzAAAAAAAAAAABCQAAZAAAAAIFAAAAE2xhc3RGaWVsZFByb2Nlc3NCZXQAAAAAAAAAAAEJAABkAAAAAgUAAAAJYmV0T25Sb2xsAAAAAAAAAAABBQAAAApnYW1lTnVtYmVyCQABpAAAAAEFAAAABmFtb3VudAUAAAAHYmV0VHlwZQUAAAAJYmV0UGxhY2VyBQAAAANvZGQBAAAADHN0b3JlUGFzc0JldAAAAAQAAAALZ2FtZUNvdW50ZXIAAAAGYW1vdW50AAAAB3R5cGVCZXQAAAAGY2FsbGVyBAAAAAckbWF0Y2gwCQEAAAAQZ2V0R2FtZVRvdGFsQmV0cwAAAAADCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAA0ludAQAAAAGbnVtYmVyBQAAAAckbWF0Y2gwBAAAAAxuZXdUb3RhbEJldHMJAABkAAAAAgUAAAAGbnVtYmVyAAAAAAAAAAABCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAATZ2FtZUJldENvdW50ZXJMYWJlbAAAAAEFAAAADG5ld1RvdGFsQmV0cwUAAAALZ2FtZUNvdW50ZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEGdhbWVCZXRMaW5lTGFiZWwAAAABBQAAAAxuZXdUb3RhbEJldHMJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACBQAAAAZjYWxsZXICAAAAAV8FAAAABmFtb3VudAIAAAABXwUAAAAHdHlwZUJldAIAAAAPX2FjdGl2ZV9wZW5kaW5nCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABJnYW1lVG90YWxCZXRzTGFiZWwFAAAADG5ld1RvdGFsQmV0cwUAAAADbmlsCQAAAgAAAAECAAAAHEdhbWUgaGFzIG5vdCBiZWUgaW5pdGlhbGl6ZWQBAAAAGHVkcGF0ZUJldERldGFpbHNXaXRoTG9zdAAAAAUAAAAQdXBkYXRlQmV0RGV0aWFscwAAAApnYW1lTnVtYmVyAAAADmxhc3RQcm9jZWVkQmV0AAAACGJldEluZGV4AAAAD2JldFByb2NlZWRJbmRleAQAAAANdXBkYXRlSW5mb0JldAkAASwAAAACBQAAABB1cGRhdGVCZXREZXRpYWxzAgAAAAVfbG9zdAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAhiZXRJbmRleAUAAAANdXBkYXRlSW5mb0JldAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAPYmV0UHJvY2VlZEluZGV4BQAAAA5sYXN0UHJvY2VlZEJldAUAAAADbmlsAQAAAB91ZHBhdGVCZXREZXRhaWxzV2l0aExvc3RXaXRoT2RkAAAABgAAABB1cGRhdGVCZXREZXRpYWxzAAAACmdhbWVOdW1iZXIAAAAObGFzdFByb2NlZWRCZXQAAAAIYmV0SW5kZXgAAAAPYmV0UHJvY2VlZEluZGV4AAAACW9kZE51bWJlcgQAAAANdXBkYXRlSW5mb0JldAkAASwAAAACCQABLAAAAAIFAAAAEHVwZGF0ZUJldERldGlhbHMCAAAABl9sb3N0XwkAAaQAAAABBQAAAAlvZGROdW1iZXIJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgUAAAAIYmV0SW5kZXgFAAAADXVwZGF0ZUluZm9CZXQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAD2JldFByb2NlZWRJbmRleAUAAAAObGFzdFByb2NlZWRCZXQFAAAAA25pbAEAAAAbdXBkYXRlQmV0RGV0YWlsc1dpdGhXaW5uaW5nAAAACAAAABB1cGRhdGVCZXREZXRpYWxzAAAACmdhbWVOdW1iZXIAAAARY3VycmVudFByb2NlZWRCZXQAAAAJYmV0UGxhY2VyAAAADXdpbm5pbmdBbW91bnQAAAAHYmV0VHlwZQAAAAhiZXRJbmRleAAAAA9iZXRQcm9jZWVkSW5kZXgEAAAADXVwZGF0ZUluZm9CZXQJAAEsAAAAAgUAAAAQdXBkYXRlQmV0RGV0aWFscwIAAAAFX3dvbl8JAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAGWdhbWVXaW5uaW5nTnVtYmVyQmV0TGFiZWwAAAADBQAAAApnYW1lTnVtYmVyBQAAABFjdXJyZW50UHJvY2VlZEJldAUAAAAHYmV0VHlwZQkAASwAAAACCQABLAAAAAIFAAAACWJldFBsYWNlcgIAAAAIX2Ftb3VudF8JAAGkAAAAAQUAAAANd2lubmluZ0Ftb3VudAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACBQAAAAhiZXRJbmRleAUAAAAQdXBkYXRlQmV0RGV0aWFscwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgUAAAAPYmV0UHJvY2VlZEluZGV4BQAAABFjdXJyZW50UHJvY2VlZEJldAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAFdmFsdWUAAAABCQAEJgAAAAEFAAAACWJldFBsYWNlcgUAAAANd2lubmluZ0Ftb3VudAUAAAAEdW5pdAUAAAADbmlsAQAAABtzdG9yZUdhbWVQcm9ncmVzc1BvaW50U3RhdGUAAAAHAAAACnN0b3JlSW5kZXgAAAAKZ2FtZU51bWJlcgAAAAZudW1iZXIAAAAJcm9sbENvdW50AAAADWN1cnJlbnRIZWlnaHQAAAAKcmFuZG9tSGFzaAAAAAVzdGF0ZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADmdhbWVTdGF0ZUxhYmVsAAAAAQUAAAAKZ2FtZU51bWJlcgUAAAAFc3RhdGUJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAACnN0b3JlSW5kZXgFAAAABm51bWJlcgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAFmdhbWVSb2xsc0NvdW50QmV0TGFiZWwAAAABBQAAAApnYW1lTnVtYmVyBQAAAAlyb2xsQ291bnQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABJnYW1lRW5kSGVpZ2h0TGFiZWwAAAABBQAAAApnYW1lTnVtYmVyCQAAZAAAAAIFAAAADWN1cnJl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AAAAAgkAASwAAAACCQABLAAAAAICAAAABU9ubHkgBQAAAAtQQVNTTElORUJFVAIAAAACLCAFAAAAD0RPTlRQQVNTTElORUJFVAIAAAAcIGFsbG93ZWQgaW4gcHJvY2Vzc05leHRCZXQoKQIAAAAQIGN1cnJlbnRCZXRUeXBlIAkAAZEAAAACCQAEtQAAAAIFAAAACmJldERldGFpbHMCAAAAAV8AAAAAAAAAAAIJAAACAAAAAQIAAAApR2FtZSBkb2VzIG5vdCBleGlzdCBvciBoYXMgYWxyZWFkeSBlbmRlZC4JAAACAAAAAQIAAAAFRXJyb3IJAAACAAAAAQIAAAAyR2FtZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQsIG5leHQgYmV0cyBub3QgZm91bmQJAAACAAAAAQIAAAAyR2FtZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQsIG5leHQgYmV0cyBub3QgZm91bmQAAAABaQEAAAAScHJvY2Vzc09uZVJvdW5kQmV0AAAAAAMJAQAAABNhdXRob3JpemVQZXJtaXNzaW9uAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQAAAgAAAAECAAAAGXByb2Nlc3NGaWVsZEJldF9GT1JCSURERU4EAAAAByRtYXRjaDAJAQAAABtnZXRHYW1lVG90YWxGaWVsZE9yT2Rkc0JldHMAAAAAAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAADnRvdGFsRmllbGRCZXRzBQAAAAckbWF0Y2gwBAAAAAckbWF0Y2gxCQEAAAAfZ2V0R2FtZVByb2Nlc3NlZEZpZWxkT3JPZGRzQmV0cwAAAAADCQAAAQAAAAIFAAAAByRtYXRjaDECAAAAA0ludAQAAAATbGFzdEZpZWxkUHJvY2Vzc0JldAUAAAAHJG1hdGNoMQQAAAAHbmV4dEJldAkAAGQAAAACBQAAABNsYXN0RmllbGRQcm9jZXNzQmV0AAAAAAAAAAABAwkAAGYAAAACBQAAAAduZXh0QmV0BQAAAA50b3RhbEZpZWxkQmV0cwkAAAIAAAABAgAAACNOZXh0IEZpZWxkIEJldCBoYXMgbm90IGJlZW4gcGxhY2VzLgQAAAAHJG1hdGNoMgkBAAAAHGdldEdhbWVGaWVsZE9yT2Rkc0JldENvdW50ZXIAAAABBQAAAAduZXh0QmV0AwkAAAEAAAACBQAAAAckbWF0Y2gyAgAAAANJbnQEAAAACmdhbWVOdW1iZXIFAAAAByRtYXRjaDIEAAAAByRtYXRjaDMJAQAAAAxnZXRHYW1lU3RhdGUAAAABBQAAAApnYW1lTnVtYmVyAwkAAAEAAAACBQAAAAckbWF0Y2gzAgAAAANJbnQEAAAACWdhbWVTdGF0ZQUAAAAHJG1hdGNoMwMJAAAAAAAAAgUAAAAJZ2FtZVN0YXRlBQAAAAlHQU1FU1RBUlQJAAACAAAAAQIAAAAYR2FtZSBoYXMgbm90IHN0YXJ0ZWQgeWV0BAAAAApiZXREZXRhaWxzCQEAAAAFdmFsdWUAAAABCQEAAAAYZ2V0RmllbGRCZXREZXRhaWxzUmVzdWx0AAAAAQUAAAAHbmV4dEJldAQAAAAHYmV0VHlwZQkAAZEAAAACCQAEtQAAAAIFAAAACmJldERldGFpbHMCAAAAAV8AAAAAAAAAAAIEAAAACWJldFBsYWNlcgkAAZEAAAACCQAEtQAAAAIFAAAACmJldERldGFpbHMCAAAAAV8AAAAAAAAAAAAEAAAABmFtb3VudAkBAAAABXZhbHVlAAAAAQkABLYAAAABCQABkQAAAAIJAAS1AAAAAgUAAAAKYmV0RGV0YWlscwIAAAABXwAAAAAAAAAAAQQAAAADb2RkCQEAAAAFdmFsdWUAAAABCQAEtgAAAAEJAAGRAAAAAgkABLUAAAACBQAAAApiZXREZXRhaWxzAgAAAAFfAAAAAAAAAAAFBAAAAAdhZGRyZXNzCQEAAAAFdmFsdWUAAAABCQAEJgAAAAEFAAAACWJldFBsYWNlcgQAAAAJYmV0T25Sb2xsCQEAAAAFdmFsdWUAAAABCQEAAAAaZ2V0RmllbGRPZGRzQmV0Rm9yTmV4dERpY2UAAAABBQAAAAduZXh0QmV0BAAAABB1cGRhdGVCZXREZXRpYWxzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgUAAAAJYmV0UGxhY2VyAgAAAAFfCQABkQAAAAIJAAS1AAAAAgUAAAAKYmV0RGV0YWlscwIAAAABXwAAAAAAAAAAAQIAAAABXwkAAZEAAAACCQAEtQAAAAIFAAAACmJldERldGFpbHMCAAAAAV8AAAAAAAAAAAICAAAACl9pbmFjdGl2ZV8EAAAAByRtYXRjaDQJAQAAAB1nZXRHYW1lUm9sbERpY2VXaXRoR2FtZU51bWJlcgAAAAIFAAAACmdhbWVOdW1iZXIFAAAACWJldE9uUm9sbAMJAAABAAAAAgUAAAAHJG1hdGNoNAIAAAADSW50BAAAAA1yZXN1bHRPZlJvdW5kBQAAAAckbWF0Y2g0BAAAAAlyb3VuZFJvbGUJAQAAAAV2YWx1ZQAAAAEJAAS2AAAAAQkBAAAAFmdhbWVSb2xsc0NvdW50QmV0TGFiZWwAAAABBQAAAApnYW1lTnVtYmVyBAAAABh3aW5uaW5nQW1vdW50T25lUm91bmRCZXQJAQAAABxnZXRXaW5uaW5nQW1vdW50T25lUm91bmRCZXRzAAAAAwUAAAAKYmV0RGV0YWlscwUAAAANcmVzdWx0T2ZSb3VuZAUAAAAJcm91bmRSb2xlAwkAAAAAAAACBQAAABh3aW5uaW5nQW1vdW50T25lUm91bmRCZXQA//////////8JAQAAAA1zdG9yZU5leHRSb2xsAAAACQUAAAAJZ2FtZVN0YXRlBQAAAAZhbW91bnQFAAAADnRvdGFsRmllbGRCZXRzBQAAABNsYXN0RmllbGRQcm9jZXNzQmV0BQAAAAliZXRPblJvbGwFAAAACmdhbWVOdW1iZXIFAAAAB2JldFR5cGUFAAAACWJldFBsYWNlcgUAAAADb2RkAwkAAAAAAAACBQAAABh3aW5uaW5nQW1vdW50T25lUm91bmRCZXQAAAAAAAAAAAAJAQAAAB91ZHBhdGVCZXREZXRhaWxzV2l0aExvc3RXaXRoT2RkAAAABgUAAAAQdXBkYXRlQmV0RGV0aWFscwUAAAAKZ2FtZU51bWJlcgUAAAAHbmV4dEJldAkBAAAAG2dhbWVGaWVsZE9yT2Rkc0JldExpbmVMYWJlbAAAAAEFAAAACmdhbWVOdW1iZXIFAAAAJGdhbWVUb3RhbFByb2NjZWRGaWVsZE9yT2Rkc0JldHNMYWJlbAUAAAADb2RkCQEAAAAbdXBkYXRlQmV0RGV0YWlsc1dpdGhXaW5uaW5nAAAACAkAASwAAAACBQAAABB1cGRhdGVCZXREZXRpYWxzAgAAAAVfd29uXwUAAAAKZ2FtZU51bWJlcgUAAAAHbmV4dEJldAUAAAAJYmV0UGxhY2VyBQAAABh3aW5uaW5nQW1vdW50T25lUm91bmRCZXQFAAAAB2JldFR5cGUJAQAAABtnYW1lRmllbGRPck9kZHNCZXRMaW5lTGFiZWwAAAABBQAAAAduZXh0QmV0BQAAACRnYW1lVG90YWxQcm9jY2VkRmllbGRPck9kZHNCZXRzTGFiZWwJAAACAAAAAQIAAAAlVGhlcmUgaXMgbm8gcmVzdWx0IGZvciB0aGlzIHJvdW5kIHlldAkAAAIAAAABAgAAAChHYW1lIGRvZXMgbm90IGV4aXN0IG9yIGhhcyBhbHJlYWR5IGVuZGVkCQAAAgAAAAECAAAABUVycm9yCQAAAgAAAAECAAAAMkdhbWUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLCBuZXh0IGJldHMgbm90IGZvdW5kCQAAAgAAAAECAAAAMkdhbWUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLCBuZXh0IGJldHMgbm90IGZvdW5kAAAAAWkBAAAACGluaXRHYW1lAAAAAAMJAQAAABNhdXRob3JpemVQZXJtaXNzaW9uAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5CQAAAgAAAAECAAAAEmluaXRHYW1lX0ZPUkJJRERFTgQAAAAHJG1hdGNoMAkBAAAADmdldEdhbWVDb3VudGVyAAAAAAMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAdjb3VudGVyBQAAAAckbWF0Y2gwCQAAAgAAAAECAAAAEUlOSVRfQUxSRUFEWV9ET05FCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABBnYW1lQ291bnRlckxhYmVsAAAAAAAAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABJnYW1lVG90YWxCZXRzTGFiZWwAAAAAAAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAGWdhbWVUb3RhbFByb2NjZWRCZXRzTGFiZWwAAAAAAAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIFAAAAF2dhbWVUb3RhbEZpZWxkQmV0c0xhYmVsAAAAAAAAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAACRnYW1lVG90YWxQcm9jY2VkRmllbGRPck9kZHNCZXRzTGFiZWwAAAAAAAAAAAAFAAAAA25pbAAAAAFpAQAAAAlzdGFydEdhbWUAAAABAAAACnJhbmRvbUhhc2gDCQEAAAATYXV0aG9yaXplUGVybWlzc2lvbgAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQkAAAIAAAABAgAAABNzdGFydEdhbWVfRk9SQklEREVOBAAAAAckbWF0Y2gwCQEAAAAOZ2V0R2FtZUNvdW50ZXIAAAAAAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAABm51bWJlcgUAAAAHJG1hdGNoMAMJAAAAAAAAAgUAAAAGbnVtYmVyAAAAAAAAAAAABAAAAAluZXdOdW1iZXIJAABkAAAAAgUAAAAGbnVtYmVyAAAAAAAAAAABCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACBQAAABBnYW1lQ291bnRlckxhYmVsBQAAAAluZXdOdW1iZXIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAA5nYW1lU3RhdGVMYWJlbAAAAAEFAAAACW5ld051bWJlcgUAAAAJR0FNRVNUQVJUCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAUZ2FtZVN0YXJ0SGVpZ2h0TGFiZWwAAAABBQAAAAluZXdOdW1iZXIIBQAAAAlsYXN0QmxvY2sAAAAGaGVpZ2h0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAASZ2FtZUVuZEhlaWdodExhYmVsAAAAAQUAAAAJbmV3TnVtYmVyCQAAZAAAAAIIBQAAAAlsYXN0QmxvY2sAAAAGaGVpZ2h0BQAAABZCTE9DS1RPUFJPQ0VTU0ZPUlRIUk9XCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAWZ2FtZVJvbGxzQ291bnRCZXRMYWJlbAAAAAEFAAAACW5ld051bWJlcgAAAAAAAAAAAAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAPZ2FtZVN1bVNoYUxhYmVsAAAAAQUAAAAJbmV3TnVtYmVyCQACWAAAAAEJ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AAAAC3JzYVNpZ1ZhbGlkCQAAAgAAAAECAAAAEElOVkFMSURfUlNBX1NJR04EAAAACnJhbmROdW1iZXIJAABqAAAAAgkABLEAAAABBQAAAApyYW5kb21IYXNoAAAAAAAAAAALBAAAAAZudW1iZXIJAAGRAAAAAgUAAAAKZGljZU51bWJlcgUAAAAKcmFuZE51bWJlcgQAAAAHJG1hdGNoMwkBAAAAEWdldEdhbWVSb2xsc0NvdW50AAAAAQUAAAAKZ2FtZU51bWJlcgMJAAABAAAAAgUAAAAHJG1hdGNoMwIAAAADSW50BAAAAA9yb2xsQ291bnROdW1iZXIFAAAAByRtYXRjaDMEAAAAEm5ld1JvbGxDb3VudE51bWJlcgkAAGQAAAACBQAAAA9yb2xsQ291bnROdW1iZXIAAAAAAAAAAAEDCQAAAAAAAAIFAAAABXN0YXRlBQAAAAlHQU1FU1RBUlQDAwMDAwkAAAAAAAACBQAAAAZudW1iZXIAAAAAAAAAAAcGCQAAAAAAAAIFAAAABm51bWJlcgAAAAAAAAAACwYJAAAAAAAAAgUAAAAGbnVtYmVyAAAAAAAAAAACBgkAAAAAAAACBQAAAAZudW1iZXIAAAAAAAAAAAMGCQAAAAAAAAIFAAAABm51bWJlcgAAAAAAAAAADAkBAAAAG3N0b3JlR2FtZVByb2dyZXNzUG9pbnRTdGF0ZQAAAAcJAQAAABdnYW1lRmlyc3RQb2ludERpY2VMYWJlbAAAAAEFAAAACmdhbWVOdW1iZXIFAAAACmdhbWVOdW1iZXIFAAAABm51bWJlcgUAAAASbmV3Um9sbENvdW50TnVtYmVyBQAAAA1jdXJyZW50SGVpZ2h0BQAAAApyYW5kb21IYXNoBQAAAAxHQU1FRklOSVNIRUQJAQAAABtzdG9yZUdhbWVQcm9ncmVzc1BvaW50U3RhdGUAAAAHCQEAAAAXZ2FtZUZpcnN0UG9pbnREaWNlTGFiZWwAAAABBQAAAApnYW1lTnVtYmVyBQAAAApnYW1lTnVtYmVyBQAAAAZudW1iZXIFAAAAEm5ld1JvbGxDb3VudE51bWJlcgUAAAANY3VycmVudEhlaWdodAUAAAAKcmFuZG9tSGFzaAUAAAAOR0FNRUlOUFJPR1JFU1MEAAAADGN1cnJlbnRQb2ludAkBAAAABXZhbHVlAAAAAQkBAAAAE2dldEN1cnJlbnRQb2ludERpY2UAAAABBQAAAApnYW1lTnVtYmVyBAAAAApmaXJzdFBvaW50CQEAAAAFdmFsdWUAAAABCQEAAAARZ2V0Rmlyc3RQb2ludERpY2UAAAABBQAAAApnYW1lTnVtYmVyAwkAAAAAAAACBQAAAAxjdXJyZW50UG9pbnQAAAAAAAAAAAADAwkAAAAAAAACBQAAAAZudW1iZXIAAAAAAAAAAAcGCQAAAAAAAAIFAAAACmZpcnN0UG9pbnQFAAAABm51bWJlcgkBAAAAG3N0b3JlR2FtZVByb2dyZXNzUG9pbnRTdGF0ZQAAAAcJAQAAABlnYW1lQ3VycmVudFBvaW50RGljZUxhYmVsAAAAAQUAAAAKZ2FtZU51bWJlcgUAAAAKZ2FtZU51bWJlcgUAAAAGbnVtYmVyBQAAABJuZXdSb2xsQ291bnROdW1iZXIFAAAADWN1cnJlbnRIZWlnaHQFAAAACnJhbmRvbUhhc2gFAAAADEdBTUVGSU5JU0hFRAkBAAAAG3N0b3JlR2FtZVByb2dyZXNzUG9pbnRTdGF0ZQAAAAcJAQAAABlnYW1lQ3VycmVudFBvaW50RGljZUxhYmVsAAAAAQUAAAAKZ2FtZU51bWJlcgUAAAAKZ2FtZU51bWJlcgUAAAAGbnVtYmVyBQAAABJuZXdSb2xsQ291bnROdW1iZXIFAAAADWN1cnJlbnRIZWlnaHQFAAAACnJhbmRvbUhhc2gFAAAADkdBTUVJTlBST0dSRVNTAwMJAAAAAAAAAgUAAAAGbnVtYmVyAAAAAAAAAAAHBgkAAAAAAAACBQAAAApmaXJzdFBvaW50BQAAAAZudW1iZXIJAQAAABtzdG9yZUdhbWVQcm9ncmVzc1BvaW50U3RhdGUAAAAHCQEAAAAZZ2FtZUN1cnJlbnRQb2ludERpY2VMYWJlbAAAAAEFAAAACmdhbWVOdW1iZXIFAAAACmdhbWVOdW1iZXIFAAAABm51bWJlcgUAAAASbmV3Um9sbENvdW50TnVtYmVyBQAAAA1jdXJyZW50SGVpZ2h0BQAAAApyYW5kb21IYXNoBQAAAAxHQU1FRklOSVNIRUQJAQAAABtzdG9yZUdhbWVQcm9ncmVzc1BvaW50U3RhdGUAAAAHCQEAAAAZZ2FtZUN1cnJlbnRQb2ludERpY2VMYWJlbAAAAAEFAAAACmdhbWVOdW1iZXIFAAAACmdhbWVOdW1iZXIFAAAABm51bWJlcgUAAAASbmV3Um9sbENvdW50TnVtYmVyBQAAAA1jdXJyZW50SGVpZ2h0BQAAAApyYW5kb21IYXNoBQAAAA5HQU1FSU5QUk9HUkVTUwkAAAIAAAABAgAAABlObyBkaWNlcyBoYXZlIGJlZW4gdGhyb3duCQAAAgAAAAECAAAAGUxhc3QgYmxvY2sgZG9lc24ndCBleGlzdC4JAAACAAAAAQIAAAARU0hBIGRvZXNuJ3QgZXhpc3QJAAACAAAAAQIAAAA3VGhyb3cgZGljZSBub3QgYWxsb3cgc3RpbGwgd2FpdGluZyBmb3IgYmxvY2sgdG8gcHJvY2VzcwkAAAIAAAABAgAAAClHYW1lIGRvZXMgbm90IGV4aXN0IG9yIGhhcyBhbHJlYWR5IGVuZGVkLgAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAEAAAAByRtYXRjaDAFAAAAAnR4CQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAgFAAAAAnR4AAAAD3NlbmRlclB1YmxpY0tleangzFs=", "height": 1554265, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 3xyfGpiECe248rgrw1jv4cPiFii3BgCvLjVfUDdJHtTt Next: F2kS4LccRVAChi2rK44KWyBkn5tK6ML2TWm8Xej7yimR Diff:
OldNewDifferences
190190 func getWinningAmountForOdds (amount,odd,resultOfRound) = if (if ((odd == 4))
191191 then true
192192 else (odd == 10))
193- then {
194- let winningAmount = (amount * 7)
195- winningAmount
196- }
193+ then (amount * 7)
197194 else if (if ((odd == 5))
198195 then true
199196 else (odd == 8))
200- then {
201- let winningAmount = (amount * 9)
202- winningAmount
203- }
197+ then (amount * 9)
204198 else if (if ((odd == 3))
205199 then true
206200 else (odd == 11))
207- then {
208- let winningAmount = (amount * 15)
209- winningAmount
210- }
201+ then (amount * 15)
211202 else if (if ((odd == 2))
212203 then true
213204 else (odd == 12))
214- then {
215- let winningAmount = (amount * 30)
216- winningAmount
217- }
205+ then (amount * 30)
218206 else if (if ((odd == 10))
219207 then true
220208 else (odd == 4))
221- then {
222- let winningAmount = (amount * 30)
223- winningAmount
224- }
209+ then (amount * 30)
225210 else if ((odd == 7))
226- then {
227- let winningAmount = (amount * 4)
228- winningAmount
229- }
211+ then (amount * 4)
230212 else if (if ((odd == 100))
231213 then if (if ((resultOfRound == 3))
232214 then true
234216 then true
235217 else (resultOfRound == 2)
236218 else false)
237- then {
238- let winningAmount = (amount * 7)
239- winningAmount
240- }
219+ then (amount * 7)
241220 else 0
242221
243222
244223 func getWinningAmountForField (amount,resultOfRound) = if ((resultOfRound == 12))
245- then {
246- let winningAmount = (amount * 4)
247- winningAmount
248- }
224+ then (amount * 4)
249225 else if ((resultOfRound == 2))
250- then {
251- let winningAmount = (amount * 3)
252- winningAmount
253- }
226+ then (amount * 3)
254227 else if (if (if (if ((resultOfRound == 5))
255228 then true
256229 else (resultOfRound == 6))
259232 then true
260233 else (resultOfRound == 8))
261234 then 0
262- else {
263- let winningAmount = (amount * 2)
264- winningAmount
265- }
235+ else (amount * 2)
266236
267237
268238 func storeOneRoundBetTypes (gameCounter,amount,typeBet,caller,odd) = match getGameTotalFieldOrOddsBets() {
292262 else rollPlaceBetIntoAnotherRoundBet((totalFieldBets + 1), (lastFieldProcessBet + 1), (betOnRoll + 1), gameNumber, toString(amount), betType, betPlacer, odd)
293263
294264
295-func storeComeDontComeBet (gameState,betDetails,resultOfRound,amount,totalFieldBets,lastFieldProcessBet,betOnRoll,gameNumber,betType,betPlacer,odd) = {
296- let comeBetGameNumber = value(parseInt(split(betDetails, "_")[5]))
297- let comeBetRollNumber = value(parseInt(split(betDetails, "_")[6]))
298- let resultOfGame = value(getGameRollDiceWithGameNumber(comeBetGameNumber, comeBetRollNumber))
299- if ((resultOfRound == 7))
300- then if ((betDetails == COMEBET))
301- then throw("Only Field Type of Bet can be proceed")
302- else throw("Only Field Type of Bet can be proceed")
303- else if ((resultOfRound == resultOfGame))
304- then throw("Only Field Type of Bet can be proceed")
305- else if ((gameState == GAMEFINISHED))
306- then storeNextRoll(gameState, amount, (totalFieldBets + 1), (lastFieldProcessBet + 1), 1, (gameNumber + 1), betType, betPlacer, odd)
307- else storeNextRoll(gameState, amount, (totalFieldBets + 1), (lastFieldProcessBet + 1), (betOnRoll + 1), gameNumber, betType, betPlacer, odd)
308- }
309-
310-
311-func storePassOrComeBet (gameCounter,amount,typeBet,caller) = match getGameTotalBets() {
265+func storePassBet (gameCounter,amount,typeBet,caller) = match getGameTotalBets() {
312266 case number: Int =>
313267 let newTotalBets = (number + 1)
314268 [IntegerEntry(gameBetCounterLabel(newTotalBets), gameCounter), StringEntry(gameBetLineLabel(newTotalBets), (((((caller + "_") + amount) + "_") + typeBet) + "_active_pending")), IntegerEntry(gameTotalBetsLabel, newTotalBets)]
338292 func storeGameProgressPointState (storeIndex,gameNumber,number,rollCount,currentHeight,randomHash,state) = [IntegerEntry(gameStateLabel(gameNumber), state), IntegerEntry(storeIndex, number), IntegerEntry(gameRollsCountBetLabel(gameNumber), rollCount), IntegerEntry(gameEndHeightLabel(gameNumber), (currentHeight + BLOCKTOPROCESSFORTHROW)), StringEntry(gameRandomHashLabel(gameNumber), toBase64String(randomHash)), IntegerEntry(gameRollDiceWithGameNumberLabel(gameNumber, rollCount), number)]
339293
340294
295+func getWinningAmountPassLineBets (firstPoint,lastPoint,betDetails) = {
296+ let betType = split(betDetails, "_")[2]
297+ let betPlacer = split(betDetails, "_")[0]
298+ let amount = value(parseInt(split(betDetails, "_")[1]))
299+ if ((betType == PASSLINEBET))
300+ then if ((lastPoint == 0))
301+ then if (if ((firstPoint == 7))
302+ then true
303+ else (firstPoint == 11))
304+ then (amount * 2)
305+ else 0
306+ else if ((firstPoint == lastPoint))
307+ then (amount * 2)
308+ else if ((lastPoint == 7))
309+ then 0
310+ else 0
311+ else if ((betType == DONTPASSLINEBET))
312+ then if ((lastPoint == 0))
313+ then if (if ((firstPoint == 2))
314+ then true
315+ else (firstPoint == 3))
316+ then (amount * 2)
317+ else if (if ((lastPoint == 7))
318+ then true
319+ else (lastPoint == 11))
320+ then 0
321+ else 0
322+ else if (if ((lastPoint == 2))
323+ then true
324+ else (lastPoint == 3))
325+ then (amount * 2)
326+ else if ((lastPoint == 7))
327+ then 0
328+ else 0
329+ else 0
330+ }
331+
332+
333+func getWinningAmountOneRoundBets (betDetails,resultOfRound,round) = {
334+ let betType = split(betDetails, "_")[2]
335+ let odd = value(parseInt(split(betDetails, "_")[5]))
336+ let amount = value(parseInt(split(betDetails, "_")[1]))
337+ if ((betType == FIELDBET))
338+ then if ((resultOfRound == 12))
339+ then (amount * 4)
340+ else if ((resultOfRound == 2))
341+ then (amount * 3)
342+ else if (if (if (if ((resultOfRound == 5))
343+ then true
344+ else (resultOfRound == 6))
345+ then true
346+ else (resultOfRound == 7))
347+ then true
348+ else (resultOfRound == 8))
349+ then 0
350+ else (amount * 2)
351+ else if ((betType == ODDSBET))
352+ then if (if ((odd == 4))
353+ then true
354+ else (odd == 10))
355+ then (amount * 7)
356+ else if (if ((odd == 5))
357+ then true
358+ else (odd == 8))
359+ then (amount * 9)
360+ else if (if ((odd == 3))
361+ then true
362+ else (odd == 11))
363+ then (amount * 15)
364+ else if (if ((odd == 2))
365+ then true
366+ else (odd == 12))
367+ then (amount * 30)
368+ else if (if ((odd == 10))
369+ then true
370+ else (odd == 4))
371+ then (amount * 30)
372+ else if ((odd == 7))
373+ then (amount * 4)
374+ else if (if ((odd == 100))
375+ then if (if ((resultOfRound == 3))
376+ then true
377+ else (resultOfRound == 12))
378+ then true
379+ else (resultOfRound == 2)
380+ else false)
381+ then (amount * 7)
382+ else 0
383+ else if ((betType == BIG6OR8BET))
384+ then if (if ((resultOfRound == 6))
385+ then true
386+ else (resultOfRound == 8))
387+ then (2 * amount)
388+ else 0
389+ else if (if ((betType == PLACEBETLAY))
390+ then true
391+ else (betType == PLACEBETLOSE))
392+ then if ((resultOfRound == 7))
393+ then (amount * 2)
394+ else if ((resultOfRound == odd))
395+ then 0
396+ else -1
397+ else if (if ((betType == PLACEBETBUY))
398+ then true
399+ else (betType == PLACEBETWIN))
400+ then if ((resultOfRound == 7))
401+ then 0
402+ else if ((resultOfRound == odd))
403+ then (amount * 2)
404+ else -1
405+ else if ((betType == COMEBET))
406+ then {
407+ let playerPoint = value(parseInt(split(betDetails, "_")[6]))
408+ if ((round == 2))
409+ then if (if ((resultOfRound == 7))
410+ then true
411+ else (resultOfRound == 11))
412+ then (amount * 2)
413+ else if (if (if ((resultOfRound == 2))
414+ then true
415+ else (resultOfRound == 12))
416+ then true
417+ else (resultOfRound == 3))
418+ then 0
419+ else if ((resultOfRound == playerPoint))
420+ then (amount * 2)
421+ else -1
422+ else if ((round > 2))
423+ then if ((resultOfRound == 7))
424+ then 0
425+ else if ((resultOfRound == playerPoint))
426+ then (amount * 2)
427+ else -1
428+ else throw("Not Allow in The Beginning")
429+ }
430+ else if ((betType == DONTCOMEBET))
431+ then {
432+ let playerPoint = value(parseInt(split(betDetails, "_")[6]))
433+ if ((round == 2))
434+ then if (if ((resultOfRound == 7))
435+ then true
436+ else (resultOfRound == 11))
437+ then 0
438+ else if (if (if ((resultOfRound == 2))
439+ then true
440+ else (resultOfRound == 12))
441+ then true
442+ else (resultOfRound == 3))
443+ then (amount * 2)
444+ else if ((resultOfRound == playerPoint))
445+ then (amount * 2)
446+ else -1
447+ else if ((round > 1))
448+ then if ((resultOfRound == 7))
449+ then (amount * 2)
450+ else if ((resultOfRound == playerPoint))
451+ then 0
452+ else -1
453+ else throw("Not Allow in The Beginning")
454+ }
455+ else 0
456+ }
457+
458+
341459 @Callable(i)
342460 func processNextBet () = if (authorizePermission(i.callerPublicKey))
343461 then throw("processFieldBet_FORBIDDEN")
358476 then throw("Game has to finished in order to process NON-FIELD bets")
359477 else {
360478 let betDetails = value(getBetDetailsResult(nextBet))
361- let betType = split(betDetails, "_")[2]
362- let betPlacer = split(betDetails, "_")[0]
363- let amount = value(parseInt(split(betDetails, "_")[1]))
364- let address = value(addressFromString(betPlacer))
479+ let address = value(addressFromString(split(betDetails, "_")[0]))
365480 let currentPoint = getCurrentPointDice(nextBet)
366- let firstPoint = getFirstPointDice(nextBet)
367- let updateBetDetials = (((((betPlacer + "_") + split(betDetails, "_")[1]) + "_") + split(betDetails, "_")[2]) + "_inactive_")
368- if ((betType == PASSLINEBET))
369- then if ((currentPoint == 0))
370- then if (if ((firstPoint == 7))
371- then true
372- else (firstPoint == 11))
373- then {
374- let winningAmount = (amount * 2)
375- updateBetDetailsWithWinning(updateBetDetials, gameNumber, nextBet, betPlacer, winningAmount, betType, gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
376- }
377- else udpateBetDetailsWithLost(updateBetDetials, gameNumber, nextBet, gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
378- else if ((firstPoint == currentPoint))
379- then {
380- let winningAmount = (amount * 2)
381- updateBetDetailsWithWinning(updateBetDetials, gameNumber, nextBet, betPlacer, winningAmount, betType, gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
382- }
383- else if ((currentPoint == 7))
384- then udpateBetDetailsWithLost(updateBetDetials, gameNumber, nextBet, gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
385- else udpateBetDetailsWithLost(updateBetDetials, gameNumber, nextBet, gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
386- else if ((betType == DONTPASSLINEBET))
387- then if ((currentPoint == 0))
388- then if (if ((firstPoint == 2))
389- then true
390- else (firstPoint == 3))
391- then {
392- let winningAmount = (amount * 2)
393- updateBetDetailsWithWinning(updateBetDetials, gameNumber, nextBet, betPlacer, winningAmount, betType, gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
394- }
395- else if (if ((currentPoint == 7))
396- then true
397- else (currentPoint == 11))
398- then udpateBetDetailsWithLost(updateBetDetials, gameNumber, nextBet, gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
399- else udpateBetDetailsWithLost(updateBetDetials, gameNumber, nextBet, gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
400- else if (if ((currentPoint == 2))
401- then true
402- else (currentPoint == 3))
403- then {
404- let winningAmount = (amount * 2)
405- updateBetDetailsWithWinning(updateBetDetials, gameNumber, nextBet, betPlacer, winningAmount, betType, gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
406- }
407- else if ((currentPoint == 7))
408- then udpateBetDetailsWithLost(updateBetDetials, gameNumber, nextBet, gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
409- else udpateBetDetailsWithLost(updateBetDetials, gameNumber, nextBet, gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
410- else throw((((((("Only " + PASSLINEBET) + ", ") + DONTPASSLINEBET) + " allowed in processNextBet()") + " currentBetType ") + betType))
481+ let firstPoint = value(getFirstPointDice(nextBet))
482+ let updateBetDetials = (((((split(betDetails, "_")[0] + "_") + split(betDetails, "_")[1]) + "_") + split(betDetails, "_")[2]) + "_inactive_")
483+ let winningAmountResult = getWinningAmountPassLineBets(firstPoint, currentPoint, betDetails)
484+ if ((winningAmountResult == 0))
485+ then udpateBetDetailsWithLost(updateBetDetials, gameNumber, nextBet, gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
486+ else if ((winningAmountResult > 0))
487+ then updateBetDetailsWithWinning(updateBetDetials, gameNumber, nextBet, split(betDetails, "_")[0], winningAmountResult, split(betDetails, "_")[2], gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
488+ else throw((((((("Only " + PASSLINEBET) + ", ") + DONTPASSLINEBET) + " allowed in processNextBet()") + " currentBetType ") + split(betDetails, "_")[2]))
411489 }
412490 case _ =>
413491 throw("Game does not exist or has already ended.")
448526 let odd = value(parseInt(split(betDetails, "_")[5]))
449527 let address = value(addressFromString(betPlacer))
450528 let betOnRoll = value(getFieldOddsBetForNextDice(nextBet))
529+ let updateBetDetials = (((((betPlacer + "_") + split(betDetails, "_")[1]) + "_") + split(betDetails, "_")[2]) + "_inactive_")
451530 match getGameRollDiceWithGameNumber(gameNumber, betOnRoll) {
452531 case resultOfRound: Int =>
453- let updateBetDetials = (((((betPlacer + "_") + split(betDetails, "_")[1]) + "_") + split(betDetails, "_")[2]) + "_inactive_")
454- if ((betType == FIELDBET))
455- then {
456- let winningAmount = getWinningAmountForField(amount, resultOfRound)
457- if ((winningAmount == 0))
458- then udpateBetDetailsWithLost(updateBetDetials, gameNumber, nextBet, gameFieldOrOddsBetLineLabel(gameNumber), gameTotalProccedFieldOrOddsBetsLabel)
459- else updateBetDetailsWithWinning(updateBetDetials, gameNumber, nextBet, betPlacer, winningAmount, betType, gameFieldOrOddsBetLineLabel(nextBet), gameTotalProccedFieldOrOddsBetsLabel)
460- }
461- else if ((betType == ODDSBET))
462- then {
463- let winningAmount = getWinningAmountForOdds(amount, odd, resultOfRound)
464- if ((winningAmount == 0))
465- then updateBetDetailsWithWinning((updateBetDetials + "_won_"), gameNumber, nextBet, betPlacer, winningAmount, betType, gameFieldOrOddsBetLineLabel(nextBet), gameTotalProccedFieldOrOddsBetsLabel)
466- else udpateBetDetailsWithLostWithOdd(updateBetDetials, gameNumber, nextBet, gameFieldOrOddsBetLineLabel(nextBet), gameTotalProccedFieldOrOddsBetsLabel, odd)
467- }
468- else if ((betType == BIG6OR8BET))
469- then if (if ((resultOfRound == 6))
470- then true
471- else (resultOfRound == 8))
472- then {
473- let winningAmount = (2 * amount)
474- updateBetDetailsWithWinning((updateBetDetials + "_won_"), gameNumber, nextBet, betPlacer, winningAmount, betType, gameFieldOrOddsBetLineLabel(nextBet), gameTotalProccedFieldOrOddsBetsLabel)
475- }
476- else udpateBetDetailsWithLostWithOdd(updateBetDetials, gameNumber, nextBet, gameFieldOrOddsBetLineLabel(nextBet), gameTotalProccedFieldOrOddsBetsLabel, odd)
477- else if (if ((betType == PLACEBETBUY))
478- then true
479- else (betType == PLACEBETWIN))
480- then if ((resultOfRound == 7))
481- then udpateBetDetailsWithLostWithOdd(updateBetDetials, gameNumber, nextBet, gameFieldOrOddsBetLineLabel(nextBet), gameTotalProccedFieldOrOddsBetsLabel, odd)
482- else if ((resultOfRound == odd))
483- then {
484- let winningAmount = (amount * 2)
485- updateBetDetailsWithWinning((updateBetDetials + "_won_"), gameNumber, nextBet, betPlacer, winningAmount, betType, gameFieldOrOddsBetLineLabel(nextBet), gameTotalProccedFieldOrOddsBetsLabel)
486- }
487- else storeNextRoll(gameState, amount, (totalFieldBets + 1), (lastFieldProcessBet + 1), 1, (gameNumber + 1), betType, betPlacer, odd)
488- else if (if ((betType == PLACEBETLAY))
489- then true
490- else (betType == PLACEBETLOSE))
491- then if ((resultOfRound == 7))
492- then {
493- let winningAmount = (amount * 2)
494- updateBetDetailsWithWinning(updateBetDetials, gameNumber, nextBet, betPlacer, winningAmount, betType, gameFieldOrOddsBetLineLabel(nextBet), gameTotalProccedFieldOrOddsBetsLabel)
495- }
496- else if ((resultOfRound == odd))
497- then udpateBetDetailsWithLostWithOdd(updateBetDetials, gameNumber, nextBet, gameFieldOrOddsBetLineLabel(nextBet), gameTotalProccedFieldOrOddsBetsLabel, odd)
498- else storeNextRoll(gameState, amount, (totalFieldBets + 1), (lastFieldProcessBet + 1), 1, (gameNumber + 1), betType, betPlacer, odd)
499- else if (if ((betType == COMEBET))
500- then true
501- else (betType == DONTCOMEBET))
502- then storeComeDontComeBet(gameState, betDetails, resultOfRound, amount, totalFieldBets, lastFieldProcessBet, betOnRoll, gameNumber, betType, betPlacer, odd)
503- else throw("Only Field Type of Bet can be proceed")
532+ let roundRole = value(parseInt(gameRollsCountBetLabel(gameNumber)))
533+ let winningAmountOneRoundBet = getWinningAmountOneRoundBets(betDetails, resultOfRound, roundRole)
534+ if ((winningAmountOneRoundBet == -1))
535+ then storeNextRoll(gameState, amount, totalFieldBets, lastFieldProcessBet, betOnRoll, gameNumber, betType, betPlacer, odd)
536+ else if ((winningAmountOneRoundBet == 0))
537+ then udpateBetDetailsWithLostWithOdd(updateBetDetials, gameNumber, nextBet, gameFieldOrOddsBetLineLabel(gameNumber), gameTotalProccedFieldOrOddsBetsLabel, odd)
538+ else updateBetDetailsWithWinning((updateBetDetials + "_won_"), gameNumber, nextBet, betPlacer, winningAmountOneRoundBet, betType, gameFieldOrOddsBetLineLabel(nextBet), gameTotalProccedFieldOrOddsBetsLabel)
504539 case _ =>
505540 throw("There is no result for this round yet")
506541 }
574609 then if (if ((typeBet == PASSLINEBET))
575610 then true
576611 else (typeBet == DONTPASSLINEBET))
577- then storePassOrComeBet(GAMENUMBER, toString(p.amount), typeBet, toBase58String(i.caller.bytes))
612+ then storePassBet(GAMENUMBER, toString(p.amount), typeBet, toBase58String(i.caller.bytes))
578613 else throw((((((("Only " + PASSLINEBET) + ", ") + DONTPASSLINEBET) + " and ") + FIELDBET) + " are allowed in the Beginning of Game"))
579614 else if ((state == GAMEINPROGRESS))
580615 then throw((((((("Only " + COMEBET) + ", ") + DONTCOMEBET) + " and ") + FIELDBET) + " ARE ALLOWED at Start."))
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 4 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let gameMasterPublicKey = base58'AN4MpPP69eUoXBNDezAU1WiBE9X2oVfoN8T7XeyRxiKt'
55
66 let diceNumber = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
77
88 let gameToken = base58'Co7gTLr7ZJvVKwToLpuZJqmkVecy5uwupYH6qCkKuhc8'
99
1010 let RSAPUBLIC = fromBase64String("base64:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjnt2PdN1Pdj7rsXzbapgucn9e1XffUx1o7grAlw8C6NFuv1PPj7KnQ6RtN9xhniLF4xKlc7//TYXd1uHWmx9vu9hjciYX9UMRJnhlZO2q34mxPdcgLDKhJHDN726KI0wHpFQ5dHMyzoMLdWsahFc1Wx/XxroK2Kc1y2JBWN2akRlkxSDcluqbbUcWMyrwG6iWuVlhej5xfcuerg/psK35WGn7SLF29tWuR2x+24nM+BJUsuRG7yBZUhGrYzJk2gvpucRLea6AFRvow7RdyMYAwKFrr6mgQ0VcUw2T750e1oGanY0UdU3NPsKIgvU4Ft4uibMlMMBJvcrsEbDQHfDlwIDAQAB")
1111
1212 let GAMESTART = 0
1313
1414 let GAMEINPROGRESS = 1
1515
1616 let GAMEFINISHED = 2
1717
1818 let BLOCKTOPROCESSFORTHROW = 1
1919
2020 let PASSLINEBET = "PASSLINEBET"
2121
2222 let DONTPASSLINEBET = "DONTPASSLINEBET"
2323
2424 let COMEBET = "COMEBET"
2525
2626 let DONTCOMEBET = "DONTCOMEBET"
2727
2828 let FIELDBET = "FIELDBET"
2929
3030 let ODDSBET = "ODDSBET"
3131
3232 let BIG6OR8BET = "BIG6OR8BET"
3333
3434 let PLACEBETBUY = "PLACEBETBUY"
3535
3636 let PLACEBETLOSE = "PLACEBETLOSE"
3737
3838 let PLACEBETLAY = "PLACEBETLAY"
3939
4040 let PLACEBETWIN = "PLACEBETWIN"
4141
4242 let gameCounterLabel = "G_GAMECOUNTER"
4343
4444 let gameTotalBetsLabel = "G_TOTALBETS"
4545
4646 let gameTotalProccedBetsLabel = "G_PROCESSEDBETS"
4747
4848 let gameTotalFieldBetsLabel = "G_TOTALFIELD_ODDS_BETS"
4949
5050 let gameTotalProccedFieldOrOddsBetsLabel = "G_PROCESSEDFIEL_ODDS_BETS"
5151
5252 func gameStartHeightLabel (gameCounter) = (("G_" + toString(gameCounter)) + "_STARTHEIGHT")
5353
5454
5555 func gameEndHeightLabel (gameCounter) = (("G_" + toString(gameCounter)) + "_ENDHEIGHT")
5656
5757
5858 func getStartHeight (gameCounter) = getInteger(this, gameStartHeightLabel(gameCounter))
5959
6060
6161 func getEndHeight (gameCounter) = getInteger(this, gameEndHeightLabel(gameCounter))
6262
6363
6464 func gameBetLineLabel (betNumber) = (("B_" + toString(betNumber)) + "_BETDETAILS")
6565
6666
6767 func gameFieldOrOddsBetLineLabel (betNumber) = (("B_" + toString(betNumber)) + "_BETFIELODDSDDETAILS")
6868
6969
7070 func getBetDetailsResult (betNumber) = getString(this, gameBetLineLabel(betNumber))
7171
7272
7373 func getFieldBetDetailsResult (betNumber) = getString(this, gameFieldOrOddsBetLineLabel(betNumber))
7474
7575
7676 func authorizePermission (callerPublicKey) = (callerPublicKey != gameMasterPublicKey)
7777
7878
7979 func gameCurrentPointDiceLabel (gameCounter) = (("G_" + toString(gameCounter)) + "_LASTPOINT")
8080
8181
8282 func gameFirstPointDiceLabel (gameCounter) = (("G_" + toString(gameCounter)) + "_FIRSTPOINT")
8383
8484
8585 func gameWinningNumberBetLabel (gameCounter,betNumber,betType) = ((((((("W_" + "BET_TYPE_") + betType) + "_") + toString(betNumber)) + "_WINNING_BET_") + toString(gameCounter)) + "_GAME_NUMBER")
8686
8787
8888 func gameStateLabel (gameCounter) = (("G_" + toString(gameCounter)) + "_STATE")
8989
9090
9191 func gameSumShaLabel (gameCounter) = (("G_" + toString(gameCounter)) + "_SUMSHA")
9292
9393
9494 func gameRandomHashLabel (gameCounter) = (("G_" + toString(gameCounter)) + "_RANDOMHASH")
9595
9696
9797 func getGameTotalBets () = getInteger(this, gameTotalBetsLabel)
9898
9999
100100 func getGameProcessedBets () = getInteger(this, gameTotalProccedBetsLabel)
101101
102102
103103 func getGameTotalFieldOrOddsBets () = getInteger(this, gameTotalFieldBetsLabel)
104104
105105
106106 func getGameProcessedFieldOrOddsBets () = getInteger(this, gameTotalProccedFieldOrOddsBetsLabel)
107107
108108
109109 func getGameState (gameCounter) = getInteger(this, gameStateLabel(gameCounter))
110110
111111
112112 func getGameSumSha (gameCounter) = getString(this, gameSumShaLabel(gameCounter))
113113
114114
115115 func getRandomHash (gameCounter) = getString(this, gameRandomHashLabel(gameCounter))
116116
117117
118118 func gameRollsCountBetLabel (gameCounter) = (("G_" + toString(gameCounter)) + "_ROLLSCOUNT")
119119
120120
121121 func gameRollDiceWithGameNumberLabel (gameCounter,rollDice) = (((("G_" + toString(gameCounter)) + "_") + toString(rollDice)) + "_GAMENUMBER_ROLLDICE")
122122
123123
124124 func gameFieldOrOddsBetForNextThrowLabel (betNumber) = (("B_" + toString(betNumber)) + "_FIELD_ODDS_BET_ROLLDICE")
125125
126126
127127 func getGameRollsCount (gameCounter) = getInteger(this, gameRollsCountBetLabel(gameCounter))
128128
129129
130130 func getGameRollDiceWithGameNumber (gameCounter,rollDice) = getInteger(this, gameRollDiceWithGameNumberLabel(gameCounter, rollDice))
131131
132132
133133 func getFieldOddsBetForNextDice (betNumber) = getInteger(this, gameFieldOrOddsBetForNextThrowLabel(betNumber))
134134
135135
136136 func gameBetCounterLabel (gameNumber) = (("B_" + toString(gameNumber)) + "_BET_GAMENUMBER")
137137
138138
139139 func gameFieldOrOddsBetGameCounterLabel (gameNumber) = (("B_" + toString(gameNumber)) + "_FIELD_ODDS_BET_GAMENUMBER")
140140
141141
142142 func getGameBetCounter (gameNumber) = getInteger(this, gameBetCounterLabel(gameNumber))
143143
144144
145145 func getGameFieldOrOddsBetCounter (gameNumber) = getInteger(this, gameFieldOrOddsBetGameCounterLabel(gameNumber))
146146
147147
148148 func getGameCounter () = getInteger(this, gameCounterLabel)
149149
150150
151151 func getFirstPointDice (gameCounter) = getInteger(this, gameFirstPointDiceLabel(gameCounter))
152152
153153
154154 func getCurrentPointDice (gameCounter) = match getInteger(this, gameCurrentPointDiceLabel(gameCounter)) {
155155 case val: Int =>
156156 val
157157 case _ =>
158158 0
159159 }
160160
161161
162162 func validateBetName (betName) = if ((betName == PASSLINEBET))
163163 then true
164164 else if ((betName == DONTPASSLINEBET))
165165 then true
166166 else false
167167
168168
169169 func validateRoundBet (betName) = if ((betName == FIELDBET))
170170 then true
171171 else if ((betName == ODDSBET))
172172 then true
173173 else if ((betName == BIG6OR8BET))
174174 then true
175175 else if ((betName == PLACEBETBUY))
176176 then true
177177 else if ((betName == PLACEBETLAY))
178178 then true
179179 else if ((betName == COMEBET))
180180 then true
181181 else if ((betName == DONTCOMEBET))
182182 then true
183183 else if ((betName == PLACEBETLOSE))
184184 then true
185185 else if ((betName == PLACEBETWIN))
186186 then true
187187 else false
188188
189189
190190 func getWinningAmountForOdds (amount,odd,resultOfRound) = if (if ((odd == 4))
191191 then true
192192 else (odd == 10))
193- then {
194- let winningAmount = (amount * 7)
195- winningAmount
196- }
193+ then (amount * 7)
197194 else if (if ((odd == 5))
198195 then true
199196 else (odd == 8))
200- then {
201- let winningAmount = (amount * 9)
202- winningAmount
203- }
197+ then (amount * 9)
204198 else if (if ((odd == 3))
205199 then true
206200 else (odd == 11))
207- then {
208- let winningAmount = (amount * 15)
209- winningAmount
210- }
201+ then (amount * 15)
211202 else if (if ((odd == 2))
212203 then true
213204 else (odd == 12))
214- then {
215- let winningAmount = (amount * 30)
216- winningAmount
217- }
205+ then (amount * 30)
218206 else if (if ((odd == 10))
219207 then true
220208 else (odd == 4))
221- then {
222- let winningAmount = (amount * 30)
223- winningAmount
224- }
209+ then (amount * 30)
225210 else if ((odd == 7))
226- then {
227- let winningAmount = (amount * 4)
228- winningAmount
229- }
211+ then (amount * 4)
230212 else if (if ((odd == 100))
231213 then if (if ((resultOfRound == 3))
232214 then true
233215 else (resultOfRound == 12))
234216 then true
235217 else (resultOfRound == 2)
236218 else false)
237- then {
238- let winningAmount = (amount * 7)
239- winningAmount
240- }
219+ then (amount * 7)
241220 else 0
242221
243222
244223 func getWinningAmountForField (amount,resultOfRound) = if ((resultOfRound == 12))
245- then {
246- let winningAmount = (amount * 4)
247- winningAmount
248- }
224+ then (amount * 4)
249225 else if ((resultOfRound == 2))
250- then {
251- let winningAmount = (amount * 3)
252- winningAmount
253- }
226+ then (amount * 3)
254227 else if (if (if (if ((resultOfRound == 5))
255228 then true
256229 else (resultOfRound == 6))
257230 then true
258231 else (resultOfRound == 7))
259232 then true
260233 else (resultOfRound == 8))
261234 then 0
262- else {
263- let winningAmount = (amount * 2)
264- winningAmount
265- }
235+ else (amount * 2)
266236
267237
268238 func storeOneRoundBetTypes (gameCounter,amount,typeBet,caller,odd) = match getGameTotalFieldOrOddsBets() {
269239 case betCount: Int =>
270240 match getGameRollsCount(gameCounter) {
271241 case rollCount: Int =>
272242 let newTotalBetCount = (betCount + 1)
273243 let newRollCountForGame = (rollCount + 1)
274244 if (if ((typeBet == COMEBET))
275245 then true
276246 else (typeBet == DONTCOMEBET))
277247 then [IntegerEntry(gameFieldOrOddsBetGameCounterLabel(newTotalBetCount), gameCounter), StringEntry(gameFieldOrOddsBetLineLabel(newTotalBetCount), ((((((((caller + "_") + amount) + "_") + typeBet) + "_active_pending_") + toString(gameCounter)) + "_") + toString(newRollCountForGame))), IntegerEntry(gameTotalFieldBetsLabel, newTotalBetCount), IntegerEntry(gameFieldOrOddsBetForNextThrowLabel(newTotalBetCount), newRollCountForGame)]
278248 else [IntegerEntry(gameFieldOrOddsBetGameCounterLabel(newTotalBetCount), gameCounter), StringEntry(gameFieldOrOddsBetLineLabel(newTotalBetCount), ((((((caller + "_") + amount) + "_") + typeBet) + "_active_pending_") + toString(odd))), IntegerEntry(gameTotalFieldBetsLabel, newTotalBetCount), IntegerEntry(gameFieldOrOddsBetForNextThrowLabel(newTotalBetCount), newRollCountForGame)]
279249 case _ =>
280250 throw("Game doesn't exist")
281251 }
282252 case _ =>
283253 throw("Game has not bee initialized")
284254 }
285255
286256
287257 func rollPlaceBetIntoAnotherRoundBet (totalBets,lastFieldProcessBet,betOnRoll,gameCounter,amount,typeBet,caller,odd) = [IntegerEntry(gameFieldOrOddsBetGameCounterLabel(totalBets), gameCounter), StringEntry(gameFieldOrOddsBetLineLabel(totalBets), ((((((caller + "_") + amount) + "_") + typeBet) + "_active_pending_") + toString(odd))), StringEntry(gameFieldOrOddsBetLineLabel(lastFieldProcessBet), ((((((caller + "_") + amount) + "_") + typeBet) + "_inactive_rolled_") + toString(odd))), IntegerEntry(gameTotalProccedFieldOrOddsBetsLabel, lastFieldProcessBet), IntegerEntry(gameTotalFieldBetsLabel, totalBets), IntegerEntry(gameFieldOrOddsBetForNextThrowLabel(totalBets), betOnRoll)]
288258
289259
290260 func storeNextRoll (gameState,amount,totalFieldBets,lastFieldProcessBet,betOnRoll,gameNumber,betType,betPlacer,odd) = if ((gameState == GAMEFINISHED))
291261 then rollPlaceBetIntoAnotherRoundBet((totalFieldBets + 1), (lastFieldProcessBet + 1), 1, (gameNumber + 1), toString(amount), betType, betPlacer, odd)
292262 else rollPlaceBetIntoAnotherRoundBet((totalFieldBets + 1), (lastFieldProcessBet + 1), (betOnRoll + 1), gameNumber, toString(amount), betType, betPlacer, odd)
293263
294264
295-func storeComeDontComeBet (gameState,betDetails,resultOfRound,amount,totalFieldBets,lastFieldProcessBet,betOnRoll,gameNumber,betType,betPlacer,odd) = {
296- let comeBetGameNumber = value(parseInt(split(betDetails, "_")[5]))
297- let comeBetRollNumber = value(parseInt(split(betDetails, "_")[6]))
298- let resultOfGame = value(getGameRollDiceWithGameNumber(comeBetGameNumber, comeBetRollNumber))
299- if ((resultOfRound == 7))
300- then if ((betDetails == COMEBET))
301- then throw("Only Field Type of Bet can be proceed")
302- else throw("Only Field Type of Bet can be proceed")
303- else if ((resultOfRound == resultOfGame))
304- then throw("Only Field Type of Bet can be proceed")
305- else if ((gameState == GAMEFINISHED))
306- then storeNextRoll(gameState, amount, (totalFieldBets + 1), (lastFieldProcessBet + 1), 1, (gameNumber + 1), betType, betPlacer, odd)
307- else storeNextRoll(gameState, amount, (totalFieldBets + 1), (lastFieldProcessBet + 1), (betOnRoll + 1), gameNumber, betType, betPlacer, odd)
308- }
309-
310-
311-func storePassOrComeBet (gameCounter,amount,typeBet,caller) = match getGameTotalBets() {
265+func storePassBet (gameCounter,amount,typeBet,caller) = match getGameTotalBets() {
312266 case number: Int =>
313267 let newTotalBets = (number + 1)
314268 [IntegerEntry(gameBetCounterLabel(newTotalBets), gameCounter), StringEntry(gameBetLineLabel(newTotalBets), (((((caller + "_") + amount) + "_") + typeBet) + "_active_pending")), IntegerEntry(gameTotalBetsLabel, newTotalBets)]
315269 case _ =>
316270 throw("Game has not bee initialized")
317271 }
318272
319273
320274 func udpateBetDetailsWithLost (updateBetDetials,gameNumber,lastProceedBet,betIndex,betProceedIndex) = {
321275 let updateInfoBet = (updateBetDetials + "_lost")
322276 [StringEntry(betIndex, updateInfoBet), IntegerEntry(betProceedIndex, lastProceedBet)]
323277 }
324278
325279
326280 func udpateBetDetailsWithLostWithOdd (updateBetDetials,gameNumber,lastProceedBet,betIndex,betProceedIndex,oddNumber) = {
327281 let updateInfoBet = ((updateBetDetials + "_lost_") + toString(oddNumber))
328282 [StringEntry(betIndex, updateInfoBet), IntegerEntry(betProceedIndex, lastProceedBet)]
329283 }
330284
331285
332286 func updateBetDetailsWithWinning (updateBetDetials,gameNumber,currentProceedBet,betPlacer,winningAmount,betType,betIndex,betProceedIndex) = {
333287 let updateInfoBet = (updateBetDetials + "_won_")
334288 [StringEntry(gameWinningNumberBetLabel(gameNumber, currentProceedBet, betType), ((betPlacer + "_amount_") + toString(winningAmount))), StringEntry(betIndex, updateBetDetials), IntegerEntry(betProceedIndex, currentProceedBet), ScriptTransfer(value(addressFromString(betPlacer)), winningAmount, unit)]
335289 }
336290
337291
338292 func storeGameProgressPointState (storeIndex,gameNumber,number,rollCount,currentHeight,randomHash,state) = [IntegerEntry(gameStateLabel(gameNumber), state), IntegerEntry(storeIndex, number), IntegerEntry(gameRollsCountBetLabel(gameNumber), rollCount), IntegerEntry(gameEndHeightLabel(gameNumber), (currentHeight + BLOCKTOPROCESSFORTHROW)), StringEntry(gameRandomHashLabel(gameNumber), toBase64String(randomHash)), IntegerEntry(gameRollDiceWithGameNumberLabel(gameNumber, rollCount), number)]
339293
340294
295+func getWinningAmountPassLineBets (firstPoint,lastPoint,betDetails) = {
296+ let betType = split(betDetails, "_")[2]
297+ let betPlacer = split(betDetails, "_")[0]
298+ let amount = value(parseInt(split(betDetails, "_")[1]))
299+ if ((betType == PASSLINEBET))
300+ then if ((lastPoint == 0))
301+ then if (if ((firstPoint == 7))
302+ then true
303+ else (firstPoint == 11))
304+ then (amount * 2)
305+ else 0
306+ else if ((firstPoint == lastPoint))
307+ then (amount * 2)
308+ else if ((lastPoint == 7))
309+ then 0
310+ else 0
311+ else if ((betType == DONTPASSLINEBET))
312+ then if ((lastPoint == 0))
313+ then if (if ((firstPoint == 2))
314+ then true
315+ else (firstPoint == 3))
316+ then (amount * 2)
317+ else if (if ((lastPoint == 7))
318+ then true
319+ else (lastPoint == 11))
320+ then 0
321+ else 0
322+ else if (if ((lastPoint == 2))
323+ then true
324+ else (lastPoint == 3))
325+ then (amount * 2)
326+ else if ((lastPoint == 7))
327+ then 0
328+ else 0
329+ else 0
330+ }
331+
332+
333+func getWinningAmountOneRoundBets (betDetails,resultOfRound,round) = {
334+ let betType = split(betDetails, "_")[2]
335+ let odd = value(parseInt(split(betDetails, "_")[5]))
336+ let amount = value(parseInt(split(betDetails, "_")[1]))
337+ if ((betType == FIELDBET))
338+ then if ((resultOfRound == 12))
339+ then (amount * 4)
340+ else if ((resultOfRound == 2))
341+ then (amount * 3)
342+ else if (if (if (if ((resultOfRound == 5))
343+ then true
344+ else (resultOfRound == 6))
345+ then true
346+ else (resultOfRound == 7))
347+ then true
348+ else (resultOfRound == 8))
349+ then 0
350+ else (amount * 2)
351+ else if ((betType == ODDSBET))
352+ then if (if ((odd == 4))
353+ then true
354+ else (odd == 10))
355+ then (amount * 7)
356+ else if (if ((odd == 5))
357+ then true
358+ else (odd == 8))
359+ then (amount * 9)
360+ else if (if ((odd == 3))
361+ then true
362+ else (odd == 11))
363+ then (amount * 15)
364+ else if (if ((odd == 2))
365+ then true
366+ else (odd == 12))
367+ then (amount * 30)
368+ else if (if ((odd == 10))
369+ then true
370+ else (odd == 4))
371+ then (amount * 30)
372+ else if ((odd == 7))
373+ then (amount * 4)
374+ else if (if ((odd == 100))
375+ then if (if ((resultOfRound == 3))
376+ then true
377+ else (resultOfRound == 12))
378+ then true
379+ else (resultOfRound == 2)
380+ else false)
381+ then (amount * 7)
382+ else 0
383+ else if ((betType == BIG6OR8BET))
384+ then if (if ((resultOfRound == 6))
385+ then true
386+ else (resultOfRound == 8))
387+ then (2 * amount)
388+ else 0
389+ else if (if ((betType == PLACEBETLAY))
390+ then true
391+ else (betType == PLACEBETLOSE))
392+ then if ((resultOfRound == 7))
393+ then (amount * 2)
394+ else if ((resultOfRound == odd))
395+ then 0
396+ else -1
397+ else if (if ((betType == PLACEBETBUY))
398+ then true
399+ else (betType == PLACEBETWIN))
400+ then if ((resultOfRound == 7))
401+ then 0
402+ else if ((resultOfRound == odd))
403+ then (amount * 2)
404+ else -1
405+ else if ((betType == COMEBET))
406+ then {
407+ let playerPoint = value(parseInt(split(betDetails, "_")[6]))
408+ if ((round == 2))
409+ then if (if ((resultOfRound == 7))
410+ then true
411+ else (resultOfRound == 11))
412+ then (amount * 2)
413+ else if (if (if ((resultOfRound == 2))
414+ then true
415+ else (resultOfRound == 12))
416+ then true
417+ else (resultOfRound == 3))
418+ then 0
419+ else if ((resultOfRound == playerPoint))
420+ then (amount * 2)
421+ else -1
422+ else if ((round > 2))
423+ then if ((resultOfRound == 7))
424+ then 0
425+ else if ((resultOfRound == playerPoint))
426+ then (amount * 2)
427+ else -1
428+ else throw("Not Allow in The Beginning")
429+ }
430+ else if ((betType == DONTCOMEBET))
431+ then {
432+ let playerPoint = value(parseInt(split(betDetails, "_")[6]))
433+ if ((round == 2))
434+ then if (if ((resultOfRound == 7))
435+ then true
436+ else (resultOfRound == 11))
437+ then 0
438+ else if (if (if ((resultOfRound == 2))
439+ then true
440+ else (resultOfRound == 12))
441+ then true
442+ else (resultOfRound == 3))
443+ then (amount * 2)
444+ else if ((resultOfRound == playerPoint))
445+ then (amount * 2)
446+ else -1
447+ else if ((round > 1))
448+ then if ((resultOfRound == 7))
449+ then (amount * 2)
450+ else if ((resultOfRound == playerPoint))
451+ then 0
452+ else -1
453+ else throw("Not Allow in The Beginning")
454+ }
455+ else 0
456+ }
457+
458+
341459 @Callable(i)
342460 func processNextBet () = if (authorizePermission(i.callerPublicKey))
343461 then throw("processFieldBet_FORBIDDEN")
344462 else match getGameTotalBets() {
345463 case totalBets: Int =>
346464 match getGameProcessedBets() {
347465 case lastProcessBet: Int =>
348466 let nextBet = (lastProcessBet + 1)
349467 if ((nextBet > totalBets))
350468 then throw("Next bet has not been places.")
351469 else match getGameBetCounter(nextBet) {
352470 case gameNumber: Int =>
353471 match getGameState(gameNumber) {
354472 case gameState: Int =>
355473 if (if ((gameState == GAMESTART))
356474 then true
357475 else (gameState == GAMEINPROGRESS))
358476 then throw("Game has to finished in order to process NON-FIELD bets")
359477 else {
360478 let betDetails = value(getBetDetailsResult(nextBet))
361- let betType = split(betDetails, "_")[2]
362- let betPlacer = split(betDetails, "_")[0]
363- let amount = value(parseInt(split(betDetails, "_")[1]))
364- let address = value(addressFromString(betPlacer))
479+ let address = value(addressFromString(split(betDetails, "_")[0]))
365480 let currentPoint = getCurrentPointDice(nextBet)
366- let firstPoint = getFirstPointDice(nextBet)
367- let updateBetDetials = (((((betPlacer + "_") + split(betDetails, "_")[1]) + "_") + split(betDetails, "_")[2]) + "_inactive_")
368- if ((betType == PASSLINEBET))
369- then if ((currentPoint == 0))
370- then if (if ((firstPoint == 7))
371- then true
372- else (firstPoint == 11))
373- then {
374- let winningAmount = (amount * 2)
375- updateBetDetailsWithWinning(updateBetDetials, gameNumber, nextBet, betPlacer, winningAmount, betType, gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
376- }
377- else udpateBetDetailsWithLost(updateBetDetials, gameNumber, nextBet, gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
378- else if ((firstPoint == currentPoint))
379- then {
380- let winningAmount = (amount * 2)
381- updateBetDetailsWithWinning(updateBetDetials, gameNumber, nextBet, betPlacer, winningAmount, betType, gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
382- }
383- else if ((currentPoint == 7))
384- then udpateBetDetailsWithLost(updateBetDetials, gameNumber, nextBet, gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
385- else udpateBetDetailsWithLost(updateBetDetials, gameNumber, nextBet, gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
386- else if ((betType == DONTPASSLINEBET))
387- then if ((currentPoint == 0))
388- then if (if ((firstPoint == 2))
389- then true
390- else (firstPoint == 3))
391- then {
392- let winningAmount = (amount * 2)
393- updateBetDetailsWithWinning(updateBetDetials, gameNumber, nextBet, betPlacer, winningAmount, betType, gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
394- }
395- else if (if ((currentPoint == 7))
396- then true
397- else (currentPoint == 11))
398- then udpateBetDetailsWithLost(updateBetDetials, gameNumber, nextBet, gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
399- else udpateBetDetailsWithLost(updateBetDetials, gameNumber, nextBet, gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
400- else if (if ((currentPoint == 2))
401- then true
402- else (currentPoint == 3))
403- then {
404- let winningAmount = (amount * 2)
405- updateBetDetailsWithWinning(updateBetDetials, gameNumber, nextBet, betPlacer, winningAmount, betType, gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
406- }
407- else if ((currentPoint == 7))
408- then udpateBetDetailsWithLost(updateBetDetials, gameNumber, nextBet, gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
409- else udpateBetDetailsWithLost(updateBetDetials, gameNumber, nextBet, gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
410- else throw((((((("Only " + PASSLINEBET) + ", ") + DONTPASSLINEBET) + " allowed in processNextBet()") + " currentBetType ") + betType))
481+ let firstPoint = value(getFirstPointDice(nextBet))
482+ let updateBetDetials = (((((split(betDetails, "_")[0] + "_") + split(betDetails, "_")[1]) + "_") + split(betDetails, "_")[2]) + "_inactive_")
483+ let winningAmountResult = getWinningAmountPassLineBets(firstPoint, currentPoint, betDetails)
484+ if ((winningAmountResult == 0))
485+ then udpateBetDetailsWithLost(updateBetDetials, gameNumber, nextBet, gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
486+ else if ((winningAmountResult > 0))
487+ then updateBetDetailsWithWinning(updateBetDetials, gameNumber, nextBet, split(betDetails, "_")[0], winningAmountResult, split(betDetails, "_")[2], gameBetLineLabel(nextBet), gameTotalProccedBetsLabel)
488+ else throw((((((("Only " + PASSLINEBET) + ", ") + DONTPASSLINEBET) + " allowed in processNextBet()") + " currentBetType ") + split(betDetails, "_")[2]))
411489 }
412490 case _ =>
413491 throw("Game does not exist or has already ended.")
414492 }
415493 case _ =>
416494 throw("Error")
417495 }
418496 case _ =>
419497 throw("Game has not been initialized, next bets not found")
420498 }
421499 case _ =>
422500 throw("Game has not been initialized, next bets not found")
423501 }
424502
425503
426504
427505 @Callable(i)
428506 func processOneRoundBet () = if (authorizePermission(i.callerPublicKey))
429507 then throw("processFieldBet_FORBIDDEN")
430508 else match getGameTotalFieldOrOddsBets() {
431509 case totalFieldBets: Int =>
432510 match getGameProcessedFieldOrOddsBets() {
433511 case lastFieldProcessBet: Int =>
434512 let nextBet = (lastFieldProcessBet + 1)
435513 if ((nextBet > totalFieldBets))
436514 then throw("Next Field Bet has not been places.")
437515 else match getGameFieldOrOddsBetCounter(nextBet) {
438516 case gameNumber: Int =>
439517 match getGameState(gameNumber) {
440518 case gameState: Int =>
441519 if ((gameState == GAMESTART))
442520 then throw("Game has not started yet")
443521 else {
444522 let betDetails = value(getFieldBetDetailsResult(nextBet))
445523 let betType = split(betDetails, "_")[2]
446524 let betPlacer = split(betDetails, "_")[0]
447525 let amount = value(parseInt(split(betDetails, "_")[1]))
448526 let odd = value(parseInt(split(betDetails, "_")[5]))
449527 let address = value(addressFromString(betPlacer))
450528 let betOnRoll = value(getFieldOddsBetForNextDice(nextBet))
529+ let updateBetDetials = (((((betPlacer + "_") + split(betDetails, "_")[1]) + "_") + split(betDetails, "_")[2]) + "_inactive_")
451530 match getGameRollDiceWithGameNumber(gameNumber, betOnRoll) {
452531 case resultOfRound: Int =>
453- let updateBetDetials = (((((betPlacer + "_") + split(betDetails, "_")[1]) + "_") + split(betDetails, "_")[2]) + "_inactive_")
454- if ((betType == FIELDBET))
455- then {
456- let winningAmount = getWinningAmountForField(amount, resultOfRound)
457- if ((winningAmount == 0))
458- then udpateBetDetailsWithLost(updateBetDetials, gameNumber, nextBet, gameFieldOrOddsBetLineLabel(gameNumber), gameTotalProccedFieldOrOddsBetsLabel)
459- else updateBetDetailsWithWinning(updateBetDetials, gameNumber, nextBet, betPlacer, winningAmount, betType, gameFieldOrOddsBetLineLabel(nextBet), gameTotalProccedFieldOrOddsBetsLabel)
460- }
461- else if ((betType == ODDSBET))
462- then {
463- let winningAmount = getWinningAmountForOdds(amount, odd, resultOfRound)
464- if ((winningAmount == 0))
465- then updateBetDetailsWithWinning((updateBetDetials + "_won_"), gameNumber, nextBet, betPlacer, winningAmount, betType, gameFieldOrOddsBetLineLabel(nextBet), gameTotalProccedFieldOrOddsBetsLabel)
466- else udpateBetDetailsWithLostWithOdd(updateBetDetials, gameNumber, nextBet, gameFieldOrOddsBetLineLabel(nextBet), gameTotalProccedFieldOrOddsBetsLabel, odd)
467- }
468- else if ((betType == BIG6OR8BET))
469- then if (if ((resultOfRound == 6))
470- then true
471- else (resultOfRound == 8))
472- then {
473- let winningAmount = (2 * amount)
474- updateBetDetailsWithWinning((updateBetDetials + "_won_"), gameNumber, nextBet, betPlacer, winningAmount, betType, gameFieldOrOddsBetLineLabel(nextBet), gameTotalProccedFieldOrOddsBetsLabel)
475- }
476- else udpateBetDetailsWithLostWithOdd(updateBetDetials, gameNumber, nextBet, gameFieldOrOddsBetLineLabel(nextBet), gameTotalProccedFieldOrOddsBetsLabel, odd)
477- else if (if ((betType == PLACEBETBUY))
478- then true
479- else (betType == PLACEBETWIN))
480- then if ((resultOfRound == 7))
481- then udpateBetDetailsWithLostWithOdd(updateBetDetials, gameNumber, nextBet, gameFieldOrOddsBetLineLabel(nextBet), gameTotalProccedFieldOrOddsBetsLabel, odd)
482- else if ((resultOfRound == odd))
483- then {
484- let winningAmount = (amount * 2)
485- updateBetDetailsWithWinning((updateBetDetials + "_won_"), gameNumber, nextBet, betPlacer, winningAmount, betType, gameFieldOrOddsBetLineLabel(nextBet), gameTotalProccedFieldOrOddsBetsLabel)
486- }
487- else storeNextRoll(gameState, amount, (totalFieldBets + 1), (lastFieldProcessBet + 1), 1, (gameNumber + 1), betType, betPlacer, odd)
488- else if (if ((betType == PLACEBETLAY))
489- then true
490- else (betType == PLACEBETLOSE))
491- then if ((resultOfRound == 7))
492- then {
493- let winningAmount = (amount * 2)
494- updateBetDetailsWithWinning(updateBetDetials, gameNumber, nextBet, betPlacer, winningAmount, betType, gameFieldOrOddsBetLineLabel(nextBet), gameTotalProccedFieldOrOddsBetsLabel)
495- }
496- else if ((resultOfRound == odd))
497- then udpateBetDetailsWithLostWithOdd(updateBetDetials, gameNumber, nextBet, gameFieldOrOddsBetLineLabel(nextBet), gameTotalProccedFieldOrOddsBetsLabel, odd)
498- else storeNextRoll(gameState, amount, (totalFieldBets + 1), (lastFieldProcessBet + 1), 1, (gameNumber + 1), betType, betPlacer, odd)
499- else if (if ((betType == COMEBET))
500- then true
501- else (betType == DONTCOMEBET))
502- then storeComeDontComeBet(gameState, betDetails, resultOfRound, amount, totalFieldBets, lastFieldProcessBet, betOnRoll, gameNumber, betType, betPlacer, odd)
503- else throw("Only Field Type of Bet can be proceed")
532+ let roundRole = value(parseInt(gameRollsCountBetLabel(gameNumber)))
533+ let winningAmountOneRoundBet = getWinningAmountOneRoundBets(betDetails, resultOfRound, roundRole)
534+ if ((winningAmountOneRoundBet == -1))
535+ then storeNextRoll(gameState, amount, totalFieldBets, lastFieldProcessBet, betOnRoll, gameNumber, betType, betPlacer, odd)
536+ else if ((winningAmountOneRoundBet == 0))
537+ then udpateBetDetailsWithLostWithOdd(updateBetDetials, gameNumber, nextBet, gameFieldOrOddsBetLineLabel(gameNumber), gameTotalProccedFieldOrOddsBetsLabel, odd)
538+ else updateBetDetailsWithWinning((updateBetDetials + "_won_"), gameNumber, nextBet, betPlacer, winningAmountOneRoundBet, betType, gameFieldOrOddsBetLineLabel(nextBet), gameTotalProccedFieldOrOddsBetsLabel)
504539 case _ =>
505540 throw("There is no result for this round yet")
506541 }
507542 }
508543 case _ =>
509544 throw("Game does not exist or has already ended")
510545 }
511546 case _ =>
512547 throw("Error")
513548 }
514549 case _ =>
515550 throw("Game has not been initialized, next bets not found")
516551 }
517552 case _ =>
518553 throw("Game has not been initialized, next bets not found")
519554 }
520555
521556
522557
523558 @Callable(i)
524559 func initGame () = if (authorizePermission(i.callerPublicKey))
525560 then throw("initGame_FORBIDDEN")
526561 else match getGameCounter() {
527562 case counter: Int =>
528563 throw("INIT_ALREADY_DONE")
529564 case _ =>
530565 [IntegerEntry(gameCounterLabel, 0), IntegerEntry(gameTotalBetsLabel, 0), IntegerEntry(gameTotalProccedBetsLabel, 0), IntegerEntry(gameTotalFieldBetsLabel, 0), IntegerEntry(gameTotalProccedFieldOrOddsBetsLabel, 0)]
531566 }
532567
533568
534569
535570 @Callable(i)
536571 func startGame (randomHash) = if (authorizePermission(i.callerPublicKey))
537572 then throw("startGame_FORBIDDEN")
538573 else match getGameCounter() {
539574 case number: Int =>
540575 if ((number == 0))
541576 then {
542577 let newNumber = (number + 1)
543578 [IntegerEntry(gameCounterLabel, newNumber), IntegerEntry(gameStateLabel(newNumber), GAMESTART), IntegerEntry(gameStartHeightLabel(newNumber), lastBlock.height), IntegerEntry(gameEndHeightLabel(newNumber), (lastBlock.height + BLOCKTOPROCESSFORTHROW)), IntegerEntry(gameRollsCountBetLabel(newNumber), 0), StringEntry(gameSumShaLabel(newNumber), toBase58String(sha256(fromBase64String(randomHash))))]
544579 }
545580 else match getGameState(number) {
546581 case state: Int =>
547582 if (if ((state == GAMEINPROGRESS))
548583 then true
549584 else (state == GAMESTART))
550585 then throw("The previous game is still in progress")
551586 else {
552587 let newNumber = (number + 1)
553588 [IntegerEntry(gameCounterLabel, newNumber), IntegerEntry(gameStateLabel(newNumber), GAMESTART), IntegerEntry(gameStartHeightLabel(newNumber), lastBlock.height), IntegerEntry(gameEndHeightLabel(newNumber), (lastBlock.height + BLOCKTOPROCESSFORTHROW)), IntegerEntry(gameRollsCountBetLabel(newNumber), 0), StringEntry(gameSumShaLabel(newNumber), toBase58String(sha256(fromBase64String(randomHash))))]
554589 }
555590 case _ =>
556591 throw("Error")
557592 }
558593 case _ =>
559594 throw("INIT_NEED")
560595 }
561596
562597
563598
564599 @Callable(i)
565600 func placeBet (typeBet) = if (validateBetName(typeBet))
566601 then if ((size(i.payments) == 0))
567602 then throw("Payment not attached")
568603 else match getGameCounter() {
569604 case GAMENUMBER: Int =>
570605 let p = i.payments[0]
571606 match getGameState(GAMENUMBER) {
572607 case state: Int =>
573608 if ((state == GAMESTART))
574609 then if (if ((typeBet == PASSLINEBET))
575610 then true
576611 else (typeBet == DONTPASSLINEBET))
577- then storePassOrComeBet(GAMENUMBER, toString(p.amount), typeBet, toBase58String(i.caller.bytes))
612+ then storePassBet(GAMENUMBER, toString(p.amount), typeBet, toBase58String(i.caller.bytes))
578613 else throw((((((("Only " + PASSLINEBET) + ", ") + DONTPASSLINEBET) + " and ") + FIELDBET) + " are allowed in the Beginning of Game"))
579614 else if ((state == GAMEINPROGRESS))
580615 then throw((((((("Only " + COMEBET) + ", ") + DONTCOMEBET) + " and ") + FIELDBET) + " ARE ALLOWED at Start."))
581616 else if ((state == GAMEFINISHED))
582617 then throw("Game already ended.")
583618 else throw("Unknown Game State.")
584619 case _ =>
585620 throw("Game does not exist or has already ended.")
586621 }
587622 case _ =>
588623 throw("Game has not been initialized.")
589624 }
590625 else throw(((((((((("Unsupported Type of Bet for Crap. Please Select one of " + PASSLINEBET) + ", ") + DONTPASSLINEBET) + ", ") + COMEBET) + ", ") + DONTCOMEBET) + ", ") + FIELDBET))
591626
592627
593628
594629 @Callable(i)
595630 func placeRoundBet (typeBet,oddNumber) = if (validateRoundBet(typeBet))
596631 then if ((size(i.payments) == 0))
597632 then throw("Payment not attached")
598633 else match getGameCounter() {
599634 case GAMENUMBER: Int =>
600635 let p = i.payments[0]
601636 match getGameState(GAMENUMBER) {
602637 case state: Int =>
603638 if ((state == GAMEFINISHED))
604639 then throw("Game already ended.")
605640 else if (if ((typeBet == COMEBET))
606641 then true
607642 else (typeBet == DONTCOMEBET))
608643 then if ((state == GAMESTART))
609644 then throw("Cannot place COME OR DONTCOME BET IF GAME HAS NOT STARTED")
610645 else storeOneRoundBetTypes(GAMENUMBER, toString(p.amount), typeBet, toBase58String(i.caller.bytes), 0)
611646 else storeOneRoundBetTypes(GAMENUMBER, toString(p.amount), typeBet, toBase58String(i.caller.bytes), oddNumber)
612647 case _ =>
613648 throw("Game does not exist or has already ended.")
614649 }
615650 case _ =>
616651 throw("Game has not been initialized.")
617652 }
618653 else throw(((((((((("Unsupported Type of Bet for Crap. Please Select one of " + ODDSBET) + ", ") + DONTPASSLINEBET) + ", ") + COMEBET) + ", ") + DONTCOMEBET) + ", ") + FIELDBET))
619654
620655
621656
622657 @Callable(i)
623658 func throwDices (rsaSign,gameNumber) = if (authorizePermission(i.callerPublicKey))
624659 then throw("throwDices_FORBIDDEN")
625660 else match getGameState(gameNumber) {
626661 case state: Int =>
627662 if ((state == GAMEFINISHED))
628663 then throw("Game is finished")
629664 else {
630665 let currentHeight = lastBlock.height
631666 let lastHeightAllowed = value(getEndHeight(gameNumber))
632667 if ((currentHeight >= lastHeightAllowed))
633668 then match getGameSumSha(gameNumber) {
634669 case sumSha: String =>
635670 let sig = fromBase64String(rsaSign)
636671 let rsaSigValid = rsaVerify(SHA256, fromBase58String(sumSha), sig, RSAPUBLIC)
637672 match blockInfoByHeight((lastBlock.height - 1)) {
638673 case previousBlock: BlockInfo =>
639674 let randomHash = sha256((take(sig, 4) + take(previousBlock.generationSignature, 8)))
640675 if (!(rsaSigValid))
641676 then throw("INVALID_RSA_SIGN")
642677 else {
643678 let randNumber = (toInt(randomHash) % 11)
644679 let number = diceNumber[randNumber]
645680 match getGameRollsCount(gameNumber) {
646681 case rollCountNumber: Int =>
647682 let newRollCountNumber = (rollCountNumber + 1)
648683 if ((state == GAMESTART))
649684 then if (if (if (if (if ((number == 7))
650685 then true
651686 else (number == 11))
652687 then true
653688 else (number == 2))
654689 then true
655690 else (number == 3))
656691 then true
657692 else (number == 12))
658693 then storeGameProgressPointState(gameFirstPointDiceLabel(gameNumber), gameNumber, number, newRollCountNumber, currentHeight, randomHash, GAMEFINISHED)
659694 else storeGameProgressPointState(gameFirstPointDiceLabel(gameNumber), gameNumber, number, newRollCountNumber, currentHeight, randomHash, GAMEINPROGRESS)
660695 else {
661696 let currentPoint = value(getCurrentPointDice(gameNumber))
662697 let firstPoint = value(getFirstPointDice(gameNumber))
663698 if ((currentPoint == 0))
664699 then if (if ((number == 7))
665700 then true
666701 else (firstPoint == number))
667702 then storeGameProgressPointState(gameCurrentPointDiceLabel(gameNumber), gameNumber, number, newRollCountNumber, currentHeight, randomHash, GAMEFINISHED)
668703 else storeGameProgressPointState(gameCurrentPointDiceLabel(gameNumber), gameNumber, number, newRollCountNumber, currentHeight, randomHash, GAMEINPROGRESS)
669704 else if (if ((number == 7))
670705 then true
671706 else (firstPoint == number))
672707 then storeGameProgressPointState(gameCurrentPointDiceLabel(gameNumber), gameNumber, number, newRollCountNumber, currentHeight, randomHash, GAMEFINISHED)
673708 else storeGameProgressPointState(gameCurrentPointDiceLabel(gameNumber), gameNumber, number, newRollCountNumber, currentHeight, randomHash, GAMEINPROGRESS)
674709 }
675710 case _ =>
676711 throw("No dices have been thrown")
677712 }
678713 }
679714 case _ =>
680715 throw("Last block doesn't exist.")
681716 }
682717 case _ =>
683718 throw("SHA doesn't exist")
684719 }
685720 else throw("Throw dice not allow still waiting for block to process")
686721 }
687722 case _ =>
688723 throw("Game does not exist or has already ended.")
689724 }
690725
691726
692727 @Verifier(tx)
693728 func verify () = match tx {
694729 case _ =>
695730 sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
696731 }
697732

github/deemru/w8io/873ac7e 
87.84 ms