tx · GgKwRamX8giqs48NmXgTBX8TNQ23xeuaiFjBcG2YBDah

3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep:  -0.01100000 Waves

2022.12.25 17:47 [2375948] smart account 3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep > SELF 0.00000000 Waves

{ "type": 13, "id": "GgKwRamX8giqs48NmXgTBX8TNQ23xeuaiFjBcG2YBDah", "fee": 1100000, "feeAssetId": null, "timestamp": 1671979640108, "version": 2, "chainId": 84, "sender": "3N8y4wxX3JC4TdrCJBXX16SjWf6X256hrep", "senderPublicKey": "7v5L7QkXxfkirALdyqmox38QCsa9jtfAtgUfHTh34eWq", "proofs": [ "cnsxBKBZrrRimwyvQGrq2TLTdKnrADsxoqr5TbndDnjumJTQutqDgVvtdwpWtsEJ6Q6KJ3nDogaQoXt3o573j9b" ], "script": "base64:BgIcCAISBQoDAQEBEgQKAhEREgUKAwEBARIECgIRER4ABU1VTFQ2AMCEPQAFTVVMVDgAgMLXLwAFY2hhaW4JALAJAQkAyQECCQDKAQIIBQR0aGlzBWJ5dGVzAAEAAQALdXNkbkFzc2V0SWQEByRtYXRjaDAFBWNoYWluAwkAAAICAVcFByRtYXRjaDABILYmKcME9c5TkaQOS3UkL2SMUbH6369UKb1I0h0qsqrRAwkAAAICAVQFByRtYXRjaDABIPd26vf3g8pl224T7gI7z1gplanB0Y3yS9ps2B1igMjeCQACAQINVW5rbm93biBjaGFpbgAPc3Rha2luZ0NvbnRyYWN0CQERQGV4dHJOYXRpdmUoMTA2MikBBAckbWF0Y2gwBQVjaGFpbgMJAAACAgFXBQckbWF0Y2gwAiMzUExuY1h0UzFVODNENmNRYkZEM0g4ckJIUExnenhTRktaMQMJAAACAgFUBQckbWF0Y2gwAiMzTkRDeUJHNXE4NUp1YVJpaWdVZUV0YWlueWpDUVQzWHBabQkAAgECDVVua25vd24gY2hhaW4AD0RFRkFVTFRMT0NBVElPTgIPQWZyaWNhX0ZfQWZyaWNhAAZOVU1SRVMABgATRkFDVE9SWU1BWFdBUkVIT1VTRQCAyK+gJQAQUkVTT1VSQ0VQUklDRU1JTgDV1gkACk1JTlBBWU1FTlQAkE4ACHJlc1R5cGVzCQDMCAICA09pbAkAzAgCAgNPcmUJAMwIAgIEV29vZAkAzAgCAgRTYW5kCQDMCAICBENsYXkJAMwIAgIHT3JnYW5pYwUDbmlsAAhtYXRUeXBlcwkAzAgCAgRGdWVsCQDMCAICBU1ldGFsCQDMCAICBVBsYW5rCQDMCAICBUdsYXNzCQDMCAICB1BsYXN0aWMJAMwIAgIHUHJvdGVpbgUDbmlsAApjb250aW5lbnRzCQDMCAICCEFtZXJpY2FzCQDMCAICBkV1cm9wZQkAzAgCAgRBc2lhCQDMCAICBkFmcmljYQkAzAgCAgdPY2VhbmlhBQNuaWwBHmtleUZhY3RvcnlXYXJlaG91c2VCeUlkQW5kVHlwZQIJZmFjdG9yeUlkB3Jlc1R5cGUJAKwCAgkArAICCQCsAgICG2ZhY3RvcnlXaEJ5Q29udGluZW50QW5kUmVzXwUJZmFjdG9yeUlkAgFfCQCkAwEFB3Jlc1R5cGUBFGtleVN0YWtlZER1Y2tCeU93bmVyAQlvd25lckFkZHIJAKwCAgISc3Rha2VkRHVja0J5T3duZXJfBQlvd25lckFkZHIBEWtleUJhY2twYWNrQnlEdWNrAQtkdWNrQXNzZXRJZAkArAICAgliYWNrUGFja18FC2R1Y2tBc3NldElkAQ9rZXlEdWNrTG9jYXRpb24BC2R1Y2tBc3NldElkCQCsAgICDWR1Y2tMb2NhdGlvbl8FC2R1Y2tBc3NldElkAA9sb2NJZHhDb250aW5lbnQAAAAKbG9jSWR4VHlwZQABAAhsb2NJZHhJZAACAApicElkeExldmVsAAAACGJwSWR4UmVzAAEACGJwSWR4TWF0AAIACWJwSWR4UHJvZAADAQhhc1N0cmluZwEBdgQHJG1hdGNoMAUBdgMJAAECBQckbWF0Y2gwAgZTdHJpbmcEAXMFByRtYXRjaDAFAXMJAAIBAhhmYWlsIHRvIGNhc3QgaW50byBTdHJpbmcBBnN1YlJlcwMHcmVzTGlzdAdyZXNUeXBlBmFtb3VudAoBBnN1YmJlcgIDYWNjAWkJAM0IAgUDYWNjAwkAAAIFAWkFB3Jlc1R5cGUJAKQDAQkAZQIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdyZXNMaXN0BQFpBQZhbW91bnQJAJEDAgUHcmVzTGlzdAUBaQQBcgoAAiRsCQDMCAIAAAkAzAgCAAEJAMwIAgACCQDMCAIAAwkAzAgCAAQJAMwIAgAFBQNuaWwKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBBnN1YmJlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgkAuQkCBQFyAgFfAQZhZGRNYXQDB21hdExpc3QHbWF0VHlwZQZhbW91bnQKAQlpbmNyZWFzZXICA2FjYwFpCQDNCAIFA2FjYwMJAAACBQFpBQdt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B21hdFR5cGUCASkJAJUKAwkBDEludGVnZXJFbnRyeQIFBXdoS2V5CQBlAgUCdzAFAW0FCXVzZG5TcGVudAUBbQELZ2V0QmFja3BhY2sBBWJwS2V5BAFwCQC1CQIJAQt2YWx1ZU9yRWxzZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0BQVicEtleQIaMDowXzBfMF8wXzBfMDowXzBfMF8wXzBfMDoCAToJAMwIAgkApAMBCQELdmFsdWVPckVsc2UCCQC2CQEJAJEDAgUBcAUKYnBJZHhMZXZlbAAACQDMCAIDCQAAAgkAkAMBCQC1CQIJAJEDAgUBcAUIYnBJZHhSZXMCAV8FBk5VTVJFUwkAkQMCBQFwBQhicElkeFJlcwILMF8wXzBfMF8wXzAJAMwIAgMJAAACCQCQAwEJALUJAgkAkQMCBQFwBQhicElkeE1hdAIBXwUGTlVNUkVTCQCRAwIFAXAFCGJwSWR4TWF0AgswXzBfMF8wXzBfMAkAzAgCCQCRAwIFAXAFCWJwSWR4UHJvZAUDbmlsBAFpAQxzZWxsUmVzb3VyY2UDB3Jlc1R5cGUGYW1vdW50CG1pblByaWNlAwMJAGYCAAAFB3Jlc1R5cGUGCQBnAgUHcmVzVHlwZQUGTlVNUkVTCQACAQkArAICAhJVbmtub3duIHJlc291cmNlOiAJAKQDAQUHcmVzVHlwZQMJAGcCAAAFBmFtb3VudAkAAgEJAKwCAgIbQW1vdW50IHNob3VsZCBiZSBwb3NpdGl2ZSEgCQCkAwEFBmFtb3VudAQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIqc2VsbFJlc291cmNlcyBkb2Vzbid0IHJlcXVpcmUgYW55IHBheW1lbnRzBAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8DCQECIT0CCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlAgFGCQACAQkArAICAi1EdWNrIGxvY2F0aW9uIHR5cGUgc2hvdWxkIGJlIEZhY3RvcnksIGJ1dCBpcyAJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUEC2N1cnJlbnRQYWNrCQELZ2V0QmFja3BhY2sBCQERa2V5QmFja3BhY2tCeUR1Y2sBBQtkdWNrQXNzZXRJZAQHcmVzTGlzdAkAtQkCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwIBXwQKY3VycmVudFJlcwkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFB3Jlc1R5cGUDCQBmAgUGYW1vdW50BQpjdXJyZW50UmVzCQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgICCVlvdSBoYXZlIAkApAMBBQpjdXJyZW50UmVzAgQgb2YgCQCRAwIFCHJlc1R5cGVzBQdyZXNUeXBlAiAgaW4gYmFja3BhY2ssIGJ1dCB0cmllZCB0byBzZWxsIAkApAMBBQZhbW91bnQEAWIJAQxzZWxsSW50ZXJuYWwECQCRAwIFC2N1ckxvY2F0aW9uBQhsb2NJZHhJZAUHcmVzVHlwZQUGYW1vdW50BQhtaW5QcmljZQQFYnBSZXMJAQZzdWJSZXMDBQdyZXNMaXN0BQdyZXNUeXBlBQZhbW91bnQEB25ld1BhY2sJALkJAgkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQpicElkeExldmVsCQDMCAIFBWJwUmVzCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0CQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6BAZyZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQduZXdQYWNrBQNuaWwFA25pbAkAlAoCCQDMCAIIBQFiAl8xCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcggFAWICXzIFC3VzZG5Bc3NldElkBQNuaWwFBnJlc3VsdAFpAQ1zZWxsUmVzb3VyY2VzAgdhbW91bnRzCW1pblByaWNlcwQLZHVja0Fzc2V0SWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJARRrZXlTdGFrZWREdWNrQnlPd25lcgEJAKUIAQgFAWkGY2FsbGVyAhxZb3UgZG9uJ3QgaGF2ZSBhIGR1Y2sgc3Rha2VkAwkBAiE9AgkAkAMBCAUBaQhwYXltZW50cwAACQACAQIqc2VsbFJlc291cmNlcyBkb2Vzbid0IHJlcXVpcmUgYW55IHBheW1lbnRzBAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8DCQECIT0CCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlAgFGCQACAQkArAICAi1EdWNrIGxvY2F0aW9uIHR5cGUgc2hvdWxkIGJlIEZhY3RvcnksIGJ1dCBpcyAJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUEBWxvY0lkCQCRAwIFC2N1ckxvY2F0aW9uBQhsb2NJZHhJZAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdyZXNMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4UmVzAgFfCgEFYWRkZXICA2FjYwFqAwkAZgIJAJEDAgUHYW1vdW50cwUBagkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWoJAAIBCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIJWW91IGhhdmUgCQCRAwIFB3Jlc0xpc3QFAWoCBCBvZiAJAJEDAgUIcmVzVHlwZXMFAWoCFCwgYnV0IHRyaWVkIHRvIHNlbGwgCQCkAwEJAJEDAgUHYW1vdW50cwUBagMJAGYCCQCRAwIFB2Ftb3VudHMFAWoAAAQBYgkBDHNlbGxJbnRlcm5hbAQFBWxvY0lkBQFqCQCRAwIFB2Ftb3VudHMFAWoJAJEDAgUJbWluUHJpY2VzCQEFdmFsdWUBBQFqCQCVCgMJAM0IAggFA2FjYwJfMQgFAWICXzEJAM0IAggFA2FjYwJfMgkApAMBCQBlAgkBDXBhcnNlSW50VmFsdWUBCQCRAwIFB3Jlc0xpc3QFAWoJAJEDAgUHYW1vdW50cwUBagkAZAIIBQNhY2MCXzMIBQFiAl8yCQCVCgMIBQNhY2MCXzEJAM0IAggFA2FjYwJfMgkAkQMCBQdyZXNMaXN0BQFqCAUDYWNjAl8zBAZtZXJnZWQKAAIkbAkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQVhZGRlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgQHbmV3UGFjawkAuQkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAuQkCCAUGbWVyZ2VkAl8yAgFfCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0CQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6BAZyZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQduZXdQYWNrBQNuaWwFA25pbAkAlAoCCQDNCAIIBQZtZXJnZWQCXzEJAQ5TY3JpcHRUcmFuc2ZlcgMIBQFpBmNhbGxlcggFBm1lcmdlZAJfMwULdXNkbkFzc2V0SWQFBnJlc3VsdAFpAQtidXlNYXRlcmlhbAMHbWF0VHlwZQZhbW91bnQIbWF4UHJpY2UDAwkAZgIAAAUHbWF0VHlwZQYJAGcCBQdtYXRUeXBlBQZOVU1SRVMJAAIBCQCsAgICElVua25vd24gbWF0ZXJpYWw6IAkApAMBBQdtYXRUeXBlAwkAZwIAAAUGYW1vdW50CQACAQkArAICAhtBbW91bnQgc2hvdWxkIGJlIHBvc2l0aXZlISAJAKQDAQUGYW1vdW50BAtkdWNrQXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBFGtleVN0YWtlZER1Y2tCeU93bmVyAQkApQgBCAUBaQZjYWxsZXICHFlvdSBkb24ndCBoYXZlIGEgZHVjayBzdGFrZWQDCQECIT0CCQCQAwEIBQFpCHBheW1lbnRzAAEJAAIBAiJleGFjdGx5IDEgcGF5bWVudCBtdXN0IGJlIGF0dGFjaGVkBANwbXQJAJEDAggFAWkIcGF5bWVudHMAAAQDYW10CAUDcG10BmFtb3VudAQKcG10QXNzZXRJZAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCAUDcG10B2Fzc2V0SWQCHldBVkVTIGNhbid0IGJlIHVzZWQgYXMgcGF5bWVudAMJAQIhPQIFCnBtdEFzc2V0SWQFC3VzZG5Bc3NldElkCQACAQITVVNETiBwYXltZW50cyBvbmx5IQQLY3VyTG9jYXRpb24JALUJAgkBC3ZhbHVlT3JFbHNlAgkAnQgCBQ9zdGFraW5nQ29udHJhY3QJAQ9rZXlEdWNrTG9jYXRpb24BBQtkdWNrQXNzZXRJZAUPREVGQVVMVExPQ0FUSU9OAgFfAwkBAiE9AgkAkQMCBQtjdXJMb2NhdGlvbgUKbG9jSWR4VHlwZQIBRgkAAgEJAKwCAgItRHVjayBsb2NhdGlvbiB0eXBlIHNob3VsZCBiZSBGYWN0b3J5LCBidXQgaXMgCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlBAtjdXJyZW50UGFjawkBC2dldEJhY2twYWNrAQkBEWtleUJhY2twYWNrQnlEdWNrAQULZHVja0Fzc2V0SWQEB21hdExpc3QJALUJAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhNYXQCAV8ECmN1cnJlbnRNYXQJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdtYXRMaXN0BQdtYXRUeXBlBAFiCQELYnV5SW50ZXJuYWwECQCRAwIFC2N1ckxvY2F0aW9uBQhsb2NJZHhJZAUHbWF0VHlwZQUGYW1vdW50BQhtYXhQcmljZQMJAGYCCAUBYgJfMgUDYW10CQACAQkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgkArAICAhBZb3VyIHNwZW5kaW5nID0gCQCkAwEIBQFiAl8yAgogVVNETiBmb3IgCQCkAwEIBQFiAl8zAgQgb2YgCQCRAwIFCG1hdFR5cGVzBQdtYXRUeXBlAhkgaXMgPiBhdHRhY2hlZCBwYXltZW50ID0gCQCkAwEFA2FtdAMJAGYCBQpNSU5QQVlNRU5UCAUBYgJfMgkAAgEJAKwCAgkArAICCQCsAgIJAKwCAgkArAICCQCsAgIJAKwCAgIQWW91ciBzcGVuZGluZyA9IAkApAMBCAUBYgJfMgIKIFVTRE4gZm9yIAkApAMBCAUBYgJfMwIEIG9mIAkAkQMCBQhtYXRUeXBlcwUHbWF0VHlwZQIQIGlzIDwgbWluaW1hbCA9IAkApAMBBQpNSU5QQVlNRU5UBAVicE1hdAkBBmFkZE1hdAMFB21hdExpc3QFB21hdFR5cGUIBQFiAl8zBAduZXdQYWNrCQC5CQIJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUKYnBJZHhMZXZlbAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQhicElkeFJlcwkAzAgCBQVicE1hdAkAzAgCCQCRAwIFC2N1cnJlbnRQYWNrBQlicElkeFByb2QFA25pbAIBOgQGcmVzdWx0CQEIYXNTdHJpbmcBCQD8BwQFD3N0YWtpbmdDb250cmFjdAIOdXBkYXRlQmFja3BhY2sJAMwIAgULZHVja0Fzc2V0SWQJAMwIAgUHbmV3UGFjawUDbmlsBQNuaWwEBHJlc3QDCQBmAgkAZQIFA2FtdAgFAWICXzIAAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIJAGUCBQNhbXQIBQFiAl8yBQt1c2RuQXNzZXRJZAUDbmlsBQNuaWwJAJQKAgkAzQgCBQRyZXN0CAUBYgJfMQUGcmVzdWx0AWkBDGJ1eU1hdGVyaWFscwIHYW1vdW50cwltYXhQcmljZXMEC2R1Y2tBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUPc3Rha2luZ0NvbnRyYWN0CQEUa2V5U3Rha2VkRHVja0J5T3duZXIBCQClCAEIBQFpBmNhbGxlcgIcWW91IGRvbid0IGhhdmUgYSBkdWNrIHN0YWtlZAMJAQIhPQIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECImV4YWN0bHkgMSBwYXltZW50IG11c3QgYmUgYXR0YWNoZWQEA3BtdAkAkQMCCAUBaQhwYXltZW50cwAABANhbXQIBQNwbXQGYW1vdW50BApwbXRBc3NldElkCQETdmFsdWVPckVycm9yTWVzc2FnZQIIBQNwbXQHYXNzZXRJZAIeV0FWRVMgY2FuJ3QgYmUgdXNlZCBhcyBwYXltZW50AwkBAiE9AgUKcG10QXNzZXRJZAULdXNkbkFzc2V0SWQJAAIBAhNVU0ROIHBheW1lbnRzIG9ubHkhBAtjdXJMb2NhdGlvbgkAtQkCCQELdmFsdWVPckVsc2UCCQCdCAIFD3N0YWtpbmdDb250cmFjdAkBD2tleUR1Y2tMb2NhdGlvbgEFC2R1Y2tBc3NldElkBQ9ERUZBVUxUTE9DQVRJT04CAV8DCQECIT0CCQCRAwIFC2N1ckxvY2F0aW9uBQpsb2NJZHhUeXBlAgFGCQACAQkArAICAi1EdWNrIGxvY2F0aW9uIHR5cGUgc2hvdWxkIGJlIEZhY3RvcnksIGJ1dCBpcyAJAJEDAgULY3VyTG9jYXRpb24FCmxvY0lkeFR5cGUEBWxvY0lkCQCRAwIFC2N1ckxvY2F0aW9uBQhsb2NJZHhJZAQLY3VycmVudFBhY2sJAQtnZXRCYWNrcGFjawEJARFrZXlCYWNrcGFja0J5RHVjawEFC2R1Y2tBc3NldElkBAdtYXRMaXN0CQC1CQIJAJEDAgULY3VycmVudFBhY2sFCGJwSWR4TWF0AgFfCgEIbVVwZGF0ZXICA2FjYwFqAwkAZgIJAJEDAgUHYW1vdW50cwUBagAABAFiCQELYnV5SW50ZXJuYWwEBQVsb2NJZAUBagkAkQMCBQdhbW91bnRzBQFqCQCRAwIFCW1heFByaWNlcwUBagkAlQoDCQDNCAIIBQNhY2MCXzEIBQFiAl8xCQDNCAIIBQNhY2MCXzIJAKQDAQkAZAIJAQ1wYXJzZUludFZhbHVlAQkAkQMCBQdtYXRMaXN0BQFqCAUBYgJfMwkAZAIIBQNhY2MCXzMIBQFiAl8yCQCVCgMIBQNhY2MCXzEJAM0IAggFA2FjYwJfMgkAkQMCBQdtYXRMaXN0BQFqCAUDYWNjAl8zBAZtZXJnZWQKAAIkbAkAzAgCAAAJAMwIAgABCQDMCAIAAgkAzAgCAAMJAMwIAgAECQDMCAIABQUDbmlsCgACJHMJAJADAQUCJGwKAAUkYWNjMAkAlQoDBQNuaWwFA25pbAAACgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQhtVXBkYXRlcgIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQITTGlzdCBzaXplIGV4Y2VlZHMgNgkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgMJAGYCCAUGbWVyZ2VkAl8zBQNhbXQJAAIBCQCsAgIJAKwCAgkArAICAh9JbnN1ZmZpY2llbnQgcGF5bWVudCEgQXR0YWNoZWQ9CQCkAwEFA2FtdAILLCByZXF1aXJlZD0JAKQDAQgFBm1lcmdlZAJfMwQHbmV3UGFjawkAuQkCCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCmJwSWR4TGV2ZWwJAMwIAgkAkQMCBQtjdXJyZW50UGFjawUIYnBJZHhSZXMJAMwIAgkAuQkCCAUGbWVyZ2VkAl8yAgFfCQDMCAIJAJEDAgULY3VycmVudFBhY2sFCWJwSWR4UHJvZAUDbmlsAgE6BAZyZXN1bHQJAQhhc1N0cmluZwEJAPwHBAUPc3Rha2luZ0NvbnRyYWN0Ag51cGRhdGVCYWNrcGFjawkAzAgCBQtkdWNrQXNzZXRJZAkAzAgCBQduZXdQYWNrBQNuaWwFA25pbAQEcmVzdAMJAGYCCQBlAgUDYW10CAUGbWVyZ2VkAl8zAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyCQBlAgUDYW10CAUGbWVyZ2VkAl8zBQt1c2RuQXNzZXRJZAUDbmlsBQNuaWwJAJQKAgkAzggCCAUGbWVyZ2VkAl8xBQRyZXN0BQZyZXN1bHQAgJFLLQ==", "height": 2375948, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: EJj4FnSCZMQb4oixJba7kViPwDXYRrgaQ5EpLZk3MsLv Next: Ak5wThy6788jfSt9LcgREpNGNVjaVFRqfBqR4hnuS4aX Diff:
OldNewDifferences
210210 let locId = curLocation[locIdxId]
211211 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
212212 let resList = split(currentPack[bpIdxRes], "_")
213- func adder (acc,j) = if ((amounts[j] > 0))
214- then {
215- let b = sellInternal(locId, j, amounts[j], minPrices[value(j)])
216- $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(resList[j]) - amounts[j]))), (acc._3 + b._2))
217- }
218- else $Tuple3(acc._1, (acc._2 :+ resList[j]), acc._3)
213+ func adder (acc,j) = if ((amounts[j] > parseIntValue(resList[j])))
214+ then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to sell ") + toString(amounts[j])))
215+ else if ((amounts[j] > 0))
216+ then {
217+ let b = sellInternal(locId, j, amounts[j], minPrices[value(j)])
218+ $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(resList[j]) - amounts[j]))), (acc._3 + b._2))
219+ }
220+ else $Tuple3(acc._1, (acc._2 :+ resList[j]), acc._3)
219221
220222 let merged = {
221223 let $l = [0, 1, 2, 3, 4, 5]
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 func getBackpack (bpKey) = {
157157 let p = split(valueOrElse(getString(stakingContract, bpKey), "0:0_0_0_0_0_0:0_0_0_0_0_0:"), ":")
158158 [toString(valueOrElse(parseInt(p[bpIdxLevel]), 0)), if ((size(split(p[bpIdxRes], "_")) == NUMRES))
159159 then p[bpIdxRes]
160160 else "0_0_0_0_0_0", if ((size(split(p[bpIdxMat], "_")) == NUMRES))
161161 then p[bpIdxMat]
162162 else "0_0_0_0_0_0", p[bpIdxProd]]
163163 }
164164
165165
166166 @Callable(i)
167167 func sellResource (resType,amount,minPrice) = if (if ((0 > resType))
168168 then true
169169 else (resType >= NUMRES))
170170 then throw(("Unknown resource: " + toString(resType)))
171171 else if ((0 >= amount))
172172 then throw(("Amount should be positive! " + toString(amount)))
173173 else {
174174 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
175175 if ((size(i.payments) != 0))
176176 then throw("sellResources doesn't require any payments")
177177 else {
178178 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
179179 if ((curLocation[locIdxType] != "F"))
180180 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
181181 else {
182182 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
183183 let resList = split(currentPack[bpIdxRes], "_")
184184 let currentRes = parseIntValue(resList[resType])
185185 if ((amount > currentRes))
186186 then throw(((((("You have " + toString(currentRes)) + " of ") + resTypes[resType]) + " in backpack, but tried to sell ") + toString(amount)))
187187 else {
188188 let b = sellInternal(curLocation[locIdxId], resType, amount, minPrice)
189189 let bpRes = subRes(resList, resType, amount)
190190 let newPack = makeString([currentPack[bpIdxLevel], bpRes, currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
191191 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
192192 $Tuple2([b._1, ScriptTransfer(i.caller, b._2, usdnAssetId)], result)
193193 }
194194 }
195195 }
196196 }
197197
198198
199199
200200 @Callable(i)
201201 func sellResources (amounts,minPrices) = {
202202 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
203203 if ((size(i.payments) != 0))
204204 then throw("sellResources doesn't require any payments")
205205 else {
206206 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
207207 if ((curLocation[locIdxType] != "F"))
208208 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
209209 else {
210210 let locId = curLocation[locIdxId]
211211 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
212212 let resList = split(currentPack[bpIdxRes], "_")
213- func adder (acc,j) = if ((amounts[j] > 0))
214- then {
215- let b = sellInternal(locId, j, amounts[j], minPrices[value(j)])
216- $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(resList[j]) - amounts[j]))), (acc._3 + b._2))
217- }
218- else $Tuple3(acc._1, (acc._2 :+ resList[j]), acc._3)
213+ func adder (acc,j) = if ((amounts[j] > parseIntValue(resList[j])))
214+ then throw(((((("You have " + resList[j]) + " of ") + resTypes[j]) + ", but tried to sell ") + toString(amounts[j])))
215+ else if ((amounts[j] > 0))
216+ then {
217+ let b = sellInternal(locId, j, amounts[j], minPrices[value(j)])
218+ $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(resList[j]) - amounts[j]))), (acc._3 + b._2))
219+ }
220+ else $Tuple3(acc._1, (acc._2 :+ resList[j]), acc._3)
219221
220222 let merged = {
221223 let $l = [0, 1, 2, 3, 4, 5]
222224 let $s = size($l)
223225 let $acc0 = $Tuple3(nil, nil, 0)
224226 func $f0_1 ($a,$i) = if (($i >= $s))
225227 then $a
226228 else adder($a, $l[$i])
227229
228230 func $f0_2 ($a,$i) = if (($i >= $s))
229231 then $a
230232 else throw("List size exceeds 6")
231233
232234 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
233235 }
234236 let newPack = makeString([currentPack[bpIdxLevel], makeString(merged._2, "_"), currentPack[bpIdxMat], currentPack[bpIdxProd]], ":")
235237 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
236238 $Tuple2((merged._1 :+ ScriptTransfer(i.caller, merged._3, usdnAssetId)), result)
237239 }
238240 }
239241 }
240242
241243
242244
243245 @Callable(i)
244246 func buyMaterial (matType,amount,maxPrice) = if (if ((0 > matType))
245247 then true
246248 else (matType >= NUMRES))
247249 then throw(("Unknown material: " + toString(matType)))
248250 else if ((0 >= amount))
249251 then throw(("Amount should be positive! " + toString(amount)))
250252 else {
251253 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
252254 if ((size(i.payments) != 1))
253255 then throw("exactly 1 payment must be attached")
254256 else {
255257 let pmt = i.payments[0]
256258 let amt = pmt.amount
257259 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
258260 if ((pmtAssetId != usdnAssetId))
259261 then throw("USDN payments only!")
260262 else {
261263 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
262264 if ((curLocation[locIdxType] != "F"))
263265 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
264266 else {
265267 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
266268 let matList = split(currentPack[bpIdxMat], "_")
267269 let currentMat = parseIntValue(matList[matType])
268270 let b = buyInternal(curLocation[locIdxId], matType, amount, maxPrice)
269271 if ((b._2 > amt))
270272 then throw(((((((("Your spending = " + toString(b._2)) + " USDN for ") + toString(b._3)) + " of ") + matTypes[matType]) + " is > attached payment = ") + toString(amt)))
271273 else if ((MINPAYMENT > b._2))
272274 then throw(((((((("Your spending = " + toString(b._2)) + " USDN for ") + toString(b._3)) + " of ") + matTypes[matType]) + " is < minimal = ") + toString(MINPAYMENT)))
273275 else {
274276 let bpMat = addMat(matList, matType, b._3)
275277 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], bpMat, currentPack[bpIdxProd]], ":")
276278 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
277279 let rest = if (((amt - b._2) > 0))
278280 then [ScriptTransfer(i.caller, (amt - b._2), usdnAssetId)]
279281 else nil
280282 $Tuple2((rest :+ b._1), result)
281283 }
282284 }
283285 }
284286 }
285287 }
286288
287289
288290
289291 @Callable(i)
290292 func buyMaterials (amounts,maxPrices) = {
291293 let duckAssetId = valueOrErrorMessage(getString(stakingContract, keyStakedDuckByOwner(toString(i.caller))), "You don't have a duck staked")
292294 if ((size(i.payments) != 1))
293295 then throw("exactly 1 payment must be attached")
294296 else {
295297 let pmt = i.payments[0]
296298 let amt = pmt.amount
297299 let pmtAssetId = valueOrErrorMessage(pmt.assetId, "WAVES can't be used as payment")
298300 if ((pmtAssetId != usdnAssetId))
299301 then throw("USDN payments only!")
300302 else {
301303 let curLocation = split(valueOrElse(getString(stakingContract, keyDuckLocation(duckAssetId)), DEFAULTLOCATION), "_")
302304 if ((curLocation[locIdxType] != "F"))
303305 then throw(("Duck location type should be Factory, but is " + curLocation[locIdxType]))
304306 else {
305307 let locId = curLocation[locIdxId]
306308 let currentPack = getBackpack(keyBackpackByDuck(duckAssetId))
307309 let matList = split(currentPack[bpIdxMat], "_")
308310 func mUpdater (acc,j) = if ((amounts[j] > 0))
309311 then {
310312 let b = buyInternal(locId, j, amounts[j], maxPrices[j])
311313 $Tuple3((acc._1 :+ b._1), (acc._2 :+ toString((parseIntValue(matList[j]) + b._3))), (acc._3 + b._2))
312314 }
313315 else $Tuple3(acc._1, (acc._2 :+ matList[j]), acc._3)
314316
315317 let merged = {
316318 let $l = [0, 1, 2, 3, 4, 5]
317319 let $s = size($l)
318320 let $acc0 = $Tuple3(nil, nil, 0)
319321 func $f0_1 ($a,$i) = if (($i >= $s))
320322 then $a
321323 else mUpdater($a, $l[$i])
322324
323325 func $f0_2 ($a,$i) = if (($i >= $s))
324326 then $a
325327 else throw("List size exceeds 6")
326328
327329 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6)
328330 }
329331 if ((merged._3 > amt))
330332 then throw(((("Insufficient payment! Attached=" + toString(amt)) + ", required=") + toString(merged._3)))
331333 else {
332334 let newPack = makeString([currentPack[bpIdxLevel], currentPack[bpIdxRes], makeString(merged._2, "_"), currentPack[bpIdxProd]], ":")
333335 let result = asString(invoke(stakingContract, "updateBackpack", [duckAssetId, newPack], nil))
334336 let rest = if (((amt - merged._3) > 0))
335337 then [ScriptTransfer(i.caller, (amt - merged._3), usdnAssetId)]
336338 else nil
337339 $Tuple2((merged._1 ++ rest), result)
338340 }
339341 }
340342 }
341343 }
342344 }
343345
344346

github/deemru/w8io/169f3d6 
89.61 ms