tx · E1abgJgWboM2XPmh4q97CSYoYmb1VmTvXaVe98V4pTXh 3Mungn3ygy3DzpbDUKPbJQaeNKfQHu9fkK8: -0.01200000 Waves 2022.11.10 17:50 [2311192] smart account 3Mungn3ygy3DzpbDUKPbJQaeNKfQHu9fkK8 > SELF 0.00000000 Waves
{ "type": 13, "id": "E1abgJgWboM2XPmh4q97CSYoYmb1VmTvXaVe98V4pTXh", "fee": 1200000, "feeAssetId": null, "timestamp": 1668091853991, "version": 2, "chainId": 84, "sender": "3Mungn3ygy3DzpbDUKPbJQaeNKfQHu9fkK8", "senderPublicKey": "6L7iBerXuPa5E74WCM6fLSB2VM1bMG9jgASH8tu9orHN", "proofs": [ "2XpDHTYMSA6Lqy9pJdfrMYpWCUGMgrENeyShFC4hqcEMhQoxpC5SBSRTwqTyGyDKEgXS9h9rWWvMCDYAqQwRNm3W" ], "script": "base64:BgIfCAISBgoEAQEICBIDCgEBEgQKAgEIEgQKAhEYEgASACsAD0dBTUVfVFlQRV9HUk9VUAIFR3JvdXAAEUdBTUVfVFlQRV9QTEFUT0ZGAghQbGF5LW9mZgAKR0FNRV9UWVBFUwkAzAgCBQ9HQU1FX1RZUEVfR1JPVVAJAMwIAgURR0FNRV9UWVBFX1BMQVRPRkYFA25pbAAEVVNEVAEgbySjyqsw3FIpmOgsYVruWn8jTcItdbvpnapU4NLQB8EAB01JTl9CRVQAwIQ9AAhPTkVfSE9VUgkAaAIJAGgCAAUAPADoBwARTU9ORVlfQk9YX0FERFJFRVMJAQdBZGRyZXNzAQEaAVSxYgy7BRV2F+zuKtUZtXyHmoiep9yqU84AB0JFVF9GRUUA9AMACUZFRV9TQ0FMRQCQTgAHa0FjdGl2ZQIGYWN0aXZlAAtrQWN0aXZlR2xvYgIUYWN0aXZlX2FsbF9jb250cmFjdHMABmtDYXVzZQIOc2h1dGRvd25fY2F1c2UADWtHYW1lU3RyYVRpbWUCDl9zdGFydEdhbWVUaW1lAAlrR2FtZVR5cGUCDl9zdGFydEdhbWVUaW1lAAtrTGFzdEdhbWVJZAIMbGFzdF9nYW1lX2lkAAprVG90YWxCZXRzAgpfdG90YWxCZXRzAAdrVG9XaW5BAgdfdG9XaW5BAAdrVG9XaW5CAgdfdG9XaW5BAAdrT25EcmF3Agdfb25EcmF3AAtrR2FtZVJlc3VsdAIHX3Jlc3VsdAAFa0JhbmsCBV9iYW5rAAprRmluYWxUaW1lAg1fZmluYWxUaW1l4oCdABFrVG90YWxCZXRzRm9yVHlwZQIRX3RvdGFsQmV0c0ZvclR5cGUACGtVc2VyQmV0AghfdXNlckJldAAKa1VzZXJSZWZJZAIGX3JlZklkAAxrVXNlckNsYWltZWQCCF9jbGFpbWVkAA1rQWRtaW5QdWJLZXkxAgthZG1pbl9wdWJfMQANa0FkbWluUHViS2V5MgILYWRtaW5fcHViXzIADWtBZG1pblB1YktleTMCC2FkbWluX3B1Yl8zAAZvcmFjbGUJAQdBZGRyZXNzAQEaAVeK/whomjW6QM1hdPISN96mN/D6OM7oHjgBE2dldEJhc2U1OEZyb21PcmFjbGUBA2tleQQHJG1hdGNoMAkAnQgCBQZvcmFjbGUFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEBnN0cmluZwUHJG1hdGNoMAkA2QQBBQZzdHJpbmcEB25vdGhpbmcFByRtYXRjaDAJAAIBCQCsAgIFA2tleQIIaXMgZW1wdHkADGFkbWluUHViS2V5MQkBE2dldEJhc2U1OEZyb21PcmFjbGUBBQ1rQWRtaW5QdWJLZXkxAAxhZG1pblB1YktleTIJARNnZXRCYXNlNThGcm9tT3JhY2xlAQUNa0FkbWluUHViS2V5MgAMYWRtaW5QdWJLZXkzCQETZ2V0QmFzZTU4RnJvbU9yYWNsZQEFDWtBZG1pblB1YktleTMABmFjdGl2ZQkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQdrQWN0aXZlBgAKYWN0aXZlR2xvYgkBC3ZhbHVlT3JFbHNlAgkAmwgCBQZvcmFjbGUFC2tBY3RpdmVHbG9iBgEIaXNBY3RpdmUAAwMFBmFjdGl2ZQUKYWN0aXZlR2xvYgcFBHVuaXQJAAIBAh9EQXBwIGlzIGluYWN0aXZlIGF0IHRoaXMgbW9tZW50AQtpc0FkbWluQ2FsbAEBaQMJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQUEdW5pdAkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgEHc3VzcGVuZAEFY2F1c2UJAMwIAgkBDEJvb2xlYW5FbnRyeQIFB2tBY3RpdmUHCQDMCAIJAQtTdHJpbmdFbnRyeQIFBmtDYXVzZQUFY2F1c2UFA25pbAENZ2V0VXNlckJldEtleQQEdXNlcgZnYW1lSWQEdHlwZQZyZXN1bHQJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwkApAMBBQZnYW1lSWQCAV8JAKQDAQUEdHlwZQIBXwUGcmVzdWx0BQhrVXNlckJldAEWZ2V0VG90YWxCZXRzRm9yVHlwZUtleQMGZ2FtZUlkBHR5cGUGcmVzdWx0CQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkApAMBBQZnYW1lSWQCAV8JAKQDAQUEdHlwZQIBXwUGcmVzdWx0BRFrVG90YWxCZXRzRm9yVHlwZQELdmFsaWRhdGVCZXQDCGdhbWVUeXBlBHR5cGUGcmVzdWx0AwkAAAIFBHR5cGUAAQMJAQIhPQIJALECAQUGcmVzdWx0AAEJAAIBAi9HYW1lIHJlc3VsdCBtdXN0IGNvbnRhaW4gb25seSBvbmUgbGV0dGVyOiBBLEIsRAMJAQEhAQkBCGNvbnRhaW5zAgIDQUJEBQZyZXN1bHQJAAIBAi9HYW1lIHJlc3VsdCBtdXN0IGNvbnRhaW4gb25seSBvbmUgbGV0dGVyOiBBLEIsRAMDCQAAAgUIZ2FtZVR5cGUFEUdBTUVfVFlQRV9QTEFUT0ZGCQEBIQEJAQhjb250YWlucwICAkFCBQZyZXN1bHQHCQACAQItR2FtZSByZXN1bHQgbXVzdCBjb250YWluIG9ubHkgb25lIGxldHRlcjogQSxCBgMJAAACBQR0eXBlAAIEB3NwbGl0ZWQJALUJAgUGcmVzdWx0AgFfAwkBAiE9AgkAkAMBBQdzcGxpdGVkAAIJAAIBAhZJbm5jb3JyZWN0IGdhbWUgcmVzdWx0BAZiYWxsc0EJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFB3NwbGl0ZWQAAAIWSW5uY29ycmVjdCBnYW1lIHJlc3VsdAQGYmFsbHNCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQdzcGxpdGVkAAECFklubmNvcnJlY3QgZ2FtZSByZXN1bHQDCQAAAgUGYmFsbHNBBQZiYWxsc0IJAAIBAi9Jbm5jb3JyZWN0IGdhbWUgcmVzdWx0LiBBIGFuZCBCIGNhbm5vdCBiZSBlcXVhbAYDCQAAAgUEdHlwZQADBAdzcGxpdGVkCQC1CQIFBnJlc3VsdAIBXwMJAQIhPQIJAJADAQUHc3BsaXRlZAACCQACAQIWSW5uY29ycmVjdCBnYW1lIHJlc3VsdAQEdGVhbQkAkQMCBQdzcGxpdGVkAAAEC2JhbGxzQW1vdW50CQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQdzcGxpdGVkAAECFklubmNvcnJlY3QgZ2FtZSByZXN1bHQDCQBnAgAABQtiYWxsc0Ftb3VudAkAAgECO0lubmNvcnJlY3QgZ2FtZSByZXN1bHQsIGJhbGxzIGFtb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhlbiAwAwMJAQIhPQIJALECAQUEdGVhbQABBgkBASEBCQEIY29udGFpbnMCAgJBQgUEdGVhbQkAAgECLUdhbWUgcmVzdWx0IG11c3QgY29udGFpbiBvbmx5IG9uZSBsZXR0ZXI6IEEsQgYHARFwb3RlbnRpYWxXaW5uaW5ncwUGZ2FtZUlkC3VzZXJBZGRyZXNzBmFtb3VudAR0eXBlBnJlc3VsdAQHc3BsZFJlcwkAtQkCBQZyZXN1bHQCAV8ECyR0MDM5ODI0MzkwAwkAAAIFBHR5cGUAAQMJAAACBQZyZXN1bHQCAUEJAJUKAwIDMV8wAAEAAAMJAAACBQZyZXN1bHQCAUIJAJUKAwIDMF8xAAAAAQkAlQoDAgMxXzEAAQABAwkAAAIFBHR5cGUAAgkAlQoDBQZyZXN1bHQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzcGxkUmVzAAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzcGxkUmVzAAEDCQAAAgkAkQMCBQdzcGxkUmVzAAACAUEJAJUKAwkArAICCQCRAwIFB3NwbGRSZXMAAQICXzAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdzcGxkUmVzAAEAAAkAlQoDCQCsAgICAjBfCQCRAwIFB3NwbGRSZXMAAQAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHc3BsZFJlcwABBApnYW1lUmVzdWx0CAULJHQwMzk4MjQzOTACXzEEBmJhbGxzQQgFCyR0MDM5ODI0MzkwAl8yBAZiYWxsc0IIBQskdDAzOTgyNDM5MAJfMwQEZGlmZgMJAGYCBQZiYWxsc0EFBmJhbGxzQgkAZQIFBmJhbGxzQQUGYmFsbHNCCQBlAgUGYmFsbHNCBQZiYWxsc0EEBndpbm5lcgMJAGYCBQZiYWxsc0EFBmJhbGxzQgIBQQMJAGYCBQZiYWxsc0IFBmJhbGxzQQIBQgIBRAQCRzEJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARZnZXRUb3RhbEJldHNGb3JUeXBlS2V5AwUGZ2FtZUlkAAEFBndpbm5lcgAAAwkAAAIFBHR5cGUAAQUGYW1vdW50AAAEAkcyCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEWZ2V0VG90YWxCZXRzRm9yVHlwZUtleQMFBmdhbWVJZAACBQZyZXN1bHQAAAMJAAACBQR0eXBlAAIFBmFtb3VudAAABAJHMwkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkBFmdldFRvdGFsQmV0c0ZvclR5cGVLZXkDBQZnYW1lSWQAAwkArAICCQCsAgIFBndpbm5lcgIBXwkApAMBBQRkaWZmAAADCQAAAgUEdHlwZQADBQZhbW91bnQAAAQNdG90YWxXaW5WYWx1ZQkAZAIJAGQCBQJHMQUCRzIFAkczBAl0b3RhbEJldHMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCkAwEFBmdhbWVJZAUKa1RvdGFsQmV0cwAABAtiYW5rV2l0aEZlZQkAZQIFCXRvdGFsQmV0cwUNdG90YWxXaW5WYWx1ZQQDZmVlCQBrAwULYmFua1dpdGhGZWUFB0JFVF9GRUUFCUZFRV9TQ0FMRQQBQgkAZQIFC2JhbmtXaXRoRmVlBQNmZWUEA1VCMQkAZAIJAQt2YWx1ZU9yRWxzZQIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ1nZXRVc2VyQmV0S2V5BAULdXNlckFkZHJlc3MFBmdhbWVJZAABBQZ3aW5uZXIAAAMJAAACBQR0eXBlAAEFBmFtb3VudAAABANVQjIJAGQCCQELdmFsdWVPckVsc2UCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQENZ2V0VXNlckJldEtleQQFC3VzZXJBZGRyZXNzBQZnYW1lSWQAAgUKZ2FtZVJlc3VsdAAAAwkAAAIFBHR5cGUAAQUGYW1vdW50AAAEA1VCMwkAZAIJAQt2YWx1ZU9yRWxzZQIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAQ1nZXRVc2VyQmV0S2V5BAULdXNlckFkZHJlc3MFBmdhbWVJZAADCQCsAgIJAKwCAgUGd2lubmVyAgFfCQCkAwEFBGRpZmYAAAMJAAACBQR0eXBlAAEFBmFtb3VudAAABBB0b3RhbFdpblZhbHVlTWF4CQBkAgkAZAIFAkcxCQBoAgUCRzIAAwkAaAIFAkczAAIEAkQxCQBpAgkAaAIJAGQCBQJHMQkAaAIJAGkCBQJHMQUQdG90YWxXaW5WYWx1ZU1heAUBQgUDVUIxBQJHMQQCRDIJAGkCCQBoAgkAZAIFAkcyCQBoAgkAaQIFAkcyBRB0b3RhbFdpblZhbHVlTWF4BQFCBQNVQjIFAkcyBAJEMwkAaQIJAGgCCQBkAgUCRzMJAGgCCQBpAgUCRzMFEHRvdGFsV2luVmFsdWVNYXgFAUIFA1VCMwUCRzMEC2NsYWltQW1vdW50CQBkAgkAZAIFAkQxBQJEMgUCRDMFC2NsYWltQW1vdW50BgFpAQNiZXQEBmdhbWVJZAR0eXBlBnJlc3VsdAVyZWZJZAkBC3ZhbHVlT3JFbHNlAgkBCGlzQWN0aXZlAAQEdXNlcgkApQgBCAUBaQZjYWxsZXIEBmdJZFN0cgkApAMBBQZnYW1lSWQECyR0MDYwMzU2MTEwCQCUCgIICQCRAwIIBQFpCHBheW1lbnRzAAAGYW1vdW50CAkAkQMCCAUBaQhwYXltZW50cwAAB2Fzc2V0SWQECXBtdEFtb3VudAgFCyR0MDYwMzU2MTEwAl8xBApwbXRBc3NldElkCAULJHQwNjAzNTYxMTACXzIEDWdhbWVTdGFydFRpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCkAwEFBmdhbWVJZAUNa0dhbWVTdHJhVGltZQAABAhnYW1lVHlwZQkBEUBleHRyTmF0aXZlKDEwNTMpAgUEdGhpcwkArAICCQCkAwEFBmdhbWVJZAUJa0dhbWVUeXBlAwkBAiE9AgUKcG10QXNzZXRJZAUEVVNEVAkAAgECHlBhbXltZW50IG11c3QgYmUgSW4gVVNEVCBhc3NldAMJAGYCBQdNSU5fQkVUBQlwbXRBbW91bnQJAAIBCQCsAgIJAKwCAgIITWluIGJldCAJAKQDAQkAaQIFB01JTl9CRVQAwIQ9AgRVU0RUAwkAAAIFDWdhbWVTdGFydFRpbWUAAAkAAgEJAKwCAgIYVGhlcmUgaXMgbm8gZ2FtZSB3aXRoIGlkCQCkAwEFBmdhbWVJZAMJAGcCCQBkAggFCWxhc3RCbG9jawl0aW1lc3RhbXAFCE9ORV9IT1VSBQ1nYW1lU3RhcnRUaW1lCQACAQIoQmV0cyBvbiB0aGlzIGdhbWUgYXJlIG5vIGxvbmdlciBhY2NlcHRlZAMJAQEhAQkBC3ZhbGlkYXRlQmV0AwUIZ2FtZVR5cGUFBHR5cGUFBnJlc3VsdAkAAgECEkluY29ycmVjdCBiZXQgdHlwZQQHc3BsZFJlcwkAtQkCBQZyZXN1bHQCAV8ECnVzZXJCZXRLZXkJAQ1nZXRVc2VyQmV0S2V5BAUEdXNlcgUGZ2FtZUlkBQR0eXBlBQZyZXN1bHQEFnRvdGFsQmV0c0ZvclR5cGVCZXRLZXkJARZnZXRUb3RhbEJldHNGb3JUeXBlS2V5AwUGZ2FtZUlkBQR0eXBlBQZyZXN1bHQEB3VzZXJCZXQJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFCnVzZXJCZXRLZXkAAAUJcG10QW1vdW50BBN0b3RhbEJldHNGb3JUeXBlQmV0CQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBRZ0b3RhbEJldHNGb3JUeXBlQmV0S2V5AAAFCXBtdEFtb3VudAQJdG90YWxCZXRzCQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBmdJZFN0cgUKa1RvdGFsQmV0cwAABQlwbXRBbW91bnQEBnRvV2luQQkAZAIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICBQZnSWRTdHIFB2tUb1dpbkEAAAMDCQAAAgUEdHlwZQABCQAAAgUGcmVzdWx0AgFBBwUJcG10QW1vdW50AwMJAAACBQR0eXBlAAIJAGYCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHc3BsZFJlcwAACQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHc3BsZFJlcwABBwUJcG10QW1vdW50AwMJAAACBQR0eXBlAAMJAAACCQCRAwIFB3NwbGRSZXMAAAIBQQcFCXBtdEFtb3VudAAABAZ0b1dpbkIJAGQCCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJAKwCAgUGZ0lkU3RyBQdrVG9XaW5CAAADAwkAAAIFBHR5cGUAAQkAAAIFBnJlc3VsdAIBQgcFCXBtdEFtb3VudAMDCQAAAgUEdHlwZQACCQBmAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3NwbGRSZXMAAQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3NwbGRSZXMAAAcFCXBtdEFtb3VudAMDCQAAAgUEdHlwZQADCQAAAgkAkQMCBQdzcGxkUmVzAAACAUIHBQlwbXRBbW91bnQAAAQGb25EcmF3CQBkAgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQCsAgIFBmdJZFN0cgUHa09uRHJhdwAAAwMJAAACBQR0eXBlAAEJAAACBQZyZXN1bHQCAUQHBQlwbXRBbW91bnQAAAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQp1c2VyQmV0S2V5BQd1c2VyQmV0CQDMCAIJAQxJbnRlZ2VyRW50cnkCBRZ0b3RhbEJldHNGb3JUeXBlQmV0S2V5BRN0b3RhbEJldHNGb3JUeXBlQmV0CQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBmdJZFN0cgUKa1RvdGFsQmV0cwUJdG90YWxCZXRzCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBmdJZFN0cgUHa1RvV2luQQUGdG9XaW5BCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBmdJZFN0cgUHa1RvV2luQgUGdG9XaW5CCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBmdJZFN0cgUHa09uRHJhdwUGb25EcmF3BQNuaWwDCQEBIQEJAQlpc0RlZmluZWQBCQCdCAIFBHRoaXMFCmtVc2VyUmVmSWQJAMwIAgkBC1N0cmluZ0VudHJ5AgUKa1VzZXJSZWZJZAUFcmVmSWQFA25pbAUDbmlsAWkBBWNsYWltAQZnYW1lSWQJAQt2YWx1ZU9yRWxzZQIJAQhpc0FjdGl2ZQAEBHVzZXIJAKUIAQgFAWkGY2FsbGVyBAZnSWRTdHIJAKQDAQUGZ2FtZUlkBAlmaW5hbFRpbWUJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAmggCBQR0aGlzCQCsAgIFBmdJZFN0cgUKa0ZpbmFsVGltZQIkWW91IGNhbiBjbGFpbSBvbmx5IGFmdGVyIGdhbWUgZmluaXNoAwkAZgIIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQBkAgUJZmluYWxUaW1lBQhPTkVfSE9VUgkAAgECN1lvdSBjYW4gY2xhaW0gb25seSBhZnRlciBvbmUgaG91ciBwYXNzIGFmdGVyIGZpbmFsIHRpbWUDCQEJaXNEZWZpbmVkAQkAmwgCBQR0aGlzCQCsAgIJAKwCAgkArAICBQR1c2VyAgFfBQZnSWRTdHIFDGtVc2VyQ2xhaW1lZAkAAgECFllvdSBhcmUgYWxyZWR5IGNsYWltZWQECmdhbWVSZXN1bHQJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgUGZ0lkU3RyBQtrR2FtZVJlc3VsdAQHc3BsZFJlcwkAtQkCBQpnYW1lUmVzdWx0AgFfBAZiYWxsc0EJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFB3NwbGRSZXMAAAIWSW5uY29ycmVjdCBnYW1lIHJlc3VsdAQGYmFsbHNCCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQdzcGxkUmVzAAECFklubmNvcnJlY3QgZ2FtZSByZXN1bHQEBGRpZmYDCQBmAgUGYmFsbHNBBQZiYWxsc0IJAGUCBQZiYWxsc0EFBmJhbGxzQgkAZQIFBmJhbGxzQgUGYmFsbHNBBAZ3aW5uZXIDCQBmAgUGYmFsbHNBBQZiYWxsc0ICAUEDCQBmAgUGYmFsbHNCBQZiYWxsc0ECAUICAUQEAUIJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMJAKwCAgUGZ0lkU3RyBQVrQmFuawQDVUIxCQELdmFsdWVPckVsc2UCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQENZ2V0VXNlckJldEtleQQFBHVzZXIFBmdhbWVJZAABBQZ3aW5uZXIAAAQDVUIyCQELdmFsdWVPckVsc2UCCQERQGV4dHJOYXRpdmUoMTA1MCkCBQR0aGlzCQENZ2V0VXNlckJldEtleQQFBHVzZXIFBmdhbWVJZAACBQpnYW1lUmVzdWx0AAAEA1VCMwkBC3ZhbHVlT3JFbHNlAgkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwkBDWdldFVzZXJCZXRLZXkEBQR1c2VyBQZnYW1lSWQAAwkArAICCQCsAgIFBndpbm5lcgIBXwkApAMBBQRkaWZmAAAEAkcxCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARZnZXRUb3RhbEJldHNGb3JUeXBlS2V5AwUGZ2FtZUlkAAEFBndpbm5lcgAABAJHMgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEWZ2V0VG90YWxCZXRzRm9yVHlwZUtleQMFBmdhbWVJZAACBQpnYW1lUmVzdWx0AAAEAkczCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMJARZnZXRUb3RhbEJldHNGb3JUeXBlS2V5AwUGZ2FtZUlkAAMJAKwCAgkArAICBQZ3aW5uZXICAV8JAKQDAQUEZGlmZgAABBB0b3RhbFdpblZhbHVlTWF4CQBkAgkAZAIFAkcxCQBoAgUCRzIAAwkAaAIFAkczAAIEAkQxCQBpAgkAaAIJAGQCBQJHMQkAaAIJAGkCBQJHMQUQdG90YWxXaW5WYWx1ZU1heAUBQgUDVUIxBQJHMQQCRDIJAGkCCQBoAgkAZAIFAkcyCQBoAgkAaQIFAkcyBRB0b3RhbFdpblZhbHVlTWF4BQFCBQNVQjIFAkcyBAJEMwkAaQIJAGgCCQBkAgUCRzMJAGgCCQBpAgUCRzMFEHRvdGFsV2luVmFsdWVNYXgFAUIFA1VCMwUCRzMEC2NsYWltQW1vdW50CQBkAgkAZAIFAkQxBQJEMgUCRDMDCQAAAgULY2xhaW1BbW91bnQAAAkAAgECEE5vdGhpbmcgdG8gY2xhaW0JAJQKAgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkArAICCQCsAgIJAKwCAgUEdXNlcgIBXwUGZ0lkU3RyBQxrVXNlckNsYWltZWQGCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgULY2xhaW1BbW91bnQFBFVTRFQFA25pbAULY2xhaW1BbW91bnQBaQELZ2FtZVN1bW1hcnkCBmdhbWVJZAZyZXN1bHQEBmdJZFN0cgkApAMBBQZnYW1lSWQEDWdhbWVTdGFydFRpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCkAwEFBmdhbWVJZAUNa0dhbWVTdHJhVGltZQAAAwkAAAIFDWdhbWVTdGFydFRpbWUAAAkAAgEJAKwCAgIYVGhlcmUgaXMgbm8gZ2FtZSB3aXRoIGlkCQCkAwEFBmdhbWVJZAQHc3BsZFJlcwkAtQkCBQZyZXN1bHQCAV8EBmJhbGxzQQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEJAJEDAgUHc3BsZFJlcwAAAhZJbm5jb3JyZWN0IGdhbWUgcmVzdWx0BAZiYWxsc0IJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFB3NwbGRSZXMAAQIWSW5uY29ycmVjdCBnYW1lIHJlc3VsdAQEZGlmZgMJAGYCBQZiYWxsc0EFBmJhbGxzQgkAZQIFBmJhbGxzQQUGYmFsbHNCCQBlAgUGYmFsbHNCBQZiYWxsc0EEBndpbm5lcgMJAGYCBQZiYWxsc0EFBmJhbGxzQgIBQQMJAGYCBQZiYWxsc0IFBmJhbGxzQQIBQgIBRAQNdG90YWxXaW5UeXBlMQkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEWZ2V0VG90YWxCZXRzRm9yVHlwZUtleQMFBmdhbWVJZAABBQZ3aW5uZXIAAAQNdG90YWxXaW5UeXBlMgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEWZ2V0VG90YWxCZXRzRm9yVHlwZUtleQMFBmdhbWVJZAACBQZyZXN1bHQAAAQNdG90YWxXaW5UeXBlMwkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzCQEWZ2V0VG90YWxCZXRzRm9yVHlwZUtleQMFBmdhbWVJZAADCQCsAgIJAKwCAgUGd2lubmVyAgFfCQCkAwEFBGRpZmYAAAQNdG90YWxXaW5WYWx1ZQkAZAIJAGQCBQ10b3RhbFdpblR5cGUxBQ10b3RhbFdpblR5cGUyBQ10b3RhbFdpblR5cGUzBAl0b3RhbEJldHMJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwkArAICCQCkAwEFBmdhbWVJZAUKa1RvdGFsQmV0cwAABAtiYW5rV2l0aEZlZQkAZQIFCXRvdGFsQmV0cwUNdG90YWxXaW5WYWx1ZQQNJHQwMTEzMzgxMTQ5NgMJAAACBQ10b3RhbFdpblZhbHVlAAAJAJQKAgULYmFua1dpdGhGZWUAAAQBZgkAawMFC2JhbmtXaXRoRmVlBQdCRVRfRkVFBQlGRUVfU0NBTEUJAJQKAgUBZgkAZQIFC2JhbmtXaXRoRmVlBQFmBANmZWUIBQ0kdDAxMTMzODExNDk2Al8xBARiYW5rCAUNJHQwMTEzMzgxMTQ5NgJfMgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIFBmdJZFN0cgULa0dhbWVSZXN1bHQFBnJlc3VsdAkAzAgCCQEMSW50ZWdlckVudHJ5AgkArAICBQZnSWRTdHIFBWtCYW5rBQRiYW5rCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQCsAgIFBmdJZFN0cgUKa0ZpbmFsVGltZQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwURTU9ORVlfQk9YX0FERFJFRVMFA2ZlZQUEVVNEVAUDbmlsAWkBCWluaXRHYW1lcwIOc3RhcnRHYW1lVGltZXMFdHlwZXMJAQt2YWx1ZU9yRWxzZQIJAQtpc0FkbWluQ2FsbAEFAWkKAQhpbml0R2FtZQIDYWNjDXN0YXJ0R2FtZVRpbWUEDSR0MDExOTA3MTE5NDEFA2FjYwQHZW50cmllcwgFDSR0MDExOTA3MTE5NDECXzEECmxhc3RHYW1lSWQIBQ0kdDAxMTkwNzExOTQxAl8yBAFqCAUNJHQwMTE5MDcxMTk0MQJfMwQJbmV3R2FtZUlkCQBkAgUKbGFzdEdhbWVJZAABAwkAZgIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBQ1zdGFydEdhbWVUaW1lCQACAQIjc3RhcnRHYW1lVGltZSBtdXN0IGJlIGluIHRoZSBmdXR1cmUDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCBQpHQU1FX1RZUEVTCQCRAwIFBXR5cGVzBQFqCQACAQkArAICAiF0eXBlIG11c3QgY29udGFpbiBvbmUgb2YgdmFsdWVzOiAJALkJAgUKR0FNRV9UWVBFUwIBLAQLZ2FtZUVudHJpZXMJAMwIAgkBDEludGVnZXJFbnRyeQIJAKwCAgkApAMBBQluZXdHYW1lSWQFDWtHYW1lU3RyYVRpbWUFDXN0YXJ0R2FtZVRpbWUJAMwIAgkBC1N0cmluZ0VudHJ5AgkArAICCQCkAwEFCW5ld0dhbWVJZAUJa0dhbWVUeXBlCQCRAwIFBXR5cGVzBQFqBQNuaWwJAJUKAwkAzggCBQdlbnRyaWVzBQtnYW1lRW50cmllcwUJbmV3R2FtZUlkCQBkAgUBagABBApsYXN0R2FtZUlkCQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFC2tMYXN0R2FtZUlkAAAEDSR0MDEyNDg0MTI1NjkKAAIkbAUOc3RhcnRHYW1lVGltZXMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFA25pbAUKbGFzdEdhbWVJZAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhpbml0R2FtZQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgNTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgACEAIgAjACQAJQAmACcAKAApACoAKwAsAC0ALgAvADAAMQAyBAxnYW1lc0VudHJpZXMIBQ0kdDAxMjQ4NDEyNTY5Al8xBAduZXdMR0lkCAUNJHQwMTI0ODQxMjU2OQJfMgkAzQgCBQxnYW1lc0VudHJpZXMJAQxJbnRlZ2VyRW50cnkCBQtrTGFzdEdhbWVJZAUHbmV3TEdJZAFpAQhzaHV0ZG93bgADCQEBIQEFBmFjdGl2ZQkAAgEJAKwCAgIiREFwcCBpcyBhbHJlYWR5IHN1c3BlbmRlZC4gQ2F1c2U6IAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQZrQ2F1c2UCGnRoZSBjYXVzZSB3YXNuJ3Qgc3BlY2lmaWVkAwkBASEBCQEPY29udGFpbnNFbGVtZW50AgkAzAgCBQxhZG1pblB1YktleTEJAMwIAgUMYWRtaW5QdWJLZXkyCQDMCAIFDGFkbWluUHViS2V5MwUDbmlsCAUBaQ9jYWxsZXJQdWJsaWNLZXkJAAIBAiFPbmx5IGFkbWluIGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24JAQdzdXNwZW5kAQIPUGF1c2VkIGJ5IGFkbWluAWkBCGFjdGl2YXRlAAMFBmFjdGl2ZQkAAgECFkRBcHAgaXMgYWxyZWFkeSBhY3RpdmUDCQEBIQEJAQ9jb250YWluc0VsZW1lbnQCCQDMCAIFDGFkbWluUHViS2V5MQkAzAgCBQxhZG1pblB1YktleTIJAMwIAgUMYWRtaW5QdWJLZXkzBQNuaWwIBQFpD2NhbGxlclB1YmxpY0tleQkAAgECIU9ubHkgYWRtaW4gY2FuIGNhbGwgdGhpcyBmdW5jdGlvbgkAzAgCCQEMQm9vbGVhbkVudHJ5AgUHa0FjdGl2ZQYJAMwIAgkBC0RlbGV0ZUVudHJ5AQUGa0NhdXNlBQNuaWwAcyT0vg==", "height": 2311192, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8TE1aBaYJwLFC6nSom7wGrcgEQBwxiAqLye4bmfJa5L2 Next: 7zJaSoFg7TcagEHL9WX2YqhBkFSQcTwze9GLAmpCUB7D Diff:
Old | New | Differences | |
---|---|---|---|
170 | 170 | let G1 = (valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, 1, winner)), 0) + (if ((type == 1)) | |
171 | 171 | then amount | |
172 | 172 | else 0)) | |
173 | - | let G2 = (valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, | |
173 | + | let G2 = (valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, 2, result)), 0) + (if ((type == 2)) | |
174 | 174 | then amount | |
175 | 175 | else 0)) | |
176 | - | let G3 = (valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, | |
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) | |
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 | - | let UB3 = (valueOrElse(getIntegerValue(this, getUserBetKey(userAddress, gameId, | |
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)) | |
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 | - | let UB3 = valueOrElse(getIntegerValue(this, getUserBetKey(user, gameId, | |
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 | - | let G2 = valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, | |
295 | - | let G3 = valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, | |
294 | + | let G2 = valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, 2, gameResult)), 0) | |
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) | |
325 | 325 | then "B" | |
326 | 326 | else "D" | |
327 | 327 | let totalWinType1 = valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, 1, winner)), 0) | |
328 | - | let totalWinType2 = valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, | |
329 | - | let totalWinType3 = valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, | |
328 | + | let totalWinType2 = valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, 2, result)), 0) | |
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) | |
345 | 345 | ||
346 | 346 | ||
347 | 347 | @Callable(i) | |
348 | - | func initGames (startGameTimes,types) = { | |
348 | + | func initGames (startGameTimes,types) = valueOrElse(isAdminCall(i), { | |
349 | 349 | func initGame (acc,startGameTime) = { | |
350 | - | let $t01188011913 = acc | |
351 | - | let entries = $t01188011913._1 | |
352 | - | let newGameId = $t01188011913._2 | |
353 | - | let j = $t01188011913._3 | |
350 | + | let $t01190711941 = acc | |
351 | + | let entries = $t01190711941._1 | |
352 | + | let lastGameId = $t01190711941._2 | |
353 | + | let j = $t01190711941._3 | |
354 | + | let newGameId = (lastGameId + 1) | |
354 | 355 | if ((lastBlock.timestamp > startGameTime)) | |
355 | 356 | then throw("startGameTime must be in the future") | |
356 | 357 | else if (!(containsElement(GAME_TYPES, types[j]))) | |
357 | 358 | then throw(("type must contain one of values: " + makeString(GAME_TYPES, ","))) | |
358 | 359 | else { | |
359 | 360 | let gameEntries = [IntegerEntry((toString(newGameId) + kGameStraTime), startGameTime), StringEntry((toString(newGameId) + kGameType), types[j])] | |
360 | - | $Tuple3((entries ++ | |
361 | + | $Tuple3((entries ++ gameEntries), newGameId, (j + 1)) | |
361 | 362 | } | |
362 | 363 | } | |
363 | 364 | ||
364 | 365 | let lastGameId = valueOrElse(getInteger(this, kLastGameId), 0) | |
365 | - | let $ | |
366 | + | let $t01248412569 = { | |
366 | 367 | let $l = startGameTimes | |
367 | 368 | let $s = size($l) | |
368 | - | let $acc0 = $Tuple3(nil, | |
369 | + | let $acc0 = $Tuple3(nil, lastGameId, 0) | |
369 | 370 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
370 | 371 | then $a | |
371 | 372 | else initGame($a, $l[$i]) | |
376 | 377 | ||
377 | 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) | |
378 | 379 | } | |
379 | - | let gamesEntries = $ | |
380 | - | let newLGId = $ | |
380 | + | let gamesEntries = $t01248412569._1 | |
381 | + | let newLGId = $t01248412569._2 | |
381 | 382 | (gamesEntries :+ IntegerEntry(kLastGameId, newLGId)) | |
382 | - | } | |
383 | + | }) | |
383 | 384 | ||
384 | 385 | ||
385 | 386 |
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 | 30 | let kGameType = "_startGameTime" | |
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 | 148 | let $t039824390 = 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 | 159 | let gameResult = $t039824390._1 | |
160 | 160 | let ballsA = $t039824390._2 | |
161 | 161 | let ballsB = $t039824390._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 | - | let G2 = (valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, | |
173 | + | let G2 = (valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, 2, result)), 0) + (if ((type == 2)) | |
174 | 174 | then amount | |
175 | 175 | else 0)) | |
176 | - | let G3 = (valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, | |
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 | - | let UB3 = (valueOrElse(getIntegerValue(this, getUserBetKey(userAddress, gameId, | |
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 | 206 | let $t060356110 = $Tuple2(i.payments[0].amount, i.payments[0].assetId) | |
207 | 207 | let pmtAmount = $t060356110._1 | |
208 | 208 | let pmtAssetId = $t060356110._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 | - | let UB3 = valueOrElse(getIntegerValue(this, getUserBetKey(user, gameId, | |
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 | - | let G2 = valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, | |
295 | - | let G3 = valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, | |
294 | + | let G2 = valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, 2, gameResult)), 0) | |
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 | - | let totalWinType2 = valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, | |
329 | - | let totalWinType3 = valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, | |
328 | + | let totalWinType2 = valueOrElse(getInteger(this, getTotalBetsForTypeKey(gameId, 2, result)), 0) | |
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 | 333 | let $t01133811496 = 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 | 339 | let fee = $t01133811496._1 | |
340 | 340 | let bank = $t01133811496._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 | - | func initGames (startGameTimes,types) = { | |
348 | + | func initGames (startGameTimes,types) = valueOrElse(isAdminCall(i), { | |
349 | 349 | func initGame (acc,startGameTime) = { | |
350 | - | let $t01188011913 = acc | |
351 | - | let entries = $t01188011913._1 | |
352 | - | let newGameId = $t01188011913._2 | |
353 | - | let j = $t01188011913._3 | |
350 | + | let $t01190711941 = acc | |
351 | + | let entries = $t01190711941._1 | |
352 | + | let lastGameId = $t01190711941._2 | |
353 | + | let j = $t01190711941._3 | |
354 | + | let newGameId = (lastGameId + 1) | |
354 | 355 | if ((lastBlock.timestamp > startGameTime)) | |
355 | 356 | then throw("startGameTime must be in the future") | |
356 | 357 | else if (!(containsElement(GAME_TYPES, types[j]))) | |
357 | 358 | then throw(("type must contain one of values: " + makeString(GAME_TYPES, ","))) | |
358 | 359 | else { | |
359 | 360 | let gameEntries = [IntegerEntry((toString(newGameId) + kGameStraTime), startGameTime), StringEntry((toString(newGameId) + kGameType), types[j])] | |
360 | - | $Tuple3((entries ++ | |
361 | + | $Tuple3((entries ++ gameEntries), newGameId, (j + 1)) | |
361 | 362 | } | |
362 | 363 | } | |
363 | 364 | ||
364 | 365 | let lastGameId = valueOrElse(getInteger(this, kLastGameId), 0) | |
365 | - | let $ | |
366 | + | let $t01248412569 = { | |
366 | 367 | let $l = startGameTimes | |
367 | 368 | let $s = size($l) | |
368 | - | let $acc0 = $Tuple3(nil, | |
369 | + | let $acc0 = $Tuple3(nil, lastGameId, 0) | |
369 | 370 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
370 | 371 | then $a | |
371 | 372 | else initGame($a, $l[$i]) | |
372 | 373 | ||
373 | 374 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
374 | 375 | then $a | |
375 | 376 | else throw("List size exceeds 50") | |
376 | 377 | ||
377 | 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) | |
378 | 379 | } | |
379 | - | let gamesEntries = $ | |
380 | - | let newLGId = $ | |
380 | + | let gamesEntries = $t01248412569._1 | |
381 | + | let newLGId = $t01248412569._2 | |
381 | 382 | (gamesEntries :+ IntegerEntry(kLastGameId, newLGId)) | |
382 | - | } | |
383 | + | }) | |
383 | 384 | ||
384 | 385 | ||
385 | 386 | ||
386 | 387 | @Callable(i) | |
387 | 388 | func shutdown () = if (!(active)) | |
388 | 389 | then throw(("DApp is already suspended. Cause: " + valueOrElse(getString(this, kCause), "the cause wasn't specified"))) | |
389 | 390 | else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))) | |
390 | 391 | then throw("Only admin can call this function") | |
391 | 392 | else suspend("Paused by admin") | |
392 | 393 | ||
393 | 394 | ||
394 | 395 | ||
395 | 396 | @Callable(i) | |
396 | 397 | func activate () = if (active) | |
397 | 398 | then throw("DApp is already active") | |
398 | 399 | else if (!(containsElement([adminPubKey1, adminPubKey2, adminPubKey3], i.callerPublicKey))) | |
399 | 400 | then throw("Only admin can call this function") | |
400 | 401 | else [BooleanEntry(kActive, true), DeleteEntry(kCause)] | |
401 | 402 | ||
402 | 403 |
github/deemru/w8io/169f3d6 75.53 ms ◑![]()