tx · 5yYuYrxHnPEiFsmanHnhkFz5Tzp5FVJtADzLewAUFS4D

3MtKQXaiKQxSTRPpa8GjJ5zE7mE992eBrGu:  -0.05000000 Waves

2019.11.03 00:00 [747756] smart account 3MtKQXaiKQxSTRPpa8GjJ5zE7mE992eBrGu > SELF 0.00000000 Waves

{ "type": 13, "id": "5yYuYrxHnPEiFsmanHnhkFz5Tzp5FVJtADzLewAUFS4D", "fee": 5000000, "feeAssetId": null, "timestamp": 1572728471625, "version": 1, "sender": "3MtKQXaiKQxSTRPpa8GjJ5zE7mE992eBrGu", "senderPublicKey": "2vmjFmSn7wGYrffwrNFgTN6j9CATDKwa8t8KAXWe2HVW", "proofs": [ "2Qt69FkqWssEHmdVBZs7vUqyH69kZQLQXhs3hkSNhajZzeMg1jZED4mDPDBg6tbFdnUuSvoYJnuQiow49X5gsR56" ], "script": "base64:AAIDAAAAAAAAABIIARIDCgEIEgQKAggCEgMKAQgAAAAkAAAAAAlSU0FQVUJMSUMJAAJbAAAAAQIAAAGPYmFzZTY0Ok1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBZzRkQVI2WGJCREFTOWhyL0VqM2RKdjZGZmM0NjZ4L21PR01XVTNsckFCczNxYThCSG11Skdua2ZicEVmMnZBd1lUT1dQdnZ6Zk0xME9CYmZsb1N5cTNjOU1LdnlUZTFsdUJMR3FXNHZaVVhJeXZTZ3oxbGl5VVZlZklReTNkeUY5amJlVFpiQzBiYmNULzdPM0RFTCswMXo2QStyRENhY1NaMGxHb2xTUTZBbmhMeHpJa1ZwT1FKYnJCbUMreCtadVpQQ01Xekp5bmQ1YWVPbjdqYWovbWtSVnl4ZTZnLzBPaFd6NE5paVpYZXVNUkIrOG1LeTBmV0QvVWxJbFpXSHNBUzJabXJrWEtxakxxMC8wd3I4SUxKa3pualNxZG5JNUliamczdVFyai80QU4raTlyMjhhUTczL1prUHRZNVNidzBBT2lBQkJ1N2dIbXE5YXlWeFpRSURBUUFCAAAAAA9HQU1FU0NPVU5URVJLRVkCAAAACSRHQU1FX05VTQAAAAAEV0JFVAEAAAAghrQ2qHjTDszY8BetSy4sBB8Hn7rKuRapStdvJa2b0HYAAAAADldBTExFVFdBVkVTQkVUCQEAAAAHQWRkcmVzcwAAAAEBAAAAGgFULxHweE6v1pOfqW4iK2a1H7JT13jPO2j7AAAAAAxXQUxMRVRNQ0FGRUUJAQAAAAdBZGRyZXNzAAAAAQEAAAAaAVQvEfB4Tq/Wk5+pbiIrZrUfslPXeM87aPsAAAAAC0ZFRVdBVkVTQkVUAAAAAAAAAAAEAAAAAAlGRUVNQ0FGRUUAAAAAAAAAAAIAAAAAB1dBVkVMRVQAAAAAAAX14QAAAAAADlNUQVRFU1VCTUlUVEVEAgAAAAlTVUJNSVRURUQAAAAADVNUQVRFQUNDRVBURUQCAAAACEFDQ0VQVEVEAAAAAA1TVEFURUZJTklTSEVEAgAAAAhGSU5JU0hFRAAAAAANU1RBVEVDQU5DRUxFRAIAAAAIQ0FOQ0VMRUQAAAAAB0NPSU5SRUQCAAAAA1JFRAAAAAAIQ09JTkJMVUUCAAAABEJMVUUAAAAAC0JFVE1JTldBVkVTCQAAaQAAAAIJAABoAAAAAgAAAAAAAAAAAQUAAAAHV0FWRUxFVAAAAAAAAAAABAAAAAAKQkVUTUlOV0JFVAkAAGgAAAACAAAAAAAAAABkBQAAAAdXQVZFTEVUAAAAAAxJZHhHYW1lU3RhdGUAAAAAAAAAAAAAAAAADklkeFBsYXllckFDb2luAAAAAAAAAAABAAAAABJJZHhQbGF5ZXJBUHViS2V5NTgAAAAAAAAAAAIAAAAACklkeFBheVR5cGUAAAAAAAAAAAMAAAAACUlkeFBheUFtdAAAAAAAAAAABAAAAAAJSWR4V2luQW10AAAAAAAAAAAFAAAAAA5JZHhQbGF5ZXJCQ29pbgAAAAAAAAAABgAAAAASSWR4UGxheWVyQlB1YktleTU4AAAAAAAAAAAHAAAAAAxJZHhMdWNreUNvaW4AAAAAAAAAAAgBAAAAEEluY3JlbWVudEdhbWVOdW0AAAAABAAAAAdnYW1lTnVtBAAAAAckbWF0Y2gwCQAEGgAAAAIFAAAABHRoaXMFAAAAD0dBTUVTQ09VTlRFUktFWQMJAAABAAAAAgUAAAAHJG1hdGNoMAIAAAADSW50BAAAAANudW0FAAAAByRtYXRjaDAFAAAAA251bQAAAAAAAAAAAAkAAGQAAAACBQAAAAdnYW1lTnVtAAAAAAAAAAABAQAAAA9HZW5lcmF0ZVJhbmRJbnQAAAACAAAABmdhbWVJZAAAAAdyc2FTaWduBAAAAAtyc2FTaWdWYWxpZAkAAfgAAAAEBQAAAAZTSEEyNTYJAAGbAAAAAQUAAAAGZ2FtZUlkBQAAAAdyc2FTaWduBQAAAAlSU0FQVUJMSUMDBQAAAAtyc2FTaWdWYWxpZAQAAAAEcmFuZAkAAGoAAAACCQAEsQAAAAEJAAH3AAAAAQUAAAAHcnNhU2lnbgAAAAAAAAAAZAMJAABmAAAAAgAAAAAAAAAAAAUAAAAEcmFuZAkAAGQAAAACCQAAaAAAAAIA//////////8FAAAABHJhbmQAAAAAAAAAAAEJAABkAAAAAgUAAAAEcmFuZAAAAAAAAAAAAQkAAAIAAAABAgAAABVJbnZhbGlkIFJTQSBzaWduYXR1cmUBAAAAC3BheW1lbnRUeXBlAAAAAQAAAAdwYXltZW50AwkAAAAAAAACCAUAAAAHcGF5bWVudAAAAAdhc3NldElkBQAAAARXQkVUAgAAAARXQkVUAgAAAAVXQVZFUwEAAAAJdG9rZW5UeXBlAAAAAQAAAAV0b2tlbgMJAAAAAAAAAgUAAAAFdG9rZW4CAAAABFdCRVQFAAAABFdCRVQFAAAABHVuaXQBAAAAE0Zvcm1hdEdhbWVEYXRhUGFyYW0AAAABAAAAAXAEAAAAAXMJAAExAAAAAQUAAAABcAMJAAAAAAAAAgUAAAABcwAAAAAAAAAAAAkAAAIAAAABAgAAACVQYXJhbWV0ZXIgc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhlbiAwAwkAAGYAAAACBQAAAAFzAAAAAAAAAABjCQAAAgAAAAECAAAAJFBhcmFtZXRlciBzaXplIG11c3QgYmUgbGVzcyB0aGVuIDEwMAMJAABmAAAAAgAAAAAAAAAACgUAAAABcwkAASwAAAACCQABLAAAAAICAAAAATAJAAGkAAAAAQUAAAABcwUAAAABcAkAASwAAAACCQABpAAAAAEFAAAAAXMFAAAAAXABAAAAEUZvcm1hdEdhbWVEYXRhU3RyAAAACQAAAAlnYW1lU3RhdGUAAAALcGxheWVyQUNvaW4AAAAPcGxheWVyQVB1YktleTU4AAAAB3BheVR5cGUAAAAJcGF5QW1vdW50AAAABndpbkFtdAAAAAtwbGF5ZXJCQ29pbgAAAA9wbGF5ZXJCUHViS2V5NTgAAAAJbHVja3lDb2luBAAAAAxmdWxsU3RhdGVTdHIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkBAAAAE0Zvcm1hdEdhbWVEYXRhUGFyYW0AAAABBQAAAAlnYW1lU3RhdGUCAAAAAV8JAQAAABNGb3JtYXRHYW1lRGF0YVBhcmFtAAAAAQUAAAALcGxheWVyQUNvaW4CAAAAAV8JAQAAABNGb3JtYXRHYW1lRGF0YVBhcmFtAAAAAQUAAAAPcGxheWVyQVB1YktleTU4AgAAAAFfCQEAAAATRm9ybWF0R2FtZURhdGFQYXJhbQAAAAEFAAAAB3BheVR5cGUCAAAAAV8JAQAAABNGb3JtYXRHYW1lRGF0YVBhcmFtAAAAAQkAAaQAAAABBQAAAAlwYXlBbW91bnQCAAAAAV8JAQAAABNGb3JtYXRHYW1lRGF0YVBhcmFtAAAAAQkAAaQAAAABBQAAAAZ3aW5BbXQDAwMJAAAAAAAAAgUAAAALcGxheWVyQkNvaW4CAAAAAAYJAAAAAAAAAgUAAAAPcGxheWVyQlB1YktleTU4AgAAAAAGCQAAAAAAAAIFAAAACWx1Y2t5Q29pbgIAAAAABQAAAAxmdWxsU3RhdGVTdHIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIJAAEsAAAAAgkAASwAAAACCQABLAAAAAIFAAAADGZ1bGxTdGF0ZVN0cgIAAAABXwkBAAAAE0Zvcm1hdEdhbWVEYXRhUGFyYW0AAAABBQAAAAtwbGF5ZXJCQ29pbgIAAAABXwkBAAAAE0Zvcm1hdEdhbWVEYXRhUGFyYW0AAAABBQAAAA9wbGF5ZXJCUHViS2V5NTgCAAAAAV8JAQAAABNGb3JtYXRHYW1lRGF0YVBhcmFtAAAAAQUAAAAJbHVja3lDb2luAQAAABlSZW1vdmVVbmRlcnNjb3JlSWZQcmVzZW50AAAAAQAAAAlyZW1haW5pbmcDCQAAZgAAAAIJAAExAAAAAQUAAAAJcmVtYWluaW5nAAAAAAAAAAAACQABMAAAAAIFAAAACXJlbWFpbmluZwAAAAAAAAAAAQUAAAAJcmVtYWluaW5nAQAAABJQYXJzZU5leHRBdHRyaWJ1dGUAAAABAAAACXJlbWFpbmluZwQAAAABcwkAATEAAAABBQAAAAlyZW1haW5pbmcDCQAAZgAAAAIFAAAAAXMAAAAAAAAAAAAEAAAAAm5uCQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAEvAAAAAgUAAAAJcmVtYWluaW5nAAAAAAAAAAACBAAAAAF2CQABLwAAAAIJAAEwAAAAAgUAAAAJcmVtYWluaW5nAAAAAAAAAAACBQAAAAJubgQAAAAMdG1wUmVtYWluaW5nCQABMAAAAAIFAAAACXJlbWFpbmluZwkAAGQAAAACBQAAAAJubgAAAAAAAAAAAgQAAAAOcmVtYWluaW5nU3RhdGUJAQAAABlSZW1vdmVVbmRlcnNjb3JlSWZQcmVzZW50AAAAAQUAAAAMdG1wUmVtYWluaW5nCQAETAAAAAIFAAAAAXYJAARMAAAAAgUAAAAOcmVtYWluaW5nU3RhdGUFAAAAA25pbAkAAAIAAAABAgAAADRFbXB0eSBzdHJpbmcgd2FzIHBhc3NlZCBpbnRvIHBhcnNlTmV4dEF0dHJpYnV0ZSBmdW5jAQAAABNQYXJzZUdhbWVSYXdEYXRhU3RyAAAAAQAAAAtyYXdTdGF0ZVN0cgQAAAAJZ2FtZVN0YXRlCQEAAAASUGFyc2VOZXh0QXR0cmlidXRlAAAAAQUAAAALcmF3U3RhdGVTdHIEAAAABnBhQ29pbgkBAAAAElBhcnNlTmV4dEF0dHJpYnV0ZQAAAAEJAAGRAAAAAgUAAAAJZ2FtZVN0YXRlAAAAAAAAAAABBAAAAApwYVB1YktleTU4CQEAAAASUGFyc2VOZXh0QXR0cmlidXRlAAAAAQkAAZEAAAACBQAAAAZwYUNvaW4AAAAAAAAAAAEEAAAAB3BheVR5cGUJAQAAABJQYXJzZU5leHRBdHRyaWJ1dGUAAAABCQABkQAAAAIFAAAACnBhUHViS2V5NTgAAAAAAAAAAAEEAAAABnBheUFtdAkBAAAAElBhcnNlTmV4dEF0dHJpYnV0ZQAAAAEJAAGRAAAAAgUAAAAHcGF5VHlwZQAAAAAAAAAAAQQAAAAGd2luQW10CQEAAAASUGFyc2VOZXh0QXR0cmlidXRlAAAAAQkAAZEAAAACBQAAAAZwYXlBbXQAAAAAAAAAAAEJAARMAAAAAgkAAZEAAAACBQAAAAlnYW1lU3RhdGUAAAAAAAAAAAAJAARMAAAAAgkAAZEAAAACBQAAAAZwYUNvaW4AAAAAAAAAAAAJAARMAAAAAgkAAZEAAAACBQAAAApwYVB1YktleTU4AAAAAAAAAAAACQAETAAAAAIJAAGRAAAAAgUAAAAHcGF5VHlwZQAAAAAAAAAAAAkABEwAAAACCQABkQAAAAIFAAAABnBheUFtdAAAAAAAAAAAAAkABEwAAAACCQABkQAAAAIFAAAABndpbkFtdAAAAAAAAAAAAAUAAAADbmlsAQAAABNFeHRyYWN0R2FtZURhdGFMaXN0AAAAAQAAAAZnYW1lSWQEAAAACnJhd0RhdGFTdHIEAAAAByRtYXRjaDAJAAQdAAAAAgUAAAAEdGhpcwUAAAAGZ2FtZUlkAwkAAAEAAAACBQAAAAckbWF0Y2gwAgAAAAZTdHJpbmcEAAAAA3N0cgUAAAAHJG1hdGNoMAUAAAADc3RyCQAAAgAAAAEJAAEsAAAAAgIAAAAWQ291bGRuJ3QgZmluZCBnYW1lIGJ5IAUAAAAGZ2FtZUlkCQEAAAATUGFyc2VHYW1lUmF3RGF0YVN0cgAAAAEFAAAACnJhd0RhdGFTdHIBAAAAGlZhbGlkYXRlQmV0QW5kRGVmaW5lV2luQW10AAAAAwAAAAZhbW91bnQAAAAKcGxheWVyQ29pbgAAAAtwYXltZW50VHlwZQMDCQEAAAACIT0AAAACBQAAAApwbGF5ZXJDb2luBQAAAAdDT0lOUkVECQEAAAACIT0AAAACBQAAAApwbGF5ZXJDb2luBQAAAAhDT0lOQkxVRQcJAAACAAAAAQIAAABASW52YWxpZCBwbGF5LCBjaGFuZ2UgeW91ciBiZXQgdG8gUkVEIG9yIEJMVUUgY29pbi4gR2FtZSBhYm9ydGVkLgMDCQAAAAAAAAIFAAAAC3BheW1lbnRUeXBlAgAAAARXQkVUCQAAZgAAAAIFAAAACkJFVE1JTldCRVQFAAAABmFtb3VudAcJAAACAAAAAQkAASwAAAACAgAAABtUaGUgbWluaW11bSBiZXQgb24gV2JldCBpcyAJAAGkAAAAAQkAAGkAAAACBQAAAApCRVRNSU5XQkVUBQAAAAdXQVZFTEVUAwMJAAAAAAAAAgUAAAALcGF5bWVudFR5cGUCAAAABVdBVkVTCQAAZgAAAAIFAAAAC0JFVE1JTldBVkVTBQAAAAZhbW91bnQHCQAAAgAAAAEJAAEsAAAAAgIAAAAcVGhlIG1pbmltdW0gYmV0IG9uIFdhdmVzIGlzIAkAAaQAAAABCQAAaQAAAAIFAAAAC0JFVE1JTldBVkVTBQAAAAdXQVZFTEVUCQAAaQAAAAIJAABoAAAAAgkAAGgAAAACBQAAAAZhbW91bnQAAAAAAAAAAAIJAABlAAAAAgAAAAAAAAAAZAkAAGQAAAACBQAAAAtGRUVXQVZFU0JFVAUAAAAJRkVFTUNBRkVFAAAAAAAAAABkAAAAAwAAAAFpAQAAAAxwbGF5Q29pbmZsaXAAAAABAAAABnBhQ29pbgQAAAAGZ2FtZUlkCQACWAAAAAEIBQAAAAFpAAAADXRyYW5zYWN0aW9uSWQEAAAACmdhbWVJZFVzZWQJAQAAAAlpc0RlZmluZWQAAAABCQAEHQAAAAIFAAAABHRoaXMFAAAABmdhbWVJZAQAAAAHcGF5bWVudAkBAAAAB2V4dHJhY3QAAAABCAUAAAABaQAAAAdwYXltZW50BAAAAApmZWVBc3NldElkCQEAAAAJaXNEZWZpbmVkAAAAAQgFAAAAAWkAAAAKZmVlQXNzZXRJZAMDCQEAAAACIT0AAAACCAUAAAAHcGF5bWVudAAAAAdhc3NldElkCQAD7AAAAAEBAAAABBOr2TMJAQAAAAIhPQAAAAIIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQFAAAABFdCRVQHCQAAAgAAAAECAAAAMVBheW1lbnQgc2hvdWxkIGJlIGluIFdiZXQgb3IgV2F2ZXMuIEdhbWUgYWJvcnRlZC4DBQAAAApmZWVBc3NldElkCQAAAgAAAAECAAAAMVRyYW5zYWN0aW9uJ3MgZmVlIG11c3QgYmUgaW4gV2F2ZXMuIEdhbWUgYWJvcnRlZC4DBQAAAApnYW1lSWRVc2VkCQAAAgAAAAECAAAAMVBhc3NlZCBnYW1lSWQgaGFkIGJlZW4gdXNlZCBiZWZvcmUuIEdhbWUgYWJvcnRlZC4EAAAACm5ld0dhbWVOdW0JAQAAABBJbmNyZW1lbnRHYW1lTnVtAAAAAAQAAAAPcGxheWVyQVB1YktleTU4CQACWAAAAAEIBQAAAAFpAAAAD2NhbGxlclB1YmxpY0tleQQAAAAHcGF5VHlwZQkBAAAAC3BheW1lbnRUeXBlAAAAAQUAAAAHcGF5bWVudAQAAAAGd2luQW10CQEAAAAaVmFsaWRhdGVCZXRBbmREZWZpbmVXaW5BbXQAAAADCAUAAAAHcGF5bWVudAAAAAZhbW91bnQFAAAABnBhQ29pbgUAAAAHcGF5VHlwZQQAAAALZ2FtZURhdGFTdHIJAQAAABFGb3JtYXRHYW1lRGF0YVN0cgAAAAkFAAAADlNUQVRFU1VCTUlUVEVEBQAAAAZwYUNvaW4FAAAAD3BsYXllckFQdWJLZXk1OAUAAAAHcGF5VHlwZQgFAAAAB3BheW1lbnQAAAAGYW1vdW50BQAAAAZ3aW5BbXQCAAAAAAIAAAAAAgAAAAAJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAA9HQU1FU0NPVU5URVJLRVkFAAAACm5ld0dhbWVOdW0JAARMAAAAAgkBAAAACURhdGFFbnRyeQAAAAIFAAAABmdhbWVJZAUAAAALZ2FtZURhdGFTdHIFAAAAA25pbAkBAAAAC1RyYW5zZmVyU2V0AAAAAQUAAAADbmlsAAAAAWkBAAAAE2FjY2VwdENvaW5DaGFsbGVuZ2UAAAACAAAABmdhbWVJZAAAAAZyc2FTaWcEAAAADGdhbWVEYXRhTGlzdAkBAAAAE0V4dHJhY3RHYW1lRGF0YUxpc3QAAAABBQAAAAZnYW1lSWQEAAAACWdhbWVTdGF0ZQkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAADElkeEdhbWVTdGF0ZQQAAAAGcGFDb2luCQABkQAAAAIFAAAADGdhbWVEYXRhTGlzdAUAAAAOSWR4UGxheWVyQUNvaW4EAAAACnBhUHViS2V5NTgJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAABJJZHhQbGF5ZXJBUHViS2V5NTgEAAAAB3BheVR5cGUJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAAApJZHhQYXlUeXBlBAAAAAZwYXlBbXQJAQAAAA1wYXJzZUludFZhbHVlAAAAAQkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAACUlkeFBheUFtdAQAAAAGd2luQW10CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAAAlJZHhXaW5BbXQEAAAAB3BheW1lbnQJAQAAAAdleHRyYWN0AAAAAQgFAAAAAWkAAAAHcGF5bWVudAQAAAAKZmVlQXNzZXRJZAkBAAAACWlzRGVmaW5lZAAAAAEIBQAAAAFpAAAACmZlZUFzc2V0SWQEAAAACnBiUHViS2V5NTgJAAJYAAAAAQgFAAAAAWkAAAAPY2FsbGVyUHVibGljS2V5BAAAAAhwYXlUeXBlQgkBAAAAC3BheW1lbnRUeXBlAAAAAQUAAAAHcGF5bWVudAMDCQEAAAACIT0AAAACCAUAAAAHcGF5bWVudAAAAAdhc3NldElkCQAD7AAAAAEBAAAABBOr2TMJAQAAAAIhPQAAAAIIBQAAAAdwYXltZW50AAAAB2Fzc2V0SWQFAAAABFdCRVQHCQAAAgAAAAECAAAAMVBheW1lbnQgc2hvdWxkIGJlIGluIFdiZXQgb3IgV2F2ZXMuIEdhbWUgYWJvcnRlZC4DBQAAAApmZWVBc3NldElkCQAAAgAAAAECAAAAMVRyYW5zYWN0aW9uJ3MgZmVlIG11c3QgYmUgaW4gV2F2ZXMuIEdhbWUgYWJvcnRlZC4DCQAAAAAAAAIFAAAACnBhUHViS2V5NTgFAAAACnBiUHViS2V5NTgJAAACAAAAAQIAAAA/WW91IGNhbid0IGFjY2VwdCBhIGNoYWxsZW5nZSBjcmVhdGVkIGJ5IHlvdXJzZWxmLiBHYW1lIGFib3J0ZWQuAwkBAAAAAiE9AAAAAgUAAAAHcGF5VHlwZQUAAAAIcGF5VHlwZUIJAAACAAAAAQIAAABaUGF5bWVudCBtdXN0IGJlIG1hZGUgaW4gdGhlIHNhbWUgdG9rZW4gYXMgdGhlIGJldCwgV0JFVC9XQkVUIG9yIFdBVkVTL1dBVkVTLiBHYW1lIGFib3J0ZWQuAwkBAAAAAiE9AAAAAgUAAAAGcGF5QW10CAUAAAAHcGF5bWVudAAAAAZhbW91bnQJAAACAAAAAQIAAABAUGF5b3V0IG11c3QgYmUgZXF1YWwgdG8gdGhlIGNoYWxsZW5nZXIgYmV0IGFtb3VudC4gR2FtZSBhYm9ydGVkLgMJAQAAAAIhPQAAAAIFAAAACWdhbWVTdGF0ZQUAAAAOU1RBVEVTVUJNSVRURUQJAAACAAAAAQIAAAAzSW52YWxpZCBnYW1lIHN0YXRlIGZvciBwYXNzZWQgZ2FtZUlkLiBHYW1lIGFib3J0ZWQuBAAAAARyYW5kCQEAAAAPR2VuZXJhdGVSYW5kSW50AAAAAgUAAAAGZ2FtZUlkBQAAAAZyc2FTaWcEAAAACWx1Y2t5Q29pbgMJAABmAAAAAgUAAAAEcmFuZAAAAAAAAAAAMgUAAAAHQ09JTlJFRAUAAAAIQ09JTkJMVUUEAAAABnBiQ29pbgMJAAAAAAAAAgUAAAAGcGFDb2luBQAAAAdDT0lOUkVEBQAAAAhDT0lOQkxVRQUAAAAHQ09JTlJFRAQAAAAMdG9rZW5Bc3NldElkCQEAAAAJdG9rZW5UeXBlAAAAAQUAAAAHcGF5VHlwZQQAAAAObmV3R2FtZURhdGFTdHIJAQAAABFGb3JtYXRHYW1lRGF0YVN0cgAAAAkFAAAADVNUQVRFRklOSVNIRUQFAAAABnBhQ29pbgUAAAAKcGFQdWJLZXk1OAUAAAAHcGF5VHlwZQUAAAAGcGF5QW10BQAAAAZ3aW5BbXQFAAAABnBiQ29pbgUAAAAKcGJQdWJLZXk1OAUAAAAJbHVja3lDb2luBAAAAAd3aW5BZGRyAwkAAAAAAAACBQAAAAZwYUNvaW4FAAAACWx1Y2t5Q29pbgkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQkAAlkAAAABBQAAAApwYVB1YktleTU4CAUAAAABaQAAAAZjYWxsZXIJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAZnYW1lSWQFAAAADm5ld0dhbWVEYXRhU3RyBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAOV0FMTEVUV0FWRVNCRVQJAABpAAAAAgkAAGgAAAACBQAAAAZ3aW5BbXQFAAAAC0ZFRVdBVkVTQkVUAAAAAAAAAABkBQAAAAx0b2tlbkFzc2V0SWQJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAMV0FMTEVUTUNBRkVFCQAAaQAAAAIJAABoAAAAAgUAAAAGd2luQW10BQAAAAtGRUVXQVZFU0JFVAAAAAAAAAAAZAUAAAAMdG9rZW5Bc3NldElkCQAETAAAAAIJAQAAAA5TY3JpcHRUcmFuc2ZlcgAAAAMFAAAAB3dpbkFkZHIFAAAABndpbkFtdAUAAAAMdG9rZW5Bc3NldElkBQAAAANuaWwAAAABaQEAAAATY2FuY2VsQ29pbkNoYWxsZW5nZQAAAAEAAAAGZ2FtZUlkBAAAAAxnYW1lRGF0YUxpc3QJAQAAABNFeHRyYWN0R2FtZURhdGFMaXN0AAAAAQUAAAAGZ2FtZUlkBAAAAAlnYW1lU3RhdGUJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAAAxJZHhHYW1lU3RhdGUEAAAABnBhQ29pbgkAAZEAAAACBQAAAAxnYW1lRGF0YUxpc3QFAAAADklkeFBsYXllckFDb2luBAAAAApwYVB1YktleTU4CQABkQAAAAIFAAAADGdhbWVEYXRhTGlzdAUAAAASSWR4UGxheWVyQVB1YktleTU4BAAAAAdwYXlUeXBlCQABkQAAAAIFAAAADGdhbWVEYXRhTGlzdAUAAAAKSWR4UGF5VHlwZQQAAAAGcGF5QW10CQEAAAANcGFyc2VJbnRWYWx1ZQAAAAEJAAGRAAAAAgUAAAAMZ2FtZURhdGFMaXN0BQAAAAlJZHhQYXlBbXQEAAAABndpbkFtdAkBAAAADXBhcnNlSW50VmFsdWUAAAABCQABkQAAAAIFAAAADGdhbWVEYXRhTGlzdAUAAAAJSWR4V2luQW10BAAAAAhwdWJLZXk1OAkAAlgAAAABCAUAAAABaQAAAA9jYWxsZXJQdWJsaWNLZXkEAAAACmZlZUFzc2V0SWQJAQAAAAlpc0RlZmluZWQAAAABCAUAAAABaQAAAApmZWVBc3NldElkAwUAAAAKZmVlQXNzZXRJZAkAAAIAAAABAgAAADFUcmFuc2FjdGlvbidzIGZlZSBtdXN0IGJlIGluIFdhdmVzLiBHYW1lIGFib3J0ZWQuAwkBAAAAAiE9AAAAAgUAAAAJZ2FtZVN0YXRlBQAAAA5TVEFURVNVQk1JVFRFRAkAAAIAAAABAgAAADNJbnZhbGlkIGdhbWUgc3RhdGUgZm9yIHBhc3NlZCBnYW1lSWQuIEdhbWUgYWJvcnRlZC4DCQEAAAACIT0AAAACBQAAAApwYVB1YktleTU4BQAAAAhwdWJLZXk1OAkAAAIAAAABAgAAAEFZb3UgY2Fubm90IGNhbmNlbCBhIGdhbWUgY3JlYXRlZCBieSBhbm90aGVyIHBsYXllci4gR2FtZSBhYm9ydGVkLgMJAAAAAAAAAggFAAAAAWkAAAAGY2FsbGVyBQAAAAR0aGlzCQAAAgAAAAECAAAANUNvaW5mbGlwIGNvbnRyYWN0IGNhbm5vdCBjYW5jZWwgYSBnYW1lLiBHYW1lIGFib3J0ZWQuBAAAAA5uZXdHYW1lRGF0YVN0cgkBAAAAEUZvcm1hdEdhbWVEYXRhU3RyAAAACQUAAAANU1RBVEVDQU5DRUxFRAUAAAAGcGFDb2luBQAAAApwYVB1YktleTU4BQAAAAdwYXlUeXBlBQAAAAZwYXlBbXQFAAAABndpbkFtdAIAAAAAAgAAAAACAAAAAAQAAAAJcmVmdW5kQW10CQAAZQAAAAIFAAAABnBheUFtdAkAAGkAAAACCQAAaAAAAAIFAAAABnBheUFtdAUAAAALRkVFV0FWRVNCRVQAAAAAAAAAAGQEAAAADHJlZnVuZFdhbGxldAkBAAAAFGFkZHJlc3NGcm9tUHVibGljS2V5AAAAAQkAAlkAAAABBQAAAApwYVB1YktleTU4BAAAAAtyZWZ1bmRUb2tlbgkBAAAACXRva2VuVHlwZQAAAAEFAAAAB3BheVR5cGUJAQAAAAxTY3JpcHRSZXN1bHQAAAACCQEAAAAIV3JpdGVTZXQAAAABCQAETAAAAAIJAQAAAAlEYXRhRW50cnkAAAACBQAAAAZnYW1lSWQFAAAADm5ld0dhbWVEYXRhU3RyBQAAAANuaWwJAQAAAAtUcmFuc2ZlclNldAAAAAEJAARMAAAAAgkBAAAADlNjcmlwdFRyYW5zZmVyAAAAAwUAAAAMcmVmdW5kV2FsbGV0BQAAAAlyZWZ1bmRBbXQFAAAAC3JlZnVuZFRva2VuBQAAAANuaWwAAAAAuJIfYA==", "chainId": 84, "height": 747756, "spentComplexity": 0 } View: original | compacted Prev: Eior6y1njH3Syqo6jVsoCa9irafm1npPHaqQuLyh4Njb Next: CadePmeFdXCUMSVNRxZJN2D3F6kWT74BhJ5XLkAwyLrX Diff:
OldNewDifferences
227227 then COINBLUE
228228 else COINRED
229229 let tokenAssetId = tokenType(payType)
230- let newGameDataStr = FormatGameDataStr(STATEACCEPTED, paCoin, paPubKey58, payType, payAmt, winAmt, pbCoin, pbPubKey58, luckyCoin)
230+ let newGameDataStr = FormatGameDataStr(STATEFINISHED, paCoin, paPubKey58, payType, payAmt, winAmt, pbCoin, pbPubKey58, luckyCoin)
231231 let winAddr = if ((paCoin == luckyCoin))
232232 then addressFromPublicKey(fromBase58String(paPubKey58))
233233 else i.caller
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 3 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let RSAPUBLIC = fromBase64String("base64:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAg4dAR6XbBDAS9hr/Ej3dJv6Ffc466x/mOGMWU3lrABs3qa8BHmuJGnkfbpEf2vAwYTOWPvvzfM10OBbfloSyq3c9MKvyTe1luBLGqW4vZUXIyvSgz1liyUVefIQy3dyF9jbeTZbC0bbcT/7O3DEL+01z6A+rDCacSZ0lGolSQ6AnhLxzIkVpOQJbrBmC+x+ZuZPCMWzJynd5aeOn7jaj/mkRVyxe6g/0OhWz4NiiZXeuMRB+8mKy0fWD/UlIlZWHsAS2ZmrkXKqjLq0/0wr8ILJkznjSqdnI5Ibjg3uQrj/4AN+i9r28aQ73/ZkPtY5Sbw0AOiABBu7gHmq9ayVxZQIDAQAB")
55
66 let GAMESCOUNTERKEY = "$GAME_NUM"
77
88 let WBET = base58'A4q1mYKo11yuH9gmvDodeJoksagcyQzeFE9JtphMWddw'
99
1010 let WALLETWAVESBET = Address(base58'3MtCy2PCFPyu8A9SRNL4qUo1V17SGLHftD8')
1111
1212 let WALLETMCAFEE = Address(base58'3MtCy2PCFPyu8A9SRNL4qUo1V17SGLHftD8')
1313
1414 let FEEWAVESBET = 4
1515
1616 let FEEMCAFEE = 2
1717
1818 let WAVELET = 100000000
1919
2020 let STATESUBMITTED = "SUBMITTED"
2121
2222 let STATEACCEPTED = "ACCEPTED"
2323
2424 let STATEFINISHED = "FINISHED"
2525
2626 let STATECANCELED = "CANCELED"
2727
2828 let COINRED = "RED"
2929
3030 let COINBLUE = "BLUE"
3131
3232 let BETMINWAVES = ((1 * WAVELET) / 4)
3333
3434 let BETMINWBET = (100 * WAVELET)
3535
3636 let IdxGameState = 0
3737
3838 let IdxPlayerACoin = 1
3939
4040 let IdxPlayerAPubKey58 = 2
4141
4242 let IdxPayType = 3
4343
4444 let IdxPayAmt = 4
4545
4646 let IdxWinAmt = 5
4747
4848 let IdxPlayerBCoin = 6
4949
5050 let IdxPlayerBPubKey58 = 7
5151
5252 let IdxLuckyCoin = 8
5353
5454 func IncrementGameNum () = {
5555 let gameNum = match getInteger(this, GAMESCOUNTERKEY) {
5656 case num: Int =>
5757 num
5858 case _ =>
5959 0
6060 }
6161 (gameNum + 1)
6262 }
6363
6464
6565 func GenerateRandInt (gameId,rsaSign) = {
6666 let rsaSigValid = rsaVerify(SHA256, toBytes(gameId), rsaSign, RSAPUBLIC)
6767 if (rsaSigValid)
6868 then {
6969 let rand = (toInt(sha256(rsaSign)) % 100)
7070 if ((0 > rand))
7171 then ((-1 * rand) + 1)
7272 else (rand + 1)
7373 }
7474 else throw("Invalid RSA signature")
7575 }
7676
7777
7878 func paymentType (payment) = if ((payment.assetId == WBET))
7979 then "WBET"
8080 else "WAVES"
8181
8282
8383 func tokenType (token) = if ((token == "WBET"))
8484 then WBET
8585 else unit
8686
8787
8888 func FormatGameDataParam (p) = {
8989 let s = size(p)
9090 if ((s == 0))
9191 then throw("Parameter size must be greater then 0")
9292 else if ((s > 99))
9393 then throw("Parameter size must be less then 100")
9494 else if ((10 > s))
9595 then (("0" + toString(s)) + p)
9696 else (toString(s) + p)
9797 }
9898
9999
100100 func FormatGameDataStr (gameState,playerACoin,playerAPubKey58,payType,payAmount,winAmt,playerBCoin,playerBPubKey58,luckyCoin) = {
101101 let fullStateStr = ((((((((((FormatGameDataParam(gameState) + "_") + FormatGameDataParam(playerACoin)) + "_") + FormatGameDataParam(playerAPubKey58)) + "_") + FormatGameDataParam(payType)) + "_") + FormatGameDataParam(toString(payAmount))) + "_") + FormatGameDataParam(toString(winAmt)))
102102 if (if (if ((playerBCoin == ""))
103103 then true
104104 else (playerBPubKey58 == ""))
105105 then true
106106 else (luckyCoin == ""))
107107 then fullStateStr
108108 else ((((((fullStateStr + "_") + FormatGameDataParam(playerBCoin)) + "_") + FormatGameDataParam(playerBPubKey58)) + "_") + FormatGameDataParam(luckyCoin))
109109 }
110110
111111
112112 func RemoveUnderscoreIfPresent (remaining) = if ((size(remaining) > 0))
113113 then drop(remaining, 1)
114114 else remaining
115115
116116
117117 func ParseNextAttribute (remaining) = {
118118 let s = size(remaining)
119119 if ((s > 0))
120120 then {
121121 let nn = parseIntValue(take(remaining, 2))
122122 let v = take(drop(remaining, 2), nn)
123123 let tmpRemaining = drop(remaining, (nn + 2))
124124 let remainingState = RemoveUnderscoreIfPresent(tmpRemaining)
125125 [v, remainingState]
126126 }
127127 else throw("Empty string was passed into parseNextAttribute func")
128128 }
129129
130130
131131 func ParseGameRawDataStr (rawStateStr) = {
132132 let gameState = ParseNextAttribute(rawStateStr)
133133 let paCoin = ParseNextAttribute(gameState[1])
134134 let paPubKey58 = ParseNextAttribute(paCoin[1])
135135 let payType = ParseNextAttribute(paPubKey58[1])
136136 let payAmt = ParseNextAttribute(payType[1])
137137 let winAmt = ParseNextAttribute(payAmt[1])
138138 [gameState[0], paCoin[0], paPubKey58[0], payType[0], payAmt[0], winAmt[0]]
139139 }
140140
141141
142142 func ExtractGameDataList (gameId) = {
143143 let rawDataStr = match getString(this, gameId) {
144144 case str: String =>
145145 str
146146 case _ =>
147147 throw(("Couldn't find game by " + gameId))
148148 }
149149 ParseGameRawDataStr(rawDataStr)
150150 }
151151
152152
153153 func ValidateBetAndDefineWinAmt (amount,playerCoin,paymentType) = if (if ((playerCoin != COINRED))
154154 then (playerCoin != COINBLUE)
155155 else false)
156156 then throw("Invalid play, change your bet to RED or BLUE coin. Game aborted.")
157157 else if (if ((paymentType == "WBET"))
158158 then (BETMINWBET > amount)
159159 else false)
160160 then throw(("The minimum bet on Wbet is " + toString((BETMINWBET / WAVELET))))
161161 else if (if ((paymentType == "WAVES"))
162162 then (BETMINWAVES > amount)
163163 else false)
164164 then throw(("The minimum bet on Waves is " + toString((BETMINWAVES / WAVELET))))
165165 else (((amount * 2) * (100 - (FEEWAVESBET + FEEMCAFEE))) / 100)
166166
167167
168168 @Callable(i)
169169 func playCoinflip (paCoin) = {
170170 let gameId = toBase58String(i.transactionId)
171171 let gameIdUsed = isDefined(getString(this, gameId))
172172 let payment = extract(i.payment)
173173 let feeAssetId = isDefined(i.feeAssetId)
174174 if (if ((payment.assetId != assetInfo(base58'WAVES')))
175175 then (payment.assetId != WBET)
176176 else false)
177177 then throw("Payment should be in Wbet or Waves. Game aborted.")
178178 else if (feeAssetId)
179179 then throw("Transaction's fee must be in Waves. Game aborted.")
180180 else if (gameIdUsed)
181181 then throw("Passed gameId had been used before. Game aborted.")
182182 else {
183183 let newGameNum = IncrementGameNum()
184184 let playerAPubKey58 = toBase58String(i.callerPublicKey)
185185 let payType = paymentType(payment)
186186 let winAmt = ValidateBetAndDefineWinAmt(payment.amount, paCoin, payType)
187187 let gameDataStr = FormatGameDataStr(STATESUBMITTED, paCoin, playerAPubKey58, payType, payment.amount, winAmt, "", "", "")
188188 ScriptResult(WriteSet([DataEntry(GAMESCOUNTERKEY, newGameNum), DataEntry(gameId, gameDataStr)]), TransferSet(nil))
189189 }
190190 }
191191
192192
193193
194194 @Callable(i)
195195 func acceptCoinChallenge (gameId,rsaSig) = {
196196 let gameDataList = ExtractGameDataList(gameId)
197197 let gameState = gameDataList[IdxGameState]
198198 let paCoin = gameDataList[IdxPlayerACoin]
199199 let paPubKey58 = gameDataList[IdxPlayerAPubKey58]
200200 let payType = gameDataList[IdxPayType]
201201 let payAmt = parseIntValue(gameDataList[IdxPayAmt])
202202 let winAmt = parseIntValue(gameDataList[IdxWinAmt])
203203 let payment = extract(i.payment)
204204 let feeAssetId = isDefined(i.feeAssetId)
205205 let pbPubKey58 = toBase58String(i.callerPublicKey)
206206 let payTypeB = paymentType(payment)
207207 if (if ((payment.assetId != assetInfo(base58'WAVES')))
208208 then (payment.assetId != WBET)
209209 else false)
210210 then throw("Payment should be in Wbet or Waves. Game aborted.")
211211 else if (feeAssetId)
212212 then throw("Transaction's fee must be in Waves. Game aborted.")
213213 else if ((paPubKey58 == pbPubKey58))
214214 then throw("You can't accept a challenge created by yourself. Game aborted.")
215215 else if ((payType != payTypeB))
216216 then throw("Payment must be made in the same token as the bet, WBET/WBET or WAVES/WAVES. Game aborted.")
217217 else if ((payAmt != payment.amount))
218218 then throw("Payout must be equal to the challenger bet amount. Game aborted.")
219219 else if ((gameState != STATESUBMITTED))
220220 then throw("Invalid game state for passed gameId. Game aborted.")
221221 else {
222222 let rand = GenerateRandInt(gameId, rsaSig)
223223 let luckyCoin = if ((rand > 50))
224224 then COINRED
225225 else COINBLUE
226226 let pbCoin = if ((paCoin == COINRED))
227227 then COINBLUE
228228 else COINRED
229229 let tokenAssetId = tokenType(payType)
230- let newGameDataStr = FormatGameDataStr(STATEACCEPTED, paCoin, paPubKey58, payType, payAmt, winAmt, pbCoin, pbPubKey58, luckyCoin)
230+ let newGameDataStr = FormatGameDataStr(STATEFINISHED, paCoin, paPubKey58, payType, payAmt, winAmt, pbCoin, pbPubKey58, luckyCoin)
231231 let winAddr = if ((paCoin == luckyCoin))
232232 then addressFromPublicKey(fromBase58String(paPubKey58))
233233 else i.caller
234234 ScriptResult(WriteSet([DataEntry(gameId, newGameDataStr)]), TransferSet([ScriptTransfer(WALLETWAVESBET, ((winAmt * FEEWAVESBET) / 100), tokenAssetId), ScriptTransfer(WALLETMCAFEE, ((winAmt * FEEWAVESBET) / 100), tokenAssetId), ScriptTransfer(winAddr, winAmt, tokenAssetId)]))
235235 }
236236 }
237237
238238
239239
240240 @Callable(i)
241241 func cancelCoinChallenge (gameId) = {
242242 let gameDataList = ExtractGameDataList(gameId)
243243 let gameState = gameDataList[IdxGameState]
244244 let paCoin = gameDataList[IdxPlayerACoin]
245245 let paPubKey58 = gameDataList[IdxPlayerAPubKey58]
246246 let payType = gameDataList[IdxPayType]
247247 let payAmt = parseIntValue(gameDataList[IdxPayAmt])
248248 let winAmt = parseIntValue(gameDataList[IdxWinAmt])
249249 let pubKey58 = toBase58String(i.callerPublicKey)
250250 let feeAssetId = isDefined(i.feeAssetId)
251251 if (feeAssetId)
252252 then throw("Transaction's fee must be in Waves. Game aborted.")
253253 else if ((gameState != STATESUBMITTED))
254254 then throw("Invalid game state for passed gameId. Game aborted.")
255255 else if ((paPubKey58 != pubKey58))
256256 then throw("You cannot cancel a game created by another player. Game aborted.")
257257 else if ((i.caller == this))
258258 then throw("Coinflip contract cannot cancel a game. Game aborted.")
259259 else {
260260 let newGameDataStr = FormatGameDataStr(STATECANCELED, paCoin, paPubKey58, payType, payAmt, winAmt, "", "", "")
261261 let refundAmt = (payAmt - ((payAmt * FEEWAVESBET) / 100))
262262 let refundWallet = addressFromPublicKey(fromBase58String(paPubKey58))
263263 let refundToken = tokenType(payType)
264264 ScriptResult(WriteSet([DataEntry(gameId, newGameDataStr)]), TransferSet([ScriptTransfer(refundWallet, refundAmt, refundToken)]))
265265 }
266266 }
267267
268268

github/deemru/w8io/c3f4982 
32.35 ms