tx · Af1jjpLHuj6JS315NxGRU9MaMYvWC8SG4Agud9v6P7VD 3Mungn3ygy3DzpbDUKPbJQaeNKfQHu9fkK8: -0.01200000 Waves 2022.11.10 18:01 [2311201] smart account 3Mungn3ygy3DzpbDUKPbJQaeNKfQHu9fkK8 > SELF 0.00000000 Waves
{ "type": 13, "id": "Af1jjpLHuj6JS315NxGRU9MaMYvWC8SG4Agud9v6P7VD", "fee": 1200000, "feeAssetId": null, "timestamp": 1668092556072, "version": 2, "chainId": 84, "sender": "3Mungn3ygy3DzpbDUKPbJQaeNKfQHu9fkK8", "senderPublicKey": "6L7iBerXuPa5E74WCM6fLSB2VM1bMG9jgASH8tu9orHN", "proofs": [ "4eYvPT1D4jmM1d2fv3m2m2KNAFDxSTBEoSpxd16m5hHgwaSxkn5BZamVggRf1uguc1fkhsTPhDmiQdBzAAg7ZBPd" ], "script": "base64:BgIfCAISBgoEAQEICBIDCgEBEgQKAgEIEgQKAhEYEgASACsAD0dBTUVfVFlQRV9HUk9VUAIFR3JvdXAAEUdBTUVfVFlQRV9QTEFUT0ZGAghQbGF5LW9mZgAKR0FNRV9UWVBFUwkAzAgCBQ9HQU1FX1RZUEVfR1JPVVAJAMwIAgURR0FNRV9UWVBFX1BMQVRPRkYFA25pbAAEVVNEVAEgbySjyqsw3FIpmOgsYVruWn8jTcItdbvpnapU4NLQB8EAB01JTl9CRVQAwIQ9AAhPTkVfSE9VUgkAaAIJAGgCAAUAPADoBwARTU9ORVlfQk9YX0FERFJFRVMJAQdBZGRyZXNzAQEaAVSxYgy7BRV2F+zuKtUZtXyHmoiep9yqU84AB0JFVF9GRUUA9AMACUZFRV9TQ0FMRQCQTgAHa0FjdGl2ZQIGYWN0aXZlAAtrQWN0aXZlR2xvYgIUYWN0aXZlX2FsbF9jb250cmFjdHMABmtDYXVzZQIOc2h1dGRvd25fY2F1c2UADWtHYW1lU3RyYVRpbWUCDl9zdGFydEdhbWVUaW1lAAlrR2FtZVR5cGUCCV9HYW1lVHlwZQALa0xhc3RHYW1lSWQCDGxhc3RfZ2FtZV9pZAAKa1RvdGFsQmV0cwIKX3RvdGFsQmV0cwAHa1RvV2luQQIHX3RvV2luQQAHa1RvV2luQgIHX3RvV2luQQAHa09uRHJhdwIHX29uRHJhdwALa0dhbWVSZXN1bHQCB19yZXN1bHQABWtCYW5rAgVfYmFuawAKa0ZpbmFsVGltZQINX2ZpbmFsVGltZeKAnQARa1RvdGFsQmV0c0ZvclR5cGUCEV90b3RhbEJldHNGb3JUeXBlAAhrVXNlckJldAIIX3VzZXJCZXQACmtVc2VyUmVmSWQCBl9yZWZJZAAMa1VzZXJDbGFpbWVkAghfY2xhaW1lZAANa0FkbWluUHViS2V5MQILYWRtaW5fcHViXzEADWtBZG1pblB1YktleTICC2FkbWluX3B1Yl8yAA1rQWRtaW5QdWJLZXkzAgthZG1pbl9wdWJfMwAGb3JhY2xlCQEHQWRkcmVzcwEBGgFXiv8IaJo1ukDNYXTyEjfepjfw+jjO6B44ARNnZXRCYXNlNThGcm9tT3JhY2xlAQNrZXkEByRtYXRjaDAJAJ0IAgUGb3JhY2xlBQNrZXkDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAZzdHJpbmcFByRtYXRjaDAJANkEAQUGc3RyaW5nBAdub3RoaW5nBQckbWF0Y2gwCQACAQkArAICBQNrZXkCCGlzIGVtcHR5AAxhZG1pblB1YktleTEJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MQAMYWRtaW5QdWJLZXkyCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTIADGFkbWluUHViS2V5MwkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkzAAZhY3RpdmUJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUHa0FjdGl2ZQYACmFjdGl2ZUdsb2IJAQt2YWx1ZU9yRWxzZQIJAJsIAgUGb3JhY2xlBQtrQWN0aXZlR2xvYgYBCGlzQWN0aXZlAAMDBQZhY3RpdmUFCmFjdGl2ZUdsb2IHBQR1bml0CQACAQIfREFwcCBpcyBpbmFjdGl2ZSBhdCB0aGlzIG1vbWVudAELaXNBZG1pbkNhbGwBAWkDCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQxhZG1pblB1YktleTEJAMwIAgUMYWRtaW5QdWJLZXkyCQDMCAIFDGFkbWluUHViS2V5MwUDbmlsCAUBaQ9jYWxsZXJQdWJsaWNLZXkFBHVuaXQJAAIBAiFPbmx5IGFkbWluIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24BB3N1c3BlbmQBBWNhdXNlCQDMCAIJAQxCb29sZWFuRW50cnkCBQdrQWN0aXZlBwkAzAgCCQELU3RyaW5nRW50cnkCBQZrQ2F1c2UFBWNhdXNlBQNuaWwBDWdldFVzZXJCZXRLZXkEBHVzZXIGZ2FtZUlkBHR5cGUGcmVzdWx0CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIFBHVzZXICAV8JAKQDAQUGZ2FtZUlkAgFfCQCkAwEFBHR5cGUCAV8FBnJlc3VsdAUIa1VzZXJCZXQBFmdldFRvdGFsQmV0c0ZvclR5cGVLZXkDBmdhbWVJZAR0eXBlBnJlc3VsdAkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKQDAQUGZ2FtZUlkAgFfCQCkAwEFBHR5cGUCAV8FBnJlc3VsdAURa1RvdGFsQmV0c0ZvclR5cGUBC3ZhbGlkYXRlQmV0AwhnYW1lVHlwZQR0eXBlBnJlc3VsdAMJAAACBQR0eXBlAAEDCQECIT0CCQCxAgEFBnJlc3VsdAABCQACAQIvR2FtZSByZXN1bHQgbXVzdCBjb250YWluIG9ubHkgb25lIGxldHRlcjogQSxCLEQDCQEBIQEJAQhjb250YWlucwICA0FCRAUGcmVzdWx0CQACAQIvR2FtZSByZXN1bHQgbXVzdCBjb250YWluIG9ubHkgb25lIGxldHRlcjogQSxCLEQDAwkAAAIFCGdhbWVUeXBlBRFHQU1FX1RZUEVfUExBVE9GRgkBASEBCQEIY29udGFpbnMCAgJBQgUGcmVzdWx0BwkAAgECLUdhbWUgcmVzdWx0IG11c3QgY29udGFpbiBvbmx5IG9uZSBsZXR0ZXI6IEEsQgYDCQAAAgUEdHlwZQACBAdzcGxpdGVkCQC1CQIFBnJlc3VsdAIBXwMJAQIhPQIJAJADAQUHc3BsaXRlZAACCQACAQIWSW5uY29ycmVjdCBnYW1lIHJlc3VsdAQGYmFsbHNBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQdzcGxpdGVkAAACFklubmNvcnJlY3QgZ2FtZSByZXN1bHQEBmJhbGxzQgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEJAJEDAgUHc3BsaXRlZAABAhZJbm5jb3JyZWN0IGdhbWUgcmVzdWx0AwkAAAIFBmJhbGxzQQUGYmFsbHNCCQACAQIvSW5uY29ycmVjdCBnYW1lIHJlc3VsdC4gQSBhbmQgQiBjYW5ub3QgYmUgZXF1YWwGAwkAAAIFBHR5cGUAAwQHc3BsaXRlZAkAtQkCBQZyZXN1bHQCAV8DCQECIT0CCQCQAwEFB3NwbGl0ZWQAAgkAAgECFklubmNvcnJlY3QgZ2FtZSByZXN1bHQEBHRlYW0JAJEDAgUHc3BsaXRlZAAABAtiYWxsc0Ftb3VudAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEJAJEDAgUHc3BsaXRlZAABAhZJbm5jb3JyZWN0IGdhbWUgcmVzdWx0AwkAZwIAAAULYmFsbHNBbW91bnQJAAIBAjtJbm5jb3JyZWN0IGdhbWUgcmVzdWx0LCBiYWxscyBhbW91bnQgbXVzdCBiZSBncmVhdGVyIHRoZW4gMAMDCQECIT0CCQCxAgEFBHRlYW0AAQYJAQEhAQkBCGNvbnRhaW5zAgICQUIFBHRlYW0JAAIBAi1HYW1lIHJlc3VsdCBtdXN0IGNvbnRhaW4gb25seSBvbmUgbGV0dGVyOiBBLEIGBwERcG90ZW50aWFsV2lubmluZ3MFBmdhbWVJZAt1c2VyQWRkcmVzcwZhbW91bnQEdHlwZQZyZXN1bHQEB3NwbGRSZXMJALUJAgUGcmVzdWx0AgFfBAskdDAzOTc3NDM4NQMJAAACBQR0eXBlAAEDCQAAAgUGcmVzdWx0AgFBCQCVCgMCAzFfMAABAAADCQAAAgUGcmVzdWx0AgFCCQCVCgMCAzBfMQAAAAEJAJUKAwIDMV8xAAEAAQMJAAACBQR0eXBlAAIJAJUKAwUGcmVzdWx0CQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHc3BsZFJlcwAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHc3BsZFJlcwABAwkAAAIJAJEDAgUHc3BsZFJlcwAAAgFBCQCVCgMJAKwCAgkAkQMCBQdzcGxkUmVzAAECAl8wCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHc3BsZFJlcwABAAAJAJUKAwkArAICAgIwXwkAkQMCBQdzcGxkUmVzAAEAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3NwbGRSZXMAAQQKZ2FtZVJlc3VsdAgFCyR0MDM5Nzc0Mzg1Al8xBAZiYWxsc0EIBQskdDAzOTc3NDM4NQJfMgQGYmFsbHNCCAULJHQwMzk3NzQzODUCXzMEBGRpZmYDCQBmAgUGYmFsbHNBBQZiYWxsc0IJAGUCBQZiYWxsc0EFBmJhbGxzQgkAZQIFBmJhbGxzQgUGYmFsbHNBBAZ3aW5uZXIDCQBmAgUGYmFsbHNBBQZiYWxsc0ICAUEDCQBmAgUGYmFsbHNCBQZiYWxsc0ECAUICAUQEAkcxCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEWZ2V0VG90YWxCZXRzRm9yVHlwZUtleQMFBmdhbWVJZAABBQZ3aW5uZXIAAAMJAAACBQR0eXBlAAEFBmFtb3VudAAABAJHMgkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBFmdldFRvdGFsQmV0c0ZvclR5cGVLZXkDBQZnYW1lSWQAAgUGcmVzdWx0AAADCQAAAgUEdHlwZQACBQZhbW91bnQAAAQCRzMJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARZnZXRUb3RhbEJldHNGb3JUeXBlS2V5AwUGZ2FtZUlkAAMJAKwCAgkArAICBQZ3aW5uZXICAV8JAKQDAQUEZGlmZgAAAwkAAAIFBHR5cGUAAwUGYW1vdW50AAAEDXRvdGFsV2luVmFsdWUJAGQCCQBkAgUCRzEFAkcyBQJHMwQJdG90YWxCZXRzCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApAMBBQZnYW1lSWQFCmtUb3RhbEJldHMAAAQLYmFua1dpdGhGZWUJAGUCBQl0b3RhbEJldHMFDXRvdGFsV2luVmFsdWUEA2ZlZQkAawMFC2JhbmtXaXRoRmVlBQdCRVRfRkVFBQlGRUVfU0NBTEUEAUIJAGUCBQtiYW5rV2l0aEZlZQUDZmVlBANVQjEJAGQCCQELdmFsdWVPckVsc2UCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQENZ2V0VXNlckJldEtleQQFC3VzZXJBZGRyZXNzBQZnYW1lSWQAAQUGd2lubmVyAAADCQAAAgUEdHlwZQABBQZhbW91bnQAAAQDVUIyCQBkAgkBC3ZhbHVlT3JFbHNlAgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBDWdldFVzZXJCZXRLZXkEBQt1c2VyQWRkcmVzcwUGZ2FtZUlkAAIFCmdhbWVSZXN1bHQAAAMJAAACBQR0eXBlAAEFBmFtb3VudAAABANVQjMJAGQCCQELdmFsdWVPckVsc2UCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQENZ2V0VXNlckJldEtleQQFC3VzZXJBZGRyZXNzBQZnYW1lSWQAAwkArAICCQCsAgIFBndpbm5lcgIBXwkApAMBBQRkaWZmAAADCQAAAgUEdHlwZQABBQZhbW91bnQAAAQQdG90YWxXaW5WYWx1ZU1heAkAZAIJAGQCBQJHMQkAaAIFAkcyAAMJAGgCBQJHMwACBAJEMQkAaQIJAGgCCQBkAgUCRzEJAGgCCQBpAgUCRzEFEHRvdGFsV2luVmFsdWVNYXgFAUIFA1VCMQUCRzEEAkQyCQBpAgkAaAIJAGQCBQJHMgkAaAIJAGkCBQJHMgUQdG90YWxXaW5WYWx1ZU1heAUBQgUDVUIyBQJHMgQCRDMJAGkCCQBoAgkAZAIFAkczCQBoAgkAaQIFAkczBRB0b3RhbFdpblZhbHVlTWF4BQFCBQNVQjMFAkczBAtjbGFpbUFtb3VudAkAZAIJAGQCBQJEMQUCRDIFAkQzBQtjbGFpbUFtb3VudAYBaQEDYmV0BAZnYW1lSWQEdHlwZQZyZXN1bHQFcmVmSWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAZnSWRTdHIJAKQDAQUGZ2FtZUlkBAskdDA2MDMwNjEwNQkAlAoCCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAgJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkBAlwbXRBbW91bnQIBQskdDA2MDMwNjEwNQJfMQQKcG10QXNzZXRJZAgFCyR0MDYwMzA2MTA1Al8yBA1nYW1lU3RhcnRUaW1lCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApAMBBQZnYW1lSWQFDWtHYW1lU3RyYVRpbWUAAAQIZ2FtZVR5cGUJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkApAMBBQZnYW1lSWQFCWtHYW1lVHlwZQMJAQIhPQIFCnBtdEFzc2V0SWQFBFVTRFQJAAIBAh5QYW15bWVudCBtdXN0IGJlIEluIFVTRFQgYXNzZXQDCQBmAgUHTUlOX0JFVAUJcG10QW1vdW50CQACAQkArAICCQCsAgICCE1pbiBiZXQgCQCkAwEJAGkCBQdNSU5fQkVUAMCEPQIEVVNEVAMJAAACBQ1nYW1lU3RhcnRUaW1lAAAJAAIBCQCsAgICGFRoZXJlIGlzIG5vIGdhbWUgd2l0aCBpZAkApAMBBQZnYW1lSWQDCQBnAgkAZAIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQhPTkVfSE9VUgUNZ2FtZVN0YXJ0VGltZQkAAgECKEJldHMgb24gdGhpcyBnYW1lIGFyZSBubyBsb25nZXIgYWNjZXB0ZWQDCQEBIQEJAQt2YWxpZGF0ZUJldAMFCGdhbWVUeXBlBQR0eXBlBQZyZXN1bHQJAAIBAhJJbmNvcnJlY3QgYmV0IHR5cGUEB3NwbGRSZXMJALUJAgUGcmVzdWx0AgFfBAp1c2VyQmV0S2V5CQENZ2V0VXNlckJldEtleQQFBHVzZXIFBmdhbWVJZAUEdHlwZQUGcmVzdWx0BBZ0b3RhbEJldHNGb3JUeXBlQmV0S2V5CQEWZ2V0VG90YWxCZXRzRm9yVHlwZUtleQMFBmdhbWVJZAUEdHlwZQUGcmVzdWx0BAd1c2VyQmV0CQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQp1c2VyQmV0S2V5AAAFCXBtdEFtb3VudAQTdG90YWxCZXRzRm9yVHlwZUJldAkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUWdG90YWxCZXRzRm9yVHlwZUJldEtleQAABQlwbXRBbW91bnQECXRvdGFsQmV0cwkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQZnSWRTdHIFCmtUb3RhbEJldHMAAAUJcG10QW1vdW50BAZ0b1dpbkEJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUGZ0lkU3RyBQdrVG9XaW5BAAADAwkAAAIFBHR5cGUAAQkAAAIFBnJlc3VsdAIBQQcFCXBtdEFtb3VudAMDCQAAAgUEdHlwZQACCQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3NwbGRSZXMAAAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3NwbGRSZXMAAQcFCXBtdEFtb3VudAMDCQAAAgUEdHlwZQADCQAAAgkAkQMCBQdzcGxkUmVzAAACAUEHBQlwbXRBbW91bnQAAAQGdG9XaW5CCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBmdJZFN0cgUHa1RvV2luQgAAAwMJAAACBQR0eXBlAAEJAAACBQZyZXN1bHQCAUIHBQlwbXRBbW91bnQDAwkAAAIFBHR5cGUAAgkAZgIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzcGxkUmVzAAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzcGxkUmVzAAAHBQlwbXRBbW91bnQDAwkAAAIFBHR5cGUAAwkAAAIJAJEDAgUHc3BsZFJlcwAAAgFCBwUJcG10QW1vdW50AAAEBm9uRHJhdwkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQZnSWRTdHIFB2tPbkRyYXcAAAMDCQAAAgUEdHlwZQABCQAAAgUGcmVzdWx0AgFEBwUJcG10QW1vdW50AAAJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUKdXNlckJldEtleQUHdXNlckJldAkAzAgCCQEMSW50ZWdlckVudHJ5AgUWdG90YWxCZXRzRm9yVHlwZUJldEtleQUTdG90YWxCZXRzRm9yVHlwZUJldAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQZnSWRTdHIFCmtUb3RhbEJldHMFCXRvdGFsQmV0cwkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQZnSWRTdHIFB2tUb1dpbkEFBnRvV2luQQkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQZnSWRTdHIFB2tUb1dpbkIFBnRvV2luQgkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQZnSWRTdHIFB2tPbkRyYXcFBm9uRHJhdwUDbmlsAwkBASEBCQEJaXNEZWZpbmVkAQkAnQgCBQR0aGlzBQprVXNlclJlZklkCQDMCAIJAQtTdHJpbmdFbnRyeQIFCmtVc2VyUmVmSWQFBXJlZklkBQNuaWwFA25pbAFpAQVjbGFpbQEGZ2FtZUlkCQELdmFsdWVPckVsc2UCCQEIaXNBY3RpdmUABAR1c2VyCQClCAEIBQFpBmNhbGxlcgQGZ0lkU3RyCQCkAwEFBmdhbWVJZAQJZmluYWxUaW1lCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwkArAICBQZnSWRTdHIFCmtGaW5hbFRpbWUCJFlvdSBjYW4gY2xhaW0gb25seSBhZnRlciBnYW1lIGZpbmlzaAMJAGYCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAZAIFCWZpbmFsVGltZQUIT05FX0hPVVIJAAIBAjdZb3UgY2FuIGNsYWltIG9ubHkgYWZ0ZXIgb25lIGhvdXIgcGFzcyBhZnRlciBmaW5hbCB0aW1lAwkBCWlzRGVmaW5lZAEJAJsIAgUEdGhpcwkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwUGZ0lkU3RyBQxrVXNlckNsYWltZWQJAAIBAhZZb3UgYXJlIGFscmVkeSBjbGFpbWVkBApnYW1lUmVzdWx0CQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzCQCsAgIFBmdJZFN0cgULa0dhbWVSZXN1bHQEB3NwbGRSZXMJALUJAgUKZ2FtZVJlc3VsdAIBXwQGYmFsbHNBCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQdzcGxkUmVzAAACFklubmNvcnJlY3QgZ2FtZSByZXN1bHQEBmJhbGxzQgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEJAJEDAgUHc3BsZFJlcwABAhZJbm5jb3JyZWN0IGdhbWUgcmVzdWx0BARkaWZmAwkAZgIFBmJhbGxzQQUGYmFsbHNCCQBlAgUGYmFsbHNBBQZiYWxsc0IJAGUCBQZiYWxsc0IFBmJhbGxzQQQGd2lubmVyAwkAZgIFBmJhbGxzQQUGYmFsbHNCAgFBAwkAZgIFBmJhbGxzQgUGYmFsbHNBAgFCAgFEBAFCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQCsAgIFBmdJZFN0cgUFa0JhbmsEA1VCMQkBC3ZhbHVlT3JFbHNlAgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBDWdldFVzZXJCZXRLZXkEBQR1c2VyBQZnYW1lSWQAAQUGd2lubmVyAAAEA1VCMgkBC3ZhbHVlT3JFbHNlAgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBDWdldFVzZXJCZXRLZXkEBQR1c2VyBQZnYW1lSWQAAgUKZ2FtZVJlc3VsdAAABANVQjMJAQt2YWx1ZU9yRWxzZQIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ1nZXRVc2VyQmV0S2V5BAUEdXNlcgUGZ2FtZUlkAAMJAKwCAgkArAICBQZ3aW5uZXICAV8JAKQDAQUEZGlmZgAABAJHMQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEWZ2V0VG90YWxCZXRzRm9yVHlwZUtleQMFBmdhbWVJZAABBQZ3aW5uZXIAAAQCRzIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBFmdldFRvdGFsQmV0c0ZvclR5cGVLZXkDBQZnYW1lSWQAAgUKZ2FtZVJlc3VsdAAABAJHMwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEWZ2V0VG90YWxCZXRzRm9yVHlwZUtleQMFBmdhbWVJZAADCQCsAgIJAKwCAgUGd2lubmVyAgFfCQCkAwEFBGRpZmYAAAQQdG90YWxXaW5WYWx1ZU1heAkAZAIJAGQCBQJHMQkAaAIFAkcyAAMJAGgCBQJHMwACBAJEMQkAaQIJAGgCCQBkAgUCRzEJAGgCCQBpAgUCRzEFEHRvdGFsV2luVmFsdWVNYXgFAUIFA1VCMQUCRzEEAkQyCQBpAgkAaAIJAGQCBQJHMgkAaAIJAGkCBQJHMgUQdG90YWxXaW5WYWx1ZU1heAUBQgUDVUIyBQJHMgQCRDMJAGkCCQBoAgkAZAIFAkczCQBoAgkAaQIFAkczBRB0b3RhbFdpblZhbHVlTWF4BQFCBQNVQjMFAkczBAtjbGFpbUFtb3VudAkAZAIJAGQCBQJEMQUCRDIFAkQzAwkAAAIFC2NsYWltQW1vdW50AAAJAAIBAhBOb3RoaW5nIHRvIGNsYWltCQCUCgIJAMwIAgkBDEJvb2xlYW5FbnRyeQIJAKwCAgkArAICCQCsAgIFBHVzZXICAV8FBmdJZFN0cgUMa1VzZXJDbGFpbWVkBgkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC2NsYWltQW1vdW50BQRVU0RUBQNuaWwFC2NsYWltQW1vdW50AWkBC2dhbWVTdW1tYXJ5AgZnYW1lSWQGcmVzdWx0BAZnSWRTdHIJAKQDAQUGZ2FtZUlkBA1nYW1lU3RhcnRUaW1lCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApAMBBQZnYW1lSWQFDWtHYW1lU3RyYVRpbWUAAAMJAAACBQ1nYW1lU3RhcnRUaW1lAAAJAAIBCQCsAgICGFRoZXJlIGlzIG5vIGdhbWUgd2l0aCBpZAkApAMBBQZnYW1lSWQEB3NwbGRSZXMJALUJAgUGcmVzdWx0AgFfBAZiYWxsc0EJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFB3NwbGRSZXMAAAIWSW5uY29ycmVjdCBnYW1lIHJlc3VsdAQGYmFsbHNCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQdzcGxkUmVzAAECFklubmNvcnJlY3QgZ2FtZSByZXN1bHQEBGRpZmYDCQBmAgUGYmFsbHNBBQZiYWxsc0IJAGUCBQZiYWxsc0EFBmJhbGxzQgkAZQIFBmJhbGxzQgUGYmFsbHNBBAZ3aW5uZXIDCQBmAgUGYmFsbHNBBQZiYWxsc0ICAUEDCQBmAgUGYmFsbHNCBQZiYWxsc0ECAUICAUQEDXRvdGFsV2luVHlwZTEJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBFmdldFRvdGFsQmV0c0ZvclR5cGVLZXkDBQZnYW1lSWQAAQUGd2lubmVyAAAEDXRvdGFsV2luVHlwZTIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBFmdldFRvdGFsQmV0c0ZvclR5cGVLZXkDBQZnYW1lSWQAAgUGcmVzdWx0AAAEDXRvdGFsV2luVHlwZTMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBFmdldFRvdGFsQmV0c0ZvclR5cGVLZXkDBQZnYW1lSWQAAwkArAICCQCsAgIFBndpbm5lcgIBXwkApAMBBQRkaWZmAAAEDXRvdGFsV2luVmFsdWUJAGQCCQBkAgUNdG90YWxXaW5UeXBlMQUNdG90YWxXaW5UeXBlMgUNdG90YWxXaW5UeXBlMwQJdG90YWxCZXRzCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgkApAMBBQZnYW1lSWQFCmtUb3RhbEJldHMAAAQLYmFua1dpdGhGZWUJAGUCBQl0b3RhbEJldHMFDXRvdGFsV2luVmFsdWUEDSR0MDExMzMzMTE0OTEDCQAAAgUNdG90YWxXaW5WYWx1ZQAACQCUCgIFC2JhbmtXaXRoRmVlAAAEAWYJAGsDBQtiYW5rV2l0aEZlZQUHQkVUX0ZFRQUJRkVFX1NDQUxFCQCUCgIFAWYJAGUCBQtiYW5rV2l0aEZlZQUBZgQDZmVlCAUNJHQwMTEzMzMxMTQ5MQJfMQQEYmFuawgFDSR0MDExMzMzMTE0OTECXzIJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICBQZnSWRTdHIFC2tHYW1lUmVzdWx0BQZyZXN1bHQJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgUGZ0lkU3RyBQVrQmFuawUEYmFuawkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQZnSWRTdHIFCmtGaW5hbFRpbWUIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFEU1PTkVZX0JPWF9BRERSRUVTBQNmZWUFBFVTRFQFA25pbAFpAQlpbml0R2FtZXMCDnN0YXJ0R2FtZVRpbWVzBXR5cGVzCgEIaW5pdEdhbWUCA2FjYw1zdGFydEdhbWVUaW1lBA0kdDAxMTg3NTExOTA5BQNhY2MEB2VudHJpZXMIBQ0kdDAxMTg3NTExOTA5Al8xBApsYXN0R2FtZUlkCAUNJHQwMTE4NzUxMTkwOQJfMgQBaggFDSR0MDExODc1MTE5MDkCXzMECW5ld0dhbWVJZAkAZAIFCmxhc3RHYW1lSWQAAQMJAGYCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUNc3RhcnRHYW1lVGltZQkAAgECI3N0YXJ0R2FtZVRpbWUgbXVzdCBiZSBpbiB0aGUgZnV0dXJlAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgUKR0FNRV9UWVBFUwkAkQMCBQV0eXBlcwUBagkAAgEJAKwCAgIhdHlwZSBtdXN0IGNvbnRhaW4gb25lIG9mIHZhbHVlczogCQC5CQIFCkdBTUVfVFlQRVMCASwEC2dhbWVFbnRyaWVzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIJAKQDAQUJbmV3R2FtZUlkBQ1rR2FtZVN0cmFUaW1lBQ1zdGFydEdhbWVUaW1lCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkApAMBBQluZXdHYW1lSWQFCWtHYW1lVHlwZQkAkQMCBQV0eXBlcwUBagUDbmlsCQCVCgMJAM4IAgUHZW50cmllcwULZ2FtZUVudHJpZXMFCW5ld0dhbWVJZAkAZAIFAWoAAQQKbGFzdEdhbWVJZAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQtrTGFzdEdhbWVJZAAABA0kdDAxMjQ1MjEyNTM3CgACJGwFDnN0YXJ0R2FtZVRpbWVzCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFCmxhc3RHYW1lSWQAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIaW5pdEdhbWUCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDUwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAAVABYAFwAYABkAGgAbABwAHQAeAB8AIAAhACIAIwAkACUAJgAnACgAKQAqACsALAAtAC4ALwAwADEAMgQMZ2FtZXNFbnRyaWVzCAUNJHQwMTI0NTIxMjUzNwJfMQQHbmV3TEdJZAgFDSR0MDEyNDUyMTI1MzcCXzIJAM0IAgUMZ2FtZXNFbnRyaWVzCQEMSW50ZWdlckVudHJ5AgULa0xhc3RHYW1lSWQFB25ld0xHSWQBaQEIc2h1dGRvd24AAwkBASEBBQZhY3RpdmUJAAIBCQCsAgICIkRBcHAgaXMgYWxyZWFkeSBzdXNwZW5kZWQuIENhdXNlOiAJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUEdGhpcwUGa0NhdXNlAhp0aGUgY2F1c2Ugd2Fzbid0IHNwZWNpZmllZAMJAQEhAQkBD2NvbnRhaW5zRWxlbWVudAIJAMwIAgUMYWRtaW5QdWJLZXkxCQDMCAIFDGFkbWluUHViS2V5MgkAzAgCBQxhZG1pblB1YktleTMFA25pbAgFAWkPY2FsbGVyUHVibGljS2V5CQACAQIhT25seSBhZG1pbiBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uCQEHc3VzcGVuZAECD1BhdXNlZCBieSBhZG1pbgFpAQhhY3RpdmF0ZQADBQZhY3RpdmUJAAIBAhZEQXBwIGlzIGFscmVhZHkgYWN0aXZlAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQxhZG1pblB1YktleTEJAMwIAgUMYWRtaW5QdWJLZXkyCQDMCAIFDGFkbWluUHViS2V5MwUDbmlsCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAAIBAiFPbmx5IGFkbWluIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24JAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUGCQDMCAIJAQtEZWxldGVFbnRyeQEFBmtDYXVzZQUDbmlsAP9NsjQ=", "height": 2311201, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 7zJaSoFg7TcagEHL9WX2YqhBkFSQcTwze9GLAmpCUB7D Next: 7NRX48DQxa467bVNUQRqcsXM2hNRebNYnsaPuprjg6Wg Diff:
Old | New | Differences | |
---|---|---|---|
27 | 27 | ||
28 | 28 | let kGameStraTime = "_startGameTime" | |
29 | 29 | ||
30 | - | let kGameType = "_ | |
30 | + | let kGameType = "_GameType" | |
31 | 31 | ||
32 | 32 | let kLastGameId = "last_game_id" | |
33 | 33 | ||
145 | 145 | ||
146 | 146 | func potentialWinnings (gameId,userAddress,amount,type,result) = { | |
147 | 147 | let spldRes = split(result, "_") | |
148 | - | let $ | |
148 | + | let $t039774385 = if ((type == 1)) | |
149 | 149 | then if ((result == "A")) | |
150 | 150 | then $Tuple3("1_0", 1, 0) | |
151 | 151 | else if ((result == "B")) | |
156 | 156 | else if ((spldRes[0] == "A")) | |
157 | 157 | then $Tuple3((spldRes[1] + "_0"), parseIntValue(spldRes[1]), 0) | |
158 | 158 | else $Tuple3(("0_" + spldRes[1]), 0, parseIntValue(spldRes[1])) | |
159 | - | let gameResult = $ | |
160 | - | let ballsA = $ | |
161 | - | let ballsB = $ | |
159 | + | let gameResult = $t039774385._1 | |
160 | + | let ballsA = $t039774385._2 | |
161 | + | let ballsB = $t039774385._3 | |
162 | 162 | let diff = if ((ballsA > ballsB)) | |
163 | 163 | then (ballsA - ballsB) | |
164 | 164 | else (ballsB - ballsA) | |
203 | 203 | func bet (gameId,type,result,refId) = valueOrElse(isActive(), { | |
204 | 204 | let user = toString(i.caller) | |
205 | 205 | let gIdStr = toString(gameId) | |
206 | - | let $ | |
207 | - | let pmtAmount = $ | |
208 | - | let pmtAssetId = $ | |
206 | + | let $t060306105 = $Tuple2(i.payments[0].amount, i.payments[0].assetId) | |
207 | + | let pmtAmount = $t060306105._1 | |
208 | + | let pmtAssetId = $t060306105._2 | |
209 | 209 | let gameStartTime = valueOrElse(getInteger(this, (toString(gameId) + kGameStraTime)), 0) | |
210 | 210 | let gameType = getStringValue(this, (toString(gameId) + kGameType)) | |
211 | 211 | if ((pmtAssetId != USDT)) | |
330 | 330 | let totalWinValue = ((totalWinType1 + totalWinType2) + totalWinType3) | |
331 | 331 | let totalBets = valueOrElse(getInteger(this, (toString(gameId) + kTotalBets)), 0) | |
332 | 332 | let bankWithFee = (totalBets - totalWinValue) | |
333 | - | let $ | |
333 | + | let $t01133311491 = if ((totalWinValue == 0)) | |
334 | 334 | then $Tuple2(bankWithFee, 0) | |
335 | 335 | else { | |
336 | 336 | let f = fraction(bankWithFee, BET_FEE, FEE_SCALE) | |
337 | 337 | $Tuple2(f, (bankWithFee - f)) | |
338 | 338 | } | |
339 | - | let fee = $ | |
340 | - | let bank = $ | |
339 | + | let fee = $t01133311491._1 | |
340 | + | let bank = $t01133311491._2 | |
341 | 341 | [StringEntry((gIdStr + kGameResult), result), IntegerEntry((gIdStr + kBank), bank), IntegerEntry((gIdStr + kFinalTime), lastBlock.timestamp), ScriptTransfer(MONEY_BOX_ADDREES, fee, USDT)] | |
342 | 342 | } | |
343 | 343 | } | |
347 | 347 | @Callable(i) | |
348 | 348 | func initGames (startGameTimes,types) = { | |
349 | 349 | func initGame (acc,startGameTime) = { | |
350 | - | let $ | |
351 | - | let entries = $ | |
352 | - | let lastGameId = $ | |
353 | - | let j = $ | |
350 | + | let $t01187511909 = acc | |
351 | + | let entries = $t01187511909._1 | |
352 | + | let lastGameId = $t01187511909._2 | |
353 | + | let j = $t01187511909._3 | |
354 | 354 | let newGameId = (lastGameId + 1) | |
355 | 355 | if ((lastBlock.timestamp > startGameTime)) | |
356 | 356 | then throw("startGameTime must be in the future") | |
363 | 363 | } | |
364 | 364 | ||
365 | 365 | let lastGameId = valueOrElse(getInteger(this, kLastGameId), 0) | |
366 | - | let $ | |
366 | + | let $t01245212537 = { | |
367 | 367 | let $l = startGameTimes | |
368 | 368 | let $s = size($l) | |
369 | 369 | let $acc0 = $Tuple3(nil, lastGameId, 0) | |
377 | 377 | ||
378 | 378 | $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($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($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($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), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50) | |
379 | 379 | } | |
380 | - | let gamesEntries = $ | |
381 | - | let newLGId = $ | |
380 | + | let gamesEntries = $t01245212537._1 | |
381 | + | let newLGId = $t01245212537._2 | |
382 | 382 | (gamesEntries :+ IntegerEntry(kLastGameId, newLGId)) | |
383 | 383 | } | |
384 | 384 |
Old | New | Differences | |
---|---|---|---|
1 | 1 | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | let GAME_TYPE_GROUP = "Group" | |
5 | 5 | ||
6 | 6 | let GAME_TYPE_PLATOFF = "Play-off" | |
7 | 7 | ||
8 | 8 | let GAME_TYPES = [GAME_TYPE_GROUP, GAME_TYPE_PLATOFF] | |
9 | 9 | ||
10 | 10 | let USDT = base58'8UrfDVd5GreeUwm7uPk7eYz1eMv376kzR52C6sANPkwS' | |
11 | 11 | ||
12 | 12 | let MIN_BET = 1000000 | |
13 | 13 | ||
14 | 14 | let ONE_HOUR = ((5 * 60) * 1000) | |
15 | 15 | ||
16 | 16 | let MONEY_BOX_ADDREES = Address(base58'3N65zqVKchaFdW4gS7FxCRibjfkVgJvo7PT') | |
17 | 17 | ||
18 | 18 | let BET_FEE = 500 | |
19 | 19 | ||
20 | 20 | let FEE_SCALE = 10000 | |
21 | 21 | ||
22 | 22 | let kActive = "active" | |
23 | 23 | ||
24 | 24 | let kActiveGlob = "active_all_contracts" | |
25 | 25 | ||
26 | 26 | let kCause = "shutdown_cause" | |
27 | 27 | ||
28 | 28 | let kGameStraTime = "_startGameTime" | |
29 | 29 | ||
30 | - | let kGameType = "_ | |
30 | + | let kGameType = "_GameType" | |
31 | 31 | ||
32 | 32 | let kLastGameId = "last_game_id" | |
33 | 33 | ||
34 | 34 | let kTotalBets = "_totalBets" | |
35 | 35 | ||
36 | 36 | let kToWinA = "_toWinA" | |
37 | 37 | ||
38 | 38 | let kToWinB = "_toWinA" | |
39 | 39 | ||
40 | 40 | let kOnDraw = "_onDraw" | |
41 | 41 | ||
42 | 42 | let kGameResult = "_result" | |
43 | 43 | ||
44 | 44 | let kBank = "_bank" | |
45 | 45 | ||
46 | 46 | let kFinalTime = "_finalTimeā" | |
47 | 47 | ||
48 | 48 | let kTotalBetsForType = "_totalBetsForType" | |
49 | 49 | ||
50 | 50 | let kUserBet = "_userBet" | |
51 | 51 | ||
52 | 52 | let kUserRefId = "_refId" | |
53 | 53 | ||
54 | 54 | let kUserClaimed = "_claimed" | |
55 | 55 | ||
56 | 56 | let kAdminPubKey1 = "admin_pub_1" | |
57 | 57 | ||
58 | 58 | let kAdminPubKey2 = "admin_pub_2" | |
59 | 59 | ||
60 | 60 | let kAdminPubKey3 = "admin_pub_3" | |
61 | 61 | ||
62 | 62 | let oracle = Address(base58'3PEbqViERCoKnmcSULh6n2aiMvUdSQdCsom') | |
63 | 63 | ||
64 | 64 | func getBase58FromOracle (key) = match getString(oracle, key) { | |
65 | 65 | case string: String => | |
66 | 66 | fromBase58String(string) | |
67 | 67 | case nothing => | |
68 | 68 | throw((key + "is empty")) | |
69 | 69 | } | |
70 | 70 | ||
71 | 71 | ||
72 | 72 | let adminPubKey1 = getBase58FromOracle(kAdminPubKey1) | |
73 | 73 | ||
74 | 74 | let adminPubKey2 = getBase58FromOracle(kAdminPubKey2) | |
75 | 75 | ||
76 | 76 | let adminPubKey3 = getBase58FromOracle(kAdminPubKey3) | |
77 | 77 | ||
78 | 78 | let active = valueOrElse(getBoolean(this, kActive), true) | |
79 | 79 | ||
80 | 80 | let activeGlob = valueOrElse(getBoolean(oracle, kActiveGlob), true) | |
81 | 81 | ||
82 | 82 | func isActive () = if (if (active) | |
83 | 83 | then activeGlob | |
84 | 84 | else false) | |
85 | 85 | then unit | |
86 | 86 | else throw("DApp is inactive at this moment") | |
87 | 87 | ||
88 | 88 | ||
89 | 89 | func isAdminCall (i) = if (containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey)) | |
90 | 90 | then unit | |
91 | 91 | else throw("Only admin can call this function") | |
92 | 92 | ||
93 | 93 | ||
94 | 94 | func suspend (cause) = [BooleanEntry(kActive, false), StringEntry(kCause, cause)] | |
95 | 95 | ||
96 | 96 | ||
97 | 97 | func getUserBetKey (user,gameId,type,result) = (((((((user + "_") + toString(gameId)) + "_") + toString(type)) + "_") + result) + kUserBet) | |
98 | 98 | ||
99 | 99 | ||
100 | 100 | func getTotalBetsForTypeKey (gameId,type,result) = (((((toString(gameId) + "_") + toString(type)) + "_") + result) + kTotalBetsForType) | |
101 | 101 | ||
102 | 102 | ||
103 | 103 | func validateBet (gameType,type,result) = if ((type == 1)) | |
104 | 104 | then if ((size(result) != 1)) | |
105 | 105 | then throw("Game result must contain only one letter: A,B,D") | |
106 | 106 | else if (!(contains("ABD", result))) | |
107 | 107 | then throw("Game result must contain only one letter: A,B,D") | |
108 | 108 | else if (if ((gameType == GAME_TYPE_PLATOFF)) | |
109 | 109 | then !(contains("AB", result)) | |
110 | 110 | else false) | |
111 | 111 | then throw("Game result must contain only one letter: A,B") | |
112 | 112 | else true | |
113 | 113 | else if ((type == 2)) | |
114 | 114 | then { | |
115 | 115 | let splited = split(result, "_") | |
116 | 116 | if ((size(splited) != 2)) | |
117 | 117 | then throw("Inncorrect game result") | |
118 | 118 | else { | |
119 | 119 | let ballsA = valueOrErrorMessage(parseInt(splited[0]), "Inncorrect game result") | |
120 | 120 | let ballsB = valueOrErrorMessage(parseInt(splited[1]), "Inncorrect game result") | |
121 | 121 | if ((ballsA == ballsB)) | |
122 | 122 | then throw("Inncorrect game result. A and B cannot be equal") | |
123 | 123 | else true | |
124 | 124 | } | |
125 | 125 | } | |
126 | 126 | else if ((type == 3)) | |
127 | 127 | then { | |
128 | 128 | let splited = split(result, "_") | |
129 | 129 | if ((size(splited) != 2)) | |
130 | 130 | then throw("Inncorrect game result") | |
131 | 131 | else { | |
132 | 132 | let team = splited[0] | |
133 | 133 | let ballsAmount = valueOrErrorMessage(parseInt(splited[1]), "Inncorrect game result") | |
134 | 134 | if ((0 >= ballsAmount)) | |
135 | 135 | then throw("Inncorrect game result, balls amount must be greater then 0") | |
136 | 136 | else if (if ((size(team) != 1)) | |
137 | 137 | then true | |
138 | 138 | else !(contains("AB", team))) | |
139 | 139 | then throw("Game result must contain only one letter: A,B") | |
140 | 140 | else true | |
141 | 141 | } | |
142 | 142 | } | |
143 | 143 | else false | |
144 | 144 | ||
145 | 145 | ||
146 | 146 | func potentialWinnings (gameId,userAddress,amount,type,result) = { | |
147 | 147 | let spldRes = split(result, "_") | |
148 | - | let $ | |
148 | + | let $t039774385 = if ((type == 1)) | |
149 | 149 | then if ((result == "A")) | |
150 | 150 | then $Tuple3("1_0", 1, 0) | |
151 | 151 | else if ((result == "B")) | |
152 | 152 | then $Tuple3("0_1", 0, 1) | |
153 | 153 | else $Tuple3("1_1", 1, 1) | |
154 | 154 | else if ((type == 2)) | |
155 | 155 | then $Tuple3(result, parseIntValue(spldRes[0]), parseIntValue(spldRes[1])) | |
156 | 156 | else if ((spldRes[0] == "A")) | |
157 | 157 | then $Tuple3((spldRes[1] + "_0"), parseIntValue(spldRes[1]), 0) | |
158 | 158 | else $Tuple3(("0_" + spldRes[1]), 0, parseIntValue(spldRes[1])) | |
159 | - | let gameResult = $ | |
160 | - | let ballsA = $ | |
161 | - | let ballsB = $ | |
159 | + | let gameResult = $t039774385._1 | |
160 | + | let ballsA = $t039774385._2 | |
161 | + | let ballsB = $t039774385._3 | |
162 | 162 | let diff = if ((ballsA > ballsB)) | |
163 | 163 | then (ballsA - ballsB) | |
164 | 164 | else (ballsB - ballsA) | |
165 | 165 | let winner = if ((ballsA > ballsB)) | |
166 | 166 | then "A" | |
167 | 167 | else if ((ballsB > ballsA)) | |
168 | 168 | then "B" | |
169 | 169 | else "D" | |
170 | 170 | let G1 = (valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, 1, winner)), 0) + (if ((type == 1)) | |
171 | 171 | then amount | |
172 | 172 | else 0)) | |
173 | 173 | let G2 = (valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, 2, result)), 0) + (if ((type == 2)) | |
174 | 174 | then amount | |
175 | 175 | else 0)) | |
176 | 176 | let G3 = (valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, 3, ((winner + "_") + toString(diff)))), 0) + (if ((type == 3)) | |
177 | 177 | then amount | |
178 | 178 | else 0)) | |
179 | 179 | let totalWinValue = ((G1 + G2) + G3) | |
180 | 180 | let totalBets = valueOrElse(getInteger(this, (toString(gameId) + kTotalBets)), 0) | |
181 | 181 | let bankWithFee = (totalBets - totalWinValue) | |
182 | 182 | let fee = fraction(bankWithFee, BET_FEE, FEE_SCALE) | |
183 | 183 | let B = (bankWithFee - fee) | |
184 | 184 | let UB1 = (valueOrElse(getIntegerValue(this, getUserBetKey(userAddress, gameId, 1, winner)), 0) + (if ((type == 1)) | |
185 | 185 | then amount | |
186 | 186 | else 0)) | |
187 | 187 | let UB2 = (valueOrElse(getIntegerValue(this, getUserBetKey(userAddress, gameId, 2, gameResult)), 0) + (if ((type == 1)) | |
188 | 188 | then amount | |
189 | 189 | else 0)) | |
190 | 190 | let UB3 = (valueOrElse(getIntegerValue(this, getUserBetKey(userAddress, gameId, 3, ((winner + "_") + toString(diff)))), 0) + (if ((type == 1)) | |
191 | 191 | then amount | |
192 | 192 | else 0)) | |
193 | 193 | let totalWinValueMax = ((G1 + (G2 * 3)) + (G3 * 2)) | |
194 | 194 | let D1 = (((G1 + ((G1 / totalWinValueMax) * B)) * UB1) / G1) | |
195 | 195 | let D2 = (((G2 + ((G2 / totalWinValueMax) * B)) * UB2) / G2) | |
196 | 196 | let D3 = (((G3 + ((G3 / totalWinValueMax) * B)) * UB3) / G3) | |
197 | 197 | let claimAmount = ((D1 + D2) + D3) | |
198 | 198 | claimAmount | |
199 | 199 | } | |
200 | 200 | ||
201 | 201 | ||
202 | 202 | @Callable(i) | |
203 | 203 | func bet (gameId,type,result,refId) = valueOrElse(isActive(), { | |
204 | 204 | let user = toString(i.caller) | |
205 | 205 | let gIdStr = toString(gameId) | |
206 | - | let $ | |
207 | - | let pmtAmount = $ | |
208 | - | let pmtAssetId = $ | |
206 | + | let $t060306105 = $Tuple2(i.payments[0].amount, i.payments[0].assetId) | |
207 | + | let pmtAmount = $t060306105._1 | |
208 | + | let pmtAssetId = $t060306105._2 | |
209 | 209 | let gameStartTime = valueOrElse(getInteger(this, (toString(gameId) + kGameStraTime)), 0) | |
210 | 210 | let gameType = getStringValue(this, (toString(gameId) + kGameType)) | |
211 | 211 | if ((pmtAssetId != USDT)) | |
212 | 212 | then throw("Pamyment must be In USDT asset") | |
213 | 213 | else if ((MIN_BET > pmtAmount)) | |
214 | 214 | then throw((("Min bet " + toString((MIN_BET / 1000000))) + "USDT")) | |
215 | 215 | else if ((gameStartTime == 0)) | |
216 | 216 | then throw(("There is no game with id" + toString(gameId))) | |
217 | 217 | else if (((lastBlock.timestamp + ONE_HOUR) >= gameStartTime)) | |
218 | 218 | then throw("Bets on this game are no longer accepted") | |
219 | 219 | else if (!(validateBet(gameType, type, result))) | |
220 | 220 | then throw("Incorrect bet type") | |
221 | 221 | else { | |
222 | 222 | let spldRes = split(result, "_") | |
223 | 223 | let userBetKey = getUserBetKey(user, gameId, type, result) | |
224 | 224 | let totalBetsForTypeBetKey = getTotalBetsForTypeKey(gameId, type, result) | |
225 | 225 | let userBet = (valueOrElse(getInteger(this, userBetKey), 0) + pmtAmount) | |
226 | 226 | let totalBetsForTypeBet = (valueOrElse(getInteger(this, totalBetsForTypeBetKey), 0) + pmtAmount) | |
227 | 227 | let totalBets = (valueOrElse(getInteger(this, (gIdStr + kTotalBets)), 0) + pmtAmount) | |
228 | 228 | let toWinA = (valueOrElse(getInteger(this, (gIdStr + kToWinA)), 0) + (if (if ((type == 1)) | |
229 | 229 | then (result == "A") | |
230 | 230 | else false) | |
231 | 231 | then pmtAmount | |
232 | 232 | else if (if ((type == 2)) | |
233 | 233 | then (parseIntValue(spldRes[0]) > parseIntValue(spldRes[1])) | |
234 | 234 | else false) | |
235 | 235 | then pmtAmount | |
236 | 236 | else if (if ((type == 3)) | |
237 | 237 | then (spldRes[0] == "A") | |
238 | 238 | else false) | |
239 | 239 | then pmtAmount | |
240 | 240 | else 0)) | |
241 | 241 | let toWinB = (valueOrElse(getInteger(this, (gIdStr + kToWinB)), 0) + (if (if ((type == 1)) | |
242 | 242 | then (result == "B") | |
243 | 243 | else false) | |
244 | 244 | then pmtAmount | |
245 | 245 | else if (if ((type == 2)) | |
246 | 246 | then (parseIntValue(spldRes[1]) > parseIntValue(spldRes[0])) | |
247 | 247 | else false) | |
248 | 248 | then pmtAmount | |
249 | 249 | else if (if ((type == 3)) | |
250 | 250 | then (spldRes[0] == "B") | |
251 | 251 | else false) | |
252 | 252 | then pmtAmount | |
253 | 253 | else 0)) | |
254 | 254 | let onDraw = (valueOrElse(getInteger(this, (gIdStr + kOnDraw)), 0) + (if (if ((type == 1)) | |
255 | 255 | then (result == "D") | |
256 | 256 | else false) | |
257 | 257 | then pmtAmount | |
258 | 258 | else 0)) | |
259 | 259 | ([IntegerEntry(userBetKey, userBet), IntegerEntry(totalBetsForTypeBetKey, totalBetsForTypeBet), IntegerEntry((gIdStr + kTotalBets), totalBets), IntegerEntry((gIdStr + kToWinA), toWinA), IntegerEntry((gIdStr + kToWinB), toWinB), IntegerEntry((gIdStr + kOnDraw), onDraw)] ++ (if (!(isDefined(getString(this, kUserRefId)))) | |
260 | 260 | then [StringEntry(kUserRefId, refId)] | |
261 | 261 | else nil)) | |
262 | 262 | } | |
263 | 263 | }) | |
264 | 264 | ||
265 | 265 | ||
266 | 266 | ||
267 | 267 | @Callable(i) | |
268 | 268 | func claim (gameId) = valueOrElse(isActive(), { | |
269 | 269 | let user = toString(i.caller) | |
270 | 270 | let gIdStr = toString(gameId) | |
271 | 271 | let finalTime = valueOrErrorMessage(getInteger(this, (gIdStr + kFinalTime)), "You can claim only after game finish") | |
272 | 272 | if ((lastBlock.timestamp > (finalTime + ONE_HOUR))) | |
273 | 273 | then throw("You can claim only after one hour pass after final time") | |
274 | 274 | else if (isDefined(getBoolean(this, (((user + "_") + gIdStr) + kUserClaimed)))) | |
275 | 275 | then throw("You are alredy claimed") | |
276 | 276 | else { | |
277 | 277 | let gameResult = getStringValue(this, (gIdStr + kGameResult)) | |
278 | 278 | let spldRes = split(gameResult, "_") | |
279 | 279 | let ballsA = valueOrErrorMessage(parseInt(spldRes[0]), "Inncorrect game result") | |
280 | 280 | let ballsB = valueOrErrorMessage(parseInt(spldRes[1]), "Inncorrect game result") | |
281 | 281 | let diff = if ((ballsA > ballsB)) | |
282 | 282 | then (ballsA - ballsB) | |
283 | 283 | else (ballsB - ballsA) | |
284 | 284 | let winner = if ((ballsA > ballsB)) | |
285 | 285 | then "A" | |
286 | 286 | else if ((ballsB > ballsA)) | |
287 | 287 | then "B" | |
288 | 288 | else "D" | |
289 | 289 | let B = getIntegerValue(this, (gIdStr + kBank)) | |
290 | 290 | let UB1 = valueOrElse(getIntegerValue(this, getUserBetKey(user, gameId, 1, winner)), 0) | |
291 | 291 | let UB2 = valueOrElse(getIntegerValue(this, getUserBetKey(user, gameId, 2, gameResult)), 0) | |
292 | 292 | let UB3 = valueOrElse(getIntegerValue(this, getUserBetKey(user, gameId, 3, ((winner + "_") + toString(diff)))), 0) | |
293 | 293 | let G1 = valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, 1, winner)), 0) | |
294 | 294 | let G2 = valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, 2, gameResult)), 0) | |
295 | 295 | let G3 = valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, 3, ((winner + "_") + toString(diff)))), 0) | |
296 | 296 | let totalWinValueMax = ((G1 + (G2 * 3)) + (G3 * 2)) | |
297 | 297 | let D1 = (((G1 + ((G1 / totalWinValueMax) * B)) * UB1) / G1) | |
298 | 298 | let D2 = (((G2 + ((G2 / totalWinValueMax) * B)) * UB2) / G2) | |
299 | 299 | let D3 = (((G3 + ((G3 / totalWinValueMax) * B)) * UB3) / G3) | |
300 | 300 | let claimAmount = ((D1 + D2) + D3) | |
301 | 301 | if ((claimAmount == 0)) | |
302 | 302 | then throw("Nothing to claim") | |
303 | 303 | else $Tuple2([BooleanEntry((((user + "_") + gIdStr) + kUserClaimed), true), ScriptTransfer(i.caller, claimAmount, USDT)], claimAmount) | |
304 | 304 | } | |
305 | 305 | }) | |
306 | 306 | ||
307 | 307 | ||
308 | 308 | ||
309 | 309 | @Callable(i) | |
310 | 310 | func gameSummary (gameId,result) = { | |
311 | 311 | let gIdStr = toString(gameId) | |
312 | 312 | let gameStartTime = valueOrElse(getInteger(this, (toString(gameId) + kGameStraTime)), 0) | |
313 | 313 | if ((gameStartTime == 0)) | |
314 | 314 | then throw(("There is no game with id" + toString(gameId))) | |
315 | 315 | else { | |
316 | 316 | let spldRes = split(result, "_") | |
317 | 317 | let ballsA = valueOrErrorMessage(parseInt(spldRes[0]), "Inncorrect game result") | |
318 | 318 | let ballsB = valueOrErrorMessage(parseInt(spldRes[1]), "Inncorrect game result") | |
319 | 319 | let diff = if ((ballsA > ballsB)) | |
320 | 320 | then (ballsA - ballsB) | |
321 | 321 | else (ballsB - ballsA) | |
322 | 322 | let winner = if ((ballsA > ballsB)) | |
323 | 323 | then "A" | |
324 | 324 | else if ((ballsB > ballsA)) | |
325 | 325 | then "B" | |
326 | 326 | else "D" | |
327 | 327 | let totalWinType1 = valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, 1, winner)), 0) | |
328 | 328 | let totalWinType2 = valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, 2, result)), 0) | |
329 | 329 | let totalWinType3 = valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, 3, ((winner + "_") + toString(diff)))), 0) | |
330 | 330 | let totalWinValue = ((totalWinType1 + totalWinType2) + totalWinType3) | |
331 | 331 | let totalBets = valueOrElse(getInteger(this, (toString(gameId) + kTotalBets)), 0) | |
332 | 332 | let bankWithFee = (totalBets - totalWinValue) | |
333 | - | let $ | |
333 | + | let $t01133311491 = if ((totalWinValue == 0)) | |
334 | 334 | then $Tuple2(bankWithFee, 0) | |
335 | 335 | else { | |
336 | 336 | let f = fraction(bankWithFee, BET_FEE, FEE_SCALE) | |
337 | 337 | $Tuple2(f, (bankWithFee - f)) | |
338 | 338 | } | |
339 | - | let fee = $ | |
340 | - | let bank = $ | |
339 | + | let fee = $t01133311491._1 | |
340 | + | let bank = $t01133311491._2 | |
341 | 341 | [StringEntry((gIdStr + kGameResult), result), IntegerEntry((gIdStr + kBank), bank), IntegerEntry((gIdStr + kFinalTime), lastBlock.timestamp), ScriptTransfer(MONEY_BOX_ADDREES, fee, USDT)] | |
342 | 342 | } | |
343 | 343 | } | |
344 | 344 | ||
345 | 345 | ||
346 | 346 | ||
347 | 347 | @Callable(i) | |
348 | 348 | func initGames (startGameTimes,types) = { | |
349 | 349 | func initGame (acc,startGameTime) = { | |
350 | - | let $ | |
351 | - | let entries = $ | |
352 | - | let lastGameId = $ | |
353 | - | let j = $ | |
350 | + | let $t01187511909 = acc | |
351 | + | let entries = $t01187511909._1 | |
352 | + | let lastGameId = $t01187511909._2 | |
353 | + | let j = $t01187511909._3 | |
354 | 354 | let newGameId = (lastGameId + 1) | |
355 | 355 | if ((lastBlock.timestamp > startGameTime)) | |
356 | 356 | then throw("startGameTime must be in the future") | |
357 | 357 | else if (!(containsElement(GAME_TYPES, types[j]))) | |
358 | 358 | then throw(("type must contain one of values: " + makeString(GAME_TYPES, ","))) | |
359 | 359 | else { | |
360 | 360 | let gameEntries = [IntegerEntry((toString(newGameId) + kGameStraTime), startGameTime), StringEntry((toString(newGameId) + kGameType), types[j])] | |
361 | 361 | $Tuple3((entries ++ gameEntries), newGameId, (j + 1)) | |
362 | 362 | } | |
363 | 363 | } | |
364 | 364 | ||
365 | 365 | let lastGameId = valueOrElse(getInteger(this, kLastGameId), 0) | |
366 | - | let $ | |
366 | + | let $t01245212537 = { | |
367 | 367 | let $l = startGameTimes | |
368 | 368 | let $s = size($l) | |
369 | 369 | let $acc0 = $Tuple3(nil, lastGameId, 0) | |
370 | 370 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
371 | 371 | then $a | |
372 | 372 | else initGame($a, $l[$i]) | |
373 | 373 | ||
374 | 374 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
375 | 375 | then $a | |
376 | 376 | else throw("List size exceeds 50") | |
377 | 377 | ||
378 | 378 | $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($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($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($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), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50) | |
379 | 379 | } | |
380 | - | let gamesEntries = $ | |
381 | - | let newLGId = $ | |
380 | + | let gamesEntries = $t01245212537._1 | |
381 | + | let newLGId = $t01245212537._2 | |
382 | 382 | (gamesEntries :+ IntegerEntry(kLastGameId, newLGId)) | |
383 | 383 | } | |
384 | 384 | ||
385 | 385 | ||
386 | 386 | ||
387 | 387 | @Callable(i) | |
388 | 388 | func shutdown () = if (!(active)) | |
389 | 389 | then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified"))) | |
390 | 390 | else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))) | |
391 | 391 | then throw("Only admin can call this function") | |
392 | 392 | else suspend("Paused by admin") | |
393 | 393 | ||
394 | 394 | ||
395 | 395 | ||
396 | 396 | @Callable(i) | |
397 | 397 | func activate () = if (active) | |
398 | 398 | then throw("DApp is already active") | |
399 | 399 | else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))) | |
400 | 400 | then throw("Only admin can call this function") | |
401 | 401 | else [BooleanEntry(kActive, true), DeleteEntry(kCause)] | |
402 | 402 | ||
403 | 403 |
github/deemru/w8io/169f3d6 63.81 ms ◑![]()