tx · MbkQLMiRfWsQVZ1vycsxEwVeZSiXeM5kio3Tga2XUrj

3N6oaapvYkEryHUr4vAiPRXM3iS6kMYXito:  -0.05000000 Waves

2021.09.14 12:58 [1702554] smart account 3N6oaapvYkEryHUr4vAiPRXM3iS6kMYXito > SELF 0.00000000 Waves

{ "type": 13, "id": "MbkQLMiRfWsQVZ1vycsxEwVeZSiXeM5kio3Tga2XUrj", "fee": 5000000, "feeAssetId": null, "timestamp": 1631613486671, "version": 2, "chainId": 84, "sender": "3N6oaapvYkEryHUr4vAiPRXM3iS6kMYXito", "senderPublicKey": "7PMrxEzirv6h9Z2zqLE47qrZd6v1AbRZER5Aqfo95Eyr", "proofs": [ "47JMz7SeDNu1dEu7SpJgnXTT3m4HT8BqcxXQAwjHYEVMM4FNdYvq6fk58vaV6gVvk3ySM8RyY3ZLPEmyYaiLm62m" ], "script": "base64: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Z2dzAQAAAApnZXRCZXRFZ2dzAAAAAQAAAAZnYW1lSWQJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkBAAAADWdldEJldEVnZ3NLZXkAAAABBQAAAAZnYW1lSWQBAAAAHWdldFdhaXRpbmdFeHBpcmF0aW9uSGVpZ2h0S2V5AAAAAQAAAAZnYW1lSWQJAAEsAAAAAgkAASwAAAACAgAAAARnYW1lCQABpAAAAAEFAAAABmdhbWVJZAIAAAAYX3dhaXRpbmdFeHBpcmF0aW9uSGVpZ2h0AQAAABpnZXRXYWl0aW5nRXhwaXJhdGlvbkhlaWdodAAAAAEAAAAGZ2FtZUlkCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAAB1nZXRXYWl0aW5nRXhwaXJhdGlvbkhlaWdodEtleQAAAAEFAAAABmdhbWVJZAEAAAAWZ2V0RXhwaXJhdGlvbkhlaWdodEtleQAAAAEAAAAGZ2FtZUlkCQABLAAAAAIJAAEsAAAAAgIAAAAEZ2FtZQkAAaQAAAABBQAAAAZnYW1lSWQCAAAAEV9leHBpcmF0aW9uSGVpZ2h0AQAAABNnZXRFeHBpcmF0aW9uSGVpZ2h0AAAAAQAAAAZnYW1lSWQJAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkBAAAAFmdldEV4cGlyYXRpb25IZWlnaHRLZXkAAAABBQAAAAZnYW1lSWQBAAAAEWdldFJhcml0eVJhbmdlS2V5AAAAAgAAAAZnYW1lSWQAAAANcmFuZ2VQb3NpdGlvbgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAEZ2FtZQkAAaQAAAABBQAAAAZnYW1lSWQCAAAADV9yYXJpdHlSYW5nZV8FAAAADXJhbmdlUG9zaXRpb24BAAAADmdldFJhcml0eVJhbmdlAAAAAgAAAAZnYW1lSWQAAAANcmFuZ2VQb3NpdGlvbgkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAARZ2V0UmFyaXR5UmFuZ2VLZXkAAAACBQAAAAZnYW1lSWQFAAAADXJhbmdlUG9zaXRpb24BAAAACmdldFN0ZXBLZXkAAAABAAAABmdhbWVJZAkAASwAAAACCQABLAAAAAICAAAABGdhbWUJAAGkAAAAAQUAAAAGZ2FtZUlkAgAAAAVfc3RlcAEAAAAHZ2V0U3RlcAAAAAEAAAAGZ2FtZUlkCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAAApnZXRTdGVwS2V5AAAAAQUAAAAGZ2FtZUlkAQAAAAxnZXRSYXJpdHlLZXkAAAADAAAABmdhbWVJZAAAAApwbGF5ZXJSb2xlAAAADXJhbmdlUG9zaXRpb24JAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAABGdhbWUJAAGkAAAAAQUAAAAGZ2FtZUlkAgAAAAFfBQAAAApwbGF5ZXJSb2xlAgAAAAFfBQAAAA1yYW5nZVBvc2l0aW9uAgAAAAZSYXJpdHkBAAAACWdldFJhcml0eQAAAAMAAAAGZ2FtZUlkAAAACnBsYXllclJvbGUAAAANcmFuZ2VQb3NpdGlvbgkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAAMZ2V0UmFyaXR5S2V5AAAAAwUAAAAGZ2FtZUlkBQAAAApwbGF5ZXJSb2xlBQAAAA1yYW5nZVBvc2l0aW9uAQAAAAxnZXREdWNrSWRLZXkAAAADAAAABmdhbWVJZAAAAApwbGF5ZXJSb2xlAAAADXJhbmdlUG9zaXRpb24JAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAABGdhbWUJAAGkAAAAAQUAAAAGZ2FtZUlkAgAAAAFfBQAAAApwbGF5ZXJSb2xlAgAAAAFfBQAAAA1yYW5nZVBvc2l0aW9uAgAAAAZEdWNrSWQBAAAACWdldER1Y2tJZAAAAAMAAAAGZ2FtZUlkAAAACnBsYXllclJvbGUAAAANcmFuZ2VQb3NpdGlvbgkBAAAADHRyeUdldFN0cmluZwAAAAEJAQAAAAxnZXREdWNrSWRLZXkAAAADBQAAAAZnYW1lSWQFAAAACnBsYXllclJvbGUFAAAADXJhbmdlUG9zaXRpb24BAAAADGdldENvbW1pdEtleQAAAAIAAAAGZ2FtZUlkAAAACnBsYXllclJvbGUJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAEZ2FtZQkAAaQAAAABBQAAAAZnYW1lSWQCAAAAAV8FAAAACnBsYXllclJvbGUCAAAAB19jb21taXQBAAAACWdldENvbW1pdAAAAAIAAAAGZ2FtZUlkAAAACnBsYXllclJvbGUJAQAAAAx0cnlHZXRTdHJpbmcAAAABCQEAAAAMZ2V0Q29tbWl0S2V5AAAAAgUAAAAGZ2FtZUlkBQAAAApwbGF5ZXJSb2xlAQAAAA9nZXREdWNrT3JkZXJLZXkAAAACAAAABmdhbWVJZAAAAApwbGF5ZXJSb2xlCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAABGdhbWUJAAGkAAAAAQUAAAAGZ2FtZUlkAgAAAAFfBQAAAApwbGF5ZXJSb2xlAgAAAApfZHVja09yZGVyAQAAAAxnZXREdWNrT3JkZXIAAAACAAAABmdhbWVJZAAAAApwbGF5ZXJSb2xlCQEAAAAMdHJ5R2V0U3RyaW5nAAAAAQkBAAAAD2dldER1Y2tPcmRlcktleQAAAAIFAAAABmdhbWVJZAUAAAAKcGxheWVyUm9sZQEAAAAQZ2V0R2FtZVJlc3VsdEtleQAAAAIAAAAGZ2FtZUlkAAAADXBsYXllckFkZHJlc3MJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAEZ2FtZQkAAaQAAAABBQAAAAZnYW1lSWQCAAAAAV8FAAAADXBsYXllckFkZHJlc3MCAAAAB19yZXN1bHQBAAAADWdldEdhbWVSZXN1bHQAAAACAAAABmdhbWVJZAAAAA1wbGF5ZXJBZGRyZXNzCQEAAAAMdHJ5R2V0U3RyaW5nAAAAAQkBAAAAEGdldEdhbWVSZXN1bHRLZXkAAAACBQAAAAZnYW1lSWQFAAAADXBsYXllckFkZHJlc3MBAAAAD2dldEdhbWVQcml6ZUtleQAAAAIAAAAGZ2FtZUlkAAAADXBsYXllckFkZHJlc3MJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgIAAAAEZ2FtZQkAAaQAAAABBQAAAAZnYW1lSWQCAAAAAV8FAAAADXBsYXllckFkZHJlc3MCAAAABl9wcml6ZQEAAAAMZ2V0R2FtZVByaXplAAAAAgAAAAZnYW1lSWQAAAANcGxheWVyQWRkcmVzcwkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAAPZ2V0R2FtZVByaXplS2V5AAAAAgUAAAAGZ2FtZUlkBQAAAA1wbGF5ZXJBZGRyZXNzAQAAABBnZXRQbGF5ZXJXaW5zS2V5AAAAAQAAAA1wbGF5ZXJBZGRyZXNzCQABLAAAAAIFAAAADXBsYXllckFkZHJlc3MCAAAABV93aW5zAQAAAA1nZXRQbGF5ZXJXaW5zAAAAAQAAAA1wbGF5ZXJBZGRyZXNzCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAABBnZXRQbGF5ZXJXaW5zS2V5AAAAAQUAAAANcGxheWVyQWRkcmVzcwEAAAARZ2V0UGxheWVyTG9zZXNLZXkAAAABAAAADXBsYXllckFkZHJlc3MJAAEsAAAAAgUAAAANcGxheWVyQWRkcmVzcwIAAAAGX2xvc2VzAQAAAA5nZXRQbGF5ZXJMb3NlcwAAAAEAAAANcGxheWVyQWRkcmVzcwkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAARZ2V0UGxheWVyTG9zZXNLZXkAAAABBQAAAA1wbGF5ZXJBZGRyZXNzAQAAABFnZXRQbGF5ZXJEcmF3c0tleQAAAAEAAAANcGxheWVyQWRkcmVzcwkAASwAAAACBQAAAA1wbGF5ZXJBZGRyZXNzAgAAAAZfZHJhd3MBAAAADmdldFBsYXllckRyYXdzAAAAAQAAAA1wbGF5ZXJBZGRyZXNzCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAABFnZXRQbGF5ZXJEcmF3c0tleQAAAAEFAAAADXBsYXllckFkZHJlc3MBAAAAEWdldEdhbWVzUGxheWVkS2V5AAAAAAIAAAALZ2FtZXNQbGF5ZWQBAAAADmdldEdhbWVzUGxheWVkAAAAAAkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAARZ2V0R2FtZXNQbGF5ZWRLZXkAAAAAAQAAAA9nZXRGYXJtaW5nUG93ZXIAAAACAAAAB2FkZHJlc3MAAAAHYXNzZXRJZAQAAAAHJG1hdGNoMAkABBoAAAACCQEAAAAHQWRkcmVzcwAAAAEFAAAADmZhcm1pbmdBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAACGFkZHJlc3NfBQAAAAdhZGRyZXNzAgAAAAdfYXNzZXRfBQAAAAdhc3NldElkAgAAAA1fZmFybWluZ1Bvd2VyAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAmZwBQAAAAckbWF0Y2gwBQAAAAJmcAAAAAAAAAAAAAEAAAAOY2hlY2tEdWNrT3duZXIAAAACAAAADG93bmVyQWRkcmVzcwAAAAdhc3NldElkAwkAAGYAAAACCQAD8AAAAAIFAAAADG93bmVyQWRkcmVzcwUAAAAHYXNzZXRJZAAAAAAAAAAAAAYJAABmAAAAAgkBAAAAD2dldEZhcm1pbmdQb3dlcgAAAAIJAAJYAAAAAQgFAAAADG93bmVyQWRkcmVzcwAAAAVieXRlcwkAAlgAAAABBQAAAAdhc3NldElkAAAAAAAAAAAAAQAAAAhnZXRTY29yZQAAAAIAAAABYQAAAAFiAwkAAGYAAAACBQAAAAFhBQAAAAFiAAAAAAAAAAABAwkAAGYAAAACBQAAAAFiBQAAAAFhAP//////////AAAAAAAAAAAAAQAAAAlnZXRXaW5uZXIAAAABAAAABmdhbWVJZAQAAAAIZ2FtZVN0ZXAJAQAAAAdnZXRTdGVwAAAAAQUAAAAGZ2FtZUlkAwkAAGYAAAACAAAAAAAAAAAGBQAAAAhnYW1lU3RlcAQAAAAQZXhwaXJhdGlvbkhlaWdodAkBAAAAE2dldEV4cGlyYXRpb25IZWlnaHQAAAABBQAAAAZnYW1lSWQDCQAAAAAAAAIFAAAAEGV4cGlyYXRpb25IZWlnaHQAAAAAAAAAAAAJAAACAAAAAQIAAAATR2FtZSBpcyBub3Qgc3RhcnRlZAMJAABmAAAAAgUAAAAQZXhwaXJhdGlvbkhlaWdodAUAAAAGaGVpZ2h0CQAAAgAAAAECAAAAH0dhbWUgaXMgbm90IGZpbmlzaGVkIG9yIGV4cGlyZWQDCQAAAAAAAAIJAABqAAAAAgkBAAAAB2dldFN0ZXAAAAABBQAAAAZnYW1lSWQAAAAAAAAAAAIAAAAAAAAAAAACAAAABW1ha2VyAgAAAAV0YWtlcgQAAAAObWFrZXJEdWNrT3JkZXIJAAS1AAAAAgkBAAAADGdldER1Y2tPcmRlcgAAAAIFAAAABmdhbWVJZAIAAAAFbWFrZXICAAAAASwEAAAADnRha2VyRHVja09yZGVyCQAEtQAAAAIJAQAAAAxnZXREdWNrT3JkZXIAAAACBQAAAAZnYW1lSWQCAAAABXRha2VyAgAAAAEsBAAAAAxtYWtlclJhcml0eTEJAQAAAAlnZXRSYXJpdHkAAAADBQAAAAZnYW1lSWQCAAAABW1ha2VyCQABkQAAAAIFAAAADm1ha2VyRHVja09yZGVyAAAAAAAAAAAABAAAAAxtYWtlclJhcml0eTIJAQAAAAlnZXRSYXJpdHkAAAADBQAAAAZnYW1lSWQCAAAABW1ha2VyCQABkQAAAAIFAAAADm1ha2VyRHVja09yZGVyAAAAAAAAAAABBAAAAAxtYWtlclJhcml0eTMJAQAAAAlnZXRSYXJpdHkAAAADBQAAAAZnYW1lSWQCAAAABW1ha2VyCQABkQAAAAIFAAAADm1ha2VyRHVja09yZGVyAAAAAAAAAAACBAAAAAx0YWtlclJhcml0eTEJAQAAAAlnZXRSYXJpdHkAAAADBQAAAAZnYW1lSWQCAAAABXRha2VyCQABkQAAAAIFAAAADnRha2VyRHVja09yZGVyAAAAAAAAAAAABAAAAAx0YWtlclJhcml0eTIJAQAAAAlnZXRSYXJpdHkAAAADBQAAAAZnYW1lSWQCAAAABXRha2VyCQABkQAAAAIFAAAADnRha2VyRHVja09yZGVyAAAAAAAAAAABBAAAAAx0YWtlclJhcml0eTMJAQAAAAlnZXRSYXJpdHkAAAADBQAAAAZnYW1lSWQCAAAABXRha2VyCQABkQAAAAIFAAAADnRha2VyRHVja09yZGVyAAAAAAAAAAACBAAAAAptYWtlclNjb3JlCQAAZAAAAAIJAABkAAAAAgkBAAAACGdldFNjb3JlAAAAAgUAAAAMbWFrZXJSYXJpdHkxBQAAAAx0YWtlclJhcml0eTEJAQAAAAhnZXRTY29yZQAAAAIFAAAADG1ha2VyUmFyaXR5MgUAAAAMdGFrZXJSYXJpdHkyCQEAAAAIZ2V0U2NvcmUAAAACBQAAAAxtYWtlclJhcml0eTMFAAAADHRha2VyUmFyaXR5MwMJAABmAAAAAgUAAAAKbWFrZXJTY29yZQAAAAAAAAAAAAIAAAAFbWFrZXIDCQAAZgAAAAIAAAAAAAAAAAAFAAAACm1ha2VyU2NvcmUCAAAABXRha2VyAgAAAARkcmF3AAAABwAAAAFpAQAAAAhtYWtlR2FtZQAAAAQAAAAEc2xvdAAAABByYXJpdHlSYW5nZVdvcnN0AAAAEXJhcml0eVJhbmdlTWVkaXVtAAAAD3Jhcml0eVJhbmdlQmVzdAQAAAANY2FsbGVyQWRkcmVzcwkAAlgAAAABCAgFAAAAAWkAAAAGY2FsbGVyAAAABWJ5dGVzBAAAAApzbG90R2FtZUlkCQEAAAAHZ2V0U2xvdAAAAAEFAAAABHNsb3QEAAAAB3BheW1lbnQJAQAAAAV2YWx1ZQAAAAEJAAGRAAAAAggFAAAAAWkAAAAIcGF5bWVudHMAAAAAAAAAAAAEAAAABGVnZ3MIBQAAAAdwYXltZW50AAAABmFtb3VudAQAAAAGZ2FtZUlkCQEAAAANZ2V0TmV4dEdhbWVJZAAAAAADCQEAAAACIT0AAAACCQEAAAAUZ2V0UGxheWVyQ3VycmVudEdhbWUAAAABBQAAAA1jYWxsZXJBZGRyZXNzAAAAAAAAAAAACQAAAgAAAAECAAAAH1lvdSBhbHJlYWR5IGhhdmUgYW4gYWN0aXZlIGdhbWUDAwkAAGYAAAACAAAAAAAAAAAABQAAAARzbG90BgkAAGcAAAACBQAAAARzbG90BQAAAAVTTE9UUwkAAAIAAAABAgAAAAxJbnZhbGlkIHNsb3QDCQEAAAACIT0AAAACBQAAAApzbG90R2FtZUlkAAAAAAAAAAAACQAAAgAAAAECAAAAEVRoaXMgc2xvdCBpcyBidXN5AwkBAAAAAiE9AAAAAggFAAAAB3BheW1lbnQAAAAHYXNzZXRJZAUAAAALZWdnc0Fzc2V0SWQJAAACAAAAAQkAASwAAAACAgAAADZZb3UgY2FuIGF0dGFjaCBvbmx5IEVHR3Mgd2l0aCB0aGUgZm9sbG93aW5nIGFzc2V0IGlkOiAJAAJYAAAAAQUAAAALZWdnc0Fzc2V0SWQDCQEAAAACIT0AAAACBQAAAARlZ2dzAAAAAAAAAAABCQAAAgAAAAECAAAAJUJldCBtdXN0IGJlIDAuMDEgRUdHIGR1cmluZyBiZXRhIHRlc3QDAwkAAGYAAAACAAAAAAAAAAABBQAAABByYXJpdHlSYW5nZVdvcnN0BgkAAGYAAAACBQAAABByYXJpdHlSYW5nZVdvcnN0AAAAAAAAAAAFCQAAAgAAAAECAAAAJ0ludmFsaWQgcmFyaXR5IHJhbmdlIGZvciB0aGUgd29yc3QgZHVjawMDCQAAZgAAAAIAAAAAAAAAAAEFAAAAEXJhcml0eVJhbmdlTWVkaXVtBgkAAGYAAAACBQAAABFyYXJpdHlSYW5nZU1lZGl1bQAAAAAAAAAABQkAAAIAAAABAgAAAChJbnZhbGlkIHJhcml0eSByYW5nZSBmb3IgdGhlIG1lZGl1bSBkdWNrAwMJAABmAAAAAgAAAAAAAAAAAQUAAAAPcmFyaXR5UmFuZ2VCZXN0BgkAAGYAAAACBQAAAA9yYXJpdHlSYW5nZUJlc3QAAAAAAAAAAAUJAAACAAAAAQIAAAAmSW52YWxpZCByYXJpdHkgcmFuZ2UgZm9yIHRoZSBiZXN0IGR1Y2sDCQAAZgAAAAIFAAAAEHJhcml0eVJhbmdlV29yc3QFAAAAEXJhcml0eVJhbmdlTWVkaXVtCQAAAgAAAAECAAAAMVRoZSBtZWRpdW0gcmFuZ2UgY2FuJ3QgYmUgbGVzcyB0aGFuIHRoZSB3b3JzdCBvbmUDCQAAZgAAAAIFAAAAEXJhcml0eVJhbmdlTWVkaXVtBQAAAA9yYXJpdHlSYW5nZUJlc3QJAAACAAAAAQIAAAAxVGhlIGJlc3QgcmFuZ2UgY2FuJ3QgYmUgd29yc2UgdGhhbiB0aGUgbWVkaXVtIG9uZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAF2dldFBsYXllckN1cnJlbnRHYW1lS2V5AAAAAQUAAAANY2FsbGVyQWRkcmVzcwUAAAAGZ2FtZUlkCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAtnZXRNYWtlcktleQAAAAEFAAAABmdhbWVJZAUAAAANY2FsbGVyQWRkcmVzcwkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAQZ2V0UGxheWVyUm9sZUtleQAAAAIFAAAABmdhbWVJZAUAAAANY2FsbGVyQWRkcmVzcwIAAAAFbWFrZXIJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAA1nZXRCZXRFZ2dzS2V5AAAAAQUAAAAGZ2FtZUlkBQAAAARlZ2dzCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAARZ2V0UmFyaXR5UmFuZ2VLZXkAAAACBQAAAAZnYW1lSWQCAAAABXdvcnN0BQAAABByYXJp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AAAAAQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwQAAAAGZ2FtZUlkCQEAAAAUZ2V0UGxheWVyQ3VycmVudEdhbWUAAAABBQAAAA1jYWxsZXJBZGRyZXNzBAAAAApwbGF5ZXJSb2xlCQEAAAANZ2V0UGxheWVyUm9sZQAAAAIFAAAABmdhbWVJZAUAAAANY2FsbGVyQWRkcmVzcwQAAAAIZ2FtZVN0ZXAJAQAAAAdnZXRTdGVwAAAAAQUAAAAGZ2FtZUlkBAAAABB3b3JzdFJhcml0eVJhbmdlCQEAAAAOZ2V0UmFyaXR5UmFuZ2UAAAACBQAAAAZnYW1lSWQCAAAABXdvcnN0BAAAABFtZWRpdW1SYXJpdHlSYW5nZQkBAAAADmdldFJhcml0eVJhbmdlAAAAAgUAAAAGZ2FtZUlkAgAAAAZtZWRpdW0EAAAAD2Jlc3RSYXJpdHlSYW5nZQkBAAAADmdldFJhcml0eVJhbmdlAAAAAgUAAAAGZ2FtZUlkAgAAAARiZXN0BAAAAA5pbnZva2VXb3JzdFJlcwkAA/wAAAAECQEAAAAHQWRkcmVzcwAAAAEFAAAAFXJhcml0eVByb3ZpZGVyQWRkcmVzcwIAAAAOZ2V0QXNzZXRSYXJpdHkJAARMAAAAAgUAAAALd29yc3REdWNrSWQFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAA5pbnZva2VXb3JzdFJlcwUAAAAOaW52b2tlV29yc3RSZXMEAAAAC3dvcnN0UmFyaXR5BAAAAAckbWF0Y2gwBQAAAA5pbnZva2VXb3JzdFJlcwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFyBQAAAAckbWF0Y2gwBQAAAAFyCQAAAgAAAAECAAAAF0luY29ycmVjdCBpbnZva2UgcmVzdWx0BAAAAA9pbnZva2VNZWRpdW1SZXMJAAP8AAAABAkBAAAAB0FkZHJlc3MAAAABBQAAABVyYXJpdHlQcm92aWRlckFkZHJlc3MCAAAADmdldEFzc2V0UmFyaXR5CQAETAAAAAIFAAAADG1lZGl1bUR1Y2tJZAUAAAADbmlsBQAAAANuaWwDCQAAAAAAAAIFAAAAD2ludm9rZU1lZGl1bVJlcwUAAAAPaW52b2tlTWVkaXVtUmVzBAAAAAxtZWRpdW1S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Z2V0VGFrZXIAAAABBQAAAAZnYW1lSWQJAQAAAAhnZXRNYWtlcgAAAAEFAAAABmdhbWVJZAQAAAAYYW5vdGhlclBsYXllckN1cnJlbnRHYW1lCQEAAAAUZ2V0UGxheWVyQ3VycmVudEdhbWUAAAABBQAAABRhbm90aGVyUGxheWVyQWRkcmVzcwQAAAAGd2lubmVyCQEAAAAJZ2V0V2lubmVyAAAAAQUAAAAGZ2FtZUlkAwkAAAAAAAACBQAAAAZnYW1lSWQAAAAAAAAAAAAJAAACAAAAAQIAAAAdWW91IGRvbid0IGhhdmUgYW4gYWN0aXZlIGdhbWUDCQAAAAAAAAIFAAAABndpbm5lcgUAAAAKcGxheWVyUm9sZQQAAAADYmV0CQEAAAAKZ2V0QmV0RWdncwAAAAEFAAAABmdhbWVJZAMJAAAAAAAAAgUAAAAYYW5vdGhlclBsYXllckN1cnJlbnRHYW1lBQAAAAZnYW1lSWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABdnZXRQbGF5ZXJDdXJyZW50R2FtZUtleQAAAAEFAAAADWNhbGxlckFkZHJlc3MAAAAAAAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABdnZXRQbGF5ZXJDdXJyZW50R2FtZUtleQAAAAEFAAAAFGFub3RoZXJQbGF5ZXJBZGRyZXNzAAAAAAAAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAQZ2V0UGxheWVyV2luc0tleQAAAAEFAAAADWNhbGxlckFkZHJlc3MJAABkAAAAAgkBAAAADWdldFBsYXllcldpbnMAAAABBQAAAA1jYWxsZXJBZGRyZXNzAAAAAAAAAAABCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAARZ2V0UGxheWVyTG9zZXNLZXkAAAABBQAAABRhbm90aGVyUGxheWVyQWRkcmVzcwkAAGQAAAACCQEAAAAOZ2V0UGxheWVyTG9zZXMAAAABBQAAABRhbm90aGVyUGxheWVyQWRkcmVzcwAAAAAAAAAAAQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAQZ2V0R2FtZVJlc3VsdEtleQAAAAIFAAAABmdhbWVJZAUAAAANY2FsbGVyQWRkcmVzcwIAAAADd2luCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBnZXRHYW1lUmVzdWx0S2V5AAAAAgUAAAAGZ2FtZUlkBQAAABRhbm90aGVyUGxheWVyQWRkcmVzcwIAAAAEbG9zZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAD2dldEdhbWVQcml6ZUtleQAAAAIFAAAABmdhbWVJZAUAAAANY2FsbGVyQWRkcmVzcwUAAAADYmV0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAPZ2V0R2FtZVByaXplS2V5AAAAAgUAAAAGZ2FtZUlkBQAAABRhbm90aGVyUGxheWVyQWRkcmVzcwkBAAAAAS0AAAABBQAAAANiZXQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyCQAAaAAAAAIJAQAAAApnZXRCZXRFZ2dzAAAAAQUAAAAGZ2FtZUlkAAAAAAAAAAACBQAAAAtlZ2dzQXNzZXRJZAUAAAADbmlsCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAXZ2V0UGxheWVyQ3VycmVudEdhbWVLZXkAAAABBQAAAA1jYWxsZXJBZGRyZXNzAAAAAAAAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAQZ2V0UGxheWVyV2luc0tleQAAAAEFAAAADWNhbGxlckFkZHJlc3MJAABkAAAAAgkBAAAADWdldFBsYXllcldpbnMAAAABBQAAAA1jYWxsZXJBZGRyZXNzAAAAAAAAAAABCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAARZ2V0UGxheWVyTG9zZXNLZXkAAAABBQAAABRhbm90aGVyUGxheWVyQWRkcmVzcwkAAGQAAAACCQEAAAAOZ2V0UGxheWVyTG9zZXMAAAABBQAAABRhbm90aGVyUGxheWVyQWRkcmVzcwAAAAAAAAAAAQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAQZ2V0R2FtZVJlc3VsdEtleQAAAAIFAAAABmdhbWVJZAUAAAANY2FsbGVyQWRkcmVzcwIAAAADd2luCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBnZXRHYW1lUmVzdWx0S2V5AAAAAgUAAAAGZ2FtZUlkBQAAABRhbm90aGVyUGxheWVyQWRkcmVzcwIAAAAEbG9zZQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAD2dldEdhbWVQcml6ZUtleQAAAAIFAAAABmdhbWVJZAUAAAANY2FsbGVyQWRkcmVzcwUAAAADYmV0CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAPZ2V0R2FtZVByaXplS2V5AAAAAgUAAAAGZ2FtZUlkBQAAABRhbm90aGVyUGxheWVyQWRkcmVzcwkBAAAAAS0AAAABBQAAAANiZXQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwgFAAAAAWkAAAAGY2FsbGVyCQAAaAAAAAIJAQAAAApnZXRCZXRFZ2dzAAAAAQUAAAAGZ2FtZUlkAAAAAAAAAAACBQAAAAtlZ2dzQXNzZXRJZAUAAAADbmlsAwkAAAAAAAACBQAAAAZ3aW5uZXICAAAABGRyYXcJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABdnZXRQbGF5ZXJDdXJyZW50R2FtZUtleQAAAAEFAAAADWNhbGxlckFkZHJlc3MAAAAAAAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABFnZXRQbGF5ZXJEcmF3c0tleQAAAAEFAAAADWNhbGxlckFkZHJlc3MJAABkAAAAAgkBAAAADmdldFBsYXllckRyYXdzAAAAAQUAAAANY2FsbGVyQWRkcmVzcwAAAAAAAAAAAQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAQZ2V0R2FtZVJlc3VsdEtleQAAAAIFAAAABmdhbWVJZAUAAAANY2FsbGVyQWRkcmVzcwIAAAAEZHJhdwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAD2dldEdhbWVQcml6ZUtleQAAAAIFAAAABmdhbWVJZAUAAAANY2FsbGVyQWRkcmVzcwAAAAAAAAAAAAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIJAQAAAApnZXRCZXRFZ2dzAAAAAQUAAAAGZ2FtZUlkBQAAAAtlZ2dzQXNzZXRJZAUAAAADbmlsCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAXZ2V0UGxheWVyQ3VycmVudEdhbWVLZXkAAAABBQAAAA1jYWxsZXJBZGRyZXNzAAAAAAAAAAAABQAAAANuaWwAAAABAAAAAnR4AQAAAAZ2ZXJpZnkAAAAACQAB9AAAAAMIBQAAAAJ0eAAAAAlib2R5Qnl0ZXMJAAGRAAAAAggFAAAAAnR4AAAABnByb29mcwAAAAAAAAAAAAgFAAAAAnR4AAAAD3NlbmRlclB1YmxpY0tleWZePmg=", "height": 1702554, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: DWsNfa7Fy7sePxsPSaL8vMtwUvq4313c1UBzyhTDXV13 Next: 9jh9CbeqJpiPwgoNSm7p272anEpaLCeWFvJ6mojJhWhE Diff:
OldNewDifferences
283283
284284 @Callable(i)
285285 func kickGame (slot) = {
286+ let callerAddress = toBase58String(i.caller.bytes)
286287 let gameId = getSlot(slot)
288+ let maker = getMaker(gameId)
287289 if (if ((0 > slot))
288290 then true
289291 else (slot >= SLOTS))
290292 then throw("Invalid slot")
291293 else if ((gameId == 0))
292294 then throw("Slot is empty")
293- else if ((getWaitingExpirationHeight(gameId) > height))
295+ else if (if ((callerAddress != maker))
296+ then (getWaitingExpirationHeight(gameId) > height)
297+ else false)
294298 then throw("Waiting is not finished yet")
295- else {
296- let maker = getMaker(gameId)
297-[IntegerEntry(getPlayerCurrentGameKey(maker), 0), IntegerEntry(getSlotKey(slot), 0), ScriptTransfer(Address(fromBase58String(maker)), getBetEggs(gameId), eggsAssetId)]
298- }
299+ else [IntegerEntry(getPlayerCurrentGameKey(maker), 0), IntegerEntry(getSlotKey(slot), 0), ScriptTransfer(Address(fromBase58String(maker)), getBetEggs(gameId), eggsAssetId)]
299300 }
300301
301302
475476 let anotherPlayerAddress = if ((playerRole == "maker"))
476477 then getTaker(gameId)
477478 else getMaker(gameId)
479+ let anotherPlayerCurrentGame = getPlayerCurrentGame(anotherPlayerAddress)
478480 let winner = getWinner(gameId)
479481 if ((gameId == 0))
480482 then throw("You don't have an active game")
481483 else if ((winner == playerRole))
482484 then {
483485 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)]
486+ if ((anotherPlayerCurrentGame == gameId))
487+ 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"), IntegerEntry(getGamePrizeKey(gameId, callerAddress), bet), IntegerEntry(getGamePrizeKey(gameId, anotherPlayerAddress), -(bet)), ScriptTransfer(i.caller, (getBetEggs(gameId) * 2), eggsAssetId)]
488+ else [IntegerEntry(getPlayerCurrentGameKey(callerAddress), 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)]
485489 }
486490 else if ((winner == "draw"))
487491 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)]
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))
136136
137137
138138 func getGamePrizeKey (gameId,playerAddress) = (((("game" + toString(gameId)) + "_") + playerAddress) + "_prize")
139139
140140
141141 func getGamePrize (gameId,playerAddress) = tryGetInteger(getGamePrizeKey(gameId, playerAddress))
142142
143143
144144 func getPlayerWinsKey (playerAddress) = (playerAddress + "_wins")
145145
146146
147147 func getPlayerWins (playerAddress) = tryGetInteger(getPlayerWinsKey(playerAddress))
148148
149149
150150 func getPlayerLosesKey (playerAddress) = (playerAddress + "_loses")
151151
152152
153153 func getPlayerLoses (playerAddress) = tryGetInteger(getPlayerLosesKey(playerAddress))
154154
155155
156156 func getPlayerDrawsKey (playerAddress) = (playerAddress + "_draws")
157157
158158
159159 func getPlayerDraws (playerAddress) = tryGetInteger(getPlayerDrawsKey(playerAddress))
160160
161161
162162 func getGamesPlayedKey () = "gamesPlayed"
163163
164164
165165 func getGamesPlayed () = tryGetInteger(getGamesPlayedKey())
166166
167167
168168 func getFarmingPower (address,assetId) = match getInteger(Address(farmingAddress), (((("address_" + address) + "_asset_") + assetId) + "_farmingPower")) {
169169 case fp: Int =>
170170 fp
171171 case _ =>
172172 0
173173 }
174174
175175
176176 func checkDuckOwner (ownerAddress,assetId) = if ((assetBalance(ownerAddress, assetId) > 0))
177177 then true
178178 else (getFarmingPower(toBase58String(ownerAddress.bytes), toBase58String(assetId)) > 0)
179179
180180
181181 func getScore (a,b) = if ((a > b))
182182 then 1
183183 else if ((b > a))
184184 then -1
185185 else 0
186186
187187
188188 func getWinner (gameId) = {
189189 let gameStep = getStep(gameId)
190190 if ((6 > gameStep))
191191 then {
192192 let expirationHeight = getExpirationHeight(gameId)
193193 if ((expirationHeight == 0))
194194 then throw("Game is not started")
195195 else if ((expirationHeight > height))
196196 then throw("Game is not finished or expired")
197197 else if (((getStep(gameId) % 2) == 0))
198198 then "maker"
199199 else "taker"
200200 }
201201 else {
202202 let makerDuckOrder = split(getDuckOrder(gameId, "maker"), ",")
203203 let takerDuckOrder = split(getDuckOrder(gameId, "taker"), ",")
204204 let makerRarity1 = getRarity(gameId, "maker", makerDuckOrder[0])
205205 let makerRarity2 = getRarity(gameId, "maker", makerDuckOrder[1])
206206 let makerRarity3 = getRarity(gameId, "maker", makerDuckOrder[2])
207207 let takerRarity1 = getRarity(gameId, "taker", takerDuckOrder[0])
208208 let takerRarity2 = getRarity(gameId, "taker", takerDuckOrder[1])
209209 let takerRarity3 = getRarity(gameId, "taker", takerDuckOrder[2])
210210 let makerScore = ((getScore(makerRarity1, takerRarity1) + getScore(makerRarity2, takerRarity2)) + getScore(makerRarity3, takerRarity3))
211211 if ((makerScore > 0))
212212 then "maker"
213213 else if ((0 > makerScore))
214214 then "taker"
215215 else "draw"
216216 }
217217 }
218218
219219
220220 @Callable(i)
221221 func makeGame (slot,rarityRangeWorst,rarityRangeMedium,rarityRangeBest) = {
222222 let callerAddress = toBase58String(i.caller.bytes)
223223 let slotGameId = getSlot(slot)
224224 let payment = value(i.payments[0])
225225 let eggs = payment.amount
226226 let gameId = getNextGameId()
227227 if ((getPlayerCurrentGame(callerAddress) != 0))
228228 then throw("You already have an active game")
229229 else if (if ((0 > slot))
230230 then true
231231 else (slot >= SLOTS))
232232 then throw("Invalid slot")
233233 else if ((slotGameId != 0))
234234 then throw("This slot is busy")
235235 else if ((payment.assetId != eggsAssetId))
236236 then throw(("You can attach only EGGs with the following asset id: " + toBase58String(eggsAssetId)))
237237 else if ((eggs != 1))
238238 then throw("Bet must be 0.01 EGG during beta test")
239239 else if (if ((1 > rarityRangeWorst))
240240 then true
241241 else (rarityRangeWorst > 5))
242242 then throw("Invalid rarity range for the worst duck")
243243 else if (if ((1 > rarityRangeMedium))
244244 then true
245245 else (rarityRangeMedium > 5))
246246 then throw("Invalid rarity range for the medium duck")
247247 else if (if ((1 > rarityRangeBest))
248248 then true
249249 else (rarityRangeBest > 5))
250250 then throw("Invalid rarity range for the best duck")
251251 else if ((rarityRangeWorst > rarityRangeMedium))
252252 then throw("The medium range can't be less than the worst one")
253253 else if ((rarityRangeMedium > rarityRangeBest))
254254 then throw("The best range can't be worse than the medium one")
255255 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))]
256256 }
257257
258258
259259
260260 @Callable(i)
261261 func takeGame (slot) = {
262262 let callerAddress = toBase58String(i.caller.bytes)
263263 let gameId = getSlot(slot)
264264 let payment = value(i.payments[0])
265265 if ((getPlayerCurrentGame(callerAddress) != 0))
266266 then throw("You already have an active game")
267267 else if (if ((0 > slot))
268268 then true
269269 else (slot >= SLOTS))
270270 then throw("Invalid slot")
271271 else if ((getSlot(slot) == 0))
272272 then throw("This slot is empty")
273273 else if ((payment.assetId != eggsAssetId))
274274 then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggsAssetId)))
275275 else if ((payment.amount != getBetEggs(gameId)))
276276 then throw("Insufficient eggs amount")
277277 else if ((height >= getWaitingExpirationHeight(gameId)))
278278 then throw("This game is expired")
279279 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))]
280280 }
281281
282282
283283
284284 @Callable(i)
285285 func kickGame (slot) = {
286+ let callerAddress = toBase58String(i.caller.bytes)
286287 let gameId = getSlot(slot)
288+ let maker = getMaker(gameId)
287289 if (if ((0 > slot))
288290 then true
289291 else (slot >= SLOTS))
290292 then throw("Invalid slot")
291293 else if ((gameId == 0))
292294 then throw("Slot is empty")
293- else if ((getWaitingExpirationHeight(gameId) > height))
295+ else if (if ((callerAddress != maker))
296+ then (getWaitingExpirationHeight(gameId) > height)
297+ else false)
294298 then throw("Waiting is not finished yet")
295- else {
296- let maker = getMaker(gameId)
297-[IntegerEntry(getPlayerCurrentGameKey(maker), 0), IntegerEntry(getSlotKey(slot), 0), ScriptTransfer(Address(fromBase58String(maker)), getBetEggs(gameId), eggsAssetId)]
298- }
299+ else [IntegerEntry(getPlayerCurrentGameKey(maker), 0), IntegerEntry(getSlotKey(slot), 0), ScriptTransfer(Address(fromBase58String(maker)), getBetEggs(gameId), eggsAssetId)]
299300 }
300301
301302
302303
303304 @Callable(i)
304305 func pickDucks (worstDuckId,mediumDuckId,bestDuckId) = {
305306 let callerAddress = toBase58String(i.caller.bytes)
306307 let gameId = getPlayerCurrentGame(callerAddress)
307308 let playerRole = getPlayerRole(gameId, callerAddress)
308309 let gameStep = getStep(gameId)
309310 let worstRarityRange = getRarityRange(gameId, "worst")
310311 let mediumRarityRange = getRarityRange(gameId, "medium")
311312 let bestRarityRange = getRarityRange(gameId, "best")
312313 let invokeWorstRes = invoke(Address(rarityProviderAddress), "getAssetRarity", [worstDuckId], nil)
313314 if ((invokeWorstRes == invokeWorstRes))
314315 then {
315316 let worstRarity = match invokeWorstRes {
316317 case r: Int =>
317318 r
318319 case _ =>
319320 throw("Incorrect invoke result")
320321 }
321322 let invokeMediumRes = invoke(Address(rarityProviderAddress), "getAssetRarity", [mediumDuckId], nil)
322323 if ((invokeMediumRes == invokeMediumRes))
323324 then {
324325 let mediumRarity = match invokeMediumRes {
325326 case r: Int =>
326327 r
327328 case _ =>
328329 throw("Incorrect invoke result")
329330 }
330331 let invokeBestRes = invoke(Address(rarityProviderAddress), "getAssetRarity", [bestDuckId], nil)
331332 if ((invokeBestRes == invokeBestRes))
332333 then {
333334 let bestRarity = match invokeBestRes {
334335 case r: Int =>
335336 r
336337 case _ =>
337338 throw("Incorrect invoke result")
338339 }
339340 if ((gameId == 0))
340341 then throw("You don't have an active game")
341342 else if ((getExpirationHeight(gameId) == 0))
342343 then throw("Game is not started")
343344 else if (if ((gameStep == 0))
344345 then (playerRole != "taker")
345346 else false)
346347 then throw("It is the taker's turn to pick now")
347348 else if (if ((gameStep == 1))
348349 then (playerRole != "maker")
349350 else false)
350351 then throw("It is the maker's turn to pick now")
351352 else if ((gameStep > 1))
352353 then throw("Ducks have already been picked")
353354 else if (!(checkDuckOwner(i.caller, fromBase58String(worstDuckId))))
354355 then throw((("Asset " + worstDuckId) + " doesn't belong to you"))
355356 else if (!(checkDuckOwner(i.caller, fromBase58String(mediumDuckId))))
356357 then throw((("Asset " + mediumDuckId) + " doesn't belong to you"))
357358 else if (!(checkDuckOwner(i.caller, fromBase58String(bestDuckId))))
358359 then throw((("Asset " + bestDuckId) + " doesn't belong to you"))
359360 else if (if ((5 > worstRarityRange))
360361 then if ((worstRarity > (worstRarityRange * 10)))
361362 then true
362363 else (((worstRarityRange - 1) * 10) >= worstRarity)
363364 else false)
364365 then throw("Worst duck doesn't fit rarity range")
365366 else if (if ((5 > mediumRarityRange))
366367 then if ((mediumRarity > (mediumRarityRange * 10)))
367368 then true
368369 else (((mediumRarityRange - 1) * 10) >= mediumRarity)
369370 else false)
370371 then throw("Medium duck doesn't fit rarity range")
371372 else if (if ((5 > bestRarityRange))
372373 then if ((bestRarity > (bestRarityRange * 10)))
373374 then true
374375 else (((bestRarityRange - 1) * 10) >= bestRarity)
375376 else false)
376377 then throw("Best duck doesn't fit rarity range")
377378 else if (if ((worstRarityRange == 5))
378379 then (40 >= worstRarity)
379380 else false)
380381 then throw("Worst duck doesn't fit rarity range")
381382 else if (if ((mediumRarityRange == 5))
382383 then (40 >= mediumRarity)
383384 else false)
384385 then throw("Medium duck doesn't fit rarity range")
385386 else if (if ((bestRarityRange == 5))
386387 then (40 >= bestRarity)
387388 else false)
388389 then throw("Best duck doesn't fit rarity range")
389390 else if (if (if ((worstRarity == mediumRarity))
390391 then true
391392 else (worstRarity == bestRarity))
392393 then true
393394 else (mediumRarity == bestRarity))
394395 then throw("Ducks must have different rarities")
395396 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))]
396397 }
397398 else throw("Strict value is not equal to itself.")
398399 }
399400 else throw("Strict value is not equal to itself.")
400401 }
401402 else throw("Strict value is not equal to itself.")
402403 }
403404
404405
405406
406407 @Callable(i)
407408 func commit (hash) = {
408409 let callerAddress = toBase58String(i.caller.bytes)
409410 let gameId = getPlayerCurrentGame(callerAddress)
410411 let playerRole = getPlayerRole(gameId, callerAddress)
411412 let gameStep = getStep(gameId)
412413 if ((gameId == 0))
413414 then throw("You don't have an active game")
414415 else if ((2 > gameStep))
415416 then throw("Commit is not started")
416417 else if (if ((gameStep == 2))
417418 then (playerRole != "taker")
418419 else false)
419420 then throw("It is the taker's turn to pick now")
420421 else if (if ((gameStep == 3))
421422 then (playerRole != "maker")
422423 else false)
423424 then throw("It is the maker's turn to pick now")
424425 else if ((gameStep > 3))
425426 then throw("Commit is finished")
426427 else [StringEntry(getCommitKey(gameId, playerRole), hash), IntegerEntry(getStepKey(gameId), (gameStep + 1)), IntegerEntry(getExpirationHeightKey(gameId), (height + stepDuration))]
427428 }
428429
429430
430431
431432 @Callable(i)
432433 func reveal (duckOrder,salt) = {
433434 let callerAddress = toBase58String(i.caller.bytes)
434435 let gameId = getPlayerCurrentGame(callerAddress)
435436 let playerRole = getPlayerRole(gameId, callerAddress)
436437 let gameStep = getStep(gameId)
437438 if ((gameId == 0))
438439 then throw("You don't have an active game")
439440 else if ((4 > gameStep))
440441 then throw("Reveal is not started")
441442 else if (if ((gameStep == 4))
442443 then (playerRole != "taker")
443444 else false)
444445 then throw("It is the taker's turn to pick now")
445446 else if (if ((gameStep == 5))
446447 then (playerRole != "maker")
447448 else false)
448449 then throw("It is the maker's turn to pick now")
449450 else if ((gameStep > 5))
450451 then throw("Reveal is finished")
451452 else if (if (if (if (if (if ((duckOrder != "worst,medium,best"))
452453 then (duckOrder != "worst,best,medium")
453454 else false)
454455 then (duckOrder != "medium,worst,best")
455456 else false)
456457 then (duckOrder != "medium,best,worst")
457458 else false)
458459 then (duckOrder != "best,worst,medium")
459460 else false)
460461 then (duckOrder != "best,medium,worst")
461462 else false)
462463 then throw("Reveal data is not valid")
463464 else if ((toBase58String(sha256(toBytes((duckOrder + salt)))) != getCommit(gameId, playerRole)))
464465 then throw("Reveal doesn't match commit")
465466 else [StringEntry(getDuckOrderKey(gameId, playerRole), duckOrder), IntegerEntry(getStepKey(gameId), (gameStep + 1)), IntegerEntry(getExpirationHeightKey(gameId), (height + stepDuration))]
466467 }
467468
468469
469470
470471 @Callable(i)
471472 func getPrize () = {
472473 let callerAddress = toBase58String(i.caller.bytes)
473474 let gameId = getPlayerCurrentGame(callerAddress)
474475 let playerRole = getPlayerRole(gameId, callerAddress)
475476 let anotherPlayerAddress = if ((playerRole == "maker"))
476477 then getTaker(gameId)
477478 else getMaker(gameId)
479+ let anotherPlayerCurrentGame = getPlayerCurrentGame(anotherPlayerAddress)
478480 let winner = getWinner(gameId)
479481 if ((gameId == 0))
480482 then throw("You don't have an active game")
481483 else if ((winner == playerRole))
482484 then {
483485 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)]
486+ if ((anotherPlayerCurrentGame == gameId))
487+ 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"), IntegerEntry(getGamePrizeKey(gameId, callerAddress), bet), IntegerEntry(getGamePrizeKey(gameId, anotherPlayerAddress), -(bet)), ScriptTransfer(i.caller, (getBetEggs(gameId) * 2), eggsAssetId)]
488+ else [IntegerEntry(getPlayerCurrentGameKey(callerAddress), 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)]
485489 }
486490 else if ((winner == "draw"))
487491 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)]
488492 else [IntegerEntry(getPlayerCurrentGameKey(callerAddress), 0)]
489493 }
490494
491495
492496 @Verifier(tx)
493497 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
494498

github/deemru/w8io/169f3d6 
62.43 ms