tx · Ck4rsZ9mhUPotvHFdYaXXTpCq9RmNcZwxRdTA1cuMZFP

3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv:  -0.02000000 Waves

2023.06.12 16:49 [3685104] smart account 3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv > SELF 0.00000000 Waves

{ "type": 13, "id": "Ck4rsZ9mhUPotvHFdYaXXTpCq9RmNcZwxRdTA1cuMZFP", "fee": 2000000, "feeAssetId": null, "timestamp": 1686577805170, "version": 2, "chainId": 87, "sender": "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv", "senderPublicKey": "5V8q3qQvKSx6YqJpXWoxT1vPdQUsiKJrcmKnoxjsEmqj", "proofs": [ "661b4TQZWDNPBrg1RfN6JwxXSShG1bjNmT2GdmhBTHb4fbou4Ayx81nGdzZaV2x1wChb3uDa1fb5PVrosn3uHAaF" ], "script": "base64:BgJACAISAwoBGBIDCgEIEgMKAQgSAwoBCBIDCgEIEgMKAQgSAwoBGBIDCgEIEgMKARgSAwoBGBIDCgEYEgMKAQgSAEcABWNoYWluCQDJAQIJAMoBAggFBHRoaXMFYnl0ZXMAAQABAAt1c2R0QXNzZXRJZAQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAEghNp6sggDP07Ru8qO7ouTvMmC3Qtd+geWqNQj+agP/7kDCQAAAgEBVAUHJG1hdGNoMAEgVbHYn3KHgu/l41uNrAWrZd6aQ6EvFrsF8xq3h6XxxRgJAAIBAg1Vbmtub3duIGNoYWluABVkZWZhdWx0UmVzdEFkZHJlc3NTdHIEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQUUN1dkZidmg0TGtQVW5yblUxejNqbmJBMXA5bTNXTmh2AwkAAAIBAVQFByRtYXRjaDACIzNNdW1rR0d6dENLQVhwV0RxeGtkZG9mcVhTVWJxUWt2U0p5CQACAQINVW5rbm93biBjaGFpbgARSW5mcmFVcGdyYWRlQ29zdFMEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDAAgMivoCUDCQAAAgEBVAUHJG1hdGNoMACAwtcvCQACAQINVW5rbm93biBjaGFpbgADU0VQAgJfXwAFTVVMVDYAwIQ9AApBUlRQUkVTQUxFAgdQUkVTQUxFAAZOVU1SRVMABgAFU1NJWkUAGQAFTVNJWkUAZAAFTFNJWkUA4QEABlhMU0laRQCQAwAHWFhMU0laRQDxBAAPREFJTFlSRVNCWVBJRUNFAID40gEACURBWU1JTExJUwCAuJkpAAxXSE1VTFRJUExJRVIAgMivoCUAEFJFU09VUkNFUFJJQ0VNSU4A1bUCAA1FU01BWFBBQ0tBR0VTAAMACUVTQlVZQ09FRgAEAApFU1NFTExDT0VGAAoAEHByb2R1Y3Rpb25NYXRyaXgJAMwIAgISMV8xXzFfMl8yXzVfMV8xMF8wCQDMCAICEzJfMl8yXzRfNF8xMF8xXzEwXzAJAMwIAgITM18zXzNfNl82XzE1XzFfMTBfMAkAzAgCAhMyXzVfNV8yXzdfNV8yXzEwMF8xCQDMCAICFzRfMTBfMTBfNF8xNF8xMF8yXzEwMF8xCQDMCAICFzZfMTVfMTVfNl8yMV8xNV8yXzEwMF8xCQDMCAICEjFfMV8xXzFfMV84XzFfMTBfMgkAzAgCAhMyXzJfMl8yXzJfMTZfMV8xMF8yCQDMCAICEzNfM18zXzNfM18yNF8xXzEwXzIJAMwIAgITOV85XzFfNV81XzFfNV8xMDBfMwkAzAgCAhcxOF8xOF8yXzEwXzEwXzJfNV8xMDBfMwkAzAgCAhcyN18yN18zXzE1XzE1XzNfNV8xMDBfMwkAzAgCAhIyXzJfMV8yXzJfMl8xXzEwXzQJAMwIAgISNF80XzJfNF80XzRfMV8xMF80CQDMCAICEjZfNl8zXzZfNl82XzFfMTBfNAUDbmlsABFyZWNpcGVJZHhQYWNrc2l6ZQAHAApyZWNMYW5kTnVtAAAAC3JlY0xhbmRTaXplAAEAC3JlY1RlcnJhaW5zAAIADHJlY0NvbnRpbmVudAADAQ9nZXRTdHJpbmdPckZhaWwCB2FkZHJlc3MDa2V5CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUHYWRkcmVzcwUDa2V5CQC5CQIJAMwIAgIKbWFuZGF0b3J5IAkAzAgCCQClCAEFB2FkZHJlc3MJAMwIAgIBLgkAzAgCBQNrZXkJAMwIAgIPIGlzIG5vdCBkZWZpbmVkBQNuaWwCAAARSWR4Q2ZnU3Rha2luZ0RhcHAAAQARSWR4Q2ZnRWNvbm9teURhcHAAAgEKa2V5UmVzdENmZwACDiVzX19yZXN0Q29uZmlnAQ5rZXlSZXN0QWRkcmVzcwACDCVzX19yZXN0QWRkcgERcmVhZFJlc3RDZmdPckZhaWwBBHJlc3QJALwJAgkBD2dldFN0cmluZ09yRmFpbAIFBHJlc3QJAQprZXlSZXN0Q2ZnAAUDU0VQARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCB3Jlc3RDZmcDaWR4CQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkAkQMCBQdyZXN0Q2ZnBQNpZHgJAKwCAgIqUmVzdCBjZmcgZG9lc24ndCBjb250YWluIGFkZHJlc3MgYXQgaW5kZXggCQCkAwEFA2lkeAAMcmVzdENvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMJAQ5rZXlSZXN0QWRkcmVzcwAFFWRlZmF1bHRSZXN0QWRkcmVzc1N0cgAHcmVzdENmZwkBEXJlYWRSZXN0Q2ZnT3JGYWlsAQUMcmVzdENvbnRyYWN0AA9zdGFraW5nQ29udHJhY3QJARhnZXRDb250cmFjdEFkZHJlc3NPckZhaWwCBQdyZXN0Q2ZnBRFJZHhDZmdTdGFraW5nRGFwcAAPZWNvbm9teUNvbnRyYWN0CQEYZ2V0Q29udHJhY3RBZGRyZXNzT3JGYWlsAgUHcmVzdENmZwURSWR4Q2ZnRWNvbm9teURhcHABEWtleUxhc3RUeElkQnlVc2VyAQRhZGRyCQCsAgICD2xhc3RUeElkQnlVc2VyXwUEYWRkcgEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQdhc3NldElkCQCsAgICCW5mdE93bmVyXwUHYXNzZXRJZAEaa2V5TGFuZEFzc2V0SWRUb0N1c3RvbU5hbWUBB2Fzc2V0SWQJAKwCAgIYbGFuZEN1c3RvbU5hbWVCeUFzc2V0SWRfBQdhc3NldElkARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQdhc3NldElkCQCsAgICC3N0YWtlZFRpbWVfBQdhc3NldElkARZrZXlJbmZyYUxldmVsQnlBc3NldElkAQdhc3NldElkCQCsAgICC2luZnJhTGV2ZWxfBQdhc3NldElkASBrZXlMYW5kQXJ0U3RhdHVzQnlUeXBlQW5kQXNzZXRJZAIEdHlwZQdhc3NldElkCQC5CQIJAMwIAgINbGFuZEFydFN0YXR1cwkAzAgCBQR0eXBlCQDMCAIFB2Fzc2V0SWQFA25pbAIBXwESa2V5V2FyZWhvdXNlQnlMYW5kAQtsYW5kQXNzZXRJZAkArAICAgp3YXJlSG91c2VfBQtsYW5kQXNzZXRJZAEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQlvd25lckFkZHIJAKwCAgITc3Rha2VkTGFuZHNCeU93bmVyXwUJb3duZXJBZGRyARprZXlEdWNrQXNzZXRJZFRvQ3VzdG9tTmFtZQEHYXNzZXRJZAkArAICAhhkdWNrQ3VzdG9tTmFtZUJ5QXNzZXRJZF8FB2Fzc2V0SWQBFmtleUFkZHJlc3NUb0N1c3RvbU5hbWUBBGFkZHIJAKwCAgIYYWNjb3VudEN1c3RvbU5hbWVCeUFkZHJfBQRhZGRyAQ9rZXlBZGRyZXNzUmVmQnkBBGFkZHIJAKwCAgIJYWNjUmVmQnlfBQRhZGRyARNrZXlBZGRyZXNzUmVmZXJyYWxzAQRhZGRyCQCsAgICDWFjY1JlZmVycmFsc18FBGFkZHIBEGtleUR1Y2tJZFRvT3duZXIBB2Fzc2V0SWQJAKwCAgIKZHVja093bmVyXwUHYXNzZXRJZAEUa2V5U3Rha2VkRHVja0J5T3duZXIBCW93bmVyQWRkcgkArAICAhJzdGFrZWREdWNrQnlPd25lcl8FCW93bmVyQWRkcgEPa2V5RHVja0xvY2F0aW9uAQtkdWNrQXNzZXRJZAkArAICAg1kdWNrTG9jYXRpb25fBQtkdWNrQXNzZXRJZAENa2V5RHVja0hlYWx0aAELZHVja0Fzc2V0SWQJAKwCAgILZHVja0hlYWx0aF8FC2R1Y2tBc3NldElkAQprZXlCbG9ja2VkAAIQY29udHJhY3RzQmxvY2tlZAEOa2V5T3JkZXJCeUxhbmQBC2xhbmRBc3NldElkCQCsAgICCmxhbmRPcmRlcl8FC2xhbmRBc3NldElkAQ5rZXlFc1dhcmVob3VzZQACGmVtZXJnZW5jeVdhcmVob3VzZVByb2R1Y3RzAQhhc1N0cmluZwEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAFAXMJAAIBAhhmYWlsIHRvIGNhc3QgaW50byBTdHJpbmcBCWFzQm9vbGVhbgEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgdCb29sZWFuBAFzBQckbWF0Y2gwBQFzCQACAQIZZmFpbCB0byBjYXN0IGludG8gQm9vbGVhbgEPbnVtUGllY2VzQnlTaXplAQhsYW5kU2l6ZQQHJG1hdGNoMAUIbGFuZFNpemUDCQAAAgIBUwUHJG1hdGNoMAUFU1NJWkUDCQAAAgIBTQUHJG1hdGNoMAUFTVNJWkUDCQAAAgIBTAUHJG1hdGNoMAUFTFNJWkUDCQAAAgICWEwFByRtYXRjaDAFBlhMU0laRQMJAAACAgNYWEwFByRtYXRjaDAFB1hYTFNJWkUJAAIBAhFVbmtub3duIGxhbmQgc2l6ZQESZ2V0UmVjaXBlTWF0ZXJpYWxzAQZyZWNpcGUKAQZhZGRNYXQCAmFjAWoJAGQCBQJhYwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFBnJlY2lwZQUBagoAAiRsCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFBQNuaWwKAAIkcwkAkAMBBQIkbAoABSRhY2MwAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBmFkZE1hdAIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgANVVNEVFBSSVpFUEFSVACgwh4BEmFzTGlzdEludENvbXBhY3RlZAEDdmFsBAckbWF0Y2gwBQN2YWwDCQABAgUHJG1hdGNoMAIJTGlzdFtBbnldBAp2YWxBbnlMaXN0BQckbWF0Y2gwAwkBAiE9AgkAkAMBBQp2YWxBbnlMaXN0BQZOVU1SRVMJAAIBCQCsAgICDkFycmF5IHNpemUgaXMgCQCkAwEJAJADAQUKdmFsQW55TGlzdAoBBGNvbnYCA2FjYwRpdGVtBAckbWF0Y2gxBQRpdGVtAwkAAQIFByRtYXRjaDECA0ludAQCaXQFByRtYXRjaDEJAM0IAgUDYWNjCQCkAwEFAml0CQACAQIUTGlzdCB0eXBlIGlzIG5vdCBJbnQEAXIKAAIkbAUKdmFsQW55TGlzdAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAFA25pbAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEEY29udgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgkAuQkCBQFyAgFfCQACAQIWZmFpbCB0byBjYXN0IGludG8gTGlzdAENYXNTcGxpdFJlc3VsdAEDdmFsBAckbWF0Y2gwBQN2YWwDCQABAgUHJG1hdGNoMAIWKExpc3RbQW55XSwgTGlzdFtBbnldKQQCdDIFByRtYXRjaDAJAJQKAgkBEmFzTGlzdEludENvbXBhY3RlZAEIBQJ0MgJfMQkBEmFzTGlzdEludENvbXBhY3RlZAEIBQJ0MgJfMgkAAgECHmZhaWwgdG8gY2FzdCBpbnRvIChMaXN0LCBMaXN0KQEOd2FsbGV0SW50ZXJuYWwBDnVzZXJBZGRyZXNzT3B0BARhZGRyCQCmCAEFDnVzZXJBZGRyZXNzT3B0BAdiYWxhbmNlAwkBCWlzRGVmaW5lZAEFBGFkZHIJAO8HAQkBBXZhbHVlAQUEYWRkcgkBDkJhbGFuY2VEZXRhaWxzBAAAAAAAAAAABAt1c2R0QmFsYW5jZQMJAQlpc0RlZmluZWQBBQRhZGRyCQDwBwIJAQV2YWx1ZQEFBGFkZHIFC3VzZHRBc3NldElkAAAECmN1c3RvbU5hbWUJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5QWRkcmVzc1RvQ3VzdG9tTmFtZQEFDnVzZXJBZGRyZXNzT3B0BQ51c2VyQWRkcmVzc09wdAQFcmVmQnkJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEPa2V5QWRkcmVzc1JlZkJ5AQUOdXNlckFkZHJlc3NPcHQCAAQEcmVmcwkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARNrZXlBZGRyZXNzUmVmZXJyYWxzAQUOdXNlckFkZHJlc3NPcHQCAAQIbGFzdFR4SWQJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQERa2V5TGFzdFR4SWRCeVVzZXIBBQ51c2VyQWRkcmVzc09wdAIACQDMCAIJAKwCAgISJXMlc19fY3VzdG9tTmFtZV9fBQpjdXN0b21OYW1lCQDMCAIJAKwCAgISJXMlc19fcmVmZXJyZWRCeV9fBQVyZWZCeQkAzAgCCQCsAgICESVzJXNfX3JlZmVycmFsc19fBQRyZWZzCQDMCAIJAKwCAgIQJXMlc19fbGFzdFR4SWRfXwUIbGFzdFR4SWQJAMwIAgkArAICAhYlcyVzJWRfX3dhdmVzQmFsYW5jZV9fCQCkAwEIBQdiYWxhbmNlCWF2YWlsYWJsZQkAzAgCCQCsAgICFSVzJXMlZF9fdXNkdEJhbGFuY2VfXwkApAMBBQt1c2R0QmFsYW5jZQUDbmlsAQxhcHBseUJvbnVzZXMCC2xhbmRBc3NldElkBnBpZWNlcwQKaW5mcmFMZXZlbAkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJARZrZXlJbmZyYUxldmVsQnlBc3NldElkAQULbGFuZEFzc2V0SWQAAAQJYXJ0UGllY2VzCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBIGtleUxhbmRBcnRTdGF0dXNCeVR5cGVBbmRBc3NldElkAgUKQVJUUFJFU0FMRQULbGFuZEFzc2V0SWQAAAQEYWRkNgkAaQIFCmluZnJhTGV2ZWwABgQEYWRkNwkAaQIFCmluZnJhTGV2ZWwABwkAlQoDBQppbmZyYUxldmVsBQlhcnRQaWVjZXMJAGQCCQBkAgUPREFJTFlSRVNCWVBJRUNFCQBrAwUPREFJTFlSRVNCWVBJRUNFCQBkAgkAZAIFCmluZnJhTGV2ZWwFBGFkZDYJAGgCAAIFBGFkZDcABQkAawMFD0RBSUxZUkVTQllQSUVDRQUJYXJ0UGllY2VzCQBoAgUGcGllY2VzAAUBF2dldFdhcmVob3VzZVRvdGFsVm9sdW1lAQl2b2xQcmVmaXgEBXBhcnRzCQC1CQIFCXZvbFByZWZpeAIBXwkAaAIJAGgCBQxXSE1VTFRJUExJRVIJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFcGFydHMAAQABCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUFcGFydHMAAAEMZ2V0V2FyZWhvdXNlAwV3aEtleQlsYW5kSW5kZXgKaW5mcmFMZXZlbAQJdm9sUHJlZml4CQCsAgIJAKwCAgkApAMBBQlsYW5kSW5kZXgCAV8JAKQDAQUKaW5mcmFMZXZlbAQEdG90UwkApAMBCQEXZ2V0V2FyZWhvdXNlVG90YWxWb2x1bWUBBQl2b2xQcmVmaXgEBXdoU3RyCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAUFd2hLZXkJAKwCAgkArAICCQCsAgIJAKwCAgUJdm9sUHJlZml4Ah46MF8wXzBfMF8wXzA6MF8wXzBfMF8wXzA6OjBfMF8FBHRvdFMCAV8FBHRvdFMJALUJAgUFd2hTdHICAToBDWR1Y2tJbmZvVHVwbGUBC2R1Y2tBc3NldElkCQCXCgUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2R1Y2tBc3NldElkAP///////////wEICQEFdmFsdWUBCQDsBwEJANkEAQULZHVja0Fzc2V0SWQEbmFtZQkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAIACQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBDWtleUR1Y2tIZWFsdGgBBQtkdWNrQXNzZXRJZAD///////////8BCQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAITZ2V0QmFja3BhY2tSRUFET05MWQkAzAgCBQtkdWNrQXNzZXRJZAUDbmlsBQNuaWwBDWR1Y2tJbmZvQXJyYXkDC2R1Y2tBc3NldElkBW93bmVyB2R1Y2tJbmYECmN1c3RvbU5hbWUJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEaa2V5RHVja0Fzc2V0SWRUb0N1c3RvbU5hbWUBBQtkdWNrQXNzZXRJZAgFB2R1Y2tJbmYCXzIJAMwIAgkArAICAg8lcyVzX19hc3NldElkX18FC2R1Y2tBc3NldElkCQDMCAIJAKwCAgINJXMlc19fb3duZXJfXwUFb3duZXIJAMwIAgkArAICAhIlcyVzX19jdXN0b21OYW1lX18FCmN1c3RvbU5hbWUJAMwIAgkArAICAhIlcyVkX19zdGFrZWRUaW1lX18JAKQDAQgFB2R1Y2tJbmYCXzEJAMwIAgkArAICAgwlcyVzX19uYW1lX18IBQdkdWNrSW5mAl8yCQDMCAIJAKwCAgIQJXMlc19fbG9jYXRpb25fXwgFB2R1Y2tJbmYCXzMJAMwIAgkArAICAg4lcyVkX19oZWFsdGhfXwkApAMBCAUHZHVja0luZgJfNAkAzAgCCQCsAgICECVzJXNfX2JhY2tQYWNrX18IBQdkdWNrSW5mAl81BQNuaWwBDWxhbmRJbmZvQXJyYXkDC2xhbmRBc3NldElkBW93bmVyCnN0YWtlZFRpbWUDCQAAAgULbGFuZEFzc2V0SWQCAAkAAgECF2xhbmRBc3NldElkIGlzIHJlcXVpcmVkBAFhCQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQEAWQJALUJAggFAWELZGVzY3JpcHRpb24CAV8EB2xhbmROdW0DCQBmAggFAWEIcXVhbnRpdHkAAAkAkQMCBQFkBQpyZWNMYW5kTnVtCQCsAgICAS0JAJEDAgUBZAUKcmVjTGFuZE51bQQGcGllY2VzCQEPbnVtUGllY2VzQnlTaXplAQkAkQMCBQFkBQtyZWNMYW5kU2l6ZQQMcHJvZHVjdGl2aXR5CQEMYXBwbHlCb251c2VzAgULbGFuZEFzc2V0SWQFBnBpZWNlcwQJZGVsdGFUaW1lCQBlAggFCWxhc3RCbG9jawl0aW1lc3RhbXAFCnN0YWtlZFRpbWUECGF2YWlsUmVzAwkAZgIFCnN0YWtlZFRpbWUAAAkAawMFCWRlbHRhVGltZQkAaAIIBQxwcm9kdWN0aXZpdHkCXzMFBnBpZWNlcwUJREFZTUlMTElTAAAEB25lZWRNYXQJAGsDBRFJbmZyYVVwZ3JhZGVDb3N0UwkAaAIFBnBpZWNlcwkAZAIIBQxwcm9kdWN0aXZpdHkCXzEAAQUFU1NJWkUEDmdsb2JhbEFuZExvY2FsAwkAZgIFCnN0YWtlZFRpbWUAAAkBDWFzU3BsaXRSZXN1bHQBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIkc3BsaXRCeUdsb2JhbEFuZExvY2FsV2VpZ2h0c1JFQURPTkxZCQDMCAIFB25lZWRNYXQJAMwIAgUIYXZhaWxSZXMJAMwIAgkAkQMCBQFkBQtyZWNUZXJyYWlucwUDbmlsBQNuaWwJAJQKAgkBEmFzTGlzdEludENvbXBhY3RlZAEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0AhxzcGxpdEJ5R2xvYmFsV2VpZ2h0c1JFQURPTkxZCQDMCAIFB25lZWRNYXQFA25pbAUDbmlsAgAECmN1c3RvbU5hbWUJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEaa2V5TGFuZEFzc2V0SWRUb0N1c3RvbU5hbWUBBQtsYW5kQXNzZXRJZAkArAICCQCsAgIJAJEDAgUBZAUMcmVjQ29udGluZW50AgEtCQCRAwIFAWQFCnJlY0xhbmROdW0JAMwIAgkArAICAg8lcyVzX19hc3NldElkX18FC2xhbmRBc3NldElkCQDMCAIJAKwCAgINJXMlc19fb3duZXJfXwUFb3duZXIJAMwIAgkArAICAhIlcyVzX19jdXN0b21OYW1lX18FCmN1c3RvbU5hbWUJAMwIAgkArAICAhIlcyVkX19zdGFrZWRUaW1lX18JAKQDAQUKc3Rha2VkVGltZQkAzAgCCQCsAgICEyVzJXNfX2Rlc2NyaXB0aW9uX18JALkJAgkAzAgCBQdsYW5kTnVtCQDMCAIJAJEDAgUBZAULcmVjTGFuZFNpemUJAMwIAgkAkQMCBQFkBQtyZWNUZXJyYWlucwkAzAgCCQCRAwIFAWQFDHJlY0NvbnRpbmVudAUDbmlsAgFfCQDMCAIJAKwCAgISJXMlZF9faW5mcmFMZXZlbF9fCQCkAwEIBQxwcm9kdWN0aXZpdHkCXzEJAMwIAgkArAICAhYlcyVzX19hdmFpbFJlc0J5VHlwZV9fCAUOZ2xvYmFsQW5kTG9jYWwCXzIJAMwIAgkArAICAhUlcyVkX19hdmFpbFJlc1RvdGFsX18JAKQDAQUIYXZhaWxSZXMJAMwIAgkArAICAhQlcyVzX19uZWVkTWF0ZXJpYWxfXwgFDmdsb2JhbEFuZExvY2FsAl8xCQDMCAIJALkJAgkAzAgCAgQlcyVzCQDMCAICDWxhbmRBcnRlZmFjdHMJAMwIAgkArAICAghQUkVTQUxFOgkApAMBCAUMcHJvZHVjdGl2aXR5Al8yBQNuaWwFA1NFUAkAzAgCCQCsAgICESVzJXNfX3dhcmVob3VzZV9fCQC5CQIJAQxnZXRXYXJlaG91c2UDCQESa2V5V2FyZWhvdXNlQnlMYW5kAQULbGFuZEFzc2V0SWQJAGkCBQZwaWVjZXMFBVNTSVpFCAUMcHJvZHVjdGl2aXR5Al8xAgE6CQDMCAIJAKwCAgIRJXMlc19fbGFuZE9yZGVyX18JAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPZWNvbm9teUNvbnRyYWN0CQEOa2V5T3JkZXJCeUxhbmQBBQtsYW5kQXNzZXRJZAIwMEAwXzBAMF8wQDBfMEAwXzBAMF8wQDA6MEAwXzBAMF8wQDBfMEAwXzBAMF8wQDA6BQNuaWwBEmxhbmRPcmRlckluZm9BcnJheQILbGFuZEFzc2V0SWQFb3duZXIDCQAAAgULbGFuZEFzc2V0SWQCAAkAAgECF2xhbmRBc3NldElkIGlzIHJlcXVpcmVkBAFhCQEFdmFsdWUBCQDsBwEJANkEAQULbGFuZEFzc2V0SWQEAWQJALUJAggFAWELZGVzY3JpcHRpb24CAV8EBnBpZWNlcwkBD251bVBpZWNlc0J5U2l6ZQEJAJEDAgUBZAULcmVjTGFuZFNpemUEDHByb2R1Y3Rpdml0eQkBDGFwcGx5Qm9udXNlcwIFC2xhbmRBc3NldElkBQZwaWVjZXMJAMwIAgkArAICAg8lcyVzX19hc3NldElkX18FC2xhbmRBc3NldElkCQDMCAIJAKwCAgINJXMlc19fb3duZXJfXwUFb3duZXIJAMwIAgkArAICAhElcyVzX193YXJlaG91c2VfXwkAuQkCCQEMZ2V0V2FyZWhvdXNlAwkBEmtleVdhcmVob3VzZUJ5TGFuZAEFC2xhbmRBc3NldElkCQBpAgUGcGllY2VzBQVTU0laRQgFDHByb2R1Y3Rpdml0eQJfMQIBOgkAzAgCCQCsAgICESVzJXNfX2xhbmRPcmRlcl9fCQELdmFsdWVPckVsc2UCCQCdCAIFD2Vjb25vbXlDb250cmFjdAkBDmtleU9yZGVyQnlMYW5kAQULbGFuZEFzc2V0SWQCMDBAMF8wQDBfMEAwXzBAMF8wQDBfMEAwOjBAMF8wQDBfMEAwXzBAMF8wQDBfMEAwOgUDbmlsDQFpAQ1jb25zdHJ1Y3RvclYxAQljb250cmFjdHMDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhJwZXJtaXNzaW9ucyBkZW5pZWQKAQpkZXNjcmlwdG9yAgNhY2MLaWdub3JlZEl0ZW0JAKwCAgUDYWNjAgIlcwQFZGVzY3IKAAIkbAUJY29udHJhY3RzCgACJHMJAJADAQUCJGwKAAUkYWNjMAIACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQpkZXNjcmlwdG9yAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAxMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQprZXlSZXN0Q2ZnAAkAuQkCCQDMCAIFBWRlc2NyBQljb250cmFjdHMFA1NFUAkAzAgCCQELU3RyaW5nRW50cnkCCQEOa2V5UmVzdEFkZHJlc3MACQClCAEFBHRoaXMFA25pbAFpARJ3YWxsZXRJbmZvUkVBRE9OTFkBDnVzZXJBZGRyZXNzT3B0CQCUCgIFA25pbAkBDndhbGxldEludGVybmFsAQUOdXNlckFkZHJlc3NPcHQBaQEXZHVja0J5T3duZXJJbmZvUkVBRE9OTFkBC3VzZXJBZGRyZXNzBApzdGFrZWREdWNrCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQULdXNlckFkZHJlc3MJAJQKAgUDbmlsAwMJAQlpc0RlZmluZWQBCQCmCAEFC3VzZXJBZGRyZXNzCQEJaXNEZWZpbmVkAQUKc3Rha2VkRHVjawcEC2R1Y2tBc3NldElkCQEFdmFsdWUBBQpzdGFrZWREdWNrCQENZHVja0luZm9BcnJheQMFC2R1Y2tBc3NldElkBQt1c2VyQWRkcmVzcwkBDWR1Y2tJbmZvVHVwbGUBBQtkdWNrQXNzZXRJZAkBDWR1Y2tJbmZvQXJyYXkDAgAFC3VzZXJBZGRyZXNzCQCXCgUA////////////AQIAAgAA////////////AQIAAWkBGWR1Y2tCeUFzc2V0SWRJbmZvUkVBRE9OTFkBC2R1Y2tBc3NldElkBAVvd25lcgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARBrZXlEdWNrSWRUb093bmVyAQULZHVja0Fzc2V0SWQEB2R1Y2tJbmYJAQ1kdWNrSW5mb1R1cGxlAQULZHVja0Fzc2V0SWQJAJQKAgUDbmlsCQENZHVja0luZm9BcnJheQMFC2R1Y2tBc3NldElkAwkBCWlzRGVmaW5lZAEFBW93bmVyCQEFdmFsdWUBBQVvd25lcgIACQENZHVja0luZm9UdXBsZQEFC2R1Y2tBc3NldElkAWkBGWxhbmRCeUFzc2V0SWRJbmZvUkVBRE9OTFkBC2xhbmRBc3NldElkAwkAAAIFC2xhbmRBc3NldElkAgAJAAIBAhdsYW5kQXNzZXRJZCBpcyByZXF1aXJlZAQKc3Rha2VkVGltZQkBC3ZhbHVlT3JFbHNlAgkAmggCBQ9zdGFraW5nQ29udHJhY3QJARZrZXlTdGFrZWRUaW1lQnlBc3NldElkAQULbGFuZEFzc2V0SWQA////////////AQQFb3duZXIDCQBmAgUKc3Rha2VkVGltZQAACQEFdmFsdWUBCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFWtleUxhbmRBc3NldElkVG9Pd25lcgEFC2xhbmRBc3NldElkAgAJAJQKAgUDbmlsCQENbGFuZEluZm9BcnJheQMFC2xhbmRBc3NldElkBQVvd25lcgUKc3Rha2VkVGltZQFpAR5zdGFrZWRMYW5kc0J5T3duZXJJbmZvUkVBRE9OTFkBEGxhbmRPd25lckFkZHJlc3MDCQAAAgUQbGFuZE93bmVyQWRkcmVzcwIACQACAQIcbGFuZE93bmVyQWRkcmVzcyBpcyByZXF1aXJlZAQIbGFuZHNTdHIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEVa2V5U3Rha2VkTGFuZHNCeU93bmVyAQUQbGFuZE93bmVyQWRkcmVzcwQFbGFuZHMDCQEJaXNEZWZpbmVkAQUIbGFuZHNTdHIJAL0JAgkBBXZhbHVlAQUIbGFuZHNTdHICAV8FA25pbAoBB29uZUxhbmQCA2FjYwtsYW5kQXNzZXRJZAMJAAACBQtsYW5kQXNzZXRJZAIACQACAQIXbGFuZEFzc2V0SWQgaXMgcmVxdWlyZWQECnN0YWtlZFRpbWUJAQt2YWx1ZU9yRWxzZQIJAJoIAgUPc3Rha2luZ0NvbnRyYWN0CQEWa2V5U3Rha2VkVGltZUJ5QXNzZXRJZAEFC2xhbmRBc3Nl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BSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0ATgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAGIAYwBkCQCUCgIFA25pbAUBcgFpASN3YXJlaG91c2VPcmRlckJ5QXNzZXRJZEluZm9SRUFET05MWQELbGFuZEFzc2V0SWQDCQAAAgULbGFuZEFzc2V0SWQCAAkAAgECF2xhbmRBc3NldElkIGlzIHJlcXVpcmVkBApzdGFrZWRUaW1lCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNzZXRJZAD///////////8BBAVvd25lcgMJAGYCBQpzdGFrZWRUaW1lAAAJAQV2YWx1ZQEJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEVa2V5TGFuZEFzc2V0SWRUb093bmVyAQULbGFuZEFzc2V0SWQCAAkAlAoCBQNuaWwJARJsYW5kT3JkZXJJbmZvQXJyYXkCBQtsYW5kQXNzZXRJZAUFb3duZXIBaQEbb3JkZXJzQnlMYW5kSWRzSW5mb1JFQURPTkxZAQxsYW5kQXNzZXRJZHMKAQdvbmVMYW5kAgNhY2MLbGFuZEFzc2V0SWQDCQAAAgULbGFuZEFzc2V0SWQCAAkAAgECF2xhbmRBc3NldElkIGlzIHJlcXVpcmVkBApzdGFrZWRUaW1lCQELdmFsdWVPckVsc2UCCQCaCAIFD3N0YWtpbmdDb250cmFjdAkBFmtleVN0YWtlZFRpbWVCeUFzc2V0SWQBBQtsYW5kQXNz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AwkBEUBleHRyTmF0aXZlKDEwNjIpAQULdXNlckFkZHJlc3MFA2FtdAULdXNkdEFzc2V0SWQFA25pbAUDYW10AWkBH2dldEVtZXJnZW5jeVNlcnZpY2VEYXRhUkVBRE9OTFkABAhleGlzdFN0cgkAnQgCBQ9lY29ub215Q29udHJhY3QJAQ5rZXlFc1dhcmVob3VzZQAEDGV4aXN0QW1vdW50cwMJAQlpc0RlZmluZWQBBQhleGlzdFN0cgkAtQkCCQEFdmFsdWUBBQhleGlzdFN0cgIBXwUDbmlsCgEKc2luZ2xlUHJvZAIDYWNjCXJlY2lwZVN0cgQBbggFA2FjYwJfMgQGcmVjaXBlCQC1CQIFCXJlY2lwZVN0cgIBXwQIcGFja1NpemUJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQZyZWNpcGUFEXJlY2lwZUlkeFBhY2tzaXplBAltYXhBbW91bnQDCQAAAgUBbgAACQBoAgUNRVNNQVhQQUNLQUdFUwUIcGFja1NpemUAAAQLZXhpc3RBbW91bnQDCQBmAgkAkAMBBQxleGlzdEFtb3VudHMFAW4JAQ1wYXJzZUludFZhbHVlAQkAkQMCBQxleGlzdEFtb3VudHMFAW4AAAQIdG90YWxNYXQJARJnZXRSZWNpcGVNYXRlcmlhbHMBBQZyZWNpcGUECGJ1eVByaWNlCQBrAwkAaAIFCHRvdGFsTWF0BQlFU0JVWUNPRUYFEFJFU09VUkNFUFJJQ0VNSU4JAGgCAAoFCHBhY2tTaXplBAlzZWxsUHJpY2UJAGsDCQBoAgUIdG90YWxNYXQFCkVTU0VMTENPRUYFEFJFU09VUkNFUFJJQ0VNSU4JAGgCAAoFCHBhY2tTaXplBAF5CQC5CQIJAMwIAgkApAMBBQltYXhBbW91bnQJAMwIAgkApAMBBQtleGlzdEFtb3VudAkAzAgCCQCkAwEFCGJ1eVByaWNlCQDMCAIJAKQDAQUJc2VsbFByaWNlBQNuaWwCAV8JAJQKAgkAzQgCCAUDYWNjAl8xBQF5CQBkAgUBbgABBAFzCQC6CQIICgACJGwFEHByb2R1Y3Rpb25NYXRyaXgKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQpzaW5nbGVQcm9kAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyA1MAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAAxADICXzECAToEBnJlc3VsdAkArAICAhwlcyVzX19lbWVyZ2VuY3lTZXJ2aWNlRGF0YV9fBQFzCQCUCgIFA25pbAUGcmVzdWx0AEF6Efw=", "height": 3685104, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: FRMkwTsSCbeUydjtU8ApENVn6Sx2K9YicVfTUVmNGYMh Next: CgtxriQm5c7iSkTvnuHz5CU7659LyakjyKDi4qR7aMHd Diff:
OldNewDifferences
1212 else throw("Unknown chain")
1313 }
1414
15+let defaultRestAddressStr = match chain {
16+ case _ =>
17+ if ((base58'2W' == $match0))
18+ then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
19+ else if ((base58'2T' == $match0))
20+ then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
21+ else throw("Unknown chain")
22+}
23+
1524 let InfraUpgradeCostS = match chain {
1625 case _ =>
1726 if ((base58'2W' == $match0))
2130 else throw("Unknown chain")
2231 }
2332
33+let SEP = "__"
34+
2435 let MULT6 = 1000000
2536
26-let MULT8 = 100000000
27-
28-let LANDPREFIX = "LAND"
29-
30-let DUCKPREFIX = "DUCK"
31-
32-let SEP = "__"
33-
3437 let ARTPRESALE = "PRESALE"
35-
36-let DAILYRESBYPIECE = 3456000
37-
38-let DAYMILLIS = 86400000
3938
4039 let NUMRES = 6
4140
4948
5049 let XXLSIZE = 625
5150
52-let USDTPRIZEPART = 500000
51+let DAILYRESBYPIECE = 3456000
52+
53+let DAYMILLIS = 86400000
5354
5455 let WHMULTIPLIER = 10000000000
56+
57+let RESOURCEPRICEMIN = 39637
58+
59+let ESMAXPACKAGES = 3
60+
61+let ESBUYCOEF = 4
62+
63+let ESSELLCOEF = 10
64+
65+let productionMatrix = ["1_1_1_2_2_5_1_10_0", "2_2_2_4_4_10_1_10_0", "3_3_3_6_6_15_1_10_0", "2_5_5_2_7_5_2_100_1", "4_10_10_4_14_10_2_100_1", "6_15_15_6_21_15_2_100_1", "1_1_1_1_1_8_1_10_2", "2_2_2_2_2_16_1_10_2", "3_3_3_3_3_24_1_10_2", "9_9_1_5_5_1_5_100_3", "18_18_2_10_10_2_5_100_3", "27_27_3_15_15_3_5_100_3", "2_2_1_2_2_2_1_10_4", "4_4_2_4_4_4_1_10_4", "6_6_3_6_6_6_1_10_4"]
66+
67+let recipeIdxPacksize = 7
5568
5669 let recLandNum = 0
5770
6174
6275 let recContinent = 3
6376
64-let whIdxLevels = 0
65-
66-let whIdxRes = 1
67-
68-let whIdxMat = 2
69-
70-let whIdxProd = 3
71-
72-let whIdxLOFT = 4
73-
74-let volLocked = 0
75-
76-let volOccupied = 1
77-
78-let volFree = 2
79-
80-let volTotal = 3
81-
82-func keyRestCfg () = "%s__restConfig"
77+func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
8378
8479
8580 let IdxCfgStakingDapp = 1
8681
8782 let IdxCfgEconomyDapp = 2
8883
89-let IdxCfgGovernanceDapp = 3
90-
91-let productPackages = [10, 10, 10, 100, 100, 100, 10, 10, 10, 100, 100, 100, 10, 10, 10]
92-
93-func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
84+func keyRestCfg () = "%s__restConfig"
9485
9586
96-func readRestCfgOrFail () = split_4C(getStringOrFail(this, keyRestCfg()), SEP)
87+func keyRestAddress () = "%s__restAddr"
88+
89+
90+func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
9791
9892
9993 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
10094
10195
102-let restCfg = readRestCfgOrFail()
96+let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
97+
98+let restCfg = readRestCfgOrFail(restContract)
10399
104100 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
105101
106102 let economyContract = getContractAddressOrFail(restCfg, IdxCfgEconomyDapp)
107103
108-let governanceContract = getContractAddressOrFail(restCfg, IdxCfgEconomyDapp)
109-
110-func keyBlocked () = "contractsBlocked"
111-
112-
113-func keyDuckIdToOwner (assetId) = ("duckOwner_" + assetId)
114-
115-
116-func keyStakedTimeByAssetId (assetId) = ("stakedTime_" + assetId)
117-
118-
119-func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
120-
121-
122-func keyStakedTimeByTypeAssetIdAndOwner (nftType,assetId,ownerAddr) = ((((("stakedTimeByTypeAssetIdAndOwner_" + nftType) + "_") + assetId) + "_") + ownerAddr)
123-
124-
125-func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
126-
127-
128-func keyWarehouseByLand (landAssetId) = ("wareHouse_" + landAssetId)
129-
130-
131-func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
132-
133-
134-func keyDuckHealth (duckAssetId) = ("duckHealth_" + duckAssetId)
104+func keyLastTxIdByUser (addr) = ("lastTxIdByUser_" + addr)
135105
136106
137107 func keyLandAssetIdToOwner (assetId) = ("nftOwner_" + assetId)
138108
139109
140110 func keyLandAssetIdToCustomName (assetId) = ("landCustomNameByAssetId_" + assetId)
111+
112+
113+func keyStakedTimeByAssetId (assetId) = ("stakedTime_" + assetId)
114+
115+
116+func keyInfraLevelByAssetId (assetId) = ("infraLevel_" + assetId)
117+
118+
119+func keyLandArtStatusByTypeAndAssetId (type,assetId) = makeString(["landArtStatus", type, assetId], "_")
120+
121+
122+func keyWarehouseByLand (landAssetId) = ("wareHouse_" + landAssetId)
123+
124+
125+func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
141126
142127
143128 func keyDuckAssetIdToCustomName (assetId) = ("duckCustomNameByAssetId_" + assetId)
152137 func keyAddressReferrals (addr) = ("accReferrals_" + addr)
153138
154139
155-func keyInfraLevelByAssetId (assetId) = ("infraLevel_" + assetId)
140+func keyDuckIdToOwner (assetId) = ("duckOwner_" + assetId)
156141
157142
158-func keyLandArtStatusByTypeAndAssetId (type,assetId) = makeString(["landArtStatus", type, assetId], "_")
143+func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
159144
160145
161-func keyPresaleArtActivatedByAssetId (assetId) = ("presaleArtActivated_" + assetId)
146+func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
162147
163148
164-func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
149+func keyDuckHealth (duckAssetId) = ("duckHealth_" + duckAssetId)
165150
166151
167-func keyLastTxIdByUser (addr) = ("lastTxIdByUser_" + addr)
152+func keyBlocked () = "contractsBlocked"
168153
169154
170155 func keyOrderByLand (landAssetId) = ("landOrder_" + landAssetId)
156+
157+
158+func keyEsWarehouse () = "emergencyWarehouseProducts"
171159
172160
173161 func asString (v) = match v {
178166 }
179167
180168
181-func asInt (v) = match v {
182- case n: Int =>
183- n
184- case _ =>
185- throw("fail to cast into Int")
186-}
187-
188-
189169 func asBoolean (v) = match v {
190170 case s: Boolean =>
191171 s
193173 throw("fail to cast into Boolean")
194174 }
195175
176+
177+func numPiecesBySize (landSize) = match landSize {
178+ case _ =>
179+ if (("S" == $match0))
180+ then SSIZE
181+ else if (("M" == $match0))
182+ then MSIZE
183+ else if (("L" == $match0))
184+ then LSIZE
185+ else if (("XL" == $match0))
186+ then XLSIZE
187+ else if (("XXL" == $match0))
188+ then XXLSIZE
189+ else throw("Unknown land size")
190+}
191+
192+
193+func getRecipeMaterials (recipe) = {
194+ func addMat (ac,j) = (ac + parseIntValue(recipe[j]))
195+
196+ let $l = [0, 1, 2, 3, 4, 5]
197+ let $s = size($l)
198+ let $acc0 = 0
199+ func $f0_1 ($a,$i) = if (($i >= $s))
200+ then $a
201+ else addMat($a, $l[$i])
202+
203+ func $f0_2 ($a,$i) = if (($i >= $s))
204+ then $a
205+ else throw("List size exceeds 6")
206+
207+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
208+ }
209+
210+
211+let USDTPRIZEPART = 500000
196212
197213 func asListIntCompacted (val) = match val {
198214 case valAnyList: List[Any] =>
260276 }
261277
262278
263-func numPiecesBySize (landSize) = match landSize {
264- case _ =>
265- if (("S" == $match0))
266- then SSIZE
267- else if (("M" == $match0))
268- then MSIZE
269- else if (("L" == $match0))
270- then LSIZE
271- else if (("XL" == $match0))
272- then XLSIZE
273- else if (("XXL" == $match0))
274- then XXLSIZE
275- else throw("Unknown land size")
276-}
277-
278-
279279 func getWarehouseTotalVolume (volPrefix) = {
280280 let parts = split(volPrefix, "_")
281281 ((WHMULTIPLIER * (parseIntValue(parts[1]) + 1)) * parseIntValue(parts[0]))
282282 }
283283
284284
285-func getWarehouseOccupiedVol (currentWh) = {
286- let goods = currentWh[whIdxProd]
287- func sumResMat (acc,item) = (acc + parseIntValue(item))
288-
289- func sumProd (acc,item) = {
290- let idx = acc._1
291- let pkgSize = productPackages[idx]
292- let pkgs = (((parseIntValue(item) + pkgSize) - 1) / pkgSize)
293- $Tuple2((idx + 1), (acc._2 + (pkgs * MULT8)))
294- }
295-
296- let whResVol = {
297- let $l = split(currentWh[whIdxRes], "_")
298- let $s = size($l)
299- let $acc0 = 0
300- func $f0_1 ($a,$i) = if (($i >= $s))
301- then $a
302- else sumResMat($a, $l[$i])
303-
304- func $f0_2 ($a,$i) = if (($i >= $s))
305- then $a
306- else throw("List size exceeds 6")
307-
308- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
309- }
310- let whMatVol = {
311- let $l = split(currentWh[whIdxMat], "_")
312- let $s = size($l)
313- let $acc0 = 0
314- func $f1_1 ($a,$i) = if (($i >= $s))
315- then $a
316- else sumResMat($a, $l[$i])
317-
318- func $f1_2 ($a,$i) = if (($i >= $s))
319- then $a
320- else throw("List size exceeds 6")
321-
322- $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
323- }
324- let whGoodsVol = if ((goods == ""))
325- then 0
326- else ( let $l = split_4C(goods, "_")
327- let $s = size($l)
328- let $acc0 = $Tuple2(0, 0)
329- func $f2_1 ($a,$i) = if (($i >= $s))
330- then $a
331- else sumProd($a, $l[$i])
332-
333- func $f2_2 ($a,$i) = if (($i >= $s))
334- then $a
335- else throw("List size exceeds 50")
336-
337- $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50))._2
338- ((whResVol + whMatVol) + whGoodsVol)
339- }
340-
341-
342285 func getWarehouse (whKey,landIndex,infraLevel) = {
343286 let volPrefix = ((toString(landIndex) + "_") + toString(infraLevel))
344- let whTotal = getWarehouseTotalVolume(volPrefix)
345- let whStr = valueOrElse(getString(stakingContract, whKey), (volPrefix + ":0_0_0_0_0_0:0_0_0_0_0_0::0"))
346- let wh = split(whStr, ":")
347- let whOccupied = getWarehouseOccupiedVol(wh)
348- let whLoft = if ((5 > size(wh)))
349- then makeString(["0", toString(whOccupied), toString((whTotal - whOccupied)), toString(whTotal)], "_")
350- else {
351- let loft = split(wh[whIdxLOFT], "_")
352- let whLocked = parseIntValue(loft[volLocked])
353- let occ = if ((size(loft) > 1))
354- then parseIntValue(loft[volOccupied])
355- else whOccupied
356- makeString([toString(whLocked), toString(occ), toString(((whTotal - whLocked) - occ)), toString(whTotal)], "_")
357- }
358-[wh[whIdxLevels], if ((size(split(wh[whIdxRes], "_")) == NUMRES))
359- then wh[whIdxRes]
360- else "0_0_0_0_0_0", if ((size(split(wh[whIdxMat], "_")) == NUMRES))
361- then wh[whIdxMat]
362- else "0_0_0_0_0_0", wh[whIdxProd], whLoft]
287+ let totS = toString(getWarehouseTotalVolume(volPrefix))
288+ let whStr = valueOrElse(getString(stakingContract, whKey), ((((volPrefix + ":0_0_0_0_0_0:0_0_0_0_0_0::0_0_") + totS) + "_") + totS))
289+ split(whStr, ":")
363290 }
364291
365292
407334
408335
409336 @Callable(i)
410-func constructorV1 (stakingContract,economyContract,governanceContract) = if ((i.caller != this))
337+func constructorV1 (contracts) = if ((i.caller != this))
411338 then throw("permissions denied")
412- else [StringEntry(keyRestCfg(), makeString(["%s%s%s", stakingContract, economyContract, governanceContract], SEP))]
339+ else {
340+ func descriptor (acc,ignoredItem) = (acc + "%s")
341+
342+ let descr = {
343+ let $l = contracts
344+ let $s = size($l)
345+ let $acc0 = ""
346+ func $f0_1 ($a,$i) = if (($i >= $s))
347+ then $a
348+ else descriptor($a, $l[$i])
349+
350+ func $f0_2 ($a,$i) = if (($i >= $s))
351+ then $a
352+ else throw("List size exceeds 10")
353+
354+ $f0_2($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)
355+ }
356+[StringEntry(keyRestCfg(), makeString(descr :: contracts, SEP)), StringEntry(keyRestAddress(), toString(this))]
357+ }
413358
414359
415360
482427
483428 func $f0_2 ($a,$i) = if (($i >= $s))
484429 then $a
485- else throw("List size exceeds 40")
430+ else throw("List size exceeds 100")
486431
487- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40)
432+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
488433 }
489434 $Tuple2(nil, r)
490435 }
513458
514459 func $f0_2 ($a,$i) = if (($i >= $s))
515460 then $a
516- else throw("List size exceeds 40")
461+ else throw("List size exceeds 100")
517462
518- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40)
463+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
519464 }
520465 $Tuple2(nil, r)
521466 }
615560 else {
616561 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
617562 then throw("landAssetId is required")
618- else if (isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId))))
619- then (acc + size(asString(invoke(stakingContract, "fixWarehouseFormat", [landAssetId], nil))))
620- else acc
563+ else (acc + size(asString(invoke(stakingContract, "fixWarehouseFormat", [landAssetId], nil))))
621564
622565 let r = {
623566 let $l = landAssetIds
647590 }
648591
649592
593+
594+@Callable(i)
595+func getEmergencyServiceDataREADONLY () = {
596+ let existStr = getString(economyContract, keyEsWarehouse())
597+ let existAmounts = if (isDefined(existStr))
598+ then split(value(existStr), "_")
599+ else nil
600+ func singleProd (acc,recipeStr) = {
601+ let n = acc._2
602+ let recipe = split(recipeStr, "_")
603+ let packSize = parseIntValue(recipe[recipeIdxPacksize])
604+ let maxAmount = if ((n == 0))
605+ then (ESMAXPACKAGES * packSize)
606+ else 0
607+ let existAmount = if ((size(existAmounts) > n))
608+ then parseIntValue(existAmounts[n])
609+ else 0
610+ let totalMat = getRecipeMaterials(recipe)
611+ let buyPrice = fraction((totalMat * ESBUYCOEF), RESOURCEPRICEMIN, (10 * packSize))
612+ let sellPrice = fraction((totalMat * ESSELLCOEF), RESOURCEPRICEMIN, (10 * packSize))
613+ let y = makeString([toString(maxAmount), toString(existAmount), toString(buyPrice), toString(sellPrice)], "_")
614+ $Tuple2((acc._1 :+ y), (n + 1))
615+ }
616+
617+ let s = makeString_2C(( let $l = productionMatrix
618+ let $s = size($l)
619+ let $acc0 = $Tuple2(nil, 0)
620+ func $f0_1 ($a,$i) = if (($i >= $s))
621+ then $a
622+ else singleProd($a, $l[$i])
623+
624+ func $f0_2 ($a,$i) = if (($i >= $s))
625+ then $a
626+ else throw("List size exceeds 50")
627+
628+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50))._1, ":")
629+ let result = ("%s%s__emergencyServiceData__" + s)
630+ $Tuple2(nil, result)
631+ }
632+
633+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let chain = take(drop(this.bytes, 1), 1)
55
66 let usdtAssetId = match chain {
77 case _ =>
88 if ((base58'2W' == $match0))
99 then base58'9wc3LXNA4TEBsXyKtoLE9mrbDD7WMHXvXrCjZvabLAsi'
1010 else if ((base58'2T' == $match0))
1111 then base58'6mWwf9mZBjVgkC54idpyaZLQfAosD914wT8fGf2iiY63'
1212 else throw("Unknown chain")
1313 }
1414
15+let defaultRestAddressStr = match chain {
16+ case _ =>
17+ if ((base58'2W' == $match0))
18+ then "3PQCuvFbvh4LkPUnrnU1z3jnbA1p9m3WNhv"
19+ else if ((base58'2T' == $match0))
20+ then "3MumkGGztCKAXpWDqxkddofqXSUbqQkvSJy"
21+ else throw("Unknown chain")
22+}
23+
1524 let InfraUpgradeCostS = match chain {
1625 case _ =>
1726 if ((base58'2W' == $match0))
1827 then 10000000000
1928 else if ((base58'2T' == $match0))
2029 then 100000000
2130 else throw("Unknown chain")
2231 }
2332
33+let SEP = "__"
34+
2435 let MULT6 = 1000000
2536
26-let MULT8 = 100000000
27-
28-let LANDPREFIX = "LAND"
29-
30-let DUCKPREFIX = "DUCK"
31-
32-let SEP = "__"
33-
3437 let ARTPRESALE = "PRESALE"
35-
36-let DAILYRESBYPIECE = 3456000
37-
38-let DAYMILLIS = 86400000
3938
4039 let NUMRES = 6
4140
4241 let SSIZE = 25
4342
4443 let MSIZE = 100
4544
4645 let LSIZE = 225
4746
4847 let XLSIZE = 400
4948
5049 let XXLSIZE = 625
5150
52-let USDTPRIZEPART = 500000
51+let DAILYRESBYPIECE = 3456000
52+
53+let DAYMILLIS = 86400000
5354
5455 let WHMULTIPLIER = 10000000000
56+
57+let RESOURCEPRICEMIN = 39637
58+
59+let ESMAXPACKAGES = 3
60+
61+let ESBUYCOEF = 4
62+
63+let ESSELLCOEF = 10
64+
65+let productionMatrix = ["1_1_1_2_2_5_1_10_0", "2_2_2_4_4_10_1_10_0", "3_3_3_6_6_15_1_10_0", "2_5_5_2_7_5_2_100_1", "4_10_10_4_14_10_2_100_1", "6_15_15_6_21_15_2_100_1", "1_1_1_1_1_8_1_10_2", "2_2_2_2_2_16_1_10_2", "3_3_3_3_3_24_1_10_2", "9_9_1_5_5_1_5_100_3", "18_18_2_10_10_2_5_100_3", "27_27_3_15_15_3_5_100_3", "2_2_1_2_2_2_1_10_4", "4_4_2_4_4_4_1_10_4", "6_6_3_6_6_6_1_10_4"]
66+
67+let recipeIdxPacksize = 7
5568
5669 let recLandNum = 0
5770
5871 let recLandSize = 1
5972
6073 let recTerrains = 2
6174
6275 let recContinent = 3
6376
64-let whIdxLevels = 0
65-
66-let whIdxRes = 1
67-
68-let whIdxMat = 2
69-
70-let whIdxProd = 3
71-
72-let whIdxLOFT = 4
73-
74-let volLocked = 0
75-
76-let volOccupied = 1
77-
78-let volFree = 2
79-
80-let volTotal = 3
81-
82-func keyRestCfg () = "%s__restConfig"
77+func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
8378
8479
8580 let IdxCfgStakingDapp = 1
8681
8782 let IdxCfgEconomyDapp = 2
8883
89-let IdxCfgGovernanceDapp = 3
90-
91-let productPackages = [10, 10, 10, 100, 100, 100, 10, 10, 10, 100, 100, 100, 10, 10, 10]
92-
93-func getStringOrFail (address,key) = valueOrErrorMessage(getString(address, key), makeString(["mandatory ", toString(address), ".", key, " is not defined"], ""))
84+func keyRestCfg () = "%s__restConfig"
9485
9586
96-func readRestCfgOrFail () = split_4C(getStringOrFail(this, keyRestCfg()), SEP)
87+func keyRestAddress () = "%s__restAddr"
88+
89+
90+func readRestCfgOrFail (rest) = split_4C(getStringOrFail(rest, keyRestCfg()), SEP)
9791
9892
9993 func getContractAddressOrFail (restCfg,idx) = valueOrErrorMessage(addressFromString(restCfg[idx]), ("Rest cfg doesn't contain address at index " + toString(idx)))
10094
10195
102-let restCfg = readRestCfgOrFail()
96+let restContract = addressFromStringValue(valueOrElse(getString(this, keyRestAddress()), defaultRestAddressStr))
97+
98+let restCfg = readRestCfgOrFail(restContract)
10399
104100 let stakingContract = getContractAddressOrFail(restCfg, IdxCfgStakingDapp)
105101
106102 let economyContract = getContractAddressOrFail(restCfg, IdxCfgEconomyDapp)
107103
108-let governanceContract = getContractAddressOrFail(restCfg, IdxCfgEconomyDapp)
109-
110-func keyBlocked () = "contractsBlocked"
111-
112-
113-func keyDuckIdToOwner (assetId) = ("duckOwner_" + assetId)
114-
115-
116-func keyStakedTimeByAssetId (assetId) = ("stakedTime_" + assetId)
117-
118-
119-func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
120-
121-
122-func keyStakedTimeByTypeAssetIdAndOwner (nftType,assetId,ownerAddr) = ((((("stakedTimeByTypeAssetIdAndOwner_" + nftType) + "_") + assetId) + "_") + ownerAddr)
123-
124-
125-func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
126-
127-
128-func keyWarehouseByLand (landAssetId) = ("wareHouse_" + landAssetId)
129-
130-
131-func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
132-
133-
134-func keyDuckHealth (duckAssetId) = ("duckHealth_" + duckAssetId)
104+func keyLastTxIdByUser (addr) = ("lastTxIdByUser_" + addr)
135105
136106
137107 func keyLandAssetIdToOwner (assetId) = ("nftOwner_" + assetId)
138108
139109
140110 func keyLandAssetIdToCustomName (assetId) = ("landCustomNameByAssetId_" + assetId)
111+
112+
113+func keyStakedTimeByAssetId (assetId) = ("stakedTime_" + assetId)
114+
115+
116+func keyInfraLevelByAssetId (assetId) = ("infraLevel_" + assetId)
117+
118+
119+func keyLandArtStatusByTypeAndAssetId (type,assetId) = makeString(["landArtStatus", type, assetId], "_")
120+
121+
122+func keyWarehouseByLand (landAssetId) = ("wareHouse_" + landAssetId)
123+
124+
125+func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
141126
142127
143128 func keyDuckAssetIdToCustomName (assetId) = ("duckCustomNameByAssetId_" + assetId)
144129
145130
146131 func keyAddressToCustomName (addr) = ("accountCustomNameByAddr_" + addr)
147132
148133
149134 func keyAddressRefBy (addr) = ("accRefBy_" + addr)
150135
151136
152137 func keyAddressReferrals (addr) = ("accReferrals_" + addr)
153138
154139
155-func keyInfraLevelByAssetId (assetId) = ("infraLevel_" + assetId)
140+func keyDuckIdToOwner (assetId) = ("duckOwner_" + assetId)
156141
157142
158-func keyLandArtStatusByTypeAndAssetId (type,assetId) = makeString(["landArtStatus", type, assetId], "_")
143+func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
159144
160145
161-func keyPresaleArtActivatedByAssetId (assetId) = ("presaleArtActivated_" + assetId)
146+func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
162147
163148
164-func keyStakedLandsByOwner (ownerAddr) = ("stakedLandsByOwner_" + ownerAddr)
149+func keyDuckHealth (duckAssetId) = ("duckHealth_" + duckAssetId)
165150
166151
167-func keyLastTxIdByUser (addr) = ("lastTxIdByUser_" + addr)
152+func keyBlocked () = "contractsBlocked"
168153
169154
170155 func keyOrderByLand (landAssetId) = ("landOrder_" + landAssetId)
156+
157+
158+func keyEsWarehouse () = "emergencyWarehouseProducts"
171159
172160
173161 func asString (v) = match v {
174162 case s: String =>
175163 s
176164 case _ =>
177165 throw("fail to cast into String")
178166 }
179167
180168
181-func asInt (v) = match v {
182- case n: Int =>
183- n
184- case _ =>
185- throw("fail to cast into Int")
186-}
187-
188-
189169 func asBoolean (v) = match v {
190170 case s: Boolean =>
191171 s
192172 case _ =>
193173 throw("fail to cast into Boolean")
194174 }
195175
176+
177+func numPiecesBySize (landSize) = match landSize {
178+ case _ =>
179+ if (("S" == $match0))
180+ then SSIZE
181+ else if (("M" == $match0))
182+ then MSIZE
183+ else if (("L" == $match0))
184+ then LSIZE
185+ else if (("XL" == $match0))
186+ then XLSIZE
187+ else if (("XXL" == $match0))
188+ then XXLSIZE
189+ else throw("Unknown land size")
190+}
191+
192+
193+func getRecipeMaterials (recipe) = {
194+ func addMat (ac,j) = (ac + parseIntValue(recipe[j]))
195+
196+ let $l = [0, 1, 2, 3, 4, 5]
197+ let $s = size($l)
198+ let $acc0 = 0
199+ func $f0_1 ($a,$i) = if (($i >= $s))
200+ then $a
201+ else addMat($a, $l[$i])
202+
203+ func $f0_2 ($a,$i) = if (($i >= $s))
204+ then $a
205+ else throw("List size exceeds 6")
206+
207+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
208+ }
209+
210+
211+let USDTPRIZEPART = 500000
196212
197213 func asListIntCompacted (val) = match val {
198214 case valAnyList: List[Any] =>
199215 if ((size(valAnyList) != NUMRES))
200216 then throw(("Array size is " + toString(size(valAnyList))))
201217 else {
202218 func conv (acc,item) = match item {
203219 case it: Int =>
204220 (acc :+ toString(it))
205221 case _ =>
206222 throw("List type is not Int")
207223 }
208224
209225 let r = {
210226 let $l = valAnyList
211227 let $s = size($l)
212228 let $acc0 = nil
213229 func $f0_1 ($a,$i) = if (($i >= $s))
214230 then $a
215231 else conv($a, $l[$i])
216232
217233 func $f0_2 ($a,$i) = if (($i >= $s))
218234 then $a
219235 else throw("List size exceeds 6")
220236
221237 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
222238 }
223239 makeString(r, "_")
224240 }
225241 case _ =>
226242 throw("fail to cast into List")
227243 }
228244
229245
230246 func asSplitResult (val) = match val {
231247 case t2: (List[Any], List[Any]) =>
232248 $Tuple2(asListIntCompacted(t2._1), asListIntCompacted(t2._2))
233249 case _ =>
234250 throw("fail to cast into (List, List)")
235251 }
236252
237253
238254 func walletInternal (userAddressOpt) = {
239255 let addr = addressFromString(userAddressOpt)
240256 let balance = if (isDefined(addr))
241257 then wavesBalance(value(addr))
242258 else BalanceDetails(0, 0, 0, 0)
243259 let usdtBalance = if (isDefined(addr))
244260 then assetBalance(value(addr), usdtAssetId)
245261 else 0
246262 let customName = valueOrElse(getString(stakingContract, keyAddressToCustomName(userAddressOpt)), userAddressOpt)
247263 let refBy = valueOrElse(getString(stakingContract, keyAddressRefBy(userAddressOpt)), "")
248264 let refs = valueOrElse(getString(stakingContract, keyAddressReferrals(userAddressOpt)), "")
249265 let lastTxId = valueOrElse(getString(stakingContract, keyLastTxIdByUser(userAddressOpt)), "")
250266 [("%s%s__customName__" + customName), ("%s%s__referredBy__" + refBy), ("%s%s__referrals__" + refs), ("%s%s__lastTxId__" + lastTxId), ("%s%s%d__wavesBalance__" + toString(balance.available)), ("%s%s%d__usdtBalance__" + toString(usdtBalance))]
251267 }
252268
253269
254270 func applyBonuses (landAssetId,pieces) = {
255271 let infraLevel = valueOrElse(getInteger(stakingContract, keyInfraLevelByAssetId(landAssetId)), 0)
256272 let artPieces = valueOrElse(getInteger(stakingContract, keyLandArtStatusByTypeAndAssetId(ARTPRESALE, landAssetId)), 0)
257273 let add6 = (infraLevel / 6)
258274 let add7 = (infraLevel / 7)
259275 $Tuple3(infraLevel, artPieces, ((DAILYRESBYPIECE + fraction(DAILYRESBYPIECE, ((infraLevel + add6) + (2 * add7)), 5)) + fraction(DAILYRESBYPIECE, artPieces, (pieces * 5))))
260276 }
261277
262278
263-func numPiecesBySize (landSize) = match landSize {
264- case _ =>
265- if (("S" == $match0))
266- then SSIZE
267- else if (("M" == $match0))
268- then MSIZE
269- else if (("L" == $match0))
270- then LSIZE
271- else if (("XL" == $match0))
272- then XLSIZE
273- else if (("XXL" == $match0))
274- then XXLSIZE
275- else throw("Unknown land size")
276-}
277-
278-
279279 func getWarehouseTotalVolume (volPrefix) = {
280280 let parts = split(volPrefix, "_")
281281 ((WHMULTIPLIER * (parseIntValue(parts[1]) + 1)) * parseIntValue(parts[0]))
282282 }
283283
284284
285-func getWarehouseOccupiedVol (currentWh) = {
286- let goods = currentWh[whIdxProd]
287- func sumResMat (acc,item) = (acc + parseIntValue(item))
288-
289- func sumProd (acc,item) = {
290- let idx = acc._1
291- let pkgSize = productPackages[idx]
292- let pkgs = (((parseIntValue(item) + pkgSize) - 1) / pkgSize)
293- $Tuple2((idx + 1), (acc._2 + (pkgs * MULT8)))
294- }
295-
296- let whResVol = {
297- let $l = split(currentWh[whIdxRes], "_")
298- let $s = size($l)
299- let $acc0 = 0
300- func $f0_1 ($a,$i) = if (($i >= $s))
301- then $a
302- else sumResMat($a, $l[$i])
303-
304- func $f0_2 ($a,$i) = if (($i >= $s))
305- then $a
306- else throw("List size exceeds 6")
307-
308- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
309- }
310- let whMatVol = {
311- let $l = split(currentWh[whIdxMat], "_")
312- let $s = size($l)
313- let $acc0 = 0
314- func $f1_1 ($a,$i) = if (($i >= $s))
315- then $a
316- else sumResMat($a, $l[$i])
317-
318- func $f1_2 ($a,$i) = if (($i >= $s))
319- then $a
320- else throw("List size exceeds 6")
321-
322- $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
323- }
324- let whGoodsVol = if ((goods == ""))
325- then 0
326- else ( let $l = split_4C(goods, "_")
327- let $s = size($l)
328- let $acc0 = $Tuple2(0, 0)
329- func $f2_1 ($a,$i) = if (($i >= $s))
330- then $a
331- else sumProd($a, $l[$i])
332-
333- func $f2_2 ($a,$i) = if (($i >= $s))
334- then $a
335- else throw("List size exceeds 50")
336-
337- $f2_2($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($f2_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50))._2
338- ((whResVol + whMatVol) + whGoodsVol)
339- }
340-
341-
342285 func getWarehouse (whKey,landIndex,infraLevel) = {
343286 let volPrefix = ((toString(landIndex) + "_") + toString(infraLevel))
344- let whTotal = getWarehouseTotalVolume(volPrefix)
345- let whStr = valueOrElse(getString(stakingContract, whKey), (volPrefix + ":0_0_0_0_0_0:0_0_0_0_0_0::0"))
346- let wh = split(whStr, ":")
347- let whOccupied = getWarehouseOccupiedVol(wh)
348- let whLoft = if ((5 > size(wh)))
349- then makeString(["0", toString(whOccupied), toString((whTotal - whOccupied)), toString(whTotal)], "_")
350- else {
351- let loft = split(wh[whIdxLOFT], "_")
352- let whLocked = parseIntValue(loft[volLocked])
353- let occ = if ((size(loft) > 1))
354- then parseIntValue(loft[volOccupied])
355- else whOccupied
356- makeString([toString(whLocked), toString(occ), toString(((whTotal - whLocked) - occ)), toString(whTotal)], "_")
357- }
358-[wh[whIdxLevels], if ((size(split(wh[whIdxRes], "_")) == NUMRES))
359- then wh[whIdxRes]
360- else "0_0_0_0_0_0", if ((size(split(wh[whIdxMat], "_")) == NUMRES))
361- then wh[whIdxMat]
362- else "0_0_0_0_0_0", wh[whIdxProd], whLoft]
287+ let totS = toString(getWarehouseTotalVolume(volPrefix))
288+ let whStr = valueOrElse(getString(stakingContract, whKey), ((((volPrefix + ":0_0_0_0_0_0:0_0_0_0_0_0::0_0_") + totS) + "_") + totS))
289+ split(whStr, ":")
363290 }
364291
365292
366293 func duckInfoTuple (duckAssetId) = $Tuple5(valueOrElse(getInteger(stakingContract, keyStakedTimeByAssetId(duckAssetId)), -1), value(assetInfo(fromBase58String(duckAssetId))).name, valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), ""), valueOrElse(getInteger(stakingContract, keyDuckHealth(duckAssetId)), -1), asString(invoke(stakingContract, "getBackpackREADONLY", [duckAssetId], nil)))
367294
368295
369296 func duckInfoArray (duckAssetId,owner,duckInf) = {
370297 let customName = valueOrElse(getString(stakingContract, keyDuckAssetIdToCustomName(duckAssetId)), duckInf._2)
371298 [("%s%s__assetId__" + duckAssetId), ("%s%s__owner__" + owner), ("%s%s__customName__" + customName), ("%s%d__stakedTime__" + toString(duckInf._1)), ("%s%s__name__" + duckInf._2), ("%s%s__location__" + duckInf._3), ("%s%d__health__" + toString(duckInf._4)), ("%s%s__backPack__" + duckInf._5)]
372299 }
373300
374301
375302 func landInfoArray (landAssetId,owner,stakedTime) = if ((landAssetId == ""))
376303 then throw("landAssetId is required")
377304 else {
378305 let a = value(assetInfo(fromBase58String(landAssetId)))
379306 let d = split(a.description, "_")
380307 let landNum = if ((a.quantity > 0))
381308 then d[recLandNum]
382309 else ("-" + d[recLandNum])
383310 let pieces = numPiecesBySize(d[recLandSize])
384311 let productivity = applyBonuses(landAssetId, pieces)
385312 let deltaTime = (lastBlock.timestamp - stakedTime)
386313 let availRes = if ((stakedTime > 0))
387314 then fraction(deltaTime, (productivity._3 * pieces), DAYMILLIS)
388315 else 0
389316 let needMat = fraction(InfraUpgradeCostS, (pieces * (productivity._1 + 1)), SSIZE)
390317 let globalAndLocal = if ((stakedTime > 0))
391318 then asSplitResult(invoke(stakingContract, "splitByGlobalAndLocalWeightsREADONLY", [needMat, availRes, d[recTerrains]], nil))
392319 else $Tuple2(asListIntCompacted(invoke(stakingContract, "splitByGlobalWeightsREADONLY", [needMat], nil)), "")
393320 let customName = valueOrElse(getString(stakingContract, keyLandAssetIdToCustomName(landAssetId)), ((d[recContinent] + "-") + d[recLandNum]))
394321 [("%s%s__assetId__" + landAssetId), ("%s%s__owner__" + owner), ("%s%s__customName__" + customName), ("%s%d__stakedTime__" + toString(stakedTime)), ("%s%s__description__" + makeString([landNum, d[recLandSize], d[recTerrains], d[recContinent]], "_")), ("%s%d__infraLevel__" + toString(productivity._1)), ("%s%s__availResByType__" + globalAndLocal._2), ("%s%d__availResTotal__" + toString(availRes)), ("%s%s__needMaterial__" + globalAndLocal._1), makeString(["%s%s", "landArtefacts", ("PRESALE:" + toString(productivity._2))], SEP), ("%s%s__warehouse__" + makeString(getWarehouse(keyWarehouseByLand(landAssetId), (pieces / SSIZE), productivity._1), ":")), ("%s%s__landOrder__" + valueOrElse(getString(economyContract, keyOrderByLand(landAssetId)), "0@0_0@0_0@0_0@0_0@0_0@0:0@0_0@0_0@0_0@0_0@0_0@0:"))]
395322 }
396323
397324
398325 func landOrderInfoArray (landAssetId,owner) = if ((landAssetId == ""))
399326 then throw("landAssetId is required")
400327 else {
401328 let a = value(assetInfo(fromBase58String(landAssetId)))
402329 let d = split(a.description, "_")
403330 let pieces = numPiecesBySize(d[recLandSize])
404331 let productivity = applyBonuses(landAssetId, pieces)
405332 [("%s%s__assetId__" + landAssetId), ("%s%s__owner__" + owner), ("%s%s__warehouse__" + makeString(getWarehouse(keyWarehouseByLand(landAssetId), (pieces / SSIZE), productivity._1), ":")), ("%s%s__landOrder__" + valueOrElse(getString(economyContract, keyOrderByLand(landAssetId)), "0@0_0@0_0@0_0@0_0@0_0@0:0@0_0@0_0@0_0@0_0@0_0@0:"))]
406333 }
407334
408335
409336 @Callable(i)
410-func constructorV1 (stakingContract,economyContract,governanceContract) = if ((i.caller != this))
337+func constructorV1 (contracts) = if ((i.caller != this))
411338 then throw("permissions denied")
412- else [StringEntry(keyRestCfg(), makeString(["%s%s%s", stakingContract, economyContract, governanceContract], SEP))]
339+ else {
340+ func descriptor (acc,ignoredItem) = (acc + "%s")
341+
342+ let descr = {
343+ let $l = contracts
344+ let $s = size($l)
345+ let $acc0 = ""
346+ func $f0_1 ($a,$i) = if (($i >= $s))
347+ then $a
348+ else descriptor($a, $l[$i])
349+
350+ func $f0_2 ($a,$i) = if (($i >= $s))
351+ then $a
352+ else throw("List size exceeds 10")
353+
354+ $f0_2($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)
355+ }
356+[StringEntry(keyRestCfg(), makeString(descr :: contracts, SEP)), StringEntry(keyRestAddress(), toString(this))]
357+ }
413358
414359
415360
416361 @Callable(i)
417362 func walletInfoREADONLY (userAddressOpt) = $Tuple2(nil, walletInternal(userAddressOpt))
418363
419364
420365
421366 @Callable(i)
422367 func duckByOwnerInfoREADONLY (userAddress) = {
423368 let stakedDuck = getString(stakingContract, keyStakedDuckByOwner(userAddress))
424369 $Tuple2(nil, if (if (isDefined(addressFromString(userAddress)))
425370 then isDefined(stakedDuck)
426371 else false)
427372 then {
428373 let duckAssetId = value(stakedDuck)
429374 duckInfoArray(duckAssetId, userAddress, duckInfoTuple(duckAssetId))
430375 }
431376 else duckInfoArray("", userAddress, $Tuple5(-1, "", "", -1, "")))
432377 }
433378
434379
435380
436381 @Callable(i)
437382 func duckByAssetIdInfoREADONLY (duckAssetId) = {
438383 let owner = getString(stakingContract, keyDuckIdToOwner(duckAssetId))
439384 let duckInf = duckInfoTuple(duckAssetId)
440385 $Tuple2(nil, duckInfoArray(duckAssetId, if (isDefined(owner))
441386 then value(owner)
442387 else "", duckInfoTuple(duckAssetId)))
443388 }
444389
445390
446391
447392 @Callable(i)
448393 func landByAssetIdInfoREADONLY (landAssetId) = if ((landAssetId == ""))
449394 then throw("landAssetId is required")
450395 else {
451396 let stakedTime = valueOrElse(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)), -1)
452397 let owner = if ((stakedTime > 0))
453398 then value(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)))
454399 else ""
455400 $Tuple2(nil, landInfoArray(landAssetId, owner, stakedTime))
456401 }
457402
458403
459404
460405 @Callable(i)
461406 func stakedLandsByOwnerInfoREADONLY (landOwnerAddress) = if ((landOwnerAddress == ""))
462407 then throw("landOwnerAddress is required")
463408 else {
464409 let landsStr = getString(stakingContract, keyStakedLandsByOwner(landOwnerAddress))
465410 let lands = if (isDefined(landsStr))
466411 then split_51C(value(landsStr), "_")
467412 else nil
468413 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
469414 then throw("landAssetId is required")
470415 else {
471416 let stakedTime = valueOrElse(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)), -1)
472417 (acc :+ landInfoArray(landAssetId, landOwnerAddress, stakedTime))
473418 }
474419
475420 let r = {
476421 let $l = lands
477422 let $s = size($l)
478423 let $acc0 = nil
479424 func $f0_1 ($a,$i) = if (($i >= $s))
480425 then $a
481426 else oneLand($a, $l[$i])
482427
483428 func $f0_2 ($a,$i) = if (($i >= $s))
484429 then $a
485- else throw("List size exceeds 40")
430+ else throw("List size exceeds 100")
486431
487- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40)
432+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
488433 }
489434 $Tuple2(nil, r)
490435 }
491436
492437
493438
494439 @Callable(i)
495440 func landsByIdsInfoREADONLY (landAssetIds) = {
496441 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
497442 then throw("landAssetId is required")
498443 else {
499444 let stakedTime = valueOrElse(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)), -1)
500445 let owner = if ((stakedTime > 0))
501446 then value(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)))
502447 else ""
503448 (acc :+ landInfoArray(landAssetId, owner, stakedTime))
504449 }
505450
506451 let r = {
507452 let $l = landAssetIds
508453 let $s = size($l)
509454 let $acc0 = nil
510455 func $f0_1 ($a,$i) = if (($i >= $s))
511456 then $a
512457 else oneLand($a, $l[$i])
513458
514459 func $f0_2 ($a,$i) = if (($i >= $s))
515460 then $a
516- else throw("List size exceeds 40")
461+ else throw("List size exceeds 100")
517462
518- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40)
463+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50), 51), 52), 53), 54), 55), 56), 57), 58), 59), 60), 61), 62), 63), 64), 65), 66), 67), 68), 69), 70), 71), 72), 73), 74), 75), 76), 77), 78), 79), 80), 81), 82), 83), 84), 85), 86), 87), 88), 89), 90), 91), 92), 93), 94), 95), 96), 97), 98), 99), 100)
519464 }
520465 $Tuple2(nil, r)
521466 }
522467
523468
524469
525470 @Callable(i)
526471 func warehouseOrderByAssetIdInfoREADONLY (landAssetId) = if ((landAssetId == ""))
527472 then throw("landAssetId is required")
528473 else {
529474 let stakedTime = valueOrElse(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)), -1)
530475 let owner = if ((stakedTime > 0))
531476 then value(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)))
532477 else ""
533478 $Tuple2(nil, landOrderInfoArray(landAssetId, owner))
534479 }
535480
536481
537482
538483 @Callable(i)
539484 func ordersByLandIdsInfoREADONLY (landAssetIds) = {
540485 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
541486 then throw("landAssetId is required")
542487 else {
543488 let stakedTime = valueOrElse(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId)), -1)
544489 let owner = if ((stakedTime > 0))
545490 then value(getString(stakingContract, keyLandAssetIdToOwner(landAssetId)))
546491 else ""
547492 (acc :+ landOrderInfoArray(landAssetId, owner))
548493 }
549494
550495 let r = {
551496 let $l = landAssetIds
552497 let $s = size($l)
553498 let $acc0 = nil
554499 func $f0_1 ($a,$i) = if (($i >= $s))
555500 then $a
556501 else oneLand($a, $l[$i])
557502
558503 func $f0_2 ($a,$i) = if (($i >= $s))
559504 then $a
560505 else throw("List size exceeds 40")
561506
562507 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40)
563508 }
564509 $Tuple2(nil, r)
565510 }
566511
567512
568513
569514 @Callable(i)
570515 func cancelWarehouseOrders (landAssetIds) = if ((i.caller != this))
571516 then throw("permission denied")
572517 else {
573518 let blocked = getBoolean(stakingContract, keyBlocked())
574519 if (if (!(isDefined(blocked)))
575520 then true
576521 else (value(blocked) == false))
577522 then throw("Contracts should be blocked before canceling orders")
578523 else {
579524 func oneLand (a,landAssetId) = if ((landAssetId == ""))
580525 then throw("landAssetId is required")
581526 else {
582527 let c = asBoolean(invoke(economyContract, "setWarehouseOrder", ["0@0_0@0_0@0_0@0_0@0_0@0:0@0_0@0_0@0_0@0_0@0_0@0:", landAssetId], nil))
583528 if (if (a)
584529 then true
585530 else c)
586531 then !(if (a)
587532 then c
588533 else false)
589534 else false
590535 }
591536
592537 let r = {
593538 let $l = landAssetIds
594539 let $s = size($l)
595540 let $acc0 = false
596541 func $f0_1 ($a,$i) = if (($i >= $s))
597542 then $a
598543 else oneLand($a, $l[$i])
599544
600545 func $f0_2 ($a,$i) = if (($i >= $s))
601546 then $a
602547 else throw("List size exceeds 30")
603548
604549 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30)
605550 }
606551 $Tuple2(nil, r)
607552 }
608553 }
609554
610555
611556
612557 @Callable(i)
613558 func fixWarehouseFormats (landAssetIds) = if ((i.caller != this))
614559 then throw("permission denied")
615560 else {
616561 func oneLand (acc,landAssetId) = if ((landAssetId == ""))
617562 then throw("landAssetId is required")
618- else if (isDefined(getInteger(stakingContract, keyStakedTimeByAssetId(landAssetId))))
619- then (acc + size(asString(invoke(stakingContract, "fixWarehouseFormat", [landAssetId], nil))))
620- else acc
563+ else (acc + size(asString(invoke(stakingContract, "fixWarehouseFormat", [landAssetId], nil))))
621564
622565 let r = {
623566 let $l = landAssetIds
624567 let $s = size($l)
625568 let $acc0 = 0
626569 func $f0_1 ($a,$i) = if (($i >= $s))
627570 then $a
628571 else oneLand($a, $l[$i])
629572
630573 func $f0_2 ($a,$i) = if (($i >= $s))
631574 then $a
632575 else throw("List size exceeds 25")
633576
634577 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25)
635578 }
636579 $Tuple2(nil, r)
637580 }
638581
639582
640583
641584 @Callable(i)
642585 func sendUsdtPrize (userAddress) = if ((i.caller != stakingContract))
643586 then throw("permission denied")
644587 else {
645588 let amt = fraction(assetBalance(this, usdtAssetId), USDTPRIZEPART, MULT6)
646589 $Tuple2([ScriptTransfer(addressFromStringValue(userAddress), amt, usdtAssetId)], amt)
647590 }
648591
649592
593+
594+@Callable(i)
595+func getEmergencyServiceDataREADONLY () = {
596+ let existStr = getString(economyContract, keyEsWarehouse())
597+ let existAmounts = if (isDefined(existStr))
598+ then split(value(existStr), "_")
599+ else nil
600+ func singleProd (acc,recipeStr) = {
601+ let n = acc._2
602+ let recipe = split(recipeStr, "_")
603+ let packSize = parseIntValue(recipe[recipeIdxPacksize])
604+ let maxAmount = if ((n == 0))
605+ then (ESMAXPACKAGES * packSize)
606+ else 0
607+ let existAmount = if ((size(existAmounts) > n))
608+ then parseIntValue(existAmounts[n])
609+ else 0
610+ let totalMat = getRecipeMaterials(recipe)
611+ let buyPrice = fraction((totalMat * ESBUYCOEF), RESOURCEPRICEMIN, (10 * packSize))
612+ let sellPrice = fraction((totalMat * ESSELLCOEF), RESOURCEPRICEMIN, (10 * packSize))
613+ let y = makeString([toString(maxAmount), toString(existAmount), toString(buyPrice), toString(sellPrice)], "_")
614+ $Tuple2((acc._1 :+ y), (n + 1))
615+ }
616+
617+ let s = makeString_2C(( let $l = productionMatrix
618+ let $s = size($l)
619+ let $acc0 = $Tuple2(nil, 0)
620+ func $f0_1 ($a,$i) = if (($i >= $s))
621+ then $a
622+ else singleProd($a, $l[$i])
623+
624+ func $f0_2 ($a,$i) = if (($i >= $s))
625+ then $a
626+ else throw("List size exceeds 50")
627+
628+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20), 21), 22), 23), 24), 25), 26), 27), 28), 29), 30), 31), 32), 33), 34), 35), 36), 37), 38), 39), 40), 41), 42), 43), 44), 45), 46), 47), 48), 49), 50))._1, ":")
629+ let result = ("%s%s__emergencyServiceData__" + s)
630+ $Tuple2(nil, result)
631+ }
632+
633+

github/deemru/w8io/6500d08 
131.30 ms