tx · B9qtHUB1u6bPNGS6AyHsk1ZYCRaK5Yx1o82XvZ5ZsAVd

3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep:  -0.01100000 Waves

2022.12.15 20:45 [2361748] smart account 3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep > SELF 0.00000000 Waves

{ "type": 13, "id": "B9qtHUB1u6bPNGS6AyHsk1ZYCRaK5Yx1o82XvZ5ZsAVd", "fee": 1100000, "feeAssetId": null, "timestamp": 1671126384583, "version": 2, "chainId": 84, "sender": "3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep", "senderPublicKey": "7v5L7QkXxfkirALdyqmox38QCsa9jtfAtgUfHTh34eWq", "proofs": [ "52YTBvea8YxZWrW2Rie1G1hL69WxcXCJrSSNYJWgNFZokE42iTigKqg9qpYMnBokdAiUy7epwH9dBrapdC4Dp6r3" ], "script": "base64:BgIcCAISBQoDAQEBEgQKAhEREgUKAwEBARIECgIRER0ABU1VTFQ2AMCEPQAFTVVMVDgAgMLXLwAFY2hhaW4JALAJAQkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQALdXNkbkFzc2V0SWQEByRtYXRjaDAFBWNoYWluAwkAAAICAVcFByRtYXRjaDABILYmKcME9c5TkaQOS3UkL2SMUbH6369UKb1I0h0qsqrRAwkAAAICAVQFByRtYXRjaDABIPd26vf3g8pl224T7gI7z1gplanB0Y3yS9ps2B1igMjeCQACAQINVW5rbm93biBjaGFpbgAPc3Rha2luZ0NvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBBAckbWF0Y2gwBQVjaGFpbgMJAAACAgFXBQckbWF0Y2gwAiMzUExuY1h0UzFVODNENmNRYkZEM0g4ckJIUExnenhTRktaMQMJAAACAgFUBQckbWF0Y2gwAiMzTkRDeUJHNXE4NUp1YVJpaWdVZUV0YWlueWpDUVQzWHBabQkAAgECDVVua25vd24gY2hhaW4AD0RFRkFVTFRMT0NBVElPTgIPQWZyaWNhX0ZfQWZyaWNhAAZOVU1SRVMABgATRkFDVE9SWU1BWFdBUkVIT1VTRQCAyK+gJQAQUkVTT1VSQ0VQUklDRU1JTgDV1gkACk1JTlBBWU1FTlQAkE4ACHJlc1R5cGVzCQDMCAICA09pbAkAzAgCAgNPcmUJAMwIAgIEV29vZAkAzAgCAgRTYW5kCQDMCAICBENsYXkJAMwIAgIHT3JnYW5pYwUDbmlsAAhtYXRUeXBlcwkAzAgCAgRGdWVsCQDMCAICBU1ldGFsCQDMCAICBVBsYW5rCQDMCAICBUdsYXNzCQDMCAICB1BsYXN0aWMJAMwIAgIHUHJvdGVpbgUDbmlsAApjb250aW5lbnRzCQDMCAICCEFtZXJpY2FzCQDMCAICBkV1cm9wZQkAzAgCAgRBc2lhCQDMCAICBkFmcmljYQkAzAgCAgdPY2VhbmlhBQNuaWwBHmtleUZhY3RvcnlXYXJlaG91c2VCeUlkQW5kVHlwZQIJZmFjdG9yeUlkB3Jlc1R5cGUJAKwCAgkArAICCQCsAgICG2ZhY3RvcnlXaEJ5Q29udGluZW50QW5kUmVzXwUJZmFjdG9yeUlkAgFfCQCkAwEFB3Jlc1R5cGUBFGtleVN0YWtlZER1Y2tCeU93bmVyAQlvd25lckFkZHIJAKwCAgISc3Rha2VkRHVja0J5T3duZXJfBQlvd25lckFkZHIBEWtleUJhY2twYWNrQnlEdWNrAQtkdWNrQXNzZXRJZAkArAICAgliYWNrUGFja18FC2R1Y2tBc3NldElkAQ9rZXlEdWNrTG9jYXRpb24BC2R1Y2tBc3NldElkCQCsAgICDWR1Y2tMb2NhdGlvbl8FC2R1Y2tBc3NldElkAA9sb2NJZHhDb250aW5lbnQAAAAKbG9jSWR4VHlwZQABAAhsb2NJZHhJZAACAApicElkeExldmVsAAAACGJwSWR4UmVzAAEACGJwSWR4TWF0AAIACWJwSWR4UHJvZAADAQhhc1N0cmluZwEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAFAXMJAAIBAhhmYWlsIHRvIGNhc3QgaW50byBTdHJpbmcBBnN1YlJlcwMHcmVzTGlzdAdyZXNUeXBlBmFtb3VudAoBBnN1YmJlcgIDYWNjAWkJAM0IAgUDYWNjAwkAAAIFAWkFB3Jlc1R5cGUJAKQDAQkAZQIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXNMaXN0BQFpBQZhbW91bnQJAJEDAgUHcmVzTGlzdAUBaQQBcgoAAiRsCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFBQNuaWwKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBnN1YmJlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgkAuQkCBQFyAgFfAQZhZGRNYXQDB21hdExpc3QHbWF0VHlwZQZhbW91bnQKAQlpbmNyZWFzZXICA2FjYwFpCQDNCAIFA2FjYwMJAAACBQFpBQdt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B21hdFR5cGUCASkJAJUKAwkBDEludGVnZXJFbnRyeQIFBXdoS2V5CQBlAgUCdzAFAW0FCXVzZG5TcGVudAUBbQQBaQEMc2VsbFJlc291cmNlAwdyZXNUeXBlBmFtb3VudAhtaW5QcmljZQMDCQBmAgAABQdyZXNUeXBlBgkAZwIFB3Jlc1R5cGUFBk5VTVJFUwkAAgEJAKwCAgISVW5rbm93biByZXNvdXJjZTogCQCkAwEFB3Jlc1R5cGUDCQBnAgAABQZhbW91bnQJAAIBCQCsAgICG0Ftb3VudCBzaG91bGQgYmUgcG9zaXRpdmUhIAkApAMBBQZhbW91bnQEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAAkAAgECKnNlbGxSZXNvdXJjZXMgZG9lc24ndCByZXF1aXJlIGFueSBwYXltZW50cwQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBRgkAAgEJAKwCAgItRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBGYWN0b3J5LCBidXQgaXMgCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlBAtjdXJyZW50UGFjawkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQCGjA6MF8wXzBfMF8wXzA6MF8wXzBfMF8wXzA6AgE6BAdyZXNMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzAgFfBApjdXJyZW50UmVzCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHcmVzTGlzdAUHcmVzVHlwZQMJAGYCBQZhbW91bnQFCmN1cnJlbnRSZXMJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJWW91IGhhdmUgCQCkAwEFCmN1cnJlbnRSZXMCBCBvZiAJAJEDAgUIcmVzVHlwZXMFB3Jlc1R5cGUCICBpbiBiYWNrcGFjaywgYnV0IHRyaWVkIHRvIHNlbGwgCQCkAwEFBmFtb3VudAQBYgkBDHNlbGxJbnRlcm5hbAQJAJEDAgULY3VyTG9jYXRpb24FCGxvY0lkeElkBQdyZXNUeXBlBQZhbW91bnQFCG1pblByaWNlBAVicFJlcwkBBnN1YlJlcwMFB3Jlc0xpc3QFB3Jlc1R5cGUFBmFtb3VudAQHbmV3UGFjawkAuQkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgUFYnBSZXMJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwCAToEBnJlc3VsdAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB25ld1BhY2sFA25pbAUDbmlsCQCUCgIJAMwIAggFAWICXzEJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCAUBYgJfMgULdXNkbkFzc2V0SWQFA25pbAUGcmVzdWx0AWkBDXNlbGxSZXNvdXJjZXMCCHJlc1R5cGVzCW1pblByaWNlcwQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIqc2VsbFJlc291cmNlcyBkb2Vzbid0IHJlcXVpcmUgYW55IHBheW1lbnRzBAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8DCQECIT0CCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlAgFGCQACAQkArAICAi1EdWNrIGxvY2F0aW9uIHR5cGUgc2hvdWxkIGJlIEZhY3RvcnksIGJ1dCBpcyAJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUEBWxvY0lkCQCRAwIFC2N1ckxvY2F0aW9uBQhsb2NJZHhJZAQLY3VycmVudFBhY2sJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkAhowOjBfMF8wXzBfMF8wOjBfMF8wXzBfMF8wOgIBOgQHcmVzTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwoBBWFkZGVyAgNhY2MDaWR4BAFqCQDPCAIFCHJlc1R5cGVzBQNpZHgDCQEJaXNEZWZpbmVkAQUBagQBYgkBDHNlbGxJbnRlcm5hbAQFBWxvY0lkBQNpZHgJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXNMaXN0BQNpZHgJAJEDAgUJbWluUHJpY2VzCQEFdmFsdWUBBQFqCQCVCgMJAM0IAggFA2FjYwJfMQgFAWICXzEJAM0IAggFA2FjYwJfMgIBMAkAZAIIBQNhY2MCXzMIBQFiAl8yCQCVCgMIBQNhY2MCXzEJAM0IAggFA2FjYwJfMgkAkQMCBQdyZXNMaXN0BQNpZHgIBQNhY2MCXzMEBm1lcmdlZAoAAiRsCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFBQNuaWwKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCVCgMFA25pbAUDbmlsAAAKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBWFkZGVyAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA2CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGBAduZXdQYWNrCQC5CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQC5CQIIBQZtZXJnZWQCXzICAV8JAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUJYnBJZHhQcm9kBQNuaWwCAToEBnJlc3VsdAkBCGFzU3RyaW5nAQkA/AcEBQ9zdGFraW5nQ29udHJhY3QCDnVwZGF0ZUJhY2twYWNrCQDMCAIFC2R1Y2tBc3NldElkCQDMCAIFB25ld1BhY2sFA25pbAUDbmlsCQCUCgIJAM0IAggFBm1lcmdlZAJfMQkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCAUGbWVyZ2VkAl8zBQt1c2RuQXNzZXRJZAUGcmVzdWx0AWkBC2J1eU1hdGVyaWFsAwdtYXRUeXBlBmFtb3VudAhtYXhQcmljZQMDCQBmAgAABQdtYXRUeXBlBgkAZwIFB21hdFR5cGUFBk5VTVJFUwkAAgEJAKwCAgISVW5rbm93biBtYXRlcmlhbDogCQCkAwEFB21hdFR5cGUDCQBnAgAABQZhbW91bnQJAAIBCQCsAgICG0Ftb3VudCBzaG91bGQgYmUgcG9zaXRpdmUhIAkApAMBBQZhbW91bnQEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQNwbXQHYXNzZXRJZAIeV0FWRVMgY2FuJ3QgYmUgdXNlZCBhcyBwYXltZW50AwkBAiE9AgUKcG10QXNzZXRJZAULdXNkbkFzc2V0SWQJAAIBAhNVU0ROIHBheW1lbnRzIG9ubHkhBAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8DCQECIT0CCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlAgFGCQACAQkArAICAi1EdWNrIGxvY2F0aW9uIHR5cGUgc2hvdWxkIGJlIEZhY3RvcnksIGJ1dCBpcyAJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUEC2N1cnJlbnRQYWNrCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAIaMDowXzBfMF8wXzBfMDowXzBfMF8wXzBfMDoCAToEB21hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8ECmN1cnJlbnRNYXQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdtYXRMaXN0BQdtYXRUeXBlBAFiCQELYnV5SW50ZXJuYWwECQCRAwIFC2N1ckxvY2F0aW9uBQhsb2NJZHhJZAUHbWF0VHlwZQUGYW1vdW50BQhtYXhQcmljZQMJAGYCCAUBYgJfMgUDYW10CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhBZb3VyIHNwZW5kaW5nID0gCQCkAwEIBQFiAl8yAgogVVNETiBmb3IgCQCkAwEIBQFiAl8zAgQgb2YgCQCRAwIFCG1hdFR5cGVzBQdtYXRUeXBlAhkgaXMgPiBhdHRhY2hlZCBwYXltZW50ID0gCQCkAwEFA2FtdAMJAGYCBQpNSU5QQVlNRU5UCAUBYgJfMgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIQWW91ciBzcGVuZGluZyA9IAkApAMBCAUBYgJfMgIKIFVTRE4gZm9yIAkApAMBCAUBYgJfMwIEIG9mIAkAkQMCBQhtYXRUeXBlcwUHbWF0VHlwZQIQIGlzIDwgbWluaW1hbCA9IAkApAMBBQpNSU5QQVlNRU5UBAVicE1hdAkBBmFkZE1hdAMFB21hdExpc3QFB21hdFR5cGUIBQFiAl8zBAduZXdQYWNrCQC5CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwkAzAgCBQVicE1hdAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgQGcmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHbmV3UGFjawUDbmlsBQNuaWwEBHJlc3QDCQBmAgkAZQIFA2FtdAgFAWICXzIAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCBQNhbXQIBQFiAl8yBQt1c2RuQXNzZXRJZAUDbmlsBQNuaWwJAJQKAgkAzQgCBQRyZXN0CAUBYgJfMQUGcmVzdWx0AWkBDGJ1eU1hdGVyaWFscwIHYW1vdW50cwltYXhQcmljZXMEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQNwbXQHYXNzZXRJZAIeV0FWRVMgY2FuJ3QgYmUgdXNlZCBhcyBwYXltZW50AwkBAiE9AgUKcG10QXNzZXRJZAULdXNkbkFzc2V0SWQJAAIBAhNVU0ROIHBheW1lbnRzIG9ubHkhBAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8DCQECIT0CCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlAgFGCQACAQkArAICAi1EdWNrIGxvY2F0aW9uIHR5cGUgc2hvdWxkIGJlIEZhY3RvcnksIGJ1dCBpcyAJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUEBWxvY0lkCQCRAwIFC2N1ckxvY2F0aW9uBQhsb2NJZHhJZAQLY3VycmVudFBhY2sJALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkAhowOjBfMF8wXzBfMF8wOjBfMF8wXzBfMF8wOgIBOgQHbWF0TGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeE1hdAIBXwoBCG1VcGRhdGVyAgNhY2MBagMJAGYCCQCRAwIFB2Ftb3VudHMFAWoAAAQBYgkBC2J1eUludGVybmFsBAUFbG9jSWQFAWoJAJEDAgUHYW1vdW50cwUBagkAkQMCBQltYXhQcmljZXMFAWoJAJUKAwkAzQgCCAUDYWNjAl8xCAUBYgJfMQkAzQgCCAUDYWNjAl8yCQCkAwEJAGQCCQENcGFyc2VJbnRWYWx1ZQEJAJEDAgUHbWF0TGlzdAUBaggFAWICXzMJAGQCCAUDYWNjAl8zCAUBYgJfMgkAlQoDCAUDYWNjAl8xCQDNCAIIBQNhY2MCXzIJAJEDAgUHbWF0TGlzdAUBaggFA2FjYwJfMwQGbWVyZ2VkCgACJGwJAMwIAgAACQDMCAIAAQkAzAgCAAIJAMwIAgADCQDMCAIABAkAzAgCAAUFA25pbAoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUDbmlsBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEIbVVwZGF0ZXICBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECE0xpc3Qgc2l6ZSBleGNlZWRzIDYJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYDCQBmAggFBm1lcmdlZAJfMwUDYW10CQACAQkArAICCQCsAgIJAKwCAgIfSW5zdWZmaWNpZW50IHBheW1lbnQhIEF0dGFjaGVkPQkApAMBBQNhbXQCCywgcmVxdWlyZWQ9CQCkAwEIBQZtZXJnZWQCXzMEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzCQDMCAIJALkJAggFBm1lcmdlZAJfMgIBXwkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgQGcmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHbmV3UGFjawUDbmlsBQNuaWwEBHJlc3QDCQBmAgkAZQIFA2FtdAgFBm1lcmdlZAJfMwAACQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcgkAZQIFA2FtdAgFBm1lcmdlZAJfMwULdXNkbkFzc2V0SWQFA25pbAUDbmlsCQCUCgIJAM4IAggFBm1lcmdlZAJfMQUEcmVzdAUGcmVzdWx0AK6KpCs=", "height": 2361748, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: GWecBuefRy863qXkyR1zwKtQE3w1fyEKp1SyNcxEnAC4 Next: 6p4KtqPMjd65JpcEk7jao7JR9RgZCYo1KSmVyesZPZcv Diff:
OldNewDifferences
278278 }
279279
280280
281+
282+@Callable(i)
283+func buyMaterials (amounts,maxPrices) = {
284+ let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
285+ if ((size(i.payments) != 1))
286+ then throw("exactly 1 payment must be attached")
287+ else {
288+ let pmt = i.payments[0]
289+ let amt = pmt.amount
290+ let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
291+ if ((pmtAssetId != usdnAssetId))
292+ then throw("USDN payments only!")
293+ else {
294+ let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
295+ if ((curLocation[locIdxType] != "F"))
296+ then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
297+ else {
298+ let locId = curLocation[locIdxId]
299+ let currentPack = split(valueOrElse(getString(stakingContract, keyBackpackByDuck(duckAssetId)), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
300+ let matList = split(currentPack[bpIdxMat], "_")
301+ func mUpdater (acc,j) = if ((amounts[j] > 0))
302+ then {
303+ let b = buyInternal(locId, j, amounts[j], maxPrices[j])
304+ $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(matList[j]) + b._3))), (acc._3 + b._2))
305+ }
306+ else $Tuple3(acc._1, (acc._2 :+ matList[j]), acc._3)
307+
308+ let merged = {
309+ let $l = [0, 1, 2, 3, 4, 5]
310+ let $s = size($l)
311+ let $acc0 = $Tuple3(nil, nil, 0)
312+ func $f0_1 ($a,$i) = if (($i >= $s))
313+ then $a
314+ else mUpdater($a, $l[$i])
315+
316+ func $f0_2 ($a,$i) = if (($i >= $s))
317+ then $a
318+ else throw("List size exceeds 6")
319+
320+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
321+ }
322+ if ((merged._3 > amt))
323+ then throw(((("Insufficient payment! Attached=" + toString(amt)) + ", required=") + toString(merged._3)))
324+ else {
325+ let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged._2, "_"), currentPack[bpIdxProd]], ":")
326+ let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
327+ let rest = if (((amt - merged._3) > 0))
328+ then [ScriptTransfer(i.caller, (amt - merged._3), usdnAssetId)]
329+ else nil
330+ $Tuple2((merged._1 ++ rest), result)
331+ }
332+ }
333+ }
334+ }
335+ }
336+
337+
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 chain = toUtf8String(take(drop(this.bytes, 1), 1))
99
1010 let usdnAssetId = match chain {
1111 case _ =>
1212 if (("W" == $match0))
1313 then base58'DG2xFkPdDwKUoBkzGAhQtLpSGzfXLiCYPEzeKH2Ad24p'
1414 else if (("T" == $match0))
1515 then base58'HezsdQuRDtzksAYUy97gfhKy7Z1NW2uXYSHA3bgqenNZ'
1616 else throw("Unknown chain")
1717 }
1818
1919 let stakingContract = addressFromStringValue(match chain {
2020 case _ =>
2121 if (("W" == $match0))
2222 then "3PLncXtS1U83D6cQbFD3H8rBHPLgzxSFKZ1"
2323 else if (("T" == $match0))
2424 then "3NDCyBG5q85JuaRiigUeEtainyjCQT3XpZm"
2525 else throw("Unknown chain")
2626 })
2727
2828 let DEFAULTLOCATION = "Africa_F_Africa"
2929
3030 let NUMRES = 6
3131
3232 let FACTORYMAXWAREHOUSE = 10000000000
3333
3434 let RESOURCEPRICEMIN = 158549
3535
3636 let MINPAYMENT = 10000
3737
3838 let resTypes = ["Oil", "Ore", "Wood", "Sand", "Clay", "Organic"]
3939
4040 let matTypes = ["Fuel", "Metal", "Plank", "Glass", "Plastic", "Protein"]
4141
4242 let continents = ["Americas", "Europe", "Asia", "Africa", "Oceania"]
4343
4444 func keyFactoryWarehouseByIdAndType (factoryId,resType) = ((("factoryWhByContinentAndRes_" + factoryId) + "_") + toString(resType))
4545
4646
4747 func keyStakedDuckByOwner (ownerAddr) = ("stakedDuckByOwner_" + ownerAddr)
4848
4949
5050 func keyBackpackByDuck (duckAssetId) = ("backPack_" + duckAssetId)
5151
5252
5353 func keyDuckLocation (duckAssetId) = ("duckLocation_" + duckAssetId)
5454
5555
5656 let locIdxContinent = 0
5757
5858 let locIdxType = 1
5959
6060 let locIdxId = 2
6161
6262 let bpIdxLevel = 0
6363
6464 let bpIdxRes = 1
6565
6666 let bpIdxMat = 2
6767
6868 let bpIdxProd = 3
6969
7070 func asString (v) = match v {
7171 case s: String =>
7272 s
7373 case _ =>
7474 throw("fail to cast into String")
7575 }
7676
7777
7878 func subRes (resList,resType,amount) = {
7979 func subber (acc,i) = (acc :+ (if ((i == resType))
8080 then toString((parseIntValue(resList[i]) - amount))
8181 else resList[i]))
8282
8383 let r = {
8484 let $l = [0, 1, 2, 3, 4, 5]
8585 let $s = size($l)
8686 let $acc0 = nil
8787 func $f0_1 ($a,$i) = if (($i >= $s))
8888 then $a
8989 else subber($a, $l[$i])
9090
9191 func $f0_2 ($a,$i) = if (($i >= $s))
9292 then $a
9393 else throw("List size exceeds 6")
9494
9595 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
9696 }
9797 makeString(r, "_")
9898 }
9999
100100
101101 func addMat (matList,matType,amount) = {
102102 func increaser (acc,i) = (acc :+ (if ((i == matType))
103103 then toString((parseIntValue(matList[i]) + amount))
104104 else matList[i]))
105105
106106 let m = {
107107 let $l = [0, 1, 2, 3, 4, 5]
108108 let $s = size($l)
109109 let $acc0 = nil
110110 func $f0_1 ($a,$i) = if (($i >= $s))
111111 then $a
112112 else increaser($a, $l[$i])
113113
114114 func $f0_2 ($a,$i) = if (($i >= $s))
115115 then $a
116116 else throw("List size exceeds 6")
117117
118118 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
119119 }
120120 makeString(m, "_")
121121 }
122122
123123
124124 func sellInternal (locId,resType,amount,minPrice) = {
125125 let whKey = keyFactoryWarehouseByIdAndType(locId, resType)
126126 let w0 = valueOrElse(getInteger(whKey), 0)
127127 let r0 = if ((w0 > FACTORYMAXWAREHOUSE))
128128 then 0
129129 else if (((w0 + amount) > FACTORYMAXWAREHOUSE))
130130 then (FACTORYMAXWAREHOUSE - w0)
131131 else amount
132132 let usdnReceived = (fraction(r0, ((2 * RESOURCEPRICEMIN) - fraction((w0 + (r0 / 2)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT8) + fraction((amount - r0), RESOURCEPRICEMIN, MULT8))
133133 let min99 = (minPrice - (minPrice / 100))
134134 if (((min99 * amount) > (usdnReceived * MULT8)))
135135 then throw((((((((((("Actual price = " + toString(usdnReceived)) + " / ") + toString(amount)) + " < minPrice = ") + toString(minPrice)) + ", (") + locId) + ", ") + resTypes[resType]) + ")"))
136136 else $Tuple2(IntegerEntry(whKey, (w0 + amount)), usdnReceived)
137137 }
138138
139139
140140 func buyInternal (locId,matType,amount,maxPrice) = {
141141 let whKey = keyFactoryWarehouseByIdAndType(locId, matType)
142142 let w0 = valueOrElse(getInteger(whKey), 0)
143143 let m1 = if ((w0 > FACTORYMAXWAREHOUSE))
144144 then min([amount, (w0 - FACTORYMAXWAREHOUSE)])
145145 else 0
146146 let m0 = min([w0, (amount - m1)])
147147 let m = (m0 + m1)
148148 let usdnSpent = (fraction(m0, ((3 * RESOURCEPRICEMIN) - fraction((w0 - (m0 / 2)), RESOURCEPRICEMIN, FACTORYMAXWAREHOUSE)), MULT8) + fraction(m1, (2 * RESOURCEPRICEMIN), MULT8))
149149 let max101 = (maxPrice + (maxPrice / 100))
150150 if (((usdnSpent * MULT8) > (max101 * m)))
151151 then throw((((((((((("Actual price = " + toString(usdnSpent)) + " / ") + toString(m)) + " > maxPrice = ") + toString(maxPrice)) + ", (") + locId) + ", ") + matTypes[matType]) + ")"))
152152 else $Tuple3(IntegerEntry(whKey, (w0 - m)), usdnSpent, m)
153153 }
154154
155155
156156 @Callable(i)
157157 func sellResource (resType,amount,minPrice) = if (if ((0 > resType))
158158 then true
159159 else (resType >= NUMRES))
160160 then throw(("Unknown resource: " + toString(resType)))
161161 else if ((0 >= amount))
162162 then throw(("Amount should be positive! " + toString(amount)))
163163 else {
164164 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
165165 if ((size(i.payments) != 0))
166166 then throw("sellResources doesn't require any payments")
167167 else {
168168 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
169169 if ((curLocation[locIdxType] != "F"))
170170 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
171171 else {
172172 let currentPack = split(valueOrElse(getString(stakingContract, keyBackpackByDuck(duckAssetId)), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
173173 let resList = split(currentPack[bpIdxRes], "_")
174174 let currentRes = parseIntValue(resList[resType])
175175 if ((amount > currentRes))
176176 then throw(((((("You have " + toString(currentRes)) + " of ") + resTypes[resType]) + " in backpack, but tried to sell ") + toString(amount)))
177177 else {
178178 let b = sellInternal(curLocation[locIdxId], resType, amount, minPrice)
179179 let bpRes = subRes(resList, resType, amount)
180180 let newPack = makeString([currentPack[bpIdxLevel], bpRes, currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
181181 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
182182 $Tuple2([b._1, ScriptTransfer(i.caller, b._2, usdnAssetId)], result)
183183 }
184184 }
185185 }
186186 }
187187
188188
189189
190190 @Callable(i)
191191 func sellResources (resTypes,minPrices) = {
192192 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
193193 if ((size(i.payments) != 0))
194194 then throw("sellResources doesn't require any payments")
195195 else {
196196 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
197197 if ((curLocation[locIdxType] != "F"))
198198 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
199199 else {
200200 let locId = curLocation[locIdxId]
201201 let currentPack = split(valueOrElse(getString(stakingContract, keyBackpackByDuck(duckAssetId)), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
202202 let resList = split(currentPack[bpIdxRes], "_")
203203 func adder (acc,idx) = {
204204 let j = indexOf(resTypes, idx)
205205 if (isDefined(j))
206206 then {
207207 let b = sellInternal(locId, idx, parseIntValue(resList[idx]), minPrices[value(j)])
208208 $Tuple3((acc._1 :+ b._1), (acc._2 :+ "0"), (acc._3 + b._2))
209209 }
210210 else $Tuple3(acc._1, (acc._2 :+ resList[idx]), acc._3)
211211 }
212212
213213 let merged = {
214214 let $l = [0, 1, 2, 3, 4, 5]
215215 let $s = size($l)
216216 let $acc0 = $Tuple3(nil, nil, 0)
217217 func $f0_1 ($a,$i) = if (($i >= $s))
218218 then $a
219219 else adder($a, $l[$i])
220220
221221 func $f0_2 ($a,$i) = if (($i >= $s))
222222 then $a
223223 else throw("List size exceeds 6")
224224
225225 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
226226 }
227227 let newPack = makeString([currentPack[bpIdxLevel], makeString(merged._2, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
228228 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
229229 $Tuple2((merged._1 :+ ScriptTransfer(i.caller, merged._3, usdnAssetId)), result)
230230 }
231231 }
232232 }
233233
234234
235235
236236 @Callable(i)
237237 func buyMaterial (matType,amount,maxPrice) = if (if ((0 > matType))
238238 then true
239239 else (matType >= NUMRES))
240240 then throw(("Unknown material: " + toString(matType)))
241241 else if ((0 >= amount))
242242 then throw(("Amount should be positive! " + toString(amount)))
243243 else {
244244 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
245245 if ((size(i.payments) != 1))
246246 then throw("exactly 1 payment must be attached")
247247 else {
248248 let pmt = i.payments[0]
249249 let amt = pmt.amount
250250 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
251251 if ((pmtAssetId != usdnAssetId))
252252 then throw("USDN payments only!")
253253 else {
254254 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
255255 if ((curLocation[locIdxType] != "F"))
256256 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
257257 else {
258258 let currentPack = split(valueOrElse(getString(stakingContract, keyBackpackByDuck(duckAssetId)), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
259259 let matList = split(currentPack[bpIdxMat], "_")
260260 let currentMat = parseIntValue(matList[matType])
261261 let b = buyInternal(curLocation[locIdxId], matType, amount, maxPrice)
262262 if ((b._2 > amt))
263263 then throw(((((((("Your spending = " + toString(b._2)) + " USDN for ") + toString(b._3)) + " of ") + matTypes[matType]) + " is > attached payment = ") + toString(amt)))
264264 else if ((MINPAYMENT > b._2))
265265 then throw(((((((("Your spending = " + toString(b._2)) + " USDN for ") + toString(b._3)) + " of ") + matTypes[matType]) + " is < minimal = ") + toString(MINPAYMENT)))
266266 else {
267267 let bpMat = addMat(matList, matType, b._3)
268268 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], bpMat, currentPack[bpIdxProd]], ":")
269269 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
270270 let rest = if (((amt - b._2) > 0))
271271 then [ScriptTransfer(i.caller, (amt - b._2), usdnAssetId)]
272272 else nil
273273 $Tuple2((rest :+ b._1), result)
274274 }
275275 }
276276 }
277277 }
278278 }
279279
280280
281+
282+@Callable(i)
283+func buyMaterials (amounts,maxPrices) = {
284+ let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
285+ if ((size(i.payments) != 1))
286+ then throw("exactly 1 payment must be attached")
287+ else {
288+ let pmt = i.payments[0]
289+ let amt = pmt.amount
290+ let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
291+ if ((pmtAssetId != usdnAssetId))
292+ then throw("USDN payments only!")
293+ else {
294+ let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
295+ if ((curLocation[locIdxType] != "F"))
296+ then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
297+ else {
298+ let locId = curLocation[locIdxId]
299+ let currentPack = split(valueOrElse(getString(stakingContract, keyBackpackByDuck(duckAssetId)), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
300+ let matList = split(currentPack[bpIdxMat], "_")
301+ func mUpdater (acc,j) = if ((amounts[j] > 0))
302+ then {
303+ let b = buyInternal(locId, j, amounts[j], maxPrices[j])
304+ $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(matList[j]) + b._3))), (acc._3 + b._2))
305+ }
306+ else $Tuple3(acc._1, (acc._2 :+ matList[j]), acc._3)
307+
308+ let merged = {
309+ let $l = [0, 1, 2, 3, 4, 5]
310+ let $s = size($l)
311+ let $acc0 = $Tuple3(nil, nil, 0)
312+ func $f0_1 ($a,$i) = if (($i >= $s))
313+ then $a
314+ else mUpdater($a, $l[$i])
315+
316+ func $f0_2 ($a,$i) = if (($i >= $s))
317+ then $a
318+ else throw("List size exceeds 6")
319+
320+ $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
321+ }
322+ if ((merged._3 > amt))
323+ then throw(((("Insufficient payment! Attached=" + toString(amt)) + ", required=") + toString(merged._3)))
324+ else {
325+ let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged._2, "_"), currentPack[bpIdxProd]], ":")
326+ let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
327+ let rest = if (((amt - merged._3) > 0))
328+ then [ScriptTransfer(i.caller, (amt - merged._3), usdnAssetId)]
329+ else nil
330+ $Tuple2((merged._1 ++ rest), result)
331+ }
332+ }
333+ }
334+ }
335+ }
336+
337+

github/deemru/w8io/169f3d6 
49.60 ms