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:
Old | New | Differences | |
---|---|---|---|
1 | - | {-# STDLIB_VERSION | |
1 | + | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | func tryGetInteger (key) = match getInteger(this, key) { | |
196 | 196 | } | |
197 | 197 | ||
198 | 198 | ||
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 | + | ||
199 | 215 | @Callable(i) | |
200 | 216 | func buyAccessItemInternal (addressStr) = if ((i.caller != this)) | |
201 | 217 | then throw("3BAII: internal use only") | |
216 | 232 | ||
217 | 233 | ||
218 | 234 | @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) | |
233 | 251 | ||
234 | 252 | ||
235 | 253 | ||
334 | 352 | let kTicketsBought = keyTicketsBought(toString(i.caller)) | |
335 | 353 | let ticketsBought = tryGetInteger(kTicketsBought) | |
336 | 354 | 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") | |
337 | 359 | 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) | |
339 | 369 | if ((pmt.assetId != expectedAssetId)) | |
340 | 370 | then throw("3BC: Wrong asset attached") | |
341 | 371 | else [IntegerEntry(kTicketsBought, (ticketsBought + newTicketsBought))] | |
420 | 450 | ||
421 | 451 | ||
422 | 452 | @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) | |
423 | 471 | func unlockDuck (assetIdStr) = { | |
424 | 472 | let addressStr = toString(i.caller) | |
425 | 473 | unstakeDuck(assetIdStr, addressStr) |
Old | New | Differences | |
---|---|---|---|
1 | - | {-# STDLIB_VERSION | |
1 | + | {-# STDLIB_VERSION 6 #-} | |
2 | 2 | {-# SCRIPT_TYPE ACCOUNT #-} | |
3 | 3 | {-# CONTENT_TYPE DAPP #-} | |
4 | 4 | func tryGetInteger (key) = match getInteger(this, key) { | |
5 | 5 | case b: Int => | |
6 | 6 | b | |
7 | 7 | case _ => | |
8 | 8 | 0 | |
9 | 9 | } | |
10 | 10 | ||
11 | 11 | ||
12 | 12 | func keyDuckUnlockTime (assetId) = (("duck_" + toBase58String(assetId)) + "_unlockTime") | |
13 | 13 | ||
14 | 14 | ||
15 | 15 | func keyDuckOwner (assetId) = (("duck_" + toBase58String(assetId)) + "_owner") | |
16 | 16 | ||
17 | 17 | ||
18 | 18 | func keyVehicleBoostersLevel (assetId) = (("vehicle_" + assetId) + "_boostersLevel") | |
19 | 19 | ||
20 | 20 | ||
21 | 21 | func keySpotsBought (addressStr) = (("address_" + addressStr) + "_spotsBought") | |
22 | 22 | ||
23 | 23 | ||
24 | 24 | func keyTicketsBought (addressStr) = (("address_" + addressStr) + "_ticketsBought") | |
25 | 25 | ||
26 | 26 | ||
27 | 27 | func keyVehicleTypePrice (name) = (("vehicleType_" + name) + "_price") | |
28 | 28 | ||
29 | 29 | ||
30 | 30 | func keySpotsBusy (addressStr) = (("address_" + addressStr) + "_spotsBusy") | |
31 | 31 | ||
32 | 32 | ||
33 | 33 | func keyLockedDuckStatus (addressStr,assetIdStr) = (((("address_" + addressStr) + "_lockedDuck_") + assetIdStr) + "_status") | |
34 | 34 | ||
35 | 35 | ||
36 | 36 | func getDuckDetails (assetId) = { | |
37 | 37 | let assetName = value(value(assetInfo(assetId)).name) | |
38 | 38 | let assetNameParts = split(assetName, "") | |
39 | 39 | let isJackpot = (assetNameParts[(size(assetNameParts) - 2)] == "J") | |
40 | 40 | let assetColor = if (isJackpot) | |
41 | 41 | then "B" | |
42 | 42 | else assetNameParts[(size(assetNameParts) - 1)] | |
43 | 43 | $Tuple2(assetColor, isJackpot) | |
44 | 44 | } | |
45 | 45 | ||
46 | 46 | ||
47 | 47 | func tryGetStringExternal (address,key) = match getString(address, key) { | |
48 | 48 | case a: String => | |
49 | 49 | a | |
50 | 50 | case _ => | |
51 | 51 | "" | |
52 | 52 | } | |
53 | 53 | ||
54 | 54 | ||
55 | 55 | func tryGetString (key) = tryGetStringExternal(this, key) | |
56 | 56 | ||
57 | 57 | ||
58 | 58 | func getOracle () = Address(fromBase58String(tryGetString("static_oracleAddress"))) | |
59 | 59 | ||
60 | 60 | ||
61 | 61 | func getGameName () = valueOrErrorMessage(getString("static_shortGameName"), "3GGN: There is no game name defined!") | |
62 | 62 | ||
63 | 63 | ||
64 | 64 | func getLongGameName () = valueOrErrorMessage(getString("static_longGameName"), "3GLGN: There is no long game name defined!") | |
65 | 65 | ||
66 | 66 | ||
67 | 67 | func getNFTName () = valueOrErrorMessage(getString("static_nftName"), "3GNN: There is no nft name defined!") | |
68 | 68 | ||
69 | 69 | ||
70 | 70 | func getIncubatorAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_incubatorAddress"))) | |
71 | 71 | ||
72 | 72 | ||
73 | 73 | func getBreederAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_breederAddress"))) | |
74 | 74 | ||
75 | 75 | ||
76 | 76 | func getFarmingAddress () = Address(fromBase58String(tryGetStringExternal(getOracle(), "static_farmingAddress"))) | |
77 | 77 | ||
78 | 78 | ||
79 | 79 | func getEggAssetId () = fromBase58String(tryGetStringExternal(getOracle(), "static_eggAssetId")) | |
80 | 80 | ||
81 | 81 | ||
82 | 82 | func getAccessItemAssetId () = fromBase58String(tryGetString("static_accessItemAssetId")) | |
83 | 83 | ||
84 | 84 | ||
85 | 85 | func getAccessItemPrice () = tryGetInteger("static_accessItemPrice") | |
86 | 86 | ||
87 | 87 | ||
88 | 88 | func getMinLockDuration () = tryGetInteger("static_minLockDuration") | |
89 | 89 | ||
90 | 90 | ||
91 | 91 | func getDefaultVehicleType () = tryGetString("static_defaultVehicleType") | |
92 | 92 | ||
93 | 93 | ||
94 | 94 | func getBosterBuyAssetId () = fromBase58String(tryGetString("static_boosterBuyAssetId")) | |
95 | 95 | ||
96 | 96 | ||
97 | 97 | func getBosterPriceForLevel (level) = valueOrErrorMessage(getInteger(("static_boosterPriceLevel_" + toString(level))), "3GBPFL: There is no price value for this level of booster") | |
98 | 98 | ||
99 | 99 | ||
100 | 100 | func getBosterNameForLevel (level) = valueOrErrorMessage(getString(("static_boosterName_" + toString(level))), "3GBNFL: There is no such booster") | |
101 | 101 | ||
102 | 102 | ||
103 | 103 | func asString (value) = match value { | |
104 | 104 | case string: String => | |
105 | 105 | string | |
106 | 106 | case _ => | |
107 | 107 | throw("3AS: wrong type, expected: String") | |
108 | 108 | } | |
109 | 109 | ||
110 | 110 | ||
111 | 111 | func getDefaultVehicleAsset () = Asset(base58'1', 1, 0, this, base58'1', false, false, unit, getDefaultVehicleType(), ("[Vehicle] " + getDefaultVehicleType())) | |
112 | 112 | ||
113 | 113 | ||
114 | 114 | func lockDuckInternal (addressStr,pmt) = { | |
115 | 115 | let assetId = value(pmt.assetId) | |
116 | 116 | let assetIssuer = value(assetInfo(assetId)).issuer | |
117 | 117 | let tDuckDetails = getDuckDetails(assetId) | |
118 | 118 | let assetColor = tDuckDetails._1 | |
119 | 119 | let isJackpot = tDuckDetails._2 | |
120 | 120 | let kSpotsBusy = keySpotsBusy(addressStr) | |
121 | 121 | let spotsBusy = tryGetInteger(kSpotsBusy) | |
122 | 122 | let kSpotsBought = keySpotsBought(addressStr) | |
123 | 123 | let addressSpotsAvailable = (tryGetInteger(kSpotsBought) - spotsBusy) | |
124 | 124 | if ((pmt.amount != 1)) | |
125 | 125 | then throw("NFT is not attached") | |
126 | 126 | else if (if ((assetIssuer != getIncubatorAddress())) | |
127 | 127 | then (assetIssuer != getBreederAddress()) | |
128 | 128 | else false) | |
129 | 129 | then throw("ivalid NFT attached") | |
130 | 130 | else if ((0 >= addressSpotsAvailable)) | |
131 | 131 | then throw("No spots available") | |
132 | 132 | else { | |
133 | 133 | let kPerchesAvailable = ((("address_" + toString(this)) + "_perchesAvailable_") + assetColor) | |
134 | 134 | let perchesAvailable = match getInteger(getFarmingAddress(), kPerchesAvailable) { | |
135 | 135 | case b: Int => | |
136 | 136 | b | |
137 | 137 | case _ => | |
138 | 138 | 0 | |
139 | 139 | } | |
140 | 140 | if ((perchesAvailable == perchesAvailable)) | |
141 | 141 | then { | |
142 | 142 | let eggAssetId = getEggAssetId() | |
143 | 143 | let inv1 = if ((perchesAvailable > 0)) | |
144 | 144 | then unit | |
145 | 145 | else invoke(getFarmingAddress(), "buyPerch", [assetColor, ""], [AttachedPayment(eggAssetId, 100000000)]) | |
146 | 146 | if ((inv1 == inv1)) | |
147 | 147 | then { | |
148 | 148 | let inv2 = if ((isJackpot == false)) | |
149 | 149 | then invoke(getFarmingAddress(), "stakeNFT", nil, [AttachedPayment(assetId, 1)]) | |
150 | 150 | else invoke(getFarmingAddress(), "stakeJackpot", [assetColor], [AttachedPayment(assetId, 1)]) | |
151 | 151 | if ((inv2 == inv2)) | |
152 | 152 | then [IntegerEntry(kSpotsBusy, (spotsBusy + 1)), StringEntry(keyDuckOwner(assetId), addressStr), BooleanEntry(keyLockedDuckStatus(addressStr, toBase58String(assetId)), true), IntegerEntry(keyDuckUnlockTime(assetId), (lastBlock.timestamp + getMinLockDuration()))] | |
153 | 153 | else throw("Strict value is not equal to itself.") | |
154 | 154 | } | |
155 | 155 | else throw("Strict value is not equal to itself.") | |
156 | 156 | } | |
157 | 157 | else throw("Strict value is not equal to itself.") | |
158 | 158 | } | |
159 | 159 | } | |
160 | 160 | ||
161 | 161 | ||
162 | 162 | func unstakeDuck (assetIdStr,addressStr) = { | |
163 | 163 | let assetId = fromBase58String(assetIdStr) | |
164 | 164 | let tDuckDetails = getDuckDetails(assetId) | |
165 | 165 | let assetColor = tDuckDetails._1 | |
166 | 166 | let isJackpot = tDuckDetails._2 | |
167 | 167 | let kSpotsBusy = keySpotsBusy(addressStr) | |
168 | 168 | let kDuckOwner = keyDuckOwner(assetId) | |
169 | 169 | let remainingForUnlock = (tryGetInteger(keyDuckUnlockTime(assetId)) - lastBlock.timestamp) | |
170 | 170 | if ((tryGetString(kDuckOwner) != addressStr)) | |
171 | 171 | then throw("3UL: The duck is not yours") | |
172 | 172 | else if ((remainingForUnlock > 0)) | |
173 | 173 | then throw((("3UL: You need to wait to unlock " + toString((remainingForUnlock / 1000))) + " seconds")) | |
174 | 174 | else { | |
175 | 175 | let unstakeFuncName = if ((isJackpot == true)) | |
176 | 176 | then "unstakeJackpot" | |
177 | 177 | else "unstakeNFT" | |
178 | 178 | let inv1 = invoke(getFarmingAddress(), unstakeFuncName, [assetIdStr], nil) | |
179 | 179 | if ((inv1 == inv1)) | |
180 | 180 | then [ScriptTransfer(Address(fromBase58String(addressStr)), 1, assetId), DeleteEntry(keyLockedDuckStatus(addressStr, assetIdStr)), DeleteEntry(kDuckOwner), IntegerEntry(kSpotsBusy, (tryGetInteger(kSpotsBusy) - 1))] | |
181 | 181 | else throw("Strict value is not equal to itself.") | |
182 | 182 | } | |
183 | 183 | } | |
184 | 184 | ||
185 | 185 | ||
186 | 186 | func getVehicleName (type) = getStringValue(this, (("static_vehicle_" + type) + "_name")) | |
187 | 187 | ||
188 | 188 | ||
189 | 189 | func getVehiclePrice (type) = tryGetInteger((("static_vehicle_" + type) + "_price")) | |
190 | 190 | ||
191 | 191 | ||
192 | 192 | func mintVehicleInternal (type,recipient,boostersLevel) = { | |
193 | 193 | let vehicleItem = Issue(type, (("[Vehicle] " + type) + " vehicle for the Metarace game. https://metarace.com"), 1, 0, false) | |
194 | 194 | let vehicleItemAssetId = calculateAssetId(vehicleItem) | |
195 | 195 | [vehicleItem, IntegerEntry(keyVehicleBoostersLevel(toBase58String(vehicleItemAssetId)), boostersLevel), ScriptTransfer(recipient, 1, vehicleItemAssetId)] | |
196 | 196 | } | |
197 | 197 | ||
198 | 198 | ||
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 | + | ||
199 | 215 | @Callable(i) | |
200 | 216 | func buyAccessItemInternal (addressStr) = if ((i.caller != this)) | |
201 | 217 | then throw("3BAII: internal use only") | |
202 | 218 | else { | |
203 | 219 | let issueAccessItem = Issue(("ACCESS-" + getGameName()), ((("[Access] " + getLongGameName()) + " access NFT for ") + getNFTName()), 1, 0, false) | |
204 | 220 | let accessRaceAssetId = toBase58String(calculateAssetId(issueAccessItem)) | |
205 | 221 | let kSpotsBought = keySpotsBought(addressStr) | |
206 | 222 | $Tuple2([issueAccessItem, StringEntry((("accessItem_" + accessRaceAssetId) + "_owner"), addressStr), StringEntry((("address_" + addressStr) + "_owning"), accessRaceAssetId), IntegerEntry(kSpotsBought, (tryGetInteger(kSpotsBought) + 1))], accessRaceAssetId) | |
207 | 223 | } | |
208 | 224 | ||
209 | 225 | ||
210 | 226 | ||
211 | 227 | @Callable(i) | |
212 | 228 | func configureOracle (oracle,shortname,longname,nftName) = if ((i.caller != this)) | |
213 | 229 | then throw("3CO: admin only") | |
214 | 230 | else [StringEntry("static_oracleAddress", oracle), StringEntry("static_shortGameName", shortname), StringEntry("static_longGameName", longname), StringEntry("static_nftName", nftName)] | |
215 | 231 | ||
216 | 232 | ||
217 | 233 | ||
218 | 234 | @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) | |
233 | 251 | ||
234 | 252 | ||
235 | 253 | ||
236 | 254 | @Callable(i) | |
237 | 255 | func deleteSetting (key) = if ((i.caller != this)) | |
238 | 256 | then throw("3DS: Only administrator can call this method") | |
239 | 257 | else [DeleteEntry(key)] | |
240 | 258 | ||
241 | 259 | ||
242 | 260 | ||
243 | 261 | @Callable(i) | |
244 | 262 | func buyVehicle (typeName) = { | |
245 | 263 | let price = getVehiclePrice(typeName) | |
246 | 264 | let pmt = value(i.payments[0]) | |
247 | 265 | let expectedAssetId = getBosterBuyAssetId() | |
248 | 266 | if ((price == 0)) | |
249 | 267 | then throw("There is no such vehicle type") | |
250 | 268 | else if ((pmt.amount != price)) | |
251 | 269 | then throw(("3BB: Bad price, it should be: " + toString(price))) | |
252 | 270 | else if ((pmt.assetId != expectedAssetId)) | |
253 | 271 | then throw(("3BB: Bad payment attached, it should be $RACE token with asset id: " + toBase58String(expectedAssetId))) | |
254 | 272 | else mintVehicleInternal(typeName, i.caller, 0) | |
255 | 273 | } | |
256 | 274 | ||
257 | 275 | ||
258 | 276 | ||
259 | 277 | @Callable(i) | |
260 | 278 | func buyBooster (assetId) = { | |
261 | 279 | let kBoughtLevel = keyVehicleBoostersLevel(assetId) | |
262 | 280 | let boughtBoosterLevel = tryGetInteger(kBoughtLevel) | |
263 | 281 | let newLevel = (boughtBoosterLevel + 1) | |
264 | 282 | let pmt = value(i.payments[0]) | |
265 | 283 | let price = getBosterPriceForLevel(newLevel) | |
266 | 284 | let expectedAssetId = getBosterBuyAssetId() | |
267 | 285 | let vehicleDetails = valueOrElse(assetInfo(fromBase58String(assetId)), getDefaultVehicleAsset()) | |
268 | 286 | if ((vehicleDetails.issuer != this)) | |
269 | 287 | then throw("This asset is not a vehicle") | |
270 | 288 | else if ((contains(value(vehicleDetails.description), "[Vehicle]") == false)) | |
271 | 289 | then throw("This asset is not a vehicle") | |
272 | 290 | else if (if ((pmt.amount != price)) | |
273 | 291 | then true | |
274 | 292 | else (price == 0)) | |
275 | 293 | then throw(("3BB: Bad price, it should be: " + toString(price))) | |
276 | 294 | else if ((pmt.assetId != expectedAssetId)) | |
277 | 295 | then throw(("3BB: Bad payment attached, it should be: " + toBase58String(expectedAssetId))) | |
278 | 296 | else if ((assetId == "")) | |
279 | 297 | then mintVehicleInternal(getDefaultVehicleType(), i.caller, 1) | |
280 | 298 | else [IntegerEntry(kBoughtLevel, newLevel)] | |
281 | 299 | } | |
282 | 300 | ||
283 | 301 | ||
284 | 302 | ||
285 | 303 | @Callable(i) | |
286 | 304 | func buyManyBoosters (assetId,newDesiredLevel) = { | |
287 | 305 | let kBoughtLevel = keyVehicleBoostersLevel(assetId) | |
288 | 306 | let boughtBoosterLevel = tryGetInteger(kBoughtLevel) | |
289 | 307 | func accumulateBoosterPrices (accum,levelToPurchase) = if (if ((boughtBoosterLevel >= levelToPurchase)) | |
290 | 308 | then true | |
291 | 309 | else (levelToPurchase > newDesiredLevel)) | |
292 | 310 | then accum | |
293 | 311 | else { | |
294 | 312 | let boosterPrice = getBosterPriceForLevel(levelToPurchase) | |
295 | 313 | (accum + boosterPrice) | |
296 | 314 | } | |
297 | 315 | ||
298 | 316 | let totalPrice = { | |
299 | 317 | let $l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] | |
300 | 318 | let $s = size($l) | |
301 | 319 | let $acc0 = 0 | |
302 | 320 | func $f0_1 ($a,$i) = if (($i >= $s)) | |
303 | 321 | then $a | |
304 | 322 | else accumulateBoosterPrices($a, $l[$i]) | |
305 | 323 | ||
306 | 324 | func $f0_2 ($a,$i) = if (($i >= $s)) | |
307 | 325 | then $a | |
308 | 326 | else throw("List size exceeds 11") | |
309 | 327 | ||
310 | 328 | $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) | |
311 | 329 | } | |
312 | 330 | let pmt = value(i.payments[0]) | |
313 | 331 | let expectedAssetId = getBosterBuyAssetId() | |
314 | 332 | let vehicleDetails = valueOrElse(assetInfo(fromBase58String(assetId)), getDefaultVehicleAsset()) | |
315 | 333 | if ((vehicleDetails.issuer != this)) | |
316 | 334 | then throw("This asset is not a vehicle") | |
317 | 335 | else if ((contains(value(vehicleDetails.description), "[Vehicle]") == false)) | |
318 | 336 | then throw("This asset is not a vehicle") | |
319 | 337 | else if ((boughtBoosterLevel >= newDesiredLevel)) | |
320 | 338 | then throw("3BB: Booster was already bought") | |
321 | 339 | else if ((pmt.amount != totalPrice)) | |
322 | 340 | then throw(("3BB: Bad price, it should be: " + toString(totalPrice))) | |
323 | 341 | else if ((pmt.assetId != expectedAssetId)) | |
324 | 342 | then throw(("3BB: Bad payment attached, it should be: " + toBase58String(expectedAssetId))) | |
325 | 343 | else if ((assetId == "")) | |
326 | 344 | then mintVehicleInternal(getDefaultVehicleType(), i.caller, newDesiredLevel) | |
327 | 345 | else [IntegerEntry(kBoughtLevel, newDesiredLevel)] | |
328 | 346 | } | |
329 | 347 | ||
330 | 348 | ||
331 | 349 | ||
332 | 350 | @Callable(i) | |
333 | 351 | func buyTickets () = { | |
334 | 352 | let kTicketsBought = keyTicketsBought(toString(i.caller)) | |
335 | 353 | let ticketsBought = tryGetInteger(kTicketsBought) | |
336 | 354 | 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") | |
337 | 359 | 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) | |
339 | 369 | if ((pmt.assetId != expectedAssetId)) | |
340 | 370 | then throw("3BC: Wrong asset attached") | |
341 | 371 | else [IntegerEntry(kTicketsBought, (ticketsBought + newTicketsBought))] | |
342 | 372 | } | |
343 | 373 | ||
344 | 374 | ||
345 | 375 | ||
346 | 376 | @Callable(i) | |
347 | 377 | func buyAccessItemAndLockDuck () = { | |
348 | 378 | let eggPayment = value(i.payments[0]) | |
349 | 379 | let duckPayment = value(i.payments[1]) | |
350 | 380 | let addressStr = toString(i.caller) | |
351 | 381 | if ((eggPayment.assetId != getAccessItemAssetId())) | |
352 | 382 | then throw("3BAI: Wrong asset attached") | |
353 | 383 | else if ((eggPayment.amount != getAccessItemPrice())) | |
354 | 384 | then throw("3BAI: Wrong amount of assets attached") | |
355 | 385 | else { | |
356 | 386 | let accessItemData = asString(invoke(this, "buyAccessItemInternal", [addressStr], nil)) | |
357 | 387 | if ((accessItemData == accessItemData)) | |
358 | 388 | then { | |
359 | 389 | let lockData = lockDuckInternal(addressStr, duckPayment) | |
360 | 390 | $Tuple2(lockData, accessItemData) | |
361 | 391 | } | |
362 | 392 | else throw("Strict value is not equal to itself.") | |
363 | 393 | } | |
364 | 394 | } | |
365 | 395 | ||
366 | 396 | ||
367 | 397 | ||
368 | 398 | @Callable(i) | |
369 | 399 | func buyAccessItem () = { | |
370 | 400 | let addressStr = toString(i.caller) | |
371 | 401 | let eggPayment = value(i.payments[0]) | |
372 | 402 | if ((eggPayment.assetId != getAccessItemAssetId())) | |
373 | 403 | then throw("3BAI: Wrong asset attached") | |
374 | 404 | else if ((eggPayment.amount != getAccessItemPrice())) | |
375 | 405 | then throw("3BAI: Wrong amount of assets attached") | |
376 | 406 | else { | |
377 | 407 | let accessItemData = asString(invoke(this, "buyAccessItemInternal", [addressStr], nil)) | |
378 | 408 | if ((accessItemData == accessItemData)) | |
379 | 409 | then $Tuple2(nil, accessItemData) | |
380 | 410 | else throw("Strict value is not equal to itself.") | |
381 | 411 | } | |
382 | 412 | } | |
383 | 413 | ||
384 | 414 | ||
385 | 415 | ||
386 | 416 | @Callable(i) | |
387 | 417 | func buyAccessItemOther (addressOther) = { | |
388 | 418 | let eggPayment = value(i.payments[0]) | |
389 | 419 | if ((eggPayment.assetId != getAccessItemAssetId())) | |
390 | 420 | then throw("3BAI: Wrong asset attached") | |
391 | 421 | else if ((eggPayment.amount != getAccessItemPrice())) | |
392 | 422 | then throw("3BAI: Wrong amount of assets attached") | |
393 | 423 | else { | |
394 | 424 | let accessItemData = asString(invoke(this, "buyAccessItemInternal", [addressOther], nil)) | |
395 | 425 | if ((accessItemData == accessItemData)) | |
396 | 426 | then $Tuple2(nil, accessItemData) | |
397 | 427 | else throw("Strict value is not equal to itself.") | |
398 | 428 | } | |
399 | 429 | } | |
400 | 430 | ||
401 | 431 | ||
402 | 432 | ||
403 | 433 | @Callable(i) | |
404 | 434 | func lockDuck () = { | |
405 | 435 | let addressStr = toString(i.caller) | |
406 | 436 | let duckPayment = value(i.payments[0]) | |
407 | 437 | lockDuckInternal(addressStr, duckPayment) | |
408 | 438 | } | |
409 | 439 | ||
410 | 440 | ||
411 | 441 | ||
412 | 442 | @Callable(i) | |
413 | 443 | func unlockDuckOther (assetIdStr) = if ((i.caller != this)) | |
414 | 444 | then throw("3UDO: Admin only!") | |
415 | 445 | else { | |
416 | 446 | let ownerKey = tryGetString(keyDuckOwner(fromBase58String(assetIdStr))) | |
417 | 447 | unstakeDuck(assetIdStr, ownerKey) | |
418 | 448 | } | |
419 | 449 | ||
420 | 450 | ||
421 | 451 | ||
422 | 452 | @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) | |
423 | 471 | func unlockDuck (assetIdStr) = { | |
424 | 472 | let addressStr = toString(i.caller) | |
425 | 473 | unstakeDuck(assetIdStr, addressStr) | |
426 | 474 | } | |
427 | 475 | ||
428 | 476 |
github/deemru/w8io/786bc32 71.25 ms ◑