tx · LyLp1Ltwsnp3VJC9FU6z4rUNxz8iD1MeWafoPCNHtMx

3MzGPAZokuNfqjMuP7yDXFATZjhjtEP5UCa:  -0.03700000 Waves

2023.01.09 11:38 [2397174] smart account 3MzGPAZokuNfqjMuP7yDXFATZjhjtEP5UCa > SELF 0.00000000 Waves

{ "type": 13, "id": "LyLp1Ltwsnp3VJC9FU6z4rUNxz8iD1MeWafoPCNHtMx", "fee": 3700000, "feeAssetId": null, "timestamp": 1673253532581, "version": 2, "chainId": 84, "sender": "3MzGPAZokuNfqjMuP7yDXFATZjhjtEP5UCa", "senderPublicKey": "4EBKd2zSCvpiSLeyovT5FUuMvGpi6oxdBAbvQybSYi6p", "proofs": [ "3zkGbkjpr8ZgnBk3Coh2Pits3mPctNmjTyb5u3fnCtDiJmTw7ngzLtNZYq15DN3KQBr9csNTKA6FhUo7ySp9jtas" ], "script": "base64:BgJLCAISBAoCCAgSAwoBCBIAEgMKAQgSCgoICAEBAQEBAQgSCwoJCAEBAQgBAQEBEg0KCwgIAQEBAQEBCAgBEgMKAQESAwoBARIDCgEBOwAUa19jb29yZGluYXRvckFkZHJlc3MCFGtfY29vcmRpbmF0b3JBZGRyZXNzABJrX2FkbWluX3B1YmxpY19rZXkCEmtfYWRtaW5fcHVibGljX2tleQANa19xdW90ZV9hc3NldAINa19xdW90ZV9hc3NldAAFa19hbW0CBWtfYW1tABFrX21hbmFnZXJfYWRkcmVzcwIRa19tYW5hZ2VyX2FkZHJlc3MAEmtfcG9zaXRpb25TZXF1ZW5jZQISa19wb3NpdGlvblNlcXVlbmNlAA5rX3Bvc2l0aW9uU2l6ZQIOa19wb3NpdGlvblNpemUABWtfZmVlAgVrX2ZlZQAQa19leGVjdXRlZE9yZGVycwIQa19leGVjdXRlZE9yZGVycwAQa19jYW5jZWxlZE9yZGVycwIQa19jYW5jZWxlZE9yZGVycwAHa19vcmRlcgIHa19vcmRlcgANa19sYXN0T3JkZXJJZAINa19sYXN0T3JkZXJJZAAQa190cmFkZXJPcmRlckNudAIQa190cmFkZXJPcmRlckNudAAQa190cmFkZXJPcmRlcklkcwIQa190cmFkZXJPcmRlcklkcwAIa19zZW5kZXICCGtfc2VuZGVyAA1rX2luaXRpYWxpemVkAg1rX2luaXRpYWxpemVkAARTVE9QAAEABFRBS0UAAgAFTElNSVQAAwAETE9ORwABAAVTSE9SVAACAAhJTkNSRUFTRQABAAhERUNSRUFTRQACABlNQVhfVFJBREVSX09SREVSU19QRVJfQU1NAAUABFRJTUUIBQlsYXN0QmxvY2sJdGltZXN0YW1wAAxERUNJTUFMX1VOSVQJAGgCAAEJAGgCCQBoAgkAaAIJAGgCCQBoAgAKAAoACgAKAAoACgAMU1BSRUFEX0xJTUlUCQBpAgUMREVDSU1BTF9VTklUAMgBAQNhYnMBAl94AwkAZgIFAl94AAAFAl94CQEBLQEFAl94AQRkaXZkAgJfeAJfeQkAbgQFAl94BQxERUNJTUFMX1VOSVQFAl95BQhIQUxGRVZFTgEEbXVsZAICX3gCX3kJAG4EBQJfeAUCX3kFDERFQ0lNQUxfVU5JVAUISEFMRkVWRU4BBG1pbnYCAl94Al95AwkAZgIFAl94BQJfeQUCX3kFAl94AQ50b0NvbXBvc2l0ZUtleQIEX2tleQhfYWRkcmVzcwkArAICCQCsAgIFBF9rZXkCAV8FCF9hZGRyZXNzARBleGVjdXRlZE9yZGVyS2V5AQhfb3JkZXJJZAkArAICCQCsAgIFEGtfZXhlY3V0ZWRPcmRlcnMCAV8JAKQDAQUIX29yZGVySWQBEGNhbmNlbGVkT3JkZXJLZXkBCF9vcmRlcklkCQCsAgIJAKwCAgUQa19jYW5jZWxlZE9yZGVycwIBXwkApAMBBQhfb3JkZXJJZAEIb3JkZXJLZXkBCF9vcmRlcklkCQEOdG9Db21wb3NpdGVLZXkCBQdrX29yZGVyCQCkAwEFCF9vcmRlcklkARN0cmFkZXJPcmRlckNvdW50S2V5AgRfYW1tB190cmFkZXIJAKwCAgkArAICCQCsAgIJAKwCAgUQa190cmFkZXJPcmRlckNudAIBXwUEX2FtbQIBXwUHX3RyYWRlcgERdHJhZGVyT3JkZXJJZHNLZXkCBF9hbW0HX3RyYWRlcgkArAICCQCsAgIJAKwCAgkArAICBRBrX3RyYWRlck9yZGVySWRzAgFfBQRfYW1tAgFfBQdfdHJhZGVyAQtjb29yZGluYXRvcgAJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkApggBCQERQGV4dHJOYXRpdmUoMTA1MykCBQR0aGlzBRRrX2Nvb3JkaW5hdG9yQWRkcmVzcwITQ29vcmRpbmF0b3Igbm90IHNldAEKcXVvdGVBc3NldAAJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUNa19xdW90ZV9hc3NldAEObWFuYWdlckFkZHJlc3MACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAURa19tYW5hZ2VyX2FkZHJlc3MCD01hbmFnZXIgbm90IHNldAELaXNXaGl0ZWxpc3QBCF9hZGRyZXNzCQELdmFsdWVPckVsc2UCCQCbCAIJAQtjb29yZGluYXRvcgAJAQ50b0NvbXBvc2l0ZUtleQIFBWtfYW1tBQhfYWRkcmVzcwcBDmFkbWluUHVibGljS2V5AAkA2QQBCQERQGV4dHJOYXRpdmUoMTA1MykCCQELY29vcmRpbmF0b3IABRJrX2FkbWluX3B1YmxpY19rZXkBC2luaXRpYWxpemVkAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQ1rX2luaXRpYWxpemVkBwEHaXNWYWxpZAEIX29yZGVySWQDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJARBleGVjdXRlZE9yZGVyS2V5AQUIX29yZGVySWQHCQACAQkArAICAhhPcmRlciBhbHJlYWR5IGV4ZWN1dGVkOiAJAKQDAQUIX29yZGVySWQDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJARBjYW5jZWxlZE9yZGVyS2V5AQUIX29yZGVySWQHCQACAQkArAICAhlPcmRlciBhbHJlYWR5IGNhbmNlbGxlZDogCQCkAwEFCF9vcmRlcklkBgEOY3VycmVudE9yZGVySWQACQELdmFsdWVPckVsc2UCCQCaCAIFBHRoaXMFDWtfbGFzdE9yZGVySWQAAAETZ2V0VHJhZGVyT3JkZXJDb3VudAIEX2FtbQdfdHJhZGVyBANrZXkJARN0cmFkZXJPcmRlckNvdW50S2V5AgUEX2FtbQUHX3RyYWRlcgkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQNrZXkAAAESdHJhZGVyQW1tT3JkZXJzSWRzAgRfYW1tB190cmFkZXIEA2tleQkBEXRyYWRlck9yZGVySWRzS2V5AgUEX2FtbQUHX3RyYWRlcgQDdmFsCQELdmFsdWVPckVsc2UCCQCdCAIFBHRoaXMFA2tleQIAAwkAAAIFA3ZhbAIABQNuaWwJALUJAgUDdmFsAgEsAQhnZXRPcmRlcgEIX29yZGVySWQECG9yZGVyU3RyCQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJ0IAgUEdGhpcwkBCG9yZGVyS2V5AQUIX29yZGVySWQJAKwCAgISSW52YWxpZCBvcmRlciBpZDogCQCkAwEFCF9vcmRlcklkBA1vcmRlclBhcnRMaXN0CQC1CQIFCG9yZGVyU3RyAgEsBANhbW0JAJEDAgUNb3JkZXJQYXJ0TGlzdAAABAZ0cmFkZXIJAJEDAgUNb3JkZXJQYXJ0TGlzdAABBAhhbW91bnRJbgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEJAJEDAgUNb3JkZXJQYXJ0TGlzdAACAhBJbnZhbGlkIGFtb3VudEluBAhsZXZlcmFnZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEJAJEDAgUNb3JkZXJQYXJ0TGlzdAADAhBJbnZhbGlkIGxldmVyYWdlBAR0eXBlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQ1vcmRlclBhcnRMaXN0AAQCDEludmFsaWQgdHlwZQQMdHJpZ2dlclByaWNlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQ1vcmRlclBhcnRMaXN0AAUCFEludmFsaWQgdHJpZ2dlclByaWNlBAtwYXltZW50VXNkbgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEJAJEDAgUNb3JkZXJQYXJ0TGlzdAAGAhNJbnZhbGlkIHBheW1lbnRVc2RuBARzaWRlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQ1vcmRlclBhcnRMaXN0AAcCDEludmFsaWQgc2lkZQQHcmVmTGluawkAkQMCBQ1vcmRlclBhcnRMaXN0AAgECnBvc2l0aW9uSWQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFDW9yZGVyUGFydExpc3QACQISSW52YWxpZCBwb3NpdGlvbklkBApsaW1pdFByaWNlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQ1vcmRlclBhcnRMaXN0AAoCEkludmFsaWQgbGltaXRQcmljZQkAnQoLBQNhbW0FBnRyYWRlcgUIYW1vdW50SW4FCGxldmVyYWdlBQR0eXBlBQx0cmlnZ2VyUHJpY2UFC3BheW1lbnRVc2RuBQRzaWRlBQdyZWZMaW5rBQpwb3NpdGlvbklkBQpsaW1pdFByaWNlAQ5nZXRNYXJrZXRQcmljZQEEX2FtbQQBcwkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQRfYW1tAhBjb21wdXRlU3BvdFByaWNlBQNuaWwFA25pbAMJAAACBQFzBQFzBANyZXMEByRtYXRjaDAFAXMDCQABAgUHJG1hdGNoMAIDSW50BAF0BQckbWF0Y2gwBQF0CQACAQIfSW52YWxpZCBjb21wdXRlU3BvdFByaWNlIHJlc3VsdAkBBXZhbHVlAQUDcmVzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQZnZXRGZWUCBF9hbW0HX3RyYWRlcgQBcwkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQRfYW1tAh9jb21wdXRlRmVlRm9yVHJhZGVyV2l0aEFydGlmYWN0CQDMCAIFB190cmFkZXIJAMwIAgIABQNuaWwFA25pbAMJAAACBQFzBQFzBANyZXMEByRtYXRjaDAFAXMDCQABAgUHJG1hdGNoMAIOKEludCwgQm9vbGVhbikEAXQFByRtYXRjaDAIBQF0Al8xCQACAQIuSW52YWxpZCBjb21wdXRlRmVlRm9yVHJhZGVyV2l0aEFydGlmYWN0IHJlc3VsdAkBBXZhbHVlAQUDcmVzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQ9nZXRQb3NpdGlvblNpemUCBF9hbW0HX3RyYWRlcgQDYW1tCQERQGV4dHJOYXRpdmUoMTA2MikBBQRfYW1tBAdzaXplS2V5CQEOdG9Db21wb3NpdGVLZXkCBQ5rX3Bvc2l0aW9uU2l6ZQUHX3RyYWRlcgkBC3ZhbHVlT3JFbHNlAgkAmggCBQNhbW0FB3NpemVLZXkAAAENZ2V0UG9zaXRpb25JZAIEX2FtbQdfdHJhZGVyBANhbW0JARFAZXh0ck5hdGl2ZSgxMDYyKQEFBF9hbW0EBnNlcUtleQkBDnRvQ29tcG9zaXRlS2V5AgUSa19wb3NpdGlvblNlcXVlbmNlBQdfdHJhZGVyCQELdmFsdWVPckVsc2UCCQCaCAIFA2FtbQUGc2VxS2V5AAABCWdldFNwcmVhZAEGX3ByaWNlCQEEbXVsZAIFBl9wcmljZQUMU1BSRUFEX0xJTUlUAQlzYXZlT3JkZXIMCF9vcmRlcklkBF9hbW0HX3RyYWRlcglfYW1vdW50SW4JX2xldmVyYWdlBV90eXBlDV90cmlnZ2VyUHJpY2UMX3BheW1lbnRVc2RuBV9zaWRlCF9yZWZMaW5rC19wb3NpdGlvbklkC19saW1pdFByaWNlBAhvcmRlclN0cgkAuQkCCQDMCAIFBF9hbW0JAMwIAgUHX3RyYWRlcgkAzAgCCQCkAwEFCV9hbW91bnRJbgkAzAgCCQCkAwEFCV9sZXZlcmFnZQkAzAgCCQCkAwEFBV90eXBlCQDMCAIJAKQDAQUNX3RyaWdnZXJQcmljZQkAzAgCCQCkAwEFDF9wYXltZW50VXNkbgkAzAgCCQCkAwEFBV9zaWRlCQDMCAIFCF9yZWZMaW5rCQDMCAIJAKQDAQULX3Bvc2l0aW9uSWQJAMwIAgkApAMBBQtfbGltaXRQcmljZQUDbmlsAgEsCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQhvcmRlcktleQEFCF9vcmRlcklkBQhvcmRlclN0cgUDbmlsARBhZGRSZW1vdmVPcmRlcklkBAhfb3JkZXJJZARfYW1tB190cmFkZXIEX2FkZAQIb3JkZXJJZHMJARJ0cmFkZXJBbW1PcmRlcnNJZHMCBQRfYW1tBQdfdHJhZGVyBAtvcmRlcklkc05ldwMFBF9hZGQJAM0IAgUIb3JkZXJJZHMJAKQDAQUIX29yZGVySWQJANEIAgUIb3JkZXJJZHMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQhvcmRlcklkcwkApAMBBQhfb3JkZXJJZAkArAICAhJObyBvcmRlciB3aXRoIGlkOiAJAKQDAQUIX29yZGVySWQEDm9yZGVySWRzTmV3U3RyCQC5CQIFC29yZGVySWRzTmV3AgEsCQDMCAIJAQtTdHJpbmdFbnRyeQIJARF0cmFkZXJPcmRlcklkc0tleQIFBF9hbW0FB190cmFkZXIFDm9yZGVySWRzTmV3U3RyBQNuaWwBFnVwZGF0ZVRyYWRlck9yZGVyQ291bnQDBF9hbW0HX3RyYWRlcgZfY291bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJARN0cmFkZXJPcmRlckNvdW50S2V5AgUEX2FtbQUHX3RyYWRlcgUGX2NvdW50BQNuaWwBEXVwZGF0ZUxhc3RPcmRlcklkAQxfbGFzdE9yZGVySWQJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtfbGFzdE9yZGVySWQFDF9sYXN0T3JkZXJJZAUDbmlsARBtYXJrRXhlY3V0ZU9yZGVyAQhfb3JkZXJJZAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUQa19leGVjdXRlZE9yZGVycwkApAMBBQhfb3JkZXJJZAYFA25pbAEPbWFya0NhbmNlbE9yZGVyAQhfb3JkZXJJZAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUQa19jYW5jZWxlZE9yZGVycwkApAMBBQhfb3JkZXJJZAYFA25pbAoBaQESY2xlYW5VcFN0YWxlT3JkZXJzAgRfYW1tB190cmFkZXIEBm9yZGVycwkBEnRyYWRlckFtbU9yZGVyc0lkcwIFBF9hbW0FB190cmFkZXIECm9yZGVyQ291bnQJARNnZXRUcmFkZXJPcmRlckNvdW50AgUEX2FtbQUHX3RyYWRlcgoBCmNsZWFuVXBPbmUCBF9hY2MIX29yZGVySWQECm9yZGVySWRJbnQJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBBQhfb3JkZXJJZAIQSW52YWxpZCBvcmRlciBpZAQLJHQwODM4Mzg1NzgJAQhnZXRPcmRlcgEFCm9yZGVySWRJbnQEA194MQgFCyR0MDgzODM4NTc4Al8xBANfeDIIBQskdDA4MzgzODU3OAJfMgQDX3gzCAULJHQwODM4Mzg1NzgCXzMEA194NAgFCyR0MDgzODM4NTc4Al80BAVfdHlwZQgFCyR0MDgzODM4NTc4Al81BANfeDUIBQskdDA4MzgzODU3OAJfNgQDX3g2CAULJHQwODM4Mzg1NzgCXzcEA194NwgFCyR0MDgzODM4NTc4Al84BANfeDgIBQskdDA4MzgzODU3OAJfOQQLX3Bvc2l0aW9uSWQIBQskdDA4MzgzODU3OANfMTAEA194OQgFCyR0MDgzODM4NTc4A18xMQQMcG9zaXRpb25TaXplCQEPZ2V0UG9zaXRpb25TaXplAgUEX2FtbQUHX3RyYWRlcgQRY3VycmVudFBvc2l0aW9uSWQDCQECIT0CBQxwb3NpdGlvblNpemUAAAkBDWdldFBvc2l0aW9uSWQCBQRfYW1tBQdfdHJhZGVyAAADAwMJAAACBQVfdHlwZQUEU1RPUAYJAAACBQVfdHlwZQUEVEFLRQkBAiE9AgURY3VycmVudFBvc2l0aW9uSWQFC19wb3NpdGlvbklkBwQGY2hhbmdlCQDOCAIJAQ9tYXJrQ2FuY2VsT3JkZXIBBQpvcmRlcklkSW50CQEQYWRkUmVtb3ZlT3JkZXJJZAQFCm9yZGVySWRJbnQFBF9hbW0FB190cmFkZXIHCQCUCgIJAGQCCAUEX2FjYwJfMQABCQDOCAIIBQRfYWNjAl8yBQZjaGFuZ2UFBF9hY2MEBnJlc3VsdAoAAiRsBQZvcmRlcnMKAAIkcwkAkAMBBQIkbAoABSRhY2MwCQCUCgIAAAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQpjbGVhblVwT25lAgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhNMaXN0IHNpemUgZXhjZWVkcyA1CQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQkAzggCCAUGcmVzdWx0Al8yCQEWdXBkYXRlVHJhZGVyT3JkZXJDb3VudAMFBF9hbW0FB190cmFkZXIJAGUCBQpvcmRlckNvdW50CAUGcmVzdWx0Al8xAWkBCnNldENvbnRleHQBB19zZW5kZXIDCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAg5Pbmx5IHNlbGYtY2FsbAkAzAgCCQELU3RyaW5nRW50cnkCBQhrX3NlbmRlcgUHX3NlbmRlcgUDbmlsAWkBDHJlc2V0Q29udGV4dAADCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAg5Pbmx5IHNlbGYtY2FsbAkAzAgCCQELRGVsZXRlRW50cnkBBQhrX3NlbmRlcgUDbmlsAWkBCmluaXRpYWxpemUBDF9jb29yZGluYXRvcgMJAQtpbml0aWFsaXplZAAJAAIBAhNBbHJlYWR5IGluaXRpYWxpemVkCQDMCAIJAQtTdHJpbmdFbnRyeQIFFGtfY29vcmRpbmF0b3JBZGRyZXNzBQxfY29vcmRpbmF0b3IJAMwIAgkBDEJvb2xlYW5FbnRyeQIFDWtfaW5pdGlhbGl6ZWQGBQNuaWwBaQELY3JlYXRlT3JkZXIIBF9hbW0FX3R5cGUNX3RyaWdnZXJQcmljZQtfbGltaXRQcmljZQlfYW1vdW50SW4JX2xldmVyYWdlBV9zaWRlCF9yZWZMaW5rBAdfdHJhZGVyCQClCAEIBQFpBmNhbGxlcgQHY2xlYW5VcAkA/AcEBQR0aGlzAhJjbGVhblVwU3RhbGVPcmRlcnMJAMwIAgUEX2FtbQkAzAgCBQdfdHJhZGVyBQNuaWwFA25pbAMJAAACBQdjbGVhblVwBQdjbGVhblVwAwkAZgIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECNUludmFsaWQgY3JlYXRlT3JkZXIgcGFyYW1ldGVyczogaW52YWxpZCBwYXltZW50IGNvdW50BA0kdDAxMDI4NzEwNTM5AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQkAlAoCCQDYBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAhBJbnZhbGlkIGFzc2V0IGlkCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAlAoCAgAAAAQOcGF5bWVudEFzc2V0SWQIBQ0kdDAxMDI4NzEwNTM5Al8xBA1wYXltZW50QW1vdW50CAUNJHQwMTAyODcxMDUzOQJfMgQGZG9DYWxsCQD8BwQFBHRoaXMCE2ludGVybmFsQ3JlYXRlT3JkZXIJAMwIAgUHX3RyYWRlcgkAzAgCBQRfYW1tCQDMCAIFBV90eXBlCQDMCAIFDV90cmlnZ2VyUHJpY2UJAMwIAgULX2xpbWl0UHJpY2UJAMwIAgUJX2Ftb3VudEluCQDMCAIFCV9sZXZlcmFnZQkAzAgCBQVfc2lkZQkAzAgCBQhfcmVmTGluawkAzAgCBQ5wYXltZW50QXNzZXRJZAkAzAgCBQ1wYXltZW50QW1vdW50BQNuaWwFA25pbAMJAAACBQZkb0NhbGwFBmRvQ2FsbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBHGluY3JlYXNlUG9zaXRpb25XaXRoU3RvcExvc3MJBF9hbW0KX2RpcmVjdGlvbglfbGV2ZXJhZ2UTX21pbkJhc2VBc3NldEFtb3VudAhfcmVmTGluaxFfc3RvcFRyaWdnZXJQcmljZQ9fc3RvcExpbWl0UHJpY2URX3Rha2VUcmlnZ2VyUHJpY2UPX3Rha2VMaW1pdFByaWNlBAdfdHJhZGVyCQClCAEIBQFpBmNhbGxlcgQHY2xlYW5VcAkA/AcEBQR0aGlzAhJjbGVhblVwU3RhbGVPcmRlcnMJAMwIAgUEX2FtbQkAzAgCBQdfdHJhZGVyBQNuaWwFA25pbAMJAAACBQdjbGVhblVwBQdjbGVhblVwAwMJAQEhAQkBC2luaXRpYWxpemVkAAYJAQEhAQkBC2lzV2hpdGVsaXN0AQUEX2FtbQkAAgECL0ludmFsaWQgaW5jcmVhc2VQb3NpdGlvbldpdGhTdG9wTG9zcyBwYXJhbWV0ZXJzBAxwb3NpdGlvblNpemUJAQ9nZXRQb3NpdGlvblNpemUCBQRfYW1tBQdfdHJhZGVyAwkBAiE9AgUMcG9zaXRpb25TaXplAAAJAAIBAkJJbnZhbGlkIGluY3JlYXNlUG9zaXRpb25XaXRoU3RvcExvc3MgcGFyYW1ldGVyczogb25seSBuZXcgcG9zaXRpb24EDGRvU2V0Q29udGV4dAkA/AcEBQR0aGlzAgpzZXRDb250ZXh0CQDMCAIFB190cmFkZXIFA25pbAUDbmlsAwkAAAIFDGRvU2V0Q29udGV4dAUMZG9TZXRDb250ZXh0BA9kb0Nsb3NlUG9zaXRpb24JAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUEX2FtbQIQaW5jcmVhc2VQb3NpdGlvbgkAzAgCBQpfZGlyZWN0aW9uCQDMCAIFCV9sZXZlcmFnZQkAzAgCBRNfbWluQmFzZUFzc2V0QW1vdW50CQDMCAIFCF9yZWZMaW5rBQNuaWwIBQFpCHBheW1lbnRzAwkAAAIFD2RvQ2xvc2VQb3NpdGlvbgUPZG9DbG9zZVBvc2l0aW9uBA5kb1Jlc2V0Q29udGV4dAkA/AcEBQR0aGlzAgxyZXNldENvbnRleHQFA25pbAUDbmlsAwkAAAIFDmRvUmVzZXRDb250ZXh0BQ5kb1Jlc2V0Q29udGV4dAQSb3BlbmVkUG9zaXRpb25TaXplCQEPZ2V0UG9zaXRpb25TaXplAgUEX2FtbQUHX3RyYWRlcgMJAAACBRJvcGVuZWRQb3NpdGlvblNpemUFEm9wZW5lZFBvc2l0aW9uU2l6ZQQIYW1vdW50SW4JAQNhYnMBBRJvcGVuZWRQb3NpdGlvblNpemUEDHN0b3BMb3NzU2lkZQMJAGYCAAAFEm9wZW5lZFBvc2l0aW9uU2l6ZQUETE9ORwUFU0hPUlQEEWRvQ3JlYXRlU3RvcE9yZGVyAwkAZgIFEV9zdG9wVHJpZ2dlclByaWNlAAAEEWRvQ3JlYXRlU3RvcE9yZGVyCQD8BwQFBHRoaXMCE2ludGVybmFsQ3JlYXRlT3JkZXIJAMwIAgUHX3RyYWRlcgkAzAgCBQRfYW1tCQDMCAIFBFNUT1AJAMwIAgURX3N0b3BUcmlnZ2VyUHJpY2UJAMwIAgUPX3N0b3BMaW1pdFByaWNlCQDMCAIFCGFtb3VudEluCQDMCAIAAAkAzAgCBQxzdG9wTG9zc1NpZGUJAMwIAgUIX3JlZkxpbmsJAMwIAgIACQDMCAIAAAUDbmlsBQNuaWwDCQAAAgURZG9DcmVhdGVTdG9wT3JkZXIFEWRvQ3JlYXRlU3RvcE9yZGVyBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAMJAAACBRFkb0NyZWF0ZVN0b3BPcmRlcgURZG9DcmVhdGVTdG9wT3JkZXIEEWRvQ3JlYXRlVGFrZU9yZGVyAwkAZgIFEV90YWtlVHJpZ2dlclByaWNlAAAEEWRvQ3JlYXRlVGFrZU9yZGVyCQD8BwQFBHRoaXMCE2ludGVybmFsQ3JlYXRlT3JkZXIJAMwIAgUHX3RyYWRlcgkAzAgCBQRfYW1tCQDMCAIFBFRBS0UJAMwIAgURX3Rha2VUcmlnZ2VyUHJpY2UJAMwIAgUPX3Rha2VMaW1pdFByaWNlCQDMCAIFCGFtb3VudEluCQDMCAIAAAkAzAgCBQxzdG9wTG9zc1NpZGUJAMwIAgUIX3JlZkxpbmsJAMwIAgIACQDMCAIAAAUDbmlsBQNuaWwDCQAAAgURZG9DcmVhdGVUYWtlT3JkZXIFEWRvQ3JlYXRlVGFrZU9yZGVyBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAMJAAACBRFkb0NyZWF0ZVRha2VPcmRlcgURZG9DcmVhdGVUYWtlT3JkZXIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARNpbnRlcm5hbENyZWF0ZU9yZGVyCwdfdHJhZGVyBF9hbW0FX3R5cGUNX3RyaWdnZXJQcmljZQtfbGltaXRQcmljZQlfYW1vdW50SW4JX2xldmVyYWdlBV9zaWRlCF9yZWZMaW5rD19wYXltZW50QXNzZXRJZA5fcGF5bWVudEFtb3VudAMDAwMDAwMDAwkBASEBCQELaW5pdGlhbGl6ZWQABgkBASEBCQELaXNXaGl0ZWxpc3QBBQRfYW1tBgkAZwIAAAUNX3RyaWdnZXJQcmljZQYJAGYCAAAFC19saW1pdFByaWNlBgkAZwIAAAUJX2Ftb3VudEluBgkAZgIAAAUJX2xldmVyYWdlBgkBASEBAwkAAAIFBV9zaWRlBQRMT05HBgkAAAIFBV9zaWRlBQVTSE9SVAYJAQEhAQMDCQAAAgUFX3R5cGUFBFNUT1AGCQAAAgUFX3R5cGUFBFRBS0UGCQAAAgUFX3R5cGUFBUxJTUlUBgkBASEBCQAAAggFAWkGY2FsbGVyBQR0aGlzCQACAQIeSW52YWxpZCBjcmVhdGVPcmRlciBwYXJhbWV0ZXJzBAdvcmRlcklkCQBkAgkBDmN1cnJlbnRPcmRlcklkAAABBBNuZXdUcmFkZXJPcmRlckNvdW50CQBkAgkBE2dldFRyYWRlck9yZGVyQ291bnQCBQRfYW1tBQdfdHJhZGVyAAEEDHBvc2l0aW9uU2l6ZQkBD2dldFBvc2l0aW9uU2l6ZQIFBF9hbW0FB190cmFkZXIECl9kaXJlY3Rpb24DAwMJAAACBQxwb3NpdGlvblNpemUAAAYDCQBmAgUMcG9zaXRpb25TaXplAAAJAAACBQVfc2lkZQUETE9ORwcGAwkAZgIAAAUMcG9zaXRpb25TaXplCQAAAgUFX3NpZGUFBVNIT1JUBwUISU5DUkVBU0UFCERFQ1JFQVNFAwMJAAACBQxwb3NpdGlvblNpemUAAAMJAAACBQVfdHlwZQUEU1RPUAYJAAACBQVfdHlwZQUEVEFLRQcJAAIBAitDYW4gbm90IGNyZWF0ZSBTVE9QL1RBS0Ugb3JkZXI6IG5vIHBvc2l0aW9uBAt1c2RuUGF5bWVudAMJAAACBQpfZGlyZWN0aW9uBQhJTkNSRUFTRQMDCQECIT0CBQ9fcGF5bWVudEFzc2V0SWQJANgEAQkBCnF1b3RlQXNzZXQABgkBAiE9AgUOX3BheW1lbnRBbW91bnQFCV9hbW91bnRJbgkAAgECNEludmFsaWQgY3JlYXRlTGltaXRPcmRlciBwYXJhbWV0ZXJzOiBpbnZhbGlkIHBheW1lbnQEBXN0YWtlCQD8BwQJAQ5tYW5hZ2VyQWRkcmVzcwACB2RlcG9zaXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQ5fcGF5bWVudEFtb3VudAUDbmlsAwkAAAIFBXN0YWtlBQVzdGFrZQUOX3BheW1lbnRBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAMJAAACBQt1c2RuUGF5bWVudAULdXNkblBheW1lbnQECnBvc2l0aW9uSWQDCQECIT0CBQxwb3NpdGlvblNpemUAAAkBDWdldFBvc2l0aW9uSWQCBQRfYW1tBQdfdHJhZGVyAAADCQBmAgUTbmV3VHJhZGVyT3JkZXJDb3VudAUZTUFYX1RSQURFUl9PUkRFUlNfUEVSX0FNTQkAAgECMEludmFsaWQgY3JlYXRlTGltaXRPcmRlciBwYXJhbWV0ZXJzOiBvcmRlciBjb3VudAkAzggCCQDOCAIJAM4IAgkBCXNhdmVPcmRlcgwFB29yZGVySWQFBF9hbW0FB190cmFkZXIFCV9hbW91bnRJbgUJX2xldmVyYWdlBQVfdHlwZQUNX3RyaWdnZXJQcmljZQULdXNkblBheW1lbnQFBV9zaWRlBQhfcmVmTGluawUKcG9zaXRpb25JZAULX2xpbWl0UHJpY2UJARBhZGRSZW1vdmVPcmRlcklkBAUHb3JkZXJJZAUEX2FtbQUHX3RyYWRlcgYJARZ1cGRhdGVUcmFkZXJPcmRlckNvdW50AwUEX2FtbQUHX3RyYWRlcgUTbmV3VHJhZGVyT3JkZXJDb3VudAkBEXVwZGF0ZUxhc3RPcmRlcklkAQUHb3JkZXJJZAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQtjYW5jZWxPcmRlcgEIX29yZGVySWQEDSR0MDE1OTA4MTYxMjcJAQhnZXRPcmRlcgEFCF9vcmRlcklkBARfYW1tCAUNJHQwMTU5MDgxNjEyNwJfMQQHX3RyYWRlcggFDSR0MDE1OTA4MTYxMjcCXzIECV9hbW91bnRJbggFDSR0MDE1OTA4MTYxMjcCXzMECV9sZXZlcmFnZQgFDSR0MDE1OTA4MTYxMjcCXzQEBV90eXBlCAUNJHQwMTU5MDgxNjEyNwJfNQQNX3RyaWdnZXJQcmljZQgFDSR0MDE1OTA4MTYxMjcCXzYEC19hbW91bnRVc2RuCAUNJHQwMTU5MDgxNjEyNwJfNwQFX3NpZGUIBQ0kdDAxNTkwODE2MTI3Al84BAhfcmVmTGluawgFDSR0MDE1OTA4MTYxMjcCXzkEC19wb3NpdGlvbklkCAUNJHQwMTU5MDgxNjEyNwNfMTAEC19saW1pdFByaWNlCAUNJHQwMTU5MDgxNjEyNwNfMTEDAwMJAQEhAQkBC2luaXRpYWxpemVkAAYJAQEhAQkBB2lzVmFsaWQBBQhfb3JkZXJJZAYJAQEhAQkAAAIJAKUIAQgFAWkGY2FsbGVyBQdfdHJhZGVyCQACAQIeSW52YWxpZCBjYW5jZWxPcmRlciBwYXJhbWV0ZXJzBAdjbGVhblVwCQD8BwQFBHRoaXMCEmNsZWFuVXBTdGFsZU9yZGVycwkAzAgCBQRfYW1tCQDMCAIFB190cmFkZXIFA25pbAUDbmlsAwkAAAIFB2NsZWFuVXAFB2NsZWFuVXAEE25ld1RyYWRlck9yZGVyQ291bnQJAGUCCQETZ2V0VHJhZGVyT3JkZXJDb3VudAIFBF9hbW0FB190cmFkZXIAAQQId2l0aGRyYXcDCQBmAgULX2Ftb3VudFVzZG4AAAQHdW5zdGFrZQkA/AcECQEObWFuYWdlckFkZHJlc3MAAgh3aXRoZHJhdwkAzAgCCQDYBAEJAQpxdW90ZUFzc2V0AAkAzAgCBQtfYW1vdW50VXNkbgUDbmlsBQNuaWwDCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwDCQAAAgUId2l0aGRyYXcFCHdpdGhkcmF3CQDOCAIJAM4IAgkAzggCCQEPbWFya0NhbmNlbE9yZGVyAQUIX29yZGVySWQJARBhZGRSZW1vdmVPcmRlcklkBAUIX29yZGVySWQFBF9hbW0FB190cmFkZXIHCQEWdXBkYXRlVHJhZGVyT3JkZXJDb3VudAMFBF9hbW0FB190cmFkZXIFE25ld1RyYWRlck9yZGVyQ291bnQDCQBmAgULX2Ftb3VudFVzZG4AAAkAzAgCCQEOU2NyaXB0VHJhbnNmZXIDCAUBaQZjYWxsZXIFC19hbW91bnRVc2RuCQEKcXVvdGVBc3NldAAFA25pbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBDGV4ZWN1dGVPcmRlcgEIX29yZGVySWQEDSR0MDE3MDk4MTczMTcJAQhnZXRPcmRlcgEFCF9vcmRlcklkBARfYW1tCAUNJHQwMTcwOTgxNzMxNwJfMQQHX3RyYWRlcggFDSR0MDE3MDk4MTczMTcCXzIECV9hbW91bnRJbggFDSR0MDE3MDk4MTczMTcCXzMECV9sZXZlcmFnZQgFDSR0MDE3MDk4MTczMTcCXzQEBV90eXBlCAUNJHQwMTcwOTgxNzMxNwJfNQQNX3RyaWdnZXJQcmljZQgFDSR0MDE3MDk4MTczMTcCXzYEC19hbW91bnRVc2RuCAUNJHQwMTcwOTgxNzMxNwJfNwQFX3NpZGUIBQ0kdDAxNzA5ODE3MzE3Al84BAhfcmVmTGluawgFDSR0MDE3MDk4MTczMTcCXzkEC19wb3NpdGlvbklkCAUNJHQwMTcwOTgxNzMxNwNfMTAEC19saW1pdFByaWNlCAUNJHQwMTcwOTgxNzMxNwNfMTEEB2NsZWFuVXAJAPwHBAUEdGhpcwISY2xlYW5VcFN0YWxlT3JkZXJzCQDMCAIFBF9hbW0JAMwIAgUHX3RyYWRlcgUDbmlsBQNuaWwDCQAAAgUHY2xlYW5VcAUHY2xlYW5VcAMDCQEBIQEJAQtpbml0aWFsaXplZAAGCQEBIQEJAQdpc1ZhbGlkAQUIX29yZGVySWQJAAIBAh9JbnZhbGlkIGV4ZWN1dGVPcmRlciBwYXJhbWV0ZXJzBAxwb3NpdGlvblNpemUJAQ9nZXRQb3NpdGlvblNpemUCBQRfYW1tBQdfdHJhZGVyBBFjdXJyZW50UG9zaXRpb25JZAMJAQIhPQIFDHBvc2l0aW9uU2l6ZQAACQENZ2V0UG9zaXRpb25JZAIFBF9hbW0FB190cmFkZXIAAAQNJHQwMTc3MjEyMTU0MgMJAAACBQVfdHlwZQUEU1RPUAQSX3Bvc2l0aW9uRGlyZWN0aW9uAwkAZgIFDHBvc2l0aW9uU2l6ZQAABQRMT05HAwkAZgIAAAUMcG9zaXRpb25TaXplBQVTSE9SVAkAAgECLENhbiBub3QgZXhlY3V0ZSBTVE9QIG9yZGVyOiBubyBvcGVuIHBvc2l0aW9uBAttYXJrZXRQcmljZQkBDmdldE1hcmtldFByaWNlAQUEX2FtbQQMaXNFeGVjdXRhYmxlAwkAAAIFBV9zaWRlBRJfcG9zaXRpb25EaXJlY3Rpb24JAAIBAidDYW4gbm90IGV4ZWN1dGUgU1RPUCBvcmRlcjogcmVkdWNlIG9ubHkDCQECIT0CBRFjdXJyZW50UG9zaXRpb25JZAULX3Bvc2l0aW9uSWQJAAIBAitDYW4gbm90IGV4ZWN1dGUgU1RPUCBvcmRlcjogcG9zaXRpb24gY2xvc2VkAwkAAAIFEl9wb3NpdGlvbkRpcmVjdGlvbgUETE9ORwkAZwIFDV90cmlnZ2VyUHJpY2UFC21hcmtldFByaWNlCQBnAgULbWFya2V0UHJpY2UFDV90cmlnZ2VyUHJpY2UDBQxpc0V4ZWN1dGFibGUJAJUKAwINY2xvc2VQb3NpdGlvbgkAzAgCCQEEbWludgIFCV9hbW91bnRJbgkBA2FicwEFDHBvc2l0aW9uU2l6ZQkAzAgCCQEEbXVsZAIFC19saW1pdFByaWNlCQEDYWJzAQUMcG9zaXRpb25TaXplBQNuaWwFA25pbAkAAgECMUNhbiBub3QgZXhlY3V0ZSBTVE9QIG9yZGVyOiB0cmlnZ2VyUHJpY2UgbWlzbWF0Y2gDCQAAAgUFX3R5cGUFBFRBS0UEEl9wb3NpdGlvbkRpcmVjdGlvbgMJAGYCBQxwb3NpdGlvblNpemUAAAUETE9ORwMJAGYCAAAFDHBvc2l0aW9uU2l6ZQUFU0hPUlQJAAIBAixDYW4gbm90IGV4ZWN1dGUgU1RPUCBvcmRlcjogbm8gb3BlbiBwb3NpdGlvbgQLbWFya2V0UHJpY2UJAQ5nZXRNYXJrZXRQcmljZQEFBF9hbW0EDGlzRXhlY3V0YWJsZQMJAAACBQVfc2lkZQUSX3Bvc2l0aW9uRGlyZWN0aW9uCQACAQInQ2FuIG5vdCBleGVjdXRlIFRBS0Ugb3JkZXI6IHJlZHVjZSBvbmx5AwkBAiE9AgURY3VycmVudFBvc2l0aW9uSWQFC19wb3NpdGlvbklkCQACAQkArAICCQCsAgIJAKwCAgIsQ2FuIG5vdCBleGVjdXRlIFRBS0Ugb3JkZXI6IHBvc2l0aW9uIGNsb3NlZCAJAKQDAQURY3VycmVudFBvc2l0aW9uSWQCAiE9CQCkAwEFC19wb3NpdGlvbklkAwkAAAIFEl9wb3NpdGlvbkRpcmVjdGlvbgUETE9ORwkAZwIFC21hcmtldFByaWNlBQ1fdHJpZ2dlclByaWNlCQBnAgUNX3RyaWdnZXJQcmljZQULbWFya2V0UHJpY2UDBQxpc0V4ZWN1dGFibGUJAJUKAwINY2xvc2VQb3NpdGlvbgkAzAgCCQEEbWludgIFCV9hbW91bnRJbgkBA2FicwEFDHBvc2l0aW9uU2l6ZQkAzAgCCQEEbXVsZAIFC19saW1pdFByaWNlCQEDYWJzAQUMcG9zaXRpb25TaXplBQNuaWwFA25pbAkAAgECMUNhbiBub3QgZXhlY3V0ZSBUQUtFIG9yZGVyOiB0cmlnZ2VyUHJpY2UgbWlzbWF0Y2gDCQAAAgUFX3R5cGUFBUxJTUlUBAttYXJrZXRQcmljZQkBDmdldE1hcmtldFByaWNlAQUEX2FtbQQGc3ByZWFkAwkAAAIFC19saW1pdFByaWNlAAAJAQlnZXRTcHJlYWQBBQ1fdHJpZ2dlclByaWNlCQEDYWJzAQkAZQIFDV90cmlnZ2VyUHJpY2UFC19saW1pdFByaWNlBAxpc0V4ZWN1dGFibGUDCQBnAgULbWFya2V0UHJpY2UJAGUCBQ1fdHJpZ2dlclByaWNlBQZzcHJlYWQJAGcCCQBkAgUNX3RyaWdnZXJQcmljZQUGc3ByZWFkBQttYXJrZXRQcmljZQcDBQxpc0V4ZWN1dGFibGUEEl9wb3NpdGlvbkRpcmVjdGlvbgMJAGYCBQxwb3NpdGlvblNpemUAAAUETE9ORwMJAGYCAAAFDHBvc2l0aW9uU2l6ZQUFU0hPUlQA////////////AQQJZGlyZWN0aW9uAwkAAAIFDHBvc2l0aW9uU2l6ZQAABQhJTkNSRUFTRQMJAAACBRJfcG9zaXRpb25EaXJlY3Rpb24FBV9zaWRlBQhJTkNSRUFTRQUIREVDUkVBU0UDCQAAAgUJZGlyZWN0aW9uBQhJTkNSRUFTRQQPYW1vdW50SW5XaXRoRmVlCQBlAgULX2Ftb3VudFVzZG4JAQRtdWxkAgULX2Ftb3VudFVzZG4JAQZnZXRGZWUCBQRfYW1tBQdfdHJhZGVyCQCVCgMCEGluY3JlYXNlUG9zaXRpb24JAMwIAgUFX3NpZGUJAMwIAgUJX2xldmVyYWdlCQDMCAIDCQAAAgULX2xpbWl0UHJpY2UAAAAACQEEZGl2ZAIFD2Ftb3VudEluV2l0aEZlZQULX2xpbWl0UHJpY2UJAMwIAgUIX3JlZkxpbmsFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQtfYW1vdW50VXNkbgUDbmlsCQCVCgMCDWNsb3NlUG9zaXRpb24JAMwIAgUJX2Ftb3VudEluCQDMCAIJAQRtdWxkAgUJX2Ftb3VudEluBQtfbGltaXRQcmljZQUDbmlsBQNuaWwJAAIBAjJDYW4gbm90IGV4ZWN1dGUgTElNSVQgb3JkZXI6IHRyaWdnZXJQcmljZSBtaXNtYXRjaAkAAgEJAKwCAgIUSW52YWxpZCBvcmRlciB0eXBlOiAJAKQDAQUFX3R5cGUEBm1ldGhvZAgFDSR0MDE3NzIxMjE1NDICXzEEBGFyZ3MIBQ0kdDAxNzcyMTIxNTQyAl8yBAhwYXltZW50cwgFDSR0MDE3NzIxMjE1NDICXzMECHdpdGhkcmF3AwkAAAIJAJADAQUIcGF5bWVudHMAAQQHdW5zdGFrZQkA/AcECQEObWFuYWdlckFkZHJlc3MAAgh3aXRoZHJhdwkAzAgCCQDYBAEJAQpxdW90ZUFzc2V0AAkAzAgCCAkAkQMCBQhwYXltZW50cwAABmFtb3VudAUDbmlsBQNuaWwDCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwDCQAAAgUId2l0aGRyYXcFCHdpdGhkcmF3BAxkb1NldENvbnRleHQJAPwHBAUEdGhpcwIKc2V0Q29udGV4dAkAzAgCBQdfdHJhZGVyBQNuaWwFA25pbAMJAAACBQxkb1NldENvbnRleHQFDGRvU2V0Q29udGV4dAQPZG9DbG9zZVBvc2l0aW9uCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBF9hbW0FBm1ldGhvZAUEYXJncwUIcGF5bWVudHMDCQAAAgUPZG9DbG9zZVBvc2l0aW9uBQ9kb0Nsb3NlUG9zaXRpb24EDmRvUmVzZXRDb250ZXh0CQD8BwQFBHRoaXMCDHJlc2V0Q29udGV4dAUDbmlsBQNuaWwDCQAAAgUOZG9SZXNldENvbnRleHQFDmRvUmVzZXRDb250ZXh0BBNuZXdUcmFkZXJPcmRlckNvdW50CQBlAgkBE2dldFRyYWRlck9yZGVyQ291bnQCBQRfYW1tBQdfdHJhZGVyAAEJAM4IAgkAzggCCQEWdXBkYXRlVHJhZGVyT3JkZXJDb3VudAMFBF9hbW0FB190cmFkZXIFE25ld1RyYWRlck9yZGVyQ291bnQJARBhZGRSZW1vdmVPcmRlcklkBAUIX29yZGVySWQFBF9hbW0FB190cmFkZXIHCQEQbWFya0V4ZWN1dGVPcmRlcgEFCF9vcmRlcklkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBFHZpZXdfY2FuRXhlY3V0ZU9yZGVyAQhfb3JkZXJJZAQBcwkA/AcEBQR0aGlzAgxleGVjdXRlT3JkZXIJAMwIAgUIX29yZGVySWQFA25pbAUDbmlsAwkAAAIFAXMFAXMJAAIBAgdTdWNjZXNzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQJ0eAEGdmVyaWZ5AAkA9AMDCAUCdHgJYm9keUJ5dGVzCQCRAwIIBQJ0eAZwcm9vZnMAAAkBDmFkbWluUHVibGljS2V5ABy9SNs=", "height": 2397174, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 67rL8AVvC7VQ37dptjZm8ZXwqYraFf8gfxETRdmkMAq2 Next: JAco3pQugD5qhd1Mc8q5S4gFRzpcvjbSBKy3PhxfXvcR Diff:
OldNewDifferences
55
66 let b = "k_admin_public_key"
77
8-let c = "k_qtAstR"
8+let c = "k_quote_asset"
99
10-let d = "k_bsAstR"
10+let d = "k_amm"
1111
12-let e = "k_positionClosedDate"
12+let e = "k_manager_address"
1313
14-let f = "k_executedOrders"
14+let f = "k_positionSequence"
1515
16-let g = "k_sender"
16+let g = "k_positionSize"
1717
18-let h = "k_initialized"
18+let h = "k_fee"
1919
20-let i = 1
20+let i = "k_executedOrders"
2121
22-let j = 2
22+let j = "k_canceledOrders"
2323
24-let k = lastBlock.timestamp
24+let k = "k_order"
2525
26-let l = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
26+let l = "k_lastOrderId"
2727
28-func m (n,o) = fraction(n, l, o, HALFEVEN)
28+let m = "k_traderOrderCnt"
29+
30+let n = "k_traderOrderIds"
31+
32+let o = "k_sender"
33+
34+let p = "k_initialized"
35+
36+let q = 1
37+
38+let r = 2
39+
40+let s = 3
41+
42+let t = 1
43+
44+let u = 2
45+
46+let v = 1
47+
48+let w = 2
49+
50+let x = 5
51+
52+let y = lastBlock.timestamp
53+
54+let z = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
55+
56+let A = (z / 200)
57+
58+func B (C) = if ((C > 0))
59+ then C
60+ else -(C)
2961
3062
31-func p (n,o) = fraction(n, o, l, HALFEVEN)
63+func D (C,E) = fraction(C, z, E, HALFEVEN)
3264
3365
34-func q (r) = ((f + "_") + r)
66+func F (C,E) = fraction(C, E, z, HALFEVEN)
3567
3668
37-func s () = valueOrErrorMessage(addressFromString(getStringValue(this, a)), "Coordinator not set")
69+func G (C,E) = if ((C > E))
70+ then E
71+ else C
3872
3973
40-func t () = fromBase58String(getStringValue(s(), b))
74+func H (I,J) = ((I + "_") + J)
4175
4276
43-func u () = valueOrElse(getBoolean(this, h), false)
77+func K (L) = ((i + "_") + toString(L))
4478
4579
46-func v (w,x,y,z) = {
47- let A = toBytes((w + x))
48- let B = fromBase58String(y)
49- let C = fromBase58String(z)
50- if (sigVerify(A, B, C))
51- then unit
52- else throw("Invalid order signature")
80+func M (L) = ((j + "_") + toString(L))
81+
82+
83+func N (L) = H(k, toString(L))
84+
85+
86+func O (P,Q) = ((((m + "_") + P) + "_") + Q)
87+
88+
89+func R (P,Q) = ((((n + "_") + P) + "_") + Q)
90+
91+
92+func S () = valueOrErrorMessage(addressFromString(getStringValue(this, a)), "Coordinator not set")
93+
94+
95+func T () = fromBase58String(getStringValue(S(), c))
96+
97+
98+func U () = valueOrErrorMessage(addressFromString(getStringValue(S(), e)), "Manager not set")
99+
100+
101+func V (J) = valueOrElse(getBoolean(S(), H(d, J)), false)
102+
103+
104+func W () = fromBase58String(getStringValue(S(), b))
105+
106+
107+func X () = valueOrElse(getBoolean(this, p), false)
108+
109+
110+func Y (L) = if (valueOrElse(getBoolean(this, K(L)), false))
111+ then throw(("Order already executed: " + toString(L)))
112+ else if (valueOrElse(getBoolean(this, M(L)), false))
113+ then throw(("Order already cancelled: " + toString(L)))
114+ else true
115+
116+
117+func Z () = valueOrElse(getInteger(this, l), 0)
118+
119+
120+func aa (P,Q) = {
121+ let ab = O(P, Q)
122+ valueOrElse(getInteger(this, ab), 0)
53123 }
54124
55125
56-func D (r) = if (valueOrElse(getBoolean(this, q(r)), false))
57- then throw(("Order already executed: " + r))
58- else unit
126+func ac (P,Q) = {
127+ let ab = R(P, Q)
128+ let ad = valueOrElse(getString(this, ab), "")
129+ if ((ad == ""))
130+ then nil
131+ else split(ad, ",")
132+ }
59133
60134
61-@Callable(E)
62-func setContext (F) = if ((E.caller != this))
63- then throw("Only self-call")
64- else [StringEntry(g, F)]
135+func ae (L) = {
136+ let af = valueOrErrorMessage(getString(this, N(L)), ("Invalid order id: " + toString(L)))
137+ let ag = split(af, ",")
138+ let ah = ag[0]
139+ let ai = ag[1]
140+ let aj = valueOrErrorMessage(parseInt(ag[2]), "Invalid amountIn")
141+ let ak = valueOrErrorMessage(parseInt(ag[3]), "Invalid leverage")
142+ let al = valueOrErrorMessage(parseInt(ag[4]), "Invalid type")
143+ let am = valueOrErrorMessage(parseInt(ag[5]), "Invalid triggerPrice")
144+ let an = valueOrErrorMessage(parseInt(ag[6]), "Invalid paymentUsdn")
145+ let ao = valueOrErrorMessage(parseInt(ag[7]), "Invalid side")
146+ let ap = ag[8]
147+ let aq = valueOrErrorMessage(parseInt(ag[9]), "Invalid positionId")
148+ let ar = valueOrErrorMessage(parseInt(ag[10]), "Invalid limitPrice")
149+ $Tuple11(ah, ai, aj, ak, al, am, an, ao, ap, aq, ar)
150+ }
151+
152+
153+func as (P) = {
154+ let at = invoke(addressFromStringValue(P), "computeSpotPrice", nil, nil)
155+ if ((at == at))
156+ then {
157+ let au = {
158+ let av = at
159+ if ($isInstanceOf(av, "Int"))
160+ then {
161+ let aw = av
162+ aw
163+ }
164+ else throw("Invalid computeSpotPrice result")
165+ }
166+ value(au)
167+ }
168+ else throw("Strict value is not equal to itself.")
169+ }
170+
171+
172+func ax (P,Q) = {
173+ let at = invoke(addressFromStringValue(P), "computeFeeForTraderWithArtifact", [Q, ""], nil)
174+ if ((at == at))
175+ then {
176+ let au = {
177+ let av = at
178+ if ($isInstanceOf(av, "(Int, Boolean)"))
179+ then {
180+ let aw = av
181+ aw._1
182+ }
183+ else throw("Invalid computeFeeForTraderWithArtifact result")
184+ }
185+ value(au)
186+ }
187+ else throw("Strict value is not equal to itself.")
188+ }
189+
190+
191+func ay (P,Q) = {
192+ let ah = addressFromStringValue(P)
193+ let az = H(g, Q)
194+ valueOrElse(getInteger(ah, az), 0)
195+ }
196+
197+
198+func aA (P,Q) = {
199+ let ah = addressFromStringValue(P)
200+ let aB = H(f, Q)
201+ valueOrElse(getInteger(ah, aB), 0)
202+ }
203+
204+
205+func aC (aD) = F(aD, A)
206+
207+
208+func aE (L,P,Q,aF,aG,aH,aI,aJ,aK,aL,aM,aN) = {
209+ let af = makeString([P, Q, toString(aF), toString(aG), toString(aH), toString(aI), toString(aJ), toString(aK), aL, toString(aM), toString(aN)], ",")
210+[StringEntry(N(L), af)]
211+ }
212+
213+
214+func aO (L,P,Q,aP) = {
215+ let aQ = ac(P, Q)
216+ let aR = if (aP)
217+ then (aQ :+ toString(L))
218+ else removeByIndex(aQ, valueOrErrorMessage(indexOf(aQ, toString(L)), ("No order with id: " + toString(L))))
219+ let aS = makeString(aR, ",")
220+[StringEntry(R(P, Q), aS)]
221+ }
222+
223+
224+func aT (P,Q,aU) = [IntegerEntry(O(P, Q), aU)]
225+
226+
227+func aV (aW) = [IntegerEntry(l, aW)]
228+
229+
230+func aX (L) = [BooleanEntry(H(i, toString(L)), true)]
231+
232+
233+func aY (L) = [BooleanEntry(H(j, toString(L)), true)]
234+
235+
236+@Callable(aZ)
237+func cleanUpStaleOrders (P,Q) = {
238+ let ba = ac(P, Q)
239+ let bb = aa(P, Q)
240+ func bc (bd,L) = {
241+ let be = valueOrErrorMessage(parseInt(L), "Invalid order id")
242+ let bf = ae(be)
243+ let bg = bf._1
244+ let bh = bf._2
245+ let bi = bf._3
246+ let bj = bf._4
247+ let aH = bf._5
248+ let bk = bf._6
249+ let bl = bf._7
250+ let bm = bf._8
251+ let bn = bf._9
252+ let aM = bf._10
253+ let bo = bf._11
254+ let bp = ay(P, Q)
255+ let bq = if ((bp != 0))
256+ then aA(P, Q)
257+ else 0
258+ if (if (if ((aH == q))
259+ then true
260+ else (aH == r))
261+ then (bq != aM)
262+ else false)
263+ then {
264+ let br = (aY(be) ++ aO(be, P, Q, false))
265+ $Tuple2((bd._1 + 1), (bd._2 ++ br))
266+ }
267+ else bd
268+ }
269+
270+ let bs = {
271+ let bt = ba
272+ let bu = size(bt)
273+ let bv = $Tuple2(0, nil)
274+ func bw (bx,by) = if ((by >= bu))
275+ then bx
276+ else bc(bx, bt[by])
277+
278+ func bz (bx,by) = if ((by >= bu))
279+ then bx
280+ else throw("List size exceeds 5")
281+
282+ bz(bw(bw(bw(bw(bw(bv, 0), 1), 2), 3), 4), 5)
283+ }
284+ (bs._2 ++ aT(P, Q, (bb - bs._1)))
285+ }
65286
66287
67288
68-@Callable(E)
69-func resetContext () = if ((E.caller != this))
289+@Callable(aZ)
290+func setContext (bA) = if ((aZ.caller != this))
70291 then throw("Only self-call")
71- else [DeleteEntry(g)]
292+ else [StringEntry(o, bA)]
72293
73294
74295
75-@Callable(E)
76-func initialize (G) = if (u())
77- then throw("Already initialized")
78- else [StringEntry(a, G), BooleanEntry(h, true)]
296+@Callable(aZ)
297+func resetContext () = if ((aZ.caller != this))
298+ then throw("Only self-call")
299+ else [DeleteEntry(o)]
79300
80301
81302
82-@Callable(E)
83-func executeOrder (w,x,y) = {
84- let H = split(x, ",")
85- let I = valueOrErrorMessage(parseInt(H[0]), "Invalid order data [type]")
86- let J = toBase58String(sha256(toBytes(x)))
87- let K = D(J)
88- if ((K == K))
89- then if (if ((I == i))
303+@Callable(aZ)
304+func initialize (bB) = if (X())
305+ then throw("Already initialized")
306+ else [StringEntry(a, bB), BooleanEntry(p, true)]
307+
308+
309+
310+@Callable(aZ)
311+func createOrder (P,aH,aI,aN,aF,aG,aK,aL) = {
312+ let Q = toString(aZ.caller)
313+ let bC = invoke(this, "cleanUpStaleOrders", [P, Q], nil)
314+ if ((bC == bC))
315+ then if ((size(aZ.payments) > 1))
316+ then throw("Invalid createOrder parameters: invalid payment count")
317+ else {
318+ let bD = if ((size(aZ.payments) == 1))
319+ then $Tuple2(toBase58String(valueOrErrorMessage(aZ.payments[0].assetId, "Invalid asset id")), aZ.payments[0].amount)
320+ else $Tuple2("", 0)
321+ let bE = bD._1
322+ let bF = bD._2
323+ let bG = invoke(this, "internalCreateOrder", [Q, P, aH, aI, aN, aF, aG, aK, aL, bE, bF], nil)
324+ if ((bG == bG))
325+ then nil
326+ else throw("Strict value is not equal to itself.")
327+ }
328+ else throw("Strict value is not equal to itself.")
329+ }
330+
331+
332+
333+@Callable(aZ)
334+func increasePositionWithStopLoss (P,bH,aG,bI,aL,bJ,bK,bL,bM) = {
335+ let Q = toString(aZ.caller)
336+ let bC = invoke(this, "cleanUpStaleOrders", [P, Q], nil)
337+ if ((bC == bC))
338+ then if (if (!(X()))
90339 then true
91- else (I == j))
92- then {
93- let L = H[1]
94- let M = H[2]
95- let N = valueOrErrorMessage(parseInt(H[3]), "Invalid order data [price]")
96- let O = valueOrErrorMessage(parseInt(H[4]), "Invalid order data [timestamp]")
97- let P = valueOrErrorMessage(parseInt(H[5]), "Invalid order data [validDue]")
98- let Q = v(w, x, y, M)
99- if ((Q == Q))
340+ else !(V(P)))
341+ then throw("Invalid increasePositionWithStopLoss parameters")
342+ else {
343+ let bp = ay(P, Q)
344+ if ((bp != 0))
345+ then throw("Invalid increasePositionWithStopLoss parameters: only new position")
346+ else {
347+ let bN = invoke(this, "setContext", [Q], nil)
348+ if ((bN == bN))
349+ then {
350+ let bO = invoke(addressFromStringValue(P), "increasePosition", [bH, aG, bI, aL], aZ.payments)
351+ if ((bO == bO))
352+ then {
353+ let bP = invoke(this, "resetContext", nil, nil)
354+ if ((bP == bP))
355+ then {
356+ let bQ = ay(P, Q)
357+ if ((bQ == bQ))
358+ then {
359+ let aj = B(bQ)
360+ let bR = if ((0 > bQ))
361+ then t
362+ else u
363+ let bS = if ((bJ > 0))
364+ then {
365+ let bS = invoke(this, "internalCreateOrder", [Q, P, q, bJ, bK, aj, 0, bR, aL, "", 0], nil)
366+ if ((bS == bS))
367+ then nil
368+ else throw("Strict value is not equal to itself.")
369+ }
370+ else nil
371+ if ((bS == bS))
372+ then {
373+ let bT = if ((bL > 0))
374+ then {
375+ let bT = invoke(this, "internalCreateOrder", [Q, P, r, bL, bM, aj, 0, bR, aL, "", 0], nil)
376+ if ((bT == bT))
377+ then nil
378+ else throw("Strict value is not equal to itself.")
379+ }
380+ else nil
381+ if ((bT == bT))
382+ then nil
383+ else throw("Strict value is not equal to itself.")
384+ }
385+ else throw("Strict value is not equal to itself.")
386+ }
387+ else throw("Strict value is not equal to itself.")
388+ }
389+ else throw("Strict value is not equal to itself.")
390+ }
391+ else throw("Strict value is not equal to itself.")
392+ }
393+ else throw("Strict value is not equal to itself.")
394+ }
395+ }
396+ else throw("Strict value is not equal to itself.")
397+ }
398+
399+
400+
401+@Callable(aZ)
402+func internalCreateOrder (Q,P,aH,aI,aN,aF,aG,aK,aL,bU,bV) = if (if (if (if (if (if (if (if (if (!(X()))
403+ then true
404+ else !(V(P)))
405+ then true
406+ else (0 >= aI))
407+ then true
408+ else (0 > aN))
409+ then true
410+ else (0 >= aF))
411+ then true
412+ else (0 > aG))
413+ then true
414+ else !(if ((aK == t))
415+ then true
416+ else (aK == u)))
417+ then true
418+ else !(if (if ((aH == q))
419+ then true
420+ else (aH == r))
421+ then true
422+ else (aH == s)))
423+ then true
424+ else !((aZ.caller == this)))
425+ then throw("Invalid createOrder parameters")
426+ else {
427+ let bW = (Z() + 1)
428+ let bX = (aa(P, Q) + 1)
429+ let bp = ay(P, Q)
430+ let bH = if (if (if ((bp == 0))
431+ then true
432+ else if ((bp > 0))
433+ then (aK == t)
434+ else false)
435+ then true
436+ else if ((0 > bp))
437+ then (aK == u)
438+ else false)
439+ then v
440+ else w
441+ if (if ((bp == 0))
442+ then if ((aH == q))
443+ then true
444+ else (aH == r)
445+ else false)
446+ then throw("Can not create STOP/TAKE order: no position")
447+ else {
448+ let bY = if ((bH == v))
449+ then if (if ((bU != toBase58String(T())))
450+ then true
451+ else (bV != aF))
452+ then throw("Invalid createLimitOrder parameters: invalid payment")
453+ else {
454+ let bZ = invoke(U(), "deposit", nil, [AttachedPayment(T(), bV)])
455+ if ((bZ == bZ))
456+ then bV
457+ else throw("Strict value is not equal to itself.")
458+ }
459+ else 0
460+ if ((bY == bY))
100461 then {
101- let R = valueOrErrorMessage(addressFromString(L), "Invalid order data [amm]")
102- let S = getIntegerValue(R, c)
103- let T = getIntegerValue(R, d)
104- let U = m(S, T)
105- let V = if ((I == i))
106- then (U >= N)
107- else (N >= U)
108- let W = if (!(V))
109- then throw(((("Can not execute order [price]: AMM Price=" + toString(U)) + " Order Price=") + toString(N)))
110- else unit
111- if ((W == W))
462+ let aq = if ((bp != 0))
463+ then aA(P, Q)
464+ else 0
465+ if ((bX > x))
466+ then throw("Invalid createLimitOrder parameters: order count")
467+ else (((aE(bW, P, Q, aF, aG, aH, aI, bY, aK, aL, aq, aN) ++ aO(bW, P, Q, true)) ++ aT(P, Q, bX)) ++ aV(bW))
468+ }
469+ else throw("Strict value is not equal to itself.")
470+ }
471+ }
472+
473+
474+
475+@Callable(aZ)
476+func cancelOrder (L) = {
477+ let ca = ae(L)
478+ let P = ca._1
479+ let Q = ca._2
480+ let aF = ca._3
481+ let aG = ca._4
482+ let aH = ca._5
483+ let aI = ca._6
484+ let cb = ca._7
485+ let aK = ca._8
486+ let aL = ca._9
487+ let aM = ca._10
488+ let aN = ca._11
489+ if (if (if (!(X()))
490+ then true
491+ else !(Y(L)))
492+ then true
493+ else !((toString(aZ.caller) == Q)))
494+ then throw("Invalid cancelOrder parameters")
495+ else {
496+ let bC = invoke(this, "cleanUpStaleOrders", [P, Q], nil)
497+ if ((bC == bC))
498+ then {
499+ let bX = (aa(P, Q) - 1)
500+ let cc = if ((cb > 0))
501+ then {
502+ let cd = invoke(U(), "withdraw", [toBase58String(T()), cb], nil)
503+ if ((cd == cd))
504+ then nil
505+ else throw("Strict value is not equal to itself.")
506+ }
507+ else nil
508+ if ((cc == cc))
509+ then (((aY(L) ++ aO(L, P, Q, false)) ++ aT(P, Q, bX)) ++ (if ((cb > 0))
510+ then [ScriptTransfer(aZ.caller, cb, T())]
511+ else nil))
512+ else throw("Strict value is not equal to itself.")
513+ }
514+ else throw("Strict value is not equal to itself.")
515+ }
516+ }
517+
518+
519+
520+@Callable(aZ)
521+func executeOrder (L) = {
522+ let ce = ae(L)
523+ let P = ce._1
524+ let Q = ce._2
525+ let aF = ce._3
526+ let aG = ce._4
527+ let aH = ce._5
528+ let aI = ce._6
529+ let cb = ce._7
530+ let aK = ce._8
531+ let aL = ce._9
532+ let aM = ce._10
533+ let aN = ce._11
534+ let bC = invoke(this, "cleanUpStaleOrders", [P, Q], nil)
535+ if ((bC == bC))
536+ then if (if (!(X()))
537+ then true
538+ else !(Y(L)))
539+ then throw("Invalid executeOrder parameters")
540+ else {
541+ let bp = ay(P, Q)
542+ let bq = if ((bp != 0))
543+ then aA(P, Q)
544+ else 0
545+ let cf = if ((aH == q))
546+ then {
547+ let cg = if ((bp > 0))
548+ then t
549+ else if ((0 > bp))
550+ then u
551+ else throw("Can not execute STOP order: no open position")
552+ let ch = as(P)
553+ let ci = if ((aK == cg))
554+ then throw("Can not execute STOP order: reduce only")
555+ else if ((bq != aM))
556+ then throw("Can not execute STOP order: position closed")
557+ else if ((cg == t))
558+ then (aI >= ch)
559+ else (ch >= aI)
560+ if (ci)
561+ then $Tuple3("closePosition", [G(aF, B(bp)), F(aN, B(bp))], nil)
562+ else throw("Can not execute STOP order: triggerPrice mismatch")
563+ }
564+ else if ((aH == r))
565+ then {
566+ let cg = if ((bp > 0))
567+ then t
568+ else if ((0 > bp))
569+ then u
570+ else throw("Can not execute STOP order: no open position")
571+ let ch = as(P)
572+ let ci = if ((aK == cg))
573+ then throw("Can not execute TAKE order: reduce only")
574+ else if ((bq != aM))
575+ then throw(((("Can not execute TAKE order: position closed " + toString(bq)) + "!=") + toString(aM)))
576+ else if ((cg == t))
577+ then (ch >= aI)
578+ else (aI >= ch)
579+ if (ci)
580+ then $Tuple3("closePosition", [G(aF, B(bp)), F(aN, B(bp))], nil)
581+ else throw("Can not execute TAKE order: triggerPrice mismatch")
582+ }
583+ else if ((aH == s))
112584 then {
113- let X = if ((P == 0))
114- then true
115- else (P >= k)
116- let Y = if (!(X))
117- then throw(((("Can not execute order [due]: Due=" + toString(P)) + " Time=") + toString(k)))
118- else unit
119- if ((Y == Y))
585+ let ch = as(P)
586+ let cj = if ((aN == 0))
587+ then aC(aI)
588+ else B((aI - aN))
589+ let ci = if ((ch >= (aI - cj)))
590+ then ((aI + cj) >= ch)
591+ else false
592+ if (ci)
120593 then {
121- let Z = toString(addressFromPublicKey(fromBase58String(M)))
122- let aa = valueOrElse(getInteger(R, ((e + "_") + Z)), 0)
123- let ab = (O >= aa)
124- let ac = if (!(ab))
125- then throw(((("Can not execute order [position closed]: Order Created=" + toString(O)) + " Position Closed=") + toString(aa)))
126- else unit
127- if ((ac == ac))
128- then if (if (if (V)
129- then X
130- else false)
131- then ab
132- else false)
133- then {
134- let ad = invoke(this, "setContext", [Z], nil)
135- if ((ad == ad))
136- then {
137- let ae = invoke(R, "closePosition", nil, nil)
138- if ((ae == ae))
139- then {
140- let af = invoke(this, "resetContext", nil, nil)
141- if ((af == af))
142- then [BooleanEntry(q(J), true)]
143- else throw("Strict value is not equal to itself.")
144- }
145- else throw("Strict value is not equal to itself.")
146- }
147- else throw("Strict value is not equal to itself.")
148- }
149- else throw("Invalid order execution timing")
594+ let cg = if ((bp > 0))
595+ then t
596+ else if ((0 > bp))
597+ then u
598+ else -1
599+ let ck = if ((bp == 0))
600+ then v
601+ else if ((cg == aK))
602+ then v
603+ else w
604+ if ((ck == v))
605+ then {
606+ let cl = (cb - F(cb, ax(P, Q)))
607+ $Tuple3("increasePosition", [aK, aG, if ((aN == 0))
608+ then 0
609+ else D(cl, aN), aL], [AttachedPayment(T(), cb)])
610+ }
611+ else $Tuple3("closePosition", [aF, F(aF, aN)], nil)
612+ }
613+ else throw("Can not execute LIMIT order: triggerPrice mismatch")
614+ }
615+ else throw(("Invalid order type: " + toString(aH)))
616+ let cm = cf._1
617+ let cn = cf._2
618+ let co = cf._3
619+ let cc = if ((size(co) == 1))
620+ then {
621+ let cd = invoke(U(), "withdraw", [toBase58String(T()), co[0].amount], nil)
622+ if ((cd == cd))
623+ then nil
624+ else throw("Strict value is not equal to itself.")
625+ }
626+ else nil
627+ if ((cc == cc))
628+ then {
629+ let bN = invoke(this, "setContext", [Q], nil)
630+ if ((bN == bN))
631+ then {
632+ let bO = invoke(addressFromStringValue(P), cm, cn, co)
633+ if ((bO == bO))
634+ then {
635+ let bP = invoke(this, "resetContext", nil, nil)
636+ if ((bP == bP))
637+ then {
638+ let bX = (aa(P, Q) - 1)
639+ ((aT(P, Q, bX) ++ aO(L, P, Q, false)) ++ aX(L))
640+ }
150641 else throw("Strict value is not equal to itself.")
151642 }
152643 else throw("Strict value is not equal to itself.")
155646 }
156647 else throw("Strict value is not equal to itself.")
157648 }
158- else throw(("Invalid order type: " + toString(I)))
159649 else throw("Strict value is not equal to itself.")
160650 }
161651
162652
163-@Verifier(ag)
164-func ah () = sigVerify(ag.bodyBytes, ag.proofs[0], t())
653+
654+@Callable(aZ)
655+func view_canExecuteOrder (L) = {
656+ let at = invoke(this, "executeOrder", [L], nil)
657+ if ((at == at))
658+ then throw("Success")
659+ else throw("Strict value is not equal to itself.")
660+ }
661+
662+
663+@Verifier(cp)
664+func cq () = sigVerify(cp.bodyBytes, cp.proofs[0], W())
165665
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let a = "k_coordinatorAddress"
55
66 let b = "k_admin_public_key"
77
8-let c = "k_qtAstR"
8+let c = "k_quote_asset"
99
10-let d = "k_bsAstR"
10+let d = "k_amm"
1111
12-let e = "k_positionClosedDate"
12+let e = "k_manager_address"
1313
14-let f = "k_executedOrders"
14+let f = "k_positionSequence"
1515
16-let g = "k_sender"
16+let g = "k_positionSize"
1717
18-let h = "k_initialized"
18+let h = "k_fee"
1919
20-let i = 1
20+let i = "k_executedOrders"
2121
22-let j = 2
22+let j = "k_canceledOrders"
2323
24-let k = lastBlock.timestamp
24+let k = "k_order"
2525
26-let l = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
26+let l = "k_lastOrderId"
2727
28-func m (n,o) = fraction(n, l, o, HALFEVEN)
28+let m = "k_traderOrderCnt"
29+
30+let n = "k_traderOrderIds"
31+
32+let o = "k_sender"
33+
34+let p = "k_initialized"
35+
36+let q = 1
37+
38+let r = 2
39+
40+let s = 3
41+
42+let t = 1
43+
44+let u = 2
45+
46+let v = 1
47+
48+let w = 2
49+
50+let x = 5
51+
52+let y = lastBlock.timestamp
53+
54+let z = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
55+
56+let A = (z / 200)
57+
58+func B (C) = if ((C > 0))
59+ then C
60+ else -(C)
2961
3062
31-func p (n,o) = fraction(n, o, l, HALFEVEN)
63+func D (C,E) = fraction(C, z, E, HALFEVEN)
3264
3365
34-func q (r) = ((f + "_") + r)
66+func F (C,E) = fraction(C, E, z, HALFEVEN)
3567
3668
37-func s () = valueOrErrorMessage(addressFromString(getStringValue(this, a)), "Coordinator not set")
69+func G (C,E) = if ((C > E))
70+ then E
71+ else C
3872
3973
40-func t () = fromBase58String(getStringValue(s(), b))
74+func H (I,J) = ((I + "_") + J)
4175
4276
43-func u () = valueOrElse(getBoolean(this, h), false)
77+func K (L) = ((i + "_") + toString(L))
4478
4579
46-func v (w,x,y,z) = {
47- let A = toBytes((w + x))
48- let B = fromBase58String(y)
49- let C = fromBase58String(z)
50- if (sigVerify(A, B, C))
51- then unit
52- else throw("Invalid order signature")
80+func M (L) = ((j + "_") + toString(L))
81+
82+
83+func N (L) = H(k, toString(L))
84+
85+
86+func O (P,Q) = ((((m + "_") + P) + "_") + Q)
87+
88+
89+func R (P,Q) = ((((n + "_") + P) + "_") + Q)
90+
91+
92+func S () = valueOrErrorMessage(addressFromString(getStringValue(this, a)), "Coordinator not set")
93+
94+
95+func T () = fromBase58String(getStringValue(S(), c))
96+
97+
98+func U () = valueOrErrorMessage(addressFromString(getStringValue(S(), e)), "Manager not set")
99+
100+
101+func V (J) = valueOrElse(getBoolean(S(), H(d, J)), false)
102+
103+
104+func W () = fromBase58String(getStringValue(S(), b))
105+
106+
107+func X () = valueOrElse(getBoolean(this, p), false)
108+
109+
110+func Y (L) = if (valueOrElse(getBoolean(this, K(L)), false))
111+ then throw(("Order already executed: " + toString(L)))
112+ else if (valueOrElse(getBoolean(this, M(L)), false))
113+ then throw(("Order already cancelled: " + toString(L)))
114+ else true
115+
116+
117+func Z () = valueOrElse(getInteger(this, l), 0)
118+
119+
120+func aa (P,Q) = {
121+ let ab = O(P, Q)
122+ valueOrElse(getInteger(this, ab), 0)
53123 }
54124
55125
56-func D (r) = if (valueOrElse(getBoolean(this, q(r)), false))
57- then throw(("Order already executed: " + r))
58- else unit
126+func ac (P,Q) = {
127+ let ab = R(P, Q)
128+ let ad = valueOrElse(getString(this, ab), "")
129+ if ((ad == ""))
130+ then nil
131+ else split(ad, ",")
132+ }
59133
60134
61-@Callable(E)
62-func setContext (F) = if ((E.caller != this))
63- then throw("Only self-call")
64- else [StringEntry(g, F)]
135+func ae (L) = {
136+ let af = valueOrErrorMessage(getString(this, N(L)), ("Invalid order id: " + toString(L)))
137+ let ag = split(af, ",")
138+ let ah = ag[0]
139+ let ai = ag[1]
140+ let aj = valueOrErrorMessage(parseInt(ag[2]), "Invalid amountIn")
141+ let ak = valueOrErrorMessage(parseInt(ag[3]), "Invalid leverage")
142+ let al = valueOrErrorMessage(parseInt(ag[4]), "Invalid type")
143+ let am = valueOrErrorMessage(parseInt(ag[5]), "Invalid triggerPrice")
144+ let an = valueOrErrorMessage(parseInt(ag[6]), "Invalid paymentUsdn")
145+ let ao = valueOrErrorMessage(parseInt(ag[7]), "Invalid side")
146+ let ap = ag[8]
147+ let aq = valueOrErrorMessage(parseInt(ag[9]), "Invalid positionId")
148+ let ar = valueOrErrorMessage(parseInt(ag[10]), "Invalid limitPrice")
149+ $Tuple11(ah, ai, aj, ak, al, am, an, ao, ap, aq, ar)
150+ }
151+
152+
153+func as (P) = {
154+ let at = invoke(addressFromStringValue(P), "computeSpotPrice", nil, nil)
155+ if ((at == at))
156+ then {
157+ let au = {
158+ let av = at
159+ if ($isInstanceOf(av, "Int"))
160+ then {
161+ let aw = av
162+ aw
163+ }
164+ else throw("Invalid computeSpotPrice result")
165+ }
166+ value(au)
167+ }
168+ else throw("Strict value is not equal to itself.")
169+ }
170+
171+
172+func ax (P,Q) = {
173+ let at = invoke(addressFromStringValue(P), "computeFeeForTraderWithArtifact", [Q, ""], nil)
174+ if ((at == at))
175+ then {
176+ let au = {
177+ let av = at
178+ if ($isInstanceOf(av, "(Int, Boolean)"))
179+ then {
180+ let aw = av
181+ aw._1
182+ }
183+ else throw("Invalid computeFeeForTraderWithArtifact result")
184+ }
185+ value(au)
186+ }
187+ else throw("Strict value is not equal to itself.")
188+ }
189+
190+
191+func ay (P,Q) = {
192+ let ah = addressFromStringValue(P)
193+ let az = H(g, Q)
194+ valueOrElse(getInteger(ah, az), 0)
195+ }
196+
197+
198+func aA (P,Q) = {
199+ let ah = addressFromStringValue(P)
200+ let aB = H(f, Q)
201+ valueOrElse(getInteger(ah, aB), 0)
202+ }
203+
204+
205+func aC (aD) = F(aD, A)
206+
207+
208+func aE (L,P,Q,aF,aG,aH,aI,aJ,aK,aL,aM,aN) = {
209+ let af = makeString([P, Q, toString(aF), toString(aG), toString(aH), toString(aI), toString(aJ), toString(aK), aL, toString(aM), toString(aN)], ",")
210+[StringEntry(N(L), af)]
211+ }
212+
213+
214+func aO (L,P,Q,aP) = {
215+ let aQ = ac(P, Q)
216+ let aR = if (aP)
217+ then (aQ :+ toString(L))
218+ else removeByIndex(aQ, valueOrErrorMessage(indexOf(aQ, toString(L)), ("No order with id: " + toString(L))))
219+ let aS = makeString(aR, ",")
220+[StringEntry(R(P, Q), aS)]
221+ }
222+
223+
224+func aT (P,Q,aU) = [IntegerEntry(O(P, Q), aU)]
225+
226+
227+func aV (aW) = [IntegerEntry(l, aW)]
228+
229+
230+func aX (L) = [BooleanEntry(H(i, toString(L)), true)]
231+
232+
233+func aY (L) = [BooleanEntry(H(j, toString(L)), true)]
234+
235+
236+@Callable(aZ)
237+func cleanUpStaleOrders (P,Q) = {
238+ let ba = ac(P, Q)
239+ let bb = aa(P, Q)
240+ func bc (bd,L) = {
241+ let be = valueOrErrorMessage(parseInt(L), "Invalid order id")
242+ let bf = ae(be)
243+ let bg = bf._1
244+ let bh = bf._2
245+ let bi = bf._3
246+ let bj = bf._4
247+ let aH = bf._5
248+ let bk = bf._6
249+ let bl = bf._7
250+ let bm = bf._8
251+ let bn = bf._9
252+ let aM = bf._10
253+ let bo = bf._11
254+ let bp = ay(P, Q)
255+ let bq = if ((bp != 0))
256+ then aA(P, Q)
257+ else 0
258+ if (if (if ((aH == q))
259+ then true
260+ else (aH == r))
261+ then (bq != aM)
262+ else false)
263+ then {
264+ let br = (aY(be) ++ aO(be, P, Q, false))
265+ $Tuple2((bd._1 + 1), (bd._2 ++ br))
266+ }
267+ else bd
268+ }
269+
270+ let bs = {
271+ let bt = ba
272+ let bu = size(bt)
273+ let bv = $Tuple2(0, nil)
274+ func bw (bx,by) = if ((by >= bu))
275+ then bx
276+ else bc(bx, bt[by])
277+
278+ func bz (bx,by) = if ((by >= bu))
279+ then bx
280+ else throw("List size exceeds 5")
281+
282+ bz(bw(bw(bw(bw(bw(bv, 0), 1), 2), 3), 4), 5)
283+ }
284+ (bs._2 ++ aT(P, Q, (bb - bs._1)))
285+ }
65286
66287
67288
68-@Callable(E)
69-func resetContext () = if ((E.caller != this))
289+@Callable(aZ)
290+func setContext (bA) = if ((aZ.caller != this))
70291 then throw("Only self-call")
71- else [DeleteEntry(g)]
292+ else [StringEntry(o, bA)]
72293
73294
74295
75-@Callable(E)
76-func initialize (G) = if (u())
77- then throw("Already initialized")
78- else [StringEntry(a, G), BooleanEntry(h, true)]
296+@Callable(aZ)
297+func resetContext () = if ((aZ.caller != this))
298+ then throw("Only self-call")
299+ else [DeleteEntry(o)]
79300
80301
81302
82-@Callable(E)
83-func executeOrder (w,x,y) = {
84- let H = split(x, ",")
85- let I = valueOrErrorMessage(parseInt(H[0]), "Invalid order data [type]")
86- let J = toBase58String(sha256(toBytes(x)))
87- let K = D(J)
88- if ((K == K))
89- then if (if ((I == i))
303+@Callable(aZ)
304+func initialize (bB) = if (X())
305+ then throw("Already initialized")
306+ else [StringEntry(a, bB), BooleanEntry(p, true)]
307+
308+
309+
310+@Callable(aZ)
311+func createOrder (P,aH,aI,aN,aF,aG,aK,aL) = {
312+ let Q = toString(aZ.caller)
313+ let bC = invoke(this, "cleanUpStaleOrders", [P, Q], nil)
314+ if ((bC == bC))
315+ then if ((size(aZ.payments) > 1))
316+ then throw("Invalid createOrder parameters: invalid payment count")
317+ else {
318+ let bD = if ((size(aZ.payments) == 1))
319+ then $Tuple2(toBase58String(valueOrErrorMessage(aZ.payments[0].assetId, "Invalid asset id")), aZ.payments[0].amount)
320+ else $Tuple2("", 0)
321+ let bE = bD._1
322+ let bF = bD._2
323+ let bG = invoke(this, "internalCreateOrder", [Q, P, aH, aI, aN, aF, aG, aK, aL, bE, bF], nil)
324+ if ((bG == bG))
325+ then nil
326+ else throw("Strict value is not equal to itself.")
327+ }
328+ else throw("Strict value is not equal to itself.")
329+ }
330+
331+
332+
333+@Callable(aZ)
334+func increasePositionWithStopLoss (P,bH,aG,bI,aL,bJ,bK,bL,bM) = {
335+ let Q = toString(aZ.caller)
336+ let bC = invoke(this, "cleanUpStaleOrders", [P, Q], nil)
337+ if ((bC == bC))
338+ then if (if (!(X()))
90339 then true
91- else (I == j))
92- then {
93- let L = H[1]
94- let M = H[2]
95- let N = valueOrErrorMessage(parseInt(H[3]), "Invalid order data [price]")
96- let O = valueOrErrorMessage(parseInt(H[4]), "Invalid order data [timestamp]")
97- let P = valueOrErrorMessage(parseInt(H[5]), "Invalid order data [validDue]")
98- let Q = v(w, x, y, M)
99- if ((Q == Q))
340+ else !(V(P)))
341+ then throw("Invalid increasePositionWithStopLoss parameters")
342+ else {
343+ let bp = ay(P, Q)
344+ if ((bp != 0))
345+ then throw("Invalid increasePositionWithStopLoss parameters: only new position")
346+ else {
347+ let bN = invoke(this, "setContext", [Q], nil)
348+ if ((bN == bN))
349+ then {
350+ let bO = invoke(addressFromStringValue(P), "increasePosition", [bH, aG, bI, aL], aZ.payments)
351+ if ((bO == bO))
352+ then {
353+ let bP = invoke(this, "resetContext", nil, nil)
354+ if ((bP == bP))
355+ then {
356+ let bQ = ay(P, Q)
357+ if ((bQ == bQ))
358+ then {
359+ let aj = B(bQ)
360+ let bR = if ((0 > bQ))
361+ then t
362+ else u
363+ let bS = if ((bJ > 0))
364+ then {
365+ let bS = invoke(this, "internalCreateOrder", [Q, P, q, bJ, bK, aj, 0, bR, aL, "", 0], nil)
366+ if ((bS == bS))
367+ then nil
368+ else throw("Strict value is not equal to itself.")
369+ }
370+ else nil
371+ if ((bS == bS))
372+ then {
373+ let bT = if ((bL > 0))
374+ then {
375+ let bT = invoke(this, "internalCreateOrder", [Q, P, r, bL, bM, aj, 0, bR, aL, "", 0], nil)
376+ if ((bT == bT))
377+ then nil
378+ else throw("Strict value is not equal to itself.")
379+ }
380+ else nil
381+ if ((bT == bT))
382+ then nil
383+ else throw("Strict value is not equal to itself.")
384+ }
385+ else throw("Strict value is not equal to itself.")
386+ }
387+ else throw("Strict value is not equal to itself.")
388+ }
389+ else throw("Strict value is not equal to itself.")
390+ }
391+ else throw("Strict value is not equal to itself.")
392+ }
393+ else throw("Strict value is not equal to itself.")
394+ }
395+ }
396+ else throw("Strict value is not equal to itself.")
397+ }
398+
399+
400+
401+@Callable(aZ)
402+func internalCreateOrder (Q,P,aH,aI,aN,aF,aG,aK,aL,bU,bV) = if (if (if (if (if (if (if (if (if (!(X()))
403+ then true
404+ else !(V(P)))
405+ then true
406+ else (0 >= aI))
407+ then true
408+ else (0 > aN))
409+ then true
410+ else (0 >= aF))
411+ then true
412+ else (0 > aG))
413+ then true
414+ else !(if ((aK == t))
415+ then true
416+ else (aK == u)))
417+ then true
418+ else !(if (if ((aH == q))
419+ then true
420+ else (aH == r))
421+ then true
422+ else (aH == s)))
423+ then true
424+ else !((aZ.caller == this)))
425+ then throw("Invalid createOrder parameters")
426+ else {
427+ let bW = (Z() + 1)
428+ let bX = (aa(P, Q) + 1)
429+ let bp = ay(P, Q)
430+ let bH = if (if (if ((bp == 0))
431+ then true
432+ else if ((bp > 0))
433+ then (aK == t)
434+ else false)
435+ then true
436+ else if ((0 > bp))
437+ then (aK == u)
438+ else false)
439+ then v
440+ else w
441+ if (if ((bp == 0))
442+ then if ((aH == q))
443+ then true
444+ else (aH == r)
445+ else false)
446+ then throw("Can not create STOP/TAKE order: no position")
447+ else {
448+ let bY = if ((bH == v))
449+ then if (if ((bU != toBase58String(T())))
450+ then true
451+ else (bV != aF))
452+ then throw("Invalid createLimitOrder parameters: invalid payment")
453+ else {
454+ let bZ = invoke(U(), "deposit", nil, [AttachedPayment(T(), bV)])
455+ if ((bZ == bZ))
456+ then bV
457+ else throw("Strict value is not equal to itself.")
458+ }
459+ else 0
460+ if ((bY == bY))
100461 then {
101- let R = valueOrErrorMessage(addressFromString(L), "Invalid order data [amm]")
102- let S = getIntegerValue(R, c)
103- let T = getIntegerValue(R, d)
104- let U = m(S, T)
105- let V = if ((I == i))
106- then (U >= N)
107- else (N >= U)
108- let W = if (!(V))
109- then throw(((("Can not execute order [price]: AMM Price=" + toString(U)) + " Order Price=") + toString(N)))
110- else unit
111- if ((W == W))
462+ let aq = if ((bp != 0))
463+ then aA(P, Q)
464+ else 0
465+ if ((bX > x))
466+ then throw("Invalid createLimitOrder parameters: order count")
467+ else (((aE(bW, P, Q, aF, aG, aH, aI, bY, aK, aL, aq, aN) ++ aO(bW, P, Q, true)) ++ aT(P, Q, bX)) ++ aV(bW))
468+ }
469+ else throw("Strict value is not equal to itself.")
470+ }
471+ }
472+
473+
474+
475+@Callable(aZ)
476+func cancelOrder (L) = {
477+ let ca = ae(L)
478+ let P = ca._1
479+ let Q = ca._2
480+ let aF = ca._3
481+ let aG = ca._4
482+ let aH = ca._5
483+ let aI = ca._6
484+ let cb = ca._7
485+ let aK = ca._8
486+ let aL = ca._9
487+ let aM = ca._10
488+ let aN = ca._11
489+ if (if (if (!(X()))
490+ then true
491+ else !(Y(L)))
492+ then true
493+ else !((toString(aZ.caller) == Q)))
494+ then throw("Invalid cancelOrder parameters")
495+ else {
496+ let bC = invoke(this, "cleanUpStaleOrders", [P, Q], nil)
497+ if ((bC == bC))
498+ then {
499+ let bX = (aa(P, Q) - 1)
500+ let cc = if ((cb > 0))
501+ then {
502+ let cd = invoke(U(), "withdraw", [toBase58String(T()), cb], nil)
503+ if ((cd == cd))
504+ then nil
505+ else throw("Strict value is not equal to itself.")
506+ }
507+ else nil
508+ if ((cc == cc))
509+ then (((aY(L) ++ aO(L, P, Q, false)) ++ aT(P, Q, bX)) ++ (if ((cb > 0))
510+ then [ScriptTransfer(aZ.caller, cb, T())]
511+ else nil))
512+ else throw("Strict value is not equal to itself.")
513+ }
514+ else throw("Strict value is not equal to itself.")
515+ }
516+ }
517+
518+
519+
520+@Callable(aZ)
521+func executeOrder (L) = {
522+ let ce = ae(L)
523+ let P = ce._1
524+ let Q = ce._2
525+ let aF = ce._3
526+ let aG = ce._4
527+ let aH = ce._5
528+ let aI = ce._6
529+ let cb = ce._7
530+ let aK = ce._8
531+ let aL = ce._9
532+ let aM = ce._10
533+ let aN = ce._11
534+ let bC = invoke(this, "cleanUpStaleOrders", [P, Q], nil)
535+ if ((bC == bC))
536+ then if (if (!(X()))
537+ then true
538+ else !(Y(L)))
539+ then throw("Invalid executeOrder parameters")
540+ else {
541+ let bp = ay(P, Q)
542+ let bq = if ((bp != 0))
543+ then aA(P, Q)
544+ else 0
545+ let cf = if ((aH == q))
546+ then {
547+ let cg = if ((bp > 0))
548+ then t
549+ else if ((0 > bp))
550+ then u
551+ else throw("Can not execute STOP order: no open position")
552+ let ch = as(P)
553+ let ci = if ((aK == cg))
554+ then throw("Can not execute STOP order: reduce only")
555+ else if ((bq != aM))
556+ then throw("Can not execute STOP order: position closed")
557+ else if ((cg == t))
558+ then (aI >= ch)
559+ else (ch >= aI)
560+ if (ci)
561+ then $Tuple3("closePosition", [G(aF, B(bp)), F(aN, B(bp))], nil)
562+ else throw("Can not execute STOP order: triggerPrice mismatch")
563+ }
564+ else if ((aH == r))
565+ then {
566+ let cg = if ((bp > 0))
567+ then t
568+ else if ((0 > bp))
569+ then u
570+ else throw("Can not execute STOP order: no open position")
571+ let ch = as(P)
572+ let ci = if ((aK == cg))
573+ then throw("Can not execute TAKE order: reduce only")
574+ else if ((bq != aM))
575+ then throw(((("Can not execute TAKE order: position closed " + toString(bq)) + "!=") + toString(aM)))
576+ else if ((cg == t))
577+ then (ch >= aI)
578+ else (aI >= ch)
579+ if (ci)
580+ then $Tuple3("closePosition", [G(aF, B(bp)), F(aN, B(bp))], nil)
581+ else throw("Can not execute TAKE order: triggerPrice mismatch")
582+ }
583+ else if ((aH == s))
112584 then {
113- let X = if ((P == 0))
114- then true
115- else (P >= k)
116- let Y = if (!(X))
117- then throw(((("Can not execute order [due]: Due=" + toString(P)) + " Time=") + toString(k)))
118- else unit
119- if ((Y == Y))
585+ let ch = as(P)
586+ let cj = if ((aN == 0))
587+ then aC(aI)
588+ else B((aI - aN))
589+ let ci = if ((ch >= (aI - cj)))
590+ then ((aI + cj) >= ch)
591+ else false
592+ if (ci)
120593 then {
121- let Z = toString(addressFromPublicKey(fromBase58String(M)))
122- let aa = valueOrElse(getInteger(R, ((e + "_") + Z)), 0)
123- let ab = (O >= aa)
124- let ac = if (!(ab))
125- then throw(((("Can not execute order [position closed]: Order Created=" + toString(O)) + " Position Closed=") + toString(aa)))
126- else unit
127- if ((ac == ac))
128- then if (if (if (V)
129- then X
130- else false)
131- then ab
132- else false)
133- then {
134- let ad = invoke(this, "setContext", [Z], nil)
135- if ((ad == ad))
136- then {
137- let ae = invoke(R, "closePosition", nil, nil)
138- if ((ae == ae))
139- then {
140- let af = invoke(this, "resetContext", nil, nil)
141- if ((af == af))
142- then [BooleanEntry(q(J), true)]
143- else throw("Strict value is not equal to itself.")
144- }
145- else throw("Strict value is not equal to itself.")
146- }
147- else throw("Strict value is not equal to itself.")
148- }
149- else throw("Invalid order execution timing")
594+ let cg = if ((bp > 0))
595+ then t
596+ else if ((0 > bp))
597+ then u
598+ else -1
599+ let ck = if ((bp == 0))
600+ then v
601+ else if ((cg == aK))
602+ then v
603+ else w
604+ if ((ck == v))
605+ then {
606+ let cl = (cb - F(cb, ax(P, Q)))
607+ $Tuple3("increasePosition", [aK, aG, if ((aN == 0))
608+ then 0
609+ else D(cl, aN), aL], [AttachedPayment(T(), cb)])
610+ }
611+ else $Tuple3("closePosition", [aF, F(aF, aN)], nil)
612+ }
613+ else throw("Can not execute LIMIT order: triggerPrice mismatch")
614+ }
615+ else throw(("Invalid order type: " + toString(aH)))
616+ let cm = cf._1
617+ let cn = cf._2
618+ let co = cf._3
619+ let cc = if ((size(co) == 1))
620+ then {
621+ let cd = invoke(U(), "withdraw", [toBase58String(T()), co[0].amount], nil)
622+ if ((cd == cd))
623+ then nil
624+ else throw("Strict value is not equal to itself.")
625+ }
626+ else nil
627+ if ((cc == cc))
628+ then {
629+ let bN = invoke(this, "setContext", [Q], nil)
630+ if ((bN == bN))
631+ then {
632+ let bO = invoke(addressFromStringValue(P), cm, cn, co)
633+ if ((bO == bO))
634+ then {
635+ let bP = invoke(this, "resetContext", nil, nil)
636+ if ((bP == bP))
637+ then {
638+ let bX = (aa(P, Q) - 1)
639+ ((aT(P, Q, bX) ++ aO(L, P, Q, false)) ++ aX(L))
640+ }
150641 else throw("Strict value is not equal to itself.")
151642 }
152643 else throw("Strict value is not equal to itself.")
153644 }
154645 else throw("Strict value is not equal to itself.")
155646 }
156647 else throw("Strict value is not equal to itself.")
157648 }
158- else throw(("Invalid order type: " + toString(I)))
159649 else throw("Strict value is not equal to itself.")
160650 }
161651
162652
163-@Verifier(ag)
164-func ah () = sigVerify(ag.bodyBytes, ag.proofs[0], t())
653+
654+@Callable(aZ)
655+func view_canExecuteOrder (L) = {
656+ let at = invoke(this, "executeOrder", [L], nil)
657+ if ((at == at))
658+ then throw("Success")
659+ else throw("Strict value is not equal to itself.")
660+ }
661+
662+
663+@Verifier(cp)
664+func cq () = sigVerify(cp.bodyBytes, cp.proofs[0], W())
165665

github/deemru/w8io/873ac7e 
56.91 ms