tx · D9nuK465nEitbyB4YKUs6J6jZjaekCQL7PVwq5Mzafkb

3N6oaapvYkEryHUr4vAiPRXM3iS6kMYXito:  -0.05000000 Waves

2021.09.10 14:31 [1696896] smart account 3N6oaapvYkEryHUr4vAiPRXM3iS6kMYXito > SELF 0.00000000 Waves

{ "type": 13, "id": "D9nuK465nEitbyB4YKUs6J6jZjaekCQL7PVwq5Mzafkb", "fee": 5000000, "feeAssetId": null, "timestamp": 1631273516753, "version": 2, "chainId": 84, "sender": "3N6oaapvYkEryHUr4vAiPRXM3iS6kMYXito", "senderPublicKey": "7PMrxEzirv6h9Z2zqLE47qrZd6v1AbRZER5Aqfo95Eyr", "proofs": [ "43vV1cqQoUEEUt8xp3fSaqD8c3XVZBqf3aG72aPUPaZa2BkfUPLeMQZsDYHcpqrinHzC4CWfcDZczgHJ8F7CZwVp" ], "script": "base64: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Z2dzAQAAAApnZXRCZXRFZ2dzAAAAAQAAAAZnYW1lSWQJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkBAAAADWdldEJldEVnZ3NLZXkAAAABBQAAAAZnYW1lSWQBAAAAHWdldFdhaXRpbmdFeHBpcmF0aW9uSGVpZ2h0S2V5AAAAAQAAAAZnYW1lSWQJAAEsAAAAAgkAASwAAAACAgAAAARnYW1lCQABpAAAAAEFAAAABmdhbWVJZAIAAAAYX3dhaXRpbmdFeHBpcmF0aW9uSGVpZ2h0AQAAABpnZXRXYWl0aW5nRXhwaXJhdGlvbkhlaWdodAAAAAEAAAAGZ2FtZUlkCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAAB1nZXRXYWl0aW5nRXhwaXJhdGlvbkhlaWdodEtleQAAAAEFAAAABmdhbWVJZAEAAAAWZ2V0RXhwaXJhdGlvbkhlaWdodEtleQAAAAEAAAAGZ2FtZUlkCQABLAAAAAIJAAEsAAAAAgIAAAAEZ2FtZQkAAaQAAAABBQAAAAZnYW1lSWQCAAAAEV9leHBpcmF0aW9uSGVpZ2h0AQAAABNnZXRFeHBpcmF0aW9uSGVpZ2h0AAAAAQAAAAZnYW1lSWQJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkBAAAAFmdldEV4cGlyYXRpb25IZWlnaHRLZXkAAAABBQAAAAZnYW1lSWQBAAAAEWdldFJhcml0eVJhbmdlS2V5AAAAAgAAAAZnYW1lSWQAAAANcmFuZ2VQb3NpdGlvbgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAEZ2FtZQkAAaQAAAABBQAAAAZnYW1lSWQCAAAADV9yYXJpdHlSYW5nZV8FAAAADXJhbmdlUG9zaXRpb24BAAAADmdldFJhcml0eVJhbmdlAAAAAgAAAAZnYW1lSWQAAAANcmFuZ2VQb3NpdGlvbgkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAARZ2V0UmFyaXR5UmFuZ2VLZXkAAAACBQAAAAZnYW1lSWQFAAAADXJhbmdlUG9zaXRpb24BAAAACmdldFN0ZXBLZXkAAAABAAAABmdhbWVJZAkAASwAAAACCQABLAAAAAICAAAABGdhbWUJAAGkAAAAAQUAAAAGZ2FtZUlkAgAAAAVfc3RlcAEAAAAHZ2V0U3RlcAAAAAEAAAAGZ2FtZUlkCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAAApnZXRTdGVwS2V5AAAAAQUAAAAGZ2FtZUlkAQAAAAxnZXRSYXJpdHlLZXkAAAADAAAABmdhbWVJZAAAAApwbGF5ZXJSb2xlAAAADXJhbmdlUG9zaXRpb24JAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAABGdhbWUJAAGkAAAAAQUAAAAGZ2FtZUlkAgAAAAFfBQAAAApwbGF5ZXJSb2xlAgAAAAFfBQAAAA1yYW5nZVBvc2l0aW9uAgAAAAZSYXJpdHkBAAAACWdldFJhcml0eQAAAAMAAAAGZ2FtZUlkAAAACnBsYXllclJvbGUAAAANcmFuZ2VQb3NpdGlvbgkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAAMZ2V0UmFyaXR5S2V5AAAAAwUAAAAGZ2FtZUlkBQAAAApwbGF5ZXJSb2xlBQAAAA1yYW5nZVBvc2l0aW9uAQAAAAxnZXREdWNrSWRLZXkAAAADAAAABmdhbWVJZAAAAApwbGF5ZXJSb2xlAAAADXJhbmdlUG9zaXRpb24JAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAABGdhbWUJAAGkAAAAAQUAAAAGZ2FtZUlkAgAAAAFfBQAAAApwbGF5ZXJSb2xlAgAAAAFfBQAAAA1yYW5nZVBvc2l0aW9uAgAAAAZEdWNrSWQBAAAACWdldER1Y2tJZAAAAAMAAAAGZ2FtZUlkAAAACnBsYXllclJvbGUAAAANcmFuZ2VQb3NpdGlvbgkBAAAADHRyeUdldFN0cmluZwAAAAEJAQAAAAxnZXREdWNrSWRLZXkAAAADBQAAAAZnYW1lSWQFAAAACnBsYXllclJvbGUFAAAADXJhbmdlUG9zaXRpb24BAAAADGdldENvbW1pdEtleQAAAAIAAAAGZ2FtZUlkAAAACnBsYXllclJvbGUJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAEZ2FtZQkAAaQAAAABBQAAAAZnYW1lSWQCAAAAAV8FAAAACnBsYXllclJvbGUCAAAAB19jb21taXQBAAAACWdldENvbW1pdAAAAAIAAAAGZ2FtZUlkAAAACnBsYXllclJvbGUJAQAAAAx0cnlHZXRTdHJpbmcAAAABCQEAAAAMZ2V0Q29tbWl0S2V5AAAAAgUAAAAGZ2FtZUlkBQAAAApwbGF5ZXJSb2xlAQAAAA9nZXREdWNrT3JkZXJLZXkAAAACAAAABmdhbWVJZAAAAApwbGF5ZXJSb2xlCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAABGdhbWUJAAGkAAAAAQUAAAAGZ2FtZUlkAgAAAAFfBQAAAApwbGF5ZXJSb2xlAgAAAApfZHVja09yZGVyAQAAAAxnZXREdWNrT3JkZXIAAAACAAAABmdhbWVJZAAAAApwbGF5ZXJSb2xlCQEAAAAMdHJ5R2V0U3RyaW5nAAAAAQkBAAAAD2dldER1Y2tPcmRlcktleQAAAAIFAAAABmdhbWVJZAUAAAAKcGxheWVyUm9sZQEAAAAQZ2V0R2FtZVJlc3VsdEtleQAAAAIAAAAGZ2FtZUlkAAAADXBsYXllckFkZHJlc3MJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAEZ2FtZQkAAaQAAAABBQAAAAZnYW1lSWQCAAAAAV8FAAAADXBsYXllckFkZHJlc3MCAAAAB19yZXN1bHQBAAAADWdldEdhbWVSZXN1bHQAAAACAAAABmdhbWVJZAAAAA1wbGF5ZXJBZGRyZXNzCQEAAAAMdHJ5R2V0U3RyaW5nAAAAAQkBAAAAEGdldEdhbWVSZXN1bHRLZXkAAAACBQAAAAZnYW1lSWQFAAAADXBsYXllckFkZHJlc3MBAAAAD2dldEdhbWVQcml6ZUtleQAAAAIAAAAGZ2FtZUlkAAAADXBsYXllckFkZHJlc3MJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAEZ2FtZQkAAaQAAAABBQAAAAZnYW1lSWQCAAAAAV8FAAAADXBsYXllckFkZHJlc3MCAAAABl9wcml6ZQEAAAAMZ2V0R2FtZVByaXplAAAAAgAAAAZnYW1lSWQAAAANcGxheWVyQWRkcmVzcwkBAAAADHRyeUdldFN0cmluZwAAAAEJAQAAAA9nZXRHYW1lUHJpemVLZXkAAAACBQAAAAZnYW1lSWQFAAAADXBsYXllckFkZHJlc3MBAAAAEGdldFBsYXllcldpbnNLZXkAAAABAAAADXBsYXllckFkZHJlc3MJAAEsAAAAAgUAAAANcGxheWVyQWRkcmVzcwIAAAAFX3dpbnMBAAAADWdldFBsYXllcldpbnMAAAABAAAADXBsYXllckFkZHJlc3MJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkBAAAAEGdldFBsYXllcldpbnNLZXkAAAABBQAAAA1wbGF5ZXJBZGRyZXNzAQAAABFnZXRQbGF5ZXJMb3Nlc0tleQAAAAEAAAANcGxheWVyQWRkcmVzcwkAASwAAAACBQAAAA1wbGF5ZXJBZGRyZXNzAgAAAAZfbG9zZXMBAAAADmdldFBsYXllckxvc2VzAAAAAQAAAA1wbGF5ZXJBZGRyZXNzCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAABFnZXRQbGF5ZXJMb3Nlc0tleQAAAAEFAAAADXBsYXllckFkZHJlc3MBAAAAEWdldFBsYXllckRyYXdzS2V5AAAAAQAAAA1wbGF5ZXJBZGRyZXNzCQABLAAAAAIFAAAADXBsYXllckFkZHJlc3MCAAAABl9kcmF3cwEAAAAOZ2V0UGxheWVyRHJhd3MAAAABAAAADXBsYXllckFkZHJlc3MJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkBAAAAEWdldFBsYXllckRyYXdzS2V5AAAAAQUAAAANcGxheWVyQWRkcmVzcwEAAAARZ2V0R2FtZXNQbGF5ZWRLZXkAAAAAAgAAAAtnYW1lc1BsYXllZAEAAAAOZ2V0R2FtZXNQbGF5ZWQAAAAACQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAABFnZXRHYW1lc1BsYXllZEtleQAAAAABAAAAD2dldEZhcm1pbmdQb3dlcgAAAAIAAAAHYWRkcmVzcwAAAAdhc3NldElkBAAAAAckbWF0Y2gwCQAEGgAAAAIJAQAAAAdBZGRyZXNzAAAAAQUAAAAOZmFybWluZ0FkZHJlc3MJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAIYWRkcmVzc18FAAAAB2FkZHJlc3MCAAAAB19hc3NldF8FAAAAB2Fzc2V0SWQCAAAADV9mYXJtaW5nUG93ZXIDCQAAAQAAAAIFAAAA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AAAAAQUAAAARcmFyaXR5UmFuZ2VNZWRpdW0GCQAAZgAAAAIFAAAAEXJhcml0eVJhbmdlTWVkaXVtAAAAAAAAAAAFCQAAAgAAAAECAAAAKEludmFsaWQgcmFyaXR5IHJhbmdlIGZvciB0aGUgbWVkaXVtIGR1Y2sDAwkAAGYAAAACAAAAAAAAAAABBQAAAA9yYXJpdHlSYW5nZUJlc3QGCQAAZgAAAAIFAAAAD3Jhcml0eVJhbmdlQmVzdAAAAAAAAAAABQkAAAIAAAABAgAAACZJbnZhbGlkIHJhcml0eSByYW5nZSBmb3IgdGhlIGJlc3QgZHVjawMJAABmAAAAAgUAAAAQcmFyaXR5UmFuZ2VXb3JzdAUAAAARcmFyaXR5UmFuZ2VNZWRpdW0JAAACAAAAAQIAAAAxVGhlIG1lZGl1bSByYW5nZSBjYW4ndCBiZSBsZXNzIHRoYW4gdGhlIHdvcnN0IG9uZQMJAABmAAAAAgUAAAARcmFyaXR5UmFuZ2VNZWRpdW0FAAAAD3Jhcml0eVJhbmdlQmVzdAkAAAIAAAABAgAAADFUaGUgYmVzdCByYW5nZSBjYW4ndCBiZSB3b3JzZSB0aGFuIHRoZSBtZWRpdW0gb25lCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAXZ2V0UGxheWVyQ3VycmVudEdhbWVLZXkAAAABBQAAAA1jYWxsZXJBZGRyZXNzBQAAAAZnYW1lSWQJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAC2dldE1ha2VyS2V5AAAAAQUAAAAGZ2FtZUlkBQAAAA1jYWxsZXJBZGRyZXNzCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBnZXRQbGF5ZXJSb2xlS2V5AAAAAgUAAAAGZ2FtZUlkBQAAAA1jYWxsZXJBZGRyZXNzAgAAAAVtYWtlcgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADWdldEJldEVnZ3NLZXkAAAABBQAAAAZnYW1lSWQFAAAABGVnZ3MJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABFnZXRSYXJpdHlSYW5nZUtleQAAAAIFAAAABmdhbWVJZAIAAAAFd29yc3QFAAAAEHJhcml0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bGF5ZXJSb2xlCQEAAAANZ2V0UGxheWVyUm9sZQAAAAIFAAAABmdhbWVJZAUAAAANY2FsbGVyQWRkcmVzcwQAAAAIZ2FtZVN0ZXAJAQAAAAdnZXRTdGVwAAAAAQUAAAAGZ2FtZUlkBAAAABB3b3JzdFJhcml0eVJhbmdlCQEAAAAOZ2V0UmFyaXR5UmFuZ2UAAAACBQAAAAZnYW1lSWQCAAAABXdvcnN0BAAAABFtZWRpdW1SYXJpdHlSYW5nZQkBAAAADmdldFJhcml0eVJhbmdlAAAAAgUAAAAGZ2FtZUlkAgAAAAZtZWRpdW0EAAAAD2Jlc3RSYXJpdHlSYW5nZQkBAAAADmdldFJhcml0eVJhbmdlAAAAAgUAAAAGZ2FtZUlkAgAAAARiZXN0BAAAAA5pbnZva2VXb3JzdFJlcwkAA/wAAAAECQEAAAAHQWRkcmVzcwAAAAEFAAAAFXJhcml0eVByb3ZpZGVyQWRkcmVzcwIAAAAOZ2V0QXNzZXRSYXJpdHkJAARMAAAAAgUAAAALd29yc3REdWNrSWQFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAA5pbnZva2VXb3JzdFJlcwUAAAAOaW52b2tlV29yc3RSZXMEAAAAC3dvcnN0UmFyaXR5BAAAAAckbWF0Y2gwBQAAAA5pbnZva2VXb3JzdFJlcwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFyBQAAAAckbWF0Y2gwBQAAAAFyCQAAAgAAAAECAAAAF0luY29ycmVjdCBpbnZva2UgcmVzdWx0BAAAAA9pbnZva2VNZWRpdW1SZXMJAAP8AAAABAkBAAAAB0FkZHJlc3MAAAABBQAAABVyYXJpdHlQcm92aWRlckFkZHJlc3MCAAAADmdldEFzc2V0UmFyaXR5CQAETAAAAAIFAAAADG1lZGl1bUR1Y2tJZAUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAD2ludm9rZU1lZGl1bVJlcwUAAAAPaW52b2tlTWVkaXVtUmVzBAAAAAxtZWRpdW1SYXJpdHkEAAAAByRtYXRjaDAFAAAAD2ludm9rZU1lZGl1bVJlcwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFyBQAAAAckbWF0Y2gwBQAAAAFyCQAAAgAA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AAxtZWRpdW1SYXJpdHkJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAxnZXRSYXJpdHlLZXkAAAADBQAAAAZnYW1lSWQFAAAACnBsYXllclJvbGUCAAAABGJlc3QFAAAACmJlc3RSYXJpdHkJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAADGdldER1Y2tJZEtleQAAAAMFAAAABmdhbWVJZAUAAAAKcGxheWVyUm9sZQIAAAAFd29yc3QFAAAAC3dvcnN0RHVja0lkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAxnZXREdWNrSWRLZXkAAAADBQAAAAZnYW1lSWQFAAAACnBsYXllclJvbGUCAAAABm1lZGl1bQUAAAAMbWVkaXVtRHVja0lkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAxnZXREdWNrSWRLZXkAAAADBQAAAAZnYW1lSWQFAAAACnBsYXllclJvbGUCAAAABGJlc3QFAAAACmJlc3REdWNrSWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAApnZXRTdGVwS2V5AAAAAQUAAAAGZ2FtZUlkCQAAZAAAAAIFAAAACGdhbWVTdGVwAAAAAAAAAAABCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAWZ2V0RXhwaXJhdGlvbkhlaWdodEtleQAAAAEFAAAABmdhbWVJZAkAAGQAAAACBQAAAAZoZWlnaHQFAAAADHN0ZXBEdXJhdGlvbgUAAAADbmlsCQAAAgAAAAECAAAAJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAAIAAAABAgAAACRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAACAAAAAQIAAAAkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAAAAAWkBAAAABmNvbW1pdAAAAAEAAAAEaGFzaAQAAAANY2FsbGVyQWRkcmVzcwkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAAZnYW1lSWQJAQAAABRnZXRQbGF5ZXJDdXJyZW50R2FtZQAA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AAAAAAACBQAAAAZnYW1lSWQAAAAAAAAAAAAJAAACAAAAAQIAAAAdWW91IGRvbid0IGhhdmUgYW4gYWN0aXZlIGdhbWUDCQAAAAAAAAIFAAAABndpbm5lcgUAAAAKcGxheWVyUm9sZQQAAAADYmV0CQEAAAAKZ2V0QmV0RWdncwAAAAEFAAAABmdhbWVJZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAF2dldFBsYXllckN1cnJlbnRHYW1lS2V5AAAAAQUAAAANY2FsbGVyQWRkcmVzcwAAAAAAAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAF2dldFBsYXllckN1cnJlbnRHYW1lS2V5AAAAAQUAAAAUYW5vdGhlclBsYXllckFkZHJlc3MAAAAAAAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABBnZXRQbGF5ZXJXaW5zS2V5AAAAAQUAAAANY2FsbGVyQWRkcmVzcwkAAGQAAAACCQEAAAANZ2V0UGxheWVyV2lucwAAAAEFAAAADWNhbGxlckFkZHJlc3MAAAAAAAAAAAEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABFnZXRQbGF5ZXJMb3Nlc0tleQAAAAEFAAAAFGFub3RoZXJQbGF5ZXJBZGRyZXNzCQAAZAAAAAIJAQAAAA5nZXRQbGF5ZXJMb3NlcwAAAAEFAAAAFGFub3RoZXJQbGF5ZXJBZGRyZXNzAAAAAAAAAAABCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBnZXRHYW1lUmVzdWx0S2V5AAAAAgUAAAAGZ2FtZUlkBQAAAA1jYWxsZXJBZGRyZXNzAgAAAAN3aW4JAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEGdldEdhbWVSZXN1bHRLZXkAAAACBQAAAAZnYW1lSWQFAAAAFGFub3RoZXJQbGF5ZXJBZGRyZXNzAgAAAARsb3NlCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAPZ2V0R2FtZVByaXplS2V5AAAAAgUAAAAGZ2FtZUlkBQAAAA1jYWxsZXJBZGRyZXNzBQAAAANiZXQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAA9nZXRHYW1lUHJpemVLZXkAAAACBQAAAAZnYW1lSWQFAAAAFGFub3RoZXJQbGF5ZXJBZGRyZXNzCQEAAAABLQAAAAEFAAAAA2JldAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIJAABoAAAAAgkBAAAACmdldEJldEVnZ3MAAAABBQAAAAZnYW1lSWQAAAAAAAAAAAIFAAAAC2VnZ3NBc3NldElkBQAAAANuaWwDCQAAAAAAAAIFAAAABndpbm5lcgIAAAAEZHJhdwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAF2dldFBsYXllckN1cnJlbnRHYW1lS2V5AAAAAQUAAAANY2FsbGVyQWRkcmVzcwAAAAAAAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEWdldFBsYXllckRyYXdzS2V5AAAAAQUAAAANY2FsbGVyQWRkcmVzcwkAAGQAAAACCQEAAAAOZ2V0UGxheWVyRHJhd3MAAAABBQAAAA1jYWxsZXJBZGRyZXNzAAAAAAAAAAABCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBnZXRHYW1lUmVzdWx0S2V5AAAAAgUAAAAGZ2FtZUlkBQAAAA1jYWxsZXJBZGRyZXNzAgAAAARkcmF3CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAPZ2V0R2FtZVByaXplS2V5AAAAAgUAAAAGZ2FtZUlkBQAAAA1jYWxsZXJBZGRyZXNzAAAAAAAAAAAACQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgkBAAAACmdldEJldEVnZ3MAAAABBQAAAAZnYW1lSWQFAAAAC2VnZ3NBc3NldElkBQAAAANuaWwJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABdnZXRQbGF5ZXJDdXJyZW50R2FtZUtleQAAAAEFAAAADWNhbGxlckFkZHJlc3MAAAAAAAAAAAAFAAAAA25pbAAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5SO2dRA==", "height": 1696896, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 9a6rU1qowbZ5NXSPGYtrE1gYgxL6XKM4DLaN4Gf2Uouv Next: DWsNfa7Fy7sePxsPSaL8vMtwUvq4313c1UBzyhTDXV13 Diff:
OldNewDifferences
133133
134134
135135 func getGameResult (gameId,playerAddress) = tryGetString(getGameResultKey(gameId, playerAddress))
136+
137+
138+func getGamePrizeKey (gameId,playerAddress) = (((("game" + toString(gameId)) + "_") + playerAddress) + "_prize")
139+
140+
141+func getGamePrize (gameId,playerAddress) = tryGetString(getGamePrizeKey(gameId, playerAddress))
136142
137143
138144 func getPlayerWinsKey (playerAddress) = (playerAddress + "_wins")
473479 if ((gameId == 0))
474480 then throw("You don't have an active game")
475481 else if ((winner == playerRole))
476- then [IntegerEntry(getPlayerCurrentGameKey(callerAddress), 0), IntegerEntry(getPlayerCurrentGameKey(anotherPlayerAddress), 0), IntegerEntry(getPlayerWinsKey(callerAddress), (getPlayerWins(callerAddress) + 1)), IntegerEntry(getPlayerLosesKey(anotherPlayerAddress), (getPlayerLoses(anotherPlayerAddress) + 1)), StringEntry(getGameResultKey(gameId, callerAddress), "win"), StringEntry(getGameResultKey(gameId, anotherPlayerAddress), "lose"), ScriptTransfer(i.caller, (getBetEggs(gameId) * 2), eggsAssetId)]
482+ then {
483+ let bet = getBetEggs(gameId)
484+[IntegerEntry(getPlayerCurrentGameKey(callerAddress), 0), IntegerEntry(getPlayerCurrentGameKey(anotherPlayerAddress), 0), IntegerEntry(getPlayerWinsKey(callerAddress), (getPlayerWins(callerAddress) + 1)), IntegerEntry(getPlayerLosesKey(anotherPlayerAddress), (getPlayerLoses(anotherPlayerAddress) + 1)), StringEntry(getGameResultKey(gameId, callerAddress), "win"), StringEntry(getGameResultKey(gameId, anotherPlayerAddress), "lose"), IntegerEntry(getGamePrizeKey(gameId, callerAddress), bet), IntegerEntry(getGamePrizeKey(gameId, anotherPlayerAddress), -(bet)), ScriptTransfer(i.caller, (getBetEggs(gameId) * 2), eggsAssetId)]
485+ }
477486 else if ((winner == "draw"))
478- then [IntegerEntry(getPlayerCurrentGameKey(callerAddress), 0), IntegerEntry(getPlayerDrawsKey(callerAddress), (getPlayerDraws(callerAddress) + 1)), StringEntry(getGameResultKey(gameId, callerAddress), "draw"), ScriptTransfer(i.caller, getBetEggs(gameId), eggsAssetId)]
487+ then [IntegerEntry(getPlayerCurrentGameKey(callerAddress), 0), IntegerEntry(getPlayerDrawsKey(callerAddress), (getPlayerDraws(callerAddress) + 1)), StringEntry(getGameResultKey(gameId, callerAddress), "draw"), IntegerEntry(getGamePrizeKey(gameId, callerAddress), 0), ScriptTransfer(i.caller, getBetEggs(gameId), eggsAssetId)]
479488 else [IntegerEntry(getPlayerCurrentGameKey(callerAddress), 0)]
480489 }
481490
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let farmingAddress = base58'3NBznG19rEYUAcnukTRTtwJHBVKQLbobVdC'
55
66 let rarityProviderAddress = base58'3NCman4dCzk1HWWU4DPTr5rsbhvuUCwwUZh'
77
88 let eggsAssetId = base58'3VUCuh9dWqe54SdzzNUkXhFXpc8UQynnJVh42B7MjNzN'
99
1010 let SLOTS = 10
1111
1212 let WAITING = 8
1313
1414 let stepDuration = 5
1515
1616 func tryGetInteger (key) = match getInteger(this, key) {
1717 case b: Int =>
1818 b
1919 case _ =>
2020 0
2121 }
2222
2323
2424 func tryGetString (key) = match getString(this, key) {
2525 case a: String =>
2626 a
2727 case _ =>
2828 ""
2929 }
3030
3131
3232 func tryGetBoolean (key) = match getBoolean(this, key) {
3333 case b: Boolean =>
3434 b
3535 case _ =>
3636 false
3737 }
3838
3939
4040 func getNextGameId () = {
4141 let nextId = tryGetInteger("nextGameId")
4242 if ((nextId == 0))
4343 then 1
4444 else nextId
4545 }
4646
4747
4848 func getPlayerCurrentGameKey (playerAddress) = (playerAddress + "_currentGame")
4949
5050
5151 func getPlayerCurrentGame (playerAddress) = tryGetInteger(getPlayerCurrentGameKey(playerAddress))
5252
5353
5454 func getSlotKey (slot) = ("slot" + toString(slot))
5555
5656
5757 func getSlot (slot) = tryGetInteger(getSlotKey(slot))
5858
5959
6060 func getPlayerRoleKey (gameId,playerAddress) = ((("game" + toString(gameId)) + "_") + playerAddress)
6161
6262
6363 func getPlayerRole (gameId,playerAddress) = tryGetString(getPlayerRoleKey(gameId, playerAddress))
6464
6565
6666 func getMakerKey (gameId) = (("game" + toString(gameId)) + "_maker")
6767
6868
6969 func getMaker (gameId) = tryGetString(getMakerKey(gameId))
7070
7171
7272 func getTakerKey (gameId) = (("game" + toString(gameId)) + "_taker")
7373
7474
7575 func getTaker (gameId) = tryGetString(getTakerKey(gameId))
7676
7777
7878 func getBetEggsKey (gameId) = (("game" + toString(gameId)) + "_betEggs")
7979
8080
8181 func getBetEggs (gameId) = tryGetInteger(getBetEggsKey(gameId))
8282
8383
8484 func getWaitingExpirationHeightKey (gameId) = (("game" + toString(gameId)) + "_waitingExpirationHeight")
8585
8686
8787 func getWaitingExpirationHeight (gameId) = tryGetInteger(getWaitingExpirationHeightKey(gameId))
8888
8989
9090 func getExpirationHeightKey (gameId) = (("game" + toString(gameId)) + "_expirationHeight")
9191
9292
9393 func getExpirationHeight (gameId) = tryGetInteger(getExpirationHeightKey(gameId))
9494
9595
9696 func getRarityRangeKey (gameId,rangePosition) = ((("game" + toString(gameId)) + "_rarityRange_") + rangePosition)
9797
9898
9999 func getRarityRange (gameId,rangePosition) = tryGetInteger(getRarityRangeKey(gameId, rangePosition))
100100
101101
102102 func getStepKey (gameId) = (("game" + toString(gameId)) + "_step")
103103
104104
105105 func getStep (gameId) = tryGetInteger(getStepKey(gameId))
106106
107107
108108 func getRarityKey (gameId,playerRole,rangePosition) = (((((("game" + toString(gameId)) + "_") + playerRole) + "_") + rangePosition) + "Rarity")
109109
110110
111111 func getRarity (gameId,playerRole,rangePosition) = tryGetInteger(getRarityKey(gameId, playerRole, rangePosition))
112112
113113
114114 func getDuckIdKey (gameId,playerRole,rangePosition) = (((((("game" + toString(gameId)) + "_") + playerRole) + "_") + rangePosition) + "DuckId")
115115
116116
117117 func getDuckId (gameId,playerRole,rangePosition) = tryGetString(getDuckIdKey(gameId, playerRole, rangePosition))
118118
119119
120120 func getCommitKey (gameId,playerRole) = (((("game" + toString(gameId)) + "_") + playerRole) + "_commit")
121121
122122
123123 func getCommit (gameId,playerRole) = tryGetString(getCommitKey(gameId, playerRole))
124124
125125
126126 func getDuckOrderKey (gameId,playerRole) = (((("game" + toString(gameId)) + "_") + playerRole) + "_duckOrder")
127127
128128
129129 func getDuckOrder (gameId,playerRole) = tryGetString(getDuckOrderKey(gameId, playerRole))
130130
131131
132132 func getGameResultKey (gameId,playerAddress) = (((("game" + toString(gameId)) + "_") + playerAddress) + "_result")
133133
134134
135135 func getGameResult (gameId,playerAddress) = tryGetString(getGameResultKey(gameId, playerAddress))
136+
137+
138+func getGamePrizeKey (gameId,playerAddress) = (((("game" + toString(gameId)) + "_") + playerAddress) + "_prize")
139+
140+
141+func getGamePrize (gameId,playerAddress) = tryGetString(getGamePrizeKey(gameId, playerAddress))
136142
137143
138144 func getPlayerWinsKey (playerAddress) = (playerAddress + "_wins")
139145
140146
141147 func getPlayerWins (playerAddress) = tryGetInteger(getPlayerWinsKey(playerAddress))
142148
143149
144150 func getPlayerLosesKey (playerAddress) = (playerAddress + "_loses")
145151
146152
147153 func getPlayerLoses (playerAddress) = tryGetInteger(getPlayerLosesKey(playerAddress))
148154
149155
150156 func getPlayerDrawsKey (playerAddress) = (playerAddress + "_draws")
151157
152158
153159 func getPlayerDraws (playerAddress) = tryGetInteger(getPlayerDrawsKey(playerAddress))
154160
155161
156162 func getGamesPlayedKey () = "gamesPlayed"
157163
158164
159165 func getGamesPlayed () = tryGetInteger(getGamesPlayedKey())
160166
161167
162168 func getFarmingPower (address,assetId) = match getInteger(Address(farmingAddress), (((("address_" + address) + "_asset_") + assetId) + "_farmingPower")) {
163169 case fp: Int =>
164170 fp
165171 case _ =>
166172 0
167173 }
168174
169175
170176 func checkDuckOwner (ownerAddress,assetId) = if ((assetBalance(ownerAddress, assetId) > 0))
171177 then true
172178 else (getFarmingPower(toBase58String(ownerAddress.bytes), toBase58String(assetId)) > 0)
173179
174180
175181 func getScore (a,b) = if ((a > b))
176182 then 1
177183 else if ((b > a))
178184 then -1
179185 else 0
180186
181187
182188 func getWinner (gameId) = {
183189 let gameStep = getStep(gameId)
184190 if ((6 > gameStep))
185191 then {
186192 let expirationHeight = getExpirationHeight(gameId)
187193 if ((expirationHeight == 0))
188194 then throw("Game is not started")
189195 else if ((expirationHeight > height))
190196 then throw("Game is not finished or expired")
191197 else if (((getStep(gameId) % 2) == 0))
192198 then "maker"
193199 else "taker"
194200 }
195201 else {
196202 let makerDuckOrder = split(getDuckOrder(gameId, "maker"), ",")
197203 let takerDuckOrder = split(getDuckOrder(gameId, "taker"), ",")
198204 let makerRarity1 = getRarity(gameId, "maker", makerDuckOrder[0])
199205 let makerRarity2 = getRarity(gameId, "maker", makerDuckOrder[1])
200206 let makerRarity3 = getRarity(gameId, "maker", makerDuckOrder[2])
201207 let takerRarity1 = getRarity(gameId, "taker", takerDuckOrder[0])
202208 let takerRarity2 = getRarity(gameId, "taker", takerDuckOrder[1])
203209 let takerRarity3 = getRarity(gameId, "taker", takerDuckOrder[2])
204210 let makerScore = ((getScore(makerRarity1, takerRarity1) + getScore(makerRarity2, takerRarity2)) + getScore(makerRarity3, takerRarity3))
205211 if ((makerScore > 0))
206212 then "maker"
207213 else if ((0 > makerScore))
208214 then "taker"
209215 else "draw"
210216 }
211217 }
212218
213219
214220 @Callable(i)
215221 func makeGame (slot,rarityRangeWorst,rarityRangeMedium,rarityRangeBest) = {
216222 let callerAddress = toBase58String(i.caller.bytes)
217223 let slotGameId = getSlot(slot)
218224 let payment = value(i.payments[0])
219225 let eggs = payment.amount
220226 let gameId = getNextGameId()
221227 if ((getPlayerCurrentGame(callerAddress) != 0))
222228 then throw("You already have an active game")
223229 else if (if ((0 > slot))
224230 then true
225231 else (slot >= SLOTS))
226232 then throw("Invalid slot")
227233 else if ((slotGameId != 0))
228234 then throw("This slot is busy")
229235 else if ((payment.assetId != eggsAssetId))
230236 then throw(("You can attach only EGGs with the following asset id: " + toBase58String(eggsAssetId)))
231237 else if ((eggs != 1))
232238 then throw("Bet must be 0.01 EGG during beta test")
233239 else if (if ((1 > rarityRangeWorst))
234240 then true
235241 else (rarityRangeWorst > 5))
236242 then throw("Invalid rarity range for the worst duck")
237243 else if (if ((1 > rarityRangeMedium))
238244 then true
239245 else (rarityRangeMedium > 5))
240246 then throw("Invalid rarity range for the medium duck")
241247 else if (if ((1 > rarityRangeBest))
242248 then true
243249 else (rarityRangeBest > 5))
244250 then throw("Invalid rarity range for the best duck")
245251 else if ((rarityRangeWorst > rarityRangeMedium))
246252 then throw("The medium range can't be less than the worst one")
247253 else if ((rarityRangeMedium > rarityRangeBest))
248254 then throw("The best range can't be worse than the medium one")
249255 else [IntegerEntry(getPlayerCurrentGameKey(callerAddress), gameId), StringEntry(getMakerKey(gameId), callerAddress), StringEntry(getPlayerRoleKey(gameId, callerAddress), "maker"), IntegerEntry(getBetEggsKey(gameId), eggs), IntegerEntry(getRarityRangeKey(gameId, "worst"), rarityRangeWorst), IntegerEntry(getRarityRangeKey(gameId, "medium"), rarityRangeMedium), IntegerEntry(getRarityRangeKey(gameId, "best"), rarityRangeBest), IntegerEntry(getWaitingExpirationHeightKey(gameId), (height + WAITING)), IntegerEntry(getSlotKey(slot), gameId), IntegerEntry("nextGameId", (gameId + 1))]
250256 }
251257
252258
253259
254260 @Callable(i)
255261 func takeGame (slot) = {
256262 let callerAddress = toBase58String(i.caller.bytes)
257263 let gameId = getSlot(slot)
258264 let payment = value(i.payments[0])
259265 if ((getPlayerCurrentGame(callerAddress) != 0))
260266 then throw("You already have an active game")
261267 else if (if ((0 > slot))
262268 then true
263269 else (slot >= SLOTS))
264270 then throw("Invalid slot")
265271 else if ((getSlot(slot) == 0))
266272 then throw("This slot is empty")
267273 else if ((payment.assetId != eggsAssetId))
268274 then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggsAssetId)))
269275 else if ((payment.amount != getBetEggs(gameId)))
270276 then throw("Insufficient eggs amount")
271277 else if ((height >= getWaitingExpirationHeight(gameId)))
272278 then throw("This game is expired")
273279 else [IntegerEntry(getPlayerCurrentGameKey(callerAddress), gameId), StringEntry(getTakerKey(gameId), callerAddress), StringEntry(getPlayerRoleKey(gameId, callerAddress), "taker"), IntegerEntry(getStepKey(gameId), 0), IntegerEntry(getExpirationHeightKey(gameId), (height + stepDuration)), IntegerEntry(getSlotKey(slot), 0), IntegerEntry("gamesPlayed", (getGamesPlayed() + 1))]
274280 }
275281
276282
277283
278284 @Callable(i)
279285 func kickGame (slot) = {
280286 let gameId = getSlot(slot)
281287 if (if ((0 > slot))
282288 then true
283289 else (slot >= SLOTS))
284290 then throw("Invalid slot")
285291 else if ((gameId == 0))
286292 then throw("Slot is empty")
287293 else if ((getWaitingExpirationHeight(gameId) > height))
288294 then throw("Waiting is not finished yet")
289295 else {
290296 let maker = getMaker(gameId)
291297 [IntegerEntry(getPlayerCurrentGameKey(maker), 0), IntegerEntry(getSlotKey(slot), 0), ScriptTransfer(Address(fromBase58String(maker)), getBetEggs(gameId), eggsAssetId)]
292298 }
293299 }
294300
295301
296302
297303 @Callable(i)
298304 func pickDucks (worstDuckId,mediumDuckId,bestDuckId) = {
299305 let callerAddress = toBase58String(i.caller.bytes)
300306 let gameId = getPlayerCurrentGame(callerAddress)
301307 let playerRole = getPlayerRole(gameId, callerAddress)
302308 let gameStep = getStep(gameId)
303309 let worstRarityRange = getRarityRange(gameId, "worst")
304310 let mediumRarityRange = getRarityRange(gameId, "medium")
305311 let bestRarityRange = getRarityRange(gameId, "best")
306312 let invokeWorstRes = invoke(Address(rarityProviderAddress), "getAssetRarity", [worstDuckId], nil)
307313 if ((invokeWorstRes == invokeWorstRes))
308314 then {
309315 let worstRarity = match invokeWorstRes {
310316 case r: Int =>
311317 r
312318 case _ =>
313319 throw("Incorrect invoke result")
314320 }
315321 let invokeMediumRes = invoke(Address(rarityProviderAddress), "getAssetRarity", [mediumDuckId], nil)
316322 if ((invokeMediumRes == invokeMediumRes))
317323 then {
318324 let mediumRarity = match invokeMediumRes {
319325 case r: Int =>
320326 r
321327 case _ =>
322328 throw("Incorrect invoke result")
323329 }
324330 let invokeBestRes = invoke(Address(rarityProviderAddress), "getAssetRarity", [bestDuckId], nil)
325331 if ((invokeBestRes == invokeBestRes))
326332 then {
327333 let bestRarity = match invokeBestRes {
328334 case r: Int =>
329335 r
330336 case _ =>
331337 throw("Incorrect invoke result")
332338 }
333339 if ((gameId == 0))
334340 then throw("You don't have an active game")
335341 else if ((getExpirationHeight(gameId) == 0))
336342 then throw("Game is not started")
337343 else if (if ((gameStep == 0))
338344 then (playerRole != "taker")
339345 else false)
340346 then throw("It is the taker's turn to pick now")
341347 else if (if ((gameStep == 1))
342348 then (playerRole != "maker")
343349 else false)
344350 then throw("It is the maker's turn to pick now")
345351 else if ((gameStep > 1))
346352 then throw("Ducks have already been picked")
347353 else if (!(checkDuckOwner(i.caller, fromBase58String(worstDuckId))))
348354 then throw((("Asset " + worstDuckId) + " doesn't belong to you"))
349355 else if (!(checkDuckOwner(i.caller, fromBase58String(mediumDuckId))))
350356 then throw((("Asset " + mediumDuckId) + " doesn't belong to you"))
351357 else if (!(checkDuckOwner(i.caller, fromBase58String(bestDuckId))))
352358 then throw((("Asset " + bestDuckId) + " doesn't belong to you"))
353359 else if (if ((5 > worstRarityRange))
354360 then if ((worstRarity > (worstRarityRange * 10)))
355361 then true
356362 else (((worstRarityRange - 1) * 10) >= worstRarity)
357363 else false)
358364 then throw("Worst duck doesn't fit rarity range")
359365 else if (if ((5 > mediumRarityRange))
360366 then if ((mediumRarity > (mediumRarityRange * 10)))
361367 then true
362368 else (((mediumRarityRange - 1) * 10) >= mediumRarity)
363369 else false)
364370 then throw("Medium duck doesn't fit rarity range")
365371 else if (if ((5 > bestRarityRange))
366372 then if ((bestRarity > (bestRarityRange * 10)))
367373 then true
368374 else (((bestRarityRange - 1) * 10) >= bestRarity)
369375 else false)
370376 then throw("Best duck doesn't fit rarity range")
371377 else if (if ((worstRarityRange == 5))
372378 then (40 >= worstRarity)
373379 else false)
374380 then throw("Worst duck doesn't fit rarity range")
375381 else if (if ((mediumRarityRange == 5))
376382 then (40 >= mediumRarity)
377383 else false)
378384 then throw("Medium duck doesn't fit rarity range")
379385 else if (if ((bestRarityRange == 5))
380386 then (40 >= bestRarity)
381387 else false)
382388 then throw("Best duck doesn't fit rarity range")
383389 else if (if (if ((worstRarity == mediumRarity))
384390 then true
385391 else (worstRarity == bestRarity))
386392 then true
387393 else (mediumRarity == bestRarity))
388394 then throw("Ducks must have different rarities")
389395 else [IntegerEntry(getRarityKey(gameId, playerRole, "worst"), worstRarity), IntegerEntry(getRarityKey(gameId, playerRole, "medium"), mediumRarity), IntegerEntry(getRarityKey(gameId, playerRole, "best"), bestRarity), StringEntry(getDuckIdKey(gameId, playerRole, "worst"), worstDuckId), StringEntry(getDuckIdKey(gameId, playerRole, "medium"), mediumDuckId), StringEntry(getDuckIdKey(gameId, playerRole, "best"), bestDuckId), IntegerEntry(getStepKey(gameId), (gameStep + 1)), IntegerEntry(getExpirationHeightKey(gameId), (height + stepDuration))]
390396 }
391397 else throw("Strict value is not equal to itself.")
392398 }
393399 else throw("Strict value is not equal to itself.")
394400 }
395401 else throw("Strict value is not equal to itself.")
396402 }
397403
398404
399405
400406 @Callable(i)
401407 func commit (hash) = {
402408 let callerAddress = toBase58String(i.caller.bytes)
403409 let gameId = getPlayerCurrentGame(callerAddress)
404410 let playerRole = getPlayerRole(gameId, callerAddress)
405411 let gameStep = getStep(gameId)
406412 if ((gameId == 0))
407413 then throw("You don't have an active game")
408414 else if ((2 > gameStep))
409415 then throw("Commit is not started")
410416 else if (if ((gameStep == 2))
411417 then (playerRole != "taker")
412418 else false)
413419 then throw("It is the taker's turn to pick now")
414420 else if (if ((gameStep == 3))
415421 then (playerRole != "maker")
416422 else false)
417423 then throw("It is the maker's turn to pick now")
418424 else if ((gameStep > 3))
419425 then throw("Commit is finished")
420426 else [StringEntry(getCommitKey(gameId, playerRole), hash), IntegerEntry(getStepKey(gameId), (gameStep + 1)), IntegerEntry(getExpirationHeightKey(gameId), (height + stepDuration))]
421427 }
422428
423429
424430
425431 @Callable(i)
426432 func reveal (duckOrder,salt) = {
427433 let callerAddress = toBase58String(i.caller.bytes)
428434 let gameId = getPlayerCurrentGame(callerAddress)
429435 let playerRole = getPlayerRole(gameId, callerAddress)
430436 let gameStep = getStep(gameId)
431437 if ((gameId == 0))
432438 then throw("You don't have an active game")
433439 else if ((4 > gameStep))
434440 then throw("Reveal is not started")
435441 else if (if ((gameStep == 4))
436442 then (playerRole != "taker")
437443 else false)
438444 then throw("It is the taker's turn to pick now")
439445 else if (if ((gameStep == 5))
440446 then (playerRole != "maker")
441447 else false)
442448 then throw("It is the maker's turn to pick now")
443449 else if ((gameStep > 5))
444450 then throw("Reveal is finished")
445451 else if (if (if (if (if (if ((duckOrder != "worst,medium,best"))
446452 then (duckOrder != "worst,best,medium")
447453 else false)
448454 then (duckOrder != "medium,worst,best")
449455 else false)
450456 then (duckOrder != "medium,best,worst")
451457 else false)
452458 then (duckOrder != "best,worst,medium")
453459 else false)
454460 then (duckOrder != "best,medium,worst")
455461 else false)
456462 then throw("Reveal data is not valid")
457463 else if ((toBase58String(sha256(toBytes((duckOrder + salt)))) != getCommit(gameId, playerRole)))
458464 then throw("Reveal doesn't match commit")
459465 else [StringEntry(getDuckOrderKey(gameId, playerRole), duckOrder), IntegerEntry(getStepKey(gameId), (gameStep + 1)), IntegerEntry(getExpirationHeightKey(gameId), (height + stepDuration))]
460466 }
461467
462468
463469
464470 @Callable(i)
465471 func getPrize () = {
466472 let callerAddress = toBase58String(i.caller.bytes)
467473 let gameId = getPlayerCurrentGame(callerAddress)
468474 let playerRole = getPlayerRole(gameId, callerAddress)
469475 let anotherPlayerAddress = if ((playerRole == "maker"))
470476 then getTaker(gameId)
471477 else getMaker(gameId)
472478 let winner = getWinner(gameId)
473479 if ((gameId == 0))
474480 then throw("You don't have an active game")
475481 else if ((winner == playerRole))
476- then [IntegerEntry(getPlayerCurrentGameKey(callerAddress), 0), IntegerEntry(getPlayerCurrentGameKey(anotherPlayerAddress), 0), IntegerEntry(getPlayerWinsKey(callerAddress), (getPlayerWins(callerAddress) + 1)), IntegerEntry(getPlayerLosesKey(anotherPlayerAddress), (getPlayerLoses(anotherPlayerAddress) + 1)), StringEntry(getGameResultKey(gameId, callerAddress), "win"), StringEntry(getGameResultKey(gameId, anotherPlayerAddress), "lose"), ScriptTransfer(i.caller, (getBetEggs(gameId) * 2), eggsAssetId)]
482+ then {
483+ let bet = getBetEggs(gameId)
484+[IntegerEntry(getPlayerCurrentGameKey(callerAddress), 0), IntegerEntry(getPlayerCurrentGameKey(anotherPlayerAddress), 0), IntegerEntry(getPlayerWinsKey(callerAddress), (getPlayerWins(callerAddress) + 1)), IntegerEntry(getPlayerLosesKey(anotherPlayerAddress), (getPlayerLoses(anotherPlayerAddress) + 1)), StringEntry(getGameResultKey(gameId, callerAddress), "win"), StringEntry(getGameResultKey(gameId, anotherPlayerAddress), "lose"), IntegerEntry(getGamePrizeKey(gameId, callerAddress), bet), IntegerEntry(getGamePrizeKey(gameId, anotherPlayerAddress), -(bet)), ScriptTransfer(i.caller, (getBetEggs(gameId) * 2), eggsAssetId)]
485+ }
477486 else if ((winner == "draw"))
478- then [IntegerEntry(getPlayerCurrentGameKey(callerAddress), 0), IntegerEntry(getPlayerDrawsKey(callerAddress), (getPlayerDraws(callerAddress) + 1)), StringEntry(getGameResultKey(gameId, callerAddress), "draw"), ScriptTransfer(i.caller, getBetEggs(gameId), eggsAssetId)]
487+ then [IntegerEntry(getPlayerCurrentGameKey(callerAddress), 0), IntegerEntry(getPlayerDrawsKey(callerAddress), (getPlayerDraws(callerAddress) + 1)), StringEntry(getGameResultKey(gameId, callerAddress), "draw"), IntegerEntry(getGamePrizeKey(gameId, callerAddress), 0), ScriptTransfer(i.caller, getBetEggs(gameId), eggsAssetId)]
479488 else [IntegerEntry(getPlayerCurrentGameKey(callerAddress), 0)]
480489 }
481490
482491
483492 @Verifier(tx)
484493 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
485494

github/deemru/w8io/c3f4982 
83.56 ms