tx · 9jUFdyBNDLwr3Gw1evnj8T7NsMLTWo5ALvFVF977EQyw

3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep:  -0.01100000 Waves

2023.02.14 00:06 [2448368] smart account 3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep > SELF 0.00000000 Waves

{ "type": 13, "id": "9jUFdyBNDLwr3Gw1evnj8T7NsMLTWo5ALvFVF977EQyw", "fee": 1100000, "feeAssetId": null, "timestamp": 1676322457708, "version": 2, "chainId": 84, "sender": "3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep", "senderPublicKey": "7v5L7QkXxfkirALdyqmox38QCsa9jtfAtgUfHTh34eWq", "proofs": [ "5nqs8QT65K8TNnizdwnQ8fUaqtaWJ23yzriq53grNWZaNwGfAgGYMKKte6vbLc7txKGwwpsFnRiNaofFR9Mg9nuy" ], "script": "base64:BgIVCAISBAoCERESBAoCERESBQoDAQEBJwAFTVVMVDYAwIQ9AAVNVUxUOACAwtcvAAZNVUxUMTAAgMivoCUABWNoYWluCQDJAQIJAMoBAggFBHRoaXMFYnl0ZXMAAQABAAt1c2RuQXNzZXRJZAQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAEgtiYpwwT1zlORpA5LdSQvZIxRsfrfr1QpvUjSHSqyqtEDCQAAAgEBVAUHJG1hdGNoMAEg93bq9/eDymXbbhPuAjvPWCmVqcHRjfJL2mzYHWKAyN4JAAIBAg1Vbmtub3duIGNoYWluAA9zdGFraW5nQ29udHJhY3QJARFAZXh0ck5hdGl2ZSgxMDYyKQEEByRtYXRjaDAFBWNoYWluAwkAAAIBAVcFByRtYXRjaDACIzNQTG5jWHRTMVU4M0Q2Y1FiRkQzSDhyQkhQTGd6eFNGS1oxAwkAAAIBAVQFByRtYXRjaDACIzNOREN5Qkc1cTg1SnVhUmlpZ1VlRXRhaW55akNRVDNYcFptCQACAQINVW5rbm93biBjaGFpbgAPREVGQVVMVExPQ0FUSU9OAg9BZnJpY2FfRl9BZnJpY2EABk5VTVJFUwAGABNGQUNUT1JZTUFYV0FSRUhPVVNFAIDIr6AlABBSRVNPVVJDRVBSSUNFTUlOANXWCQAKTUlOUEFZTUVOVACQTgAOU0VMTE1VTFRJUExJRVIAyAEADUJVWU1VTFRJUExJRVIArAIACHJlc1R5cGVzCQDMCAICA09pbAkAzAgCAgNPcmUJAMwIAgIEV29vZAkAzAgCAgRTYW5kCQDMCAICBENsYXkJAMwIAgIHT3JnYW5pYwUDbmlsAAhtYXRUeXBlcwkAzAgCAgRGdWVsCQDMCAICBU1ldGFsCQDMCAICBVBsYW5rCQDMCAICBUdsYXNzCQDMCAICB1BsYXN0aWMJAMwIAgIHUHJvdGVpbgUDbmlsAApjb250aW5lbnRzCQDMCAICCEFtZXJpY2FzCQDMCAICBkV1cm9wZQkAzAgCAgRBc2lhCQDMCAICBkFmcmljYQkAzAgCAgdPY2VhbmlhBQNuaWwAEHByb2R1Y3Rpb25NYXRyaXgJAMwIAgIQMV8xXzFfMl8yXzVfMV8xMAkAzAgCAhEyXzVfNV8yXzdfNV8yXzEwMAkAzAgCAhAxXzFfMV8yXzJfNV8xXzEwCQDMCAICETlfOV8xXzVfNV8xXzVfMTAwCQDMCAICETFfNV8xXzVfNV8xXzFfMTAwBQNuaWwAD2NvbnRJZHhBbWVyaWNhcwAAAA1jb250SWR4RXVyb3BlAAEAC2NvbnRJZHhBc2lhAAIADWNvbnRJZHhBZnJpY2EAAwAOY29udElkeE9jZWFuaWEABAEea2V5RmFjdG9yeVdhcmVob3VzZUJ5SWRBbmRUeXBlAglmYWN0b3J5SWQHcmVzVHlwZQkArAICCQCsAgIJAKwCAgIbZmFjdG9yeVdoQnlDb250aW5lbnRBbmRSZXNfBQlmYWN0b3J5SWQCAV8JAKQDAQUHcmVzVHlwZQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCW93bmVyQWRkcgkArAICAhJzdGFrZWREdWNrQnlPd25lcl8FCW93bmVyQWRkcgERa2V5QmFja3BhY2tCeUR1Y2sBC2R1Y2tBc3NldElkCQCsAgICCWJhY2tQYWNrXwULZHVja0Fzc2V0SWQBD2tleUR1Y2tMb2NhdGlvbgELZHVja0Fzc2V0SWQJAKwCAgINZHVja0xvY2F0aW9uXwULZHVja0Fzc2V0SWQBCmtleUJsb2NrZWQAAhBjb250cmFjdHNCbG9ja2VkAA9sb2NJZHhDb250aW5lbnQAAAAKbG9jSWR4VHlwZQABAAhsb2NJZHhJZAACAApicElkeExldmVsAAAACGJwSWR4UmVzAAEACGJwSWR4TWF0AAIACWJwSWR4UHJvZAADAQhhc1N0cmluZwEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAFAXMJAAIBAhhmYWlsIHRvIGNhc3QgaW50byBTdHJpbmcBDHNlbGxJbnRlcm5hbAQFbG9jSWQHcmVzVHlwZQZhbW91bnQIbWluUHJpY2UEBXdoS2V5CQEea2V5RmFjdG9yeVdhcmVob3VzZUJ5SWRBbmRUeXBlAgUFbG9jSWQFB3Jlc1R5cGUEAncwCQELdmFsdWVPckVsc2UCCQCfCAEFBXdoS2V5AAAEAnIwAwkAZgIFAncwBRNGQUNUT1JZTUFYV0FSRUhPVVNFAAADCQBmAgkAZAIFAncwBQZhbW91bnQFE0ZBQ1RPUllNQVhXQVJFSE9VU0UJAGUCBRNGQUNUT1JZTUFYV0FSRUhPVVNFBQJ3MAUGYW1vdW50BAx1c2RuUmVjZWl2ZWQJAGQCCQBrAwUCcjAJAGUCCQBoAgUOU0VMTE1VTFRJUExJRVIFEFJFU09VUkNFUFJJQ0VNSU4JAGsDCQBkAgkAaAIAZAUCdzAJAGgCADIFAnIwBRBSRVNPVVJDRVBSSUNFTUlOBRNGQUNUT1JZTUFYV0FSRUhPVVNFBQZNVUxUMTAJAGsDCQBlAgUGYW1vdW50BQJyMAUQUkVTT1VSQ0VQUklDRU1JTgUFTVVMVDgEBW1pbjk5CQBlAgUIbWluUHJpY2UJAGkCBQhtaW5QcmljZQBkAwkAZgIJAGgCBQVtaW45OQUGYW1vdW50CQBoAgUMdXNkblJlY2VpdmVkBQVNVUxUOAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIPQWN0dWFsIHByaWNlID0gCQCkAwEFDHVzZG5SZWNlaXZlZAIDIC8gCQCkAwEFBmFtb3VudAIOIDwgbWluUHJpY2UgPSAJAKQDAQUIbWluUHJpY2UCAywgKAUFbG9jSWQCAiwgCQCRAwIFCHJlc1R5cGVzBQdyZXNUeXBlAgEpCQCUCgIJAQxJbnRlZ2VyRW50cnkCBQV3aEtleQkAZAIFAncwBQZhbW91bnQFDHVzZG5SZWNlaXZlZAELYnV5SW50ZXJuYWwEBWxvY0lkB21hdFR5cGUGYW1vdW50CG1heFByaWNlBAV3aEtleQkBHmtleUZhY3RvcnlXYXJlaG91c2VCeUlkQW5kVHlwZQIFBWxvY0lkBQdtYXRUeXBlBAJ3MAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQV3aEtleQAABAJtMQMJAGYCBQJ3MAUTRkFDVE9SWU1BWFdBUkVIT1VTRQkAlwMBCQDMCAIFBmFtb3VudAkAzAgCCQBlAgUCdzAFE0ZBQ1RPUllNQVhXQVJFSE9VU0UFA25pbAAABAJtMAkAlwMBCQDMCAIFAncwCQDMCAIJAGUCBQZhbW91bnQFAm0xBQNuaWwEAW0JAGQCBQJtMAUCbTEECXVzZG5TcGVudAkAZAIJAGsDBQJtMAkAZQIJAGgCBQ1CVVlNVUxUSVBMSUVSBRBSRVNPVVJDRVBSSUNFTUlOCQBrAwkAZQIJAGgCAGQFAncwCQBoAgAyBQJtMAUQUkVTT1VSQ0VQUklDRU1JTgUTRkFDVE9SWU1BWFdBUkVIT1VTRQUGTVVMVDEwCQBrAwUCbTEJAGgCAAIFEFJFU09VUkNFUFJJQ0VNSU4FBU1VTFQ4BAZtYXgxMDEJAGQCBQhtYXhQcmljZQkAaQIFCG1heFByaWNlAGQDCQBmAgkAaAIFCXVzZG5TcGVudAUFTVVMVDgJAGgCBQZtYXgxMDEFAW0JAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICD0FjdHVhbCBwcmljZSA9IAkApAMBBQl1c2RuU3BlbnQCAyAvIAkApAMBBQFtAg4gPiBtYXhQcmljZSA9IAkApAMBBQhtYXhQcmljZQIDLCAoBQVsb2NJZAICLCAJAJEDAgUIbWF0VHlwZXMFB21hdFR5cGUCASkJAJUKAwkBDEludGVnZXJFbnRyeQIFBXdoS2V5CQBlAgUCdzAFAW0FCXVzZG5TcGVudAUBbQELZ2V0QmFja3BhY2sBBWJwS2V5BAFwCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0BQVicEtleQIaMDowXzBfMF8wXzBfMDowXzBfMF8wXzBfMDoCAToJAMwIAgkApAMBCQELdmFsdWVPckVsc2UCCQC2CQEJAJEDAgUBcAUKYnBJZHhMZXZlbAAACQDMCAIDCQAAAgkAkAMBCQC1CQIJAJEDAgUBcAUIYnBJZHhSZXMCAV8FBk5VTVJFUwkAkQMCBQFwBQhicElkeFJlcwILMF8wXzBfMF8wXzAJAMwIAgMJAAACCQCQAwEJALUJAgkAkQMCBQFwBQhicElkeE1hdAIBXwUGTlVNUkVTCQCRAwIFAXAFCGJwSWR4TWF0AgswXzBfMF8wXzBfMAkAzAgCCQCRAwIFAXAFCWJwSWR4UHJvZAUDbmlsAQxjaGVja0Jsb2NrZWQAAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQ9zdGFraW5nQ29udHJhY3QJAQprZXlCbG9ja2VkAAcJAAIBAh9Db250cmFjdHMgYXJlIHVuZGVyIG1haW50ZW5hbmNlBQR1bml0AwFpAQ1zZWxsUmVzb3VyY2VzAgdhbW91bnRzCW1pblByaWNlcwQHYmxvY2tlZAkBDGNoZWNrQmxvY2tlZAADCQAAAgUHYmxvY2tlZAUHYmxvY2tlZAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIqc2VsbFJlc291cmNlcyBkb2Vzbid0IHJlcXVpcmUgYW55IHBheW1lbnRzBAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8DCQECIT0CCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlAgFGCQACAQkArAICAi1EdWNrIGxvY2F0aW9uIHR5cGUgc2hvdWxkIGJlIEZhY3RvcnksIGJ1dCBpcyAJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUEBWxvY0lkCQCRAwIFC2N1ckxvY2F0aW9uBQhsb2NJZHhJZAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdyZXNMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzAgFfCgEFYWRkZXICA2FjYwFqAwkAZgIJAJEDAgUHYW1vdW50cwUBagkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWoJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJWW91IGhhdmUgCQCRAwIFB3Jlc0xpc3QFAWoCBCBvZiAJAJEDAgUIcmVzVHlwZXMFAWoCFCwgYnV0IHRyaWVkIHRvIHNlbGwgCQCkAwEJAJEDAgUHYW1vdW50cwUBagMJAGYCAAAJAJEDAgUHYW1vdW50cwUBagkAAgEJAKwCAgkArAICCQCsAgICJVlvdSB0cmllZCB0byBzZWxsIG5lZ2F0aXZlIGFtb3VudCBvZiAJAJEDAgUIcmVzVHlwZXMFAWoCAjogCQCkAwEJAJEDAgUHYW1vdW50cwUBagMJAGYCCQCRAwIFB2Ftb3VudHMFAWoAAAQBYgkBDHNlbGxJbnRlcm5hbAQFBWxvY0lkBQFqCQCRAwIFB2Ftb3VudHMFAWoJAJEDAgUJbWluUHJpY2VzBQFqCQCVCgMJAM0IAggFA2FjYwJfMQgFAWICXzEJAM0IAggFA2FjYwJfMgkApAMBCQBlAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWoJAJEDAgUHYW1vdW50cwUBagkAZAIIBQNhY2MCXzMIBQFiAl8yCQCVCgMIBQNhY2MCXzEJAM0IAggFA2FjYwJfMgkAkQMCBQdyZXNMaXN0BQFqCAUDYWNjAl8zBAZtZXJnZWQKAAIkbAkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQVhZGRlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgQHbmV3UGFjawkAuQkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAuQkCCAUGbWVyZ2VkAl8yAgFfCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0CQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6BAZyZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQduZXdQYWNrBQNuaWwFA25pbAkAlAoCCQDNCAIIBQZtZXJnZWQCXzEJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcggFBm1lcmdlZAJfMwULdXNkbkFzc2V0SWQFBnJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQxidXlNYXRlcmlhbHMCB2Ftb3VudHMJbWF4UHJpY2VzBAdibG9ja2VkCQEMY2hlY2tCbG9ja2VkAAMJAAACBQdibG9ja2VkBQdibG9ja2VkBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAQKcG10QXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUDcG10B2Fzc2V0SWQCHldBVkVTIGNhbid0IGJlIHVzZWQgYXMgcGF5bWVudAMJAQIhPQIFCnBtdEFzc2V0SWQFC3VzZG5Bc3NldElkCQACAQITVVNETiBwYXltZW50cyBvbmx5IQQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBRgkAAgEJAKwCAgItRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBGYWN0b3J5LCBidXQgaXMgCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlBAVsb2NJZAkAkQMCBQtjdXJMb2NhdGlvbgUIbG9jSWR4SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHbWF0TGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwoBCG1VcGRhdGVyAgNhY2MBagMJAGYCAAAJAJEDAgUHYW1vdW50cwUBagkAAgEJAKwCAgkArAICCQCsAgICJFlvdSB0cmllZCB0byBidXkgbmVnYXRpdmUgYW1vdW50IG9mIAkAkQMCBQhtYXRUeXBlcwUBagICOiAJAKQDAQkAkQMCBQdhbW91bnRzBQFqAwkAZgIJAJEDAgUHYW1vdW50cwUBagAABAFiCQELYnV5SW50ZXJuYWwEBQVsb2NJZAUBagkAkQMCBQdhbW91bnRzBQFqCQCRAwIFCW1heFByaWNlcwUBagkAlQoDCQDNCAIIBQNhY2MCXzEIBQFiAl8xCQDNCAIIBQNhY2MCXzIJAKQDAQkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdtYXRMaXN0BQFqCAUBYgJfMwkAZAIIBQNhY2MCXzMIBQFiAl8yCQCVCgMIBQNhY2MCXzEJAM0IAggFA2FjYwJfMgkAkQMCBQdtYXRMaXN0BQFqCAUDYWNjAl8zBAZtZXJnZWQKAAIkbAkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhtVXBkYXRlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgMJAGYCCAUGbWVyZ2VkAl8zBQNhbXQJAAIBCQCsAgIJAKwCAgkArAICAh9JbnN1ZmZpY2llbnQgcGF5bWVudCEgQXR0YWNoZWQ9CQCkAwEFA2FtdAILLCByZXF1aXJlZD0JAKQDAQgFBm1lcmdlZAJfMwQHbmV3UGFjawkAuQkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMJAMwIAgkAuQkCCAUGbWVyZ2VkAl8yAgFfCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6BAZyZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQduZXdQYWNrBQNuaWwFA25pbAQEcmVzdAMJAGYCCQBlAgUDYW10CAUGbWVyZ2VkAl8zAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAgUDYW10CAUGbWVyZ2VkAl8zBQt1c2RuQXNzZXRJZAUDbmlsBQNuaWwJAJQKAgkAzggCCAUGbWVyZ2VkAl8xBQRyZXN0BQZyZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEIYnV5R29vZHMDCnByb2R1Y3RJZHgFbGV2ZWwIcXVhbnRpdHkEB2Jsb2NrZWQJAQxjaGVja0Jsb2NrZWQAAwkAAAIFB2Jsb2NrZWQFB2Jsb2NrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAAJAAIBAiVidXlHb29kcyBkb2Vzbid0IHJlcXVpcmUgYW55IHBheW1lbnRzAwkAZgIAAAUIcXVhbnRpdHkJAAIBAhtRdWFudGl0eSBzaG91bGQgYmUgcG9zaXRpdmUEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBTQkAAgEJAKwCAgIxRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBNYW51ZmFjdG9yeSwgYnV0IGlzIAkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQQEY29udAkAkQMCBQtjdXJMb2NhdGlvbgUPbG9jSWR4Q29udGluZW50BAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEB21hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8DAwkAZgIAAAUKcHJvZHVjdElkeAYJAGcCBQpwcm9kdWN0SWR4CQCQAwEFEHByb2R1Y3Rpb25NYXRyaXgJAAIBCQCsAgICFFVua25vd24gcHJvZHVjdCBpZHg9CQCkAwEFCnByb2R1Y3RJZHgEDnByb2R1Y3RDb250SWR4CQBqAgUKcHJvZHVjdElkeAkAkAMBBQpjb250aW5lbnRzAwkBAiE9AgkAkQMCBQpjb250aW5lbnRzBQ5wcm9kdWN0Q29udElkeAUEY29udAkAAgEJAKwCAgkArAICCQCsAgICHVRoaXMgcHJvZHVjdCBpcyBhdmFpbGFibGUgaW4gCQCRAwIFCmNvbnRpbmVudHMFDnByb2R1Y3RDb250SWR4AhEsIGJ1dCB5b3UgYXJlIGluIAUEY29udAQGcmVjaXBlCQC1CQIJAJEDAgUQcHJvZHVjdGlvbk1hdHJpeAUKcHJvZHVjdElkeAIBXwMJAQIhPQIJAJADAQUGcmVjaXBlCQBkAgUGTlVNUkVTAAIJAAIBCQCsAgICF0ZhdGFsOiB1bmtub3duIHJlY2lwZTogCQCRAwIFEHByb2R1Y3Rpb25NYXRyaXgFCnByb2R1Y3RJZHgECHByb2RMaXN0AwkAAAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAIABQNuaWwJALUJAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kAgFfCgEGZmlsbGVyAgNhY2MLaWdub3JlZEl0ZW0EAW4IBQNhY2MCXzIEAXgDCQBmAgkAkAMBBQhwcm9kTGlzdAUBbgkAtQkCCQCRAwIFCHByb2RMaXN0BQFuAgEsCQDMCAICATAJAMwIAgIBMAkAzAgCAgEwBQNuaWwEA3gxcwkAkQMCBQF4AAAEAngxCQENcGFy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", "height": 2448368, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: D26GYuHZLea2V5wvzLQHHFACmjgdoBGaT7YhmQkWRR9a Next: DE3bJA9TFCcmbVxpXUzsxK8TS2UgBG3wV1gc8ANGjBU1 Diff:
OldNewDifferences
4646 let matTypes = ["Fuel", "Metal", "Plank", "Glass", "Plastic", "Protein"]
4747
4848 let continents = ["Americas", "Europe", "Asia", "Africa", "Oceania"]
49+
50+let productionMatrix = ["1_1_1_2_2_5_1_10", "2_5_5_2_7_5_2_100", "1_1_1_2_2_5_1_10", "9_9_1_5_5_1_5_100", "1_5_1_5_5_1_1_100"]
51+
52+let contIdxAmericas = 0
53+
54+let contIdxEurope = 1
55+
56+let contIdxAsia = 2
57+
58+let contIdxAfrica = 3
59+
60+let contIdxOceania = 4
4961
5062 func keyFactoryWarehouseByIdAndType (factoryId,resType) = ((("factoryWhByContinentAndRes_" + factoryId) + "_") + toString(resType))
5163
246258 }
247259
248260
261+
262+@Callable(i)
263+func buyGoods (productIdx,level,quantity) = {
264+ let blocked = checkBlocked()
265+ if ((blocked == blocked))
266+ then if ((size(i.payments) != 0))
267+ then throw("buyGoods doesn't require any payments")
268+ else if ((0 > quantity))
269+ then throw("Quantity should be positive")
270+ else {
271+ let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
272+ let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
273+ if ((curLocation[locIdxType] != "M"))
274+ then throw(("Duck location type should be Manufactory, but is " + curLocation[locIdxType]))
275+ else {
276+ let cont = curLocation[locIdxContinent]
277+ let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
278+ let matList = split(currentPack[bpIdxMat], "_")
279+ if (if ((0 > productIdx))
280+ then true
281+ else (productIdx >= size(productionMatrix)))
282+ then throw(("Unknown product idx=" + toString(productIdx)))
283+ else {
284+ let productContIdx = (productIdx % size(continents))
285+ if ((continents[productContIdx] != cont))
286+ then throw(((("This product is available in " + continents[productContIdx]) + ", but you are in ") + cont))
287+ else {
288+ let recipe = split(productionMatrix[productIdx], "_")
289+ if ((size(recipe) != (NUMRES + 2)))
290+ then throw(("Fatal: unknown recipe: " + productionMatrix[productIdx]))
291+ else {
292+ let prodList = if ((currentPack[bpIdxProd] == ""))
293+ then nil
294+ else split(currentPack[bpIdxProd], "_")
295+ func filler (acc,ignoredItem) = {
296+ let n = acc._2
297+ let x = if ((size(prodList) > n))
298+ then split(prodList[n], ",")
299+ else ["0", "0", "0"]
300+ let x1s = x[0]
301+ let x1 = parseIntValue(x1s)
302+ let x2s = x[1]
303+ let x2 = parseIntValue(x2s)
304+ let x3s = x[2]
305+ let x3 = parseIntValue(x3s)
306+ let amount = (quantity * parseIntValue(recipe[7]))
307+ let y = if ((n == productIdx))
308+ then match level {
309+ case _ =>
310+ if ((1 == $match0))
311+ then ((((toString((x1 + amount)) + ",") + x2s) + ",") + x3s)
312+ else if ((2 == $match0))
313+ then ((((x1s + ",") + toString((x2 + amount))) + ",") + x3s)
314+ else if ((3 == $match0))
315+ then ((((x1s + ",") + x2s) + ",") + toString((x3 + amount)))
316+ else throw(("Product level should be 1..3, not " + toString(level)))
317+ }
318+ else ((((x1s + ",") + x2s) + ",") + x3s)
319+ $Tuple2((acc._1 :+ y), (n + 1))
320+ }
321+
322+ let bpProd = ( let $l = productionMatrix
323+ let $s = size($l)
324+ let $acc0 = $Tuple2(nil, 0)
325+ func $f0_1 ($a,$i) = if (($i >= $s))
326+ then $a
327+ else filler($a, $l[$i])
328+
329+ func $f0_2 ($a,$i) = if (($i >= $s))
330+ then $a
331+ else throw("List size exceeds 50")
332+
333+ $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
334+ func producer (acc,j) = {
335+ let needMat = (parseIntValue(recipe[j]) * quantity)
336+ let haveMat = parseIntValue(matList[j])
337+ if ((needMat > haveMat))
338+ then throw(((((((("You have " + matList[j]) + " of ") + matTypes[j]) + ", but recipe requires ") + toString(needMat)) + " for quantity ") + toString(quantity)))
339+ else if ((needMat > 0))
340+ then (acc :+ toString((haveMat - needMat)))
341+ else (acc :+ matList[j])
342+ }
343+
344+ let merged = {
345+ let $l = [0, 1, 2, 3, 4, 5]
346+ let $s = size($l)
347+ let $acc0 = nil
348+ func $f1_1 ($a,$i) = if (($i >= $s))
349+ then $a
350+ else producer($a, $l[$i])
351+
352+ func $f1_2 ($a,$i) = if (($i >= $s))
353+ then $a
354+ else throw("List size exceeds 6")
355+
356+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
357+ }
358+ let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged, "_"), makeString(bpProd, "_")], ":")
359+ let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
360+ $Tuple2(nil, result)
361+ }
362+ }
363+ }
364+ }
365+ }
366+ else throw("Strict value is not equal to itself.")
367+ }
368+
369+
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let MULT6 = 1000000
55
66 let MULT8 = 100000000
77
88 let MULT10 = 10000000000
99
1010 let chain = take(drop(this.bytes, 1), 1)
1111
1212 let usdnAssetId = match chain {
1313 case _ =>
1414 if ((base58'2W' == $match0))
1515 then base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
1616 else if ((base58'2T' == $match0))
1717 then base58'HezsdQuRDtzksAYUy97gfhKy7Z1NW2uXYSHA3bgqenNZ'
1818 else throw("Unknown chain")
1919 }
2020
2121 let stakingContract = addressFromStringValue(match chain {
2222 case _ =>
2323 if ((base58'2W' == $match0))
2424 then "3PLncXtS1U83D6cQbFD3H8rBHPLgzxSFKZ1"
2525 else if ((base58'2T' == $match0))
2626 then "3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm"
2727 else throw("Unknown chain")
2828 })
2929
3030 let DEFAULTLOCATION = "Africa_F_Africa"
3131
3232 let NUMRES = 6
3333
3434 let FACTORYMAXWAREHOUSE = 10000000000
3535
3636 let RESOURCEPRICEMIN = 158549
3737
3838 let MINPAYMENT = 10000
3939
4040 let SELLMULTIPLIER = 200
4141
4242 let BUYMULTIPLIER = 300
4343
4444 let resTypes = ["Oil", "Ore", "Wood", "Sand", "Clay", "Organic"]
4545
4646 let matTypes = ["Fuel", "Metal", "Plank", "Glass", "Plastic", "Protein"]
4747
4848 let continents = ["Americas", "Europe", "Asia", "Africa", "Oceania"]
49+
50+let productionMatrix = ["1_1_1_2_2_5_1_10", "2_5_5_2_7_5_2_100", "1_1_1_2_2_5_1_10", "9_9_1_5_5_1_5_100", "1_5_1_5_5_1_1_100"]
51+
52+let contIdxAmericas = 0
53+
54+let contIdxEurope = 1
55+
56+let contIdxAsia = 2
57+
58+let contIdxAfrica = 3
59+
60+let contIdxOceania = 4
4961
5062 func keyFactoryWarehouseByIdAndType (factoryId,resType) = ((("factoryWhByContinentAndRes_" + factoryId) + "_") + toString(resType))
5163
5264
5365 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
5466
5567
5668 func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
5769
5870
5971 func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
6072
6173
6274 func keyBlocked () = "contractsBlocked"
6375
6476
6577 let locIdxContinent = 0
6678
6779 let locIdxType = 1
6880
6981 let locIdxId = 2
7082
7183 let bpIdxLevel = 0
7284
7385 let bpIdxRes = 1
7486
7587 let bpIdxMat = 2
7688
7789 let bpIdxProd = 3
7890
7991 func asString (v) = match v {
8092 case s: String =>
8193 s
8294 case _ =>
8395 throw("fail to cast into String")
8496 }
8597
8698
8799 func sellInternal (locId,resType,amount,minPrice) = {
88100 let whKey = keyFactoryWarehouseByIdAndType(locId, resType)
89101 let w0 = valueOrElse(getInteger(whKey), 0)
90102 let r0 = if ((w0 > FACTORYMAXWAREHOUSE))
91103 then 0
92104 else if (((w0 + amount) > FACTORYMAXWAREHOUSE))
93105 then (FACTORYMAXWAREHOUSE - w0)
94106 else amount
95107 let usdnReceived = (fraction(r0, ((SELLMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) + (50 * r0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction((amount - r0), RESOURCEPRICEMIN, MULT8))
96108 let min99 = (minPrice - (minPrice / 100))
97109 if (((min99 * amount) > (usdnReceived * MULT8)))
98110 then throw((((((((((("Actual price = " + toString(usdnReceived)) + " / ") + toString(amount)) + " < minPrice = ") + toString(minPrice)) + ", (") + locId) + ", ") + resTypes[resType]) + ")"))
99111 else $Tuple2(IntegerEntry(whKey, (w0 + amount)), usdnReceived)
100112 }
101113
102114
103115 func buyInternal (locId,matType,amount,maxPrice) = {
104116 let whKey = keyFactoryWarehouseByIdAndType(locId, matType)
105117 let w0 = valueOrElse(getInteger(whKey), 0)
106118 let m1 = if ((w0 > FACTORYMAXWAREHOUSE))
107119 then min([amount, (w0 - FACTORYMAXWAREHOUSE)])
108120 else 0
109121 let m0 = min([w0, (amount - m1)])
110122 let m = (m0 + m1)
111123 let usdnSpent = (fraction(m0, ((BUYMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) - (50 * m0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction(m1, (2 * RESOURCEPRICEMIN), MULT8))
112124 let max101 = (maxPrice + (maxPrice / 100))
113125 if (((usdnSpent * MULT8) > (max101 * m)))
114126 then throw((((((((((("Actual price = " + toString(usdnSpent)) + " / ") + toString(m)) + " > maxPrice = ") + toString(maxPrice)) + ", (") + locId) + ", ") + matTypes[matType]) + ")"))
115127 else $Tuple3(IntegerEntry(whKey, (w0 - m)), usdnSpent, m)
116128 }
117129
118130
119131 func getBackpack (bpKey) = {
120132 let p = split(valueOrElse(getString(stakingContract, bpKey), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
121133 [toString(valueOrElse(parseInt(p[bpIdxLevel]), 0)), if ((size(split(p[bpIdxRes], "_")) == NUMRES))
122134 then p[bpIdxRes]
123135 else "0_0_0_0_0_0", if ((size(split(p[bpIdxMat], "_")) == NUMRES))
124136 then p[bpIdxMat]
125137 else "0_0_0_0_0_0", p[bpIdxProd]]
126138 }
127139
128140
129141 func checkBlocked () = if (valueOrElse(getBoolean(stakingContract, keyBlocked()), false))
130142 then throw("Contracts are under maintenance")
131143 else unit
132144
133145
134146 @Callable(i)
135147 func sellResources (amounts,minPrices) = {
136148 let blocked = checkBlocked()
137149 if ((blocked == blocked))
138150 then {
139151 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
140152 if ((size(i.payments) != 0))
141153 then throw("sellResources doesn't require any payments")
142154 else {
143155 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
144156 if ((curLocation[locIdxType] != "F"))
145157 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
146158 else {
147159 let locId = curLocation[locIdxId]
148160 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
149161 let resList = split(currentPack[bpIdxRes], "_")
150162 func adder (acc,j) = if ((amounts[j] > parseIntValue(resList[j])))
151163 then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to sell ") + toString(amounts[j])))
152164 else if ((0 > amounts[j]))
153165 then throw(((("You tried to sell negative amount of " + resTypes[j]) + ": ") + toString(amounts[j])))
154166 else if ((amounts[j] > 0))
155167 then {
156168 let b = sellInternal(locId, j, amounts[j], minPrices[j])
157169 $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(resList[j]) - amounts[j]))), (acc._3 + b._2))
158170 }
159171 else $Tuple3(acc._1, (acc._2 :+ resList[j]), acc._3)
160172
161173 let merged = {
162174 let $l = [0, 1, 2, 3, 4, 5]
163175 let $s = size($l)
164176 let $acc0 = $Tuple3(nil, nil, 0)
165177 func $f0_1 ($a,$i) = if (($i >= $s))
166178 then $a
167179 else adder($a, $l[$i])
168180
169181 func $f0_2 ($a,$i) = if (($i >= $s))
170182 then $a
171183 else throw("List size exceeds 6")
172184
173185 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
174186 }
175187 let newPack = makeString([currentPack[bpIdxLevel], makeString(merged._2, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
176188 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
177189 $Tuple2((merged._1 :+ ScriptTransfer(i.caller, merged._3, usdnAssetId)), result)
178190 }
179191 }
180192 }
181193 else throw("Strict value is not equal to itself.")
182194 }
183195
184196
185197
186198 @Callable(i)
187199 func buyMaterials (amounts,maxPrices) = {
188200 let blocked = checkBlocked()
189201 if ((blocked == blocked))
190202 then {
191203 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
192204 if ((size(i.payments) != 1))
193205 then throw("exactly 1 payment must be attached")
194206 else {
195207 let pmt = i.payments[0]
196208 let amt = pmt.amount
197209 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
198210 if ((pmtAssetId != usdnAssetId))
199211 then throw("USDN payments only!")
200212 else {
201213 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
202214 if ((curLocation[locIdxType] != "F"))
203215 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
204216 else {
205217 let locId = curLocation[locIdxId]
206218 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
207219 let matList = split(currentPack[bpIdxMat], "_")
208220 func mUpdater (acc,j) = if ((0 > amounts[j]))
209221 then throw(((("You tried to buy negative amount of " + matTypes[j]) + ": ") + toString(amounts[j])))
210222 else if ((amounts[j] > 0))
211223 then {
212224 let b = buyInternal(locId, j, amounts[j], maxPrices[j])
213225 $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(matList[j]) + b._3))), (acc._3 + b._2))
214226 }
215227 else $Tuple3(acc._1, (acc._2 :+ matList[j]), acc._3)
216228
217229 let merged = {
218230 let $l = [0, 1, 2, 3, 4, 5]
219231 let $s = size($l)
220232 let $acc0 = $Tuple3(nil, nil, 0)
221233 func $f0_1 ($a,$i) = if (($i >= $s))
222234 then $a
223235 else mUpdater($a, $l[$i])
224236
225237 func $f0_2 ($a,$i) = if (($i >= $s))
226238 then $a
227239 else throw("List size exceeds 6")
228240
229241 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
230242 }
231243 if ((merged._3 > amt))
232244 then throw(((("Insufficient payment! Attached=" + toString(amt)) + ", required=") + toString(merged._3)))
233245 else {
234246 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged._2, "_"), currentPack[bpIdxProd]], ":")
235247 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
236248 let rest = if (((amt - merged._3) > 0))
237249 then [ScriptTransfer(i.caller, (amt - merged._3), usdnAssetId)]
238250 else nil
239251 $Tuple2((merged._1 ++ rest), result)
240252 }
241253 }
242254 }
243255 }
244256 }
245257 else throw("Strict value is not equal to itself.")
246258 }
247259
248260
261+
262+@Callable(i)
263+func buyGoods (productIdx,level,quantity) = {
264+ let blocked = checkBlocked()
265+ if ((blocked == blocked))
266+ then if ((size(i.payments) != 0))
267+ then throw("buyGoods doesn't require any payments")
268+ else if ((0 > quantity))
269+ then throw("Quantity should be positive")
270+ else {
271+ let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
272+ let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
273+ if ((curLocation[locIdxType] != "M"))
274+ then throw(("Duck location type should be Manufactory, but is " + curLocation[locIdxType]))
275+ else {
276+ let cont = curLocation[locIdxContinent]
277+ let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
278+ let matList = split(currentPack[bpIdxMat], "_")
279+ if (if ((0 > productIdx))
280+ then true
281+ else (productIdx >= size(productionMatrix)))
282+ then throw(("Unknown product idx=" + toString(productIdx)))
283+ else {
284+ let productContIdx = (productIdx % size(continents))
285+ if ((continents[productContIdx] != cont))
286+ then throw(((("This product is available in " + continents[productContIdx]) + ", but you are in ") + cont))
287+ else {
288+ let recipe = split(productionMatrix[productIdx], "_")
289+ if ((size(recipe) != (NUMRES + 2)))
290+ then throw(("Fatal: unknown recipe: " + productionMatrix[productIdx]))
291+ else {
292+ let prodList = if ((currentPack[bpIdxProd] == ""))
293+ then nil
294+ else split(currentPack[bpIdxProd], "_")
295+ func filler (acc,ignoredItem) = {
296+ let n = acc._2
297+ let x = if ((size(prodList) > n))
298+ then split(prodList[n], ",")
299+ else ["0", "0", "0"]
300+ let x1s = x[0]
301+ let x1 = parseIntValue(x1s)
302+ let x2s = x[1]
303+ let x2 = parseIntValue(x2s)
304+ let x3s = x[2]
305+ let x3 = parseIntValue(x3s)
306+ let amount = (quantity * parseIntValue(recipe[7]))
307+ let y = if ((n == productIdx))
308+ then match level {
309+ case _ =>
310+ if ((1 == $match0))
311+ then ((((toString((x1 + amount)) + ",") + x2s) + ",") + x3s)
312+ else if ((2 == $match0))
313+ then ((((x1s + ",") + toString((x2 + amount))) + ",") + x3s)
314+ else if ((3 == $match0))
315+ then ((((x1s + ",") + x2s) + ",") + toString((x3 + amount)))
316+ else throw(("Product level should be 1..3, not " + toString(level)))
317+ }
318+ else ((((x1s + ",") + x2s) + ",") + x3s)
319+ $Tuple2((acc._1 :+ y), (n + 1))
320+ }
321+
322+ let bpProd = ( let $l = productionMatrix
323+ let $s = size($l)
324+ let $acc0 = $Tuple2(nil, 0)
325+ func $f0_1 ($a,$i) = if (($i >= $s))
326+ then $a
327+ else filler($a, $l[$i])
328+
329+ func $f0_2 ($a,$i) = if (($i >= $s))
330+ then $a
331+ else throw("List size exceeds 50")
332+
333+ $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
334+ func producer (acc,j) = {
335+ let needMat = (parseIntValue(recipe[j]) * quantity)
336+ let haveMat = parseIntValue(matList[j])
337+ if ((needMat > haveMat))
338+ then throw(((((((("You have " + matList[j]) + " of ") + matTypes[j]) + ", but recipe requires ") + toString(needMat)) + " for quantity ") + toString(quantity)))
339+ else if ((needMat > 0))
340+ then (acc :+ toString((haveMat - needMat)))
341+ else (acc :+ matList[j])
342+ }
343+
344+ let merged = {
345+ let $l = [0, 1, 2, 3, 4, 5]
346+ let $s = size($l)
347+ let $acc0 = nil
348+ func $f1_1 ($a,$i) = if (($i >= $s))
349+ then $a
350+ else producer($a, $l[$i])
351+
352+ func $f1_2 ($a,$i) = if (($i >= $s))
353+ then $a
354+ else throw("List size exceeds 6")
355+
356+ $f1_2($f1_1($f1_1($f1_1($f1_1($f1_1($f1_1($acc0, 0), 1), 2), 3), 4), 5), 6)
357+ }
358+ let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged, "_"), makeString(bpProd, "_")], ":")
359+ let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
360+ $Tuple2(nil, result)
361+ }
362+ }
363+ }
364+ }
365+ }
366+ else throw("Strict value is not equal to itself.")
367+ }
368+
369+

github/deemru/w8io/169f3d6 
87.60 ms