tx · HLY34fT7CAdnkN3xqaiPyMSyrab7y5c1VcFJPrWBFiup

3N6oaapvYkEryHUr4vAiPRXM3iS6kMYXito:  -0.05000000 Waves

2021.09.09 21:22 [1695865] smart account 3N6oaapvYkEryHUr4vAiPRXM3iS6kMYXito > SELF 0.00000000 Waves

{ "type": 13, "id": "HLY34fT7CAdnkN3xqaiPyMSyrab7y5c1VcFJPrWBFiup", "fee": 5000000, "feeAssetId": null, "timestamp": 1631211731581, "version": 2, "chainId": 84, "sender": "3N6oaapvYkEryHUr4vAiPRXM3iS6kMYXito", "senderPublicKey": "7PMrxEzirv6h9Z2zqLE47qrZd6v1AbRZER5Aqfo95Eyr", "proofs": [ "dXHXHrgB1f8kD7zwqitXybmSXZADdVGs5bxbWxaHUdS6o66MqEXZr4gifd5mueiQG7pTg3h7z2RS6p5wtx2q1Hv" ], "script": "base64:AAIFAAAAAAAAACgIAhIGCgQBAQEBEgMKAQESAwoBARIFCgMICAgSAwoBCBIECgIICBIAAAAANAAAAAAQaW5jdWJhdG9yQWRkcmVzcwEAAAAaAVQu1YzRxAHn1ekAzs1AJJ6xFAc06V7PK6oAAAAADmJyZWVkZXJBZGRyZXNzAQAAABoBVIXmeysidPaPsP+lKHIt9Vw8rE+lS45bjgAAAAAVcmFyaXR5UHJvdmlkZXJBZGRyZXNzAQAAABoBVPqvXAIOK77VhJOb48rzK/MJjwrn6vR1pAAAAAALZWdnc0Fzc2V0SWQBAAAAICUCZcz3BGjIvgFZkXjlWFo4ZhQTrUpMSrf+BRdIFxaDAAAAAAVTTE9UUwAAAAAAAAAACgAAAAAHV0FJVElORwAAAAAAAAAACAAAAAAMc3RlcER1cmF0aW9uAAAAAAAAAAAFAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQAAAANrZXkEAAAAByRtYXRjaDAJAAQaAAAAAgUAAAAEdGhpcwUAAAADa2V5AwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAANJbnQEAAAAAWIFAAAAByRtYXRjaDAFAAAAAWIAAAAAAAAAAAABAAAADHRyeUdldFN0cmluZwAAAAEAAAADa2V5BAAAAAckbWF0Y2gwCQAEHQAAAAIFAAAABHRoaXMFAAAAA2tleQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAAGU3RyaW5nBAAAAAFhBQAAAAckbWF0Y2gwBQAAAAFhAgAAAAABAAAADXRyeUdldEJvb2xlYW4AAAABAAAAA2tleQQAAAAHJG1hdGNoMAkABBsAAAACBQAAAAR0aGlzBQAAAANrZXkDCQAAAQAAAAIFAAAAByRtYXRjaDACAAAAB0Jvb2xlYW4EAAAAAWIFAAAAByRtYXRjaDAFAAAAAWIHAQAAAA1nZXROZXh0R2FtZUlkAAAAAAQAAAAGbmV4dElkCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAECAAAACm5leHRHYW1lSWQDCQAAAAAAAAIFAAAABm5leHRJZAAAAAAAAAAAAAAAAAAAAAAAAQUAAAAGbmV4dElkAQAAABdnZXRQbGF5ZXJDdXJyZW50R2FtZUtleQAAAAEAAAANcGxheWVyQWRkcmVzcwkAASwAAAACBQAAAA1wbGF5ZXJBZGRyZXNzAgAAAAxfY3VycmVudEdhbWUBAAAAFGdldFBsYXllckN1cnJlbnRHYW1lAAAAAQAAAA1wbGF5ZXJBZGRyZXNzCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAABdnZXRQbGF5ZXJDdXJyZW50R2FtZUtleQAAAAEFAAAADXBsYXllckFkZHJlc3MBAAAACmdldFNsb3RLZXkAAAABAAAABHNsb3QJAAEsAAAAAgIAAAAEc2xvdAkAAaQAAAABBQAAAARzbG90AQAAAAdnZXRTbG90AAAAAQAAAARzbG90CQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAAApnZXRTbG90S2V5AAAAAQUAAAAEc2xvdAEAAAAQZ2V0UGxheWVyUm9sZUtleQAAAAIAAAAGZ2FtZUlkAAAADXBsYXllckFkZHJlc3MJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAABGdhbWUJAAGkAAAAAQUAAAAGZ2FtZUlkAgAAAAFfBQAAAA1wbGF5ZXJBZGRyZXNzAQAAAA1nZXRQbGF5ZXJSb2xlAAAAAgAAAAZnYW1lSWQAAAANcGxheWVyQWRkcmVzcwkBAAAADHRyeUdldFN0cmluZwAAAAEJAQAAABBnZXRQbGF5ZXJSb2xlS2V5AAAAAgUAAAAGZ2FtZUlkBQAAAA1wbGF5ZXJBZGRyZXNzAQAAAAtnZXRNYWtlcktleQAAAAEAAAAGZ2FtZUlkCQABLAAAAAIJAAEsAAAAAgIAAAAEZ2FtZQkAAaQAAAABBQAAAAZnYW1lSWQCAAAABl9tYWtlcgEAAAAIZ2V0TWFrZXIAAAABAAAABmdhbWVJZAkBAAAADHRyeUdldFN0cmluZwAAAAEJAQAAAAtnZXRNYWtlcktleQAAAAEFAAAABmdhbWVJZAEAAAALZ2V0VGFrZXJLZXkAAAABAAAABmdhbWVJZAkAASwAAAACCQABLAAAAAICAAAABGdhbWUJAAGkAAAAAQUAAAAGZ2FtZUlkAgAAAAZfdGFrZXIBAAAACGdldFRha2VyAAAAAQAAAAZnYW1lSWQJAQAAAAx0cnlHZXRTdHJpbmcAAAABCQEAAAALZ2V0VGFrZXJLZXkAAAABBQAAAAZnYW1lSWQBAAAADWdldEJldEVnZ3NLZXkAAAABAAAABmdhbWVJZAkAASwAAAACCQABLAAAAAICAAAABGdhbWUJAAGkAAAAAQUAAAAGZ2FtZUlkAgAAAAhfYmV0RWdncwEAAAAKZ2V0QmV0RWdncwAAAAEAAAAGZ2FtZUlkCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAAA1nZXRCZXRFZ2dzS2V5AAAAAQUAAAAGZ2FtZUlkAQAAAB1nZXRXYWl0aW5nRXhwaXJhdGlvbkhlaWdodEtleQAAAAEAAAAGZ2FtZUlkCQABLAAAAAIJAAEsAAAAAgIAAAAEZ2FtZQkAAaQAAAABBQAAAAZnYW1lSWQCAAAAGF93YWl0aW5nRXhwaXJhdGlvbkhlaWdodAEAAAAaZ2V0V2FpdGluZ0V4cGlyYXRpb25IZWlnaHQAAAABAAAABmdhbWVJZAkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAAdZ2V0V2FpdGluZ0V4cGlyYXRpb25IZWlnaHRLZXkAAAABBQAAAAZnYW1lSWQBAAAAFmdldEV4cGlyYXRpb25IZWlnaHRLZXkAAAABAAAABmdhbWVJZAkAASwAAAACCQABLAAAAAICAAAABGdhbWUJAAGkAAAAAQUAAAAGZ2FtZUlkAgAAABFfZXhwaXJhdGlvbkhlaWdodAEAAAATZ2V0RXhwaXJhdGlvbkhlaWdodAAAAAEAAAAGZ2FtZUlkCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAABZnZXRFeHBpcmF0aW9uSGVpZ2h0S2V5AAAAAQUAAAAGZ2FtZUlkAQAAABFnZXRSYXJpdHlSYW5nZUtleQAAAAIAAAAGZ2FtZUlkAAAADXJhbmdlUG9zaXRpb24JAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAABGdhbWUJAAGkAAAAAQUAAAAGZ2FtZUlkAgAAAA1fcmFyaXR5UmFuZ2VfBQAAAA1yYW5nZVBvc2l0aW9uAQAAAA5nZXRSYXJpdHlSYW5nZQAAAAIAAAAGZ2FtZUlkAAAADXJhbmdlUG9zaXRpb24JAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkBAAAAEWdldFJhcml0eVJhbmdlS2V5AAAAAgUAAAAGZ2FtZUlkBQAAAA1yYW5nZVBvc2l0aW9uAQAAAApnZXRTdGVwS2V5AAAAAQAAAAZnYW1lSWQJAAEsAAAAAgkAASwAAAACAgAAAARnYW1lCQABpAAAAAEFAAAABmdhbWVJZAIAAAAFX3N0ZXABAAAAB2dldFN0ZXAAAAABAAAABmdhbWVJZAkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAAKZ2V0U3RlcEtleQAAAAEFAAAABmdhbWVJZAEAAAAMZ2V0UmFyaXR5S2V5AAAAAwAAAAZnYW1lSWQAAAAKcGxheWVyUm9sZQAAAA1yYW5nZVBvc2l0aW9uCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAARnYW1lCQABpAAAAAEFAAAABmdhbWVJZAIAAAABXwUAAAAKcGxheWVyUm9sZQIAAAABXwUAAAANcmFuZ2VQb3NpdGlvbgIAAAAGUmFyaXR5AQAAAAlnZXRSYXJpdHkAAAADAAAABmdhbWVJZAAAAApwbGF5ZXJSb2xlAAAADXJhbmdlUG9zaXRpb24JAQAAAA10cnlHZXRJbnRlZ2VyAAAAAQkBAAAADGdldFJhcml0eUtleQAAAAMFAAAABmdhbWVJZAUAAAAKcGxheWVyUm9sZQUAAAANcmFuZ2VQb3NpdGlvbgEAAAAMZ2V0RHVja0lkS2V5AAAAAwAAAAZnYW1lSWQAAAAKcGxheWVyUm9sZQAAAA1yYW5nZVBvc2l0aW9uCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAARnYW1lCQABpAAAAAEFAAAABmdhbWVJZAIAAAABXwUAAAAKcGxheWVyUm9sZQIAAAABXwUAAAANcmFuZ2VQb3NpdGlvbgIAAAAGRHVja0lkAQAAAAlnZXREdWNrSWQAAAADAAAABmdhbWVJZAAAAApwbGF5ZXJSb2xlAAAADXJhbmdlUG9zaXRpb24JAQAAAAx0cnlHZXRTdHJpbmcAAAABCQEAAAAMZ2V0RHVja0lkS2V5AAAAAwUAAAAGZ2FtZUlkBQAAAApwbGF5ZXJSb2xlBQAAAA1yYW5nZVBvc2l0aW9uAQAAAAxnZXRDb21taXRLZXkAAAACAAAABmdhbWVJZAAAAApwbGF5ZXJSb2xlCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAABGdhbWUJAAGkAAAAAQUAAAAGZ2FtZUlkAgAAAAFfBQAAAApwbGF5ZXJSb2xlAgAAAAdfY29tbWl0AQAAAAlnZXRDb21taXQAAAACAAAABmdhbWVJZAAAAApwbGF5ZXJSb2xlCQEAAAAMdHJ5R2V0U3RyaW5nAAAAAQkBAAAADGdldENvbW1pdEtleQAAAAIFAAAABmdhbWVJZAUAAAAKcGxheWVyUm9sZQEAAAAPZ2V0RHVja09yZGVyS2V5AAAAAgAAAAZnYW1lSWQAAAAKcGxheWVyUm9sZQkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACAgAAAARnYW1lCQABpAAAAAEFAAAABmdhbWVJZAIAAAABXwUAAAAKcGxheWVyUm9sZQIAAAAKX2R1Y2tPcmRlcgEAAAAMZ2V0RHVja09yZGVyAAAAAgAAAAZnYW1lSWQAAAAKcGxheWVyUm9sZQkBAAAADHRyeUdldFN0cmluZwAAAAEJAQAAAA9nZXREdWNrT3JkZXJLZXkAAAACBQAAAAZnYW1lSWQFAAAACnBsYXllclJvbGUBAAAAEGdldEdhbWVSZXN1bHRLZXkAAAACAAAABmdhbWVJZAAAAA1wbGF5ZXJBZGRyZXNzCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAICAAAABGdhbWUJAAGkAAAAAQUAAAAGZ2FtZUlkAgAAAAFfBQAAAA1wbGF5ZXJBZGRyZXNzAgAAAAdfcmVzdWx0AQAAAA1nZXRHYW1lUmVzdWx0AAAAAgAAAAZnYW1lSWQAAAANcGxheWVyQWRkcmVzcwkBAAAADHRyeUdldFN0cmluZwAAAAEJAQAAABBnZXRHYW1lUmVzdWx0S2V5AAAAAgUAAAAGZ2FtZUlkBQAAAA1wbGF5ZXJBZGRyZXNzAQAAABBnZXRQbGF5ZXJXaW5zS2V5AAAAAQAAAA1wbGF5ZXJBZGRyZXNzCQABLAAAAAIFAAAADXBsYXllckFkZHJlc3MCAAAABV93aW5zAQAAAA1nZXRQbGF5ZXJXaW5zAAAAAQAAAA1wbGF5ZXJBZGRyZXNzCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAABBnZXRQbGF5ZXJXaW5zS2V5AAAAAQUAAAANcGxheWVyQWRkcmVzcwEAAAARZ2V0UGxheWVyTG9zZXNLZXkAAAABAAAADXBsYXllckFkZHJlc3MJAAEsAAAAAgUAAAANcGxheWVyQWRkcmVzcwIAAAAGX2xvc2VzAQAAAA5nZXRQbGF5ZXJMb3NlcwAAAAEAAAANcGxheWVyQWRkcmVzcwkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAARZ2V0UGxheWVyTG9zZXNLZXkAAAABBQAAAA1wbGF5ZXJBZGRyZXNzAQAAABFnZXRQbGF5ZXJEcmF3c0tleQAAAAEAAAANcGxheWVyQWRkcmVzcwkAASwAAAACBQAAAA1wbGF5ZXJBZGRyZXNzAgAAAAZfZHJhd3MBAAAADmdldFBsYXllckRyYXdzAAAAAQAAAA1wbGF5ZXJBZGRyZXNzCQEAAAANdHJ5R2V0SW50ZWdlcgAAAAEJAQAAABFnZXRQbGF5ZXJEcmF3c0tleQAAAAEFAAAADXBsYXllckFkZHJlc3MBAAAAEWdldEdhbWVzUGxheWVkS2V5AAAAAAIAAAALZ2FtZXNQbGF5ZWQBAAAADmdldEdhbWVzUGxheWVkAAAAAAkBAAAADXRyeUdldEludGVnZXIAAAABCQEAAAARZ2V0R2FtZXNQbGF5ZWRLZXkAAAAAAQAAAA5jaGVja0R1Y2tPd25lcgAAAAIAAAAMb3duZXJBZGRyZXNzAAAAB2Fzc2V0SWQJAABmAAAAAgkAA/AAAAACBQAAAAxvd25lckFkZHJlc3MFAAAAB2Fzc2V0SWQAAAAAAAAAAAABAAAACGdldFNjb3JlAAAAAgAAAAFhAAAAAWIDCQAAZgAAAAIFAAAAAWEFAAAAAWIAAAAAAAAAAAEDCQAAZgAAAAIFAAAAAWIFAAAAAWEA//////////8AAAAAAAAAAAABAAAACWdldFdpbm5lcgAAAAEAAAAGZ2FtZUlkBAAAAAhnYW1lU3RlcAkBAAAAB2dldFN0ZXAAAAABBQAAAAZnYW1lSWQDCQAAZgAAAAIAAAAAAAAAAAYFAAAACGdhbWVTdGVwBAAAABBleHBpcmF0aW9uSGVpZ2h0CQEAAAATZ2V0RXhwaXJhdGlvbkhlaWdodAAAAAEFAAAABmdhbWVJZAMJAAAAAAAAAgUAAAAQZXhwaXJhdGlvbkhlaWdodAAAAAAAAAAAAAkAAAIAAAABAgAAABNHYW1lIGlzIG5vdCBzdGFydGVk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cmluZ0VudHJ5AAAAAgkBAAAAC2dldE1ha2VyS2V5AAAAAQUAAAAGZ2FtZUlkBQAAAA1jYWxsZXJBZGRyZXNzCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBnZXRQbGF5ZXJSb2xlS2V5AAAAAgUAAAAGZ2FtZUlkBQAAAA1jYWxsZXJBZGRyZXNzAgAAAAVtYWtlcgkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAADWdldEJldEVnZ3NLZXkAAAABBQAAAAZnYW1lSWQFAAAABGVnZ3MJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABFnZXRSYXJpdHlSYW5nZUtleQAAAAIFAAAABmdhbWVJZAIAAAAFd29yc3QFAAAAEHJhcml0eVJhbmdlV29yc3QJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABFnZXRSYXJpdHlSYW5nZUtleQAAAAIFAAAABmdhbWVJZAIAAAAGbWVkaXVtBQAAABFyYXJpdHlSYW5nZU1lZGl1bQkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEWdldFJhcml0eVJhbmdlS2V5AAAAAgUAAAAGZ2FtZUlkAgAAAARiZXN0BQAAAA9yYXJpdHlSYW5nZUJlc3QJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAB1nZXRXYWl0aW5nRXhwaXJhdGlvbkhlaWdodEtleQAAAAEFAAAABmdhbWVJZAkAAGQAAAACBQAAAAZoZWlnaHQFAAAAB1dBSVRJTkcJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAApnZXRTbG90S2V5AAAAAQUAAAAEc2xvdAUAAAAGZ2FtZUlkCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACAgAAAApuZXh0R2FtZUlkCQAAZAAAAAIFAAAABmdhbWVJZAAAAAAAAAAAAQUAAAADbmlsAAAAAWkBAAAACHRha2VHYW1lAAAAAQAAAARzbG90BAAAAA1jYWxsZXJBZGRyZXNzCQACWAAAAAEICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMEAAAABmdhbWVJZAkBAAAAB2dldFNsb3QAAAABBQAAAARzbG90BAAAAAdwYXltZW50CQEAAAAFdmFsdWUAAAABCQABkQAAAAIIBQAAAAFpAAAACHBheW1lbnRzAAAAAAAAAAAAAwkBAAAAAiE9AAAAAgkBAAAAFGdldFBsYXllckN1cnJlbnRHYW1lAAAAAQUAAAANY2FsbGVyQWRkcmVzcwAAAAAAAAAAAAkAAAIAAAABAgAAAB9Zb3UgYWxyZWFkeSBoYXZlIGFuIGFjdGl2ZSBnYW1lAwMJAABmAAAAAgAAAAAAAAAAAAUAAAAEc2xvdAYJAABnAAAAAgUAAAAEc2xvdAUAAAAFU0xPVFMJAAACAAAAAQIAAAAMSW52YWxpZCBzbG90AwkAAAAAAAACCQEAAAAHZ2V0U2xvdAAAAAEFAAAABHNsb3QAAAAAAAAAAAAJAAACAAAAAQIAAAASVGhpcyBzbG90IGlzIGVtcHR5AwkBAAAAAiE9AAAAAggFAAAAB3BheW1lbnQAAAAHYXNzZXRJZAUAAAALZWdnc0Fzc2V0SWQJAAACAAAAAQkAASwAAAACAgAAADxZb3UgY2FuIGF0dGFjaCBvbmx5IEVHRyB0b2tlbnMgd2l0aCB0aGUgZm9sbG93aW5nIGFzc2V0IGlkOiAJAAJYAAAAAQUAAAALZWdnc0Fzc2V0SWQDCQEAAAACIT0AAAACCAUAAAAHcGF5bWVudAAAAAZhbW91bnQJAQAAAApnZXRCZXRFZ2dzAAAAAQUAAAAGZ2FtZUlkCQAAAgAAAAECAAAAGEluc3VmZmljaWVudCBlZ2dzIGFtb3VudAMJAABnAAAAAgUAAAAGaGVpZ2h0CQEAAAAaZ2V0V2FpdGluZ0V4cGlyYXRpb25IZWlnaHQAAAABBQAAAAZnYW1lSWQJAAACAAAAAQIAAAAUVGhpcyBnYW1lIGlzIGV4cGlyZWQJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABdnZXRQbGF5ZXJDdXJyZW50R2FtZUtleQAAAAEFAAAADWNhbGxlckFkZHJlc3MFAAAABmdhbWVJZAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAALZ2V0VGFrZXJLZXkAAAABBQAAAAZnYW1lSWQFAAAADWNhbGxlckFkZHJlc3MJAARMAAAAAgkBAAAAC1N0cmluZ0VudHJ5AAAAAgkBAAAAEGdldFBsYXllclJvbGVLZXkAAAACBQAAAAZnYW1lSWQFAAAADWNhbGxlckFkZHJlc3MCAAAABXRha2VyCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAKZ2V0U3RlcEtleQAAAAEFAAAABmdhbWVJZAAAAAAAAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAFmdldEV4cGlyYXRpb25IZWlnaHRLZXkAAAABBQAAAAZnYW1lSWQJAABkAAAAAgUAAAAGaGVpZ2h0BQAAAAxzdGVwRHVyYXRpb24JAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAApnZXRTbG90S2V5AAAAAQUAAAAEc2xvdAAAAAAAAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgIAAAALZ2FtZXNQbGF5ZWQJAABkAAAAAgkBAAAADmdldEdhbWVzUGxheWVkAAAAAAAAAAAAAAAAAQUAAAADbmlsAAAAAWkBAAAACGtpY2tHYW1lAAAAAQAAAARzbG90BAAAAAZnYW1lSWQJAQAAAAdnZXRTbG90AAAAAQUAAAAEc2xvdAMDCQAAZgAAAAIAAAAAAAAAAAAFAAAABHNsb3QGCQAAZwAAAAIFAAAABHNsb3QFAAAABVNMT1RTCQAAAgAAAAECAAAADEludmFsaWQgc2xvdAMJAAAAAAAAAgUAAAAGZ2FtZUlkAAAAAAAAAAAACQAAAgAAAAECAAAADVNsb3QgaXMgZW1wdHkDCQAAZgAAAAIJAQAAABpnZXRXYWl0aW5nRXhwaXJhdGlvbkhlaWdodAAAAAEFAAAABmdhbWVJZAUAAAAGaGVpZ2h0CQAAAgAAAAECAAAAG1dhaXRpbmcgaXMgbm90IGZpbmlzaGVkIHlldAQAAAAFbWFrZXIJAQAAAAhnZXRNYWtlcgAAAAEFAAAABmdhbWVJZAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAF2dldFBsYXllckN1cnJlbnRHYW1lS2V5AAAAAQUAAAAFbWFrZXIAAAAAAAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAApnZXRTbG90S2V5AAAAAQUAAAAEc2xvdAAAAAAAAAAAAAkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCQEAAAAHQWRkcmVzcwAAAAEJAAJZAAAAAQUAAAAFbWFrZXIJAQAAAApnZXRCZXRFZ2dzAAAAAQUAAAAGZ2FtZUlkBQAAAAtlZ2dzQXNzZXRJZAUAAAADbmlsAAAAAWkBAAAACXBpY2tEdWNrcwAAAAMAAAALd29yc3REdWNrSWQAAAAMbWVkaXVtRHVja0lkAAAACmJlc3REdWNrSWQEAAAADWNhbGxlckFkZHJlc3MJAAJYAAAAAQgIBQAAAAFpAAAABmNhbGxlcgAAAAVieXRlcwQAAAAGZ2FtZUlkCQEAAAAUZ2V0UGxheWVyQ3VycmVudEdhbWUAAAABBQAAAA1jYWxsZXJBZGRyZXNzBAAAAApwbGF5ZXJSb2xlCQEAAAANZ2V0UGxheWVyUm9sZQAAAAIFAAAABmdhbWVJZAUAAAANY2FsbGVyQWRkcmVzcwQAAAAIZ2FtZVN0ZXAJAQAAAAdnZXRTdGVwAAAAAQUAAAAGZ2FtZUlkBAAAABB3b3JzdFJhcml0eVJhbmdlCQEAAAAOZ2V0UmFyaXR5UmFuZ2UAAAACBQAAAAZnYW1lSWQCAAAABXdvcnN0BAAAABFtZWRpdW1SYXJpdHlSYW5nZQkBAAAADmdldFJhcml0eVJhbmdlAAAAAgUAAAAGZ2FtZUlkAgAAAAZtZWRpdW0EAAAAD2Jlc3RSYXJpdHlSYW5nZQkBAAAADmdldFJhcml0eVJhbmdlAAAAAgUAAAAGZ2FtZUlkAgAAAARiZXN0BAAAAA5pbnZva2VXb3JzdFJlcwkAA/wAAAAECQEAAAAHQWRkcmVzcwAAAAEFAAAAFXJhcml0eVByb3ZpZGVyQWRkcmVzcwIAAAAOZ2V0QXNzZXRSYXJpdHkJAARMAAAAAgUAAAALd29yc3REdWNrSWQFAAAAA25pbAUAAAADbmlsAwkAAAAAAAACBQAAAA5pbnZva2VXb3JzdFJlcwUAAAAOaW52b2tlV29yc3RSZXMEAAAAC3dvcnN0UmFyaXR5BAAAAAckbWF0Y2gwBQAAAA5pbnZva2VXb3JzdFJlcwMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAAFyBQAAAAckbWF0Y2gwBQAAAAFyCQAAAgAA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AAAAAAAAAgUAAAAPYmVzdFJhcml0eVJhbmdlAAAAAAAAAAAFCQAAZwAAAAIAAAAAAAAAACgFAAAACmJlc3RSYXJpdHkHCQAAAgAAAAECAAAAIkJlc3QgZHVjayBkb2Vzbid0IGZpdCByYXJpdHkgcmFuZ2UDAwMJAAAAAAAAAgUAAAALd29yc3RSYXJpdHkFAAAADG1lZGl1bVJhcml0eQYJAAAAAAAAAgUAAAALd29yc3RSYXJpdHkFAAAACmJlc3RSYXJpdHkGCQAAAAAAAAIFAAAADG1lZGl1bVJhcml0eQUAAAAKYmVzdFJhcml0eQkAAAIAAAABAgAAACJEdWNrcyBtdXN0IGhhdmUgZGlmZmVyZW50IHJhcml0aWVzCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAMZ2V0UmFyaXR5S2V5AAAAAwUAAAAGZ2FtZUlkBQAAAApwbGF5ZXJSb2xlAgAAAAV3b3JzdAUAAAALd29yc3RSYXJpdHkJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAAAxnZXRSYXJpdHlLZXkAAAADBQAAAAZnYW1lSWQFAAAACnBsYXllclJvbGUCAAAABm1lZGl1bQUAAAAMbWVkaXVtUmFyaXR5CQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAMZ2V0UmFyaXR5S2V5AAAAAwUAAAAGZ2FtZUlkBQAAAApwbGF5ZXJSb2xlAgAAAARiZXN0BQAAAApiZXN0UmFyaXR5CQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAAAxnZXREdWNrSWRLZXkAAAADBQAAAAZnYW1lSWQFAAAACnBsYXllclJvbGUCAAAABXdvcnN0BQAAAAt3b3JzdER1Y2tJZAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAMZ2V0RHVja0lkS2V5AAAAAwUAAAAGZ2FtZUlkBQAAAApwbGF5ZXJSb2xlAgAAAAZtZWRpdW0FAAAADG1lZGl1bUR1Y2tJZAkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAMZ2V0RHVja0lkS2V5AAAAAwUAAAAGZ2FtZUlkBQAAAApwbGF5ZXJSb2xlAgAAAARiZXN0BQAAAApi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AAAAAAEJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABZnZXRFeHBpcmF0aW9uSGVpZ2h0S2V5AAAAAQUAAAAGZ2FtZUlkCQAAZAAAAAIFAAAABmhlaWdodAUAAAAMc3RlcER1cmF0aW9uBQAAAANuaWwAAAABaQEAAAAIZ2V0UHJpemUAAAAABAAAAA1jYWxsZXJBZGRyZXNzCQACWAAAAAEICAUAAAABaQAAAAZjYWxsZXIAAAAFYnl0ZXMEAAAABmdhbWVJZAkBAAAAFGdldFBsYXllckN1cnJlbnRHYW1lAAAAAQUAAAANY2FsbGVyQWRkcmVzcwQAAAAKcGxheWVyUm9sZQkBAAAADWdldFBsYXllclJvbGUAAAACBQAAAAZnYW1lSWQFAAAADWNhbGxlckFkZHJlc3MEAAAAFGFub3RoZXJQbGF5ZXJBZGRyZXNzAwkAAAAAAAACBQAAAApwbGF5ZXJSb2xlAgAAAAVtYWtlcgkBAAAACGdldFRha2VyAAAAAQUAAAAGZ2FtZUlkCQEAAAAIZ2V0TWFrZXIAAAABBQAAAAZnYW1lSWQEAAAABndpbm5lcgkBAAAACWdldFdpbm5lcgAAAAEFAAAABmdhbWVJZAMJAAAAAAAAAgUAAAAGZ2FtZUlkAAAAAAAAAAAACQAAAgAAAAECAAAAHVlvdSBkb24ndCBoYXZlIGFuIGFjdGl2ZSBnYW1lAwkAAAAAAAACBQAAAAZ3aW5uZXIFAAAACnBsYXllclJvbGUJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABdnZXRQbGF5ZXJDdXJyZW50R2FtZUtleQAAAAEFAAAADWNhbGxlckFkZHJlc3MAAAAAAAAAAAAJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABdnZXRQbGF5ZXJDdXJyZW50R2FtZUtleQAAAAEFAAAAFGFub3RoZXJQbGF5ZXJBZGRyZXNzAAAAAAAAAAAACQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAAQZ2V0UGxheWVyV2luc0tleQAAAAEFAAAADWNhbGxlckFkZHJlc3MJAABkAAAAAgkBAAAADWdldFBsYXllcldpbnMAAAABBQAAAA1jYWxsZXJBZGRyZXNzAAAAAAAAAAABCQAETAAAAAIJAQAAAAxJbnRlZ2VyRW50cnkAAAACCQEAAAARZ2V0UGxheWVyTG9zZXNLZXkAAAABBQAAABRhbm90aGVyUGxheWVyQWRkcmVzcwkAAGQAAAACCQEAAAAOZ2V0UGxheWVyTG9zZXMAAAABBQAAABRhbm90aGVyUGxheWVyQWRkcmVzcwAAAAAAAAAAAQkABEwAAAACCQEAAAALU3RyaW5nRW50cnkAAAACCQEAAAAQZ2V0R2FtZVJlc3VsdEtleQAAAAIFAAAABmdhbWVJZAUAAAANY2FsbGVyQWRkcmVzcwIAAAADd2luCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBnZXRHYW1lUmVzdWx0S2V5AAAAAgUAAAAGZ2FtZUlkBQAAABRhbm90aGVyUGxheWVyQWRkcmVzcwIAAAAEbG9zZQkABEwAAAACCQEAAAAOU2NyaXB0VHJhbnNmZXIAAAADCAUAAAABaQAAAAZjYWxsZXIJAABoAAAAAgkBAAAACmdldEJldEVnZ3MAAAABBQAAAAZnYW1lSWQAAAAAAAAAAAIFAAAAC2VnZ3NBc3NldElkBQAAAANuaWwDCQAAAAAAAAIFAAAABndpbm5lcgIAAAAEZHJhdwkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAF2dldFBsYXllckN1cnJlbnRHYW1lS2V5AAAAAQUAAAANY2FsbGVyQWRkcmVzcwAAAAAAAAAAAAkABEwAAAACCQEAAAAMSW50ZWdlckVudHJ5AAAAAgkBAAAAEWdldFBsYXllckRyYXdzS2V5AAAAAQUAAAANY2FsbGVyQWRkcmVzcwkAAGQAAAACCQEAAAAOZ2V0UGxheWVyRHJhd3MAAAABBQAAAA1jYWxsZXJBZGRyZXNzAAAAAAAAAAABCQAETAAAAAIJAQAAAAtTdHJpbmdFbnRyeQAAAAIJAQAAABBnZXRHYW1lUmVzdWx0S2V5AAAAAgUAAAAGZ2FtZUlkBQAAAA1jYWxsZXJBZGRyZXNzAgAAAARkcmF3CQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMIBQAAAAFpAAAABmNhbGxlcgkBAAAACmdldEJldEVnZ3MAAAABBQAAAAZnYW1lSWQFAAAAC2VnZ3NBc3NldElkBQAAAANuaWwJAARMAAAAAgkBAAAADEludGVnZXJFbnRyeQAAAAIJAQAAABdnZXRQbGF5ZXJDdXJyZW50R2FtZUtleQAAAAEFAAAADWNhbGxlckFkZHJlc3MAAAAAAAAAAAAFAAAAA25pbAAAAAEAAAACdHgBAAAABnZlcmlmeQAAAAAJAAH0AAAAAwgFAAAAAnR4AAAACWJvZHlCeXRlcwkAAZEAAAACCAUAAAACdHgAAAAGcHJvb2ZzAAAAAAAAAAAACAUAAAACdHgAAAAPc2VuZGVyUHVibGljS2V5+JaJng==", "height": 1695865, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 36mz51n2TdDLiidgd9yAoxygkhgXpmHgjoNUcbbR4QkC Next: HZvBf2he46ZpsPp6qeahb4pUuEwCFXx1oBk4XZdWYc4W Diff:
OldNewDifferences
324324 }
325325 if ((gameId == 0))
326326 then throw("You don't have an active game")
327- else if ((getExpirationHeight(gameId) == 0))
328- then throw("Game is not started")
329- else if (if ((gameStep == 0))
330- then (playerRole != "taker")
331- else false)
332- then throw("It is the taker's turn to pick now")
333- else if (if ((gameStep == 1))
334- then (playerRole != "maker")
335- else false)
336- then throw("It is the maker's turn to pick now")
337- else if ((gameStep > 1))
338- then throw("Ducks have already been picked")
339- else if (!(checkDuckOwner(i.caller, fromBase58String(worstDuckId))))
340- then throw((("Asset " + worstDuckId) + " doesn't belong to you"))
341- else if (!(checkDuckOwner(i.caller, fromBase58String(mediumDuckId))))
342- then throw((("Asset " + mediumDuckId) + " doesn't belong to you"))
343- else if (!(checkDuckOwner(i.caller, fromBase58String(bestDuckId))))
344- then throw((("Asset " + bestDuckId) + " doesn't belong to you"))
345- else if (if ((5 > worstRarityRange))
346- then if ((worstRarity > (worstRarityRange * 10)))
347- then true
348- else (((worstRarityRange - 1) * 10) >= worstRarity)
349- else false)
350- then throw("Worst duck doesn't fit rarity range")
351- else if (if ((5 > mediumRarityRange))
352- then if ((mediumRarity > (mediumRarityRange * 10)))
353- then true
354- else (((mediumRarityRange - 1) * 10) >= mediumRarity)
355- else false)
356- then throw("Medium duck doesn't fit rarity range")
357- else if (if ((5 > bestRarityRange))
358- then if ((bestRarity > (bestRarityRange * 10)))
359- then true
360- else (((bestRarityRange - 1) * 10) >= bestRarity)
361- else false)
362- then throw("Best duck doesn't fit rarity range")
363- else if (if ((worstRarityRange == 5))
364- then (40 >= worstRarity)
327+ else if ((worstRarity != 13))
328+ then throw("!=13")
329+ else if ((mediumRarity != 27))
330+ then throw("!=27")
331+ else if ((bestRarity != 37))
332+ then throw("!=37")
333+ else if ((getExpirationHeight(gameId) == 0))
334+ then throw("Game is not started")
335+ else if (if ((gameStep == 0))
336+ then (playerRole != "taker")
337+ else false)
338+ then throw("It is the taker's turn to pick now")
339+ else if (if ((gameStep == 1))
340+ then (playerRole != "maker")
341+ else false)
342+ then throw("It is the maker's turn to pick now")
343+ else if ((gameStep > 1))
344+ then throw("Ducks have already been picked")
345+ else if (!(checkDuckOwner(i.caller, fromBase58String(worstDuckId))))
346+ then throw((("Asset " + worstDuckId) + " doesn't belong to you"))
347+ else if (!(checkDuckOwner(i.caller, fromBase58String(mediumDuckId))))
348+ then throw((("Asset " + mediumDuckId) + " doesn't belong to you"))
349+ else if (!(checkDuckOwner(i.caller, fromBase58String(bestDuckId))))
350+ then throw((("Asset " + bestDuckId) + " doesn't belong to you"))
351+ else if (if ((5 > worstRarityRange))
352+ then if ((worstRarity > (worstRarityRange * 10)))
353+ then true
354+ else (((worstRarityRange - 1) * 10) >= worstRarity)
365355 else false)
366356 then throw("Worst duck doesn't fit rarity range")
367- else if (if ((mediumRarityRange == 5))
368- then (40 >= mediumRarity)
357+ else if (if ((5 > mediumRarityRange))
358+ then if ((mediumRarity > (mediumRarityRange * 10)))
359+ then true
360+ else (((mediumRarityRange - 1) * 10) >= mediumRarity)
369361 else false)
370362 then throw("Medium duck doesn't fit rarity range")
371- else if (if ((bestRarityRange == 5))
372- then (40 >= bestRarity)
363+ else if (if ((5 > bestRarityRange))
364+ then if ((bestRarity > (bestRarityRange * 10)))
365+ then true
366+ else (((bestRarityRange - 1) * 10) >= bestRarity)
373367 else false)
374368 then throw("Best duck doesn't fit rarity range")
375- else if (if (if ((worstRarity == mediumRarity))
376- then true
377- else (worstRarity == bestRarity))
378- then true
379- else (mediumRarity == bestRarity))
380- then throw("Ducks of the same rarity can't play")
381- 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))]
369+ else if (if ((worstRarityRange == 5))
370+ then (40 >= worstRarity)
371+ else false)
372+ then throw("Worst duck doesn't fit rarity range")
373+ else if (if ((mediumRarityRange == 5))
374+ then (40 >= mediumRarity)
375+ else false)
376+ then throw("Medium duck doesn't fit rarity range")
377+ else if (if ((bestRarityRange == 5))
378+ then (40 >= bestRarity)
379+ else false)
380+ then throw("Best duck doesn't fit rarity range")
381+ else if (if (if ((worstRarity == mediumRarity))
382+ then true
383+ else (worstRarity == bestRarity))
384+ then true
385+ else (mediumRarity == bestRarity))
386+ then throw("Ducks must have different rarities")
387+ 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))]
382388 }
383389 else throw("Strict value is not equal to itself.")
384390 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 5 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let incubatorAddress = base58'3MtBigTsaeevrcJAEwVcr4quwkqcrtnjoAh'
55
66 let breederAddress = base58'3N285kYUMxPi6oZsdWrxhSY34dJHyu4kRN5'
77
88 let rarityProviderAddress = base58'3NCman4dCzk1HWWU4DPTr5rsbhvuUCwwUZh'
99
1010 let eggsAssetId = base58'3VUCuh9dWqe54SdzzNUkXhFXpc8UQynnJVh42B7MjNzN'
1111
1212 let SLOTS = 10
1313
1414 let WAITING = 8
1515
1616 let stepDuration = 5
1717
1818 func tryGetInteger (key) = match getInteger(this, key) {
1919 case b: Int =>
2020 b
2121 case _ =>
2222 0
2323 }
2424
2525
2626 func tryGetString (key) = match getString(this, key) {
2727 case a: String =>
2828 a
2929 case _ =>
3030 ""
3131 }
3232
3333
3434 func tryGetBoolean (key) = match getBoolean(this, key) {
3535 case b: Boolean =>
3636 b
3737 case _ =>
3838 false
3939 }
4040
4141
4242 func getNextGameId () = {
4343 let nextId = tryGetInteger("nextGameId")
4444 if ((nextId == 0))
4545 then 1
4646 else nextId
4747 }
4848
4949
5050 func getPlayerCurrentGameKey (playerAddress) = (playerAddress + "_currentGame")
5151
5252
5353 func getPlayerCurrentGame (playerAddress) = tryGetInteger(getPlayerCurrentGameKey(playerAddress))
5454
5555
5656 func getSlotKey (slot) = ("slot" + toString(slot))
5757
5858
5959 func getSlot (slot) = tryGetInteger(getSlotKey(slot))
6060
6161
6262 func getPlayerRoleKey (gameId,playerAddress) = ((("game" + toString(gameId)) + "_") + playerAddress)
6363
6464
6565 func getPlayerRole (gameId,playerAddress) = tryGetString(getPlayerRoleKey(gameId, playerAddress))
6666
6767
6868 func getMakerKey (gameId) = (("game" + toString(gameId)) + "_maker")
6969
7070
7171 func getMaker (gameId) = tryGetString(getMakerKey(gameId))
7272
7373
7474 func getTakerKey (gameId) = (("game" + toString(gameId)) + "_taker")
7575
7676
7777 func getTaker (gameId) = tryGetString(getTakerKey(gameId))
7878
7979
8080 func getBetEggsKey (gameId) = (("game" + toString(gameId)) + "_betEggs")
8181
8282
8383 func getBetEggs (gameId) = tryGetInteger(getBetEggsKey(gameId))
8484
8585
8686 func getWaitingExpirationHeightKey (gameId) = (("game" + toString(gameId)) + "_waitingExpirationHeight")
8787
8888
8989 func getWaitingExpirationHeight (gameId) = tryGetInteger(getWaitingExpirationHeightKey(gameId))
9090
9191
9292 func getExpirationHeightKey (gameId) = (("game" + toString(gameId)) + "_expirationHeight")
9393
9494
9595 func getExpirationHeight (gameId) = tryGetInteger(getExpirationHeightKey(gameId))
9696
9797
9898 func getRarityRangeKey (gameId,rangePosition) = ((("game" + toString(gameId)) + "_rarityRange_") + rangePosition)
9999
100100
101101 func getRarityRange (gameId,rangePosition) = tryGetInteger(getRarityRangeKey(gameId, rangePosition))
102102
103103
104104 func getStepKey (gameId) = (("game" + toString(gameId)) + "_step")
105105
106106
107107 func getStep (gameId) = tryGetInteger(getStepKey(gameId))
108108
109109
110110 func getRarityKey (gameId,playerRole,rangePosition) = (((((("game" + toString(gameId)) + "_") + playerRole) + "_") + rangePosition) + "Rarity")
111111
112112
113113 func getRarity (gameId,playerRole,rangePosition) = tryGetInteger(getRarityKey(gameId, playerRole, rangePosition))
114114
115115
116116 func getDuckIdKey (gameId,playerRole,rangePosition) = (((((("game" + toString(gameId)) + "_") + playerRole) + "_") + rangePosition) + "DuckId")
117117
118118
119119 func getDuckId (gameId,playerRole,rangePosition) = tryGetString(getDuckIdKey(gameId, playerRole, rangePosition))
120120
121121
122122 func getCommitKey (gameId,playerRole) = (((("game" + toString(gameId)) + "_") + playerRole) + "_commit")
123123
124124
125125 func getCommit (gameId,playerRole) = tryGetString(getCommitKey(gameId, playerRole))
126126
127127
128128 func getDuckOrderKey (gameId,playerRole) = (((("game" + toString(gameId)) + "_") + playerRole) + "_duckOrder")
129129
130130
131131 func getDuckOrder (gameId,playerRole) = tryGetString(getDuckOrderKey(gameId, playerRole))
132132
133133
134134 func getGameResultKey (gameId,playerAddress) = (((("game" + toString(gameId)) + "_") + playerAddress) + "_result")
135135
136136
137137 func getGameResult (gameId,playerAddress) = tryGetString(getGameResultKey(gameId, playerAddress))
138138
139139
140140 func getPlayerWinsKey (playerAddress) = (playerAddress + "_wins")
141141
142142
143143 func getPlayerWins (playerAddress) = tryGetInteger(getPlayerWinsKey(playerAddress))
144144
145145
146146 func getPlayerLosesKey (playerAddress) = (playerAddress + "_loses")
147147
148148
149149 func getPlayerLoses (playerAddress) = tryGetInteger(getPlayerLosesKey(playerAddress))
150150
151151
152152 func getPlayerDrawsKey (playerAddress) = (playerAddress + "_draws")
153153
154154
155155 func getPlayerDraws (playerAddress) = tryGetInteger(getPlayerDrawsKey(playerAddress))
156156
157157
158158 func getGamesPlayedKey () = "gamesPlayed"
159159
160160
161161 func getGamesPlayed () = tryGetInteger(getGamesPlayedKey())
162162
163163
164164 func checkDuckOwner (ownerAddress,assetId) = (assetBalance(ownerAddress, assetId) > 0)
165165
166166
167167 func getScore (a,b) = if ((a > b))
168168 then 1
169169 else if ((b > a))
170170 then -1
171171 else 0
172172
173173
174174 func getWinner (gameId) = {
175175 let gameStep = getStep(gameId)
176176 if ((6 > gameStep))
177177 then {
178178 let expirationHeight = getExpirationHeight(gameId)
179179 if ((expirationHeight == 0))
180180 then throw("Game is not started")
181181 else if ((expirationHeight > height))
182182 then throw("Game is not finished or expired")
183183 else if (((getStep(gameId) % 2) == 0))
184184 then "maker"
185185 else "taker"
186186 }
187187 else {
188188 let makerDuckOrder = split(getDuckOrder(gameId, "maker"), ",")
189189 let takerDuckOrder = split(getDuckOrder(gameId, "taker"), ",")
190190 let makerRarity1 = getRarity(gameId, "maker", makerDuckOrder[0])
191191 let makerRarity2 = getRarity(gameId, "maker", makerDuckOrder[1])
192192 let makerRarity3 = getRarity(gameId, "maker", makerDuckOrder[2])
193193 let takerRarity1 = getRarity(gameId, "taker", takerDuckOrder[0])
194194 let takerRarity2 = getRarity(gameId, "taker", takerDuckOrder[1])
195195 let takerRarity3 = getRarity(gameId, "taker", takerDuckOrder[2])
196196 let makerScore = ((getScore(makerRarity1, takerRarity1) + getScore(makerRarity2, takerRarity2)) + getScore(makerRarity3, takerRarity3))
197197 if ((makerScore > 0))
198198 then "maker"
199199 else if ((0 > makerScore))
200200 then "taker"
201201 else "draw"
202202 }
203203 }
204204
205205
206206 @Callable(i)
207207 func makeGame (slot,rarityRangeWorst,rarityRangeMedium,rarityRangeBest) = {
208208 let callerAddress = toBase58String(i.caller.bytes)
209209 let slotGameId = getSlot(slot)
210210 let payment = value(i.payments[0])
211211 let eggs = payment.amount
212212 let gameId = getNextGameId()
213213 if ((getPlayerCurrentGame(callerAddress) != 0))
214214 then throw("You already have an active game")
215215 else if (if ((0 > slot))
216216 then true
217217 else (slot >= SLOTS))
218218 then throw("Invalid slot")
219219 else if ((slotGameId != 0))
220220 then throw("This slot is busy")
221221 else if ((payment.assetId != eggsAssetId))
222222 then throw(("You can attach only EGGs with the following asset id: " + toBase58String(eggsAssetId)))
223223 else if ((eggs != 1))
224224 then throw("Bet must be 0.01 EGG during beta test")
225225 else if (if ((1 > rarityRangeWorst))
226226 then true
227227 else (rarityRangeWorst > 5))
228228 then throw("Invalid rarity range for the worst duck")
229229 else if (if ((1 > rarityRangeMedium))
230230 then true
231231 else (rarityRangeMedium > 5))
232232 then throw("Invalid rarity range for the medium duck")
233233 else if (if ((1 > rarityRangeBest))
234234 then true
235235 else (rarityRangeBest > 5))
236236 then throw("Invalid rarity range for the best duck")
237237 else if ((rarityRangeWorst > rarityRangeMedium))
238238 then throw("The medium range can't be less than the worst one")
239239 else if ((rarityRangeMedium > rarityRangeBest))
240240 then throw("The best range can't be worse than the medium one")
241241 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))]
242242 }
243243
244244
245245
246246 @Callable(i)
247247 func takeGame (slot) = {
248248 let callerAddress = toBase58String(i.caller.bytes)
249249 let gameId = getSlot(slot)
250250 let payment = value(i.payments[0])
251251 if ((getPlayerCurrentGame(callerAddress) != 0))
252252 then throw("You already have an active game")
253253 else if (if ((0 > slot))
254254 then true
255255 else (slot >= SLOTS))
256256 then throw("Invalid slot")
257257 else if ((getSlot(slot) == 0))
258258 then throw("This slot is empty")
259259 else if ((payment.assetId != eggsAssetId))
260260 then throw(("You can attach only EGG tokens with the following asset id: " + toBase58String(eggsAssetId)))
261261 else if ((payment.amount != getBetEggs(gameId)))
262262 then throw("Insufficient eggs amount")
263263 else if ((height >= getWaitingExpirationHeight(gameId)))
264264 then throw("This game is expired")
265265 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))]
266266 }
267267
268268
269269
270270 @Callable(i)
271271 func kickGame (slot) = {
272272 let gameId = getSlot(slot)
273273 if (if ((0 > slot))
274274 then true
275275 else (slot >= SLOTS))
276276 then throw("Invalid slot")
277277 else if ((gameId == 0))
278278 then throw("Slot is empty")
279279 else if ((getWaitingExpirationHeight(gameId) > height))
280280 then throw("Waiting is not finished yet")
281281 else {
282282 let maker = getMaker(gameId)
283283 [IntegerEntry(getPlayerCurrentGameKey(maker), 0), IntegerEntry(getSlotKey(slot), 0), ScriptTransfer(Address(fromBase58String(maker)), getBetEggs(gameId), eggsAssetId)]
284284 }
285285 }
286286
287287
288288
289289 @Callable(i)
290290 func pickDucks (worstDuckId,mediumDuckId,bestDuckId) = {
291291 let callerAddress = toBase58String(i.caller.bytes)
292292 let gameId = getPlayerCurrentGame(callerAddress)
293293 let playerRole = getPlayerRole(gameId, callerAddress)
294294 let gameStep = getStep(gameId)
295295 let worstRarityRange = getRarityRange(gameId, "worst")
296296 let mediumRarityRange = getRarityRange(gameId, "medium")
297297 let bestRarityRange = getRarityRange(gameId, "best")
298298 let invokeWorstRes = invoke(Address(rarityProviderAddress), "getAssetRarity", [worstDuckId], nil)
299299 if ((invokeWorstRes == invokeWorstRes))
300300 then {
301301 let worstRarity = match invokeWorstRes {
302302 case r: Int =>
303303 r
304304 case _ =>
305305 throw("Incorrect invoke result")
306306 }
307307 let invokeMediumRes = invoke(Address(rarityProviderAddress), "getAssetRarity", [mediumDuckId], nil)
308308 if ((invokeMediumRes == invokeMediumRes))
309309 then {
310310 let mediumRarity = match invokeMediumRes {
311311 case r: Int =>
312312 r
313313 case _ =>
314314 throw("Incorrect invoke result")
315315 }
316316 let invokeBestRes = invoke(Address(rarityProviderAddress), "getAssetRarity", [bestDuckId], nil)
317317 if ((invokeBestRes == invokeBestRes))
318318 then {
319319 let bestRarity = match invokeWorstRes {
320320 case r: Int =>
321321 r
322322 case _ =>
323323 throw("Incorrect invoke result")
324324 }
325325 if ((gameId == 0))
326326 then throw("You don't have an active game")
327- else if ((getExpirationHeight(gameId) == 0))
328- then throw("Game is not started")
329- else if (if ((gameStep == 0))
330- then (playerRole != "taker")
331- else false)
332- then throw("It is the taker's turn to pick now")
333- else if (if ((gameStep == 1))
334- then (playerRole != "maker")
335- else false)
336- then throw("It is the maker's turn to pick now")
337- else if ((gameStep > 1))
338- then throw("Ducks have already been picked")
339- else if (!(checkDuckOwner(i.caller, fromBase58String(worstDuckId))))
340- then throw((("Asset " + worstDuckId) + " doesn't belong to you"))
341- else if (!(checkDuckOwner(i.caller, fromBase58String(mediumDuckId))))
342- then throw((("Asset " + mediumDuckId) + " doesn't belong to you"))
343- else if (!(checkDuckOwner(i.caller, fromBase58String(bestDuckId))))
344- then throw((("Asset " + bestDuckId) + " doesn't belong to you"))
345- else if (if ((5 > worstRarityRange))
346- then if ((worstRarity > (worstRarityRange * 10)))
347- then true
348- else (((worstRarityRange - 1) * 10) >= worstRarity)
349- else false)
350- then throw("Worst duck doesn't fit rarity range")
351- else if (if ((5 > mediumRarityRange))
352- then if ((mediumRarity > (mediumRarityRange * 10)))
353- then true
354- else (((mediumRarityRange - 1) * 10) >= mediumRarity)
355- else false)
356- then throw("Medium duck doesn't fit rarity range")
357- else if (if ((5 > bestRarityRange))
358- then if ((bestRarity > (bestRarityRange * 10)))
359- then true
360- else (((bestRarityRange - 1) * 10) >= bestRarity)
361- else false)
362- then throw("Best duck doesn't fit rarity range")
363- else if (if ((worstRarityRange == 5))
364- then (40 >= worstRarity)
327+ else if ((worstRarity != 13))
328+ then throw("!=13")
329+ else if ((mediumRarity != 27))
330+ then throw("!=27")
331+ else if ((bestRarity != 37))
332+ then throw("!=37")
333+ else if ((getExpirationHeight(gameId) == 0))
334+ then throw("Game is not started")
335+ else if (if ((gameStep == 0))
336+ then (playerRole != "taker")
337+ else false)
338+ then throw("It is the taker's turn to pick now")
339+ else if (if ((gameStep == 1))
340+ then (playerRole != "maker")
341+ else false)
342+ then throw("It is the maker's turn to pick now")
343+ else if ((gameStep > 1))
344+ then throw("Ducks have already been picked")
345+ else if (!(checkDuckOwner(i.caller, fromBase58String(worstDuckId))))
346+ then throw((("Asset " + worstDuckId) + " doesn't belong to you"))
347+ else if (!(checkDuckOwner(i.caller, fromBase58String(mediumDuckId))))
348+ then throw((("Asset " + mediumDuckId) + " doesn't belong to you"))
349+ else if (!(checkDuckOwner(i.caller, fromBase58String(bestDuckId))))
350+ then throw((("Asset " + bestDuckId) + " doesn't belong to you"))
351+ else if (if ((5 > worstRarityRange))
352+ then if ((worstRarity > (worstRarityRange * 10)))
353+ then true
354+ else (((worstRarityRange - 1) * 10) >= worstRarity)
365355 else false)
366356 then throw("Worst duck doesn't fit rarity range")
367- else if (if ((mediumRarityRange == 5))
368- then (40 >= mediumRarity)
357+ else if (if ((5 > mediumRarityRange))
358+ then if ((mediumRarity > (mediumRarityRange * 10)))
359+ then true
360+ else (((mediumRarityRange - 1) * 10) >= mediumRarity)
369361 else false)
370362 then throw("Medium duck doesn't fit rarity range")
371- else if (if ((bestRarityRange == 5))
372- then (40 >= bestRarity)
363+ else if (if ((5 > bestRarityRange))
364+ then if ((bestRarity > (bestRarityRange * 10)))
365+ then true
366+ else (((bestRarityRange - 1) * 10) >= bestRarity)
373367 else false)
374368 then throw("Best duck doesn't fit rarity range")
375- else if (if (if ((worstRarity == mediumRarity))
376- then true
377- else (worstRarity == bestRarity))
378- then true
379- else (mediumRarity == bestRarity))
380- then throw("Ducks of the same rarity can't play")
381- 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))]
369+ else if (if ((worstRarityRange == 5))
370+ then (40 >= worstRarity)
371+ else false)
372+ then throw("Worst duck doesn't fit rarity range")
373+ else if (if ((mediumRarityRange == 5))
374+ then (40 >= mediumRarity)
375+ else false)
376+ then throw("Medium duck doesn't fit rarity range")
377+ else if (if ((bestRarityRange == 5))
378+ then (40 >= bestRarity)
379+ else false)
380+ then throw("Best duck doesn't fit rarity range")
381+ else if (if (if ((worstRarity == mediumRarity))
382+ then true
383+ else (worstRarity == bestRarity))
384+ then true
385+ else (mediumRarity == bestRarity))
386+ then throw("Ducks must have different rarities")
387+ 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))]
382388 }
383389 else throw("Strict value is not equal to itself.")
384390 }
385391 else throw("Strict value is not equal to itself.")
386392 }
387393 else throw("Strict value is not equal to itself.")
388394 }
389395
390396
391397
392398 @Callable(i)
393399 func commit (hash) = {
394400 let callerAddress = toBase58String(i.caller.bytes)
395401 let gameId = getPlayerCurrentGame(callerAddress)
396402 let playerRole = getPlayerRole(gameId, callerAddress)
397403 let gameStep = getStep(gameId)
398404 if ((gameId == 0))
399405 then throw("You don't have an active game")
400406 else if ((2 > gameStep))
401407 then throw("Commit is not started")
402408 else if (if ((gameStep == 2))
403409 then (playerRole != "taker")
404410 else false)
405411 then throw("It is the taker's turn to pick now")
406412 else if (if ((gameStep == 3))
407413 then (playerRole != "maker")
408414 else false)
409415 then throw("It is the maker's turn to pick now")
410416 else if ((gameStep > 3))
411417 then throw("Commit is finished")
412418 else [StringEntry(getCommitKey(gameId, playerRole), hash), IntegerEntry(getStepKey(gameId), (gameStep + 1)), IntegerEntry(getExpirationHeightKey(gameId), (height + stepDuration))]
413419 }
414420
415421
416422
417423 @Callable(i)
418424 func reveal (duckOrder,salt) = {
419425 let callerAddress = toBase58String(i.caller.bytes)
420426 let gameId = getPlayerCurrentGame(callerAddress)
421427 let playerRole = getPlayerRole(gameId, callerAddress)
422428 let gameStep = getStep(gameId)
423429 if ((gameId == 0))
424430 then throw("You don't have an active game")
425431 else if ((4 > gameStep))
426432 then throw("Reveal is not started")
427433 else if (if ((gameStep == 4))
428434 then (playerRole != "taker")
429435 else false)
430436 then throw("It is the taker's turn to pick now")
431437 else if (if ((gameStep == 5))
432438 then (playerRole != "maker")
433439 else false)
434440 then throw("It is the maker's turn to pick now")
435441 else if ((gameStep > 5))
436442 then throw("Reveal is finished")
437443 else if (if (if (if (if (if ((duckOrder != "worst,medium,best"))
438444 then (duckOrder != "worst,best,medium")
439445 else false)
440446 then (duckOrder != "medium,worst,best")
441447 else false)
442448 then (duckOrder != "medium,best,worst")
443449 else false)
444450 then (duckOrder != "best,worst,medium")
445451 else false)
446452 then (duckOrder != "best,medium,worst")
447453 else false)
448454 then throw("Reveal data is not valid")
449455 else if ((toBase58String(sha256(toBytes((duckOrder + salt)))) != getCommit(gameId, playerRole)))
450456 then throw("Reveal doesn't match commit")
451457 else [StringEntry(getDuckOrderKey(gameId, playerRole), duckOrder), IntegerEntry(getStepKey(gameId), (gameStep + 1)), IntegerEntry(getExpirationHeightKey(gameId), (height + stepDuration))]
452458 }
453459
454460
455461
456462 @Callable(i)
457463 func getPrize () = {
458464 let callerAddress = toBase58String(i.caller.bytes)
459465 let gameId = getPlayerCurrentGame(callerAddress)
460466 let playerRole = getPlayerRole(gameId, callerAddress)
461467 let anotherPlayerAddress = if ((playerRole == "maker"))
462468 then getTaker(gameId)
463469 else getMaker(gameId)
464470 let winner = getWinner(gameId)
465471 if ((gameId == 0))
466472 then throw("You don't have an active game")
467473 else if ((winner == playerRole))
468474 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)]
469475 else if ((winner == "draw"))
470476 then [IntegerEntry(getPlayerCurrentGameKey(callerAddress), 0), IntegerEntry(getPlayerDrawsKey(callerAddress), (getPlayerDraws(callerAddress) + 1)), StringEntry(getGameResultKey(gameId, callerAddress), "draw"), ScriptTransfer(i.caller, getBetEggs(gameId), eggsAssetId)]
471477 else [IntegerEntry(getPlayerCurrentGameKey(callerAddress), 0)]
472478 }
473479
474480
475481 @Verifier(tx)
476482 func verify () = sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
477483

github/deemru/w8io/026f985 
58.56 ms