tx · FexwAejT51B3YHBFn68M9YAGXZjjCPYDjF44bVaeCseG

3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm:  -0.01700000 Waves

2022.12.22 23:57 [2372000] smart account 3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm > SELF 0.00000000 Waves

{ "type": 13, "id": "FexwAejT51B3YHBFn68M9YAGXZjjCPYDjF44bVaeCseG", "fee": 1700000, "feeAssetId": null, "timestamp": 1671742634715, "version": 2, "chainId": 84, "sender": "3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm", "senderPublicKey": "EVooykMNV691Venwp1dHUTBd7KWequzUcda57Wd3LQEX", "proofs": [ "3oMg4yYvQ1PdHvC8oYzjunxzMDPPWRStjpybFCQ8nwfw3NqJhhFHhMaNVvsHsRsWn4Hc8PAV2r1bo9Am8XJR2Dh5" ], "script": "base64:BgI0CAISABIDCgEIEgASAwoBCBIECgIBCBIECgICAhIECgIBCBIECgIBARIECgIICBIECgICAjcABWNoYWluCQCwCQEJAMkBAgkAygECCAUEdGhpcwVieXRlcwABAAEAC3VzZG5Bc3NldElkBAckbWF0Y2gwBQVjaGFpbgMJAAACAgFXBQckbWF0Y2gwASC2JinDBPXOU5GkDkt1JC9kjFGx+t+vVCm9SNIdKrKq0QMJAAACAgFUBQckbWF0Y2gwASD3dur394PKZdtuE+4CO89YKZWpwdGN8kvabNgdYoDI3gkAAgECDVVua25vd24gY2hhaW4ADWluY3ViYXRvckFkZHIEByRtYXRjaDAFBWNoYWluAwkAAAICAVcFByRtYXRjaDAJARFAZXh0ck5hdGl2ZSgxMDYyKQECIzNQRWt0VnV4MlJoY2hTTjYzRHNEbzRiNG16NFFxektTZUR2AwkAAAICAVQFByRtYXRjaDAFBHRoaXMJAAIBAg1Vbmtub3duIGNoYWluAAticmVlZGVyQWRkcgQHJG1hdGNoMAUFY2hhaW4DCQAAAgIBVwUHJG1hdGNoMAkBEUBleHRyTmF0aXZlKDEwNjIpAQIjM1BEVnVVNDVIN0VoNWRtdE5iblJOUlN0R3dVTEE3Tlk2SGIDCQAAAgIBVAUHJG1hdGNoMAUEdGhpcwkAAgECDVVua25vd24gY2hhaW4AC2Vjb25vbXlBZGRyBAckbWF0Y2gwBQVjaGFpbgMJAAACAgFXBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBAiMzUDJzazFLbmNTeFJhWnM4YjRDV0dQdzJqa3Z2YXY3NHU0RAMJAAACAgFUBQckbWF0Y2gwCQERQGV4dHJOYXRpdmUoMTA2MikBAiMzTjh5NHd4WDNKQzRUZHJDSkJYWDE2U2pXZjZYMjU2aHJlcAkAAgECDVVua25vd24gY2hhaW4AA3B1YgEgT1PiGj9UqNadUk4THUYnVb2zU/Mse8lUVLD/Q8G0FCgACEhFQUxDT1NUAJBOAApMQU5EUFJFRklYAgRMQU5EAApEVUNLUFJFRklYAgREVUNLAA9ERUZBVUxUTE9DQVRJT04CD0FmcmljYV9GX0FmcmljYQAGTlVNUkVTAAYAD0RBSUxZUkVTQllQSUVDRQCA+NIBAAlEQVlNSUxMSVMAgLiZKQARRklWRU1JTlVURVNNSUxMSVMA4KcSABBSRVNPVVJDRVBSSUNFTUlOANXWCQAMRVhQTUFURVJJQUxTAMuA1bPLBAAFRklWRVgJALYCAQAFAAdUV0VOVFlYCQC2AgEAFAAIVFdFTlRZMlgJALYCAQkAaAIAFAAUAAhUV0VOVFkzWAkAtgIBCQBoAgkAaAIAFAAUABQACFRXRU5UWTRYCQC2AgEJAGgCCQBoAgkAaAIAFAAUABQAFAAIVFdFTlRZNVgJALYCAQkAaAIJAGgCCQBoAgkAaAIAFAAUABQAFAAUAAhtYXRUeXBlcwkAzAgCAgRGdWVsCQDMCAICBU1ldGFsCQDMCAICBVBsYW5rCQDMCAICBUdsYXNzCQDMCAICB1BsYXN0aWMJAMwIAgIHUHJvdGVpbgUDbmlsAApjb250aW5lbnRzCQDMCAICBEFzaWEJAMwIAgIGRXVyb3BlCQDMCAICCEFtZXJpY2FzCQDMCAICB09jZWFuaWEJAMwIAgIGQWZyaWNhBQNuaWwBEmtleU5leHRGcmVlTGFuZE51bQACC25leHRMYW5kTnVtARJrZXlGcmVlTGFuZE51bXNNYXAAAg9mcmVlTGFuZE51bXNNYXABEGtleUxhbmRUb0Fzc2V0SWQBB2xhbmROdW0JAKwCAgIMbGFuZFRvQXNzZXRfBQdsYW5kTnVtAQprZXlOZnROYW1lAgdsYW5kTnVtCGxhbmRTaXplCQCsAgIJAKwCAgUKTEFORFBSRUZJWAUHbGFuZE51bQUIbGFuZFNpemUBFWtleUxhbmRBc3NldElkVG9Pd25lcgEHYXNzZXRJZAkArAICAgluZnRPd25lcl8FB2Fzc2V0SWQBEGtleUR1Y2tJZFRvT3duZXIBB2Fzc2V0SWQJAKwCAgIKZHVja093bmVyXwUHYXNzZXRJZAEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEHYXNzZXRJZAkArAICAgtzdGFrZWRUaW1lXwUHYXNzZXRJZAEUa2V5U3Rha2VkRHVja0J5T3duZXIBCW93bmVyQWRkcgkArAICAhJzdGFrZWREdWNrQnlPd25lcl8FCW93bmVyQWRkcgEia2V5U3Rha2VkVGltZUJ5VHlwZUFzc2V0SWRBbmRPd25lcgMHbmZ0VHlwZQdhc3NldElkCW93bmVyQWRkcgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICIHN0YWtlZFRpbWVCeVR5cGVBc3NldElkQW5kT3duZXJfBQduZnRUeXBlAgFfBQdhc3NldElkAgFfBQlvd25lckFkZHIBEWtleUxhbmROdW1Ub093bmVyAQdsYW5kTnVtCQCsAgICCmxhbmRPd25lcl8FB2xhbmROdW0BEWtleUJhY2twYWNrQnlEdWNrAQtkdWNrQXNzZXRJZAkArAICAgliYWNrUGFja18FC2R1Y2tBc3NldElkAQ9rZXlEdWNrTG9jYXRpb24BC2R1Y2tBc3NldElkCQCsAgICDWR1Y2tMb2NhdGlvbl8FC2R1Y2tBc3NldElkAQ1rZXlEdWNrSGVhbHRoAQtkdWNrQXNzZXRJZAkArAICAgtkdWNrSGVhbHRoXwULZHVja0Fzc2V0SWQACnJlY0xhbmROdW0AAAALcmVjTGFuZFNpemUAAQALcmVjVGVycmFpbnMAAgAMcmVjQ29udGluZW50AAMAD2xvY0lkeENvbnRpbmVudAAAAApsb2NJZHhUeXBlAAEACGxvY0lkeElkAAIACmJwSWR4TGV2ZWwAAAAIYnBJZHhSZXMAAQAIYnBJZHhNYXQAAgAJYnBJZHhQcm9kAAMBDWNvdW50VGVycmFpbnMBCHRlcnJhaW5zCQDMCAIJAGUCCQCQAwEJALUJAgUIdGVycmFpbnMCAUEAAQkAzAgCCQBlAgkAkAMBCQC1CQIFCHRlcnJhaW5zAgFCAAEJAMwIAgkAZQIJAJADAQkAtQkCBQh0ZXJyYWlucwIBQwABCQDMCAIJAGUCCQCQAwEJALUJAgUIdGVycmFpbnMCAUQAAQkAzAgCCQBlAgkAkAMBCQC1CQIFCHRlcnJhaW5zAgFFAAEJAMwIAgkAZQIJAJADAQkAtQkCBQh0ZXJyYWlucwIBRgABBQNuaWwBD251bVBpZWNlc0J5U2l6ZQEIbGFuZFNpemUEByRtYXRjaDAFCGxhbmRTaXplAwkAAAICAVMFByRtYXRjaDAAGQMJAAACAgFNBQckbWF0Y2gwAGQDCQAAAgIBTAUHJG1hdGNoMADhAQMJAAACAgJYTAUHJG1hdGNoMACQAwMJAAACAgNYWEwFByRtYXRjaDAA8QQJAAIBAhFVbmtub3duIGxhbmQgc2l6ZQEMc3Vi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YXJlIGFjY2VwdGVkBAtsYW5kTnVtU2l6ZQkAsAICCAUFYXNzZXQEbmFtZQAEBAdsYW5kTnVtAwkBCGNvbnRhaW5zAgULbGFuZE51bVNpemUCA1hYTAkAswICBQtsYW5kTnVtU2l6ZQADAwkBCGNvbnRhaW5zAgULbGFuZE51bVNpemUCAlhMCQCzAgIFC2xhbmROdW1TaXplAAIJALMCAgULbGFuZE51bVNpemUAAQMJAQEhAQkBCWlzRGVmaW5lZAEJALYJAQUHbGFuZE51bQkAAgEJAKwCAgIeQ2Fubm90IHBhcnNlIGxhbmQgbnVtYmVyIGZyb20gCAUFYXNzZXQEbmFtZQQHdGltZUtleQkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBCQDYBAEFB2Fzc2V0SWQDCQEJaXNEZWZpbmVkAQkAnwgBBQd0aW1lS2V5CQACAQkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAhIgaXMgYWxyZWFkeSBzdGFrZWQJAMwIAgkBDEludGVnZXJFbnRyeQIFB3RpbWVLZXkIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEia2V5U3Rha2VkVGltZUJ5VHlwZUFzc2V0SWRBbmRPd25lcgMFCkxBTkRQUkVGSVgJANgEAQUHYXNzZXRJZAUHYWRkcmVzcwgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBC1N0cmluZ0VudHJ5AgkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEJANgEAQUHYXNzZXRJZAUHYWRkcmVzcwkAzAgCCQELU3RyaW5nRW50cnkCCQERa2V5TGFuZE51bVRvT3duZXIBBQdsYW5kTnVtBQdhZGRyZXNzBQNuaWwBaQELdW5zdGFrZUxhbmQBC2xhbmRBc3NldElkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIkdW5zdGFrZSBkb2Vzbid0IHJlcXVpcmUgYW55IHBheW1lbnRzBAdhc3NldElkCQDZBAEFC2xhbmRBc3NldElkBAdhZGRyZXNzCQClCAEIBQFpBmNhbGxlcgQFYXNzZXQJAQV2YWx1ZQEJAOwHAQUHYXNzZXRJZAMJAQIhPQIIBQVhc3NldAZpc3N1ZXIFBHRoaXMJAAIBAhdVbmtub3duIGlzc3VlciBvZiB0b2tlbgMJAQEhAQkBCGNvbnRhaW5zAggFBWFzc2V0BG5hbWUFCkxBTkRQUkVGSVgJAAIBCQCsAgIJAKwCAgIJT25seSBORlQgBQpMQU5EUFJFRklYAhcgdG9rZW5zIGNhbiBiZSB1bnN0YWtlZAQHdGltZUtleQkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEFB3RpbWVLZXkJAAIBCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkBAVvd25lcgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQtsYW5kQXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDCQECIT0CBQVvd25lcgUHYWRkcmVzcwkAAgECF1N0YWtlZCBORlQgaXMgbm90IHlvdXJzCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgABBQdhc3NldElkCQDMCAIJAQtEZWxldGVFbnRyeQEFB3RpbWVLZXkJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBImtleVN0YWtlZFRpbWVCeVR5cGVBc3NldElkQW5kT3duZXIDBQpMQU5EUFJFRklYBQtsYW5kQXNzZXRJZAUHYWRkcmVzcwUDbmlsAWkBCXN0YWtlRHVjawAEA3BtdAkBBXZhbHVlAQkAkQMCCAUBaQhwYXltZW50cwAABAdhc3NldElkCQEFdmFsdWUBCAUDcG10B2Fzc2V0SWQEB2FkZHJlc3MJAKUIAQgFAWkGY2FsbGVyAwkBAiE9AggFA3BtdAZhbW91bnQAAQkAAgEJAKwCAgkArAICAgRORlQgBQpEVUNLUFJFRklYAiQgdG9rZW4gc2hvdWxkIGJlIGF0dGFjaGVkIGFzIHBheW1lbnQEBWFzc2V0CQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQDAwkBAiE9AggFBWFzc2V0Bmlzc3VlcgUNaW5jdWJhdG9yQWRkcgkBAiE9AggFBWFzc2V0Bmlzc3VlcgULYnJlZWRlckFkZHIHCQACAQkArAICCQCsAgICElVua25vd24gaXNzdWVyIG9mIAUKRFVDS1BSRUZJWAIGIHRva2VuAwkBASEBCQEIY29udGFpbnMCCAUFYXNzZXQEbmFtZQUKRFVDS1BSRUZJWAkAAgEJAKwCAgkArAICAglPbmx5IE5GVCAFCkRVQ0tQUkVGSVgCFCB0b2tlbnMgYXJlIGFjY2VwdGVkBAphc3NldElkU3RyCQDYBAEFB2Fzc2V0SWQEB3RpbWVLZXkJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQUKYXNzZXRJZFN0cgMJAQlpc0RlZmluZWQBCQCfCAEFB3RpbWVLZXkJAAIBCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCEiBpcyBhbHJlYWR5IHN0YWtlZAMJAQlpc0RlZmluZWQBCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFB2FkZHJlc3MJAAIBCQCsAgICHVlvdSBhbHJlYWR5IHN0YWtlZCBvbmUgZHVjazogCAUFYXNzZXQEbmFtZQQGbG9jS2V5CQEPa2V5RHVja0xvY2F0aW9uAQUKYXNzZXRJZFN0cgQIbG9jYXRpb24JAKIIAQUGbG9jS2V5BAlrZXlIZWFsdGgJAQ1rZXlEdWNrSGVhbHRoAQUKYXNzZXRJZFN0cgQGaGVhbHRoCQCfCAEFCWtleUhlYWx0aAQFYnBLZXkJARFrZXlCYWNrcGFja0J5RHVjawEFCmFzc2V0SWRTdHIECGJhY2twYWNrCQCiCAEFBWJwS2V5CQDOCAIJAMwIAgkBDEludGVnZXJFbnRyeQIFB3RpbWVLZXkIBQlsYXN0QmxvY2sJdGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEia2V5U3Rha2VkVGltZUJ5VHlwZUFzc2V0SWRBbmRPd25lcgMFCkRVQ0tQUkVGSVgJANgEAQUHYXNzZXRJZAUHYWRkcmVzcwgFCWxhc3RCbG9jawl0aW1lc3RhbXAJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEGtleUR1Y2tJZFRvT3duZXIBBQphc3NldElkU3RyBQdhZGRyZXNzCQDMCAIJAQtTdHJpbmdFbnRyeQIJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFB2FkZHJlc3MFCmFzc2V0SWRTdHIFA25pbAMJAQlpc0RlZmluZWQBBQhsb2NhdGlvbgUDbmlsCQDOCAIJAMwIAgkBC1N0cmluZ0VudHJ5AgUGbG9jS2V5BQ9ERUZBVUxUTE9DQVRJT04FA25pbAMJAQlpc0RlZmluZWQBBQZoZWFsdGgFA25pbAkAzggCCQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrZXlIZWFsdGgAZAUDbmlsAwkBCWlzRGVmaW5lZAEFCGJhY2twYWNrBQNuaWwJAMwIAgkBC1N0cmluZ0VudHJ5AgUFYnBLZXkCGjA6MF8wXzBfMF8wXzA6MF8wXzBfMF8wXzA6BQNuaWwBaQELdW5zdGFrZUR1Y2sBCmFzc2V0SWRTdHIDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAiR1bnN0YWtlIGRvZXNuJ3QgcmVxdWlyZSBhbnkgcGF5bWVudHMEB2Fzc2V0SWQJANkEAQUKYXNzZXRJZFN0cgQHYWRkcmVzcwkApQgBCAUBaQZjYWxsZXIEBWFzc2V0CQEFdmFsdWUBCQDsBwEFB2Fzc2V0SWQDAwkBAiE9AggFBWFzc2V0Bmlzc3VlcgUNaW5jdWJhdG9yQWRkcgkBAiE9AggFBWFzc2V0Bmlzc3VlcgULYnJlZWRlckFkZHIHCQACAQkArAICCQCsAgICElVua25vd24gaXNzdWVyIG9mIAUKRFVDS1BSRUZJWAIGIHRva2VuAwkBASEBCQEIY29udGFpbnMCCAUFYXNzZXQEbmFtZQUKRFVDS1BSRUZJWAkAAgEJAKwCAgkArAICAglPbmx5IE5GVCAFCkRVQ0tQUkVGSVgCFyB0b2tlbnMgY2FuIGJlIHVuc3Rha2VkBAd0aW1lS2V5CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEJANgEAQUHYXNzZXRJZAMJAQEhAQkBCWlzRGVmaW5lZAEFB3RpbWVLZXkJAAIBCQCsAgIJAKwCAgIETkZUIAgFBWFzc2V0BG5hbWUCDiBpcyBub3Qgc3Rha2VkAwkBASEBCQEJaXNEZWZpbmVkAQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUHYWRkcmVzcwkAAgEJAKwCAgkArAICAglUaGUgZHVjayAIBQVhc3NldARuYW1lAg4gaXMgbm90IHN0YWtlZAQFb3duZXIJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEQa2V5RHVja0lkVG9Pd25lcgEJANgEAQUHYXNzZXRJZAkArAICCQCsAgICBE5GVCAIBQVhc3NldARuYW1lAgwgaXMgb3JwaGFuZWQDCQECIT0CBQVvd25lcgUHYWRkcmVzcwkAAgECF1N0YWtlZCBORlQgaXMgbm90IHlvdXJzCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgABBQdhc3NldElkCQDMCAIJAQtEZWxldGVFbnRyeQEFB3RpbWVLZXkJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBD2tleUR1Y2tMb2NhdGlvbgEFCmFzc2V0SWRTdHIJAMwIAgkBC0RlbGV0ZUVudHJ5AQkBImtleVN0YWtlZFRpbWVCeVR5cGVBc3NldElkQW5kT3duZXIDBQpEVUNLUFJFRklYBQphc3NldElkU3RyBQdhZGRyZXNzCQDMCAIJAQtEZWxldGVFbnRyeQEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEFB2FkZHJlc3MFA25pbAFpAQhjbGFpbVJlcwIGYW1vdW50C2xhbmRBc3NldElkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIlY2xhaW1SZXMgZG9lc24ndCByZXF1aXJlIGFueSBwYXltZW50cwQEYWRkcgkApQgBCAUBaQZjYWxsZXIEBWFzc2V0CQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQDCQEBIQEJAQhjb250YWlucwIIBQVhc3NldARuYW1lBQpMQU5EUFJFRklYCQACAQkArAICCQCsAgICBE5GVCAFCkxBTkRQUkVGSVgCICB0b2tlbiBzaG91bGQgYmUgcGFzc2VkIGFzIHBhcmFtBAd0aW1lS2V5CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3NldElkBAlzYXZlZFRpbWUJAJ8IAQUHdGltZUtleQMJAQEhAQkBCWlzRGVmaW5lZAEFCXNhdmVkVGltZQkAAgEJAKwCAgkArAICAgRORlQgCAUFYXNzZXQEbmFtZQIOIGlzIG5vdCBzdGFrZWQEBW93bmVyCQERQGV4dHJOYXRpdmUoMTA1OCkBCQEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQULbGFuZEFzc2V0SWQDCQECIT0CBQVvd25lcgUEYWRkcgkAAgEJAKwCAgUKTEFORFBSRUZJWAINIGlzIG5vdCB5b3VycwQBZAkAtQkCCAUFYXNzZXQLZGVzY3JpcHRpb24CAV8ECGxhbmRTaXplCQCRAwIFAWQFC3JlY0xhbmRTaXplBA10ZXJyYWluQ291bnRzCQENY291bnRUZXJyYWlucwEJAJEDAgUBZAULcmVjVGVycmFpbnMEBGR1Y2sJAKIIAQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUEYWRkcgMJAQEhAQkBCWlzRGVmaW5lZAEFBGR1Y2sJAAIBAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkBA5kdWNrQXNzZXRJZFN0cgkBBXZhbHVlAQUEZHVjawQLY3VyTG9jYXRpb24JAQt2YWx1ZU9yRWxzZQIJAKIIAQkBD2tleUR1Y2tMb2NhdGlvbgEFDmR1Y2tBc3NldElkU3RyBQ9ERUZBVUxUTE9DQVRJT04EA2xvYwkAtQkCCQEFdmFsdWUBBQtjdXJMb2NhdGlvbgIBXwMJAQIhPQIJAJEDAgUDbG9jBQpsb2NJZHhUeXBlAgFMCQACAQkArAICCQCsAgICFkR1Y2sgbG9jYXRpb24gdHlwZSBpcyAJAJEDAgUDbG9jBQpsb2NJZHhUeXBlAhEsIGJ1dCBzaG91bGQgYmUgTAMJAQIhPQIJAJEDAgUDbG9jBQhsb2NJZHhJZAULbGFuZEFzc2V0SWQJAAIBCQCsAgIJAKwCAgkArAICAhREdWNrIGxvY2F0aW9uIGlkIGlzIAkAkQMCBQNsb2MFCGxvY0lkeElkAhAsIGJ1dCBzaG91bGQgYmUgBQtsYW5kQXNzZXRJZAQJZGVsdGFUaW1lCQBlAggFCWxhc3RCbG9jawl0aW1lc3RhbXAJAQV2YWx1ZQEFCXNhdmVkVGltZQMJAGYCAAAFCWRlbHRhVGltZQkAAgEJAKwCAgkArAICCQCsAgICJlNhdmVkIHRpbWVzdGFtcCBpcyBpbiBmdXR1cmUsIHNhdmVkID0gCQCkAwEJAQV2YWx1ZQEFCXNhdmVkVGltZQIMLCBjdXJyZW50ID0gCQCkAwEIBQlsYXN0QmxvY2sJdGltZXN0YW1wBAZwaWVjZXMJAQ9udW1QaWVjZXNCeVNpemUBBQhsYW5kU2l6ZQQIYXZhaWxSZXMJAGgCCQBrAwUJZGVsdGFUaW1lBQ9EQUlMWVJFU0JZUElFQ0UFCURBWU1JTExJUwUGcGllY2VzAwkAZgIFBmFtb3VudAUIYXZhaWxSZXMJAAIBCQCsAgIJAKwCAgkArAICAiJOb3QgZW5vdWdoIHJlc291cmNlcywgYXZhaWxhYmxlID0gCQCkAwEFCGF2YWlsUmVzAg4sIHJlcXVlc3RlZCA9IAkApAMBBQZhbW91bnQEDG5ld0RlbHRhVGltZQkAawMJAGUCBQhhdmFpbFJlcwUGYW1vdW50BQlEQVlNSUxMSVMJAGgCBQZwaWVjZXMFD0RBSUxZUkVTQllQSUVDRQQMbmV3VGltZXN0YW1wCQBlAggFCWxhc3RCbG9jawl0aW1lc3RhbXAFDG5ld0RlbHRhVGltZQQFYnBLZXkJARFrZXlCYWNrcGFja0J5RHVjawEFDmR1Y2tBc3NldElkU3RyBAtjdXJyZW50UGFjawkAtQkCCQELdmFsdWVPckVsc2UCCQCiCAEFBWJwS2V5AhowOjBfMF8wXzBfMF8wOjBfMF8wXzBfMF8wOgIBOgQKY3VycmVudFJlcwkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwQFYnBSZXMJAQZhZGRSZXMEBQpjdXJyZW50UmVzBQ10ZXJyYWluQ291bnRzCQBlAgUJZGVsdGFUaW1lBQxuZXdEZWx0YVRpbWUJAGkCBQZwaWVjZXMAGQQHbmV3UGFjawkAuQkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgUFYnBSZXMJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwCAToJAJQKAgkAzAgCCQELU3RyaW5nRW50cnkCBQVicEtleQUHbmV3UGFjawkAzAgCCQEMSW50ZWdlckVudHJ5AgUHdGltZUtleQUMbmV3VGltZXN0YW1wCQDMCAIJAQxJbnRlZ2VyRW50cnkCCQEia2V5U3Rha2VkVGltZUJ5VHlwZUFzc2V0SWRBbmRPd25lcgMFCkxBTkRQUkVGSVgFC2xhbmRBc3NldElkBQVvd25lcgUMbmV3VGltZXN0YW1wBQNuaWwFBHVuaXQBaQEGZmxpZ2h0AgdtZXNzYWdlA3NpZwMJAQEhAQkAxBMDBQdtZXNzYWdlBQNzaWcFA3B1YgkAAgECGHNpZ25hdHVyZSBkb2VzIG5vdCBtYXRjaAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECI2ZsaWdodCBkb2Vzbid0IHJlcXVpcmUgYW55IHBheW1lbnRzBAVwYXJ0cwkAtQkCCQCwCQEFB21lc3NhZ2UCATsEAmhwCQC1CQIJAJEDAgkAtQkCCQCRAwIFBXBhcnRzAAACAXwAAAIBXwQFY3VySFAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQJocAAABAVuZXdIUAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmhwAAEEDW5ld0xvY0FuZFRpbWUJALUJAgkAkQMCBQVwYXJ0cwABAgE6BAtuZXdMb2NhdGlvbgkAkQMCBQ1uZXdMb2NBbmRUaW1lAAAEBHRpbWUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQ1uZXdMb2NBbmRUaW1lAAEDAwkAZgIFBHRpbWUJAGQCCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAURRklWRU1JTlVURVNNSUxMSVMGCQBmAgkAZQIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBRFGSVZFTUlOVVRFU01JTExJUwUEdGltZQkAAgECEnNpZ25hdHVyZSBvdXRkYXRlZAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAoggBCQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQJa2V5SGVhbHRoCQENa2V5RHVja0hlYWx0aAEFC2R1Y2tBc3NldElkBAxvbGRGcm9tU3RhdGUJAQt2YWx1ZU9yRWxzZQIJAJ8IAQUJa2V5SGVhbHRoAGQDCQECIT0CBQxvbGRGcm9tU3RhdGUFBWN1ckhQCQACAQkArAICCQCsAgIJAKwCAgIKb2xkSGVhbHRoPQkApAMBCQELdmFsdWVPckVsc2UCCQCfCAEFCWtleUhlYWx0aABkAi8gZnJvbSBzdGF0ZSBkb2VzIG5vdCBtYXRjaCBvbmUgZnJvbSBmbGlnaHQgbG9nPQkApAMBBQVjdXJIUAMJAGcCAAAFBWN1ckhQCQACAQIeWW91IGNhbid0IGZseSB3aXRoIHplcm8gaGVhbHRoBAZsb2NLZXkJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAQLY3VyTG9jYXRpb24JAQt2YWx1ZU9yRWxzZQIJAKIIAQUGbG9jS2V5BQ9ERUZBVUxUTE9DQVRJT04DCQAAAgULbmV3TG9jYXRpb24FC2N1ckxvY2F0aW9uCQACAQIiWW91IGNhbid0IGZseSB0byB0aGUgc2FtZSBsb2NhdGlvbgkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIFBmxvY0tleQMJAGYCBQVuZXdIUAAABQtuZXdMb2NhdGlvbgULY3VyTG9jYXRpb24JAMwIAgkBDEludGVnZXJFbnRyeQIFCWtleUhlYWx0aAUFbmV3SFAFA25pbAUEdW5pdAFpAQlzZXRIZWFsdGgCBmhlYWx0aAtkdWNrQXNzZXRJZAMDCQBmAgAABQZoZWFsdGgGCQBmAgUGaGVhbHRoAGQJAAIBAhpIUCBzaG91bGQgYmUgd2l0aGluIDAuLjEwMAkAzAgCCQEMSW50ZWdlckVudHJ5AgkBDWtleUR1Y2tIZWFsdGgBBQtkdWNrQXNzZXRJZAUGaGVhbHRoBQNuaWwBaQEEaGVhbAIHbWF0VHlwZQZhbW91bnQDAwkAZgIAAAUHbWF0VHlwZQYJAGcCBQdtYXRUeXBlBQZOVU1SRVMJAAIBCQCsAgICElVua25vd24gbWF0ZXJpYWw6IAkApAMBBQdtYXRUeXBlAwkAZwIAAAUGYW1vdW50CQACAQkArAICAhtBbW91bnQgc2hvdWxkIGJlIHBvc2l0aXZlISAJAKQDAQUGYW1vdW50BAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkBAlrZXlIZWFsdGgJAQ1rZXlEdWNrSGVhbHRoAQULZHVja0Fzc2V0SWQECW9sZEhlYWx0aAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlrZXlIZWFsdGgAZAMJAGcCBQlvbGRIZWFsdGgAZAkAAgECGkhQIHNob3VsZCBiZSA8IDEwMCB0byBoZWFsBAVicEtleQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEC2N1cnJlbnRQYWNrCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAKIIAQUFYnBLZXkCGjA6MF8wXzBfMF8wXzA6MF8wXzBfMF8wXzA6AgE6BAdtYXRMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfBAVtTGlzdAMJAQIhPQIJAJADAQUHbWF0TGlzdAUGTlVNUkVTCQDMCAICATAJAMwIAgIBMAkAzAgCAgEwCQDMCAICATAJAMwIAgIBMAkAzAgCAgEwBQNuaWwFB21hdExpc3QEDWN1cnJlbnRBbW91bnQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQVtTGlzdAUHbWF0VHlwZQQLZGVsdGFIZWFsdGgJAJcDAQkAzAgCCQBpAgUGYW1vdW50BQhIRUFMQ09TVAkAzAgCCQBlAgBkBQlvbGRIZWFsdGgFA25pbAQLc3BlbmRBbW91bnQJAGgCBQtkZWx0YUhlYWx0aAUISEVBTENPU1QDCQBmAgULc3BlbmRBbW91bnQFDWN1cnJlbnRBbW91bnQJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJWW91IG5lZWQgCQCkAwEFC3NwZW5kQW1vdW50AgQgb2YgCQCRAwIFCG1hdFR5cGVzBQdtYXRUeXBlAiQgdG8gaGVhbCwgYnV0IHlvdSBiYWNrcGFjayBjb250YWlucyAJAKQDAQUNY3VycmVudEFtb3VudAQGbmV3TWF0CQEMc3ViT25lSW5MaXN0AwUFbUxpc3QFB21hdFR5cGUFC3NwZW5kQW1vdW50CQDMCAIJAQxJbnRlZ2VyRW50cnkCBQlrZXlIZWFsdGgJAGQCBQlvbGRIZWFsdGgFC2RlbHRhSGVhbHRoCQDMCAIJAQtTdHJpbmdFbnRyeQIFBWJwS2V5CQC5CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwkAzAgCBQZuZXdNYXQJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwCAToFA25pbAFpAQ51cGRhdGVCYWNrcGFjawILZHVja0Fzc2V0SWQHbmV3UGFjawMJAQIhPQIIBQFpBmNhbGxlcgULZWNvbm9teUFkZHIJAAIBAhFwZXJtaXNzaW9uIGRlbmllZAkAlAoCCQDMCAIJAQtTdHJpbmdFbnRyeQIJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBQduZXdQYWNrBQNuaWwFB25ld1BhY2sBaQEKZXhwZWRpdGlvbgIHbWVzc2FnZQNzaWcDCQEBIQEJAMQTAwUHbWVzc2FnZQUDc2lnBQNwdWIJAAIBAhhzaWduYXR1cmUgZG9lcyBub3QgbWF0Y2gDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAidleHBlZGl0aW9uIGRvZXNuJ3QgcmVxdWlyZSBhbnkgcGF5bWVudHMEBXBhcnRzCQC1CQIJALAJAQUHbWVzc2FnZQIBOwQCaHAJALUJAgkAkQMCCQC1CQIJAJEDAgUFcGFydHMAAAIBfAAAAgFfBAVjdXJIUAkBDXBhcnNlSW50VmFsdWUBCQCRAwIFAmhwAAAEBW5ld0hQCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUCaHAAAQQKbG9jQW5kVGltZQkAtQkCCQCRAwIFBXBhcnRzAAECAToEDnRhcmdldExvY2F0aW9uCQC1CQIJAJEDAgUKbG9jQW5kVGltZQAAAgFfAwkBAiE9AgkAkQMCBQ50YXJnZXRMb2NhdGlvbgABAgFFCQACAQIrZXhwZWRpdGlvbiB0YXJnZXQgbG9jYXRpb24gdHlwZSBzaG91bGQgYmUgRQQEdGltZQkBDXBhcnNlSW50VmFsdWUBCQCRAwIFCmxvY0FuZFRpbWUAAQMDCQBmAgUEdGltZQkAZAIIBQlsYXN0QmxvY2sJdGltZXN0YW1wBRFGSVZFTUlOVVRFU01JTExJUwYJAGYCCQBlAggFCWxhc3RCbG9jawl0aW1lc3RhbXAFEUZJVkVNSU5VVEVTTUlMTElTBQR0aW1lCQACAQISc2lnbmF0dXJlIG91dGRhdGVkBAh1c2VyQWRkcgkApQgBCAUBaQZjYWxsZXIEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKIIAQkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQUIdXNlckFkZHICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQECWtleUhlYWx0aAkBDWtleUR1Y2tIZWFsdGgBBQtkdWNrQXNzZXRJZAQMb2xkRnJvbVN0YXRlCQELdmFsdWVPckVsc2UCCQCfCAEFCWtleUhlYWx0aABkAwkBAiE9AgUMb2xkRnJvbVN0YXRlBQVjdXJIUAkAAgEJAKwCAgkArAICCQCsAgICCm9sZEhlYWx0aD0JAKQDAQkBC3ZhbHVlT3JFbHNlAgkAnwgBBQlrZXlIZWFsdGgAZAIvIGZyb20gc3RhdGUgZG9lcyBub3QgbWF0Y2ggb25lIGZyb20gZmxpZ2h0IGxvZz0JAKQDAQUFY3VySFADCQBnAgAABQVjdXJIUAkAAgECHllvdSBjYW4ndCBmbHkgd2l0aCB6ZXJvIGhlYWx0aAMJAGcCAAAFBW5ld0hQCQACAQIrWW91ciBkdWNrIGhlYWx0aCBpcyB6ZXJvLCBleHBlZGl0aW9uIGZhaWxlZAQLY3VycmVudFBhY2sJALUJAgkBC3ZhbHVlT3JFbHNlAgkAoggBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAIaMDowXzBfMF8wXzBfMDowXzBfMF8wXzBfMDoCAToEB21hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8ECHRvdGFsTWF0CQBkAgkAZAIJAGQCCQBkAgkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdtYXRMaXN0AAAJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdtYXRMaXN0AAEJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdtYXRMaXN0AAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdtYXRMaXN0AAMJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdtYXRMaXN0AAQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdtYXRMaXN0AAUDCQBmAgUMRVhQTUFURVJJQUxTBQh0b3RhbE1hdAkAAgEJAKwCAgkArAICAglZb3UgbmVlZCAJAKQDAQUMRVhQTUFURVJJQUxTAicgKiAxMF4tOCBtYXRlcmlhbHMgdG90YWwgZm9yIGV4cGVkaXRpb24EBG51bXMJAL0JAgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCiCAEJARJrZXlGcmVlTGFuZE51bXNNYXAACQCsAgIJARJrZXlGcmVlTGFuZE51bXNNYXAAAhMgaXMgbm90IGluaXRpYWxpemVkAgFfBANsZW4JAJADAQUEbnVtcwQGYmlnTnVtCQEDYWJzAQkAngMBCAUBaQ10cmFuc2FjdGlvbklkBBBudW1BY3Rpb25BbmRTZWVkAwkAAAIFA2xlbgAABAdmcmVlTnVtCQELdmFsdWVPckVsc2UCCQCfCAEJARJrZXlOZXh0RnJlZUxhbmROdW0AAPUDCQCVCgMJAKQDAQUHZnJlZU51bQkBDEludGVnZXJFbnRyeQIJARJrZXlOZXh0RnJlZUxhbmROdW0ACQBkAgUHZnJlZU51bQABBQZiaWdOdW0EAXEJALYCAQUDbGVuBAZtYXBJZHgJAKADAQkAuwICBQZiaWdOdW0FAXEJAJUKAwkAkQMCBQRudW1zBQZtYXBJZHgJAQtTdHJpbmdFbnRyeQIJARJrZXlGcmVlTGFuZE51bXNNYXAACQC7CQIJANEIAgUEbnVtcwUGbWFwSWR4AgFfCQC6AgIFBmJpZ051bQUBcQQMY29udGluZW50SWR4CQCgAwEJALsCAggFEG51bUFjdGlvbkFuZFNlZWQCXzMFBUZJVkVYBAFmCQCRAwIFBGZyZXEFDGNvbnRpbmVudElkeAoBEHRlcnJhaW5HZW5lcmF0b3ICA2FjYwRlbGVtCQCUCgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCAUDYWNjAl8xCQEHZ2VuQ2hhcgIIBQNhY2MCXzIFAWYJAQdnZW5DaGFyAgkAugICCAUDYWNjAl8yBQdUV0VOVFlYBQFmCQEHZ2VuQ2hhcgIJALoCAggFA2FjYwJfMgUIVFdFTlRZMlgFAWYJAQdnZW5DaGFyAgkAugICCAUDYWNjAl8yBQhUV0VOVFkzWAUBZgkBB2dlbkNoYXICCQC6AgIIBQNhY2MCXzIFCFRXRU5UWTRYBQFmCQC6AgIIBQNhY2MCXzIFCFRXRU5UWTVYBAF0CgACJGwJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlAoCAgAJALoCAggFEG51bUFjdGlvbkFuZFNlZWQCXzMFBUZJVkVYCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJARB0ZXJyYWluR2VuZXJhdG9yAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQQJY29udGluZW50CQCRAwIFCmNvbnRpbmVudHMFDGNvbnRpbmVudElkeAQFaXNzdWUJAMIIBQkBCmtleU5mdE5hbWUCCAUQbnVtQWN0aW9uQW5kU2VlZAJfMQIBUwkAuQkCCQDMCAIIBRBudW1BY3Rpb25BbmRTZWVkAl8xCQDMCAICAVMJAMwIAggFAXQCXzEJAMwIAgUJY29udGluZW50BQNuaWwCAV8AAQAABwQHYXNzZXRJZAkAuAgBBQVpc3N1ZQQCaWQJANgEAQUHYXNzZXRJZAkAlAoCCQDMCAIIBRBudW1BY3Rpb25BbmRTZWVkAl8yCQDMCAIFBWlzc3VlCQDMCAIJAQtTdHJpbmdFbnRyeQIJARBrZXlMYW5kVG9Bc3NldElkAQgFEG51bUFjdGlvbkFuZFNlZWQCXzEFAmlkCQDMCAIJAQtTdHJpbmdFbnRyeQIJARVrZXlMYW5kQXNzZXRJZFRvT3duZXIBBQJpZAUIdXNlckFkZHIJAMwIAgkBC1N0cmluZ0VudHJ5AgkBEWtleUxhbmROdW1Ub093bmVyAQgFEG51bUFjdGlvbkFuZFNlZWQCXzEFCHVzZXJBZGRyCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgABBQdhc3NldElkCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAkAuQkCCQDMCAIFCWNvbnRpbmVudAkAzAgCAgFMCQDMCAIFAmlkBQNuaWwCAV8JAMwIAgkBDEludGVnZXJFbnRyeQIFCWtleUhlYWx0aAUFbmV3SFAFA25pbAUEdW5pdACzI1eV", "height": 2372000, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EJUih26gnK7JcrYUpLPafmH4zxkW3wVuFYk7k8rQG4x6 Next: 7g5t5rQfrJkYyopZd59UAi4e3tT4Y31EVUV5khJuyWC7 Diff:
OldNewDifferences
7575
7676 let matTypes = ["Fuel", "Metal", "Plank", "Glass", "Plastic", "Protein"]
7777
78-let continents = ["Americas", "Europe", "Asia", "Africa", "Oceania"]
78+let continents = ["Asia", "Europe", "Americas", "Oceania", "Africa"]
7979
8080 func keyNextFreeLandNum () = "nextLandNum"
8181
211211
212212 let freq = [[1, 4, 9, 10, 15], [5, 8, 13, 14, 15], [6, 9, 14, 15, 16], [4, 7, 8, 13, 18], [1, 6, 7, 15, 19]]
213213
214-func genChar (n,continentIdx) = {
214+func genChar (n,freqs) = {
215215 let rem = toInt((n % TWENTYX))
216- let letter = if ((freq[continentIdx][0] > rem))
216+ let letter = if ((freqs[0] > rem))
217217 then "A"
218- else if ((freq[continentIdx][1] > rem))
218+ else if ((freqs[1] > rem))
219219 then "B"
220- else if ((freq[continentIdx][2] > rem))
220+ else if ((freqs[2] > rem))
221221 then "C"
222- else if ((freq[continentIdx][3] > rem))
222+ else if ((freqs[3] > rem))
223223 then "D"
224- else if ((freq[continentIdx][4] > rem))
224+ else if ((freqs[4] > rem))
225225 then "E"
226226 else "F"
227227 letter
512512
513513
514514 @Callable(i)
515-func expedition () = if ((size(i.payments) != 0))
516- then throw("expedition doesn't require any payments")
517- else {
518- let userAddr = toString(i.caller)
519- let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(userAddr)), "You don't have a duck staked")
520- let keyHealth = keyDuckHealth(duckAssetId)
521- let health = valueOrElse(getInteger(keyHealth), 100)
522- if ((0 >= health))
523- then throw("Your duck needs healing")
524- else {
525- let currentPack = split(valueOrElse(getString(keyBackpackByDuck(duckAssetId)), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
526- let matList = split(currentPack[bpIdxMat], "_")
527- let totalMat = (((((parseIntValue(matList[0]) + parseIntValue(matList[1])) + parseIntValue(matList[2])) + parseIntValue(matList[3])) + parseIntValue(matList[4])) + parseIntValue(matList[5]))
528- let nums = split_51C(valueOrErrorMessage(getString(keyFreeLandNumsMap()), (keyFreeLandNumsMap() + " is not initialized")), "_")
529- let len = size(nums)
530- let bigNum = abs(toBigInt(i.transactionId))
531- let numActionAndSeed = if ((len == 0))
532- then {
533- let freeNum = valueOrElse(getInteger(keyNextFreeLandNum()), 501)
534- $Tuple3(toString(freeNum), IntegerEntry(keyNextFreeLandNum(), (freeNum + 1)), bigNum)
535- }
536- else {
537- let q = toBigInt(len)
538- let mapIdx = toInt((bigNum % q))
539- $Tuple3(nums[mapIdx], StringEntry(keyFreeLandNumsMap(), makeString_11C(removeByIndex(nums, mapIdx), "_")), (bigNum / q))
540- }
541- let continentIdx = toInt((numActionAndSeed._3 % FIVEX))
542- func terrainGenerator (acc,elem) = $Tuple2((((((acc._1 + genChar(acc._2, continentIdx)) + genChar((acc._2 / TWENTYX), continentIdx)) + genChar((acc._2 / TWENTY2X), continentIdx)) + genChar((acc._2 / TWENTY3X), continentIdx)) + genChar((acc._2 / TWENTY4X), continentIdx)), (acc._2 / TWENTY5X))
515+func expedition (message,sig) = if (!(sigVerify_8Kb(message, sig, pub)))
516+ then throw("signature does not match")
517+ else if ((size(i.payments) != 0))
518+ then throw("expedition doesn't require any payments")
519+ else {
520+ let parts = split(toUtf8String(message), ";")
521+ let hp = split(split(parts[0], "|")[0], "_")
522+ let curHP = parseIntValue(hp[0])
523+ let newHP = parseIntValue(hp[1])
524+ let locAndTime = split(parts[1], ":")
525+ let targetLocation = split(locAndTime[0], "_")
526+ if ((targetLocation[1] != "E"))
527+ then throw("expedition target location type should be E")
528+ else {
529+ let time = parseIntValue(locAndTime[1])
530+ if (if ((time > (lastBlock.timestamp + FIVEMINUTESMILLIS)))
531+ then true
532+ else ((lastBlock.timestamp - FIVEMINUTESMILLIS) > time))
533+ then throw("signature outdated")
534+ else {
535+ let userAddr = toString(i.caller)
536+ let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(userAddr)), "You don't have a duck staked")
537+ let keyHealth = keyDuckHealth(duckAssetId)
538+ let oldFromState = valueOrElse(getInteger(keyHealth), 100)
539+ if ((oldFromState != curHP))
540+ then throw(((("oldHealth=" + toString(valueOrElse(getInteger(keyHealth), 100))) + " from state does not match one from flight log=") + toString(curHP)))
541+ else if ((0 >= curHP))
542+ then throw("You can't fly with zero health")
543+ else if ((0 >= newHP))
544+ then throw("Your duck health is zero, expedition failed")
545+ else {
546+ let currentPack = split(valueOrElse(getString(keyBackpackByDuck(duckAssetId)), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
547+ let matList = split(currentPack[bpIdxMat], "_")
548+ let totalMat = (((((parseIntValue(matList[0]) + parseIntValue(matList[1])) + parseIntValue(matList[2])) + parseIntValue(matList[3])) + parseIntValue(matList[4])) + parseIntValue(matList[5]))
549+ if ((EXPMATERIALS > totalMat))
550+ then throw((("You need " + toString(EXPMATERIALS)) + " * 10^-8 materials total for expedition"))
551+ else {
552+ let nums = split_51C(valueOrErrorMessage(getString(keyFreeLandNumsMap()), (keyFreeLandNumsMap() + " is not initialized")), "_")
553+ let len = size(nums)
554+ let bigNum = abs(toBigInt(i.transactionId))
555+ let numActionAndSeed = if ((len == 0))
556+ then {
557+ let freeNum = valueOrElse(getInteger(keyNextFreeLandNum()), 501)
558+ $Tuple3(toString(freeNum), IntegerEntry(keyNextFreeLandNum(), (freeNum + 1)), bigNum)
559+ }
560+ else {
561+ let q = toBigInt(len)
562+ let mapIdx = toInt((bigNum % q))
563+ $Tuple3(nums[mapIdx], StringEntry(keyFreeLandNumsMap(), makeString_11C(removeByIndex(nums, mapIdx), "_")), (bigNum / q))
564+ }
565+ let continentIdx = toInt((numActionAndSeed._3 % FIVEX))
566+ let f = freq[continentIdx]
567+ func terrainGenerator (acc,elem) = $Tuple2((((((acc._1 + genChar(acc._2, f)) + genChar((acc._2 / TWENTYX), f)) + genChar((acc._2 / TWENTY2X), f)) + genChar((acc._2 / TWENTY3X), f)) + genChar((acc._2 / TWENTY4X), f)), (acc._2 / TWENTY5X))
543568
544- let t = {
545- let $l = [1, 2, 3, 4, 5]
546- let $s = size($l)
547- let $acc0 = $Tuple2("", (bigNum / FIVEX))
548- func $f0_1 ($a,$i) = if (($i >= $s))
549- then $a
550- else terrainGenerator($a, $l[$i])
569+ let t = {
570+ let $l = [1, 2, 3, 4, 5]
571+ let $s = size($l)
572+ let $acc0 = $Tuple2("", (numActionAndSeed._3 / FIVEX))
573+ func $f0_1 ($a,$i) = if (($i >= $s))
574+ then $a
575+ else terrainGenerator($a, $l[$i])
551576
552- func $f0_2 ($a,$i) = if (($i >= $s))
553- then $a
554- else throw("List size exceeds 5")
577+ func $f0_2 ($a,$i) = if (($i >= $s))
578+ then $a
579+ else throw("List size exceeds 5")
555580
556- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
581+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
582+ }
583+ let continent = continents[continentIdx]
584+ let issue = Issue(keyNftName(numActionAndSeed._1, "S"), makeString([numActionAndSeed._1, "S", t._1, continent], "_"), 1, 0, false)
585+ let assetId = calculateAssetId(issue)
586+ let id = toBase58String(assetId)
587+ $Tuple2([numActionAndSeed._2, issue, StringEntry(keyLandToAssetId(numActionAndSeed._1), id), StringEntry(keyLandAssetIdToOwner(id), userAddr), StringEntry(keyLandNumToOwner(numActionAndSeed._1), userAddr), ScriptTransfer(i.caller, 1, assetId), StringEntry(keyDuckLocation(duckAssetId), makeString([continent, "L", id], "_")), IntegerEntry(keyHealth, newHP)], unit)
588+ }
589+ }
590+ }
557591 }
558- let issue = Issue(keyNftName(numActionAndSeed._1, "S"), makeString([numActionAndSeed._1, "S", t._1, continents[continentIdx]], "_"), 1, 0, false)
559- let assetId = calculateAssetId(issue)
560- let id = toBase58String(assetId)
561- $Tuple2([numActionAndSeed._2, issue, StringEntry(keyLandToAssetId(numActionAndSeed._1), id), StringEntry(keyLandAssetIdToOwner(id), userAddr), StringEntry(keyLandNumToOwner(numActionAndSeed._1), userAddr), ScriptTransfer(i.caller, 1, assetId)], unit)
562- }
563- }
592+ }
564593
565594
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let chain = toUtf8String(take(drop(this.bytes, 1), 1))
55
66 let usdnAssetId = match chain {
77 case _ =>
88 if (("W" == $match0))
99 then base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
1010 else if (("T" == $match0))
1111 then base58'HezsdQuRDtzksAYUy97gfhKy7Z1NW2uXYSHA3bgqenNZ'
1212 else throw("Unknown chain")
1313 }
1414
1515 let incubatorAddr = match chain {
1616 case _ =>
1717 if (("W" == $match0))
1818 then addressFromStringValue("3PEktVux2RhchSN63DsDo4b4mz4QqzKSeDv")
1919 else if (("T" == $match0))
2020 then this
2121 else throw("Unknown chain")
2222 }
2323
2424 let breederAddr = match chain {
2525 case _ =>
2626 if (("W" == $match0))
2727 then addressFromStringValue("3PDVuU45H7Eh5dmtNbnRNRStGwULA7NY6Hb")
2828 else if (("T" == $match0))
2929 then this
3030 else throw("Unknown chain")
3131 }
3232
3333 let economyAddr = match chain {
3434 case _ =>
3535 if (("W" == $match0))
3636 then addressFromStringValue("3P2sk1KncSxRaZs8b4CWGPw2jkvvav74u4D")
3737 else if (("T" == $match0))
3838 then addressFromStringValue("3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep")
3939 else throw("Unknown chain")
4040 }
4141
4242 let pub = base58'6LfPuKJjLgekmncBhMg2LZyMTNVzZBccXR28ySXm9uXD'
4343
4444 let HEALCOST = 10000
4545
4646 let LANDPREFIX = "LAND"
4747
4848 let DUCKPREFIX = "DUCK"
4949
5050 let DEFAULTLOCATION = "Africa_F_Africa"
5151
5252 let NUMRES = 6
5353
5454 let DAILYRESBYPIECE = 3456000
5555
5656 let DAYMILLIS = 86400000
5757
5858 let FIVEMINUTESMILLIS = 300000
5959
6060 let RESOURCEPRICEMIN = 158549
6161
6262 let EXPMATERIALS = 157679960139
6363
6464 let FIVEX = toBigInt(5)
6565
6666 let TWENTYX = toBigInt(20)
6767
6868 let TWENTY2X = toBigInt((20 * 20))
6969
7070 let TWENTY3X = toBigInt(((20 * 20) * 20))
7171
7272 let TWENTY4X = toBigInt((((20 * 20) * 20) * 20))
7373
7474 let TWENTY5X = toBigInt(((((20 * 20) * 20) * 20) * 20))
7575
7676 let matTypes = ["Fuel", "Metal", "Plank", "Glass", "Plastic", "Protein"]
7777
78-let continents = ["Americas", "Europe", "Asia", "Africa", "Oceania"]
78+let continents = ["Asia", "Europe", "Americas", "Oceania", "Africa"]
7979
8080 func keyNextFreeLandNum () = "nextLandNum"
8181
8282
8383 func keyFreeLandNumsMap () = "freeLandNumsMap"
8484
8585
8686 func keyLandToAssetId (landNum) = ("landToAsset_" + landNum)
8787
8888
8989 func keyNftName (landNum,landSize) = ((LANDPREFIX + landNum) + landSize)
9090
9191
9292 func keyLandAssetIdToOwner (assetId) = ("nftOwner_" + assetId)
9393
9494
9595 func keyDuckIdToOwner (assetId) = ("duckOwner_" + assetId)
9696
9797
9898 func keyStakedTimeByAssetId (assetId) = ("stakedTime_" + assetId)
9999
100100
101101 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
102102
103103
104104 func keyStakedTimeByTypeAssetIdAndOwner (nftType,assetId,ownerAddr) = ((((("stakedTimeByTypeAssetIdAndOwner_" + nftType) + "_") + assetId) + "_") + ownerAddr)
105105
106106
107107 func keyLandNumToOwner (landNum) = ("landOwner_" + landNum)
108108
109109
110110 func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
111111
112112
113113 func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
114114
115115
116116 func keyDuckHealth (duckAssetId) = ("duckHealth_" + duckAssetId)
117117
118118
119119 let recLandNum = 0
120120
121121 let recLandSize = 1
122122
123123 let recTerrains = 2
124124
125125 let recContinent = 3
126126
127127 let locIdxContinent = 0
128128
129129 let locIdxType = 1
130130
131131 let locIdxId = 2
132132
133133 let bpIdxLevel = 0
134134
135135 let bpIdxRes = 1
136136
137137 let bpIdxMat = 2
138138
139139 let bpIdxProd = 3
140140
141141 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)]
142142
143143
144144 func numPiecesBySize (landSize) = match landSize {
145145 case _ =>
146146 if (("S" == $match0))
147147 then 25
148148 else if (("M" == $match0))
149149 then 100
150150 else if (("L" == $match0))
151151 then 225
152152 else if (("XL" == $match0))
153153 then 400
154154 else if (("XXL" == $match0))
155155 then 625
156156 else throw("Unknown land size")
157157 }
158158
159159
160160 func subOneInList (aList,idx,amount) = {
161161 func subber (acc,i) = (acc :+ (if ((i == idx))
162162 then toString((parseIntValue(aList[i]) - amount))
163163 else aList[i]))
164164
165165 let r = {
166166 let $l = [0, 1, 2, 3, 4, 5]
167167 let $s = size($l)
168168 let $acc0 = nil
169169 func $f0_1 ($a,$i) = if (($i >= $s))
170170 then $a
171171 else subber($a, $l[$i])
172172
173173 func $f0_2 ($a,$i) = if (($i >= $s))
174174 then $a
175175 else throw("List size exceeds 6")
176176
177177 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
178178 }
179179 makeString(r, "_")
180180 }
181181
182182
183183 func addRes (currentRes,terrainCounts,deltaTime,landSizeIndex) = {
184184 func adder (acc,i) = {
185185 let resOfType = ((fraction(deltaTime, DAILYRESBYPIECE, DAYMILLIS) * terrainCounts[i]) * landSizeIndex)
186186 (acc :+ toString((parseIntValue(currentRes[i]) + resOfType)))
187187 }
188188
189189 let r = {
190190 let $l = [0, 1, 2, 3, 4, 5]
191191 let $s = size($l)
192192 let $acc0 = nil
193193 func $f0_1 ($a,$i) = if (($i >= $s))
194194 then $a
195195 else adder($a, $l[$i])
196196
197197 func $f0_2 ($a,$i) = if (($i >= $s))
198198 then $a
199199 else throw("List size exceeds 6")
200200
201201 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
202202 }
203203 makeString(r, "_")
204204 }
205205
206206
207207 func abs (x) = if ((x >= toBigInt(0)))
208208 then x
209209 else -(x)
210210
211211
212212 let freq = [[1, 4, 9, 10, 15], [5, 8, 13, 14, 15], [6, 9, 14, 15, 16], [4, 7, 8, 13, 18], [1, 6, 7, 15, 19]]
213213
214-func genChar (n,continentIdx) = {
214+func genChar (n,freqs) = {
215215 let rem = toInt((n % TWENTYX))
216- let letter = if ((freq[continentIdx][0] > rem))
216+ let letter = if ((freqs[0] > rem))
217217 then "A"
218- else if ((freq[continentIdx][1] > rem))
218+ else if ((freqs[1] > rem))
219219 then "B"
220- else if ((freq[continentIdx][2] > rem))
220+ else if ((freqs[2] > rem))
221221 then "C"
222- else if ((freq[continentIdx][3] > rem))
222+ else if ((freqs[3] > rem))
223223 then "D"
224- else if ((freq[continentIdx][4] > rem))
224+ else if ((freqs[4] > rem))
225225 then "E"
226226 else "F"
227227 letter
228228 }
229229
230230
231231 @Callable(i)
232232 func stakeLand () = {
233233 let pmt = value(i.payments[0])
234234 let assetId = value(pmt.assetId)
235235 let address = toString(i.caller)
236236 if ((pmt.amount != 1))
237237 then throw((("NFT " + LANDPREFIX) + " token should be attached as payment"))
238238 else {
239239 let asset = value(assetInfo(assetId))
240240 if ((asset.issuer != this))
241241 then throw("Unknown issuer of token")
242242 else if (!(contains(asset.name, LANDPREFIX)))
243243 then throw((("Only NFT " + LANDPREFIX) + " tokens are accepted"))
244244 else {
245245 let landNumSize = drop(asset.name, 4)
246246 let landNum = if (contains(landNumSize, "XXL"))
247247 then dropRight(landNumSize, 3)
248248 else if (contains(landNumSize, "XL"))
249249 then dropRight(landNumSize, 2)
250250 else dropRight(landNumSize, 1)
251251 if (!(isDefined(parseInt(landNum))))
252252 then throw(("Cannot parse land number from " + asset.name))
253253 else {
254254 let timeKey = keyStakedTimeByAssetId(toBase58String(assetId))
255255 if (isDefined(getInteger(timeKey)))
256256 then throw((("NFT " + asset.name) + " is already staked"))
257257 else [IntegerEntry(timeKey, lastBlock.timestamp), IntegerEntry(keyStakedTimeByTypeAssetIdAndOwner(LANDPREFIX, toBase58String(assetId), address), lastBlock.timestamp), StringEntry(keyLandAssetIdToOwner(toBase58String(assetId)), address), StringEntry(keyLandNumToOwner(landNum), address)]
258258 }
259259 }
260260 }
261261 }
262262
263263
264264
265265 @Callable(i)
266266 func unstakeLand (landAssetId) = if ((size(i.payments) != 0))
267267 then throw("unstake doesn't require any payments")
268268 else {
269269 let assetId = fromBase58String(landAssetId)
270270 let address = toString(i.caller)
271271 let asset = value(assetInfo(assetId))
272272 if ((asset.issuer != this))
273273 then throw("Unknown issuer of token")
274274 else if (!(contains(asset.name, LANDPREFIX)))
275275 then throw((("Only NFT " + LANDPREFIX) + " tokens can be unstaked"))
276276 else {
277277 let timeKey = keyStakedTimeByAssetId(landAssetId)
278278 if (!(isDefined(timeKey)))
279279 then throw((("NFT " + asset.name) + " is not staked"))
280280 else {
281281 let owner = valueOrErrorMessage(getString(keyLandAssetIdToOwner(landAssetId)), (("NFT " + asset.name) + " is orphaned"))
282282 if ((owner != address))
283283 then throw("Staked NFT is not yours")
284284 else [ScriptTransfer(i.caller, 1, assetId), DeleteEntry(timeKey), DeleteEntry(keyStakedTimeByTypeAssetIdAndOwner(LANDPREFIX, landAssetId, address))]
285285 }
286286 }
287287 }
288288
289289
290290
291291 @Callable(i)
292292 func stakeDuck () = {
293293 let pmt = value(i.payments[0])
294294 let assetId = value(pmt.assetId)
295295 let address = toString(i.caller)
296296 if ((pmt.amount != 1))
297297 then throw((("NFT " + DUCKPREFIX) + " token should be attached as payment"))
298298 else {
299299 let asset = value(assetInfo(assetId))
300300 if (if ((asset.issuer != incubatorAddr))
301301 then (asset.issuer != breederAddr)
302302 else false)
303303 then throw((("Unknown issuer of " + DUCKPREFIX) + " token"))
304304 else if (!(contains(asset.name, DUCKPREFIX)))
305305 then throw((("Only NFT " + DUCKPREFIX) + " tokens are accepted"))
306306 else {
307307 let assetIdStr = toBase58String(assetId)
308308 let timeKey = keyStakedTimeByAssetId(assetIdStr)
309309 if (isDefined(getInteger(timeKey)))
310310 then throw((("NFT " + asset.name) + " is already staked"))
311311 else if (isDefined(getString(keyStakedDuckByOwner(address))))
312312 then throw(("You already staked one duck: " + asset.name))
313313 else {
314314 let locKey = keyDuckLocation(assetIdStr)
315315 let location = getString(locKey)
316316 let keyHealth = keyDuckHealth(assetIdStr)
317317 let health = getInteger(keyHealth)
318318 let bpKey = keyBackpackByDuck(assetIdStr)
319319 let backpack = getString(bpKey)
320320 ([IntegerEntry(timeKey, lastBlock.timestamp), IntegerEntry(keyStakedTimeByTypeAssetIdAndOwner(DUCKPREFIX, toBase58String(assetId), address), lastBlock.timestamp), StringEntry(keyDuckIdToOwner(assetIdStr), address), StringEntry(keyStakedDuckByOwner(address), assetIdStr)] ++ (if (isDefined(location))
321321 then nil
322322 else ([StringEntry(locKey, DEFAULTLOCATION)] ++ (if (isDefined(health))
323323 then nil
324324 else ([IntegerEntry(keyHealth, 100)] ++ (if (isDefined(backpack))
325325 then nil
326326 else [StringEntry(bpKey, "0:0_0_0_0_0_0:0_0_0_0_0_0:")]))))))
327327 }
328328 }
329329 }
330330 }
331331
332332
333333
334334 @Callable(i)
335335 func unstakeDuck (assetIdStr) = if ((size(i.payments) != 0))
336336 then throw("unstake doesn't require any payments")
337337 else {
338338 let assetId = fromBase58String(assetIdStr)
339339 let address = toString(i.caller)
340340 let asset = value(assetInfo(assetId))
341341 if (if ((asset.issuer != incubatorAddr))
342342 then (asset.issuer != breederAddr)
343343 else false)
344344 then throw((("Unknown issuer of " + DUCKPREFIX) + " token"))
345345 else if (!(contains(asset.name, DUCKPREFIX)))
346346 then throw((("Only NFT " + DUCKPREFIX) + " tokens can be unstaked"))
347347 else {
348348 let timeKey = keyStakedTimeByAssetId(toBase58String(assetId))
349349 if (!(isDefined(timeKey)))
350350 then throw((("NFT " + asset.name) + " is not staked"))
351351 else if (!(isDefined(keyStakedDuckByOwner(address))))
352352 then throw((("The duck " + asset.name) + " is not staked"))
353353 else {
354354 let owner = valueOrErrorMessage(getString(keyDuckIdToOwner(toBase58String(assetId))), (("NFT " + asset.name) + " is orphaned"))
355355 if ((owner != address))
356356 then throw("Staked NFT is not yours")
357357 else [ScriptTransfer(i.caller, 1, assetId), DeleteEntry(timeKey), DeleteEntry(keyDuckLocation(assetIdStr)), DeleteEntry(keyStakedTimeByTypeAssetIdAndOwner(DUCKPREFIX, assetIdStr, address)), DeleteEntry(keyStakedDuckByOwner(address))]
358358 }
359359 }
360360 }
361361
362362
363363
364364 @Callable(i)
365365 func claimRes (amount,landAssetId) = if ((size(i.payments) != 0))
366366 then throw("claimRes doesn't require any payments")
367367 else {
368368 let addr = toString(i.caller)
369369 let asset = value(assetInfo(fromBase58String(landAssetId)))
370370 if (!(contains(asset.name, LANDPREFIX)))
371371 then throw((("NFT " + LANDPREFIX) + " token should be passed as param"))
372372 else {
373373 let timeKey = keyStakedTimeByAssetId(landAssetId)
374374 let savedTime = getInteger(timeKey)
375375 if (!(isDefined(savedTime)))
376376 then throw((("NFT " + asset.name) + " is not staked"))
377377 else {
378378 let owner = getStringValue(keyLandAssetIdToOwner(landAssetId))
379379 if ((owner != addr))
380380 then throw((LANDPREFIX + " is not yours"))
381381 else {
382382 let d = split(asset.description, "_")
383383 let landSize = d[recLandSize]
384384 let terrainCounts = countTerrains(d[recTerrains])
385385 let duck = getString(keyStakedDuckByOwner(addr))
386386 if (!(isDefined(duck)))
387387 then throw("You don't have a duck staked")
388388 else {
389389 let duckAssetIdStr = value(duck)
390390 let curLocation = valueOrElse(getString(keyDuckLocation(duckAssetIdStr)), DEFAULTLOCATION)
391391 let loc = split(value(curLocation), "_")
392392 if ((loc[locIdxType] != "L"))
393393 then throw((("Duck location type is " + loc[locIdxType]) + ", but should be L"))
394394 else if ((loc[locIdxId] != landAssetId))
395395 then throw(((("Duck location id is " + loc[locIdxId]) + ", but should be ") + landAssetId))
396396 else {
397397 let deltaTime = (lastBlock.timestamp - value(savedTime))
398398 if ((0 > deltaTime))
399399 then throw(((("Saved timestamp is in future, saved = " + toString(value(savedTime))) + ", current = ") + toString(lastBlock.timestamp)))
400400 else {
401401 let pieces = numPiecesBySize(landSize)
402402 let availRes = (fraction(deltaTime, DAILYRESBYPIECE, DAYMILLIS) * pieces)
403403 if ((amount > availRes))
404404 then throw(((("Not enough resources, available = " + toString(availRes)) + ", requested = ") + toString(amount)))
405405 else {
406406 let newDeltaTime = fraction((availRes - amount), DAYMILLIS, (pieces * DAILYRESBYPIECE))
407407 let newTimestamp = (lastBlock.timestamp - newDeltaTime)
408408 let bpKey = keyBackpackByDuck(duckAssetIdStr)
409409 let currentPack = split(valueOrElse(getString(bpKey), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
410410 let currentRes = split(currentPack[bpIdxRes], "_")
411411 let bpRes = addRes(currentRes, terrainCounts, (deltaTime - newDeltaTime), (pieces / 25))
412412 let newPack = makeString([currentPack[bpIdxLevel], bpRes, currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
413413 $Tuple2([StringEntry(bpKey, newPack), IntegerEntry(timeKey, newTimestamp), IntegerEntry(keyStakedTimeByTypeAssetIdAndOwner(LANDPREFIX, landAssetId, owner), newTimestamp)], unit)
414414 }
415415 }
416416 }
417417 }
418418 }
419419 }
420420 }
421421 }
422422
423423
424424
425425 @Callable(i)
426426 func flight (message,sig) = if (!(sigVerify_8Kb(message, sig, pub)))
427427 then throw("signature does not match")
428428 else if ((size(i.payments) != 0))
429429 then throw("flight doesn't require any payments")
430430 else {
431431 let parts = split(toUtf8String(message), ";")
432432 let hp = split(split(parts[0], "|")[0], "_")
433433 let curHP = parseIntValue(hp[0])
434434 let newHP = parseIntValue(hp[1])
435435 let newLocAndTime = split(parts[1], ":")
436436 let newLocation = newLocAndTime[0]
437437 let time = parseIntValue(newLocAndTime[1])
438438 if (if ((time > (lastBlock.timestamp + FIVEMINUTESMILLIS)))
439439 then true
440440 else ((lastBlock.timestamp - FIVEMINUTESMILLIS) > time))
441441 then throw("signature outdated")
442442 else {
443443 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
444444 let keyHealth = keyDuckHealth(duckAssetId)
445445 let oldFromState = valueOrElse(getInteger(keyHealth), 100)
446446 if ((oldFromState != curHP))
447447 then throw(((("oldHealth=" + toString(valueOrElse(getInteger(keyHealth), 100))) + " from state does not match one from flight log=") + toString(curHP)))
448448 else if ((0 >= curHP))
449449 then throw("You can't fly with zero health")
450450 else {
451451 let locKey = keyDuckLocation(duckAssetId)
452452 let curLocation = valueOrElse(getString(locKey), DEFAULTLOCATION)
453453 if ((newLocation == curLocation))
454454 then throw("You can't fly to the same location")
455455 else $Tuple2([StringEntry(locKey, if ((newHP > 0))
456456 then newLocation
457457 else curLocation), IntegerEntry(keyHealth, newHP)], unit)
458458 }
459459 }
460460 }
461461
462462
463463
464464 @Callable(i)
465465 func setHealth (health,duckAssetId) = if (if ((0 > health))
466466 then true
467467 else (health > 100))
468468 then throw("HP should be within 0..100")
469469 else [IntegerEntry(keyDuckHealth(duckAssetId), health)]
470470
471471
472472
473473 @Callable(i)
474474 func heal (matType,amount) = if (if ((0 > matType))
475475 then true
476476 else (matType >= NUMRES))
477477 then throw(("Unknown material: " + toString(matType)))
478478 else if ((0 >= amount))
479479 then throw(("Amount should be positive! " + toString(amount)))
480480 else {
481481 let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
482482 let keyHealth = keyDuckHealth(duckAssetId)
483483 let oldHealth = valueOrElse(getInteger(keyHealth), 100)
484484 if ((oldHealth >= 100))
485485 then throw("HP should be < 100 to heal")
486486 else {
487487 let bpKey = keyBackpackByDuck(duckAssetId)
488488 let currentPack = split(valueOrElse(getString(bpKey), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
489489 let matList = split(currentPack[bpIdxMat], "_")
490490 let mList = if ((size(matList) != NUMRES))
491491 then ["0", "0", "0", "0", "0", "0"]
492492 else matList
493493 let currentAmount = parseIntValue(mList[matType])
494494 let deltaHealth = min([(amount / HEALCOST), (100 - oldHealth)])
495495 let spendAmount = (deltaHealth * HEALCOST)
496496 if ((spendAmount > currentAmount))
497497 then throw(((((("You need " + toString(spendAmount)) + " of ") + matTypes[matType]) + " to heal, but you backpack contains ") + toString(currentAmount)))
498498 else {
499499 let newMat = subOneInList(mList, matType, spendAmount)
500500 [IntegerEntry(keyHealth, (oldHealth + deltaHealth)), StringEntry(bpKey, makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], newMat, currentPack[bpIdxProd]], ":"))]
501501 }
502502 }
503503 }
504504
505505
506506
507507 @Callable(i)
508508 func updateBackpack (duckAssetId,newPack) = if ((i.caller != economyAddr))
509509 then throw("permission denied")
510510 else $Tuple2([StringEntry(keyBackpackByDuck(duckAssetId), newPack)], newPack)
511511
512512
513513
514514 @Callable(i)
515-func expedition () = if ((size(i.payments) != 0))
516- then throw("expedition doesn't require any payments")
517- else {
518- let userAddr = toString(i.caller)
519- let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(userAddr)), "You don't have a duck staked")
520- let keyHealth = keyDuckHealth(duckAssetId)
521- let health = valueOrElse(getInteger(keyHealth), 100)
522- if ((0 >= health))
523- then throw("Your duck needs healing")
524- else {
525- let currentPack = split(valueOrElse(getString(keyBackpackByDuck(duckAssetId)), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
526- let matList = split(currentPack[bpIdxMat], "_")
527- let totalMat = (((((parseIntValue(matList[0]) + parseIntValue(matList[1])) + parseIntValue(matList[2])) + parseIntValue(matList[3])) + parseIntValue(matList[4])) + parseIntValue(matList[5]))
528- let nums = split_51C(valueOrErrorMessage(getString(keyFreeLandNumsMap()), (keyFreeLandNumsMap() + " is not initialized")), "_")
529- let len = size(nums)
530- let bigNum = abs(toBigInt(i.transactionId))
531- let numActionAndSeed = if ((len == 0))
532- then {
533- let freeNum = valueOrElse(getInteger(keyNextFreeLandNum()), 501)
534- $Tuple3(toString(freeNum), IntegerEntry(keyNextFreeLandNum(), (freeNum + 1)), bigNum)
535- }
536- else {
537- let q = toBigInt(len)
538- let mapIdx = toInt((bigNum % q))
539- $Tuple3(nums[mapIdx], StringEntry(keyFreeLandNumsMap(), makeString_11C(removeByIndex(nums, mapIdx), "_")), (bigNum / q))
540- }
541- let continentIdx = toInt((numActionAndSeed._3 % FIVEX))
542- func terrainGenerator (acc,elem) = $Tuple2((((((acc._1 + genChar(acc._2, continentIdx)) + genChar((acc._2 / TWENTYX), continentIdx)) + genChar((acc._2 / TWENTY2X), continentIdx)) + genChar((acc._2 / TWENTY3X), continentIdx)) + genChar((acc._2 / TWENTY4X), continentIdx)), (acc._2 / TWENTY5X))
515+func expedition (message,sig) = if (!(sigVerify_8Kb(message, sig, pub)))
516+ then throw("signature does not match")
517+ else if ((size(i.payments) != 0))
518+ then throw("expedition doesn't require any payments")
519+ else {
520+ let parts = split(toUtf8String(message), ";")
521+ let hp = split(split(parts[0], "|")[0], "_")
522+ let curHP = parseIntValue(hp[0])
523+ let newHP = parseIntValue(hp[1])
524+ let locAndTime = split(parts[1], ":")
525+ let targetLocation = split(locAndTime[0], "_")
526+ if ((targetLocation[1] != "E"))
527+ then throw("expedition target location type should be E")
528+ else {
529+ let time = parseIntValue(locAndTime[1])
530+ if (if ((time > (lastBlock.timestamp + FIVEMINUTESMILLIS)))
531+ then true
532+ else ((lastBlock.timestamp - FIVEMINUTESMILLIS) > time))
533+ then throw("signature outdated")
534+ else {
535+ let userAddr = toString(i.caller)
536+ let duckAssetId = valueOrErrorMessage(getString(keyStakedDuckByOwner(userAddr)), "You don't have a duck staked")
537+ let keyHealth = keyDuckHealth(duckAssetId)
538+ let oldFromState = valueOrElse(getInteger(keyHealth), 100)
539+ if ((oldFromState != curHP))
540+ then throw(((("oldHealth=" + toString(valueOrElse(getInteger(keyHealth), 100))) + " from state does not match one from flight log=") + toString(curHP)))
541+ else if ((0 >= curHP))
542+ then throw("You can't fly with zero health")
543+ else if ((0 >= newHP))
544+ then throw("Your duck health is zero, expedition failed")
545+ else {
546+ let currentPack = split(valueOrElse(getString(keyBackpackByDuck(duckAssetId)), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
547+ let matList = split(currentPack[bpIdxMat], "_")
548+ let totalMat = (((((parseIntValue(matList[0]) + parseIntValue(matList[1])) + parseIntValue(matList[2])) + parseIntValue(matList[3])) + parseIntValue(matList[4])) + parseIntValue(matList[5]))
549+ if ((EXPMATERIALS > totalMat))
550+ then throw((("You need " + toString(EXPMATERIALS)) + " * 10^-8 materials total for expedition"))
551+ else {
552+ let nums = split_51C(valueOrErrorMessage(getString(keyFreeLandNumsMap()), (keyFreeLandNumsMap() + " is not initialized")), "_")
553+ let len = size(nums)
554+ let bigNum = abs(toBigInt(i.transactionId))
555+ let numActionAndSeed = if ((len == 0))
556+ then {
557+ let freeNum = valueOrElse(getInteger(keyNextFreeLandNum()), 501)
558+ $Tuple3(toString(freeNum), IntegerEntry(keyNextFreeLandNum(), (freeNum + 1)), bigNum)
559+ }
560+ else {
561+ let q = toBigInt(len)
562+ let mapIdx = toInt((bigNum % q))
563+ $Tuple3(nums[mapIdx], StringEntry(keyFreeLandNumsMap(), makeString_11C(removeByIndex(nums, mapIdx), "_")), (bigNum / q))
564+ }
565+ let continentIdx = toInt((numActionAndSeed._3 % FIVEX))
566+ let f = freq[continentIdx]
567+ func terrainGenerator (acc,elem) = $Tuple2((((((acc._1 + genChar(acc._2, f)) + genChar((acc._2 / TWENTYX), f)) + genChar((acc._2 / TWENTY2X), f)) + genChar((acc._2 / TWENTY3X), f)) + genChar((acc._2 / TWENTY4X), f)), (acc._2 / TWENTY5X))
543568
544- let t = {
545- let $l = [1, 2, 3, 4, 5]
546- let $s = size($l)
547- let $acc0 = $Tuple2("", (bigNum / FIVEX))
548- func $f0_1 ($a,$i) = if (($i >= $s))
549- then $a
550- else terrainGenerator($a, $l[$i])
569+ let t = {
570+ let $l = [1, 2, 3, 4, 5]
571+ let $s = size($l)
572+ let $acc0 = $Tuple2("", (numActionAndSeed._3 / FIVEX))
573+ func $f0_1 ($a,$i) = if (($i >= $s))
574+ then $a
575+ else terrainGenerator($a, $l[$i])
551576
552- func $f0_2 ($a,$i) = if (($i >= $s))
553- then $a
554- else throw("List size exceeds 5")
577+ func $f0_2 ($a,$i) = if (($i >= $s))
578+ then $a
579+ else throw("List size exceeds 5")
555580
556- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
581+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5)
582+ }
583+ let continent = continents[continentIdx]
584+ let issue = Issue(keyNftName(numActionAndSeed._1, "S"), makeString([numActionAndSeed._1, "S", t._1, continent], "_"), 1, 0, false)
585+ let assetId = calculateAssetId(issue)
586+ let id = toBase58String(assetId)
587+ $Tuple2([numActionAndSeed._2, issue, StringEntry(keyLandToAssetId(numActionAndSeed._1), id), StringEntry(keyLandAssetIdToOwner(id), userAddr), StringEntry(keyLandNumToOwner(numActionAndSeed._1), userAddr), ScriptTransfer(i.caller, 1, assetId), StringEntry(keyDuckLocation(duckAssetId), makeString([continent, "L", id], "_")), IntegerEntry(keyHealth, newHP)], unit)
588+ }
589+ }
590+ }
557591 }
558- let issue = Issue(keyNftName(numActionAndSeed._1, "S"), makeString([numActionAndSeed._1, "S", t._1, continents[continentIdx]], "_"), 1, 0, false)
559- let assetId = calculateAssetId(issue)
560- let id = toBase58String(assetId)
561- $Tuple2([numActionAndSeed._2, issue, StringEntry(keyLandToAssetId(numActionAndSeed._1), id), StringEntry(keyLandAssetIdToOwner(id), userAddr), StringEntry(keyLandNumToOwner(numActionAndSeed._1), userAddr), ScriptTransfer(i.caller, 1, assetId)], unit)
562- }
563- }
592+ }
564593
565594

github/deemru/w8io/169f3d6 
121.82 ms