2023.04.20 12:39 [3608266] smart account 3PAChhfAJB6CM3PgN1Gguz7HWGaGQeCZNuT > SELF 0.00000000 Waves

{ "type": 13, "id": "3bqS2BdknYsjKTLugcBBsF4MkZDgenrjBgmDFPtBiBJs", "fee": 1400000, "feeAssetId": null, "timestamp": 1681983598222, "version": 2, "chainId": 87, "sender": "3PAChhfAJB6CM3PgN1Gguz7HWGaGQeCZNuT", "senderPublicKey": "EY8iGCRDbPaCGeaXESYXRcMqQdgfWvZgndMJXgw1icdy", "proofs": [ "4Vsa9CREGdub6mWMutGRfoyN49ar69FKRy6RTBoRC2RyPyKgFHJJiXCKLp5m8PATXu9AUdcFrAAYwuvb4EGhei4k" ], "script": "base64:BgJfCAISAwoBCBIGCgQICAgIEgQKAggBEgQKAggIEgQKAggEEgQKAggCEgMKAQgSAwoBCBIDCgEIEgQKAggBEgASABIAEgMKAQgSABIDCgEIEgMKAQgSBQoDCAgBEgMKAQgjAQ10cnlHZXRJbnRlZ2VyAQNrZXkEByRtYXRjaDAJAJoIAgUEdGhpcwUDa2V5AwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAUBYgAAARFrZXlEdWNrVW5sb2NrVGltZQEHYXNzZXRJZAkArAICCQCsAgICBWR1Y2tfCQDYBAEFB2Fzc2V0SWQCC191bmxvY2tUaW1lAQxrZXlEdWNrT3duZXIBB2Fzc2V0SWQJAKwCAgkArAICAgVkdWNrXwkA2AQBBQdhc3NldElkAgZfb3duZXIBF2tleVZlaGljbGVCb29zdGVyc0xldmVsAQdhc3NldElkCQCsAgIJAKwCAgIIdmVoaWNsZV8FB2Fzc2V0SWQCDl9ib29zdGVyc0xldmVsAQ5rZXlTcG90c0JvdWdodAEKYWRkcmVzc1N0cgkArAICCQCsAgICCGFkZHJlc3NfBQphZGRyZXNzU3RyAgxfc3BvdHNCb3VnaHQBEGtleVRpY2tldHNCb3VnaHQBCmFkZHJlc3NTdHIJAKwCAgkArAICAghhZGRyZXNzXwUKYWRkcmVzc1N0cgIOX3RpY2tldHNCb3VnaHQBE2tleVZlaGljbGVUeXBlUHJpY2UBBG5hbWUJAKwCAgkArAICAgx2ZWhpY2xlVHlwZV8FBG5hbWUCBl9wcmljZQEMa2V5U3BvdHNCdXN5AQphZGRyZXNzU3RyCQCsAgIJAKwCAgIIYWRkcmVzc18FCmFkZHJlc3NTdHICCl9zcG90c0J1c3kBE2tleUxvY2tlZER1Y2tTdGF0dXMCCmFkZHJlc3NTdHIKYXNzZXRJZFN0cgkArAICCQCsAgIJAKwCAgkArAICAghhZGRyZXNzXwUKYWRkcmVzc1N0cgIMX2xvY2tlZER1Y2tfBQphc3NldElkU3RyAgdfc3RhdHVzAQ5nZXREdWNrRGV0YWlscwEHYXNzZXRJZAQJYXNzZXROYW1lCQEFdmFsdWUBCAkBBXZhbHVlAQkA7AcBBQdhc3NldElkBG5hbWUEDmFzc2V0TmFtZVBhcnRzCQC1CQIFCWFzc2V0TmFtZQIABAlpc0phY2twb3QJAAACCQCRAwIFDmFzc2V0TmFtZVBhcnRzCQBlAgkAkAMBBQ5hc3NldE5hbWVQYXJ0cwACAgFKBAphc3NldENvbG9yAwUJaXNKYWNrcG90AgFCCQCRAwIFDmFzc2V0TmFtZVBhcnRzCQBlAgkAkAMBBQ5hc3NldE5hbWVQYXJ0cwABCQCUCgIFCmFzc2V0Q29sb3IFCWlzSmFja3BvdAEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCB2FkZHJlc3MDa2V5BAckbWF0Y2gwCQCdCAIFB2FkZHJlc3MFA2tleQMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAWEFByRtYXRjaDAFAWECAAEMdHJ5R2V0U3RyaW5nAQNrZXkJARR0cnlHZXRTdHJpbmdFeHRlcm5hbAIFBHRoaXMFA2tleQEJZ2V0T3JhY2xlAAkBB0FkZHJlc3MBCQDZBAEJAQx0cnlHZXRTdHJpbmcBAhRzdGF0aWNfb3JhY2xlQWRkcmVzcwELZ2V0R2FtZU5hbWUACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQIUc3RhdGljX3Nob3J0R2FtZU5hbWUCJDNHR046IFRoZXJlIGlzIG5vIGdhbWUgbmFtZSBkZWZpbmVkIQEPZ2V0TG9uZ0dhbWVOYW1lAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAECE3N0YXRpY19sb25nR2FtZU5hbWUCKjNHTEdOOiBUaGVyZSBpcyBubyBsb25nIGdhbWUgbmFtZSBkZWZpbmVkIQEKZ2V0TkZUTmFtZQAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBAg5zdGF0aWNfbmZ0TmFtZQIjM0dOTjogVGhlcmUgaXMgbm8gbmZ0IG5hbWUgZGVmaW5lZCEBE2dldEluY3ViYXRvckFkZHJlc3MACQEHQWRkcmVzcwEJANkEAQkBFHRyeUdldFN0cmluZ0V4dGVybmFsAgkBCWdldE9yYWNsZQACF3N0YXRpY19pbmN1YmF0b3JBZGRyZXNzARFnZXRCcmVlZGVyQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAIVc3RhdGljX2JyZWVkZXJBZGRyZXNzARFnZXRGYXJtaW5nQWRkcmVzcwAJAQdBZGRyZXNzAQkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAIVc3RhdGljX2Zhcm1pbmdBZGRyZXNzAQ1nZXRFZ2dBc3NldElkAAkA2QQBCQEUdHJ5R2V0U3RyaW5nRXh0ZXJuYWwCCQEJZ2V0T3JhY2xlAAIRc3RhdGljX2VnZ0Fzc2V0SWQBFGdldEFjY2Vzc0l0ZW1Bc3NldElkAAkA2QQBCQEMdHJ5R2V0U3RyaW5nAQIYc3RhdGljX2FjY2Vzc0l0ZW1Bc3NldElkARJnZXRBY2Nlc3NJdGVtUHJpY2UACQENdHJ5R2V0SW50ZWdlcgECFnN0YXRpY19hY2Nlc3NJdGVtUHJpY2UBEmdldE1pbkxvY2tEdXJhdGlvbgAJAQ10cnlHZXRJbnRlZ2VyAQIWc3RhdGljX21pbkxvY2tEdXJhdGlvbgEVZ2V0RGVmYXVsdFZlaGljbGVUeXBlAAkBDHRyeUdldFN0cmluZwECGXN0YXRpY19kZWZhdWx0VmVoaWNsZVR5cGUBE2dldEJvc3RlckJ1eUFzc2V0SWQACQDZBAEJAQx0cnlHZXRTdHJpbmcBAhhzdGF0aWNfYm9vc3RlckJ1eUFzc2V0SWQBFmdldEJvc3RlclByaWNlRm9yTGV2ZWwBBWxldmVsCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ8IAQkArAICAhlzdGF0aWNfYm9vc3RlclByaWNlTGV2ZWxfCQCkAwEFBWxldmVsAjkzR0JQRkw6IFRoZXJlIGlzIG5vIHByaWNlIHZhbHVlIGZvciB0aGlzIGxldmVsIG9mIGJvb3N0ZXIBFWdldEJvc3Rlck5hbWVGb3JMZXZlbAEFbGV2ZWwJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQCsAgICE3N0YXRpY19ib29zdGVyTmFtZV8JAKQDAQUFbGV2ZWwCIDNHQk5GTDogVGhlcmUgaXMgbm8gc3VjaCBib29zdGVyAQhhc1N0cmluZwEFdmFsdWUEByRtYXRjaDAFBXZhbHVlAwkAAQIFByRtYXRjaDACBlN0cmluZwQGc3RyaW5nBQckbWF0Y2gwBQZzdHJpbmcJAAIBAiEzQVM6IHdyb25nIHR5cGUsIGV4cGVjdGVkOiBTdHJpbmcBFmdldERlZmF1bHRWZWhpY2xlQXNzZXQACQEFQXNzZXQKAQEAAAEAAAUEdGhpcwEBAAcHBQR1bml0CQEVZ2V0RGVmYXVsdFZlaGljbGVUeXBlAAkArAICAgpbVmVoaWNsZV0gCQEVZ2V0RGVmYXVsdFZlaGljbGVUeXBlAAEQbG9ja0R1Y2tJbnRlcm5hbAIKYWRkcmVzc1N0cgNwbXQEB2Fzc2V0SWQJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAQLYXNzZXRJc3N1ZXIICQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQGaXNzdWVyBAx0RHVja0RldGFpbHMJAQ5nZXREdWNrRGV0YWlscwEFB2Fzc2V0SWQECmFzc2V0Q29sb3IIBQx0RHVja0RldGFpbHMCXzEECWlzSmFja3BvdAgFDHREdWNrRGV0YWlscwJfMgQKa1Nwb3RzQnVzeQkBDGtleVNwb3RzQnVzeQEFCmFkZHJlc3NTdHIECXNwb3RzQnVzeQkBDXRyeUdldEludGVnZXIBBQprU3BvdHNCdXN5BAxrU3BvdHNCb3VnaHQJAQ5rZXlTcG90c0JvdWdodAEFCmFkZHJlc3NTdHIEFWFkZHJlc3NTcG90c0F2YWlsYWJsZQkAZQIJAQ10cnlHZXRJbnRlZ2VyAQUMa1Nwb3RzQm91Z2h0BQlzcG90c0J1c3kDCQECIT0CCAUDcG10BmFtb3VudAABCQACAQITTkZUIGlzIG5vdCBhdHRhY2hlZAMDCQECIT0CBQthc3NldElzc3VlcgkBE2dldEluY3ViYXRvckFkZHJlc3MACQECIT0CBQthc3NldElzc3VlcgkBEWdldEJyZWVkZXJBZGRyZXNzAAcJAAIBAhNpdmFsaWQgTkZUIGF0dGFjaGVkAwkAZwIAAAUVYWRkcmVzc1Nwb3RzQXZhaWxhYmxlCQACAQISTm8gc3BvdHMgYXZhaWxhYmxlBBFrUGVyY2hlc0F2YWlsYWJsZQkArAICCQCsAgIJAKwCAgIIYWRkcmVzc18JAKUIAQUEdGhpcwISX3BlcmNoZXNBdmFpbGFibGVfBQphc3NldENvbG9yBBBwZXJjaGVzQXZhaWxhYmxlBAckbWF0Y2gwCQCaCAIJARFnZXRGYXJtaW5nQWRkcmVzcwAFEWtQZXJjaGVzQXZhaWxhYmxlAwkAAQIFByRtYXRjaDACA0ludAQBYgUHJG1hdGNoMAUBYgAAAwkAAAIFEHBlcmNoZXNBdmFpbGFibGUFEHBlcmNoZXNBdmFpbGFibGUECmVnZ0Fzc2V0SWQJAQ1nZXRFZ2dBc3NldElkAAQEaW52MQMJAGYCBRBwZXJjaGVzQXZhaWxhYmxlAAAFBHVuaXQJAPwHBAkBEWdldEZhcm1pbmdBZGRyZXNzAAIIYnV5UGVyY2gJAMwIAgUKYXNzZXRDb2xvcgkAzAgCAgAFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgUKZWdnQXNzZXRJZACAwtcvBQNuaWwDCQAAAgUEaW52MQUEaW52MQQEaW52MgMJAAACBQlpc0phY2twb3QHCQD8BwQJARFnZXRGYXJtaW5nQWRkcmVzcwACCHN0YWtlTkZUBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFB2Fzc2V0SWQAAQUDbmlsCQD8BwQJARFnZXRGYXJtaW5nQWRkcmVzcwACDHN0YWtlSmFja3BvdAkAzAgCBQphc3NldENvbG9yBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIFB2Fzc2V0SWQAAQUDbmlsAwkAAAIFBGludjIFBGludjIJAMwIAgkBDEludGVnZXJFbnRyeQIFCmtTcG90c0J1c3kJAGQCBQlzcG90c0J1c3kAAQkAzAgCCQELU3RyaW5nRW50cnkCCQEMa2V5RHVja093bmVyAQUHYXNzZXRJZAUKYWRkcmVzc1N0cgkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBE2tleUxvY2tlZER1Y2tTdGF0dXMCBQphZGRyZXNzU3RyCQDYBAEFB2Fzc2V0SWQGCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQERa2V5RHVja1VubG9ja1RpbWUBBQdhc3NldElkCQBkAggFCWxhc3RCbG9jawl0aW1lc3RhbXAJARJnZXRNaW5Mb2NrRHVyYXRpb24ABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BC3Vuc3Rha2VEdWNrAgphc3NldElkU3RyCmFkZHJlc3NTdHIEB2Fzc2V0SWQJANkEAQUKYXNzZXRJZFN0cgQMdER1Y2tEZXRhaWxzCQEOZ2V0RHVja0RldGFpbHMBBQdhc3NldElkBAphc3NldENvbG9yCAUMdER1Y2tEZXRhaWxzAl8xBAlpc0phY2twb3QIBQx0RHVja0RldGFpbHMCXzIECmtTcG90c0J1c3kJAQxrZXlTcG90c0J1c3kBBQphZGRyZXNzU3RyBAprRHVja093bmVyCQEMa2V5RHVja093bmVyAQUHYXNzZXRJZAQScmVtYWluaW5nRm9yVW5sb2NrCQBlAgkBDXRyeUdldEludGVnZXIBCQERa2V5RHVja1VubG9ja1RpbWUBBQdhc3NldElkCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAMJAQIhPQIJAQx0cnlHZXRTdHJpbmcBBQprRHVja093bmVyBQphZGRyZXNzU3RyCQACAQIaM1VMOiBUaGUgZHVjayBpcyBub3QgeW91cnMDCQBmAgUScmVtYWluaW5nRm9yVW5sb2NrAAAJAAIBCQCsAgIJAKwCAgIgM1VMOiBZb3UgbmVlZCB0byB3YWl0IHRvIHVubG9jayAJAKQDAQkAaQIFEnJlbWFpbmluZ0ZvclVubG9jawDoBwIIIHNlY29uZHMED3Vuc3Rha2VGdW5jTmFtZQMJAAACBQlpc0phY2twb3QGAg51bnN0YWtlSmFja3BvdAIKdW5zdGFrZU5GVAQEaW52MQkA/AcECQERZ2V0RmFybWluZ0FkZHJlc3MABQ91bnN0YWtlRnVuY05hbWUJAMwIAgUKYXNzZXRJZFN0cgUDbmlsBQNuaWwDCQAAAgUEaW52MQUEaW52MQkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCQEHQWRkcmVzcwEJANkEAQUKYWRkcmVzc1N0cgABBQdhc3NldElkCQDMCAIJAQtEZWxldGVFbnRyeQEJARNrZXlMb2NrZWREdWNrU3RhdHVzAgUKYWRkcmVzc1N0cgUKYXNzZXRJZFN0cgkAzAgCCQELRGVsZXRlRW50cnkBBQprRHVja093bmVyCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQprU3BvdHNCdXN5CQBlAgkBDXRyeUdldEludGVnZXIBBQprU3BvdHNCdXN5AAEFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgEOZ2V0VmVoaWNsZU5hbWUBBHR5cGUJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMJAKwCAgkArAICAg9zdGF0aWNfdmVoaWNsZV8FBHR5cGUCBV9uYW1lAQ9nZXRWZWhpY2xlUHJpY2UBBHR5cGUJAQ10cnlHZXRJbnRlZ2VyAQkArAICCQCsAgICD3N0YXRpY192ZWhpY2xlXwUEdHlwZQIGX3ByaWNlARNtaW50VmVoaWNsZUludGVybmFsAwR0eXBlCXJlY2lwaWVudA1ib29zdGVyc0xldmVsBAt2ZWhpY2xlSXRlbQkAwggFBQR0eXBlCQCsAgIJAKwCAgIKW1ZlaGljbGVdIAUEdHlwZQI0IHZlaGljbGUgZm9yIHRoZSBNZXRhcmFjZSBnYW1lLiBodHRwczovL21ldGFyYWNlLmNvbQABAAAHBBJ2ZWhpY2xlSXRlbUFzc2V0SWQJALgIAQULdmVoaWNsZUl0ZW0JAMwIAgULdmVoaWNsZUl0ZW0JAMwIAgkBDEludGVnZXJFbnRyeQIJARdrZXlWZWhpY2xlQm9vc3RlcnNMZXZlbAEJANgEAQUSdmVoaWNsZUl0ZW1Bc3NldElkBQ1ib29zdGVyc0xldmVsCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMFCXJlY2lwaWVudAABBRJ2ZWhpY2xlSXRlbUFzc2V0SWQFA25pbAEVdXBkYXRlU2V0dGluZ0ludGVybmFsAwFpA2tleQV2YWx1ZQMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECJ09ubHkgYWRtaW5pc3RyYXRvciBjYW4gY2FsbCB0aGlzIG1ldGhvZAQHJG1hdGNoMAUFdmFsdWUDCQABAgUHJG1hdGNoMAIDSW50BANpbnQFByRtYXRjaDAJAMwIAgkBDEludGVnZXJFbnRyeQIFA2tleQUDaW50BQNuaWwDCQABAgUHJG1hdGNoMAIGU3RyaW5nBAFzBQckbWF0Y2gwCQDMCAIJAQtTdHJpbmdFbnRyeQIFA2tleQUBcwUDbmlsAwkAAQIFByRtYXRjaDACB0Jvb2xlYW4EAWIFByRtYXRjaDAJAMwIAgkBDEJvb2xlYW5FbnRyeQIFA2tleQUBYgUDbmlsAwkAAQIFByRtYXRjaDACCkJ5dGVWZWN0b3IEAmJ2BQckbWF0Y2gwCQDMCAIJAQtCaW5hcnlFbnRyeQIFA2tleQUCYnYFA25pbAkAAgECDkJhZCB2YWx1ZSB0eXBlEwFpARVidXlBY2Nlc3NJdGVtSW50ZXJuYWwBCmFkZHJlc3NTdHIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhgzQkFJSTogaW50ZXJuYWwgdXNlIG9ubHkED2lzc3VlQWNjZXNzSXRlbQkAwggFCQCsAgICB0FDQ0VTUy0JAQtnZXRHYW1lTmFtZQAJAKwCAgkArAICCQCsAgICCVtBY2Nlc3NdIAkBD2dldExvbmdHYW1lTmFtZQACECBhY2Nlc3MgTkZUIGZvciAJAQpnZXRORlROYW1lAAABAAAHBBFhY2Nlc3NSYWNlQXNzZXRJZAkA2AQBCQC4CAEFD2lzc3VlQWNjZXNzSXRlbQQMa1Nwb3RzQm91Z2h0CQEOa2V5U3BvdHNCb3VnaHQBBQphZGRyZXNzU3RyCQCUCgIJAMwIAgUPaXNzdWVBY2Nlc3NJdGVtCQDMCAIJAQtTdHJpbmdFbnRyeQIJAKwCAgkArAICAgthY2Nlc3NJdGVtXwURYWNjZXNzUmFjZUFzc2V0SWQCBl9vd25lcgUKYWRkcmVzc1N0cgkAzAgCCQELU3RyaW5nRW50cnkCCQCsAgIJAKwCAgIIYWRkcmVzc18FCmFkZHJlc3NTdHICB19vd25pbmcFEWFjY2Vzc1JhY2VBc3NldElkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQxrU3BvdHNCb3VnaHQJAGQCCQENdHJ5R2V0SW50ZWdlcgEFDGtTcG90c0JvdWdodAABBQNuaWwFEWFjY2Vzc1JhY2VBc3NldElkAWkBD2NvbmZpZ3VyZU9yYWNsZQQGb3JhY2xlCXNob3J0bmFtZQhsb25nbmFtZQduZnROYW1lAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIPM0NPOiBhZG1pbiBvbmx5CQDMCAIJAQtTdHJpbmdFbnRyeQICFHN0YXRpY19vcmFjbGVBZGRyZXNzBQZvcmFjbGUJAMwIAgkBC1N0cmluZ0VudHJ5AgIUc3RhdGljX3Nob3J0R2FtZU5hbWUFCXNob3J0bmFtZQkAzAgCCQELU3RyaW5nRW50cnkCAhNzdGF0aWNfbG9uZ0dhbWVOYW1lBQhsb25nbmFtZQkAzAgCCQELU3RyaW5nRW50cnkCAg5zdGF0aWNfbmZ0TmFtZQUHbmZ0TmFtZQUDbmlsAWkBEHVwZGF0ZVNldHRpbmdJbnQCA2tleQV2YWx1ZQkBFXVwZGF0ZVNldHRpbmdJbnRlcm5hbAMFAWkFA2tleQUFdmFsdWUBaQEQdXBkYXRlU2V0dGluZ1N0cgIDa2V5BXZhbHVlCQEVdXBkYXRlU2V0dGluZ0ludGVybmFsAwUBaQUDa2V5BQV2YWx1ZQFpARR1cGRhdGVTZXR0aW5nQm9vbGVhbgIDa2V5BXZhbHVlCQEVdXBkYXRlU2V0dGluZ0ludGVybmFsAwUBaQUDa2V5BQV2YWx1ZQFpARd1cGRhdGVTZXR0aW5nQnl0ZVZlY3RvcgIDa2V5BXZhbHVlCQEVdXBkYXRlU2V0dGluZ0ludGVybmFsAwUBaQUDa2V5BQV2YWx1ZQFpAQ1kZWxldGVTZXR0aW5nAQNrZXkDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAiwzRFM6IE9ubHkgYWRtaW5pc3RyYXRvciBjYW4gY2FsbCB0aGlzIG1ldGhvZAkAzAgCCQELRGVsZXRlRW50cnkBBQNrZXkFA25pbAFpAQpidXlWZWhpY2xlAQh0eXBlTmFtZQQFcHJpY2UJAQ9nZXRWZWhpY2xlUHJpY2UBBQh0eXBlTmFtZQQDcG10CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAED2V4cGVjdGVkQXNzZXRJZAkBE2dldEJvc3RlckJ1eUFzc2V0SWQAAwkAAAIFBXByaWNlAAAJAAIBAh1UaGVyZSBpcyBubyBzdWNoIHZlaGljbGUgdHlwZQMJAQIhPQIIBQNwbXQGYW1vdW50BQVwcmljZQkAAgEJAKwCAgIeM0JCOiBCYWQgcHJpY2UsIGl0IHNob3VsZCBiZTogCQCkAwEFBXByaWNlAwkBAiE9AggFA3BtdAdhc3NldElkBQ9leHBlY3RlZEFzc2V0SWQJAAIBCQCsAgICQzNCQjogQmFkIHBheW1lbnQgYXR0YWNoZWQsIGl0IHNob3VsZCBiZSAkUkFDRSB0b2tlbiB3aXRoIGFzc2V0IGlkOiAJANgEAQUPZXhwZWN0ZWRBc3NldElkCQETbWludFZlaGljbGVJbnRlcm5hbAMFCHR5cGVOYW1lCAUBaQZjYWxsZXIAAAFpAQpidXlCb29zdGVyAQdhc3NldElkBAxrQm91Z2h0TGV2ZWwJARdrZXlWZWhpY2xlQm9vc3RlcnNMZXZlbAEFB2Fzc2V0SWQEEmJvdWdodEJvb3N0ZXJMZXZlbAkBDXRyeUdldEludGVnZXIBBQxrQm91Z2h0TGV2ZWwECG5ld0xldmVsCQBkAgUSYm91Z2h0Qm9vc3RlckxldmVsAAEEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAVwcmljZQkBFmdldEJvc3RlclByaWNlRm9yTGV2ZWwBBQhuZXdMZXZlbAQPZXhwZWN0ZWRBc3NldElkCQETZ2V0Qm9zdGVyQnV5QXNzZXRJZAAEDnZlaGljbGVEZXRhaWxzCQELdmFsdWVPckVsc2UCCQDsBwEJANkEAQUHYXNzZXRJZAkBFmdldERlZmF1bHRWZWhpY2xlQXNzZXQAAwkBAiE9AggFDnZlaGljbGVEZXRhaWxzBmlzc3VlcgUEdGhpcwkAAgECG1RoaXMgYXNzZXQgaXMgbm90IGEgdmVoaWNsZQMJAAACCQEIY29udGFpbnMCCQEFdmFsdWUBCAUOdmVoaWNsZURldGFpbHMLZGVzY3JpcHRpb24CCVtWZWhpY2xlXQcJAAIBAhtUaGlzIGFzc2V0IGlzIG5vdCBhIHZlaGljbGUDAwkBAiE9AggFA3BtdAZhbW91bnQFBXByaWNlBgkAAAIFBXByaWNlAAAJAAIBCQCsAgICHjNCQjogQmFkIHByaWNlLCBpdCBzaG91bGQgYmU6IAkApAMBBQVwcmljZQMJAQIhPQIIBQNwbXQHYXNzZXRJZAUPZXhwZWN0ZWRBc3NldElkCQACAQkArAICAikzQkI6IEJhZCBwYXltZW50IGF0dGFjaGVkLCBpdCBzaG91bGQgYmU6IAkA2AQBBQ9leHBlY3RlZEFzc2V0SWQDCQAAAgUHYXNzZXRJZAIACQETbWludFZlaGljbGVJbnRlcm5hbAMJARVnZXREZWZhdWx0VmVoaWNsZVR5cGUACAUBaQZjYWxsZXIAAQkAzAgCCQEMSW50ZWdlckVudHJ5AgUMa0JvdWdodExldmVsBQhuZXdMZXZlbAUDbmlsAWkBD2J1eU1hbnlCb29zdGVycwIHYXNzZXRJZA9uZXdEZXNpcmVkTGV2ZWwEDGtCb3VnaHRMZXZlbAkBF2tleVZlaGljbGVCb29zdGVyc0xldmVsAQUHYXNzZXRJZAQSYm91Z2h0Qm9vc3RlckxldmVsCQENdHJ5R2V0SW50ZWdlcgEFDGtCb3VnaHRMZXZlbAoBF2FjY3VtdWxhdGVCb29zdGVyUHJpY2VzAgVhY2N1bQ9sZXZlbFRvUHVyY2hhc2UDAwkAZwIFEmJvdWdodEJvb3N0ZXJMZXZlbAUPbGV2ZWxUb1B1cmNoYXNlBgkAZgIFD2xldmVsVG9QdXJjaGFzZQUPbmV3RGVzaXJlZExldmVsBQVhY2N1bQQMYm9vc3RlclByaWNlCQEWZ2V0Qm9zdGVyUHJpY2VGb3JMZXZlbAEFD2xldmVsVG9QdXJjaGFzZQkAZAIFBWFjY3VtBQxib29zdGVyUHJpY2UECnRvdGFsUHJpY2UKAAIkbAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFCQDMCAIABgkAzAgCAAcJAMwIAgAICQDMCAIACQkAzAgCAAoJAMwIAgALBQNuaWwKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBF2FjY3VtdWxhdGVCb29zdGVyUHJpY2VzAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMQkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABA9leHBlY3RlZEFzc2V0SWQJARNnZXRCb3N0ZXJCdXlBc3NldElkAAQOdmVoaWNsZURldGFpbHMJAQt2YWx1ZU9yRWxzZQIJAOwHAQkA2QQBBQdhc3NldElkCQEWZ2V0RGVmYXVsdFZlaGljbGVBc3NldAADCQECIT0CCAUOdmVoaWNsZURldGFpbHMGaXNzdWVyBQR0aGlzCQACAQIbVGhpcyBhc3NldCBpcyBub3QgYSB2ZWhpY2xlAwkAAAIJAQhjb250YWlucwIJAQV2YWx1ZQEIBQ52ZWhpY2xlRGV0YWlscwtkZXNjcmlwdGlvbgIJW1ZlaGljbGVdBwkAAgECG1RoaXMgYXNzZXQgaXMgbm90IGEgdmVoaWNsZQMJAGcCBRJib3VnaHRCb29zdGVyTGV2ZWwFD25ld0Rlc2lyZWRMZXZlbAkAAgECHzNCQjogQm9vc3RlciB3YXMgYWxyZWFkeSBib3VnaHQDCQECIT0CCAUDcG10BmFtb3VudAUKdG90YWxQcmljZQkAAgEJAKwCAgIeM0JCOiBCYWQgcHJpY2UsIGl0IHNob3VsZCBiZTogCQCkAwEFCnRvdGFsUHJpY2UDCQECIT0CCAUDcG10B2Fzc2V0SWQFD2V4cGVjdGVkQXNzZXRJZAkAAgEJAKwCAgIpM0JCOiBCYWQgcGF5bWVudCBhdHRhY2hlZCwgaXQgc2hvdWxkIGJlOiAJANgEAQUPZXhwZWN0ZWRBc3NldElkAwkAAAIFB2Fzc2V0SWQCAAkBE21pbnRWZWhpY2xlSW50ZXJuYWwDCQEVZ2V0RGVmYXVsdFZlaGljbGVUeXBlAAgFAWkGY2FsbGVyBQ9uZXdEZXNpcmVkTGV2ZWwJAMwIAgkBDEludGVnZXJFbnRyeQIFDGtCb3VnaHRMZXZlbAUPbmV3RGVzaXJlZExldmVsBQNuaWwBaQEKYnV5VGlja2V0cwAEDmtUaWNrZXRzQm91Z2h0CQEQa2V5VGlja2V0c0JvdWdodAEJAKUIAQgFAWkGY2FsbGVyBA10aWNrZXRzQm91Z2h0CQENdHJ5R2V0SW50ZWdlcgEFDmtUaWNrZXRzQm91Z2h0BANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQLcGFjazEwUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCFHN0YXRpY19wYWNrXzEwX3ByaWNlBAtwYWNrNTBQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIUc3RhdGljX3BhY2tfNTBfcHJpY2UEDHBhY2sxMDBQcmljZQkBEUBleHRyTmF0aXZlKDEwNTApAgUEdGhpcwIVc3RhdGljX3BhY2tfMTAwX3ByaWNlBAxwYWNrMjUwUHJpY2UJARFAZXh0ck5hdGl2ZSgxMDUwKQIFBHRoaXMCFXN0YXRpY19wYWNrXzI1MF9wcmljZQQPZXhwZWN0ZWRBc3NldElkCQETZ2V0Qm9zdGVyQnV5QXNzZXRJZAAEEG5ld1RpY2tldHNCb3VnaHQDCQAAAggFA3BtdAZhbW91bnQFC3BhY2sxMFByaWNlAAoDCQAAAggFA3BtdAZhbW91bnQFC3BhY2s1MFByaWNlADIDCQAAAggFA3BtdAZhbW91bnQFDHBhY2sxMDBQcmljZQAyAwkAAAIIBQNwbXQGYW1vdW50BQxwYWNrMjUwUHJpY2UAMgkAaQIIBQNwbXQGYW1vdW50AIDC1y8DCQECIT0CCAUDcG10B2Fzc2V0SWQFD2V4cGVjdGVkQXNzZXRJZAkAAgECGTNCQzogV3JvbmcgYXNzZXQgYXR0YWNoZWQJAMwIAgkBDEludGVnZXJFbnRyeQIFDmtUaWNrZXRzQm91Z2h0CQBkAgUNdGlja2V0c0JvdWdodAUQbmV3VGlja2V0c0JvdWdodAUDbmlsAWkBGGJ1eUFjY2Vzc0l0ZW1BbmRMb2NrRHVjawAECmVnZ1BheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAAQLZHVja1BheW1lbnQJAQV2YWx1ZQEJAJEDAggFAWkIcGF5bWVudHMAAQQKYWRkcmVzc1N0cgkApQgBCAUBaQZjYWxsZXIDCQECIT0CCAUKZWdnUGF5bWVudAdhc3NldElkCQEUZ2V0QWNjZXNzSXRlbUFzc2V0SWQACQACAQIaM0JBSTogV3JvbmcgYXNzZXQgYXR0YWNoZWQDCQECIT0CCAUKZWdnUGF5bWVudAZhbW91bnQJARJnZXRBY2Nlc3NJdGVtUHJpY2UACQACAQIlM0JBSTogV3JvbmcgYW1vdW50IG9mIGFzc2V0cyBhdHRhY2hlZAQOYWNjZXNzSXRlbURhdGEJAQhhc1N0cmluZwEJAPwHBAUEdGhpcwIVYnV5QWNjZXNzSXRlbUludGVybmFsCQDMCAIFCmFkZHJlc3NTdHIFA25pbAUDbmlsAwkAAAIFDmFjY2Vzc0l0ZW1EYXRhBQ5hY2Nlc3NJdGVtRGF0YQQIbG9ja0RhdGEJARBsb2NrRHVja0ludGVybmFsAgUKYWRkcmVzc1N0cgULZHVja1BheW1lbnQJAJQKAgUIbG9ja0RhdGEFDmFjY2Vzc0l0ZW1EYXRhCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDWJ1eUFjY2Vzc0l0ZW0ABAphZGRyZXNzU3RyCQClCAEIBQFpBmNhbGxlcgQKZWdnUGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAAAwkBAiE9AggFCmVnZ1BheW1lbnQHYXNzZXRJZAkBFGdldEFjY2Vzc0l0ZW1Bc3NldElkAAkAAgECGjNCQUk6IFdyb25nIGFzc2V0IGF0dGFjaGVkAwkBAiE9AggFCmVnZ1BheW1lbnQGYW1vdW50CQESZ2V0QWNjZXNzSXRlbVByaWNlAAkAAgECJTNCQUk6IFdyb25nIGFtb3VudCBvZiBhc3NldHMgYXR0YWNoZWQEDmFjY2Vzc0l0ZW1EYXRhCQEIYXNTdHJpbmcBCQD8BwQFBHRoaXMCFWJ1eUFjY2Vzc0l0ZW1JbnRlcm5hbAkAzAgCBQphZGRyZXNzU3RyBQNuaWwFA25pbAMJAAACBQ5hY2Nlc3NJdGVtRGF0YQUOYWNjZXNzSXRlbURhdGEJAJQKAgUDbmlsBQ5hY2Nlc3NJdGVtRGF0YQkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARJidXlBY2Nlc3NJdGVtT3RoZXIBDGFkZHJlc3NPdGhlcgQKZWdnUGF5bWVudAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAAAwkBAiE9AggFCmVnZ1BheW1lbnQHYXNzZXRJZAkBFGdldEFjY2Vzc0l0ZW1Bc3NldElkAAkAAgECGjNCQUk6IFdyb25nIGFzc2V0IGF0dGFjaGVkAwkBAiE9AggFCmVnZ1BheW1lbnQGYW1vdW50CQESZ2V0QWNjZXNzSXRlbVByaWNlAAkAAgECJTNCQUk6IFdyb25nIGFtb3VudCBvZiBhc3NldHMgYXR0YWNoZWQEDmFjY2Vzc0l0ZW1EYXRhCQEIYXNTdHJpbmcBCQD8BwQFBHRoaXMCFWJ1eUFjY2Vzc0l0ZW1JbnRlcm5hbAkAzAgCBQxhZGRyZXNzT3RoZXIFA25pbAUDbmlsAwkAAAIFDmFjY2Vzc0l0ZW1EYXRhBQ5hY2Nlc3NJdGVtRGF0YQkAlAoCBQNuaWwFDmFjY2Vzc0l0ZW1EYXRhCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBCGxvY2tEdWNrAAQKYWRkcmVzc1N0cgkApQgBCAUBaQZjYWxsZXIEC2R1Y2tQYXltZW50CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAJARBsb2NrRHVja0ludGVybmFsAgUKYWRkcmVzc1N0cgULZHVja1BheW1lbnQBaQEPdW5sb2NrRHVja090aGVyAQphc3NldElkU3RyAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIRM1VETzogQWRtaW4gb25seSEECG93bmVyS2V5CQEMdHJ5R2V0U3RyaW5nAQkBDGtleUR1Y2tPd25lcgEJANkEAQUKYXNzZXRJZFN0cgkBC3Vuc3Rha2VEdWNrAgUKYXNzZXRJZFN0cgUIb3duZXJLZXkBaQEebWludExhd25Nb3dlckZvckxlZ2FjeUJvb3N0ZXJzAQdhZGRyZXNzBAFrCQCsAgIJAKwCAgIIYWRkcmVzc18FB2FkZHJlc3MCE19ib3VnaHRCb29zdGVyTGV2ZWwEDGN1cnJlbnRMZXZlbAkBDXRyeUdldEludGVnZXIBBQFrAwkAAAIFDGN1cnJlbnRMZXZlbAAACQACAQIgVGhlcmUgaXMgbm8gYm9vc3RlciBmb3IgdGhlIHVzZXIJAM4IAgkBE21pbnRWZWhpY2xlSW50ZXJuYWwDAglMYXduTW93ZXIJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB2FkZHJlc3MFDGN1cnJlbnRMZXZlbAkAzAgCCQELRGVsZXRlRW50cnkBBQFrBQNuaWwBaQEVbWludFRydWNrV2l0aEJvb3N0ZXJzAwlyZWNpcGllbnQJdHJ1Y2tUeXBlDWJvb3N0ZXJzTGV2ZWwDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhtPbmx5IGFkbWluIGNhbGwgbWludCB0cnVja3MJARNtaW50VmVoaWNsZUludGVybmFsAwUJdHJ1Y2tUeXBlCQERQGV4dHJOYXRpdmUoMTA2MikBBQlyZWNpcGllbnQFDWJvb3N0ZXJzTGV2ZWwBaQEKdW5sb2NrRHVjawEKYXNzZXRJZFN0cgQKYWRkcmVzc1N0cgkApQgBCAUBaQZjYWxsZXIJAQt1bnN0YWtlRHVjawIFCmFzc2V0SWRTdHIFCmFkZHJlc3NTdHIA8KayQA==", "height": 3608266, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 8G2canSJ1tpAAsnjZs7JfF7j6BSFRdeigFUuoVNe2FBU Next: none Diff:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func tryGetInteger (key) = match getInteger(this, key) {
196196 }
197197
198198
199+func updateSettingInternal (i,key,value) = if ((i.caller != this))
200+ then throw("Only administrator can call this method")
201+ else match value {
202+ case int: Int =>
203+[IntegerEntry(key, int)]
204+ case s: String =>
205+[StringEntry(key, s)]
206+ case b: Boolean =>
207+[BooleanEntry(key, b)]
208+ case bv: ByteVector =>
209+[BinaryEntry(key, bv)]
210+ case _ =>
211+ throw("Bad value type")
212+ }
213+
214+
199215 @Callable(i)
200216 func buyAccessItemInternal (addressStr) = if ((i.caller != this))
201217 then throw("3BAII: internal use only")
216232
217233
218234 @Callable(i)
219-func updateSetting (key,value) = if ((i.caller != this))
220- then throw("Only administrator can call this method")
221- else match value {
222- case int: Int =>
223-[IntegerEntry(key, int)]
224- case s: String =>
225-[StringEntry(key, s)]
226- case b: Boolean =>
227-[BooleanEntry(key, b)]
228- case bv: ByteVector =>
229-[BinaryEntry(key, bv)]
230- case _ =>
231- throw("Bad value type")
232- }
235+func updateSettingInt (key,value) = updateSettingInternal(i, key, value)
236+
237+
238+
239+@Callable(i)
240+func updateSettingStr (key,value) = updateSettingInternal(i, key, value)
241+
242+
243+
244+@Callable(i)
245+func updateSettingBoolean (key,value) = updateSettingInternal(i, key, value)
246+
247+
248+
249+@Callable(i)
250+func updateSettingByteVector (key,value) = updateSettingInternal(i, key, value)
233251
234252
235253
334352 let kTicketsBought = keyTicketsBought(toString(i.caller))
335353 let ticketsBought = tryGetInteger(kTicketsBought)
336354 let pmt = i.payments[0]
355+ let pack10Price = getIntegerValue(this, "static_pack_10_price")
356+ let pack50Price = getIntegerValue(this, "static_pack_50_price")
357+ let pack100Price = getIntegerValue(this, "static_pack_100_price")
358+ let pack250Price = getIntegerValue(this, "static_pack_250_price")
337359 let expectedAssetId = getBosterBuyAssetId()
338- let newTicketsBought = (pmt.amount / 100000000)
360+ let newTicketsBought = if ((pmt.amount == pack10Price))
361+ then 10
362+ else if ((pmt.amount == pack50Price))
363+ then 50
364+ else if ((pmt.amount == pack100Price))
365+ then 50
366+ else if ((pmt.amount == pack250Price))
367+ then 50
368+ else (pmt.amount / 100000000)
339369 if ((pmt.assetId != expectedAssetId))
340370 then throw("3BC: Wrong asset attached")
341371 else [IntegerEntry(kTicketsBought, (ticketsBought + newTicketsBought))]
420450
421451
422452 @Callable(i)
453+func mintLawnMowerForLegacyBoosters (address) = {
454+ let k = (("address_" + address) + "_boughtBoosterLevel")
455+ let currentLevel = tryGetInteger(k)
456+ if ((currentLevel == 0))
457+ then throw("There is no booster for the user")
458+ else (mintVehicleInternal("LawnMower", addressFromStringValue(address), currentLevel) ++ [DeleteEntry(k)])
459+ }
460+
461+
462+
463+@Callable(i)
464+func mintTruckWithBoosters (recipient,truckType,boostersLevel) = if ((i.caller != this))
465+ then throw("Only admin call mint trucks")
466+ else mintVehicleInternal(truckType, addressFromStringValue(recipient), boostersLevel)
467+
468+
469+
470+@Callable(i)
423471 func unlockDuck (assetIdStr) = {
424472 let addressStr = toString(i.caller)
425473 unstakeDuck(assetIdStr, addressStr)
Full:
OldNewDifferences
1-{-# STDLIB_VERSION 5 #-}
1+{-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 func tryGetInteger (key) = match getInteger(this, key) {
55 case b: Int =>
66 b
77 case _ =>
88 0
99 }
1010
1111
1212 func keyDuckUnlockTime (assetId) = (("duck_" + toBase58String(assetId)) + "_unlockTime")
1313
1414
1515 func keyDuckOwner (assetId) = (("duck_" + toBase58String(assetId)) + "_owner")
1616
1717
1818 func keyVehicleBoostersLevel (assetId) = (("vehicle_" + assetId) + "_boostersLevel")
1919
2020
2121 func keySpotsBought (addressStr) = (("address_" + addressStr) + "_spotsBought")
2222
2323
2424 func keyTicketsBought (addressStr) = (("address_" + addressStr) + "_ticketsBought")
2525
2626
2727 func keyVehicleTypePrice (name) = (("vehicleType_" + name) + "_price")
2828
2929
3030 func keySpotsBusy (addressStr) = (("address_" + addressStr) + "_spotsBusy")
3131
3232
3333 func keyLockedDuckStatus (addressStr,assetIdStr) = (((("address_" + addressStr) + "_lockedDuck_") + assetIdStr) + "_status")
3434
3535
3636 func getDuckDetails (assetId) = {
3737 let assetName = value(value(assetInfo(assetId)).name)
3838 let assetNameParts = split(assetName, "")
3939 let isJackpot = (assetNameParts[(size(assetNameParts) - 2)] == "J")
4040 let assetColor = if (isJackpot)
4141 then "B"
4242 else assetNameParts[(size(assetNameParts) - 1)]
4343 $Tuple2(assetColor, isJackpot)
4444 }
4545
4646
4747 func tryGetStringExternal (address,key) = match getString(address, key) {
4848 case a: String =>
4949 a
5050 case _ =>
5151 ""
5252 }
5353
5454
5555 func tryGetString (key) = tryGetStringExternal(this, key)
5656
5757
5858 func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress")))
5959
6060
6161 func getGameName () = valueOrErrorMessage(getString("static_shortGameName"), "3GGN: There is no game name defined!")
6262
6363
6464 func getLongGameName () = valueOrErrorMessage(getString("static_longGameName"), "3GLGN: There is no long game name defined!")
6565
6666
6767 func getNFTName () = valueOrErrorMessage(getString("static_nftName"), "3GNN: There is no nft name defined!")
6868
6969
7070 func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_incubatorAddress")))
7171
7272
7373 func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_breederAddress")))
7474
7575
7676 func getFarmingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_farmingAddress")))
7777
7878
7979 func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_eggAssetId"))
8080
8181
8282 func getAccessItemAssetId () = fromBase58String(tryGetString("static_accessItemAssetId"))
8383
8484
8585 func getAccessItemPrice () = tryGetInteger("static_accessItemPrice")
8686
8787
8888 func getMinLockDuration () = tryGetInteger("static_minLockDuration")
8989
9090
9191 func getDefaultVehicleType () = tryGetString("static_defaultVehicleType")
9292
9393
9494 func getBosterBuyAssetId () = fromBase58String(tryGetString("static_boosterBuyAssetId"))
9595
9696
9797 func getBosterPriceForLevel (level) = valueOrErrorMessage(getInteger(("static_boosterPriceLevel_" + toString(level))), "3GBPFL: There is no price value for this level of booster")
9898
9999
100100 func getBosterNameForLevel (level) = valueOrErrorMessage(getString(("static_boosterName_" + toString(level))), "3GBNFL: There is no such booster")
101101
102102
103103 func asString (value) = match value {
104104 case string: String =>
105105 string
106106 case _ =>
107107 throw("3AS: wrong type, expected: String")
108108 }
109109
110110
111111 func getDefaultVehicleAsset () = Asset(base58'1', 1, 0, this, base58'1', false, false, unit, getDefaultVehicleType(), ("[Vehicle] " + getDefaultVehicleType()))
112112
113113
114114 func lockDuckInternal (addressStr,pmt) = {
115115 let assetId = value(pmt.assetId)
116116 let assetIssuer = value(assetInfo(assetId)).issuer
117117 let tDuckDetails = getDuckDetails(assetId)
118118 let assetColor = tDuckDetails._1
119119 let isJackpot = tDuckDetails._2
120120 let kSpotsBusy = keySpotsBusy(addressStr)
121121 let spotsBusy = tryGetInteger(kSpotsBusy)
122122 let kSpotsBought = keySpotsBought(addressStr)
123123 let addressSpotsAvailable = (tryGetInteger(kSpotsBought) - spotsBusy)
124124 if ((pmt.amount != 1))
125125 then throw("NFT is not attached")
126126 else if (if ((assetIssuer != getIncubatorAddress()))
127127 then (assetIssuer != getBreederAddress())
128128 else false)
129129 then throw("ivalid NFT attached")
130130 else if ((0 >= addressSpotsAvailable))
131131 then throw("No spots available")
132132 else {
133133 let kPerchesAvailable = ((("address_" + toString(this)) + "_perchesAvailable_") + assetColor)
134134 let perchesAvailable = match getInteger(getFarmingAddress(), kPerchesAvailable) {
135135 case b: Int =>
136136 b
137137 case _ =>
138138 0
139139 }
140140 if ((perchesAvailable == perchesAvailable))
141141 then {
142142 let eggAssetId = getEggAssetId()
143143 let inv1 = if ((perchesAvailable > 0))
144144 then unit
145145 else invoke(getFarmingAddress(), "buyPerch", [assetColor, ""], [AttachedPayment(eggAssetId, 100000000)])
146146 if ((inv1 == inv1))
147147 then {
148148 let inv2 = if ((isJackpot == false))
149149 then invoke(getFarmingAddress(), "stakeNFT", nil, [AttachedPayment(assetId, 1)])
150150 else invoke(getFarmingAddress(), "stakeJackpot", [assetColor], [AttachedPayment(assetId, 1)])
151151 if ((inv2 == inv2))
152152 then [IntegerEntry(kSpotsBusy, (spotsBusy + 1)), StringEntry(keyDuckOwner(assetId), addressStr), BooleanEntry(keyLockedDuckStatus(addressStr, toBase58String(assetId)), true), IntegerEntry(keyDuckUnlockTime(assetId), (lastBlock.timestamp + getMinLockDuration()))]
153153 else throw("Strict value is not equal to itself.")
154154 }
155155 else throw("Strict value is not equal to itself.")
156156 }
157157 else throw("Strict value is not equal to itself.")
158158 }
159159 }
160160
161161
162162 func unstakeDuck (assetIdStr,addressStr) = {
163163 let assetId = fromBase58String(assetIdStr)
164164 let tDuckDetails = getDuckDetails(assetId)
165165 let assetColor = tDuckDetails._1
166166 let isJackpot = tDuckDetails._2
167167 let kSpotsBusy = keySpotsBusy(addressStr)
168168 let kDuckOwner = keyDuckOwner(assetId)
169169 let remainingForUnlock = (tryGetInteger(keyDuckUnlockTime(assetId)) - lastBlock.timestamp)
170170 if ((tryGetString(kDuckOwner) != addressStr))
171171 then throw("3UL: The duck is not yours")
172172 else if ((remainingForUnlock > 0))
173173 then throw((("3UL: You need to wait to unlock " + toString((remainingForUnlock / 1000))) + " seconds"))
174174 else {
175175 let unstakeFuncName = if ((isJackpot == true))
176176 then "unstakeJackpot"
177177 else "unstakeNFT"
178178 let inv1 = invoke(getFarmingAddress(), unstakeFuncName, [assetIdStr], nil)
179179 if ((inv1 == inv1))
180180 then [ScriptTransfer(Address(fromBase58String(addressStr)), 1, assetId), DeleteEntry(keyLockedDuckStatus(addressStr, assetIdStr)), DeleteEntry(kDuckOwner), IntegerEntry(kSpotsBusy, (tryGetInteger(kSpotsBusy) - 1))]
181181 else throw("Strict value is not equal to itself.")
182182 }
183183 }
184184
185185
186186 func getVehicleName (type) = getStringValue(this, (("static_vehicle_" + type) + "_name"))
187187
188188
189189 func getVehiclePrice (type) = tryGetInteger((("static_vehicle_" + type) + "_price"))
190190
191191
192192 func mintVehicleInternal (type,recipient,boostersLevel) = {
193193 let vehicleItem = Issue(type, (("[Vehicle] " + type) + " vehicle for the Metarace game. https://metarace.com"), 1, 0, false)
194194 let vehicleItemAssetId = calculateAssetId(vehicleItem)
195195 [vehicleItem, IntegerEntry(keyVehicleBoostersLevel(toBase58String(vehicleItemAssetId)), boostersLevel), ScriptTransfer(recipient, 1, vehicleItemAssetId)]
196196 }
197197
198198
199+func updateSettingInternal (i,key,value) = if ((i.caller != this))
200+ then throw("Only administrator can call this method")
201+ else match value {
202+ case int: Int =>
203+[IntegerEntry(key, int)]
204+ case s: String =>
205+[StringEntry(key, s)]
206+ case b: Boolean =>
207+[BooleanEntry(key, b)]
208+ case bv: ByteVector =>
209+[BinaryEntry(key, bv)]
210+ case _ =>
211+ throw("Bad value type")
212+ }
213+
214+
199215 @Callable(i)
200216 func buyAccessItemInternal (addressStr) = if ((i.caller != this))
201217 then throw("3BAII: internal use only")
202218 else {
203219 let issueAccessItem = Issue(("ACCESS-" + getGameName()), ((("[Access] " + getLongGameName()) + " access NFT for ") + getNFTName()), 1, 0, false)
204220 let accessRaceAssetId = toBase58String(calculateAssetId(issueAccessItem))
205221 let kSpotsBought = keySpotsBought(addressStr)
206222 $Tuple2([issueAccessItem, StringEntry((("accessItem_" + accessRaceAssetId) + "_owner"), addressStr), StringEntry((("address_" + addressStr) + "_owning"), accessRaceAssetId), IntegerEntry(kSpotsBought, (tryGetInteger(kSpotsBought) + 1))], accessRaceAssetId)
207223 }
208224
209225
210226
211227 @Callable(i)
212228 func configureOracle (oracle,shortname,longname,nftName) = if ((i.caller != this))
213229 then throw("3CO: admin only")
214230 else [StringEntry("static_oracleAddress", oracle), StringEntry("static_shortGameName", shortname), StringEntry("static_longGameName", longname), StringEntry("static_nftName", nftName)]
215231
216232
217233
218234 @Callable(i)
219-func updateSetting (key,value) = if ((i.caller != this))
220- then throw("Only administrator can call this method")
221- else match value {
222- case int: Int =>
223-[IntegerEntry(key, int)]
224- case s: String =>
225-[StringEntry(key, s)]
226- case b: Boolean =>
227-[BooleanEntry(key, b)]
228- case bv: ByteVector =>
229-[BinaryEntry(key, bv)]
230- case _ =>
231- throw("Bad value type")
232- }
235+func updateSettingInt (key,value) = updateSettingInternal(i, key, value)
236+
237+
238+
239+@Callable(i)
240+func updateSettingStr (key,value) = updateSettingInternal(i, key, value)
241+
242+
243+
244+@Callable(i)
245+func updateSettingBoolean (key,value) = updateSettingInternal(i, key, value)
246+
247+
248+
249+@Callable(i)
250+func updateSettingByteVector (key,value) = updateSettingInternal(i, key, value)
233251
234252
235253
236254 @Callable(i)
237255 func deleteSetting (key) = if ((i.caller != this))
238256 then throw("3DS: Only administrator can call this method")
239257 else [DeleteEntry(key)]
240258
241259
242260
243261 @Callable(i)
244262 func buyVehicle (typeName) = {
245263 let price = getVehiclePrice(typeName)
246264 let pmt = value(i.payments[0])
247265 let expectedAssetId = getBosterBuyAssetId()
248266 if ((price == 0))
249267 then throw("There is no such vehicle type")
250268 else if ((pmt.amount != price))
251269 then throw(("3BB: Bad price, it should be: " + toString(price)))
252270 else if ((pmt.assetId != expectedAssetId))
253271 then throw(("3BB: Bad payment attached, it should be $RACE token with asset id: " + toBase58String(expectedAssetId)))
254272 else mintVehicleInternal(typeName, i.caller, 0)
255273 }
256274
257275
258276
259277 @Callable(i)
260278 func buyBooster (assetId) = {
261279 let kBoughtLevel = keyVehicleBoostersLevel(assetId)
262280 let boughtBoosterLevel = tryGetInteger(kBoughtLevel)
263281 let newLevel = (boughtBoosterLevel + 1)
264282 let pmt = value(i.payments[0])
265283 let price = getBosterPriceForLevel(newLevel)
266284 let expectedAssetId = getBosterBuyAssetId()
267285 let vehicleDetails = valueOrElse(assetInfo(fromBase58String(assetId)), getDefaultVehicleAsset())
268286 if ((vehicleDetails.issuer != this))
269287 then throw("This asset is not a vehicle")
270288 else if ((contains(value(vehicleDetails.description), "[Vehicle]") == false))
271289 then throw("This asset is not a vehicle")
272290 else if (if ((pmt.amount != price))
273291 then true
274292 else (price == 0))
275293 then throw(("3BB: Bad price, it should be: " + toString(price)))
276294 else if ((pmt.assetId != expectedAssetId))
277295 then throw(("3BB: Bad payment attached, it should be: " + toBase58String(expectedAssetId)))
278296 else if ((assetId == ""))
279297 then mintVehicleInternal(getDefaultVehicleType(), i.caller, 1)
280298 else [IntegerEntry(kBoughtLevel, newLevel)]
281299 }
282300
283301
284302
285303 @Callable(i)
286304 func buyManyBoosters (assetId,newDesiredLevel) = {
287305 let kBoughtLevel = keyVehicleBoostersLevel(assetId)
288306 let boughtBoosterLevel = tryGetInteger(kBoughtLevel)
289307 func accumulateBoosterPrices (accum,levelToPurchase) = if (if ((boughtBoosterLevel >= levelToPurchase))
290308 then true
291309 else (levelToPurchase > newDesiredLevel))
292310 then accum
293311 else {
294312 let boosterPrice = getBosterPriceForLevel(levelToPurchase)
295313 (accum + boosterPrice)
296314 }
297315
298316 let totalPrice = {
299317 let $l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
300318 let $s = size($l)
301319 let $acc0 = 0
302320 func $f0_1 ($a,$i) = if (($i >= $s))
303321 then $a
304322 else accumulateBoosterPrices($a, $l[$i])
305323
306324 func $f0_2 ($a,$i) = if (($i >= $s))
307325 then $a
308326 else throw("List size exceeds 11")
309327
310328 $f0_2($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)
311329 }
312330 let pmt = value(i.payments[0])
313331 let expectedAssetId = getBosterBuyAssetId()
314332 let vehicleDetails = valueOrElse(assetInfo(fromBase58String(assetId)), getDefaultVehicleAsset())
315333 if ((vehicleDetails.issuer != this))
316334 then throw("This asset is not a vehicle")
317335 else if ((contains(value(vehicleDetails.description), "[Vehicle]") == false))
318336 then throw("This asset is not a vehicle")
319337 else if ((boughtBoosterLevel >= newDesiredLevel))
320338 then throw("3BB: Booster was already bought")
321339 else if ((pmt.amount != totalPrice))
322340 then throw(("3BB: Bad price, it should be: " + toString(totalPrice)))
323341 else if ((pmt.assetId != expectedAssetId))
324342 then throw(("3BB: Bad payment attached, it should be: " + toBase58String(expectedAssetId)))
325343 else if ((assetId == ""))
326344 then mintVehicleInternal(getDefaultVehicleType(), i.caller, newDesiredLevel)
327345 else [IntegerEntry(kBoughtLevel, newDesiredLevel)]
328346 }
329347
330348
331349
332350 @Callable(i)
333351 func buyTickets () = {
334352 let kTicketsBought = keyTicketsBought(toString(i.caller))
335353 let ticketsBought = tryGetInteger(kTicketsBought)
336354 let pmt = i.payments[0]
355+ let pack10Price = getIntegerValue(this, "static_pack_10_price")
356+ let pack50Price = getIntegerValue(this, "static_pack_50_price")
357+ let pack100Price = getIntegerValue(this, "static_pack_100_price")
358+ let pack250Price = getIntegerValue(this, "static_pack_250_price")
337359 let expectedAssetId = getBosterBuyAssetId()
338- let newTicketsBought = (pmt.amount / 100000000)
360+ let newTicketsBought = if ((pmt.amount == pack10Price))
361+ then 10
362+ else if ((pmt.amount == pack50Price))
363+ then 50
364+ else if ((pmt.amount == pack100Price))
365+ then 50
366+ else if ((pmt.amount == pack250Price))
367+ then 50
368+ else (pmt.amount / 100000000)
339369 if ((pmt.assetId != expectedAssetId))
340370 then throw("3BC: Wrong asset attached")
341371 else [IntegerEntry(kTicketsBought, (ticketsBought + newTicketsBought))]
342372 }
343373
344374
345375
346376 @Callable(i)
347377 func buyAccessItemAndLockDuck () = {
348378 let eggPayment = value(i.payments[0])
349379 let duckPayment = value(i.payments[1])
350380 let addressStr = toString(i.caller)
351381 if ((eggPayment.assetId != getAccessItemAssetId()))
352382 then throw("3BAI: Wrong asset attached")
353383 else if ((eggPayment.amount != getAccessItemPrice()))
354384 then throw("3BAI: Wrong amount of assets attached")
355385 else {
356386 let accessItemData = asString(invoke(this, "buyAccessItemInternal", [addressStr], nil))
357387 if ((accessItemData == accessItemData))
358388 then {
359389 let lockData = lockDuckInternal(addressStr, duckPayment)
360390 $Tuple2(lockData, accessItemData)
361391 }
362392 else throw("Strict value is not equal to itself.")
363393 }
364394 }
365395
366396
367397
368398 @Callable(i)
369399 func buyAccessItem () = {
370400 let addressStr = toString(i.caller)
371401 let eggPayment = value(i.payments[0])
372402 if ((eggPayment.assetId != getAccessItemAssetId()))
373403 then throw("3BAI: Wrong asset attached")
374404 else if ((eggPayment.amount != getAccessItemPrice()))
375405 then throw("3BAI: Wrong amount of assets attached")
376406 else {
377407 let accessItemData = asString(invoke(this, "buyAccessItemInternal", [addressStr], nil))
378408 if ((accessItemData == accessItemData))
379409 then $Tuple2(nil, accessItemData)
380410 else throw("Strict value is not equal to itself.")
381411 }
382412 }
383413
384414
385415
386416 @Callable(i)
387417 func buyAccessItemOther (addressOther) = {
388418 let eggPayment = value(i.payments[0])
389419 if ((eggPayment.assetId != getAccessItemAssetId()))
390420 then throw("3BAI: Wrong asset attached")
391421 else if ((eggPayment.amount != getAccessItemPrice()))
392422 then throw("3BAI: Wrong amount of assets attached")
393423 else {
394424 let accessItemData = asString(invoke(this, "buyAccessItemInternal", [addressOther], nil))
395425 if ((accessItemData == accessItemData))
396426 then $Tuple2(nil, accessItemData)
397427 else throw("Strict value is not equal to itself.")
398428 }
399429 }
400430
401431
402432
403433 @Callable(i)
404434 func lockDuck () = {
405435 let addressStr = toString(i.caller)
406436 let duckPayment = value(i.payments[0])
407437 lockDuckInternal(addressStr, duckPayment)
408438 }
409439
410440
411441
412442 @Callable(i)
413443 func unlockDuckOther (assetIdStr) = if ((i.caller != this))
414444 then throw("3UDO: Admin only!")
415445 else {
416446 let ownerKey = tryGetString(keyDuckOwner(fromBase58String(assetIdStr)))
417447 unstakeDuck(assetIdStr, ownerKey)
418448 }
419449
420450
421451
422452 @Callable(i)
453+func mintLawnMowerForLegacyBoosters (address) = {
454+ let k = (("address_" + address) + "_boughtBoosterLevel")
455+ let currentLevel = tryGetInteger(k)
456+ if ((currentLevel == 0))
457+ then throw("There is no booster for the user")
458+ else (mintVehicleInternal("LawnMower", addressFromStringValue(address), currentLevel) ++ [DeleteEntry(k)])
459+ }
460+
461+
462+
463+@Callable(i)
464+func mintTruckWithBoosters (recipient,truckType,boostersLevel) = if ((i.caller != this))
465+ then throw("Only admin call mint trucks")
466+ else mintVehicleInternal(truckType, addressFromStringValue(recipient), boostersLevel)
467+
468+
469+
470+@Callable(i)
423471 func unlockDuck (assetIdStr) = {
424472 let addressStr = toString(i.caller)
425473 unstakeDuck(assetIdStr, addressStr)
426474 }
427475
428476

github/deemru/w8io/786bc32 
71.25 ms