tx · DGsR1vDJrNaRA1WeRT65YhtvBeNefZrwUSMGXTQ1f4cU

3MyrsoUShtK8LVWE6mGVinCdwiJeedCtkvr:  -0.01400000 Waves

2023.11.28 13:36 [2863132] smart account 3MyrsoUShtK8LVWE6mGVinCdwiJeedCtkvr > SELF 0.00000000 Waves

{ "type": 13, "id": "DGsR1vDJrNaRA1WeRT65YhtvBeNefZrwUSMGXTQ1f4cU", "fee": 1400000, "feeAssetId": null, "timestamp": 1701167803265, "version": 1, "sender": "3MyrsoUShtK8LVWE6mGVinCdwiJeedCtkvr", "senderPublicKey": "53WfUfPHKFYj846Npe6Bu5indsxPueAsu9YWe8fnprXh", "proofs": [ "5c6URsJwZugGdwfdm4TagU3EwZp3JxF9Au1H1rySZ6A7BLtDkPqbdzmUyftrprU4VFF95pubZwZsRBn1ttz81Khc" ], "script": "base64:BgIaCAISBgoECAgBCBIDCgEEEgMKAQgSBAoCCAJCAANTRVACAl9fAAdXQVZFU0lEAQQTq9kzAAZXQVZFU0QAgMLXLwAJR0FNRV9OQU1FAg9DYXJkIG9mIHRoZSBEYXkADFJBTkRPTV9SQU5HRQAoAAhOVU1fQkVUUwABAAhXSU5fQ0FSRAkApAMBCQBlAgUMUkFORE9NX1JBTkdFAAEBDGdldFN0ck9yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAAQxnZXRJbnRPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUHYWRkcmVzcwUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAENZ2V0Qm9vbE9yRmFpbAIHYWRkcmVzcwNrZXkJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmwgCBQdhZGRyZXNzBQNrZXkJALkJAgkAzAgCAgptYW5kYXRvcnkgCQDMCAIJAKUIAQUHYWRkcmVzcwkAzAgCAgEuCQDMCAIFA2tleQkAzAgCAg8gaXMgbm90IGRlZmluZWQFA25pbAIAABBhbGxvd2VkQXNzZXRzS2V5AhglcyVzX19jZmdfX2FsbG93ZWRBc3NldHMAEWFzc2V0c0RlY2ltYWxzS2V5AhklcyVzX19jZmdfX2Fzc2V0c0RlY2ltYWxzAA5iZXREaXZpZGVyc0tleQIcJXMlc19fY2ZnX19hc3NldHNCZXREaXZpZGVycwAOUlNBUFVCTElDNjRLRVkCFiVzJXNfX2NmZ19fcnNhUHVibGljNjQAEFNFUlZFUkFERFJFU1NLRVkCFiVzJXNfX2NmZ19fYmVuekFkZHJlc3MAEFJBTkRUSU1FRlJBTUVLRVkCHCVzJXNfX2NmZ19fd2l0aGRyYXdUaW1lRnJhbWUAD0dBTUVTQ09VTlRFUktFWQIWJXMlc19fcnVudGltZV9fZ2FtZU51bQAKYmxvY2tlZEtleQIgJXMlc19fcnVudGltZV9fY29udHJhY3RJc0Jsb2NrZWQBC2dldEludEFycmF5AQNrZXkEAWEJAQxnZXRTdHJPckZhaWwCBQR0aGlzBQNrZXkKAQZmaWxsZXICA2FjYwJlbAkAzQgCBQNhY2MJAQ1wYXJzZUludFZhbHVlAQUCZWwKAAIkbAkAtQkCBQFhBQNTRVAKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBmZpbGxlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgAGQVNTRVRTCQC1CQIJAQxnZXRTdHJPckZhaWwCBQR0aGlzBRBhbGxvd2VkQXNzZXRzS2V5BQNTRVAACERFQ0lNQUxTCQELZ2V0SW50QXJyYXkBBRFhc3NldHNEZWNpbWFsc0tleQALQkVURElWSURFUlMJAQtnZXRJbnRBcnJheQEFDmJldERpdmlkZXJzS2V5ARhrZXlSZXNlcnZhdGlvbkJ5QXNzZXRTdHIBCGFzc2V0U3RyCQCsAgICESRSRVNFUlZFRF9BTU9VTlRfBQhhc3NldFN0cgEYa2V5UmVzZXJ2YXRpb25CeUFzc2V0SWR4AQhhc3NldElkeAkBGGtleVJlc2VydmF0aW9uQnlBc3NldFN0cgEJAJEDAgUGQVNTRVRTBQhhc3NldElkeAALTUlORkVFV0FWRVMJAGkCCQBoAgAFBQZXQVZFU0QA6AcACWlkeEFzc2V0cwAAAAtpZHhEZWNpbWFscwABAAtpZHhEaXZpZGVycwACAARCRVQxAAEABEJFVDIAAgAEQkVUNAAEAARCRVQ4AAgABUJFVDE0AA4ACFJBVEVNVUxUAJBOAARSQVRFAJChDwAEQkVUUwkAzAgCBQRCRVQyBQNuaWwADElkeEdhbWVTdGF0ZQAAAA9JZHhQbGF5ZXJDaG9pY2UAAQARSWR4UGxheWVyUHViS2V5NTgAAgAQSWR4U3RhcnRlZEhlaWdodAADAAxJZHhXaW5BbW91bnQABAAKSWR4QXNzZXRJZAAFAA5TVEFURVNVQk1JVFRFRAIJU1VCTUlUVEVEAAhTVEFURVdPTgIDV09OAAlTVEFURUxPU1QCBExPU1QBD2dldFN0cmluZ09yRmFpbAEDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwUDa2V5CQCsAgIFA2tleQIjIGtleSBpcyBub3Qgc3BlY2lmaWVkIGluIHRoaXMuc3RhdGUACVJTQVBVQkxJQwkA2wQBCQEPZ2V0U3RyaW5nT3JGYWlsAQUOUlNBUFVCTElDNjRLRVkABlNFUlZFUgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBD2dldFN0cmluZ09yRmFpbAEFEFNFUlZFUkFERFJFU1NLRVkAE1JBTkRPUkFDTEVUSU1FRlJBTUUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUQUkFORFRJTUVGUkFNRUtFWQCgOAEIZ2V0SW50T3ICA2tleQdkZWZhdWx0AwkBCWlzRGVmaW5lZAEJAJ8IAQUDa2V5CQERQGV4dHJOYXRpdmUoMTA1NSkBBQNrZXkFB2RlZmF1bHQBBnNldEludAIDa2V5BXZhbHVlCQEMSW50ZWdlckVudHJ5AgUDa2V5BQV2YWx1ZQEMaW5jcmVtZW50SW50AQNrZXkJAQZzZXRJbnQCBQNrZXkJAGQCCQEIZ2V0SW50T3ICBQNrZXkA////////////AQABAQljaGFuZ2VJbnQCA2tleQJieQkBBnNldEludAIFA2tleQkAZAIJAQhnZXRJbnRPcgIFA2tleQAABQJieQEMYXNzZXRJZFRvU3RyAQ1hc3NldElkT3JVbml0BAckbWF0Y2gwBQ1hc3NldElkT3JVbml0AwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAWIFByRtYXRjaDAJANgEAQUBYgIFV0FWRVMBDmFzc2V0SWRGcm9tU3RyAQphc3NldElkU3RyAwkAAAIFCmFzc2V0SWRTdHICBVdBVkVTBQR1bml0CQDZBAEFCmFzc2V0SWRTdHIBD2dldEFzc2V0QmFsYW5jZQENYXNzZXRJZE9yVW5pdAQHJG1hdGNoMAUNYXNzZXRJZE9yVW5pdAMJAAECBQckbWF0Y2gwAgpCeXRlVmVjdG9yBAdhc3NldElkBQckbWF0Y2gwCQDwBwIFBHRoaXMFB2Fzc2V0SWQICQDvBwEFBHRoaXMJYXZhaWxhYmxlARVpbmNyZWFzZVJlc2VydmVBbW91bnQCCXdpbkFtb3VudAhhc3NldElkeAQKYXNzZXRJZFN0cgkAkQMCBQZBU1NFVFMFCGFzc2V0SWR4BBFuZXdSZXNlcnZlZEFtb3VudAkAZAIJAQhnZXRJbnRPcgIJARhrZXlSZXNlcnZhdGlvbkJ5QXNzZXRJZHgBBQhhc3NldElkeAAABQl3aW5BbW91bnQDCQBmAgURbmV3UmVzZXJ2ZWRBbW91bnQJAQ9nZXRBc3NldEJhbGFuY2UBCQEOYXNzZXRJZEZyb21TdHIBBQphc3NldElkU3RyCQACAQkArAICCQCsAgICFkluc3VmZmljaWVudCBmdW5kcyBvbiAFCUdBTUVfTkFNRQIzIGFjY291bnQuIFRyYW5zYWN0aW9uIHdhcyByZWplY3RlZCBmb3IgeW91ciBzYWZldHkuBRFuZXdSZXNlcnZlZEFtb3VudAEWZGVjcmVhc2VSZXNlcnZlZEFtb3VudAMGZ2FtZUlkCGFzc2V0SWR4CXdpbkFtb3VudAMJAGYCAAAJAGUCCQEIZ2V0SW50T3ICCQEYa2V5UmVzZXJ2YXRpb25CeUFzc2V0SWR4AQUIYXNzZXRJZHgAAAUJd2luQW1vdW50CQACAQkArAICCQCsAgICCEludmFsaWQgBQlHQU1FX05BTUUCLyBhY2NvdW50IHN0YXRlIC0gcmVzZXJ2ZWQgYW1vdW50IGlzIGxlc3MgdGhhbiAwCQEJY2hhbmdlSW50AgkBGGtleVJlc2VydmF0aW9uQnlBc3NldElkeAEFCGFzc2V0SWR4CQEBLQEFCXdpbkFtb3VudAEWdmFsaWRhdGVBbmRHZXRBc3NldElkeAEKYXNzZXRJZFN0cgQDaWR4CQDPCAIFBkFTU0VUUwUKYXNzZXRJZFN0cgMJAQEhAQkBCWlzRGVmaW5lZAEFA2lkeAkAAgECFUludmFsaWQgcGF5bWVudCBhc3NldAkBBXZhbHVlAQUDaWR4ARp2YWxpZGF0ZUJldEFuZEdldFdpbkFtb3VudAMDYmV0EGludGVybmFsQXNzZXRJZHgMcGxheWVyQ2hvaWNlBApkaWNlc0NvdW50CQCxAgEFDHBsYXllckNob2ljZQoBC2NoZWNrQW1vdW50AgFhAXgDBQFhBgkAAAIFA2JldAkAaQIJAGgCBQF4CQCRAwIFCERFQ0lNQUxTBRBpbnRlcm5hbEFzc2V0SWR4CQCRAwIFC0JFVERJVklERVJTBRBpbnRlcm5hbEFzc2V0SWR4AwkBASEBCgACJGwFBEJFVFMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBwoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQELY2hlY2tBbW91bnQCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDUJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFCQACAQIXQmV0IGFtb3VudCBpcyBub3QgdmFsaWQDCQAAAgkAtgkBBQxwbGF5ZXJDaG9pY2UFBHVuaXQJAAIBAhdJbnZhbGlkIHBsYXllcidzIGNob2ljZQkAawMFA2JldAUEUkFURQUIUkFURU1VTFQBEmdlbmVyYXRlUmFuZENob2ljZQMGZ2FtZUlkB3JzYVNpZ24McGxheWVyQ2hvaWNlBAtyc2FTaWdWYWxpZAkAqBQEBQZTSEEyNTYJAJsDAQUGZ2FtZUlkBQdyc2FTaWduBQlSU0FQVUJMSUMDCQEBIQEFC3JzYVNpZ1ZhbGlkCQACAQIVSW52YWxpZCBSU0Egc2lnbmF0dXJlBARyYW5kCQBqAgkAsQkBCQD3AwEJAMsBAgUHcnNhU2lnbgkAmwMBBQxwbGF5ZXJDaG9pY2UFDFJBTkRPTV9SQU5HRQkApAMBBQRyYW5kAQtpc1BsYXllcldpbgIMcGxheWVyQ2hvaWNlCnJhbmRDaG9pc2UJAAACBQxwbGF5ZXJDaG9pY2UFCnJhbmRDaG9pc2UBD2Zvcm1hdEdhbWVEYXRhUwcKZ2FtZVN0YXR1cwxwbGF5ZXJDaG9pY2UOcGxheWVyUHViS2V5NTgNc3RhcnRlZEhlaWdodAl3aW5BbW91bnQIYXNzZXRJZHgLcmFuZE9yRW1wdHkJALkJAgkAzAgCBQpnYW1lU3RhdHVzCQDMCAIFDHBsYXllckNob2ljZQkAzAgCBQ5wbGF5ZXJQdWJLZXk1OAkAzAgCBQ1zdGFydGVkSGVpZ2h0CQDMCAIFCXdpbkFtb3VudAkAzAgCBQhhc3NldElkeAkAzAgCAwkAAAIFC3JhbmRPckVtcHR5AgACAAULcmFuZE9yRW1wdHkFA25pbAIBXwEOZm9ybWF0R2FtZURhdGEHCmdhbWVTdGF0dXMMcGxheWVyQ2hvaWNlDnBsYXllclB1YktleTU4DXN0YXJ0ZWRIZWlnaHQJd2luQW1vdW50CGFzc2V0SWR4C3JhbmRPckVtcHR5CQEPZm9ybWF0R2FtZURhdGFTBwUKZ2FtZVN0YXR1cwUMcGxheWVyQ2hvaWNlBQ5wbGF5ZXJQdWJLZXk1OAkApAMBBQ1zdGFydGVkSGVpZ2h0CQCkAwEFCXdpbkFtb3VudAkApAMBBQhhc3NldElkeAULcmFuZE9yRW1wdHkBDmZpbmlzaEdhbWVEYXRhBAxvcmlnR2FtZURhdGEKZ2FtZVN0YXR1cwRyYW5kDHdpbkJ5VGltZW91dAQOZmluaXNoR2FtZURhdGEJAQ9mb3JtYXRHYW1lRGF0YVMHBQpnYW1lU3RhdHVzBQRyYW5kCQCRAwIFDG9yaWdHYW1lRGF0YQURSWR4UGxheWVyUHViS2V5NTgJAJEDAgUMb3JpZ0dhbWVEYXRhBRBJZHhTdGFydGVkSGVpZ2h0CQCRAwIFDG9yaWdHYW1lRGF0YQUMSWR4V2luQW1vdW50CQCRAwIFDG9yaWdHYW1lRGF0YQUKSWR4QXNzZXRJZAUIV0lOX0NBUkQDBQx3aW5CeVRpbWVvdXQJAKwCAgUOZmluaXNoR2FtZURhdGECCF9USU1FT1VUBQ5maW5pc2hHYW1lRGF0YQEPZXh0cmFjdEdhbWVEYXRhAQZnYW1lSWQJALUJAgQHJG1hdGNoMAkAnQgCBQR0aGlzBQZnYW1lSWQDCQABAgUHJG1hdGNoMAIGU3RyaW5nBANzdHIFByRtYXRjaDAFA3N0cgkAAgEJAKwCAgkArAICAgZHYW1lOiAFBmdhbWVJZAILIG5vdCBmb3VuZC4CAV8EAWkBDWNvbnN0cnVjdG9yVjEEC3JzYVB1YmxpYzY0C2JlbnpBZGRyZXNzE3JhbmRPcmFjbGVUaW1lRnJhbWUQdG9rZW5zRGVzY3JpcHRvcgMJAQIhPQIIBQFpBmNhbGxlcgUGU0VSVkVSCQACAQIObm90IGF1dGhvcml6ZWQKAQhzcGxpdHRlcgIDYWNjBGVsZW0EB3Rva0xpc3QJALUJAgUEZWxlbQIBOgMJAQIhPQIJAJADAQUHdG9rTGlzdAAECQACAQIUSW52YWxpZCBhc3NldCByZWNvcmQJAJUKAwkAzQgCCAUDYWNjAl8xCQCRAwIFB3Rva0xpc3QFCWlkeEFzc2V0cwkAzQgCCAUDYWNjAl8yCQCRAwIFB3Rva0xpc3QFC2lkeERlY2ltYWxzCQDNCAIIBQNhY2MCXzMJAJEDAgUHdG9rTGlzdAULaWR4RGl2aWRlcnMEAXIKAAIkbAkAvAkCBRB0b2tlbnNEZXNjcmlwdG9yAgFfCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFA25pbAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhzcGxpdHRlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgkAzAgCCQELU3RyaW5nRW50cnkCBQ5SU0FQVUJMSUM2NEtFWQULcnNhUHVibGljNjQJAMwIAgkBC1N0cmluZ0VudHJ5AgUQU0VSVkVSQUREUkVTU0tFWQULYmVuekFkZHJlc3MJAMwIAgkBDEludGVnZXJFbnRyeQIFEFJBTkRUSU1FRlJBTUVLRVkFE3JhbmRPcmFjbGVUaW1lRnJhbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgUQYWxsb3dlZEFzc2V0c0tleQkAugkCCAUBcgJfMQUDU0VQCQDMCAIJAQtTdHJpbmdFbnRyeQIFEWFzc2V0c0RlY2ltYWxzS2V5CQC5CQIIBQFyAl8yBQNTRVAJAMwIAgkBC1N0cmluZ0VudHJ5AgUOYmV0RGl2aWRlcnNLZXkJALkJAggFAXICXzMFA1NFUAUDbmlsAWkBC21haW50ZW5hbmNlAQdibG9ja2VkAwkBAiE9AggFAWkGY2FsbGVyBQZTRVJWRVIJAAIBAg5ub3QgYXV0aG9yaXplZAkAzAgCCQEMQm9vbGVhbkVudHJ5AgUKYmxvY2tlZEtleQUHYmxvY2tlZAUDbmlsAWkBA2JldAEMcGxheWVyQ2hvaWNlAwkBC3ZhbHVlT3JFbHNlAgkAoAgBBQpibG9ja2VkS2V5BwkAAgECH0dhbWUgaXMgc3RvcHBlZCBmb3IgbWFpbnRlbmVuY2UEBmdhbWVJZAkA2AQBCAUBaQ10cmFuc2FjdGlvbklkAwkAZwIAAQkAkAMBCAUBaQhwYXltZW50cwkAAgECGzIgcGF5bWVudHMgbXVzdCBiZSBhdHRhY2hlZAMJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMFBmdhbWVJZAkAAgEJAKwCAgkArAICAglCZXQgZm9yOiAFBmdhbWVJZAISIHdhcyBhbHJlYWR5IG1hZGUuBAZiZXRQbXQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQGZmVlUG10CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAEDCQEJaXNEZWZpbmVkAQgFBmZlZVBtdAdhc3NldElkCQACAQItZmVlUG10ICgybmQgcGF5bWVudCkgYXNzZXRJZCBtdXN0IGJlIGluIFdhdmVzAwkAZgIFC01JTkZFRVdBVkVTCAUGZmVlUG10BmFtb3VudAkAAgECK2ZlZVBtdCAoMm5kIHBheW1lbnQpIG11c3QgYmUgPj0gMC4wMDUgV2F2ZXMECmFzc2V0SWRTdHIJAQxhc3NldElkVG9TdHIBCAUGYmV0UG10B2Fzc2V0SWQEEGludGVybmFsQXNzZXRJZHgJARZ2YWxpZGF0ZUFuZEdldEFzc2V0SWR4AQUKYXNzZXRJZFN0cgQKY29tbWlzc2lvbggFBmZlZVBtdAZhbW91bnQECXdpbkFtb3VudAkBGnZhbGlkYXRlQmV0QW5kR2V0V2luQW1vdW50AwgFBmJldFBtdAZhbW91bnQFEGludGVybmFsQXNzZXRJZHgFDHBsYXllckNob2ljZQQOcGxheWVyUHViS2V5NTgJANgEAQgFAWkPY2FsbGVyUHVibGljS2V5BAhnYW1lRGF0YQkBDmZvcm1hdEdhbWVEYXRhBwUOU1RBVEVTVUJNSVRURUQFDHBsYXllckNob2ljZQUOcGxheWVyUHViS2V5NTgFBmhlaWdodAUJd2luQW1vdW50BRBpbnRlcm5hbEFzc2V0SWR4AgAJAMwIAgkBDEludGVnZXJFbnRyeQIJARhrZXlSZXNlcnZhdGlvbkJ5QXNzZXRJZHgBBRBpbnRlcm5hbEFzc2V0SWR4CQEVaW5jcmVhc2VSZXNlcnZlQW1vdW50AgUJd2luQW1vdW50BRBpbnRlcm5hbEFzc2V0SWR4CQDMCAIJAQxpbmNyZW1lbnRJbnQBBQ9HQU1FU0NPVU5URVJLRVkJAMwIAgkBC1N0cmluZ0VudHJ5AgUGZ2FtZUlkBQhnYW1lRGF0YQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDBQZTRVJWRVIFCmNvbW1pc3Npb24IBQZmZWVQbXQHYXNzZXRJZAUDbmlsAWkBCHdpdGhkcmF3AgZnYW1lSWQHcnNhU2lnbgQIZ2FtZURhdGEJAQ9leHRyYWN0R2FtZURhdGEBBQZnYW1lSWQECWdhbWVTdGF0ZQkAkQMCBQhnYW1lRGF0YQUMSWR4R2FtZVN0YXRlBAxwbGF5ZXJDaG9pY2UJAJEDAgUIZ2FtZURhdGEFD0lkeFBsYXllckNob2ljZQQNc3RhcnRlZEhlaWdodAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGdhbWVEYXRhBRBJZHhTdGFydGVkSGVpZ2h0BAl3aW5BbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQhnYW1lRGF0YQUMSWR4V2luQW1vdW50BAhhc3NldElkeAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCGdhbWVEYXRhBQpJZHhBc3NldElkBA5wbGF5ZXJQdWJLZXk1OAkAkQMCBQhnYW1lRGF0YQURSWR4UGxheWVyUHViS2V5NTgEDXBsYXllckFkZHJlc3MJAKcIAQkA2QQBBQ5wbGF5ZXJQdWJLZXk1OAMJAQIhPQIFCWdhbWVTdGF0ZQUOU1RBVEVTVUJNSVRURUQJAAIBAiRJbnZhbGlkIGdhbWUgc3RhdGUgZm9yIHBhc3NlZCBnYW1lSWQDCQECIT0CCAUBaQZjYWxsZXIFBlNFUlZFUgkAAgECK1JlZ3VsYXIgd2l0aGRyYXcgY2FuIGJlIGRvbmUgYnkgc2VydmVyIG9ubHkEDHdpbkJ5VGltZW91dAkAZgIJAGUCBQZoZWlnaHQFDXN0YXJ0ZWRIZWlnaHQFE1JBTkRPUkFDTEVUSU1FRlJBTUUECnJhbmRDaG9pc2UDBQx3aW5CeVRpbWVvdXQFCFdJTl9DQVJECQESZ2VuZXJhdGVSYW5kQ2hvaWNlAwUGZ2FtZUlkBQdyc2FTaWduBQxwbGF5ZXJDaG9pY2UECXBsYXllcldpbgkBC2lzUGxheWVyV2luAgUKcmFuZENob2lzZQUIV0lOX0NBUkQEDW5ld0dhbWVTdGF0dXMDBQlwbGF5ZXJXaW4FCFNUQVRFV09OBQlTVEFURUxPU1QEC25ld0dhbWVEYXRhCQEOZmluaXNoR2FtZURhdGEEBQhnYW1lRGF0YQUNbmV3R2FtZVN0YXR1cwUKcmFuZENob2lzZQUMd2luQnlUaW1lb3V0CQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgUGZ2FtZUlkBQtuZXdHYW1lRGF0YQkAzAgCCQEWZGVjcmVhc2VSZXNlcnZlZEFtb3VudAMFBmdhbWVJZAUIYXNzZXRJZHgFCXdpbkFtb3VudAUDbmlsAwUJcGxheWVyV2luCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFDXBsYXllckFkZHJlc3MFCXdpbkFtb3VudAkBDmFzc2V0SWRGcm9tU3RyAQkAkQMCBQZBU1NFVFMFCGFzc2V0SWR4BQNuaWwFA25pbAECdHgBBnZlcmlmeQADCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5BAckbWF0Y2gwBQJ0eAMJAAECBQckbWF0Y2gwAhNUcmFuc2ZlclRyYW5zYWN0aW9uBAN0dHgFByRtYXRjaDAECGFzc2V0SWR4CQEWdmFsaWRhdGVBbmRHZXRBc3NldElkeAEJAQxhc3NldElkVG9TdHIBCAUDdHR4B2Fzc2V0SWQJAGcCCQBlAgkBD2dldEFzc2V0QmFsYW5jZQEIBQN0dHgHYXNzZXRJZAgFA3R0eAZhbW91bnQJAQhnZXRJbnRPcgIJARhrZXlSZXNlcnZhdGlvbkJ5QXNzZXRJZHgBBQhhc3NldElkeAAAAwkAAQIFByRtYXRjaDACFFNldFNjcmlwdFRyYW5zYWN0aW9uBANzdHgFByRtYXRjaDAKAQdjaGVja2VyAgNhY2MFYXNzZXQDBQNhY2MJAAACCQEIZ2V0SW50T3ICCQEYa2V5UmVzZXJ2YXRpb25CeUFzc2V0U3RyAQUFYXNzZXQAAAAABwoAAiRsBQZBU1NFVFMKAAIkcwkAkAMBBQIkbAoABSRhY2MwBgoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEHY2hlY2tlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgcHKYev3Q==", "chainId": 84, "height": 2863132, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6HkiJZhvmR393T8YxBmF85gjSsyRMGhGGpe1W1C2nAgF Next: GgxepTxMZteQCP5HtU6VQe9fehEdoMP5sgRr4BjqkuCw Diff:
OldNewDifferences
1212 let RANDOM_RANGE = 40
1313
1414 let NUM_BETS = 1
15+
16+let WIN_CARD = toString((RANDOM_RANGE - 1))
1517
1618 func getStrOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
1719
215217 }
216218
217219
218-func isPlayerWin (playerChoice,randChoise) = if ((size(playerChoice) == NUM_BETS))
219- then (randChoise == toString((RANDOM_RANGE - 1)))
220- else false
220+func isPlayerWin (playerChoice,randChoise) = (playerChoice == randChoise)
221221
222222
223223 func formatGameDataS (gameStatus,playerChoice,playerPubKey58,startedHeight,winAmount,assetIdx,randOrEmpty) = makeString([gameStatus, playerChoice, playerPubKey58, startedHeight, winAmount, assetIdx, if ((randOrEmpty == ""))
229229
230230
231231 func finishGameData (origGameData,gameStatus,rand,winByTimeout) = {
232- let finishGameData = formatGameDataS(gameStatus, origGameData[IdxPlayerChoice], origGameData[IdxPlayerPubKey58], origGameData[IdxStartedHeight], origGameData[IdxWinAmount], origGameData[IdxAssetId], rand)
232+ let finishGameData = formatGameDataS(gameStatus, rand, origGameData[IdxPlayerPubKey58], origGameData[IdxStartedHeight], origGameData[IdxWinAmount], origGameData[IdxAssetId], WIN_CARD)
233233 if (winByTimeout)
234234 then (finishGameData + "_TIMEOUT")
235235 else finishGameData
328328 else {
329329 let winByTimeout = ((height - startedHeight) > RANDORACLETIMEFRAME)
330330 let randChoise = if (winByTimeout)
331- then playerChoice
331+ then WIN_CARD
332332 else generateRandChoice(gameId, rsaSign, playerChoice)
333- let playerWin = isPlayerWin(playerChoice, randChoise)
333+ let playerWin = isPlayerWin(randChoise, WIN_CARD)
334334 let newGameStatus = if (playerWin)
335335 then STATEWON
336336 else STATELOST
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 = "Card of the Day"
1111
1212 let RANDOM_RANGE = 40
1313
1414 let NUM_BETS = 1
15+
16+let WIN_CARD = toString((RANDOM_RANGE - 1))
1517
1618 func getStrOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
1719
1820
1921 func getIntOrFail (address,key) = valueOrErrorMessage(getInteger(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
2022
2123
2224 func getBoolOrFail (address,key) = valueOrErrorMessage(getBoolean(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
2325
2426
2527 let allowedAssetsKey = "%s%s__cfg__allowedAssets"
2628
2729 let assetsDecimalsKey = "%s%s__cfg__assetsDecimals"
2830
2931 let betDividersKey = "%s%s__cfg__assetsBetDividers"
3032
3133 let RSAPUBLIC64KEY = "%s%s__cfg__rsaPublic64"
3234
3335 let SERVERADDRESSKEY = "%s%s__cfg__benzAddress"
3436
3537 let RANDTIMEFRAMEKEY = "%s%s__cfg__withdrawTimeFrame"
3638
3739 let GAMESCOUNTERKEY = "%s%s__runtime__gameNum"
3840
3941 let blockedKey = "%s%s__runtime__contractIsBlocked"
4042
4143 func getIntArray (key) = {
4244 let a = getStrOrFail(this, key)
4345 func filler (acc,el) = (acc :+ parseIntValue(el))
4446
4547 let $l = split(a, SEP)
4648 let $s = size($l)
4749 let $acc0 = nil
4850 func $f0_1 ($a,$i) = if (($i >= $s))
4951 then $a
5052 else filler($a, $l[$i])
5153
5254 func $f0_2 ($a,$i) = if (($i >= $s))
5355 then $a
5456 else throw("List size exceeds 10")
5557
5658 $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)
5759 }
5860
5961
6062 let ASSETS = split(getStrOrFail(this, allowedAssetsKey), SEP)
6163
6264 let DECIMALS = getIntArray(assetsDecimalsKey)
6365
6466 let BETDIVIDERS = getIntArray(betDividersKey)
6567
6668 func keyReservationByAssetStr (assetStr) = ("$RESERVED_AMOUNT_" + assetStr)
6769
6870
6971 func keyReservationByAssetIdx (assetIdx) = keyReservationByAssetStr(ASSETS[assetIdx])
7072
7173
7274 let MINFEEWAVES = ((5 * WAVESD) / 1000)
7375
7476 let idxAssets = 0
7577
7678 let idxDecimals = 1
7779
7880 let idxDividers = 2
7981
8082 let BET1 = 1
8183
8284 let BET2 = 2
8385
8486 let BET4 = 4
8587
8688 let BET8 = 8
8789
8890 let BET14 = 14
8991
9092 let RATEMULT = 10000
9193
9294 let RATE = 250000
9395
9496 let BETS = [BET2]
9597
9698 let IdxGameState = 0
9799
98100 let IdxPlayerChoice = 1
99101
100102 let IdxPlayerPubKey58 = 2
101103
102104 let IdxStartedHeight = 3
103105
104106 let IdxWinAmount = 4
105107
106108 let IdxAssetId = 5
107109
108110 let STATESUBMITTED = "SUBMITTED"
109111
110112 let STATEWON = "WON"
111113
112114 let STATELOST = "LOST"
113115
114116 func getStringOrFail (key) = valueOrErrorMessage(getString(this, key), (key + " key is not specified in this.state"))
115117
116118
117119 let RSAPUBLIC = fromBase64String(getStringOrFail(RSAPUBLIC64KEY))
118120
119121 let SERVER = addressFromStringValue(getStringOrFail(SERVERADDRESSKEY))
120122
121123 let RANDORACLETIMEFRAME = valueOrElse(getInteger(this, RANDTIMEFRAMEKEY), 7200)
122124
123125 func getIntOr (key,default) = if (isDefined(getInteger(key)))
124126 then getIntegerValue(key)
125127 else default
126128
127129
128130 func setInt (key,value) = IntegerEntry(key, value)
129131
130132
131133 func incrementInt (key) = setInt(key, (getIntOr(key, -1) + 1))
132134
133135
134136 func changeInt (key,by) = setInt(key, (getIntOr(key, 0) + by))
135137
136138
137139 func assetIdToStr (assetIdOrUnit) = match assetIdOrUnit {
138140 case b: ByteVector =>
139141 toBase58String(b)
140142 case _ =>
141143 "WAVES"
142144 }
143145
144146
145147 func assetIdFromStr (assetIdStr) = if ((assetIdStr == "WAVES"))
146148 then unit
147149 else fromBase58String(assetIdStr)
148150
149151
150152 func getAssetBalance (assetIdOrUnit) = match assetIdOrUnit {
151153 case assetId: ByteVector =>
152154 assetBalance(this, assetId)
153155 case _ =>
154156 wavesBalance(this).available
155157 }
156158
157159
158160 func increaseReserveAmount (winAmount,assetIdx) = {
159161 let assetIdStr = ASSETS[assetIdx]
160162 let newReservedAmount = (getIntOr(keyReservationByAssetIdx(assetIdx), 0) + winAmount)
161163 if ((newReservedAmount > getAssetBalance(assetIdFromStr(assetIdStr))))
162164 then throw((("Insufficient funds on " + GAME_NAME) + " account. Transaction was rejected for your safety."))
163165 else newReservedAmount
164166 }
165167
166168
167169 func decreaseReservedAmount (gameId,assetIdx,winAmount) = if ((0 > (getIntOr(keyReservationByAssetIdx(assetIdx), 0) - winAmount)))
168170 then throw((("Invalid " + GAME_NAME) + " account state - reserved amount is less than 0"))
169171 else changeInt(keyReservationByAssetIdx(assetIdx), -(winAmount))
170172
171173
172174 func validateAndGetAssetIdx (assetIdStr) = {
173175 let idx = indexOf(ASSETS, assetIdStr)
174176 if (!(isDefined(idx)))
175177 then throw("Invalid payment asset")
176178 else value(idx)
177179 }
178180
179181
180182 func validateBetAndGetWinAmount (bet,internalAssetIdx,playerChoice) = {
181183 let dicesCount = size(playerChoice)
182184 func checkAmount (a,x) = if (a)
183185 then true
184186 else (bet == ((x * DECIMALS[internalAssetIdx]) / BETDIVIDERS[internalAssetIdx]))
185187
186188 if (!({
187189 let $l = BETS
188190 let $s = size($l)
189191 let $acc0 = false
190192 func $f0_1 ($a,$i) = if (($i >= $s))
191193 then $a
192194 else checkAmount($a, $l[$i])
193195
194196 func $f0_2 ($a,$i) = if (($i >= $s))
195197 then $a
196198 else throw("List size exceeds 5")
197199
198200 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
199201 }))
200202 then throw("Bet amount is not valid")
201203 else if ((parseInt(playerChoice) == unit))
202204 then throw("Invalid player's choice")
203205 else fraction(bet, RATE, RATEMULT)
204206 }
205207
206208
207209 func generateRandChoice (gameId,rsaSign,playerChoice) = {
208210 let rsaSigValid = rsaVerify_16Kb(SHA256, toBytes(gameId), rsaSign, RSAPUBLIC)
209211 if (!(rsaSigValid))
210212 then throw("Invalid RSA signature")
211213 else {
212214 let rand = (toInt(sha256((rsaSign + toBytes(playerChoice)))) % RANDOM_RANGE)
213215 toString(rand)
214216 }
215217 }
216218
217219
218-func isPlayerWin (playerChoice,randChoise) = if ((size(playerChoice) == NUM_BETS))
219- then (randChoise == toString((RANDOM_RANGE - 1)))
220- else false
220+func isPlayerWin (playerChoice,randChoise) = (playerChoice == randChoise)
221221
222222
223223 func formatGameDataS (gameStatus,playerChoice,playerPubKey58,startedHeight,winAmount,assetIdx,randOrEmpty) = makeString([gameStatus, playerChoice, playerPubKey58, startedHeight, winAmount, assetIdx, if ((randOrEmpty == ""))
224224 then ""
225225 else randOrEmpty], "_")
226226
227227
228228 func formatGameData (gameStatus,playerChoice,playerPubKey58,startedHeight,winAmount,assetIdx,randOrEmpty) = formatGameDataS(gameStatus, playerChoice, playerPubKey58, toString(startedHeight), toString(winAmount), toString(assetIdx), randOrEmpty)
229229
230230
231231 func finishGameData (origGameData,gameStatus,rand,winByTimeout) = {
232- let finishGameData = formatGameDataS(gameStatus, origGameData[IdxPlayerChoice], origGameData[IdxPlayerPubKey58], origGameData[IdxStartedHeight], origGameData[IdxWinAmount], origGameData[IdxAssetId], rand)
232+ let finishGameData = formatGameDataS(gameStatus, rand, origGameData[IdxPlayerPubKey58], origGameData[IdxStartedHeight], origGameData[IdxWinAmount], origGameData[IdxAssetId], WIN_CARD)
233233 if (winByTimeout)
234234 then (finishGameData + "_TIMEOUT")
235235 else finishGameData
236236 }
237237
238238
239239 func extractGameData (gameId) = split(match getString(this, gameId) {
240240 case str: String =>
241241 str
242242 case _ =>
243243 throw((("Game: " + gameId) + " not found."))
244244 }, "_")
245245
246246
247247 @Callable(i)
248248 func constructorV1 (rsaPublic64,benzAddress,randOracleTimeFrame,tokensDescriptor) = if ((i.caller != SERVER))
249249 then throw("not authorized")
250250 else {
251251 func splitter (acc,elem) = {
252252 let tokList = split(elem, ":")
253253 if ((size(tokList) != 4))
254254 then throw("Invalid asset record")
255255 else $Tuple3((acc._1 :+ tokList[idxAssets]), (acc._2 :+ tokList[idxDecimals]), (acc._3 :+ tokList[idxDividers]))
256256 }
257257
258258 let r = {
259259 let $l = split_4C(tokensDescriptor, "_")
260260 let $s = size($l)
261261 let $acc0 = $Tuple3(nil, nil, nil)
262262 func $f0_1 ($a,$i) = if (($i >= $s))
263263 then $a
264264 else splitter($a, $l[$i])
265265
266266 func $f0_2 ($a,$i) = if (($i >= $s))
267267 then $a
268268 else throw("List size exceeds 10")
269269
270270 $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)
271271 }
272272 [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))]
273273 }
274274
275275
276276
277277 @Callable(i)
278278 func maintenance (blocked) = if ((i.caller != SERVER))
279279 then throw("not authorized")
280280 else [BooleanEntry(blockedKey, blocked)]
281281
282282
283283
284284 @Callable(i)
285285 func bet (playerChoice) = if (valueOrElse(getBoolean(blockedKey), false))
286286 then throw("Game is stopped for maintenence")
287287 else {
288288 let gameId = toBase58String(i.transactionId)
289289 if ((1 >= size(i.payments)))
290290 then throw("2 payments must be attached")
291291 else if (isDefined(getString(this, gameId)))
292292 then throw((("Bet for: " + gameId) + " was already made."))
293293 else {
294294 let betPmt = value(i.payments[0])
295295 let feePmt = value(i.payments[1])
296296 if (isDefined(feePmt.assetId))
297297 then throw("feePmt (2nd payment) assetId must be in Waves")
298298 else if ((MINFEEWAVES > feePmt.amount))
299299 then throw("feePmt (2nd payment) must be >= 0.005 Waves")
300300 else {
301301 let assetIdStr = assetIdToStr(betPmt.assetId)
302302 let internalAssetIdx = validateAndGetAssetIdx(assetIdStr)
303303 let commission = feePmt.amount
304304 let winAmount = validateBetAndGetWinAmount(betPmt.amount, internalAssetIdx, playerChoice)
305305 let playerPubKey58 = toBase58String(i.callerPublicKey)
306306 let gameData = formatGameData(STATESUBMITTED, playerChoice, playerPubKey58, height, winAmount, internalAssetIdx, "")
307307 [IntegerEntry(keyReservationByAssetIdx(internalAssetIdx), increaseReserveAmount(winAmount, internalAssetIdx)), incrementInt(GAMESCOUNTERKEY), StringEntry(gameId, gameData), ScriptTransfer(SERVER, commission, feePmt.assetId)]
308308 }
309309 }
310310 }
311311
312312
313313
314314 @Callable(i)
315315 func withdraw (gameId,rsaSign) = {
316316 let gameData = extractGameData(gameId)
317317 let gameState = gameData[IdxGameState]
318318 let playerChoice = gameData[IdxPlayerChoice]
319319 let startedHeight = parseIntValue(gameData[IdxStartedHeight])
320320 let winAmount = parseIntValue(gameData[IdxWinAmount])
321321 let assetIdx = parseIntValue(gameData[IdxAssetId])
322322 let playerPubKey58 = gameData[IdxPlayerPubKey58]
323323 let playerAddress = addressFromPublicKey(fromBase58String(playerPubKey58))
324324 if ((gameState != STATESUBMITTED))
325325 then throw("Invalid game state for passed gameId")
326326 else if ((i.caller != SERVER))
327327 then throw("Regular withdraw can be done by server only")
328328 else {
329329 let winByTimeout = ((height - startedHeight) > RANDORACLETIMEFRAME)
330330 let randChoise = if (winByTimeout)
331- then playerChoice
331+ then WIN_CARD
332332 else generateRandChoice(gameId, rsaSign, playerChoice)
333- let playerWin = isPlayerWin(playerChoice, randChoise)
333+ let playerWin = isPlayerWin(randChoise, WIN_CARD)
334334 let newGameStatus = if (playerWin)
335335 then STATEWON
336336 else STATELOST
337337 let newGameData = finishGameData(gameData, newGameStatus, randChoise, winByTimeout)
338338 ([StringEntry(gameId, newGameData), decreaseReservedAmount(gameId, assetIdx, winAmount)] ++ (if (playerWin)
339339 then [ScriptTransfer(playerAddress, winAmount, assetIdFromStr(ASSETS[assetIdx]))]
340340 else nil))
341341 }
342342 }
343343
344344
345345 @Verifier(tx)
346346 func verify () = if (sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey))
347347 then match tx {
348348 case ttx: TransferTransaction =>
349349 let assetIdx = validateAndGetAssetIdx(assetIdToStr(ttx.assetId))
350350 ((getAssetBalance(ttx.assetId) - ttx.amount) >= getIntOr(keyReservationByAssetIdx(assetIdx), 0))
351351 case stx: SetScriptTransaction =>
352352 func checker (acc,asset) = if (acc)
353353 then (getIntOr(keyReservationByAssetStr(asset), 0) == 0)
354354 else false
355355
356356 let $l = ASSETS
357357 let $s = size($l)
358358 let $acc0 = true
359359 func $f0_1 ($a,$i) = if (($i >= $s))
360360 then $a
361361 else checker($a, $l[$i])
362362
363363 func $f0_2 ($a,$i) = if (($i >= $s))
364364 then $a
365365 else throw("List size exceeds 10")
366366
367367 $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)
368368 case _ =>
369369 false
370370 }
371371 else false
372372

github/deemru/w8io/026f985 
62.30 ms