tx · 2fKnLFXeMRi15d4aYSuwwSv34kWdRbmGpWC3qgVUyJf5

3N8NLvRGsbGhgoXy7EdigPbAz6N2i7ygBcZ:  -0.01700000 Waves

2023.12.12 19:40 [2883765] smart account 3N8NLvRGsbGhgoXy7EdigPbAz6N2i7ygBcZ > SELF 0.00000000 Waves

{ "type": 13, "id": "2fKnLFXeMRi15d4aYSuwwSv34kWdRbmGpWC3qgVUyJf5", "fee": 1700000, "feeAssetId": null, "timestamp": 1702399280814, "version": 2, "chainId": 84, "sender": "3N8NLvRGsbGhgoXy7EdigPbAz6N2i7ygBcZ", "senderPublicKey": "CQoe8BRHR78TuPQLcK3Ykv39w9CeNLhjKdj6TNbJ5FrM", "proofs": [ "5qVBqVzb7LtCUmaoqcxJT7p1cbZWJZpahoaAvSRHHV22mQKVVHtnb1kjnQoG5qQtX4eCw2D133QUPXa6uuec4eEY" ], "script": "base64:BgIaCAISBgoECAgBCBIDCgEEEgMKAQgSBAoCCAJGAANTRVACAl9fAAdXQVZFU0lEAQQTq9kzAAZXQVZFU0QAgMLXLwAJR0FNRV9OQU1FAglYbWFzIFRyZWUADFJBTkRPTV9SQU5HRQAFAAhOVU1fQkVUUwABAQxnZXRTdHJPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUHYWRkcmVzcwUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAEMZ2V0SW50T3JGYWlsAgdhZGRyZXNzA2tleQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCaCAIFB2FkZHJlc3MFA2tleQkAuQkCCQDMCAICCm1hbmRhdG9yeSAJAMwIAgkApQgBBQdhZGRyZXNzCQDMCAICAS4JAMwIAgUDa2V5CQDMCAICDyBpcyBub3QgZGVmaW5lZAUDbmlsAgABDWdldEJvb2xPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJsIAgUHYWRkcmVzcwUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAAQYWxsb3dlZEFzc2V0c0tleQIYJXMlc19fY2ZnX19hbGxvd2VkQXNzZXRzABFhc3NldHNEZWNpbWFsc0tleQIZJXMlc19fY2ZnX19hc3NldHNEZWNpbWFscwAOYmV0RGl2aWRlcnNLZXkCHCVzJXNfX2NmZ19fYXNzZXRzQmV0RGl2aWRlcnMADlJTQVBVQkxJQzY0S0VZAhYlcyVzX19jZmdfX3JzYVB1YmxpYzY0ABBTRVJWRVJBRERSRVNTS0VZAhYlcyVzX19jZmdfX2JlbnpBZGRyZXNzABBSQU5EVElNRUZSQU1FS0VZAhwlcyVzX19jZmdfX3dpdGhkcmF3VGltZUZyYW1lAA9HQU1FU0NPVU5URVJLRVkCFiVzJXNfX3J1bnRpbWVfX2dhbWVOdW0ACmJsb2NrZWRLZXkCICVzJXNfX3J1bnRpbWVfX2NvbnRyYWN0SXNCbG9ja2VkABJyZXNlcnZlZEFtb3VudHNLZXkCHiVzJXNfX3J1bnRpbWVfX3Jlc2VydmVkQW1vdW50cwELZ2V0SW50QXJyYXkBA2tleQQBYQkBDGdldFN0ck9yRmFpbAIFBHRoaXMFA2tleQoBBmZpbGxlcgIDYWNjAmVsCQDNCAIFA2FjYwkBDXBhcnNlSW50VmFsdWUBBQJlbAoAAiRsCQC1CQIFAWEFA1NFUAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEGZmlsbGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAZBU1NFVFMJALUJAgkBDGdldFN0ck9yRmFpbAIFBHRoaXMFEGFsbG93ZWRBc3NldHNLZXkFA1NFUAAIREVDSU1BTFMJAQtnZXRJbnRBcnJheQEFEWFzc2V0c0RlY2ltYWxzS2V5AAtCRVRESVZJREVSUwkBC2dldEludEFycmF5AQUOYmV0RGl2aWRlcnNLZXkBGGtleVJlc2VydmF0aW9uQnlBc3NldFN0cgEIYXNzZXRTdHIJAKwCAgIRJFJFU0VSVkVEX0FNT1VOVF8FCGFzc2V0U3RyARhrZXlSZXNlcnZhdGlvbkJ5QXNzZXRJZHgBCGFzc2V0SWR4CQEYa2V5UmVzZXJ2YXRpb25CeUFzc2V0U3RyAQkAkQMCBQZBU1NFVFMFCGFzc2V0SWR4AAtNSU5GRUVXQVZFUwkAaQIJAGgCAAUFBldBVkVTRADoBwAJaWR4QXNzZXRzAAAAC2lkeERlY2ltYWxzAAEAC2lkeERpdmlkZXJzAAIABEJFVDEAAQAEQkVUMgACAARCRVQ0AAQABEJFVDgACAAFQkVUMTQADgAIUkFURU1VTFQAkE4ABFJBVEUAkKEPAARCRVRTCQDMCAIFBEJFVDIFA25pbAAMSWR4R2FtZVN0YXRlAAAAD0lkeFBsYXllckNob2ljZQABABFJZHhQbGF5ZXJQdWJLZXk1OAACABBJZHhTdGFydGVkSGVpZ2h0AAMADElkeFdpbkFtb3VudAAEAApJZHhBc3NldElkAAUADlNUQVRFU1VCTUlUVEVEAglTVUJNSVRURUQACFNUQVRFV09OAgNXT04ACVNUQVRFTE9TVAIETE9TVAEPZ2V0U3RyaW5nT3JGYWlsAQNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQR0aGlzBQNrZXkJAKwCAgUDa2V5AiMga2V5IGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhpcy5zdGF0ZQAJUlNBUFVCTElDCQDbBAEJAQ9nZXRTdHJpbmdPckZhaWwBBQ5SU0FQVUJMSUM2NEtFWQAGU0VSVkVSCQERQGV4dHJOYXRpdmUoMTA2MikBCQEPZ2V0U3RyaW5nT3JGYWlsAQUQU0VSVkVSQUREUkVTU0tFWQATUkFORE9SQUNMRVRJTUVGUkFNRQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRBSQU5EVElNRUZSQU1FS0VZAKA4AQhnZXRJbnRPcgIDa2V5B2RlZmF1bHQDCQEJaXNEZWZpbmVkAQkAnwgBBQNrZXkJARFAZXh0ck5hdGl2ZSgxMDU1KQEFA2tleQUHZGVmYXVsdAEGc2V0SW50AgNrZXkFdmFsdWUJAQxJbnRlZ2VyRW50cnkCBQNrZXkFBXZhbHVlAQxpbmNyZW1lbnRJbnQBA2tleQkBBnNldEludAIFA2tleQkAZAIJAQhnZXRJbnRPcgIFA2tleQD///////////8BAAEBCWNoYW5nZUludAIDa2V5AmJ5CQEGc2V0SW50AgUDa2V5CQBkAgkBCGdldEludE9yAgUDa2V5AAAFAmJ5AQxhc3NldElkVG9TdHIBDWFzc2V0SWRPclVuaXQEByRtYXRjaDAFDWFzc2V0SWRPclVuaXQDCQABAgUHJG1hdGNoMAIKQnl0ZVZlY3RvcgQBYgUHJG1hdGNoMAkA2AQBBQFiAgVXQVZFUwEOYXNzZXRJZEZyb21TdHIBCmFzc2V0SWRTdHIDCQAAAgUKYXNzZXRJZFN0cgIFV0FWRVMFBHVuaXQJANkEAQUKYXNzZXRJZFN0cgEPZ2V0QXNzZXRCYWxhbmNlAQ1hc3NldElkT3JVbml0BAckbWF0Y2gwBQ1hc3NldElkT3JVbml0AwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEB2Fzc2V0SWQFByRtYXRjaDAJAPAHAgUEdGhpcwUHYXNzZXRJZAgJAO8HAQUEdGhpcwlhdmFpbGFibGUBFWluY3JlYXNlUmVzZXJ2ZUFtb3VudAIJd2luQW1vdW50CGFzc2V0SWR4BAphc3NldElkU3RyCQCRAwIFBkFTU0VUUwUIYXNzZXRJZHgEEW5ld1Jlc2VydmVkQW1vdW50CQBkAgkBCGdldEludE9yAgkBGGtleVJlc2VydmF0aW9uQnlBc3NldElkeAEFCGFzc2V0SWR4AAAFCXdpbkFtb3VudAMJAGYCBRFuZXdSZXNlcnZlZEFtb3VudAkBD2dldEFzc2V0QmFsYW5jZQEJAQ5hc3NldElkRnJvbVN0cgEFCmFzc2V0SWRTdHIJAAIBCQCsAgIJAKwCAgIWSW5zdWZmaWNpZW50IGZ1bmRzIG9uIAUJR0FNRV9OQU1FAjMgYWNjb3VudC4gVHJhbnNhY3Rpb24gd2FzIHJlamVjdGVkIGZvciB5b3VyIHNhZmV0eS4FEW5ld1Jlc2VydmVkQW1vdW50ARZkZWNyZWFzZVJlc2VydmVkQW1vdW50AwZnYW1lSWQIYXNzZXRJZHgJd2luQW1vdW50AwkAZgIAAAkAZQIJAQhnZXRJbnRPcgIJARhrZXlSZXNlcnZhdGlvbkJ5QXNzZXRJZHgBBQhhc3NldElkeAAABQl3aW5BbW91bnQJAAIBCQCsAgIJAKwCAgIISW52YWxpZCAFCUdBTUVfTkFNRQIvIGFjY291bnQgc3RhdGUgLSByZXNlcnZlZCBhbW91bnQgaXMgbGVzcyB0aGFuIDAJAQljaGFuZ2VJbnQCCQEYa2V5UmVzZXJ2YXRpb25CeUFzc2V0SWR4AQUIYXNzZXRJZHgJAQEtAQUJd2luQW1vdW50ARZ2YWxpZGF0ZUFuZEdldEFzc2V0SWR4AQphc3NldElkU3RyBANpZHgJAM8IAgUGQVNTRVRTBQphc3NldElkU3RyAwkBASEBCQEJaXNEZWZp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bXgwNAkAagIJALEJAQkA9wMBCQDLAQIFB3JzYVNpZ24JAJoDAQUBagkAZQIFBG14MTQFBG14MDQEBnJhbmRZNAkAZAIJAJEDAgUDdG9wAAIJAGoCCQCxCQEJAPcDAQkAywECBQdyc2FTaWduCQCaAwEFBnJhbmRYNAUCaDQEAmE0CQBlAgkAaAIJAJEDAgUDdG9wAAIFAk00BQZyYW5kWTQEAmI0CQBlAgkAaAIJAJEDAgUGYm90dG9tAAIFAk00BQZyYW5kWTQEA3gwNAkAawMJAGUCCQBoAgkAkQMCBQN0b3AAAAUCYjQJAGgCCQCRAwIFBmJvdHRvbQAABQJhNAUCTTQFAmg0BAN4MTQJAGsDCQBlAgkAaAIJAJEDAgUDdG9wAAEFAmI0CQBoAgkAkQMCBQZib3R0b20AAQUCYTQFAk00BQJoNAMJAGYCBQN4MDQFBnJhbmRYNAkAzAgCCQBlAgkAaAIAAgUEbXgwNAUGcmFuZFg0CQDMCAIJAGUCCQBoAgACBQNteTQFBnJhbmRZNAUDbmlsAwkAZgIFBnJhbmRYNAUDeDE0CQDMCAIJAGUCCQBoAgACBQRteDE0BQZyYW5kWDQJAMwIAgkAZQIJAGgCAAIFA215NAUGcmFuZFk0BQNuaWwJAMwIAgUGcmFuZFg0CQDMCAIFBnJhbmRZNAUDbmlsARJnZW5lcmF0ZVJhbmRDaG9pY2UCBmdhbWVJZAdyc2FTaWduBAtyc2FTaWdWYWxpZAkAqBQEBQZTSEEyNTYJAJsDAQUGZ2FtZUlkBQdyc2FTaWduBQlSU0FQVUJMSUMDCQEBIQEFC3JzYVNpZ1ZhbGlkCQACAQIVSW52YWxpZCBSU0Egc2lnbmF0dXJlBARyYW5kCQBqAgkAsQkBCQD3AwEFB3JzYVNpZ24FDFJBTkRPTV9SQU5HRQkApAMBCQBkAgUEcmFuZAABAQtpc1BsYXllcldpbgIMcGxheWVyQ2hvaWNlCnJhbmRDaG9pc2UEAXMJALECAQUMcGxheWVyQ2hvaWNlCgEFY2hlY2sCAWEBeAMFAWEGAwkAZwIFAXMFAXgJAAACCQCvAgIJALACAgUMcGxheWVyQ2hvaWNlCQBlAgUBeAABAAEFCnJhbmRDaG9pc2UHCgACJGwJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAcKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBWNoZWNrAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQEPZm9ybWF0R2FtZURhdGFTCQpnYW1lU3RhdHVzDHBsYXllckNob2ljZQ5wbGF5ZXJQdWJLZXk1OA1zdGFydGVkSGVpZ2h0CXdpbkFtb3VudAhhc3NldElkeAtyYW5kT3JFbXB0eQZ4Q29vcmQGeUNvb3JkCQC5CQIJAMwIAgUKZ2FtZVN0YXR1cwkAzAgCBQxwbGF5ZXJDaG9pY2UJAMwIAgUOcGxheWVyUHViS2V5NTgJAMwIAgUNc3RhcnRlZEhlaWdodAkAzAgCBQl3aW5BbW91bnQJAMwIAgUIYXNzZXRJZHgJAMwIAgMJAAACBQtyYW5kT3JFbXB0eQIAAgAFC3JhbmRPckVtcHR5CQDMCAIFBnhDb29yZAkAzAgCBQZ5Q29vcmQFA25pbAIBXwEOZm9ybWF0R2FtZURhdGEJCmdhbWVTdGF0dXMMcGxheWVyQ2hvaWNlDnBsYXllclB1YktleTU4DXN0YXJ0ZWRIZWlnaHQJd2luQW1vdW50CGFzc2V0SWR4C3JhbmRPckVtcHR5BnhDb29yZAZ5Q29vcmQJAQ9mb3JtYXRHYW1lRGF0YVMJBQpnYW1lU3RhdHVzBQxwbGF5ZXJDaG9pY2UFDnBsYXllclB1YktleTU4CQCkAwEFDXN0YXJ0ZWRIZWlnaHQJAKQDAQUJd2luQW1vdW50CQCkAwEFCGFzc2V0SWR4BQtyYW5kT3JFbXB0eQkApAMBBQZ4Q29vcmQJAKQDAQUGeUNvb3JkAQ5maW5pc2hHYW1lRGF0YQYMb3JpZ0dhbWVEYXRhCmdhbWVTdGF0dXMEcmFuZAx3aW5CeVRpbWVvdXQGeENvb3JkBnlDb29yZAQOZmluaXNoR2FtZURhdGEJAQ9mb3JtYXRHYW1lRGF0YVMJBQpnYW1lU3RhdHVzCQCRAwIFDG9yaWdHYW1lRGF0YQUPSWR4UGxheWVyQ2hvaWNlCQCRAwIFDG9yaWdHYW1lRGF0YQURSWR4UGxheWVyUHViS2V5NTgJAJEDAgUMb3JpZ0dhbWVEYXRhBRBJZHhTdGFydGVkSGVpZ2h0CQCRAwIFDG9yaWdHYW1lRGF0YQUMSWR4V2luQW1vdW50CQCRAwIFDG9yaWdHYW1lRGF0YQUKSWR4QXNzZXRJZAUEcmFuZAkApAMBBQZ4Q29vcmQJAKQDAQUGeUNvb3JkAwUMd2luQnlUaW1lb3V0CQCsAgIFDmZpbmlzaEdhbWVEYXRhAghfVElNRU9VVAUOZmluaXNoR2FtZURhdGEBD2V4dHJhY3RHYW1lRGF0YQEGZ2FtZUlkCQC1CQIEByRtYXRjaDAJAJ0IAgUEdGhpcwUGZ2FtZUlkAwkAAQIFByRtYXRjaDACBlN0cmluZwQDc3RyBQckbWF0Y2gwBQNzdHIJAAIBCQCsAgIJAKwCAgIGR2FtZTogBQZnYW1lSWQCCyBub3QgZm91bmQuAgFfBAFpAQ1jb25zdHJ1Y3RvclYxBAtyc2FQdWJsaWM2NAtiZW56QWRkcmVzcxNyYW5kT3JhY2xlVGltZUZyYW1lEHRva2Vuc0Rlc2NyaXB0b3IDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAg5ub3QgYXV0aG9yaXplZAoBCHNwbGl0dGVyAgNhY2MEZWxlbQQHdG9rTGlzdAkAtQkCBQRlbGVtAgE6AwkBAiE9AgkAkAMBBQd0b2tMaXN0AAMJAAIBAhRJbnZhbGlkIGFzc2V0IHJlY29yZAkAlQoDCQDNCAIIBQNhY2MCXzEJAJEDAgUHdG9rTGlzdAUJaWR4QXNzZXRzCQDNCAIIBQNhY2MCXzIJAJEDAgUHdG9rTGlzdAULaWR4RGVjaW1hbHMJAM0IAggFA2FjYwJfMwkAkQMCBQd0b2tMaXN0BQtpZHhEaXZpZGVycwQBcgoAAiRsCQC8CQIFEHRva2Vuc0Rlc2NyaXB0b3ICAV8KAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFA25pbAUDbmlsBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBCHNwbGl0dGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCQDMCAIJAQtTdHJpbmdFbnRyeQIFDlJTQVBVQkxJQzY0S0VZBQtyc2FQdWJsaWM2NAkAzAgCCQELU3RyaW5nRW50cnkCBRBTRVJWRVJBRERSRVNTS0VZBQtiZW56QWRkcmVzcwkAzAgCCQEMSW50ZWdlckVudHJ5AgUQUkFORFRJTUVGUkFNRUtFWQUTcmFuZE9yYWNsZVRpbWVGcmFtZQkAzAgCCQELU3RyaW5nRW50cnkCBRBhbGxvd2VkQXNzZXRzS2V5CQC6CQIIBQFyAl8xBQNTRVAJAMwIAgkBC1N0cmluZ0VudHJ5AgURYXNzZXRzRGVjaW1hbHNLZXkJALkJAggFAXICXzIFA1NFUAkAzAgCCQELU3RyaW5nRW50cnkCBQ5iZXREaXZpZGVyc0tleQkAuQkCCAUBcgJfMwUDU0VQBQNuaWwBaQELbWFpbnRlbmFuY2UBB2Jsb2NrZWQDCQECIT0CCAUBaQZjYWxsZXIFBlNFUlZFUgkAAgECDm5vdCBhdXRob3JpemVkCQDMCAIJAQxCb29sZWFuRW50cnkCBQpibG9ja2VkS2V5BQdibG9ja2VkBQNuaWwBaQEDYmV0AQxwbGF5ZXJDaG9pY2UDCQELdmFsdWVPckVsc2UCCQCgCAEFCmJsb2NrZWRLZXkHCQACAQIfR2FtZSBpcyBzdG9wcGVkIGZvciBtYWludGVuZW5jZQQGZ2FtZUlkCQDYBAEIBQFpDXRyYW5zYWN0aW9uSWQDCQBnAgABCQCQAwEIBQFpCHBheW1lbnRzCQACAQIbMiBwYXltZW50cyBtdXN0IGJlIGF0dGFjaGVkAwkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwUGZ2FtZUlkCQACAQkArAICCQCsAgICCUJldCBmb3I6IAUGZ2FtZUlkAhIgd2FzIGFscmVhZHkgbWFkZS4EBmJldFBtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAZmZWVQbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAQMJAQlpc0RlZmluZWQBCAUGZmVlUG10B2Fzc2V0SWQJAAIBAi1mZWVQbXQgKDJuZCBwYXltZW50KSBhc3NldElkIG11c3QgYmUgaW4gV2F2ZXMDCQBmAgULTUlORkVFV0FWRVMIBQZmZWVQbXQGYW1vdW50CQACAQIrZmVlUG10ICgybmQgcGF5bWVudCkgbXVzdCBiZSA+PSAwLjAwNSBXYXZlcwQKYXNzZXRJZFN0cgkBDGFzc2V0SWRUb1N0cgEIBQZiZXRQbXQHYXNzZXRJZAQQaW50ZXJuYWxBc3NldElkeAkBFnZhbGlkYXRlQW5kR2V0QXNzZXRJZHgBBQphc3NldElkU3RyBApjb21taXNzaW9uCAUGZmVlUG10BmFtb3VudAQJd2luQW1vdW50CQEadmFsaWRhdGVCZXRBbmRHZXRXaW5BbW91bnQDCAUGYmV0UG10BmFtb3VudAUQaW50ZXJuYWxBc3NldElkeAUMcGxheWVyQ2hvaWNlBA5wbGF5ZXJQdWJLZXk1OAkA2AQBCAUBaQ9jYWxsZXJQdWJsaWNLZXkECGdhbWVEYXRhCQEOZm9ybWF0R2FtZURhdGEJBQ5TVEFURVNVQk1JVFRFRAUMcGxheWVyQ2hvaWNlBQ5wbGF5ZXJQdWJLZXk1OAUGaGVpZ2h0BQl3aW5BbW91bnQFEGludGVybmFsQXNzZXRJZHgCAAD///////////8BAP///////////wEJAMwIAgkBDEludGVnZXJFbnRyeQIJARhrZXlSZXNlcnZhdGlvbkJ5QXNzZXRJZHgBBRBpbnRlcm5hbEFzc2V0SWR4CQEVaW5jcmVhc2VSZXNlcnZlQW1vdW50AgUJd2luQW1vdW50BRBpbnRlcm5hbEFzc2V0SWR4CQDMCAIJAQxpbmNyZW1lbnRJbnQBBQ9HQU1FU0NPVU5URVJLRVkJAMwIAgkBC1N0cmluZ0VudHJ5AgUGZ2FtZUlkBQhnYW1lRGF0YQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZTRVJWRVIFCmNvbW1pc3Npb24IBQZmZWVQbXQHYXNzZXRJZAUDbmlsAWkBCHdpdGhkcmF3AgZnYW1lSWQHcnNhU2lnbgQIZ2FtZURhdGEJAQ9leHRyYWN0R2FtZURhdGEBBQZnYW1lSWQECWdhbWVTdGF0ZQkAkQMCBQhnYW1lRGF0YQUMSWR4R2FtZVN0YXRlBAxwbGF5ZXJDaG9pY2UJAJEDAgUIZ2FtZURhdGEFD0lkeFBsYXllckNob2ljZQQNc3RhcnRlZEhlaWdodAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGdhbWVEYXRhBRBJZHhTdGFydGVkSGVpZ2h0BAl3aW5BbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhnYW1lRGF0YQUMSWR4V2luQW1vdW50BAhhc3NldElkeAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGdhbWVEYXRhBQpJZHhBc3NldElkBA5wbGF5ZXJQdWJLZXk1OAkAkQMCBQhnYW1lRGF0YQURSWR4UGxheWVyUHViS2V5NTgEDXBsYXllckFkZHJlc3MJAKcIAQkA2QQBBQ5wbGF5ZXJQdWJLZXk1OAMJAQIhPQIFCWdhbWVTdGF0ZQUOU1RBVEVTVUJNSVRURUQJAAIBAiRJbnZhbGlkIGdhbWUgc3RhdGUgZm9yIHBhc3NlZCBnYW1lSWQDCQECIT0CCAUBaQZjYWxsZXIFBlNFUlZFUgkAAgECK1JlZ3VsYXIgd2l0aGRyYXcgY2FuIGJlIGRvbmUgYnkgc2VydmVyIG9ubHkEDHdpbkJ5VGltZW91dAkAZgIJAGUCBQZoZWlnaHQFDXN0YXJ0ZWRIZWlnaHQFE1JBTkRPUkFDTEVUSU1FRlJBTUUECnJhbmRDaG9pY2UDBQx3aW5CeVRpbWVvdXQJAK8CAgUMcGxheWVyQ2hvaWNlAAEJARJnZW5lcmF0ZVJhbmRDaG9pY2UCBQZnYW1lSWQFB3JzYVNpZ24ECXBsYXllcldpbgkBC2lzUGxheWVyV2luAgUMcGxheWVyQ2hvaWNlBQpyYW5kQ2hvaWNlBA1uZXdHYW1lU3RhdHVzAwUJcGxheWVyV2luBQhTVEFURVdPTgUJU1RBVEVMT1NUBAZjb29yZHMDBQlwbGF5ZXJXaW4JAMwIAgkBAS0BBQJNNAkAzAgCCQEBLQEFAk00BQNuaWwJAQlnZXRDb29yZHMCBQZnYW1lSWQFB3JzYVNpZ24EC25ld0dhbWVEYXRhCQEOZmluaXNoR2FtZURhdGEGBQhnYW1lRGF0YQUNbmV3R2FtZVN0YXR1cwUKcmFuZENob2ljZQUMd2luQnlUaW1lb3V0CQBpAgkAkQMCBQZjb29yZHMAAAUCTTQJAGkCCQCRAwIFBmNvb3JkcwABBQJNNAkAzggCCQDMCAIJAQtTdHJpbmdFbnRyeQIFBmdhbWVJZAULbmV3R2FtZURhdGEJAMwIAgkBFmRlY3JlYXNlUmVzZXJ2ZWRBbW91bnQDBQZnYW1lSWQFCGFzc2V0SWR4BQl3aW5BbW91bnQFA25pbAMFCXBsYXllcldpbgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQ1wbGF5ZXJBZGRyZXNzBQl3aW5BbW91bnQJAQ5hc3NldElkRnJvbVN0cgEJAJEDAgUGQVNTRVRTBQhhc3NldElkeAUDbmlsBQNuaWwBAnR4AQZ2ZXJpZnkAAwkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAgFAnR4D3NlbmRlclB1YmxpY0tleQQHJG1hdGNoMAUCdHgDCQABAgUHJG1hdGNoMAITVHJhbnNmZXJUcmFuc2FjdGlvbgQDdHR4BQckbWF0Y2gwBAhhc3NldElkeAkBFnZhbGlkYXRlQW5kR2V0QXNzZXRJZHgBCQEMYXNzZXRJZFRvU3RyAQgFA3R0eAdhc3NldElkCQBnAgkAZQIJAQ9nZXRBc3NldEJhbGFuY2UBCAUDdHR4B2Fzc2V0SWQIBQN0dHgGYW1vdW50CQEIZ2V0SW50T3ICCQEYa2V5UmVzZXJ2YXRpb25CeUFzc2V0SWR4AQUIYXNzZXRJZHgAAAMJAAECBQckbWF0Y2gwAhRTZXRTY3JpcHRUcmFuc2FjdGlvbgQDc3R4BQckbWF0Y2gwCgEHY2hlY2tlcgIDYWNjBWFzc2V0AwUDYWNjCQAAAgkBCGdldEludE9yAgkBGGtleVJlc2VydmF0aW9uQnlBc3NldFN0cgEFBWFzc2V0AAAAAAcKAAIkbAUGQVNTRVRTCgACJHMJAJADAQUCJGwKAAUkYWNjMAYKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBB2NoZWNrZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDEwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoDCQABAgUHJG1hdGNoMAIXSW52b2tlU2NyaXB0VHJhbnNhY3Rpb24EA2l0eAUHJG1hdGNoMAMJAAACCAUDaXR4BGRBcHAFBHRoaXMJAAACCAUDaXR4CGZ1bmN0aW9uAg1jb25zdHJ1Y3RvclYxBwcHE/Df4w==", "height": 2883765, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: CFJTzodtTfc9BN6gqaKMCjoN9S9G4Er3fHxoYvtWZ8EZ Next: E4hcche2nVENgLZA29jHVUsB5Z2TCDktD716RhguQUie Diff:
OldNewDifferences
217217 func getCoords (gameId,rsaSign) = {
218218 func calcAreas (acc,ignored) = {
219219 let i = acc._3
220- let top = HOR_LINES[i]
221- let bottom = HOR_LINES[(i + 1)]
222- let area4 = (((((top[1] - top[0]) + bottom[1]) - bottom[0]) * (bottom[2] - top[2])) * 5000)
223- $Tuple3((acc._1 :+ area4), (acc._2 + area4), (acc._3 + 1))
220+ if ((i == 14))
221+ then acc
222+ else {
223+ let top = HOR_LINES[i]
224+ let bottom = HOR_LINES[(i + 1)]
225+ let area4 = (((((top[1] - top[0]) + bottom[1]) - bottom[0]) * (bottom[2] - top[2])) * 5000)
226+ $Tuple3((acc._1 :+ area4), (acc._2 + area4), (acc._3 + 1))
227+ }
224228 }
225229
226- let $t079398006 = {
230+ let $t079748041 = {
227231 let $l = HOR_LINES
228232 let $s = size($l)
229233 let $acc0 = $Tuple3(nil, 0, 0)
233237
234238 func $f0_2 ($a,$i) = if (($i >= $s))
235239 then $a
236- else throw("List size exceeds 14")
240+ else throw("List size exceeds 15")
237241
238- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14)
242+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
239243 }
240- let areas = $t079398006._1
241- let totalArea = $t079398006._2
244+ let areas = $t079748041._1
245+ let totalArea = $t079748041._2
242246 let rand = (toInt(sha256(rsaSign)) % totalArea)
243247 func check (acc,area) = {
244248 let i = acc._1
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let SEP = "__"
55
66 let WAVESID = base58'WAVES'
77
88 let WAVESD = 100000000
99
1010 let GAME_NAME = "Xmas Tree"
1111
1212 let RANDOM_RANGE = 5
1313
1414 let NUM_BETS = 1
1515
1616 func getStrOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
1717
1818
1919 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
2020
2121
2222 func getBoolOrFail (address,key) = valueOrErrorMessage(getBoolean(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
2323
2424
2525 let allowedAssetsKey = "%s%s__cfg__allowedAssets"
2626
2727 let assetsDecimalsKey = "%s%s__cfg__assetsDecimals"
2828
2929 let betDividersKey = "%s%s__cfg__assetsBetDividers"
3030
3131 let RSAPUBLIC64KEY = "%s%s__cfg__rsaPublic64"
3232
3333 let SERVERADDRESSKEY = "%s%s__cfg__benzAddress"
3434
3535 let RANDTIMEFRAMEKEY = "%s%s__cfg__withdrawTimeFrame"
3636
3737 let GAMESCOUNTERKEY = "%s%s__runtime__gameNum"
3838
3939 let blockedKey = "%s%s__runtime__contractIsBlocked"
4040
4141 let reservedAmountsKey = "%s%s__runtime__reservedAmounts"
4242
4343 func getIntArray (key) = {
4444 let a = getStrOrFail(this, key)
4545 func filler (acc,el) = (acc :+ parseIntValue(el))
4646
4747 let $l = split(a, SEP)
4848 let $s = size($l)
4949 let $acc0 = nil
5050 func $f0_1 ($a,$i) = if (($i >= $s))
5151 then $a
5252 else filler($a, $l[$i])
5353
5454 func $f0_2 ($a,$i) = if (($i >= $s))
5555 then $a
5656 else throw("List size exceeds 10")
5757
5858 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
5959 }
6060
6161
6262 let ASSETS = split(getStrOrFail(this, allowedAssetsKey), SEP)
6363
6464 let DECIMALS = getIntArray(assetsDecimalsKey)
6565
6666 let BETDIVIDERS = getIntArray(betDividersKey)
6767
6868 func keyReservationByAssetStr (assetStr) = ("$RESERVED_AMOUNT_" + assetStr)
6969
7070
7171 func keyReservationByAssetIdx (assetIdx) = keyReservationByAssetStr(ASSETS[assetIdx])
7272
7373
7474 let MINFEEWAVES = ((5 * WAVESD) / 1000)
7575
7676 let idxAssets = 0
7777
7878 let idxDecimals = 1
7979
8080 let idxDividers = 2
8181
8282 let BET1 = 1
8383
8484 let BET2 = 2
8585
8686 let BET4 = 4
8787
8888 let BET8 = 8
8989
9090 let BET14 = 14
9191
9292 let RATEMULT = 10000
9393
9494 let RATE = 250000
9595
9696 let BETS = [BET2]
9797
9898 let IdxGameState = 0
9999
100100 let IdxPlayerChoice = 1
101101
102102 let IdxPlayerPubKey58 = 2
103103
104104 let IdxStartedHeight = 3
105105
106106 let IdxWinAmount = 4
107107
108108 let IdxAssetId = 5
109109
110110 let STATESUBMITTED = "SUBMITTED"
111111
112112 let STATEWON = "WON"
113113
114114 let STATELOST = "LOST"
115115
116116 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (key + " key is not specified in this.state"))
117117
118118
119119 let RSAPUBLIC = fromBase64String(getStringOrFail(RSAPUBLIC64KEY))
120120
121121 let SERVER = addressFromStringValue(getStringOrFail(SERVERADDRESSKEY))
122122
123123 let RANDORACLETIMEFRAME = valueOrElse(getInteger(this, RANDTIMEFRAMEKEY), 7200)
124124
125125 func getIntOr (key,default) = if (isDefined(getInteger(key)))
126126 then getIntegerValue(key)
127127 else default
128128
129129
130130 func setInt (key,value) = IntegerEntry(key, value)
131131
132132
133133 func incrementInt (key) = setInt(key, (getIntOr(key, -1) + 1))
134134
135135
136136 func changeInt (key,by) = setInt(key, (getIntOr(key, 0) + by))
137137
138138
139139 func assetIdToStr (assetIdOrUnit) = match assetIdOrUnit {
140140 case b: ByteVector =>
141141 toBase58String(b)
142142 case _ =>
143143 "WAVES"
144144 }
145145
146146
147147 func assetIdFromStr (assetIdStr) = if ((assetIdStr == "WAVES"))
148148 then unit
149149 else fromBase58String(assetIdStr)
150150
151151
152152 func getAssetBalance (assetIdOrUnit) = match assetIdOrUnit {
153153 case assetId: ByteVector =>
154154 assetBalance(this, assetId)
155155 case _ =>
156156 wavesBalance(this).available
157157 }
158158
159159
160160 func increaseReserveAmount (winAmount,assetIdx) = {
161161 let assetIdStr = ASSETS[assetIdx]
162162 let newReservedAmount = (getIntOr(keyReservationByAssetIdx(assetIdx), 0) + winAmount)
163163 if ((newReservedAmount > getAssetBalance(assetIdFromStr(assetIdStr))))
164164 then throw((("Insufficient funds on " + GAME_NAME) + " account. Transaction was rejected for your safety."))
165165 else newReservedAmount
166166 }
167167
168168
169169 func decreaseReservedAmount (gameId,assetIdx,winAmount) = if ((0 > (getIntOr(keyReservationByAssetIdx(assetIdx), 0) - winAmount)))
170170 then throw((("Invalid " + GAME_NAME) + " account state - reserved amount is less than 0"))
171171 else changeInt(keyReservationByAssetIdx(assetIdx), -(winAmount))
172172
173173
174174 func validateAndGetAssetIdx (assetIdStr) = {
175175 let idx = indexOf(ASSETS, assetIdStr)
176176 if (!(isDefined(idx)))
177177 then throw("Invalid payment asset")
178178 else value(idx)
179179 }
180180
181181
182182 func validateBetAndGetWinAmount (bet,internalAssetIdx,playerChoice) = {
183183 let dicesCount = size(playerChoice)
184184 func checkAmount (a,x) = if (a)
185185 then true
186186 else (bet == ((x * DECIMALS[internalAssetIdx]) / BETDIVIDERS[internalAssetIdx]))
187187
188188 if (!({
189189 let $l = BETS
190190 let $s = size($l)
191191 let $acc0 = false
192192 func $f0_1 ($a,$i) = if (($i >= $s))
193193 then $a
194194 else checkAmount($a, $l[$i])
195195
196196 func $f0_2 ($a,$i) = if (($i >= $s))
197197 then $a
198198 else throw("List size exceeds 5")
199199
200200 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
201201 }))
202202 then throw("Bet amount is not valid")
203203 else if ((parseInt(playerChoice) == unit))
204204 then throw("Invalid player's choice")
205205 else if ((dicesCount != NUM_BETS))
206206 then throw("Invalid length of player's choice")
207207 else fraction(bet, RATE, RATEMULT)
208208 }
209209
210210
211211 let HOR_LINES = [[491, 506, 44], [455, 542, 120], [404, 596, 166], [441, 556, 177], [387, 620, 232], [423, 620, 232], [410, 592, 244], [329, 665, 321], [370, 666, 337], [355, 645, 349], [313, 692, 384], [289, 682, 405], [324, 657, 461], [450, 575, 525], [505, 505, 532]]
212212
213213 let HALF = 5000
214214
215215 let M4 = 10000
216216
217217 func getCoords (gameId,rsaSign) = {
218218 func calcAreas (acc,ignored) = {
219219 let i = acc._3
220- let top = HOR_LINES[i]
221- let bottom = HOR_LINES[(i + 1)]
222- let area4 = (((((top[1] - top[0]) + bottom[1]) - bottom[0]) * (bottom[2] - top[2])) * 5000)
223- $Tuple3((acc._1 :+ area4), (acc._2 + area4), (acc._3 + 1))
220+ if ((i == 14))
221+ then acc
222+ else {
223+ let top = HOR_LINES[i]
224+ let bottom = HOR_LINES[(i + 1)]
225+ let area4 = (((((top[1] - top[0]) + bottom[1]) - bottom[0]) * (bottom[2] - top[2])) * 5000)
226+ $Tuple3((acc._1 :+ area4), (acc._2 + area4), (acc._3 + 1))
227+ }
224228 }
225229
226- let $t079398006 = {
230+ let $t079748041 = {
227231 let $l = HOR_LINES
228232 let $s = size($l)
229233 let $acc0 = $Tuple3(nil, 0, 0)
230234 func $f0_1 ($a,$i) = if (($i >= $s))
231235 then $a
232236 else calcAreas($a, $l[$i])
233237
234238 func $f0_2 ($a,$i) = if (($i >= $s))
235239 then $a
236- else throw("List size exceeds 14")
240+ else throw("List size exceeds 15")
237241
238- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14)
242+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15)
239243 }
240- let areas = $t079398006._1
241- let totalArea = $t079398006._2
244+ let areas = $t079748041._1
245+ let totalArea = $t079748041._2
242246 let rand = (toInt(sha256(rsaSign)) % totalArea)
243247 func check (acc,area) = {
244248 let i = acc._1
245249 let newArea = (acc._2 + area)
246250 $Tuple3((i + 1), newArea, if ((newArea > rand))
247251 then i
248252 else acc._3)
249253 }
250254
251255 let j = ( let $l = areas
252256 let $s = size($l)
253257 let $acc0 = $Tuple3(0, 0, -1)
254258 func $f1_1 ($a,$i) = if (($i >= $s))
255259 then $a
256260 else check($a, $l[$i])
257261
258262 func $f1_2 ($a,$i) = if (($i >= $s))
259263 then $a
260264 else throw("List size exceeds 14")
261265
262266 $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14))._3
263267 let top = HOR_LINES[j]
264268 let bottom = HOR_LINES[(j + 1)]
265269 let mx04 = ((top[0] + bottom[0]) * HALF)
266270 let mx14 = ((top[1] + bottom[1]) * HALF)
267271 let h4 = ((bottom[2] - top[2]) * M4)
268272 let my4 = ((top[2] + bottom[2]) * HALF)
269273 let randX4 = (mx04 + (toInt(sha256((rsaSign + toBytes(j)))) % (mx14 - mx04)))
270274 let randY4 = (top[2] + (toInt(sha256((rsaSign + toBytes(randX4)))) % h4))
271275 let a4 = ((top[2] * M4) - randY4)
272276 let b4 = ((bottom[2] * M4) - randY4)
273277 let x04 = fraction(((top[0] * b4) - (bottom[0] * a4)), M4, h4)
274278 let x14 = fraction(((top[1] * b4) - (bottom[1] * a4)), M4, h4)
275279 if ((x04 > randX4))
276280 then [((2 * mx04) - randX4), ((2 * my4) - randY4)]
277281 else if ((randX4 > x14))
278282 then [((2 * mx14) - randX4), ((2 * my4) - randY4)]
279283 else [randX4, randY4]
280284 }
281285
282286
283287 func generateRandChoice (gameId,rsaSign) = {
284288 let rsaSigValid = rsaVerify_16Kb(SHA256, toBytes(gameId), rsaSign, RSAPUBLIC)
285289 if (!(rsaSigValid))
286290 then throw("Invalid RSA signature")
287291 else {
288292 let rand = (toInt(sha256(rsaSign)) % RANDOM_RANGE)
289293 toString((rand + 1))
290294 }
291295 }
292296
293297
294298 func isPlayerWin (playerChoice,randChoise) = {
295299 let s = size(playerChoice)
296300 func check (a,x) = if (a)
297301 then true
298302 else if ((s >= x))
299303 then (take(drop(playerChoice, (x - 1)), 1) == randChoise)
300304 else false
301305
302306 let $l = [1, 2, 3, 4, 5]
303307 let $s = size($l)
304308 let $acc0 = false
305309 func $f0_1 ($a,$i) = if (($i >= $s))
306310 then $a
307311 else check($a, $l[$i])
308312
309313 func $f0_2 ($a,$i) = if (($i >= $s))
310314 then $a
311315 else throw("List size exceeds 5")
312316
313317 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
314318 }
315319
316320
317321 func formatGameDataS (gameStatus,playerChoice,playerPubKey58,startedHeight,winAmount,assetIdx,randOrEmpty,xCoord,yCoord) = makeString([gameStatus, playerChoice, playerPubKey58, startedHeight, winAmount, assetIdx, if ((randOrEmpty == ""))
318322 then ""
319323 else randOrEmpty, xCoord, yCoord], "_")
320324
321325
322326 func formatGameData (gameStatus,playerChoice,playerPubKey58,startedHeight,winAmount,assetIdx,randOrEmpty,xCoord,yCoord) = formatGameDataS(gameStatus, playerChoice, playerPubKey58, toString(startedHeight), toString(winAmount), toString(assetIdx), randOrEmpty, toString(xCoord), toString(yCoord))
323327
324328
325329 func finishGameData (origGameData,gameStatus,rand,winByTimeout,xCoord,yCoord) = {
326330 let finishGameData = formatGameDataS(gameStatus, origGameData[IdxPlayerChoice], origGameData[IdxPlayerPubKey58], origGameData[IdxStartedHeight], origGameData[IdxWinAmount], origGameData[IdxAssetId], rand, toString(xCoord), toString(yCoord))
327331 if (winByTimeout)
328332 then (finishGameData + "_TIMEOUT")
329333 else finishGameData
330334 }
331335
332336
333337 func extractGameData (gameId) = split(match getString(this, gameId) {
334338 case str: String =>
335339 str
336340 case _ =>
337341 throw((("Game: " + gameId) + " not found."))
338342 }, "_")
339343
340344
341345 @Callable(i)
342346 func constructorV1 (rsaPublic64,benzAddress,randOracleTimeFrame,tokensDescriptor) = if ((i.caller != this))
343347 then throw("not authorized")
344348 else {
345349 func splitter (acc,elem) = {
346350 let tokList = split(elem, ":")
347351 if ((size(tokList) != 3))
348352 then throw("Invalid asset record")
349353 else $Tuple3((acc._1 :+ tokList[idxAssets]), (acc._2 :+ tokList[idxDecimals]), (acc._3 :+ tokList[idxDividers]))
350354 }
351355
352356 let r = {
353357 let $l = split_4C(tokensDescriptor, "_")
354358 let $s = size($l)
355359 let $acc0 = $Tuple3(nil, nil, nil)
356360 func $f0_1 ($a,$i) = if (($i >= $s))
357361 then $a
358362 else splitter($a, $l[$i])
359363
360364 func $f0_2 ($a,$i) = if (($i >= $s))
361365 then $a
362366 else throw("List size exceeds 10")
363367
364368 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
365369 }
366370 [StringEntry(RSAPUBLIC64KEY, rsaPublic64), StringEntry(SERVERADDRESSKEY, benzAddress), IntegerEntry(RANDTIMEFRAMEKEY, randOracleTimeFrame), StringEntry(allowedAssetsKey, makeString_2C(r._1, SEP)), StringEntry(assetsDecimalsKey, makeString(r._2, SEP)), StringEntry(betDividersKey, makeString(r._3, SEP))]
367371 }
368372
369373
370374
371375 @Callable(i)
372376 func maintenance (blocked) = if ((i.caller != SERVER))
373377 then throw("not authorized")
374378 else [BooleanEntry(blockedKey, blocked)]
375379
376380
377381
378382 @Callable(i)
379383 func bet (playerChoice) = if (valueOrElse(getBoolean(blockedKey), false))
380384 then throw("Game is stopped for maintenence")
381385 else {
382386 let gameId = toBase58String(i.transactionId)
383387 if ((1 >= size(i.payments)))
384388 then throw("2 payments must be attached")
385389 else if (isDefined(getString(this, gameId)))
386390 then throw((("Bet for: " + gameId) + " was already made."))
387391 else {
388392 let betPmt = value(i.payments[0])
389393 let feePmt = value(i.payments[1])
390394 if (isDefined(feePmt.assetId))
391395 then throw("feePmt (2nd payment) assetId must be in Waves")
392396 else if ((MINFEEWAVES > feePmt.amount))
393397 then throw("feePmt (2nd payment) must be >= 0.005 Waves")
394398 else {
395399 let assetIdStr = assetIdToStr(betPmt.assetId)
396400 let internalAssetIdx = validateAndGetAssetIdx(assetIdStr)
397401 let commission = feePmt.amount
398402 let winAmount = validateBetAndGetWinAmount(betPmt.amount, internalAssetIdx, playerChoice)
399403 let playerPubKey58 = toBase58String(i.callerPublicKey)
400404 let gameData = formatGameData(STATESUBMITTED, playerChoice, playerPubKey58, height, winAmount, internalAssetIdx, "", -1, -1)
401405 [IntegerEntry(keyReservationByAssetIdx(internalAssetIdx), increaseReserveAmount(winAmount, internalAssetIdx)), incrementInt(GAMESCOUNTERKEY), StringEntry(gameId, gameData), ScriptTransfer(SERVER, commission, feePmt.assetId)]
402406 }
403407 }
404408 }
405409
406410
407411
408412 @Callable(i)
409413 func withdraw (gameId,rsaSign) = {
410414 let gameData = extractGameData(gameId)
411415 let gameState = gameData[IdxGameState]
412416 let playerChoice = gameData[IdxPlayerChoice]
413417 let startedHeight = parseIntValue(gameData[IdxStartedHeight])
414418 let winAmount = parseIntValue(gameData[IdxWinAmount])
415419 let assetIdx = parseIntValue(gameData[IdxAssetId])
416420 let playerPubKey58 = gameData[IdxPlayerPubKey58]
417421 let playerAddress = addressFromPublicKey(fromBase58String(playerPubKey58))
418422 if ((gameState != STATESUBMITTED))
419423 then throw("Invalid game state for passed gameId")
420424 else if ((i.caller != SERVER))
421425 then throw("Regular withdraw can be done by server only")
422426 else {
423427 let winByTimeout = ((height - startedHeight) > RANDORACLETIMEFRAME)
424428 let randChoice = if (winByTimeout)
425429 then take(playerChoice, 1)
426430 else generateRandChoice(gameId, rsaSign)
427431 let playerWin = isPlayerWin(playerChoice, randChoice)
428432 let newGameStatus = if (playerWin)
429433 then STATEWON
430434 else STATELOST
431435 let coords = if (playerWin)
432436 then [-(M4), -(M4)]
433437 else getCoords(gameId, rsaSign)
434438 let newGameData = finishGameData(gameData, newGameStatus, randChoice, winByTimeout, (coords[0] / M4), (coords[1] / M4))
435439 ([StringEntry(gameId, newGameData), decreaseReservedAmount(gameId, assetIdx, winAmount)] ++ (if (playerWin)
436440 then [ScriptTransfer(playerAddress, winAmount, assetIdFromStr(ASSETS[assetIdx]))]
437441 else nil))
438442 }
439443 }
440444
441445
442446 @Verifier(tx)
443447 func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
444448 then match tx {
445449 case ttx: TransferTransaction =>
446450 let assetIdx = validateAndGetAssetIdx(assetIdToStr(ttx.assetId))
447451 ((getAssetBalance(ttx.assetId) - ttx.amount) >= getIntOr(keyReservationByAssetIdx(assetIdx), 0))
448452 case stx: SetScriptTransaction =>
449453 func checker (acc,asset) = if (acc)
450454 then (getIntOr(keyReservationByAssetStr(asset), 0) == 0)
451455 else false
452456
453457 let $l = ASSETS
454458 let $s = size($l)
455459 let $acc0 = true
456460 func $f0_1 ($a,$i) = if (($i >= $s))
457461 then $a
458462 else checker($a, $l[$i])
459463
460464 func $f0_2 ($a,$i) = if (($i >= $s))
461465 then $a
462466 else throw("List size exceeds 10")
463467
464468 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
465469 case itx: InvokeScriptTransaction =>
466470 if ((itx.dApp == this))
467471 then (itx.function == "constructorV1")
468472 else false
469473 case _ =>
470474 false
471475 }
472476 else false
473477

github/deemru/w8io/3ef1775 
78.23 ms