tx · D26GYuHZLea2V5wvzLQHHFACmjgdoBGaT7YhmQkWRR9a

3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep:  -0.01000000 Waves

2023.01.24 20:36 [2419361] smart account 3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep > SELF 0.00000000 Waves

{ "type": 13, "id": "D26GYuHZLea2V5wvzLQHHFACmjgdoBGaT7YhmQkWRR9a", "fee": 1000000, "feeAssetId": null, "timestamp": 1674581825626, "version": 2, "chainId": 84, "sender": "3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep", "senderPublicKey": "7v5L7QkXxfkirALdyqmox38QCsa9jtfAtgUfHTh34eWq", "proofs": [ "4GeTKTAo1DcVZk9bkuS9gQjftToa2T4hegcJu1KkEsqGDJPgpE47P7WR3RSx7cnsGBfCGgGtf3BdD4ZRuCQDuwXa" ], "script": "base64:BgIOCAISBAoCERESBAoCEREhAAVNVUxUNgDAhD0ABU1VTFQ4AIDC1y8ABk1VTFQxMACAyK+gJQAFY2hhaW4JAMkBAgkAygECCAUEdGhpcwVieXRlcwABAAEAC3VzZG5Bc3NldElkBAckbWF0Y2gwBQVjaGFpbgMJAAACAQFXBQckbWF0Y2gwASC2JinDBPXOU5GkDkt1JC9kjFGx+t+vVCm9SNIdKrKq0QMJAAACAQFUBQckbWF0Y2gwASD3dur394PKZdtuE+4CO89YKZWpwdGN8kvabNgdYoDI3gkAAgECDVVua25vd24gY2hhaW4AD3N0YWtpbmdDb250cmFjdAkBEUBleHRyTmF0aXZlKDEwNjIpAQQHJG1hdGNoMAUFY2hhaW4DCQAAAgEBVwUHJG1hdGNoMAIjM1BMbmNYdFMxVTgzRDZjUWJGRDNIOHJCSFBMZ3p4U0ZLWjEDCQAAAgEBVAUHJG1hdGNoMAIjM05EQ3lCRzVxODVKdWFSaWlnVWVFdGFpbnlqQ1FUM1hwWm0JAAIBAg1Vbmtub3duIGNoYWluAA9ERUZBVUxUTE9DQVRJT04CD0FmcmljYV9GX0FmcmljYQAGTlVNUkVTAAYAE0ZBQ1RPUllNQVhXQVJFSE9VU0UAgMivoCUAEFJFU09VUkNFUFJJQ0VNSU4A1dYJAApNSU5QQVlNRU5UAJBOAA5TRUxMTVVMVElQTElFUgDIAQANQlVZTVVMVElQTElFUgCsAgAIcmVzVHlwZXMJAMwIAgIDT2lsCQDMCAICA09yZQkAzAgCAgRXb29kCQDMCAICBFNhbmQJAMwIAgIEQ2xheQkAzAgCAgdPcmdhbmljBQNuaWwACG1hdFR5cGVzCQDMCAICBEZ1ZWwJAMwIAgIFTWV0YWwJAMwIAgIFUGxhbmsJAMwIAgIFR2xhc3MJAMwIAgIHUGxhc3RpYwkAzAgCAgdQcm90ZWluBQNuaWwACmNvbnRpbmVudHMJAMwIAgIIQW1lcmljYXMJAMwIAgIGRXVyb3BlCQDMCAICBEFzaWEJAMwIAgIGQWZyaWNhCQDMCAICB09jZWFuaWEFA25pbAEea2V5RmFjdG9yeVdhcmVob3VzZUJ5SWRBbmRUeXBlAglmYWN0b3J5SWQHcmVzVHlwZQkArAICCQCsAgIJAKwCAgIbZmFjdG9yeVdoQnlDb250aW5lbnRBbmRSZXNfBQlmYWN0b3J5SWQCAV8JAKQDAQUHcmVzVHlwZQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCW93bmVyQWRkcgkArAICAhJzdGFrZWREdWNrQnlPd25lcl8FCW93bmVyQWRkcgERa2V5QmFja3BhY2tCeUR1Y2sBC2R1Y2tBc3NldElkCQCsAgICCWJhY2tQYWNrXwULZHVja0Fzc2V0SWQBD2tleUR1Y2tMb2NhdGlvbgELZHVja0Fzc2V0SWQJAKwCAgINZHVja0xvY2F0aW9uXwULZHVja0Fzc2V0SWQBCmtleUJsb2NrZWQAAhBjb250cmFjdHNCbG9ja2VkAA9sb2NJZHhDb250aW5lbnQAAAAKbG9jSWR4VHlwZQABAAhsb2NJZHhJZAACAApicElkeExldmVsAAAACGJwSWR4UmVzAAEACGJwSWR4TWF0AAIACWJwSWR4UHJvZAADAQhhc1N0cmluZwEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAFAXMJAAIBAhhmYWlsIHRvIGNhc3QgaW50byBTdHJpbmcBDHNlbGxJbnRlcm5hbAQFbG9jSWQHcmVzVHlwZQZhbW91bnQIbWluUHJpY2UEBXdoS2V5CQEea2V5RmFjdG9yeVdhcmVob3VzZUJ5SWRBbmRUeXBlAgUFbG9jSWQFB3Jlc1R5cGUEAncwCQELdmFsdWVPckVsc2UCCQCfCAEFBXdoS2V5AAAEAnIwAwkAZgIFAncwBRNGQUNUT1JZTUFYV0FSRUhPVVNFAAADCQBmAgkAZAIFAncwBQZhbW91bnQFE0ZBQ1RPUllNQVhXQVJFSE9VU0UJAGUCBRNGQUNUT1JZTUFYV0FSRUhPVVNFBQJ3MAUGYW1vdW50BAx1c2RuUmVjZWl2ZWQJAGQCCQBrAwUCcjAJAGUCCQBoAgUOU0VMTE1VTFRJUExJRVIFEFJFU09VUkNFUFJJQ0VNSU4JAGsDCQBkAgkAaAIAZAUCdzAJAGgCADIFAnIwBRBSRVNPVVJDRVBSSUNFTUlOBRNGQUNUT1JZTUFYV0FSRUhPVVNFBQZNVUxUMTAJAGsDCQBlAgUGYW1vdW50BQJyMAUQUkVTT1VSQ0VQUklDRU1JTgUFTVVMVDgEBW1pbjk5CQBlAgUIbWluUHJpY2UJAGkCBQhtaW5QcmljZQBkAwkAZgIJAGgCBQVtaW45OQUGYW1vdW50CQBoAgUMdXNkblJlY2VpdmVkBQVNVUxUOAkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIPQWN0dWFsIHByaWNlID0gCQCkAwEFDHVzZG5SZWNlaXZlZAIDIC8gCQCkAwEFBmFtb3VudAIOIDwgbWluUHJpY2UgPSAJAKQDAQUIbWluUHJpY2UCAywgKAUFbG9jSWQCAiwgCQCRAwIFCHJlc1R5cGVzBQdyZXNUeXBlAgEpCQCUCgIJAQxJbnRlZ2VyRW50cnkCBQV3aEtleQkAZAIFAncwBQZhbW91bnQFDHVzZG5SZWNlaXZlZAELYnV5SW50ZXJuYWwEBWxvY0lkB21hdFR5cGUGYW1vdW50CG1heFByaWNlBAV3aEtleQkBHmtleUZhY3RvcnlXYXJlaG91c2VCeUlkQW5kVHlwZQIFBWxvY0lkBQdtYXRUeXBlBAJ3MAkBC3ZhbHVlT3JFbHNlAgkAnwgBBQV3aEtleQAABAJtMQMJAGYCBQJ3MAUTRkFDVE9SWU1BWFdBUkVIT1VTRQkAlwMBCQDMCAIFBmFtb3VudAkAzAgCCQBlAgUCdzAFE0ZBQ1RPUllNQVhXQVJFSE9VU0UFA25pbAAABAJtMAkAlwMBCQDMCAIFAncwCQDMCAIJAGUCBQZhbW91bnQFAm0xBQNuaWwEAW0JAGQCBQJtMAUCbTEECXVzZG5TcGVudAkAZAIJAGsDBQJtMAkAZQIJAGgCBQ1CVVlNVUxUSVBMSUVSBRBSRVNPVVJDRVBSSUNFTUlOCQBrAwkAZQIJAGgCAGQFAncwCQBoAgAyBQJtMAUQUkVTT1VSQ0VQUklDRU1JTgUTRkFDVE9SWU1BWFdBUkVIT1VTRQUGTVVMVDEwCQBrAwUCbTEJAGgCAAIFEFJFU09VUkNFUFJJQ0VNSU4FBU1VTFQ4BAZtYXgxMDEJAGQCBQhtYXhQcmljZQkAaQIFCG1heFByaWNlAGQDCQBmAgkAaAIFCXVzZG5TcGVudAUFTVVMVDgJAGgCBQZtYXgxMDEFAW0JAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgICD0FjdHVhbCBwcmljZSA9IAkApAMBBQl1c2RuU3BlbnQCAyAvIAkApAMBBQFtAg4gPiBtYXhQcmljZSA9IAkApAMBBQhtYXhQcmljZQIDLCAoBQVsb2NJZAICLCAJAJEDAgUIbWF0VHlwZXMFB21hdFR5cGUCASkJAJUKAwkBDEludGVnZXJFbnRyeQIFBXdoS2V5CQBlAgUCdzAFAW0FCXVzZG5TcGVudAUBbQELZ2V0QmFja3BhY2sBBWJwS2V5BAFwCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0BQVicEtleQIaMDowXzBfMF8wXzBfMDowXzBfMF8wXzBfMDoCAToJAMwIAgkApAMBCQELdmFsdWVPckVsc2UCCQC2CQEJAJEDAgUBcAUKYnBJZHhMZXZlbAAACQDMCAIDCQAAAgkAkAMBCQC1CQIJAJEDAgUBcAUIYnBJZHhSZXMCAV8FBk5VTVJFUwkAkQMCBQFwBQhicElkeFJlcwILMF8wXzBfMF8wXzAJAMwIAgMJAAACCQCQAwEJALUJAgkAkQMCBQFwBQhicElkeE1hdAIBXwUGTlVNUkVTCQCRAwIFAXAFCGJwSWR4TWF0AgswXzBfMF8wXzBfMAkAzAgCCQCRAwIFAXAFCWJwSWR4UHJvZAUDbmlsAQxjaGVja0Jsb2NrZWQAAwkBC3ZhbHVlT3JFbHNlAgkAmwgCBQ9zdGFraW5nQ29udHJhY3QJAQprZXlCbG9ja2VkAAcJAAIBAh9Db250cmFjdHMgYXJlIHVuZGVyIG1haW50ZW5hbmNlBQR1bml0AgFpAQ1zZWxsUmVzb3VyY2VzAgdhbW91bnRzCW1pblByaWNlcwQHYmxvY2tlZAkBDGNoZWNrQmxvY2tlZAADCQAAAgUHYmxvY2tlZAUHYmxvY2tlZAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIqc2VsbFJlc291cmNlcyBkb2Vzbid0IHJlcXVpcmUgYW55IHBheW1lbnRzBAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8DCQECIT0CCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlAgFGCQACAQkArAICAi1EdWNrIGxvY2F0aW9uIHR5cGUgc2hvdWxkIGJlIEZhY3RvcnksIGJ1dCBpcyAJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUEBWxvY0lkCQCRAwIFC2N1ckxvY2F0aW9uBQhsb2NJZHhJZAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdyZXNMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzAgFfCgEFYWRkZXICA2FjYwFqAwkAZgIJAJEDAgUHYW1vdW50cwUBagkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWoJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJWW91IGhhdmUgCQCRAwIFB3Jlc0xpc3QFAWoCBCBvZiAJAJEDAgUIcmVzVHlwZXMFAWoCFCwgYnV0IHRyaWVkIHRvIHNlbGwgCQCkAwEJAJEDAgUHYW1vdW50cwUBagMJAGYCAAAJAJEDAgUHYW1vdW50cwUBagkAAgEJAKwCAgkArAICCQCsAgICJVlvdSB0cmllZCB0byBzZWxsIG5lZ2F0aXZlIGFtb3VudCBvZiAJAJEDAgUIcmVzVHlwZXMFAWoCAjogCQCkAwEJAJEDAgUHYW1vdW50cwUBagMJAGYCCQCRAwIFB2Ftb3VudHMFAWoAAAQBYgkBDHNlbGxJbnRlcm5hbAQFBWxvY0lkBQFqCQCRAwIFB2Ftb3VudHMFAWoJAJEDAgUJbWluUHJpY2VzBQFqCQCVCgMJAM0IAggFA2FjYwJfMQgFAWICXzEJAM0IAggFA2FjYwJfMgkApAMBCQBlAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWoJAJEDAgUHYW1vdW50cwUBagkAZAIIBQNhY2MCXzMIBQFiAl8yCQCVCgMIBQNhY2MCXzEJAM0IAggFA2FjYwJfMgkAkQMCBQdyZXNMaXN0BQFqCAUDYWNjAl8zBAZtZXJnZWQKAAIkbAkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQVhZGRlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgQHbmV3UGFjawkAuQkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAuQkCCAUGbWVyZ2VkAl8yAgFfCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0CQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6BAZyZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQduZXdQYWNrBQNuaWwFA25pbAkAlAoCCQDNCAIIBQZtZXJnZWQCXzEJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcggFBm1lcmdlZAJfMwULdXNkbkFzc2V0SWQFBnJlc3VsdAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQxidXlNYXRlcmlhbHMCB2Ftb3VudHMJbWF4UHJpY2VzBAdibG9ja2VkCQEMY2hlY2tCbG9ja2VkAAMJAAACBQdibG9ja2VkBQdibG9ja2VkBAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAQKcG10QXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUDcG10B2Fzc2V0SWQCHldBVkVTIGNhbid0IGJlIHVzZWQgYXMgcGF5bWVudAMJAQIhPQIFCnBtdEFzc2V0SWQFC3VzZG5Bc3NldElkCQACAQITVVNETiBwYXltZW50cyBvbmx5IQQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBRgkAAgEJAKwCAgItRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBGYWN0b3J5LCBidXQgaXMgCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlBAVsb2NJZAkAkQMCBQtjdXJMb2NhdGlvbgUIbG9jSWR4SWQEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHbWF0TGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwoBCG1VcGRhdGVyAgNhY2MBagMJAGYCAAAJAJEDAgUHYW1vdW50cwUBagkAAgEJAKwCAgkArAICCQCsAgICJFlvdSB0cmllZCB0byBidXkgbmVnYXRpdmUgYW1vdW50IG9mIAkAkQMCBQhtYXRUeXBlcwUBagICOiAJAKQDAQkAkQMCBQdhbW91bnRzBQFqAwkAZgIJAJEDAgUHYW1vdW50cwUBagAABAFiCQELYnV5SW50ZXJuYWwEBQVsb2NJZAUBagkAkQMCBQdhbW91bnRzBQFqCQCRAwIFCW1heFByaWNlcwUBagkAlQoDCQDNCAIIBQNhY2MCXzEIBQFiAl8xCQDNCAIIBQNhY2MCXzIJAKQDAQkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdtYXRMaXN0BQFqCAUBYgJfMwkAZAIIBQNhY2MCXzMIBQFiAl8yCQCVCgMIBQNhY2MCXzEJAM0IAggFA2FjYwJfMgkAkQMCBQdtYXRMaXN0BQFqCAUDYWNjAl8zBAZtZXJnZWQKAAIkbAkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhtVXBkYXRlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgMJAGYCCAUGbWVyZ2VkAl8zBQNhbXQJAAIBCQCsAgIJAKwCAgkArAICAh9JbnN1ZmZpY2llbnQgcGF5bWVudCEgQXR0YWNoZWQ9CQCkAwEFA2FtdAILLCByZXF1aXJlZD0JAKQDAQgFBm1lcmdlZAJfMwQHbmV3UGFjawkAuQkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMJAMwIAgkAuQkCCAUGbWVyZ2VkAl8yAgFfCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6BAZyZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQduZXdQYWNrBQNuaWwFA25pbAQEcmVzdAMJAGYCCQBlAgUDYW10CAUGbWVyZ2VkAl8zAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAgUDYW10CAUGbWVyZ2VkAl8zBQt1c2RuQXNzZXRJZAUDbmlsBQNuaWwJAJQKAgkAzggCCAUGbWVyZ2VkAl8xBQRyZXN0BQZyZXN1bHQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AgaA84A==", "height": 2419361, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: AQW4awMwXU4cnSBKhk5bxkr77ucERSQZrXfCSZBf8Usb Next: 9jUFdyBNDLwr3Gw1evnj8T7NsMLTWo5ALvFVF977EQyw Diff:
OldNewDifferences
77
88 let MULT10 = 10000000000
99
10-let chain = toUtf8String(take(drop(this.bytes, 1), 1))
10+let chain = take(drop(this.bytes, 1), 1)
1111
1212 let usdnAssetId = match chain {
1313 case _ =>
14- if (("W" == $match0))
14+ if ((base58'2W' == $match0))
1515 then base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
16- else if (("T" == $match0))
16+ else if ((base58'2T' == $match0))
1717 then base58'HezsdQuRDtzksAYUy97gfhKy7Z1NW2uXYSHA3bgqenNZ'
1818 else throw("Unknown chain")
1919 }
2020
2121 let stakingContract = addressFromStringValue(match chain {
2222 case _ =>
23- if (("W" == $match0))
23+ if ((base58'2W' == $match0))
2424 then "3PLncXtS1U83D6cQbFD3H8rBHPLgzxSFKZ1"
25- else if (("T" == $match0))
25+ else if ((base58'2T' == $match0))
2626 then "3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm"
2727 else throw("Unknown chain")
2828 })
5757
5858
5959 func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
60+
61+
62+func keyBlocked () = "contractsBlocked"
6063
6164
6265 let locIdxContinent = 0
123126 }
124127
125128
126-@Callable(i)
127-func sellResources (amounts,minPrices) = {
128- let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
129- if ((size(i.payments) != 0))
130- then throw("sellResources doesn't require any payments")
131- else {
132- let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
133- if ((curLocation[locIdxType] != "F"))
134- then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
135- else {
136- let locId = curLocation[locIdxId]
137- let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
138- let resList = split(currentPack[bpIdxRes], "_")
139- func adder (acc,j) = if ((amounts[j] > parseIntValue(resList[j])))
140- then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to sell ") + toString(amounts[j])))
141- else if ((0 > amounts[j]))
142- then throw(((("You tried to sell negative amount of " + resTypes[j]) + ": ") + toString(amounts[j])))
143- else if ((amounts[j] > 0))
144- then {
145- let b = sellInternal(locId, j, amounts[j], minPrices[j])
146- $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(resList[j]) - amounts[j]))), (acc._3 + b._2))
147- }
148- else $Tuple3(acc._1, (acc._2 :+ resList[j]), acc._3)
149-
150- let merged = {
151- let $l = [0, 1, 2, 3, 4, 5]
152- let $s = size($l)
153- let $acc0 = $Tuple3(nil, nil, 0)
154- func $f0_1 ($a,$i) = if (($i >= $s))
155- then $a
156- else adder($a, $l[$i])
157-
158- func $f0_2 ($a,$i) = if (($i >= $s))
159- then $a
160- else throw("List size exceeds 6")
161-
162- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
163- }
164- let newPack = makeString([currentPack[bpIdxLevel], makeString(merged._2, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
165- let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
166- $Tuple2((merged._1 :+ ScriptTransfer(i.caller, merged._3, usdnAssetId)), result)
167- }
168- }
169- }
170-
129+func checkBlocked () = if (valueOrElse(getBoolean(stakingContract, keyBlocked()), false))
130+ then throw("Contracts are under maintenance")
131+ else unit
171132
172133
173134 @Callable(i)
174-func buyMaterials (amounts,maxPrices) = {
175- let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
176- if ((size(i.payments) != 1))
177- then throw("exactly 1 payment must be attached")
178- else {
179- let pmt = i.payments[0]
180- let amt = pmt.amount
181- let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
182- if ((pmtAssetId != usdnAssetId))
183- then throw("USDN payments only!")
135+func sellResources (amounts,minPrices) = {
136+ let blocked = checkBlocked()
137+ if ((blocked == blocked))
138+ then {
139+ let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
140+ if ((size(i.payments) != 0))
141+ then throw("sellResources doesn't require any payments")
184142 else {
185143 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
186144 if ((curLocation[locIdxType] != "F"))
188146 else {
189147 let locId = curLocation[locIdxId]
190148 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
191- let matList = split(currentPack[bpIdxMat], "_")
192- func mUpdater (acc,j) = if ((0 > amounts[j]))
193- then throw(((("You tried to buy negative amount of " + matTypes[j]) + ": ") + toString(amounts[j])))
194- else if ((amounts[j] > 0))
195- then {
196- let b = buyInternal(locId, j, amounts[j], maxPrices[j])
197- $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(matList[j]) + b._3))), (acc._3 + b._2))
198- }
199- else $Tuple3(acc._1, (acc._2 :+ matList[j]), acc._3)
149+ let resList = split(currentPack[bpIdxRes], "_")
150+ func adder (acc,j) = if ((amounts[j] > parseIntValue(resList[j])))
151+ then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to sell ") + toString(amounts[j])))
152+ else if ((0 > amounts[j]))
153+ then throw(((("You tried to sell negative amount of " + resTypes[j]) + ": ") + toString(amounts[j])))
154+ else if ((amounts[j] > 0))
155+ then {
156+ let b = sellInternal(locId, j, amounts[j], minPrices[j])
157+ $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(resList[j]) - amounts[j]))), (acc._3 + b._2))
158+ }
159+ else $Tuple3(acc._1, (acc._2 :+ resList[j]), acc._3)
200160
201161 let merged = {
202162 let $l = [0, 1, 2, 3, 4, 5]
204164 let $acc0 = $Tuple3(nil, nil, 0)
205165 func $f0_1 ($a,$i) = if (($i >= $s))
206166 then $a
207- else mUpdater($a, $l[$i])
167+ else adder($a, $l[$i])
208168
209169 func $f0_2 ($a,$i) = if (($i >= $s))
210170 then $a
212172
213173 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
214174 }
215- if ((merged._3 > amt))
216- then throw(((("Insufficient payment! Attached=" + toString(amt)) + ", required=") + toString(merged._3)))
175+ let newPack = makeString([currentPack[bpIdxLevel], makeString(merged._2, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
176+ let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
177+ $Tuple2((merged._1 :+ ScriptTransfer(i.caller, merged._3, usdnAssetId)), result)
178+ }
179+ }
180+ }
181+ else throw("Strict value is not equal to itself.")
182+ }
183+
184+
185+
186+@Callable(i)
187+func buyMaterials (amounts,maxPrices) = {
188+ let blocked = checkBlocked()
189+ if ((blocked == blocked))
190+ then {
191+ let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
192+ if ((size(i.payments) != 1))
193+ then throw("exactly 1 payment must be attached")
194+ else {
195+ let pmt = i.payments[0]
196+ let amt = pmt.amount
197+ let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
198+ if ((pmtAssetId != usdnAssetId))
199+ then throw("USDN payments only!")
200+ else {
201+ let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
202+ if ((curLocation[locIdxType] != "F"))
203+ then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
217204 else {
218- let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged._2, "_"), currentPack[bpIdxProd]], ":")
219- let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
220- let rest = if (((amt - merged._3) > 0))
221- then [ScriptTransfer(i.caller, (amt - merged._3), usdnAssetId)]
222- else nil
223- $Tuple2((merged._1 ++ rest), result)
205+ let locId = curLocation[locIdxId]
206+ let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
207+ let matList = split(currentPack[bpIdxMat], "_")
208+ func mUpdater (acc,j) = if ((0 > amounts[j]))
209+ then throw(((("You tried to buy negative amount of " + matTypes[j]) + ": ") + toString(amounts[j])))
210+ else if ((amounts[j] > 0))
211+ then {
212+ let b = buyInternal(locId, j, amounts[j], maxPrices[j])
213+ $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(matList[j]) + b._3))), (acc._3 + b._2))
214+ }
215+ else $Tuple3(acc._1, (acc._2 :+ matList[j]), acc._3)
216+
217+ let merged = {
218+ let $l = [0, 1, 2, 3, 4, 5]
219+ let $s = size($l)
220+ let $acc0 = $Tuple3(nil, nil, 0)
221+ func $f0_1 ($a,$i) = if (($i >= $s))
222+ then $a
223+ else mUpdater($a, $l[$i])
224+
225+ func $f0_2 ($a,$i) = if (($i >= $s))
226+ then $a
227+ else throw("List size exceeds 6")
228+
229+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
230+ }
231+ if ((merged._3 > amt))
232+ then throw(((("Insufficient payment! Attached=" + toString(amt)) + ", required=") + toString(merged._3)))
233+ else {
234+ let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged._2, "_"), currentPack[bpIdxProd]], ":")
235+ let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
236+ let rest = if (((amt - merged._3) > 0))
237+ then [ScriptTransfer(i.caller, (amt - merged._3), usdnAssetId)]
238+ else nil
239+ $Tuple2((merged._1 ++ rest), result)
240+ }
224241 }
225242 }
226243 }
227244 }
245+ else throw("Strict value is not equal to itself.")
228246 }
229247
230248
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
10-let chain = toUtf8String(take(drop(this.bytes, 1), 1))
10+let chain = take(drop(this.bytes, 1), 1)
1111
1212 let usdnAssetId = match chain {
1313 case _ =>
14- if (("W" == $match0))
14+ if ((base58'2W' == $match0))
1515 then base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
16- else if (("T" == $match0))
16+ else if ((base58'2T' == $match0))
1717 then base58'HezsdQuRDtzksAYUy97gfhKy7Z1NW2uXYSHA3bgqenNZ'
1818 else throw("Unknown chain")
1919 }
2020
2121 let stakingContract = addressFromStringValue(match chain {
2222 case _ =>
23- if (("W" == $match0))
23+ if ((base58'2W' == $match0))
2424 then "3PLncXtS1U83D6cQbFD3H8rBHPLgzxSFKZ1"
25- else if (("T" == $match0))
25+ 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"]
4949
5050 func keyFactoryWarehouseByIdAndType (factoryId,resType) = ((("factoryWhByContinentAndRes_" + factoryId) + "_") + toString(resType))
5151
5252
5353 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
5454
5555
5656 func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
5757
5858
5959 func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
60+
61+
62+func keyBlocked () = "contractsBlocked"
6063
6164
6265 let locIdxContinent = 0
6366
6467 let locIdxType = 1
6568
6669 let locIdxId = 2
6770
6871 let bpIdxLevel = 0
6972
7073 let bpIdxRes = 1
7174
7275 let bpIdxMat = 2
7376
7477 let bpIdxProd = 3
7578
7679 func asString (v) = match v {
7780 case s: String =>
7881 s
7982 case _ =>
8083 throw("fail to cast into String")
8184 }
8285
8386
8487 func sellInternal (locId,resType,amount,minPrice) = {
8588 let whKey = keyFactoryWarehouseByIdAndType(locId, resType)
8689 let w0 = valueOrElse(getInteger(whKey), 0)
8790 let r0 = if ((w0 > FACTORYMAXWAREHOUSE))
8891 then 0
8992 else if (((w0 + amount) > FACTORYMAXWAREHOUSE))
9093 then (FACTORYMAXWAREHOUSE - w0)
9194 else amount
9295 let usdnReceived = (fraction(r0, ((SELLMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) + (50 * r0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction((amount - r0), RESOURCEPRICEMIN, MULT8))
9396 let min99 = (minPrice - (minPrice / 100))
9497 if (((min99 * amount) > (usdnReceived * MULT8)))
9598 then throw((((((((((("Actual price = " + toString(usdnReceived)) + " / ") + toString(amount)) + " < minPrice = ") + toString(minPrice)) + ", (") + locId) + ", ") + resTypes[resType]) + ")"))
9699 else $Tuple2(IntegerEntry(whKey, (w0 + amount)), usdnReceived)
97100 }
98101
99102
100103 func buyInternal (locId,matType,amount,maxPrice) = {
101104 let whKey = keyFactoryWarehouseByIdAndType(locId, matType)
102105 let w0 = valueOrElse(getInteger(whKey), 0)
103106 let m1 = if ((w0 > FACTORYMAXWAREHOUSE))
104107 then min([amount, (w0 - FACTORYMAXWAREHOUSE)])
105108 else 0
106109 let m0 = min([w0, (amount - m1)])
107110 let m = (m0 + m1)
108111 let usdnSpent = (fraction(m0, ((BUYMULTIPLIER * RESOURCEPRICEMIN) - fraction(((100 * w0) - (50 * m0)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT10) + fraction(m1, (2 * RESOURCEPRICEMIN), MULT8))
109112 let max101 = (maxPrice + (maxPrice / 100))
110113 if (((usdnSpent * MULT8) > (max101 * m)))
111114 then throw((((((((((("Actual price = " + toString(usdnSpent)) + " / ") + toString(m)) + " > maxPrice = ") + toString(maxPrice)) + ", (") + locId) + ", ") + matTypes[matType]) + ")"))
112115 else $Tuple3(IntegerEntry(whKey, (w0 - m)), usdnSpent, m)
113116 }
114117
115118
116119 func getBackpack (bpKey) = {
117120 let p = split(valueOrElse(getString(stakingContract, bpKey), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
118121 [toString(valueOrElse(parseInt(p[bpIdxLevel]), 0)), if ((size(split(p[bpIdxRes], "_")) == NUMRES))
119122 then p[bpIdxRes]
120123 else "0_0_0_0_0_0", if ((size(split(p[bpIdxMat], "_")) == NUMRES))
121124 then p[bpIdxMat]
122125 else "0_0_0_0_0_0", p[bpIdxProd]]
123126 }
124127
125128
126-@Callable(i)
127-func sellResources (amounts,minPrices) = {
128- let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
129- if ((size(i.payments) != 0))
130- then throw("sellResources doesn't require any payments")
131- else {
132- let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
133- if ((curLocation[locIdxType] != "F"))
134- then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
135- else {
136- let locId = curLocation[locIdxId]
137- let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
138- let resList = split(currentPack[bpIdxRes], "_")
139- func adder (acc,j) = if ((amounts[j] > parseIntValue(resList[j])))
140- then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to sell ") + toString(amounts[j])))
141- else if ((0 > amounts[j]))
142- then throw(((("You tried to sell negative amount of " + resTypes[j]) + ": ") + toString(amounts[j])))
143- else if ((amounts[j] > 0))
144- then {
145- let b = sellInternal(locId, j, amounts[j], minPrices[j])
146- $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(resList[j]) - amounts[j]))), (acc._3 + b._2))
147- }
148- else $Tuple3(acc._1, (acc._2 :+ resList[j]), acc._3)
149-
150- let merged = {
151- let $l = [0, 1, 2, 3, 4, 5]
152- let $s = size($l)
153- let $acc0 = $Tuple3(nil, nil, 0)
154- func $f0_1 ($a,$i) = if (($i >= $s))
155- then $a
156- else adder($a, $l[$i])
157-
158- func $f0_2 ($a,$i) = if (($i >= $s))
159- then $a
160- else throw("List size exceeds 6")
161-
162- $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
163- }
164- let newPack = makeString([currentPack[bpIdxLevel], makeString(merged._2, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
165- let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
166- $Tuple2((merged._1 :+ ScriptTransfer(i.caller, merged._3, usdnAssetId)), result)
167- }
168- }
169- }
170-
129+func checkBlocked () = if (valueOrElse(getBoolean(stakingContract, keyBlocked()), false))
130+ then throw("Contracts are under maintenance")
131+ else unit
171132
172133
173134 @Callable(i)
174-func buyMaterials (amounts,maxPrices) = {
175- let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
176- if ((size(i.payments) != 1))
177- then throw("exactly 1 payment must be attached")
178- else {
179- let pmt = i.payments[0]
180- let amt = pmt.amount
181- let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
182- if ((pmtAssetId != usdnAssetId))
183- then throw("USDN payments only!")
135+func sellResources (amounts,minPrices) = {
136+ let blocked = checkBlocked()
137+ if ((blocked == blocked))
138+ then {
139+ let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
140+ if ((size(i.payments) != 0))
141+ then throw("sellResources doesn't require any payments")
184142 else {
185143 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
186144 if ((curLocation[locIdxType] != "F"))
187145 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
188146 else {
189147 let locId = curLocation[locIdxId]
190148 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
191- let matList = split(currentPack[bpIdxMat], "_")
192- func mUpdater (acc,j) = if ((0 > amounts[j]))
193- then throw(((("You tried to buy negative amount of " + matTypes[j]) + ": ") + toString(amounts[j])))
194- else if ((amounts[j] > 0))
195- then {
196- let b = buyInternal(locId, j, amounts[j], maxPrices[j])
197- $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(matList[j]) + b._3))), (acc._3 + b._2))
198- }
199- else $Tuple3(acc._1, (acc._2 :+ matList[j]), acc._3)
149+ let resList = split(currentPack[bpIdxRes], "_")
150+ func adder (acc,j) = if ((amounts[j] > parseIntValue(resList[j])))
151+ then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to sell ") + toString(amounts[j])))
152+ else if ((0 > amounts[j]))
153+ then throw(((("You tried to sell negative amount of " + resTypes[j]) + ": ") + toString(amounts[j])))
154+ else if ((amounts[j] > 0))
155+ then {
156+ let b = sellInternal(locId, j, amounts[j], minPrices[j])
157+ $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(resList[j]) - amounts[j]))), (acc._3 + b._2))
158+ }
159+ else $Tuple3(acc._1, (acc._2 :+ resList[j]), acc._3)
200160
201161 let merged = {
202162 let $l = [0, 1, 2, 3, 4, 5]
203163 let $s = size($l)
204164 let $acc0 = $Tuple3(nil, nil, 0)
205165 func $f0_1 ($a,$i) = if (($i >= $s))
206166 then $a
207- else mUpdater($a, $l[$i])
167+ else adder($a, $l[$i])
208168
209169 func $f0_2 ($a,$i) = if (($i >= $s))
210170 then $a
211171 else throw("List size exceeds 6")
212172
213173 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
214174 }
215- if ((merged._3 > amt))
216- then throw(((("Insufficient payment! Attached=" + toString(amt)) + ", required=") + toString(merged._3)))
175+ let newPack = makeString([currentPack[bpIdxLevel], makeString(merged._2, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
176+ let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
177+ $Tuple2((merged._1 :+ ScriptTransfer(i.caller, merged._3, usdnAssetId)), result)
178+ }
179+ }
180+ }
181+ else throw("Strict value is not equal to itself.")
182+ }
183+
184+
185+
186+@Callable(i)
187+func buyMaterials (amounts,maxPrices) = {
188+ let blocked = checkBlocked()
189+ if ((blocked == blocked))
190+ then {
191+ let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
192+ if ((size(i.payments) != 1))
193+ then throw("exactly 1 payment must be attached")
194+ else {
195+ let pmt = i.payments[0]
196+ let amt = pmt.amount
197+ let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
198+ if ((pmtAssetId != usdnAssetId))
199+ then throw("USDN payments only!")
200+ else {
201+ let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
202+ if ((curLocation[locIdxType] != "F"))
203+ then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
217204 else {
218- let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged._2, "_"), currentPack[bpIdxProd]], ":")
219- let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
220- let rest = if (((amt - merged._3) > 0))
221- then [ScriptTransfer(i.caller, (amt - merged._3), usdnAssetId)]
222- else nil
223- $Tuple2((merged._1 ++ rest), result)
205+ let locId = curLocation[locIdxId]
206+ let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
207+ let matList = split(currentPack[bpIdxMat], "_")
208+ func mUpdater (acc,j) = if ((0 > amounts[j]))
209+ then throw(((("You tried to buy negative amount of " + matTypes[j]) + ": ") + toString(amounts[j])))
210+ else if ((amounts[j] > 0))
211+ then {
212+ let b = buyInternal(locId, j, amounts[j], maxPrices[j])
213+ $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(matList[j]) + b._3))), (acc._3 + b._2))
214+ }
215+ else $Tuple3(acc._1, (acc._2 :+ matList[j]), acc._3)
216+
217+ let merged = {
218+ let $l = [0, 1, 2, 3, 4, 5]
219+ let $s = size($l)
220+ let $acc0 = $Tuple3(nil, nil, 0)
221+ func $f0_1 ($a,$i) = if (($i >= $s))
222+ then $a
223+ else mUpdater($a, $l[$i])
224+
225+ func $f0_2 ($a,$i) = if (($i >= $s))
226+ then $a
227+ else throw("List size exceeds 6")
228+
229+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
230+ }
231+ if ((merged._3 > amt))
232+ then throw(((("Insufficient payment! Attached=" + toString(amt)) + ", required=") + toString(merged._3)))
233+ else {
234+ let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged._2, "_"), currentPack[bpIdxProd]], ":")
235+ let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
236+ let rest = if (((amt - merged._3) > 0))
237+ then [ScriptTransfer(i.caller, (amt - merged._3), usdnAssetId)]
238+ else nil
239+ $Tuple2((merged._1 ++ rest), result)
240+ }
224241 }
225242 }
226243 }
227244 }
245+ else throw("Strict value is not equal to itself.")
228246 }
229247
230248

github/deemru/w8io/169f3d6 
49.84 ms