tx · FMyjq7Z2HwFFzAo5K6NoujxTK46jDjZWBaeGHHYD14FT

3MzGPAZokuNfqjMuP7yDXFATZjhjtEP5UCa:  -0.03700000 Waves

2023.07.27 15:51 [2684284] smart account 3MzGPAZokuNfqjMuP7yDXFATZjhjtEP5UCa > SELF 0.00000000 Waves

{ "type": 13, "id": "FMyjq7Z2HwFFzAo5K6NoujxTK46jDjZWBaeGHHYD14FT", "fee": 3700000, "feeAssetId": null, "timestamp": 1690462416587, "version": 2, "chainId": 84, "sender": "3MzGPAZokuNfqjMuP7yDXFATZjhjtEP5UCa", "senderPublicKey": "4EBKd2zSCvpiSLeyovT5FUuMvGpi6oxdBAbvQybSYi6p", "proofs": [ "4eMB96JfyARoMa1pFCbzgYkL7f2ikNEyXKr3VvS6aFYVe1XZdiFaXaW8TeAvzSnPe63GNaimwAqGFhHU3iXwboFz" ], "script": "base64:BgKPAQgCEhAKDgEICAEBAQEBAQgBAQEBEgQKAggIEgMKAQgSABIECgIIARIECgIBBBIDCgEIEgMKAQgSEAoOCAEBAQEBAQgBAQEBAQgSDAoKCAEBAQgBAQEBCBIFCgMICAESCAoGCAgBAQEBEg4KDAgIAQEBAQEBCAgBARIDCgEBEgQKAgEIEgQKAgEIEgQKAgEISgAUa19jb29yZGluYXRvckFkZHJlc3MCFGtfY29vcmRpbmF0b3JBZGRyZXNzAA9rX2FkbWluX2FkZHJlc3MCD2tfYWRtaW5fYWRkcmVzcwANa19xdW90ZV9hc3NldAINa19xdW90ZV9hc3NldAAFa19hbW0CBWtfYW1tABFrX21hbmFnZXJfYWRkcmVzcwIRa19tYW5hZ2VyX2FkZHJlc3MAEmtfcG9zaXRpb25TZXF1ZW5jZQISa19wb3NpdGlvblNlcXVlbmNlAA5rX3Bvc2l0aW9uU2l6ZQIOa19wb3NpdGlvblNpemUAEGtfZXhlY3V0ZWRPcmRlcnMCEGtfZXhlY3V0ZWRPcmRlcnMAEGtfY2FuY2VsZWRPcmRlcnMCEGtfY2FuY2VsZWRPcmRlcnMAB2tfb3JkZXICB2tfb3JkZXIADmtfb3JkZXJSZXF1ZXN0AgprX29yZGVyUmVxAA1rX2xhc3RPcmRlcklkAg1rX2xhc3RPcmRlcklkABBrX3RyYWRlck9yZGVyQ250AhBrX3RyYWRlck9yZGVyQ250ABBrX3RyYWRlck9yZGVySWRzAhBrX3RyYWRlck9yZGVySWRzAA1rX3NwcmVhZExpbWl0Ag1rX3NwcmVhZExpbWl0AA9rX29ubHlXaGl0ZWxpc3QCD2tfb25seVdoaXRlbGlzdAATa193aGl0ZWxpc3RFeGVjdXRvcgITa193aGl0ZWxpc3RFeGVjdXRvcgAIa19zZW5kZXICCGtfc2VuZGVyAA1rX2luaXRpYWxpemVkAg1rX2luaXRpYWxpemVkAARTVE9QAAEABFRBS0UAAgAFTElNSVQAAwAGTUFSS0VUAAQABExPTkcAAQAFU0hPUlQAAgAISU5DUkVBU0UAAQAIREVDUkVBU0UAAgAZTUFYX1RSQURFUl9PUkRFUlNfUEVSX0FNTQAKAARUSU1FCAUJbGFzdEJsb2NrCXRpbWVzdGFtcAAMREVDSU1BTF9VTklUCQBoAgABCQBoAgkAaAIJAGgCCQBoAgkAaAIACgAKAAoACgAKAAoBA2FicwECX3gDCQBmAgUCX3gAAAUCX3gJAQEtAQUCX3gBBGRpdmQCAl94Al95CQBuBAUCX3gFDERFQ0lNQUxfVU5JVAUCX3kFCEhBTEZFVkVOAQRtdWxkAgJfeAJfeQkAbgQFAl94BQJfeQUMREVDSU1BTF9VTklUBQhIQUxGRVZFTgEEbWludgICX3gCX3kDCQBmAgUCX3gFAl95BQJfeQUCX3gBDnRvQ29tcG9zaXRlS2V5AgRfa2V5CF9hZGRyZXNzCQCsAgIJAKwCAgUEX2tleQIBXwUIX2FkZHJlc3MBEGV4ZWN1dGVkT3JkZXJLZXkBCF9vcmRlcklkCQCsAgIJAKwCAgUQa19leGVjdXRlZE9yZGVycwIBXwkApAMBBQhfb3JkZXJJZAEQY2FuY2VsZWRPcmRlcktleQEIX29yZGVySWQJAKwCAgkArAICBRBrX2NhbmNlbGVkT3JkZXJzAgFfCQCkAwEFCF9vcmRlcklkAQhvcmRlcktleQEIX29yZGVySWQJAQ50b0NvbXBvc2l0ZUtleQIFB2tfb3JkZXIJAKQDAQUIX29yZGVySWQBD29yZGVyUmVxdWVzdEtleQIIX29yZGVySWQFX3R5cGUJAKwCAgkArAICCQCsAgIJAKwCAgUOa19vcmRlclJlcXVlc3QCAV8JAKQDAQUIX29yZGVySWQCAV8JAKQDAQUFX3R5cGUBE3RyYWRlck9yZGVyQ291bnRLZXkCBF9hbW0HX3RyYWRlcgkArAICCQCsAgIJAKwCAgkArAICBRBrX3RyYWRlck9yZGVyQ250AgFfBQRfYW1tAgFfBQdfdHJhZGVyARF0cmFkZXJPcmRlcklkc0tleQIEX2FtbQdfdHJhZGVyCQCsAgIJAKwCAgkArAICCQCsAgIFEGtfdHJhZGVyT3JkZXJJZHMCAV8FBF9hbW0CAV8FB190cmFkZXIBC2Nvb3JkaW5hdG9yAAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIFBHRoaXMFFGtfY29vcmRpbmF0b3JBZGRyZXNzAhNDb29yZGluYXRvciBub3Qgc2V0AQxhZG1pbkFkZHJlc3MACQCmCAEJARFAZXh0ck5hdGl2ZSgxMDUzKQIJAQtjb29yZGluYXRvcgAFD2tfYWRtaW5fYWRkcmVzcwEKcXVvdGVBc3NldAAJANkEAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAUNa19xdW90ZV9hc3NldAEObWFuYWdlckFkZHJlc3MACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAKYIAQkBEUBleHRyTmF0aXZlKDEwNTMpAgkBC2Nvb3JkaW5hdG9yAAURa19tYW5hZ2VyX2FkZHJlc3MCD01hbmFnZXIgbm90IHNldAELaXNXaGl0ZWxpc3QBCF9hZGRyZXNzCQELdmFsdWVPckVsc2UCCQCbCAIJAQtjb29yZGluYXRvcgAJAQ50b0NvbXBvc2l0ZUtleQIFBWtfYW1tBQhfYWRkcmVzcwcBC2luaXRpYWxpemVkAAkBC3ZhbHVlT3JFbHNlAgkAmwgCBQR0aGlzBQ1rX2luaXRpYWxpemVkBwEHaXNWYWxpZAEIX29yZGVySWQDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJARBleGVjdXRlZE9yZGVyS2V5AQUIX29yZGVySWQHCQACAQkArAICAhhPcmRlciBhbHJlYWR5IGV4ZWN1dGVkOiAJAKQDAQUIX29yZGVySWQDCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJARBjYW5jZWxlZE9yZGVyS2V5AQUIX29yZGVySWQHCQACAQkArAICAhlPcmRlciBhbHJlYWR5IGNhbmNlbGxlZDogCQCkAwEFCF9vcmRlcklkBgEOZ2V0U3ByZWFkTGltaXQACQETdmFsdWVPckVycm9yTWVzc2FnZQIJAJoIAgUEdGhpcwUNa19zcHJlYWRMaW1pdAIUU3ByZWFkIGxpbWl0IG5vdCBzZXQBDmN1cnJlbnRPcmRlcklkAAkBC3ZhbHVlT3JFbHNlAgkAmggCBQR0aGlzBQ1rX2xhc3RPcmRlcklkAAABE2dldFRyYWRlck9yZGVyQ291bnQCBF9hbW0HX3RyYWRlcgQDa2V5CQETdHJhZGVyT3JkZXJDb3VudEtleQIFBF9hbW0FB190cmFkZXIJAQt2YWx1ZU9yRWxzZQIJAJoIAgUEdGhpcwUDa2V5AAABEnRyYWRlckFtbU9yZGVyc0lkcwIEX2FtbQdfdHJhZGVyBANrZXkJARF0cmFkZXJPcmRlcklkc0tleQIFBF9hbW0FB190cmFkZXIEA3ZhbAkBC3ZhbHVlT3JFbHNlAgkAnQgCBQR0aGlzBQNrZXkCAAMJAAACBQN2YWwCAAUDbmlsCQC1CQIFA3ZhbAIBLAEQaGF2ZU9yZGVyUmVxdWVzdAIIX29yZGVySWQFX3R5cGUEA2tleQkBD29yZGVyUmVxdWVzdEtleQIFCF9vcmRlcklkBQVfdHlwZQkBCWlzRGVmaW5lZAEJAJ0IAgUEdGhpcwUDa2V5AQ9nZXRPcmRlclJlcXVlc3QCCF9vcmRlcklkBV90eXBlBANrZXkJAQ9vcmRlclJlcXVlc3RLZXkCBQhfb3JkZXJJZAUFX3R5cGUED29yZGVyUmVxdWVzdFN0cgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMFA2tleQkArAICAhtOb3Qgb3JkZXIgcmVxdWVzdCBmb3Iga2V5OiAFA2tleQQUb3JkZXJSZXF1ZXN0UGFydExpc3QJALUJAgUPb3JkZXJSZXF1ZXN0U3RyAgEsBAdvcmRlcklkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBRRvcmRlclJlcXVlc3RQYXJ0TGlzdAAAAg9JbnZhbGlkIG9yZGVySWQEA2FtbQkAkQMCBRRvcmRlclJlcXVlc3RQYXJ0TGlzdAABBAZ0cmFkZXIJAJEDAgUUb3JkZXJSZXF1ZXN0UGFydExpc3QAAgQEdHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEJAJEDAgUUb3JkZXJSZXF1ZXN0UGFydExpc3QAAwIMSW52YWxpZCB0eXBlBAx0cmlnZ2VyUHJpY2UJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFFG9yZGVyUmVxdWVzdFBhcnRMaXN0AAQCFEludmFsaWQgdHJpZ2dlclByaWNlBApsaW1pdFByaWNlCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBRRvcmRlclJlcXVlc3RQYXJ0TGlzdAAFAhJJbnZhbGlkIGxpbWl0UHJpY2UJAJgKBgUHb3JkZXJJZAUDYW1tBQZ0cmFkZXIFBHR5cGUFDHRyaWdnZXJQcmljZQUKbGltaXRQcmljZQEIZ2V0T3JkZXIBCF9vcmRlcklkBAhvcmRlclN0cgkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQCdCAIFBHRoaXMJAQhvcmRlcktleQEFCF9vcmRlcklkCQCsAgICEkludmFsaWQgb3JkZXIgaWQ6IAkApAMBBQhfb3JkZXJJZAQNb3JkZXJQYXJ0TGlzdAkAtQkCBQhvcmRlclN0cgIBLAQDYW1tCQCRAwIFDW9yZGVyUGFydExpc3QAAAQGdHJhZGVyCQCRAwIFDW9yZGVyUGFydExpc3QAAQQIYW1vdW50SW4JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFDW9yZGVyUGFydExpc3QAAgIQSW52YWxpZCBhbW91bnRJbgQIbGV2ZXJhZ2UJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFDW9yZGVyUGFydExpc3QAAwIQSW52YWxpZCBsZXZlcmFnZQQEdHlwZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEJAJEDAgUNb3JkZXJQYXJ0TGlzdAAEAgxJbnZhbGlkIHR5cGUEDHRyaWdnZXJQcmljZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEJAJEDAgUNb3JkZXJQYXJ0TGlzdAAFAhRJbnZhbGlkIHRyaWdnZXJQcmljZQQLcGF5bWVudFVzZG4JARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFDW9yZGVyUGFydExpc3QABgITSW52YWxpZCBwYXltZW50VXNkbgQEc2lkZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEJAJEDAgUNb3JkZXJQYXJ0TGlzdAAHAgxJbnZhbGlkIHNpZGUEB3JlZkxpbmsJAJEDAgUNb3JkZXJQYXJ0TGlzdAAIBApwb3NpdGlvbklkCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQ1vcmRlclBhcnRMaXN0AAkCEkludmFsaWQgcG9zaXRpb25JZAQKbGltaXRQcmljZQkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEJAJEDAgUNb3JkZXJQYXJ0TGlzdAAKAhJJbnZhbGlkIGxpbWl0UHJpY2UECmV4cGlyYXRpb24DCQBmAgkAkAMBBQ1vcmRlclBhcnRMaXN0AAsJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAtgkBCQCRAwIFDW9yZGVyUGFydExpc3QACwISSW52YWxpZCBleHBpcmF0aW9uAAAEC21hcmtldFByaWNlAwkAZgIJAJADAQUNb3JkZXJQYXJ0TGlzdAAMCQETdmFsdWVPckVycm9yTWVzc2FnZQIJALYJAQkAkQMCBQ1vcmRlclBhcnRMaXN0AAwCGEludmFsaWQgb3JkZXJNYXJrZXRQcmljZQAACQCfCg0FA2FtbQUGdHJhZGVyBQhhbW91bnRJbgUIbGV2ZXJhZ2UFBHR5cGUFDHRyaWdnZXJQcmljZQULcGF5bWVudFVzZG4FBHNpZGUFB3JlZkxpbmsFCnBvc2l0aW9uSWQFCmxpbWl0UHJpY2UFCmV4cGlyYXRpb24FC21hcmtldFByaWNlAQ5nZXRNYXJrZXRQcmljZQEEX2FtbQQBcwkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQRfYW1tAhBjb21wdXRlU3BvdFByaWNlBQNuaWwFA25pbAMJAAACBQFzBQFzBANyZXMEByRtYXRjaDAFAXMDCQABAgUHJG1hdGNoMAIDSW50BAF0BQckbWF0Y2gwBQF0CQACAQIfSW52YWxpZCBjb21wdXRlU3BvdFByaWNlIHJlc3VsdAkBBXZhbHVlAQUDcmVzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAQZnZXRGZWUCBF9hbW0HX3RyYWRlcgQBcwkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQRfYW1tAh9jb21wdXRlRmVlRm9yVHJhZGVyV2l0aEFydGlmYWN0CQDMCAIFB190cmFkZXIJAMwIAgIABQNuaWwFA25pbAMJAAACBQFzBQFzBANyZXMEByRtYXRjaDAFAXMDCQABAgUHJG1hdGNoMAIOKEludCwgQm9vbGVhbikEAXQFByRtYXRjaDAIBQF0Al8xCQACAQIuSW52YWxpZCBjb21wdXRlRmVlRm9yVHJhZGVyV2l0aEFydGlmYWN0IHJlc3VsdAkBBXZhbHVlAQUDcmVzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuARRnZXRQb3NpdGlvbkRpcmVjdGlvbgIKX29yZGVyU2lkZQpfb3JkZXJUeXBlAwMJAAACBQpfb3JkZXJUeXBlBQRUQUtFBgkAAAIFCl9vcmRlclR5cGUFBFNUT1ADCQAAAgUKX29yZGVyU2lkZQUETE9ORwUFU0hPUlQFBExPTkcFCl9vcmRlclNpZGUBD2dldFBvc2l0aW9uU2l6ZQMEX2FtbQdfdHJhZGVyCl9kaXJlY3Rpb24EA2FtbQkBEUBleHRyTmF0aXZlKDEwNjIpAQUEX2FtbQQLcG9zaXRpb25LZXkJAKwCAgkArAICBQdfdHJhZGVyAgFfCQCkAwEFCl9kaXJlY3Rpb24EB3NpemVLZXkJAQ50b0NvbXBvc2l0ZUtleQIFDmtfcG9zaXRpb25TaXplBQtwb3NpdGlvbktleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQNhbW0FB3NpemVLZXkAAAENZ2V0UG9zaXRpb25JZAMEX2FtbQdfdHJhZGVyCl9kaXJlY3Rpb24EA2FtbQkBEUBleHRyTmF0aXZlKDEwNjIpAQUEX2FtbQQLcG9zaXRpb25LZXkJAKwCAgkArAICBQdfdHJhZGVyAgFfCQCkAwEFCl9kaXJlY3Rpb24EBnNlcUtleQkBDnRvQ29tcG9zaXRlS2V5AgUSa19wb3NpdGlvblNlcXVlbmNlBQtwb3NpdGlvbktleQkBC3ZhbHVlT3JFbHNlAgkAmggCBQNhbW0FBnNlcUtleQAAAQlnZXRTcHJlYWQBBl9wcmljZQkBBG11bGQCBQZfcHJpY2UJAQ5nZXRTcHJlYWRMaW1pdAABGGlzT25seVdoaXRlbGlzdEV4ZWN1dG9ycwAJAQt2YWx1ZU9yRWxzZQIJAJsIAgUEdGhpcwUPa19vbmx5V2hpdGVsaXN0BwETaXNXaGl0ZWxpc3RFeGVjdXRvcgEJX2V4ZWN1dG9yCQELdmFsdWVPckVsc2UCCQCbCAIFBHRoaXMJAQ50b0NvbXBvc2l0ZUtleQIFE2tfd2hpdGVsaXN0RXhlY3V0b3IFCV9leGVjdXRvcgcBCXNhdmVPcmRlcg4IX29yZGVySWQEX2FtbQdfdHJhZGVyCV9hbW91bnRJbglfbGV2ZXJhZ2UFX3R5cGUNX3RyaWdnZXJQcmljZQxfcGF5bWVudFVzZG4FX3NpZGUIX3JlZkxpbmsLX3Bvc2l0aW9uSWQLX2xpbWl0UHJpY2ULX2V4cGlyYXRpb24RX29yZGVyTWFya2V0UHJpY2UECG9yZGVyU3RyCQC5CQIJAMwIAgUEX2FtbQkAzAgCBQdfdHJhZGVyCQDMCAIJAKQDAQUJX2Ftb3VudEluCQDMCAIJAKQDAQUJX2xldmVyYWdlCQDMCAIJAKQDAQUFX3R5cGUJAMwIAgkApAMBBQ1fdHJpZ2dlclByaWNlCQDMCAIJAKQDAQUMX3BheW1lbnRVc2RuCQDMCAIJAKQDAQUFX3NpZGUJAMwIAgUIX3JlZkxpbmsJAMwIAgkApAMBBQtfcG9zaXRpb25JZAkAzAgCCQCkAwEFC19saW1pdFByaWNlCQDMCAIJAKQDAQULX2V4cGlyYXRpb24JAMwIAgkApAMBBRFfb3JkZXJNYXJrZXRQcmljZQUDbmlsAgEsCQDMCAIJAQtTdHJpbmdFbnRyeQIJAQhvcmRlcktleQEFCF9vcmRlcklkBQhvcmRlclN0cgUDbmlsARBzYXZlT3JkZXJSZXF1ZXN0Bghfb3JkZXJJZARfYW1tB190cmFkZXIFX3R5cGUNX3RyaWdnZXJQcmljZQtfbGltaXRQcmljZQQLb3JkZXJSZXFTdHIJALkJAgkAzAgCCQCkAwEFCF9vcmRlcklkCQDMCAIFBF9hbW0JAMwIAgUHX3RyYWRlcgkAzAgCCQCkAwEFBV90eXBlCQDMCAIJAKQDAQUNX3RyaWdnZXJQcmljZQkAzAgCCQCkAwEFC19saW1pdFByaWNlBQNuaWwCASwJAMwIAgkBC1N0cmluZ0VudHJ5AgkBD29yZGVyUmVxdWVzdEtleQIFCF9vcmRlcklkBQVfdHlwZQULb3JkZXJSZXFTdHIFA25pbAEQdXBkYXRlT3JkZXJJZFN0cgMPX29yZGVySWRzTmV3U3RyBF9hbW0HX3RyYWRlcgkAzAgCCQELU3RyaW5nRW50cnkCCQERdHJhZGVyT3JkZXJJZHNLZXkCBQRfYW1tBQdfdHJhZGVyBQ9fb3JkZXJJZHNOZXdTdHIFA25pbAEUYWRkUmVtb3ZlT3JkZXJJZExpc3QFCV9vcmRlcklkcwhfb3JkZXJJZARfYW1tB190cmFkZXIEX2FkZAQLb3JkZXJJZHNOZXcDBQRfYWRkCQDNCAIFCV9vcmRlcklkcwkApAMBBQhfb3JkZXJJZAkA0QgCBQlfb3JkZXJJZHMJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAgkAzwgCBQlfb3JkZXJJZHMJAKQDAQUIX29yZGVySWQJAKwCAgISTm8gb3JkZXIgd2l0aCBpZDogCQCkAwEFCF9vcmRlcklkBQtvcmRlcklkc05ldwEQYWRkUmVtb3ZlT3JkZXJJZAQIX29yZGVySWQEX2FtbQdfdHJhZGVyBF9hZGQECG9yZGVySWRzCQESdHJhZGVyQW1tT3JkZXJzSWRzAgUEX2FtbQUHX3RyYWRlcgQLb3JkZXJJZHNOZXcJARRhZGRSZW1vdmVPcmRlcklkTGlzdAUFCG9yZGVySWRzBQhfb3JkZXJJZAUEX2FtbQUHX3RyYWRlcgUEX2FkZAQOb3JkZXJJZHNOZXdTdHIJALkJAgULb3JkZXJJZHNOZXcCASwJARB1cGRhdGVPcmRlcklkU3RyAwUOb3JkZXJJZHNOZXdTdHIFBF9hbW0FB190cmFkZXIBFnVwZGF0ZVRyYWRlck9yZGVyQ291bnQDBF9hbW0HX3RyYWRlcgZfY291bnQDCQBmAgAABQZfY291bnQJAAIBCQCsAgICFUludmFsaWQgb3JkZXIgY291bnQ6IAkApAMBBQZfY291bnQJAMwIAgkBDEludGVnZXJFbnRyeQIJARN0cmFkZXJPcmRlckNvdW50S2V5AgUEX2FtbQUHX3RyYWRlcgUGX2NvdW50BQNuaWwBEXVwZGF0ZUxhc3RPcmRlcklkAQxfbGFzdE9yZGVySWQJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtfbGFzdE9yZGVySWQFDF9sYXN0T3JkZXJJZAUDbmlsARBtYXJrRXhlY3V0ZU9yZGVyAQhfb3JkZXJJZAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUQa19leGVjdXRlZE9yZGVycwkApAMBBQhfb3JkZXJJZAYFA25pbAEPbWFya0NhbmNlbE9yZGVyAQhfb3JkZXJJZAkAzAgCCQEMQm9vbGVhbkVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUQa19jYW5jZWxlZE9yZGVycwkApAMBBQhfb3JkZXJJZAYFA25pbAEOZ2V0UG9zaXRpb25JZHMCBF9hbW0HX3RyYWRlcgQQbG9uZ1Bvc2l0aW9uU2l6ZQkBD2dldFBvc2l0aW9uU2l6ZQMFBF9hbW0FB190cmFkZXIFBExPTkcEFWN1cnJlbnRMb25nUG9zaXRpb25JZAMJAQIhPQIFEGxvbmdQb3NpdGlvblNpemUAAAkBDWdldFBvc2l0aW9uSWQDBQRfYW1tBQdfdHJhZGVyBQRMT05HAAAEEXNob3J0UG9zaXRpb25TaXplCQEPZ2V0UG9zaXRpb25TaXplAwUEX2FtbQUHX3RyYWRlcgUFU0hPUlQEFmN1cnJlbnRTaG9ydFBvc2l0aW9uSWQDCQECIT0CBRFzaG9ydFBvc2l0aW9uU2l6ZQAACQENZ2V0UG9zaXRpb25JZAMFBF9hbW0FB190cmFkZXIFBVNIT1JUAAAJAMwIAgUVY3VycmVudExvbmdQb3NpdGlvbklkCQDMCAIFFmN1cnJlbnRTaG9ydFBvc2l0aW9uSWQFA25pbAESY2hlY2tWYWxpZEV4ZWN1dG9yAQdfY2FsbGVyAwkBGGlzT25seVdoaXRlbGlzdEV4ZWN1dG9ycwAJARNpc1doaXRlbGlzdEV4ZWN1dG9yAQkApQgBBQdfY2FsbGVyBhEBaQERaW50ZXJuYWxTYXZlT3JkZXIOCF9vcmRlcklkBF9hbW0HX3RyYWRlcglfYW1vdW50SW4JX2xldmVyYWdlBV90eXBlDV90cmlnZ2VyUHJpY2UMX3BheW1lbnRVc2RuBV9zaWRlCF9yZWZMaW5rC19wb3NpdGlvbklkC19saW1pdFByaWNlC19leHBpcmF0aW9uEV9vcmRlck1hcmtldFByaWNlAwkBAiE9AggFAWkGY2FsbGVyBQR0aGlzCQACAQIgSW52YWxpZCBzYXZlT3JkZXJJbnRlcm5hbCBwYXJhbXMJAQlzYXZlT3JkZXIOBQhfb3JkZXJJZAUEX2FtbQUHX3RyYWRlcgUJX2Ftb3VudEluBQlfbGV2ZXJhZ2UFBV90eXBlBQ1fdHJpZ2dlclByaWNlBQxfcGF5bWVudFVzZG4FBV9zaWRlBQhfcmVmTGluawULX3Bvc2l0aW9uSWQFC19saW1pdFByaWNlBQtfZXhwaXJhdGlvbgURX29yZGVyTWFya2V0UHJpY2UBaQESY2xlYW5VcFN0YWxlT3JkZXJzAgRfYW1tB190cmFkZXIEBm9yZGVycwkBEnRyYWRlckFtbU9yZGVyc0lkcwIFBF9hbW0FB190cmFkZXIEC3Bvc2l0aW9uSWRzCQEOZ2V0UG9zaXRpb25JZHMCBQRfYW1tBQdfdHJhZGVyCgEKY2xlYW5VcE9uZQIEX2FjYwhfb3JkZXJJZAQKb3JkZXJJZEludAkBE3ZhbHVlT3JFcnJvck1lc3NhZ2UCCQC2CQEFCF9vcmRlcklkAhBJbnZhbGlkIG9yZGVyIGlkBA0kdDAxMzExMzEzMzM4CQEIZ2V0T3JkZXIBBQpvcmRlcklkSW50BANfeDEIBQ0kdDAxMzExMzEzMzM4Al8xBANfeDIIBQ0kdDAxMzExMzEzMzM4Al8yBANfeDMIBQ0kdDAxMzExMzEzMzM4Al8zBANfeDQIBQ0kdDAxMzExMzEzMzM4Al80BAVfdHlwZQgFDSR0MDEzMTEzMTMzMzgCXzUEA194NQgFDSR0MDEzMTEzMTMzMzgCXzYEDF9wYXltZW50VXNkbggFDSR0MDEzMTEzMTMzMzgCXzcEA194NggFDSR0MDEzMTEzMTMzMzgCXzgEA194NwgFDSR0MDEzMTEzMTMzMzgCXzkEC19wb3NpdGlvbklkCAUNJHQwMTMxMTMxMzMzOANfMTAEA194OAgFDSR0MDEzMTEzMTMzMzgDXzExBAtfZXhwaXJhdGlvbggFDSR0MDEzMTEzMTMzMzgDXzEyBBpjYW5jZWxUYWtlU3RvcE9mTm9Qb3NpdGlvbgMDAwkAAAIFBV90eXBlBQRTVE9QBgkAAAIFBV90eXBlBQRUQUtFCQECIT0CCQCRAwIFC3Bvc2l0aW9uSWRzAAAFC19wb3NpdGlvbklkBwkBAiE9AgkAkQMCBQtwb3NpdGlvbklkcwABBQtfcG9zaXRpb25JZAcEFGNhbmNlbExpbWl0SWZFeHBpcmVkAwMJAAACBQVfdHlwZQUFTElNSVQGCQAAAgUFX3R5cGUFBk1BUktFVAkAZwIFBFRJTUUFC19leHBpcmF0aW9uBwMDBRpjYW5jZWxUYWtlU3RvcE9mTm9Qb3NpdGlvbgYFFGNhbmNlbExpbWl0SWZFeHBpcmVkBAZjaGFuZ2UJAQ9tYXJrQ2FuY2VsT3JkZXIBBQpvcmRlcklkSW50BAxuZXdPcmRlckxpc3QJARRhZGRSZW1vdmVPcmRlcklkTGlzdAUIBQRfYWNjAl8xBQpvcmRlcklkSW50BQRfYW1tBQdfdHJhZGVyBwQPcGF5bWVudFRvUmV0dXJuAwMJAAACBQVfdHlwZQUFTElNSVQGCQAAAgUFX3R5cGUFBk1BUktFVAUMX3BheW1lbnRVc2RuAAAJAJUKAwUMbmV3T3JkZXJMaXN0CQDOCAIIBQRfYWNjAl8yBQZjaGFuZ2UJAGQCCAUEX2FjYwJfMwUPcGF5bWVudFRvUmV0dXJuBQRfYWNjBA0kdDAxNDA0MDE0MTM1CgACJGwFBm9yZGVycwoAAiRzCQCQAwEFAiRsCgAFJGFjYzAJAJUKAwUGb3JkZXJzBQNuaWwAAAoBBSRmMF8xAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQEKY2xlYW5VcE9uZQIFAiRhCQCRAwIFAiRsBQIkaQoBBSRmMF8yAgIkYQIkaQMJAGcCBQIkaQUCJHMFAiRhCQACAQIUTGlzdCBzaXplIGV4Y2VlZHMgMTAJAQUkZjBfMgIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIJAQUkZjBfMQIFBSRhY2MwAAAAAQACAAMABAAFAAYABwAIAAkACgQJbmV3T3JkZXJzCAUNJHQwMTQwNDAxNDEzNQJfMQQNY2FuY2VsQWN0aW9ucwgFDSR0MDE0MDQwMTQxMzUCXzIED3BheW1lbnRUb1JldHVybggFDSR0MDE0MDQwMTQxMzUCXzMECHdpdGhkcmF3AwkAZgIFD3BheW1lbnRUb1JldHVybgAABAd1bnN0YWtlCQD8BwQJAQ5tYW5hZ2VyQWRkcmVzcwACCHdpdGhkcmF3CQDMCAIJANgEAQkBCnF1b3RlQXNzZXQACQDMCAIFD3BheW1lbnRUb1JldHVybgUDbmlsBQNuaWwDCQAAAgUHdW5zdGFrZQUHdW5zdGFrZQUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwDCQAAAgUId2l0aGRyYXcFCHdpdGhkcmF3CQDOCAIJAM4IAgkAzggCBQ1jYW5jZWxBY3Rpb25zCQEWdXBkYXRlVHJhZGVyT3JkZXJDb3VudAMFBF9hbW0FB190cmFkZXIJAJADAQUJbmV3T3JkZXJzCQEQdXBkYXRlT3JkZXJJZFN0cgMJALkJAgUJbmV3T3JkZXJzAgEsBQRfYW1tBQdfdHJhZGVyCQDMCAIJAQ5TY3JpcHRUcmFuc2ZlcgMJARFAZXh0ck5hdGl2ZSgxMDYyKQEFB190cmFkZXIFD3BheW1lbnRUb1JldHVybgkBCnF1b3RlQXNzZXQABQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEKc2V0Q29udGV4dAEHX3NlbmRlcgMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECDk9ubHkgc2VsZi1jYWxsCQDMCAIJAQtTdHJpbmdFbnRyeQIFCGtfc2VuZGVyBQdfc2VuZGVyBQNuaWwBaQEMcmVzZXRDb250ZXh0AAMJAQIhPQIIBQFpBmNhbGxlcgUEdGhpcwkAAgECDk9ubHkgc2VsZi1jYWxsCQDMCAIJAQtEZWxldGVFbnRyeQEFCGtfc2VuZGVyBQNuaWwBaQEKaW5pdGlhbGl6ZQIMX2Nvb3JkaW5hdG9yDF9zcHJlYWRMaW1pdAMDAwkBC2luaXRpYWxpemVkAAYDCQBmAgAABQxfc3ByZWFkTGltaXQGCQBmAgUMX3NwcmVhZExpbWl0CQBpAgUMREVDSU1BTF9VTklUAAoGCQECIT0CCAUBaQZjYWxsZXIFBHRoaXMJAAIBAhRVbmFibGUgdG8gaW5pdGlhbGl6ZQkAzAgCCQELU3RyaW5nRW50cnkCBRRrX2Nvb3JkaW5hdG9yQWRkcmVzcwkApQgBCQERQGV4dHJOYXRpdmUoMTA2MikBBQxfY29vcmRpbmF0b3IJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtfc3ByZWFkTGltaXQFDF9zcHJlYWRMaW1pdAkAzAgCCQEMQm9vbGVhbkVudHJ5AgUNa19pbml0aWFsaXplZAYFA25pbAFpAQ5jaGFuZ2VTZXR0aW5ncwIMX3NwcmVhZExpbWl0Dl9vbmx5V2hpdGVsaXN0AwMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAGAwkAZgIAAAUMX3NwcmVhZExpbWl0BgkAZgIFDF9zcHJlYWRMaW1pdAkAaQIFDERFQ0lNQUxfVU5JVAAKCQACAQIdSW52YWxpZCBjaGFuZ2VTZXR0aW5ncyBwYXJhbXMJAMwIAgkBDEludGVnZXJFbnRyeQIFDWtfc3ByZWFkTGltaXQFDF9zcHJlYWRMaW1pdAkAzAgCCQEMQm9vbGVhbkVudHJ5AgUPa19vbmx5V2hpdGVsaXN0BQ5fb25seVdoaXRlbGlzdAUDbmlsAWkBDGFkZFdoaXRlbGlzdAEFX2xpc3QDCQECIT0CCAUBaQZjYWxsZXIJAQxhZG1pbkFkZHJlc3MACQACAQIbSW52YWxpZCBhZGRXaGl0ZWxpc3QgcGFyYW1zCgENdG9BZGRyZXNzTGlzdAIEX2FjYwVfYWRkcgQHYWRkcmVzcwkBEUBleHRyTmF0aXZlKDEwNjIpAQUFX2FkZHIDCQAAAgUHYWRkcmVzcwUHYWRkcmVzcwkAzQgCBQRfYWNjCQEMQm9vbGVhbkVudHJ5AgkBDnRvQ29tcG9zaXRlS2V5AgUTa193aGl0ZWxpc3RFeGVjdXRvcgkApQgBBQdhZGRyZXNzBgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgoAAiRsCQC8CQIFBV9saXN0AgEsCgACJHMJAJADAQUCJGwKAAUkYWNjMAUDbmlsCgEFJGYwXzECAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAQ10b0FkZHJlc3NMaXN0AgUCJGEJAJEDAgUCJGwFAiRpCgEFJGYwXzICAiRhAiRpAwkAZwIFAiRpBQIkcwUCJGEJAAIBAhRMaXN0IHNpemUgZXhjZWVkcyAyMAkBBSRmMF8yAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgkBBSRmMF8xAgUFJGFjYzAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQBaQEPcmVtb3ZlV2hpdGVsaXN0AQVfbGlzdAMJAQIhPQIIBQFpBmNhbGxlcgkBDGFkbWluQWRkcmVzcwAJAAIBAh5JbnZhbGlkIHJlbW92ZVdoaXRlbGlzdCBwYXJhbXMKAQ10b0FkZHJlc3NMaXN0AgRfYWNjBV9hZGRyBAdhZGRyZXNzCQERQGV4dHJOYXRpdmUoMTA2MikBBQVfYWRkcgMJAAACBQdhZGRyZXNzBQdhZGRyZXNzCQDNCAIFBF9hY2MJAQxCb29sZWFuRW50cnkCCQEOdG9Db21wb3NpdGVLZXkCBRNrX3doaXRlbGlzdEV4ZWN1dG9yCQClCAEFB2FkZHJlc3MHCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCgACJGwJALwJAgUFX2xpc3QCASwKAAIkcwkAkAMBBQIkbAoABSRhY2MwBQNuaWwKAQUkZjBfMQICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkBDXRvQWRkcmVzc0xpc3QCBQIkYQkAkQMCBQIkbAUCJGkKAQUkZjBfMgICJGECJGkDCQBnAgUCJGkFAiRzBQIkYQkAAgECFExpc3Qgc2l6ZSBleGNlZWRzIDIwCQEFJGYwXzICCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECCQEFJGYwXzECBQUkYWNjMAAAAAEAAgADAAQABQAGAAcACAAJAAoACwAMAA0ADgAPABAAEQASABMAFAFpAQtjcmVhdGVPcmRlcg4EX2FtbQVfdHlwZQ1fdHJpZ2dlclByaWNlC19saW1pdFByaWNlCV9hbW91bnRJbglfbGV2ZXJhZ2UFX3NpZGUIX3JlZkxpbmsRX3N0b3BUcmlnZ2VyUHJpY2UPX3N0b3BMaW1pdFByaWNlEV90YWtlVHJpZ2dlclByaWNlD190YWtlTGltaXRQcmljZQtfZXhwaXJhdGlvbgpfcHJpY2VEYXRhBAdfdHJhZGVyCQClCAEIBQFpBmNhbGxlcgQLdXBkYXRlUHJpY2UJAPwHBAkBEUBleHRyTmF0aXZlKDEwNjIpAQUEX2FtbQIMdXBkYXRlT3JhY2xlCQDMCAIFCl9wcmljZURhdGEFA25pbAUDbmlsAwkAAAIFC3VwZGF0ZVByaWNlBQt1cGRhdGVQcmljZQQHY2xlYW5VcAkA/AcEBQR0aGlzAhJjbGVhblVwU3RhbGVPcmRlcnMJAMwIAgUEX2FtbQkAzAgCBQdfdHJhZGVyBQNuaWwFA25pbAMJAAACBQdjbGVhblVwBQdjbGVhblVwAwkAZgIJAJADAQgFAWkIcGF5bWVudHMAAQkAAgECNUludmFsaWQgY3JlYXRlT3JkZXIgcGFyYW1ldGVyczogaW52YWxpZCBwYXltZW50IGNvdW50BA0kdDAxODY0NDE4ODk2AwkAAAIJAJADAQgFAWkIcGF5bWVudHMAAQkAlAoCCQDYBAEJARN2YWx1ZU9yRXJyb3JNZXNzYWdlAggJAJEDAggFAWkIcGF5bWVudHMAAAdhc3NldElkAhBJbnZhbGlkIGFzc2V0IGlkCAkAkQMCCAUBaQhwYXltZW50cwAABmFtb3VudAkAlAoCAgAAAAQOcGF5bWVudEFzc2V0SWQIBQ0kdDAxODY0NDE4ODk2Al8xBA1wYXltZW50QW1vdW50CAUNJHQwMTg2NDQxODg5NgJfMgQGZG9DYWxsCQD8BwQFBHRoaXMCE2ludGVybmFsQ3JlYXRlT3JkZXIJAMwIAgUHX3RyYWRlcgkAzAgCBQRfYW1tCQDMCAIFBV90eXBlCQDMCAIFDV90cmlnZ2VyUHJpY2UJAMwIAgULX2xpbWl0UHJpY2UJAMwIAgUJX2Ftb3VudEluCQDMCAIFCV9sZXZlcmFnZQkAzAgCBQVfc2lkZQkAzAgCBQhfcmVmTGluawkAzAgCBQ5wYXltZW50QXNzZXRJZAkAzAgCBQ1wYXltZW50QW1vdW50CQDMCAIFC19leHBpcmF0aW9uBQNuaWwFA25pbAMJAAACBQZkb0NhbGwFBmRvQ2FsbAQHb3JkZXJJZAQHJG1hdGNoMAUGZG9DYWxsAwkAAQIFByRtYXRjaDACA0ludAQBdAUHJG1hdGNoMAUBdAkAAgECG0ludmFsaWQgSUQgb2YgY3JlYXRlZCBvcmRlcgMDCQAAAgUFX3R5cGUFBUxJTUlUBgkAAAIFBV90eXBlBQZNQVJLRVQECG1ha2VTdG9wAwkAZgIFEV9zdG9wVHJpZ2dlclByaWNlAAAECmRvTWFrZVN0b3AJAPwHBAUEdGhpcwIaaW50ZXJuYWxDcmVhdGVPcmRlclJlcXVlc3QJAMwIAgUHX3RyYWRlcgkAzAgCBQRfYW1tCQDMCAIFB29yZGVySWQJAMwIAgUEU1RPUAkAzAgCBRFfc3RvcFRyaWdnZXJQcmljZQkAzAgCBQ9fc3RvcExpbWl0UHJpY2UFA25pbAUDbmlsAwkAAAIFCmRvTWFrZVN0b3AFCmRvTWFrZVN0b3AFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsBAhtYWtlVGFrZQMJAGYCBRFfdGFrZVRyaWdnZXJQcmljZQAABApkb01ha2VUYWtlCQD8BwQFBHRoaXMCGmludGVybmFsQ3JlYXRlT3JkZXJSZXF1ZXN0CQDMCAIFB190cmFkZXIJAMwIAgUEX2FtbQkAzAgCBQdvcmRlcklkCQDMCAIFBFRBS0UJAMwIAgURX3Rha2VUcmlnZ2VyUHJpY2UJAMwIAgUPX3Rha2VMaW1pdFByaWNlBQNuaWwFA25pbAMJAAACBQpkb01ha2VUYWtlBQpkb01ha2VUYWtlBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAkAzggCBQhtYWtlU3RvcAUIbWFrZVRha2UFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARxpbmNyZWFzZVBvc2l0aW9uV2l0aFN0b3BMb3NzCgRfYW1tCl9kaXJlY3Rpb24JX2xldmVyYWdlE19taW5CYXNlQXNzZXRBbW91bnQIX3JlZkxpbmsRX3N0b3BUcmlnZ2VyUHJpY2UPX3N0b3BMaW1pdFByaWNlEV90YWtlVHJpZ2dlclByaWNlD190YWtlTGltaXRQcmljZQpfcHJpY2VEYXRhBAdfdHJhZGVyCQClCAEIBQFpBmNhbGxlcgQHY2xlYW5VcAkA/AcEBQR0aGlzAhJjbGVhblVwU3RhbGVPcmRlcnMJAMwIAgUEX2FtbQkAzAgCBQdfdHJhZGVyBQNuaWwFA25pbAMJAAACBQdjbGVhblVwBQdjbGVhblVwAwMJAQEhAQkBC2luaXRpYWxpemVkAAYJAQEhAQkBC2lzV2hpdGVsaXN0AQUEX2FtbQkAAgECL0ludmFsaWQgaW5jcmVhc2VQb3NpdGlvbldpdGhTdG9wTG9zcyBwYXJhbWV0ZXJzBAxwb3NpdGlvblNpemUJAQ9nZXRQb3NpdGlvblNpemUDBQRfYW1tBQdfdHJhZGVyBQpfZGlyZWN0aW9uAwkBAiE9AgUMcG9zaXRpb25TaXplAAAJAAIBAkJJbnZhbGlkIGluY3JlYXNlUG9zaXRpb25XaXRoU3RvcExvc3MgcGFyYW1ldGVyczogb25seSBuZXcgcG9zaXRpb24EDGRvU2V0Q29udGV4dAkA/AcEBQR0aGlzAgpzZXRDb250ZXh0CQDMCAIFB190cmFkZXIFA25pbAUDbmlsAwkAAAIFDGRvU2V0Q29udGV4dAUMZG9TZXRDb250ZXh0BA5kb09wZW5Qb3NpdGlvbgkA/AcECQERQGV4dHJOYXRpdmUoMTA2MikBBQRfYW1tAhBpbmNyZWFzZVBvc2l0aW9uCQDMCAIFCl9kaXJlY3Rpb24JAMwIAgUJX2xldmVyYWdlCQDMCAIFE19taW5CYXNlQXNzZXRBbW91bnQJAMwIAgUIX3JlZkxpbmsJAMwIAgUKX3ByaWNlRGF0YQUDbmlsCAUBaQhwYXltZW50cwMJAAACBQ5kb09wZW5Qb3NpdGlvbgUOZG9PcGVuUG9zaXRpb24EDmRvUmVzZXRDb250ZXh0CQD8BwQFBHRoaXMCDHJlc2V0Q29udGV4dAUDbmlsBQNuaWwDCQAAAgUOZG9SZXNldENvbnRleHQFDmRvUmVzZXRDb250ZXh0BBJvcGVuZWRQb3NpdGlvblNpemUJAQ9nZXRQb3NpdGlvblNpemUDBQRfYW1tBQdfdHJhZGVyBQpfZGlyZWN0aW9uAwkAAAIFEm9wZW5lZFBvc2l0aW9uU2l6ZQUSb3BlbmVkUG9zaXRpb25TaXplBAhhbW91bnRJbgkBA2FicwEFEm9wZW5lZFBvc2l0aW9uU2l6ZQMJAAACBQhhbW91bnRJbgUIYW1vdW50SW4EDHN0b3BMb3NzU2lkZQMJAGYCAAAFEm9wZW5lZFBvc2l0aW9uU2l6ZQUETE9ORwUFU0hPUlQEDWNoZWNrQW1vdW50SW4DCQBnAgAABQhhbW91bnRJbgQEZGF0YQkAuQkCCQDMCAIFBF9hbW0JAMwIAgUHX3RyYWRlcgkAzAgCCQCkAwEFCl9kaXJlY3Rpb24JAMwIAgkApAMBBQlfbGV2ZXJhZ2UJAMwIAgkApAMBBRNfbWluQmFzZUFzc2V0QW1vdW50CQDMCAIFCF9yZWZMaW5rCQDMCAIFCl9wcmljZURhdGEFA25pbAIBLAkAAgEJAKwCAgkArAICCQCsAgICEUludmFsaWQgYW1vdW50SW49CQCkAwEFCGFtb3VudEluAiEgYWZ0ZXIgc3VjY2VzcyBpbmNyZWFzZVBvc2l0aW9uOiAFBGRhdGEAAAMJAAACBQ1jaGVja0Ftb3VudEluBQ1jaGVja0Ftb3VudEluBBFkb0NyZWF0ZVN0b3BPcmRlcgMJAGYCBRFfc3RvcFRyaWdnZXJQcmljZQAABBFkb0NyZWF0ZVN0b3BPcmRlcgkA/AcEBQR0aGlzAhNpbnRlcm5hbENyZWF0ZU9yZGVyCQDMCAIFB190cmFkZXIJAMwIAgUEX2FtbQkAzAgCBQRTVE9QCQDMCAIFEV9zdG9wVHJpZ2dlclByaWNlCQDMCAIFD19zdG9wTGltaXRQcmljZQkAzAgCBQhhbW91bnRJbgkAzAgCAAAJAMwIAgUMc3RvcExvc3NTaWRlCQDMCAIFCF9yZWZMaW5rCQDMCAICAAkAzAgCAAAJAMwIAgAABQNuaWwFA25pbAMJAAACBRFkb0NyZWF0ZVN0b3BPcmRlcgURZG9DcmVhdGVTdG9wT3JkZXIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFEWRvQ3JlYXRlU3RvcE9yZGVyBRFkb0NyZWF0ZVN0b3BPcmRlcgQRZG9DcmVhdGVUYWtlT3JkZXIDCQBmAgURX3Rha2VUcmlnZ2VyUHJpY2UAAAQRZG9DcmVhdGVUYWtlT3JkZXIJAPwHBAUEdGhpcwITaW50ZXJuYWxDcmVhdGVPcmRlcgkAzAgCBQdfdHJhZGVyCQDMCAIFBF9hbW0JAMwIAgUEVEFLRQkAzAgCBRFfdGFrZVRyaWdnZXJQcmljZQkAzAgCBQ9fdGFrZUxpbWl0UHJpY2UJAMwIAgUIYW1vdW50SW4JAMwIAgAACQDMCAIFDHN0b3BMb3NzU2lkZQkAzAgCBQhfcmVmTGluawkAzAgCAgAJAMwIAgAACQDMCAIAAAUDbmlsBQNuaWwDCQAAAgURZG9DcmVhdGVUYWtlT3JkZXIFEWRvQ3JlYXRlVGFrZU9yZGVyBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4FA25pbAMJAAACBRFkb0NyZWF0ZVRha2VPcmRlcgURZG9DcmVhdGVUYWtlT3JkZXIFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpARlpbnRlcm5hbE1hcmtPcmRlckV4ZWN1dGVkAwRfYW1tB190cmFkZXIIX29yZGVySWQDAwMJAQEhAQkBC2luaXRpYWxpemVkAAYJAQEhAQkBC2lzV2hpdGVsaXN0AQUEX2FtbQYJAQEhAQkAAAIIBQFpBmNhbGxlcgUEdGhpcwkAAgECLEludmFsaWQgaW50ZXJuYWxNYXJrT3JkZXJFeGVjdXRlZCBwYXJhbWV0ZXJzBBNuZXdUcmFkZXJPcmRlckNvdW50CQBlAgkBE2dldFRyYWRlck9yZGVyQ291bnQCBQRfYW1tBQdfdHJhZGVyAAEJAM4IAgkAzggCCQEWdXBkYXRlVHJhZGVyT3JkZXJDb3VudAMFBF9hbW0FB190cmFkZXIFE25ld1RyYWRlck9yZGVyQ291bnQJARBhZGRSZW1vdmVPcmRlcklkBAUIX29yZGVySWQFBF9hbW0FB190cmFkZXIHCQEQbWFya0V4ZWN1dGVPcmRlcgEFCF9vcmRlcklkAWkBGmludGVybmFsQ3JlYXRlT3JkZXJSZXF1ZXN0BgdfdHJhZGVyBF9hbW0IX29yZGVySWQFX3R5cGUNX3RyaWdnZXJQcmljZQtfbGltaXRQcmljZQMDAwMDCQEBIQEJAQtpbml0aWFsaXplZAAGCQEBIQEJAQtpc1doaXRlbGlzdAEFBF9hbW0GCQBnAgAABQ1fdHJpZ2dlclByaWNlBgkAZgIAAAULX2xpbWl0UHJpY2UGCQEBIQEJAAACCAUBaQZjYWxsZXIFBHRoaXMJAAIBAi1JbnZhbGlkIGludGVybmFsQ3JlYXRlT3JkZXJSZXF1ZXN0IHBhcmFtZXRlcnMJARBzYXZlT3JkZXJSZXF1ZXN0BgUIX29yZGVySWQFBF9hbW0FB190cmFkZXIFBV90eXBlBQ1fdHJpZ2dlclByaWNlBQtfbGltaXRQcmljZQFpARNpbnRlcm5hbENyZWF0ZU9yZGVyDAdfdHJhZGVyBF9hbW0FX3R5cGUNX3RyaWdnZXJQcmljZQtfbGltaXRQcmljZQlfYW1vdW50SW4JX2xldmVyYWdlBV9zaWRlCF9yZWZMaW5rD19wYXltZW50QXNzZXRJZA5fcGF5bWVudEFtb3VudAtfZXhwaXJhdGlvbgMDAwMDAwMDAwMJAQEhAQkBC2luaXRpYWxpemVkAAYJAQEhAQkBC2lzV2hpdGVsaXN0AQUEX2FtbQYJAGYCAAAFDV90cmlnZ2VyUHJpY2UGCQBmAgAABQtfbGltaXRQcmljZQYJAGcCAAAFCV9hbW91bnRJbgYJAGYCAAAFCV9sZXZlcmFnZQYJAQEhAQMJAAACBQVfc2lkZQUETE9ORwYJAAACBQVfc2lkZQUFU0hPUlQGCQEBIQEDAwMJAAACBQVfdHlwZQUEU1RPUAYJAAACBQVfdHlwZQUEVEFLRQYJAAACBQVfdHlwZQUFTElNSVQGCQAAAgUFX3R5cGUFBk1BUktFVAYJAQEhAQkAAAIIBQFpBmNhbGxlcgUEdGhpcwYJAGYCAAAFC19leHBpcmF0aW9uCQACAQImSW52YWxpZCBpbnRlcm5hbENyZWF0ZU9yZGVyIHBhcmFtZXRlcnMEB29yZGVySWQJAGQCCQEOY3VycmVudE9yZGVySWQAAAEEEXBvc2l0aW9uRGlyZWN0aW9uCQEUZ2V0UG9zaXRpb25EaXJlY3Rpb24CBQVfc2lkZQUFX3R5cGUEE25ld1RyYWRlck9yZGVyQ291bnQJAGQCCQETZ2V0VHJhZGVyT3JkZXJDb3VudAIFBF9hbW0FB190cmFkZXIAAQQMcG9zaXRpb25TaXplCQEPZ2V0UG9zaXRpb25TaXplAwUEX2FtbQUHX3RyYWRlcgURcG9zaXRpb25EaXJlY3Rpb24EEG9yZGVyTWFya2V0UHJpY2UJAQ5nZXRNYXJrZXRQcmljZQEFBF9hbW0ECl9kaXJlY3Rpb24DAwMJAAACBQxwb3NpdGlvblNpemUAAAYDCQBmAgUMcG9zaXRpb25TaXplAAAJAAACBQVfc2lkZQUETE9ORwcGAwkAZgIAAAUMcG9zaXRpb25TaXplCQAAAgUFX3NpZGUFBVNIT1JUBwUISU5DUkVBU0UFCERFQ1JFQVNFAwMJAAACBQxwb3NpdGlvblNpemUAAAMJAAACBQVfdHlwZQUEU1RPUAYJAAACBQVfdHlwZQUEVEFLRQcJAAIBAitDYW4gbm90IGNyZWF0ZSBTVE9QL1RBS0Ugb3JkZXI6IG5vIHBvc2l0aW9uBAt1c2RuUGF5bWVudAMJAAACBQpfZGlyZWN0aW9uBQhJTkNSRUFTRQMDCQECIT0CBQ9fcGF5bWVudEFzc2V0SWQJANgEAQkBCnF1b3RlQXNzZXQABgkBAiE9AgUOX3BheW1lbnRBbW91bnQFCV9hbW91bnRJbgkAAgECNEludmFsaWQgY3JlYXRlTGltaXRPcmRlciBwYXJhbWV0ZXJzOiBpbnZhbGlkIHBheW1lbnQEBXN0YWtlCQD8BwQJAQ5tYW5hZ2VyQWRkcmVzcwACB2RlcG9zaXQFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQ5fcGF5bWVudEFtb3VudAUDbmlsAwkAAAIFBXN0YWtlBQVzdGFrZQUOX3BheW1lbnRBbW91bnQJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4AAAMJAAACBQt1c2RuUGF5bWVudAULdXNkblBheW1lbnQECnBvc2l0aW9uSWQDCQECIT0CBQxwb3NpdGlvblNpemUAAAkBDWdldFBvc2l0aW9uSWQDBQRfYW1tBQdfdHJhZGVyBRFwb3NpdGlvbkRpcmVjdGlvbgAAAwMDCQAAAgUFX3R5cGUFBFNUT1AGCQAAAgUFX3R5cGUFBFRBS0UJAAACBQpwb3NpdGlvbklkAAAHCQACAQI/U1RPUCBhbmQgVEFLRSBvcmRlciBzaG91bGQgYmUgYXNzaWduZWQgdG8gcG9zaXRpb24gd2l0aCBpZCAhPSAwAwkAZgIFE25ld1RyYWRlck9yZGVyQ291bnQFGU1BWF9UUkFERVJfT1JERVJTX1BFUl9BTU0JAAIBAjBJbnZhbGlkIGNyZWF0ZUxpbWl0T3JkZXIgcGFyYW1ldGVyczogb3JkZXIgY291bnQECWNoYW5nZVNldAkAzggCCQDOCAIJAM4IAgkBCXNhdmVPcmRlcg4FB29yZGVySWQFBF9hbW0FB190cmFkZXIFCV9hbW91bnRJbgUJX2xldmVyYWdlBQVfdHlwZQUNX3RyaWdnZXJQcmljZQULdXNkblBheW1lbnQFBV9zaWRlBQhfcmVmTGluawUKcG9zaXRpb25JZAULX2xpbWl0UHJpY2UFC19leHBpcmF0aW9uBRBvcmRlck1hcmtldFByaWNlCQEQYWRkUmVtb3ZlT3JkZXJJZAQFB29yZGVySWQFBF9hbW0FB190cmFkZXIGCQEWdXBkYXRlVHJhZGVyT3JkZXJDb3VudAMFBF9hbW0FB190cmFkZXIFE25ld1RyYWRlck9yZGVyQ291bnQJARF1cGRhdGVMYXN0T3JkZXJJZAEFB29yZGVySWQJAJQKAgUJY2hhbmdlU2V0BQdvcmRlcklkCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBC2NhbmNlbE9yZGVyAQhfb3JkZXJJZAQNJHQwMjg1NjkyODcxOQkBCGdldE9yZGVyAQUIX29yZGVySWQEBF9hbW0IBQ0kdDAyODU2OTI4NzE5Al8xBAdfdHJhZGVyCAUNJHQwMjg1NjkyODcxOQJfMgQJX2Ftb3VudEluCAUNJHQwMjg1NjkyODcxOQJfMwQJX2xldmVyYWdlCAUNJHQwMjg1NjkyODcxOQJfNAQFX3R5cGUIBQ0kdDAyODU2OTI4NzE5Al81BA1fdHJpZ2dlclByaWNlCAUNJHQwMjg1NjkyODcxOQJfNgQLX2Ftb3VudFVzZG4IBQ0kdDAyODU2OTI4NzE5Al83AwMDCQEBIQEJAQtpbml0aWFsaXplZAAGCQEBIQEJAQdpc1ZhbGlkAQUIX29yZGVySWQGCQEBIQEJAAACCQClCAEIBQFpBmNhbGxlcgUHX3RyYWRlcgkAAgECHkludmFsaWQgY2FuY2VsT3JkZXIgcGFyYW1ldGVycwQHY2xlYW5VcAkA/AcEBQR0aGlzAhJjbGVhblVwU3RhbGVPcmRlcnMJAMwIAgUEX2FtbQkAzAgCBQdfdHJhZGVyBQNuaWwFA25pbAMJAAACBQdjbGVhblVwBQdjbGVhblVwBBNuZXdUcmFkZXJPcmRlckNvdW50CQBlAgkBE2dldFRyYWRlck9yZGVyQ291bnQCBQRfYW1tBQdfdHJhZGVyAAEECHdpdGhkcmF3AwkAZgIFC19hbW91bnRVc2RuAAAEB3Vuc3Rha2UJAPwHBAkBDm1hbmFnZXJBZGRyZXNzAAIId2l0aGRyYXcJAMwIAgkA2AQBCQEKcXVvdGVBc3NldAAJAMwIAgULX2Ftb3VudFVzZG4FA25pbAUDbmlsAwkAAAIFB3Vuc3Rha2UFB3Vuc3Rha2UFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFCHdpdGhkcmF3BQh3aXRoZHJhdwkAzggCCQDOCAIJAM4IAgkBD21hcmtDYW5jZWxPcmRlcgEFCF9vcmRlcklkCQEQYWRkUmVtb3ZlT3JkZXJJZAQFCF9vcmRlcklkBQRfYW1tBQdfdHJhZGVyBwkBFnVwZGF0ZVRyYWRlck9yZGVyQ291bnQDBQRfYW1tBQdfdHJhZGVyBRNuZXdUcmFkZXJPcmRlckNvdW50AwkAZgIFC19hbW91bnRVc2RuAAAJAMwIAgkBDlNjcmlwdFRyYW5zZmVyAwgFAWkGY2FsbGVyBQtfYW1vdW50VXNkbgkBCnF1b3RlQXNzZXQABQNuaWwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgFpAQxleGVjdXRlT3JkZXICCF9vcmRlcklkCl9wcmljZURhdGEEDSR0MDI5OTM3MzAyMDAJAQhnZXRPcmRlcgEFCF9vcmRlcklkBARfYW1tCAUNJHQwMjk5MzczMDIwMAJfMQQHX3RyYWRlcggFDSR0MDI5OTM3MzAyMDACXzIECV9hbW91bnRJbggFDSR0MDI5OTM3MzAyMDACXzMECV9sZXZlcmFnZQgFDSR0MDI5OTM3MzAyMDACXzQEBV90eXBlCAUNJHQwMjk5MzczMDIwMAJfNQQNX3RyaWdnZXJQcmljZQgFDSR0MDI5OTM3MzAyMDACXzYEC19hbW91bnRVc2RuCAUNJHQwMjk5MzczMDIwMAJfNwQFX3NpZGUIBQ0kdDAyOTkzNzMwMjAwAl84BAhfcmVmTGluawgFDSR0MDI5OTM3MzAyMDACXzkEC19wb3NpdGlvbklkCAUNJHQwMjk5MzczMDIwMANfMTAEC19saW1pdFByaWNlCAUNJHQwMjk5MzczMDIwMANfMTEEC19leHBpcmF0aW9uCAUNJHQwMjk5MzczMDIwMANfMTIEEV9vcmRlck1hcmtldFByaWNlCAUNJHQwMjk5MzczMDIwMANfMTMEC3VwZGF0ZVByaWNlCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBF9hbW0CDHVwZGF0ZU9yYWNsZQkAzAgCBQpfcHJpY2VEYXRhBQNuaWwFA25pbAMJAAACBQt1cGRhdGVQcmljZQULdXBkYXRlUHJpY2UEB2NsZWFuVXAJAPwHBAUEdGhpcwISY2xlYW5VcFN0YWxlT3JkZXJzCQDMCAIFBF9hbW0JAMwIAgUHX3RyYWRlcgUDbmlsBQNuaWwDCQAAAgUHY2xlYW5VcAUHY2xlYW5VcAQHX2NhbGxlcgMJAAACCAUBaQZjYWxsZXIFBHRoaXMIBQFpDG9yaWdpbkNhbGxlcggFAWkGY2FsbGVyAwkAAAIFB19jYWxsZXIFB19jYWxsZXIEEXBvc2l0aW9uRGlyZWN0aW9uCQEUZ2V0UG9zaXRpb25EaXJlY3Rpb24CBQVfc2lkZQUFX3R5cGUDAwMJAQEhAQkBC2luaXRpYWxpemVkAAYJAQEhAQkBB2lzVmFsaWQBBQhfb3JkZXJJZAYJAQEhAQkBEmNoZWNrVmFsaWRFeGVjdXRvcgEFB19jYWxsZXIJAAIBAh9JbnZhbGlkIGV4ZWN1dGVPcmRlciBwYXJhbWV0ZXJzBAxwb3NpdGlvblNpemUJAQ9nZXRQb3NpdGlvblNpemUDBQRfYW1tBQdfdHJhZGVyBRFwb3NpdGlvbkRpcmVjdGlvbgMJAAACBQxwb3NpdGlvblNpemUFDHBvc2l0aW9uU2l6ZQQRY3VycmVudFBvc2l0aW9uSWQDCQECIT0CBQxwb3NpdGlvblNpemUAAAkBDWdldFBvc2l0aW9uSWQDBQRfYW1tBQdfdHJhZGVyBRFwb3NpdGlvbkRpcmVjdGlvbgAABA0kdDAzMDk0NjM2MTk3AwkAAAIFBV90eXBlBQRTVE9QBBJfcG9zaXRpb25EaXJlY3Rpb24DCQBmAgUMcG9zaXRpb25TaXplAAAFBExPTkcDCQBmAgAABQxwb3NpdGlvblNpemUFBVNIT1JUCQACAQIsQ2FuIG5vdCBleGVjdXRlIFNUT1Agb3JkZXI6IG5vIG9wZW4gcG9zaXRpb24EC21hcmtldFByaWNlCQEOZ2V0TWFya2V0UHJpY2UBBQRfYW1tBAxpc0V4ZWN1dGFibGUDCQAAAgUFX3NpZGUFEl9wb3NpdGlvbkRpcmVjdGlvbgkAAgECJ0NhbiBub3QgZXhlY3V0ZSBTVE9QIG9yZGVyOiByZWR1Y2Ugb25seQMJAQIhPQIFEWN1cnJlbnRQb3NpdGlvbklkBQtfcG9zaXRpb25JZAkAAgECK0NhbiBub3QgZXhlY3V0ZSBTVE9QIG9yZGVyOiBwb3NpdGlvbiBjbG9zZWQDCQAAAgUSX3Bvc2l0aW9uRGlyZWN0aW9uBQRMT05HCQBnAgUNX3RyaWdnZXJQcmljZQULbWFya2V0UHJpY2UJAGcCBQttYXJrZXRQcmljZQUNX3RyaWdnZXJQcmljZQMFDGlzRXhlY3V0YWJsZQkAlQoDAg1jbG9zZVBvc2l0aW9uCQDMCAIJAQRtaW52AgUJX2Ftb3VudEluCQEDYWJzAQUMcG9zaXRpb25TaXplCQDMCAIFEXBvc2l0aW9uRGlyZWN0aW9uCQDMCAIJAQRtdWxkAgULX2xpbWl0UHJpY2UJAQNhYnMBBQxwb3NpdGlvblNpemUJAMwIAgcJAMwIAgUKX3ByaWNlRGF0YQUDbmlsBQNuaWwJAAIBAjFDYW4gbm90IGV4ZWN1dGUgU1RPUCBvcmRlcjogdHJpZ2dlclByaWNlIG1pc21hdGNoAwkAAAIFBV90eXBlBQRUQUtFBBJfcG9zaXRpb25EaXJlY3Rpb24DCQBmAgUMcG9zaXRpb25TaXplAAAFBExPTkcDCQBmAgAABQxwb3NpdGlvblNpemUFBVNIT1JUCQACAQIsQ2FuIG5vdCBleGVjdXRlIFNUT1Agb3JkZXI6IG5vIG9wZW4gcG9zaXRpb24EC21hcmtldFByaWNlCQEOZ2V0TWFya2V0UHJpY2UBBQRfYW1tBAxpc0V4ZWN1dGFibGUDCQAAAgUFX3NpZGUFEl9wb3NpdGlvbkRpcmVjdGlvbgkAAgECJ0NhbiBub3QgZXhlY3V0ZSBUQUtFIG9yZGVyOiByZWR1Y2Ugb25seQMJAQIhPQIFEWN1cnJlbnRQb3NpdGlvbklkBQtfcG9zaXRpb25JZAkAAgEJAKwCAgkArAICCQCsAgICLENhbiBub3QgZXhlY3V0ZSBUQUtFIG9yZGVyOiBwb3NpdGlvbiBjbG9zZWQgCQCkAwEFEWN1cnJlbnRQb3NpdGlvbklkAgIhPQkApAMBBQtfcG9zaXRpb25JZAMJAAACBRJfcG9zaXRpb25EaXJlY3Rpb24FBExPTkcJAGcCBQttYXJrZXRQcmljZQUNX3RyaWdnZXJQcmljZQkAZwIFDV90cmlnZ2VyUHJpY2UFC21hcmtldFByaWNlAwUMaXNFeGVjdXRhYmxlCQCVCgMCDWNsb3NlUG9zaXRpb24JAMwIAgkBBG1pbnYCBQlfYW1vdW50SW4JAQNhYnMBBQxwb3NpdGlvblNpemUJAMwIAgURcG9zaXRpb25EaXJlY3Rpb24JAMwIAgkBBG11bGQCBQtfbGltaXRQcmljZQkBA2FicwEFDHBvc2l0aW9uU2l6ZQkAzAgCBwkAzAgCBQpfcHJpY2VEYXRhBQNuaWwFA25pbAkAAgECMUNhbiBub3QgZXhlY3V0ZSBUQUtFIG9yZGVyOiB0cmlnZ2VyUHJpY2UgbWlzbWF0Y2gDCQAAAgUFX3R5cGUFBUxJTUlUBAttYXJrZXRQcmljZQkBDmdldE1hcmtldFByaWNlAQUEX2FtbQQSaXNFeGVjdXRhYmxlQnlTdG9wAwkAAAIFC19saW1pdFByaWNlAAAGAwkAAAIFBV9zaWRlBQRMT05HCQBnAgULbWFya2V0UHJpY2UFC19saW1pdFByaWNlCQBnAgULX2xpbWl0UHJpY2UFC21hcmtldFByaWNlBBtpc0V4ZWN1dGFibGVGb3JUcmlnZ2VyUHJpY2UDCQAAAgUFX3NpZGUFBExPTkcJAGcCBQ1fdHJpZ2dlclByaWNlBQttYXJrZXRQcmljZQkAZwIFC21hcmtldFByaWNlBQ1fdHJpZ2dlclByaWNlBBdpc0V4ZWN1dGFibGVCeVRpbWVzdGFtcAMDCQAAAgULX2V4cGlyYXRpb24AAAYJAGcCBQtfZXhwaXJhdGlvbgUEVElNRQYHBAxpc0V4ZWN1dGFibGUDAwUSaXNFeGVjdXRhYmxlQnlTdG9wBRtpc0V4ZWN1dGFibGVGb3JUcmlnZ2VyUHJpY2UHBRdpc0V4ZWN1dGFibGVCeVRpbWVzdGFtcAcDBQxpc0V4ZWN1dGFibGUEDG1hcmdpbkFtb3VudAkBBGRpdmQCBQtfYW1vdW50VXNkbgkAZAIJAQRtdWxkAgkBBmdldEZlZQIFBF9hbW0FB190cmFkZXIFCV9sZXZlcmFnZQUMREVDSU1BTF9VTklUBAxvcGVuTm90aW9uYWwJAQRtdWxkAgUMbWFyZ2luQW1vdW50BQlfbGV2ZXJhZ2UEF2lkZWFsTWluQmFzZUFzc2V0QW1vdW50CQEEZGl2ZAIFDG9wZW5Ob3Rpb25hbAUNX3RyaWdnZXJQcmljZQQSbWluQmFzZUFzc2V0QW1vdW50CQBlAgUXaWRlYWxNaW5CYXNlQXNzZXRBbW91bnQJAQRtdWxkAgUXaWRlYWxNaW5CYXNlQXNzZXRBbW91bnQJAQ5nZXRTcHJlYWRMaW1pdAAJAJUKAwIQaW5jcmVhc2VQb3NpdGlvbgkAzAgCBQVfc2lkZQkAzAgCBQlfbGV2ZXJhZ2UJAMwIAgUSbWluQmFzZUFzc2V0QW1vdW50CQDMCAIFCF9yZWZMaW5rCQDMCAIFCl9wcmljZURhdGEFA25pbAkAzAgCCQEPQXR0YWNoZWRQYXltZW50AgkBCnF1b3RlQXNzZXQABQtfYW1vdW50VXNkbgUDbmlsAwMDBRJpc0V4ZWN1dGFibGVCeVN0b3AFF2lzRXhlY3V0YWJsZUJ5VGltZXN0YW1wBwkBAiE9AgULX2xpbWl0UHJpY2UAAAcEDWRvVXBkYXRlT3JkZXIJAPwHBAUEdGhpcwIRaW50ZXJuYWxTYXZlT3JkZXIJAMwIAgUIX29yZGVySWQJAMwIAgUEX2FtbQkAzAgCBQdfdHJhZGVyCQDMCAIFCV9hbW91bnRJbgkAzAgCBQlfbGV2ZXJhZ2UJAMwIAgUFX3R5cGUJAMwIAgUNX3RyaWdnZXJQcmljZQkAzAgCBQtfYW1vdW50VXNkbgkAzAgCBQVfc2lkZQkAzAgCBQhfcmVmTGluawkAzAgCBQtfcG9zaXRpb25JZAkAzAgCAAAJAMwIAgULX2V4cGlyYXRpb24JAMwIAgURX29yZGVyTWFya2V0UHJpY2UFA25pbAUDbmlsAwkAAAIFDWRvVXBkYXRlT3JkZXIFDWRvVXBkYXRlT3JkZXIJAJUKAwIABQNuaWwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgkAAgECMkNhbiBub3QgZXhlY3V0ZSBMSU1JVCBvcmRlcjogdHJpZ2dlclByaWNlIG1pc21hdGNoAwkAAAIFBV90eXBlBQZNQVJLRVQEC21hcmtldFByaWNlCQEOZ2V0TWFya2V0UHJpY2UBBQRfYW1tBBdpc0V4ZWN1dGFibGVCeVRpbWVzdGFtcAMDCQAAAgULX2V4cGlyYXRpb24AAAYJAGcCBQtfZXhwaXJhdGlvbgUEVElNRQYHBAxpc0V4ZWN1dGFibGUFF2lzRXhlY3V0YWJsZUJ5VGltZXN0YW1wAwUMaXNFeGVjdXRhYmxlCQCVCgMCEGluY3JlYXNlUG9zaXRpb24JAMwIAgUFX3NpZGUJAMwIAgUJX2xldmVyYWdlCQDMCAIAAAkAzAgCBQhfcmVmTGluawkAzAgCBQpfcHJpY2VEYXRhBQNuaWwJAMwIAgkBD0F0dGFjaGVkUGF5bWVudAIJAQpxdW90ZUFzc2V0AAULX2Ftb3VudFVzZG4FA25pbAkAAgECMUNhbiBub3QgZXhlY3V0ZSBNQVJLRVQgb3JkZXI6IGV4cGlyYXRpb24gbWlzbWF0Y2gJAAIBCQCsAgICFEludmFsaWQgb3JkZXIgdHlwZTogCQCkAwEFBV90eXBlBAZtZXRob2QIBQ0kdDAzMDk0NjM2MTk3Al8xBARhcmdzCAUNJHQwMzA5NDYzNjE5NwJfMgQIcGF5bWVudHMIBQ0kdDAzMDk0NjM2MTk3Al8zBAh3aXRoZHJhdwMJAAACCQCQAwEFCHBheW1lbnRzAAEEB3Vuc3Rha2UJAPwHBAkBDm1hbmFnZXJBZGRyZXNzAAIId2l0aGRyYXcJAMwIAgkA2AQBCQEKcXVvdGVBc3NldAAJAMwIAggJAJEDAgUIcGF5bWVudHMAAAZhbW91bnQFA25pbAUDbmlsAwkAAAIFB3Vuc3Rha2UFB3Vuc3Rha2UFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFCHdpdGhkcmF3BQh3aXRoZHJhdwMJAQIhPQIFBm1ldGhvZAIABAxkb1NldENvbnRleHQJAPwHBAUEdGhpcwIKc2V0Q29udGV4dAkAzAgCBQdfdHJhZGVyBQNuaWwFA25pbAMJAAACBQxkb1NldENvbnRleHQFDGRvU2V0Q29udGV4dAQPZG9DbG9zZVBvc2l0aW9uCQD8BwQJARFAZXh0ck5hdGl2ZSgxMDYyKQEFBF9hbW0FBm1ldGhvZAUEYXJncwUIcGF5bWVudHMDCQAAAgUPZG9DbG9zZVBvc2l0aW9uBQ9kb0Nsb3NlUG9zaXRpb24EDmRvUmVzZXRDb250ZXh0CQD8BwQFBHRoaXMCDHJlc2V0Q29udGV4dAUDbmlsBQNuaWwDCQAAAgUOZG9SZXNldENvbnRleHQFDmRvUmVzZXRDb250ZXh0BBNleGVjdXRlT3JkZXJSZXF1ZXN0AwMJAAACBQVfdHlwZQUFTElNSVQGCQAAAgUFX3R5cGUFBk1BUktFVAQPbmV3UG9zaXRpb25TaXplCQEPZ2V0UG9zaXRpb25TaXplAwUEX2FtbQUHX3RyYWRlcgURcG9zaXRpb25EaXJlY3Rpb24DCQAAAgUPbmV3UG9zaXRpb25TaXplBQ9uZXdQb3NpdGlvblNpemUEDW5ld1Bvc2l0aW9uSWQJAQ1nZXRQb3NpdGlvbklkAwUEX2FtbQUHX3RyYWRlcgURcG9zaXRpb25EaXJlY3Rpb24DCQAAAgUNbmV3UG9zaXRpb25JZAUNbmV3UG9zaXRpb25JZAQRcG9zaXRpb25TaXplRGVsdGEJAGUCBQ9uZXdQb3NpdGlvblNpemUFDHBvc2l0aW9uU2l6ZQQOY2xvc2VPcmRlclNpZGUDCQBmAgUPbmV3UG9zaXRpb25TaXplAAAFBVNIT1JUBQRMT05HBA1tYWtlVGFrZU9yZGVyAwkBEGhhdmVPcmRlclJlcXVlc3QCBQhfb3JkZXJJZAUEVEFLRQQNJHQwMzcyMzEzNzQ0NAkBD2dldE9yZGVyUmVxdWVzdAIFCF9vcmRlcklkBQRUQUtFBApuZXdPcmRlcklkCAUNJHQwMzcyMzEzNzQ0NAJfMQQGbmV3QW1tCAUNJHQwMzcyMzEzNzQ0NAJfMgQJbmV3VHJhZGVyCAUNJHQwMzcyMzEzNzQ0NAJfMwQHbmV3VHlwZQgFDSR0MDM3MjMxMzc0NDQCXzQED25ld1RyaWdnZXJQcmljZQgFDSR0MDM3MjMxMzc0NDQCXzUEDW5ld0xpbWl0UHJpY2UIBQ0kdDAzNzIzMTM3NDQ0Al82BAZkb0NhbGwJAPwHBAUEdGhpcwITaW50ZXJuYWxDcmVhdGVPcmRlcgkAzAgCBQluZXdUcmFkZXIJAMwIAgUGbmV3QW1tCQDMCAIFB25ld1R5cGUJAMwIAgUPbmV3VHJpZ2dlclByaWNlCQDMCAIFDW5ld0xpbWl0UHJpY2UJAMwIAgURcG9zaXRpb25TaXplRGVsdGEJAMwIAgAACQDMCAIFDmNsb3NlT3JkZXJTaWRlCQDMCAICAAkAzAgCAgAJAMwIAgAACQDMCAIAAAUDbmlsBQNuaWwDCQAAAgUGZG9DYWxsBQZkb0NhbGwFA25pbAkAAgECJFN0cmljdCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgUDbmlsAwkAAAIFDW1ha2VUYWtlT3JkZXIFDW1ha2VUYWtlT3JkZXIEDW1ha2VTdG9wT3JkZXIDCQEQaGF2ZU9yZGVyUmVxdWVzdAIFCF9vcmRlcklkBQRTVE9QBA0kdDAzODA2NzM4MjgwCQEPZ2V0T3JkZXJSZXF1ZXN0AgUIX29yZGVySWQFBFNUT1AECm5ld09yZGVySWQIBQ0kdDAzODA2NzM4MjgwAl8xBAZuZXdBbW0IBQ0kdDAzODA2NzM4MjgwAl8yBAluZXdUcmFkZXIIBQ0kdDAzODA2NzM4MjgwAl8zBAduZXdUeXBlCAUNJHQwMzgwNjczODI4MAJfNAQPbmV3VHJpZ2dlclByaWNlCAUNJHQwMzgwNjczODI4MAJfNQQNbmV3TGltaXRQcmljZQgFDSR0MDM4MDY3MzgyODACXzYEBmRvQ2FsbAkA/AcEBQR0aGlzAhNpbnRlcm5hbENyZWF0ZU9yZGVyCQDMCAIFCW5ld1RyYWRlcgkAzAgCBQZuZXdBbW0JAMwIAgUHbmV3VHlwZQkAzAgCBQ9uZXdUcmlnZ2VyUHJpY2UJAMwIAgUNbmV3TGltaXRQcmljZQkAzAgCBRFwb3NpdGlvblNpemVEZWx0YQkAzAgCAAAJAMwIAgUOY2xvc2VPcmRlclNpZGUJAMwIAgIACQDMCAICAAkAzAgCAAAJAMwIAgAABQNuaWwFA25pbAMJAAACBQZkb0NhbGwFBmRvQ2FsbAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwDCQAAAgUNbWFrZVN0b3BPcmRlcgUNbWFrZVN0b3BPcmRlcgkAzggCBQ1tYWtlVGFrZU9yZGVyBQ1tYWtlU3RvcE9yZGVyCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwDCQAAAgUTZXhlY3V0ZU9yZGVyUmVxdWVzdAUTZXhlY3V0ZU9yZGVyUmVxdWVzdAQTZG9NYXJrT3JkZXJFeGVjdXRlZAkA/AcEBQR0aGlzAhlpbnRlcm5hbE1hcmtPcmRlckV4ZWN1dGVkCQDMCAIFBF9hbW0JAMwIAgUHX3RyYWRlcgkAzAgCBQhfb3JkZXJJZAUDbmlsBQNuaWwDCQAAAgUTZG9NYXJrT3JkZXJFeGVjdXRlZAUTZG9NYXJrT3JkZXJFeGVjdXRlZAUDbmlsCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuBQNuaWwJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4JAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BaQEUdmlld19jYW5FeGVjdXRlT3JkZXICCF9vcmRlcklkCl9wcmljZURhdGEEAXMJAPwHBAUEdGhpcwIMZXhlY3V0ZU9yZGVyCQDMCAIFCF9vcmRlcklkCQDMCAIFCl9wcmljZURhdGEFA25pbAUDbmlsAwkAAAIFAXMFAXMJAAIBAgdTdWNjZXNzCQACAQIkU3RyaWN0IHZhbHVlIGlzIG5vdCBlcXVhbCB0byBpdHNlbGYuAWkBGXZpZXdfY2FuQWN0aXZhdGVTdG9wT3JkZXICCF9vcmRlcklkCl9wcmljZURhdGEEAXMJAPwHBAUEdGhpcwIRYWN0aXZhdGVTdG9wT3JkZXIJAMwIAgUIX29yZGVySWQJAMwIAgUKX3ByaWNlRGF0YQUDbmlsBQNuaWwDCQAAAgUBcwUBcwkAAgECB1N1Y2Nlc3MJAAIBAiRTdHJpY3QgdmFsdWUgaXMgbm90IGVxdWFsIHRvIGl0c2VsZi4BAnR4AQZ2ZXJpZnkABA5jb29yZGluYXRvclN0cgkAnQgCBQR0aGlzBRRrX2Nvb3JkaW5hdG9yQWRkcmVzcwMJAQlpc0RlZmluZWQBBQ5jb29yZGluYXRvclN0cgQFYWRtaW4JAJ0IAgkBEUBleHRyTmF0aXZlKDEwNjIpAQkBBXZhbHVlAQUOY29vcmRpbmF0b3JTdHIFD2tfYWRtaW5fYWRkcmVzcwMJAQlpc0RlZmluZWQBBQVhZG1pbgkBC3ZhbHVlT3JFbHNlAgkAmwgCCQERQGV4dHJOYXRpdmUoMTA2MikBCQEFdmFsdWUBBQVhZG1pbgkArAICCQCsAgIJAKwCAgIHc3RhdHVzXwkApQgBBQR0aGlzAgFfCQDYBAEIBQJ0eAJpZAcJAAIBAi51bmFibGUgdG8gdmVyaWZ5OiBhZG1pbiBub3Qgc2V0IGluIGNvb3JkaW5hdG9yCQD0AwMIBQJ0eAlib2R5Qnl0ZXMJAJEDAggFAnR4BnByb29mcwAACAUCdHgPc2VuZGVyUHVibGljS2V5zP3F3Q==", "height": 2684284, "applicationStatus": "succeeded", "spentComplexity": 0 } View: original | compacted Prev: 28htBguZMVt4Hz3mXrV4695C49oysKeMY6DTYx3QQ63V Next: none Diff:
OldNewDifferences
318318
319319
320320 @Callable(i)
321+func internalSaveOrder (_orderId,_amm,_trader,_amountIn,_leverage,_type,_triggerPrice,_paymentUsdn,_side,_refLink,_positionId,_limitPrice,_expiration,_orderMarketPrice) = if ((i.caller != this))
322+ then throw("Invalid saveOrderInternal params")
323+ else saveOrder(_orderId, _amm, _trader, _amountIn, _leverage, _type, _triggerPrice, _paymentUsdn, _side, _refLink, _positionId, _limitPrice, _expiration, _orderMarketPrice)
324+
325+
326+
327+@Callable(i)
321328 func cleanUpStaleOrders (_amm,_trader) = {
322329 let orders = traderAmmOrdersIds(_amm, _trader)
323330 let positionIds = getPositionIds(_amm, _trader)
324331 func cleanUpOne (_acc,_orderId) = {
325332 let orderIdInt = valueOrErrorMessage(parseInt(_orderId), "Invalid order id")
326- let $t01236712592 = getOrder(orderIdInt)
327- let _x1 = $t01236712592._1
328- let _x2 = $t01236712592._2
329- let _x3 = $t01236712592._3
330- let _x4 = $t01236712592._4
331- let _type = $t01236712592._5
332- let _x5 = $t01236712592._6
333- let _paymentUsdn = $t01236712592._7
334- let _x6 = $t01236712592._8
335- let _x7 = $t01236712592._9
336- let _positionId = $t01236712592._10
337- let _x8 = $t01236712592._11
338- let _expiration = $t01236712592._12
333+ let $t01311313338 = getOrder(orderIdInt)
334+ let _x1 = $t01311313338._1
335+ let _x2 = $t01311313338._2
336+ let _x3 = $t01311313338._3
337+ let _x4 = $t01311313338._4
338+ let _type = $t01311313338._5
339+ let _x5 = $t01311313338._6
340+ let _paymentUsdn = $t01311313338._7
341+ let _x6 = $t01311313338._8
342+ let _x7 = $t01311313338._9
343+ let _positionId = $t01311313338._10
344+ let _x8 = $t01311313338._11
345+ let _expiration = $t01311313338._12
339346 let cancelTakeStopOfNoPosition = if (if (if ((_type == STOP))
340347 then true
341348 else (_type == TAKE))
364371 else _acc
365372 }
366373
367- let $t01329313388 = {
374+ let $t01404014135 = {
368375 let $l = orders
369376 let $s = size($l)
370377 let $acc0 = $Tuple3(orders, nil, 0)
378385
379386 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
380387 }
381- let newOrders = $t01329313388._1
382- let cancelActions = $t01329313388._2
383- let paymentToReturn = $t01329313388._3
388+ let newOrders = $t01404014135._1
389+ let cancelActions = $t01404014135._2
390+ let paymentToReturn = $t01404014135._3
384391 let withdraw = if ((paymentToReturn > 0))
385392 then {
386393 let unstake = invoke(managerAddress(), "withdraw", [toBase58String(quoteAsset()), paymentToReturn], nil)
499506 then if ((size(i.payments) > 1))
500507 then throw("Invalid createOrder parameters: invalid payment count")
501508 else {
502- let $t01789718149 = if ((size(i.payments) == 1))
509+ let $t01864418896 = if ((size(i.payments) == 1))
503510 then $Tuple2(toBase58String(valueOrErrorMessage(i.payments[0].assetId, "Invalid asset id")), i.payments[0].amount)
504511 else $Tuple2("", 0)
505- let paymentAssetId = $t01789718149._1
506- let paymentAmount = $t01789718149._2
512+ let paymentAssetId = $t01864418896._1
513+ let paymentAmount = $t01864418896._2
507514 let doCall = invoke(this, "internalCreateOrder", [_trader, _amm, _type, _triggerPrice, _limitPrice, _amountIn, _leverage, _side, _refLink, paymentAssetId, paymentAmount, _expiration], nil)
508515 if ((doCall == doCall))
509516 then {
748755
749756 @Callable(i)
750757 func cancelOrder (_orderId) = {
751- let $t02782227972 = getOrder(_orderId)
752- let _amm = $t02782227972._1
753- let _trader = $t02782227972._2
754- let _amountIn = $t02782227972._3
755- let _leverage = $t02782227972._4
756- let _type = $t02782227972._5
757- let _triggerPrice = $t02782227972._6
758- let _amountUsdn = $t02782227972._7
758+ let $t02856928719 = getOrder(_orderId)
759+ let _amm = $t02856928719._1
760+ let _trader = $t02856928719._2
761+ let _amountIn = $t02856928719._3
762+ let _leverage = $t02856928719._4
763+ let _type = $t02856928719._5
764+ let _triggerPrice = $t02856928719._6
765+ let _amountUsdn = $t02856928719._7
759766 if (if (if (!(initialized()))
760767 then true
761768 else !(isValid(_orderId)))
789796
790797 @Callable(i)
791798 func executeOrder (_orderId,_priceData) = {
792- let $t02919029453 = getOrder(_orderId)
793- let _amm = $t02919029453._1
794- let _trader = $t02919029453._2
795- let _amountIn = $t02919029453._3
796- let _leverage = $t02919029453._4
797- let _type = $t02919029453._5
798- let _triggerPrice = $t02919029453._6
799- let _amountUsdn = $t02919029453._7
800- let _side = $t02919029453._8
801- let _refLink = $t02919029453._9
802- let _positionId = $t02919029453._10
803- let _limitPrice = $t02919029453._11
804- let _expiration = $t02919029453._12
805- let _orderMarketPrice = $t02919029453._13
799+ let $t02993730200 = getOrder(_orderId)
800+ let _amm = $t02993730200._1
801+ let _trader = $t02993730200._2
802+ let _amountIn = $t02993730200._3
803+ let _leverage = $t02993730200._4
804+ let _type = $t02993730200._5
805+ let _triggerPrice = $t02993730200._6
806+ let _amountUsdn = $t02993730200._7
807+ let _side = $t02993730200._8
808+ let _refLink = $t02993730200._9
809+ let _positionId = $t02993730200._10
810+ let _limitPrice = $t02993730200._11
811+ let _expiration = $t02993730200._12
812+ let _orderMarketPrice = $t02993730200._13
806813 let updatePrice = invoke(addressFromStringValue(_amm), "updateOracle", [_priceData], nil)
807814 if ((updatePrice == updatePrice))
808815 then {
828835 let currentPositionId = if ((positionSize != 0))
829836 then getPositionId(_amm, _trader, positionDirection)
830837 else 0
831- let $t03019934951 = if ((_type == STOP))
838+ let $t03094636197 = if ((_type == STOP))
832839 then {
833840 let _positionDirection = if ((positionSize > 0))
834841 then LONG
871878 let marketPrice = getMarketPrice(_amm)
872879 let isExecutableByStop = if ((_limitPrice == 0))
873880 then true
874- else if ((_limitPrice > _orderMarketPrice))
881+ else if ((_side == LONG))
875882 then (marketPrice >= _limitPrice)
876883 else (_limitPrice >= marketPrice)
877884 let isExecutableForTriggerPrice = if ((_side == LONG))
895902 let minBaseAssetAmount = (idealMinBaseAssetAmount - muld(idealMinBaseAssetAmount, getSpreadLimit()))
896903 $Tuple3("increasePosition", [_side, _leverage, minBaseAssetAmount, _refLink, _priceData], [AttachedPayment(quoteAsset(), _amountUsdn)])
897904 }
898- else throw("Can not execute LIMIT order: triggerPrice mismatch")
905+ else if (if (if (isExecutableByStop)
906+ then isExecutableByTimestamp
907+ else false)
908+ then (_limitPrice != 0)
909+ else false)
910+ then {
911+ let doUpdateOrder = invoke(this, "internalSaveOrder", [_orderId, _amm, _trader, _amountIn, _leverage, _type, _triggerPrice, _amountUsdn, _side, _refLink, _positionId, 0, _expiration, _orderMarketPrice], nil)
912+ if ((doUpdateOrder == doUpdateOrder))
913+ then $Tuple3("", nil, nil)
914+ else throw("Strict value is not equal to itself.")
915+ }
916+ else throw("Can not execute LIMIT order: triggerPrice mismatch")
899917 }
900918 else if ((_type == MARKET))
901919 then {
911929 else throw("Can not execute MARKET order: expiration mismatch")
912930 }
913931 else throw(("Invalid order type: " + toString(_type)))
914- let method = $t03019934951._1
915- let args = $t03019934951._2
916- let payments = $t03019934951._3
932+ let method = $t03094636197._1
933+ let args = $t03094636197._2
934+ let payments = $t03094636197._3
917935 let withdraw = if ((size(payments) == 1))
918936 then {
919937 let unstake = invoke(managerAddress(), "withdraw", [toBase58String(quoteAsset()), payments[0].amount], nil)
923941 }
924942 else nil
925943 if ((withdraw == withdraw))
926- then {
927- let doSetContext = invoke(this, "setContext", [_trader], nil)
928- if ((doSetContext == doSetContext))
929- then {
930- let doClosePosition = invoke(addressFromStringValue(_amm), method, args, payments)
931- if ((doClosePosition == doClosePosition))
932- then {
933- let doResetContext = invoke(this, "resetContext", nil, nil)
934- if ((doResetContext == doResetContext))
935- then {
936- let executeOrderRequest = if (if ((_type == LIMIT))
937- then true
938- else (_type == MARKET))
939- then {
940- let newPositionSize = getPositionSize(_amm, _trader, positionDirection)
941- if ((newPositionSize == newPositionSize))
942- then {
943- let newPositionId = getPositionId(_amm, _trader, positionDirection)
944- if ((newPositionId == newPositionId))
945- then {
946- let positionSizeDelta = (newPositionSize - positionSize)
947- let closeOrderSide = if ((newPositionSize > 0))
948- then SHORT
949- else LONG
950- let makeTakeOrder = if (haveOrderRequest(_orderId, TAKE))
951- then {
952- let $t03593236131 = getOrderRequest(_orderId, TAKE)
953- let newOrderId = $t03593236131._1
954- let newAmm = $t03593236131._2
955- let newTrader = $t03593236131._3
956- let newType = $t03593236131._4
957- let newTriggerPrice = $t03593236131._5
958- let newLimitPrice = $t03593236131._6
959- let doCall = invoke(this, "internalCreateOrder", [newTrader, newAmm, newType, newTriggerPrice, newLimitPrice, positionSizeDelta, 0, closeOrderSide, "", "", 0, 0], nil)
960- if ((doCall == doCall))
961- then nil
962- else throw("Strict value is not equal to itself.")
963- }
964- else nil
965- if ((makeTakeOrder == makeTakeOrder))
966- then {
967- let makeStopOrder = if (haveOrderRequest(_orderId, STOP))
968- then {
969- let $t03670436903 = getOrderRequest(_orderId, STOP)
970- let newOrderId = $t03670436903._1
971- let newAmm = $t03670436903._2
972- let newTrader = $t03670436903._3
973- let newType = $t03670436903._4
974- let newTriggerPrice = $t03670436903._5
975- let newLimitPrice = $t03670436903._6
976- let doCall = invoke(this, "internalCreateOrder", [newTrader, newAmm, newType, newTriggerPrice, newLimitPrice, positionSizeDelta, 0, closeOrderSide, "", "", 0, 0], nil)
977- if ((doCall == doCall))
978- then nil
979- else throw("Strict value is not equal to itself.")
980- }
981- else nil
982- if ((makeStopOrder == makeStopOrder))
983- then (makeTakeOrder ++ makeStopOrder)
984- else throw("Strict value is not equal to itself.")
985- }
986- else throw("Strict value is not equal to itself.")
987- }
988- else throw("Strict value is not equal to itself.")
989- }
990- else throw("Strict value is not equal to itself.")
991- }
992- else nil
993- if ((executeOrderRequest == executeOrderRequest))
994- then {
995- let doMarkOrderExecuted = invoke(this, "internalMarkOrderExecuted", [_amm, _trader, _orderId], nil)
996- if ((doMarkOrderExecuted == doMarkOrderExecuted))
997- then nil
998- else throw("Strict value is not equal to itself.")
999- }
1000- else throw("Strict value is not equal to itself.")
1001- }
1002- else throw("Strict value is not equal to itself.")
1003- }
1004- else throw("Strict value is not equal to itself.")
1005- }
1006- else throw("Strict value is not equal to itself.")
1007- }
944+ then if ((method != ""))
945+ then {
946+ let doSetContext = invoke(this, "setContext", [_trader], nil)
947+ if ((doSetContext == doSetContext))
948+ then {
949+ let doClosePosition = invoke(addressFromStringValue(_amm), method, args, payments)
950+ if ((doClosePosition == doClosePosition))
951+ then {
952+ let doResetContext = invoke(this, "resetContext", nil, nil)
953+ if ((doResetContext == doResetContext))
954+ then {
955+ let executeOrderRequest = if (if ((_type == LIMIT))
956+ then true
957+ else (_type == MARKET))
958+ then {
959+ let newPositionSize = getPositionSize(_amm, _trader, positionDirection)
960+ if ((newPositionSize == newPositionSize))
961+ then {
962+ let newPositionId = getPositionId(_amm, _trader, positionDirection)
963+ if ((newPositionId == newPositionId))
964+ then {
965+ let positionSizeDelta = (newPositionSize - positionSize)
966+ let closeOrderSide = if ((newPositionSize > 0))
967+ then SHORT
968+ else LONG
969+ let makeTakeOrder = if (haveOrderRequest(_orderId, TAKE))
970+ then {
971+ let $t03723137444 = getOrderRequest(_orderId, TAKE)
972+ let newOrderId = $t03723137444._1
973+ let newAmm = $t03723137444._2
974+ let newTrader = $t03723137444._3
975+ let newType = $t03723137444._4
976+ let newTriggerPrice = $t03723137444._5
977+ let newLimitPrice = $t03723137444._6
978+ let doCall = invoke(this, "internalCreateOrder", [newTrader, newAmm, newType, newTriggerPrice, newLimitPrice, positionSizeDelta, 0, closeOrderSide, "", "", 0, 0], nil)
979+ if ((doCall == doCall))
980+ then nil
981+ else throw("Strict value is not equal to itself.")
982+ }
983+ else nil
984+ if ((makeTakeOrder == makeTakeOrder))
985+ then {
986+ let makeStopOrder = if (haveOrderRequest(_orderId, STOP))
987+ then {
988+ let $t03806738280 = getOrderRequest(_orderId, STOP)
989+ let newOrderId = $t03806738280._1
990+ let newAmm = $t03806738280._2
991+ let newTrader = $t03806738280._3
992+ let newType = $t03806738280._4
993+ let newTriggerPrice = $t03806738280._5
994+ let newLimitPrice = $t03806738280._6
995+ let doCall = invoke(this, "internalCreateOrder", [newTrader, newAmm, newType, newTriggerPrice, newLimitPrice, positionSizeDelta, 0, closeOrderSide, "", "", 0, 0], nil)
996+ if ((doCall == doCall))
997+ then nil
998+ else throw("Strict value is not equal to itself.")
999+ }
1000+ else nil
1001+ if ((makeStopOrder == makeStopOrder))
1002+ then (makeTakeOrder ++ makeStopOrder)
1003+ else throw("Strict value is not equal to itself.")
1004+ }
1005+ else throw("Strict value is not equal to itself.")
1006+ }
1007+ else throw("Strict value is not equal to itself.")
1008+ }
1009+ else throw("Strict value is not equal to itself.")
1010+ }
1011+ else nil
1012+ if ((executeOrderRequest == executeOrderRequest))
1013+ then {
1014+ let doMarkOrderExecuted = invoke(this, "internalMarkOrderExecuted", [_amm, _trader, _orderId], nil)
1015+ if ((doMarkOrderExecuted == doMarkOrderExecuted))
1016+ then nil
1017+ else throw("Strict value is not equal to itself.")
1018+ }
1019+ else throw("Strict value is not equal to itself.")
1020+ }
1021+ else throw("Strict value is not equal to itself.")
1022+ }
1023+ else throw("Strict value is not equal to itself.")
1024+ }
1025+ else throw("Strict value is not equal to itself.")
1026+ }
1027+ else nil
10081028 else throw("Strict value is not equal to itself.")
10091029 }
10101030 else throw("Strict value is not equal to itself.")
10281048 }
10291049
10301050
1051+
1052+@Callable(i)
1053+func view_canActivateStopOrder (_orderId,_priceData) = {
1054+ let s = invoke(this, "activateStopOrder", [_orderId, _priceData], nil)
1055+ if ((s == s))
1056+ then throw("Success")
1057+ else throw("Strict value is not equal to itself.")
1058+ }
1059+
1060+
10311061 @Verifier(tx)
10321062 func verify () = {
10331063 let coordinatorStr = getString(this, k_coordinatorAddress)
Full:
OldNewDifferences
11 {-# STDLIB_VERSION 6 #-}
22 {-# SCRIPT_TYPE ACCOUNT #-}
33 {-# CONTENT_TYPE DAPP #-}
44 let k_coordinatorAddress = "k_coordinatorAddress"
55
66 let k_admin_address = "k_admin_address"
77
88 let k_quote_asset = "k_quote_asset"
99
1010 let k_amm = "k_amm"
1111
1212 let k_manager_address = "k_manager_address"
1313
1414 let k_positionSequence = "k_positionSequence"
1515
1616 let k_positionSize = "k_positionSize"
1717
1818 let k_executedOrders = "k_executedOrders"
1919
2020 let k_canceledOrders = "k_canceledOrders"
2121
2222 let k_order = "k_order"
2323
2424 let k_orderRequest = "k_orderReq"
2525
2626 let k_lastOrderId = "k_lastOrderId"
2727
2828 let k_traderOrderCnt = "k_traderOrderCnt"
2929
3030 let k_traderOrderIds = "k_traderOrderIds"
3131
3232 let k_spreadLimit = "k_spreadLimit"
3333
3434 let k_onlyWhitelist = "k_onlyWhitelist"
3535
3636 let k_whitelistExecutor = "k_whitelistExecutor"
3737
3838 let k_sender = "k_sender"
3939
4040 let k_initialized = "k_initialized"
4141
4242 let STOP = 1
4343
4444 let TAKE = 2
4545
4646 let LIMIT = 3
4747
4848 let MARKET = 4
4949
5050 let LONG = 1
5151
5252 let SHORT = 2
5353
5454 let INCREASE = 1
5555
5656 let DECREASE = 2
5757
5858 let MAX_TRADER_ORDERS_PER_AMM = 10
5959
6060 let TIME = lastBlock.timestamp
6161
6262 let DECIMAL_UNIT = (1 * (((((10 * 10) * 10) * 10) * 10) * 10))
6363
6464 func abs (_x) = if ((_x > 0))
6565 then _x
6666 else -(_x)
6767
6868
6969 func divd (_x,_y) = fraction(_x, DECIMAL_UNIT, _y, HALFEVEN)
7070
7171
7272 func muld (_x,_y) = fraction(_x, _y, DECIMAL_UNIT, HALFEVEN)
7373
7474
7575 func minv (_x,_y) = if ((_x > _y))
7676 then _y
7777 else _x
7878
7979
8080 func toCompositeKey (_key,_address) = ((_key + "_") + _address)
8181
8282
8383 func executedOrderKey (_orderId) = ((k_executedOrders + "_") + toString(_orderId))
8484
8585
8686 func canceledOrderKey (_orderId) = ((k_canceledOrders + "_") + toString(_orderId))
8787
8888
8989 func orderKey (_orderId) = toCompositeKey(k_order, toString(_orderId))
9090
9191
9292 func orderRequestKey (_orderId,_type) = ((((k_orderRequest + "_") + toString(_orderId)) + "_") + toString(_type))
9393
9494
9595 func traderOrderCountKey (_amm,_trader) = ((((k_traderOrderCnt + "_") + _amm) + "_") + _trader)
9696
9797
9898 func traderOrderIdsKey (_amm,_trader) = ((((k_traderOrderIds + "_") + _amm) + "_") + _trader)
9999
100100
101101 func coordinator () = valueOrErrorMessage(addressFromString(getStringValue(this, k_coordinatorAddress)), "Coordinator not set")
102102
103103
104104 func adminAddress () = addressFromString(getStringValue(coordinator(), k_admin_address))
105105
106106
107107 func quoteAsset () = fromBase58String(getStringValue(coordinator(), k_quote_asset))
108108
109109
110110 func managerAddress () = valueOrErrorMessage(addressFromString(getStringValue(coordinator(), k_manager_address)), "Manager not set")
111111
112112
113113 func isWhitelist (_address) = valueOrElse(getBoolean(coordinator(), toCompositeKey(k_amm, _address)), false)
114114
115115
116116 func initialized () = valueOrElse(getBoolean(this, k_initialized), false)
117117
118118
119119 func isValid (_orderId) = if (valueOrElse(getBoolean(this, executedOrderKey(_orderId)), false))
120120 then throw(("Order already executed: " + toString(_orderId)))
121121 else if (valueOrElse(getBoolean(this, canceledOrderKey(_orderId)), false))
122122 then throw(("Order already cancelled: " + toString(_orderId)))
123123 else true
124124
125125
126126 func getSpreadLimit () = valueOrErrorMessage(getInteger(this, k_spreadLimit), "Spread limit not set")
127127
128128
129129 func currentOrderId () = valueOrElse(getInteger(this, k_lastOrderId), 0)
130130
131131
132132 func getTraderOrderCount (_amm,_trader) = {
133133 let key = traderOrderCountKey(_amm, _trader)
134134 valueOrElse(getInteger(this, key), 0)
135135 }
136136
137137
138138 func traderAmmOrdersIds (_amm,_trader) = {
139139 let key = traderOrderIdsKey(_amm, _trader)
140140 let val = valueOrElse(getString(this, key), "")
141141 if ((val == ""))
142142 then nil
143143 else split(val, ",")
144144 }
145145
146146
147147 func haveOrderRequest (_orderId,_type) = {
148148 let key = orderRequestKey(_orderId, _type)
149149 isDefined(getString(this, key))
150150 }
151151
152152
153153 func getOrderRequest (_orderId,_type) = {
154154 let key = orderRequestKey(_orderId, _type)
155155 let orderRequestStr = valueOrErrorMessage(getString(this, key), ("Not order request for key: " + key))
156156 let orderRequestPartList = split(orderRequestStr, ",")
157157 let orderId = valueOrErrorMessage(parseInt(orderRequestPartList[0]), "Invalid orderId")
158158 let amm = orderRequestPartList[1]
159159 let trader = orderRequestPartList[2]
160160 let type = valueOrErrorMessage(parseInt(orderRequestPartList[3]), "Invalid type")
161161 let triggerPrice = valueOrErrorMessage(parseInt(orderRequestPartList[4]), "Invalid triggerPrice")
162162 let limitPrice = valueOrErrorMessage(parseInt(orderRequestPartList[5]), "Invalid limitPrice")
163163 $Tuple6(orderId, amm, trader, type, triggerPrice, limitPrice)
164164 }
165165
166166
167167 func getOrder (_orderId) = {
168168 let orderStr = valueOrErrorMessage(getString(this, orderKey(_orderId)), ("Invalid order id: " + toString(_orderId)))
169169 let orderPartList = split(orderStr, ",")
170170 let amm = orderPartList[0]
171171 let trader = orderPartList[1]
172172 let amountIn = valueOrErrorMessage(parseInt(orderPartList[2]), "Invalid amountIn")
173173 let leverage = valueOrErrorMessage(parseInt(orderPartList[3]), "Invalid leverage")
174174 let type = valueOrErrorMessage(parseInt(orderPartList[4]), "Invalid type")
175175 let triggerPrice = valueOrErrorMessage(parseInt(orderPartList[5]), "Invalid triggerPrice")
176176 let paymentUsdn = valueOrErrorMessage(parseInt(orderPartList[6]), "Invalid paymentUsdn")
177177 let side = valueOrErrorMessage(parseInt(orderPartList[7]), "Invalid side")
178178 let refLink = orderPartList[8]
179179 let positionId = valueOrErrorMessage(parseInt(orderPartList[9]), "Invalid positionId")
180180 let limitPrice = valueOrErrorMessage(parseInt(orderPartList[10]), "Invalid limitPrice")
181181 let expiration = if ((size(orderPartList) > 11))
182182 then valueOrErrorMessage(parseInt(orderPartList[11]), "Invalid expiration")
183183 else 0
184184 let marketPrice = if ((size(orderPartList) > 12))
185185 then valueOrErrorMessage(parseInt(orderPartList[12]), "Invalid orderMarketPrice")
186186 else 0
187187 $Tuple13(amm, trader, amountIn, leverage, type, triggerPrice, paymentUsdn, side, refLink, positionId, limitPrice, expiration, marketPrice)
188188 }
189189
190190
191191 func getMarketPrice (_amm) = {
192192 let s = invoke(addressFromStringValue(_amm), "computeSpotPrice", nil, nil)
193193 if ((s == s))
194194 then {
195195 let res = match s {
196196 case t: Int =>
197197 t
198198 case _ =>
199199 throw("Invalid computeSpotPrice result")
200200 }
201201 value(res)
202202 }
203203 else throw("Strict value is not equal to itself.")
204204 }
205205
206206
207207 func getFee (_amm,_trader) = {
208208 let s = invoke(addressFromStringValue(_amm), "computeFeeForTraderWithArtifact", [_trader, ""], nil)
209209 if ((s == s))
210210 then {
211211 let res = match s {
212212 case t: (Int, Boolean) =>
213213 t._1
214214 case _ =>
215215 throw("Invalid computeFeeForTraderWithArtifact result")
216216 }
217217 value(res)
218218 }
219219 else throw("Strict value is not equal to itself.")
220220 }
221221
222222
223223 func getPositionDirection (_orderSide,_orderType) = if (if ((_orderType == TAKE))
224224 then true
225225 else (_orderType == STOP))
226226 then if ((_orderSide == LONG))
227227 then SHORT
228228 else LONG
229229 else _orderSide
230230
231231
232232 func getPositionSize (_amm,_trader,_direction) = {
233233 let amm = addressFromStringValue(_amm)
234234 let positionKey = ((_trader + "_") + toString(_direction))
235235 let sizeKey = toCompositeKey(k_positionSize, positionKey)
236236 valueOrElse(getInteger(amm, sizeKey), 0)
237237 }
238238
239239
240240 func getPositionId (_amm,_trader,_direction) = {
241241 let amm = addressFromStringValue(_amm)
242242 let positionKey = ((_trader + "_") + toString(_direction))
243243 let seqKey = toCompositeKey(k_positionSequence, positionKey)
244244 valueOrElse(getInteger(amm, seqKey), 0)
245245 }
246246
247247
248248 func getSpread (_price) = muld(_price, getSpreadLimit())
249249
250250
251251 func isOnlyWhitelistExecutors () = valueOrElse(getBoolean(this, k_onlyWhitelist), false)
252252
253253
254254 func isWhitelistExecutor (_executor) = valueOrElse(getBoolean(this, toCompositeKey(k_whitelistExecutor, _executor)), false)
255255
256256
257257 func saveOrder (_orderId,_amm,_trader,_amountIn,_leverage,_type,_triggerPrice,_paymentUsdn,_side,_refLink,_positionId,_limitPrice,_expiration,_orderMarketPrice) = {
258258 let orderStr = makeString([_amm, _trader, toString(_amountIn), toString(_leverage), toString(_type), toString(_triggerPrice), toString(_paymentUsdn), toString(_side), _refLink, toString(_positionId), toString(_limitPrice), toString(_expiration), toString(_orderMarketPrice)], ",")
259259 [StringEntry(orderKey(_orderId), orderStr)]
260260 }
261261
262262
263263 func saveOrderRequest (_orderId,_amm,_trader,_type,_triggerPrice,_limitPrice) = {
264264 let orderReqStr = makeString([toString(_orderId), _amm, _trader, toString(_type), toString(_triggerPrice), toString(_limitPrice)], ",")
265265 [StringEntry(orderRequestKey(_orderId, _type), orderReqStr)]
266266 }
267267
268268
269269 func updateOrderIdStr (_orderIdsNewStr,_amm,_trader) = [StringEntry(traderOrderIdsKey(_amm, _trader), _orderIdsNewStr)]
270270
271271
272272 func addRemoveOrderIdList (_orderIds,_orderId,_amm,_trader,_add) = {
273273 let orderIdsNew = if (_add)
274274 then (_orderIds :+ toString(_orderId))
275275 else removeByIndex(_orderIds, valueOrErrorMessage(indexOf(_orderIds, toString(_orderId)), ("No order with id: " + toString(_orderId))))
276276 orderIdsNew
277277 }
278278
279279
280280 func addRemoveOrderId (_orderId,_amm,_trader,_add) = {
281281 let orderIds = traderAmmOrdersIds(_amm, _trader)
282282 let orderIdsNew = addRemoveOrderIdList(orderIds, _orderId, _amm, _trader, _add)
283283 let orderIdsNewStr = makeString(orderIdsNew, ",")
284284 updateOrderIdStr(orderIdsNewStr, _amm, _trader)
285285 }
286286
287287
288288 func updateTraderOrderCount (_amm,_trader,_count) = if ((0 > _count))
289289 then throw(("Invalid order count: " + toString(_count)))
290290 else [IntegerEntry(traderOrderCountKey(_amm, _trader), _count)]
291291
292292
293293 func updateLastOrderId (_lastOrderId) = [IntegerEntry(k_lastOrderId, _lastOrderId)]
294294
295295
296296 func markExecuteOrder (_orderId) = [BooleanEntry(toCompositeKey(k_executedOrders, toString(_orderId)), true)]
297297
298298
299299 func markCancelOrder (_orderId) = [BooleanEntry(toCompositeKey(k_canceledOrders, toString(_orderId)), true)]
300300
301301
302302 func getPositionIds (_amm,_trader) = {
303303 let longPositionSize = getPositionSize(_amm, _trader, LONG)
304304 let currentLongPositionId = if ((longPositionSize != 0))
305305 then getPositionId(_amm, _trader, LONG)
306306 else 0
307307 let shortPositionSize = getPositionSize(_amm, _trader, SHORT)
308308 let currentShortPositionId = if ((shortPositionSize != 0))
309309 then getPositionId(_amm, _trader, SHORT)
310310 else 0
311311 [currentLongPositionId, currentShortPositionId]
312312 }
313313
314314
315315 func checkValidExecutor (_caller) = if (isOnlyWhitelistExecutors())
316316 then isWhitelistExecutor(toString(_caller))
317317 else true
318318
319319
320320 @Callable(i)
321+func internalSaveOrder (_orderId,_amm,_trader,_amountIn,_leverage,_type,_triggerPrice,_paymentUsdn,_side,_refLink,_positionId,_limitPrice,_expiration,_orderMarketPrice) = if ((i.caller != this))
322+ then throw("Invalid saveOrderInternal params")
323+ else saveOrder(_orderId, _amm, _trader, _amountIn, _leverage, _type, _triggerPrice, _paymentUsdn, _side, _refLink, _positionId, _limitPrice, _expiration, _orderMarketPrice)
324+
325+
326+
327+@Callable(i)
321328 func cleanUpStaleOrders (_amm,_trader) = {
322329 let orders = traderAmmOrdersIds(_amm, _trader)
323330 let positionIds = getPositionIds(_amm, _trader)
324331 func cleanUpOne (_acc,_orderId) = {
325332 let orderIdInt = valueOrErrorMessage(parseInt(_orderId), "Invalid order id")
326- let $t01236712592 = getOrder(orderIdInt)
327- let _x1 = $t01236712592._1
328- let _x2 = $t01236712592._2
329- let _x3 = $t01236712592._3
330- let _x4 = $t01236712592._4
331- let _type = $t01236712592._5
332- let _x5 = $t01236712592._6
333- let _paymentUsdn = $t01236712592._7
334- let _x6 = $t01236712592._8
335- let _x7 = $t01236712592._9
336- let _positionId = $t01236712592._10
337- let _x8 = $t01236712592._11
338- let _expiration = $t01236712592._12
333+ let $t01311313338 = getOrder(orderIdInt)
334+ let _x1 = $t01311313338._1
335+ let _x2 = $t01311313338._2
336+ let _x3 = $t01311313338._3
337+ let _x4 = $t01311313338._4
338+ let _type = $t01311313338._5
339+ let _x5 = $t01311313338._6
340+ let _paymentUsdn = $t01311313338._7
341+ let _x6 = $t01311313338._8
342+ let _x7 = $t01311313338._9
343+ let _positionId = $t01311313338._10
344+ let _x8 = $t01311313338._11
345+ let _expiration = $t01311313338._12
339346 let cancelTakeStopOfNoPosition = if (if (if ((_type == STOP))
340347 then true
341348 else (_type == TAKE))
342349 then (positionIds[0] != _positionId)
343350 else false)
344351 then (positionIds[1] != _positionId)
345352 else false
346353 let cancelLimitIfExpired = if (if ((_type == LIMIT))
347354 then true
348355 else (_type == MARKET))
349356 then (TIME >= _expiration)
350357 else false
351358 if (if (cancelTakeStopOfNoPosition)
352359 then true
353360 else cancelLimitIfExpired)
354361 then {
355362 let change = markCancelOrder(orderIdInt)
356363 let newOrderList = addRemoveOrderIdList(_acc._1, orderIdInt, _amm, _trader, false)
357364 let paymentToReturn = if (if ((_type == LIMIT))
358365 then true
359366 else (_type == MARKET))
360367 then _paymentUsdn
361368 else 0
362369 $Tuple3(newOrderList, (_acc._2 ++ change), (_acc._3 + paymentToReturn))
363370 }
364371 else _acc
365372 }
366373
367- let $t01329313388 = {
374+ let $t01404014135 = {
368375 let $l = orders
369376 let $s = size($l)
370377 let $acc0 = $Tuple3(orders, nil, 0)
371378 func $f0_1 ($a,$i) = if (($i >= $s))
372379 then $a
373380 else cleanUpOne($a, $l[$i])
374381
375382 func $f0_2 ($a,$i) = if (($i >= $s))
376383 then $a
377384 else throw("List size exceeds 10")
378385
379386 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10)
380387 }
381- let newOrders = $t01329313388._1
382- let cancelActions = $t01329313388._2
383- let paymentToReturn = $t01329313388._3
388+ let newOrders = $t01404014135._1
389+ let cancelActions = $t01404014135._2
390+ let paymentToReturn = $t01404014135._3
384391 let withdraw = if ((paymentToReturn > 0))
385392 then {
386393 let unstake = invoke(managerAddress(), "withdraw", [toBase58String(quoteAsset()), paymentToReturn], nil)
387394 if ((unstake == unstake))
388395 then nil
389396 else throw("Strict value is not equal to itself.")
390397 }
391398 else nil
392399 if ((withdraw == withdraw))
393400 then (((cancelActions ++ updateTraderOrderCount(_amm, _trader, size(newOrders))) ++ updateOrderIdStr(makeString(newOrders, ","), _amm, _trader)) ++ [ScriptTransfer(addressFromStringValue(_trader), paymentToReturn, quoteAsset())])
394401 else throw("Strict value is not equal to itself.")
395402 }
396403
397404
398405
399406 @Callable(i)
400407 func setContext (_sender) = if ((i.caller != this))
401408 then throw("Only self-call")
402409 else [StringEntry(k_sender, _sender)]
403410
404411
405412
406413 @Callable(i)
407414 func resetContext () = if ((i.caller != this))
408415 then throw("Only self-call")
409416 else [DeleteEntry(k_sender)]
410417
411418
412419
413420 @Callable(i)
414421 func initialize (_coordinator,_spreadLimit) = if (if (if (initialized())
415422 then true
416423 else if ((0 > _spreadLimit))
417424 then true
418425 else (_spreadLimit > (DECIMAL_UNIT / 10)))
419426 then true
420427 else (i.caller != this))
421428 then throw("Unable to initialize")
422429 else [StringEntry(k_coordinatorAddress, toString(addressFromStringValue(_coordinator))), IntegerEntry(k_spreadLimit, _spreadLimit), BooleanEntry(k_initialized, true)]
423430
424431
425432
426433 @Callable(i)
427434 func changeSettings (_spreadLimit,_onlyWhitelist) = if (if ((i.caller != adminAddress()))
428435 then true
429436 else if ((0 > _spreadLimit))
430437 then true
431438 else (_spreadLimit > (DECIMAL_UNIT / 10)))
432439 then throw("Invalid changeSettings params")
433440 else [IntegerEntry(k_spreadLimit, _spreadLimit), BooleanEntry(k_onlyWhitelist, _onlyWhitelist)]
434441
435442
436443
437444 @Callable(i)
438445 func addWhitelist (_list) = if ((i.caller != adminAddress()))
439446 then throw("Invalid addWhitelist params")
440447 else {
441448 func toAddressList (_acc,_addr) = {
442449 let address = addressFromStringValue(_addr)
443450 if ((address == address))
444451 then (_acc :+ BooleanEntry(toCompositeKey(k_whitelistExecutor, toString(address)), true))
445452 else throw("Strict value is not equal to itself.")
446453 }
447454
448455 let $l = split_4C(_list, ",")
449456 let $s = size($l)
450457 let $acc0 = nil
451458 func $f0_1 ($a,$i) = if (($i >= $s))
452459 then $a
453460 else toAddressList($a, $l[$i])
454461
455462 func $f0_2 ($a,$i) = if (($i >= $s))
456463 then $a
457464 else throw("List size exceeds 20")
458465
459466 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
460467 }
461468
462469
463470
464471 @Callable(i)
465472 func removeWhitelist (_list) = if ((i.caller != adminAddress()))
466473 then throw("Invalid removeWhitelist params")
467474 else {
468475 func toAddressList (_acc,_addr) = {
469476 let address = addressFromStringValue(_addr)
470477 if ((address == address))
471478 then (_acc :+ BooleanEntry(toCompositeKey(k_whitelistExecutor, toString(address)), false))
472479 else throw("Strict value is not equal to itself.")
473480 }
474481
475482 let $l = split_4C(_list, ",")
476483 let $s = size($l)
477484 let $acc0 = nil
478485 func $f0_1 ($a,$i) = if (($i >= $s))
479486 then $a
480487 else toAddressList($a, $l[$i])
481488
482489 func $f0_2 ($a,$i) = if (($i >= $s))
483490 then $a
484491 else throw("List size exceeds 20")
485492
486493 $f0_2($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($f0_1($acc0, 0), 1), 2), 3), 4), 5), 6), 7), 8), 9), 10), 11), 12), 13), 14), 15), 16), 17), 18), 19), 20)
487494 }
488495
489496
490497
491498 @Callable(i)
492499 func createOrder (_amm,_type,_triggerPrice,_limitPrice,_amountIn,_leverage,_side,_refLink,_stopTriggerPrice,_stopLimitPrice,_takeTriggerPrice,_takeLimitPrice,_expiration,_priceData) = {
493500 let _trader = toString(i.caller)
494501 let updatePrice = invoke(addressFromStringValue(_amm), "updateOracle", [_priceData], nil)
495502 if ((updatePrice == updatePrice))
496503 then {
497504 let cleanUp = invoke(this, "cleanUpStaleOrders", [_amm, _trader], nil)
498505 if ((cleanUp == cleanUp))
499506 then if ((size(i.payments) > 1))
500507 then throw("Invalid createOrder parameters: invalid payment count")
501508 else {
502- let $t01789718149 = if ((size(i.payments) == 1))
509+ let $t01864418896 = if ((size(i.payments) == 1))
503510 then $Tuple2(toBase58String(valueOrErrorMessage(i.payments[0].assetId, "Invalid asset id")), i.payments[0].amount)
504511 else $Tuple2("", 0)
505- let paymentAssetId = $t01789718149._1
506- let paymentAmount = $t01789718149._2
512+ let paymentAssetId = $t01864418896._1
513+ let paymentAmount = $t01864418896._2
507514 let doCall = invoke(this, "internalCreateOrder", [_trader, _amm, _type, _triggerPrice, _limitPrice, _amountIn, _leverage, _side, _refLink, paymentAssetId, paymentAmount, _expiration], nil)
508515 if ((doCall == doCall))
509516 then {
510517 let orderId = match doCall {
511518 case t: Int =>
512519 t
513520 case _ =>
514521 throw("Invalid ID of created order")
515522 }
516523 if (if ((_type == LIMIT))
517524 then true
518525 else (_type == MARKET))
519526 then {
520527 let makeStop = if ((_stopTriggerPrice > 0))
521528 then {
522529 let doMakeStop = invoke(this, "internalCreateOrderRequest", [_trader, _amm, orderId, STOP, _stopTriggerPrice, _stopLimitPrice], nil)
523530 if ((doMakeStop == doMakeStop))
524531 then nil
525532 else throw("Strict value is not equal to itself.")
526533 }
527534 else nil
528535 let makeTake = if ((_takeTriggerPrice > 0))
529536 then {
530537 let doMakeTake = invoke(this, "internalCreateOrderRequest", [_trader, _amm, orderId, TAKE, _takeTriggerPrice, _takeLimitPrice], nil)
531538 if ((doMakeTake == doMakeTake))
532539 then nil
533540 else throw("Strict value is not equal to itself.")
534541 }
535542 else nil
536543 (makeStop ++ makeTake)
537544 }
538545 else nil
539546 }
540547 else throw("Strict value is not equal to itself.")
541548 }
542549 else throw("Strict value is not equal to itself.")
543550 }
544551 else throw("Strict value is not equal to itself.")
545552 }
546553
547554
548555
549556 @Callable(i)
550557 func increasePositionWithStopLoss (_amm,_direction,_leverage,_minBaseAssetAmount,_refLink,_stopTriggerPrice,_stopLimitPrice,_takeTriggerPrice,_takeLimitPrice,_priceData) = {
551558 let _trader = toString(i.caller)
552559 let cleanUp = invoke(this, "cleanUpStaleOrders", [_amm, _trader], nil)
553560 if ((cleanUp == cleanUp))
554561 then if (if (!(initialized()))
555562 then true
556563 else !(isWhitelist(_amm)))
557564 then throw("Invalid increasePositionWithStopLoss parameters")
558565 else {
559566 let positionSize = getPositionSize(_amm, _trader, _direction)
560567 if ((positionSize != 0))
561568 then throw("Invalid increasePositionWithStopLoss parameters: only new position")
562569 else {
563570 let doSetContext = invoke(this, "setContext", [_trader], nil)
564571 if ((doSetContext == doSetContext))
565572 then {
566573 let doOpenPosition = invoke(addressFromStringValue(_amm), "increasePosition", [_direction, _leverage, _minBaseAssetAmount, _refLink, _priceData], i.payments)
567574 if ((doOpenPosition == doOpenPosition))
568575 then {
569576 let doResetContext = invoke(this, "resetContext", nil, nil)
570577 if ((doResetContext == doResetContext))
571578 then {
572579 let openedPositionSize = getPositionSize(_amm, _trader, _direction)
573580 if ((openedPositionSize == openedPositionSize))
574581 then {
575582 let amountIn = abs(openedPositionSize)
576583 if ((amountIn == amountIn))
577584 then {
578585 let stopLossSide = if ((0 > openedPositionSize))
579586 then LONG
580587 else SHORT
581588 let checkAmountIn = if ((0 >= amountIn))
582589 then {
583590 let data = makeString([_amm, _trader, toString(_direction), toString(_leverage), toString(_minBaseAssetAmount), _refLink, _priceData], ",")
584591 throw(((("Invalid amountIn=" + toString(amountIn)) + " after success increasePosition: ") + data))
585592 }
586593 else 0
587594 if ((checkAmountIn == checkAmountIn))
588595 then {
589596 let doCreateStopOrder = if ((_stopTriggerPrice > 0))
590597 then {
591598 let doCreateStopOrder = invoke(this, "internalCreateOrder", [_trader, _amm, STOP, _stopTriggerPrice, _stopLimitPrice, amountIn, 0, stopLossSide, _refLink, "", 0, 0], nil)
592599 if ((doCreateStopOrder == doCreateStopOrder))
593600 then nil
594601 else throw("Strict value is not equal to itself.")
595602 }
596603 else nil
597604 if ((doCreateStopOrder == doCreateStopOrder))
598605 then {
599606 let doCreateTakeOrder = if ((_takeTriggerPrice > 0))
600607 then {
601608 let doCreateTakeOrder = invoke(this, "internalCreateOrder", [_trader, _amm, TAKE, _takeTriggerPrice, _takeLimitPrice, amountIn, 0, stopLossSide, _refLink, "", 0, 0], nil)
602609 if ((doCreateTakeOrder == doCreateTakeOrder))
603610 then nil
604611 else throw("Strict value is not equal to itself.")
605612 }
606613 else nil
607614 if ((doCreateTakeOrder == doCreateTakeOrder))
608615 then nil
609616 else throw("Strict value is not equal to itself.")
610617 }
611618 else throw("Strict value is not equal to itself.")
612619 }
613620 else throw("Strict value is not equal to itself.")
614621 }
615622 else throw("Strict value is not equal to itself.")
616623 }
617624 else throw("Strict value is not equal to itself.")
618625 }
619626 else throw("Strict value is not equal to itself.")
620627 }
621628 else throw("Strict value is not equal to itself.")
622629 }
623630 else throw("Strict value is not equal to itself.")
624631 }
625632 }
626633 else throw("Strict value is not equal to itself.")
627634 }
628635
629636
630637
631638 @Callable(i)
632639 func internalMarkOrderExecuted (_amm,_trader,_orderId) = if (if (if (!(initialized()))
633640 then true
634641 else !(isWhitelist(_amm)))
635642 then true
636643 else !((i.caller == this)))
637644 then throw("Invalid internalMarkOrderExecuted parameters")
638645 else {
639646 let newTraderOrderCount = (getTraderOrderCount(_amm, _trader) - 1)
640647 ((updateTraderOrderCount(_amm, _trader, newTraderOrderCount) ++ addRemoveOrderId(_orderId, _amm, _trader, false)) ++ markExecuteOrder(_orderId))
641648 }
642649
643650
644651
645652 @Callable(i)
646653 func internalCreateOrderRequest (_trader,_amm,_orderId,_type,_triggerPrice,_limitPrice) = if (if (if (if (if (!(initialized()))
647654 then true
648655 else !(isWhitelist(_amm)))
649656 then true
650657 else (0 >= _triggerPrice))
651658 then true
652659 else (0 > _limitPrice))
653660 then true
654661 else !((i.caller == this)))
655662 then throw("Invalid internalCreateOrderRequest parameters")
656663 else saveOrderRequest(_orderId, _amm, _trader, _type, _triggerPrice, _limitPrice)
657664
658665
659666
660667 @Callable(i)
661668 func internalCreateOrder (_trader,_amm,_type,_triggerPrice,_limitPrice,_amountIn,_leverage,_side,_refLink,_paymentAssetId,_paymentAmount,_expiration) = if (if (if (if (if (if (if (if (if (if (!(initialized()))
662669 then true
663670 else !(isWhitelist(_amm)))
664671 then true
665672 else (0 > _triggerPrice))
666673 then true
667674 else (0 > _limitPrice))
668675 then true
669676 else (0 >= _amountIn))
670677 then true
671678 else (0 > _leverage))
672679 then true
673680 else !(if ((_side == LONG))
674681 then true
675682 else (_side == SHORT)))
676683 then true
677684 else !(if (if (if ((_type == STOP))
678685 then true
679686 else (_type == TAKE))
680687 then true
681688 else (_type == LIMIT))
682689 then true
683690 else (_type == MARKET)))
684691 then true
685692 else !((i.caller == this)))
686693 then true
687694 else (0 > _expiration))
688695 then throw("Invalid internalCreateOrder parameters")
689696 else {
690697 let orderId = (currentOrderId() + 1)
691698 let positionDirection = getPositionDirection(_side, _type)
692699 let newTraderOrderCount = (getTraderOrderCount(_amm, _trader) + 1)
693700 let positionSize = getPositionSize(_amm, _trader, positionDirection)
694701 let orderMarketPrice = getMarketPrice(_amm)
695702 let _direction = if (if (if ((positionSize == 0))
696703 then true
697704 else if ((positionSize > 0))
698705 then (_side == LONG)
699706 else false)
700707 then true
701708 else if ((0 > positionSize))
702709 then (_side == SHORT)
703710 else false)
704711 then INCREASE
705712 else DECREASE
706713 if (if ((positionSize == 0))
707714 then if ((_type == STOP))
708715 then true
709716 else (_type == TAKE)
710717 else false)
711718 then throw("Can not create STOP/TAKE order: no position")
712719 else {
713720 let usdnPayment = if ((_direction == INCREASE))
714721 then if (if ((_paymentAssetId != toBase58String(quoteAsset())))
715722 then true
716723 else (_paymentAmount != _amountIn))
717724 then throw("Invalid createLimitOrder parameters: invalid payment")
718725 else {
719726 let stake = invoke(managerAddress(), "deposit", nil, [AttachedPayment(quoteAsset(), _paymentAmount)])
720727 if ((stake == stake))
721728 then _paymentAmount
722729 else throw("Strict value is not equal to itself.")
723730 }
724731 else 0
725732 if ((usdnPayment == usdnPayment))
726733 then {
727734 let positionId = if ((positionSize != 0))
728735 then getPositionId(_amm, _trader, positionDirection)
729736 else 0
730737 if (if (if ((_type == STOP))
731738 then true
732739 else (_type == TAKE))
733740 then (positionId == 0)
734741 else false)
735742 then throw("STOP and TAKE order should be assigned to position with id != 0")
736743 else if ((newTraderOrderCount > MAX_TRADER_ORDERS_PER_AMM))
737744 then throw("Invalid createLimitOrder parameters: order count")
738745 else {
739746 let changeSet = (((saveOrder(orderId, _amm, _trader, _amountIn, _leverage, _type, _triggerPrice, usdnPayment, _side, _refLink, positionId, _limitPrice, _expiration, orderMarketPrice) ++ addRemoveOrderId(orderId, _amm, _trader, true)) ++ updateTraderOrderCount(_amm, _trader, newTraderOrderCount)) ++ updateLastOrderId(orderId))
740747 $Tuple2(changeSet, orderId)
741748 }
742749 }
743750 else throw("Strict value is not equal to itself.")
744751 }
745752 }
746753
747754
748755
749756 @Callable(i)
750757 func cancelOrder (_orderId) = {
751- let $t02782227972 = getOrder(_orderId)
752- let _amm = $t02782227972._1
753- let _trader = $t02782227972._2
754- let _amountIn = $t02782227972._3
755- let _leverage = $t02782227972._4
756- let _type = $t02782227972._5
757- let _triggerPrice = $t02782227972._6
758- let _amountUsdn = $t02782227972._7
758+ let $t02856928719 = getOrder(_orderId)
759+ let _amm = $t02856928719._1
760+ let _trader = $t02856928719._2
761+ let _amountIn = $t02856928719._3
762+ let _leverage = $t02856928719._4
763+ let _type = $t02856928719._5
764+ let _triggerPrice = $t02856928719._6
765+ let _amountUsdn = $t02856928719._7
759766 if (if (if (!(initialized()))
760767 then true
761768 else !(isValid(_orderId)))
762769 then true
763770 else !((toString(i.caller) == _trader)))
764771 then throw("Invalid cancelOrder parameters")
765772 else {
766773 let cleanUp = invoke(this, "cleanUpStaleOrders", [_amm, _trader], nil)
767774 if ((cleanUp == cleanUp))
768775 then {
769776 let newTraderOrderCount = (getTraderOrderCount(_amm, _trader) - 1)
770777 let withdraw = if ((_amountUsdn > 0))
771778 then {
772779 let unstake = invoke(managerAddress(), "withdraw", [toBase58String(quoteAsset()), _amountUsdn], nil)
773780 if ((unstake == unstake))
774781 then nil
775782 else throw("Strict value is not equal to itself.")
776783 }
777784 else nil
778785 if ((withdraw == withdraw))
779786 then (((markCancelOrder(_orderId) ++ addRemoveOrderId(_orderId, _amm, _trader, false)) ++ updateTraderOrderCount(_amm, _trader, newTraderOrderCount)) ++ (if ((_amountUsdn > 0))
780787 then [ScriptTransfer(i.caller, _amountUsdn, quoteAsset())]
781788 else nil))
782789 else throw("Strict value is not equal to itself.")
783790 }
784791 else throw("Strict value is not equal to itself.")
785792 }
786793 }
787794
788795
789796
790797 @Callable(i)
791798 func executeOrder (_orderId,_priceData) = {
792- let $t02919029453 = getOrder(_orderId)
793- let _amm = $t02919029453._1
794- let _trader = $t02919029453._2
795- let _amountIn = $t02919029453._3
796- let _leverage = $t02919029453._4
797- let _type = $t02919029453._5
798- let _triggerPrice = $t02919029453._6
799- let _amountUsdn = $t02919029453._7
800- let _side = $t02919029453._8
801- let _refLink = $t02919029453._9
802- let _positionId = $t02919029453._10
803- let _limitPrice = $t02919029453._11
804- let _expiration = $t02919029453._12
805- let _orderMarketPrice = $t02919029453._13
799+ let $t02993730200 = getOrder(_orderId)
800+ let _amm = $t02993730200._1
801+ let _trader = $t02993730200._2
802+ let _amountIn = $t02993730200._3
803+ let _leverage = $t02993730200._4
804+ let _type = $t02993730200._5
805+ let _triggerPrice = $t02993730200._6
806+ let _amountUsdn = $t02993730200._7
807+ let _side = $t02993730200._8
808+ let _refLink = $t02993730200._9
809+ let _positionId = $t02993730200._10
810+ let _limitPrice = $t02993730200._11
811+ let _expiration = $t02993730200._12
812+ let _orderMarketPrice = $t02993730200._13
806813 let updatePrice = invoke(addressFromStringValue(_amm), "updateOracle", [_priceData], nil)
807814 if ((updatePrice == updatePrice))
808815 then {
809816 let cleanUp = invoke(this, "cleanUpStaleOrders", [_amm, _trader], nil)
810817 if ((cleanUp == cleanUp))
811818 then {
812819 let _caller = if ((i.caller == this))
813820 then i.originCaller
814821 else i.caller
815822 if ((_caller == _caller))
816823 then {
817824 let positionDirection = getPositionDirection(_side, _type)
818825 if (if (if (!(initialized()))
819826 then true
820827 else !(isValid(_orderId)))
821828 then true
822829 else !(checkValidExecutor(_caller)))
823830 then throw("Invalid executeOrder parameters")
824831 else {
825832 let positionSize = getPositionSize(_amm, _trader, positionDirection)
826833 if ((positionSize == positionSize))
827834 then {
828835 let currentPositionId = if ((positionSize != 0))
829836 then getPositionId(_amm, _trader, positionDirection)
830837 else 0
831- let $t03019934951 = if ((_type == STOP))
838+ let $t03094636197 = if ((_type == STOP))
832839 then {
833840 let _positionDirection = if ((positionSize > 0))
834841 then LONG
835842 else if ((0 > positionSize))
836843 then SHORT
837844 else throw("Can not execute STOP order: no open position")
838845 let marketPrice = getMarketPrice(_amm)
839846 let isExecutable = if ((_side == _positionDirection))
840847 then throw("Can not execute STOP order: reduce only")
841848 else if ((currentPositionId != _positionId))
842849 then throw("Can not execute STOP order: position closed")
843850 else if ((_positionDirection == LONG))
844851 then (_triggerPrice >= marketPrice)
845852 else (marketPrice >= _triggerPrice)
846853 if (isExecutable)
847854 then $Tuple3("closePosition", [minv(_amountIn, abs(positionSize)), positionDirection, muld(_limitPrice, abs(positionSize)), false, _priceData], nil)
848855 else throw("Can not execute STOP order: triggerPrice mismatch")
849856 }
850857 else if ((_type == TAKE))
851858 then {
852859 let _positionDirection = if ((positionSize > 0))
853860 then LONG
854861 else if ((0 > positionSize))
855862 then SHORT
856863 else throw("Can not execute STOP order: no open position")
857864 let marketPrice = getMarketPrice(_amm)
858865 let isExecutable = if ((_side == _positionDirection))
859866 then throw("Can not execute TAKE order: reduce only")
860867 else if ((currentPositionId != _positionId))
861868 then throw(((("Can not execute TAKE order: position closed " + toString(currentPositionId)) + "!=") + toString(_positionId)))
862869 else if ((_positionDirection == LONG))
863870 then (marketPrice >= _triggerPrice)
864871 else (_triggerPrice >= marketPrice)
865872 if (isExecutable)
866873 then $Tuple3("closePosition", [minv(_amountIn, abs(positionSize)), positionDirection, muld(_limitPrice, abs(positionSize)), false, _priceData], nil)
867874 else throw("Can not execute TAKE order: triggerPrice mismatch")
868875 }
869876 else if ((_type == LIMIT))
870877 then {
871878 let marketPrice = getMarketPrice(_amm)
872879 let isExecutableByStop = if ((_limitPrice == 0))
873880 then true
874- else if ((_limitPrice > _orderMarketPrice))
881+ else if ((_side == LONG))
875882 then (marketPrice >= _limitPrice)
876883 else (_limitPrice >= marketPrice)
877884 let isExecutableForTriggerPrice = if ((_side == LONG))
878885 then (_triggerPrice >= marketPrice)
879886 else (marketPrice >= _triggerPrice)
880887 let isExecutableByTimestamp = if (if ((_expiration == 0))
881888 then true
882889 else (_expiration >= TIME))
883890 then true
884891 else false
885892 let isExecutable = if (if (isExecutableByStop)
886893 then isExecutableForTriggerPrice
887894 else false)
888895 then isExecutableByTimestamp
889896 else false
890897 if (isExecutable)
891898 then {
892899 let marginAmount = divd(_amountUsdn, (muld(getFee(_amm, _trader), _leverage) + DECIMAL_UNIT))
893900 let openNotional = muld(marginAmount, _leverage)
894901 let idealMinBaseAssetAmount = divd(openNotional, _triggerPrice)
895902 let minBaseAssetAmount = (idealMinBaseAssetAmount - muld(idealMinBaseAssetAmount, getSpreadLimit()))
896903 $Tuple3("increasePosition", [_side, _leverage, minBaseAssetAmount, _refLink, _priceData], [AttachedPayment(quoteAsset(), _amountUsdn)])
897904 }
898- else throw("Can not execute LIMIT order: triggerPrice mismatch")
905+ else if (if (if (isExecutableByStop)
906+ then isExecutableByTimestamp
907+ else false)
908+ then (_limitPrice != 0)
909+ else false)
910+ then {
911+ let doUpdateOrder = invoke(this, "internalSaveOrder", [_orderId, _amm, _trader, _amountIn, _leverage, _type, _triggerPrice, _amountUsdn, _side, _refLink, _positionId, 0, _expiration, _orderMarketPrice], nil)
912+ if ((doUpdateOrder == doUpdateOrder))
913+ then $Tuple3("", nil, nil)
914+ else throw("Strict value is not equal to itself.")
915+ }
916+ else throw("Can not execute LIMIT order: triggerPrice mismatch")
899917 }
900918 else if ((_type == MARKET))
901919 then {
902920 let marketPrice = getMarketPrice(_amm)
903921 let isExecutableByTimestamp = if (if ((_expiration == 0))
904922 then true
905923 else (_expiration >= TIME))
906924 then true
907925 else false
908926 let isExecutable = isExecutableByTimestamp
909927 if (isExecutable)
910928 then $Tuple3("increasePosition", [_side, _leverage, 0, _refLink, _priceData], [AttachedPayment(quoteAsset(), _amountUsdn)])
911929 else throw("Can not execute MARKET order: expiration mismatch")
912930 }
913931 else throw(("Invalid order type: " + toString(_type)))
914- let method = $t03019934951._1
915- let args = $t03019934951._2
916- let payments = $t03019934951._3
932+ let method = $t03094636197._1
933+ let args = $t03094636197._2
934+ let payments = $t03094636197._3
917935 let withdraw = if ((size(payments) == 1))
918936 then {
919937 let unstake = invoke(managerAddress(), "withdraw", [toBase58String(quoteAsset()), payments[0].amount], nil)
920938 if ((unstake == unstake))
921939 then nil
922940 else throw("Strict value is not equal to itself.")
923941 }
924942 else nil
925943 if ((withdraw == withdraw))
926- then {
927- let doSetContext = invoke(this, "setContext", [_trader], nil)
928- if ((doSetContext == doSetContext))
929- then {
930- let doClosePosition = invoke(addressFromStringValue(_amm), method, args, payments)
931- if ((doClosePosition == doClosePosition))
932- then {
933- let doResetContext = invoke(this, "resetContext", nil, nil)
934- if ((doResetContext == doResetContext))
935- then {
936- let executeOrderRequest = if (if ((_type == LIMIT))
937- then true
938- else (_type == MARKET))
939- then {
940- let newPositionSize = getPositionSize(_amm, _trader, positionDirection)
941- if ((newPositionSize == newPositionSize))
942- then {
943- let newPositionId = getPositionId(_amm, _trader, positionDirection)
944- if ((newPositionId == newPositionId))
945- then {
946- let positionSizeDelta = (newPositionSize - positionSize)
947- let closeOrderSide = if ((newPositionSize > 0))
948- then SHORT
949- else LONG
950- let makeTakeOrder = if (haveOrderRequest(_orderId, TAKE))
951- then {
952- let $t03593236131 = getOrderRequest(_orderId, TAKE)
953- let newOrderId = $t03593236131._1
954- let newAmm = $t03593236131._2
955- let newTrader = $t03593236131._3
956- let newType = $t03593236131._4
957- let newTriggerPrice = $t03593236131._5
958- let newLimitPrice = $t03593236131._6
959- let doCall = invoke(this, "internalCreateOrder", [newTrader, newAmm, newType, newTriggerPrice, newLimitPrice, positionSizeDelta, 0, closeOrderSide, "", "", 0, 0], nil)
960- if ((doCall == doCall))
961- then nil
962- else throw("Strict value is not equal to itself.")
963- }
964- else nil
965- if ((makeTakeOrder == makeTakeOrder))
966- then {
967- let makeStopOrder = if (haveOrderRequest(_orderId, STOP))
968- then {
969- let $t03670436903 = getOrderRequest(_orderId, STOP)
970- let newOrderId = $t03670436903._1
971- let newAmm = $t03670436903._2
972- let newTrader = $t03670436903._3
973- let newType = $t03670436903._4
974- let newTriggerPrice = $t03670436903._5
975- let newLimitPrice = $t03670436903._6
976- let doCall = invoke(this, "internalCreateOrder", [newTrader, newAmm, newType, newTriggerPrice, newLimitPrice, positionSizeDelta, 0, closeOrderSide, "", "", 0, 0], nil)
977- if ((doCall == doCall))
978- then nil
979- else throw("Strict value is not equal to itself.")
980- }
981- else nil
982- if ((makeStopOrder == makeStopOrder))
983- then (makeTakeOrder ++ makeStopOrder)
984- else throw("Strict value is not equal to itself.")
985- }
986- else throw("Strict value is not equal to itself.")
987- }
988- else throw("Strict value is not equal to itself.")
989- }
990- else throw("Strict value is not equal to itself.")
991- }
992- else nil
993- if ((executeOrderRequest == executeOrderRequest))
994- then {
995- let doMarkOrderExecuted = invoke(this, "internalMarkOrderExecuted", [_amm, _trader, _orderId], nil)
996- if ((doMarkOrderExecuted == doMarkOrderExecuted))
997- then nil
998- else throw("Strict value is not equal to itself.")
999- }
1000- else throw("Strict value is not equal to itself.")
1001- }
1002- else throw("Strict value is not equal to itself.")
1003- }
1004- else throw("Strict value is not equal to itself.")
1005- }
1006- else throw("Strict value is not equal to itself.")
1007- }
944+ then if ((method != ""))
945+ then {
946+ let doSetContext = invoke(this, "setContext", [_trader], nil)
947+ if ((doSetContext == doSetContext))
948+ then {
949+ let doClosePosition = invoke(addressFromStringValue(_amm), method, args, payments)
950+ if ((doClosePosition == doClosePosition))
951+ then {
952+ let doResetContext = invoke(this, "resetContext", nil, nil)
953+ if ((doResetContext == doResetContext))
954+ then {
955+ let executeOrderRequest = if (if ((_type == LIMIT))
956+ then true
957+ else (_type == MARKET))
958+ then {
959+ let newPositionSize = getPositionSize(_amm, _trader, positionDirection)
960+ if ((newPositionSize == newPositionSize))
961+ then {
962+ let newPositionId = getPositionId(_amm, _trader, positionDirection)
963+ if ((newPositionId == newPositionId))
964+ then {
965+ let positionSizeDelta = (newPositionSize - positionSize)
966+ let closeOrderSide = if ((newPositionSize > 0))
967+ then SHORT
968+ else LONG
969+ let makeTakeOrder = if (haveOrderRequest(_orderId, TAKE))
970+ then {
971+ let $t03723137444 = getOrderRequest(_orderId, TAKE)
972+ let newOrderId = $t03723137444._1
973+ let newAmm = $t03723137444._2
974+ let newTrader = $t03723137444._3
975+ let newType = $t03723137444._4
976+ let newTriggerPrice = $t03723137444._5
977+ let newLimitPrice = $t03723137444._6
978+ let doCall = invoke(this, "internalCreateOrder", [newTrader, newAmm, newType, newTriggerPrice, newLimitPrice, positionSizeDelta, 0, closeOrderSide, "", "", 0, 0], nil)
979+ if ((doCall == doCall))
980+ then nil
981+ else throw("Strict value is not equal to itself.")
982+ }
983+ else nil
984+ if ((makeTakeOrder == makeTakeOrder))
985+ then {
986+ let makeStopOrder = if (haveOrderRequest(_orderId, STOP))
987+ then {
988+ let $t03806738280 = getOrderRequest(_orderId, STOP)
989+ let newOrderId = $t03806738280._1
990+ let newAmm = $t03806738280._2
991+ let newTrader = $t03806738280._3
992+ let newType = $t03806738280._4
993+ let newTriggerPrice = $t03806738280._5
994+ let newLimitPrice = $t03806738280._6
995+ let doCall = invoke(this, "internalCreateOrder", [newTrader, newAmm, newType, newTriggerPrice, newLimitPrice, positionSizeDelta, 0, closeOrderSide, "", "", 0, 0], nil)
996+ if ((doCall == doCall))
997+ then nil
998+ else throw("Strict value is not equal to itself.")
999+ }
1000+ else nil
1001+ if ((makeStopOrder == makeStopOrder))
1002+ then (makeTakeOrder ++ makeStopOrder)
1003+ else throw("Strict value is not equal to itself.")
1004+ }
1005+ else throw("Strict value is not equal to itself.")
1006+ }
1007+ else throw("Strict value is not equal to itself.")
1008+ }
1009+ else throw("Strict value is not equal to itself.")
1010+ }
1011+ else nil
1012+ if ((executeOrderRequest == executeOrderRequest))
1013+ then {
1014+ let doMarkOrderExecuted = invoke(this, "internalMarkOrderExecuted", [_amm, _trader, _orderId], nil)
1015+ if ((doMarkOrderExecuted == doMarkOrderExecuted))
1016+ then nil
1017+ else throw("Strict value is not equal to itself.")
1018+ }
1019+ else throw("Strict value is not equal to itself.")
1020+ }
1021+ else throw("Strict value is not equal to itself.")
1022+ }
1023+ else throw("Strict value is not equal to itself.")
1024+ }
1025+ else throw("Strict value is not equal to itself.")
1026+ }
1027+ else nil
10081028 else throw("Strict value is not equal to itself.")
10091029 }
10101030 else throw("Strict value is not equal to itself.")
10111031 }
10121032 }
10131033 else throw("Strict value is not equal to itself.")
10141034 }
10151035 else throw("Strict value is not equal to itself.")
10161036 }
10171037 else throw("Strict value is not equal to itself.")
10181038 }
10191039
10201040
10211041
10221042 @Callable(i)
10231043 func view_canExecuteOrder (_orderId,_priceData) = {
10241044 let s = invoke(this, "executeOrder", [_orderId, _priceData], nil)
10251045 if ((s == s))
10261046 then throw("Success")
10271047 else throw("Strict value is not equal to itself.")
10281048 }
10291049
10301050
1051+
1052+@Callable(i)
1053+func view_canActivateStopOrder (_orderId,_priceData) = {
1054+ let s = invoke(this, "activateStopOrder", [_orderId, _priceData], nil)
1055+ if ((s == s))
1056+ then throw("Success")
1057+ else throw("Strict value is not equal to itself.")
1058+ }
1059+
1060+
10311061 @Verifier(tx)
10321062 func verify () = {
10331063 let coordinatorStr = getString(this, k_coordinatorAddress)
10341064 if (isDefined(coordinatorStr))
10351065 then {
10361066 let admin = getString(addressFromStringValue(value(coordinatorStr)), k_admin_address)
10371067 if (isDefined(admin))
10381068 then valueOrElse(getBoolean(addressFromStringValue(value(admin)), ((("status_" + toString(this)) + "_") + toBase58String(tx.id))), false)
10391069 else throw("unable to verify: admin not set in coordinator")
10401070 }
10411071 else sigVerify(tx.bodyBytes, tx.proofs[0], tx.senderPublicKey)
10421072 }
10431073

github/deemru/w8io/873ac7e 
126.23 ms