tx · DQ9ByJxk7nao3tceAMGQAbW7ZD9B5eTTEBempsLqTL4w

3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm:  -0.01100000 Waves

2022.12.09 21:52 [2353174] smart account 3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm > SELF 0.00000000 Waves

{ "type": 13, "id": "DQ9ByJxk7nao3tceAMGQAbW7ZD9B5eTTEBempsLqTL4w", "fee": 1100000, "feeAssetId": null, "timestamp": 1670611956696, "version": 2, "chainId": 84, "sender": "3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm", "senderPublicKey": "EVooykMNV691Venwp1dHUTBd7KWequzUcda57Wd3LQEX", "proofs": [ "5H2NsK8LYhg9H4FNnVMWP89RjRCxBL4aitZdtMiYen3pxDgd9FyBU9qrTH9ro81BpZZCtknxremRA34H3NcYZQb5" ], "script": "base64:BgIoCAISABIDCgEIEgASAwoBCBIECgIBCBIECgICAhIECgIBCBIECgIICCkAC3VzZG5Bc3NldElkASD3dur394PKZdtuE+4CO89YKZWpwdGN8kvabNgdYoDI3gANaW5jdWJhdG9yQWRkcgUEdGhpcwALYnJlZWRlckFkZHIFBHRoaXMAC2JhY2tFbmRBZGRyCQERQGV4dHJOYXRpdmUoMTA2MikBAiMzTjVTcFgyMVIzUjc1UW80ZWIzTXdGRnZXN1RVenlodmF2dgALZWNvbm9teUFkZHIJARFAZXh0ck5hdGl2ZSgxMDYyKQECIzNOOHk0d3hYM0pDNFRkckNKQlhYMTZTaldmNlgyNTZocmVwAANwdWIBIE9T4ho/VKjWnVJOEx1GJ1W9s1PzLHvJVFSw/0PBtBQoAApMQU5EUFJFRklYAgRMQU5EAApEVUNLUFJFRklYAgREVUNLAA9ERUZBVUxUTE9DQVRJT04CD0FmcmljYV9GX0FmcmljYQAPREFJTFlSRVNCWVBJRUNFAID40gEACURBWU1JTExJUwCAuJkpABFGSVZFTUlOVVRFU01JTExJUwDgpxIBEWtleUFzc2V0SWRUb093bmVyAQdhc3NldElkCQCsAgICCW5mdE93bmVyXwUHYXNzZXRJZAEQa2V5RHVja0lkVG9Pd25lcgEHYXNzZXRJZAkArAICAgpkdWNrT3duZXJfBQdhc3NldElkARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQdhc3NldElkCQCsAgICC3N0YWtlZFRpbWVfBQdhc3NldElkARRrZXlTdGFrZWREdWNrQnlPd25lcgEJb3duZXJBZGRyCQCsAgICEnN0YWtlZER1Y2tCeU93bmVyXwUJb3duZXJBZGRyASJrZXlTdGFrZWRUaW1lQnlUeXBlQXNzZXRJZEFuZE93bmVyAwduZnRUeXBlB2Fzc2V0SWQJb3duZXJBZGRyCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIgc3Rha2VkVGltZUJ5VHlwZUFzc2V0SWRBbmRPd25lcl8FB25mdFR5cGUCAV8FB2Fzc2V0SWQCAV8FCW93bmVyQWRkcgEOa2V5TGFuZFRvT3duZXIBB2xhbmROdW0JAKwCAgIKbGFuZE93bmVyXwUHbGFuZE51bQERa2V5QmFja3BhY2tCeUR1Y2sBC2R1Y2tBc3NldElkCQCsAgICCWJhY2tQYWNrXwULZHVja0Fzc2V0SWQBD2tleUR1Y2tMb2NhdGlvbgELZHVja0Fzc2V0SWQJAKwCAgINZHVja0xvY2F0aW9uXwULZHVja0Fzc2V0SWQBDWtleUR1Y2tIZWFsdGgBC2R1Y2tBc3NldElkCQCsAgICC2R1Y2tIZWFsdGhfBQtkdWNrQXNzZXRJZAAKcmVjTGFuZE51bQAAAAtyZWNMYW5kU2l6ZQABAAtyZWNUZXJyYWlucwACAAxyZWNDb250aW5lbnQAAwAPbG9jSWR4Q29udGluZW50AAAACmxvY0lkeFR5cGUAAQAIbG9jSWR4SWQAAgAKYnBJZHhMZXZlbAAAAAhicElkeFJlcwABAAhicElkeE1hdAACAAlicElkeFByb2QAAwAEaWR4QQAAAARpZHhCAAEABGlkeEMAAgAEaWR4RAADAARpZHhFAAQABGlkeEYABQENY291bnRUZXJyYWlucwEIdGVycmFpbnMJAMwIAgkAZQIJAJADAQkAtQkCBQh0ZXJyYWlucwIBQQABCQDMCAIJAGUCCQCQAwEJALUJAgUIdGVycmFpbnMCAUIAAQkAzAgCCQBlAgkAkAMBCQC1CQIFCHRlcnJhaW5zAgFDAAEJAMwIAgkAZQIJAJADAQkAtQkCBQh0ZXJyYWlucwIBRAABCQDMCAIJAGUCCQCQAwEJALUJAgUIdGVycmFpbnMCAUUAAQkAzAgCCQBlAgkAkAMBCQC1CQIFCHRlcnJhaW5zAgFGAAEFA25pbAEPbnVtUGllY2VzQnlTaXplAQhsYW5kU2l6ZQQHJG1hdGNoMAUIbGFuZFNpemUDCQAAAgIBUwUHJG1hdGNoMAAZAwkAAAICAU0FByRtYXRjaDAAZAMJAAACAgFMBQckbWF0Y2gwAOEBAwkAAAICAlhMBQckbWF0Y2gwAJADAwkAAAICA1hYTAUHJG1hdGNoMADxBAkAAgECEVVua25vd24gbGFuZCBzaXplAQZhZGRSZXMDCmN1cnJlbnRSZXMNdGVycmFpbkNvdW50cwlkZWx0YVRpbWUKAQVhZGRlcgIDYWNjAWkECXJlc09mVHlwZQkAaAIJAGsDBQlkZWx0YVRpbWUFD0RBSUxZUkVTQllQSUVDRQUJREFZTUlMTElTCQCRAwIFDXRlcnJhaW5Db3VudHMFAWkJAM0IAgUDYWNjCQCkAwEJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUKY3VycmVudFJlcwUBaQUJcmVzT2ZUeXBlBAFyCgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEFYWRkZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYJALkJAgUBcgIBXwgBaQEJc3Rha2VMYW5kAAQDcG10CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEB2Fzc2V0SWQJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIDCQECIT0CCAUDcG10BmFtb3VudAABCQACAQkArAICCQCsAgICBE5GVCAFCkxBTkRQUkVGSVgCJCB0b2tlbiBzaG91bGQgYmUgYXR0YWNoZWQgYXMgcGF5bWVudAQFYXNzZXQJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZAMJAQIhPQIIBQVhc3NldAZpc3N1ZXIFBHRoaXMJAAIBAhdVbmtub3duIGlzc3VlciBvZiB0b2tlbgMJAQEhAQkBCGNvbnRhaW5zAggFBWFzc2V0BG5hbWUFCkxBTkRQUkVGSVgJAAIBCQCsAgIJAKwCAgIJT25seSBORlQgBQpMQU5EUFJFRklYAhQgdG9rZW5zIGFyZSBhY2NlcHRlZAQLbGFuZE51bVNpemUJALACAggFBWFzc2V0BG5hbWUABAQHbGFuZE51bQMJAQhjb250YWlucwIFC2xhbmROdW1TaXplAgNYWEwJALMCAgULbGFuZE51bVNpemUAAwMJAQhjb250YWlucwIFC2xhbmROdW1TaXplAgJYTAkAswICBQtsYW5kTnVtU2l6ZQACCQCzAgIFC2xhbmROdW1TaXplAAEDCQEBIQEJAQlpc0RlZmluZWQBCQC2CQEFB2xhbmROdW0JAAIBCQCsAgICHkNhbm5vdCBwYXJzZSBsYW5kIG51bWJlciBmcm9tIAgFBWFzc2V0BG5hbWUEB3RpbWVLZXkJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQkA2AQBBQdhc3NldElkAwkBCWlzRGVmaW5lZAEJAJ8IAQUHdGltZUtleQkAAgEJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQISIGlzIGFscmVhZHkgc3Rha2VkCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQd0aW1lS2V5CAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBImtleVN0YWtlZFRpbWVCeVR5cGVBc3NldElkQW5kT3duZXIDBQpMQU5EUFJFRklYCQDYBAEFB2Fzc2V0SWQFB2FkZHJlc3MIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQtTdHJpbmdFbnRyeQIJARFrZXlBc3NldElkVG9Pd25lcgEJANgEAQUHYXNzZXRJZAUHYWRkcmVzcwkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5TGFuZFRvT3duZXIBBQdsYW5kTnVtBQdhZGRyZXNzBQNuaWwBaQELdW5zdGFrZUxhbmQBC2xhbmRBc3NldElkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIkdW5zdGFrZSBkb2Vzbid0IHJlcXVpcmUgYW55IHBheW1lbnRzBAdhc3NldElkCQDZBAEFC2xhbmRBc3NldElkBAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgQFYXNzZXQJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZAMJAQIhPQIIBQVhc3NldAZpc3N1ZXIFBHRoaXMJAAIBAhdVbmtub3duIGlzc3VlciBvZiB0b2tlbgMJAQEhAQkBCGNvbnRhaW5zAggFBWFzc2V0BG5hbWUFCkxBTkRQUkVGSVgJAAIBCQCsAgIJAKwCAgIJT25seSBORlQgBQpMQU5EUFJFRklYAhcgdG9rZW5zIGNhbiBiZSB1bnN0YWtlZAQHdGltZUtleQkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEFB3RpbWVLZXkJAAIBCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkBAVvd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARFrZXlBc3NldElkVG9Pd25lcgEFC2xhbmRBc3NldElkCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDCBpcyBvcnBoYW5lZAMJAQIhPQIFBW93bmVyBQdhZGRyZXNzCQACAQIXU3Rha2VkIE5GVCBpcyBub3QgeW91cnMJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyAAEFB2Fzc2V0SWQJAMwIAgkBC0RlbGV0ZUVudHJ5AQUHdGltZUtleQkAzAgCCQELRGVsZXRlRW50cnkBCQEia2V5U3Rha2VkVGltZUJ5VHlwZUFzc2V0SWRBbmRPd25lcgMFCkxBTkRQUkVGSVgFC2xhbmRBc3NldElkBQdhZGRyZXNzBQNuaWwBaQEJc3Rha2VEdWNrAAQDcG10CQEFdmFsdWUBCQCRAwIIBQFpCHBheW1lbnRzAAAEB2Fzc2V0SWQJAQV2YWx1ZQEIBQNwbXQHYXNzZXRJZAQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIDCQECIT0CCAUDcG10BmFtb3VudAABCQACAQkArAICCQCsAgICBE5GVCAFCkRVQ0tQUkVGSVgCJCB0b2tlbiBzaG91bGQgYmUgYXR0YWNoZWQgYXMgcGF5bWVudAQFYXNzZXQJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZAMDCQECIT0CCAUFYXNzZXQGaXNzdWVyBQ1pbmN1YmF0b3JBZGRyCQECIT0CCAUFYXNzZXQGaXNzdWVyBQticmVlZGVyQWRkcgcJAAIBCQCsAgIJAKwCAgISVW5rbm93biBpc3N1ZXIgb2YgBQpEVUNLUFJFRklYAgYgdG9rZW4DCQEBIQEJAQhjb250YWlucwIIBQVhc3NldARuYW1lBQpEVUNLUFJFRklYCQACAQkArAICCQCsAgICCU9ubHkgTkZUIAUKRFVDS1BSRUZJWAIUIHRva2VucyBhcmUgYWNjZXB0ZWQECmFzc2V0SWRTdHIJANgEAQUHYXNzZXRJZAQHdGltZUtleQkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQphc3NldElkU3RyAwkBCWlzRGVmaW5lZAEJAJ8IAQUHdGltZUtleQkAAgEJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQISIGlzIGFscmVhZHkgc3Rha2VkAwkBCWlzRGVmaW5lZAEJAKIIAQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUHYWRkcmVzcwkAAgEJAKwCAgIdWW91IGFscmVhZHkgc3Rha2VkIG9uZSBkdWNrOiAIBQVhc3NldARuYW1lBAZsb2NLZXkJAQ9rZXlEdWNrTG9jYXRpb24BBQphc3NldElkU3RyBAhsb2NhdGlvbgkAoggBBQZsb2NLZXkECWtleUhlYWx0aAkBDWtleUR1Y2tIZWFsdGgBBQphc3NldElkU3RyBAZoZWFsdGgJAJ8IAQUJa2V5SGVhbHRoBAVicEtleQkBEWtleUJhY2twYWNrQnlEdWNrAQUKYXNzZXRJZFN0cgQIYmFja3BhY2sJAKIIAQUFYnBLZXkJAM4IAgkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdGltZUtleQgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBDEludGVnZXJFbnRyeQIJASJrZXlTdGFrZWRUaW1lQnlUeXBlQXNzZXRJZEFuZE93bmVyAwUKRFVDS1BSRUZJWAkA2AQBBQdhc3NldElkBQdhZGRyZXNzCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkAzAgCCQELU3RyaW5nRW50cnkCCQEQa2V5RHVja0lkVG9Pd25lcgEFCmFzc2V0SWRTdHIFB2FkZHJlc3MJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUHYWRkcmVzcwUKYXNzZXRJZFN0cgUDbmlsAwkBCWlzRGVmaW5lZAEFCGxvY2F0aW9uBQNuaWwJAM4IAgkAzAgCCQELU3RyaW5nRW50cnkCBQZsb2NLZXkFD0RFRkFVTFRMT0NBVElPTgUDbmlsAwkBCWlzRGVmaW5lZAEFBmhlYWx0aAUDbmlsCQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFCWtleUhlYWx0aABkBQNuaWwDCQEJaXNEZWZpbmVkAQUIYmFja3BhY2sFA25pbAkAzAgCCQELU3RyaW5nRW50cnkCBQVicEtleQIPMDowXzBfMF8wXzBfMDo6BQNuaWwBaQELdW5zdGFrZUR1Y2sBCmFzc2V0SWRTdHIDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAiR1bnN0YWtlIGRvZXNuJ3QgcmVxdWlyZSBhbnkgcGF5bWVudHMEB2Fzc2V0SWQJANkEAQUKYXNzZXRJZFN0cgQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEBWFzc2V0CQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQDAwkBAiE9AggFBWFzc2V0Bmlzc3VlcgUNaW5jdWJhdG9yQWRkcgkBAiE9AggFBWFzc2V0Bmlzc3VlcgULYnJlZWRlckFkZHIHCQACAQkArAICCQCsAgICElVua25vd24gaXNzdWVyIG9mIAUKRFVDS1BSRUZJWAIGIHRva2VuAwkBASEBCQEIY29udGFpbnMCCAUFYXNzZXQEbmFtZQUKRFVDS1BSRUZJWAkAAgEJAKwCAgkArAICAglPbmx5IE5GVCAFCkRVQ0tQUkVGSVgCFyB0b2tlbnMgY2FuIGJlIHVuc3Rha2VkBAd0aW1lS2V5CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEJANgEAQUHYXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEFB3RpbWVLZXkJAAIBCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkAwkBASEBCQEJaXNEZWZpbmVkAQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUHYWRkcmVzcwkAAgEJAKwCAgkArAICAglUaGUgZHVjayAIBQVhc3NldARuYW1lAg4gaXMgbm90IHN0YWtlZAQFb3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEQa2V5RHVja0lkVG9Pd25lcgEJANgEAQUHYXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDCQECIT0CBQVvd25lcgUHYWRkcmVzcwkAAgECF1N0YWtlZCBORlQgaXMgbm90IHlvdXJzCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgABBQdhc3NldElkCQDMCAIJAQtEZWxldGVFbnRyeQEFB3RpbWVLZXkJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBD2tleUR1Y2tMb2NhdGlvbgEFCmFzc2V0SWRTdHIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBImtleVN0YWtlZFRpbWVCeVR5cGVBc3NldElkQW5kT3duZXIDBQpEVUNLUFJFRklYBQphc3NldElkU3RyBQdhZGRyZXNzCQDMCAIJAQtEZWxldGVFbnRyeQEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFB2FkZHJlc3MFA25pbAFpAQhjbGFpbVJlcwIGYW1vdW50C2xhbmRBc3NldElkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIlY2xhaW1SZXMgZG9lc24ndCByZXF1aXJlIGFueSBwYXltZW50cwQEYWRkcgkApQgBCAUBaQZjYWxsZXIEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQDCQEBIQEJAQhjb250YWlucwIIBQVhc3NldARuYW1lBQpMQU5EUFJFRklYCQACAQkArAICCQCsAgICBE5GVCAFCkxBTkRQUkVGSVgCICB0b2tlbiBzaG91bGQgYmUgcGFzc2VkIGFzIHBhcmFtBAd0aW1lS2V5CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkBAlzYXZlZFRpbWUJAJ8IAQUHdGltZUtleQMJAQEhAQkBCWlzRGVmaW5lZAEFCXNhdmVkVGltZQkAAgEJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQEBW93bmVyCQERQGV4dHJOYXRpdmUoMTA1OCkBCQERa2V5QXNzZXRJZFRvT3duZXIBBQtsYW5kQXNzZXRJZAMJAQIhPQIFBW93bmVyBQRhZGRyCQACAQkArAICBQpMQU5EUFJFRklYAg0gaXMgbm90IHlvdXJzBAFkCQC1CQIIBQVhc3NldAtkZXNjcmlwdGlvbgIBXwQIbGFuZFNpemUJAJEDAgUBZAULcmVjTGFuZFNpemUEDXRlcnJhaW5Db3VudHMJAQ1jb3VudFRlcnJhaW5zAQkAkQMCBQFkBQtyZWNUZXJyYWlucwQEZHVjawkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBBQRhZGRyAwkBASEBCQEJaXNEZWZpbmVkAQUEZHVjawkAAgECHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQEDmR1Y2tBc3NldElkU3RyCQEFdmFsdWUBBQRkdWNrBAtjdXJMb2NhdGlvbgkBC3ZhbHVlT3JFbHNlAgkAoggBCQEPa2V5RHVja0xvY2F0aW9uAQUOZHVja0Fzc2V0SWRTdHIFD0RFRkFVTFRMT0NBVElPTgQDbG9jCQC1CQIJAQV2YWx1ZQEFC2N1ckxvY2F0aW9uAgFfAwkBAiE9AgkAkQMCBQNsb2MFCmxvY0lkeFR5cGUCAUwJAAIBCQCsAgIJAKwCAgIWRHVjayBsb2NhdGlvbiB0eXBlIGlzIAkAkQMCBQNsb2MFCmxvY0lkeFR5cGUCESwgYnV0IHNob3VsZCBiZSBMAwkBAiE9AgkAkQMCBQNsb2MFCGxvY0lkeElkBQtsYW5kQXNzZXRJZAkAAgEJAKwCAgkArAICCQCsAgICFER1Y2sgbG9jYXRpb24gaWQgaXMgCQCRAwIFA2xvYwUIbG9jSWR4SWQCECwgYnV0IHNob3VsZCBiZSAFC2xhbmRBc3NldElkBAlkZWx0YVRpbWUJAGUCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAkBBXZhbHVlAQUJc2F2ZWRUaW1lAwkAZgIAAAUJZGVsdGFUaW1lCQACAQkArAICCQCsAgIJAKwCAgImU2F2ZWQgdGltZXN0YW1wIGlzIGluIGZ1dHVyZSwgc2F2ZWQgPSAJAKQDAQkBBXZhbHVlAQUJc2F2ZWRUaW1lAgwsIGN1cnJlbnQgPSAJAKQDAQgFCWxhc3RCbG9jawl0aW1lc3RhbXAEBnBpZWNlcwkBD251bVBpZWNlc0J5U2l6ZQEFCGxhbmRTaXplBAhhdmFpbFJlcwkAaAIJAGsDBQlkZWx0YVRpbWUFD0RBSUxZUkVTQllQSUVDRQUJREFZTUlMTElTBQZwaWVjZXMDCQBmAgUGYW1vdW50BQhhdmFpbFJlcwkAAgEJAKwCAgkArAICCQCsAgICIk5vdCBlbm91Z2ggcmVzb3VyY2VzLCBhdmFpbGFibGUgPSAJAKQDAQUIYXZhaWxSZXMCDiwgcmVxdWVzdGVkID0gCQCkAwEFBmFtb3VudAQMbmV3RGVsdGFUaW1lCQBrAwkAZQIFCGF2YWlsUmVzBQZhbW91bnQFCURBWU1JTExJUwkAaAIFBnBpZWNlcwUPREFJTFlSRVNCWVBJRUNFBAxuZXdUaW1lc3RhbXAJAGUCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAUMbmV3RGVsdGFUaW1lBAVicEtleQkBEWtleUJhY2twYWNrQnlEdWNrAQUOZHVja0Fzc2V0SWRTdHIEC2N1cnJlbnRQYWNrCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUFYnBLZXkCDzA6MF8wXzBfMF8wXzA6OgIBOgQKY3VycmVudFJlcwkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwQFYnBSZXMJAQZhZGRSZXMDBQpjdXJyZW50UmVzBQ10ZXJyYWluQ291bnRzCQBlAgUJZGVsdGFUaW1lBQxuZXdEZWx0YVRpbWUEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIFBWJwUmVzCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0CQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6CQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgUFYnBLZXkFB25ld1BhY2sJAMwIAgkBDEludGVnZXJFbnRyeQIFB3RpbWVLZXkFDG5ld1RpbWVzdGFtcAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBImtleVN0YWtlZFRpbWVCeVR5cGVBc3NldElkQW5kT3duZXIDBQpMQU5EUFJFRklYBQtsYW5kQXNzZXRJZAUFb3duZXIFDG5ld1RpbWVzdGFtcAUDbmlsBQR1bml0AWkBBmZsaWdodAIHbWVzc2FnZQNzaWcDCQEBIQEJAMQTAwUHbWVzc2FnZQUDc2lnBQNwdWIJAAIBAhhzaWduYXR1cmUgZG9lcyBub3QgbWF0Y2gDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAiNmbGlnaHQgZG9lc24ndCByZXF1aXJlIGFueSBwYXltZW50cwQFcGFydHMJALUJAgkAsAkBBQdtZXNzYWdlAgE7BAJocAkAtQkCCQCRAwIJALUJAgkAkQMCBQVwYXJ0cwAAAgF8AAACAV8EBWN1ckhQCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCaHAAAAMJAGcCAAAFBWN1ckhQCQACAQIeWW91IGNhbid0IGZseSB3aXRoIHplcm8gaGVhbHRoBAVuZXdIUAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmhwAAEEDW5ld0xvY0FuZFRpbWUJALUJAgkAkQMCBQVwYXJ0cwABAgE6BAtuZXdMb2NhdGlvbgkAkQMCBQ1uZXdMb2NBbmRUaW1lAAAEBHRpbWUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ1uZXdMb2NBbmRUaW1lAAEDAwkAZgIFBHRpbWUJAGQCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAURRklWRU1JTlVURVNNSUxMSVMGCQBmAgkAZQIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBRFGSVZFTUlOVVRFU01JTExJUwUEdGltZQkAAgECEnNpZ25hdHVyZSBvdXRkYXRlZAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQJa2V5SGVhbHRoCQENa2V5RHVja0hlYWx0aAEFC2R1Y2tBc3NldElkBAxvbGRGcm9tU3RhdGUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJa2V5SGVhbHRoAGQDCQECIT0CBQxvbGRGcm9tU3RhdGUFBWN1ckhQCQACAQkArAICCQCsAgIJAKwCAgIKb2xkSGVhbHRoPQkApAMBCQELdmFsdWVPckVsc2UCCQCfCAEFCWtleUhlYWx0aABkAi8gZnJvbSBzdGF0ZSBkb2VzIG5vdCBtYXRjaCBvbmUgZnJvbSBmbGlnaHQgbG9nPQkApAMBBQVjdXJIUAQGbG9jS2V5CQEPa2V5RHVja0xvY2F0aW9uAQULZHVja0Fzc2V0SWQEC2N1ckxvY2F0aW9uCQELdmFsdWVPckVsc2UCCQCiCAEFBmxvY0tleQUPREVGQVVMVExPQ0FUSU9OAwkAAAIFC25ld0xvY2F0aW9uBQtjdXJMb2NhdGlvbgkAAgECIllvdSBjYW4ndCBmbHkgdG8gdGhlIHNhbWUgbG9jYXRpb24JAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQZsb2NLZXkDCQBmAgUFbmV3SFAAAAULbmV3TG9jYXRpb24FC2N1ckxvY2F0aW9uCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrZXlIZWFsdGgFBW5ld0hQBQNuaWwFBHVuaXQBaQEJc2V0SGVhbHRoAgZoZWFsdGgLZHVja0Fzc2V0SWQEDmR1Y2tBc3NldElkU3RyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDAwkAZgIAAAUGaGVhbHRoBgkAZgIFBmhlYWx0aABkCQACAQIaSFAgc2hvdWxkIGJlIHdpdGhpbiAwLi4xMDAJAMwIAgkBDEludGVnZXJFbnRyeQIJAQ1rZXlEdWNrSGVhbHRoAQULZHVja0Fzc2V0SWQFBmhlYWx0aAUDbmlsAWkBDnVwZGF0ZUJhY2twYWNrAgtkdWNrQXNzZXRJZAduZXdQYWNrAwkBAiE9AggFAWkGY2FsbGVyBQtlY29ub215QWRkcgkAAgECEXBlcm1pc3Npb24gZGVuaWVkCQCUCgIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQFB25ld1BhY2sFA25pbAUHbmV3UGFjawCoMCiI", "height": 2353174, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 6U3sR1H1EKBorGnsBCEp9vLN4zEWnV7rU7RTXDDon5hs Next: HHsAaRK3pFVjsa1dkNSGd2YeLiTj8vx75UNw5CLtxxj Diff:
OldNewDifferences
332332 let parts = split(toUtf8String(message), ";")
333333 let hp = split(split(parts[0], "|")[0], "_")
334334 let curHP = parseIntValue(hp[0])
335- let newHP = parseIntValue(hp[1])
336- let newLocAndTime = split(parts[1], ":")
337- let newLocation = newLocAndTime[0]
338- let time = parseIntValue(newLocAndTime[1])
339- if (if ((time > (lastBlock.timestamp + FIVEMINUTESMILLIS)))
340- then true
341- else ((lastBlock.timestamp - FIVEMINUTESMILLIS) > time))
342- then throw("signature outdated")
335+ if ((0 >= curHP))
336+ then throw("You can't fly with zero health")
343337 else {
344- let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
345- let keyHealth = keyDuckHealth(duckAssetId)
346- let oldFromState = valueOrElse(getInteger(keyHealth), 100)
347- if ((oldFromState != curHP))
348- then throw(((("oldHealth=" + toString(valueOrElse(getInteger(keyHealth), 100))) + " from state does not match one from flight log=") + toString(curHP)))
338+ let newHP = parseIntValue(hp[1])
339+ let newLocAndTime = split(parts[1], ":")
340+ let newLocation = newLocAndTime[0]
341+ let time = parseIntValue(newLocAndTime[1])
342+ if (if ((time > (lastBlock.timestamp + FIVEMINUTESMILLIS)))
343+ then true
344+ else ((lastBlock.timestamp - FIVEMINUTESMILLIS) > time))
345+ then throw("signature outdated")
349346 else {
350- let locKey = keyDuckLocation(duckAssetId)
351- let curLocation = valueOrElse(getString(locKey), DEFAULTLOCATION)
352- if ((newLocation == curLocation))
353- then throw("You can't fly to the same location")
354- else $Tuple2([StringEntry(locKey, if ((newHP > 0))
355- then newLocation
356- else curLocation), IntegerEntry(keyHealth, newHP)], unit)
347+ let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
348+ let keyHealth = keyDuckHealth(duckAssetId)
349+ let oldFromState = valueOrElse(getInteger(keyHealth), 100)
350+ if ((oldFromState != curHP))
351+ then throw(((("oldHealth=" + toString(valueOrElse(getInteger(keyHealth), 100))) + " from state does not match one from flight log=") + toString(curHP)))
352+ else {
353+ let locKey = keyDuckLocation(duckAssetId)
354+ let curLocation = valueOrElse(getString(locKey), DEFAULTLOCATION)
355+ if ((newLocation == curLocation))
356+ then throw("You can't fly to the same location")
357+ else $Tuple2([StringEntry(locKey, if ((newHP > 0))
358+ then newLocation
359+ else curLocation), IntegerEntry(keyHealth, newHP)], unit)
360+ }
357361 }
358362 }
359363 }
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let usdnAssetId = base58'HezsdQuRDtzksAYUy97gfhKy7Z1NW2uXYSHA3bgqenNZ'
55
66 let incubatorAddr = this
77
88 let breederAddr = this
99
1010 let backEndAddr = addressFromStringValue("3N5SpX21R3R75Qo4eb3MwFFvW7TUzyhvavv")
1111
1212 let economyAddr = addressFromStringValue("3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep")
1313
1414 let pub = base58'6LfPuKJjLgekmncBhMg2LZyMTNVzZBccXR28ySXm9uXD'
1515
1616 let LANDPREFIX = "LAND"
1717
1818 let DUCKPREFIX = "DUCK"
1919
2020 let DEFAULTLOCATION = "Africa_F_Africa"
2121
2222 let DAILYRESBYPIECE = 3456000
2323
2424 let DAYMILLIS = 86400000
2525
2626 let FIVEMINUTESMILLIS = 300000
2727
2828 func keyAssetIdToOwner (assetId) = ("nftOwner_" + assetId)
2929
3030
3131 func keyDuckIdToOwner (assetId) = ("duckOwner_" + assetId)
3232
3333
3434 func keyStakedTimeByAssetId (assetId) = ("stakedTime_" + assetId)
3535
3636
3737 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
3838
3939
4040 func keyStakedTimeByTypeAssetIdAndOwner (nftType,assetId,ownerAddr) = ((((("stakedTimeByTypeAssetIdAndOwner_" + nftType) + "_") + assetId) + "_") + ownerAddr)
4141
4242
4343 func keyLandToOwner (landNum) = ("landOwner_" + landNum)
4444
4545
4646 func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
4747
4848
4949 func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
5050
5151
5252 func keyDuckHealth (duckAssetId) = ("duckHealth_" + duckAssetId)
5353
5454
5555 let recLandNum = 0
5656
5757 let recLandSize = 1
5858
5959 let recTerrains = 2
6060
6161 let recContinent = 3
6262
6363 let locIdxContinent = 0
6464
6565 let locIdxType = 1
6666
6767 let locIdxId = 2
6868
6969 let bpIdxLevel = 0
7070
7171 let bpIdxRes = 1
7272
7373 let bpIdxMat = 2
7474
7575 let bpIdxProd = 3
7676
7777 let idxA = 0
7878
7979 let idxB = 1
8080
8181 let idxC = 2
8282
8383 let idxD = 3
8484
8585 let idxE = 4
8686
8787 let idxF = 5
8888
8989 func countTerrains (terrains) = [(size(split(terrains, "A")) - 1), (size(split(terrains, "B")) - 1), (size(split(terrains, "C")) - 1), (size(split(terrains, "D")) - 1), (size(split(terrains, "E")) - 1), (size(split(terrains, "F")) - 1)]
9090
9191
9292 func numPiecesBySize (landSize) = match landSize {
9393 case _ =>
9494 if (("S" == $match0))
9595 then 25
9696 else if (("M" == $match0))
9797 then 100
9898 else if (("L" == $match0))
9999 then 225
100100 else if (("XL" == $match0))
101101 then 400
102102 else if (("XXL" == $match0))
103103 then 625
104104 else throw("Unknown land size")
105105 }
106106
107107
108108 func addRes (currentRes,terrainCounts,deltaTime) = {
109109 func adder (acc,i) = {
110110 let resOfType = (fraction(deltaTime, DAILYRESBYPIECE, DAYMILLIS) * terrainCounts[i])
111111 (acc :+ toString((parseIntValue(currentRes[i]) + resOfType)))
112112 }
113113
114114 let r = {
115115 let $l = [0, 1, 2, 3, 4, 5]
116116 let $s = size($l)
117117 let $acc0 = nil
118118 func $f0_1 ($a,$i) = if (($i >= $s))
119119 then $a
120120 else adder($a, $l[$i])
121121
122122 func $f0_2 ($a,$i) = if (($i >= $s))
123123 then $a
124124 else throw("List size exceeds 6")
125125
126126 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
127127 }
128128 makeString(r, "_")
129129 }
130130
131131
132132 @Callable(i)
133133 func stakeLand () = {
134134 let pmt = value(i.payments[0])
135135 let assetId = value(pmt.assetId)
136136 let address = toString(i.caller)
137137 if ((pmt.amount != 1))
138138 then throw((("NFT " + LANDPREFIX) + " token should be attached as payment"))
139139 else {
140140 let asset = value(assetInfo(assetId))
141141 if ((asset.issuer != this))
142142 then throw("Unknown issuer of token")
143143 else if (!(contains(asset.name, LANDPREFIX)))
144144 then throw((("Only NFT " + LANDPREFIX) + " tokens are accepted"))
145145 else {
146146 let landNumSize = drop(asset.name, 4)
147147 let landNum = if (contains(landNumSize, "XXL"))
148148 then dropRight(landNumSize, 3)
149149 else if (contains(landNumSize, "XL"))
150150 then dropRight(landNumSize, 2)
151151 else dropRight(landNumSize, 1)
152152 if (!(isDefined(parseInt(landNum))))
153153 then throw(("Cannot parse land number from " + asset.name))
154154 else {
155155 let timeKey = keyStakedTimeByAssetId(toBase58String(assetId))
156156 if (isDefined(getInteger(timeKey)))
157157 then throw((("NFT " + asset.name) + " is already staked"))
158158 else [IntegerEntry(timeKey, lastBlock.timestamp), IntegerEntry(keyStakedTimeByTypeAssetIdAndOwner(LANDPREFIX, toBase58String(assetId), address), lastBlock.timestamp), StringEntry(keyAssetIdToOwner(toBase58String(assetId)), address), StringEntry(keyLandToOwner(landNum), address)]
159159 }
160160 }
161161 }
162162 }
163163
164164
165165
166166 @Callable(i)
167167 func unstakeLand (landAssetId) = if ((size(i.payments) != 0))
168168 then throw("unstake doesn't require any payments")
169169 else {
170170 let assetId = fromBase58String(landAssetId)
171171 let address = toString(i.caller)
172172 let asset = value(assetInfo(assetId))
173173 if ((asset.issuer != this))
174174 then throw("Unknown issuer of token")
175175 else if (!(contains(asset.name, LANDPREFIX)))
176176 then throw((("Only NFT " + LANDPREFIX) + " tokens can be unstaked"))
177177 else {
178178 let timeKey = keyStakedTimeByAssetId(landAssetId)
179179 if (!(isDefined(timeKey)))
180180 then throw((("NFT " + asset.name) + " is not staked"))
181181 else {
182182 let owner = valueOrErrorMessage(getString(keyAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
183183 if ((owner != address))
184184 then throw("Staked NFT is not yours")
185185 else [ScriptTransfer(i.caller, 1, assetId), DeleteEntry(timeKey), DeleteEntry(keyStakedTimeByTypeAssetIdAndOwner(LANDPREFIX, landAssetId, address))]
186186 }
187187 }
188188 }
189189
190190
191191
192192 @Callable(i)
193193 func stakeDuck () = {
194194 let pmt = value(i.payments[0])
195195 let assetId = value(pmt.assetId)
196196 let address = toString(i.caller)
197197 if ((pmt.amount != 1))
198198 then throw((("NFT " + DUCKPREFIX) + " token should be attached as payment"))
199199 else {
200200 let asset = value(assetInfo(assetId))
201201 if (if ((asset.issuer != incubatorAddr))
202202 then (asset.issuer != breederAddr)
203203 else false)
204204 then throw((("Unknown issuer of " + DUCKPREFIX) + " token"))
205205 else if (!(contains(asset.name, DUCKPREFIX)))
206206 then throw((("Only NFT " + DUCKPREFIX) + " tokens are accepted"))
207207 else {
208208 let assetIdStr = toBase58String(assetId)
209209 let timeKey = keyStakedTimeByAssetId(assetIdStr)
210210 if (isDefined(getInteger(timeKey)))
211211 then throw((("NFT " + asset.name) + " is already staked"))
212212 else if (isDefined(getString(keyStakedDuckByOwner(address))))
213213 then throw(("You already staked one duck: " + asset.name))
214214 else {
215215 let locKey = keyDuckLocation(assetIdStr)
216216 let location = getString(locKey)
217217 let keyHealth = keyDuckHealth(assetIdStr)
218218 let health = getInteger(keyHealth)
219219 let bpKey = keyBackpackByDuck(assetIdStr)
220220 let backpack = getString(bpKey)
221221 ([IntegerEntry(timeKey, lastBlock.timestamp), IntegerEntry(keyStakedTimeByTypeAssetIdAndOwner(DUCKPREFIX, toBase58String(assetId), address), lastBlock.timestamp), StringEntry(keyDuckIdToOwner(assetIdStr), address), StringEntry(keyStakedDuckByOwner(address), assetIdStr)] ++ (if (isDefined(location))
222222 then nil
223223 else ([StringEntry(locKey, DEFAULTLOCATION)] ++ (if (isDefined(health))
224224 then nil
225225 else ([IntegerEntry(keyHealth, 100)] ++ (if (isDefined(backpack))
226226 then nil
227227 else [StringEntry(bpKey, "0:0_0_0_0_0_0::")]))))))
228228 }
229229 }
230230 }
231231 }
232232
233233
234234
235235 @Callable(i)
236236 func unstakeDuck (assetIdStr) = if ((size(i.payments) != 0))
237237 then throw("unstake doesn't require any payments")
238238 else {
239239 let assetId = fromBase58String(assetIdStr)
240240 let address = toString(i.caller)
241241 let asset = value(assetInfo(assetId))
242242 if (if ((asset.issuer != incubatorAddr))
243243 then (asset.issuer != breederAddr)
244244 else false)
245245 then throw((("Unknown issuer of " + DUCKPREFIX) + " token"))
246246 else if (!(contains(asset.name, DUCKPREFIX)))
247247 then throw((("Only NFT " + DUCKPREFIX) + " tokens can be unstaked"))
248248 else {
249249 let timeKey = keyStakedTimeByAssetId(toBase58String(assetId))
250250 if (!(isDefined(timeKey)))
251251 then throw((("NFT " + asset.name) + " is not staked"))
252252 else if (!(isDefined(keyStakedDuckByOwner(address))))
253253 then throw((("The duck " + asset.name) + " is not staked"))
254254 else {
255255 let owner = valueOrErrorMessage(getString(keyDuckIdToOwner(toBase58String(assetId))), (("NFT " + asset.name) + " is orphaned"))
256256 if ((owner != address))
257257 then throw("Staked NFT is not yours")
258258 else [ScriptTransfer(i.caller, 1, assetId), DeleteEntry(timeKey), DeleteEntry(keyDuckLocation(assetIdStr)), DeleteEntry(keyStakedTimeByTypeAssetIdAndOwner(DUCKPREFIX, assetIdStr, address)), DeleteEntry(keyStakedDuckByOwner(address))]
259259 }
260260 }
261261 }
262262
263263
264264
265265 @Callable(i)
266266 func claimRes (amount,landAssetId) = if ((size(i.payments) != 0))
267267 then throw("claimRes doesn't require any payments")
268268 else {
269269 let addr = toString(i.caller)
270270 let asset = value(assetInfo(fromBase58String(landAssetId)))
271271 if (!(contains(asset.name, LANDPREFIX)))
272272 then throw((("NFT " + LANDPREFIX) + " token should be passed as param"))
273273 else {
274274 let timeKey = keyStakedTimeByAssetId(landAssetId)
275275 let savedTime = getInteger(timeKey)
276276 if (!(isDefined(savedTime)))
277277 then throw((("NFT " + asset.name) + " is not staked"))
278278 else {
279279 let owner = getStringValue(keyAssetIdToOwner(landAssetId))
280280 if ((owner != addr))
281281 then throw((LANDPREFIX + " is not yours"))
282282 else {
283283 let d = split(asset.description, "_")
284284 let landSize = d[recLandSize]
285285 let terrainCounts = countTerrains(d[recTerrains])
286286 let duck = getString(keyStakedDuckByOwner(addr))
287287 if (!(isDefined(duck)))
288288 then throw("You don't have a duck staked")
289289 else {
290290 let duckAssetIdStr = value(duck)
291291 let curLocation = valueOrElse(getString(keyDuckLocation(duckAssetIdStr)), DEFAULTLOCATION)
292292 let loc = split(value(curLocation), "_")
293293 if ((loc[locIdxType] != "L"))
294294 then throw((("Duck location type is " + loc[locIdxType]) + ", but should be L"))
295295 else if ((loc[locIdxId] != landAssetId))
296296 then throw(((("Duck location id is " + loc[locIdxId]) + ", but should be ") + landAssetId))
297297 else {
298298 let deltaTime = (lastBlock.timestamp - value(savedTime))
299299 if ((0 > deltaTime))
300300 then throw(((("Saved timestamp is in future, saved = " + toString(value(savedTime))) + ", current = ") + toString(lastBlock.timestamp)))
301301 else {
302302 let pieces = numPiecesBySize(landSize)
303303 let availRes = (fraction(deltaTime, DAILYRESBYPIECE, DAYMILLIS) * pieces)
304304 if ((amount > availRes))
305305 then throw(((("Not enough resources, available = " + toString(availRes)) + ", requested = ") + toString(amount)))
306306 else {
307307 let newDeltaTime = fraction((availRes - amount), DAYMILLIS, (pieces * DAILYRESBYPIECE))
308308 let newTimestamp = (lastBlock.timestamp - newDeltaTime)
309309 let bpKey = keyBackpackByDuck(duckAssetIdStr)
310310 let currentPack = split(valueOrElse(getString(bpKey), "0:0_0_0_0_0_0::"), ":")
311311 let currentRes = split(currentPack[bpIdxRes], "_")
312312 let bpRes = addRes(currentRes, terrainCounts, (deltaTime - newDeltaTime))
313313 let newPack = makeString([currentPack[bpIdxLevel], bpRes, currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
314314 $Tuple2([StringEntry(bpKey, newPack), IntegerEntry(timeKey, newTimestamp), IntegerEntry(keyStakedTimeByTypeAssetIdAndOwner(LANDPREFIX, landAssetId, owner), newTimestamp)], unit)
315315 }
316316 }
317317 }
318318 }
319319 }
320320 }
321321 }
322322 }
323323
324324
325325
326326 @Callable(i)
327327 func flight (message,sig) = if (!(sigVerify_8Kb(message, sig, pub)))
328328 then throw("signature does not match")
329329 else if ((size(i.payments) != 0))
330330 then throw("flight doesn't require any payments")
331331 else {
332332 let parts = split(toUtf8String(message), ";")
333333 let hp = split(split(parts[0], "|")[0], "_")
334334 let curHP = parseIntValue(hp[0])
335- let newHP = parseIntValue(hp[1])
336- let newLocAndTime = split(parts[1], ":")
337- let newLocation = newLocAndTime[0]
338- let time = parseIntValue(newLocAndTime[1])
339- if (if ((time > (lastBlock.timestamp + FIVEMINUTESMILLIS)))
340- then true
341- else ((lastBlock.timestamp - FIVEMINUTESMILLIS) > time))
342- then throw("signature outdated")
335+ if ((0 >= curHP))
336+ then throw("You can't fly with zero health")
343337 else {
344- let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
345- let keyHealth = keyDuckHealth(duckAssetId)
346- let oldFromState = valueOrElse(getInteger(keyHealth), 100)
347- if ((oldFromState != curHP))
348- then throw(((("oldHealth=" + toString(valueOrElse(getInteger(keyHealth), 100))) + " from state does not match one from flight log=") + toString(curHP)))
338+ let newHP = parseIntValue(hp[1])
339+ let newLocAndTime = split(parts[1], ":")
340+ let newLocation = newLocAndTime[0]
341+ let time = parseIntValue(newLocAndTime[1])
342+ if (if ((time > (lastBlock.timestamp + FIVEMINUTESMILLIS)))
343+ then true
344+ else ((lastBlock.timestamp - FIVEMINUTESMILLIS) > time))
345+ then throw("signature outdated")
349346 else {
350- let locKey = keyDuckLocation(duckAssetId)
351- let curLocation = valueOrElse(getString(locKey), DEFAULTLOCATION)
352- if ((newLocation == curLocation))
353- then throw("You can't fly to the same location")
354- else $Tuple2([StringEntry(locKey, if ((newHP > 0))
355- then newLocation
356- else curLocation), IntegerEntry(keyHealth, newHP)], unit)
347+ let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
348+ let keyHealth = keyDuckHealth(duckAssetId)
349+ let oldFromState = valueOrElse(getInteger(keyHealth), 100)
350+ if ((oldFromState != curHP))
351+ then throw(((("oldHealth=" + toString(valueOrElse(getInteger(keyHealth), 100))) + " from state does not match one from flight log=") + toString(curHP)))
352+ else {
353+ let locKey = keyDuckLocation(duckAssetId)
354+ let curLocation = valueOrElse(getString(locKey), DEFAULTLOCATION)
355+ if ((newLocation == curLocation))
356+ then throw("You can't fly to the same location")
357+ else $Tuple2([StringEntry(locKey, if ((newHP > 0))
358+ then newLocation
359+ else curLocation), IntegerEntry(keyHealth, newHP)], unit)
360+ }
357361 }
358362 }
359363 }
360364
361365
362366
363367 @Callable(i)
364368 func setHealth (health,duckAssetId) = {
365369 let duckAssetIdStr = valueOrErrorMessage(getString(keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
366370 if (if ((0 > health))
367371 then true
368372 else (health > 100))
369373 then throw("HP should be within 0..100")
370374 else [IntegerEntry(keyDuckHealth(duckAssetId), health)]
371375 }
372376
373377
374378
375379 @Callable(i)
376380 func updateBackpack (duckAssetId,newPack) = if ((i.caller != economyAddr))
377381 then throw("permission denied")
378382 else $Tuple2([StringEntry(keyBackpackByDuck(duckAssetId), newPack)], newPack)
379383
380384

github/deemru/w8io/169f3d6 
82.81 ms